ZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS8uY2xhc3NwYXRoIGIvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlLy5jbGFzc3BhdGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM5MmM2MgotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS8uY2xhc3NwYXRoCkBAIC0wLDAgKzEsOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxjbGFzc3BhdGg+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+CisJPGNsYXNzcGF0aGVudHJ5IG91dHB1dD0ic3JjX2FudF9iaW4iIGtpbmQ9InNyYyIgcGF0aD0ic3JjX2FudC8iLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS40Ii8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Cis8L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS8uZXh0ZXJuYWxUb29sQnVpbGRlcnMvQnVpbGQgQW50IFN1cHBvcnQgSkFSLmxhdW5jaCBiL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS8uZXh0ZXJuYWxUb29sQnVpbGRlcnMvQnVpbGQgQW50IFN1cHBvcnQgSkFSLmxhdW5jaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjVkMzEzCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlLy5leHRlcm5hbFRvb2xCdWlsZGVycy9CdWlsZCBBbnQgU3VwcG9ydCBKQVIubGF1bmNoCkBAIC0wLDAgKzEsMTcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8bGF1bmNoQ29uZmlndXJhdGlvbiB0eXBlPSJvcmcuZWNsaXBzZS5hbnQuQW50QnVpbGRlckxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIj4KKzxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcudWkuQVRUUl9MQVVOQ0hfSU5fQkFDS0dST1VORCIgdmFsdWU9ImZhbHNlIi8+Cis8Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmFudC51aS5ERUZBVUxUX1ZNX0lOU1RBTEwiIHZhbHVlPSJmYWxzZSIvPgorPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkRFRkFVTFRfQ0xBU1NQQVRIIiB2YWx1ZT0idHJ1ZSIvPgorPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuQVRUUl9SVU5fQlVJTERfS0lORFMiIHZhbHVlPSJmdWxsLGluY3JlbWVudGFsLGF1dG8sY2xlYW4iLz4KKzxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuYW50LnVpLkFUVFJfVEFSR0VUU19VUERBVEVEIiB2YWx1ZT0idHJ1ZSIvPgorPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLmFwcGVuZEVudmlyb25tZW50VmFyaWFibGVzIiB2YWx1ZT0idHJ1ZSIvPgorPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLkFUVFJfVFJJR0dFUlNfQ09ORklHVVJFRCIgdmFsdWU9InRydWUiLz4KKzxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkNMQVNTUEFUSF9QUk9WSURFUiIgdmFsdWU9Im9yZy5lY2xpcHNlLmFudC51aS5BbnRDbGFzc3BhdGhQcm92aWRlciIvPgorPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLnRhcmdldF9ydW5fcGVyc3BlY3RpdmUiIHZhbHVlPSJwZXJzcGVjdGl2ZV9ub25lIi8+Cis8c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuYW50LnVpLkFUVFJfQU5UX0NMRUFOX1RBUkdFVFMiIHZhbHVlPSJjbGVhbiwiLz4KKzxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLkFUVFJfQlVJTERfU0NPUEUiIHZhbHVlPSIke3dvcmtpbmdfc2V0OiZsdDs/eG1sIHZlcnNpb249JnF1b3Q7MS4wJnF1b3Q7IGVuY29kaW5nPSZxdW90O1VURi04JnF1b3Q7PyZndDsmIzEwOyZsdDtsYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ1NldCBmYWN0b3J5SUQ9JnF1b3Q7b3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuV29ya2luZ1NldEZhY3RvcnkmcXVvdDsgbmFtZT0mcXVvdDt3b3JraW5nU2V0JnF1b3Q7IGVkaXRQYWdlSWQ9JnF1b3Q7b3JnLmVjbGlwc2UudWkucmVzb3VyY2VXb3JraW5nU2V0UGFnZSZxdW90OyZndDsmIzEwOyZsdDtpdGVtIGZhY3RvcnlJRD0mcXVvdDtvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5tb2RlbC5SZXNvdXJjZUZhY3RvcnkmcXVvdDsgcGF0aD0mcXVvdDsvb3JnLmVjbGlwc2UuYW50LmNvcmUvc3JjX2FudCZxdW90OyB0eXBlPSZxdW90OzImcXVvdDsvJmd0OyYjMTA7Jmx0O2l0ZW0gZmFjdG9yeUlEPSZxdW90O29yZy5lY2xpcHNlLnVpLmludGVybmFsLm1vZGVsLlJlc291cmNlRmFjdG9yeSZxdW90OyBwYXRoPSZxdW90Oy9vcmcuZWNsaXBzZS5hbnQuY29yZS9idWlsZGZpbGVzL2J1aWxkRXh0cmFKQVIueG1sJnF1b3Q7IHR5cGU9JnF1b3Q7MSZxdW90Oy8mZ3Q7JiMxMDsmbHQ7L2xhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nU2V0Jmd0OyYjMTA7fSIvPgorPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuQVRUUl9SRUZSRVNIX1NDT1BFIiB2YWx1ZT0iJHt3b3JraW5nX3NldDombHQ7P3htbCB2ZXJzaW9uPSZxdW90OzEuMCZxdW90OyBlbmNvZGluZz0mcXVvdDtVVEYtOCZxdW90Oz8mZ3Q7JiMxMDsmbHQ7bGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdTZXQgZmFjdG9yeUlEPSZxdW90O29yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtpbmdTZXRGYWN0b3J5JnF1b3Q7IG5hbWU9JnF1b3Q7d29ya2luZ1NldCZxdW90OyBlZGl0UGFnZUlkPSZxdW90O29yZy5lY2xpcHNlLnVpLnJlc291cmNlV29ya2luZ1NldFBhZ2UmcXVvdDsmZ3Q7JiMxMDsmbHQ7aXRlbSBmYWN0b3J5SUQ9JnF1b3Q7b3JnLmVjbGlwc2UudWkuaW50ZXJuYWwubW9kZWwuUmVzb3VyY2VGYWN0b3J5JnF1b3Q7IHBhdGg9JnF1b3Q7L29yZy5lY2xpcHNlLmFudC5jb3JlJnF1b3Q7IHR5cGU9JnF1b3Q7NCZxdW90Oy8mZ3Q7JiMxMDsmbHQ7L2xhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nU2V0Jmd0OyYjMTA7fSIvPgorPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuQVRUUl9MT0NBVElPTiIgdmFsdWU9IiR7d29ya3NwYWNlX2xvYzovb3JnLmVjbGlwc2UuYW50LmNvcmUvYnVpbGRmaWxlcy9idWlsZEV4dHJhSkFSLnhtbH0iLz4KKzxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcudWkuQVRUUl9SVU5fSU5fQkFDS0dST1VORCIgdmFsdWU9ImZhbHNlIi8+Cis8L2xhdW5jaENvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvLnByb2plY3QgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvLnByb2plY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM3ZDFjNQotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS8ucHJvamVjdApAQCAtMCwwICsxLDQzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHByb2plY3REZXNjcmlwdGlvbj4KKwk8bmFtZT5vcmcuZWNsaXBzZS5hbnQuY29yZTwvbmFtZT4KKwk8Y29tbWVudD48L2NvbW1lbnQ+CisJPHByb2plY3RzPgorCTwvcHJvamVjdHM+CisJPGJ1aWxkU3BlYz4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5FeHRlcm5hbFRvb2xCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCQk8ZGljdGlvbmFyeT4KKwkJCQkJPGtleT5MYXVuY2hDb25maWdIYW5kbGU8L2tleT4KKwkJCQkJPHZhbHVlPiZsdDtwcm9qZWN0Jmd0Oy8uZXh0ZXJuYWxUb29sQnVpbGRlcnMvQnVpbGQgQW50IFN1cHBvcnQgSkFSLmxhdW5jaDwvdmFsdWU+CisJCQkJPC9kaWN0aW9uYXJ5PgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLmFwaS50b29scy5hcGlBbmFseXNpc0J1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCTwvYnVpbGRTcGVjPgorCTxuYXR1cmVzPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLmFwaS50b29scy5hcGlBbmFseXNpc05hdHVyZTwvbmF0dXJlPgorCTwvbmF0dXJlcz4KKzwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcyBiL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ5MGVjZgotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMKQEAgLTAsMCArMSwzIEBACisjVGh1IE1heSAyNyAxNDo0Nzo1MCBQRFQgMjAwNA0KK2VjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xDQorc2VsZmhvc3RpbmcuYmluRXhjbHVkZXM9L29yZy5lY2xpcHNlLmFudC5jb3JlL3NyY19hbnRfYmluDQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL2Fib3V0Lmh0bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvYWJvdXQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2MwYTI2Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL2Fib3V0Lmh0bWwKQEAgLTAsMCArMSw1NCBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKKyAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KKzx0aXRsZT5BYm91dDwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keSBsYW5nPSJFTi1VUyI+Cis8aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KKyAKKzxwPk9jdG9iZXIgOCwgMjAwOTwvcD4JCis8aDM+TGljZW5zZTwvaDM+CisKKzxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAoraW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQorRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKK2F0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCitGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgorCis8cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAorYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQorYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAorcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCitpbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAorYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KKworPGgzPlRoaXJkIFBhcnR5IENvbnRlbnQ8L2gzPgorCis8cD5UaGUgQ29udGVudCBpbmNsdWRlcyBpdGVtcyB0aGF0IGhhdmUgYmVlbiBzb3VyY2VkIGZyb20gdGhpcmQgcGFydGllcyBhcyBzZXQgb3V0IGJlbG93LiBJZiB5b3UgCitkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIGZvbGxvd2luZyBpcyBwcm92aWRlZCAKK2ZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHksIGFuZCB5b3Ugc2hvdWxkIGxvb2sgdG8gdGhlIFJlZGlzdHJpYnV0b3ImcnNxdW87cyBsaWNlbnNlIGZvciAKK3Rlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVzZS48L3A+CisKKzxoND5BbnQgMS43LjE8L2g0PgorCis8cD5UaGUgZm9sbG93aW5nIGNsYXNzZXMgaW4gdGhlIHBsdWctaW4gSkFSIGFyZSBiYXNlZCBvbiBBbnQgY29kZSAgZGV2ZWxvcGVkIGJ5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgc2hhbGwgYmUgZGVmaW5lZCBhcyB0aGUgJnF1b3Q7QW50LURlcml2ZWQgV29yayZxdW90Ozo8L3A+CisKKzx1bD4KKwk8bGk+b3JnLmVjbGlwc2UuYW50LmludGVybmFsLmNvcmUuYW50LkludGVybmFsQW50UnVubmVyPC9saT4KKwk8bGk+b3JnLmVjbGlwc2UuYW50LmludGVybmFsLmNvcmUuYW50LkludGVybmFsUHJvamVjdDwvbGk+Cis8L3VsPgorCis8cD5UaGUgYmluYXJ5IGNvZGUgZm9yIHRoZSBBbnQtRGVyaXZlZCBXb3JrIGlzIGxvY2F0ZWQgaW4gbGliL2FudHN1cHBvcnRsaWIuamFyIGFuZCB0aGUgc291cmNlIGNvZGUgaXMgbG9jYXRlZCBpbiBsaWIvYW50c3VwcG9ydGxpYnNyYy56aXAuPC9wPgorCis8cD5Zb3VyIHVzZSBvZiB0aGUgQW50LURlcml2ZWQgV29yayBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wLiAgQSBjb3B5IG9mIHRoZSBsaWNlbnNlIGlzIGNvbnRhaW5lZAoraW4gdGhlIGZpbGUgPGEgaHJlZj0iYWJvdXRfZmlsZXMvYXNsLXYyMC50eHQiIHRhcmdldD0iX2JsYW5rIj5hYm91dF9maWxlcy9hc2wtdjIwLnR4dDwvYT4gYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC5odG1sIiB0YXJnZXQ9Il9ibGFuayI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLmh0bWw8L2E+LgorCis8cD5UaGUgbmFtZXMgJnF1b3Q7QW50JnF1b3Q7IGFuZCAgJnF1b3Q7QXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24mcXVvdDsgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgCitzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IDxhIGhyZWY9Im1haWx0bzphcGFjaGVAYXBhY2hlLm9yZyI+YXBhY2hlQGFwYWNoZS5vcmc8L2E+LjwvcD4KKworPHA+VGhlIEFwYWNoZSBhdHRyaWJ1dGlvbiA8YSBocmVmPSJhYm91dF9maWxlcy9OT1RJQ0UiIHRhcmdldD0iX2JsYW5rIj5OT1RJQ0U8L2E+IGZpbGUgaXMgaW5jbHVkZWQgd2l0aCB0aGUgQ29udGVudCBpbiBhY2NvcmRhbmNlIHdpdGggNGQgb2YgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC48L3A+CisKKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvYWJvdXRfZmlsZXMvTk9USUNFIGIvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL2Fib3V0X2ZpbGVzL05PVElDRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmI2ZGRlCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL2Fib3V0X2ZpbGVzL05PVElDRQpAQCAtMCwwICsxLDE1IEBACisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICA9PSAgTk9USUNFIGZpbGUgY29ycmVzcG9uZGluZyB0byB0aGUgc2VjdGlvbiA0IGQgb2YgICAgICAgICAgICAgICAgICAgID09CisgICA9PSAgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09CisgICA9PSAgaW4gdGhpcyBjYXNlIGZvciB0aGUgQXBhY2hlIEFudCBkaXN0cmlidXRpb24uICAgICAgICAgICAgICAgICAgICAgID09CisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkKKyAgIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuCisKKyAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBhbHNvIHNvZnR3YXJlIGRldmVsb3BlZCBieSA6CisgICAgIC0gdGhlIFczQyBjb25zb3J0aXVtIChodHRwOi8vd3d3LnczYy5vcmcpICwKKyAgICAgLSB0aGUgU0FYIHByb2plY3QgKGh0dHA6Ly93d3cuc2F4cHJvamVjdC5vcmcpCisKKyAgIFBsZWFzZSByZWFkIHRoZSBkaWZmZXJlbnQgTElDRU5TRSBmaWxlcyBwcmVzZW50IGluIHRoZSByb290IGRpcmVjdG9yeSBvZgorICAgdGhpcyBkaXN0cmlidXRpb24uCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvYWJvdXRfZmlsZXMvYXNsLXYyMC50eHQgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvYWJvdXRfZmlsZXMvYXNsLXYyMC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY0NTY5NQotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9hYm91dF9maWxlcy9hc2wtdjIwLnR4dApAQCAtMCwwICsxLDIwMiBAQAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAorICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLworCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KKworICAgMS4gRGVmaW5pdGlvbnMuCisKKyAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCisgICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KKworICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KKworICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAorICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgorICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKKyAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQorICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKKyAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQorICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KKworICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KKworICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCisgICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCisgICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgorCisgICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAorICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAorICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAorICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgorCisgICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgorICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQorICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCisgICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgorCisgICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0CisgICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCisgICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCisgICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcworICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCisgICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCisgICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgorCisgICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZworICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucworICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5CisgICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCisgICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgorICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAorICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KKyAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCisgICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQorICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0CisgICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQorICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCisKKyAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKKyAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgorCisgICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKKyAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQorICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KKworICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCisgICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKKyAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCisgICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgorICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQorICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKKyAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCisgICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCisgICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAorICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcworICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCisgICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCisKKyAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCisgICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKKyAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91CisgICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKKyAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAorCisgICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCisKKyAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcworICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKKyAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAorICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKKyAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCisKKyAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cworICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKKyAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKKyAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKKyAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKKyAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAorICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKKyAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKKyAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCisgICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCisgICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAorICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCisgICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKKyAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKKyAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKKyAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAorICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgorICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCisgICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKKyAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCisKKyAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKKyAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaworICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgorICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQorICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKKyAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KKworICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQorICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAorICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCisgICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KKworICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCisgICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCisgICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKKyAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKKyAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQorICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CisgICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCisKKyAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAorICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCisgICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQorICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKKyAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKKyAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQorICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQorICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAorICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKKyAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKKyAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKworICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZworICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKKyAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCisgICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcworICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKKyAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCisgICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCisgICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKKyAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KKyAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgorCisgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKworICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgorCisgICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZworICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgorICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKKyAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCisgICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKKyAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKKyAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgorICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgorCisgICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KKworICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9idWlsZC5wcm9wZXJ0aWVzIGIvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL2J1aWxkLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFmM2IwOAotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9idWlsZC5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMjUgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisjIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorIyAKKyMgQ29udHJpYnV0b3JzOgorIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitzb3VyY2UuLiA9c3JjLworc291cmNlLmxpYi9hbnRzdXBwb3J0bGliLmphcj1zcmNfYW50Lworc3JjLmluY2x1ZGVzID0gYWJvdXQuaHRtbCxcCisgICAgICAgICAgICAgICBzY2hlbWEvLFwKKyAgICAgICAgICAgICAgIGFib3V0X2ZpbGVzLworYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCisgICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCisgICAgICAgICAgICAgICBhYm91dC5odG1sLFwKKyAgICAgICAgICAgICAgIC4sXAorICAgICAgICAgICAgICAgbGliLyouamFyLFwKKyAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCisgICAgICAgICAgICAgICBhYm91dF9maWxlcy8KK2phcnMuY29tcGlsZS5vcmRlcj0uLGxpYi9hbnRzdXBwb3J0bGliLmphcgoramFycy5leHRyYS5jbGFzc3BhdGg9cGxhdGZvcm06L3BsdWdpbi9vcmcuYXBhY2hlLmFudC9saWIvYW50LmphcixwbGF0Zm9ybTovcGx1Z2luL29yZy5hcGFjaGUuYW50L2xpYi9hbnQtbGF1bmNoZXIuamFyCitqYXZhZG9jLnBhY2thZ2VzPW9yZy5lY2xpcHNlLioKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvYnVpbGRmaWxlcy9leHBvcnRwbHVnaW4ueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL2J1aWxkZmlsZXMvZXhwb3J0cGx1Z2luLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGRmNWMzCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL2J1aWxkZmlsZXMvZXhwb3J0cGx1Z2luLnhtbApAQCAtMCwwICsxLDM3IEBACis8IS0tIEV4cG9ydCBhIGphciBvZiAuY2xhc3MgZmlsZXMgZm9yIHRoZSBvcmcuZWNsaXBzZS5hbnQuY29yZSBFY2xpcHNlIHBsdWctaW4KKyAgICAgYWxvbmcgd2l0aCBvdGhlciBpbXBvcnRhbnQgcGx1Z2luIGZpbGVzIHRvIHRoZSAicGx1Z2luLWV4cG9ydCIgc3ViZGlyZWN0b3J5CisgICAgIG9mIHRoZSB0YXJnZXQgRWNsaXBzZSBpbnN0YWxsYXRpb24gLS0+Cis8cHJvamVjdCBuYW1lPSJFeHBvcnQgYW50LmNvcmUiIGRlZmF1bHQ9ImV4cG9ydCIgYmFzZWRpcj0iLi4iPgorCisJPCEtLSBTZXQgdGhlIHRpbWVzdGFtcCBhbmQgaW1wb3J0YW50IHByb3BlcnRpZXMgLS0+CisJPHRhcmdldCBuYW1lPSJpbml0Ij4KKwkJPHRzdGFtcC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXN0ZGlyIiB2YWx1ZT0iLi4vLi4vcGx1Z2luLWV4cG9ydCIgLz4KKwkJPHByb3BlcnR5IG5hbWU9ImRlc3QiICB2YWx1ZT0iJHtkZXN0ZGlyfS9vcmcuZWNsaXBzZS5hbnQuY29yZV8zLjAuMCIgLz4KKwk8L3RhcmdldD4KKworCTwhLS0gQ3JlYXRlIHRoZSBqYXIgb2YgLmNsYXNzIGZpbGVzLCBhbmQgY29weSBvdGhlciBpbXBvcnRhbnQgZmlsZXMgdG8gZXhwb3J0IGRpciAtLT4KKwk8dGFyZ2V0IG5hbWU9ImV4cG9ydCIgZGVwZW5kcz0iaW5pdCI+CisJCTxta2RpciBkaXI9IiR7ZGVzdGRpcn0iIC8+CisJCTxkZWxldGUgZGlyPSIke2Rlc3R9IiAvPgorCQk8bWtkaXIgZGlyPSIke2Rlc3R9IiAvPgorCQk8ZGVsZXRlIGRpcj0iJHtkZXN0fS9saWIiLz4KKwkJPG1rZGlyIGRpcj0iJHtkZXN0fS9saWIiLz4KKwkJPGphciBkZXN0ZmlsZT0iJHtkZXN0fS9hbnRzdXBwb3J0LmphciI+CisJCQk8ZmlsZXNldCBkaXI9ImJpbiI+CisJCQkJPGV4Y2x1ZGUgbmFtZT0ib3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2NvcmUvYW50LyoiLz4KKwkJCTwvZmlsZXNldD4KKwkJPC9qYXI+CisJCTwhLS0gQ3JlYXRlIHRoZSBzb3VyY2UgemlwIC0tPgorCQk8emlwIGRlc3RmaWxlPSIke2Rlc3R9L2FudHN1cHBvcnRzcmMuemlwIj4KKwkJCTxmaWxlc2V0IGRpcj0ic3JjIi8+CisJCTwvemlwPgorCQk8Y29weSBmaWxlPSJwbHVnaW4ueG1sIiB0b2Rpcj0iJHtkZXN0fSIvPgorCQk8Y29weSBmaWxlPSJwbHVnaW4ucHJvcGVydGllcyIgdG9kaXI9IiR7ZGVzdH0iLz4KKwkJPGNvcHkgZmlsZT0iLmNsYXNzcGF0aCIgdG9kaXI9IiR7ZGVzdH0iLz4KKwkJPGNvcHkgZmlsZT0iLm9wdGlvbnMiIHRvZGlyPSIke2Rlc3R9Ii8+CisJCTxhbnQgYW50ZmlsZT0iYnVpbGRmaWxlcy9idWlsZEV4dHJhSkFSLnhtbCIgdGFyZ2V0PSJidWlsZCIvPgorCQk8Y29weSBmaWxlPSJsaWIvYW50c3VwcG9ydGxpYi5qYXIiIHRvZGlyPSIke2Rlc3R9L2xpYiIvPgorCTwvdGFyZ2V0PgorCQorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkM2Q1MjYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxOSBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisjIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjIAorIyBDb250cmlidXRvcnM6CisjICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworcGx1Z2luTmFtZSA9IEFudCBCdWlsZCBUb29sIENvcmUKK3Byb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCitjbGFzc3BhdGhOYW1lID0gRXh0cmEgQW50IENsYXNzcGF0aCBFbnRyeSBEZWZpbml0aW9ucwordGFza3NOYW1lID0gQW50IFRhc2sgRGVmaW5pdGlvbnMKK3R5cGVzTmFtZSA9IEFudCBUeXBlIERlZmluaXRpb25zCitwcm9wZXJ0aWVzTmFtZSA9IEFudCBQcm9wZXJ0aWVzIERlZmluaXRpb25zCisKK2FudEJ1aWxkRmlsZUNvbnRlbnRUeXBlLm5hbWU9IEFudCBCdWlsZGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zY2hlbWEvYW50UHJvcGVydGllcy5leHNkIGIvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NjaGVtYS9hbnRQcm9wZXJ0aWVzLmV4c2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBhODEyZAotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zY2hlbWEvYW50UHJvcGVydGllcy5leHNkCkBAIC0wLDAgKzEsMTQ5IEBACis8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/Pg0KKzwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+DQorPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmFudC5jb3JlIj4NCis8YW5ub3RhdGlvbj4NCisgICAgICA8YXBwSW5mbz4NCisgICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5hbnQuY29yZSIgaWQ9ImFudFByb3BlcnRpZXMiIG5hbWU9IkFudCBQcm9wZXJ0aWVzIi8+DQorICAgICAgPC9hcHBJbmZvPg0KKyAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgIEFsbG93cyBwbHVnLWlucyB0byBkZWZpbmUgQW50IHByb3BlcnRpZXMgZm9yIHVzZSBpbiBBbnQgYnVpbGQgZmlsZXMuDQorICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgIDwvYW5ub3RhdGlvbj4NCisNCisgICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPg0KKyAgICAgIDxjb21wbGV4VHlwZT4NCisgICAgICAgICA8c2VxdWVuY2U+DQorICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJhbnRQcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPg0KKyAgICAgICAgIDwvc2VxdWVuY2U+DQorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCisgICAgICAgICAgICA8YW5ub3RhdGlvbj4NCisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50DQorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCisgICAgICAgICA8L2F0dHJpYnV0ZT4NCisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPg0KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICA8L2Fubm90YXRpb24+DQorICAgICAgICAgPC9hdHRyaWJ1dGU+DQorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPg0KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICA8L2Fubm90YXRpb24+DQorICAgICAgICAgPC9hdHRyaWJ1dGU+DQorICAgICAgPC9jb21wbGV4VHlwZT4NCisgICA8L2VsZW1lbnQ+DQorDQorICAgPGVsZW1lbnQgbmFtZT0iYW50UHJvcGVydHkiPg0KKyAgICAgIDxhbm5vdGF0aW9uPg0KKyAgICAgICAgIDxhcHBJbmZvPg0KKyAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9Im5hbWUiLz4NCisgICAgICAgICA8L2FwcEluZm8+DQorICAgICAgPC9hbm5vdGF0aW9uPg0KKyAgICAgIDxjb21wbGV4VHlwZT4NCisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQorICAgICAgICAgICAgPGFubm90YXRpb24+DQorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5Lg0KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICA8L2Fubm90YXRpb24+DQorICAgICAgICAgPC9hdHRyaWJ1dGU+DQorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ic3RyaW5nIj4NCisgICAgICAgICAgICA8YW5ub3RhdGlvbj4NCisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICAgICAgICBUaGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5LiBJZiBhIHZhbHVlIGlzIHByb3ZpZGVkIGhlcmUsIHRoZSAmcXVvdDtjbGFzcyZxdW90OyBhdHRyaWJ1dGUgaXMgaWdub3JlZC4NCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KKyAgICAgICAgIDwvYXR0cmlidXRlPg0KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyI+DQorICAgICAgICAgICAgPGFubm90YXRpb24+DQorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgICAgICAgSWYgdGhlcmUgaXMgbm8gJmFwb3M7dmFsdWUmYXBvczsgYXR0cmlidXRlIHByb3ZpZGVkLCB0aGlzIGNsYXNzIGlzIGNhbGxlZCB0byByZXR1cm4gdGhlIGR5bmFtaWMgdmFsdWUgZm9yIHRoZSBBbnQgcHJvcGVydHkuICBJZiAmbHQ7Y29kZSZndDtudWxsJmx0Oy9jb2RlJmd0OyBpcyByZXR1cm5lZCwgdGhlIHZhbHVlIGlzIG5vdCBzZXQuDQorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgICAgIDxhcHBJbmZvPg0KKyAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS5hbnQuY29yZS5JQW50UHJvcGVydHlWYWx1ZVByb3ZpZGVyIi8+DQorICAgICAgICAgICAgICAgPC9hcHBJbmZvPg0KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCisgICAgICAgICA8L2F0dHJpYnV0ZT4NCisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImhlYWRsZXNzIiB0eXBlPSJib29sZWFuIj4NCisgICAgICAgICAgICA8YW5ub3RhdGlvbj4NCisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICAgICAgICBpbmRpY2F0ZXMgd2hldGhlciB0aGlzIHByb3BlcnR5IGlzIHN1aXRhYmxlIGZvciB1c2UgaW4gYSAmcXVvdDtoZWFkbGVzcyZxdW90OyBBbnQgZW52aXJvbm1lbnQuIElmIHJ1bm5pbmcgaGVhZGxlc3MgYW5kIHRoZSBhdHRyaWJ1dGUgaXMgJnF1b3Q7ZmFsc2UmcXVvdDssIHRoZSBwcm9wZXJ0eSB3aWxsIG5vdCBiZSBzZXQgYW5kIGFueSBzcGVjaWZpZWQgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2UuYW50LmNvcmUuSUFudFByb3BlcnR5VmFsdWVQcm92aWRlciZsdDsvY29kZSZndDsgd2lsbCBub3QgYmUgaW5zdGFudGlhdGVkLiBUaGUgaW1wbGllZCB2YWx1ZSBpcyAmbHQ7Y29kZSZndDt0cnVlJmx0Oy9jb2RlJmd0Oywgd2hlbiBub3Qgc3BlY2lmaWVkLg0KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICA8L2Fubm90YXRpb24+DQorICAgICAgICAgPC9hdHRyaWJ1dGU+DQorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJlY2xpcHNlUnVudGltZSIgdHlwZT0iYm9vbGVhbiI+DQorICAgICAgICAgICAgPGFubm90YXRpb24+DQorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgICAgICAgaW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBwcm9wZXJ0eSBzaG91bGQgb25seSBiZSBjb25zaWRlcmVkIHdoZW4gcnVuIGluIHRoZSBzYW1lIFZNIGFzIEVjbGlwc2UuIFRoZSBpbXBsaWVkIHZhbHVlIGlzICZsdDtjb2RlJmd0O3RydWUmbHQ7L2NvZGUmZ3Q7LCB3aGVuIG5vdCBzcGVjaWZpZWQuDQorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCisgICAgICAgICA8L2F0dHJpYnV0ZT4NCisgICAgICA8L2NvbXBsZXhUeXBlPg0KKyAgIDwvZWxlbWVudD4NCisNCisgICA8YW5ub3RhdGlvbj4NCisgICAgICA8YXBwSW5mbz4NCisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+DQorICAgICAgPC9hcHBJbmZvPg0KKyAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgIDMuMA0KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICA8L2Fubm90YXRpb24+DQorDQorICAgPGFubm90YXRpb24+DQorICAgICAgPGFwcEluZm8+DQorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPg0KKyAgICAgIDwvYXBwSW5mbz4NCisgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYW4gQW50IHByb3BlcnRpZXMgZXh0ZW5zaW9uIHBvaW50OiANCismbHQ7cCZndDsNCismbHQ7cHJlJmd0Ow0KKyAgICZsdDtleHRlbnNpb24gcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2UuYW50LmNvcmUuYW50UHJvcGVydGllcyZxdW90OyZndDsNCisgICAgICAmbHQ7YW50UHJvcGVydHkgbmFtZT0mcXVvdDtlY2xpcHNlLmhvbWUmcXVvdDsNCisgICAgICAgICAgIGNsYXNzPSZxdW90O29yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5jb3JlLkFudFByb3BlcnR5VmFsdWVQcm92aWRlciZxdW90Oy8mZ3Q7DQorICAgICAgJmx0O2FudFByb3BlcnR5IG5hbWU9JnF1b3Q7ZWNsaXBzZS5ydW5uaW5nJnF1b3Q7DQorICAgICAgICAgICB2YWx1ZT0mcXVvdDt0cnVlJnF1b3Q7LyZndDsNCisgICAmbHQ7L2V4dGVuc2lvbiZndDsgDQorJmx0Oy9wcmUmZ3Q7DQorJmx0Oy9wJmd0Ow0KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICA8L2Fubm90YXRpb24+DQorDQorICAgPGFubm90YXRpb24+DQorICAgICAgPGFwcEluZm8+DQorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+DQorICAgICAgPC9hcHBJbmZvPg0KKyAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgIFRoZSBjbGFzcyBuYW1lZCBpbiB0aGUgJmx0O3NhbXAmZ3Q7Y2xhc3MmbHQ7L3NhbXAmZ3Q7IHByb3BlcnR5IG11c3QgaW1wbGVtZW50IHRoZSAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS5hbnQuY29yZS5JQW50UHJvcGVydHlWYWx1ZVByb3ZpZGVyJmx0Oy9zYW1wJmd0OyBpbnRlcmZhY2UuDQorICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgIDwvYW5ub3RhdGlvbj4NCisNCisgICA8YW5ub3RhdGlvbj4NCisgICAgICA8YXBwSW5mbz4NCisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+DQorICAgICAgPC9hcHBJbmZvPg0KKyAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgIFRoZSBwbGF0Zm9ybSB1c2VzIHRoaXMgbWVjaGFuaXNtIHRvIHNldCB0aGUgQW50IHByb3BlcnR5IGVjbGlwc2UuaG9tZSB0byB0aGUgRWNsaXBzZSBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IGFuZCB0byBzZXQgdGhlIGVjbGlwc2UucnVubmluZyBwcm9wZXJ0eS4NCisgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgPC9hbm5vdGF0aW9uPg0KKw0KKyAgIDxhbm5vdGF0aW9uPg0KKyAgICAgIDxhcHBJbmZvPg0KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+DQorICAgICAgPC9hcHBJbmZvPg0KKyAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7DQorQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSANCithdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggDQorYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgDQorJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsNCisgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgPC9hbm5vdGF0aW9uPg0KKw0KKzwvc2NoZW1hPg0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zY2hlbWEvYW50VHlwZXMuZXhzZCBiL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zY2hlbWEvYW50VHlwZXMuZXhzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzZkMzFkCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NjaGVtYS9hbnRUeXBlcy5leHNkCkBAIC0wLDAgKzEsMTQxIEBACis8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgorPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KKzxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5hbnQuY29yZSI+Cis8YW5ub3RhdGlvbj4KKyAgICAgIDxhcHBJbmZvPgorICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuYW50LmNvcmUiIGlkPSJhbnRUeXBlcyIgbmFtZT0iQW50IFR5cGVzIi8+CisgICAgICA8L2FwcEluZm8+CisgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgIEFsbG93cyBwbHVnLWlucyB0byBkZWZpbmUgYXJiaXRyYXJ5IEFudCBkYXRhdHlwZXMgZm9yIAordXNlIGJ5IHRoZSBBbnQgaW5mcmFzdHJ1Y3R1cmUuICBUaGUgc3RhbmRhcmQgQW50IAoraW5mcmFzdHJ1Y3R1cmUgYWxsb3dzIGZvciB0aGUgYWRkaXRpb24gb2YgYXJiaXRyYXJ5IAorZGF0YXR5cGVzLiAgVW5mb3J0dW5hdGVseSwgaXQgaXMgdW5saWtlbHkgdGhhdCB0aGUgCitBbnQgQ29yZSBwbHVnLWluIHdvdWxkIGhhdmUgdGhlIGNsYXNzZXMgcmVxdWlyZWQgCitieSB0aGVzZSBkYXRhdHlwZXMgb24gaXRzIGNsYXNzcGF0aCAob3IgdGhhdCBvZiBhbnkgCitvZiBpdHMgcHJlcmVxdWlzaXRlcykuICBUbyBhZGRyZXNzIHRoaXMsIGNsaWVudHMgCitzaG91bGQgZGVmaW5lIGFuIGV4dGVuc2lvbiB3aGljaCBwbHVncyBpbnRvIHRoaXMgCitleHRlbnNpb24tcG9pbnQgYW5kIG1hcHMgYSBkYXRhdHlwZSBuYW1lIG9udG8gYSBjbGFzcy4gIAorVGhlIEFudCBwbHVnLWluIGNhbiB0aGVuIHJlcXVlc3QgdGhhdCB0aGUgZGVjbGFyaW5nIAorcGx1Zy1pbiBsb2FkIHRoZSBzcGVjaWZpZWQgY2xhc3MuCisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKyAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+CisgICAgICA8Y29tcGxleFR5cGU+CisgICAgICAgICA8c2VxdWVuY2U+CisgICAgICAgICAgICA8ZWxlbWVudCByZWY9ImFudFR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgICAgIDwvc2VxdWVuY2U+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8L2NvbXBsZXhUeXBlPgorICAgPC9lbGVtZW50PgorCisgICA8ZWxlbWVudCBuYW1lPSJhbnRUeXBlIj4KKyAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgPGFwcEluZm8+CisgICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJuYW1lIi8+CisgICAgICAgICA8L2FwcEluZm8+CisgICAgICA8L2Fubm90YXRpb24+CisgICAgICA8Y29tcGxleFR5cGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgbmFtZSBvZiB0aGUgdHlwZSB0byBiZSBkZWZpbmVkCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9InVyaSIgdHlwZT0ic3RyaW5nIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICAgVGhlIHVyaSB0aGF0IHRoaXMgZGVmaW5pdGlvbiBzaG91bGQgbGl2ZSBpbi4gT25seSB1c2VkIGlmIHVzaW5nIEFudCBuZXdlciB0aGFuIDEuNi4KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBKYXZhIGNsYXNzIGltcGxlbWVudGluZyAKK3RoZSBkYXRhdHlwZS4gIEdlbmVyYWxseSB0aGlzIGNsYXNzIG11c3QgYmUgYSBzdWJjbGFzcyBvZgorJmx0O2NvZGUmZ3Q7b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRGF0YVR5cGUmbHQ7L2NvZGUmZ3Q7LgorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgPGFwcEluZm8+CisgICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRGF0YVR5cGUiLz4KKyAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsaWJyYXJ5IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIGEgcGF0aCByZWxhdGl2ZSB0byB0aGUgcGx1Zy1pbiBpbnN0YWxsIGxvY2F0aW9uIGZvciB0aGUgbGlicmFyeSBjb250YWluaW5nIHRoZSB0eXBlLgorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgPGFwcEluZm8+CisgICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0icmVzb3VyY2UiLz4KKyAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJoZWFkbGVzcyIgdHlwZT0iYm9vbGVhbiI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgaW5kaWNhdGVzIHdoZXRoZXIgdGhpcyB0eXBlIGlzIHN1aXRhYmxlIGZvciB1c2UgaW4gYSAmcXVvdDtoZWFkbGVzcyZxdW90OyBBbnQgZW52aXJvbm1lbnQuIElmIHJ1bm5pbmcgaGVhZGxlc3MgYW5kIHRoZSBhdHRyaWJ1dGUgaXMgJmx0O2NvZGUmZ3Q7ZmFsc2UmbHQ7L2NvZGUmZ3Q7LCB0aGUgdHlwZSB3aWxsIG5vdCBiZSBsb2FkZWQgb3IgZGVmaW5lZC4gQXMgd2VsbCwgdGhlIHBsdWdpbiBjbGFzcyBsb2FkZXIgd2lsbCBub3QgYmUgYWRkZWQgYXMgYSBwYXJlbnQgY2xhc3Nsb2FkZXIgdG8gdGhlIEFudCBjbGFzc2xvYWRlci4gVGhlIGltcGxpZWQgdmFsdWUgaXMgJmx0O2NvZGUmZ3Q7dHJ1ZSZsdDsvY29kZSZndDssIHdoZW4gbm90IHNwZWNpZmllZC4KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJlY2xpcHNlUnVudGltZSIgdHlwZT0iYm9vbGVhbiI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgaW5kaWNhdGVzIHdoZXRoZXIgdGhpcyB0eXBlIHJlcXVpcmVzIGFuIEVjbGlwc2UgcnVudGltZSAoaS5lLiBtdXN0IGJlIHJ1biBpbiB0aGUgc2FtZSBWTSBhcyBFY2xpcHNlKS4gVGhlIGltcGxpZWQgdmFsdWUgaXMgJmx0O2NvZGUmZ3Q7dHJ1ZSZsdDsvY29kZSZndDssIHdoZW4gbm90IHNwZWNpZmllZC4KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPC9jb21wbGV4VHlwZT4KKyAgIDwvZWxlbWVudD4KKworICAgPGFubm90YXRpb24+CisgICAgICA8YXBwSW5mbz4KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KKyAgICAgIDwvYXBwSW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGFuIEFudCB0eXBlcyBleHRlbnNpb24gcG9pbnQ6IAorJmx0O3AmZ3Q7CismbHQ7cHJlJmd0OworICAgJmx0O2V4dGVuc2lvbiBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS5hbnQuY29yZS5hbnRUeXBlcyZxdW90OyZndDsKKyAgICAgICZsdDthbnRUeXBlIG5hbWU9JnF1b3Q7Y29vbFR5cGUmcXVvdDsgY2xhc3M9JnF1b3Q7Y29tLmV4YW1wbGUuQ29vbFR5cGUmcXVvdDsgbGlicmFyeT0mcXVvdDtsaWIvYW50U3VwcG9ydC5qYXImcXVvdDsvJmd0OworICAgJmx0Oy9leHRlbnNpb24mZ3Q7IAorJmx0Oy9wcmUmZ3Q7CismbHQ7L3AmZ3Q7CisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKyAgIDxhbm5vdGF0aW9uPgorICAgICAgPGFwcEluZm8+CisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgorICAgICAgPC9hcHBJbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OworQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKK2F2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKK2FjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvc2NoZW1hL2V4dHJhQ2xhc3NwYXRoRW50cmllcy5leHNkIGIvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NjaGVtYS9leHRyYUNsYXNzcGF0aEVudHJpZXMuZXhzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTU3OTc3Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NjaGVtYS9leHRyYUNsYXNzcGF0aEVudHJpZXMuZXhzZApAQCAtMCwwICsxLDExMyBAQAorPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KKzwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Cis8c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuYW50LmNvcmUiPgorPGFubm90YXRpb24+CisgICAgICA8YXBwSW5mbz4KKyAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmFudC5jb3JlIiBpZD0iZXh0cmFDbGFzc3BhdGhFbnRyaWVzIiBuYW1lPSJFeHRyYSBBbnQgQ2xhc3NwYXRoIEVudHJpZXMiLz4KKyAgICAgIDwvYXBwSW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgQWxsb3dzIHBsdWctaW5zIHRvIGRlZmluZSBhcmJpdHJhcnkgSkFScyBmb3IgdXNlIGJ5IHRoZSBBbnQgaW5mcmFzdHJ1Y3R1cmUuCitUaGVzZSBKQVJzIGFyZSBwdXQgaW50byB0aGUgQW50IGNsYXNzcGF0aCBhdCBydW50aW1lLiAgQmVzaWRlcwordGhlIEpBUiwgdGhlIHBsdWctaW4gY2xhc3Nsb2FkZXIgb2YgdGhlIHBsdWctaW4gcHJvdmlkaW5nIHRoZQorSkFSIGlzIGFsc28gYWRkZWQgdG8gdGhlIGNsYXNzcGF0aC4KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KKyAgICAgIDxjb21wbGV4VHlwZT4KKyAgICAgICAgIDxzZXF1ZW5jZT4KKyAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZXh0cmFDbGFzc3BhdGhFbnRyeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgICAgPC9zZXF1ZW5jZT4KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludAorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDwvY29tcGxleFR5cGU+CisgICA8L2VsZW1lbnQ+CisKKyAgIDxlbGVtZW50IG5hbWU9ImV4dHJhQ2xhc3NwYXRoRW50cnkiPgorICAgICAgPGNvbXBsZXhUeXBlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsaWJyYXJ5IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIGEgcGF0aCByZWxhdGl2ZSB0byB0aGUgcGx1Zy1pbiBpbnN0YWxsIGxvY2F0aW9uIGZvciB0aGUgbGlicmFyeS4KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgIDxhcHBJbmZvPgorICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9InJlc291cmNlIi8+CisgICAgICAgICAgICAgICA8L2FwcEluZm8+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaGVhZGxlc3MiIHR5cGU9ImJvb2xlYW4iPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIGluZGljYXRlcyB3aGV0aGVyIHRoaXMgZXh0cmEgY2xhc3NwYXRoIGVudHJ5IGlzIHN1aXRhYmxlIGZvciB1c2UgaW4gYSAmcXVvdDtoZWFkbGVzcyZxdW90OyBBbnQgZW52aXJvbm1lbnQuIElmIHJ1bm5pbmcgaGVhZGxlc3MgYW5kIHRoZSBhdHRyaWJ1dGUgaXMgJmx0O2NvZGUmZ3Q7ZmFsc2UmbHQ7L2NvZGUmZ3Q7LCB0aGlzIGVudHJ5IHdpbGwgbm90IGJlIGFkZGVkIHRvIHRoZSBBbnQgY2xhc3NwYXRoLiBBcyB3ZWxsLCB0aGUgcGx1Z2luIGNsYXNzIGxvYWRlciB3aWxsIG5vdCBiZSBhZGRlZCBhcyBhIHBhcmVudCBjbGFzc2xvYWRlciB0byB0aGUgQW50IGNsYXNzbG9hZGVyLiBUaGUgaW1wbGllZCB2YWx1ZSBpcyAmbHQ7Y29kZSZndDt0cnVlJmx0Oy9jb2RlJmd0Oywgd2hlbiBub3Qgc3BlY2lmaWVkLgorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImVjbGlwc2VSdW50aW1lIiB0eXBlPSJib29sZWFuIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICBpbmRpY2F0ZXMgd2hldGhlciB0aGlzIGV4dHJhIGNsYXNzcGF0aCBlbnRyeSBzaG91bGQgb25seSBiZSBjb25zaWRlcmVkIGZvciBidWlsZHMgcnVuIGluIHRoZSBzYW1lIFZNIGFzIEVjbGlwc2UuIFRoZSBpbXBsaWVkIHZhbHVlIGlzIHRydWUsIHdoZW4gbm90IHNwZWNpZmllZC4KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPC9jb21wbGV4VHlwZT4KKyAgIDwvZWxlbWVudD4KKworICAgPGFubm90YXRpb24+CisgICAgICA8YXBwSW5mbz4KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KKyAgICAgIDwvYXBwSW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGFuIGV4dHJhIGNsYXNzcGF0aCBlbnRyaWVzIGV4dGVuc2lvbiBwb2ludDoKKworJmx0O3AmZ3Q7CismbHQ7cHJlJmd0OworICZsdDtleHRlbnNpb24gcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2UuYW50LmNvcmUuZXh0cmFDbGFzc3BhdGhFbnRyaWVzJnF1b3Q7Jmd0OworICAmbHQ7ZXh0cmFDbGFzc3BhdGhFbnRyeSBsaWJyYXJ5PSZxdW90O215RXh0cmFMaWJyYXJ5LmphciZxdW90Oy8mZ3Q7CisgJmx0Oy9leHRlbnNpb24mZ3Q7CismbHQ7L3ByZSZndDsKKyZsdDsvcCZndDsKKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworICAgPGFubm90YXRpb24+CisgICAgICA8YXBwSW5mbz4KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KKyAgICAgIDwvYXBwSW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgVGhlIHBsYXRmb3JtIGl0c2VsZiBzdXBwbGllcyBhbiBBbnQgc3VwcG9ydCBqYXIgKGFudHN1cHBvcnRsaWIuamFyKS4KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworICAgPGFubm90YXRpb24+CisgICAgICA8YXBwSW5mbz4KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+CisgICAgICA8L2FwcEluZm8+CisgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKK0FsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCithdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCithY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7CisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKzwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9hbnQvY29yZS9BbnRDb3JlUGx1Z2luLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvc3JjL29yZy9lY2xpcHNlL2FudC9jb3JlL0FudENvcmVQbHVnaW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjI2Mzc2Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9hbnQvY29yZS9BbnRDb3JlUGx1Z2luLmphdmEKQEAgLTAsMCArMSwzMDggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuY29yZTsKKworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmNvcmUuQW50Q2xhc3NMb2FkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmNvcmUuQW50Q29yZVV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7CitpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7CisKKy8qKgorICogVGhlIHBsdWctaW4gcnVudGltZSBjbGFzcyBmb3IgdGhlIEFudCBDb3JlIHBsdWctaW4uCisgKiBDbGllbnRzIG1heSBub3QgaW5zdGFudGlhdGUgb3Igc3ViY2xhc3MgdGhpcyBjbGFzcy4KKyAqIEBub2luc3RhbnRpYXRlIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZCBieSBjbGllbnRzLgorICogQG5vZXh0ZW5kIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4KKyAqLworcHVibGljIGNsYXNzIEFudENvcmVQbHVnaW4gZXh0ZW5kcyBQbHVnaW4geworCisJLyoqCisJICogU3RhdHVzIGNvZGUgaW5kaWNhdGluZyBhbiB1bmV4cGVjdGVkIGludGVybmFsIGVycm9yLgorCSAqIEBzaW5jZSAyLjEKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5BTF9FUlJPUiA9IDEyMDsJCQorCQorCS8qKgorCSAqIFRoZSBzaW5nbGUgaW5zdGFuY2Ugb2YgdGhpcyBwbHVnLWluIHJ1bnRpbWUgY2xhc3MuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgQW50Q29yZVBsdWdpbiBwbHVnaW47CisKKwkvKioKKwkgKiBUaGUgcHJlZmVyZW5jZXMgY2xhc3MgZm9yIHRoaXMgcGx1Zy1pbi4KKwkgKi8KKwlwcml2YXRlIEFudENvcmVQcmVmZXJlbmNlcyBwcmVmZXJlbmNlczsKKwkKKwkvKioKKwkgKiBVbmlxdWUgaWRlbnRpZmllciBjb25zdGFudCAodmFsdWUgPGNvZGU+Im9yZy5lY2xpcHNlLmFudC5jb3JlIjwvY29kZT4pCisJICogZm9yIHRoZSBBbnQgQ29yZSBwbHVnLWluLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBJX0FOVENPUkUgPSAib3JnLmVjbGlwc2UuYW50LmNvcmUiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBTaW1wbGUgaWRlbnRpZmllciBjb25zdGFudCAodmFsdWUgPGNvZGU+ImFudFRhc2tzIjwvY29kZT4pCisJICogZm9yIHRoZSBBbnQgdGFza3MgZXh0ZW5zaW9uIHBvaW50LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBUX1RBU0tTID0gImFudFRhc2tzIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogU2ltcGxlIGlkZW50aWZpZXIgY29uc3RhbnQgKHZhbHVlIDxjb2RlPiJleHRyYUNsYXNzcGF0aEVudHJpZXMiPC9jb2RlPikKKwkgKiBmb3IgdGhlIGV4dHJhIGNsYXNzcGF0aCBlbnRyaWVzIGV4dGVuc2lvbiBwb2ludC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQVF9FWFRSQV9DTEFTU1BBVEggPSAiZXh0cmFDbGFzc3BhdGhFbnRyaWVzIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogU2ltcGxlIGlkZW50aWZpZXIgY29uc3RhbnQgKHZhbHVlIDxjb2RlPiJhbnRUeXBlcyI8L2NvZGU+KQorCSAqIGZvciB0aGUgQW50IHR5cGVzIGV4dGVuc2lvbiBwb2ludC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQVF9UWVBFUyA9ICJhbnRUeXBlcyI7IC8vJE5PTi1OTFMtMSQKKwkKKwkvKioKKwkgKiBTaW1wbGUgaWRlbnRpZmllciBjb25zdGFudCAodmFsdWUgPGNvZGU+ImFudFByb3BlcnRpZXMiPC9jb2RlPikKKwkgKiBmb3IgdGhlIEFudCBwcm9wZXJ0aWVzIGV4dGVuc2lvbiBwb2ludC4KKwkgKiAKKwkgKiBAc2luY2UgMy4wCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFRfUFJPUEVSVElFUyA9ICJhbnRQcm9wZXJ0aWVzIjsgLy8kTk9OLU5MUy0xJAorCQorCS8qKgorCSAqIFNpbXBsZSBpZGVudGlmaWVyIGNvbnN0YW50ICh2YWx1ZSA8Y29kZT4ib3JnLmVjbGlwc2UuYW50LmNvcmUuYW50QnVpbGRGaWxlIjwvY29kZT4pCisJICogZm9yIHRoZSBjb250ZW50IHR5cGUgb2YgYW4gQW50IEJ1aWxkRmlsZQorCSAqIAorCSAqIEBzaW5jZSAzLjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTlRfQlVJTERGSUxFX0NPTlRFTlRfVFlQRSA9IFBJX0FOVENPUkUgKyAiLmFudEJ1aWxkRmlsZSI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFNpbXBsZSBpZGVudGlmaWVyIGNvbnN0YW50ICh2YWx1ZSA8Y29kZT4iY2xhc3MiPC9jb2RlPikKKwkgKiBvZiBhIHRhZyB0aGF0IGFwcGVhcnMgaW4gQW50IGV4dGVuc2lvbnMuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBTaW1wbGUgaWRlbnRpZmllciBjb25zdGFudCAodmFsdWUgPGNvZGU+Im5hbWUiPC9jb2RlPikKKwkgKiBvZiBhIHRhZyB0aGF0IGFwcGVhcnMgaW4gQW50IGV4dGVuc2lvbnMuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogU2ltcGxlIGlkZW50aWZpZXIgY29uc3RhbnQgKHZhbHVlIDxjb2RlPiJsaWJyYXJ5IjwvY29kZT4pCisJICogb2YgYSB0YWcgdGhhdCBhcHBlYXJzIGluIEFudCBleHRlbnNpb25zLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJQlJBUlkgPSAibGlicmFyeSI7IC8vJE5PTi1OTFMtMSQKKwkKKwkvKioKKwkgKiBTaW1wbGUgaWRlbnRpZmllciBjb25zdGFudCAodmFsdWUgPGNvZGU+ImhlYWRsZXNzIjwvY29kZT4pIG9mIGEgdGFnCisJICogdGhhdCBhcHBlYXJzIGluIEFudCBleHRlbnNpb25zLgorCSAqIEBzaW5jZSAyLjEKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFETEVTUyA9ICJoZWFkbGVzcyI7IC8vJE5PTi1OTFMtMSQKKwkKKwkvKioKKwkgKiBTaW1wbGUgaWRlbnRpZmllciBjb25zdGFudCAodmFsdWUgPGNvZGU+ImVjbGlwc2VSdW50aW1lIjwvY29kZT4pIG9mIGEgdGFnCisJICogdGhhdCBhcHBlYXJzIGluIEFudCBleHRlbnNpb25zLgorCSAqIEBzaW5jZSAzLjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFX1JVTlRJTUUgPSAiZWNsaXBzZVJ1bnRpbWUiOyAvLyROT04tTkxTLTEkCisJCisJLyoqCisJICogU2ltcGxlIGlkZW50aWZpZXIgY29uc3RhbnQgKHZhbHVlIDxjb2RlPiJ1cmkiPC9jb2RlPikgb2YgYSB0YWcKKwkgKiB0aGF0IGFwcGVhcnMgaW4gQW50IGV4dGVuc2lvbnMuCisJICogQHNpbmNlIDMuMgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSSSA9ICJ1cmkiOyAvLyROT04tTkxTLTEkCisJCisJLyoqCisJICogU2ltcGxlIGlkZW50aWZpZXIgY29uc3RhbnQgKHZhbHVlIDxjb2RlPiJ2YWx1ZSI8L2NvZGU+KSBvZiBhIHRhZworCSAqIHRoYXQgYXBwZWFycyBpbiBBbnQgZXh0ZW5zaW9ucy4KKwkgKiBAc2luY2UgMy4wCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUUgPSAidmFsdWUiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBLZXkgdG8gYWNjZXNzIHRoZSA8Y29kZT5JUHJvZ3Jlc3NNb25pdG9yPC9jb2RlPiByZWZlcmVuY2UuIFdoZW4gYQorCSAqIHByb2dyZXNzIG1vbml0b3IgaXMgcGFzc2VkIHRvIHRoZSA8Y29kZT5BbnRSdW5uZXIucnVuKElQcm9ncmVzc01vbml0b3IpPC9jb2RlPgorCSAqIG1ldGhvZCwgdGhlIG9iamVjdCBpcyBhdmFpbGFibGUgYXMgYSByZWZlcmVuY2UgZm9yIHRoZSBjdXJyZW50CisJICogQW50IHByb2plY3QuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRV9QUk9HUkVTU19NT05JVE9SID0gImVjbGlwc2UucHJvZ3Jlc3MubW9uaXRvciI7IC8vJE5PTi1OTFMtMSQKKwkKKwkvKioKKwkgKiBTdGF0dXMgY29kZSBpbmRpY2F0aW5nIGFuIGVycm9yIG9jY3VycmVkIHJ1bm5pbmcgYSBidWlsZC4KKwkgKiBAc2luY2UgMi4xCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfUlVOTklOR19CVUlMRCA9IDE7CisJCisJLyoqCisJICogU3RhdHVzIGNvZGUgaW5kaWNhdGluZyBhbiBlcnJvciBvY2N1cnJlZCBkdWUgdG8gYSBtYWxmb3JtZWQgVVJMLgorCSAqIEBzaW5jZSAyLjEKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUl9NQUxGT1JNRURfVVJMID0gMjsKKwkKKwkvKioKKwkgKiBTdGF0dXMgY29kZSBpbmRpY2F0aW5nIGFuIGVycm9yIG9jY3VycmVkIGFzIGEgbGlicmFyeSB3YXMgbm90IHNwZWNpZmllZAorCSAqIEBzaW5jZSAyLjEKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUl9MSUJSQVJZX05PVF9TUEVDSUZJRUQgPSAzOworCisJLyoqIAorCSAqIENvbnN0cnVjdHMgYW4gaW5zdGFuY2Ugb2YgdGhpcyBwbHVnLWluIHJ1bnRpbWUgY2xhc3MuCisJICogPHA+CisJICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBwbHVnLWluIHJ1bnRpbWUgY2xhc3MgaXMgYXV0b21hdGljYWxseSBjcmVhdGVkIAorCSAqIHdoZW4gdGhlIGZhY2lsaXRpZXMgcHJvdmlkZWQgYnkgdGhlIEFudCBDb3JlIHBsdWctaW4gYXJlIHJlcXVpcmVkLgorCSAqIDxiPkNsaWVudHMgbXVzdCBuZXZlciBleHBsaWNpdGx5IGluc3RhbnRpYXRlIGEgcGx1Zy1pbiBydW50aW1lIGNsYXNzLjwvYj4KKwkgKiA8L3A+CisJICogQHNpbmNlIDMuMQorCSAqIAorCSAqLworCXB1YmxpYyBBbnRDb3JlUGx1Z2luKCkgeworCQlwbHVnaW4gPSB0aGlzOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKKwkgKiBAc2luY2UgMy4xCisJICovCisJcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24geworCQlzdXBlci5zdG9wKGNvbnRleHQpOworICAgICAgICBBbnRDb3JlVXRpbC5zZXRCdW5kbGVDb250ZXh0KG51bGwpOworCQlpZiAocHJlZmVyZW5jZXMgIT0gbnVsbCkgeworCQkJc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7CisJCX0KKwl9CisgICAgCisgICAgLyogKG5vbi1KYXZhZG9jKQorICAgICAqIEBzZWUgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvciNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKKyAgICAgKiBAc2luY2UgMy4xCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc3RhcnQoY29udGV4dCk7CisgICAgICAgIEFudENvcmVVdGlsLnNldEJ1bmRsZUNvbnRleHQoY29udGV4dCk7CisgICAgfQorCisJLyoqCisJICogR2l2ZW4gYW4gZXh0ZW5zaW9uIHBvaW50IG5hbWUsIGV4dHJhY3QgaXRzIGV4dGVuc2lvbnMgYW5kIHJldHVybiB0aGVtCisJICogYXMgYSBMaXN0LgorCSAqIEBwYXJhbSBwb2ludE5hbWUgVGhlIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBwb2ludAorCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgdGhlIGV4dGVuc2lvbnMKKwkgKi8KKwlwcml2YXRlIExpc3QgZXh0cmFjdEV4dGVuc2lvbnMoU3RyaW5nIHBvaW50TmFtZSkgeworCQlJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQ9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uUG9pbnQoQW50Q29yZVBsdWdpbi5QSV9BTlRDT1JFLCBwb2ludE5hbWUpOworCQlpZiAoZXh0ZW5zaW9uUG9pbnQgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZXh0ZW5zaW9ucyA9IGV4dGVuc2lvblBvaW50LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOworCQlyZXR1cm4gQXJyYXlzLmFzTGlzdChleHRlbnNpb25zKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhpcyBwbHVnLWluJ3MgcHJlZmVyZW5jZXMuCisJICogCisJICogQHJldHVybiB0aGUgQW50IGNvcmUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgcHJlZmVyZW5jZXMgZm9yIHRoaXMgcGx1Zy1pbi4KKwkgKi8KKwlwdWJsaWMgQW50Q29yZVByZWZlcmVuY2VzIGdldFByZWZlcmVuY2VzKCkgeworCQlpZiAocHJlZmVyZW5jZXMgPT0gbnVsbCkgeworCQkJcHJlZmVyZW5jZXMgPSBuZXcgQW50Q29yZVByZWZlcmVuY2VzKGV4dHJhY3RFeHRlbnNpb25zKFBUX1RBU0tTKSwgZXh0cmFjdEV4dGVuc2lvbnMoUFRfRVhUUkFfQ0xBU1NQQVRIKSwgZXh0cmFjdEV4dGVuc2lvbnMoUFRfVFlQRVMpLCBleHRyYWN0RXh0ZW5zaW9ucyhQVF9QUk9QRVJUSUVTKSwgZmFsc2UpOworCQl9CisJCXJldHVybiBwcmVmZXJlbmNlczsKKwl9CisJCisJLyoqCisJICogU2V0IHRoaXMgcGx1Zy1pbidzIHByZWZlcmVuY2VzIGZvciBydW5uaW5nIGhlYWRsZXNzIGJhc2VkIG9uIHRoZSAKKwkgKiBoZWFkbGVzcyBwYXJhbWV0ZXIuCisJICogVGhpcyBtZXRob2QgaXMgcHVibGljIGZvciB0ZXN0aW5nIHB1cnBvc2VzIG9ubHkuIEl0IHNob3VsZCBub3QKKwkgKiBiZSBjYWxsZWQgb3V0c2lkZSBvZiB0aGUgQW50IGludGVncmF0aW9uIGZyYW1ld29yay4KKwkgKiBAcGFyYW0gaGVhZGxlc3MgV2hldGhlciBvciBub3QgdG8gbWFyayB0aGF0IHRoZSBwbHVnLWluIGlzIHJ1bm5pbmcgaGVhZGxlc3Mgb3Igbm90CisJICovCisJcHVibGljIHZvaWQgc2V0UnVubmluZ0hlYWRsZXNzKGJvb2xlYW4gaGVhZGxlc3MpIHsKKwkJcHJlZmVyZW5jZXMgPSBuZXcgQW50Q29yZVByZWZlcmVuY2VzKGV4dHJhY3RFeHRlbnNpb25zKFBUX1RBU0tTKSwgZXh0cmFjdEV4dGVuc2lvbnMoUFRfRVhUUkFfQ0xBU1NQQVRIKSwgZXh0cmFjdEV4dGVuc2lvbnMoUFRfVFlQRVMpLCBleHRyYWN0RXh0ZW5zaW9ucyhQVF9QUk9QRVJUSUVTKSwgaGVhZGxlc3MpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhpcyBwbHVnLWluIGluc3RhbmNlLgorCSAqCisJICogQHJldHVybiB0aGUgc2luZ2xlIGluc3RhbmNlIG9mIHRoaXMgcGx1Zy1pbiBydW50aW1lIGNsYXNzCisJICovCisJcHVibGljIHN0YXRpYyBBbnRDb3JlUGx1Z2luIGdldFBsdWdpbigpIHsKKwkJcmV0dXJuIHBsdWdpbjsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBjbGFzcyBsb2FkZXIgdG8gdXNlIHdoZW4gZXhlY3V0aW5nIEFudCBidWlsZHMuCisJICogCisJICogQHJldHVybiB0aGUgbmV3IGNsYXNzIGxvYWRlcgorCSAqLworCXB1YmxpYyBDbGFzc0xvYWRlciBnZXROZXdDbGFzc0xvYWRlcigpIHsKKwkgICAgQW50Q29yZVByZWZlcmVuY2VzIGNvcmVQcmVmZXJlbmNlcyA9IGdldFByZWZlcmVuY2VzKCk7CisJCXJldHVybiBnZXROZXdDbGFzc0xvYWRlcihmYWxzZSwgY29yZVByZWZlcmVuY2VzLmdldFVSTHMoKSk7CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgYSBuZXcgY2xhc3MgbG9hZGVyIHRvIHVzZSB3aGVuIGV4ZWN1dGluZyBBbnQgYnVpbGRzLgorCSAqIEBwYXJhbSB1cmxzIHRoZSBVUkxzIHRoYXQgZGVmaW5lIHRoZSBjbGFzc3BhdGggb2YgdGhlIG5ldyBjbGFzc2xvYWRlcgorCSAqIEByZXR1cm4gdGhlIG5ldyBjbGFzcyBsb2FkZXIKKwkgKiBAc2luY2UgMy4xCisJICovCisJcHVibGljIFVSTENsYXNzTG9hZGVyIGdldE5ld0NsYXNzTG9hZGVyKFVSTFtdIHVybHMpIHsKKwkJcmV0dXJuIGdldE5ld0NsYXNzTG9hZGVyKGZhbHNlLCB1cmxzKTsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBjbGFzcyBsb2FkZXIgdG8gdXNlIHdoZW4gZXhlY3V0aW5nIEFudCBidWlsZHMgb3IgCisJICogb3RoZXIgYXBwbGljYXRpb25zIHN1Y2ggYXMgcGFyc2luZyBvciBjb2RlIHByb3Bvc2FsIGRldGVybWluYXRpb24uCisJICogCisJICogQHBhcmFtIGFsbG93TG9hZGluZyB3aGV0aGVyIHRvIGFsbG93IHBsdWctaW4gY2xhc3Nsb2FkZXJzIGFzc29jaWF0ZWQgCisJICogd2l0aCB0aGUgbmV3IGNsYXNzbG9hZGVyIHRvIGxvYWQgQXBhY2hlIEFudCBjbGFzc2VzIG9yIHJlc291cmNlcy4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgY2xhc3MgbG9hZGVyCisJICovCisJcHVibGljIENsYXNzTG9hZGVyIGdldE5ld0NsYXNzTG9hZGVyKGJvb2xlYW4gYWxsb3dMb2FkaW5nKSB7CisJCUFudENvcmVQcmVmZXJlbmNlcyBjb3JlUHJlZmVyZW5jZXMgPSBnZXRQcmVmZXJlbmNlcygpOworCQlVUkxbXSB1cmxzID0gY29yZVByZWZlcmVuY2VzLmdldFVSTHMoKTsKKwkJcmV0dXJuIGdldE5ld0NsYXNzTG9hZGVyKGFsbG93TG9hZGluZywgdXJscyk7CisJfQorCQkKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IGNsYXNzIGxvYWRlciB0byB1c2Ugd2hlbiBleGVjdXRpbmcgQW50IGJ1aWxkcyBvciAKKwkgKiBvdGhlciBhcHBsaWNhdGlvbnMgc3VjaCBhcyBwYXJzaW5nIG9yIGNvZGUgcHJvcG9zYWwgZGV0ZXJtaW5hdGlvbi4KKwkgKiAgCisJICogQHBhcmFtIGFsbG93TG9hZGluZyB3aGV0aGVyIHRvIGFsbG93IHBsdWctaW4gY2xhc3Nsb2FkZXJzIGFzc29jaWF0ZWQgCisJICogd2l0aCB0aGUgbmV3IGNsYXNzbG9hZGVyIHRvIGxvYWQgQXBhY2hlIEFudCBjbGFzc2VzIG9yIHJlc291cmNlcy4KKwkgKiBAcGFyYW0gdXJscyB0aGUgVVJMcyB0aGF0IGRlZmluZSB0aGUgY2xhc3NwYXRoIG9mIHRoZSBuZXcgY2xhc3Nsb2FkZXIKKwkgKiBAcmV0dXJuIHRoZSBuZXcgY2xhc3MgbG9hZGVyCisJICogQHNpbmNlIDMuMQorCSAqLworCXB1YmxpYyBVUkxDbGFzc0xvYWRlciBnZXROZXdDbGFzc0xvYWRlcihib29sZWFuIGFsbG93TG9hZGluZywgVVJMW10gdXJscykgeworCQlBbnRDb3JlUHJlZmVyZW5jZXMgY29yZVByZWZlcmVuY2VzID0gZ2V0UHJlZmVyZW5jZXMoKTsKKwkJQ2xhc3NMb2FkZXJbXSBwbHVnaW5Mb2FkZXJzID0gY29yZVByZWZlcmVuY2VzLmdldFBsdWdpbkNsYXNzTG9hZGVycygpOworCQlBbnRDbGFzc0xvYWRlciBsb2FkZXI9IG5ldyBBbnRDbGFzc0xvYWRlcih1cmxzLCBwbHVnaW5Mb2FkZXJzKTsKKwkJbG9hZGVyLmFsbG93UGx1Z2luQ2xhc3NMb2FkZXJzVG9Mb2FkQW50KGFsbG93TG9hZGluZyk7CisJCXJldHVybiBsb2FkZXI7CisJfQorCQorCS8qKgorCSAqIExvZ3MgdGhlIHNwZWNpZmllZCB0aHJvd2FibGUgd2l0aCB0aGlzIHBsdWctaW4ncyBsb2cuCisJICogCisJICogQHBhcmFtIHQgdGhyb3dhYmxlIHRvIGxvZyAKKwkgKiBAc2luY2UgMi4xCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIGxvZyhUaHJvd2FibGUgdCkgeworCQlJU3RhdHVzIHN0YXR1cz0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQSV9BTlRDT1JFLCBJTlRFUk5BTF9FUlJPUiwgIkVycm9yIGxvZ2dlZCBmcm9tIEFudCBDb3JlOiAiLCB0KTsgLy8kTk9OLU5MUy0xJAorCQlnZXRQbHVnaW4oKS5nZXRMb2coKS5sb2coc3RhdHVzKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvc3JjL29yZy9lY2xpcHNlL2FudC9jb3JlL0FudFNlY3VyaXR5RXhjZXB0aW9uLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvc3JjL29yZy9lY2xpcHNlL2FudC9jb3JlL0FudFNlY3VyaXR5RXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY4Njc0MQotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmMvb3JnL2VjbGlwc2UvYW50L2NvcmUvQW50U2VjdXJpdHlFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDI2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5jb3JlOworCisKKy8qKgorICogQSBzZWN1cml0eSBleGNlcHRpb24gdGhhdCBpcyB0aHJvd24gYnkgdGhlIEFudFNlY3VyaXR5TWFuYWdlciBpZgorICogYW4gQW50IHRhc2sgaW4gc29tZSB3YXkgYXR0ZW1wdHMgdG8gaGFsdCBvciBleGl0IHRoZSBKYXZhIFZpcnR1YWwgTWFjaGluZS4KKyAqIAorICogQ2xpZW50cyBtYXkgaW5zdGFudGlhdGUgdGhpcyBjbGFzczsgaXQgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQuCisgKiBAc2luY2UgMi4xCisgKiBAbm9leHRlbmQgVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZCBieSBjbGllbnRzLgorICovCitwdWJsaWMgY2xhc3MgQW50U2VjdXJpdHlFeGNlcHRpb24gZXh0ZW5kcyBTZWN1cml0eUV4Y2VwdGlvbiB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9hbnQvY29yZS9JQW50Q2xhc3NwYXRoRW50cnkuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmMvb3JnL2VjbGlwc2UvYW50L2NvcmUvSUFudENsYXNzcGF0aEVudHJ5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQyMDY2OQotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmMvb3JnL2VjbGlwc2UvYW50L2NvcmUvSUFudENsYXNzcGF0aEVudHJ5LmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuY29yZTsKKworaW1wb3J0IGphdmEubmV0LlVSTDsKKworLyoqCisgKiBSZXByZXNlbnRzIGFuIEFudCBjbGFzc3BhdGggZW50cnkuCisgKiBDbGllbnRzIG1heSBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UuCisgKgorICogQHNpbmNlIDMuMAorICovCitwdWJsaWMgaW50ZXJmYWNlIElBbnRDbGFzc3BhdGhFbnRyeSB7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBsYWJlbCBmb3IgdGhpcyBjbGFzc3BhdGggZW50cnkuCisJICogQHJldHVybiB0aGUgbGFiZWwgZm9yIHRoaXMgZW50cnkuCisJICovCisJcHVibGljIFN0cmluZyBnZXRMYWJlbCgpOworCQorCS8qKgorCSAqIFJldHVybnMgdGhlIFVSTCBmb3IgdGhpcyBjbGFzc3BhdGggZW50cnkgb3IgPGNvZGU+bnVsbDwvY29kZT4KKwkgKiBpZiBpdCBjYW5ub3QgYmUgcmVzb2x2ZWQuCisJICogCisJICogQHJldHVybiB0aGUgdXJsIGZvciB0aGlzIGNsYXNzcGF0aCBlbnRyeS4KKwkgKi8KKwlwdWJsaWMgVVJMIGdldEVudHJ5VVJMKCk7CisJCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoaXMgY2xhc3NwYXRoIGVudHJ5IHJlcXVpcmVzIHRoZSBFY2xpcHNlIHJ1bnRpbWUgdG8gYmUgCisJICogcmVsZXZhbnQuIERlZmF1bHRzIHZhbHVlIGlzIDxjb2RlPnRydWU8L2NvZGU+CisJICogCisJICogQHJldHVybiB3aGV0aGVyIHRoaXMgY2xhc3NwYXRoIGVudHJ5IHJlcXVpcmVzIHRoZSBFY2xpcHNlIHJ1bnRpbWUKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0VjbGlwc2VSdW50aW1lUmVxdWlyZWQoKTsKK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmMvb3JnL2VjbGlwc2UvYW50L2NvcmUvVGFzay5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9hbnQvY29yZS9UYXNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q0ZWNhNQotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmMvb3JnL2VjbGlwc2UvYW50L2NvcmUvVGFzay5qYXZhCkBAIC0wLDAgKzEsMzkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmNvcmU7CisKKworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5jb3JlLkFudE9iamVjdDsKKworLyoqCisgKiBSZXByZXNlbnRzIGFuIEFudCB0YXNrLgorICogQ2xpZW50cyBtYXkgaW5zdGFudGlhdGUgdGhpcyBjbGFzczsgaXQgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQuCisgKiBAc2luY2UgMi4xCisgKiBAbm9leHRlbmQgVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZCBieSBjbGllbnRzLgorICovCitwdWJsaWMgY2xhc3MgVGFzayBleHRlbmRzIEFudE9iamVjdCB7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSB0YXNrCisJICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgdGFzaworCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0VGFza05hbWUoKSB7CisJCXJldHVybiBmTmFtZTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSB0YXNrCisJICogQHBhcmFtIHRhc2tOYW1lIFRoZSB0YXNrTmFtZSB0byBzZXQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRUYXNrTmFtZShTdHJpbmcgdGFza05hbWUpIHsKKwkJZk5hbWU9IHRhc2tOYW1lOworCX0KK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmMvb3JnL2VjbGlwc2UvYW50L2NvcmUvVHlwZS5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9hbnQvY29yZS9UeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI5ZWFjZAotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmMvb3JnL2VjbGlwc2UvYW50L2NvcmUvVHlwZS5qYXZhCkBAIC0wLDAgKzEsMzkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmNvcmU7CisKKworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5jb3JlLkFudE9iamVjdDsKKworLyoqCisgKiBSZXByZXNlbnRzIGFuIEFudCB0eXBlLgorICogQ2xpZW50cyBtYXkgaW5zdGFudGlhdGUgdGhpcyBjbGFzczsgaXQgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQuCisgKiBAc2luY2UgMi4xCisgKiBAbm9leHRlbmQgVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZCBieSBjbGllbnRzLgorICovCitwdWJsaWMgY2xhc3MgVHlwZSBleHRlbmRzIEFudE9iamVjdCB7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB0eXBlIG5hbWUKKwkgKiBAcmV0dXJuIFJldHVybnMgYSBTdHJpbmcKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgeworCQlyZXR1cm4gZk5hbWU7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdGFza05hbWUuCisJICogQHBhcmFtIHRhc2tOYW1lIFRoZSB0YXNrTmFtZSB0byBzZXQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRUeXBlTmFtZShTdHJpbmcgdGFza05hbWUpIHsKKwkJZk5hbWUgPSB0YXNrTmFtZTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvc3JjL29yZy9lY2xpcHNlL2FudC9jb3JlL3BhY2thZ2UuaHRtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmMvb3JnL2VjbGlwc2UvYW50L2NvcmUvcGFja2FnZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MzEwODkKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvc3JjL29yZy9lY2xpcHNlL2FudC9jb3JlL3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDE0IEBACis8IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgorPGh0bWw+Cis8aGVhZD4KKyAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgorICAgPHRpdGxlPlBhY2thZ2UtbGV2ZWwgSmF2YWRvYzwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keT4KK1Byb3ZpZGVzIHN1cHBvcnQgZm9yIHJ1bm5pbmcgdGhlIEFudCBidWlsZCB0b29sIGluIHRoZSBwbGF0Zm9ybS4KKzxoMj4KK1BhY2thZ2UgU3BlY2lmaWNhdGlvbjwvaDI+CitUaGlzIHBhY2thZ2UgZGVmaW5lcyBhIG51bWJlciBvZiB0YXNrIGFuZCBkYXRhIHR5cGVzIGFuZCB2YXJpb3VzIGluZnJhc3RydWN0dXJlCitwaWVjZXMgd2hpY2ggbWFrZSBBbnQgaW4gdGhlIHBsYXRmb3JtIGVhc2llciBhbmQgbW9yZSBwb3dlcmZ1bC4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2NvcmUvQWJzdHJhY3RFY2xpcHNlQnVpbGRMb2dnZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2NvcmUvQWJzdHJhY3RFY2xpcHNlQnVpbGRMb2dnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2MyMjk5Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvY29yZS9BYnN0cmFjdEVjbGlwc2VCdWlsZExvZ2dlci5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmNvcmU7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmNvcmUuQW50Q29yZVBsdWdpbjsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RWNsaXBzZUJ1aWxkTG9nZ2VyIHsKKyAgICAKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIGlkZW50aWZpZXIgLSB1c2VkIHRvIGxpbmsgdGhlIEVjbGlwc2UgQW50IGJ1aWxkCisgICAgICogbG9nZ2VycyB0byBhIHByb2Nlc3MuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU5UX1BST0NFU1NfSUQgPSBBbnRDb3JlUGx1Z2luLlBJX0FOVENPUkUgKyAiLkFOVF9QUk9DRVNTX0lEIjsgLy8kTk9OLU5MUy0xJAorICAgIAorICAgIHByb3RlY3RlZCBTdHJpbmcgZlByb2Nlc3NJZD0gbnVsbDsKKyAgICAKKyAgICBwdWJsaWMgdm9pZCBjb25maWd1cmUoTWFwIHVzZXJQcm9wZXJ0aWVzKSB7CisgICAgICAgIGZQcm9jZXNzSWQ9IChTdHJpbmcpIHVzZXJQcm9wZXJ0aWVzLnJlbW92ZShBTlRfUFJPQ0VTU19JRCk7CisgICAgfSAKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9jb3JlL0FudENsYXNzTG9hZGVyLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9jb3JlL0FudENsYXNzTG9hZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZhMWRjMgotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2NvcmUvQW50Q2xhc3NMb2FkZXIuamF2YQpAQCAtMCwwICsxLDE2OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqICAgICBUb20gVHJvbWV5ICh0cm9tZXlAcmVkaGF0LmNvbSkgLSBwYXRjaCBmb3IgYnVnIDQwOTcyCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmNvcmU7CisKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEubmV0LlVSTENsYXNzTG9hZGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworcHVibGljIGNsYXNzIEFudENsYXNzTG9hZGVyIGV4dGVuZHMgVVJMQ2xhc3NMb2FkZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFOVF9QQUNLQUdFU19QUkVGSVggPSAib3JnLmFwYWNoZS50b29scyI7IC8vJE5PTi1OTFMtMSQKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU5UX1VSTF9QUkVGSVggPSAib3JnL2FwYWNoZS90b29scyI7ICAgICAvLyROT04tTkxTLTEkCisgICAgCisgICAgcHJpdmF0ZSBib29sZWFuIGZBbGxvd1BsdWdpbkxvYWRpbmcgPSBmYWxzZTsKKworICAgIHByb3RlY3RlZCBDbGFzc0xvYWRlcltdIGZQbHVnaW5Mb2FkZXJzOworCisgICAgcHJpdmF0ZSBDbGFzc0xvYWRlciBmQ29udGV4dENsYXNzbG9hZGVyID0gbnVsbDsKKyAgICAKKyAgICBwdWJsaWMgQW50Q2xhc3NMb2FkZXIoVVJMW10gdXJscywgQ2xhc3NMb2FkZXJbXSBwbHVnaW5Mb2FkZXJzKSB7CisgICAgICAgIHN1cGVyKHVybHMsIENsYXNzTG9hZGVyLmdldFN5c3RlbUNsYXNzTG9hZGVyKCkpOworICAgICAgICBmUGx1Z2luTG9hZGVycyA9IHBsdWdpbkxvYWRlcnM7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBAc2VlIGphdmEubmV0LlVSTENsYXNzTG9hZGVyI2ZpbmRDbGFzcyhqYXZhLmxhbmcuU3RyaW5nKQorICAgICAqLworICAgIHByb3RlY3RlZCBDbGFzcyBmaW5kQ2xhc3MoU3RyaW5nIG5hbWUpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgQ2xhc3MgcmVzdWx0ID0gbnVsbDsKKyAgICAgICAgLy9jaGVjayB3aGV0aGVyIHRvIGxvYWQgdGhlIEFwYWNoZSBBbnQgY2xhc3NlcyBmcm9tIHRoZSBwbHVnLWluIGNsYXNzIGxvYWRlcnMgCisgICAgICAgIC8vb3IgdG8gb25seSBsb2FkIGZyb20gdGhlIFVSTHMgc3BlY2lmaWVkIGZyb20gdGhlIEFudCBydW50aW1lIGNsYXNzcGF0aCBwcmVmZXJlbmNlcyBzZXR0aW5nCisgICAgICAgIGlmIChmQWxsb3dQbHVnaW5Mb2FkaW5nIHx8ICEobmFtZS5zdGFydHNXaXRoKEFOVF9QQUNLQUdFU19QUkVGSVgpKSkgeworICAgICAgICAgICAgcmVzdWx0ID0gbG9hZENsYXNzUGx1Z2lucyhuYW1lKTsKKyAgICAgICAgfSAKKyAgICAgICAgCisgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIHN1cGVyLmZpbmRDbGFzcyhuYW1lKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgQ2xhc3MgbG9hZENsYXNzUGx1Z2lucyhTdHJpbmcgbmFtZSkgeworICAgICAgICAvL3JlbW92ZSB0aGlzIGNsYXNzIGxvYWRlciBhcyB0aGUgY29udGV4dCBjbGFzcyBsb2FkZXIKKyAgICAgICAgLy93aGVuIGxvYWRpbmcgY2xhc3NlcyBmcm9tIHBsdWctaW5zLi4uc2VlIGJ1ZyA5NDQ3MQorICAgICAgICBDbGFzc0xvYWRlciBvcmlnaW5hbENsYXNzTG9hZGVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgaWYgKGZDb250ZXh0Q2xhc3Nsb2FkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIoZkNvbnRleHRDbGFzc2xvYWRlcik7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENsYXNzIHJlc3VsdCA9IG51bGw7CisgICAgICAgICAgICBpZiAoZlBsdWdpbkxvYWRlcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyAoaSA8IGZQbHVnaW5Mb2FkZXJzLmxlbmd0aCkgJiYgKHJlc3VsdCA9PSBudWxsKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBmUGx1Z2luTG9hZGVyc1tpXS5sb2FkQ2xhc3MobmFtZSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlIGV4Y2VwdGlvbiBub3cuIElmIG5lY2Vzc2FyeSB3ZSdsbCB0aHJvdworICAgICAgICAgICAgICAgICAgICAgICAgLy8gYSBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGluIGxvYWRDbGFzcyhTdHJpbmcpCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIob3JpZ2luYWxDbGFzc0xvYWRlcik7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyoKKyAgICAgKiBAc2VlIGphdmEubmV0LlVSTENsYXNzTG9hZGVyI2ZpbmRSZXNvdXJjZShqYXZhLmxhbmcuU3RyaW5nKQorICAgICAqLworICAgIHB1YmxpYyBVUkwgZmluZFJlc291cmNlKFN0cmluZyBuYW1lKSB7CisgICAgCSBpZiAoZkFsbG93UGx1Z2luTG9hZGluZyB8fCAhKG5hbWUuc3RhcnRzV2l0aChBTlRfVVJMX1BSRUZJWCkpKSB7CisgICAgICAgICAgICAgVVJMIHJlc3VsdCA9IGZpbmRSZXNvdXJjZVBsdWdpbnMobmFtZSk7CisgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7CisgICAgICAgICAgICAJIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICAgfQorICAgICAgICAgfSAKKyAgICAJCisgICAgCXJldHVybiBzdXBlci5maW5kUmVzb3VyY2UobmFtZSk7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgVVJMIGZpbmRSZXNvdXJjZVBsdWdpbnMoU3RyaW5nIG5hbWUpIHsKKyAgICAJLy9yZW1vdmUgdGhpcyBjbGFzcyBsb2FkZXIgYXMgdGhlIGNvbnRleHQgY2xhc3MgbG9hZGVyCisgICAgCS8vd2hlbiBsb2FkaW5nIHJlc291cmNlcyBmcm9tIHBsdWctaW5zLi4uc2VlIGJ1ZyA5NDQ3MQorICAgIAlDbGFzc0xvYWRlciBvcmlnaW5hbENsYXNzTG9hZGVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKKyAgICAJaWYgKGZDb250ZXh0Q2xhc3Nsb2FkZXIgIT0gbnVsbCkgeworICAgIAkJVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIoZkNvbnRleHRDbGFzc2xvYWRlcik7CisgICAgCX0KKyAgICAJdHJ5IHsKKyAgICAJCVVSTCByZXN1bHQgPSBudWxsOworICAgIAkJaWYgKGZQbHVnaW5Mb2FkZXJzICE9IG51bGwpIHsKKyAgICAJCQlmb3IgKGludCBpID0gMDsgaSA8IGZQbHVnaW5Mb2FkZXJzLmxlbmd0aDsgaSsrKSB7CisgICAgCQkJCXJlc3VsdCA9IGZQbHVnaW5Mb2FkZXJzW2ldLmdldFJlc291cmNlKG5hbWUpOworICAgIAkJCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKKyAgICAJICAgIAkJCXJldHVybiByZXN1bHQ7CisgICAgCSAgICAJCX0KKyAgICAJCQl9CisgICAgCQl9CisgICAgCX0gZmluYWxseSB7CisgICAgCQlUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihvcmlnaW5hbENsYXNzTG9hZGVyKTsKKyAgICAJfQorICAgIAlyZXR1cm4gbnVsbDsKKyAgICB9CisgICAgCisgICAgLyoKKyAgICAgKiBAc2VlIGphdmEubmV0LlVSTENsYXNzTG9hZGVyI2ZpbmRSZXNvdXJjZXMoamF2YS5sYW5nLlN0cmluZykKKyAgICAgKi8KKyAgICBwdWJsaWMgRW51bWVyYXRpb24gZmluZFJlc291cmNlcyhTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAJQ2xhc3NMb2FkZXIgb3JpZ2luYWxDbGFzc0xvYWRlciA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7CisgICAgCWlmIChmQ29udGV4dENsYXNzbG9hZGVyICE9IG51bGwpIHsKKyAgICAJCVRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKGZDb250ZXh0Q2xhc3Nsb2FkZXIpOworICAgIAl9CisgICAgCUxpc3QgYWxsID0gbmV3IEFycmF5TGlzdCgpOworICAgIAl0cnkgeworICAgIAkJaWYgKGZBbGxvd1BsdWdpbkxvYWRpbmcgfHwgIShuYW1lLnN0YXJ0c1dpdGgoQU5UX1VSTF9QUkVGSVgpIHx8IG5hbWUuc3RhcnRzV2l0aChBTlRfVVJMX1BSRUZJWCwgMSkpKSB7CisgICAgCQkJaWYgKGZQbHVnaW5Mb2FkZXJzICE9IG51bGwpIHsKKyAgICAJCQkJRW51bWVyYXRpb24gcmVzdWx0ID0gbnVsbDsKKyAgICAJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmUGx1Z2luTG9hZGVycy5sZW5ndGg7IGkrKykgeworICAgIAkJCQkJcmVzdWx0ID0gZlBsdWdpbkxvYWRlcnNbaV0uZ2V0UmVzb3VyY2VzKG5hbWUpOworICAgIAkJCQkJd2hpbGUgKHJlc3VsdC5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgIAkJCQkJCWFsbC5hZGQocmVzdWx0Lm5leHRFbGVtZW50KCkpOworICAgIAkJCQkJfQorICAgIAkJCQl9CisgICAgCQkJfQorICAgIAkJfQorCisgICAgCQlFbnVtZXJhdGlvbiBzdXBlclJlc291cmNlcyA9IHN1cGVyLmZpbmRSZXNvdXJjZXMobmFtZSk7CisgICAgCQlpZiAoYWxsLmlzRW1wdHkoKSkgeworICAgIAkJCXJldHVybiBzdXBlclJlc291cmNlczsKKyAgICAJCX0KKworICAgIAkJd2hpbGUgKHN1cGVyUmVzb3VyY2VzLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgCQkJYWxsLmFkZChzdXBlclJlc291cmNlcy5uZXh0RWxlbWVudCgpKTsKKyAgICAJCX0KKyAgICAJCXJldHVybiBDb2xsZWN0aW9ucy5lbnVtZXJhdGlvbihhbGwpOworICAgIAl9IGZpbmFsbHkgeworICAgIAkJVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIob3JpZ2luYWxDbGFzc0xvYWRlcik7CisgICAgCX0KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0cyB3aGV0aGVyIHRoaXMgY2xhc3MgbG9hZGVyIHdpbGwgYWxsb3cgQXBhY2hlIEFudCBjbGFzc2VzIG9yIHJlc291cmNlcyB0byBiZSBmb3VuZCBvcgorICAgICAqIGxvYWRlZCBmcm9tIGl0cyBzZXQgb2YgcGx1Zy1pbiBjbGFzcyBsb2FkZXJzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBhbGxvd0xvYWRpbmcgd2hldGhlciBvciBub3QgdG8gYWxsb3cgdGhlIHBsdWctaW4gY2xhc3MgbG9hZGVycworICAgICAqIHRvIGxvYWQgdGhlIEFwYWNoZSBBbnQgY2xhc3NlcyBvciByZXNvdXJjZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhbGxvd1BsdWdpbkNsYXNzTG9hZGVyc1RvTG9hZEFudChib29sZWFuIGFsbG93TG9hZGluZykgeworICAgICAgICBmQWxsb3dQbHVnaW5Mb2FkaW5nID0gYWxsb3dMb2FkaW5nOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRQbHVnaW5Db250ZXh0Q2xhc3Nsb2FkZXIoQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHsKKyAgICAgICAgZkNvbnRleHRDbGFzc2xvYWRlciA9IGNsYXNzTG9hZGVyOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9jb3JlL0FudFByb3BlcnR5VmFsdWVQcm92aWRlci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvY29yZS9BbnRQcm9wZXJ0eVZhbHVlUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDI4MDI1Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvY29yZS9BbnRQcm9wZXJ0eVZhbHVlUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDU5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IEJCRE8gRGV0cm9pdCBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBUaGllcnJ5IExhY2ggKHRoaWVycnkubGFjaEBiYmRvZGV0cm9pdC5jb20pIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIGZvciBidWcgNDA1MDIKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBhZGRlZCBlY2xpcHNlLnJ1bm5pbmcgcHJvcGVydHksIGJ1ZyA2NTY1NQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5jb3JlOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEubmV0LlVSTDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5jb3JlLkFudENvcmVQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmNvcmUuSUFudFByb3BlcnR5VmFsdWVQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7CisKKy8qKgorICogRHluYW1pYyBwcm92aWRlciBmb3IgQW50IHByb3BlcnRpZXMuCisgKiAKKyAqIFByb3ZpZGVzIHRoZSBkeW5hbWljIHZhbHVlcyBmb3IgdGhlIGZvbGxvd2luZyBBbnQgcHJvcGVydGllczoKKyAqIAorICogPHVsPgorICogPGxpPjxjb2RlPmVjbGlwc2UuaG9tZTwvY29kZT4gLSBzZXQgdG8gdGhlIEVjbGlwc2UgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeTwvbGk+CisgKiA8L3VsPgorICogKiA8dWw+CisgKiA8bGk+PGNvZGU+ZWNsaXBzZS5ydW5uaW5nPC9jb2RlPiAtIHNldCAodG8gInRydWUiKSB3aGVuIEVjbGlwc2UgaXMgcnVubmluZzwvbGk+CisgKiA8L3VsPgorICogCisgKiBAc2luY2UgMy4wCisgKi8KK3B1YmxpYyBjbGFzcyBBbnRQcm9wZXJ0eVZhbHVlUHJvdmlkZXIgaW1wbGVtZW50cyBJQW50UHJvcGVydHlWYWx1ZVByb3ZpZGVyIHsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBkeW5hbWljIHByb3BlcnR5IHZhbHVlcyBmb3IgQW50IHByb3BlcnRpZXMuCisJICogCisJICogQHBhcmFtIHByb3BlcnR5TmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gcmVzb2x2ZSB0aGUgdmFsdWUgZm9yCisJICogQHJldHVybiBUaGUgcmVzb2x2ZWQgdmFsdWUgZm9yIHRoZSBwcm9wZXJ0eQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmNvcmUuSUFudFByb3BlcnR5VmFsdWVQcm92aWRlciNnZXRBbnRQcm9wZXJ0eVZhbHVlKFN0cmluZykKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldEFudFByb3BlcnR5VmFsdWUoU3RyaW5nIHByb3BlcnR5TmFtZSkgeworCQlTdHJpbmcgdmFsdWUgPSBudWxsOworCQlpZiAoImVjbGlwc2UucnVubmluZyIuZXF1YWxzKHByb3BlcnR5TmFtZSkpeyAvLyROT04tTkxTLTEkCisJCQlyZXR1cm4gInRydWUiOyAvLyROT04tTkxTLTEkCisJCX0gZWxzZSBpZiAoImVjbGlwc2UuaG9tZSIuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsgLy8kTk9OLU5MUy0xJAorCQkJdHJ5IHsKKwkJCQl2YWx1ZSA9IG5ldyBGaWxlKEZpbGVMb2NhdG9yLnJlc29sdmUobmV3IFVSTCgicGxhdGZvcm06L2Jhc2UvIikpLmdldFBhdGgoKSkuZ2V0QWJzb2x1dGVQYXRoKCk7IC8vJE5PTi1OTFMtMSQKKwkJCQlpZiAodmFsdWUuZW5kc1dpdGgoIi8iKSkgeyAvLyROT04tTkxTLTEkCisJCQkJICAgIHZhbHVlID0gdmFsdWUuc3Vic3RyaW5nKDAsIHZhbHVlLmxlbmd0aCgpIC0gMSk7CisJCQkJfQorCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQlBbnRDb3JlUGx1Z2luLmxvZyhlKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gdmFsdWU7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2NvcmUvQW50U2VjdXJpdHlNYW5hZ2VyLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9jb3JlL0FudFNlY3VyaXR5TWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkNzlkZGUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9jb3JlL0FudFNlY3VyaXR5TWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsMzczIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5jb3JlOworCisKK2ltcG9ydCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yOworaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LlNvY2tldFBlcm1pc3Npb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uOworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb247CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmNvcmUuQW50U2VjdXJpdHlFeGNlcHRpb247CisKKy8qKgorICogQSBzZWN1cml0eSBtYW5hZ2VyIHRoYXQgYWx3YXlzIHRocm93cyBhbiA8Y29kZT5BbnRTZWN1cml0eUV4Y2VwdGlvbjwvY29kZT4KKyAqIGlmIHRoZSBjYWxsaW5nIHRocmVhZCBhdHRlbXB0cyB0byBjYXVzZSB0aGUgSmF2YSBWaXJ0dWFsIE1hY2hpbmUgdG8gCisgKiBleGl0L2hhbHQgb3IgaWYgdGhlIHJlc3RyaWN0ZWQgdGhyZWFkIGF0dGVtcHRzIHRvIHNldCBhIFN5c3RlbSBwcm9wZXJ0eS4KKyAqIE90aGVyd2lzZSB0aGlzIG1hbmFnZXIganVzdCBkZWxlZ2F0ZXMgdG8gdGhlIHByZS1leGlzdGluZyBtYW5hZ2VyCisgKiBwYXNzZWQgaW4gdGhlIGNvbnN0cnVjdG9yIG9yIG1pbWljcyB0aGUgZGVmYXVsdCBzZWN1cml0eSBtYW5hZ2VyIGJlaGF2aW9yCisgKi8KK3B1YmxpYyBjbGFzcyBBbnRTZWN1cml0eU1hbmFnZXIgZXh0ZW5kcyBTZWN1cml0eU1hbmFnZXIgeworCisJcHJpdmF0ZSBTZWN1cml0eU1hbmFnZXIgZlNlY3VyaXR5TWFuYWdlcj0gbnVsbDsKKwlwcml2YXRlIFRocmVhZCBmUmVzdHJpY3RlZFRocmVhZD0gbnVsbDsKKwkvL2Vuc3VyZSB0aGF0IHRoZSBQcm9wZXJ0eVBlcm1pc3Npb24gY2xhc3MgaXMgbG9hZGVkIGJlZm9yZSB3ZSAKKwkvL3N0YXJ0IGNoZWNraW5nIHBlcm1pc3Npb25zOiBidWcgODU5MDgKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBQcm9wZXJ0eVBlcm1pc3Npb24gZmdQcm9wZXJ0eVBlcm1pc3Npb249IG5ldyBQcm9wZXJ0eVBlcm1pc3Npb24oIioiLCAid3JpdGUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCisJcHJpdmF0ZSBib29sZWFuIGZBbGxvd1NldHRpbmdTeXN0ZW1Qcm9wZXJ0aWVzPSB0cnVlOworCQorCXB1YmxpYyBBbnRTZWN1cml0eU1hbmFnZXIoU2VjdXJpdHlNYW5hZ2VyIHNlY3VyaXR5TWFuYWdlciwgVGhyZWFkIHJlc3RyaWN0ZWRUaHJlYWQsIGJvb2xlYW4gYWxsb3dTZXR0aW5nUHJvcGVydGllcykgeworCQlmU2VjdXJpdHlNYW5hZ2VyPSBzZWN1cml0eU1hbmFnZXI7CisJCWZSZXN0cmljdGVkVGhyZWFkPSByZXN0cmljdGVkVGhyZWFkOworCQlmQWxsb3dTZXR0aW5nU3lzdGVtUHJvcGVydGllcz0gYWxsb3dTZXR0aW5nUHJvcGVydGllczsKKwl9CisJCisJcHVibGljIEFudFNlY3VyaXR5TWFuYWdlcihTZWN1cml0eU1hbmFnZXIgc2VjdXJpdHlNYW5hZ2VyLCBUaHJlYWQgcmVzdHJpY3RlZFRocmVhZCkgeworCQl0aGlzKHNlY3VyaXR5TWFuYWdlciwgcmVzdHJpY3RlZFRocmVhZCwgdHJ1ZSk7CisJfQorCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2hlY2tFeGl0KGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBjaGVja0V4aXQoaW50IHN0YXR1cykgeworCQkvL25vIGV4aXQgYWxsb3dlZCBmcm9tIHRoZSByZXN0cmljdGVkIHRocmVhZC4uLlN5c3RlbS5leGl0IGlzIGJlaW5nIGNhbGxlZAorCQkvL2J5IHNvbWUgYW50IHRhc2suLi5kbyBub3Qgd2FudCBFY2xpcHNlIHRvIGV4aXQgaWYKKwkJLy9pbiB0aGUgc2FtZSBWTS4KKwkJaWYgKFRocmVhZC5jdXJyZW50VGhyZWFkKCkgPT0gZlJlc3RyaWN0ZWRUaHJlYWQpIHsKKwkJCXRocm93IG5ldyBBbnRTZWN1cml0eUV4Y2VwdGlvbigpOworCQl9CisJCWlmIChmU2VjdXJpdHlNYW5hZ2VyICE9IG51bGwpIHsKKwkJCWZTZWN1cml0eU1hbmFnZXIuY2hlY2tFeGl0KHN0YXR1cyk7CisJCX0KKwl9CisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNjaGVja0FjY2VwdChqYXZhLmxhbmcuU3RyaW5nLCBpbnQpCisJICovCisJcHVibGljIHZvaWQgY2hlY2tBY2NlcHQoU3RyaW5nIGhvc3QsIGludCBwb3J0KSB7CisJCWlmIChmU2VjdXJpdHlNYW5hZ2VyICE9IG51bGwpIHsKKwkJCWZTZWN1cml0eU1hbmFnZXIuY2hlY2tBY2NlcHQoaG9zdCwgcG9ydCk7CisJCX0KKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2NoZWNrQWNjZXNzKGphdmEubGFuZy5UaHJlYWQpCisJICovCisJcHVibGljIHZvaWQgY2hlY2tBY2Nlc3MoVGhyZWFkIHQpIHsKKwkJaWYgKGZTZWN1cml0eU1hbmFnZXIgIT0gbnVsbCkgeworCQkJZlNlY3VyaXR5TWFuYWdlci5jaGVja0FjY2Vzcyh0KTsKKwkJfQorCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2hlY2tBY2Nlc3MoamF2YS5sYW5nLlRocmVhZEdyb3VwKQorCSAqLworCXB1YmxpYyB2b2lkIGNoZWNrQWNjZXNzKFRocmVhZEdyb3VwIGcpIHsKKwkJaWYgKGZTZWN1cml0eU1hbmFnZXIgIT0gbnVsbCkgeworCQkJZlNlY3VyaXR5TWFuYWdlci5jaGVja0FjY2VzcyhnKTsKKwkJfQorCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2hlY2tBd3RFdmVudFF1ZXVlQWNjZXNzKCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBjaGVja0F3dEV2ZW50UXVldWVBY2Nlc3MoKSB7CisJCWlmIChmU2VjdXJpdHlNYW5hZ2VyICE9IG51bGwpIHsKKwkJCWZTZWN1cml0eU1hbmFnZXIuY2hlY2tBd3RFdmVudFF1ZXVlQWNjZXNzKCk7CisJCX0KKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2NoZWNrQ29ubmVjdChqYXZhLmxhbmcuU3RyaW5nLCBpbnQsIGphdmEubGFuZy5PYmplY3QpCisJICovCisJcHVibGljIHZvaWQgY2hlY2tDb25uZWN0KFN0cmluZyBob3N0LCBpbnQgcG9ydCwgT2JqZWN0IGNvbnRleHQpIHsKKwkJaWYgKGZTZWN1cml0eU1hbmFnZXIgIT0gbnVsbCkgeworCQkJZlNlY3VyaXR5TWFuYWdlci5jaGVja0Nvbm5lY3QoaG9zdCwgcG9ydCwgY29udGV4dCk7CisJCX0KKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2NoZWNrQ29ubmVjdChqYXZhLmxhbmcuU3RyaW5nLCBpbnQpCisJICovCisJcHVibGljIHZvaWQgY2hlY2tDb25uZWN0KFN0cmluZyBob3N0LCBpbnQgcG9ydCkgeworCQlpZiAoZlNlY3VyaXR5TWFuYWdlciAhPSBudWxsKSB7CisJCQlmU2VjdXJpdHlNYW5hZ2VyLmNoZWNrQ29ubmVjdChob3N0LCBwb3J0KTsKKwkJfQorCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2hlY2tDcmVhdGVDbGFzc0xvYWRlcigpCisJICovCisJcHVibGljIHZvaWQgY2hlY2tDcmVhdGVDbGFzc0xvYWRlcigpIHsKKwkJaWYgKGZTZWN1cml0eU1hbmFnZXIgIT0gbnVsbCkgeworCQkJZlNlY3VyaXR5TWFuYWdlci5jaGVja0NyZWF0ZUNsYXNzTG9hZGVyKCk7CisJCX0KKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2NoZWNrRGVsZXRlKGphdmEubGFuZy5TdHJpbmcpCisJICovCisJcHVibGljIHZvaWQgY2hlY2tEZWxldGUoU3RyaW5nIGZpbGUpIHsKKwkJaWYgKGZTZWN1cml0eU1hbmFnZXIgIT0gbnVsbCkgeworCQkJZlNlY3VyaXR5TWFuYWdlci5jaGVja0RlbGV0ZShmaWxlKTsKKwkJfQorCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2hlY2tFeGVjKGphdmEubGFuZy5TdHJpbmcpCisJICovCisJcHVibGljIHZvaWQgY2hlY2tFeGVjKFN0cmluZyBjbWQpIHsKKwkJaWYgKGZTZWN1cml0eU1hbmFnZXIgIT0gbnVsbCkgeworCQkJZlNlY3VyaXR5TWFuYWdlci5jaGVja0V4ZWMoY21kKTsKKwkJfQorCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2hlY2tMaW5rKGphdmEubGFuZy5TdHJpbmcpCisJICovCisJcHVibGljIHZvaWQgY2hlY2tMaW5rKFN0cmluZyBsaWIpIHsKKwkJaWYgKGZTZWN1cml0eU1hbmFnZXIgIT0gbnVsbCkgeworCQkJZlNlY3VyaXR5TWFuYWdlci5jaGVja0xpbmsobGliKTsKKwkJfQorCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2hlY2tMaXN0ZW4oaW50KQorCSAqLworCXB1YmxpYyB2b2lkIGNoZWNrTGlzdGVuKGludCBwb3J0KSB7CisJCWlmIChmU2VjdXJpdHlNYW5hZ2VyICE9IG51bGwpIHsKKwkJCWZTZWN1cml0eU1hbmFnZXIuY2hlY2tMaXN0ZW4ocG9ydCk7CisJCX0KKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2NoZWNrTWVtYmVyQWNjZXNzKGphdmEubGFuZy5DbGFzcywgaW50KQorCSAqLworCXB1YmxpYyB2b2lkIGNoZWNrTWVtYmVyQWNjZXNzKENsYXNzIGNsYXp6LCBpbnQgd2hpY2gpIHsKKwkJaWYgKGZTZWN1cml0eU1hbmFnZXIgIT0gbnVsbCkgeworCQkJZlNlY3VyaXR5TWFuYWdlci5jaGVja01lbWJlckFjY2VzcyhjbGF6eiwgd2hpY2gpOworCQl9CisJfQorCisJLyoqCisJICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2NoZWNrTXVsdGljYXN0KGphdmEubmV0LkluZXRBZGRyZXNzLCBieXRlKQorCSAqIEBkZXByZWNhdGVkCisJICovCisJcHVibGljIHZvaWQgY2hlY2tNdWx0aWNhc3QoSW5ldEFkZHJlc3MgbWFkZHIsIGJ5dGUgdHRsKSB7CisJCWlmIChmU2VjdXJpdHlNYW5hZ2VyICE9IG51bGwpIHsKKwkJCVN0cmluZyBob3N0ID0gbWFkZHIuZ2V0SG9zdEFkZHJlc3MoKTsKKwkJCWlmICghaG9zdC5zdGFydHNXaXRoKCJbIikgJiYgaG9zdC5pbmRleE9mKCc6JykgIT0gLTEpIHsgLy8kTk9OLU5MUy0xJAorCSAgIAkJCWhvc3QgPSAiWyIgKyBob3N0ICsgIl0iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCX0KKwkgICAgCWNoZWNrUGVybWlzc2lvbihuZXcgU29ja2V0UGVybWlzc2lvbihob3N0LCAiYWNjZXB0LGNvbm5lY3QiKSk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2hlY2tNdWx0aWNhc3QoamF2YS5uZXQuSW5ldEFkZHJlc3MpCisJICovCisJcHVibGljIHZvaWQgY2hlY2tNdWx0aWNhc3QoSW5ldEFkZHJlc3MgbWFkZHIpIHsKKwkJaWYgKGZTZWN1cml0eU1hbmFnZXIgIT0gbnVsbCkgeworCQkJZlNlY3VyaXR5TWFuYWdlci5jaGVja011bHRpY2FzdChtYWRkcik7CisJCX0KKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2NoZWNrUGFja2FnZUFjY2VzcyhqYXZhLmxhbmcuU3RyaW5nKQorCSAqLworCXB1YmxpYyB2b2lkIGNoZWNrUGFja2FnZUFjY2VzcyhTdHJpbmcgcGtnKSB7CisJCWlmIChmU2VjdXJpdHlNYW5hZ2VyICE9IG51bGwpIHsKKwkJCWZTZWN1cml0eU1hbmFnZXIuY2hlY2tQYWNrYWdlQWNjZXNzKHBrZyk7CisJCX0KKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2NoZWNrUGFja2FnZURlZmluaXRpb24oamF2YS5sYW5nLlN0cmluZykKKwkgKi8KKwlwdWJsaWMgdm9pZCBjaGVja1BhY2thZ2VEZWZpbml0aW9uKFN0cmluZyBwa2cpIHsKKwkJaWYgKGZTZWN1cml0eU1hbmFnZXIgIT0gbnVsbCkgeworCQkJZlNlY3VyaXR5TWFuYWdlci5jaGVja1BhY2thZ2VEZWZpbml0aW9uKHBrZyk7CisJCX0KKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2NoZWNrUGVybWlzc2lvbihqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb24sIGphdmEubGFuZy5PYmplY3QpCisJICovCisJcHVibGljIHZvaWQgY2hlY2tQZXJtaXNzaW9uKFBlcm1pc3Npb24gcGVybSwgT2JqZWN0IGNvbnRleHQpIHsKKwkJaWYgKGZTZWN1cml0eU1hbmFnZXIgIT0gbnVsbCkgeworCQkJZlNlY3VyaXR5TWFuYWdlci5jaGVja1Blcm1pc3Npb24ocGVybSwgY29udGV4dCk7CisJCX0KKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2NoZWNrUGVybWlzc2lvbihqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb24pCisJICovCisJcHVibGljIHZvaWQgY2hlY2tQZXJtaXNzaW9uKFBlcm1pc3Npb24gcGVybSkgeworCQlpZiAoIWZBbGxvd1NldHRpbmdTeXN0ZW1Qcm9wZXJ0aWVzICYmIGZnUHJvcGVydHlQZXJtaXNzaW9uLmltcGxpZXMocGVybSkgJiYgZlJlc3RyaWN0ZWRUaHJlYWQgPT0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSkgeworCQkJLy9hdHRlbXB0aW5nIHRvIHdyaXRlIGEgc3lzdGVtIHByb3BlcnR5CisJCQl0aHJvdyBuZXcgQW50U2VjdXJpdHlFeGNlcHRpb24oKTsKKwkJfQorCQlpZiAoZlNlY3VyaXR5TWFuYWdlciAhPSBudWxsKSB7CisJCQlmU2VjdXJpdHlNYW5hZ2VyLmNoZWNrUGVybWlzc2lvbihwZXJtKTsKKwkJfQorCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2hlY2tQcmludEpvYkFjY2VzcygpCisJICovCisJcHVibGljIHZvaWQgY2hlY2tQcmludEpvYkFjY2VzcygpIHsKKwkJaWYgKGZTZWN1cml0eU1hbmFnZXIgIT0gbnVsbCkgeworCQkJZlNlY3VyaXR5TWFuYWdlci5jaGVja1ByaW50Sm9iQWNjZXNzKCk7CisJCX0KKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2NoZWNrUHJvcGVydGllc0FjY2VzcygpCisJICovCisJcHVibGljIHZvaWQgY2hlY2tQcm9wZXJ0aWVzQWNjZXNzKCkgeworCQlpZiAoZlNlY3VyaXR5TWFuYWdlciAhPSBudWxsKSB7CisJCQlmU2VjdXJpdHlNYW5hZ2VyLmNoZWNrUHJvcGVydGllc0FjY2VzcygpOworCQl9CisJCXN1cGVyLmNoZWNrUHJvcGVydGllc0FjY2VzcygpOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2hlY2tQcm9wZXJ0eUFjY2VzcyhqYXZhLmxhbmcuU3RyaW5nKQorCSAqLworCXB1YmxpYyB2b2lkIGNoZWNrUHJvcGVydHlBY2Nlc3MoU3RyaW5nIGtleSkgeworCQlpZiAoZlNlY3VyaXR5TWFuYWdlciAhPSBudWxsKSB7CisJCQlmU2VjdXJpdHlNYW5hZ2VyLmNoZWNrUHJvcGVydHlBY2Nlc3Moa2V5KTsKKwkJfQorCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2hlY2tSZWFkKGphdmEuaW8uRmlsZURlc2NyaXB0b3IpCisJICovCisJcHVibGljIHZvaWQgY2hlY2tSZWFkKEZpbGVEZXNjcmlwdG9yIGZkKSB7CisJCWlmIChmU2VjdXJpdHlNYW5hZ2VyICE9IG51bGwpIHsKKwkJCWZTZWN1cml0eU1hbmFnZXIuY2hlY2tSZWFkKGZkKTsKKwkJfQorCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2hlY2tSZWFkKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QpCisJICovCisJcHVibGljIHZvaWQgY2hlY2tSZWFkKFN0cmluZyBmaWxlLCBPYmplY3QgY29udGV4dCkgeworCQlpZiAoZlNlY3VyaXR5TWFuYWdlciAhPSBudWxsKSB7CisJCQlmU2VjdXJpdHlNYW5hZ2VyLmNoZWNrUmVhZChmaWxlLCBjb250ZXh0KTsKKwkJfQorCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2hlY2tSZWFkKGphdmEubGFuZy5TdHJpbmcpCisJICovCisJcHVibGljIHZvaWQgY2hlY2tSZWFkKFN0cmluZyBmaWxlKSB7CisJCWlmIChmU2VjdXJpdHlNYW5hZ2VyICE9IG51bGwpIHsKKwkJCWZTZWN1cml0eU1hbmFnZXIuY2hlY2tSZWFkKGZpbGUpOworCQl9CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNjaGVja1NlY3VyaXR5QWNjZXNzKGphdmEubGFuZy5TdHJpbmcpCisJICovCisJcHVibGljIHZvaWQgY2hlY2tTZWN1cml0eUFjY2VzcyhTdHJpbmcgdGFyZ2V0KSB7CisJCWlmIChmU2VjdXJpdHlNYW5hZ2VyICE9IG51bGwpIHsKKwkJCWZTZWN1cml0eU1hbmFnZXIuY2hlY2tTZWN1cml0eUFjY2Vzcyh0YXJnZXQpOworCQl9CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNjaGVja1NldEZhY3RvcnkoKQorCSAqLworCXB1YmxpYyB2b2lkIGNoZWNrU2V0RmFjdG9yeSgpIHsKKwkJaWYgKGZTZWN1cml0eU1hbmFnZXIgIT0gbnVsbCkgeworCQkJZlNlY3VyaXR5TWFuYWdlci5jaGVja1NldEZhY3RvcnkoKTsKKwkJfQorCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2hlY2tTeXN0ZW1DbGlwYm9hcmRBY2Nlc3MoKQorCSAqLworCXB1YmxpYyB2b2lkIGNoZWNrU3lzdGVtQ2xpcGJvYXJkQWNjZXNzKCkgeworCQlpZiAoZlNlY3VyaXR5TWFuYWdlciAhPSBudWxsKSB7CisJCQlmU2VjdXJpdHlNYW5hZ2VyLmNoZWNrU3lzdGVtQ2xpcGJvYXJkQWNjZXNzKCk7CisJCX0KKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2NoZWNrVG9wTGV2ZWxXaW5kb3coamF2YS5sYW5nLk9iamVjdCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBjaGVja1RvcExldmVsV2luZG93KE9iamVjdCB3aW5kb3cpIHsKKwkJaWYgKGZTZWN1cml0eU1hbmFnZXIgIT0gbnVsbCkgeworCQkJcmV0dXJuIGZTZWN1cml0eU1hbmFnZXIuY2hlY2tUb3BMZXZlbFdpbmRvdyh3aW5kb3cpOworCQl9CisJCXJldHVybiBzdXBlci5jaGVja1RvcExldmVsV2luZG93KHdpbmRvdyk7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNjaGVja1dyaXRlKGphdmEuaW8uRmlsZURlc2NyaXB0b3IpCisJICovCisJcHVibGljIHZvaWQgY2hlY2tXcml0ZShGaWxlRGVzY3JpcHRvciBmZCkgeworCQlpZiAoZlNlY3VyaXR5TWFuYWdlciAhPSBudWxsKSB7CisJCQlmU2VjdXJpdHlNYW5hZ2VyLmNoZWNrV3JpdGUoZmQpOworCQl9CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNjaGVja1dyaXRlKGphdmEubGFuZy5TdHJpbmcpCisJICovCisJcHVibGljIHZvaWQgY2hlY2tXcml0ZShTdHJpbmcgZmlsZSkgeworCQlpZiAoZlNlY3VyaXR5TWFuYWdlciAhPSBudWxsKSB7CisJCQlmU2VjdXJpdHlNYW5hZ2VyLmNoZWNrV3JpdGUoZmlsZSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBAc2VlIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjZ2V0SW5DaGVjaygpCisJICogQGRlcHJlY2F0ZWQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBnZXRJbkNoZWNrKCkgeworCQlpZiAoZlNlY3VyaXR5TWFuYWdlciAhPSBudWxsKSB7CisJCQlyZXR1cm4gZlNlY3VyaXR5TWFuYWdlci5nZXRJbkNoZWNrKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmdldEluQ2hlY2soKTsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2dldFNlY3VyaXR5Q29udGV4dCgpCisJICovCisJcHVibGljIE9iamVjdCBnZXRTZWN1cml0eUNvbnRleHQoKSB7CisJCWlmIChmU2VjdXJpdHlNYW5hZ2VyICE9IG51bGwpIHsKKwkJCXJldHVybiBmU2VjdXJpdHlNYW5hZ2VyLmdldFNlY3VyaXR5Q29udGV4dCgpOworCQl9CisJCXJldHVybiBzdXBlci5nZXRTZWN1cml0eUNvbnRleHQoKTsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2dldFRocmVhZEdyb3VwKCkKKwkgKi8KKwlwdWJsaWMgVGhyZWFkR3JvdXAgZ2V0VGhyZWFkR3JvdXAoKSB7CisJCWlmIChmU2VjdXJpdHlNYW5hZ2VyICE9IG51bGwpIHsKKwkJCWZTZWN1cml0eU1hbmFnZXIuZ2V0VGhyZWFkR3JvdXAoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZ2V0VGhyZWFkR3JvdXAoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9jb3JlL0ludGVybmFsQ29yZUFudE1lc3NhZ2VzLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9jb3JlL0ludGVybmFsQ29yZUFudE1lc3NhZ2VzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJmNjVlNgotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2NvcmUvSW50ZXJuYWxDb3JlQW50TWVzc2FnZXMuamF2YQpAQCAtMCwwICsxLDM1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCisgKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKKyAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6IAorICogSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmNvcmU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworCitwdWJsaWMgY2xhc3MgSW50ZXJuYWxDb3JlQW50TWVzc2FnZXMgZXh0ZW5kcyBOTFMgeworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwuY29yZS5JbnRlcm5hbENvcmVBbnRNZXNzYWdlcyI7Ly8kTk9OLU5MUy0xJAorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgQW50Q29yZVByZWZlcmVuY2VzX01hbGZvcm1lZF9VUkxfXzE7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQW50Q29yZVByZWZlcmVuY2VzX0xpYnJhcnlfbm90X3NwZWNpZmllZF9mb3JfX18wX180OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudENvcmVQcmVmZXJlbmNlc19Ob19saWJyYXJ5X2Zvcl90YXNrOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudENvcmVQcmVmZXJlbmNlc19Ob19saWJyYXJ5X2Zvcl90eXBlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudENvcmVQcmVmZXJlbmNlc184OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudENvcmVQcmVmZXJlbmNlc182OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudENvcmVQcmVmZXJlbmNlc18wOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudENvcmVQcmVmZXJlbmNlc18xOworCisJcHVibGljIHN0YXRpYyBTdHJpbmcgQW50UnVubmVyX0NvdWxkX25vdF9maW5kX29uZV9vcl9tb3JlX2NsYXNzZXNfX1BsZWFzZV9jaGVja190aGVfQW50X2NsYXNzcGF0aF9fMTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRSdW5uZXJfQ291bGRfbm90X2ZpbmRfb25lX29yX21vcmVfY2xhc3Nlc19fUGxlYXNlX2NoZWNrX3RoZV9BbnRfY2xhc3NwYXRoX18yOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudFJ1bm5lcl9CdWlsZF9GYWlsZWRfXzM7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQW50UnVubmVyX0FscmVhZHlfaW5fcHJvZ2VzczsKKworCXN0YXRpYyB7CisJCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQorCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBJbnRlcm5hbENvcmVBbnRNZXNzYWdlcy5jbGFzcyk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2NvcmUvSW50ZXJuYWxDb3JlQW50TWVzc2FnZXMucHJvcGVydGllcyBiL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2NvcmUvSW50ZXJuYWxDb3JlQW50TWVzc2FnZXMucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2ZmZDkyCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvY29yZS9JbnRlcm5hbENvcmVBbnRNZXNzYWdlcy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMjQgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisjIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorIworIyBDb250cmlidXRvcnM6CisjICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworQW50Q29yZVByZWZlcmVuY2VzX01hbGZvcm1lZF9VUkxfXzE9TWFsZm9ybWVkIFVSTC4KK0FudENvcmVQcmVmZXJlbmNlc19MaWJyYXJ5X25vdF9zcGVjaWZpZWRfZm9yX19fMF9fND1MaWJyYXJ5IG5vdCBzcGVjaWZpZWQgZm9yOiB7MH0KK0FudENvcmVQcmVmZXJlbmNlc19Ob19saWJyYXJ5X2Zvcl90YXNrPVRoZSBsaWJyYXJ5IFwiezB9XCIgc3BlY2lmaWVkIGZyb20gXCJ7MX1cIiBmb3IgdGhlIGFudFRhc2tzIGV4dGVuc2lvbiBkb2VzIG5vdCBleGlzdAorQW50Q29yZVByZWZlcmVuY2VzX05vX2xpYnJhcnlfZm9yX3R5cGU9VGhlIGxpYnJhcnkgXCJ7MH1cIiBzcGVjaWZpZWQgZnJvbSBcInsxfVwiIGZvciB0aGUgYW50VHlwZXMgZXh0ZW5zaW9uIG9mIGRvZXMgbm90IGV4aXN0CitBbnRDb3JlUHJlZmVyZW5jZXNfOD1UaGUgbGlicmFyeSBcInswfVwiIHNwZWNpZmllZCBmcm9tIFwiezF9XCIgZm9yIHRoZSBhbnRUYXNrcyBvciBhbnRUeXBlcyBleHRlbnNpb24gZG9lcyBub3QgZXhpc3QKK0FudENvcmVQcmVmZXJlbmNlc182PVRoZSBsaWJyYXJ5IFwiezB9XCIgc3BlY2lmaWVkIGZyb20gXCJ7MX1cIiBmb3IgdGhlIGV4dHJhQ2xhc3NwYXRoRW50cmllcyBleHRlbnNpb24gZG9lcyBub3QgZXhpc3QKK0FudENvcmVQcmVmZXJlbmNlc18wPUV4Y2VwdGlvbiBwYXJzaW5nIGJ1bmRsZSBtYW5pZmVzdCBmaWxlLgorQW50Q29yZVByZWZlcmVuY2VzXzE9SG9zdCBub3QgZm91bmQgZm9yIHRoZSBmcmFnbWVudDogezB9CisKK0FudFJ1bm5lcl9Db3VsZF9ub3RfZmluZF9vbmVfb3JfbW9yZV9jbGFzc2VzX19QbGVhc2VfY2hlY2tfdGhlX0FudF9jbGFzc3BhdGhfXzE9Q291bGQgbm90IGZpbmQgb25lIG9yIG1vcmUgY2xhc3Nlcy4gUGxlYXNlIGNoZWNrIHRoZSBBbnQgY2xhc3NwYXRoLgorQW50UnVubmVyX0NvdWxkX25vdF9maW5kX29uZV9vcl9tb3JlX2NsYXNzZXNfX1BsZWFzZV9jaGVja190aGVfQW50X2NsYXNzcGF0aF9fMj1Db3VsZCBub3QgZmluZCBvbmUgb3IgbW9yZSBjbGFzc2VzOiBcInswfVwiLiBQbGVhc2UgY2hlY2sgdGhlIEFudCBjbGFzc3BhdGguCitBbnRSdW5uZXJfQnVpbGRfRmFpbGVkX18zPUJVSUxEIEZBSUxFRAorQW50UnVubmVyX0FscmVhZHlfaW5fcHJvZ2Vzcz1BbnQgYnVpbGQgezB9IGFscmVhZHkgaW4gcHJvZ3Jlc3MuIENvbmN1cnJlbnQgQW50IGJ1aWxkcyBhcmUgcG9zc2libGUgaWYgeW91IHNwZWNpZnkgdG8gYnVpbGQgaW4gYSBzZXBhcmF0ZSBKUkUuCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9jb3JlL2NvbnRlbnREZXNjcmliZXIvQW50QnVpbGRmaWxlQ29udGVudERlc2NyaWJlci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvY29yZS9jb250ZW50RGVzY3JpYmVyL0FudEJ1aWxkZmlsZUNvbnRlbnREZXNjcmliZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2VkZjlkCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvY29yZS9jb250ZW50RGVzY3JpYmVyL0FudEJ1aWxkZmlsZUNvbnRlbnREZXNjcmliZXIuamF2YQpAQCAtMCwwICsxLDExOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqICAgICBQaGlsaXBwZSBPbWJyZWRhbm5lIChwb21icmVkYW5uZUBuZXhiLmNvbSkgLSBidWcgMTI1MzY3CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmNvcmUuY29udGVudERlc2NyaWJlcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlJlYWRlcjsKKworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXhlY3V0YWJsZUV4dGVuc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LlhNTENvbnRlbnREZXNjcmliZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOworCisvKioKKyAqIEEgY29udGVudCBkZXNjcmliZXIgZm9yIEFudCBidWlsZGZpbGVzLgorICogPHA+CisgKiBJZiBwcm9qZWN0IHRvcCBsZXZlbCBlbGVtZW50IGlzIGZvdW5kIAorICogICAgICB0aGVuIGlmOgorICogICAgICAgICAgdGFyZ2V0IHN1Yi1lbGVtZW50cyBhcmUgZm91bmQgcmV0dXJucyBWQUxJRAorICogICAgICAgICAgZGVmYXVsdCBhdHRyaWJ1dGUgaXMgZm91bmQgcmV0dXJucyBWQUxJRAorICogICAgICAgICAgc29tZSBvdGhlciBsaWtlbHkgQW50IGVsZW1lbnQgaXMgZm91bmQgKGNsYXNzcGF0aCwgaW1wb3J0LCBtYWNyb2RlZiwgcGF0aCwgcHJvcGVydHksIHRhc2tkZWYsIHR5cGVkZWYpIHJldHVybnMgVkFMSUQKKyAqICAgICAgZWxzZToKKyAqICAgICAgICAgIHJldHVybnMgSU5ERVRFUk1JTkFURQorICogZWxzZQorICogICAgICByZXR1cm5zIElOREVURVJNSU5BVEUKKyAqIDwvcD4KKyAqIAorICogQHNpbmNlIDMuMQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQW50QnVpbGRmaWxlQ29udGVudERlc2NyaWJlciBleHRlbmRzIFhNTENvbnRlbnREZXNjcmliZXIgaW1wbGVtZW50cyBJRXhlY3V0YWJsZUV4dGVuc2lvbiB7CisKKwkvKiAoSW50ZW50aW9uYWxseSBub3QgaW5jbHVkZWQgaW4gamF2YWRvYykKKwkgKiBEZXRlcm1pbmVzIHRoZSB2YWxpZGF0aW9uIHN0YXR1cyBmb3IgdGhlIGdpdmVuIGNvbnRlbnRzLgorCSAqIAorCSAqIEBwYXJhbSBjb250ZW50cyB0aGUgY29udGVudHMgdG8gYmUgZXZhbHVhdGVkCisJICogQHJldHVybiBvbmUgb2YgdGhlIGZvbGxvd2luZzo8dWw+CisJICogPGxpPjxjb2RlPlZBTElEPC9jb2RlPjwvbGk+LAorCSAqIDxsaT48Y29kZT5JTlZBTElEPC9jb2RlPjwvbGk+LAorCSAqIDxsaT48Y29kZT5JTkRFVEVSTUlOQVRFPC9jb2RlPjwvbGk+CisJICogPC91bD4KKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisJICovCisJcHJpdmF0ZSBpbnQgY2hlY2tDcml0ZXJpYShJbnB1dFNvdXJjZSBjb250ZW50cykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJQW50SGFuZGxlciBhbnRIYW5kbGVyID0gbmV3IEFudEhhbmRsZXIoKTsKKwkJdHJ5IHsKKwkJCWlmICghYW50SGFuZGxlci5wYXJzZUNvbnRlbnRzKGNvbnRlbnRzKSkgeworCQkJCXJldHVybiBJTkRFVEVSTUlOQVRFOworICAgICAgICAgICAgfQorCQl9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgeworCQkJLy8gd2UgbWF5IGJlIGhhbmRlZCBhbnkga2luZCBvZiBjb250ZW50cy4uLiBpdCBpcyBub3JtYWwgd2UgZmFpbCB0byBwYXJzZQorCQkJcmV0dXJuIElOREVURVJNSU5BVEU7CisJCX0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgeworCQkJLy8gc29tZSBiYWQgdGhpbmcgaGFwcGVuZWQgLSBmb3JjZSB0aGlzIGRlc2NyaWJlciB0byBiZSBkaXNhYmxlZAorCQkJU3RyaW5nIG1lc3NhZ2UgPSAiSW50ZXJuYWwgRXJyb3I6IFhNTCBwYXJzZXIgY29uZmlndXJhdGlvbiBlcnJvciBkdXJpbmcgY29udGVudCBkZXNjcmlwdGlvbiBmb3IgQW50IGJ1aWxkZmlsZXMiOyAvLyROT04tTkxTLTEkCisJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihtZXNzYWdlKTsKKwkJfQorCQkvLyBDaGVjayB0byBzZWUgaWYgd2UgbWF0Y2hlZCBvdXIgY3JpdGVyaWEuCisJCWlmIChhbnRIYW5kbGVyLmhhc1Jvb3RQcm9qZWN0RWxlbWVudCgpKSB7CisJCQlpZiAoYW50SGFuZGxlci5oYXNQcm9qZWN0RGVmYXVsdEF0dHJpYnV0ZSgpIHx8IGFudEhhbmRsZXIuaGFzVGFyZ2V0RWxlbWVudCgpIHx8IGFudEhhbmRsZXIuaGFzQW50RWxlbWVudCgpKSB7CisgICAgICAgICAgICAgICAgLy9wcm9qZWN0IGFuZCBkZWZhdWx0IGF0dHJpYnV0ZSBvciBwcm9qZWN0IGFuZCB0YXJnZXQgZWxlbWVudChzKSAKKwkJCQkvL29yIHByb2plY3QgYW5kIHRvcCBsZXZlbCBhbnQgZWxlbWVudChzKSAoY2xhc3NwYXRoLCBpbXBvcnQsIG1hY3JvZGVmLCBwYXRoLCBwcm9wZXJ0eSwgdGFza2RlZiwgdHlwZWRlZikKKyAgICAgICAgICAgICAgICByZXR1cm4gVkFMSUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvL29ubHkgYSB0b3AgbGV2ZWwgcHJvamVjdCBlbGVtZW50Li4ubWF5YmUgYW4gQW50IGJ1aWxkZmlsZQorICAgICAgICAgICAgcmV0dXJuIElOREVURVJNSU5BVEU7CisgICAgICAgIH0gCisJCQkKKwkJcmV0dXJuIElOREVURVJNSU5BVEU7CisJfQorCisJLyogKEludGVudGlvbmFsbHkgbm90IGluY2x1ZGVkIGluIGphdmFkb2MpCisJICogQHNlZSBJQ29udGVudERlc2NyaWJlciNkZXNjcmliZShJbnB1dFN0cmVhbSwgSUNvbnRlbnREZXNjcmlwdGlvbikKKwkgKi8KKwlwdWJsaWMgaW50IGRlc2NyaWJlKElucHV0U3RyZWFtIGNvbnRlbnRzLCBJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQkvLyBjYWxsIHRoZSBiYXNpYyBYTUwgZGVzY3JpYmVyIHRvIGRvIGJhc2ljIHJlY29nbml0aW9uCisJCWlmIChzdXBlci5kZXNjcmliZShjb250ZW50cywgZGVzY3JpcHRpb24pID09IElOVkFMSUQpIHsKKwkJCXJldHVybiBJTlZBTElEOworCQl9CisJCS8vIHN1cGVyLmRlc2NyaWJlIHdpbGwgaGF2ZSBjb25zdW1lZCBzb21lIGNoYXJzLCBuZWVkIHRvIHJld2luZAkJCisJCWNvbnRlbnRzLnJlc2V0KCk7CisJCS8vIENoZWNrIHRvIHNlZSBpZiB3ZSBtYXRjaGVkIG91ciBjcml0ZXJpYS4JCQorCQlyZXR1cm4gY2hlY2tDcml0ZXJpYShuZXcgSW5wdXRTb3VyY2UoY29udGVudHMpKTsKKwl9CisKKwkvKiAoSW50ZW50aW9uYWxseSBub3QgaW5jbHVkZWQgaW4gamF2YWRvYykKKwkgKiBAc2VlIElDb250ZW50RGVzY3JpYmVyI2Rlc2NyaWJlKFJlYWRlciwgSUNvbnRlbnREZXNjcmlwdGlvbikKKwkgKi8KKwlwdWJsaWMgaW50IGRlc2NyaWJlKFJlYWRlciBjb250ZW50cywgSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJLy8gY2FsbCB0aGUgYmFzaWMgWE1MIGRlc2NyaWJlciB0byBkbyBiYXNpYyByZWNvZ25pdGlvbgorCQlpZiAoc3VwZXIuZGVzY3JpYmUoY29udGVudHMsIGRlc2NyaXB0aW9uKSA9PSBJTlZBTElEKSB7CisJCQlyZXR1cm4gSU5WQUxJRDsKKwkJfQorCQkvLyBzdXBlci5kZXNjcmliZSB3aWxsIGhhdmUgY29uc3VtZWQgc29tZSBjaGFycywgbmVlZCB0byByZXdpbmQKKwkJY29udGVudHMucmVzZXQoKTsKKwkJLy8gQ2hlY2sgdG8gc2VlIGlmIHdlIG1hdGNoZWQgb3VyIGNyaXRlcmlhLgorCQlyZXR1cm4gY2hlY2tDcml0ZXJpYShuZXcgSW5wdXRTb3VyY2UoY29udGVudHMpKTsKKwl9CisKKyAgICAvKiAobm9uLUphdmFkb2MpCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4ZWN1dGFibGVFeHRlbnNpb24jc2V0SW5pdGlhbGl6YXRpb25EYXRhKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SW5pdGlhbGl6YXRpb25EYXRhKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWcsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBkYXRhKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmNfYW50L01FVEEtSU5GL2VjbGlwc2UuaW5mIGIvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NyY19hbnQvTUVUQS1JTkYvZWNsaXBzZS5pbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRkZjNhYgotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmNfYW50L01FVEEtSU5GL2VjbGlwc2UuaW5mCkBAIC0wLDAgKzEgQEAKK2phcnByb2Nlc3Nvci5leGNsdWRlLnNpZ249dHJ1ZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmNfYW50L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9jb3JlL2FudC9EZW11eElucHV0U3RyZWFtU2V0dGVyLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvc3JjX2FudC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvY29yZS9hbnQvRGVtdXhJbnB1dFN0cmVhbVNldHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4ZTgyNGQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvc3JjX2FudC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvY29yZS9hbnQvRGVtdXhJbnB1dFN0cmVhbVNldHRlci5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmNvcmUuYW50OworCisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5EZW11eElucHV0U3RyZWFtOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CisKKy8qKgorICogVGhpcyBjbGFzcyBleGlzdHMgc28gdGhhdCB0aGUgQW50IGludGVncmF0aW9uIGhhcyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQorICogd2l0aCBBbnQgcmVsZWFzZXMgcHJldmlvdXMgdG8gMS42LiBEZW11eElucHV0U3RyZWFtIGlzIGEgbmV3IGNsYXNzIHRvIEFudCAxLjYuCisgKi8KK2NsYXNzIERlbXV4SW5wdXRTdHJlYW1TZXR0ZXIgeworCisJcHJvdGVjdGVkIHZvaWQgcmVtYXBTeXN0ZW1JbihQcm9qZWN0IHByb2plY3QpIHsKKwkJU3lzdGVtLnNldEluKG5ldyBEZW11eElucHV0U3RyZWFtKHByb2plY3QpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvc3JjX2FudC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvY29yZS9hbnQvRWNsaXBzZUFudE1haW4uamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmNfYW50L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9jb3JlL2FudC9FY2xpcHNlQW50TWFpbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MGI1OTEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvc3JjX2FudC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvY29yZS9hbnQvRWNsaXBzZUFudE1haW4uamF2YQpAQCAtMCwwICsxLDUwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwuY29yZS5hbnQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZExpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50Lk1haW47CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKKworcHVibGljIGNsYXNzIEVjbGlwc2VBbnRNYWluIGV4dGVuZHMgTWFpbiB7CisKKwlwcml2YXRlIFByb2plY3QgZkVjbGlwc2VBbnRQcm9qZWN0OworCisJcHVibGljIEVjbGlwc2VBbnRNYWluKFByb2plY3QgZWNsaXBzZUFudFByb2plY3QpIHsKKwkJc3VwZXIoKTsKKwkJZkVjbGlwc2VBbnRQcm9qZWN0ID0gZWNsaXBzZUFudFByb2plY3Q7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIHJ1bihTdHJpbmdbXSBhcmdzLCBQcm9qZWN0IGVjbGlwc2VBbnRQcm9qZWN0KSB7CisJCU1haW4gcHJvamVjdEhlbHBNYWluID0gbmV3IEVjbGlwc2VBbnRNYWluKGVjbGlwc2VBbnRQcm9qZWN0KTsKKwkJcHJvamVjdEhlbHBNYWluLnN0YXJ0QW50KGFyZ3MsIG51bGwsIG51bGwpOworCX0KKwkKKwkvKgorCSAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuTWFpbiNleGl0KGludCkKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBleGl0KGludCBleGl0Q29kZSkgeworCQkvL2Rpc2FsbG93IHN5c3RlbSBleGl0CisJfQorCQorCS8qCisJICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5NYWluI2FkZEJ1aWxkTGlzdGVuZXJzKG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3QpCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkQnVpbGRMaXN0ZW5lcnMoUHJvamVjdCBwcm9qZWN0KSB7CisJCUl0ZXJhdG9yIGxpc3RlbmVycyA9IGZFY2xpcHNlQW50UHJvamVjdC5nZXRCdWlsZExpc3RlbmVycygpLml0ZXJhdG9yKCk7CisJCXdoaWxlIChsaXN0ZW5lcnMuaGFzTmV4dCgpKSB7CisJCQlwcm9qZWN0LmFkZEJ1aWxkTGlzdGVuZXIoKEJ1aWxkTGlzdGVuZXIpIGxpc3RlbmVycy5uZXh0KCkpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NyY19hbnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2NvcmUvYW50L0VjbGlwc2VEZWZhdWx0RXhlY3V0b3IuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmNfYW50L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9jb3JlL2FudC9FY2xpcHNlRGVmYXVsdEV4ZWN1dG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRhYTM1YQotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmNfYW50L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9jb3JlL2FudC9FY2xpcHNlRGVmYXVsdEV4ZWN1dG9yLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5jb3JlLmFudDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkV4ZWN1dG9yOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuaGVscGVyLkRlZmF1bHRFeGVjdXRvcjsKKworcHVibGljIGNsYXNzIEVjbGlwc2VEZWZhdWx0RXhlY3V0b3IgZXh0ZW5kcyBEZWZhdWx0RXhlY3V0b3IgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRWNsaXBzZVNpbmdsZUNoZWNrRXhlY3V0b3IgU1VCX0VYRUNVVE9SID0gbmV3IEVjbGlwc2VTaW5nbGVDaGVja0V4ZWN1dG9yKCk7CisgICAgCisgICAgLyogKG5vbi1KYXZhZG9jKQorICAgICAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuRXhlY3V0b3IjZXhlY3V0ZVRhcmdldHMob3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdCwgamF2YS5sYW5nLlN0cmluZ1tdKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGVUYXJnZXRzKFByb2plY3QgcHJvamVjdCwgU3RyaW5nW10gdGFyZ2V0TmFtZXMpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIFZlY3RvciB2PSBuZXcgVmVjdG9yKCk7CisgICAgICAgIHYuYWRkQWxsKEFycmF5cy5hc0xpc3QodGFyZ2V0TmFtZXMpKTsKKyAgICAgICAgcHJvamVjdC5hZGRSZWZlcmVuY2UoImVjbGlwc2UuYW50LnRhcmdldFZlY3RvciIsIHYpOyAvLyROT04tTkxTLTEkCisgICAgICAgIHN1cGVyLmV4ZWN1dGVUYXJnZXRzKHByb2plY3QsIHRhcmdldE5hbWVzKTsKKyAgICB9CisgICAgCisgICAgLyogKG5vbi1KYXZhZG9jKQorICAgICAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuRXhlY3V0b3IjZ2V0U3ViUHJvamVjdEV4ZWN1dG9yKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgRXhlY3V0b3IgZ2V0U3ViUHJvamVjdEV4ZWN1dG9yKCkgeworICAgICAgIHJldHVybiBTVUJfRVhFQ1VUT1I7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NyY19hbnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2NvcmUvYW50L0VjbGlwc2VNYWluSGVscGVyLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvc3JjX2FudC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvY29yZS9hbnQvRWNsaXBzZU1haW5IZWxwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDUyNTAyCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NyY19hbnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2NvcmUvYW50L0VjbGlwc2VNYWluSGVscGVyLmphdmEKQEAgLTAsMCArMSwyNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmNvcmUuYW50OworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKKworcHVibGljIGNsYXNzIEVjbGlwc2VNYWluSGVscGVyIHsKKworCXByb3RlY3RlZCB2b2lkIHJ1blByb2plY3RIZWxwKFN0cmluZyBidWlsZEZpbGVMb2NhdGlvbiwgUHJvamVjdCBlY2xpcHNlQW50UHJvamVjdCkgeworCQlFY2xpcHNlQW50TWFpbi5ydW4obmV3IFN0cmluZ1tdeyItZiIsIGJ1aWxkRmlsZUxvY2F0aW9uLCAiLXAifSwgZWNsaXBzZUFudFByb2plY3QpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgcnVuVXNhZ2UoU3RyaW5nIGJ1aWxkRmlsZUxvY2F0aW9uLCBQcm9qZWN0IGVjbGlwc2VBbnRQcm9qZWN0KSB7CisJCUVjbGlwc2VBbnRNYWluLnJ1bihuZXcgU3RyaW5nW117Ii1mIiwgYnVpbGRGaWxlTG9jYXRpb24sICItaCJ9LCBlY2xpcHNlQW50UHJvamVjdCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCX0KK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmNfYW50L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9jb3JlL2FudC9FY2xpcHNlU2luZ2xlQ2hlY2tFeGVjdXRvci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NyY19hbnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2NvcmUvYW50L0VjbGlwc2VTaW5nbGVDaGVja0V4ZWN1dG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY1NDliNgotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmNfYW50L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9jb3JlL2FudC9FY2xpcHNlU2luZ2xlQ2hlY2tFeGVjdXRvci5qYXZhCkBAIC0wLDAgKzEsMzkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwuY29yZS5hbnQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5FeGVjdXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LmhlbHBlci5TaW5nbGVDaGVja0V4ZWN1dG9yOworCitwdWJsaWMgY2xhc3MgRWNsaXBzZVNpbmdsZUNoZWNrRXhlY3V0b3IgZXh0ZW5kcyBTaW5nbGVDaGVja0V4ZWN1dG9yIHsKKworICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LkV4ZWN1dG9yI2V4ZWN1dGVUYXJnZXRzKG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3QsIGphdmEubGFuZy5TdHJpbmdbXSkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlVGFyZ2V0cyhQcm9qZWN0IHByb2plY3QsIFN0cmluZ1tdIHRhcmdldE5hbWVzKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBWZWN0b3Igdj0gbmV3IFZlY3RvcigpOworICAgICAgICB2LmFkZEFsbChBcnJheXMuYXNMaXN0KHRhcmdldE5hbWVzKSk7CisgICAgICAgIHByb2plY3QuYWRkUmVmZXJlbmNlKCJlY2xpcHNlLmFudC50YXJnZXRWZWN0b3IiLCB2KTsgLy8kTk9OLU5MUy0xJAorICAgICAgICBzdXBlci5leGVjdXRlVGFyZ2V0cyhwcm9qZWN0LCB0YXJnZXROYW1lcyk7CisgICAgfQorICAgIAorICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LkV4ZWN1dG9yI2dldFN1YlByb2plY3RFeGVjdXRvcigpCisgICAgICovCisgICAgcHVibGljIEV4ZWN1dG9yIGdldFN1YlByb2plY3RFeGVjdXRvcigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NyY19hbnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2NvcmUvYW50L0V4ZWN1dG9yU2V0dGVyLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvc3JjX2FudC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvY29yZS9hbnQvRXhlY3V0b3JTZXR0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzc1OWYyCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NyY19hbnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2NvcmUvYW50L0V4ZWN1dG9yU2V0dGVyLmphdmEKQEAgLTAsMCArMSwyNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5jb3JlLmFudDsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkV4ZWN1dG9yOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CisKKy8qKgorICogVGhpcyBjbGFzcyBleGlzdHMgc28gdGhhdCB0aGUgQW50IGludGVncmF0aW9uIGhhcyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQorICogd2l0aCBBbnQgcmVsZWFzZXMgcHJldmlvdXMgdG8gMS42LjMuIEV4ZWN1dG9ycyBhcmUgYSBuZXcgZmVhdHVyZSBvZiBBbnQgMS42LjMuCisgKi8KK3B1YmxpYyBjbGFzcyBFeGVjdXRvclNldHRlciB7CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRFeGVjdXRvcihQcm9qZWN0IHByb2plY3QpIHsKKyAgICAgICAgRXhlY3V0b3IgZXhlY3V0b3I9IG5ldyBFY2xpcHNlRGVmYXVsdEV4ZWN1dG9yKCk7CisgICAgICAgIHByb2plY3Quc2V0RXhlY3V0b3IoZXhlY3V0b3IpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmNfYW50L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9jb3JlL2FudC9GYWlsSW5wdXRIYW5kbGVyLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvc3JjX2FudC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvY29yZS9hbnQvRmFpbElucHV0SGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyMTU1YjMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvc3JjX2FudC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvY29yZS9hbnQvRmFpbElucHV0SGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsMjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwuY29yZS5hbnQ7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5pbnB1dC5EZWZhdWx0SW5wdXRIYW5kbGVyOworCitwdWJsaWMgY2xhc3MgRmFpbElucHV0SGFuZGxlciBleHRlbmRzIERlZmF1bHRJbnB1dEhhbmRsZXIgeworCQorCXByb3RlY3RlZCBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHsKKwkJLy9lbnN1cmUgYW55IGF0dGVtcHRzIHRvIHJlYWQgaW5wdXQgZmFpbAorCQlyZXR1cm4gbmV3IElucHV0U3RyZWFtKCl7CisJCQlwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigpOworCQkJfQorCQl9OworCX0KK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmNfYW50L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9jb3JlL2FudC9JbnB1dEhhbmRsZXJTZXR0ZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmNfYW50L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9jb3JlL2FudC9JbnB1dEhhbmRsZXJTZXR0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Mjk2NWI5Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NyY19hbnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2NvcmUvYW50L0lucHV0SGFuZGxlclNldHRlci5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqICBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmNvcmUuYW50OworCisKK2ltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsgLy8gY2FuJ3QgdXNlIElDVSBpbiBhbnQKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuaW5wdXQuRGVmYXVsdElucHV0SGFuZGxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5pbnB1dC5JbnB1dEhhbmRsZXI7CisKKy8qKgorICogVGhpcyBjbGFzcyBleGlzdHMgc28gdGhhdCB0aGUgQW50IGludGVncmF0aW9uIGhhcyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQorICogd2l0aCBBbnQgcmVsZWFzZXMgcHJldmlvdXMgdG8gMS41LiBJbnB1dEhhbmRsZXJzIGFyZSBhIG5ldyBmZWF0dXJlIG9mIEFudCAxLjUuCisgKi8KK2NsYXNzIElucHV0SGFuZGxlclNldHRlciB7CisKKwlwcm90ZWN0ZWQgdm9pZCBzZXRJbnB1dEhhbmRsZXIoUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgaW5wdXRIYW5kbGVyQ2xhc3NuYW1lKSB7CisJCUlucHV0SGFuZGxlciBoYW5kbGVyID0gbnVsbDsKKwkJaWYgKGlucHV0SGFuZGxlckNsYXNzbmFtZSA9PSBudWxsKSB7CisJCQloYW5kbGVyID0gbmV3IERlZmF1bHRJbnB1dEhhbmRsZXIoKTsKKwkJfSBlbHNlIHsKKwkJCXRyeSB7CisJCQkJaGFuZGxlciA9IChJbnB1dEhhbmRsZXIpKENsYXNzLmZvck5hbWUoaW5wdXRIYW5kbGVyQ2xhc3NuYW1lKS5uZXdJbnN0YW5jZSgpKTsKKwkJCX0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7CisJCQkJU3RyaW5nIG1zZyA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEludGVybmFsQW50TWVzc2FnZXMuSW50ZXJuYWxBbnRSdW5uZXJfaGFuZGxlcl9kb2VzX25vdF9pbXBsZW1lbnRfSW5wdXRIYW5kbGVyNSwgbmV3IFN0cmluZ1tde2lucHV0SGFuZGxlckNsYXNzbmFtZX0pOworCQkJCXRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGUpOworCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQlTdHJpbmcgbXNnID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoSW50ZXJuYWxBbnRNZXNzYWdlcy5JbnRlcm5hbEFudFJ1bm5lcl9VbmFibGVfdG9faW5zdGFudGlhdGVfaW5wdXRfaGFuZGxlcl9jbGFzcywgbmV3IFN0cmluZ1tde2lucHV0SGFuZGxlckNsYXNzbmFtZSwgZS5nZXRDbGFzcygpLmdldE5hbWUoKX0pOworCQkJCXRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGUpOworCQkJfQorCQl9CisJCXByb2plY3Quc2V0SW5wdXRIYW5kbGVyKGhhbmRsZXIpOworCQlwcm9qZWN0LnNldFByb2plY3RSZWZlcmVuY2UoaGFuZGxlcik7CisJfQorfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NyY19hbnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2NvcmUvYW50L0ludGVybmFsUHJvamVjdC5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NyY19hbnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2NvcmUvYW50L0ludGVybmFsUHJvamVjdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhMGFhYjIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvc3JjX2FudC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvY29yZS9hbnQvSW50ZXJuYWxQcm9qZWN0LmphdmEKQEAgLTAsMCArMSwxNzggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqICBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gZGVyaXZlZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmNvcmUuYW50OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CitpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7IC8vIGNhbid0IHVzZSBJQ1UsIGFudCBidWlsZCBzY3JpcHQKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdENvbXBvbmVudDsKKworLyoqCisgKiBBIHN1YmNsYXNzIG9mIFByb2plY3QgdG8gZmFjaWxpdGF0ZSAiZmFzdGVyIiBwYXJzaW5nIHdpdGgKKyAqIGxlc3MgZ2FyYmFnZSBnZW5lcmF0ZWQuIFRoaXMgY2xhc3MgaXMgbm90IHVzZWQgb24gQW50IDEuNiBhbmQgbmV3ZXIKKyAqIGR1ZSB0byB0aGUgaW1wcm92ZW1lbnRzIGluIGxhenkgbG9hZGluZyBvZiB0aGVzZSBBbnQgdmVyc2lvbnMuCisgKiAKKyAqIE9ubHkgdGhyZWUgdGFza3MgYXJlIGxvYWRlZCAocHJvcGVydHksIHRhc2tkZWYgYW5kIAorICogdHlwZWRlZjogdGhyZWUgdGFza3MgdGhhdCBjYW4gYmUgZGVmaW5lZCBvdXRzaWRlIG9mIGEgdGFyZ2V0IG9uIEFudCAxLjUuMSBvciBvbGRlcikuCisgKgorICogRGF0YXR5cGVzIGFyZSBsb2FkZWQgaWYgcmVxdWVzdGVkLgorICogCisgKiBEZXJpdmVkIGZyb20gdGhlIG9yaWdpbmFsIEFudCBQcm9qZWN0IGNsYXNzCisgKi8KK3B1YmxpYyBjbGFzcyBJbnRlcm5hbFByb2plY3QgZXh0ZW5kcyBQcm9qZWN0IHsKKworCXByaXZhdGUgSGFzaHRhYmxlIHR5cGVOYW1lVG9DbGFzcyA9IG51bGw7CisJCisJcHVibGljIEludGVybmFsUHJvamVjdCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0I2luaXQoKQorCSAqLworCXB1YmxpYyB2b2lkIGluaXQoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworCQlzZXRKYXZhVmVyc2lvblByb3BlcnR5KCk7CisKKwkJdHJ5IHsKKwkJCUNsYXNzIHRhc2tDbGFzcyA9IENsYXNzLmZvck5hbWUoIm9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlByb3BlcnR5Iik7IC8vJE5PTi1OTFMtMSQKKwkJCWFkZFRhc2tEZWZpbml0aW9uKCJwcm9wZXJ0eSIsIHRhc2tDbGFzcyk7IC8vJE5PTi1OTFMtMSQKKwkJCXRhc2tDbGFzcyA9IENsYXNzLmZvck5hbWUoIm9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlR5cGVkZWYiKTsgLy8kTk9OLU5MUy0xJAorCQkJYWRkVGFza0RlZmluaXRpb24oInR5cGVkZWYiLCB0YXNrQ2xhc3MpOyAvLyROT04tTkxTLTEkCisJCQl0YXNrQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKCJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5UYXNrZGVmIik7IC8vJE5PTi1OTFMtMSQKKwkJCWFkZFRhc2tEZWZpbml0aW9uKCJ0YXNrZGVmIiwgdGFza0NsYXNzKTsgLy8kTk9OLU5MUy0xJAorCQl9IGNhdGNoIChOb0NsYXNzRGVmRm91bmRFcnJvciBlKSB7CisJCQl0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oSW50ZXJuYWxBbnRNZXNzYWdlcy5JbnRlcm5hbEFudFJ1bm5lcl9NaXNzaW5nX0NsYXNzLCBlKTsKKwkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBjKSB7CisJCQl0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oSW50ZXJuYWxBbnRNZXNzYWdlcy5JbnRlcm5hbEFudFJ1bm5lcl9NaXNzaW5nX0NsYXNzLCBjKTsKKwkJfQorCisJCXNldFN5c3RlbVByb3BlcnRpZXMoKTsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0I2NyZWF0ZURhdGFUeXBlKGphdmEubGFuZy5TdHJpbmcpCisJICovCisJcHVibGljIE9iamVjdCBjcmVhdGVEYXRhVHlwZShTdHJpbmcgdHlwZU5hbWUpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisJCWlmICh0eXBlTmFtZVRvQ2xhc3MgPT0gbnVsbCkgeworCQkJaW5pdGlhbGl6ZVR5cGVzKCk7CisJCX0KKwkJQ2xhc3MgdHlwZUNsYXNzID0gKENsYXNzKSB0eXBlTmFtZVRvQ2xhc3MuZ2V0KHR5cGVOYW1lKTsKKworCQlpZiAodHlwZUNsYXNzID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJVGhyb3dhYmxlIHRocm93biA9IG51bGw7CisJCXRyeSB7CisJCQlDb25zdHJ1Y3RvciBjdG9yID0gbnVsbDsKKwkJCWJvb2xlYW4gbm9BcmcgPSBmYWxzZTsKKwkJCS8vIERhdGFUeXBlIGNhbiBoYXZlIGEgIm5vIGFyZyIgY29uc3RydWN0b3Igb3IgdGFrZSBhIHNpbmdsZQorCQkJLy8gUHJvamVjdCBhcmd1bWVudC4KKwkJCXRyeSB7CisJCQkJY3RvciA9IHR5cGVDbGFzcy5nZXRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbMF0pOworCQkJCW5vQXJnID0gdHJ1ZTsKKwkJCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBuc2UpIHsKKwkJCQljdG9yID0gdHlwZUNsYXNzLmdldENvbnN0cnVjdG9yKG5ldyBDbGFzc1tdIHsgUHJvamVjdC5jbGFzcyB9KTsKKwkJCQlub0FyZyA9IGZhbHNlOworCQkJfQorCisJCQlPYmplY3QgbyA9IG51bGw7CisJCQlpZiAobm9BcmcpIHsKKwkJCQlvID0gY3Rvci5uZXdJbnN0YW5jZShuZXcgT2JqZWN0WzBdKTsKKwkJCX0gZWxzZSB7CisJCQkJbyA9IGN0b3IubmV3SW5zdGFuY2UobmV3IE9iamVjdFtdIHsgdGhpcyB9KTsKKwkJCX0KKwkJCWlmIChvIGluc3RhbmNlb2YgUHJvamVjdENvbXBvbmVudCkgeworCQkJCSgoUHJvamVjdENvbXBvbmVudCkgbykuc2V0UHJvamVjdCh0aGlzKTsKKwkJCX0KKwkJCXJldHVybiBvOworCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGl0ZSkgeworCQkJdGhyb3duID0gaXRlLmdldFRhcmdldEV4Y2VwdGlvbigpOworCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworCQkJdGhyb3duID0gZTsKKwkJfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvd24gPSBlOworCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93biA9IGU7CisJCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBuc2UpIHsKKwkJCXRocm93biA9IG5zZTsKKwkJfSBjYXRjaCAoTm9DbGFzc0RlZkZvdW5kRXJyb3IgbmNkZmUpIHsKKwkJCXRocm93biA9IG5jZGZlOworCQl9CisJCWlmICh0aHJvd24gIT0gbnVsbCkgeworCQkJU3RyaW5nIG1lc3NhZ2U9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEludGVybmFsQW50TWVzc2FnZXMuSW50ZXJuYWxQcm9qZWN0X2NvdWxkX25vdF9jcmVhdGVfdHlwZSwgbmV3IFN0cmluZ1tde3R5cGVOYW1lLCB0aHJvd24udG9TdHJpbmcoKX0pOworCQkJdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1lc3NhZ2UsIHRocm93bik7CisJCX0KKwkJLy8gdGhpcyBsaW5lIGlzIGFjdHVhbGx5IHVucmVhY2hhYmxlCisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIEluaXRpYWxpemUgdGhlIG1hcHBpbmcgb2YgZGF0YSB0eXBlIG5hbWUgdG8gZGF0YSB0eXBlIGNsYXNzbmFtZQorCSAqLworCXByaXZhdGUgdm9pZCBpbml0aWFsaXplVHlwZXMoKSB7CisJCXR5cGVOYW1lVG9DbGFzcyA9IG5ldyBIYXNodGFibGUoMTgpOworCQlTdHJpbmcgZGF0YURlZnMgPSAiL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL2RlZmF1bHRzLnByb3BlcnRpZXMiOyAvLyROT04tTkxTLTEkCisJCXRyeSB7CisJCQlQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKKwkJCUlucHV0U3RyZWFtIGluID0gUHJvamVjdC5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKGRhdGFEZWZzKTsKKwkJCWlmIChpbiA9PSBudWxsKSB7CisJCQkJcmV0dXJuOworCQkJfQorCQkJcHJvcHMubG9hZChpbik7CisJCQlpbi5jbG9zZSgpOworCisJCQlFbnVtZXJhdGlvbiBlbnVtZXJhdGlvbiA9IHByb3BzLnByb3BlcnR5TmFtZXMoKTsKKwkJCXdoaWxlIChlbnVtZXJhdGlvbi5oYXNNb3JlRWxlbWVudHMoKSkgeworCQkJCVN0cmluZyB0eXBlTmFtZSA9IChTdHJpbmcpIGVudW1lcmF0aW9uLm5leHRFbGVtZW50KCk7CisJCQkJU3RyaW5nIGNsYXNzTmFtZSA9IHByb3BzLmdldFByb3BlcnR5KHR5cGVOYW1lKTsKKwkJCQl0cnkgeworCQkJCQlDbGFzcyB0eXBlQ2xhc3M9IENsYXNzLmZvck5hbWUoY2xhc3NOYW1lKTsKKwkJCQkJdHlwZU5hbWVUb0NsYXNzLnB1dCh0eXBlTmFtZSwgdHlwZUNsYXNzKTsKKwkJCQl9IGNhdGNoIChOb0NsYXNzRGVmRm91bmRFcnJvciBlKSB7CisJCQkJCS8vaWdub3JlCisJCQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBjKSB7CisJCQkJCS8vaWdub3JlCisJCQkJfQorCQkJfQorCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKwkJCXJldHVybjsKKwkJfQorCisJfQorCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3QjZ2V0RGF0YVR5cGVEZWZpbml0aW9ucygpCisJICovCisJcHVibGljIEhhc2h0YWJsZSBnZXREYXRhVHlwZURlZmluaXRpb25zKCkgeworCQlpZiAodHlwZU5hbWVUb0NsYXNzID09IG51bGwpIHsKKwkJCWluaXRpYWxpemVUeXBlcygpOworCQl9CisJCXJldHVybiB0eXBlTmFtZVRvQ2xhc3M7CisJfQorCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3QjYWRkRGF0YVR5cGVEZWZpbml0aW9uKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5DbGFzcykKKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGREYXRhVHlwZURlZmluaXRpb24oU3RyaW5nIHR5cGVOYW1lLCBDbGFzcyB0eXBlQ2xhc3MpIHsKKwkJZ2V0RGF0YVR5cGVEZWZpbml0aW9ucygpOworCQl0eXBlTmFtZVRvQ2xhc3MucHV0KHR5cGVOYW1lLCB0eXBlQ2xhc3MpOworCX0KK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmNfYW50L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9jb3JlL2FudC9JbnRlcm5hbFByb2plY3QyLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvc3JjX2FudC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvY29yZS9hbnQvSW50ZXJuYWxQcm9qZWN0Mi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1YWUxN2YKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvc3JjX2FudC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvY29yZS9hbnQvSW50ZXJuYWxQcm9qZWN0Mi5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5jb3JlLmFudDsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkFudENsYXNzTG9hZGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aDsKKworcHVibGljIGNsYXNzIEludGVybmFsUHJvamVjdDIgZXh0ZW5kcyBQcm9qZWN0IHsKKworICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3QjY3JlYXRlQ2xhc3NMb2FkZXIob3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aCkKKyAgICAgKi8KKyAgICBwdWJsaWMgQW50Q2xhc3NMb2FkZXIgY3JlYXRlQ2xhc3NMb2FkZXIoUGF0aCBwYXRoKSB7CisgICAgCUFudENsYXNzTG9hZGVyIGxvYWRlcj0gc3VwZXIuY3JlYXRlQ2xhc3NMb2FkZXIocGF0aCk7CisgICAgCWlmIChwYXRoID09IG51bGwpIHsKKyAgICAJCS8vdXNlIHRoZSAiZmFrZSIgRWNsaXBzZSBydW50aW1lIGNsYXNzcGF0aCBmb3IgQW50CisgICAgCQlsb2FkZXIuc2V0Q2xhc3NQYXRoKFBhdGguc3lzdGVtQ2xhc3NwYXRoKTsKKyAgICAJfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIGxvYWRlcjsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NyY19hbnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2NvcmUvYW50L051bGxJbnB1dEhhbmRsZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmNfYW50L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9jb3JlL2FudC9OdWxsSW5wdXRIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY2MDk2MgotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmNfYW50L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9jb3JlL2FudC9OdWxsSW5wdXRIYW5kbGVyLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5jb3JlLmFudDsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LmlucHV0LklucHV0SGFuZGxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5pbnB1dC5JbnB1dFJlcXVlc3Q7CisKKy8qKgorICogQSBpbnB1dCBoYW5kbGVyIHRoYXQgZG9lcyBub3RoaW5nIHdpdGggaW5wdXQgcmVxdWVzdHMKKyAqIFVzZWQgdG8gZW5zdXJlIHdlIGRvIG5vdCBibG9jayB3aGlsZSByZXRyaWV2aW5nIHRhcmdldHMgZnJvbSBhbiBBbnQgYnVpbGRmaWxlCisgKiB0aGF0IGhhcyBhbiBpbnB1dCB0YXNrIGluIHRoZSB0b3AgbGV2ZWwgaW1wbGljaXQgdGFyZ2V0CisgKi8KK3B1YmxpYyBjbGFzcyBOdWxsSW5wdXRIYW5kbGVyIGltcGxlbWVudHMgSW5wdXRIYW5kbGVyIHsKKworCXB1YmxpYyBOdWxsSW5wdXRIYW5kbGVyKCkgeworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LmlucHV0LklucHV0SGFuZGxlciNoYW5kbGVJbnB1dChvcmcuYXBhY2hlLnRvb2xzLmFudC5pbnB1dC5JbnB1dFJlcXVlc3QpCisJICovCisJcHVibGljIHZvaWQgaGFuZGxlSW5wdXQoSW5wdXRSZXF1ZXN0IHJlcXVlc3QpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisJfQorfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvLmNsYXNzcGF0aCBiL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nLy5jbGFzc3BhdGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThlYjAwZQotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nLy5jbGFzc3BhdGgKQEAgLTAsMCArMSwxMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxjbGFzc3BhdGg+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNCIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIG91dHB1dD0ibG9nZ2Vyc19iaW4iIHBhdGg9ImxvZ2dlcnMiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBvdXRwdXQ9ImNvbW1vbl9iaW4iIHBhdGg9ImNvbW1vbiIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIG91dHB1dD0icmVtb3RlX2JpbiIgcGF0aD0icmVtb3RlIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Cis8L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCAiYS9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy8uZXh0ZXJuYWxUb29sQnVpbGRlcnMvYnVpbGQgY29tbW9uIGRlYnVnIFwxMzNCdWlsZGVyXDEzNS5sYXVuY2giICJiL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nLy5leHRlcm5hbFRvb2xCdWlsZGVycy9idWlsZCBjb21tb24gZGVidWcgXDEzM0J1aWxkZXJcMTM1LmxhdW5jaCIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmYxZWM1NQotLS0gL2Rldi9udWxsCisrKyAiYi9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy8uZXh0ZXJuYWxUb29sQnVpbGRlcnMvYnVpbGQgY29tbW9uIGRlYnVnIFwxMzNCdWlsZGVyXDEzNS5sYXVuY2giCkBAIC0wLDAgKzEsMjEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8bGF1bmNoQ29uZmlndXJhdGlvbiB0eXBlPSJvcmcuZWNsaXBzZS5hbnQuQW50QnVpbGRlckxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIj4KKzxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuYW50LnVpLkFUVFJfVEFSR0VUU19VUERBVEVEIiB2YWx1ZT0idHJ1ZSIvPgorPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5hbnQudWkuREVGQVVMVF9WTV9JTlNUQUxMIiB2YWx1ZT0iZmFsc2UiLz4KKzxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkFUVFJfUkVGUkVTSF9TQ09QRSIgdmFsdWU9IiR7d29ya2luZ19zZXQ6Jmx0Oz94bWwgdmVyc2lvbj0mcXVvdDsxLjAmcXVvdDsgZW5jb2Rpbmc9JnF1b3Q7VVRGLTgmcXVvdDs/Jmd0OyYjMTM7JiMxMDsmbHQ7bGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdTZXQgZWRpdFBhZ2VJZD0mcXVvdDtvcmcuZWNsaXBzZS51aS5yZXNvdXJjZVdvcmtpbmdTZXRQYWdlJnF1b3Q7IGZhY3RvcnlJRD0mcXVvdDtvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JraW5nU2V0RmFjdG9yeSZxdW90OyBpZD0mcXVvdDsxMjU0NTM5ODA4MzI4XzExMiZxdW90OyBsYWJlbD0mcXVvdDt3b3JraW5nIHNldCZxdW90OyBuYW1lPSZxdW90O3dvcmtpbmcgc2V0JnF1b3Q7Jmd0OyYjMTM7JiMxMDsmbHQ7aXRlbSBmYWN0b3J5SUQ9JnF1b3Q7b3JnLmVjbGlwc2UudWkuaW50ZXJuYWwubW9kZWwuUmVzb3VyY2VGYWN0b3J5JnF1b3Q7IHBhdGg9JnF1b3Q7L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvbGliJnF1b3Q7IHR5cGU9JnF1b3Q7MiZxdW90Oy8mZ3Q7JiMxMzsmIzEwOyZsdDsvbGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdTZXQmZ3Q7fSIvPgorPGxpc3RBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLk1BUFBFRF9SRVNPVVJDRV9QQVRIUyI+Cis8bGlzdEVudHJ5IHZhbHVlPSIvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9idWlsZGZpbGVzL2J1aWxkQ29tbW9uRGVidWcueG1sIi8+Cis8L2xpc3RBdHRyaWJ1dGU+Cis8bGlzdEF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuTUFQUEVEX1JFU09VUkNFX1RZUEVTIj4KKzxsaXN0RW50cnkgdmFsdWU9IjEiLz4KKzwvbGlzdEF0dHJpYnV0ZT4KKzxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcudWkuQVRUUl9MQVVOQ0hfSU5fQkFDS0dST1VORCIgdmFsdWU9ImZhbHNlIi8+Cis8c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5DTEFTU1BBVEhfUFJPVklERVIiIHZhbHVlPSJvcmcuZWNsaXBzZS5hbnQudWkuQW50Q2xhc3NwYXRoUHJvdmlkZXIiLz4KKzxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLlBST0pFQ1RfQVRUUiIgdmFsdWU9Im9yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmciLz4KKzxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLlNPVVJDRV9QQVRIX1BST1ZJREVSIiB2YWx1ZT0ib3JnLmVjbGlwc2UuYW50LnVpLkFudENsYXNzcGF0aFByb3ZpZGVyIi8+Cis8c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5BVFRSX0JVSUxEX1NDT1BFIiB2YWx1ZT0iJHt3b3JraW5nX3NldDombHQ7P3htbCB2ZXJzaW9uPSZxdW90OzEuMCZxdW90OyBlbmNvZGluZz0mcXVvdDtVVEYtOCZxdW90Oz8mZ3Q7JiMxMzsmIzEwOyZsdDtsYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ1NldCBlZGl0UGFnZUlkPSZxdW90O29yZy5lY2xpcHNlLnVpLnJlc291cmNlV29ya2luZ1NldFBhZ2UmcXVvdDsgZmFjdG9yeUlEPSZxdW90O29yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtpbmdTZXRGYWN0b3J5JnF1b3Q7IGlkPSZxdW90OzEyNTQ1Mzk4MzQ5NTNfMTEzJnF1b3Q7IGxhYmVsPSZxdW90O3dvcmtpbmdTZXQmcXVvdDsgbmFtZT0mcXVvdDt3b3JraW5nU2V0JnF1b3Q7Jmd0OyYjMTM7JiMxMDsmbHQ7aXRlbSBmYWN0b3J5SUQ9JnF1b3Q7b3JnLmVjbGlwc2UudWkuaW50ZXJuYWwubW9kZWwuUmVzb3VyY2VGYWN0b3J5JnF1b3Q7IHBhdGg9JnF1b3Q7L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvY29tbW9uJnF1b3Q7IHR5cGU9JnF1b3Q7MiZxdW90Oy8mZ3Q7JiMxMzsmIzEwOyZsdDsvbGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdTZXQmZ3Q7fSIvPgorPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuQVRUUl9MT0NBVElPTiIgdmFsdWU9IiR7d29ya3NwYWNlX2xvYzovb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9idWlsZGZpbGVzL2J1aWxkQ29tbW9uRGVidWcueG1sfSIvPgorPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuQVRUUl9SVU5fQlVJTERfS0lORFMiIHZhbHVlPSJmdWxsLGluY3JlbWVudGFsLGF1dG8sIi8+Cis8Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuQVRUUl9UUklHR0VSU19DT05GSUdVUkVEIiB2YWx1ZT0idHJ1ZSIvPgorPHN0cmluZ0F0dHJpYnV0ZSBrZXk9InByb2Nlc3NfZmFjdG9yeV9pZCIgdmFsdWU9Im9yZy5lY2xpcHNlLmFudC51aS5yZW1vdGVBbnRQcm9jZXNzRmFjdG9yeSIvPgorPC9sYXVuY2hDb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0ICJhL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nLy5leHRlcm5hbFRvb2xCdWlsZGVycy9idWlsZCBsb2dnZXJzIFwxMzNCdWlsZGVyXDEzNS5sYXVuY2giICJiL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nLy5leHRlcm5hbFRvb2xCdWlsZGVycy9idWlsZCBsb2dnZXJzIFwxMzNCdWlsZGVyXDEzNS5sYXVuY2giCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjNzE4ZDgKLS0tIC9kZXYvbnVsbAorKysgImIvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvLmV4dGVybmFsVG9vbEJ1aWxkZXJzL2J1aWxkIGxvZ2dlcnMgXDEzM0J1aWxkZXJcMTM1LmxhdW5jaCIKQEAgLTAsMCArMSwyMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxsYXVuY2hDb25maWd1cmF0aW9uIHR5cGU9Im9yZy5lY2xpcHNlLmFudC5BbnRCdWlsZGVyTGF1bmNoQ29uZmlndXJhdGlvblR5cGUiPgorPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5hbnQudWkuQVRUUl9UQVJHRVRTX1VQREFURUQiIHZhbHVlPSJ0cnVlIi8+Cis8Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmFudC51aS5ERUZBVUxUX1ZNX0lOU1RBTEwiIHZhbHVlPSJmYWxzZSIvPgorPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5hbnQudWlTRVRfSU5QVVRIQU5ETEVSIiB2YWx1ZT0iZmFsc2UiLz4KKzxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkFUVFJfUkVGUkVTSF9TQ09QRSIgdmFsdWU9IiR7d29ya2luZ19zZXQ6Jmx0Oz94bWwgdmVyc2lvbj0mcXVvdDsxLjAmcXVvdDsgZW5jb2Rpbmc9JnF1b3Q7VVRGLTgmcXVvdDs/Jmd0OyYjMTM7JiMxMDsmbHQ7bGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdTZXQgZWRpdFBhZ2VJZD0mcXVvdDtvcmcuZWNsaXBzZS51aS5yZXNvdXJjZVdvcmtpbmdTZXRQYWdlJnF1b3Q7IGZhY3RvcnlJRD0mcXVvdDtvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JraW5nU2V0RmFjdG9yeSZxdW90OyBpZD0mcXVvdDsxMjU0NTM5NjA0OTY4XzI5JnF1b3Q7IGxhYmVsPSZxdW90O3dvcmtpbmcgc2V0JnF1b3Q7IG5hbWU9JnF1b3Q7d29ya2luZyBzZXQmcXVvdDsmZ3Q7JiMxMzsmIzEwOyZsdDtpdGVtIGZhY3RvcnlJRD0mcXVvdDtvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5tb2RlbC5SZXNvdXJjZUZhY3RvcnkmcXVvdDsgcGF0aD0mcXVvdDsvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9saWImcXVvdDsgdHlwZT0mcXVvdDsyJnF1b3Q7LyZndDsmIzEzOyYjMTA7Jmx0Oy9sYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ1NldCZndDt9Ii8+Cis8bGlzdEF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuTUFQUEVEX1JFU09VUkNFX1BBVEhTIj4KKzxsaXN0RW50cnkgdmFsdWU9Ii9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL2J1aWxkZmlsZXMvYnVpbGRMb2dnZXJzLnhtbCIvPgorPC9saXN0QXR0cmlidXRlPgorPGxpc3RBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLk1BUFBFRF9SRVNPVVJDRV9UWVBFUyI+Cis8bGlzdEVudHJ5IHZhbHVlPSIxIi8+Cis8L2xpc3RBdHRyaWJ1dGU+Cis8Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLkFUVFJfTEFVTkNIX0lOX0JBQ0tHUk9VTkQiIHZhbHVlPSJmYWxzZSIvPgorPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuQ0xBU1NQQVRIX1BST1ZJREVSIiB2YWx1ZT0ib3JnLmVjbGlwc2UuYW50LnVpLkFudENsYXNzcGF0aFByb3ZpZGVyIi8+Cis8c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5QUk9KRUNUX0FUVFIiIHZhbHVlPSJvcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nIi8+Cis8c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5TT1VSQ0VfUEFUSF9QUk9WSURFUiIgdmFsdWU9Im9yZy5lY2xpcHNlLmFudC51aS5BbnRDbGFzc3BhdGhQcm92aWRlciIvPgorPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuQVRUUl9CVUlMRF9TQ09QRSIgdmFsdWU9IiR7d29ya2luZ19zZXQ6Jmx0Oz94bWwgdmVyc2lvbj0mcXVvdDsxLjAmcXVvdDsgZW5jb2Rpbmc9JnF1b3Q7VVRGLTgmcXVvdDs/Jmd0OyYjMTM7JiMxMDsmbHQ7bGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdTZXQgZWRpdFBhZ2VJZD0mcXVvdDtvcmcuZWNsaXBzZS51aS5yZXNvdXJjZVdvcmtpbmdTZXRQYWdlJnF1b3Q7IGZhY3RvcnlJRD0mcXVvdDtvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JraW5nU2V0RmFjdG9yeSZxdW90OyBpZD0mcXVvdDsxMjU0NTM5NjcxODc1XzU2JnF1b3Q7IGxhYmVsPSZxdW90O3dvcmtpbmdTZXQmcXVvdDsgbmFtZT0mcXVvdDt3b3JraW5nU2V0JnF1b3Q7Jmd0OyYjMTM7JiMxMDsmbHQ7aXRlbSBmYWN0b3J5SUQ9JnF1b3Q7b3JnLmVjbGlwc2UudWkuaW50ZXJuYWwubW9kZWwuUmVzb3VyY2VGYWN0b3J5JnF1b3Q7IHBhdGg9JnF1b3Q7L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvbG9nZ2VycyZxdW90OyB0eXBlPSZxdW90OzImcXVvdDsvJmd0OyYjMTM7JiMxMDsmbHQ7L2xhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nU2V0Jmd0O30iLz4KKzxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLkFUVFJfTE9DQVRJT04iIHZhbHVlPSIke3dvcmtzcGFjZV9sb2M6L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvYnVpbGRmaWxlcy9idWlsZExvZ2dlcnMueG1sfSIvPgorPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuQVRUUl9SVU5fQlVJTERfS0lORFMiIHZhbHVlPSJmdWxsLGluY3JlbWVudGFsLGF1dG8sIi8+Cis8Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuQVRUUl9UUklHR0VSU19DT05GSUdVUkVEIiB2YWx1ZT0idHJ1ZSIvPgorPHN0cmluZ0F0dHJpYnV0ZSBrZXk9InByb2Nlc3NfZmFjdG9yeV9pZCIgdmFsdWU9Im9yZy5lY2xpcHNlLmFudC51aS5yZW1vdGVBbnRQcm9jZXNzRmFjdG9yeSIvPgorPC9sYXVuY2hDb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0ICJhL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nLy5leHRlcm5hbFRvb2xCdWlsZGVycy9idWlsZCByZW1vdGUgc3VwcG9ydCBcMTMzQnVpbGRlclwxMzUubGF1bmNoIiAiYi9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy8uZXh0ZXJuYWxUb29sQnVpbGRlcnMvYnVpbGQgcmVtb3RlIHN1cHBvcnQgXDEzM0J1aWxkZXJcMTM1LmxhdW5jaCIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU2ZWI5NgotLS0gL2Rldi9udWxsCisrKyAiYi9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy8uZXh0ZXJuYWxUb29sQnVpbGRlcnMvYnVpbGQgcmVtb3RlIHN1cHBvcnQgXDEzM0J1aWxkZXJcMTM1LmxhdW5jaCIKQEAgLTAsMCArMSwyMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxsYXVuY2hDb25maWd1cmF0aW9uIHR5cGU9Im9yZy5lY2xpcHNlLmFudC5BbnRCdWlsZGVyTGF1bmNoQ29uZmlndXJhdGlvblR5cGUiPgorPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5hbnQudWkuQVRUUl9UQVJHRVRTX1VQREFURUQiIHZhbHVlPSJ0cnVlIi8+Cis8Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmFudC51aS5ERUZBVUxUX1ZNX0lOU1RBTEwiIHZhbHVlPSJmYWxzZSIvPgorPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuQVRUUl9SRUZSRVNIX1NDT1BFIiB2YWx1ZT0iJHt3b3JraW5nX3NldDombHQ7P3htbCB2ZXJzaW9uPSZxdW90OzEuMCZxdW90OyBlbmNvZGluZz0mcXVvdDtVVEYtOCZxdW90Oz8mZ3Q7JiMxMzsmIzEwOyZsdDtsYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ1NldCBmYWN0b3J5SUQ9JnF1b3Q7b3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuV29ya2luZ1NldEZhY3RvcnkmcXVvdDsgaWQ9JnF1b3Q7MTI1NDYxNzE5MTQ2OF80NCZxdW90OyBsYWJlbD0mcXVvdDt3b3JraW5nIHNldCZxdW90OyBuYW1lPSZxdW90O3dvcmtpbmcgc2V0JnF1b3Q7Jmd0OyYjMTM7JiMxMDsmbHQ7aXRlbSBmYWN0b3J5SUQ9JnF1b3Q7b3JnLmVjbGlwc2UudWkuaW50ZXJuYWwubW9kZWwuUmVzb3VyY2VGYWN0b3J5JnF1b3Q7IHBhdGg9JnF1b3Q7L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvbGliJnF1b3Q7IHR5cGU9JnF1b3Q7MiZxdW90Oy8mZ3Q7JiMxMzsmIzEwOyZsdDsvbGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdTZXQmZ3Q7fSIvPgorPGxpc3RBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLk1BUFBFRF9SRVNPVVJDRV9QQVRIUyI+Cis8bGlzdEVudHJ5IHZhbHVlPSIvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9idWlsZGZpbGVzL2J1aWxkUmVtb3RlLnhtbCIvPgorPC9saXN0QXR0cmlidXRlPgorPGxpc3RBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLk1BUFBFRF9SRVNPVVJDRV9UWVBFUyI+Cis8bGlzdEVudHJ5IHZhbHVlPSIxIi8+Cis8L2xpc3RBdHRyaWJ1dGU+Cis8Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLkFUVFJfTEFVTkNIX0lOX0JBQ0tHUk9VTkQiIHZhbHVlPSJmYWxzZSIvPgorPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuQ0xBU1NQQVRIX1BST1ZJREVSIiB2YWx1ZT0ib3JnLmVjbGlwc2UuYW50LnVpLkFudENsYXNzcGF0aFByb3ZpZGVyIi8+Cis8c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5QUk9KRUNUX0FUVFIiIHZhbHVlPSJvcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nIi8+Cis8c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5TT1VSQ0VfUEFUSF9QUk9WSURFUiIgdmFsdWU9Im9yZy5lY2xpcHNlLmFudC51aS5BbnRDbGFzc3BhdGhQcm92aWRlciIvPgorPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuQVRUUl9CVUlMRF9TQ09QRSIgdmFsdWU9IiR7d29ya2luZ19zZXQ6Jmx0Oz94bWwgdmVyc2lvbj0mcXVvdDsxLjAmcXVvdDsgZW5jb2Rpbmc9JnF1b3Q7VVRGLTgmcXVvdDs/Jmd0OyYjMTM7JiMxMDsmbHQ7bGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdTZXQgZmFjdG9yeUlEPSZxdW90O29yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtpbmdTZXRGYWN0b3J5JnF1b3Q7IGlkPSZxdW90OzEyNTQ2MTcyMDY0NTNfNDUmcXVvdDsgbGFiZWw9JnF1b3Q7d29ya2luZ1NldCZxdW90OyBuYW1lPSZxdW90O3dvcmtpbmdTZXQmcXVvdDsmZ3Q7JiMxMzsmIzEwOyZsdDtpdGVtIGZhY3RvcnlJRD0mcXVvdDtvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5tb2RlbC5SZXNvdXJjZUZhY3RvcnkmcXVvdDsgcGF0aD0mcXVvdDsvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9yZW1vdGUmcXVvdDsgdHlwZT0mcXVvdDsyJnF1b3Q7LyZndDsmIzEzOyYjMTA7Jmx0Oy9sYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ1NldCZndDt9Ii8+Cis8c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5BVFRSX0xPQ0FUSU9OIiB2YWx1ZT0iJHt3b3Jrc3BhY2VfbG9jOi9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL2J1aWxkZmlsZXMvYnVpbGRSZW1vdGUueG1sfSIvPgorPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuQVRUUl9SVU5fQlVJTERfS0lORFMiIHZhbHVlPSJmdWxsLGluY3JlbWVudGFsLGF1dG8sIi8+Cis8Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuQVRUUl9UUklHR0VSU19DT05GSUdVUkVEIiB2YWx1ZT0idHJ1ZSIvPgorPHN0cmluZ0F0dHJpYnV0ZSBrZXk9InByb2Nlc3NfZmFjdG9yeV9pZCIgdmFsdWU9Im9yZy5lY2xpcHNlLmFudC51aS5yZW1vdGVBbnRQcm9jZXNzRmFjdG9yeSIvPgorPC9sYXVuY2hDb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvLnByb2plY3QgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy8ucHJvamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjcwNGVmCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvLnByb2plY3QKQEAgLTAsMCArMSw2NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxwcm9qZWN0RGVzY3JpcHRpb24+CisJPG5hbWU+b3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZzwvbmFtZT4KKwk8Y29tbWVudD48L2NvbW1lbnQ+CisJPHByb2plY3RzPgorCTwvcHJvamVjdHM+CisJPGJ1aWxkU3BlYz4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLmFwaS50b29scy5hcGlBbmFseXNpc0J1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5FeHRlcm5hbFRvb2xCdWlsZGVyPC9uYW1lPgorCQkJPHRyaWdnZXJzPmF1dG8sZnVsbCxpbmNyZW1lbnRhbCw8L3RyaWdnZXJzPgorCQkJPGFyZ3VtZW50cz4KKwkJCQk8ZGljdGlvbmFyeT4KKwkJCQkJPGtleT5MYXVuY2hDb25maWdIYW5kbGU8L2tleT4KKwkJCQkJPHZhbHVlPiZsdDtwcm9qZWN0Jmd0Oy8uZXh0ZXJuYWxUb29sQnVpbGRlcnMvYnVpbGQgbG9nZ2VycyBbQnVpbGRlcl0ubGF1bmNoPC92YWx1ZT4KKwkJCQk8L2RpY3Rpb25hcnk+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLkV4dGVybmFsVG9vbEJ1aWxkZXI8L25hbWU+CisJCQk8dHJpZ2dlcnM+YXV0byxmdWxsLGluY3JlbWVudGFsLDwvdHJpZ2dlcnM+CisJCQk8YXJndW1lbnRzPgorCQkJCTxkaWN0aW9uYXJ5PgorCQkJCQk8a2V5PkxhdW5jaENvbmZpZ0hhbmRsZTwva2V5PgorCQkJCQk8dmFsdWU+Jmx0O3Byb2plY3QmZ3Q7Ly5leHRlcm5hbFRvb2xCdWlsZGVycy9idWlsZCBjb21tb24gZGVidWcgW0J1aWxkZXJdLmxhdW5jaDwvdmFsdWU+CisJCQkJPC9kaWN0aW9uYXJ5PgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5FeHRlcm5hbFRvb2xCdWlsZGVyPC9uYW1lPgorCQkJPHRyaWdnZXJzPmF1dG8sZnVsbCxpbmNyZW1lbnRhbCw8L3RyaWdnZXJzPgorCQkJPGFyZ3VtZW50cz4KKwkJCQk8ZGljdGlvbmFyeT4KKwkJCQkJPGtleT5MYXVuY2hDb25maWdIYW5kbGU8L2tleT4KKwkJCQkJPHZhbHVlPiZsdDtwcm9qZWN0Jmd0Oy8uZXh0ZXJuYWxUb29sQnVpbGRlcnMvYnVpbGQgcmVtb3RlIHN1cHBvcnQgW0J1aWxkZXJdLmxhdW5jaDwvdmFsdWU+CisJCQkJPC9kaWN0aW9uYXJ5PgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCTwvYnVpbGRTcGVjPgorCTxuYXR1cmVzPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLmFwaS50b29scy5hcGlBbmFseXNpc05hdHVyZTwvbmF0dXJlPgorCTwvbmF0dXJlcz4KKzwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvYWJvdXQuaHRtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL2Fib3V0Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk5MzkyNQotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL2Fib3V0Lmh0bWwKQEAgLTAsMCArMSw1MyBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKKyAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KKzx0aXRsZT5BYm91dDwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keSBsYW5nPSJFTi1VUyI+Cis8aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KKyAKKzxwPk9jdG9iZXIgOCwgMjAwOTwvcD4JCis8aDM+TGljZW5zZTwvaDM+CisKKzxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAoraW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQorRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKK2F0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCitGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgorCis8cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAorYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQorYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAorcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCitpbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAorYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KKworPGgzPlRoaXJkIFBhcnR5IENvbnRlbnQ8L2gzPgorCis8cD5UaGUgQ29udGVudCBpbmNsdWRlcyBpdGVtcyB0aGF0IGhhdmUgYmVlbiBzb3VyY2VkIGZyb20gdGhpcmQgcGFydGllcyBhcyBzZXQgb3V0IGJlbG93LiBJZiB5b3UgCitkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIGZvbGxvd2luZyBpcyBwcm92aWRlZCAKK2ZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHksIGFuZCB5b3Ugc2hvdWxkIGxvb2sgdG8gdGhlIFJlZGlzdHJpYnV0b3ImcnNxdW87cyBsaWNlbnNlIGZvciAKK3Rlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVzZS48L3A+CisKKzxoND5BbnQgMS43LjE8L2g0PgorCis8cD5UaGUgZm9sbG93aW5nIGNsYXNzZXMgaW4gdGhlIHBsdWctaW4gSkFSIGFyZSBiYXNlZCBvbiBBbnQgY29kZSBkZXZlbG9wZWQgYnkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCBzaGFsbCBiZSBkZWZpbmVkIGFzIHRoZSAmcXVvdDtBbnQtRGVyaXZlZCBXb3JrJnF1b3Q7OjwvcD4KKworPHVsPgorCTxsaT5vcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwubGF1bmNoaW5nLnJlbW90ZS5JbnRlcm5hbEFudFJ1bm5lcjwvbGk+Cis8L3VsPgorCis8cD5UaGUgb2JqZWN0IGNvZGUgZm9yIEludGVybmFsQW50UnVubmVyIGlzIGxvY2F0ZWQgaW4gbGliL3JlbW90ZS5qYXIgYW5kIHRoZSBzb3VyY2UgY29kZSBpcyBsb2NhdGVkIGluIGxpYi9yZW1vdGVzcmMuemlwLjwvcD4KKworPHA+WW91ciB1c2Ugb2YgdGhlIEFudC1EZXJpdmVkIFdvcmsgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMC4gIEEgY29weSBvZiB0aGUgbGljZW5zZSBpcyBjb250YWluZWQKK2luIHRoZSBmaWxlIDxhIGhyZWY9ImFib3V0X2ZpbGVzL2FzbC12MjAudHh0IiB0YXJnZXQ9Il9ibGFuayI+YWJvdXRfZmlsZXMvYXNsLXYyMC50eHQ8L2E+IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCAKKzxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC5odG1sIiB0YXJnZXQ9Il9ibGFuayI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLmh0bWw8L2E+LjwvcD4KKworPHA+VGhlIG5hbWVzICZxdW90O0FudCZxdW90OyBhbmQgICZxdW90O0FwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uJnF1b3Q7IG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIAorc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uICBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCA8YSBocmVmPSJtYWlsdG86YXBhY2hlQGFwYWNoZS5vcmciPmFwYWNoZUBhcGFjaGUub3JnPC9hPi48L3A+CisKKzxwPlRoZSBBcGFjaGUgYXR0cmlidXRpb24gPGEgaHJlZj0iYWJvdXRfZmlsZXMvTk9USUNFIiB0YXJnZXQ9Il9ibGFuayI+Tk9USUNFPC9hPiBmaWxlIGlzIGluY2x1ZGVkIHdpdGggdGhlIENvbnRlbnQgaW4gYWNjb3JkYW5jZSB3aXRoIDRkIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuPC9wPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL2J1aWxkLnByb3BlcnRpZXMgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9idWlsZC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3YTlkMDUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9idWlsZC5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMzIgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisjIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorIyAKKyMgQ29udHJpYnV0b3JzOgorIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitzb3VyY2UuLiA9IHNyYy8gICAgICAgICAgICAgICAgICAgICAgICAgICAKK291dHB1dC4uID0gYmluLworYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKKyAgICAgICAgICAgICAgIC4sXAorICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCisgICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCisgICAgICAgICAgICAgICBsaWIvYW50ZGVidWcuamFyLFwKKyAgICAgICAgICAgICAgIGxpYi9sb2dnZXJzLmphcixcCisgICAgICAgICAgICAgICBsaWIvcmVtb3RlLmphcixcCisgICAgICAgICAgICAgICBhYm91dC5odG1sCisKK2phcnMuY29tcGlsZS5vcmRlciA9IC4sXAorCQkJCSAgICAgICAgICAgICAgICAgICAgIGxpYi9hbnRkZWJ1Zy5qYXIsXAorICAgICAgICAgICAgICAgICAgICAgbGliL2xvZ2dlcnMuamFyLFwKKyAgICAgICAgICAgICAgICAgICAgIGxpYi9yZW1vdGUuamFyCitzb3VyY2UubGliL2xvZ2dlcnMuamFyID0gbG9nZ2Vycy8KK291dHB1dC5saWIvbG9nZ2Vycy5qYXIgPSBsb2dnZXJzX2Jpbi8KK3NvdXJjZS5saWIvYW50ZGVidWcuamFyID0gY29tbW9uLworb3V0cHV0LmxpYi9hbnRkZWJ1Zy5qYXIgPSBjb21tb25fYmluLworc291cmNlLmxpYi9yZW1vdGUuamFyID0gcmVtb3RlLworb3V0cHV0LmxpYi9yZW1vdGUuamFyID0gcmVtb3RlX2Jpbi8KK3NyYy5pbmNsdWRlcyA9IGFib3V0Lmh0bWwKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL2J1aWxkZmlsZXMvYnVpbGRDb21tb25EZWJ1Zy54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9idWlsZGZpbGVzL2J1aWxkQ29tbW9uRGVidWcueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4Yjk5ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9idWlsZGZpbGVzL2J1aWxkQ29tbW9uRGVidWcueG1sCkBAIC0wLDAgKzEsMzkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAgICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAgICAKKyAgICAgQ29udHJpYnV0b3JzOgorICAgICAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgLS0+CisKKzxwcm9qZWN0IG5hbWU9IkJ1aWxkIEFudCBjb21tb24gZGVidWcgc3VwcG9ydCBKQVIiIGRlZmF1bHQ9ImJ1aWxkIiBiYXNlZGlyPSIuLiI+CisJCisJPHRhcmdldCBuYW1lPSJidWlsZCIgZGVzY3JpcHRpb249IkNsZWFucywgYnVpbGRzIGFuZCByZWZyZXNoZXMiIGRlcGVuZHM9ImNsZWFuLCBsaWIvYW50ZGVidWdsaWIuamFyIi8+CisKKwk8dGFyZ2V0IG5hbWU9ImluaXQiPgorCQk8cHJvcGVydHkgbmFtZT0idGVtcC5mb2xkZXIiIHZhbHVlPSIke2Jhc2VkaXJ9L3RlbXAuZm9sZGVyIi8+CisJCTxwcm9wZXJ0eSBuYW1lPSJidWlsZC5yZXN1bHQuZm9sZGVyIiB2YWx1ZT0iJHtiYXNlZGlyfSIvPgorCTwvdGFyZ2V0PgorCQorCTx0YXJnZXQgbmFtZT0ibGliL2FudGRlYnVnbGliLmphciIgZGVzY3JpcHRpb249ICJDcmVhdGVzIHRoZSBhbnRkZWJ1Zy5qYXIiIGRlcGVuZHM9ImluaXQiPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzdGRpciIgdmFsdWU9IiR7dGVtcC5mb2xkZXJ9L2xpYi9hbnRkZWJ1Zy5qYXIuYmluIi8+CisJCTxkZWxldGUgZGlyPSIke2Rlc3RkaXJ9Ii8+CisJCTxta2RpciBkaXI9IiR7ZGVzdGRpcn0iLz4KKwkJPCEtLSBjb3B5IG5lY2Vzc2FyeSBjbGFzcyBmaWxlcyByZXNvdXJjZXMgLS0+CisJCTxjb3B5IHRvZGlyPSIke2Rlc3RkaXJ9Ij4KKwkJCTxmaWxlc2V0IGRpcj0iJHtiYXNlZGlyfS9jb21tb25fYmluIi8+CisJCTwvY29weT4KKwkJPG1rZGlyIGRpcj0iJHtidWlsZC5yZXN1bHQuZm9sZGVyfS9saWIiLz4KKwkJPGphciBkZXN0ZmlsZT0iJHtidWlsZC5yZXN1bHQuZm9sZGVyfS9saWIvYW50ZGVidWcuamFyIiBiYXNlZGlyPSIke2Rlc3RkaXJ9Ii8+CisJCTxkZWxldGUgZGlyPSIke3RlbXAuZm9sZGVyfSIvPgorCTwvdGFyZ2V0PgorCisJPHRhcmdldCBuYW1lPSJjbGVhbiIgZGVzY3JpcHRpb249IkRlbGV0ZXMgcHJldmlvdXMgYnVpbGQgcmVtbmFudHMiIGRlcGVuZHM9ImluaXQiPgorCQk8ZGVsZXRlIGZpbGU9IiR7YnVpbGQucmVzdWx0LmZvbGRlcn0vbGliL2FudGRlYnVnLmphciIvPgorCQk8ZGVsZXRlIGRpcj0iJHt0ZW1wLmZvbGRlcn0iLz4KKwk8L3RhcmdldD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL2J1aWxkZmlsZXMvYnVpbGRMb2dnZXJzLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL2J1aWxkZmlsZXMvYnVpbGRMb2dnZXJzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGJiMDRjCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvYnVpbGRmaWxlcy9idWlsZExvZ2dlcnMueG1sCkBAIC0wLDAgKzEsMzkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAgICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAgICAKKyAgICAgQ29udHJpYnV0b3JzOgorICAgICAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgLS0+CisKKzxwcm9qZWN0IG5hbWU9IkJ1aWxkIEFudCBsb2dnZXJzIHN1cHBvcnQgSkFSIiBkZWZhdWx0PSJidWlsZCIgYmFzZWRpcj0iLi4iPgorCQorCTx0YXJnZXQgbmFtZT0iYnVpbGQiIGRlc2NyaXB0aW9uPSJDbGVhbnMsIGJ1aWxkcyBhbmQgcmVmcmVzaGVzIiBkZXBlbmRzPSJjbGVhbiwgbGliL2xvZ2dlcnNsaWIuamFyIi8+CisKKwk8dGFyZ2V0IG5hbWU9ImluaXQiPgorCQk8cHJvcGVydHkgbmFtZT0idGVtcC5mb2xkZXIiIHZhbHVlPSIke2Jhc2VkaXJ9L3RlbXAuZm9sZGVyIi8+CisJCTxwcm9wZXJ0eSBuYW1lPSJidWlsZC5yZXN1bHQuZm9sZGVyIiB2YWx1ZT0iJHtiYXNlZGlyfSIvPgorCTwvdGFyZ2V0PgorCisJPHRhcmdldCBuYW1lPSJsaWIvbG9nZ2Vyc2xpYi5qYXIiIGRlc2NyaXB0aW9uPSAiQ3JlYXRlcyB0aGUgbG9nZ2Vycy5qYXIiIGRlcGVuZHM9ImluaXQiPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzdGRpciIgdmFsdWU9IiR7dGVtcC5mb2xkZXJ9L2xpYi9sb2dnZXJzLmphci5iaW4iLz4KKwkJPGRlbGV0ZSBkaXI9IiR7ZGVzdGRpcn0iLz4KKwkJPG1rZGlyIGRpcj0iJHtkZXN0ZGlyfSIvPgorCQk8IS0tIGNvcHkgbmVjZXNzYXJ5IGNsYXNzIGZpbGVzIHJlc291cmNlcyAtLT4KKwkJPGNvcHkgdG9kaXI9IiR7ZGVzdGRpcn0iPgorCQkJPGZpbGVzZXQgZGlyPSIke2Jhc2VkaXJ9L2xvZ2dlcnNfYmluLyIvPgorCQk8L2NvcHk+CisJCTxta2RpciBkaXI9IiR7YnVpbGQucmVzdWx0LmZvbGRlcn0vbGliIi8+CisJCTxqYXIgZGVzdGZpbGU9IiR7YnVpbGQucmVzdWx0LmZvbGRlcn0vbGliL2xvZ2dlcnMuamFyIiBiYXNlZGlyPSIke2Rlc3RkaXJ9Ii8+CisJCTxkZWxldGUgZGlyPSIke3RlbXAuZm9sZGVyfSIvPgorCTwvdGFyZ2V0PgorCisJPHRhcmdldCBuYW1lPSJjbGVhbiIgZGVzY3JpcHRpb249IkRlbGV0ZXMgcHJldmlvdXMgYnVpbGQgcmVtbmFudHMiIGRlcGVuZHM9ImluaXQiPgorCQk8ZGVsZXRlIGZpbGU9IiR7YnVpbGQucmVzdWx0LmZvbGRlcn0vbGliL2xvZ2dlcnMuamFyIi8+CisJCTxkZWxldGUgZGlyPSIke3RlbXAuZm9sZGVyfSIvPgorCTwvdGFyZ2V0PgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvYnVpbGRmaWxlcy9idWlsZFJlbW90ZS54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9idWlsZGZpbGVzL2J1aWxkUmVtb3RlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTIyZTU4Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvYnVpbGRmaWxlcy9idWlsZFJlbW90ZS54bWwKQEAgLTAsMCArMSwzOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyAgICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICAgIAorICAgICBDb250cmlidXRvcnM6CisgICAgICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAtLT4KKworPHByb2plY3QgbmFtZT0iQnVpbGQgQW50IHJlbW90ZSBzdXBwb3J0IEpBUiIgZGVmYXVsdD0iYnVpbGQiIGJhc2VkaXI9Ii4uIj4KKwkKKwk8dGFyZ2V0IG5hbWU9ImJ1aWxkIiBkZXNjcmlwdGlvbj0iQ2xlYW5zLCBidWlsZHMgYW5kIHJlZnJlc2hlcyIgZGVwZW5kcz0iY2xlYW4sIGxpYi9yZW1vdGVsaWIuamFyIi8+CisKKwk8dGFyZ2V0IG5hbWU9ImluaXQiPgorCQk8cHJvcGVydHkgbmFtZT0idGVtcC5mb2xkZXIiIHZhbHVlPSIke2Jhc2VkaXJ9L3RlbXAuZm9sZGVyIi8+CisJCTxwcm9wZXJ0eSBuYW1lPSJidWlsZC5yZXN1bHQuZm9sZGVyIiB2YWx1ZT0iJHtiYXNlZGlyfSIvPgorCTwvdGFyZ2V0PgorCQorCTx0YXJnZXQgbmFtZT0ibGliL3JlbW90ZWxpYi5qYXIiIGRlc2NyaXB0aW9uPSAiQ3JlYXRlcyB0aGUgcmVtb3RlLmphciIgZGVwZW5kcz0iaW5pdCI+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXN0ZGlyIiB2YWx1ZT0iJHt0ZW1wLmZvbGRlcn0vbGliL3JlbW90ZS5qYXIuYmluIi8+CisJCTxkZWxldGUgZGlyPSIke2Rlc3RkaXJ9Ii8+CisJCTxta2RpciBkaXI9IiR7ZGVzdGRpcn0iLz4KKwkJPCEtLSBjb3B5IG5lY2Vzc2FyeSBjbGFzcyBmaWxlcyByZXNvdXJjZXMgLS0+CisJCTxjb3B5IHRvZGlyPSIke2Rlc3RkaXJ9Ij4KKwkJCTxmaWxlc2V0IGRpcj0iJHtiYXNlZGlyfS9yZW1vdGVfYmluIi8+CisJCTwvY29weT4KKwkJPG1rZGlyIGRpcj0iJHtidWlsZC5yZXN1bHQuZm9sZGVyfS9saWIiLz4KKwkJPGphciBkZXN0ZmlsZT0iJHtidWlsZC5yZXN1bHQuZm9sZGVyfS9saWIvcmVtb3RlLmphciIgYmFzZWRpcj0iJHtkZXN0ZGlyfSIvPgorCQk8ZGVsZXRlIGRpcj0iJHt0ZW1wLmZvbGRlcn0iLz4KKwk8L3RhcmdldD4KKworCTx0YXJnZXQgbmFtZT0iY2xlYW4iIGRlc2NyaXB0aW9uPSJEZWxldGVzIHByZXZpb3VzIGJ1aWxkIHJlbW5hbnRzIiBkZXBlbmRzPSJpbml0Ij4KKwkJPGRlbGV0ZSBmaWxlPSIke2J1aWxkLnJlc3VsdC5mb2xkZXJ9L2xpYi9yZW1vdGUuamFyIi8+CisJCTxkZWxldGUgZGlyPSIke3RlbXAuZm9sZGVyfSIvPgorCTwvdGFyZ2V0PgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvY29tbW9uL01FVEEtSU5GL2VjbGlwc2UuaW5mIGIvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvY29tbW9uL01FVEEtSU5GL2VjbGlwc2UuaW5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ZGYzYWIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9jb21tb24vTUVUQS1JTkYvZWNsaXBzZS5pbmYKQEAgLTAsMCArMSBAQAoramFycHJvY2Vzc29yLmV4Y2x1ZGUuc2lnbj10cnVlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvY29tbW9uL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvZGVidWcvSURlYnVnQnVpbGRMb2dnZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL2NvbW1vbi9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL2RlYnVnL0lEZWJ1Z0J1aWxkTG9nZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWViMDZjNQotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL2NvbW1vbi9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL2RlYnVnL0lEZWJ1Z0J1aWxkTG9nZ2VyLmphdmEKQEAgLTAsMCArMSwyMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwubGF1bmNoaW5nLmRlYnVnOworCisKK3B1YmxpYyBpbnRlcmZhY2UgSURlYnVnQnVpbGRMb2dnZXIgeworCisJLyoqCisJICogUmVxdWVzdHMgdG8gc3VzcGVuZCB0aGUgYnVpbGQgaWYgdGhlIGN1cnJlbnQgZGVidWcgc3RhdGUKKwkgKiBpbmRpY2F0ZXMgdGhhdCBzdXNwZW5zaW9uIGlzIHJlcXVpcmVkLgorCSAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHdhaXRJZlN1c3BlbmRlZCgpOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL2xvZ2dlcnMvTUVUQS1JTkYvZWNsaXBzZS5pbmYgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9sb2dnZXJzL01FVEEtSU5GL2VjbGlwc2UuaW5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ZGYzYWIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9sb2dnZXJzL01FVEEtSU5GL2VjbGlwc2UuaW5mCkBAIC0wLDAgKzEgQEAKK2phcnByb2Nlc3Nvci5leGNsdWRlLnNpZ249dHJ1ZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL2xvZ2dlcnMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9ydW50aW1lL2xvZ2dlci9OdWxsQnVpbGRMb2dnZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL2xvZ2dlcnMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9ydW50aW1lL2xvZ2dlci9OdWxsQnVpbGRMb2dnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDUwMjUwCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvbG9nZ2Vycy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL3J1bnRpbWUvbG9nZ2VyL051bGxCdWlsZExvZ2dlci5qYXZhCkBAIC0wLDAgKzEsMTc5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmxhdW5jaGluZy5ydW50aW1lLmxvZ2dlcjsKKworCitpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXZlbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMb2dnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlN0cmluZ1V0aWxzOworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5jb3JlLkFudFNlY3VyaXR5RXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5jb3JlLkFic3RyYWN0RWNsaXBzZUJ1aWxkTG9nZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKKworcHVibGljIGNsYXNzIE51bGxCdWlsZExvZ2dlciBleHRlbmRzIEFic3RyYWN0RWNsaXBzZUJ1aWxkTG9nZ2VyIGltcGxlbWVudHMgQnVpbGRMb2dnZXJ7CisKKwlwcm90ZWN0ZWQgaW50IGZNZXNzYWdlT3V0cHV0TGV2ZWwgPSBQcm9qZWN0Lk1TR19JTkZPOworCXByaXZhdGUgUHJpbnRTdHJlYW0gZkVycj0gbnVsbDsKKwlwcml2YXRlIFByaW50U3RyZWFtIGZPdXQ9IG51bGw7CisJcHJvdGVjdGVkIGJvb2xlYW4gZkVtYWNzTW9kZT0gZmFsc2U7CisJCisJLyoqCisJICogQW4gZXhjZXB0aW9uIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBsb2dnZWQuCisJICovCisJcHJvdGVjdGVkIFRocm93YWJsZSBmSGFuZGxlZEV4Y2VwdGlvbj0gbnVsbDsKKwkKKwkvKioKKwkgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkTG9nZ2VyI3NldE1lc3NhZ2VPdXRwdXRMZXZlbChpbnQpCisJICovCisJcHVibGljIHZvaWQgc2V0TWVzc2FnZU91dHB1dExldmVsKGludCBsZXZlbCkgeworCQlmTWVzc2FnZU91dHB1dExldmVsPSBsZXZlbDsKKwl9CisJCisJcHJvdGVjdGVkIGludCBnZXRNZXNzYWdlT3V0cHV0TGV2ZWwoKSB7CisJCXJldHVybiBmTWVzc2FnZU91dHB1dExldmVsOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMb2dnZXIjc2V0RW1hY3NNb2RlKGJvb2xlYW4pCisJICovCisJcHVibGljIHZvaWQgc2V0RW1hY3NNb2RlKGJvb2xlYW4gZW1hY3NNb2RlKSB7CisJCWZFbWFjc01vZGU9IGVtYWNzTW9kZTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkTGlzdGVuZXIjYnVpbGRTdGFydGVkKG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXZlbnQpCisJICovCisJcHVibGljIHZvaWQgYnVpbGRTdGFydGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkTGlzdGVuZXIjYnVpbGRGaW5pc2hlZChvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV2ZW50KQorCSAqLworCXB1YmxpYyB2b2lkIGJ1aWxkRmluaXNoZWQoQnVpbGRFdmVudCBldmVudCkgeworCQlTdHJpbmcgbWVzc2FnZT0gaGFuZGxlRXhjZXB0aW9uKGV2ZW50KTsKKyAgICAgICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCkgeworICAgICAgICAgICAgbG9nTWVzc2FnZShtZXNzYWdlLCBnZXRNZXNzYWdlT3V0cHV0TGV2ZWwoKSk7CisgICAgICAgIH0KKwkJZkhhbmRsZWRFeGNlcHRpb249IG51bGw7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZExpc3RlbmVyI3RhcmdldFN0YXJ0ZWQob3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFdmVudCkKKwkgKi8KKwlwdWJsaWMgdm9pZCB0YXJnZXRTdGFydGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkTGlzdGVuZXIjdGFyZ2V0RmluaXNoZWQob3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFdmVudCkKKwkgKi8KKwlwdWJsaWMgdm9pZCB0YXJnZXRGaW5pc2hlZChCdWlsZEV2ZW50IGV2ZW50KSB7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZExpc3RlbmVyI3Rhc2tTdGFydGVkKG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXZlbnQpCisJICovCisJcHVibGljIHZvaWQgdGFza1N0YXJ0ZWQoQnVpbGRFdmVudCBldmVudCkgeworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMaXN0ZW5lciN0YXNrRmluaXNoZWQob3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFdmVudCkKKwkgKi8KKwlwdWJsaWMgdm9pZCB0YXNrRmluaXNoZWQoQnVpbGRFdmVudCBldmVudCkgeworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkTGlzdGVuZXIjbWVzc2FnZUxvZ2dlZChvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV2ZW50KQorCSAqLworCXB1YmxpYyB2b2lkIG1lc3NhZ2VMb2dnZWQoQnVpbGRFdmVudCBldmVudCkgeworCQlsb2dNZXNzYWdlKGV2ZW50LmdldE1lc3NhZ2UoKSwgZXZlbnQuZ2V0UHJpb3JpdHkoKSk7CisJfQorCisJcHJvdGVjdGVkIFByaW50U3RyZWFtIGdldEVycm9yUHJpbnRTdHJlYW0oKSB7CisJCXJldHVybiBmRXJyOworCX0KKwkKKwlwcm90ZWN0ZWQgUHJpbnRTdHJlYW0gZ2V0T3V0cHV0UHJpbnRTdHJlYW0oKSB7CisJCXJldHVybiBmT3V0OworCX0KKwkKKwkvKioKKwkgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkTG9nZ2VyI3NldEVycm9yUHJpbnRTdHJlYW0oamF2YS5pby5QcmludFN0cmVhbSkKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRFcnJvclByaW50U3RyZWFtKFByaW50U3RyZWFtIGVycikgeworCQkvL3RoaXMgYnVpbGQgbG9nZ2VyIGxvZ3MgdG8gIm51bGwiIHVubGVzcworCQkvL3RoZSB1c2VyIGhhcyBleHBsaWNpdGx5IHNldCBhIGxvZ2ZpbGUgdG8gdXNlCisJCWlmIChlcnIgPT0gU3lzdGVtLmVycikgeworCQkJZkVycj0gbnVsbDsKKwkJfSBlbHNlIHsKKwkJCWZFcnI9IGVycjsKKwkJfQorCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMb2dnZXIjc2V0T3V0cHV0UHJpbnRTdHJlYW0oamF2YS5pby5QcmludFN0cmVhbSkKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRPdXRwdXRQcmludFN0cmVhbShQcmludFN0cmVhbSBvdXRwdXQpIHsKKwkJLy90aGlzIGJ1aWxkIGxvZ2dlciBsb2dzIHRvICJudWxsIiB1bmxlc3MKKwkJLy90aGUgdXNlciBoYXMgZXhwbGljaXRseSBzZXQgYSBsb2dmaWxlIHRvIHVzZQorCQlpZiAob3V0cHV0ID09IFN5c3RlbS5vdXQpIHsKKwkJCWZPdXQ9IG51bGw7CisJCX0gZWxzZSB7CisJCQlmT3V0PSBvdXRwdXQ7CisJCX0KKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgbG9nTWVzc2FnZShTdHJpbmcgbWVzc2FnZSwgaW50IHByaW9yaXR5KSB7CisJCWlmIChwcmlvcml0eSA+IGdldE1lc3NhZ2VPdXRwdXRMZXZlbCgpKSB7CisJCQlyZXR1cm47CisJCX0KKwkJCisJCWlmIChwcmlvcml0eSA9PSBQcm9qZWN0Lk1TR19FUlIpIHsKKwkJCWlmIChnZXRFcnJvclByaW50U3RyZWFtKCkgIT0gbnVsbCAmJiBnZXRFcnJvclByaW50U3RyZWFtKCkgIT0gU3lzdGVtLmVycikgeworCQkJCS8vdXNlciBoYXMgZGVzaWduYXRlZCB0byBsb2cgdG8gYSBsb2dmaWxlCisJCQkJZ2V0RXJyb3JQcmludFN0cmVhbSgpLnByaW50bG4obWVzc2FnZSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoZ2V0T3V0cHV0UHJpbnRTdHJlYW0oKSAhPSBudWxsICYmIGdldE91dHB1dFByaW50U3RyZWFtKCkgIT0gU3lzdGVtLm91dCkgeworCQkJCS8vdXNlciBoYXMgZGVzaWduYXRlZCB0byBsb2cgdG8gYSBsb2dmaWxlCisJCQkJZ2V0T3V0cHV0UHJpbnRTdHJlYW0oKS5wcmludGxuKG1lc3NhZ2UpOworCQkJfSAKKwkJfQorCX0KKwkKKwlwcm90ZWN0ZWQgU3RyaW5nIGhhbmRsZUV4Y2VwdGlvbihCdWlsZEV2ZW50IGV2ZW50KSB7CisJCVRocm93YWJsZSBleGNlcHRpb24gPSBldmVudC5nZXRFeGNlcHRpb24oKTsKKwkJaWYgKGV4Y2VwdGlvbiA9PSBudWxsIHx8IGV4Y2VwdGlvbiA9PSBmSGFuZGxlZEV4Y2VwdGlvbgorCQl8fCBleGNlcHRpb24gaW5zdGFuY2VvZiBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbgorCQl8fCBleGNlcHRpb24gaW5zdGFuY2VvZiBBbnRTZWN1cml0eUV4Y2VwdGlvbikgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJZkhhbmRsZWRFeGNlcHRpb249IGV4Y2VwdGlvbjsKKyAgICAgICAgU3RyaW5nQnVmZmVyIG1lc3NhZ2U9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgbWVzc2FnZS5hcHBlbmQoU3RyaW5nVXRpbHMuTElORV9TRVApOworICAgICAgICBtZXNzYWdlLmFwcGVuZChSdW50aW1lTWVzc2FnZXMuTnVsbEJ1aWxkTG9nZ2VyXzEpOworICAgICAgICBtZXNzYWdlLmFwcGVuZChTdHJpbmdVdGlscy5MSU5FX1NFUCk7CisgICAgICAgIGlmIChQcm9qZWN0Lk1TR19WRVJCT1NFIDw9IGZNZXNzYWdlT3V0cHV0TGV2ZWwgfHwgIShleGNlcHRpb24gaW5zdGFuY2VvZiBCdWlsZEV4Y2VwdGlvbikpIHsKKyAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKFN0cmluZ1V0aWxzLmdldFN0YWNrVHJhY2UoZXhjZXB0aW9uKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoZXhjZXB0aW9uIGluc3RhbmNlb2YgQnVpbGRFeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICBtZXNzYWdlLmFwcGVuZChleGNlcHRpb24udG9TdHJpbmcoKSkuYXBwZW5kKFN0cmluZ1V0aWxzLkxJTkVfU0VQKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbWVzc2FnZS5hcHBlbmQoZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSkuYXBwZW5kKFN0cmluZ1V0aWxzLkxJTkVfU0VQKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKwkJcmV0dXJuIG1lc3NhZ2UudG9TdHJpbmcoKTsJCisJfQorfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvbG9nZ2Vycy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL3J1bnRpbWUvbG9nZ2VyL1J1bnRpbWVNZXNzYWdlcy5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvbG9nZ2Vycy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL3J1bnRpbWUvbG9nZ2VyL1J1bnRpbWVNZXNzYWdlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExZGI1NTgKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9sb2dnZXJzL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvcnVudGltZS9sb2dnZXIvUnVudGltZU1lc3NhZ2VzLmphdmEKQEAgLTAsMCArMSwzMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmxhdW5jaGluZy5ydW50aW1lLmxvZ2dlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CisKK3B1YmxpYyBjbGFzcyBSdW50aW1lTWVzc2FnZXMgZXh0ZW5kcyBOTFMgeworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwubGF1bmNoaW5nLnJ1bnRpbWUubG9nZ2VyLlJ1bnRpbWVNZXNzYWdlcyI7Ly8kTk9OLU5MUy0xJAorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgTnVsbEJ1aWxkTG9nZ2VyXzE7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQW50UHJvY2Vzc0J1aWxkTG9nZ2VyX1RvdGFsX3RpbWU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQW50UHJvY2Vzc0J1aWxkTG9nZ2VyX19taW51dGVzXzI7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQW50UHJvY2Vzc0J1aWxkTG9nZ2VyX19taW51dGVfMzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRQcm9jZXNzQnVpbGRMb2dnZXJfX3NlY29uZHNfNDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRQcm9jZXNzQnVpbGRMb2dnZXJfX3NlY29uZF81OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudFByb2Nlc3NCdWlsZExvZ2dlcl9fbWlsbGlzZWNvbmRzXzY7CisJCisJcHVibGljIHN0YXRpYyBTdHJpbmcgQW50UHJvY2Vzc0RlYnVnQnVpbGRMb2dnZXJfMTsKKworCXN0YXRpYyB7CisJCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQorCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBSdW50aW1lTWVzc2FnZXMuY2xhc3MpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9sb2dnZXJzL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvcnVudGltZS9sb2dnZXIvUnVudGltZU1lc3NhZ2VzLnByb3BlcnRpZXMgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9sb2dnZXJzL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvcnVudGltZS9sb2dnZXIvUnVudGltZU1lc3NhZ2VzLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTczMTg4YQotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL2xvZ2dlcnMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9ydW50aW1lL2xvZ2dlci9SdW50aW1lTWVzc2FnZXMucHJvcGVydGllcwpAQCAtMCwwICsxLDIwIEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyMKKyMgQ29udHJpYnV0b3JzOgorIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK051bGxCdWlsZExvZ2dlcl8xPUJVSUxEIEZBSUxFRAorQW50UHJvY2Vzc0J1aWxkTG9nZ2VyX1RvdGFsX3RpbWU9VG90YWwgdGltZTogCitBbnRQcm9jZXNzQnVpbGRMb2dnZXJfX21pbnV0ZXNfMj1cIG1pbnV0ZXMKK0FudFByb2Nlc3NCdWlsZExvZ2dlcl9fbWludXRlXzM9XCBtaW51dGUKK0FudFByb2Nlc3NCdWlsZExvZ2dlcl9fc2Vjb25kc180PVwgc2Vjb25kcworQW50UHJvY2Vzc0J1aWxkTG9nZ2VyX19zZWNvbmRfNT1cIHNlY29uZAorQW50UHJvY2Vzc0J1aWxkTG9nZ2VyX19taWxsaXNlY29uZHNfNj1cIG1pbGxpc2Vjb25kcworCitBbnRQcm9jZXNzRGVidWdCdWlsZExvZ2dlcl8xPUJ1aWxkIGNhbmNlbGxlZC4KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvcGx1Z2luLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUwZmI0ZgotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3BsdWdpbi5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMjQgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisjIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorIworIyBDb250cmlidXRvcnM6CisjICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworcGx1Z2luTmFtZT1BbnQgTGF1bmNoaW5nIFN1cHBvcnQKK3Byb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZworCitBbnRCdWlsZCA9IEFudCBCdWlsZAorQW50TGF1bmNoRGVsZWdhdGUubmFtZT1FY2xpcHNlIEFudCBMYXVuY2hlcgorQW50TGF1bmNoRGVsZWdhdGUuZGVzY3JpcHRpb249VGhlIEVjbGlwc2UgQW50IExhdW5jaGVyIHN1cHBvcnRzIHJ1bm5pbmcgYW5kIGRlYnVnZ2luZyBBbnQgYnVpbGQgZmlsZXMuCisKK0FudEJ1aWxkZXIubmFtZT1BbnQgQnVpbGRlcgorQW50QnVpbGRlckxhdW5jaERlbGVnYXRlLm5hbWU9IEVjbGlwc2UgQW50IEJ1aWxkZXIgTGF1bmNoZXIKK0FudEJ1aWxkZXJMYXVuY2hEZWxlZ2F0ZS5kZXNjcmlwdGlvbj1UaGUgRWNsaXBzZSBBbnQgQnVpbGRlciBMYXVuY2hlciBzdXBwb3J0cyBydW5uaW5nIEFudCBidWlsZCBmaWxlcy4KKworYW50QnJlYWtwb2ludEdyb3VwTmFtZT0gQW50IEJyZWFrcG9pbnRzCitBbnRMaW5lQnJlYWtwb2ludC5uYW1lID0gQW50IExpbmUgQnJlYWtwb2ludApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3JlbW90ZS9NRVRBLUlORi9lY2xpcHNlLmluZiBiL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3JlbW90ZS9NRVRBLUlORi9lY2xpcHNlLmluZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGRmM2FiCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvcmVtb3RlL01FVEEtSU5GL2VjbGlwc2UuaW5mCkBAIC0wLDAgKzEgQEAKK2phcnByb2Nlc3Nvci5leGNsdWRlLnNpZ249dHJ1ZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3JlbW90ZS9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL3JlbW90ZS9BbnRTZWN1cml0eUV4Y2VwdGlvbi5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvcmVtb3RlL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvcmVtb3RlL0FudFNlY3VyaXR5RXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk0YjI0OAotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3JlbW90ZS9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL3JlbW90ZS9BbnRTZWN1cml0eUV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwubGF1bmNoaW5nLnJlbW90ZTsKKworLyoqCisgKiBBIHNlY3VyaXR5IGV4Y2VwdGlvbiB0aGF0IGlzIHRocm93biBieSB0aGUgQW50U2VjdXJpdHlNYW5hZ2VyIGlmCisgKiBhbiBBbnQgdGFzayBpbiBzb21lIHdheSBhdHRlbXB0cyB0byBoYWx0IG9yIGV4aXQgdGhlIEphdmEgVmlydHVhbCBNYWNoaW5lLgorICogCisgKiBAc2luY2UgMi4xCisgKi8KK3B1YmxpYyBjbGFzcyBBbnRTZWN1cml0eUV4Y2VwdGlvbiBleHRlbmRzIFNlY3VyaXR5RXhjZXB0aW9uIHsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCit9CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9yZW1vdGUvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9yZW1vdGUvQW50U2VjdXJpdHlNYW5hZ2VyLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9yZW1vdGUvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9yZW1vdGUvQW50U2VjdXJpdHlNYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBmN2ViYgotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3JlbW90ZS9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL3JlbW90ZS9BbnRTZWN1cml0eU1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDM3MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5sYXVuY2hpbmcucmVtb3RlOworCisKK2ltcG9ydCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yOworaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LlNvY2tldFBlcm1pc3Npb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uOworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb247CisKKy8qKgorICogQSBzZWN1cml0eSBtYW5hZ2VyIHRoYXQgYWx3YXlzIHRocm93cyBhbiA8Y29kZT5BbnRTZWN1cml0eUV4Y2VwdGlvbjwvY29kZT4KKyAqIGlmIHRoZSBjYWxsaW5nIHRocmVhZCBhdHRlbXB0cyB0byBjYXVzZSB0aGUgSmF2YSBWaXJ0dWFsIE1hY2hpbmUgdG8gCisgKiBleGl0L2hhbHQgb3IgaWYgdGhlIHJlc3RyaWN0ZWQgdGhyZWFkIGF0dGVtcHRzIHRvIHNldCBhIFN5c3RlbSBwcm9wZXJ0eS4KKyAqIE90aGVyd2lzZSB0aGlzIG1hbmFnZXIganVzdCBkZWxlZ2F0ZXMgdG8gdGhlIHByZS1leGlzdGluZyBtYW5hZ2VyCisgKiBwYXNzZWQgaW4gdGhlIGNvbnN0cnVjdG9yIG9yIG1pbWljcyB0aGUgZGVmYXVsdCBzZWN1cml0eSBtYW5hZ2VyIGJlaGF2aW9yCisgKi8KK3B1YmxpYyBjbGFzcyBBbnRTZWN1cml0eU1hbmFnZXIgZXh0ZW5kcyBTZWN1cml0eU1hbmFnZXIgeworCisJcHJpdmF0ZSBTZWN1cml0eU1hbmFnZXIgZlNlY3VyaXR5TWFuYWdlcj0gbnVsbDsKKwlwcml2YXRlIFRocmVhZCBmUmVzdHJpY3RlZFRocmVhZD0gbnVsbDsKKwkvL2Vuc3VyZSB0aGF0IHRoZSBQcm9wZXJ0eVBlcm1pc3Npb24gY2xhc3MgaXMgbG9hZGVkIGJlZm9yZSB3ZSAKKwkvL3N0YXJ0IGNoZWNraW5nIHBlcm1pc3Npb25zOiBidWcgODU5MDgKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBQcm9wZXJ0eVBlcm1pc3Npb24gZmdQcm9wZXJ0eVBlcm1pc3Npb249IG5ldyBQcm9wZXJ0eVBlcm1pc3Npb24oIioiLCAid3JpdGUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCisJcHJpdmF0ZSBib29sZWFuIGZBbGxvd1NldHRpbmdTeXN0ZW1Qcm9wZXJ0aWVzPSB0cnVlOworCQorCXB1YmxpYyBBbnRTZWN1cml0eU1hbmFnZXIoU2VjdXJpdHlNYW5hZ2VyIHNlY3VyaXR5TWFuYWdlciwgVGhyZWFkIHJlc3RyaWN0ZWRUaHJlYWQsIGJvb2xlYW4gYWxsb3dTZXR0aW5nUHJvcGVydGllcykgeworCQlmU2VjdXJpdHlNYW5hZ2VyPSBzZWN1cml0eU1hbmFnZXI7CisJCWZSZXN0cmljdGVkVGhyZWFkPSByZXN0cmljdGVkVGhyZWFkOworCQlmQWxsb3dTZXR0aW5nU3lzdGVtUHJvcGVydGllcz0gYWxsb3dTZXR0aW5nUHJvcGVydGllczsKKwl9CisJCisJcHVibGljIEFudFNlY3VyaXR5TWFuYWdlcihTZWN1cml0eU1hbmFnZXIgc2VjdXJpdHlNYW5hZ2VyLCBUaHJlYWQgcmVzdHJpY3RlZFRocmVhZCkgeworCQl0aGlzKHNlY3VyaXR5TWFuYWdlciwgcmVzdHJpY3RlZFRocmVhZCwgdHJ1ZSk7CisJfQorCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2hlY2tFeGl0KGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBjaGVja0V4aXQoaW50IHN0YXR1cykgeworCQkvL25vIGV4aXQgYWxsb3dlZCBmcm9tIHRoZSByZXN0cmljdGVkIHRocmVhZC4uLlN5c3RlbS5leGl0IGlzIGJlaW5nIGNhbGxlZAorCQkvL2J5IHNvbWUgYW50IHRhc2suLi5kaXNhbGxvdyB0aGUgZXhpdAorCQlpZiAoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSA9PSBmUmVzdHJpY3RlZFRocmVhZCkgeworCQkJdGhyb3cgbmV3IEFudFNlY3VyaXR5RXhjZXB0aW9uKCk7CisJCX0KKwkJaWYgKGZTZWN1cml0eU1hbmFnZXIgIT0gbnVsbCkgeworCQkJZlNlY3VyaXR5TWFuYWdlci5jaGVja0V4aXQoc3RhdHVzKTsKKwkJfQorCX0KKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2NoZWNrQWNjZXB0KGphdmEubGFuZy5TdHJpbmcsIGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBjaGVja0FjY2VwdChTdHJpbmcgaG9zdCwgaW50IHBvcnQpIHsKKwkJaWYgKGZTZWN1cml0eU1hbmFnZXIgIT0gbnVsbCkgeworCQkJZlNlY3VyaXR5TWFuYWdlci5jaGVja0FjY2VwdChob3N0LCBwb3J0KTsKKwkJfQorCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2hlY2tBY2Nlc3MoamF2YS5sYW5nLlRocmVhZCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBjaGVja0FjY2VzcyhUaHJlYWQgdCkgeworCQlpZiAoZlNlY3VyaXR5TWFuYWdlciAhPSBudWxsKSB7CisJCQlmU2VjdXJpdHlNYW5hZ2VyLmNoZWNrQWNjZXNzKHQpOworCQl9CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNjaGVja0FjY2VzcyhqYXZhLmxhbmcuVGhyZWFkR3JvdXApCisJICovCisJcHVibGljIHZvaWQgY2hlY2tBY2Nlc3MoVGhyZWFkR3JvdXAgZykgeworCQlpZiAoZlNlY3VyaXR5TWFuYWdlciAhPSBudWxsKSB7CisJCQlmU2VjdXJpdHlNYW5hZ2VyLmNoZWNrQWNjZXNzKGcpOworCQl9CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNjaGVja0F3dEV2ZW50UXVldWVBY2Nlc3MoKQorCSAqLworCXB1YmxpYyB2b2lkIGNoZWNrQXd0RXZlbnRRdWV1ZUFjY2VzcygpIHsKKwkJaWYgKGZTZWN1cml0eU1hbmFnZXIgIT0gbnVsbCkgeworCQkJZlNlY3VyaXR5TWFuYWdlci5jaGVja0F3dEV2ZW50UXVldWVBY2Nlc3MoKTsKKwkJfQorCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2hlY2tDb25uZWN0KGphdmEubGFuZy5TdHJpbmcsIGludCwgamF2YS5sYW5nLk9iamVjdCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBjaGVja0Nvbm5lY3QoU3RyaW5nIGhvc3QsIGludCBwb3J0LCBPYmplY3QgY29udGV4dCkgeworCQlpZiAoZlNlY3VyaXR5TWFuYWdlciAhPSBudWxsKSB7CisJCQlmU2VjdXJpdHlNYW5hZ2VyLmNoZWNrQ29ubmVjdChob3N0LCBwb3J0LCBjb250ZXh0KTsKKwkJfQorCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2hlY2tDb25uZWN0KGphdmEubGFuZy5TdHJpbmcsIGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBjaGVja0Nvbm5lY3QoU3RyaW5nIGhvc3QsIGludCBwb3J0KSB7CisJCWlmIChmU2VjdXJpdHlNYW5hZ2VyICE9IG51bGwpIHsKKwkJCWZTZWN1cml0eU1hbmFnZXIuY2hlY2tDb25uZWN0KGhvc3QsIHBvcnQpOworCQl9CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNjaGVja0NyZWF0ZUNsYXNzTG9hZGVyKCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBjaGVja0NyZWF0ZUNsYXNzTG9hZGVyKCkgeworCQlpZiAoZlNlY3VyaXR5TWFuYWdlciAhPSBudWxsKSB7CisJCQlmU2VjdXJpdHlNYW5hZ2VyLmNoZWNrQ3JlYXRlQ2xhc3NMb2FkZXIoKTsKKwkJfQorCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2hlY2tEZWxldGUoamF2YS5sYW5nLlN0cmluZykKKwkgKi8KKwlwdWJsaWMgdm9pZCBjaGVja0RlbGV0ZShTdHJpbmcgZmlsZSkgeworCQlpZiAoZlNlY3VyaXR5TWFuYWdlciAhPSBudWxsKSB7CisJCQlmU2VjdXJpdHlNYW5hZ2VyLmNoZWNrRGVsZXRlKGZpbGUpOworCQl9CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNjaGVja0V4ZWMoamF2YS5sYW5nLlN0cmluZykKKwkgKi8KKwlwdWJsaWMgdm9pZCBjaGVja0V4ZWMoU3RyaW5nIGNtZCkgeworCQlpZiAoZlNlY3VyaXR5TWFuYWdlciAhPSBudWxsKSB7CisJCQlmU2VjdXJpdHlNYW5hZ2VyLmNoZWNrRXhlYyhjbWQpOworCQl9CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNjaGVja0xpbmsoamF2YS5sYW5nLlN0cmluZykKKwkgKi8KKwlwdWJsaWMgdm9pZCBjaGVja0xpbmsoU3RyaW5nIGxpYikgeworCQlpZiAoZlNlY3VyaXR5TWFuYWdlciAhPSBudWxsKSB7CisJCQlmU2VjdXJpdHlNYW5hZ2VyLmNoZWNrTGluayhsaWIpOworCQl9CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNjaGVja0xpc3RlbihpbnQpCisJICovCisJcHVibGljIHZvaWQgY2hlY2tMaXN0ZW4oaW50IHBvcnQpIHsKKwkJaWYgKGZTZWN1cml0eU1hbmFnZXIgIT0gbnVsbCkgeworCQkJZlNlY3VyaXR5TWFuYWdlci5jaGVja0xpc3Rlbihwb3J0KTsKKwkJfQorCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2hlY2tNZW1iZXJBY2Nlc3MoamF2YS5sYW5nLkNsYXNzLCBpbnQpCisJICovCisJcHVibGljIHZvaWQgY2hlY2tNZW1iZXJBY2Nlc3MoQ2xhc3MgY2xhenosIGludCB3aGljaCkgeworCQlpZiAoZlNlY3VyaXR5TWFuYWdlciAhPSBudWxsKSB7CisJCQlmU2VjdXJpdHlNYW5hZ2VyLmNoZWNrTWVtYmVyQWNjZXNzKGNsYXp6LCB3aGljaCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBAc2VlIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2hlY2tNdWx0aWNhc3QoamF2YS5uZXQuSW5ldEFkZHJlc3MsIGJ5dGUpCisJICogQGRlcHJlY2F0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBjaGVja011bHRpY2FzdChJbmV0QWRkcmVzcyBtYWRkciwgYnl0ZSB0dGwpIHsKKwkJaWYgKGZTZWN1cml0eU1hbmFnZXIgIT0gbnVsbCkgeworCQkJU3RyaW5nIGhvc3QgPSBtYWRkci5nZXRIb3N0QWRkcmVzcygpOworCQkJaWYgKCFob3N0LnN0YXJ0c1dpdGgoIlsiKSAmJiBob3N0LmluZGV4T2YoJzonKSAhPSAtMSkgeyAvLyROT04tTkxTLTEkCisJICAgCQkJaG9zdCA9ICJbIiArIGhvc3QgKyAiXSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJfQorCSAgICAJY2hlY2tQZXJtaXNzaW9uKG5ldyBTb2NrZXRQZXJtaXNzaW9uKGhvc3QsICJhY2NlcHQsY29ubmVjdCIpKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNjaGVja011bHRpY2FzdChqYXZhLm5ldC5JbmV0QWRkcmVzcykKKwkgKi8KKwlwdWJsaWMgdm9pZCBjaGVja011bHRpY2FzdChJbmV0QWRkcmVzcyBtYWRkcikgeworCQlpZiAoZlNlY3VyaXR5TWFuYWdlciAhPSBudWxsKSB7CisJCQlmU2VjdXJpdHlNYW5hZ2VyLmNoZWNrTXVsdGljYXN0KG1hZGRyKTsKKwkJfQorCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2hlY2tQYWNrYWdlQWNjZXNzKGphdmEubGFuZy5TdHJpbmcpCisJICovCisJcHVibGljIHZvaWQgY2hlY2tQYWNrYWdlQWNjZXNzKFN0cmluZyBwa2cpIHsKKwkJaWYgKGZTZWN1cml0eU1hbmFnZXIgIT0gbnVsbCkgeworCQkJZlNlY3VyaXR5TWFuYWdlci5jaGVja1BhY2thZ2VBY2Nlc3MocGtnKTsKKwkJfQorCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2hlY2tQYWNrYWdlRGVmaW5pdGlvbihqYXZhLmxhbmcuU3RyaW5nKQorCSAqLworCXB1YmxpYyB2b2lkIGNoZWNrUGFja2FnZURlZmluaXRpb24oU3RyaW5nIHBrZykgeworCQlpZiAoZlNlY3VyaXR5TWFuYWdlciAhPSBudWxsKSB7CisJCQlmU2VjdXJpdHlNYW5hZ2VyLmNoZWNrUGFja2FnZURlZmluaXRpb24ocGtnKTsKKwkJfQorCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2hlY2tQZXJtaXNzaW9uKGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbiwgamF2YS5sYW5nLk9iamVjdCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBjaGVja1Blcm1pc3Npb24oUGVybWlzc2lvbiBwZXJtLCBPYmplY3QgY29udGV4dCkgeworCQlpZiAoZlNlY3VyaXR5TWFuYWdlciAhPSBudWxsKSB7CisJCQlmU2VjdXJpdHlNYW5hZ2VyLmNoZWNrUGVybWlzc2lvbihwZXJtLCBjb250ZXh0KTsKKwkJfQorCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2hlY2tQZXJtaXNzaW9uKGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbikKKwkgKi8KKwlwdWJsaWMgdm9pZCBjaGVja1Blcm1pc3Npb24oUGVybWlzc2lvbiBwZXJtKSB7CisJCWlmICghZkFsbG93U2V0dGluZ1N5c3RlbVByb3BlcnRpZXMgJiYgZmdQcm9wZXJ0eVBlcm1pc3Npb24uaW1wbGllcyhwZXJtKSAmJiBmUmVzdHJpY3RlZFRocmVhZCA9PSBUaHJlYWQuY3VycmVudFRocmVhZCgpKSB7CisJCQkvL2F0dGVtcHRpbmcgdG8gd3JpdGUgYSBzeXN0ZW0gcHJvcGVydHkKKwkJCXRocm93IG5ldyBBbnRTZWN1cml0eUV4Y2VwdGlvbigpOworCQl9CisJCWlmIChmU2VjdXJpdHlNYW5hZ2VyICE9IG51bGwpIHsKKwkJCWZTZWN1cml0eU1hbmFnZXIuY2hlY2tQZXJtaXNzaW9uKHBlcm0pOworCQl9CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNjaGVja1ByaW50Sm9iQWNjZXNzKCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBjaGVja1ByaW50Sm9iQWNjZXNzKCkgeworCQlpZiAoZlNlY3VyaXR5TWFuYWdlciAhPSBudWxsKSB7CisJCQlmU2VjdXJpdHlNYW5hZ2VyLmNoZWNrUHJpbnRKb2JBY2Nlc3MoKTsKKwkJfQorCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2hlY2tQcm9wZXJ0aWVzQWNjZXNzKCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBjaGVja1Byb3BlcnRpZXNBY2Nlc3MoKSB7CisJCWlmIChmU2VjdXJpdHlNYW5hZ2VyICE9IG51bGwpIHsKKwkJCWZTZWN1cml0eU1hbmFnZXIuY2hlY2tQcm9wZXJ0aWVzQWNjZXNzKCk7CisJCX0KKwkJc3VwZXIuY2hlY2tQcm9wZXJ0aWVzQWNjZXNzKCk7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNjaGVja1Byb3BlcnR5QWNjZXNzKGphdmEubGFuZy5TdHJpbmcpCisJICovCisJcHVibGljIHZvaWQgY2hlY2tQcm9wZXJ0eUFjY2VzcyhTdHJpbmcga2V5KSB7CisJCWlmIChmU2VjdXJpdHlNYW5hZ2VyICE9IG51bGwpIHsKKwkJCWZTZWN1cml0eU1hbmFnZXIuY2hlY2tQcm9wZXJ0eUFjY2VzcyhrZXkpOworCQl9CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNjaGVja1JlYWQoamF2YS5pby5GaWxlRGVzY3JpcHRvcikKKwkgKi8KKwlwdWJsaWMgdm9pZCBjaGVja1JlYWQoRmlsZURlc2NyaXB0b3IgZmQpIHsKKwkJaWYgKGZTZWN1cml0eU1hbmFnZXIgIT0gbnVsbCkgeworCQkJZlNlY3VyaXR5TWFuYWdlci5jaGVja1JlYWQoZmQpOworCQl9CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNjaGVja1JlYWQoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBjaGVja1JlYWQoU3RyaW5nIGZpbGUsIE9iamVjdCBjb250ZXh0KSB7CisJCWlmIChmU2VjdXJpdHlNYW5hZ2VyICE9IG51bGwpIHsKKwkJCWZTZWN1cml0eU1hbmFnZXIuY2hlY2tSZWFkKGZpbGUsIGNvbnRleHQpOworCQl9CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNjaGVja1JlYWQoamF2YS5sYW5nLlN0cmluZykKKwkgKi8KKwlwdWJsaWMgdm9pZCBjaGVja1JlYWQoU3RyaW5nIGZpbGUpIHsKKwkJaWYgKGZTZWN1cml0eU1hbmFnZXIgIT0gbnVsbCkgeworCQkJZlNlY3VyaXR5TWFuYWdlci5jaGVja1JlYWQoZmlsZSk7CisJCX0KKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2NoZWNrU2VjdXJpdHlBY2Nlc3MoamF2YS5sYW5nLlN0cmluZykKKwkgKi8KKwlwdWJsaWMgdm9pZCBjaGVja1NlY3VyaXR5QWNjZXNzKFN0cmluZyB0YXJnZXQpIHsKKwkJaWYgKGZTZWN1cml0eU1hbmFnZXIgIT0gbnVsbCkgeworCQkJZlNlY3VyaXR5TWFuYWdlci5jaGVja1NlY3VyaXR5QWNjZXNzKHRhcmdldCk7CisJCX0KKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2NoZWNrU2V0RmFjdG9yeSgpCisJICovCisJcHVibGljIHZvaWQgY2hlY2tTZXRGYWN0b3J5KCkgeworCQlpZiAoZlNlY3VyaXR5TWFuYWdlciAhPSBudWxsKSB7CisJCQlmU2VjdXJpdHlNYW5hZ2VyLmNoZWNrU2V0RmFjdG9yeSgpOworCQl9CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNjaGVja1N5c3RlbUNsaXBib2FyZEFjY2VzcygpCisJICovCisJcHVibGljIHZvaWQgY2hlY2tTeXN0ZW1DbGlwYm9hcmRBY2Nlc3MoKSB7CisJCWlmIChmU2VjdXJpdHlNYW5hZ2VyICE9IG51bGwpIHsKKwkJCWZTZWN1cml0eU1hbmFnZXIuY2hlY2tTeXN0ZW1DbGlwYm9hcmRBY2Nlc3MoKTsKKwkJfQorCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2hlY2tUb3BMZXZlbFdpbmRvdyhqYXZhLmxhbmcuT2JqZWN0KQorCSAqLworCXB1YmxpYyBib29sZWFuIGNoZWNrVG9wTGV2ZWxXaW5kb3coT2JqZWN0IHdpbmRvdykgeworCQlpZiAoZlNlY3VyaXR5TWFuYWdlciAhPSBudWxsKSB7CisJCQlyZXR1cm4gZlNlY3VyaXR5TWFuYWdlci5jaGVja1RvcExldmVsV2luZG93KHdpbmRvdyk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmNoZWNrVG9wTGV2ZWxXaW5kb3cod2luZG93KTsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2NoZWNrV3JpdGUoamF2YS5pby5GaWxlRGVzY3JpcHRvcikKKwkgKi8KKwlwdWJsaWMgdm9pZCBjaGVja1dyaXRlKEZpbGVEZXNjcmlwdG9yIGZkKSB7CisJCWlmIChmU2VjdXJpdHlNYW5hZ2VyICE9IG51bGwpIHsKKwkJCWZTZWN1cml0eU1hbmFnZXIuY2hlY2tXcml0ZShmZCk7CisJCX0KKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2NoZWNrV3JpdGUoamF2YS5sYW5nLlN0cmluZykKKwkgKi8KKwlwdWJsaWMgdm9pZCBjaGVja1dyaXRlKFN0cmluZyBmaWxlKSB7CisJCWlmIChmU2VjdXJpdHlNYW5hZ2VyICE9IG51bGwpIHsKKwkJCWZTZWN1cml0eU1hbmFnZXIuY2hlY2tXcml0ZShmaWxlKTsKKwkJfQorCX0KKworCS8qKgorCSAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNnZXRJbkNoZWNrKCkKKwkgKiBAZGVwcmVjYXRlZAorCSAqLworCXB1YmxpYyBib29sZWFuIGdldEluQ2hlY2soKSB7CisJCWlmIChmU2VjdXJpdHlNYW5hZ2VyICE9IG51bGwpIHsKKwkJCXJldHVybiBmU2VjdXJpdHlNYW5hZ2VyLmdldEluQ2hlY2soKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZ2V0SW5DaGVjaygpOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjZ2V0U2VjdXJpdHlDb250ZXh0KCkKKwkgKi8KKwlwdWJsaWMgT2JqZWN0IGdldFNlY3VyaXR5Q29udGV4dCgpIHsKKwkJaWYgKGZTZWN1cml0eU1hbmFnZXIgIT0gbnVsbCkgeworCQkJcmV0dXJuIGZTZWN1cml0eU1hbmFnZXIuZ2V0U2VjdXJpdHlDb250ZXh0KCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmdldFNlY3VyaXR5Q29udGV4dCgpOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjZ2V0VGhyZWFkR3JvdXAoKQorCSAqLworCXB1YmxpYyBUaHJlYWRHcm91cCBnZXRUaHJlYWRHcm91cCgpIHsKKwkJaWYgKGZTZWN1cml0eU1hbmFnZXIgIT0gbnVsbCkgeworCQkJZlNlY3VyaXR5TWFuYWdlci5nZXRUaHJlYWRHcm91cCgpOworCQl9CisJCXJldHVybiBzdXBlci5nZXRUaHJlYWRHcm91cCgpOworCX0KK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3JlbW90ZS9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL3JlbW90ZS9EZW11eElucHV0U3RyZWFtU2V0dGVyLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9yZW1vdGUvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9yZW1vdGUvRGVtdXhJbnB1dFN0cmVhbVNldHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxMTE2MTEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9yZW1vdGUvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9yZW1vdGUvRGVtdXhJbnB1dFN0cmVhbVNldHRlci5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwubGF1bmNoaW5nLnJlbW90ZTsKKworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuRGVtdXhJbnB1dFN0cmVhbTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworCisvKioKKyAqIFRoaXMgY2xhc3MgZXhpc3RzIHNvIHRoYXQgdGhlIEFudCBpbnRlZ3JhdGlvbiBoYXMgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKKyAqIHdpdGggQW50IHJlbGVhc2VzIHByZXZpb3VzIHRvIDEuNi4gRGVtdXhJbnB1dFN0cmVhbSBpcyBhIG5ldyBjbGFzcyB0byBBbnQgMS42LgorICovCitjbGFzcyBEZW11eElucHV0U3RyZWFtU2V0dGVyIHsKKworCXByb3RlY3RlZCB2b2lkIHJlbWFwU3lzdGVtSW4oUHJvamVjdCBwcm9qZWN0KSB7CisJCVN5c3RlbS5zZXRJbihuZXcgRGVtdXhJbnB1dFN0cmVhbShwcm9qZWN0KSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvcmVtb3RlL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvcmVtb3RlL0VjbGlwc2VEZWZhdWx0RXhlY3V0b3IuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3JlbW90ZS9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL3JlbW90ZS9FY2xpcHNlRGVmYXVsdEV4ZWN1dG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI4NmY1ZAotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3JlbW90ZS9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL3JlbW90ZS9FY2xpcHNlRGVmYXVsdEV4ZWN1dG9yLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5sYXVuY2hpbmcucmVtb3RlOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuRXhlY3V0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5oZWxwZXIuRGVmYXVsdEV4ZWN1dG9yOworCitwdWJsaWMgY2xhc3MgRWNsaXBzZURlZmF1bHRFeGVjdXRvciBleHRlbmRzIERlZmF1bHRFeGVjdXRvciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBFY2xpcHNlU2luZ2xlQ2hlY2tFeGVjdXRvciBTVUJfRVhFQ1VUT1IgPSBuZXcgRWNsaXBzZVNpbmdsZUNoZWNrRXhlY3V0b3IoKTsKKyAgICAKKyAgICAvKiAobm9uLUphdmFkb2MpCisgICAgICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5FeGVjdXRvciNleGVjdXRlVGFyZ2V0cyhvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0LCBqYXZhLmxhbmcuU3RyaW5nW10pCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZVRhcmdldHMoUHJvamVjdCBwcm9qZWN0LCBTdHJpbmdbXSB0YXJnZXROYW1lcykgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgVmVjdG9yIHY9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgdi5hZGRBbGwoQXJyYXlzLmFzTGlzdCh0YXJnZXROYW1lcykpOworICAgICAgICBwcm9qZWN0LmFkZFJlZmVyZW5jZSgiZWNsaXBzZS5hbnQudGFyZ2V0VmVjdG9yIiwgdik7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgc3VwZXIuZXhlY3V0ZVRhcmdldHMocHJvamVjdCwgdGFyZ2V0TmFtZXMpOworICAgIH0KKyAgICAKKyAgICAvKiAobm9uLUphdmFkb2MpCisgICAgICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5FeGVjdXRvciNnZXRTdWJQcm9qZWN0RXhlY3V0b3IoKQorICAgICAqLworICAgIHB1YmxpYyBFeGVjdXRvciBnZXRTdWJQcm9qZWN0RXhlY3V0b3IoKSB7CisgICAgICAgcmV0dXJuIFNVQl9FWEVDVVRPUjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9yZW1vdGUvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9yZW1vdGUvRWNsaXBzZVNpbmdsZUNoZWNrRXhlY3V0b3IuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3JlbW90ZS9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL3JlbW90ZS9FY2xpcHNlU2luZ2xlQ2hlY2tFeGVjdXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyZGRkNGYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9yZW1vdGUvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9yZW1vdGUvRWNsaXBzZVNpbmdsZUNoZWNrRXhlY3V0b3IuamF2YQpAQCAtMCwwICsxLDM5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmxhdW5jaGluZy5yZW1vdGU7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5FeGVjdXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LmhlbHBlci5TaW5nbGVDaGVja0V4ZWN1dG9yOworCitwdWJsaWMgY2xhc3MgRWNsaXBzZVNpbmdsZUNoZWNrRXhlY3V0b3IgZXh0ZW5kcyBTaW5nbGVDaGVja0V4ZWN1dG9yIHsKKworICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LkV4ZWN1dG9yI2V4ZWN1dGVUYXJnZXRzKG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3QsIGphdmEubGFuZy5TdHJpbmdbXSkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlVGFyZ2V0cyhQcm9qZWN0IHByb2plY3QsIFN0cmluZ1tdIHRhcmdldE5hbWVzKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBWZWN0b3Igdj0gbmV3IFZlY3RvcigpOworICAgICAgICB2LmFkZEFsbChBcnJheXMuYXNMaXN0KHRhcmdldE5hbWVzKSk7CisgICAgICAgIHByb2plY3QuYWRkUmVmZXJlbmNlKCJlY2xpcHNlLmFudC50YXJnZXRWZWN0b3IiLCB2KTsgLy8kTk9OLU5MUy0xJAorICAgICAgICBzdXBlci5leGVjdXRlVGFyZ2V0cyhwcm9qZWN0LCB0YXJnZXROYW1lcyk7CisgICAgfQorICAgIAorICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LkV4ZWN1dG9yI2dldFN1YlByb2plY3RFeGVjdXRvcigpCisgICAgICovCisgICAgcHVibGljIEV4ZWN1dG9yIGdldFN1YlByb2plY3RFeGVjdXRvcigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvcmVtb3RlL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvcmVtb3RlL0V4ZWN1dG9yU2V0dGVyLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9yZW1vdGUvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9yZW1vdGUvRXhlY3V0b3JTZXR0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDlhYmE1Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvcmVtb3RlL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvcmVtb3RlL0V4ZWN1dG9yU2V0dGVyLmphdmEKQEAgLTAsMCArMSwyNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5sYXVuY2hpbmcucmVtb3RlOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuRXhlY3V0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKKworLyoqCisgKiBUaGlzIGNsYXNzIGV4aXN0cyBzbyB0aGF0IHRoZSBBbnQgaW50ZWdyYXRpb24gaGFzIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CisgKiB3aXRoIEFudCByZWxlYXNlcyBwcmV2aW91cyB0byAxLjYuMy4gRXhlY3V0b3JzIGFyZSBhIG5ldyBmZWF0dXJlIG9mIEFudCAxLjYuMy4KKyAqLworcHVibGljIGNsYXNzIEV4ZWN1dG9yU2V0dGVyIHsKKworICAgIHByb3RlY3RlZCB2b2lkIHNldEV4ZWN1dG9yKFByb2plY3QgcHJvamVjdCkgeworICAgICAgICBFeGVjdXRvciBleGVjdXRvcj0gbmV3IEVjbGlwc2VEZWZhdWx0RXhlY3V0b3IoKTsKKyAgICAgICAgcHJvamVjdC5zZXRFeGVjdXRvcihleGVjdXRvcik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvcmVtb3RlL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvcmVtb3RlL0lucHV0SGFuZGxlclNldHRlci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvcmVtb3RlL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvcmVtb3RlL0lucHV0SGFuZGxlclNldHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxYmRkMWYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9yZW1vdGUvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9yZW1vdGUvSW5wdXRIYW5kbGVyU2V0dGVyLmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5sYXVuY2hpbmcucmVtb3RlOworCisKK2ltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsgLy8gY2FuJ3QgdXNlIElDVSwgdXNlZCBieSBhbnQKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuaW5wdXQuRGVmYXVsdElucHV0SGFuZGxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5pbnB1dC5JbnB1dEhhbmRsZXI7CisKKy8qKgorICogVGhpcyBjbGFzcyBleGlzdHMgc28gdGhhdCB0aGUgQW50IGludGVncmF0aW9uIGhhcyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQorICogd2l0aCBBbnQgcmVsZWFzZXMgcHJldmlvdXMgdG8gMS41LiBJbnB1dEhhbmRsZXJzIGFyZSBhIG5ldyBmZWF0dXJlIG9mIEFudCAxLjUuCisgKi8KK2NsYXNzIElucHV0SGFuZGxlclNldHRlciB7CisKKwlwcm90ZWN0ZWQgdm9pZCBzZXRJbnB1dEhhbmRsZXIoUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgaW5wdXRIYW5kbGVyQ2xhc3NuYW1lKSB7CisJCUlucHV0SGFuZGxlciBoYW5kbGVyID0gbnVsbDsKKwkJaWYgKGlucHV0SGFuZGxlckNsYXNzbmFtZSA9PSBudWxsKSB7CisJCQloYW5kbGVyID0gbmV3IERlZmF1bHRJbnB1dEhhbmRsZXIoKTsKKwkJfSBlbHNlIHsKKwkJCXRyeSB7CisJCQkJaGFuZGxlciA9IChJbnB1dEhhbmRsZXIpKENsYXNzLmZvck5hbWUoaW5wdXRIYW5kbGVyQ2xhc3NuYW1lKS5uZXdJbnN0YW5jZSgpKTsKKwkJCX0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7CisJCQkJU3RyaW5nIG1zZyA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KFJlbW90ZUFudE1lc3NhZ2VzLmdldFN0cmluZygiSW50ZXJuYWxBbnRSdW5uZXIuVGhlX3NwZWNpZmllZF9pbnB1dF9oYW5kbGVyX2NsYXNzX3swfV9kb2VzX25vdF9pbXBsZW1lbnRfdGhlX29yZy5hcGFjaGUudG9vbHMuYW50LmlucHV0LklucHV0SGFuZGxlcl9pbnRlcmZhY2VfNSIpLCBuZXcgU3RyaW5nW117aW5wdXRIYW5kbGVyQ2xhc3NuYW1lfSk7IC8vJE5PTi1OTFMtMSQKKwkJCQl0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBlKTsKKwkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJU3RyaW5nIG1zZyA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KFJlbW90ZUFudE1lc3NhZ2VzLmdldFN0cmluZygiSW50ZXJuYWxBbnRSdW5uZXIuVW5hYmxlX3RvX2luc3RhbnRpYXRlX3NwZWNpZmllZF9pbnB1dF9oYW5kbGVyX2NsYXNzX3swfV9fX3sxfV82IiksIG5ldyBTdHJpbmdbXXtpbnB1dEhhbmRsZXJDbGFzc25hbWUsIGUuZ2V0Q2xhc3MoKS5nZXROYW1lKCl9KTsgLy8kTk9OLU5MUy0xJAorCQkJCXRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGUpOworCQkJfQorCQl9CisJCXByb2plY3Quc2V0SW5wdXRIYW5kbGVyKGhhbmRsZXIpOworCX0KK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3JlbW90ZS9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL3JlbW90ZS9SZW1vdGVBbnRNZXNzYWdlcy5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvcmVtb3RlL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvcmVtb3RlL1JlbW90ZUFudE1lc3NhZ2VzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNiOTI3ZQotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3JlbW90ZS9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL3JlbW90ZS9SZW1vdGVBbnRNZXNzYWdlcy5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwubGF1bmNoaW5nLnJlbW90ZTsKKworCitpbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7CisKK3B1YmxpYyBjbGFzcyBSZW1vdGVBbnRNZXNzYWdlcyB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuYW50LmludGVybmFsLmxhdW5jaGluZy5yZW1vdGUuUmVtb3RlQW50TWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZUJ1bmRsZSBSRVNPVVJDRV9CVU5ETEUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoQlVORExFX05BTUUpOworCisJcHJpdmF0ZSBSZW1vdGVBbnRNZXNzYWdlcygpIHsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgeworCQl0cnkgeworCQkJcmV0dXJuIFJFU09VUkNFX0JVTkRMRS5nZXRTdHJpbmcoa2V5KTsKKwkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiAnIScgKyBrZXkgKyAnISc7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9yZW1vdGUvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9yZW1vdGUvUmVtb3RlQW50TWVzc2FnZXMucHJvcGVydGllcyBiL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3JlbW90ZS9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL3JlbW90ZS9SZW1vdGVBbnRNZXNzYWdlcy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwYzczMzIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9yZW1vdGUvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9yZW1vdGUvUmVtb3RlQW50TWVzc2FnZXMucHJvcGVydGllcwpAQCAtMCwwICsxLDc2IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyMKKyMgQ29udHJpYnV0b3JzOgorIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK0ludGVybmFsQW50UnVubmVyLkJ1aWxkX2ZpbGVfX3swfV8xPUJ1aWxkZmlsZTogezB9CitJbnRlcm5hbEFudFJ1bm5lci5Bcmd1bWVudHNfX3swfV8yPUFyZ3VtZW50czogezB9CitJbnRlcm5hbEFudFJ1bm5lci5EZWZhdWx0X3RhcmdldF9fMz1EZWZhdWx0IHRhcmdldDoKK0ludGVybmFsQW50UnVubmVyLk1haW5fdGFyZ2V0c19fND1NYWluIHRhcmdldHM6CitJbnRlcm5hbEFudFJ1bm5lci5TdWJ0YXJnZXRzX181PVN1YnRhcmdldHM6CitJbnRlcm5hbEFudFJ1bm5lci5VbmFibGVfdG9faW5zdGFudGlhdGVfbG9nZ2VyX197MH1fNj1VbmFibGUgdG8gaW5zdGFudGlhdGUgbG9nZ2VyOiB7MH0KK0ludGVybmFsQW50UnVubmVyLkNvdWxkX25vdF9sb2FkX3RoZV92ZXJzaW9uX2luZm9ybWF0aW9uLl97MH1fOT1Db3VsZCBub3QgbG9hZCB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbi4gezB9CitJbnRlcm5hbEFudFJ1bm5lci5Db3VsZF9ub3RfbG9hZF90aGVfdmVyc2lvbl9pbmZvcm1hdGlvbi5fMTA9Q291bGQgbm90IGxvYWQgdGhlIHZlcnNpb24gaW5mb3JtYXRpb24uCitJbnRlcm5hbEFudFJ1bm5lci5vcHRpb25zXzEzPW9wdGlvbnMKK0ludGVybmFsQW50UnVubmVyLnRhcmdldF8xNT10YXJnZXQKK0ludGVybmFsQW50UnVubmVyLk9wdGlvbnNfX18yMT1PcHRpb25zOiAKK0ludGVybmFsQW50UnVubmVyLnByaW50X3RoaXNfbWVzc2FnZV8yMz1wcmludCB0aGlzIG1lc3NhZ2UKK0ludGVybmFsQW50UnVubmVyLnByaW50X3Byb2plY3RfaGVscF9pbmZvcm1hdGlvbl8yNT1wcmludCBwcm9qZWN0IGhlbHAgaW5mb3JtYXRpb24KK0ludGVybmFsQW50UnVubmVyLnByaW50X3RoZV92ZXJzaW9uX2luZm9ybWF0aW9uX2FuZF9leGl0XzI3PXByaW50IHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFuZCBleGl0CitJbnRlcm5hbEFudFJ1bm5lci5iZV9leHRyYV9xdWlldF8yOT1iZSBleHRyYSBxdWlldAorSW50ZXJuYWxBbnRSdW5uZXIuYmVfZXh0cmFfdmVyYm9zZV8zMT1iZSBleHRyYSB2ZXJib3NlCitJbnRlcm5hbEFudFJ1bm5lci5wcmludF9kZWJ1Z2dpbmdfaW5mb3JtYXRpb25fMzM9cHJpbnQgZGVidWdnaW5nIGluZm9ybWF0aW9uCitJbnRlcm5hbEFudFJ1bm5lci5wcm9kdWNlX2xvZ2dpbmdfaW5mb3JtYXRpb25fd2l0aG91dF9hZG9ybm1lbnRzXzM1PXByb2R1Y2UgbG9nZ2luZyBpbmZvcm1hdGlvbiB3aXRob3V0IGFkb3JubWVudHMKK0ludGVybmFsQW50UnVubmVyLnVzZV9naXZlbl9maWxlX2Zvcl9sb2dfMzc9dXNlIGdpdmVuIGZpbGUgZm9yIGxvZworSW50ZXJuYWxBbnRSdW5uZXIudGhlX2NsYXNzX3doaWNoX2lzX3RvX3BlcmZvcm1fbG9nZ2luZ18zOT10aGUgY2xhc3Mgd2hpY2ggaXMgdG8gcGVyZm9ybSBsb2dnaW5nCitJbnRlcm5hbEFudFJ1bm5lci5hZGRfYW5faW5zdGFuY2Vfb2ZfY2xhc3NfYXNfYV9wcm9qZWN0X2xpc3RlbmVyXzQxPWFkZCBhbiBpbnN0YW5jZSBvZiBjbGFzcyBhcyBhIHByb2plY3QgbGlzdGVuZXIKK0ludGVybmFsQW50UnVubmVyLnVzZV9naXZlbl9idWlsZGZpbGVfNDM9dXNlIGdpdmVuIGJ1aWxkZmlsZQorSW50ZXJuYWxBbnRSdW5uZXIudXNlX3ZhbHVlX2Zvcl9naXZlbl9wcm9wZXJ0eV80NT11c2UgdmFsdWUgZm9yIGdpdmVuIHByb3BlcnR5CitJbnRlcm5hbEFudFJ1bm5lci5Vc2luZ197MH1fZmlsZV9hc19idWlsZF9sb2cuXzE9VXNpbmcgezB9IGZpbGUgYXMgYnVpbGQgbG9nLgorSW50ZXJuYWxBbnRSdW5uZXIuQ291bGRfbm90X3dyaXRlX3RvX3RoZV9zcGVjaWZpZWRfbG9nX2ZpbGVfX3swfS5fTWFrZV9zdXJlX3RoZV9wYXRoX2V4aXN0c19hbmRfeW91X2hhdmVfd3JpdGVfcGVybWlzc2lvbnMuXzI9Q2Fubm90IHdyaXRlIG9uIHRoZSBzcGVjaWZpZWQgbG9nIGZpbGU6IHswfS4gTWFrZSBzdXJlIHRoZSBwYXRoIGV4aXN0cyBhbmQgeW91IGhhdmUgd3JpdGUgcGVybWlzc2lvbnMuCitJbnRlcm5hbEFudFJ1bm5lci5CVUlMRF9TVUNDRVNTRlVMXzE9QlVJTEQgU1VDQ0VTU0ZVTAorSW50ZXJuYWxBbnRSdW5uZXIuVW5rbm93bl9hcmd1bWVudF9fezB9XzI9VW5rbm93biBhcmd1bWVudDogezB9CitJbnRlcm5hbEFudFJ1bm5lci5CdWlsZGZpbGVfX3swfV9kb2VzX25vdF9leGlzdF8hXzE9QnVpbGRmaWxlOiB7MH0gZG9lcyBub3QgZXhpc3QKK0ludGVybmFsQW50UnVubmVyLnswfV93aGljaF93YXNfc3BlY2lmaWVkX3RvX2JlX2FfYnVpbGRfbGlzdGVuZXJfaXNfbm90X2FuX2luc3RhbmNlX29mX29yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkTGlzdGVuZXIuXzE9ezB9IHdoaWNoIHdhcyBzcGVjaWZpZWQgdG8gYmUgYSBidWlsZCBsaXN0ZW5lciBpcyBub3QgYW4gaW5zdGFuY2Ugb2Ygb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMaXN0ZW5lci4KK0ludGVybmFsQW50UnVubmVyLnswfV93aGljaF93YXNfc3BlY2lmaWVkX3RvX3BlcmZvcm1fbG9nZ2luZ19pc19ub3RfYW5faW5zdGFuY2Vfb2Zfb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMb2dnZXIuXzI9ezB9IHdoaWNoIHdhcyBzcGVjaWZpZWQgdG8gcGVyZm9ybSBsb2dnaW5nIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZExvZ2dlci4KK0ludGVybmFsQW50UnVubmVyLllvdV9tdXN0X3NwZWNpZnlfYV9jbGFzc25hbWVfd2hlbl91c2luZ190aGVfLWxpc3RlbmVyX2FyZ3VtZW50XzE9WW91IG11c3Qgc3BlY2lmeSBhIGNsYXNzbmFtZSB3aGVuIHVzaW5nIHRoZSAtbGlzdGVuZXIgYXJndW1lbnQKK0ludGVybmFsQW50UnVubmVyLllvdV9tdXN0X3NwZWNpZnlfYV9sb2dfZmlsZV93aGVuX3VzaW5nX3RoZV8tbG9nX2FyZ3VtZW50XzM9WW91IG11c3Qgc3BlY2lmeSBhIGxvZyBmaWxlIHdoZW4gdXNpbmcgdGhlIC1sb2cgYXJndW1lbnQKK0ludGVybmFsQW50UnVubmVyLllvdV9tdXN0X3NwZWNpZnlfYV9idWlsZGZpbGVfd2hlbl91c2luZ190aGVfLWJ1aWxkZmlsZV9hcmd1bWVudF80PVlvdSBtdXN0IHNwZWNpZnkgYSBidWlsZGZpbGUgd2hlbiB1c2luZyB0aGUgLWJ1aWxkZmlsZSBhcmd1bWVudAorSW50ZXJuYWxBbnRSdW5uZXIuMTI9cHJpbnQgaW5mb3JtYXRpb24gdGhhdCBtaWdodCBiZSBoZWxwZnVsIHRvCitJbnRlcm5hbEFudFJ1bm5lci4xMz1cdFx0XHRcdFx0XHRcdGRpYWdub3NlIG9yIHJlcG9ydCBwcm9ibGVtcy4KK0ludGVybmFsQW50UnVubmVyLjE5PWxvYWQgYWxsIHByb3BlcnRpZXMgZnJvbSBmaWxlIHdpdGggLUQKK0ludGVybmFsQW50UnVubmVyLjIwPVx0XHRcdFx0XHRcdFx0cHJvcGVydGllcyB0YWtpbmcgcHJlY2VkZW5jZQorSW50ZXJuYWxBbnRSdW5uZXIuMjI9dGhlIGNsYXNzIHdoaWNoIHdpbGwgaGFuZGxlIGlucHV0IHJlcXVlc3RzCitJbnRlcm5hbEFudFJ1bm5lci4xPVx0XHRcdFx0XCcKK0ludGVybmFsQW50UnVubmVyLk9ubHlfb25lX2xvZ2dlcl9jbGFzc19tYXlfYmVfc3BlY2lmaWVkXzE9T25seSBvbmUgbG9nZ2VyIGNsYXNzIG1heSBiZSBzcGVjaWZpZWQKK0ludGVybmFsQW50UnVubmVyLllvdV9tdXN0X3NwZWNpZnlfYV9jbGFzc25hbWVfd2hlbl91c2luZ190aGVfLWlucHV0aGFuZGxlcl9hcmd1bWVudF8xPVlvdSBtdXN0IHNwZWNpZnkgYSBjbGFzc25hbWUgd2hlbiB1c2luZyB0aGUgLWlucHV0aGFuZGxlciBhcmd1bWVudAorSW50ZXJuYWxBbnRSdW5uZXIuT25seV9vbmVfaW5wdXRfaGFuZGxlcl9jbGFzc19tYXlfYmVfc3BlY2lmaWVkLl8yPU9ubHkgb25lIGlucHV0IGhhbmRsZXIgY2xhc3MgbWF5IGJlIHNwZWNpZmllZC4KK0ludGVybmFsQW50UnVubmVyLllvdV9tdXN0X3NwZWNpZnlfYV9wcm9wZXJ0eV9maWxlbmFtZV93aGVuX3VzaW5nX3RoZV8tcHJvcGVydHlmaWxlX2FyZ3VtZW50XzM9WW91IG11c3Qgc3BlY2lmeSBhIHByb3BlcnR5IGZpbGVuYW1lIHdoZW4gdXNpbmcgdGhlIC1wcm9wZXJ0eWZpbGUgYXJndW1lbnQKK0ludGVybmFsQW50UnVubmVyLkNvdWxkX25vdF9sb2FkX3Byb3BlcnR5X2ZpbGVfezB9X197MX1fND1Db3VsZCBub3QgbG9hZCBwcm9wZXJ0eSBmaWxlIHswfTogezF9CitJbnRlcm5hbEFudFJ1bm5lci5UaGVfc3BlY2lmaWVkX2lucHV0X2hhbmRsZXJfY2xhc3NfezB9X2RvZXNfbm90X2ltcGxlbWVudF90aGVfb3JnLmFwYWNoZS50b29scy5hbnQuaW5wdXQuSW5wdXRIYW5kbGVyX2ludGVyZmFjZV81PVRoZSBzcGVjaWZpZWQgaW5wdXQgaGFuZGxlciBjbGFzcyB7MH0gZG9lcyBub3QgaW1wbGVtZW50IHRoZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5pbnB1dC5JbnB1dEhhbmRsZXIgaW50ZXJmYWNlCitJbnRlcm5hbEFudFJ1bm5lci5VbmFibGVfdG9faW5zdGFudGlhdGVfc3BlY2lmaWVkX2lucHV0X2hhbmRsZXJfY2xhc3NfezB9X19fezF9XzY9VW5hYmxlIHRvIGluc3RhbnRpYXRlIHNwZWNpZmllZCBpbnB1dCBoYW5kbGVyIGNsYXNzIHswfSA6IHsxfQorSW50ZXJuYWxBbnRSdW5uZXIuVGhlX2RpYWdub3NpdGljc19vcHRpb25zX2lzX2FuX0FudF8xLjUuKl9mZWF0dXJlLl9QbGVhc2VfdXBkYXRlX3lvdXJfQW50X2NsYXNzcGF0aF90b19pbmNsdWRlX2FuX0FudF92ZXJzaW9uX2dyZWF0ZXJfdGhhbl90aGlzLl80PVRoZSBkaWFnbm9zdGljcyBvcHRpb25zIGlzIGFuIEFudCAxLjUuKiBmZWF0dXJlLiBQbGVhc2UgdXBkYXRlIHlvdXIgQW50IGNsYXNzcGF0aCB0byBpbmNsdWRlIGFuIEFudCB2ZXJzaW9uIGdyZWF0ZXIgdGhhbiB0aGlzLgorSW50ZXJuYWxBbnRSdW5uZXIuU3BlY2lmeWluZ19wcm9wZXJ0eV9maWxlc19pc19hX0FudF8xLjUuKl9mZWF0dXJlLl9QbGVhc2VfdXBkYXRlX3lvdXJfQW50X2NsYXNzcGF0aC5fNj1TcGVjaWZ5aW5nIHByb3BlcnR5IGZpbGVzIGlzIGEgQW50IDEuNS4qIGZlYXR1cmUuIFBsZWFzZSB1cGRhdGUgeW91ciBBbnQgY2xhc3NwYXRoIHRvIGluY2x1ZGUgYW4gQW50IHZlcnNpb24gZ3JlYXRlciB0aGFuIHRoaXMuCitJbnRlcm5hbEFudFJ1bm5lci5BTlRfSE9NRV9tdXN0X2JlX3NldF90b191c2VfQW50X2RpYWdub3N0aWNzXzI9QU5UX0hPTUUgbXVzdCBiZSBzZXQgdG8gdXNlIEFudCBkaWFnbm9zdGljcworSW50ZXJuYWxBbnRSdW5uZXIuQnVpbGRmaWxlX197MH1faXNfbm90X2FfZmlsZV8xPUJ1aWxkZmlsZTogezB9IGlzIG5vdCBhIGZpbGUKK0ludGVybmFsQW50UnVubmVyLi1maW5kX25vdF9zdXBwb3J0ZWQ9LWZpbmQgbm90IHN1cHBvcnRlZC5cbkNhbiBiZSBlbXVsYXRlZCB1c2luZyBSdW4gQXMgPiBBbnQgQnVpbGQgbG9jYXRlZFxuaW4gdGhlIFJ1biA+IEV4dGVybmFsIFRvb2xzIG1lbnUKK0ludGVybmFsQW50UnVubmVyLjE1Nz0tbGliIG5vdCBzdXBwb3J0ZWRcbkNvbmZpZ3VyZSB0aGUgQW50IHJ1bnRpbWUgY2xhc3NwYXRoIHVzaW5nIGVpdGhlciB0aGVcbmdsb2JhbCBBbnQgcnVudGltZSBjbGFzc3BhdGggb3IgdGhlIEFudCBydW50aW1lIGNsYXNzcGF0aFxuIGZvciB0aGlzIHBhcnRpY3VsYXIgYnVpbGQKK0ludGVybmFsQW50UnVubmVyLjE1OD1cdFx0XHRkbyBub3QgYWxsb3cgaW50ZXJhY3RpdmUgaW5wdXQKK0ludGVybmFsQW50UnVubmVyLjE1OT1cdFx0ZXhlY3V0ZSBhbGwgdGFyZ2V0cyB0aGF0IGRvIG5vdCBkZXBlbmQKK0ludGVybmFsQW50UnVubmVyLjE2MD1cdFx0XHRcdFx0XHRvbiBmYWlsZWQgdGFyZ2V0KHMpCitJbnRlcm5hbEFudFJ1bm5lci4xNjE9Q2xhc3MgezB9IG5vdCBmb3VuZCBmb3IgdGFzayB7MX0KK0ludGVybmFsQW50UnVubmVyLjE2Mj1DbGFzcyB7MH0gbm90IGZvdW5kIGZvciB0eXBlIHsxfQorCitSZW1vdGVBbnRCdWlsZExvZ2dlci4xPUJVSUxEIEZBSUxFRAorUmVtb3RlQW50QnVpbGRMb2dnZXIuVG90YWxfdGltZT1Ub3RhbCB0aW1lOiAKK1JlbW90ZUFudEJ1aWxkTG9nZ2VyLl9taW51dGVzXzI9XCBtaW51dGVzCitSZW1vdGVBbnRCdWlsZExvZ2dlci5fbWludXRlXzM9XCBtaW51dGUKK1JlbW90ZUFudEJ1aWxkTG9nZ2VyLl9zZWNvbmRzXzQ9XCBzZWNvbmRzCitSZW1vdGVBbnRCdWlsZExvZ2dlci5fc2Vjb25kXzU9XCBzZWNvbmQKK1JlbW90ZUFudEJ1aWxkTG9nZ2VyLl9taWxsaXNlY29uZHNfNj1cIG1pbGxpc2Vjb25kcwpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvcmVtb3RlL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvcmVtb3RlL2lucHV0aGFuZGxlci9GYWlsSW5wdXRIYW5kbGVyLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9yZW1vdGUvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9yZW1vdGUvaW5wdXRoYW5kbGVyL0ZhaWxJbnB1dEhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzM0MWY0Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvcmVtb3RlL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvcmVtb3RlL2lucHV0aGFuZGxlci9GYWlsSW5wdXRIYW5kbGVyLmphdmEKQEAgLTAsMCArMSwyOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmxhdW5jaGluZy5yZW1vdGUuaW5wdXRoYW5kbGVyOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuaW5wdXQuRGVmYXVsdElucHV0SGFuZGxlcjsKKworcHVibGljIGNsYXNzIEZhaWxJbnB1dEhhbmRsZXIgZXh0ZW5kcyBEZWZhdWx0SW5wdXRIYW5kbGVyIHsKKwkKKwlwcm90ZWN0ZWQgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB7CisJCS8vZW5zdXJlIGFueSBhdHRlbXB0cyB0byByZWFkIGlucHV0IGZhaWwKKwkJcmV0dXJuIG5ldyBJbnB1dFN0cmVhbSgpeworCQkJcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oKTsKKwkJCX0KKwkJfTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9yZW1vdGUvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9yZW1vdGUvbG9nZ2VyL01lc3NhZ2VJZHMuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3JlbW90ZS9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL3JlbW90ZS9sb2dnZXIvTWVzc2FnZUlkcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjMDc0MWEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9yZW1vdGUvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9yZW1vdGUvbG9nZ2VyL01lc3NhZ2VJZHMuamF2YQpAQCAtMCwwICsxLDIxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmxhdW5jaGluZy5yZW1vdGUubG9nZ2VyOworCisKK3B1YmxpYyBjbGFzcyBNZXNzYWdlSWRzIHsKKworCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBST0NFU1NfSUQ9ICAgInByb2Nlc3NJRCI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBCVUlMRF9DQU5DRUxMRUQ9ICJjYW5jZWxsZWQiOyAvLyROT04tTkxTLTEkCisgICAgLy9jb25zdGFudHMgbmVlZCB0byBzdGFydCBncmVhdGVyIHRoYW4gdGhlIFByb2plY3QuTVNHXyogY29uc3RhbnRzCisJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEFTSz0gIjYiOyAvLyROT04tTkxTLTEkCisJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEFSR0VUPSAiNyI7IC8vJE5PTi1OTFMtMSQKK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3JlbW90ZS9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL3JlbW90ZS9sb2dnZXIvUmVtb3RlQW50QnJlYWtwb2ludC5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvcmVtb3RlL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvcmVtb3RlL2xvZ2dlci9SZW1vdGVBbnRCcmVha3BvaW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM3MTUxNgotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3JlbW90ZS9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL3JlbW90ZS9sb2dnZXIvUmVtb3RlQW50QnJlYWtwb2ludC5qYXZhCkBAIC0wLDAgKzEsNzQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwubGF1bmNoaW5nLnJlbW90ZS5sb2dnZXI7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwubGF1bmNoaW5nLmRlYnVnLm1vZGVsLkRlYnVnTWVzc2FnZUlkczsKKworcHVibGljIGNsYXNzIFJlbW90ZUFudEJyZWFrcG9pbnQgeworCQorICAgIHByaXZhdGUgRmlsZSBmRmlsZTsKKwlwcml2YXRlIGludCBmTGluZU51bWJlcjsKKwlwcml2YXRlIFN0cmluZyBmRmlsZU5hbWU7CisJCisJcHVibGljIFJlbW90ZUFudEJyZWFrcG9pbnQoU3RyaW5nIGJyZWFrcG9pbnRSZXByZXNlbnRhdGlvbikgeworCQlTdHJpbmdbXSBkYXRhPSBicmVha3BvaW50UmVwcmVzZW50YXRpb24uc3BsaXQoRGVidWdNZXNzYWdlSWRzLk1FU1NBR0VfREVMSU1JVEVSKTsKKwkJU3RyaW5nIGZpbGVOYW1lPSBkYXRhWzFdOworCQlTdHJpbmcgbGluZU51bWJlcj0gZGF0YVsyXTsKKwkJZkZpbGVOYW1lPSBmaWxlTmFtZTsKKwkJZkZpbGU9IG5ldyBGaWxlKGZpbGVOYW1lKTsKKwkJZkxpbmVOdW1iZXI9IEludGVnZXIucGFyc2VJbnQobGluZU51bWJlcik7CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNBdChTdHJpbmcgZmlsZU5hbWUsIGludCBsaW5lTnVtYmVyKSB7CisJCXJldHVybiBmTGluZU51bWJlciA9PSBsaW5lTnVtYmVyICYmIGZpbGVOYW1lICE9IG51bGwgJiYgZkZpbGUuZXF1YWxzKG5ldyBGaWxlKGZpbGVOYW1lKSk7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgdG9NYXJzaGFsbFN0cmluZygpIHsKKwkJU3RyaW5nQnVmZmVyIGJ1ZmZlcj0gbmV3IFN0cmluZ0J1ZmZlcihEZWJ1Z01lc3NhZ2VJZHMuQlJFQUtQT0lOVCk7CisJCWJ1ZmZlci5hcHBlbmQoRGVidWdNZXNzYWdlSWRzLk1FU1NBR0VfREVMSU1JVEVSKTsKKwkJYnVmZmVyLmFwcGVuZChmRmlsZU5hbWUpOworCQlidWZmZXIuYXBwZW5kKERlYnVnTWVzc2FnZUlkcy5NRVNTQUdFX0RFTElNSVRFUik7CisJCWJ1ZmZlci5hcHBlbmQoZkxpbmVOdW1iZXIpOworCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CisJfQorCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisJICovCisJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKwkJaWYgKCEob2JqIGluc3RhbmNlb2YgUmVtb3RlQW50QnJlYWtwb2ludCkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlSZW1vdGVBbnRCcmVha3BvaW50IG90aGVyPSAoUmVtb3RlQW50QnJlYWtwb2ludCkgb2JqOworCQlyZXR1cm4gb3RoZXIuZ2V0TGluZU51bWJlcigpID09IGZMaW5lTnVtYmVyICYmIG90aGVyLmdldEZpbGUoKS5lcXVhbHMoZkZpbGUpOworCX0KKwkKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2hhc2hDb2RlKCkKKwkgKi8KKwlwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworCQlyZXR1cm4gZkZpbGVOYW1lLmhhc2hDb2RlKCkgKyBmTGluZU51bWJlcjsKKwl9CisJCisJcHVibGljIGludCBnZXRMaW5lTnVtYmVyKCkgeworCQlyZXR1cm4gZkxpbmVOdW1iZXI7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRGaWxlTmFtZSgpIHsKKwkJcmV0dXJuIGZGaWxlTmFtZTsKKwl9CisJCisJcHVibGljIEZpbGUgZ2V0RmlsZSgpIHsKKwkgICAgcmV0dXJuIGZGaWxlOworCX0KK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL0FudENvcmVNb2RlbE1lc3NhZ2VzLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9BbnRDb3JlTW9kZWxNZXNzYWdlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhNzhlNzQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9BbnRDb3JlTW9kZWxNZXNzYWdlcy5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKKyAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKKyAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcworICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczogCisgKiBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwubGF1bmNoaW5nOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKKworcHVibGljIGNsYXNzIEFudENvcmVNb2RlbE1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuYW50LmludGVybmFsLmxhdW5jaGluZy5sYXVuY2hDb25maWd1cmF0aW9ucy5BbnRDb3JlTW9kZWxNZXNzYWdlcyI7Ly8kTk9OLU5MUy0xJAorCQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudFV0aWxfNjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRVdGlsXzc7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQW50VXRpbF8yOworCisJc3RhdGljIHsKKwkJLy8gbG9hZCBtZXNzYWdlIHZhbHVlcyBmcm9tIGJ1bmRsZSBmaWxlCisJCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEFudENvcmVNb2RlbE1lc3NhZ2VzLmNsYXNzKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvQW50Q29yZU1vZGVsTWVzc2FnZXMucHJvcGVydGllcyBiL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL0FudENvcmVNb2RlbE1lc3NhZ2VzLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJhZDU0ZgotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL0FudENvcmVNb2RlbE1lc3NhZ2VzLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxNCBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisjIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjCisjIENvbnRyaWJ1dG9yczoKKyMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitBbnRVdGlsXzY9SW52YWxpZCBwcm9wZXJ0eSBmaWxlIGVudHJ5OiB7MH0KK0FudFV0aWxfNz1VbmFibGUgdG8gZ2VuZXJhdGUgQW50IGNsYXNzcGF0aAorQW50VXRpbF8yPUVycm9yIHJlYWRpbmcgbGF1bmNoIGNvbmZpZ3VyYXRpb24KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL0FudExhdW5jaC5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvQW50TGF1bmNoLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFjNDE0MwotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL0FudExhdW5jaC5qYXZhCkBAIC0wLDAgKzEsNTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwubGF1bmNoaW5nOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5MYXVuY2g7CitpbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JU291cmNlTG9jYXRvcjsKKworLyoqCisgKiBTdG9yZXMgbGluayBkZXNjcmlwdG9ycyBmb3IgTGF1bmNoIGZvciBmdXJ0aGVyIHVzZSBvZiBUYXNrTGlua01hbmFnZXIKKyAqLworcHVibGljIGNsYXNzIEFudExhdW5jaCBleHRlbmRzIExhdW5jaCB7CisJTGlzdCBsaW5rRGVzY3JpcHRvcnM7CisKKwlwdWJsaWMgQW50TGF1bmNoKElMYXVuY2hDb25maWd1cmF0aW9uIGxhdW5jaENvbmZpZ3VyYXRpb24sIFN0cmluZyBtb2RlLCBJU291cmNlTG9jYXRvciBsb2NhdG9yKSB7CisJCXN1cGVyKGxhdW5jaENvbmZpZ3VyYXRpb24sIG1vZGUsIGxvY2F0b3IpOworCQlsaW5rRGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0KCk7CisJfQorCisJcHVibGljIHZvaWQgYWRkTGlua0Rlc2NyaXB0b3IoU3RyaW5nIGxpbmUsIFN0cmluZyBmaWxlTmFtZSwgaW50IGxpbmVOdW1iZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKKwkJaWYgKGZpbGVOYW1lIT0gbnVsbCAmJiBmaWxlTmFtZS50cmltKCkubGVuZ3RoKCkgPiAwKSB7CisJCQlzeW5jaHJvbml6ZWQgKGxpbmtEZXNjcmlwdG9ycykgeworCQkJCWxpbmtEZXNjcmlwdG9ycy5hZGQobmV3IExpbmtEZXNjcmlwdG9yKGxpbmUsIGZpbGVOYW1lLCBsaW5lTnVtYmVyLCBvZmZzZXQsIGxlbmd0aCkpOworCQkJfQorCQl9CisJfQorCisJcHVibGljIHZvaWQgcmVtb3ZlTGlua0Rlc2NyaXB0b3IoTGlua0Rlc2NyaXB0b3IgbGQpIHsKKwkJc3luY2hyb25pemVkIChsaW5rRGVzY3JpcHRvcnMpIHsKKwkJCWxpbmtEZXNjcmlwdG9ycy5yZW1vdmUobGQpOworCQl9CisJfQorCisJcHVibGljIExpc3QgZ2V0TGlua0Rlc2NyaXB0b3JzKCkgeworCQlzeW5jaHJvbml6ZWQgKGxpbmtEZXNjcmlwdG9ycykgeworCQkJcmV0dXJuIG5ldyBBcnJheUxpc3QobGlua0Rlc2NyaXB0b3JzKTsKKwkJfQorCX0KKworCXB1YmxpYyB2b2lkIGNsZWFyTGlua0Rlc2NyaXB0b3JzKCkgeworCQlzeW5jaHJvbml6ZWQgKGxpbmtEZXNjcmlwdG9ycykgeworCQkJbGlua0Rlc2NyaXB0b3JzLmNsZWFyKCk7CisJCX0KKwl9CisKK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL0FudExhdW5jaGluZ1ByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvQW50TGF1bmNoaW5nUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRkNTk2NAotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL0FudExhdW5jaGluZ1ByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmxhdW5jaGluZzsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuRGVmYXVsdFNjb3BlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JRWNsaXBzZVByZWZlcmVuY2VzOworCitwdWJsaWMgY2xhc3MgQW50TGF1bmNoaW5nUHJlZmVyZW5jZUluaXRpYWxpemVyIGV4dGVuZHMKKwkJQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgeworCisJcHVibGljIEFudExhdW5jaGluZ1ByZWZlcmVuY2VJbml0aWFsaXplcigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2Vlb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyIworCSAqIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKQorCSAqLworCXB1YmxpYyB2b2lkIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKSB7CisKKwkJSUVjbGlwc2VQcmVmZXJlbmNlcyBub2RlID0gbmV3IERlZmF1bHRTY29wZSgpCisJCQkJLmdldE5vZGUoQW50TGF1bmNoaW5nLmdldFVuaXF1ZUlkZW50aWZpZXIoKSk7CisJCW5vZGUucHV0KElBbnRMYXVuY2hpbmdQcmVmZXJlbmNlQ29uc3RhbnRzLkFOVF9DT01NVU5JQ0FUSU9OX1RJTUVPVVQsCisJCQkJIjIwMDAwIik7IC8vJE5PTi1OTFMtMSQKKwl9Cit9CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9JQW50TGF1bmNoaW5nUHJlZmVyZW5jZUNvbnN0YW50cy5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvSUFudExhdW5jaGluZ1ByZWZlcmVuY2VDb25zdGFudHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWNkNTgxCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvSUFudExhdW5jaGluZ1ByZWZlcmVuY2VDb25zdGFudHMuamF2YQpAQCAtMCwwICsxLDIzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5sYXVuY2hpbmc7CisKKy8qKgorICogQ29uc3RhbnRzIHVzZWQgdG8gaWRlbnRpZnkgdXNlciBwcmVmZXJlbmNlcy4KKyAqLworcHVibGljIGludGVyZmFjZSBJQW50TGF1bmNoaW5nUHJlZmVyZW5jZUNvbnN0YW50cyB7CisKKwkgLyoqCisgICAgICogaW50IHByZWZlcmVuY2UgaWRlbnRpZmllciBjb25zdGFudCB3aGljaCBzcGVjaWZpZXMgdGhlIGxlbmd0aCBvZiB0aW1lIHRvIHdhaXQKKyAgICAgKiB0byBjb25uZWN0IHdpdGggdGhlIHNvY2tldCB0aGF0IGNvbW11bmljYXRlcyB3aXRoIHRoZSBzZXBhcmF0ZSBKUkUgdG8gY2FwdHVyZSB0aGUgb3V0cHV0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU5UX0NPTU1VTklDQVRJT05fVElNRU9VVD0gInRpbWVvdXQiOyAvLyROT04tTkxTLTEkCit9CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9MaW5rRGVzY3JpcHRvci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvTGlua0Rlc2NyaXB0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWJhMjA2Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvTGlua0Rlc2NyaXB0b3IuamF2YQpAQCAtMCwwICsxLDczIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmxhdW5jaGluZzsKKworLyoqCisgKiBTdG9yZXMgZGV0YWlsZWQgZGF0YSBvZiBMaW5rLiBVc2VkIHRvIGNyZWF0ZSBsaW5rZWQgbWVzc2FnZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBMaW5rRGVzY3JpcHRvciB7CisJU3RyaW5nIGxpbmU7CisJU3RyaW5nIGZpbGVOYW1lOworCWludCBsaW5lTnVtYmVyOworCWludCBvZmZzZXQ7CisJaW50IGxlbmd0aDsKKworCXB1YmxpYyBMaW5rRGVzY3JpcHRvcihTdHJpbmcgbGluZSwgU3RyaW5nIGZpbGVOYW1lLCBpbnQgbGluZU51bWJlciwKKwkJCWludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5saW5lID0gbGluZTsKKwkJdGhpcy5maWxlTmFtZSA9IGZpbGVOYW1lOworCQl0aGlzLmxpbmVOdW1iZXIgPSBsaW5lTnVtYmVyOworCQl0aGlzLm9mZnNldCA9IG9mZnNldDsKKwkJdGhpcy5sZW5ndGggPSBsZW5ndGg7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRMaW5lKCkgeworCQlyZXR1cm4gbGluZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRMaW5lKFN0cmluZyBsaW5lKSB7CisJCXRoaXMubGluZSA9IGxpbmU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRGaWxlTmFtZSgpIHsKKwkJcmV0dXJuIGZpbGVOYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldEZpbGVOYW1lKFN0cmluZyBmaWxlTmFtZSkgeworCQl0aGlzLmZpbGVOYW1lID0gZmlsZU5hbWU7CisJfQorCisJcHVibGljIGludCBnZXRMaW5lTnVtYmVyKCkgeworCQlyZXR1cm4gbGluZU51bWJlcjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRMaW5lTnVtYmVyKGludCBsaW5lTnVtYmVyKSB7CisJCXRoaXMubGluZU51bWJlciA9IGxpbmVOdW1iZXI7CisJfQorCisJcHVibGljIGludCBnZXRPZmZzZXQoKSB7CisJCXJldHVybiBvZmZzZXQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0T2Zmc2V0KGludCBvZmZzZXQpIHsKKwkJdGhpcy5vZmZzZXQgPSBvZmZzZXQ7CisJfQorCisJcHVibGljIGludCBnZXRMZW5ndGgoKSB7CisJCXJldHVybiBsZW5ndGg7CisJfQorCisJcHVibGljIHZvaWQgc2V0TGVuZ3RoKGludCBsZW5ndGgpIHsKKwkJdGhpcy5sZW5ndGggPSBsZW5ndGg7CisJfQorCit9CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9kZWJ1Zy9BbnREZWJ1Z01lc3NhZ2VzLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9kZWJ1Zy9BbnREZWJ1Z01lc3NhZ2VzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk2YzFjNAotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL2RlYnVnL0FudERlYnVnTWVzc2FnZXMuamF2YQpAQCAtMCwwICsxLDIzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCisgKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKKyAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6IAorICogSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmxhdW5jaGluZy5kZWJ1ZzsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CisKK3B1YmxpYyBjbGFzcyBBbnREZWJ1Z01lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuYW50LmludGVybmFsLmxhdW5jaGluZy5kZWJ1Zy5BbnREZWJ1Z01lc3NhZ2VzIjsvLyROT04tTkxTLTEkCisgICAgCisJcHVibGljIHN0YXRpYyBTdHJpbmcgQW50U291cmNlQ29udGFpbmVyXzA7CisKKwlzdGF0aWMgeworCQkvLyBsb2FkIG1lc3NhZ2UgdmFsdWVzIGZyb20gYnVuZGxlIGZpbGUKKwkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgQW50RGVidWdNZXNzYWdlcy5jbGFzcyk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL2RlYnVnL0FudERlYnVnTWVzc2FnZXMucHJvcGVydGllcyBiL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL2RlYnVnL0FudERlYnVnTWVzc2FnZXMucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGMxMWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvZGVidWcvQW50RGVidWdNZXNzYWdlcy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTIgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisjIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorIworIyBDb250cmlidXRvcnM6CisjICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworQW50U291cmNlQ29udGFpbmVyXzA9QW50IFNvdXJjZSBDb250YWluZXIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9kZWJ1Zy9BbnRTb3VyY2VDb250YWluZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL2RlYnVnL0FudFNvdXJjZUNvbnRhaW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3OWI2NmYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9kZWJ1Zy9BbnRTb3VyY2VDb250YWluZXIuamF2YQpAQCAtMCwwICsxLDczIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmxhdW5jaGluZy5kZWJ1ZzsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuc291cmNlbG9va3VwLklTb3VyY2VDb250YWluZXJUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuc291cmNlbG9va3VwLmNvbnRhaW5lcnMuQWJzdHJhY3RTb3VyY2VDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5zb3VyY2Vsb29rdXAuY29udGFpbmVycy5Mb2NhbEZpbGVTdG9yYWdlOworCitwdWJsaWMgY2xhc3MgQW50U291cmNlQ29udGFpbmVyIGV4dGVuZHMgQWJzdHJhY3RTb3VyY2VDb250YWluZXIgeworCisJcHJpdmF0ZSBJV29ya3NwYWNlUm9vdCBmUm9vdDsKKworCXB1YmxpYyBBbnRTb3VyY2VDb250YWluZXIoKSB7CisJCWZSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLnNvdXJjZWxvb2t1cC5JU291cmNlQ29udGFpbmVyI2ZpbmRTb3VyY2VFbGVtZW50cyhqYXZhLmxhbmcuU3RyaW5nKQorCSAqLworCXB1YmxpYyBPYmplY3RbXSBmaW5kU291cmNlRWxlbWVudHMoU3RyaW5nIHBhdGgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJQXJyYXlMaXN0IHNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisJCUZpbGUgb3NGaWxlID0gbmV3IEZpbGUocGF0aCk7CisJCWlmIChvc0ZpbGUuZXhpc3RzKCkpIHsKKwkJCXRyeSB7CisJCQkJSVBhdGggY2Fub25pY2FsUGF0aCA9IG5ldyBQYXRoKG9zRmlsZS5nZXRDYW5vbmljYWxQYXRoKCkpOworCQkJCUlGaWxlW10gZmlsZXMgPSBmUm9vdC5maW5kRmlsZXNGb3JMb2NhdGlvbihjYW5vbmljYWxQYXRoKTsKKwkJCQlpZiAoZmlsZXMubGVuZ3RoID4gMCkgeworCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7CisJCQkJCQlzb3VyY2VzLmFkZChmaWxlc1tpXSk7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlzb3VyY2VzLmFkZChuZXcgTG9jYWxGaWxlU3RvcmFnZShvc0ZpbGUpKTsKKwkJCQl9CisJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQl9CisJCX0KKwkJcmV0dXJuIHNvdXJjZXMudG9BcnJheSgpOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuc291cmNlbG9va3VwLklTb3VyY2VDb250YWluZXIjZ2V0TmFtZSgpCisJICovCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gQW50RGVidWdNZXNzYWdlcy5BbnRTb3VyY2VDb250YWluZXJfMDsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLnNvdXJjZWxvb2t1cC5JU291cmNlQ29udGFpbmVyI2dldFR5cGUoKQorICAgICAqIE5vdCBwZXJzaXN0ZWQgdmlhIHRoZSBsYXVuY2ggY29uZmlndXJhdGlvbgorCSAqLworCXB1YmxpYyBJU291cmNlQ29udGFpbmVyVHlwZSBnZXRUeXBlKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvZGVidWcvQW50U291cmNlTG9va3VwRGlyZWN0b3IuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL2RlYnVnL0FudFNvdXJjZUxvb2t1cERpcmVjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBkZTNkZAotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL2RlYnVnL0FudFNvdXJjZUxvb2t1cERpcmVjdG9yLmphdmEKQEAgLTAsMCArMSwzNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwubGF1bmNoaW5nLmRlYnVnOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5zb3VyY2Vsb29rdXAuQWJzdHJhY3RTb3VyY2VMb29rdXBEaXJlY3RvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLnNvdXJjZWxvb2t1cC5JU291cmNlTG9va3VwUGFydGljaXBhbnQ7CisKKy8qKgorICogQW50IHNvdXJjZSBsb29rdXAgZGlyZWN0b3IuIEZvciBBbnQgc291cmNlIGxvb2t1cCB0aGVyZSBpcyBvbmUgc291cmNlCisgKiBsb29rdXAgcGFydGljaXBhbnQuIAorICovCitwdWJsaWMgY2xhc3MgQW50U291cmNlTG9va3VwRGlyZWN0b3IgZXh0ZW5kcyBBYnN0cmFjdFNvdXJjZUxvb2t1cERpcmVjdG9yIHsKKwkKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLnNvdXJjZWxvb2t1cC5JU291cmNlTG9va3VwRGlyZWN0b3IjaW5pdGlhbGl6ZVBhcnRpY2lwYW50cygpCisJICovCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhcnRpY2lwYW50cygpIHsKKwkJYWRkUGFydGljaXBhbnRzKG5ldyBJU291cmNlTG9va3VwUGFydGljaXBhbnRbXXtuZXcgQW50U291cmNlTG9va3VwUGFydGljaXBhbnQoKX0pOworCX0KKworICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVBlcnNpc3RhYmxlU291cmNlTG9jYXRvciNnZXRNZW1lbnRvKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE1lbWVudG8oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9kZWJ1Zy9BbnRTb3VyY2VMb29rdXBQYXJ0aWNpcGFudC5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvZGVidWcvQW50U291cmNlTG9va3VwUGFydGljaXBhbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2UwNDA5Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvZGVidWcvQW50U291cmNlTG9va3VwUGFydGljaXBhbnQuamF2YQpAQCAtMCwwICsxLDM2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5sYXVuY2hpbmcuZGVidWc7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwubGF1bmNoaW5nLmRlYnVnLm1vZGVsLkFudFN0YWNrRnJhbWU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5zb3VyY2Vsb29rdXAuQWJzdHJhY3RTb3VyY2VMb29rdXBQYXJ0aWNpcGFudDsKKworLyoqCisgKiBUaGUgQW50IHNvdXJjZSBsb29rdXAgcGFydGljaXBhbnQga25vd3MgaG93IHRvIHRyYW5zbGF0ZSBhIAorICogQW50IHN0YWNrIGZyYW1lIGludG8gYSBzb3VyY2UgZmlsZSBuYW1lIAorICovCitwdWJsaWMgY2xhc3MgQW50U291cmNlTG9va3VwUGFydGljaXBhbnQgZXh0ZW5kcyBBYnN0cmFjdFNvdXJjZUxvb2t1cFBhcnRpY2lwYW50IHsKKwkKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLnNvdXJjZWxvb2t1cC5JU291cmNlTG9va3VwUGFydGljaXBhbnQjZ2V0U291cmNlTmFtZShqYXZhLmxhbmcuT2JqZWN0KQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0U291cmNlTmFtZShPYmplY3Qgb2JqZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBBbnRTdGFja0ZyYW1lKSB7CisJCQlyZXR1cm4gKChBbnRTdGFja0ZyYW1lKW9iamVjdCkuZ2V0RmlsZVBhdGgoKTsKKwkJfQorICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgU3RyaW5nKSB7CisgICAgICAgICAgICAvLyBhc3N1bWUgaXQncyBhIGZpbGUgbmFtZQorICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpb2JqZWN0OworICAgICAgICB9CisJCXJldHVybiBudWxsOworCX0KK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL2RlYnVnL0FudFNvdXJjZVBhdGhDb21wdXRlckRlbGVnYXRlLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9kZWJ1Zy9BbnRTb3VyY2VQYXRoQ29tcHV0ZXJEZWxlZ2F0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3ZTIxNmYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9kZWJ1Zy9BbnRTb3VyY2VQYXRoQ29tcHV0ZXJEZWxlZ2F0ZS5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmxhdW5jaGluZy5kZWJ1ZzsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5zb3VyY2Vsb29rdXAuSVNvdXJjZUNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLnNvdXJjZWxvb2t1cC5JU291cmNlUGF0aENvbXB1dGVyRGVsZWdhdGU7CisKKy8qKgorICogQ29tcHV0ZXMgdGhlIGRlZmF1bHQgc291cmNlIGxvb2t1cCBwYXRoIGZvciBhbiBBbnQgbGF1bmNoIGNvbmZpZ3VyYXRpb24uCisgKiBUaGUgZGVmYXVsdCBzb3VyY2UgbG9va3VwIGlzIGEgY29udGFpbmVyIHRoYXQga25vd3MgaG93IHRvIG1hcCB0aGUgCisgKiBmdWxseSBxdWFsaWZpZWQgZmlsZSBzeXN0ZW0gcGF0aHMgdG8gZWl0aGVyIHRoZSA8Y29kZT5JRmlsZTwvY29kZT4gd2l0aGluIHRoZSB3b3Jrc3BhY2Ugb3IKKyAqIGEgPGNvZGU+TG9jYWxGaWxlU3RvcmFnZTwvY29kZT4gZm9yIGJ1aWxkZmlsZXMgbm90IGluIHRoZSB3b3Jrc3BhY2UuCisgKi8KK3B1YmxpYyBjbGFzcyBBbnRTb3VyY2VQYXRoQ29tcHV0ZXJEZWxlZ2F0ZSBpbXBsZW1lbnRzIElTb3VyY2VQYXRoQ29tcHV0ZXJEZWxlZ2F0ZSB7CisJCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5zb3VyY2Vsb29rdXAuSVNvdXJjZVBhdGhDb21wdXRlckRlbGVnYXRlI2NvbXB1dGVTb3VyY2VDb250YWluZXJzKG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb24sIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQorCSAqLworCXB1YmxpYyBJU291cmNlQ29udGFpbmVyW10gY29tcHV0ZVNvdXJjZUNvbnRhaW5lcnMoSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCXJldHVybiBuZXcgSVNvdXJjZUNvbnRhaW5lcltdIHtuZXcgQW50U291cmNlQ29udGFpbmVyKCl9OworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9kZWJ1Zy9JQW50RGVidWdDb25zdGFudHMuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL2RlYnVnL0lBbnREZWJ1Z0NvbnN0YW50cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1M2UxMjEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9kZWJ1Zy9JQW50RGVidWdDb25zdGFudHMuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmxhdW5jaGluZy5kZWJ1ZzsKKworcHVibGljIGludGVyZmFjZSBJQW50RGVidWdDb25zdGFudHMgeworCQorCS8qKgorCSAqIFVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgQW50IGRlYnVnIG1vZGVsICh2YWx1ZSAKKwkgKiA8Y29kZT5vcmcuZWNsaXBzZS5hbnQudWkuZGVidWc8L2NvZGU+KS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9BTlRfREVCVUdfTU9ERUwgPSAib3JnLmVjbGlwc2UuYW50LnVpLmRlYnVnIjsgLy8kTk9OLU5MUy0xJAorCQorCS8qKgorCSAqIFVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgQW50IGxpbmUgYnJlYWtwb2ludCBtYXJrZXJzIAorCSAqICh2YWx1ZSA8Y29kZT5vcmcuZWNsaXBzZS5hbnQudWkuYW50TGluZUJyZWFrcG9pbnRNYXJrZXI8L2NvZGU+KS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9BTlRfTElORV9CUkVBS1BPSU5UX01BUktFUj0gIm9yZy5lY2xpcHNlLmFudC51aS5hbnRMaW5lQnJlYWtwb2ludE1hcmtlciI7IC8vJE5PTi1OTFMtMSQKKyAgICAKKyAgICAvKioKKyAgICAgKiBVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIEFudCBydW4gdG8gbGluZSBicmVha3BvaW50cyAKKyAgICAgKiAodmFsdWUgPGNvZGU+b3JnLmVjbGlwc2UuYW50LnVpLnJ1blRvTGluZUJyZWFrcG9pbnQ8L2NvZGU+KS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTlRfUlVOX1RPX0xJTkU9ICJvcmcuZWNsaXBzZS5hbnQudWkucnVuVG9MaW5lQnJlYWtwb2ludCI7IC8vJE5PTi1OTFMtMSQKK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL2RlYnVnL21vZGVsL0FudERlYnVnRWxlbWVudC5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvZGVidWcvbW9kZWwvQW50RGVidWdFbGVtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdhOTUyOAotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL2RlYnVnL21vZGVsL0FudERlYnVnRWxlbWVudC5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwubGF1bmNoaW5nLmRlYnVnLm1vZGVsOworCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwubGF1bmNoaW5nLkFudExhdW5jaGluZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwubGF1bmNoaW5nLmRlYnVnLklBbnREZWJ1Z0NvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5EZWJ1Z0VsZW1lbnQ7CisKKy8qKgorICogQ29tbW9uIGZ1bmN0aW9uIG9mIEFudCBkZWJ1ZyBtb2RlbCBlbGVtZW50cworICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQW50RGVidWdFbGVtZW50IGV4dGVuZHMgRGVidWdFbGVtZW50IHsKKwkKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGEgbmV3IGRlYnVnIGVsZW1lbnQgY29udGFpbmVkIGluIHRoZSBnaXZlbgorCSAqIGRlYnVnIHRhcmdldC4KKwkgKiAKKwkgKiBAcGFyYW0gdGFyZ2V0IGRlYnVnIHRhcmdldAorCSAqLworCXB1YmxpYyBBbnREZWJ1Z0VsZW1lbnQoQW50RGVidWdUYXJnZXQgdGFyZ2V0KSB7CisJCXN1cGVyKHRhcmdldCk7CisJfQorCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSURlYnVnRWxlbWVudCNnZXRNb2RlbElkZW50aWZpZXIoKQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TW9kZWxJZGVudGlmaWVyKCkgeworCQlyZXR1cm4gSUFudERlYnVnQ29uc3RhbnRzLklEX0FOVF9ERUJVR19NT0RFTDsKKwl9CisgICAgCisJLyoqCisgICAgICogVGhyb3dzIGEgZGVidWcgZXhjZXB0aW9uIHdpdGggdGhlIGdpdmVuIG1lc3NhZ2UsIGVycm9yIGNvZGUsIGFuZCB1bmRlcmx5aW5nCisgICAgICogZXhjZXB0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHRocm93RGVidWdFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBEZWJ1Z0V4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFudExhdW5jaGluZy5nZXRVbmlxdWVJZGVudGlmaWVyKCksCisgICAgICAgICAgICBEZWJ1Z0V4Y2VwdGlvbi5UQVJHRVRfUkVRVUVTVF9GQUlMRUQsIG1lc3NhZ2UsIG51bGwpKTsKKyAgICB9CisgICAgCisgICAgcHJvdGVjdGVkIEFudERlYnVnVGFyZ2V0IGdldEFudERlYnVnVGFyZ2V0KCkgeworICAgICAgICByZXR1cm4gKEFudERlYnVnVGFyZ2V0KXN1cGVyLmdldERlYnVnVGFyZ2V0KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvZGVidWcvbW9kZWwvQW50TGluZUJyZWFrcG9pbnQuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL2RlYnVnL21vZGVsL0FudExpbmVCcmVha3BvaW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE5NmI1YgotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL2RlYnVnL21vZGVsL0FudExpbmVCcmVha3BvaW50LmphdmEKQEAgLTAsMCArMSwxMTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwubGF1bmNoaW5nLmRlYnVnLm1vZGVsOworCitpbXBvcnQgY29tLmlibS5pY3UudGV4dC5NZXNzYWdlRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwubGF1bmNoaW5nLmRlYnVnLklBbnREZWJ1Z0NvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSUJyZWFrcG9pbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5MaW5lQnJlYWtwb2ludDsKKworLyoqCisgKiBBbnQgbGluZSBicmVha3BvaW50CisgKi8KK3B1YmxpYyBjbGFzcyBBbnRMaW5lQnJlYWtwb2ludCBleHRlbmRzIExpbmVCcmVha3BvaW50IHsKKwkKKwkvKioKKwkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yIGlzIHJlcXVpcmVkIGZvciB0aGUgYnJlYWtwb2ludCBtYW5hZ2VyCisJICogdG8gcmUtY3JlYXRlIHBlcnNpc3RlZCBicmVha3BvaW50cy4gQWZ0ZXIgaW5zdGFudGlhdGluZyBhIGJyZWFrcG9pbnQsCisJICogdGhlIDxjb2RlPnNldE1hcmtlciguLi4pPC9jb2RlPiBtZXRob2QgaXMgY2FsbGVkIHRvIHJlc3RvcmUKKwkgKiB0aGlzIGJyZWFrcG9pbnQncyBhdHRyaWJ1dGVzLgorCSAqLworCXB1YmxpYyBBbnRMaW5lQnJlYWtwb2ludCgpIHsKKwl9CisJCisJLyoqCisJICogQ29uc3RydWN0cyBhIGxpbmUgYnJlYWtwb2ludCBvbiB0aGUgZ2l2ZW4gcmVzb3VyY2UgYXQgdGhlIGdpdmVuCisJICogbGluZSBudW1iZXIuIFRoZSBsaW5lIG51bWJlciBpcyAxLWJhc2VkIChpLmUuIHRoZSBmaXJzdCBsaW5lIG9mIGEKKwkgKiBmaWxlIGlzIGxpbmUgbnVtYmVyIDEpLgorCSAqIAorCSAqIEBwYXJhbSByZXNvdXJjZSBmaWxlIG9uIHdoaWNoIHRvIHNldCB0aGUgYnJlYWtwb2ludAorCSAqIEBwYXJhbSBsaW5lTnVtYmVyIDEtYmFzZWQgbGluZSBudW1iZXIgb2YgdGhlIGJyZWFrcG9pbnQKKwkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgdW5hYmxlIHRvIGNyZWF0ZSB0aGUgYnJlYWtwb2ludAorCSAqLworCXB1YmxpYyBBbnRMaW5lQnJlYWtwb2ludChJUmVzb3VyY2UgcmVzb3VyY2UsIGludCBsaW5lTnVtYmVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJICAgIHRoaXMocmVzb3VyY2UsIGxpbmVOdW1iZXIsIG5ldyBIYXNoTWFwKCksIHRydWUpOworCX0KKwkKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGEgbGluZSBicmVha3BvaW50IG9uIHRoZSBnaXZlbiByZXNvdXJjZSBhdCB0aGUgZ2l2ZW4KKwkgKiBsaW5lIG51bWJlci4gVGhlIGxpbmUgbnVtYmVyIGlzIDEtYmFzZWQgKGkuZS4gdGhlIGZpcnN0IGxpbmUgb2YgYQorCSAqIGZpbGUgaXMgbGluZSBudW1iZXIgMSkuCisJICogCisJICogQHBhcmFtIHJlc291cmNlIGZpbGUgb24gd2hpY2ggdG8gc2V0IHRoZSBicmVha3BvaW50CisJICogQHBhcmFtIGxpbmVOdW1iZXIgMS1iYXNlZCBsaW5lIG51bWJlciBvZiB0aGUgYnJlYWtwb2ludAorCSAqIEBwYXJhbSBhdHRyaWJ1dGVzIHRoZSBtYXJrZXIgYXR0cmlidXRlcyB0byBzZXQKKwkgKiBAcGFyYW0gcmVnaXN0ZXIgd2hldGhlciB0byBhZGQgdGhpcyBicmVha3BvaW50IHRvIHRoZSBicmVha3BvaW50IG1hbmFnZXIKKwkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgdW5hYmxlIHRvIGNyZWF0ZSB0aGUgYnJlYWtwb2ludAorCSAqLworCXB1YmxpYyBBbnRMaW5lQnJlYWtwb2ludChmaW5hbCBJUmVzb3VyY2UgcmVzb3VyY2UsIGZpbmFsIGludCBsaW5lTnVtYmVyLCBmaW5hbCBNYXAgYXR0cmlidXRlcywgZmluYWwgYm9vbGVhbiByZWdpc3RlcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCSAgICBJV29ya3NwYWNlUnVubmFibGUgd3I9IG5ldyBJV29ya3NwYWNlUnVubmFibGUoKSB7CisJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCQkgICAgSU1hcmtlciBtYXJrZXIgPSByZXNvdXJjZS5jcmVhdGVNYXJrZXIoSUFudERlYnVnQ29uc3RhbnRzLklEX0FOVF9MSU5FX0JSRUFLUE9JTlRfTUFSS0VSKTsKKwkJCSAgICBzZXRNYXJrZXIobWFya2VyKTsKKwkJCSAgICBhdHRyaWJ1dGVzLnB1dChJQnJlYWtwb2ludC5FTkFCTEVELCBCb29sZWFuLlRSVUUpOworCQkJICAgIGF0dHJpYnV0ZXMucHV0KElNYXJrZXIuTElORV9OVU1CRVIsIG5ldyBJbnRlZ2VyKGxpbmVOdW1iZXIpKTsKKwkJCSAgICBhdHRyaWJ1dGVzLnB1dChJQnJlYWtwb2ludC5JRCwgSUFudERlYnVnQ29uc3RhbnRzLklEX0FOVF9ERUJVR19NT0RFTCk7CisgICAgICAgICAgICAgICAgYXR0cmlidXRlcy5wdXQoSU1hcmtlci5NRVNTQUdFLCBNZXNzYWdlRm9ybWF0LmZvcm1hdChEZWJ1Z01vZGVsTWVzc2FnZXMuQW50TGluZUJyZWFrcG9pbnRfMCwgbmV3IFN0cmluZ1tdIHtJbnRlZ2VyLnRvU3RyaW5nKGxpbmVOdW1iZXIpfSkpOworCQkJICAgIGVuc3VyZU1hcmtlcigpLnNldEF0dHJpYnV0ZXMoYXR0cmlidXRlcyk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgcmVnaXN0ZXIocmVnaXN0ZXIpOworCQkJfQorCSAgICB9OworCSAgICBydW4oZ2V0TWFya2VyUnVsZShyZXNvdXJjZSksIHdyKTsKKwl9CisJCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JQnJlYWtwb2ludCNnZXRNb2RlbElkZW50aWZpZXIoKQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TW9kZWxJZGVudGlmaWVyKCkgeworCQlyZXR1cm4gSUFudERlYnVnQ29uc3RhbnRzLklEX0FOVF9ERUJVR19NT0RFTDsKKwl9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBicmVha3BvaW50IGlzIGEgcnVuIHRvIGxpbmUgYnJlYWtwb2ludAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzUnVuVG9MaW5lKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGVuc3VyZU1hcmtlcigpLmdldEF0dHJpYnV0ZShJQW50RGVidWdDb25zdGFudHMuQU5UX1JVTl9UT19MSU5FLCBmYWxzZSk7CisgICAgICAgIH0gY2F0Y2ggKERlYnVnRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEFkZCB0aGlzIGJyZWFrcG9pbnQgdG8gdGhlIGJyZWFrcG9pbnQgbWFuYWdlciwKKyAgICAgKiBvciBzZXRzIGl0IGFzIHVucmVnaXN0ZXJlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcmVnaXN0ZXIoYm9vbGVhbiByZWdpc3RlcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworICAgICAgICBpZiAocmVnaXN0ZXIpIHsKKyAgICAgICAgICAgIERlYnVnUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCcmVha3BvaW50TWFuYWdlcigpLmFkZEJyZWFrcG9pbnQodGhpcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZXRSZWdpc3RlcmVkKGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL2RlYnVnL21vZGVsL0FudFByb3BlcnRpZXMuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL2RlYnVnL21vZGVsL0FudFByb3BlcnRpZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjkzZmVjCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvZGVidWcvbW9kZWwvQW50UHJvcGVydGllcy5qYXZhCkBAIC0wLDAgKzEsMTA5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5sYXVuY2hpbmcuZGVidWcubW9kZWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVZhcmlhYmxlOworCitwdWJsaWMgY2xhc3MgQW50UHJvcGVydGllcyBleHRlbmRzIEFudERlYnVnRWxlbWVudCBpbXBsZW1lbnRzIElWYXJpYWJsZSB7CisJCisJcHJpdmF0ZSBJVmFsdWUgZlZhbHVlOworCXByaXZhdGUgU3RyaW5nIGZOYW1lOworICAgIHByaXZhdGUgYm9vbGVhbiBmVmFsaWQ9IHRydWU7CisKKwlwdWJsaWMgQW50UHJvcGVydGllcyhBbnREZWJ1Z1RhcmdldCB0YXJnZXQsIFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKHRhcmdldCk7CisJCWZOYW1lPSBuYW1lOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVZhcmlhYmxlI2dldFZhbHVlKCkKKwkgKi8KKwlwdWJsaWMgc3luY2hyb25pemVkIElWYWx1ZSBnZXRWYWx1ZSgpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7CisgICAgICAgIGludCBhdHRlbXB0cz0gMDsKKyAgICAgICAgd2hpbGUgKCFmVmFsaWQgJiYgIWdldERlYnVnVGFyZ2V0KCkuaXNUZXJtaW5hdGVkKCkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgd2FpdCg1MCk7CisgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYXR0ZW1wdHMgPT0gMjAgJiYgIWZWYWxpZCAmJiAhZ2V0RGVidWdUYXJnZXQoKS5pc1Rlcm1pbmF0ZWQoKSkgeworICAgICAgICAgICAgICAgIHRocm93RGVidWdFeGNlcHRpb24oRGVidWdNb2RlbE1lc3NhZ2VzLkFudFByb3BlcnRpZXNfMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdHRlbXB0cysrOworICAgICAgICB9CisgCQlyZXR1cm4gZlZhbHVlOworCX0KKyAgICAKKyAgICBwdWJsaWMgSVZhbHVlIGdldExhc3RWYWx1ZSgpIHsKKyAgICAgICAgcmV0dXJuIGZWYWx1ZTsKKyAgICB9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklWYXJpYWJsZSNnZXROYW1lKCkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiBmTmFtZTsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklWYXJpYWJsZSNnZXRSZWZlcmVuY2VUeXBlTmFtZSgpCisJICovCisJcHVibGljIFN0cmluZyBnZXRSZWZlcmVuY2VUeXBlTmFtZSgpIHsKKwkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JVmFyaWFibGUjaGFzVmFsdWVDaGFuZ2VkKCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBoYXNWYWx1ZUNoYW5nZWQoKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklWYWx1ZU1vZGlmaWNhdGlvbiNzZXRWYWx1ZShqYXZhLmxhbmcuU3RyaW5nKQorCSAqLworCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBleHByZXNzaW9uKSB7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JVmFsdWVNb2RpZmljYXRpb24jc2V0VmFsdWUob3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JVmFsdWUpCisJICovCisJcHVibGljIHZvaWQgc2V0VmFsdWUoSVZhbHVlIHZhbHVlKSB7CisJCWZWYWx1ZT0gdmFsdWU7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JVmFsdWVNb2RpZmljYXRpb24jc3VwcG9ydHNWYWx1ZU1vZGlmaWNhdGlvbigpCisJICovCisJcHVibGljIGJvb2xlYW4gc3VwcG9ydHNWYWx1ZU1vZGlmaWNhdGlvbigpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVZhbHVlTW9kaWZpY2F0aW9uI3ZlcmlmeVZhbHVlKGphdmEubGFuZy5TdHJpbmcpCisJICovCisJcHVibGljIGJvb2xlYW4gdmVyaWZ5VmFsdWUoU3RyaW5nIGV4cHJlc3Npb24pIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVZhbHVlTW9kaWZpY2F0aW9uI3ZlcmlmeVZhbHVlKG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVZhbHVlKQorCSAqLworCXB1YmxpYyBib29sZWFuIHZlcmlmeVZhbHVlKElWYWx1ZSB2YWx1ZSkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFZhbGlkKGJvb2xlYW4gdmFsaWQpIHsKKyAgICAgICAgZlZhbGlkPSB2YWxpZDsgICAgICAgIAorICAgICAgICBub3RpZnlBbGwoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9kZWJ1Zy9tb2RlbC9BbnRQcm9wZXJ0aWVzVmFsdWUuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL2RlYnVnL21vZGVsL0FudFByb3BlcnRpZXNWYWx1ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlYzMwM2MKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9kZWJ1Zy9tb2RlbC9BbnRQcm9wZXJ0aWVzVmFsdWUuamF2YQpAQCAtMCwwICsxLDcxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogICAgIEJyb2NrIEphbmljemFrIChicm9ja2pAdHBnLmNvbS5hdSkgLSBidWcgMTU0OTA3CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmxhdW5jaGluZy5kZWJ1Zy5tb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVZhcmlhYmxlOworCitwdWJsaWMgY2xhc3MgQW50UHJvcGVydGllc1ZhbHVlIGV4dGVuZHMgQW50RGVidWdFbGVtZW50IGltcGxlbWVudHMgSVZhbHVlIHsKKwkKKwlwcml2YXRlIExpc3QgZlByb3BlcnRpZXM9IG5ldyBBcnJheUxpc3QoKTsKKwkKKwlwdWJsaWMgQW50UHJvcGVydGllc1ZhbHVlKEFudERlYnVnVGFyZ2V0IHRhcmdldCkgeworCQlzdXBlcih0YXJnZXQpOworCX0KKwkKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklWYWx1ZSNnZXRSZWZlcmVuY2VUeXBlTmFtZSgpCisJICovCisJcHVibGljIFN0cmluZyBnZXRSZWZlcmVuY2VUeXBlTmFtZSgpIHsKKwkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCisJfQorCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVZhbHVlI2dldFZhbHVlU3RyaW5nKCkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFZhbHVlU3RyaW5nKCkgeworCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKKwl9CisJCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JVmFsdWUjaXNBbGxvY2F0ZWQoKQorCSAqLworCXB1YmxpYyBib29sZWFuIGlzQWxsb2NhdGVkKCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JVmFsdWUjZ2V0VmFyaWFibGVzKCkKKwkgKi8KKwlwdWJsaWMgSVZhcmlhYmxlW10gZ2V0VmFyaWFibGVzKCkgeworCQlDb2xsZWN0aW9ucy5zb3J0KGZQcm9wZXJ0aWVzKTsKKwkJcmV0dXJuIChJVmFyaWFibGVbXSlmUHJvcGVydGllcy50b0FycmF5KG5ldyBJVmFyaWFibGVbZlByb3BlcnRpZXMuc2l6ZSgpXSk7CisJfQorCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVZhbHVlI2hhc1ZhcmlhYmxlcygpCisJICovCisJcHVibGljIGJvb2xlYW4gaGFzVmFyaWFibGVzKCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydGllcyhMaXN0IHByb3BlcnRpZXMpIHsKKwkJZlByb3BlcnRpZXMuYWRkQWxsKHByb3BlcnRpZXMpOworCX0KKworCXB1YmxpYyBMaXN0IGdldFByb3BlcnRpZXMoKSB7CisJCXJldHVybiBmUHJvcGVydGllczsKKwl9Cit9CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9kZWJ1Zy9tb2RlbC9BbnRQcm9wZXJ0eS5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvZGVidWcvbW9kZWwvQW50UHJvcGVydHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTY5OWRhCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvZGVidWcvbW9kZWwvQW50UHJvcGVydHkuamF2YQpAQCAtMCwwICsxLDEyMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqICAgICBCcm9jayBKYW5pY3phayAoYnJvY2tqQHRwZy5jb20uYXUpIC0gYnVnIDE1NDkwNworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5sYXVuY2hpbmcuZGVidWcubW9kZWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklWYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklWYXJpYWJsZTsKKworLyoqCisgKiBBIHByb3BlcnR5IGluIGFuIEFudCBidWlsZC4KKyAqLworcHVibGljIGNsYXNzIEFudFByb3BlcnR5IGV4dGVuZHMgQW50RGVidWdFbGVtZW50IGltcGxlbWVudHMgSVZhcmlhYmxlLCBDb21wYXJhYmxlIHsKKworCXByaXZhdGUgU3RyaW5nIGZOYW1lOworCXByaXZhdGUgQW50VmFsdWUgZlZhbHVlOworICAgIHByaXZhdGUgU3RyaW5nIGZMYWJlbDsKKwkKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGEgdmFyaWFibGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBkZWJ1ZyB0YXJnZXQKKwkgKiB3aXRoIHRoZSBnaXZlbiBuYW1lIGFuZCB2YWx1ZS4KKwkgKiAKKwkgKiBAcGFyYW0gdGFyZ2V0IHRoZSBkZWJ1ZyB0YXJnZXQKKwkgKiBAcGFyYW0gbmFtZSBwcm9wZXJ0eSBuYW1lCisJICogQHBhcmFtIHZhbHVlIHByb3BlcnR5IHZhbHVlCisJICovCisJcHVibGljIEFudFByb3BlcnR5KEFudERlYnVnVGFyZ2V0IHRhcmdldCwgU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgeworCQlzdXBlcih0YXJnZXQpOworCQlmTmFtZSA9IG5hbWU7CisJCWZWYWx1ZT0gbmV3IEFudFZhbHVlKHRhcmdldCwgdmFsdWUpOworCX0KKwkKKwkvKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JVmFyaWFibGUjZ2V0VmFsdWUoKQorCSAqLworCXB1YmxpYyBJVmFsdWUgZ2V0VmFsdWUoKSB7CisJCXJldHVybiBmVmFsdWU7CisJfQorCQorCS8qCisJICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklWYXJpYWJsZSNnZXROYW1lKCkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiBmTmFtZTsKKwl9CisJCisJLyoKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVZhcmlhYmxlI2dldFJlZmVyZW5jZVR5cGVOYW1lKCkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFJlZmVyZW5jZVR5cGVOYW1lKCkgeworCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKKwl9CisJCisJLyoKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVZhcmlhYmxlI2hhc1ZhbHVlQ2hhbmdlZCgpCisJICovCisJcHVibGljIGJvb2xlYW4gaGFzVmFsdWVDaGFuZ2VkKCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCQorCS8qCisJICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklWYWx1ZU1vZGlmaWNhdGlvbiNzZXRWYWx1ZShqYXZhLmxhbmcuU3RyaW5nKQorCSAqLworCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBleHByZXNzaW9uKSB7CisJfQorCQorCS8qCisJICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklWYWx1ZU1vZGlmaWNhdGlvbiNzZXRWYWx1ZShvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklWYWx1ZSkKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRWYWx1ZShJVmFsdWUgdmFsdWUpIHsKKwl9CisJCisJLyoKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVZhbHVlTW9kaWZpY2F0aW9uI3N1cHBvcnRzVmFsdWVNb2RpZmljYXRpb24oKQorCSAqLworCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzVmFsdWVNb2RpZmljYXRpb24oKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisJCisJLyoKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVZhbHVlTW9kaWZpY2F0aW9uI3ZlcmlmeVZhbHVlKGphdmEubGFuZy5TdHJpbmcpCisJICovCisJcHVibGljIGJvb2xlYW4gdmVyaWZ5VmFsdWUoU3RyaW5nIGV4cHJlc3Npb24pIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwkKKwkvKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JVmFsdWVNb2RpZmljYXRpb24jdmVyaWZ5VmFsdWUob3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JVmFsdWUpCisJICovCisJcHVibGljIGJvb2xlYW4gdmVyaWZ5VmFsdWUoSVZhbHVlIHZhbHVlKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSB0ZXh0IHVzZWQgdG8gcmVuZGVyIHRoaXMgcHJvcGVydHkKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7CisgICAgICAgIGlmIChmTGFiZWwgPT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlcj0gbmV3IFN0cmluZ0J1ZmZlcihnZXROYW1lKCkpOworICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiPSAiKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChmVmFsdWUuZ2V0VmFsdWVTdHJpbmcoKSk7ICAgICAgICAgIAorICAgICAgICAgICAgZkxhYmVsPSAgYnVmZmVyLnRvU3RyaW5nKCk7CisgICAgICAgIH0gCisgICAgICAgIHJldHVybiBmTGFiZWw7CisgICAgfQorICAgIAorICAgIC8qCisgICAgICogQHNlZSBqYXZhLmxhbmcuQ29tcGFyYWJsZSNjb21wYXJlVG8oamF2YS5sYW5nLk9iamVjdCkKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGNvbXBhcmVUbyhPYmplY3Qgb3RoZXIpIHsKKyAgICAJQW50UHJvcGVydHkgb3RoZXJQcm9wZXJ0eSA9IChBbnRQcm9wZXJ0eSkgb3RoZXI7CisgICAgCXJldHVybiBmTmFtZS5jb21wYXJlVG9JZ25vcmVDYXNlKG90aGVyUHJvcGVydHkuZ2V0TmFtZSgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9kZWJ1Zy9tb2RlbC9BbnRTdGFja0ZyYW1lLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9kZWJ1Zy9tb2RlbC9BbnRTdGFja0ZyYW1lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTcyYTcxMgotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL2RlYnVnL21vZGVsL0FudFN0YWNrRnJhbWUuamF2YQpAQCAtMCwwICsxLDMxNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwubGF1bmNoaW5nLmRlYnVnLm1vZGVsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmxhdW5jaGluZy5BbnRMYXVuY2hpbmdVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JUmVnaXN0ZXJHcm91cDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklTdGFja0ZyYW1lOworaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVRocmVhZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklWYXJpYWJsZTsKKworLyoqCisgKiBBbnQgc3RhY2sgZnJhbWUuCisgKi8KK3B1YmxpYyBjbGFzcyBBbnRTdGFja0ZyYW1lIGV4dGVuZHMgQW50RGVidWdFbGVtZW50IGltcGxlbWVudHMgSVN0YWNrRnJhbWUgeworCQorCXByaXZhdGUgQW50VGhyZWFkIGZUaHJlYWQ7CisJcHJpdmF0ZSBTdHJpbmcgZk5hbWU7CisJcHJpdmF0ZSBpbnQgZkxpbmVOdW1iZXI7CisJcHJpdmF0ZSBTdHJpbmcgZkZpbGVQYXRoOworCXByaXZhdGUgaW50IGZJZDsKKyAgICBwcml2YXRlIFN0cmluZyBmRnVsbFBhdGg7CisJCisJLyoqCisJICogQ29uc3RydWN0cyBhIHN0YWNrIGZyYW1lIGluIHRoZSBnaXZlbiB0aHJlYWQgd2l0aCB0aGUgZ2l2ZW4gaWQuCisJICogCisJICogQHBhcmFtIGFudFRocmVhZAorCSAqIEBwYXJhbSBpZCBzdGFjayBmcmFtZSBpZCAoMCBpcyB0aGUgdG9wIG9mIHRoZSBzdGFjaykKKwkgKi8KKwlwdWJsaWMgQW50U3RhY2tGcmFtZShBbnRUaHJlYWQgYW50VGhyZWFkLCBpbnQgaWQsIFN0cmluZyBuYW1lLCBTdHJpbmcgZnVsbFBhdGgsIGludCBsaW5lTnVtYmVyKSB7CisJCXN1cGVyKChBbnREZWJ1Z1RhcmdldCkgYW50VGhyZWFkLmdldERlYnVnVGFyZ2V0KCkpOworCQlmSWQgPSBpZDsKKwkJZlRocmVhZCA9IGFudFRocmVhZDsKKwkJZkxpbmVOdW1iZXI9IGxpbmVOdW1iZXI7CisJCWZOYW1lPSBuYW1lOworCQlzZXRGaWxlUGF0aChmdWxsUGF0aCk7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldElkKGludCBpZCkgeworCQlmSWQ9IGlkOworCX0KKwkKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklTdGFja0ZyYW1lI2dldFRocmVhZCgpCisJICovCisJcHVibGljIElUaHJlYWQgZ2V0VGhyZWFkKCkgeworCQlyZXR1cm4gZlRocmVhZDsKKwl9CisJCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JU3RhY2tGcmFtZSNnZXRWYXJpYWJsZXMoKQorCSAqLworCXB1YmxpYyBJVmFyaWFibGVbXSBnZXRWYXJpYWJsZXMoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24geworCSAgIHJldHVybiBmVGhyZWFkLmdldFZhcmlhYmxlcygpOworCX0KKworICAgIC8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVN0YWNrRnJhbWUjaGFzVmFyaWFibGVzKCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBoYXNWYXJpYWJsZXMoKSB7CisJCXJldHVybiBpc1N1c3BlbmRlZCgpOworCX0KKwkKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklTdGFja0ZyYW1lI2dldExpbmVOdW1iZXIoKQorCSAqLworCXB1YmxpYyBpbnQgZ2V0TGluZU51bWJlcigpIHsKKwkJcmV0dXJuIGZMaW5lTnVtYmVyOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRMaW5lTnVtYmVyKGludCBsaW5lTnVtYmVyKSB7CisJCWZMaW5lTnVtYmVyPSBsaW5lTnVtYmVyOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRGaWxlUGF0aChTdHJpbmcgZnVsbFBhdGgpIHsKKyAgICAgICAgZkZ1bGxQYXRoPSBmdWxsUGF0aDsKKyAgICAgICAgSUZpbGUgZmlsZT0gQW50TGF1bmNoaW5nVXRpbC5nZXRGaWxlRm9yTG9jYXRpb24oZnVsbFBhdGgsIG51bGwpOworICAgICAgICBpZiAoZmlsZSAhPSBudWxsKSB7CisgICAgICAgICAgICBmRmlsZVBhdGg9IGZpbGUuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnRvU3RyaW5nKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmRmlsZVBhdGg9IG5ldyBQYXRoKGZ1bGxQYXRoKS5sYXN0U2VnbWVudCgpOworICAgICAgICB9CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZVBhdGgoKSB7CisJCXJldHVybiBmRnVsbFBhdGg7CisJfQorCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVN0YWNrRnJhbWUjZ2V0Q2hhclN0YXJ0KCkKKwkgKi8KKwlwdWJsaWMgaW50IGdldENoYXJTdGFydCgpIHsKKwkJcmV0dXJuIC0xOworCX0KKwkKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklTdGFja0ZyYW1lI2dldENoYXJFbmQoKQorCSAqLworCXB1YmxpYyBpbnQgZ2V0Q2hhckVuZCgpIHsKKwkJcmV0dXJuIC0xOworCX0KKwkKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklTdGFja0ZyYW1lI2dldE5hbWUoKQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIGZOYW1lOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisJCWZOYW1lPSBuYW1lOworCX0KKwkKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklTdGFja0ZyYW1lI2dldFJlZ2lzdGVyR3JvdXBzKCkKKwkgKi8KKwlwdWJsaWMgSVJlZ2lzdGVyR3JvdXBbXSBnZXRSZWdpc3Rlckdyb3VwcygpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVN0YWNrRnJhbWUjaGFzUmVnaXN0ZXJHcm91cHMoKQorCSAqLworCXB1YmxpYyBib29sZWFuIGhhc1JlZ2lzdGVyR3JvdXBzKCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVN0ZXAjY2FuU3RlcEludG8oKQorCSAqLworCXB1YmxpYyBib29sZWFuIGNhblN0ZXBJbnRvKCkgeworCQlyZXR1cm4gZ2V0VGhyZWFkKCkuY2FuU3RlcEludG8oKTsKKwl9CisJCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JU3RlcCNjYW5TdGVwT3ZlcigpCisJICovCisJcHVibGljIGJvb2xlYW4gY2FuU3RlcE92ZXIoKSB7CisJCXJldHVybiBnZXRUaHJlYWQoKS5jYW5TdGVwT3ZlcigpOworCX0KKwkKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklTdGVwI2NhblN0ZXBSZXR1cm4oKQorCSAqLworCXB1YmxpYyBib29sZWFuIGNhblN0ZXBSZXR1cm4oKSB7CisJCXJldHVybiBnZXRUaHJlYWQoKS5jYW5TdGVwUmV0dXJuKCk7CisJfQorCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVN0ZXAjaXNTdGVwcGluZygpCisJICovCisJcHVibGljIGJvb2xlYW4gaXNTdGVwcGluZygpIHsKKwkJcmV0dXJuIGdldFRocmVhZCgpLmlzU3RlcHBpbmcoKTsKKwl9CisJCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JU3RlcCNzdGVwSW50bygpCisJICovCisJcHVibGljIHZvaWQgc3RlcEludG8oKSB0aHJvd3MgRGVidWdFeGNlcHRpb24geworCQlnZXRUaHJlYWQoKS5zdGVwSW50bygpOworCX0KKwkKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklTdGVwI3N0ZXBPdmVyKCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBzdGVwT3ZlcigpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7CisJCWdldFRocmVhZCgpLnN0ZXBPdmVyKCk7CisJfQorCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVN0ZXAjc3RlcFJldHVybigpCisJICovCisJcHVibGljIHZvaWQgc3RlcFJldHVybigpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7CisJCWdldFRocmVhZCgpLnN0ZXBSZXR1cm4oKTsKKwl9CisJCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JU3VzcGVuZFJlc3VtZSNjYW5SZXN1bWUoKQorCSAqLworCXB1YmxpYyBib29sZWFuIGNhblJlc3VtZSgpIHsKKwkJcmV0dXJuIGdldFRocmVhZCgpLmNhblJlc3VtZSgpOworCX0KKwkKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklTdXNwZW5kUmVzdW1lI2NhblN1c3BlbmQoKQorCSAqLworCXB1YmxpYyBib29sZWFuIGNhblN1c3BlbmQoKSB7CisJCXJldHVybiBnZXRUaHJlYWQoKS5jYW5TdXNwZW5kKCk7CisJfQorCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVN1c3BlbmRSZXN1bWUjaXNTdXNwZW5kZWQoKQorCSAqLworCXB1YmxpYyBib29sZWFuIGlzU3VzcGVuZGVkKCkgeworCQlyZXR1cm4gZ2V0VGhyZWFkKCkuaXNTdXNwZW5kZWQoKTsKKwl9CisJCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JU3VzcGVuZFJlc3VtZSNyZXN1bWUoKQorCSAqLworCXB1YmxpYyB2b2lkIHJlc3VtZSgpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7CisJCWdldFRocmVhZCgpLnJlc3VtZSgpOworCX0KKwkKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklTdXNwZW5kUmVzdW1lI3N1c3BlbmQoKQorCSAqLworCXB1YmxpYyB2b2lkIHN1c3BlbmQoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24geworCQlnZXRUaHJlYWQoKS5zdXNwZW5kKCk7CisJfQorCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVRlcm1pbmF0ZSNjYW5UZXJtaW5hdGUoKQorCSAqLworCXB1YmxpYyBib29sZWFuIGNhblRlcm1pbmF0ZSgpIHsKKwkJcmV0dXJuIGdldFRocmVhZCgpLmNhblRlcm1pbmF0ZSgpOworCX0KKwkKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklUZXJtaW5hdGUjaXNUZXJtaW5hdGVkKCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1Rlcm1pbmF0ZWQoKSB7CisJCXJldHVybiBnZXRUaHJlYWQoKS5pc1Rlcm1pbmF0ZWQoKTsKKwl9CisJCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JVGVybWluYXRlI3Rlcm1pbmF0ZSgpCisJICovCisJcHVibGljIHZvaWQgdGVybWluYXRlKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uIHsKKwkJZ2V0VGhyZWFkKCkudGVybWluYXRlKCk7CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGJ1aWxkZmlsZSB0aGlzIHN0YWNrIGZyYW1lIGlzIGFzc29jaWF0ZWQKKwkgKiB3aXRoLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGJ1aWxkZmlsZSB0aGlzIHN0YWNrIGZyYW1lIGlzIGFzc29jaWF0ZWQKKwkgKiB3aXRoCisJICovCisJcHVibGljIFN0cmluZyBnZXRTb3VyY2VOYW1lKCkgeworCQlyZXR1cm4gZkZpbGVQYXRoOworCX0KKwkKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorCSAqLworCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisJCWlmIChvYmogaW5zdGFuY2VvZiBBbnRTdGFja0ZyYW1lKSB7CisJCQlBbnRTdGFja0ZyYW1lIHNmID0gKEFudFN0YWNrRnJhbWUpb2JqOworCQkJaWYgKGdldFNvdXJjZU5hbWUoKSAhPSBudWxsKSB7CisJCQkJcmV0dXJuIGdldFNvdXJjZU5hbWUoKS5lcXVhbHMoc2YuZ2V0U291cmNlTmFtZSgpKSAmJgorCQkJCQlzZi5nZXRMaW5lTnVtYmVyKCkgPT0gZ2V0TGluZU51bWJlcigpICYmCisJCQkJCXNmLmZJZCA9PSBmSWQ7CisJCQl9IAorCQkJcmV0dXJuIHNmLmZJZCA9PSBmSWQ7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKwkKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2hhc2hDb2RlKCkKKwkgKi8KKwlwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworCSAgICBpZiAoZ2V0U291cmNlTmFtZSgpID09IG51bGwpIHsKKwkgICAgICAgIHJldHVybiBmSWQ7CisJICAgIH0KKwkgICAgcmV0dXJuIGdldFNvdXJjZU5hbWUoKS5oYXNoQ29kZSgpICsgZklkOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoaXMgc3RhY2sgZnJhbWUncyB1bmlxdWUgaWRlbnRpZmllciB3aXRoaW4gaXRzIHRocmVhZAorCSAqIAorCSAqIEByZXR1cm4gdGhpcyBzdGFjayBmcmFtZSdzIHVuaXF1ZSBpZGVudGlmaWVyIHdpdGhpbiBpdHMgdGhyZWFkCisJICovCisJcHJvdGVjdGVkIGludCBnZXRJZGVudGlmaWVyKCkgeworCQlyZXR1cm4gZklkOworCX0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzeXN0ZW0sIHVzZXIgb3IgcnVudGltZSBwcm9wZXJ0eQorICAgICAqIG5hbWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHVuYWJsZSB0byByZXNvbHZlIGEgcHJvcGVydHkgd2l0aCB0aGUgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIHNlYXJjaCBmb3IKKyAgICAgKiBAcmV0dXJuIGEgcHJvcGVydHksIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKKyAgICAgKi8KKyAgICBwdWJsaWMgQW50UHJvcGVydHkgZmluZFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIElWYXJpYWJsZVtdIGdyb3Vwcz0gZ2V0VmFyaWFibGVzKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGdyb3Vwcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIEFudFByb3BlcnRpZXMgcHJvcGVydGllc0dyb3VwaW5nID0gKEFudFByb3BlcnRpZXMpIGdyb3Vwc1tpXTsKKyAgICAgICAgICAgICAgICBBbnRQcm9wZXJ0aWVzVmFsdWUgdmFsdWU9IChBbnRQcm9wZXJ0aWVzVmFsdWUpIHByb3BlcnRpZXNHcm91cGluZy5nZXRWYWx1ZSgpOworICAgICAgICAgICAgICAgIElWYXJpYWJsZVtdIHByb3BlcnRpZXM9IHZhbHVlLmdldFZhcmlhYmxlcygpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcHJvcGVydGllcy5sZW5ndGg7IGorKykgeworICAgICAgICAgICAgICAgICAgICBBbnRQcm9wZXJ0eSBwcm9wZXJ0eSA9IChBbnRQcm9wZXJ0eSkgcHJvcGVydGllc1tqXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5LmdldE5hbWUoKS5lcXVhbHMocHJvcGVydHlOYW1lKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChEZWJ1Z0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfSAKK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL2RlYnVnL21vZGVsL0FudFZhbHVlLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9kZWJ1Zy9tb2RlbC9BbnRWYWx1ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyODUyNzkKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9kZWJ1Zy9tb2RlbC9BbnRWYWx1ZS5qYXZhCkBAIC0wLDAgKzEsNzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmxhdW5jaGluZy5kZWJ1Zy5tb2RlbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5sYXVuY2hpbmcuZGVidWcuSUFudERlYnVnQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVZhcmlhYmxlOworCitwdWJsaWMgY2xhc3MgQW50VmFsdWUgZXh0ZW5kcyBBbnREZWJ1Z0VsZW1lbnQgaW1wbGVtZW50cyBJVmFsdWUgIHsKKworICAgIHByaXZhdGUgU3RyaW5nIGZWYWx1ZVN0cmluZzsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIElWYXJpYWJsZVtdIEVNUFRZID0gbmV3IElWYXJpYWJsZVswXTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gdGFyZ2V0CisgICAgICovCisgICAgcHVibGljIEFudFZhbHVlKEFudERlYnVnVGFyZ2V0IHRhcmdldCwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIHN1cGVyKHRhcmdldCk7CisgICAgICAgIGZWYWx1ZVN0cmluZz0gdmFsdWU7CisgICAgfQorCisgICAgLyogKG5vbi1KYXZhZG9jKQorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JVmFsdWUjZ2V0UmVmZXJlbmNlVHlwZU5hbWUoKQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVmZXJlbmNlVHlwZU5hbWUoKSB7CisgICAgICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAorICAgIH0KKworICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVZhbHVlI2dldFZhbHVlU3RyaW5nKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gZlZhbHVlU3RyaW5nOworICAgIH0KKworICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVZhbHVlI2lzQWxsb2NhdGVkKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0FsbG9jYXRlZCgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyogKG5vbi1KYXZhZG9jKQorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JVmFsdWUjZ2V0VmFyaWFibGVzKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgSVZhcmlhYmxlW10gZ2V0VmFyaWFibGVzKCkgeworICAgICAgICByZXR1cm4gRU1QVFk7CisgICAgfQorCisgICAgLyogKG5vbi1KYXZhZG9jKQorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JVmFsdWUjaGFzVmFyaWFibGVzKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNWYXJpYWJsZXMoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKiAobm9uLUphdmFkb2MpCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklEZWJ1Z0VsZW1lbnQjZ2V0TW9kZWxJZGVudGlmaWVyKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE1vZGVsSWRlbnRpZmllcigpIHsKKyAgICAgICAgcmV0dXJuIElBbnREZWJ1Z0NvbnN0YW50cy5JRF9BTlRfREVCVUdfTU9ERUw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvZGVidWcvbW9kZWwvRGVidWdNZXNzYWdlSWRzLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9kZWJ1Zy9tb2RlbC9EZWJ1Z01lc3NhZ2VJZHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2M4ZjNlCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvZGVidWcvbW9kZWwvRGVidWdNZXNzYWdlSWRzLmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwubGF1bmNoaW5nLmRlYnVnLm1vZGVsOworCisKK3B1YmxpYyBjbGFzcyBEZWJ1Z01lc3NhZ2VJZHMgeworCQorCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE1FU1NBR0VfREVMSU1JVEVSPSAiLCI7IC8vJE5PTi1OTFMtMSQKKwkKKwlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBCVUlMRF9TVEFSVEVEPSAgICJidWlsZF9zdGFydGVkIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFRBUkdFVF9TVEFSVEVEPSAidGFyZ2V0X3N0YXJ0ZWQiOyAvLyROT04tTkxTLTEkCisJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEFSR0VUX0ZJTklTSEVEPSAidGFyZ2V0X2ZpbmlzaGVkIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFRBU0tfU1RBUlRFRD0gInRhc2tfc3RhcnRlZCI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBUQVNLX0ZJTklTSEVEPSAidGFza19maW5pc2hlZCI7IC8vJE5PTi1OTFMtMSQKKwkKKwlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTVEVQPSAic3RlcCI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTVEVQX09WRVI9ICJzdGVwX292ZXIiOyAvLyROT04tTkxTLTEkCisJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1RFUF9JTlRPPSAic3RlcF9pbnRvIjsgLy8kTk9OLU5MUy0xJAorCQorCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFRFUk1JTkFURT0gInRlcm1pbmF0ZSI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBURVJNSU5BVEVEPSAidGVybWluYXRlZCI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTVVNQRU5EPSAic3VzcGVuZCI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTVVNQRU5ERUQ9ICJzdXNwZW5kZWQiOyAvLyROT04tTkxTLTEkCisJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUkVTVU1FPSAicmVzdW1lIjsgLy8kTk9OLU5MUy0xJAorCQorCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNUQUNLPSAic3RhY2siOyAvLyROT04tTkxTLTEkCisJCisJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQUREX0JSRUFLUE9JTlQ9ICJhZGQiOyAvLyROT04tTkxTLTEkCisJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUkVNT1ZFX0JSRUFLUE9JTlQ9ICJyZW1vdmUiOyAvLyROT04tTkxTLTEkCisJCisJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0xJRU5UX1JFUVVFU1Q9ICJjbGllbnQiOyAvLyROT04tTkxTLTEkCisJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQlJFQUtQT0lOVD0gImJyZWFrcG9pbnQiOyAvLyROT04tTkxTLTEkCisJCisJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFJPUEVSVElFUz0gInByb3AiOyAvLyROT04tTkxTLTEkCisJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFJPUEVSVFlfVkFMVUU9ICJ2YWx1ZSI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgZmluYWwgc3RhdGljIGludCBQUk9QRVJUWV9VU0VSPSAwOworCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFBST1BFUlRZX1NZU1RFTT0gMTsKKwlwdWJsaWMgZmluYWwgc3RhdGljIGludCBQUk9QRVJUWV9SVU5USU1FPSAyOworfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvZGVidWcvbW9kZWwvRGVidWdNb2RlbE1lc3NhZ2VzLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9kZWJ1Zy9tb2RlbC9EZWJ1Z01vZGVsTWVzc2FnZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2FkYWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvZGVidWcvbW9kZWwvRGVidWdNb2RlbE1lc3NhZ2VzLmphdmEKQEAgLTAsMCArMSwzMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcworICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCisgKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOiAKKyAqIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5sYXVuY2hpbmcuZGVidWcubW9kZWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworCitwdWJsaWMgY2xhc3MgRGVidWdNb2RlbE1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuYW50LmludGVybmFsLmxhdW5jaGluZy5kZWJ1Zy5tb2RlbC5EZWJ1Z01vZGVsTWVzc2FnZXMiOy8vJE5PTi1OTFMtMSQKKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudERlYnVnVGFyZ2V0XzA7CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRMaW5lQnJlYWtwb2ludF8wOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudFRocmVhZF8wOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudFRocmVhZF8xOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudFRocmVhZF8yOworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudFRocmVhZF8zOworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudFRocmVhZF80OworICAgIAorICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudFByb3BlcnRpZXNfMTsKKyAgICAKKwlzdGF0aWMgeworCQkvLyBsb2FkIG1lc3NhZ2UgdmFsdWVzIGZyb20gYnVuZGxlIGZpbGUKKwkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgRGVidWdNb2RlbE1lc3NhZ2VzLmNsYXNzKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvZGVidWcvbW9kZWwvRGVidWdNb2RlbE1lc3NhZ2VzLnByb3BlcnRpZXMgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9kZWJ1Zy9tb2RlbC9EZWJ1Z01vZGVsTWVzc2FnZXMucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWNmODQzCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvZGVidWcvbW9kZWwvRGVidWdNb2RlbE1lc3NhZ2VzLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyMSBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisjIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjCisjIENvbnRyaWJ1dG9yczoKKyMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitBbnREZWJ1Z1RhcmdldF8wPUFudCBCdWlsZAorCitBbnRMaW5lQnJlYWtwb2ludF8wPUFudCBicmVha3BvaW50IFtsaW5lOiB7MH1dCitBbnRUaHJlYWRfMD1Vc2VyIFByb3BlcnRpZXMKK0FudFRocmVhZF8xPVN5c3RlbSBQcm9wZXJ0aWVzCitBbnRUaHJlYWRfMj1SdW50aW1lIFByb3BlcnRpZXMKK0FudFRocmVhZF8zPVJlcXVlc3QgdG8gcmV0cmlldmUgQW50IHN0YWNrIGZyYW1lcyBmYWlsZWQKK0FudFRocmVhZF80PVJlcXVlc3QgdG8gcmV0cmlldmUgQW50IHByb3BlcnRpZXMgZmFpbGVkCisKK0FudFByb3BlcnRpZXNfMT1SZXF1ZXN0IHRvIEFudCBwcm9wZXJ0aWVzIHZhbHVlIGZhaWxlZApkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvbGF1bmNoQ29uZmlndXJhdGlvbnMvQW50Q2xhc3NwYXRoUHJvdmlkZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL2xhdW5jaENvbmZpZ3VyYXRpb25zL0FudENsYXNzcGF0aFByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRmOGIzNgotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL2xhdW5jaENvbmZpZ3VyYXRpb25zL0FudENsYXNzcGF0aFByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw1MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5sYXVuY2hpbmcubGF1bmNoQ29uZmlndXJhdGlvbnM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklSdW50aW1lQ2xhc3NwYXRoRW50cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KYXZhUnVudGltZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLlN0YW5kYXJkQ2xhc3NwYXRoUHJvdmlkZXI7CisKK3B1YmxpYyBjbGFzcyBBbnRDbGFzc3BhdGhQcm92aWRlciBleHRlbmRzIFN0YW5kYXJkQ2xhc3NwYXRoUHJvdmlkZXIgeworCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JUnVudGltZUNsYXNzcGF0aFByb3ZpZGVyI2NvbXB1dGVVbnJlc29sdmVkQ2xhc3NwYXRoKG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb24pCisJICovCisJcHVibGljIElSdW50aW1lQ2xhc3NwYXRoRW50cnlbXSBjb21wdXRlVW5yZXNvbHZlZENsYXNzcGF0aChJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCWJvb2xlYW4gdXNlRGVmYXVsdCA9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX0RFRkFVTFRfQ0xBU1NQQVRILCB0cnVlKTsKKwkJaWYgKHVzZURlZmF1bHQpIHsKKwkJCUxpc3QgcnRlcyA9IG5ldyBBcnJheUxpc3QoMTApOworCQkJSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeSBqcmVFbnRyeSA9IG51bGw7CisJCQl0cnkgeworCQkJCWpyZUVudHJ5ID0gSmF2YVJ1bnRpbWUuY29tcHV0ZUpSRUVudHJ5KGNvbmZpZ3VyYXRpb24pOworCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkJLy8gbm90IGEgamF2YSBwcm9qZWN0CisJCQl9CisJCQlpZiAoanJlRW50cnkgPT0gbnVsbCkgeworCQkJCWpyZUVudHJ5ID0gSmF2YVJ1bnRpbWUubmV3UnVudGltZUNvbnRhaW5lckNsYXNzcGF0aEVudHJ5KAorCQkJCQkJSmF2YVJ1bnRpbWUubmV3RGVmYXVsdEpSRUNvbnRhaW5lclBhdGgoKSwgSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeS5TVEFOREFSRF9DTEFTU0VTKTsKKwkJCX0KKwkJCXJ0ZXMuYWRkKGpyZUVudHJ5KTsKKwkJCXJ0ZXMuYWRkKG5ldyBBbnRIb21lQ2xhc3NwYXRoRW50cnkoKSk7CisJCQlydGVzLmFkZChuZXcgQ29udHJpYnV0ZWRDbGFzc3BhdGhFbnRyaWVzRW50cnkoKSk7CisJCQlyZXR1cm4gKElSdW50aW1lQ2xhc3NwYXRoRW50cnlbXSkgcnRlcy50b0FycmF5KG5ldyBJUnVudGltZUNsYXNzcGF0aEVudHJ5W3J0ZXMuc2l6ZSgpXSk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmNvbXB1dGVVbnJlc29sdmVkQ2xhc3NwYXRoKGNvbmZpZ3VyYXRpb24pOworCX0KK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL2xhdW5jaENvbmZpZ3VyYXRpb25zL0FudEhvbWVDbGFzc3BhdGhFbnRyeS5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvbGF1bmNoQ29uZmlndXJhdGlvbnMvQW50SG9tZUNsYXNzcGF0aEVudHJ5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE4YTliZgotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL2xhdW5jaENvbmZpZ3VyYXRpb25zL0FudEhvbWVDbGFzc3BhdGhFbnRyeS5qYXZhCkBAIC0wLDAgKzEsMjEwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmxhdW5jaGluZy5sYXVuY2hDb25maWd1cmF0aW9uczsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmNvcmUuQW50Q29yZVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuY29yZS5BbnRDb3JlUHJlZmVyZW5jZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmNvcmUuSUFudENsYXNzcGF0aEVudHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5sYXVuY2hpbmcuQWJzdHJhY3RSdW50aW1lQ2xhc3NwYXRoRW50cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JUnVudGltZUNsYXNzcGF0aEVudHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSmF2YVJ1bnRpbWU7CitpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKKworaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuTWVzc2FnZUZvcm1hdDsKKworLyoqCisgKiBBIGNsYXNzcGF0aCBlbnRyeSB0aGF0IGNvbnRhaW5zIGEgc2V0IG9mIGFyY2hpdmVzIGZvciBhIHBhcnRpY3VsYXIKKyAqIEFOVF9IT01FLgorICogCisgKiBAc2luY2UgMy4wIAorICovCitwdWJsaWMgY2xhc3MgQW50SG9tZUNsYXNzcGF0aEVudHJ5IGV4dGVuZHMgQWJzdHJhY3RSdW50aW1lQ2xhc3NwYXRoRW50cnkgeworCQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfSUQgPSAib3JnLmVjbGlwc2UuYW50LnVpLmNsYXNzcGF0aGVudHJ5LmFudEhvbWUiOyAvLyROT04tTkxTLTEkCisJCisJLyoqCisJICogTG9jYWwgcGF0aCBvbiBkaXNrIHdoZXJlIEFudCBIb21lIGlzIGxvY2F0ZWQgb3IgPGNvZGU+bnVsbDwvY29kZT4KKwkgKiB0byBpbmRpY2F0ZSB0aGUgdXNlIG9mIHRoZSBkZWZhdWx0IEFudCBIb21lLgorCSAqLworCXByaXZhdGUgU3RyaW5nIGFudEhvbWVMb2NhdGlvbiA9IG51bGw7CisJCisJLyoqCisJICogQ3JlYXRlcyBhbiBBbnRIb21lIGVudHJ5IGZvciB0aGUgZGVmYXVsdCBBbnRIb21lIGluc3RhbGxhdGlvbi4KKwkgKi8KKwlwdWJsaWMgQW50SG9tZUNsYXNzcGF0aEVudHJ5KCkgeworCQlhbnRIb21lTG9jYXRpb24gPSBudWxsOworCX0KKwkKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGFuIEFudEhvbWUgZW50cnkgZm9yIHRoZSBBbnQgaW5zdGFsbGVkIGF0IHRoZSBzcGVjaWZpZWQKKwkgKiByb290IGRpcmVjdG9yeS4KKwkgKiAKKwkgKiBAcGFyYW0gYW50SG9tZSBwYXRoIGluIHRoZSBsb2NhbCBmaWxlIHN5c3RlbSB0byBhbiBBbnQgaW5zdGFsbGF0aW9uCisJICovCisJcHVibGljIEFudEhvbWVDbGFzc3BhdGhFbnRyeShTdHJpbmcgYW50SG9tZSkgeworCQlhbnRIb21lTG9jYXRpb24gPSBhbnRIb21lOworCX0KKwkJCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmxhdW5jaGluZy5BYnN0cmFjdFJ1bnRpbWVDbGFzc3BhdGhFbnRyeSNidWlsZE1lbWVudG8ob3JnLnczYy5kb20uRG9jdW1lbnQsIG9yZy53M2MuZG9tLkVsZW1lbnQpCisJICovCisJcHJvdGVjdGVkIHZvaWQgYnVpbGRNZW1lbnRvKERvY3VtZW50IGRvY3VtZW50LCBFbGVtZW50IG1lbWVudG8pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJaWYgKGFudEhvbWVMb2NhdGlvbiA9PSBudWxsKSB7CisJCQltZW1lbnRvLnNldEF0dHJpYnV0ZSgiZGVmYXVsdCIsICJ0cnVlIik7ICAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAorCQl9IGVsc2UgeworCQkJbWVtZW50by5zZXRBdHRyaWJ1dGUoImFudEhvbWUiLCBuZXcgUGF0aChhbnRIb21lTG9jYXRpb24pLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCisJCX0KKwl9CisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmxhdW5jaGluZy5JUnVudGltZUNsYXNzcGF0aEVudHJ5MiNpbml0aWFsaXplRnJvbShvcmcudzNjLmRvbS5FbGVtZW50KQorCSAqLworCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tKEVsZW1lbnQgbWVtZW50bykgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlTdHJpbmcgYW50SG9tZSA9IG1lbWVudG8uZ2V0QXR0cmlidXRlKCJhbnRIb21lIik7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKGFudEhvbWUgIT0gbnVsbCAmJiAoYW50SG9tZS5sZW5ndGgoKSA+IDApKSB7CisJCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgoYW50SG9tZSk7CisJCQlhbnRIb21lTG9jYXRpb24gPSBwYXRoLnRvT1NTdHJpbmcoKTsKKwkJfSBlbHNlIHsKKwkJCWFudEhvbWVMb2NhdGlvbiA9IG51bGw7CisJCX0KKwl9CisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JUnVudGltZUNsYXNzcGF0aEVudHJ5MiNnZXRUeXBlSWQoKQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZUlkKCkgeworCQlyZXR1cm4gVFlQRV9JRDsKKwl9CisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JUnVudGltZUNsYXNzcGF0aEVudHJ5MiNnZXRSdW50aW1lQ2xhc3NwYXRoRW50cmllcyhvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uKQorCSAqLworCXB1YmxpYyBJUnVudGltZUNsYXNzcGF0aEVudHJ5W10gZ2V0UnVudGltZUNsYXNzcGF0aEVudHJpZXMoSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlMaXN0IGxpYnMgPSBuZXcgQXJyYXlMaXN0KDQwKTsKKwkJQW50Q29yZVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gQW50Q29yZVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRQcmVmZXJlbmNlcygpOworCQlpZiAoYW50SG9tZUxvY2F0aW9uID09IG51bGwpIHsKKwkJCUlBbnRDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMgPSBwcmVmZXJlbmNlcy5nZXRBbnRIb21lQ2xhc3NwYXRoRW50cmllcygpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7CisJCQkJSUFudENsYXNzcGF0aEVudHJ5IGVudHJ5ID0gZW50cmllc1tpXTsKKwkJCQlsaWJzLmFkZChKYXZhUnVudGltZS5uZXdTdHJpbmdWYXJpYWJsZUNsYXNzcGF0aEVudHJ5KGVudHJ5LmdldExhYmVsKCkpKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCUZpbGUgbGliPSByZXNvbHZlQW50SG9tZSgpOworCQkJSVBhdGggbGliRGlyID0gbmV3IFBhdGgoYW50SG9tZUxvY2F0aW9uKS5hcHBlbmQoImxpYiIpOyAvLyROT04tTkxTLTEkCisJCQlTdHJpbmdbXSBmaWxlTmFtZXMgPSBsaWIubGlzdCgpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlTmFtZXMubGVuZ3RoOyBpKyspIHsKKwkJCQlTdHJpbmcgbmFtZSA9IGZpbGVOYW1lc1tpXTsKKwkJCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgobmFtZSk7CisJCQkJU3RyaW5nIGZpbGVFeHRlbnNpb24gPSBwYXRoLmdldEZpbGVFeHRlbnNpb24oKTsKKwkJCQlpZiAoImphciIuZXF1YWxzSWdub3JlQ2FzZShmaWxlRXh0ZW5zaW9uKSkgeyAvLyROT04tTkxTLTEkCisJCQkJCWxpYnMuYWRkKEphdmFSdW50aW1lLm5ld0FyY2hpdmVSdW50aW1lQ2xhc3NwYXRoRW50cnkobGliRGlyLmFwcGVuZChwYXRoKSkpOworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gKElSdW50aW1lQ2xhc3NwYXRoRW50cnlbXSkgbGlicy50b0FycmF5KG5ldyBJUnVudGltZUNsYXNzcGF0aEVudHJ5W2xpYnMuc2l6ZSgpXSk7CisJfQorCQorCXB1YmxpYyBGaWxlIHJlc29sdmVBbnRIb21lKCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlpZiAoYW50SG9tZUxvY2F0aW9uID09IG51bGwpIHsgLy91c2luZyB0aGUgZGVmYXVsdCBhbnQgaG9tZQorCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJSVBhdGggbGliRGlyPSBuZXcgUGF0aChhbnRIb21lTG9jYXRpb24pLmFwcGVuZCgibGliIik7IC8vJE5PTi1OTFMtMSQKKwkJRmlsZSBsaWI9IGxpYkRpci50b0ZpbGUoKTsKKwkJRmlsZSBwYXJlbnREaXI9IGxpYi5nZXRQYXJlbnRGaWxlKCk7CisJCWlmIChwYXJlbnREaXIgPT0gbnVsbCB8fCAhcGFyZW50RGlyLmV4aXN0cygpKSB7CisJCQlhYm9ydChNZXNzYWdlRm9ybWF0LmZvcm1hdChBbnRMYXVuY2hDb25maWd1cmF0aW9uTWVzc2FnZXMuQW50SG9tZUNsYXNzcGF0aEVudHJ5XzEwLCBuZXcgU3RyaW5nW10ge2FudEhvbWVMb2NhdGlvbn0pLCBudWxsKTsKKwkJfQorCQlpZiAoIWxpYi5leGlzdHMoKSB8fCAhbGliLmlzRGlyZWN0b3J5KCkpIHsKKwkJCWFib3J0KE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEFudExhdW5jaENvbmZpZ3VyYXRpb25NZXNzYWdlcy5BbnRIb21lQ2xhc3NwYXRoRW50cnlfMTEsIG5ldyBTdHJpbmdbXSB7YW50SG9tZUxvY2F0aW9ufSksIG51bGwpOworCQl9CisJCXJldHVybiBsaWI7CisJfQorCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeTIjZ2V0TmFtZSgpCisJICovCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlpZiAoYW50SG9tZUxvY2F0aW9uID09IG51bGwpIHsKKwkJCXJldHVybiBBbnRMYXVuY2hDb25maWd1cmF0aW9uTWVzc2FnZXMuQW50SG9tZUNsYXNzcGF0aEVudHJ5Xzg7CisJCX0KKwkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEFudExhdW5jaENvbmZpZ3VyYXRpb25NZXNzYWdlcy5BbnRIb21lQ2xhc3NwYXRoRW50cnlfOSwgbmV3IFN0cmluZ1tde2FudEhvbWVMb2NhdGlvbn0pOworCX0KKwkKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklSdW50aW1lQ2xhc3NwYXRoRW50cnkjZ2V0VHlwZSgpCisJICovCisJcHVibGljIGludCBnZXRUeXBlKCkgeworCQlyZXR1cm4gSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeS5PVEhFUjsKKwl9CisJCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JUnVudGltZUNsYXNzcGF0aEVudHJ5MiNpc0NvbXBvc2l0ZSgpCisJICovCisJcHVibGljIGJvb2xlYW4gaXNDb21wb3NpdGUoKSB7CisJCXJldHVybiB0cnVlOworCX0KKwkKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorCSAqLworCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisJCXJldHVybiBvYmogaW5zdGFuY2VvZiBBbnRIb21lQ2xhc3NwYXRoRW50cnkgJiYKKwkJICBlcXVhbHNPck51bGwoYW50SG9tZUxvY2F0aW9uLCAoKEFudEhvbWVDbGFzc3BhdGhFbnRyeSlvYmopLmFudEhvbWVMb2NhdGlvbik7CisJfQorCQorCS8qKgorCSAqIFJldHVybiB3aGV0aGVyIHMxIGlzIGVxdWl2YWxlbnQgdG8gczIuCisJICogCisJICogQHBhcmFtIHMxCisJICogQHBhcmFtIHMyCisJICogQHJldHVybiB3aGV0aGVyIHMxIGlzIGVxdWl2YWxlbnQgdG8gczIKKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gZXF1YWxzT3JOdWxsKFN0cmluZyBzMSwgU3RyaW5nIHMyKSB7CisJCWlmIChzMSA9PSBudWxsIHx8IHMyID09IG51bGwpIHsKKwkJCXJldHVybiBzMSA9PSBzMjsKKwkJfSAKKwkJcmV0dXJuIHMxLmVxdWFsc0lnbm9yZUNhc2UoczIpOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjaGFzaENvZGUoKQorCSAqLworCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisJCXJldHVybiBnZXRDbGFzcygpLmhhc2hDb2RlKCk7CisJfQkKKwkKKwkvKioKKwkgKiBTZXRzIHRoZSBhbnQgaG9tZSB0byB1c2UuCisJICogCisJICogQHBhcmFtIHBhdGggcGF0aCB0byB0b29yIG9mIGFuIGFudCBob21lIGluc3RhbGxhdGlvbgorCSAqLworCXB1YmxpYyB2b2lkIHNldEFudEhvbWUoU3RyaW5nIHBhdGgpIHsKKwkJYW50SG9tZUxvY2F0aW9uID0gcGF0aDsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgYW50IGhvbWUgbG9jYXRpb24KKwkgKiAKKwkgKiBAcmV0dXJuIHBhdGggdG8gcm9vdCBhbnQgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0QW50SG9tZSgpIHsKKwkJaWYgKGFudEhvbWVMb2NhdGlvbiA9PSBudWxsKSB7CisJCQlyZXR1cm4gQW50Q29yZVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRQcmVmZXJlbmNlcygpLmdldEFudEhvbWUoKTsKKwkJfQorCQlyZXR1cm4gYW50SG9tZUxvY2F0aW9uOworCX0KK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL2xhdW5jaENvbmZpZ3VyYXRpb25zL0FudEphdmFMYXVuY2hEZWxlZ2F0ZS5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvbGF1bmNoQ29uZmlndXJhdGlvbnMvQW50SmF2YUxhdW5jaERlbGVnYXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMwOGM2NQotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL2xhdW5jaENvbmZpZ3VyYXRpb25zL0FudEphdmFMYXVuY2hEZWxlZ2F0ZS5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmxhdW5jaGluZy5sYXVuY2hDb25maWd1cmF0aW9uczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KYXZhTGF1bmNoRGVsZWdhdGU7CisKKy8qKgorICogVXNlZCBieSB0aGUgQW50TGF1bmNoRGVsZWdhdGUgZm9yIEFudCBidWlsZHMgaW4gYSBzZXBhcmF0ZSBWTQorICogVGhlIHN1YmNsYXNzaW5nIGlzIG5lZWRlZCB0byBiZSBhYmxlIHRvIGxhdW5jaCBhbiBBbnQgYnVpbGQgZnJvbSBhIG5vbi1KYXZhIHByb2plY3QKKyAqLworcHVibGljIGNsYXNzIEFudEphdmFMYXVuY2hEZWxlZ2F0ZSBleHRlbmRzIEphdmFMYXVuY2hEZWxlZ2F0ZSB7CisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlMiNwcmVMYXVuY2hDaGVjayhvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uLCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBwcmVMYXVuY2hDaGVjayhJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLFN0cmluZyBtb2RlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCXJldHVybiBzdXBlci5wcmVMYXVuY2hDaGVjayhjb25maWd1cmF0aW9uLCBtb2RlLCBtb25pdG9yKTsKKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgeworCQkJLy9saWtlbHkgZGVhbGluZyB3aXRoIGEgbm9uLUphdmEgcHJvamVjdAorCQl9CisJCS8vbm8gbmVlZCB0byBjaGVjayBmb3IgYnJlYWtwb2ludHMgYXMgYWx3YXlzIGluIHJ1biBtb2RlCisJCXJldHVybiB0cnVlOworCX0KKwkKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkFic3RyYWN0SmF2YUxhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZSNnZXRQcm9ncmFtQXJndW1lbnRzKG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb24pCisJICovCisJcHVibGljIFN0cmluZyBnZXRQcm9ncmFtQXJndW1lbnRzKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCXJldHVybiBzdXBlci5nZXRQcm9ncmFtQXJndW1lbnRzKGNvbmZpZ3VyYXRpb24pOworCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7CisJCX0KKwkJcmV0dXJuIGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1BST0dSQU1fQVJHVU1FTlRTLCAiIik7IC8vJE5PTi1OTFMtMSQKKwl9Cit9CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9sYXVuY2hDb25maWd1cmF0aW9ucy9BbnRMYXVuY2hDb25maWd1cmF0aW9uTWVzc2FnZXMuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL2xhdW5jaENvbmZpZ3VyYXRpb25zL0FudExhdW5jaENvbmZpZ3VyYXRpb25NZXNzYWdlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwYzdkZjMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9sYXVuY2hDb25maWd1cmF0aW9ucy9BbnRMYXVuY2hDb25maWd1cmF0aW9uTWVzc2FnZXMuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCisgKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKKyAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6IAorICogSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiBkYWtzaGluYW11cnRoeS5rYXJyYUBnbWFpbC5jb20gLSBidWcgMTY1MzcxCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmxhdW5jaGluZy5sYXVuY2hDb25maWd1cmF0aW9uczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CisKK3B1YmxpYyBjbGFzcyBBbnRMYXVuY2hDb25maWd1cmF0aW9uTWVzc2FnZXMgZXh0ZW5kcyBOTFMgeworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwubGF1bmNoaW5nLmxhdW5jaENvbmZpZ3VyYXRpb25zLkFudExhdW5jaENvbmZpZ3VyYXRpb25NZXNzYWdlcyI7Ly8kTk9OLU5MUy0xJAorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgQW50TGF1bmNoRGVsZWdhdGVfTGF1bmNoaW5nX18wX18xOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudExhdW5jaERlbGVnYXRlX1J1bm5pbmdfXzBfXzI7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQW50TGF1bmNoRGVsZWdhdGVfQnVpbGRfSW5fUHJvZ3Jlc3M7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQW50TGF1bmNoRGVsZWdhdGVfRmFpbHVyZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRMYXVuY2hEZWxlZ2F0ZV8yMjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRMYXVuY2hEZWxlZ2F0ZV8yMzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRMYXVuY2hEZWxlZ2F0ZV8yODsKKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudEhvbWVDbGFzc3BhdGhFbnRyeV84OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudEhvbWVDbGFzc3BhdGhFbnRyeV85OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudEhvbWVDbGFzc3BhdGhFbnRyeV8xMDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRIb21lQ2xhc3NwYXRoRW50cnlfMTE7CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDb250cmlidXRlZENsYXNzcGF0aEVudHJpZXNFbnRyeV8xOworCisJc3RhdGljIHsKKwkJLy8gbG9hZCBtZXNzYWdlIHZhbHVlcyBmcm9tIGJ1bmRsZSBmaWxlCisJCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEFudExhdW5jaENvbmZpZ3VyYXRpb25NZXNzYWdlcy5jbGFzcyk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL2xhdW5jaENvbmZpZ3VyYXRpb25zL0FudExhdW5jaENvbmZpZ3VyYXRpb25NZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvbGF1bmNoQ29uZmlndXJhdGlvbnMvQW50TGF1bmNoQ29uZmlndXJhdGlvbk1lc3NhZ2VzLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY2MTY1NQotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL2xhdW5jaENvbmZpZ3VyYXRpb25zL0FudExhdW5jaENvbmZpZ3VyYXRpb25NZXNzYWdlcy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMjYgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisjIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorIworIyBDb250cmlidXRvcnM6CisjICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyMgICAgIGRha3NoaW5hbXVydGh5LmthcnJhQGdtYWlsLmNvbSAtIGJ1ZyAxNjUzNzEKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworQW50TGF1bmNoRGVsZWdhdGVfTGF1bmNoaW5nX18wX18xPUxhdW5jaGluZyB7MH0KK0FudExhdW5jaERlbGVnYXRlX1J1bm5pbmdfXzBfXzI9UnVubmluZyB7MH0KK0FudExhdW5jaERlbGVnYXRlX0J1aWxkX0luX1Byb2dyZXNzPUFudCBidWlsZCB7MH0gYWxyZWFkeSBpbiBwcm9ncmVzcy4gQ29uY3VycmVudCBBbnQgYnVpbGRzIGFyZSBwb3NzaWJsZSBpZiB5b3Ugc3BlY2lmeSB0byBidWlsZCBpbiBhIHNlcGFyYXRlIEpSRS4KK0FudExhdW5jaERlbGVnYXRlX0ZhaWx1cmU9RmFpbHVyZSBvZiBCYWNrZ3JvdW5kIEFudCBCdWlsZAorQW50TGF1bmNoRGVsZWdhdGVfMjI9JkRvIG5vdCBzaG93IGVycm9yIGRpYWxvZyB3aGVuIEFudCBidWlsZCBmYWlscworQW50TGF1bmNoRGVsZWdhdGVfMjM9QW50IEJ1aWxkIEZhaWxlZAorQW50TGF1bmNoRGVsZWdhdGVfMjg9V2FpdGluZyBmb3IgdmlydHVhbCBtYWNoaW5lIHRvIGV4aXQuLi4KKworQW50SG9tZUNsYXNzcGF0aEVudHJ5Xzg9QW50IEhvbWUgKERlZmF1bHQpCitBbnRIb21lQ2xhc3NwYXRoRW50cnlfOT1BbnQgSG9tZSAoezB9KQorQW50SG9tZUNsYXNzcGF0aEVudHJ5XzEwPUFudCBIb21lIHswfSBkb2VzIG5vdCBleGlzdAorQW50SG9tZUNsYXNzcGF0aEVudHJ5XzExPUFudCBIb21lIHswfSBkb2VzIG5vdCBjb250YWluIGEgImxpYiIgZGlyZWN0b3J5CisKK0NvbnRyaWJ1dGVkQ2xhc3NwYXRoRW50cmllc0VudHJ5XzE9QWRkaXRpb25hbCBUYXNrcyAmIFN1cHBvcnQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9sYXVuY2hDb25maWd1cmF0aW9ucy9BbnRNaWdyYXRpb25EZWxlZ2F0ZS5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvbGF1bmNoQ29uZmlndXJhdGlvbnMvQW50TWlncmF0aW9uRGVsZWdhdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDU2ODMyCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvbGF1bmNoQ29uZmlndXJhdGlvbnMvQW50TWlncmF0aW9uRGVsZWdhdGUuamF2YQpAQCAtMCwwICsxLDc3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5sYXVuY2hpbmcubGF1bmNoQ29uZmlndXJhdGlvbnM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwubGF1bmNoaW5nLkFudExhdW5jaGluZ1V0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHRlcm5hbHRvb2xzLmludGVybmFsLklFeHRlcm5hbFRvb2xDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUudmFyaWFibGVzLklTdHJpbmdWYXJpYWJsZU1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS52YXJpYWJsZXMuVmFyaWFibGVzUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbk1pZ3JhdGlvbkRlbGVnYXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weTsKKworLyoqCisgKiBEZWxlZ2F0ZSBmb3IgbWlncmF0aW5nIEFudCBsYXVuY2ggY29uZmlndXJhdGlvbnMuCisgKiBUaGUgbWlncmF0aW9uIHByb2Nlc3MgaW52b2x2ZXMgYSByZXNvdXJjZSBtYXBwaW5nIGJlaW5nIGNyZWF0ZWQgc3VjaCB0aGF0IGxhdW5jaCBjb25maWd1cmF0aW9ucworICogY2FuIGJlIGZpbHRlcmVkIGZyb20gdGhlIGxhdW5jaCBjb25maWd1cmF0aW9uIGRpYWxvZyBiYXNlZCBvbiByZXNvdXJjZSBhdmFpbGFiaWxpdHkuCisgKiAKKyAqIEBzaW5jZSAzLjIKKyAqLworcHVibGljIGNsYXNzIEFudE1pZ3JhdGlvbkRlbGVnYXRlIGltcGxlbWVudHMgSUxhdW5jaENvbmZpZ3VyYXRpb25NaWdyYXRpb25EZWxlZ2F0ZSB7CisJCisJLyoqCisJICogTWV0aG9kIHRvIGdldCB0aGUgZmlsZSBmb3IgdGhlIHNwZWNpZmllZCBsYXVuY2ggY29uZmlndXJhdGlvbiB0aGF0IHNob3VsZCBiZSBtYXBwZWQgdG8gdGhlIGxhdW5jaCBjb25maWd1cmF0aW9uICAKKwkgKiAKKwkgKiBAcGFyYW0gY2FuZGlkYXRlIHRoZSBsYXVuY2ggY29uZmlndXJhdGlvbiB0aGF0IHRoZSBmaWxlIHdpbGwgYmUgbWFwcGVkIHRvLgorCSAqIEByZXR1cm4gdGhlIGJ1aWxkZmlsZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgaW4gdGhlIHdvcmtzcGFjZQorCSAqLworCXByb3RlY3RlZCBJRmlsZSBnZXRGaWxlRm9yQ2FuZGlkYXRlKElMYXVuY2hDb25maWd1cmF0aW9uIGNhbmRpZGF0ZSkgeworCQlJRmlsZSBmaWxlPSBudWxsOworCQlTdHJpbmcgZXhwYW5kZWRMb2NhdGlvbj0gbnVsbDsKKwkJU3RyaW5nIGxvY2F0aW9uPSBudWxsOworCQlJU3RyaW5nVmFyaWFibGVNYW5hZ2VyIG1hbmFnZXIgPSBWYXJpYWJsZXNQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFN0cmluZ1ZhcmlhYmxlTWFuYWdlcigpOworCQl0cnkgeworCQkJbG9jYXRpb249IGNhbmRpZGF0ZS5nZXRBdHRyaWJ1dGUoSUV4dGVybmFsVG9vbENvbnN0YW50cy5BVFRSX0xPQ0FUSU9OLCAoU3RyaW5nKW51bGwpOworCQkJaWYgKGxvY2F0aW9uICE9IG51bGwpIHsKKwkJCQlleHBhbmRlZExvY2F0aW9uPSBtYW5hZ2VyLnBlcmZvcm1TdHJpbmdTdWJzdGl0dXRpb24obG9jYXRpb24pOworCQkJCWlmIChleHBhbmRlZExvY2F0aW9uICE9IG51bGwpIHsKKwkJCQkJZmlsZT0gQW50TGF1bmNoaW5nVXRpbC5nZXRGaWxlRm9yTG9jYXRpb24oZXhwYW5kZWRMb2NhdGlvbiwgbnVsbCk7CisJCQkJfQorCQkJfQorCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJfQorCQlyZXR1cm4gZmlsZTsKKwl9CisJCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbk1pZ3JhdGlvbkRlbGVnYXRlI2lzQ2FuZGlkYXRlKCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0NhbmRpZGF0ZShJTGF1bmNoQ29uZmlndXJhdGlvbiBjYW5kaWRhdGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJSVJlc291cmNlW10gbWFwcGVkUmVzb3VyY2VzID0gY2FuZGlkYXRlLmdldE1hcHBlZFJlc291cmNlcygpOworCQlpZiAobWFwcGVkUmVzb3VyY2VzICE9IG51bGwgJiYgbWFwcGVkUmVzb3VyY2VzLmxlbmd0aCA+IDApIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlyZXR1cm4gZ2V0RmlsZUZvckNhbmRpZGF0ZShjYW5kaWRhdGUpICE9IG51bGw7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbk1pZ3JhdGlvbkRlbGVnYXRlI21pZ3JhdGUob3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbikKKwkgKi8KKwlwdWJsaWMgdm9pZCBtaWdyYXRlKElMYXVuY2hDb25maWd1cmF0aW9uIGNhbmRpZGF0ZSkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlJRmlsZSBmaWxlID0gZ2V0RmlsZUZvckNhbmRpZGF0ZShjYW5kaWRhdGUpOworCQlJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IHdjID0gY2FuZGlkYXRlLmdldFdvcmtpbmdDb3B5KCk7CisJCXdjLnNldE1hcHBlZFJlc291cmNlcyhuZXcgSVJlc291cmNlW10ge2ZpbGV9KTsKKwkJd2MuZG9TYXZlKCk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL2xhdW5jaENvbmZpZ3VyYXRpb25zL0FudFN0cmVhbU1vbml0b3IuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL2xhdW5jaENvbmZpZ3VyYXRpb25zL0FudFN0cmVhbU1vbml0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjYxOTlmCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvbGF1bmNoQ29uZmlndXJhdGlvbnMvQW50U3RyZWFtTW9uaXRvci5qYXZhCkBAIC0wLDAgKzEsODMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmxhdW5jaGluZy5sYXVuY2hDb25maWd1cmF0aW9uczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5MaXN0ZW5lckxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JU3RyZWFtTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JRmx1c2hhYmxlU3RyZWFtTW9uaXRvcjsKKworLyoqCisgKiBTdHJlYW0gbW9uaXRvciBpbXBsZW1lbnRhdGlvbiBmb3IgYW4gQW50IGJ1aWxkIHByb2Nlc3MuCisgKi8KK3B1YmxpYyBjbGFzcyBBbnRTdHJlYW1Nb25pdG9yIGltcGxlbWVudHMgSUZsdXNoYWJsZVN0cmVhbU1vbml0b3IgeworCisJcHJpdmF0ZSBTdHJpbmdCdWZmZXIgZkNvbnRlbnRzID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCXByaXZhdGUgTGlzdGVuZXJMaXN0IGZMaXN0ZW5lcnMgPSBuZXcgTGlzdGVuZXJMaXN0KDEpOworCXByaXZhdGUgYm9vbGVhbiBmQnVmZmVyZWQgPSB0cnVlOworCQorCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JU3RyZWFtTW9uaXRvciNhZGRMaXN0ZW5lcihvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklTdHJlYW1MaXN0ZW5lcikKKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJU3RyZWFtTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJZkxpc3RlbmVycy5hZGQobGlzdGVuZXIpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JU3RyZWFtTW9uaXRvciNnZXRDb250ZW50cygpCisJICovCisJcHVibGljIFN0cmluZyBnZXRDb250ZW50cygpIHsKKwkJcmV0dXJuIGZDb250ZW50cy50b1N0cmluZygpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JU3RyZWFtTW9uaXRvciNyZW1vdmVMaXN0ZW5lcihvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklTdHJlYW1MaXN0ZW5lcikKKwkgKi8KKwlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJU3RyZWFtTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJZkxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOworCX0KKworCS8qKgorCSAqIEFwcGVuZHMgdGhlIGdpdmVuIG1lc3NhZ2UgdG8gdGhpcyBzdHJlYW0sIGFuZCBub3RpZmllcyBsaXN0ZW5lcnMuCisJICogCisJICogQHBhcmFtIG1lc3NhZ2UKKwkgKi8KKwlwdWJsaWMgdm9pZCBhcHBlbmQoU3RyaW5nIG1lc3NhZ2UpIHsKKwkJaWYgKGlzQnVmZmVyZWQoKSkgeworCQkJZkNvbnRlbnRzLmFwcGVuZChtZXNzYWdlKTsKKwkJfQorCQlPYmplY3RbXSBsaXN0ZW5lcnMgPSBmTGlzdGVuZXJzLmdldExpc3RlbmVycygpOworCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykgeworCQkJSVN0cmVhbUxpc3RlbmVyIGxpc3RlbmVyID0gKElTdHJlYW1MaXN0ZW5lcilsaXN0ZW5lcnNbaV07CisJCQlsaXN0ZW5lci5zdHJlYW1BcHBlbmRlZChtZXNzYWdlLCB0aGlzKTsKKwkJfQorCX0KKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSUZsdXNoYWJsZVN0cmVhbU1vbml0b3IjZmx1c2hDb250ZW50cygpCisJICovCisJcHVibGljIHZvaWQgZmx1c2hDb250ZW50cygpIHsKKwkJZkNvbnRlbnRzLnNldExlbmd0aCgwKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSUZsdXNoYWJsZVN0cmVhbU1vbml0b3IjaXNCdWZmZXJlZCgpCisJICovCisJcHVibGljIGJvb2xlYW4gaXNCdWZmZXJlZCgpIHsKKwkJcmV0dXJuIGZCdWZmZXJlZDsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSUZsdXNoYWJsZVN0cmVhbU1vbml0b3Ijc2V0QnVmZmVyZWQoYm9vbGVhbikKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRCdWZmZXJlZChib29sZWFuIGJ1ZmZlcikgeworCQlmQnVmZmVyZWQgPSBidWZmZXI7CisJfQorfQorCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9sYXVuY2hDb25maWd1cmF0aW9ucy9BbnRTdHJlYW1zUHJveHkuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL2xhdW5jaENvbmZpZ3VyYXRpb25zL0FudFN0cmVhbXNQcm94eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2YTVlMDkKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9sYXVuY2hDb25maWd1cmF0aW9ucy9BbnRTdHJlYW1zUHJveHkuamF2YQpAQCAtMCwwICsxLDY1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5sYXVuY2hpbmcubGF1bmNoQ29uZmlndXJhdGlvbnM7CisKKworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5sYXVuY2hpbmcuQW50TGF1bmNoaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVN0cmVhbU1vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JU3RyZWFtc1Byb3h5OworCisvKioKKyAqIAorICovCitwdWJsaWMgY2xhc3MgQW50U3RyZWFtc1Byb3h5IGltcGxlbWVudHMgSVN0cmVhbXNQcm94eSB7CisJCisJcHJpdmF0ZSBBbnRTdHJlYW1Nb25pdG9yIGZFcnJvck1vbml0b3IgPSBuZXcgQW50U3RyZWFtTW9uaXRvcigpOworCXByaXZhdGUgQW50U3RyZWFtTW9uaXRvciBmT3V0cHV0TW9uaXRvciA9IG5ldyBBbnRTdHJlYW1Nb25pdG9yKCk7CisJCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU5UX0RFQlVHX1NUUkVBTSA9IEFudExhdW5jaGluZy5QTFVHSU5fSUQgKyAiLkFOVF9ERUJVR19TVFJFQU0iOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU5UX1ZFUkJPU0VfU1RSRUFNID0gQW50TGF1bmNoaW5nLlBMVUdJTl9JRCArICIuQU5UX1ZFUkJPU0VfU1RSRUFNIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFOVF9XQVJOSU5HX1NUUkVBTSA9IEFudExhdW5jaGluZy5QTFVHSU5fSUQgKyAiLkFOVF9XQVJOSU5HX1NUUkVBTSI7IC8vJE5PTi1OTFMtMSQKKwkKKwlwcml2YXRlIEFudFN0cmVhbU1vbml0b3IgZkRlYnVnTW9uaXRvciA9IG5ldyBBbnRTdHJlYW1Nb25pdG9yKCk7CisJcHJpdmF0ZSBBbnRTdHJlYW1Nb25pdG9yIGZWZXJib3NlTW9uaXRvciA9IG5ldyBBbnRTdHJlYW1Nb25pdG9yKCk7CisJcHJpdmF0ZSBBbnRTdHJlYW1Nb25pdG9yIGZXYXJuaW5nTW9uaXRvciA9IG5ldyBBbnRTdHJlYW1Nb25pdG9yKCk7CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVN0cmVhbXNQcm94eSNnZXRFcnJvclN0cmVhbU1vbml0b3IoKQorCSAqLworCXB1YmxpYyBJU3RyZWFtTW9uaXRvciBnZXRFcnJvclN0cmVhbU1vbml0b3IoKSB7CisJCXJldHVybiBmRXJyb3JNb25pdG9yOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JU3RyZWFtc1Byb3h5I2dldE91dHB1dFN0cmVhbU1vbml0b3IoKQorCSAqLworCXB1YmxpYyBJU3RyZWFtTW9uaXRvciBnZXRPdXRwdXRTdHJlYW1Nb25pdG9yKCkgeworCQlyZXR1cm4gZk91dHB1dE1vbml0b3I7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklTdHJlYW1zUHJveHkjd3JpdGUoamF2YS5sYW5nLlN0cmluZykKKwkgKi8KKwlwdWJsaWMgdm9pZCB3cml0ZShTdHJpbmcgaW5wdXQpIHsKKwl9CisKKwlwdWJsaWMgSVN0cmVhbU1vbml0b3IgZ2V0V2FybmluZ1N0cmVhbU1vbml0b3IoKSB7CisJCXJldHVybiBmV2FybmluZ01vbml0b3I7CisJfQorCQorCXB1YmxpYyBJU3RyZWFtTW9uaXRvciBnZXREZWJ1Z1N0cmVhbU1vbml0b3IoKSB7CisJCXJldHVybiBmRGVidWdNb25pdG9yOworCX0JCisJCisJcHVibGljIElTdHJlYW1Nb25pdG9yIGdldFZlcmJvc2VTdHJlYW1Nb25pdG9yKCkgeworCQlyZXR1cm4gZlZlcmJvc2VNb25pdG9yOworCX0JCit9CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9sYXVuY2hDb25maWd1cmF0aW9ucy9NZXNzYWdlSWRzLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9sYXVuY2hDb25maWd1cmF0aW9ucy9NZXNzYWdlSWRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE5ZTE4YQotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL2xhdW5jaENvbmZpZ3VyYXRpb25zL01lc3NhZ2VJZHMuamF2YQpAQCAtMCwwICsxLDIxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmxhdW5jaGluZy5sYXVuY2hDb25maWd1cmF0aW9uczsKKworcHVibGljIGNsYXNzIE1lc3NhZ2VJZHMgeworCisJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFJPQ0VTU19JRD0gICAicHJvY2Vzc0lEIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEJVSUxEX0NBTkNFTExFRD0gImNhbmNlbGxlZCI7IC8vJE5PTi1OTFMtMSQKKwkvL2NvbnN0YW50cyBuZWVkIHRvIHN0YXJ0IGdyZWF0ZXIgdGhhbiB0aGUgUHJvamVjdC5NU0dfKiBjb25zdGFudHMKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBUQVNLPSAiNiI7IC8vJE5PTi1OTFMtMSQKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBUQVJHRVQ9ICI3IjsgLy8kTk9OLU5MUy0xJAorfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvbGF1bmNoQ29uZmlndXJhdGlvbnMvUmVtb3RlQW50UHJvY2Vzc0ZhY3RvcnkuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL2xhdW5jaENvbmZpZ3VyYXRpb25zL1JlbW90ZUFudFByb2Nlc3NGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDEzYzEzZQotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL2xhdW5jaENvbmZpZ3VyYXRpb25zL1JlbW90ZUFudFByb2Nlc3NGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwzNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5sYXVuY2hpbmcubGF1bmNoQ29uZmlndXJhdGlvbnM7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy5JQW50TGF1bmNoQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklQcm9jZXNzRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklQcm9jZXNzOworCitwdWJsaWMgY2xhc3MgUmVtb3RlQW50UHJvY2Vzc0ZhY3RvcnkgaW1wbGVtZW50cyBJUHJvY2Vzc0ZhY3RvcnkgeworCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JUHJvY2Vzc0ZhY3RvcnkjbmV3UHJvY2VzcyhvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2gsIGphdmEubGFuZy5Qcm9jZXNzLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnV0aWwuTWFwKQorCSAqLworCXB1YmxpYyBJUHJvY2VzcyBuZXdQcm9jZXNzKElMYXVuY2ggbGF1bmNoLCBQcm9jZXNzIHByb2Nlc3MsIFN0cmluZyBsYWJlbCwgTWFwIGF0dHJpYnV0ZXMpIHsKKwkJaWYgKGF0dHJpYnV0ZXMgPT0gbnVsbCkgeworCQkJYXR0cmlidXRlcz0gbmV3IEhhc2hNYXAoMSk7CisJCX0KKwkJYXR0cmlidXRlcy5wdXQoSVByb2Nlc3MuQVRUUl9QUk9DRVNTX1RZUEUsIElBbnRMYXVuY2hDb25zdGFudHMuSURfQU5UX1BST0NFU1NfVFlQRSk7CisJCXJldHVybiBuZXcgUmVtb3RlQW50UnVudGltZVByb2Nlc3MobGF1bmNoLCBwcm9jZXNzLCBsYWJlbCwgYXR0cmlidXRlcyk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvbGF1bmNoQ29uZmlndXJhdGlvbnMvUmVtb3RlQW50UnVudGltZVByb2Nlc3MuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL2xhdW5jaENvbmZpZ3VyYXRpb25zL1JlbW90ZUFudFJ1bnRpbWVQcm9jZXNzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGEwYmJhMgotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL2xhdW5jaENvbmZpZ3VyYXRpb25zL1JlbW90ZUFudFJ1bnRpbWVQcm9jZXNzLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5sYXVuY2hpbmcubGF1bmNoQ29uZmlndXJhdGlvbnM7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklTdHJlYW1zUHJveHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5SdW50aW1lUHJvY2VzczsKKworcHVibGljIGNsYXNzIFJlbW90ZUFudFJ1bnRpbWVQcm9jZXNzIGV4dGVuZHMgUnVudGltZVByb2Nlc3MgeworCisJLyoqCisJICogQ29uc3RydWN0cyBhIFJ1bnRpbWVQcm9jZXNzIG9uIHRoZSBnaXZlbiBzeXN0ZW0gcHJvY2VzcworCSAqIHdpdGggdGhlIGdpdmVuIG5hbWUsIGFkZGluZyB0aGlzIHByb2Nlc3MgdG8gdGhlIGdpdmVuCisJICogbGF1bmNoLgorCSAqIFNldHMgdGhlIHN0cmVhbXMgcHJveHkgdG8gYW4gQW50U3RyZWFtc1Byb3h5IGlmIG91dHB1dCBpcyBjYXB0dXJlZC4KKwkgKi8KKwlwdWJsaWMgUmVtb3RlQW50UnVudGltZVByb2Nlc3MoSUxhdW5jaCBsYXVuY2gsIFByb2Nlc3MgcHJvY2VzcywgU3RyaW5nIG5hbWUsIE1hcCBhdHRyaWJ1dGVzKSB7CisJCXN1cGVyKGxhdW5jaCwgcHJvY2VzcywgbmFtZSwgYXR0cmlidXRlcyk7CisJfQorCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuUnVudGltZVByb2Nlc3MjY3JlYXRlU3RyZWFtc1Byb3h5KCkKKwkgKi8KKwlwcm90ZWN0ZWQgSVN0cmVhbXNQcm94eSBjcmVhdGVTdHJlYW1zUHJveHkoKSB7CisJCXJldHVybiBuZXcgQW50U3RyZWFtc1Byb3h5KCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL2FudC9sYXVuY2hpbmcvSUFudExhdW5jaENvbnN0YW50cy5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL2FudC9sYXVuY2hpbmcvSUFudExhdW5jaENvbnN0YW50cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjOGFlMzMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2UvYW50L2xhdW5jaGluZy9JQW50TGF1bmNoQ29uc3RhbnRzLmphdmEKQEAgLTAsMCArMSwxMjYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHRlcm5hbHRvb2xzLmludGVybmFsLklFeHRlcm5hbFRvb2xDb25zdGFudHM7CisKKy8qKgorICogQ29uc3RhbnQgZGVmaW5pdGlvbnMgZm9yIEFudCBsYXVuY2ggY29uZmlndXJhdGlvbnMuCisgKiAKKyAqIEBzaW5jZSAxLjAKKyAqIEBub2ltcGxlbWVudCBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KKyAqLworcHVibGljIGludGVyZmFjZSBJQW50TGF1bmNoQ29uc3RhbnRzIHsKKworCS8qKgorCSAqIEFudCBsYXVuY2ggY29uZmlndXJhdGlvbiB0eXBlIGlkZW50aWZpZXIuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfQU5UX0xBVU5DSF9DT05GSUdVUkFUSU9OX1RZUEUgPSAib3JnLmVjbGlwc2UuYW50LkFudExhdW5jaENvbmZpZ3VyYXRpb25UeXBlIjsgLy8kTk9OLU5MUy0xJAorCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFJTl9UWVBFX05BTUU9ICJvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwubGF1bmNoaW5nLnJlbW90ZS5JbnRlcm5hbEFudFJ1bm5lciI7IC8vJE5PTi1OTFMtMSQKKwkKKwkvKioKKwkgKiBBbnQgYnVpbGRlciBsYXVuY2ggY29uZmlndXJhdGlvbiB0eXBlIGlkZW50aWZpZXIuIEFudCBwcm9qZWN0IGJ1aWxkZXJzCisJICogYXJlIG9mIHRoaXMgdHlwZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9BTlRfQlVJTERFUl9MQVVOQ0hfQ09ORklHVVJBVElPTl9UWVBFID0gIm9yZy5lY2xpcHNlLmFudC5BbnRCdWlsZGVyTGF1bmNoQ29uZmlndXJhdGlvblR5cGUiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBTdHJpbmcgYXR0cmlidXRlIGluZGljYXRpbmcgdGhlIEFudCB0YXJnZXRzIHRvIGV4ZWN1dGUuIERlZmF1bHQgdmFsdWUgaXMKKwkgKiA8Y29kZT5udWxsPC9jb2RlPiB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgZGVmYXVsdCB0YXJnZXQgaXMgdG8gYmUKKwkgKiBleGVjdXRlZC4gRm9ybWF0IGlzIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Rpbmcgb2YgdGFyZ2V0cy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0FOVF9UQVJHRVRTID0gSUV4dGVybmFsVG9vbENvbnN0YW50cy5VSV9QTFVHSU5fSUQgKyAiLkFUVFJfQU5UX1RBUkdFVFMiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBTdHJpbmcgYXR0cmlidXRlIGluZGljYXRpbmcgdGhlIEFudCB0YXJnZXRzIHRvIGV4ZWN1dGUgYWZ0ZXIgYSBjbGVhbgorCSAqIChmdWxsIGJ1aWxkKSBmb3IgYW4gQW50IGJ1aWxkZXIuIERlZmF1bHQgdmFsdWUgaXMgPGNvZGU+bnVsbDwvY29kZT4gd2hpY2gKKwkgKiBpbmRpY2F0ZXMgdGhhdCB0aGUgZGVmYXVsdCB0YXJnZXQgaXMgdG8gYmUgZXhlY3V0ZWQuIEZvcm1hdCBpcyBhIGNvbW1hCisJICogc2VwYXJhdGVkIGxpc3Rpbmcgb2YgdGFyZ2V0cy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0FOVF9BRlRFUl9DTEVBTl9UQVJHRVRTID0gIm9yZy5lY2xpcHNlLmFudC51aS5BVFRSX0FOVF9BRlRFUl9DTEVBTl9UQVJHRVRTIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogU3RyaW5nIGF0dHJpYnV0ZSBpbmRpY2F0aW5nIHRoZSBBbnQgdGFyZ2V0cyB0byBleGVjdXRlIGR1cmluZyBhIG1hbnVhbAorCSAqIGJ1aWxkIGZvciBhbiBBbnQgYnVpbGRlci4gRGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT5udWxsPC9jb2RlPiB3aGljaAorCSAqIGluZGljYXRlcyB0aGF0IHRoZSBkZWZhdWx0IHRhcmdldCBpcyB0byBiZSBleGVjdXRlZC4gRm9ybWF0IGlzIGEgY29tbWEKKwkgKiBzZXBhcmF0ZWQgbGlzdGluZyBvZiB0YXJnZXRzLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQU5UX01BTlVBTF9UQVJHRVRTID0gIm9yZy5lY2xpcHNlLmFudC51aS5BVFRSX0FOVF9NQU5VQUxfVEFSR0VUUyI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFN0cmluZyBhdHRyaWJ1dGUgaW5kaWNhdGluZyB0aGUgQW50IHRhcmdldHMgdG8gZXhlY3V0ZSBkdXJpbmcgYW4gYXV0bworCSAqIGJ1aWxkIGZvciBhbiBBbnQgYnVpbGRlci4gRGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT5udWxsPC9jb2RlPiB3aGljaAorCSAqIGluZGljYXRlcyB0aGF0IHRoZSBkZWZhdWx0IHRhcmdldCBpcyB0byBiZSBleGVjdXRlZC4gRm9ybWF0IGlzIGEgY29tbWEKKwkgKiBzZXBhcmF0ZWQgbGlzdGluZyBvZiB0YXJnZXRzLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQU5UX0FVVE9fVEFSR0VUUyA9ICJvcmcuZWNsaXBzZS5hbnQudWkuQVRUUl9BTlRfQVVUT19UQVJHRVRTIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogU3RyaW5nIGF0dHJpYnV0ZSBpbmRpY2F0aW5nIHRoZSBBbnQgdGFyZ2V0cyB0byBleGVjdXRlIGR1cmluZyBhIGNsZWFuIGZvcgorCSAqIGFuIEFudCBidWlsZGVyLiBEZWZhdWx0IHZhbHVlIGlzIDxjb2RlPm51bGw8L2NvZGU+IHdoaWNoIGluZGljYXRlcyB0aGF0CisJICogdGhlIGRlZmF1bHQgdGFyZ2V0IGlzIHRvIGJlIGV4ZWN1dGVkLiBGb3JtYXQgaXMgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdGluZworCSAqIG9mIHRhcmdldHMuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9BTlRfQ0xFQU5fVEFSR0VUUyA9ICJvcmcuZWNsaXBzZS5hbnQudWkuQVRUUl9BTlRfQ0xFQU5fVEFSR0VUUyI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIEJvb2xlYW4gYXR0cmlidXRlIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgdGFyZ2V0IHNwZWNpZmljYXRpb24gZm9yIGFuCisJICogQW50IGJ1aWxkZXIgaGFzIGJlZW4gdXBkYXRlZCBmb3IgMy4xCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9UQVJHRVRTX1VQREFURUQgPSAib3JnLmVjbGlwc2UuYW50LnVpLkFUVFJfVEFSR0VUU19VUERBVEVEIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogTWFwIGF0dHJpYnV0ZSBpbmRpY2F0aW5nIHRoZSBBbnQgcHJvcGVydGllcyB0byBiZSBkZWZpbmVkIGR1cmluZyB0aGUKKwkgKiBidWlsZC4gRGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT5udWxsPC9jb2RlPiB3aGljaCBpbmRpY2F0ZXMgbm8gYWRkaXRpb25hbAorCSAqIHByb3BlcnRpZXMgd2lsbCBiZSBkZWZpbmVkLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQU5UX1BST1BFUlRJRVMgPSBJRXh0ZXJuYWxUb29sQ29uc3RhbnRzLlVJX1BMVUdJTl9JRCArICIuQVRUUl9BTlRfUFJPUEVSVElFUyI7IC8vJE5PTi1OTFMtMSQJCQkJCQorCisJLyoqCisJICogU3RyaW5nIGF0dHJpYnV0ZSBpbmRpY2F0aW5nIHRoZSBBbnQgdGFyZ2V0cyB0byBleGVjdXRlLiBEZWZhdWx0IHZhbHVlIGlzCisJICogPGNvZGU+bnVsbDwvY29kZT4gd2hpY2ggaW5kaWNhdGVzIHRoYXQgbm8gYWRkaXRpb25hbCBwcm9wZXJ0eSBmaWxlcyB3aWxsCisJICogYmUgZGVmaW5lZC4gRm9ybWF0IGlzIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Rpbmcgb2YgcHJvcGVydHkgZmlsZXMuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9BTlRfUFJPUEVSVFlfRklMRVMgPSBJRXh0ZXJuYWxUb29sQ29uc3RhbnRzLlVJX1BMVUdJTl9JRCArICIuQVRUUl9BTlRfUFJPUEVSVFlfRklMRVMiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBCb29sZWFuIGF0dHJpYnV0ZSBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IGludGVybmFsIHRhcmdldHMgKHRhcmdldHMKKwkgKiB3aXRoIG5vIGRlc2NyaXB0aW9uKSBzaG91bGQgYmUgaGlkZGVuIGZyb20gdGhlIHVzZXIgaW4gdGhlIGxhdW5jaAorCSAqIGNvbmZpZ3VyYXRpb24gZGlhbG9nLiBEZWZhdWx0IHZhbHVlIGlzIDxjb2RlPmZhbHNlPC9jb2RlPiB3aGljaCBpbmRpY2F0ZXMKKwkgKiB0aGF0IGFsbCB0YXJnZXRzIHdpbGwgYmUgZGlzcGxheWVkLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfSElERV9JTlRFUk5BTF9UQVJHRVRTID0gSUV4dGVybmFsVG9vbENvbnN0YW50cy5VSV9QTFVHSU5fSUQgKyAiLkFUVFJfSElERV9JTlRFUk5BTF9UQVJHRVRTIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogSW50ZWdlciBhdHRyaWJ1dGUgaW5kaWNhdGluZyB3aGljaCBjb2x1bW4gdGFyZ2V0cyBzaG91bGQgYmUgc29ydGVkIG9uLiBBCisJICogdmFsdWUgb2YgMCBpbmRpY2F0ZXMgdGFyZ2V0IG5hbWUsIDEgaW5kaWNhdGVzIHRhcmdldCBkZXNjcmlwdGlvbiwgYW5kIC0xCisJICogaW5kaWNhdGVzIG5vIHNvcnQuIERlZmF1bHQgdmFsdWUgaXMgLTEuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9TT1JUX1RBUkdFVFMgPSBJRXh0ZXJuYWxUb29sQ29uc3RhbnRzLlVJX1BMVUdJTl9JRCArICJBVFRSX1NPUlRfVEFSR0VUUyI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIEJvb2xlYW4gYXR0cmlidXRlIGluZGljYXRpbmcgaWYgdGhlIGRlZmF1bHQgVk0gaW5zdGFsbCBzaG91bGQgYmUgdXNlZCBmb3IKKwkgKiB0aGUgc2VwYXJhdGUgSlJFIGJ1aWxkIERlZmF1bHQgdmFsdWUgaXMgPGNvZGU+ZmFsc2U8L2NvZGU+IGZvciBiYWNrd2FyZHMKKwkgKiBjb21wYXRpYmlsaXR5CisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9ERUZBVUxUX1ZNX0lOU1RBTEwgPSAib3JnLmVjbGlwc2UuYW50LnVpLkRFRkFVTFRfVk1fSU5TVEFMTCI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIElkZW50aWZpZXIgZm9yIEFudCBwcm9jZXNzZXMgKHZhbHVlCisJICogPGNvZGU+b3JnLmVjbGlwc2UuYW50LnVpLmFudFByb2Nlc3M8L2NvZGU+KS4gVGhpcyBpZGVudGlmaWVyIGlzIHNldCBhcworCSAqIHRoZSB2YWx1ZSBmb3IgdGhlIDxjb2RlPklQcm9jZXNzLkFUVFJfUFJPQ0VTU19UWVBFPC9jb2RlPiBhdHRyaWJ1dGUgaW4KKwkgKiBwcm9jZXNzZXMgY3JlYXRlZCBieSB0aGUgQW50IGxhdW5jaCBkZWxlZ2F0ZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9BTlRfUFJPQ0VTU19UWVBFID0gIm9yZy5lY2xpcHNlLmFudC51aS5hbnRQcm9jZXNzIjsgLy8kTk9OLU5MUy0xJAorCit9CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2UvYW50L2xhdW5jaGluZy9wYWNrYWdlLmh0bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2UvYW50L2xhdW5jaGluZy9wYWNrYWdlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVmZDQ4NAotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvbGF1bmNoaW5nL3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDEzIEBACis8IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgorPGh0bWw+Cis8aGVhZD4KKyAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgorICAgPHRpdGxlPlBhY2thZ2UtbGV2ZWwgSmF2YWRvYzwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keT4KK1Byb3ZpZGVzIHN1cHBvcnQgZm9yIEFudCBsYXVuY2hpbmcuCis8aDI+CitQYWNrYWdlIFNwZWNpZmljYXRpb248L2gyPgorVGhpcyBwYWNrYWdlIGRlZmluZXMgY29uc3RhbnRzIGZvciBBbnQgbGF1bmNoIGNvbmZpZ3VyYXRpb24gYXR0cmlidXRlcy4gCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvLmNsYXNzcGF0aCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS8uY2xhc3NwYXRoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlZDFlOWMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvLmNsYXNzcGF0aApAQCAtMCwwICsxLDkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8Y2xhc3NwYXRoPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InRlc3QgcGx1Z2luIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0idGVzdHMiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBvdXRwdXQ9InRlc3Rfc3VwcG9ydF9iaW4iIHBhdGg9InRlc3Qgc3VwcG9ydCIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjQiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KKzwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLy5leHRlcm5hbFRvb2xCdWlsZGVycy9BbnQgVGVzdCBTdXBwb3J0IExpYiBCdWlsZGVyLmxhdW5jaCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS8uZXh0ZXJuYWxUb29sQnVpbGRlcnMvQW50IFRlc3QgU3VwcG9ydCBMaWIgQnVpbGRlci5sYXVuY2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAxZDRhMAotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS8uZXh0ZXJuYWxUb29sQnVpbGRlcnMvQW50IFRlc3QgU3VwcG9ydCBMaWIgQnVpbGRlci5sYXVuY2gKQEAgLTAsMCArMSwxNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxsYXVuY2hDb25maWd1cmF0aW9uIHR5cGU9Im9yZy5lY2xpcHNlLmFudC5BbnRCdWlsZGVyTGF1bmNoQ29uZmlndXJhdGlvblR5cGUiPgorPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5BVFRSX0xBVU5DSF9JTl9CQUNLR1JPVU5EIiB2YWx1ZT0iZmFsc2UiLz4KKzxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5ERUZBVUxUX0NMQVNTUEFUSCIgdmFsdWU9InRydWUiLz4KKzxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuYW50LnVpLkRFRkFVTFRfVk1fSU5TVEFMTCIgdmFsdWU9ImZhbHNlIi8+Cis8c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5BVFRSX1JVTl9CVUlMRF9LSU5EUyIgdmFsdWU9ImZ1bGwsaW5jcmVtZW50YWwsYXV0byxjbGVhbiIvPgorPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5hbnQudWkuQVRUUl9UQVJHRVRTX1VQREFURUQiIHZhbHVlPSJ0cnVlIi8+Cis8Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuQVRUUl9UUklHR0VSU19DT05GSUdVUkVEIiB2YWx1ZT0idHJ1ZSIvPgorPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLmFwcGVuZEVudmlyb25tZW50VmFyaWFibGVzIiB2YWx1ZT0idHJ1ZSIvPgorPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuQ0xBU1NQQVRIX1BST1ZJREVSIiB2YWx1ZT0ib3JnLmVjbGlwc2UuYW50LnVpLkFudENsYXNzcGF0aFByb3ZpZGVyIi8+Cis8c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5BVFRSX0JVSUxEX1NDT1BFIiB2YWx1ZT0iJHt3b3JraW5nX3NldDombHQ7P3htbCB2ZXJzaW9uPSZxdW90OzEuMCZxdW90OyBlbmNvZGluZz0mcXVvdDtVVEYtOCZxdW90Oz8mZ3Q7JiMxMDsmbHQ7bGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdTZXQgZmFjdG9yeUlEPSZxdW90O29yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtpbmdTZXRGYWN0b3J5JnF1b3Q7IG5hbWU9JnF1b3Q7d29ya2luZ1NldCZxdW90OyBlZGl0UGFnZUlkPSZxdW90O29yZy5lY2xpcHNlLnVpLnJlc291cmNlV29ya2luZ1NldFBhZ2UmcXVvdDsmZ3Q7JiMxMDsmbHQ7aXRlbSBmYWN0b3J5SUQ9JnF1b3Q7b3JnLmVjbGlwc2UudWkuaW50ZXJuYWwubW9kZWwuUmVzb3VyY2VGYWN0b3J5JnF1b3Q7IHBhdGg9JnF1b3Q7L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3Qgc3VwcG9ydC9vcmcmcXVvdDsgdHlwZT0mcXVvdDsyJnF1b3Q7LyZndDsmIzEwOyZsdDtpdGVtIGZhY3RvcnlJRD0mcXVvdDtvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5tb2RlbC5SZXNvdXJjZUZhY3RvcnkmcXVvdDsgcGF0aD0mcXVvdDsvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvYnVpbGRmaWxlcy9idWlsZEFudFRlc3RzU3VwcG9ydEpBUi54bWwmcXVvdDsgdHlwZT0mcXVvdDsxJnF1b3Q7LyZndDsmIzEwOyZsdDsvbGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdTZXQmZ3Q7JiMxMDt9Ii8+Cis8c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuYW50LnVpLkFUVFJfQU5UX0NMRUFOX1RBUkdFVFMiIHZhbHVlPSJjbGVhbiwiLz4KKzxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkFUVFJfUkVGUkVTSF9TQ09QRSIgdmFsdWU9IiR7d29ya2luZ19zZXQ6Jmx0Oz94bWwgdmVyc2lvbj0mcXVvdDsxLjAmcXVvdDsgZW5jb2Rpbmc9JnF1b3Q7VVRGLTgmcXVvdDs/Jmd0OyYjMTA7Jmx0O2xhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nU2V0IGZhY3RvcnlJRD0mcXVvdDtvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JraW5nU2V0RmFjdG9yeSZxdW90OyBuYW1lPSZxdW90O3dvcmtpbmdTZXQmcXVvdDsgZWRpdFBhZ2VJZD0mcXVvdDtvcmcuZWNsaXBzZS51aS5yZXNvdXJjZVdvcmtpbmdTZXRQYWdlJnF1b3Q7Jmd0OyYjMTA7Jmx0O2l0ZW0gZmFjdG9yeUlEPSZxdW90O29yZy5lY2xpcHNlLnVpLmludGVybmFsLm1vZGVsLlJlc291cmNlRmFjdG9yeSZxdW90OyBwYXRoPSZxdW90Oy9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZSZxdW90OyB0eXBlPSZxdW90OzQmcXVvdDsvJmd0OyYjMTA7Jmx0Oy9sYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ1NldCZndDsmIzEwO30iLz4KKzxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLkFUVFJfTE9DQVRJT04iIHZhbHVlPSIke3dvcmtzcGFjZV9sb2M6L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL2J1aWxkZmlsZXMvYnVpbGRBbnRUZXN0c1N1cHBvcnRKQVIueG1sfSIvPgorPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5BVFRSX1JVTl9JTl9CQUNLR1JPVU5EIiB2YWx1ZT0iZmFsc2UiLz4KKzwvbGF1bmNoQ29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS8ucHJvamVjdCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS8ucHJvamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDY3MGNkCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLy5wcm9qZWN0CkBAIC0wLDAgKzEsMzcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdERlc2NyaXB0aW9uPgorCTxuYW1lPm9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlPC9uYW1lPgorCTxjb21tZW50PjwvY29tbWVudD4KKwk8cHJvamVjdHM+CisJPC9wcm9qZWN0cz4KKwk8YnVpbGRTcGVjPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CQkKKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuRXh0ZXJuYWxUb29sQnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQkJPGRpY3Rpb25hcnk+CisJCQkJCTxrZXk+TGF1bmNoQ29uZmlnSGFuZGxlPC9rZXk+CisJCQkJCTx2YWx1ZT4mbHQ7cHJvamVjdCZndDsvLmV4dGVybmFsVG9vbEJ1aWxkZXJzL0FudCBUZXN0IFN1cHBvcnQgTGliIEJ1aWxkZXIubGF1bmNoPC92YWx1ZT4KKwkJCQk8L2RpY3Rpb25hcnk+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJPC9idWlsZFNwZWM+CisJPG5hdHVyZXM+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KKwk8L25hdHVyZXM+Cis8L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5jb3JlLnByZWZzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwMWEzNzQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5jb3JlLnByZWZzCkBAIC0wLDAgKzEsMyBAQAorI1RodSBNYXkgMjcgMTQ6NDg6NDMgUERUIDIwMDQNCitlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQ0KK3NlbGZob3N0aW5nLmJpbkV4Y2x1ZGVzPS9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0X3N1cHBvcnRfYmluDQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzA3NzE1Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKQEAgLTAsMCArMSwyOSBAQAorI01vbiBEZWMgMTQgMTE6NDA6NDggQ1NUIDIwMDkNCitjb21waWxlcnMuZi51bnJlc29sdmVkLWZlYXR1cmVzPTENCitjb21waWxlcnMuZi51bnJlc29sdmVkLXBsdWdpbnM9MQ0KK2NvbXBpbGVycy5pbmNvbXBhdGlibGUtZW52aXJvbm1lbnQ9MQ0KK2NvbXBpbGVycy5wLmJ1aWxkPTENCitjb21waWxlcnMucC5idWlsZC5taXNzaW5nLm91dHB1dD0xDQorY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xDQorY29tcGlsZXJzLnAuZGlzY291cmFnZWQtY2xhc3M9MQ0KK2NvbXBpbGVycy5wLmlsbGVnYWwtYXR0LXZhbHVlPTANCitjb21waWxlcnMucC5pbnRlcm5hbD0xDQorY29tcGlsZXJzLnAubWlzc2luZy1wYWNrYWdlcz0yDQorY29tcGlsZXJzLnAubWlzc2luZy12ZXJzaW9uLWV4cG9ydC1wYWNrYWdlPTINCitjb21waWxlcnMucC5taXNzaW5nLXZlcnNpb24taW1wb3J0LXBhY2thZ2U9Mg0KK2NvbXBpbGVycy5wLm1pc3NpbmctdmVyc2lvbi1yZXF1aXJlLWJ1bmRsZT0yDQorY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTANCitjb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0xDQorY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MA0KK2NvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MQ0KK2NvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0wDQorY29tcGlsZXJzLnAudW5rbm93bi1pZGVudGlmaWVyPTENCitjb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTENCitjb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wDQorY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MA0KK2NvbXBpbGVycy5wLnVudXNlZC1lbGVtZW50LW9yLWF0dHJpYnV0ZT0xDQorY29tcGlsZXJzLnMuY3JlYXRlLWRvY3M9ZmFsc2UNCitjb21waWxlcnMucy5kb2MtZm9sZGVyPWRvYw0KK2NvbXBpbGVycy5zLm9wZW4tdGFncz0xDQorY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUNCitlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQ0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS9hYm91dC5odG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL2Fib3V0Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDYwMjMzMAotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS9hYm91dC5odG1sCkBAIC0wLDAgKzEsMjggQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCisgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Cis8dGl0bGU+QWJvdXQ8L3RpdGxlPgorPC9oZWFkPgorPGJvZHkgbGFuZz0iRU4tVVMiPgorPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+CisgCis8cD5KdW5lIDIsIDIwMDY8L3A+CQorPGgzPkxpY2Vuc2U8L2gzPgorCis8cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKK2luZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKK0VjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCithdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgorRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KKworPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKK2JlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKK2FwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKK3Byb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQoraW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKK2FuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+CisKKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvYnVpbGQucHJvcGVydGllcyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS9idWlsZC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkNGNmZjAKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvYnVpbGQucHJvcGVydGllcwpAQCAtMCwwICsxLDI4IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyMKKyMgQ29udHJpYnV0b3JzOgorIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitiaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKKyAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKKyAgICAgICAgICAgICAgIHRlc3QueG1sLFwKKyAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAorICAgICAgICAgICAgICAgdGVzdGJ1aWxkZmlsZXMvLFwKKyAgICAgICAgICAgICAgIHRlc3RyZXNvdXJjZXMvLFwKKyAgICAgICAgICAgICAgIHRlc3RsaWIvLFwKKyAgICAgICAgICAgICAgIGxpYi8sXAorICAgICAgICAgICAgICAgbGliLyouamFyLFwKKyAgICAgICAgICAgICAgICouamFyLFwKKyAgICAgICAgICAgICAgIE1FVEEtSU5GLworICAgICAgICAgICAgICAgCitzb3VyY2UuYW50dGVzdHNjb3JlLmphciA9IHRlc3QgcGx1Z2luLyxcCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RzLworc291cmNlLmxpYi9hbnRUZXN0c1N1cHBvcnQuamFyID0gdGVzdCBzdXBwb3J0LworamFycy5jb21waWxlLm9yZGVyPWFudHRlc3RzY29yZS5qYXIsbGliL2FudFRlc3RzU3VwcG9ydC5qYXIKK291dHB1dC5saWIvYW50VGVzdHNTdXBwb3J0LmphciA9IHRlc3Rfc3VwcG9ydF9iaW4vCitvdXRwdXQuYW50dGVzdHNjb3JlLmphciA9IGJpbi8KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS9idWlsZGZpbGVzL2J1aWxkQW50VGVzdHNTdXBwb3J0SkFSLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS9idWlsZGZpbGVzL2J1aWxkQW50VGVzdHNTdXBwb3J0SkFSLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjU3YWU3Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL2J1aWxkZmlsZXMvYnVpbGRBbnRUZXN0c1N1cHBvcnRKQVIueG1sCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS9wbHVnaW4ucHJvcGVydGllcyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS9wbHVnaW4ucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWU5ZTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTMgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisjIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorIyAKKyMgQ29udHJpYnV0b3JzOgorIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK3BsdWdpbk5hbWU9QW50IENvcmUgVGVzdCBQbHVnaW4KK3Byb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3BsdWdpbi54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvcGx1Z2luLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGFkZDRhCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3BsdWdpbi54bWwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3QgcGx1Z2luL29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3Rlc3RwbHVnaW4vQW50RmlsZVJ1bm5lci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3QgcGx1Z2luL29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3Rlc3RwbHVnaW4vQW50RmlsZVJ1bm5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzOWU4MDIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdCBwbHVnaW4vb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvdGVzdHBsdWdpbi9BbnRGaWxlUnVubmVyLmphdmEKQEAgLTAsMCArMSw3OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS50ZXN0cGx1Z2luOworCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuY29yZS5BbnRSdW5uZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUuQWJzdHJhY3RBbnRUZXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworCisvKioKKyAqIFJlc3BvbnNpYmxlIGZvciBydW5uaW5nIHRlc3QgYW50IGJ1aWxkIGZpbGVzLgorICovCitwdWJsaWMgY2xhc3MgQW50RmlsZVJ1bm5lciB7CisJCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJBU0VfRElSX1BSRUZJWCA9ICItRGJhc2VkaXI9IjsgLy8kTk9OLU5MUy0xJAorCisJcHVibGljIHZvaWQgcnVuKElGaWxlIGJ1aWxkRmlsZSwgU3RyaW5nW10gdGFyZ2V0cywgU3RyaW5nW10gYXJncywgU3RyaW5nIGJhc2VEaXIsIGJvb2xlYW4gY2FwdHVyZU91dHB1dCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQorCQlBbnRSdW5uZXIgcnVubmVyID0gbmV3IEFudFJ1bm5lcigpOworCisJCVN0cmluZ1tdIHJ1bm5lckFyZ3MgPSBhcmdzOworCisJCWlmIChiYXNlRGlyLmxlbmd0aCgpID4gMCkgeworCQkJLy8gQW50IHJlcXVpcmVzIHRoZSB3b3JraW5nIGRpcmVjdG9yeSB0byBiZSBzcGVjaWZpZWQKKwkJCS8vIGFzIG9uZSBvZiB0aGUgYXJndW1lbnRzLCBzbyBpdCBuZWVkcyB0byBiZSBhcHBlbmRlZC4KKwkJCWludCBsZW5ndGggPSAxOworCQkJaWYgKGFyZ3MgIT0gbnVsbCkgeworCQkJCWxlbmd0aCA9IGFyZ3MubGVuZ3RoICsgMTsKKwkJCX0gCisJCQkKKwkJCXJ1bm5lckFyZ3MgPSBuZXcgU3RyaW5nW2xlbmd0aF07CisJCQlpZiAoYXJncyAhPSBudWxsKSB7CisJCQkJU3lzdGVtLmFycmF5Y29weShhcmdzLCAwLCBydW5uZXJBcmdzLCAwLCBhcmdzLmxlbmd0aCk7CisJCQl9CisJCQlydW5uZXJBcmdzW2xlbmd0aCAtIDFdID0gQkFTRV9ESVJfUFJFRklYICsgYmFzZURpcjsKKwkJfQorCQlydW5uZXIuc2V0QXJndW1lbnRzKHJ1bm5lckFyZ3MpOworCisJCWlmIChidWlsZEZpbGUgIT0gbnVsbCkgeworCQkJcnVubmVyLnNldEJ1aWxkRmlsZUxvY2F0aW9uKGJ1aWxkRmlsZS5nZXRMb2NhdGlvbigpLnRvRmlsZSgpLnRvU3RyaW5nKCkpOworCQl9CisJCWlmICh0YXJnZXRzICE9IG51bGwgJiYgdGFyZ2V0cy5sZW5ndGggPiAwKSB7CisJCQlydW5uZXIuc2V0RXhlY3V0aW9uVGFyZ2V0cyh0YXJnZXRzKTsKKwkJfQorCQlpZiAoY2FwdHVyZU91dHB1dCkgeworCQkJcnVubmVyLmFkZEJ1aWxkTG9nZ2VyKEFic3RyYWN0QW50VGVzdC5BTlRfVEVTVF9CVUlMRF9MT0dHRVIpOworCQl9CisKKwkJcnVubmVyLnJ1bihudWxsKTsKKwl9CisJCisJcHVibGljIHZvaWQgcnVuKFN0cmluZ1tdIGFyZ3MsIFN0cmluZyBiYXNlRGlyKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkKKwkJQW50UnVubmVyIHJ1bm5lciA9IG5ldyBBbnRSdW5uZXIoKTsKKworCQlTdHJpbmdbXSBydW5uZXJBcmdzID0gYXJnczsKKworCQlpZiAoYmFzZURpci5sZW5ndGgoKSA+IDApIHsKKwkJCS8vIEFudCByZXF1aXJlcyB0aGUgd29ya2luZyBkaXJlY3RvcnkgdG8gYmUgc3BlY2lmaWVkCisJCQkvLyBhcyBvbmUgb2YgdGhlIGFyZ3VtZW50cywgc28gaXQgbmVlZHMgdG8gYmUgYXBwZW5kZWQuCisJCQlydW5uZXJBcmdzID0gbmV3IFN0cmluZ1thcmdzLmxlbmd0aCArIDFdOworCQkJU3lzdGVtLmFycmF5Y29weShhcmdzLCAwLCBydW5uZXJBcmdzLCAwLCBhcmdzLmxlbmd0aCk7CisJCQlydW5uZXJBcmdzW2FyZ3MubGVuZ3RoXSA9IEJBU0VfRElSX1BSRUZJWCArIGJhc2VEaXI7CisJCX0KKwkJcnVubmVyLnNldEFyZ3VtZW50cyhydW5uZXJBcmdzKTsKKworCQlydW5uZXIucnVuKGFyZ3MpOworCX0KK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0IHBsdWdpbi9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS90ZXN0cGx1Z2luL0FudFRlc3RDaGVja2VyLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdCBwbHVnaW4vb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvdGVzdHBsdWdpbi9BbnRUZXN0Q2hlY2tlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmNDQ5ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdCBwbHVnaW4vb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvdGVzdHBsdWdpbi9BbnRUZXN0Q2hlY2tlci5qYXZhCkBAIC0wLDAgKzEsMjI5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLnRlc3RwbHVnaW47CisKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworcHVibGljIGNsYXNzIEFudFRlc3RDaGVja2VyIHsKKwkKKwlwcml2YXRlIHN0YXRpYyBBbnRUZXN0Q2hlY2tlciBkZWZsdD0gbnVsbDsKKwkKKwlwcml2YXRlIGludCB0YXNrU3RhcnRlZENvdW50OworCQorCXByaXZhdGUgaW50IHRhc2tGaW5pc2hlZENvdW50OworCQorCXByaXZhdGUgaW50IHRhcmdldHNTdGFydGVkQ291bnQ7CisJCisJcHJpdmF0ZSBpbnQgdGFyZ2V0c0ZpbmlzaGVkQ291bnQ7CisJCisJcHJpdmF0ZSBpbnQgYnVpbGRzU3RhcnRlZENvdW50OworCQorCXByaXZhdGUgaW50IGJ1aWxkc0ZpbmlzaGVkQ291bnQ7CisJCisJcHJpdmF0ZSBMaXN0IG1lc3NhZ2VzPSBuZXcgQXJyYXlMaXN0KCk7CisJCisJcHJpdmF0ZSBMaXN0IHRhcmdldHM9IG5ldyBBcnJheUxpc3QoKTsKKwkKKwlwcml2YXRlIExpc3QgdGFza3M9IG5ldyBBcnJheUxpc3QoKTsKKwkKKwlwcml2YXRlIExpc3QgcHJvamVjdHM9IG5ldyBBcnJheUxpc3QoKTsKKwkKKwlwcml2YXRlIEhhc2h0YWJsZSB1c2VyUHJvcGVydGllczsKKwkKKwlwcml2YXRlIExpc3QgbmFtZU9mTGlzdGVuZXJzPSBuZXcgQXJyYXlMaXN0KCk7CisJCisJcHJpdmF0ZSBBbnRUZXN0Q2hlY2tlcigpICB7CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBBbnRUZXN0Q2hlY2tlcgorCSAqLworCXB1YmxpYyBzdGF0aWMgQW50VGVzdENoZWNrZXIgZ2V0RGVmYXVsdCgpIHsKKwkJaWYgKGRlZmx0ID09IG51bGwpIHsKKwkJCWRlZmx0PSBuZXcgQW50VGVzdENoZWNrZXIoKTsKKwkJfQorCQlyZXR1cm4gZGVmbHQ7CisJfQorCQorCS8qKgorCSAqIFJlc2V0cyB0aGUgc2luZ2xldG9uIEFudFRlc3RDaGVja2VyCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIHJlc2V0KCkgeworCQlpZiAoZGVmbHQgIT0gbnVsbCkgeworCQkJZGVmbHQucmVzZXRTdGF0ZSgpOworCQl9CisJfQorCS8qKgorCSAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMaXN0ZW5lciNidWlsZEZpbmlzaGVkKG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXZlbnQpCisJICovCisJcHVibGljIHZvaWQgYnVpbGRGaW5pc2hlZCgpIHsKKwkJYnVpbGRzRmluaXNoZWRDb3VudCsrOworCX0KKworCQorCXB1YmxpYyB2b2lkIGJ1aWxkU3RhcnRlZChTdHJpbmcgcHJvamVjdE5hbWUpIHsKKwkJYnVpbGRzU3RhcnRlZENvdW50Kys7CisJCXByb2plY3RzLmFkZChwcm9qZWN0TmFtZSk7CisJfQorCisJCisJcHVibGljIHZvaWQgbWVzc2FnZUxvZ2dlZChTdHJpbmcgbWVzc2FnZSkgeworCQltZXNzYWdlcy5hZGQobWVzc2FnZSk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZExpc3RlbmVyI3RhcmdldEZpbmlzaGVkKG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXZlbnQpCisJICovCisJcHVibGljIHZvaWQgdGFyZ2V0RmluaXNoZWQoKSB7CisJCXRhcmdldHNGaW5pc2hlZENvdW50Kys7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZExpc3RlbmVyI3RhcmdldFN0YXJ0ZWQob3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFdmVudCkKKwkgKi8KKwlwdWJsaWMgdm9pZCB0YXJnZXRTdGFydGVkKFN0cmluZyB0YXJnZXROYW1lKSB7CisJCXRhcmdldHNTdGFydGVkQ291bnQrKzsKKwkJdGFyZ2V0cy5hZGQodGFyZ2V0TmFtZSk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZExpc3RlbmVyI3Rhc2tGaW5pc2hlZChvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV2ZW50KQorCSAqLworCXB1YmxpYyB2b2lkIHRhc2tGaW5pc2hlZCgpIHsKKwkJdGFza0ZpbmlzaGVkQ291bnQrKzsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkTGlzdGVuZXIjdGFza1N0YXJ0ZWQob3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFdmVudCkKKwkgKi8KKwlwdWJsaWMgdm9pZCB0YXNrU3RhcnRlZChTdHJpbmcgdGFza05hbWUpIHsKKwkJdGFza1N0YXJ0ZWRDb3VudCsrOworCQl0YXNrcy5hZGQodGFza05hbWUpOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBidWlsZHNGaW5pc2hlZENvdW50LgorCSAqIEByZXR1cm4gaW50CisJICovCisJcHVibGljIGludCBnZXRCdWlsZHNGaW5pc2hlZENvdW50KCkgeworCQlyZXR1cm4gYnVpbGRzRmluaXNoZWRDb3VudDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBidWlsZHNTdGFydGVkQ291bnQuCisJICogQHJldHVybiBpbnQKKwkgKi8KKwlwdWJsaWMgaW50IGdldEJ1aWxkc1N0YXJ0ZWRDb3VudCgpIHsKKwkJcmV0dXJuIGJ1aWxkc1N0YXJ0ZWRDb3VudDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXNzYWdlc0xvZ2dlZENvdW50LgorCSAqIEByZXR1cm4gaW50CisJICovCisJcHVibGljIGludCBnZXRNZXNzYWdlc0xvZ2dlZENvdW50KCkgeworCQlyZXR1cm4gbWVzc2FnZXMuc2l6ZSgpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHRhcmdldHNGaW5pc2hlZENvdW50LgorCSAqIEByZXR1cm4gaW50CisJICovCisJcHVibGljIGludCBnZXRUYXJnZXRzRmluaXNoZWRDb3VudCgpIHsKKwkJcmV0dXJuIHRhcmdldHNGaW5pc2hlZENvdW50OworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHRhcmdldHNTdGFydGVkQ291bnQuCisJICogQHJldHVybiBpbnQKKwkgKi8KKwlwdWJsaWMgaW50IGdldFRhcmdldHNTdGFydGVkQ291bnQoKSB7CisJCXJldHVybiB0YXJnZXRzU3RhcnRlZENvdW50OworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHRhc2tGaW5pc2hlZENvdW50LgorCSAqIEByZXR1cm4gaW50CisJICovCisJcHVibGljIGludCBnZXRUYXNrRmluaXNoZWRDb3VudCgpIHsKKwkJcmV0dXJuIHRhc2tGaW5pc2hlZENvdW50OworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHRhc2tTdGFydGVkQ291bnQuCisJICogQHJldHVybiBpbnQKKwkgKi8KKwlwdWJsaWMgaW50IGdldFRhc2tTdGFydGVkQ291bnQoKSB7CisJCXJldHVybiB0YXNrU3RhcnRlZENvdW50OworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCByZXNldFN0YXRlKCkgeworCQl0YXNrU3RhcnRlZENvdW50PSAwOworCQl0YXNrRmluaXNoZWRDb3VudD0gMDsKKwkJdGFyZ2V0c1N0YXJ0ZWRDb3VudD0gMDsKKwkJdGFyZ2V0c0ZpbmlzaGVkQ291bnQ9IDA7CisJCWJ1aWxkc1N0YXJ0ZWRDb3VudD0gMDsKKwkJYnVpbGRzRmluaXNoZWRDb3VudD0gMDsKKwkJbWVzc2FnZXM9IG5ldyBBcnJheUxpc3QoKTsKKwkJdGFza3M9IG5ldyBBcnJheUxpc3QoKTsKKwkJdGFyZ2V0cz0gbmV3IEFycmF5TGlzdCgpOworCQlwcm9qZWN0cz0gbmV3IEFycmF5TGlzdCgpOworCQl1c2VyUHJvcGVydGllcz0gbnVsbDsKKwkJbmFtZU9mTGlzdGVuZXJzPSBuZXcgQXJyYXlMaXN0KCk7CisJfQorCQorCS8qKgorICAgICAqIFJldHVybiB0aGUgbWVzc2FnZSBuIGZyb20gdGhlIGxhc3Q6CisgICAgICogZS5nLiBnZXRMb2dnZWRNZXNzYWdlKDApIHJldHVybnMgdGhlIG1vc3QgcmVjZW50IG1lc3NhZ2UKKyAgICAgKiAKKwkgKiBAcGFyYW0gbiBtZXNzYWdlIGluZGV4CisJICogQHJldHVybiB0aGUgbnRoIGxhc3QgbWVzc2FnZQorCSAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9nZ2VkTWVzc2FnZShpbnQgbikgeworICAgICAgICBuID0gbWVzc2FnZXMuc2l6ZSgpIC0gKG4gKyAxKTsKKyAgICAgICAgaWYgKChuIDwgMCkgfHwgKG4gPj0gbWVzc2FnZXMuc2l6ZSgpKSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChTdHJpbmcpIG1lc3NhZ2VzLmdldChuKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldExhc3RNZXNzYWdlTG9nZ2VkKCkgeworICAgICAgICByZXR1cm4gZ2V0TG9nZ2VkTWVzc2FnZSgwKTsKKyAgICB9CisJCisJcHVibGljIHZvaWQgc2V0VXNlclByb3BlcnRpZXMoSGFzaHRhYmxlIHVzZXJQcm9wZXJ0aWVzKSB7CisJCXRoaXMudXNlclByb3BlcnRpZXM9IHVzZXJQcm9wZXJ0aWVzOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VXNlclByb3BlcnR5KFN0cmluZyBuYW1lKSB7CisJCXJldHVybiAoU3RyaW5nKXVzZXJQcm9wZXJ0aWVzLmdldChuYW1lKTsKKwl9CisJCisJcHVibGljIExpc3QgZ2V0TWVzc2FnZXMoKSB7CisJCXJldHVybiBtZXNzYWdlczsKKwl9CisJCisJcHVibGljIExpc3QgZ2V0TGlzdGVuZXJzKCkgeworCQlyZXR1cm4gbmFtZU9mTGlzdGVuZXJzOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldExhc3RMaXN0ZW5lcigpIHsKKwkJcmV0dXJuIChTdHJpbmcpbmFtZU9mTGlzdGVuZXJzLmdldChuYW1lT2ZMaXN0ZW5lcnMuc2l6ZSgpIC0gMSk7CisJfQorCisKKwlwdWJsaWMgdm9pZCBhZGROYW1lT2ZMaXN0ZW5lcihTdHJpbmcgbmFtZU9mTGlzdGVuZXIpIHsKKwkJdGhpcy5uYW1lT2ZMaXN0ZW5lcnMuYWRkKG5hbWVPZkxpc3RlbmVyKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdCBwbHVnaW4vb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvdGVzdHBsdWdpbi9BbnRUZXN0UGx1Z2luLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdCBwbHVnaW4vb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvdGVzdHBsdWdpbi9BbnRUZXN0UGx1Z2luLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U1ODEwMwotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0IHBsdWdpbi9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS90ZXN0cGx1Z2luL0FudFRlc3RQbHVnaW4uamF2YQpAQCAtMCwwICsxLDYzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUudGVzdHBsdWdpbjsKKworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlRGVzY3JpcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47CitpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKKworCitwdWJsaWMgY2xhc3MgQW50VGVzdFBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4geworCQorCXByaXZhdGUgc3RhdGljIEFudFRlc3RQbHVnaW4gZGVmbHQ7CisJCisJcHVibGljIEFudFRlc3RQbHVnaW4oKSB7CisJCXN1cGVyKCk7CisJCWRlZmx0PSB0aGlzOworCX0KKwkKKwlwdWJsaWMgc3RhdGljIEFudFRlc3RQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKKwkJcmV0dXJuIGRlZmx0OworCX0KKwkKKwlwdWJsaWMgc3RhdGljIElXb3Jrc3BhY2UgZ2V0V29ya3NwYWNlKCkgeworCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOworCX0KKwkKKwlwdWJsaWMgc3RhdGljIHZvaWQgZW5hYmxlQXV0b2J1aWxkKGJvb2xlYW4gZW5hYmxlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCS8vIGRpc2FibGUgYXV0byBidWlsZAorCQlJV29ya3NwYWNlIHdvcmtzcGFjZT0gQW50VGVzdFBsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKKwkJSVdvcmtzcGFjZURlc2NyaXB0aW9uIGRlc2M9IHdvcmtzcGFjZS5nZXREZXNjcmlwdGlvbigpOworCQlkZXNjLnNldEF1dG9CdWlsZGluZyhlbmFibGUpOworCQl3b3Jrc3BhY2Uuc2V0RGVzY3JpcHRpb24oZGVzYyk7CisJfQorCQorCXB1YmxpYyBGaWxlIGdldEZpbGVJblBsdWdpbihJUGF0aCBwYXRoKSB7CisJCXRyeSB7CisJCQlCdW5kbGUgYnVuZGxlID0gZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpOworCQkJVVJMIGluc3RhbGxVUkw9IG5ldyBVUkwoYnVuZGxlLmdldEVudHJ5KCIvIiksIHBhdGgudG9TdHJpbmcoKSk7CisJCQlVUkwgbG9jYWxVUkw9IEZpbGVMb2NhdG9yLnRvRmlsZVVSTChpbnN0YWxsVVJMKTsKKwkJCXJldHVybiBuZXcgRmlsZShsb2NhbFVSTC5nZXRGaWxlKCkpOworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0IHBsdWdpbi9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS90ZXN0cGx1Z2luL0FudFRlc3RQcm9wZXJ0eVZhbHVlUHJvdmlkZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0IHBsdWdpbi9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS90ZXN0cGx1Z2luL0FudFRlc3RQcm9wZXJ0eVZhbHVlUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzg2ZTk2Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3QgcGx1Z2luL29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3Rlc3RwbHVnaW4vQW50VGVzdFByb3BlcnR5VmFsdWVQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMjQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUudGVzdHBsdWdpbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5jb3JlLklBbnRQcm9wZXJ0eVZhbHVlUHJvdmlkZXI7CisKK3B1YmxpYyBjbGFzcyBBbnRUZXN0UHJvcGVydHlWYWx1ZVByb3ZpZGVyIGltcGxlbWVudHMgSUFudFByb3BlcnR5VmFsdWVQcm92aWRlciB7CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5hbnQuY29yZS5JQW50UHJvcGVydHlWYWx1ZVByb3ZpZGVyI2dldEFudFByb3BlcnR5VmFsdWUoamF2YS5sYW5nLlN0cmluZykKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldEFudFByb3BlcnR5VmFsdWUoU3RyaW5nIGFudFByb3BlcnR5TmFtZSkgeworCQlyZXR1cm4gIkFudFRlc3RQcm9wZXJ0eVZhbHVlUHJvdmlkZXIiOworCX0KKworfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3QgcGx1Z2luL29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3Rlc3RwbHVnaW4vUHJvamVjdEhlbHBlci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3QgcGx1Z2luL29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3Rlc3RwbHVnaW4vUHJvamVjdEhlbHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzODllZDcKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdCBwbHVnaW4vb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvdGVzdHBsdWdpbi9Qcm9qZWN0SGVscGVyLmphdmEKQEAgLTAsMCArMSwxMTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUudGVzdHBsdWdpbjsKKworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5JT3ZlcndyaXRlUXVlcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkud2l6YXJkcy5kYXRhdHJhbnNmZXIuKjsKKworLyoqCisgKiBIZWxwZXIgbWV0aG9kcyB0byBzZXQgdXAgYW4gSVByb2plY3QuCisgKi8KK3B1YmxpYyBjbGFzcyBQcm9qZWN0SGVscGVyIHsKKwkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIElQYXRoIFRFU1RfQlVJTERGSUxFU19ESVI9IG5ldyBQYXRoKCJ0ZXN0YnVpbGRmaWxlcyIpOworCXB1YmxpYyBzdGF0aWMgZmluYWwgSVBhdGggVEVTVF9SRVNPVVJDRVNfRElSPSBuZXcgUGF0aCgidGVzdHJlc291cmNlcyIpOwkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIElQYXRoIFRFU1RfTElCX0RJUj0gbmV3IFBhdGgoInRlc3RsaWIiKTsKKwkKKwkvKioKKwkgKiBDcmVhdGVzIGEgSVByb2plY3QuCisJICovCQorCXB1YmxpYyBzdGF0aWMgSVByb2plY3QgY3JlYXRlUHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJSVdvcmtzcGFjZVJvb3Qgcm9vdD0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKKwkJSVByb2plY3QgcHJvamVjdD0gcm9vdC5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKKwkJaWYgKCFwcm9qZWN0LmV4aXN0cygpKSB7CisJCQlwcm9qZWN0LmNyZWF0ZShudWxsKTsKKwkJfSBlbHNlIHsKKwkJCXByb2plY3QucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgbnVsbCk7CisJCX0KKwkJCisJCWlmICghcHJvamVjdC5pc09wZW4oKSkgeworCQkJcHJvamVjdC5vcGVuKG51bGwpOworCQl9CisJCQorCQlyZXR1cm4gcHJvamVjdDsKKwl9CisJCisJLyoqCisJICogUmVtb3ZlcyBhbiBJUHJvamVjdC4KKwkgKi8JCQorCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWxldGUoSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlwcm9qZWN0LmRlbGV0ZSh0cnVlLCB0cnVlLCBudWxsKTsKKwl9CisKKworCS8qKgorCSAqIEFkZHMgYSBmb2xkZXIgdG8gYW4gSVByb2plY3QuCisJICovCQkKKwlwdWJsaWMgc3RhdGljIElGb2xkZXIgYWRkRm9sZGVyKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBjb250YWluZXJOYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCQorCQkJSUZvbGRlciBmb2xkZXI9IHByb2plY3QuZ2V0Rm9sZGVyKGNvbnRhaW5lck5hbWUpOworCQkJaWYgKCFmb2xkZXIuZXhpc3RzKCkpIHsKKwkJCQlmb2xkZXIuY3JlYXRlKGZhbHNlLCB0cnVlLCBudWxsKTsKKwkJCX0KKwkJCisJCXJldHVybiBmb2xkZXI7CisJCQorCX0KKwkKKwlwdWJsaWMgc3RhdGljIHZvaWQgaW1wb3J0RmlsZXNGcm9tRGlyZWN0b3J5KEZpbGUgcm9vdERpciwgSVBhdGggZGVzdFBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsJCQorCQlJSW1wb3J0U3RydWN0dXJlUHJvdmlkZXIgc3RydWN0dXJlUHJvdmlkZXIgPSBGaWxlU3lzdGVtU3RydWN0dXJlUHJvdmlkZXIuSU5TVEFOQ0U7CisJCUxpc3QgZmlsZXMgPSBuZXcgQXJyYXlMaXN0KDEwMCk7CisJCWFkZEZpbGVzKHJvb3REaXIsIGZpbGVzKTsKKwkJdHJ5IHsKKwkJCUltcG9ydE9wZXJhdGlvbiBvcD0gbmV3IEltcG9ydE9wZXJhdGlvbihkZXN0UGF0aCwgcm9vdERpciwgc3RydWN0dXJlUHJvdmlkZXIsIG5ldyBJbXBvcnRPdmVyd3JpdGVRdWVyeSgpLCBmaWxlcyk7CisJCQlvcC5zZXRDcmVhdGVDb250YWluZXJTdHJ1Y3R1cmUoZmFsc2UpOworCQkJb3AucnVuKG1vbml0b3IpOworCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisJCQkvLyBzaG91bGQgbm90IGhhcHBlbgorCQl9CisJfQkKKwkKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZEZpbGVzKEZpbGUgZGlyLCBMaXN0IGNvbGxlY3Rpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUZpbGVbXSBmaWxlcyA9IGRpci5saXN0RmlsZXMoKTsKKwkJTGlzdCBzdWJEaXJzID0gbmV3IEFycmF5TGlzdCgyKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgeworCQkJaWYgKGZpbGVzW2ldLmlzRmlsZSgpKSB7CisJCQkJY29sbGVjdGlvbi5hZGQoZmlsZXNbaV0pOworCQkJfSBlbHNlIGlmIChmaWxlc1tpXS5pc0RpcmVjdG9yeSgpKSB7CisJCQkJc3ViRGlycy5hZGQoZmlsZXNbaV0pOworCQkJfQorCQl9CisJCUl0ZXJhdG9yIGl0ZXIgPSBzdWJEaXJzLml0ZXJhdG9yKCk7CisJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgeworCQkJRmlsZSBzdWJEaXIgPSAoRmlsZSlpdGVyLm5leHQoKTsKKwkJCWFkZEZpbGVzKHN1YkRpciwgY29sbGVjdGlvbik7CisJCX0KKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSW1wb3J0T3ZlcndyaXRlUXVlcnkgaW1wbGVtZW50cyBJT3ZlcndyaXRlUXVlcnkgeworCQlwdWJsaWMgU3RyaW5nIHF1ZXJ5T3ZlcndyaXRlKFN0cmluZyBmaWxlKSB7CisJCQlyZXR1cm4gQUxMOworCQl9CQorCX0KKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfTkFNRSA9ICJBbnRUZXN0cyI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVJTERGSUxFU19GT0xERVIgPSAiYnVpbGRmaWxlcyI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VTX0ZPTERFUiA9ICJyZXNvdXJjZXMiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJQl9GT0xERVIgPSAibGliIjsJCQkKK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0IHN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvc3VwcG9ydC9pbnB1dEhhbmRsZXJzL0FudFRlc3RJbnB1dEhhbmRsZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0IHN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvc3VwcG9ydC9pbnB1dEhhbmRsZXJzL0FudFRlc3RJbnB1dEhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmJlOGRjCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3Qgc3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS9zdXBwb3J0L2lucHV0SGFuZGxlcnMvQW50VGVzdElucHV0SGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUuc3VwcG9ydC5pbnB1dEhhbmRsZXJzOworCisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5pbnB1dC5EZWZhdWx0SW5wdXRIYW5kbGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LmlucHV0LklucHV0UmVxdWVzdDsKKworLyoqCisgKiBBIHRlc3QgaW5wdXQgaGFuZGxlciB3aGVuIHVzaW5nIEFudCB3aXRoaW4gRWNsaXBzZS4KKyAqIFRoaXMgaXMgdGhlIGNsYXNzIHRoYXQgd2lsbCByZXNwb25kIHRvIDxpbnB1dD4gcmVxdWVzdHMgZnJvbQorICogd2l0aGluIGFuIEFudCBidWlsZCBmaWxlLgorICogSWYgdGhlIGJ1aWxkIGlzIG9jY3VycmluZyBpbiBBbnQgMS42LjAgYW5kIHRoZSAtbm9pbnB1dCBvcHRpb24gaGFzIGJlZW4gc3BlY2lmaWVkCisgKiB0aGlzIGlucHV0IGhhbmRsZXIgd2lsbCBmYWlsLgorICovCitwdWJsaWMgY2xhc3MgQW50VGVzdElucHV0SGFuZGxlciBleHRlbmRzIERlZmF1bHRJbnB1dEhhbmRsZXIgeworCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LmlucHV0LklucHV0SGFuZGxlciNoYW5kbGVJbnB1dChvcmcuYXBhY2hlLnRvb2xzLmFudC5pbnB1dC5JbnB1dFJlcXVlc3QpCisJICovCisJcHVibGljIHZvaWQgaGFuZGxlSW5wdXQoSW5wdXRSZXF1ZXN0IHJlcXVlc3QpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisJCWlmIChTeXN0ZW0uZ2V0UHJvcGVydHkoImVjbGlwc2UuYW50Lm5vSW5wdXQiKSAhPSBudWxsKSB7IC8vJE5PTi1OTFMtMSQKKwkJCXRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVW5hYmxlIHRvIHJlc3BvbmQgdG8gaW5wdXQgcmVxdWVzdCBsaWtlbHkgYXMgYSByZXN1bHQgb2Ygc3BlY2lmeWluZyB0aGUgLW5vaW5wdXQgY29tbWFuZCIpOworCQl9CisJCXJlcXVlc3Quc2V0SW5wdXQoInRlc3RpbmcgaGFuZGxpbmcgaW5wdXQgcmVxdWVzdHMiKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdCBzdXBwb3J0L29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3N1cHBvcnQvdGFza3MvQW50VGVzdFRhc2suamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0IHN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvc3VwcG9ydC90YXNrcy9BbnRUZXN0VGFzay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3MzcyZjAKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdCBzdXBwb3J0L29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3N1cHBvcnQvdGFza3MvQW50VGVzdFRhc2suamF2YQpAQCAtMCwwICsxLDM1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLnN1cHBvcnQudGFza3M7CisKKworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5FY2hvOworCisKK3B1YmxpYyBjbGFzcyBBbnRUZXN0VGFzayBleHRlbmRzIFRhc2sgeworCQorCXB1YmxpYyBBbnRUZXN0VGFzaygpIHsKKwkJc3VwZXIoKTsKKwl9CisJCisJLyoqCisJICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrI2V4ZWN1dGUoKQorCSAqLworCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworCQlFY2hvIGVjaG89IG5ldyBFY2hvKCk7CisJCWVjaG8uc2V0UHJvamVjdChnZXRQcm9qZWN0KCkpOworCQllY2hvLnNldE1lc3NhZ2UoIlRlc3RpbmcgQW50IGluIEVjbGlwc2Ugd2l0aCBhIGN1c3RvbSB0YXNrIik7CisJCWVjaG8uZXhlY3V0ZSgpOworCX0KK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0IHN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvc3VwcG9ydC90YXNrcy9BbnRUZXN0VGFzazIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0IHN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvc3VwcG9ydC90YXNrcy9BbnRUZXN0VGFzazIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjQ0YmUyCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3Qgc3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS9zdXBwb3J0L3Rhc2tzL0FudFRlc3RUYXNrMi5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUuc3VwcG9ydC50YXNrczsKKworCisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkVjaG87CisKKworcHVibGljIGNsYXNzIEFudFRlc3RUYXNrMiBleHRlbmRzIFRhc2sgeworCQorCXB1YmxpYyBBbnRUZXN0VGFzazIoKSB7CisJCXN1cGVyKCk7CisJfQorCQorCS8qKgorCSAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzayNleGVjdXRlKCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKwkJRWNobyBlY2hvPSBuZXcgRWNobygpOworCQllY2hvLnNldFByb2plY3QoZ2V0UHJvamVjdCgpKTsKKwkJZWNoby5zZXRNZXNzYWdlKCJUZXN0aW5nIEFudCBpbiBFY2xpcHNlIHdpdGggYSBjdXN0b20gdGFzayIpOworCQllY2hvLmV4ZWN1dGUoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdCBzdXBwb3J0L29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3N1cHBvcnQvdGVzdGxvZ2dlcnMvVGVzdEJ1aWxkTGlzdGVuZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0IHN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvc3VwcG9ydC90ZXN0bG9nZ2Vycy9UZXN0QnVpbGRMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NDQ4ODAKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdCBzdXBwb3J0L29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3N1cHBvcnQvdGVzdGxvZ2dlcnMvVGVzdEJ1aWxkTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDY0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLnN1cHBvcnQudGVzdGxvZ2dlcnM7CisKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXZlbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS50ZXN0cGx1Z2luLkFudFRlc3RDaGVja2VyOworCisKK3B1YmxpYyBjbGFzcyBUZXN0QnVpbGRMaXN0ZW5lciBpbXBsZW1lbnRzIEJ1aWxkTGlzdGVuZXIgeworCisJLyoqCisJICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZExpc3RlbmVyI2J1aWxkRmluaXNoZWQob3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFdmVudCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBidWlsZEZpbmlzaGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkTGlzdGVuZXIjYnVpbGRTdGFydGVkKG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXZlbnQpCisJICovCisJcHVibGljIHZvaWQgYnVpbGRTdGFydGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKKwkJQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmFkZE5hbWVPZkxpc3RlbmVyKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMaXN0ZW5lciNtZXNzYWdlTG9nZ2VkKG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXZlbnQpCisJICovCisJcHVibGljIHZvaWQgbWVzc2FnZUxvZ2dlZChCdWlsZEV2ZW50IGV2ZW50KSB7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZExpc3RlbmVyI3RhcmdldEZpbmlzaGVkKG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXZlbnQpCisJICovCisJcHVibGljIHZvaWQgdGFyZ2V0RmluaXNoZWQoQnVpbGRFdmVudCBldmVudCkgeworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMaXN0ZW5lciN0YXJnZXRTdGFydGVkKG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXZlbnQpCisJICovCisJcHVibGljIHZvaWQgdGFyZ2V0U3RhcnRlZChCdWlsZEV2ZW50IGV2ZW50KSB7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZExpc3RlbmVyI3Rhc2tGaW5pc2hlZChvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV2ZW50KQorCSAqLworCXB1YmxpYyB2b2lkIHRhc2tGaW5pc2hlZChCdWlsZEV2ZW50IGV2ZW50KSB7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZExpc3RlbmVyI3Rhc2tTdGFydGVkKG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXZlbnQpCisJICovCisJcHVibGljIHZvaWQgdGFza1N0YXJ0ZWQoQnVpbGRFdmVudCBldmVudCkgeworCX0KKworfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3Qgc3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS9zdXBwb3J0L3Rlc3Rsb2dnZXJzL1Rlc3RCdWlsZExvZ2dlci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3Qgc3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS9zdXBwb3J0L3Rlc3Rsb2dnZXJzL1Rlc3RCdWlsZExvZ2dlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiOWQ4YWEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdCBzdXBwb3J0L29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3N1cHBvcnQvdGVzdGxvZ2dlcnMvVGVzdEJ1aWxkTG9nZ2VyLmphdmEKQEAgLTAsMCArMSwxNzggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUuc3VwcG9ydC50ZXN0bG9nZ2VyczsKKworCitpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXZlbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMb2dnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuY29yZS5BbnRTZWN1cml0eUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS50ZXN0cGx1Z2luLkFudFRlc3RDaGVja2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKKworcHVibGljIGNsYXNzIFRlc3RCdWlsZExvZ2dlciBpbXBsZW1lbnRzIEJ1aWxkTG9nZ2VyIHsKKworCXByaXZhdGUgaW50IGZNZXNzYWdlT3V0cHV0TGV2ZWw9IFByb2plY3QuTVNHX0lORk87CisJcHJpdmF0ZSBQcmludFN0cmVhbSBmRXJyPSBudWxsOworCXByaXZhdGUgUHJpbnRTdHJlYW0gZk91dD0gbnVsbDsKKyAgICBwcml2YXRlIGJvb2xlYW4gZlNldFByb3BlcnRpZXM9IHRydWU7CisJCisJLyoqCisJICogQW4gZXhjZXB0aW9uIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBsb2dnZWQuCisJICovCisJcHJpdmF0ZSBUaHJvd2FibGUgZkhhbmRsZWRFeGNlcHRpb249IG51bGw7CisJCisJCisJcHVibGljIFRlc3RCdWlsZExvZ2dlcigpIHsKKwl9CisJCisJLyoqCisJICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZExvZ2dlciNzZXRNZXNzYWdlT3V0cHV0TGV2ZWwoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIHNldE1lc3NhZ2VPdXRwdXRMZXZlbChpbnQgbGV2ZWwpIHsKKwkJZk1lc3NhZ2VPdXRwdXRMZXZlbD0gbGV2ZWw7CisJfQorCQorCXByb3RlY3RlZCBpbnQgZ2V0TWVzc2FnZU91dHB1dExldmVsKCkgeworCQlyZXR1cm4gZk1lc3NhZ2VPdXRwdXRMZXZlbDsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkTG9nZ2VyI3NldEVtYWNzTW9kZShib29sZWFuKQorCSAqLworCXB1YmxpYyB2b2lkIHNldEVtYWNzTW9kZShib29sZWFuIGVtYWNzTW9kZSkgeworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMaXN0ZW5lciNidWlsZFN0YXJ0ZWQob3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFdmVudCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBidWlsZFN0YXJ0ZWQoQnVpbGRFdmVudCBldmVudCkgeworCQlBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuYnVpbGRTdGFydGVkKGV2ZW50LmdldFByb2plY3QoKS5nZXROYW1lKCkpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMaXN0ZW5lciNidWlsZEZpbmlzaGVkKG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXZlbnQpCisJICovCisJcHVibGljIHZvaWQgYnVpbGRGaW5pc2hlZChCdWlsZEV2ZW50IGV2ZW50KSB7CisJCWhhbmRsZUV4Y2VwdGlvbihldmVudCk7CisJCWZIYW5kbGVkRXhjZXB0aW9uPSBudWxsOworCQlBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuYnVpbGRGaW5pc2hlZCgpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMaXN0ZW5lciN0YXJnZXRTdGFydGVkKG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXZlbnQpCisJICovCisJcHVibGljIHZvaWQgdGFyZ2V0U3RhcnRlZChCdWlsZEV2ZW50IGV2ZW50KSB7CisJCUFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS50YXJnZXRTdGFydGVkKGV2ZW50LmdldFRhcmdldCgpLmdldE5hbWUoKSk7CisgICAgICAgIGlmIChmU2V0UHJvcGVydGllcykgeworICAgICAgICAgICAgZlNldFByb3BlcnRpZXM9IGZhbHNlOworICAgICAgICAgICAgQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLnNldFVzZXJQcm9wZXJ0aWVzKGV2ZW50LmdldFByb2plY3QoKS5nZXRQcm9wZXJ0aWVzKCkpOworICAgICAgICB9CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZExpc3RlbmVyI3RhcmdldEZpbmlzaGVkKG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXZlbnQpCisJICovCisJcHVibGljIHZvaWQgdGFyZ2V0RmluaXNoZWQoQnVpbGRFdmVudCBldmVudCkgeworCQloYW5kbGVFeGNlcHRpb24oZXZlbnQpOworCQlBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkudGFyZ2V0RmluaXNoZWQoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkTGlzdGVuZXIjdGFza1N0YXJ0ZWQob3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFdmVudCkKKwkgKi8KKwlwdWJsaWMgdm9pZCB0YXNrU3RhcnRlZChCdWlsZEV2ZW50IGV2ZW50KSB7CisJCUFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS50YXNrU3RhcnRlZChldmVudC5nZXRUYXNrKCkuZ2V0VGFza05hbWUoKSk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZExpc3RlbmVyI3Rhc2tGaW5pc2hlZChvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV2ZW50KQorCSAqLworCXB1YmxpYyB2b2lkIHRhc2tGaW5pc2hlZChCdWlsZEV2ZW50IGV2ZW50KSB7CisJCWhhbmRsZUV4Y2VwdGlvbihldmVudCk7CisJCUFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS50YXJnZXRGaW5pc2hlZCgpOworCX0KKworCS8qKgorCSAqIEBzZWUgQnVpbGRMaXN0ZW5lciNtZXNzYWdlTG9nZ2VkKEJ1aWxkRXZlbnQpCisJICovCisJcHVibGljIHZvaWQgbWVzc2FnZUxvZ2dlZChCdWlsZEV2ZW50IGV2ZW50KSB7CisJCWlmIChldmVudC5nZXRQcmlvcml0eSgpID4gZ2V0TWVzc2FnZU91dHB1dExldmVsKCkpIHsKKwkJCXJldHVybjsKKwkJfQorCQlsb2dNZXNzYWdlKGV2ZW50LmdldE1lc3NhZ2UoKSwgZXZlbnQuZ2V0UHJpb3JpdHkoKSk7CisJCUFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5tZXNzYWdlTG9nZ2VkKGV2ZW50LmdldE1lc3NhZ2UoKSk7CisJfQorCisJcHJvdGVjdGVkIFByaW50U3RyZWFtIGdldEVycm9yUHJpbnRTdHJlYW0oKSB7CisJCXJldHVybiBmRXJyOworCX0KKwkKKwlwcm90ZWN0ZWQgUHJpbnRTdHJlYW0gZ2V0T3V0cHV0UHJpbnRTdHJlYW0oKSB7CisJCXJldHVybiBmT3V0OworCX0KKwkKKwkvKioKKwkgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkTG9nZ2VyI3NldEVycm9yUHJpbnRTdHJlYW0oamF2YS5pby5QcmludFN0cmVhbSkKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRFcnJvclByaW50U3RyZWFtKFByaW50U3RyZWFtIGVycikgeworCQkvL3RoaXMgYnVpbGQgbG9nZ2VyIGxvZ3MgdG8gIm51bGwiIHVubGVzcworCQkvL3RoZSB1c2VyIGhhcyBleHBsaWNpdGx5IHNldCBhIGxvZ2ZpbGUgdG8gdXNlCisJCWlmIChlcnIgPT0gU3lzdGVtLmVycikgeworCQkJZkVycj0gbnVsbDsKKwkJfSBlbHNlIHsKKwkJCWZFcnI9IGVycjsKKwkJfQorCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMb2dnZXIjc2V0T3V0cHV0UHJpbnRTdHJlYW0oamF2YS5pby5QcmludFN0cmVhbSkKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRPdXRwdXRQcmludFN0cmVhbShQcmludFN0cmVhbSBvdXRwdXQpIHsKKwkJLy90aGlzIGJ1aWxkIGxvZ2dlciBsb2dzIHRvICJudWxsIiB1bmxlc3MKKwkJLy90aGUgdXNlciBoYXMgZXhwbGljaXRseSBzZXQgYSBsb2dmaWxlIHRvIHVzZQorCQlpZiAob3V0cHV0ID09IFN5c3RlbS5vdXQpIHsKKwkJCWZPdXQ9IG51bGw7CisJCX0gZWxzZSB7CisJCQlmT3V0PSBvdXRwdXQ7CisJCX0KKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgbG9nTWVzc2FnZShTdHJpbmcgbWVzc2FnZSwgaW50IHByaW9yaXR5KSB7CisJCWlmIChwcmlvcml0eSA+IGdldE1lc3NhZ2VPdXRwdXRMZXZlbCgpKSB7CisJCQlyZXR1cm47CisJCX0KKwkJCisJCWlmIChwcmlvcml0eSA9PSBQcm9qZWN0Lk1TR19FUlIpIHsKKwkJCWlmIChnZXRFcnJvclByaW50U3RyZWFtKCkgIT0gbnVsbCAmJiBnZXRFcnJvclByaW50U3RyZWFtKCkgIT0gU3lzdGVtLmVycikgeworCQkJCS8vdXNlciBoYXMgZGVzaWduYXRlZCB0byBsb2cgdG8gYSBsb2dmaWxlCisJCQkJZ2V0RXJyb3JQcmludFN0cmVhbSgpLnByaW50bG4obWVzc2FnZSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoZ2V0T3V0cHV0UHJpbnRTdHJlYW0oKSAhPSBudWxsICYmIGdldE91dHB1dFByaW50U3RyZWFtKCkgIT0gU3lzdGVtLm91dCkgeworCQkJCS8vdXNlciBoYXMgZGVzaWduYXRlZCB0byBsb2cgdG8gYSBsb2dmaWxlCisJCQkJZ2V0T3V0cHV0UHJpbnRTdHJlYW0oKS5wcmludGxuKG1lc3NhZ2UpOworCQkJfSAKKwkJfQorCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVFeGNlcHRpb24oQnVpbGRFdmVudCBldmVudCkgeworCQlUaHJvd2FibGUgZXhjZXB0aW9uID0gZXZlbnQuZ2V0RXhjZXB0aW9uKCk7CisJCWlmIChleGNlcHRpb24gPT0gbnVsbCB8fCBleGNlcHRpb24gPT0gZkhhbmRsZWRFeGNlcHRpb24KKwkJfHwgZXhjZXB0aW9uIGluc3RhbmNlb2YgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24KKwkJfHwgZXhjZXB0aW9uIGluc3RhbmNlb2YgQW50U2VjdXJpdHlFeGNlcHRpb24pIHsKKwkJCXJldHVybjsKKwkJfQorCQlmSGFuZGxlZEV4Y2VwdGlvbj0gZXhjZXB0aW9uOworCX0KK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0IHN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvc3VwcG9ydC90eXBlcy9BbnRUZXN0UGF0aC5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3Qgc3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS9zdXBwb3J0L3R5cGVzL0FudFRlc3RQYXRoLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVlOWJmMgotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0IHN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvc3VwcG9ydC90eXBlcy9BbnRUZXN0UGF0aC5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUuc3VwcG9ydC50eXBlczsKKworCisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGg7CisKK3B1YmxpYyBjbGFzcyBBbnRUZXN0UGF0aCBleHRlbmRzIFBhdGggeworCQorCVN0cmluZyBtZXNzYWdlOworCQorCXB1YmxpYyBBbnRUZXN0UGF0aChQcm9qZWN0IHByb2plY3QpIHsKKwkJc3VwZXIocHJvamVjdCk7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKKwkJdGhpcy5tZXNzYWdlPSBtZXNzYWdlOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7CisJCXJldHVybiBtZXNzYWdlOworCX0KKwkKK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0LnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjZkYWE1Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3QueG1sCkBAIC0wLDAgKzEsNTQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorCis8cHJvamVjdCBuYW1lPSJ0ZXN0c3VpdGUiIGRlZmF1bHQ9InJ1biIgYmFzZWRpcj0iLiI+CisgIDwhLS0gc2V0cyB0aGUgcHJvcGVydGllcyBlY2xpcHNlLWhvbWUsIGFuZCBsaWJyYXJ5LWZpbGUgLS0+CisgIDwhLS0gVGhlIHByb3BlcnR5ICR7ZWNsaXBzZS1ob21lfSBzaG91bGQgYmUgcGFzc2VkIGludG8gdGhpcyBzY3JpcHQgLS0+CisgIDwhLS0gU2V0IGEgbWVhbmluZ2Z1bCBkZWZhdWx0IHZhbHVlIGZvciB3aGVuIGl0IGlzIG5vdC4gLS0+CisgIDxwcm9wZXJ0eSBuYW1lPSJlY2xpcHNlLWhvbWUiIHZhbHVlPSIke2Jhc2VkaXJ9XC4uXC4uIi8+Cis8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSJvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZSIvPgorICA8cHJvcGVydHkgbmFtZT0ibGlicmFyeS1maWxlIgorICAgICAgICAgICAgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9wbHVnaW5zL29yZy5lY2xpcHNlLnRlc3QvbGlicmFyeS54bWwiLz4KKyAKKyAgPCEtLSBUaGlzIHRhcmdldCBob2xkcyBhbGwgaW5pdGlhbGl6YXRpb24gY29kZSB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgZm9yIC0tPgorICA8IS0tIGFsbCB0ZXN0cyB0aGF0IGFyZSB0byBiZSBydW4uIEluaXRpYWxpemF0aW9uIGZvciBpbmRpdmlkdWFsIHRlc3RzIC0tPgorICA8IS0tIHNob3VsZCBiZSBkb25lIHdpdGhpbiB0aGUgYm9keSBvZiB0aGUgc3VpdGUgdGFyZ2V0LiAtLT4KKyAgPHRhcmdldCBuYW1lPSJpbml0Ij4KKyAgICA8dHN0YW1wLz4KKyAgICA8ZGVsZXRlPgorICAgICAgPGZpbGVzZXQgZGlyPSIke2VjbGlwc2UtaG9tZX0iIGluY2x1ZGVzPSJvcmcqLnhtbCIvPgorICAgIDwvZGVsZXRlPgorICA8L3RhcmdldD4KKworICA8IS0tIFRoaXMgdGFyZ2V0IGRlZmluZXMgdGhlIHRlc3RzIHRoYXQgbmVlZCB0byBiZSBydW4uIC0tPgorICA8dGFyZ2V0IG5hbWU9InN1aXRlIj4KKyAgICA8cHJvcGVydHkgbmFtZT0iamR0LWZvbGRlciIgCisgICAgICAgICAgICAgIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vamR0X2ZvbGRlciIvPgorICAgIDxkZWxldGUgZGlyPSIke2pkdC1mb2xkZXJ9IiBxdWlldD0idHJ1ZSIvPgorICAgIDxhbnQgdGFyZ2V0PSJjb3JlLXRlc3QiIGFudGZpbGU9IiR7bGlicmFyeS1maWxlfSIgZGlyPSIke2VjbGlwc2UtaG9tZX0iPgorICAgICAgPHByb3BlcnR5IG5hbWU9ImRhdGEtZGlyIiB2YWx1ZT0iJHtqZHQtZm9sZGVyfSIvPgorICAgICAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0iLz4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc25hbWUiIAorICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS5BdXRvbWF0ZWRTdWl0ZSIvPgorICAgIDwvYW50PgorICA8L3RhcmdldD4KKworICA8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGNvZGUgdG8gY2xlYW51cCB0aGUgdGVzdGluZyBlbnZpcm9ubWVudCBhZnRlciAtLT4KKyAgPCEtLSBhZnRlciBhbGwgb2YgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4uIFlvdSBjYW4gdXNlIHRoaXMgdGFyZ2V0IHRvIC0tPgorICA8IS0tIGRlbGV0ZSB0ZW1wb3JhcnkgZmlsZXMgdGhhdCBoYXZlIGJlZW4gY3JlYXRlZC4gLS0+CisgIDx0YXJnZXQgbmFtZT0iY2xlYW51cCI+CisgIDwvdGFyZ2V0PgorCisgIDwhLS0gVGhpcyB0YXJnZXQgcnVucyB0aGUgdGVzdCBzdWl0ZS4gQW55IGFjdGlvbnMgdGhhdCBuZWVkIHRvIGhhcHBlbiAtLT4KKyAgPCEtLSBhZnRlciBhbGwgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4gc2hvdWxkIGdvIGhlcmUuIC0tPgorICA8dGFyZ2V0IG5hbWU9InJ1biIgZGVwZW5kcz0iaW5pdCxzdWl0ZSxjbGVhbnVwIj4KKyAgICA8YW50IHRhcmdldD0iY29sbGVjdCIgYW50ZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+CisgICAgICA8cHJvcGVydHkgbmFtZT0iaW5jbHVkZXMiIHZhbHVlPSJvcmcqLnhtbCIvPgorICAgICAgPHByb3BlcnR5IG5hbWU9Im91dHB1dC1maWxlIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0ueG1sIi8+CisgICAgPC9hbnQ+CisgIDwvdGFyZ2V0PgorCisgIDwhLS0gVGhpcyB0YXJnZXQgcnVucyB0aGUgcGVyZm9ybWFuY2UgdGVzdCBzdWl0ZXMuIC0tPgorICA8dGFyZ2V0IG5hbWU9InBlcmZvcm1hbmNlIj4KKyAgPC90YXJnZXQ+CQorCQorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RidWlsZGZpbGVzL0J1ZzMyNTUxLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0YnVpbGRmaWxlcy9CdWczMjU1MS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU0Mzk5NwotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0YnVpbGRmaWxlcy9CdWczMjU1MS54bWwKQEAgLTAsMCArMSwxNSBAQAorPHByb2plY3QgbmFtZT0iYnVnIiBkZWZhdWx0PSJhbGwiPgorIDxwYXRoIGlkPSJteWNsYXNzcGF0aCI+CisgCTxmaWxlc2V0IGRpcj0iLi5cbGliIj4KKyAgCQk8aW5jbHVkZSBuYW1lPSJhbnRUZXN0c1N1cHBvcnQuamFyIiAvPiAKKyAgCTwvZmlsZXNldD4KKyAgPC9wYXRoPgorICAKKyA8dGFza2RlZiBuYW1lPSJoZWxsbyIgY2xhc3NuYW1lPSJvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS5zdXBwb3J0LnRhc2tzLkFudFRlc3RUYXNrIj4KKyAgCTxjbGFzc3BhdGggcmVmaWQ9Im15Y2xhc3NwYXRoIiAvPiAKKyAgPC90YXNrZGVmPgorICAKKyA8dGFyZ2V0IG5hbWU9ImFsbCI+CisgIAk8aGVsbG8gLz4gCisgIDwvdGFyZ2V0PgorICA8L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RidWlsZGZpbGVzL0J1ZzM0NjYzLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0YnVpbGRmaWxlcy9CdWczNDY2My54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ3OWY5MAotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0YnVpbGRmaWxlcy9CdWczNDY2My54bWwKQEAgLTAsMCArMSw4IEBACis8cHJvamVjdCBuYW1lPSIzNDY2My54bWwiIGRlZmF1bHQ9ImVjaG9QIj4KKworPHRhc2tkZWYgZmlsZT0iJHtST09URElSfS90YXNrZGVmcy5wcm9wZXJ0aWVzIiAvPgorIAorIDx0YXJnZXQgbmFtZT0iZWNob1AiPgorIAk8bXlFY2hvUHJvcGVydGllcy8+CisgPC90YXJnZXQ+Cis8L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RidWlsZGZpbGVzL0J1ZzQyOTI2LnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0YnVpbGRmaWxlcy9CdWc0MjkyNi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JiODZhMgotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0YnVpbGRmaWxlcy9CdWc0MjkyNi54bWwKQEAgLTAsMCArMSwxMiBAQAorPHByb2plY3QgZGVmYXVsdD0iYWxsIj4KKwk8cGF0aCBpZD0ic29tZWNsYXNzcGF0aCI+CisJCTxmaWxlc2V0IGRpcj0iJHthbnQuaG9tZX0vbGliIiBpbmNsdWRlcz0ic29tZXRhc2suamFyIi8+CisJPC9wYXRoPgorCisJPHRhc2tkZWYgbmFtZT0ic29tZXRhc2siIGNsYXNzbmFtZT0iY29tLmZvby5Tb21lVGFzayIKK2NsYXNzcGF0aHJlZj0ic29tZWNsYXNzcGF0aCIvPgorCisJPHRhcmdldCBuYW1lPSJhbGwiPgorCQk8ZWNobz5IZWxsbyAke2FudC5ob21lfTwvZWNobz4KKwk8L3RhcmdldD4KKzwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvQnVnNzM2MDIueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RidWlsZGZpbGVzL0J1ZzczNjAyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDVhMmJkCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RidWlsZGZpbGVzL0J1ZzczNjAyLnhtbApAQCAtMCwwICsxLDEzIEBACis8cHJvamVjdCBuYW1lPSJtYWluIiBkZWZhdWx0PSJhbGwiPgorICAgIDx0YXNrZGVmIHJlc291cmNlPSJ0YXNrZGVmcy5wcm9wZXJ0aWVzIi8+CisgICAgPGhlbGxvLz4KKyAgICA8dGFyZ2V0IG5hbWU9ImFsbCI+CisgICAgICAgIDxlY2hvPkhlbGxvPC9lY2hvPgorICAgIDwvdGFyZ2V0PgorCTx0YXJnZXQgbmFtZT0iYWxsMyI+CisJICAgICAgICA8ZWNobz5IZWxsbzwvZWNobz4KKwkgICAgPC90YXJnZXQ+CisJPHRhcmdldCBuYW1lPSJhbGw0Ij4KKwkgICAgICAgIDxlY2hvPkhlbGxvPC9lY2hvPgorCSAgICA8L3RhcmdldD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0YnVpbGRmaWxlcy9DbGFzc3BhdGhPcmRlcmluZy54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvQ2xhc3NwYXRoT3JkZXJpbmcueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5OWI2NWUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvQ2xhc3NwYXRoT3JkZXJpbmcueG1sCkBAIC0wLDAgKzEsNiBAQAorPHByb2plY3QgbmFtZT0iQ2xhc3NwYXRoT3JkZXJpbmciIGRlZmF1bHQ9Im9yZGVyZWQiIGJhc2VkaXI9Ii4uIj4KKworCTx0YXJnZXQgbmFtZT0ib3JkZXJlZCI+CisJCTxqYXZhIGNsYXNzbmFtZT0gIkNsYXNzcGF0aE9yZGVyaW5nIi8+CisJPC90YXJnZXQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvQ3VzdG9tVGFzay54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvQ3VzdG9tVGFzay54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM1MjVjOAotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0YnVpbGRmaWxlcy9DdXN0b21UYXNrLnhtbApAQCAtMCwwICsxLDEzIEBACis8cHJvamVjdCBuYW1lPSJDdXN0b20gVGFzayIgZGVmYXVsdD0iQ3VzdG9tIFRhc2siIGJhc2VkaXI9Ii4iPgorCTx0YXJnZXQgbmFtZT0iaW5pdCI+CisJCTx0c3RhbXAvPgorCTwvdGFyZ2V0PgorCisJPHRhcmdldCBuYW1lPSJDdXN0b20gVGFzayIgZGVzY3JpcHRpb249ICJUZXN0IGFkZGluZyBhIGN1c3RvbSB0YXNrIiBkZXBlbmRzPSJpbml0Ij4KKwkJPEFudFRlc3RUYXNrLz4KKwk8L3RhcmdldD4KKwkKKwk8dGFyZ2V0IG5hbWU9IkN1c3RvbSBUYXNrIGZyb20gRW50cnkiIGRlc2NyaXB0aW9uPSAiVGVzdCBhZGRpbmcgYSBjdXN0b20gdGFzayI+CisJCTxBbnRUZXN0VGFzazIvPgorCTwvdGFyZ2V0PgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RidWlsZGZpbGVzL0N1c3RvbVR5cGUueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RidWlsZGZpbGVzL0N1c3RvbVR5cGUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhZTFlZjUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvQ3VzdG9tVHlwZS54bWwKQEAgLTAsMCArMSwxNiBAQAorPHByb2plY3QgbmFtZT0iQ3VzdG9tIFR5cGUiIGRlZmF1bHQ9IkN1c3RvbSBUeXBlIiBiYXNlZGlyPSIuIj4KKworCTxhbnR0ZXN0cGF0aCBpZD0iY29tcGlsZS5jbGFzc3BhdGgiPgorICAgICAgPGZpbGVzZXQgZGlyPSJsaWIiPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmphciIvPgorICAgICAgPC9maWxlc2V0PgorICAgIDwvYW50dGVzdHBhdGg+CisgICAgCisJPHRhcmdldCBuYW1lPSJpbml0Ij4KKwkJPHRzdGFtcC8+CisJPC90YXJnZXQ+CisKKwk8dGFyZ2V0IG5hbWU9IkN1c3RvbSBUeXBlIiBkZXNjcmlwdGlvbj0gIlRlc3QgYWRkaW5nIGEgY3VzdG9tIHR5cGUiIGRlcGVuZHM9ImluaXQiPgorCQk8ZWNobyBtZXNzYWdlPSJUZXN0IGFkZGluZyBhIGN1c3RvbSB0eXBlIi8+CisJPC90YXJnZXQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvRXh0ZW5zaW9uUG9pbnRUYXNrLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0YnVpbGRmaWxlcy9FeHRlbnNpb25Qb2ludFRhc2sueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4YzZiYjQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvRXh0ZW5zaW9uUG9pbnRUYXNrLnhtbApAQCAtMCwwICsxLDE2IEBACis8IS0tCisgICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAgICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAgICAKKyAgICAgQ29udHJpYnV0b3JzOgorICAgICAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgLS0+Cis8cHJvamVjdCBuYW1lPSJFeHRlbnNpb24gUG9pbnQgVGFzayIgZGVmYXVsdD0iRXh0ZW5zaW9uIFBvaW50IFRhc2siIGJhc2VkaXI9Ii4iPgorCTx0YXJnZXQgbmFtZT0iRXh0ZW5zaW9uIFBvaW50IFRhc2siIGRlc2NyaXB0aW9uPSAiRW5zdXJlIHRoYXQgYW4gZXh0ZW5zaW9uIHBvaW50IGRlZmluZWQgdGFzayBpcyBwcmVzZW50Ij4KKwkJPGNvb2xUYXNrLz4KKwkJPG15OmNvb2xUYXNrIHhtbG5zOm15PSJ0ZXN0aW5nIi8+CisJPC90YXJnZXQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvRXh0ZW5zaW9uUG9pbnRUeXBlLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0YnVpbGRmaWxlcy9FeHRlbnNpb25Qb2ludFR5cGUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiYWFhZWMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvRXh0ZW5zaW9uUG9pbnRUeXBlLnhtbApAQCAtMCwwICsxLDEyIEBACis8cHJvamVjdCBuYW1lPSJFeHRlbnNpb24gUG9pbnQgVHlwZSIgZGVmYXVsdD0iRXh0ZW5zaW9uIFBvaW50IFR5cGUiIGJhc2VkaXI9Ii4iPgorCisJPGNvb2xUeXBlIGlkPSJjb21waWxlLmNsYXNzcGF0aCI+CisgICAgICA8ZmlsZXNldCBkaXI9ImxpYiI+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouamFyIi8+CisgICAgICA8L2ZpbGVzZXQ+CisgICAgPC9jb29sVHlwZT4KKyAgICAKKwk8dGFyZ2V0IG5hbWU9IkV4dGVuc2lvbiBQb2ludCBUeXBlIiBkZXNjcmlwdGlvbj0gIkVuc3VyZSB0aGF0IGFuIGV4dGVuc2lvbiBwb2ludCBkZWZpbmVkIHR5cGUgaXMgcHJlc2VudCI+CisJCTxlY2hvIG1lc3NhZ2U9IkVuc3VyZSB0aGF0IGFuIGV4dGVuc2lvbiBwb2ludCBkZWZpbmVkIHR5cGUgaXMgcHJlc2VudCIvPgorCTwvdGFyZ2V0PgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RidWlsZGZpbGVzL05vRGVmYXVsdC54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvTm9EZWZhdWx0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2M5MTRhCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RidWlsZGZpbGVzL05vRGVmYXVsdC54bWwKQEAgLTAsMCArMSw1IEBACis8cHJvamVjdCBuYW1lPSAiVGVzdGluZyI+CisJPHRhcmdldCBuYW1lPSAidGVzdCI+CisJCTxlY2hvIG1lc3NhZ2U9InRlc3RpbmciLz4KKwk8L3RhcmdldD4KKzwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvVGVzdEZvckVjaG8ueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RidWlsZGZpbGVzL1Rlc3RGb3JFY2hvLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjEzZTVlCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RidWlsZGZpbGVzL1Rlc3RGb3JFY2hvLnhtbApAQCAtMCwwICsxLDExIEBACis8cHJvamVjdCBuYW1lPSJFY2hvIFRlc3QiIGRlZmF1bHQ9IlRlc3QgZm9yIEVjaG8iIGJhc2VkaXI9Ii4iPgorCTx0YXJnZXQgbmFtZT0iaW5pdCI+CisJCTx0c3RhbXAvPgorCTwvdGFyZ2V0PgorCisJPHRhcmdldCBuYW1lPSJUZXN0IGZvciBFY2hvIiBkZXNjcmlwdGlvbj0gIkNhbGxzIG90aGVyIGVjaG9zIiBkZXBlbmRzPSJpbml0Ij4KKwkJPGFudCBhbnRmaWxlPSJidWlsZGZpbGVzL2VjaG9pbmcueG1sIiBkaXI9Ii4uLy4uL0FudFRlc3RzIiB0YXJnZXQ9ImVjaG8xIi8+CisJCTxhbnQgYW50ZmlsZT0iYnVpbGRmaWxlcy9lY2hvaW5nLnhtbCIgZGlyPSIuLi8uLi9BbnRUZXN0cyIgdGFyZ2V0PSJlY2hvMiIvPgorCQk8YW50IGFudGZpbGU9ImJ1aWxkZmlsZXMvZWNob2luZy54bWwiIGRpcj0iLi4vLi4vQW50VGVzdHMiIHRhcmdldD0iZWNobzMiLz4KKwk8L3RhcmdldD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0YnVpbGRmaWxlcy9idWlsZC54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvYnVpbGQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MzhhNTMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvYnVpbGQueG1sCkBAIC0wLDAgKzEsMTQgQEAKKzxwcm9qZWN0IG5hbWU9IkVjaGluZyIgZGVmYXVsdD0iZWNobzEiIGJhc2VkaXI9Ii4uIj4KKworCTx0YXJnZXQgbmFtZT0iZWNobzEiPgorCQk8ZWNobyBtZXNzYWdlPSJlY2hvMSIvPgorCTwvdGFyZ2V0PgorCQorCTx0YXJnZXQgbmFtZT0iZWNobzIiPgorCQk8ZWNobyBtZXNzYWdlPSJlY2hvMiIvPgorCTwvdGFyZ2V0PgorCQorCTx0YXJnZXQgbmFtZT0iZWNobzMiIGRlc2NyaXB0aW9uPSAiQW4gZWNobzMhIj4KKwkJPGVjaG8gbWVzc2FnZT0iZWNobzMiLz4KKwk8L3RhcmdldD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0YnVpbGRmaWxlcy9lY2hvaW5nLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0YnVpbGRmaWxlcy9lY2hvaW5nLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2RkNjRkCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RidWlsZGZpbGVzL2VjaG9pbmcueG1sCkBAIC0wLDAgKzEsMTQgQEAKKzxwcm9qZWN0IG5hbWU9IkVjaG9pbmciIGRlZmF1bHQ9ImVjaG8xIiBiYXNlZGlyPSIuLiI+CisKKwk8dGFyZ2V0IG5hbWU9ImVjaG8xIj4KKwkJPGVjaG8gbWVzc2FnZT0iZWNobzEiLz4KKwk8L3RhcmdldD4KKwkKKwk8dGFyZ2V0IG5hbWU9ImVjaG8yIj4KKwkJPGVjaG8gbWVzc2FnZT0iZWNobzIiLz4KKwk8L3RhcmdldD4KKwkKKwk8dGFyZ2V0IG5hbWU9ImVjaG8zIiBkZXNjcmlwdGlvbj0gIkFuIGVjaG8zISI+CisJCTxlY2hvIG1lc3NhZ2U9ImVjaG8zIi8+CisJPC90YXJnZXQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvZmFpbGluZ1RhcmdldC54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvZmFpbGluZ1RhcmdldC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ0MThlMAotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0YnVpbGRmaWxlcy9mYWlsaW5nVGFyZ2V0LnhtbApAQCAtMCwwICsxLDkgQEAKKzxwcm9qZWN0IGRlZmF1bHQ9ImFsbCI+CisJPHRhcmdldCBuYW1lPSJhbGwiIGRlcGVuZHM9ImZhaWxzLCBlY2hvcyIvPgorCTx0YXJnZXQgbmFtZT0iZmFpbHMiPgorCQk8amFyIGphcmZpbGU9ImphcjE2LmphciIgYmFzZWRpcj0iZG9lc05vdEV4aXN0Ii8+CisJPC90YXJnZXQ+CisJPHRhcmdldCBuYW1lPSJlY2hvcyI+CisJCTxlY2hvPlN0aWxsIGVjaG8gb24gZmFpbHVyZTwvZWNobz4KKwk8L3RhcmdldD4KKzwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvaW5wdXQueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RidWlsZGZpbGVzL2lucHV0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDcwYWI1Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RidWlsZGZpbGVzL2lucHV0LnhtbApAQCAtMCwwICsxLDcgQEAKKzxwcm9qZWN0IG5hbWU9ImlucHV0IHRlc3RpbmciIGRlZmF1bHQ9ICJpbnB1dCB0ZXN0Ij4KKwk8dGFyZ2V0IG5hbWU9ImlucHV0IHRlc3QiPgorCQk8aW5wdXQgbWVzc2FnZT0iRW50ZXIgZm9yIGVjaG8iIGFkZHByb3BlcnR5PSAiaW5wdXRUZXN0Ij4KKwkJPC9pbnB1dD4KKwkJPGVjaG8gbWVzc2FnZT0iJHtpbnB1dFRlc3R9Ii8+CisJPC90YXJnZXQ+CQorPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0YnVpbGRmaWxlcy9qYXZhYy54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvamF2YWMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyZjAyMjUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvamF2YWMueG1sCkBAIC0wLDAgKzEsMzMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdCBuYW1lPSJvcmcuZWNsaXBzZS5hbnQuY29yZSIgZGVmYXVsdD0iYnVpbGQiIGJhc2VkaXI9Ii4uIj4KKworCQorCTx0YXJnZXQgbmFtZT0iaW5pdCIgZGVwZW5kcz0icHJvcGVydGllcyI+CisJCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4iIHZhbHVlPSJBbnRUZXN0cyIvPgorCQk8cHJvcGVydHkgbmFtZT0idGVtcC5mb2xkZXIiIHZhbHVlPSIke2Jhc2VkaXJ9L3RlbXAuZm9sZGVyIi8+CisJCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4uZGVzdGluYXRpb24iIHZhbHVlPSIke2Jhc2VkaXJ9Ii8+CisJCTxwcm9wZXJ0eSBuYW1lPSJidWlsZC5yZXN1bHQuZm9sZGVyIiB2YWx1ZT0iJHtiYXNlZGlyfSIvPgorCTwvdGFyZ2V0PgorCQorCTx0YXJnZXQgbmFtZT0icHJvcGVydGllcyIgaWY9InVzZS5lY2xpcHNlLkpEVENvbXBpbGVyIj4KKwkJPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmNvbXBpbGVyIiB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSkRUQ29tcGlsZXJBZGFwdGVyIi8+CisJPC90YXJnZXQ+CisJCisJPHRhcmdldCBuYW1lPSJidWlsZCIgZGVwZW5kcz0iaW5pdCI+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXN0ZGlyIiB2YWx1ZT0iJHt0ZW1wLmZvbGRlcn0vamF2YWMuYmluIi8+CisJCTxkZWxldGUgZGlyPSIke3RlbXAuZm9sZGVyfS9qYXZhYy5iaW4iLz4KKwkJPG1rZGlyIGRpcj0iJHt0ZW1wLmZvbGRlcn0vamF2YWMuYmluIi8+CisJCTwhLS0gY29tcGlsZSB0aGUgc291cmNlIGNvZGUgLS0+CisJCTxqYXZhYyBkZXN0ZGlyPSIke3RlbXAuZm9sZGVyfS9qYXZhYy5iaW4iIGZhaWxvbmVycm9yPSJmYWxzZSIgdmVyYm9zZT0iZmFsc2UiIGRlYnVnPSJvbiIgaW5jbHVkZUFudFJ1bnRpbWU9InllcyI+CisJCQk8c3JjIHBhdGg9InJlc291cmNlcyIvPgorCQk8L2phdmFjPgorCTwvdGFyZ2V0PgorCQorCTx0YXJnZXQgbmFtZT0iY2xlYW4iIGRlcGVuZHM9ImluaXQiPgorCQk8ZGVsZXRlIGRpcj0iJHt0ZW1wLmZvbGRlcn0iLz4KKwk8L3RhcmdldD4KKworCTx0YXJnZXQgbmFtZT0icmVmcmVzaCIgZGVwZW5kcz0iaW5pdCIgaWY9ImVjbGlwc2UucnVubmluZyI+CisJCTxlY2xpcHNlLnJlZnJlc2hMb2NhbCByZXNvdXJjZT0iJHtwbHVnaW59IiBkZXB0aD0iaW5maW5pdGUiLz4KKwk8L3RhcmdldD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0bGliL2NsYXNzcGF0aE9yZGVyaW5nMS5qYXIgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGxpYi9jbGFzc3BhdGhPcmRlcmluZzEuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMGNiN2YKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGxpYi9jbGFzc3BhdGhPcmRlcmluZzEuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0bGliL2NsYXNzcGF0aE9yZGVyaW5nMi5qYXIgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGxpYi9jbGFzc3BhdGhPcmRlcmluZzIuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4MTY3NDEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGxpYi9jbGFzc3BhdGhPcmRlcmluZzIuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0bGliL3Rhc2tGb2xkZXIvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvc3VwcG9ydC90YXNrcy9BbnRUZXN0VGFzazIuY2xhc3MgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGxpYi90YXNrRm9sZGVyL29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3N1cHBvcnQvdGFza3MvQW50VGVzdFRhc2syLmNsYXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhMzdlYjUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGxpYi90YXNrRm9sZGVyL29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3N1cHBvcnQvdGFza3MvQW50VGVzdFRhc2syLmNsYXNzCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0cmVzb3VyY2VzL0FudFRlc3RUYXNrLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdHJlc291cmNlcy9BbnRUZXN0VGFzay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmM2YwOWMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdHJlc291cmNlcy9BbnRUZXN0VGFzay5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkVjaG87CisKKworcHVibGljIGNsYXNzIEFudFRlc3RUYXNrIGV4dGVuZHMgVGFzayB7CisJCisJcHVibGljIEFudFRlc3RUYXNrKCkgeworCQlzdXBlcigpOworCX0KKwkKKwkvKioKKwkgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2sjZXhlY3V0ZSgpCisJICovCisJcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisJCUVjaG8gZWNobz0gbmV3IEVjaG8oKTsKKwkJZWNoby5zZXRQcm9qZWN0KGdldFByb2plY3QoKSk7CisJCWVjaG8uc2V0TWVzc2FnZSgiVGVzdGluZyBBbnQgaW4gRWNsaXBzZSB3aXRoIGEgY3VzdG9tIHRhc2siKTsKKwkJZWNoby5leGVjdXRlKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RyZXNvdXJjZXMvdGFza2RlZnMucHJvcGVydGllcyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0cmVzb3VyY2VzL3Rhc2tkZWZzLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdmZGQzYQotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0cmVzb3VyY2VzL3Rhc2tkZWZzLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxMiBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisjIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjIAorIyBDb250cmlidXRvcnM6CisjICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK215RWNob1Byb3BlcnRpZXM9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuRWNob1Byb3BlcnRpZXMKK2hlbGxvPW9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLnN1cHBvcnQudGFza3MuQW50VGVzdFRhc2sKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdHJlc291cmNlcy90ZXN0LnByb3BlcnRpZXMgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdHJlc291cmNlcy90ZXN0LnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGEwNDNmOAotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0cmVzb3VyY2VzL3Rlc3QucHJvcGVydGllcwpAQCAtMCwwICsxLDEyIEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyMgCisjIENvbnRyaWJ1dG9yczoKKyMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworQW50VGVzdHM9dGVzdGluZyBmcm9tIHByb3BlcnRpZXMgZmlsZQorZWNsaXBzZS5pcy5jb29sPVllcApkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL0Fic3RyYWN0QW50VGVzdC5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL0Fic3RyYWN0QW50VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlNWY5YzMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvQWJzdHJhY3RBbnRUZXN0LmphdmEKQEAgLTAsMCArMSwyNjMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmU7CisKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5jb3JlLkFudENvcmVQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmNvcmUuQW50Q29yZVByZWZlcmVuY2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5jb3JlLkFudFJ1bm5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuY29yZS5JQW50Q2xhc3NwYXRoRW50cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmNvcmUuUHJvcGVydHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmNvcmUuVGFyZ2V0SW5mbzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuY29yZS5UYXNrOworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5jb3JlLlR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUudGVzdHBsdWdpbi5BbnRGaWxlUnVubmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLnRlc3RwbHVnaW4uQW50VGVzdENoZWNrZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUudGVzdHBsdWdpbi5BbnRUZXN0UGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLnRlc3RwbHVnaW4uUHJvamVjdEhlbHBlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOworIAorLyoqCisgKiBUZXN0cyBmb3IgQW50IGNvcmUKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0QW50VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKwkKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBCVUlMRF9TVUNDRVNTRlVMPSAiQlVJTEQgU1VDQ0VTU0ZVTCI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU5UX1RFU1RfQlVJTERfTE9HR0VSID0gIm9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLnN1cHBvcnQudGVzdGxvZ2dlcnMuVGVzdEJ1aWxkTG9nZ2VyIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFOVF9URVNUX0JVSUxEX0xJU1RFTkVSPSAib3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUuc3VwcG9ydC50ZXN0bG9nZ2Vycy5UZXN0QnVpbGRMaXN0ZW5lciI7CisJCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCQlzdXBlci5zZXRVcCgpOworCQlhc3NlcnRQcm9qZWN0KCk7CisJfQorCQorCS8qKgorCSAqIEFzc2VydHMgdGhhdCB0aGUgdGVzdCBwcm9qZWN0IGhhcyBiZWVuIGNyZWF0ZWQgYW5kIGFsbCB0ZXN0aW5nIHJlc291cmNlcyBoYXZlIGJlZW4gCisJICogbG9hZGVkIGVhY2ggdGltZSB0aGUge0BsaW5rICNzZXRVcCgpfSBtZXRob2QgaXMgY2FsbGVkCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKiBAc2luY2UgMy41CisJICovCisJcHJvdGVjdGVkIHZvaWQgYXNzZXJ0UHJvamVjdCgpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBkZWxldGUgYW55IHByZS1leGlzdGluZyBwcm9qZWN0CisJCUlQcm9qZWN0IHBybyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChQcm9qZWN0SGVscGVyLlBST0pFQ1RfTkFNRSk7CisJCWlmICghcHJvLmV4aXN0cygpKSB7CisJCQkvLyBjcmVhdGUgcHJvamVjdCBhbmQgaW1wb3J0IGJ1aWxkIGZpbGVzIGFuZCBzdXBwb3J0IGZpbGVzCisJCQlJUHJvamVjdCBwcm9qZWN0ID0gUHJvamVjdEhlbHBlci5jcmVhdGVQcm9qZWN0KFByb2plY3RIZWxwZXIuUFJPSkVDVF9OQU1FKTsKKwkJCUlGb2xkZXIgZm9sZGVyID0gUHJvamVjdEhlbHBlci5hZGRGb2xkZXIocHJvamVjdCwgUHJvamVjdEhlbHBlci5CVUlMREZJTEVTX0ZPTERFUik7CisJCQlGaWxlIHJvb3QgPSBBbnRUZXN0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRGaWxlSW5QbHVnaW4oUHJvamVjdEhlbHBlci5URVNUX0JVSUxERklMRVNfRElSKTsKKwkJCVByb2plY3RIZWxwZXIuaW1wb3J0RmlsZXNGcm9tRGlyZWN0b3J5KHJvb3QsIGZvbGRlci5nZXRGdWxsUGF0aCgpLCBudWxsKTsKKwkJCQorCQkJZm9sZGVyID0gUHJvamVjdEhlbHBlci5hZGRGb2xkZXIocHJvamVjdCwgUHJvamVjdEhlbHBlci5SRVNPVVJDRVNfRk9MREVSKTsKKwkJCXJvb3QgPSBBbnRUZXN0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRGaWxlSW5QbHVnaW4oUHJvamVjdEhlbHBlci5URVNUX1JFU09VUkNFU19ESVIpOworCQkJUHJvamVjdEhlbHBlci5pbXBvcnRGaWxlc0Zyb21EaXJlY3Rvcnkocm9vdCwgZm9sZGVyLmdldEZ1bGxQYXRoKCksIG51bGwpOworCQkJCisJCQlmb2xkZXIgPSBQcm9qZWN0SGVscGVyLmFkZEZvbGRlcihwcm9qZWN0LCBQcm9qZWN0SGVscGVyLkxJQl9GT0xERVIpOworCQkJcm9vdCA9IEFudFRlc3RQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEZpbGVJblBsdWdpbihQcm9qZWN0SGVscGVyLlRFU1RfTElCX0RJUik7CisJCQlQcm9qZWN0SGVscGVyLmltcG9ydEZpbGVzRnJvbURpcmVjdG9yeShyb290LCBmb2xkZXIuZ2V0RnVsbFBhdGgoKSwgbnVsbCk7CisJCX0KKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgJ0FudFRlc3RzJyBwcm9qZWN0LgorCSAqIAorCSAqIEByZXR1cm4gdGhlIHRlc3QgcHJvamVjdAorCSAqLworCXByb3RlY3RlZCBJUHJvamVjdCBnZXRQcm9qZWN0KCkgeworCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KFByb2plY3RIZWxwZXIuUFJPSkVDVF9OQU1FKTsKKwl9CisJCisJcHVibGljIEFic3RyYWN0QW50VGVzdChTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisJCisJcHJvdGVjdGVkIElGaWxlIGdldEJ1aWxkRmlsZShTdHJpbmcgYnVpbGRGaWxlTmFtZSkgeworCQlJRmlsZSBmaWxlID0gZ2V0UHJvamVjdCgpLmdldEZvbGRlcihQcm9qZWN0SGVscGVyLkJVSUxERklMRVNfRk9MREVSKS5nZXRGaWxlKGJ1aWxkRmlsZU5hbWUpOworCQlhc3NlcnRUcnVlKCJDb3VsZCBub3QgZmluZCBidWlsZCBmaWxlIG5hbWVkOiAiICsgYnVpbGRGaWxlTmFtZSwgZmlsZS5leGlzdHMoKSk7CisJCXJldHVybiBmaWxlOworCX0KKwkKKwlwcm90ZWN0ZWQgSUZvbGRlciBnZXRXb3JraW5nRGlyZWN0b3J5KFN0cmluZyB3b3JraW5nRGlyZWN0b3J5TmFtZSkgeworCQlJRm9sZGVyIGZvbGRlciA9IGdldFByb2plY3QoKS5nZXRGb2xkZXIod29ya2luZ0RpcmVjdG9yeU5hbWUpOworCQlhc3NlcnRUcnVlKCJDb3VsZCBub3QgZmluZCB0aGUgd29ya2luZyBkaXJlY3RvcnkgbmFtZWQ6ICIgKyB3b3JraW5nRGlyZWN0b3J5TmFtZSwgZm9sZGVyLmV4aXN0cygpKTsKKwkJcmV0dXJuIGZvbGRlcjsKKwl9CisJCisJcHJvdGVjdGVkIElGaWxlIGNoZWNrRmlsZUV4aXN0cyhTdHJpbmcgZmlsZU5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJZ2V0UHJvamVjdCgpLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUsIG51bGwpOworCQlJRmlsZSBmaWxlID0gZ2V0UHJvamVjdCgpLmdldEZvbGRlcihQcm9qZWN0SGVscGVyLkJVSUxERklMRVNfRk9MREVSKS5nZXRGaWxlKGZpbGVOYW1lKTsKKwkJYXNzZXJ0VHJ1ZSgiQ291bGQgbm90IGZpbmQgZmlsZSBuYW1lZDogIiArIGZpbGVOYW1lLCBmaWxlLmV4aXN0cygpKTsKKwkJcmV0dXJuIGZpbGU7CisJfQorCQorCXB1YmxpYyB2b2lkIHJ1bihTdHJpbmcgYnVpbGRGaWxlTmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlydW4oYnVpbGRGaWxlTmFtZSwgbnVsbCwgZmFsc2UpOworCX0KKwkKKwlwdWJsaWMgdm9pZCBydW4oU3RyaW5nIGJ1aWxkRmlsZU5hbWUsIFN0cmluZ1tdIGFyZ3MpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJcnVuKGJ1aWxkRmlsZU5hbWUsIGFyZ3MsIGZhbHNlKTsKKwl9CisJCisJcHVibGljIHZvaWQgcnVuKFN0cmluZyBidWlsZEZpbGVOYW1lLCBTdHJpbmdbXSBhcmdzLCBib29sZWFuIHJldHJpZXZlVGFyZ2V0cykgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlydW4oYnVpbGRGaWxlTmFtZSwgYXJncywgcmV0cmlldmVUYXJnZXRzLCAiIik7CisJfQorCQorCXB1YmxpYyB2b2lkIHJ1bihTdHJpbmcgYnVpbGRGaWxlTmFtZSwgU3RyaW5nW10gYXJncywgYm9vbGVhbiByZXRyaWV2ZVRhcmdldHMsIFN0cmluZyB3b3JraW5nRGlyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCUFudFRlc3RDaGVja2VyLnJlc2V0KCk7CisJCUlGaWxlIGJ1aWxkRmlsZT0gbnVsbDsKKwkJaWYgKGJ1aWxkRmlsZU5hbWUgIT0gbnVsbCkgeworCQkJYnVpbGRGaWxlPSBnZXRCdWlsZEZpbGUoYnVpbGRGaWxlTmFtZSk7CisJCX0KKwkJQW50RmlsZVJ1bm5lciBydW5uZXI9IG5ldyBBbnRGaWxlUnVubmVyKCk7CisJCVN0cmluZ1tdIHRhcmdldHM9IG51bGw7CisJCWlmIChyZXRyaWV2ZVRhcmdldHMpIHsKKwkJCXRhcmdldHM9IGdldFRhcmdldE5hbWVzKGJ1aWxkRmlsZU5hbWUpOworCQl9CisJCWlmICh3b3JraW5nRGlyLmxlbmd0aCgpID4gMCkgeworCQkJd29ya2luZ0Rpcj0gZ2V0V29ya2luZ0RpcmVjdG9yeSh3b3JraW5nRGlyKS5nZXRMb2NhdGlvbigpLnRvRmlsZSgpLmdldEFic29sdXRlUGF0aCgpOworCQl9IAorCQlydW5uZXIucnVuKGJ1aWxkRmlsZSwgdGFyZ2V0cywgYXJncywgd29ya2luZ0RpciwgdHJ1ZSk7CisJCWFzc2VydFRydWUoIkJ1aWxkIHN0YXJ0cyBkaWQgbm90IGVxdWFsIGJ1aWxkIGZpbmlzaGVzIiwgQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldEJ1aWxkc1N0YXJ0ZWRDb3VudCgpID09IEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRCdWlsZHNGaW5pc2hlZENvdW50KCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgVGFyZ2V0SW5mb1tdIGdldFRhcmdldHMoU3RyaW5nIGJ1aWxkRmlsZU5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJSUZpbGUgYnVpbGRGaWxlPSBnZXRCdWlsZEZpbGUoYnVpbGRGaWxlTmFtZSk7CisJCQorCQlBbnRSdW5uZXIgcnVubmVyID0gbmV3IEFudFJ1bm5lcigpOworCQlydW5uZXIuc2V0QnVpbGRGaWxlTG9jYXRpb24oYnVpbGRGaWxlLmdldExvY2F0aW9uKCkudG9GaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCkpOworCSAJcmV0dXJuIHJ1bm5lci5nZXRBdmFpbGFibGVUYXJnZXRzKCk7CisJfQorCQorCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRUYXJnZXROYW1lcyhTdHJpbmcgYnVpbGRGaWxlTmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlUYXJnZXRJbmZvW10gaW5mb3M9IGdldFRhcmdldHMoYnVpbGRGaWxlTmFtZSk7CisJCVN0cmluZ1tdIG5hbWVzPSBuZXcgU3RyaW5nW2luZm9zLmxlbmd0aF07CisJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5mb3MubGVuZ3RoOyBpKyspIHsKKwkJCVRhcmdldEluZm8gaW5mbyA9IGluZm9zW2ldOworCQkJbmFtZXNbaV09IGluZm8uZ2V0TmFtZSgpOworCQl9CisJCXJldHVybiBuYW1lczsKKwl9CisJCisJcHJvdGVjdGVkIFN0cmluZ1tdIGdldFRhcmdldERlc2NyaXB0aW9ucyhTdHJpbmcgYnVpbGRGaWxlTmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlUYXJnZXRJbmZvW10gaW5mb3M9IGdldFRhcmdldHMoYnVpbGRGaWxlTmFtZSk7CisJCVN0cmluZ1tdIGRlc2NyaXB0aW9ucz0gbmV3IFN0cmluZ1tpbmZvcy5sZW5ndGhdOworCQlmb3IgKGludCBpID0gMDsgaSA8IGluZm9zLmxlbmd0aDsgaSsrKSB7CisJCQlUYXJnZXRJbmZvIGluZm8gPSBpbmZvc1tpXTsKKwkJCWRlc2NyaXB0aW9uc1tpXT0gaW5mby5nZXREZXNjcmlwdGlvbigpOworCQl9CisJCXJldHVybiBkZXNjcmlwdGlvbnM7CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHByb2plY3QgY29udGFpbmluZyB0aGUgZ2l2ZW4gdGFyZ2V0IGluIHRoZSBnaXZlbiBidWlsZCBmaWxlIG9yCisJICogPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gcHJvamVjdCBuYW1lIGNhbiBiZSBmb3VuZC4KKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2plY3ROYW1lKFN0cmluZyBidWlsZEZpbGVOYW1lLCBTdHJpbmcgdGFyZ2V0TmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlUYXJnZXRJbmZvIGluZm89IGdldFRhcmdldChidWlsZEZpbGVOYW1lLCB0YXJnZXROYW1lKTsKKwkJaWYgKGluZm8gIT0gbnVsbCkgeworCQkJcmV0dXJuIGluZm8uZ2V0UHJvamVjdCgpLmdldE5hbWUoKTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgZGVwZW5kZW5jaWVzIG9mIHRoZSB0YXJnZXQgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBpbiB0aGUgZ2l2ZW4gYnVpbGQgZmlsZSBvciA8Y29kZT5udWxsPC9jb2RlPgorCSAqIGlmIG5vIHN1Y2ggdGFyZ2V0IGNhbiBiZSBmb3VuZC4KKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0RGVwZW5kZW5jaWVzKFN0cmluZyBidWlsZEZpbGVOYW1lLCBTdHJpbmcgdGFyZ2V0TmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlUYXJnZXRJbmZvIGluZm89IGdldFRhcmdldChidWlsZEZpbGVOYW1lLCB0YXJnZXROYW1lKTsKKwkJaWYgKGluZm8gIT0gbnVsbCkgeworCQkJcmV0dXJuIGluZm8uZ2V0RGVwZW5kZW5jaWVzKCk7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgdGhlIHRhcmdldCB3aXRoIHRoZSBnaXZlbiBuYW1lIGluIHRoZSBnaXZlbiBidWlsZCBmaWxlIG9yIDxjb2RlPm51bGw8L2NvZGU+CisJICogaWYgbm8gc3VjaCB0YXJnZXQgY2FuIGJlIGZvdW5kLgorCSAqLworCXByb3RlY3RlZCBUYXJnZXRJbmZvIGdldFRhcmdldChTdHJpbmcgYnVpbGRGaWxlTmFtZSwgU3RyaW5nIHRhcmdldE5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJVGFyZ2V0SW5mb1tdIGluZm9zPSBnZXRUYXJnZXRzKGJ1aWxkRmlsZU5hbWUpOworCQlmb3IgKGludCBpPSAwLCBudW1UYXJnZXRzPSBpbmZvcy5sZW5ndGg7IGkgPCBudW1UYXJnZXRzOyBpKyspIHsKKwkJCWlmIChpbmZvc1tpXS5nZXROYW1lKCkuZXF1YWxzKHRhcmdldE5hbWUpKSB7CisJCQkJcmV0dXJuIGluZm9zW2ldOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGxvZyBtZXNzYWdlIG4gZnJvbSB0aGUgbGFzdDoKKyAgICAgKiBlLmcuIGdldExvZ2dlZE1lc3NhZ2UoMCkgcmV0dXJucyB0aGUgbW9zdCByZWNlbnQgbWVzc2FnZQorICAgICAqIAorICAgICAqIEBwYXJhbSBuIG1lc3NhZ2UgaW5kZXgKKyAgICAgKiBAcmV0dXJuIHRoZSBudGggbGFzdCBtZXNzYWdlCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRMb2dnZWRNZXNzYWdlKGludCBuKSB7CisgICAgICAgIHJldHVybiBBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VkTWVzc2FnZShuKTsKKyAgICB9CisJCisJcHJvdGVjdGVkIFN0cmluZyBnZXRMYXN0TWVzc2FnZUxvZ2dlZCgpIHsKKwkJcmV0dXJuIGdldExvZ2dlZE1lc3NhZ2UoMCk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIGFzc2VydFN1Y2Nlc3NmdWwoKSB7CisJCUxpc3QgbWVzc2FnZXM9IEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRNZXNzYWdlcygpOworCQlTdHJpbmcgc3VjY2Vzcz0gKFN0cmluZyltZXNzYWdlcy5nZXQobWVzc2FnZXMuc2l6ZSgpIC0gMSk7CisJCWFzc2VydEVxdWFscygiQnVpbGQgd2FzIG5vdCBmbGFnZ2VkIGFzIHN1Y2Nlc3NmdWw6ICIgKyBzdWNjZXNzLCBCVUlMRF9TVUNDRVNTRlVMLCBzdWNjZXNzKTsKKwl9CisJCisJcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9wZXJ0eUZpbGVOYW1lKCkgeworCQlyZXR1cm4gZ2V0UHJvamVjdCgpLmdldEZvbGRlcihQcm9qZWN0SGVscGVyLlJFU09VUkNFU19GT0xERVIpLmdldEZpbGUoInRlc3QucHJvcGVydGllcyIpLmdldExvY2F0aW9uKCkudG9GaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHJlc3RvcmVQcmVmZXJlbmNlRGVmYXVsdHMoKSB7CisJCUFudENvcmVQcmVmZXJlbmNlcyBwcmVmcz0gQW50Q29yZVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRQcmVmZXJlbmNlcygpOworCQlJQW50Q2xhc3NwYXRoRW50cnkgdG9vbHNFbnRyeT0gcHJlZnMuZ2V0VG9vbHNKYXJFbnRyeSgpOworCQlJQW50Q2xhc3NwYXRoRW50cnlbXSBhZGRpdGlvbmFsRW50cmllczsKKwkJaWYgKHRvb2xzRW50cnkgPT0gbnVsbCkgeworCQkJYWRkaXRpb25hbEVudHJpZXM9IG5ldyBJQW50Q2xhc3NwYXRoRW50cnlbXXt9OworCQl9IGVsc2UgeworCQkJYWRkaXRpb25hbEVudHJpZXM9IG5ldyBJQW50Q2xhc3NwYXRoRW50cnlbXSB7dG9vbHNFbnRyeX07CisJCX0KKwkJcHJlZnMuc2V0QWRkaXRpb25hbENsYXNzcGF0aEVudHJpZXMoYWRkaXRpb25hbEVudHJpZXMpOworCQlwcmVmcy5zZXRBbnRIb21lQ2xhc3NwYXRoRW50cmllcyhwcmVmcy5nZXREZWZhdWx0QW50SG9tZUVudHJpZXMoKSk7CisJCXByZWZzLnNldEN1c3RvbVRhc2tzKG5ldyBUYXNrW117fSk7CisJCXByZWZzLnNldEN1c3RvbVR5cGVzKG5ldyBUeXBlW117fSk7CisJCXByZWZzLnNldEN1c3RvbVByb3BlcnR5RmlsZXMobmV3IFN0cmluZ1tde30pOworCQlwcmVmcy5zZXRDdXN0b21Qcm9wZXJ0aWVzKG5ldyBQcm9wZXJ0eVtde30pOworCQlwcmVmcy5zZXRBbnRIb21lKHByZWZzLmdldERlZmF1bHRBbnRIb21lKCkpOworCX0KKwkKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldEFudEhvbWUoKSB7CisJCUFudENvcmVQcmVmZXJlbmNlcyBwcmVmcz0gQW50Q29yZVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRQcmVmZXJlbmNlcygpOworCQlJQW50Q2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzPSBwcmVmcy5nZXRBbnRIb21lQ2xhc3NwYXRoRW50cmllcygpOworCQlJQW50Q2xhc3NwYXRoRW50cnkgYW50amFyPSBlbnRyaWVzWzBdOworCQlJUGF0aCBhbnRIb21lUGF0aD0gbmV3IFBhdGgoYW50amFyLmdldEVudHJ5VVJMKCkuZ2V0RmlsZSgpKTsKKwkJYW50SG9tZVBhdGg9IGFudEhvbWVQYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKTsKKwkJcmV0dXJuIGFudEhvbWVQYXRoLnRvRmlsZSgpLmdldEFic29sdXRlUGF0aCgpOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3Rlc3RzL1Byb2plY3RUZXN0cy5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3Rlc3RzL1Byb2plY3RUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzNjk0ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvdGVzdHMvUHJvamVjdFRlc3RzLmphdmEKQEAgLTAsMCArMSw3NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS50ZXN0czsKKworCitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmNvcmUuQW50Q29yZVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS5BYnN0cmFjdEFudFRlc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUudGVzdHBsdWdpbi5BbnRUZXN0Q2hlY2tlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKKworCitwdWJsaWMgY2xhc3MgUHJvamVjdFRlc3RzIGV4dGVuZHMgQWJzdHJhY3RBbnRUZXN0IHsKKwkKKwlwdWJsaWMgUHJvamVjdFRlc3RzKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKwkKKwkvKioKKwkgKiBUZXN0cyB0aGF0IHRoZSB0aHJlZSBwcm9wZXJ0aWVzIHRoYXQgc2hvdWxkIGFsd2F5cyBiZSBzZXQgYXJlIGNvcnJlY3QKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0QmFzZVByb3BlcnRpZXNTZXQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCVN0cmluZyBidWlsZEZpbGVOYW1lPSJUZXN0Rm9yRWNoby54bWwiOyAKKwkJcnVuKGJ1aWxkRmlsZU5hbWUpOworCQlJRmlsZSBidWlsZEZpbGU9IGdldEJ1aWxkRmlsZShidWlsZEZpbGVOYW1lKTsKKwkJU3RyaW5nIGZ1bGxOYW1lPSBidWlsZEZpbGUuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKTsKKwkJYXNzZXJ0RXF1YWxzKCJlY2xpcHNlLnJ1bm5pbmcgc2hvdWxkIGhhdmUgYmVlbiBzZXQgYXMgdHJ1ZSIsICJ0cnVlIiwgQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldFVzZXJQcm9wZXJ0eSgiZWNsaXBzZS5ydW5uaW5nIikpOworCQlhc3NlcnRFcXVhbHMoImFudC5maWxlIHNob3VsZCBoYXZlIGJlZW4gc2V0IGFzIHRoZSBidWlsZCBmaWxlIG5hbWUiLCBmdWxsTmFtZSwgQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldFVzZXJQcm9wZXJ0eSgiYW50LmZpbGUiKSk7CisJCWFzc2VydE5vdE51bGwoImFudC5qYXZhLnZlcnNpb24gc2hvdWxkIGhhdmUgYmVlbiBzZXQiLCBBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0VXNlclByb3BlcnR5KCJhbnQuamF2YS52ZXJzaW9uIikpOworCQlhc3NlcnROb3ROdWxsKCJhbnQudmVyc2lvbiBzaG91bGQgaGF2ZSBiZWVuIHNldCIsIEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRVc2VyUHJvcGVydHkoImFudC52ZXJzaW9uIikpOworCQlhc3NlcnROb3ROdWxsKCJlY2xpcHNlLmhvbWUgc2hvdWxkIGhhdmUgYmVlbiBzZXQiLCBBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0VXNlclByb3BlcnR5KCJlY2xpcHNlLmhvbWUiKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdFZhbHVlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlTdHJpbmcgYnVpbGRGaWxlTmFtZT0iVGVzdEZvckVjaG8ueG1sIjsgCisJCXJ1bihidWlsZEZpbGVOYW1lKTsKKwkJYXNzZXJ0RXF1YWxzKCJwcm9wZXJ0eS50ZXN0aW5nIHNob3VsZCBoYXZlIGJlZW4gc2V0IGFzIHRydWUiLCAidHJ1ZSIsIEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRVc2VyUHJvcGVydHkoInByb3BlcnR5LnRlc3RpbmciKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdFZhbHVlV2l0aENsYXNzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQkKKwkJU3RyaW5nIGJ1aWxkRmlsZU5hbWU9IlRlc3RGb3JFY2hvLnhtbCI7IAorCQlydW4oYnVpbGRGaWxlTmFtZSk7CisJCWFzc2VydEVxdWFscygicHJvcGVydHkudGVzdGluZzIgc2hvdWxkIGhhdmUgYmVlbiBzZXQgYXMgaGV5IiwgImhleSIsIEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRVc2VyUHJvcGVydHkoInByb3BlcnR5LnRlc3RpbmcyIikpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RDbGFzcygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGJ1aWxkRmlsZU5hbWU9IlRlc3RGb3JFY2hvLnhtbCI7IAorCQlydW4oYnVpbGRGaWxlTmFtZSk7CisJCWFzc2VydEVxdWFscygicHJvcGVydHkudGVzdGluZzMgc2hvdWxkIGhhdmUgYmVlbiBzZXQgYXMgQW50VGVzdFByb3BlcnR5UHJvdmlkZXIiLCAiQW50VGVzdFByb3BlcnR5VmFsdWVQcm92aWRlciIsIEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRVc2VyUHJvcGVydHkoInByb3BlcnR5LnRlc3RpbmczIikpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0SGVhZGxlc3MoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCXRyeSB7CisJCQlBbnRDb3JlUGx1Z2luLmdldFBsdWdpbigpLnNldFJ1bm5pbmdIZWFkbGVzcyh0cnVlKTsKKwkJCVN0cmluZyBidWlsZEZpbGVOYW1lPSJUZXN0Rm9yRWNoby54bWwiOyAKKwkJCXJ1bihidWlsZEZpbGVOYW1lKTsKKwkJCWFzc2VydE51bGwoInByb3BlcnR5LmhlYWRsZXNzIHNob3VsZCBub3QgaGF2ZSBiZWVuIHNldCBhcyBBbnRUZXN0UHJvcGVydHlQcm92aWRlciIsIEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRVc2VyUHJvcGVydHkoInByb3BlcnR5LmhlYWRsZXNzIikpOworCQl9IGZpbmFsbHkgeworCQkJQW50Q29yZVBsdWdpbi5nZXRQbHVnaW4oKS5zZXRSdW5uaW5nSGVhZGxlc3MoZmFsc2UpOworCQl9CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3ROb3RIZWFkbGVzcygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGJ1aWxkRmlsZU5hbWU9IlRlc3RGb3JFY2hvLnhtbCI7IAorCQlydW4oYnVpbGRGaWxlTmFtZSk7CisJCWFzc2VydEVxdWFscygicHJvcGVydHkuaGVhZGxlc3Mgc2hvdWxkIGhhdmUgYmVlbiBzZXQgYXMgQW50VGVzdFByb3BlcnR5UHJvdmlkZXIiLCAiaGVhZGxlc3MiLCBBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0VXNlclByb3BlcnR5KCJwcm9wZXJ0eS5oZWFkbGVzcyIpKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3Rlc3RzL1Rhc2tUZXN0cy5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3Rlc3RzL1Rhc2tUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0YWU4MTIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvdGVzdHMvVGFza1Rlc3RzLmphdmEKQEAgLTAsMCArMSwxNTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS50ZXN0czsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuY29yZS5BbnRDb3JlUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5jb3JlLkFudENvcmVQcmVmZXJlbmNlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuY29yZS5JQW50Q2xhc3NwYXRoRW50cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmNvcmUuUHJvcGVydHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmNvcmUuVGFzazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwuY29yZS5BbnRDbGFzc3BhdGhFbnRyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS5BYnN0cmFjdEFudFRlc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUudGVzdHBsdWdpbi5BbnRUZXN0Q2hlY2tlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS50ZXN0cGx1Z2luLlByb2plY3RIZWxwZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CisKK3B1YmxpYyBjbGFzcyBUYXNrVGVzdHMgZXh0ZW5kcyBBYnN0cmFjdEFudFRlc3QgeworCisJCisJcHVibGljIFRhc2tUZXN0cyhTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisJCisJLyoqCisJICogVGVzdGluZyB0aGUgb2xkIGRlcHJlY2F0ZWQgQVBJCisJICogQHRocm93cyBDb3JlRXhjZXB0aW9uCisJICovCisJcHVibGljIHZvaWQgdGVzdEFkZFRhc2tTZXR0aW5nTGlicmFyeSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJQW50Q29yZVByZWZlcmVuY2VzIHByZWZzID1BbnRDb3JlUGx1Z2luLmdldFBsdWdpbigpLmdldFByZWZlcmVuY2VzKCk7CisJCVVSTFtdIHVybHM9IHByZWZzLmdldEV4dHJhQ2xhc3NwYXRoVVJMcygpOworCQlUYXNrIG5ld1Rhc2s9IG5ldyBUYXNrKCk7CisJCW5ld1Rhc2suc2V0TGlicmFyeSh1cmxzWzBdKTsKKwkJbmV3VGFzay5zZXRUYXNrTmFtZSgiQW50VGVzdFRhc2siKTsKKwkJbmV3VGFzay5zZXRDbGFzc05hbWUoIm9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLnN1cHBvcnQudGFza3MuQW50VGVzdFRhc2siKTsKKwkJcHJlZnMuc2V0Q3VzdG9tVGFza3MobmV3IFRhc2tbXXtuZXdUYXNrfSk7CisJCQorCQlwcmVmcy51cGRhdGVQbHVnaW5QcmVmZXJlbmNlcygpOworCQkKKwkJcnVuKCJDdXN0b21UYXNrLnhtbCIsIG5ldyBTdHJpbmdbMF0sIGZhbHNlKTsKKwkJU3RyaW5nIG1zZz0gKFN0cmluZylBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0TWVzc2FnZXMoKS5nZXQoMSk7CisJCWFzc2VydEVxdWFscygiTWVzc2FnZSBpbmNvcnJlY3Q6ICIgKyBtc2csICJUZXN0aW5nIEFudCBpbiBFY2xpcHNlIHdpdGggYSBjdXN0b20gdGFzayIsIG1zZyk7CisJCWFzc2VydFN1Y2Nlc3NmdWwoKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEFkZFRhc2tTZXR0aW5nTGlicmFyeUVudHJ5KCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlBbnRDb3JlUHJlZmVyZW5jZXMgcHJlZnMgPUFudENvcmVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0UHJlZmVyZW5jZXMoKTsKKwkJVVJMW10gdXJscz0gcHJlZnMuZ2V0RXh0cmFDbGFzc3BhdGhVUkxzKCk7CisJCVRhc2sgbmV3VGFzaz0gbmV3IFRhc2soKTsKKwkJbmV3VGFzay5zZXRMaWJyYXJ5RW50cnkobmV3IEFudENsYXNzcGF0aEVudHJ5KHVybHNbMF0pKTsKKwkJbmV3VGFzay5zZXRUYXNrTmFtZSgiQW50VGVzdFRhc2syIik7CisJCW5ld1Rhc2suc2V0Q2xhc3NOYW1lKCJvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS5zdXBwb3J0LnRhc2tzLkFudFRlc3RUYXNrIik7CisJCXByZWZzLnNldEN1c3RvbVRhc2tzKG5ldyBUYXNrW117bmV3VGFza30pOworCQkKKwkJcHJlZnMudXBkYXRlUGx1Z2luUHJlZmVyZW5jZXMoKTsKKwkJCisJCXJ1bigiQ3VzdG9tVGFzay54bWwiLCBuZXcgU3RyaW5nW10geyJDdXN0b20gVGFzayBmcm9tIEVudHJ5In0sIGZhbHNlKTsKKwkJU3RyaW5nIG1zZz0gKFN0cmluZylBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0TWVzc2FnZXMoKS5nZXQoMSk7CisJCWFzc2VydEVxdWFscygiTWVzc2FnZSBpbmNvcnJlY3Q6ICIgKyBtc2csICJUZXN0aW5nIEFudCBpbiBFY2xpcHNlIHdpdGggYSBjdXN0b20gdGFzayIsIG1zZyk7CisJCWFzc2VydFN1Y2Nlc3NmdWwoKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFJlbW92ZVRhc2soKSB7CisJCUFudENvcmVQcmVmZXJlbmNlcyBwcmVmcyA9QW50Q29yZVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRQcmVmZXJlbmNlcygpOworCQlwcmVmcy5zZXRDdXN0b21UYXNrcyhuZXcgVGFza1tde30pOworCQl0cnkgeworCQkJcnVuKCJDdXN0b21UYXNrLnhtbCIpOworCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7CisJCQlhc3NlcnRUcnVlKCJFeGNlcHRpb24gZnJvbSB1bmRlZmluZWQgdGFzayBpcyBpbmNvcnJlY3QiLCBjZS5nZXRNZXNzYWdlKCkudHJpbSgpLmVuZHNXaXRoKCJBY3Rpb246IENoZWNrIHRoYXQgYW55IDxwcmVzZXRkZWY+LzxtYWNyb2RlZj4gZGVjbGFyYXRpb25zIGhhdmUgdGFrZW4gcGxhY2UuIikpOworCQkJcmV0dXJuOworCQl9IGZpbmFsbHkgeworCQkJcmVzdG9yZVByZWZlcmVuY2VEZWZhdWx0cygpOwkKKwkJfQorCQlhc3NlcnRUcnVlKCJCdWlsZCBzaG91bGQgaGF2ZSBmYWlsZWQgYXMgdGFzayBubyBsb25nZXIgZGVmaW5lZCIsIGZhbHNlKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEFkZFRhc2tGcm9tRm9sZGVyKCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQl0cnkgeworCQkJQW50Q29yZVByZWZlcmVuY2VzIHByZWZzID1BbnRDb3JlUGx1Z2luLmdldFBsdWdpbigpLmdldFByZWZlcmVuY2VzKCk7CisJCQlUYXNrIG5ld1Rhc2s9IG5ldyBUYXNrKCk7CisJCQlTdHJpbmcgcGF0aD0gZ2V0UHJvamVjdCgpLmdldEZvbGRlcihQcm9qZWN0SGVscGVyLkxJQl9GT0xERVIpLmdldEZpbGUoInRhc2tGb2xkZXIiKS5nZXRMb2NhdGlvbigpLnRvRmlsZSgpLmdldEFic29sdXRlUGF0aCgpOworCQkJSUFudENsYXNzcGF0aEVudHJ5IGVudHJ5PSBuZXcgQW50Q2xhc3NwYXRoRW50cnkocGF0aCArIEZpbGUuc2VwYXJhdG9yQ2hhcik7CisJCQlJQW50Q2xhc3NwYXRoRW50cnkgZW50cmllc1tdID0gcHJlZnMuZ2V0QWRkaXRpb25hbENsYXNzcGF0aEVudHJpZXMoKTsKKwkJCUlBbnRDbGFzc3BhdGhFbnRyeSBuZXdFbnRyaWVzW10gPSBuZXcgSUFudENsYXNzcGF0aEVudHJ5W2VudHJpZXMubGVuZ3RoICsgMV07CisJCQlTeXN0ZW0uYXJyYXljb3B5KGVudHJpZXMsIDAsIG5ld0VudHJpZXMsIDAsIGVudHJpZXMubGVuZ3RoKTsKKwkJCW5ld0VudHJpZXNbZW50cmllcy5sZW5ndGhdID0gZW50cnk7CisJCQlwcmVmcy5zZXRBZGRpdGlvbmFsQ2xhc3NwYXRoRW50cmllcyhuZXdFbnRyaWVzKTsKKwkJCisJCQluZXdUYXNrLnNldExpYnJhcnlFbnRyeShlbnRyeSk7CisJCQluZXdUYXNrLnNldFRhc2tOYW1lKCJBbnRUZXN0VGFzayIpOworCQkJbmV3VGFzay5zZXRDbGFzc05hbWUoIm9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLnN1cHBvcnQudGFza3MuQW50VGVzdFRhc2syIik7CisJCQlwcmVmcy5zZXRDdXN0b21UYXNrcyhuZXcgVGFza1tde25ld1Rhc2t9KTsKKwkJCisJCQlwcmVmcy51cGRhdGVQbHVnaW5QcmVmZXJlbmNlcygpOworCQkKKwkJCXJ1bigiQ3VzdG9tVGFzay54bWwiLCBuZXcgU3RyaW5nWzBdLCBmYWxzZSk7CisJCQlTdHJpbmcgbXNnPSAoU3RyaW5nKUFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRNZXNzYWdlcygpLmdldCgxKTsKKwkJCWFzc2VydEVxdWFscygiTWVzc2FnZSBpbmNvcnJlY3Q6ICIgKyBtc2csICJUZXN0aW5nIEFudCBpbiBFY2xpcHNlIHdpdGggYSBjdXN0b20gdGFzayIsIG1zZyk7CisJCQlhc3NlcnRTdWNjZXNzZnVsKCk7CisJCX0gZmluYWxseSB7CisJCQlyZXN0b3JlUHJlZmVyZW5jZURlZmF1bHRzKCk7CisJCX0KKwl9CisJCQorCXB1YmxpYyB2b2lkIHRlc3RUYXNrc0RlZmluZWRJblByb3BlcnR5RmlsZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCUFudENvcmVQcmVmZXJlbmNlcyBwcmVmcyA9QW50Q29yZVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRQcmVmZXJlbmNlcygpOworCQkJUHJvcGVydHkgbmV3UHJvcD0gbmV3IFByb3BlcnR5KCJST09URElSIiwgIi4uLy9yZXNvdXJjZXMiKTsKKwkJCXByZWZzLnNldEN1c3RvbVByb3BlcnRpZXMobmV3IFByb3BlcnR5W117bmV3UHJvcH0pOworCQkJcnVuKCJCdWczNDY2My54bWwiKTsKKwkJfSBmaW5hbGx5IHsKKwkJCXJlc3RvcmVQcmVmZXJlbmNlRGVmYXVsdHMoKTsKKwkJfQorCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0VGFza0RlZmluZWRJbkV4dGVuc2lvblBvaW50KCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlydW4oIkV4dGVuc2lvblBvaW50VGFzay54bWwiKTsKKwkJU3RyaW5nIG1zZz0gKFN0cmluZylBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0TWVzc2FnZXMoKS5nZXQoMSk7CisJCWFzc2VydEVxdWFscygiTWVzc2FnZSBpbmNvcnJlY3Q6ICIgKyBtc2csICJUZXN0aW5nIEFudCBpbiBFY2xpcHNlIHdpdGggYSBjdXN0b20gdGFzayIsIG1zZyk7CisJCWFzc2VydFN1Y2Nlc3NmdWwoKTsKKwl9CisJCQorCXB1YmxpYyB2b2lkIHRlc3RUYXNrRGVmaW5lZEluRXh0ZW5zaW9uUG9pbnRIZWFkbGVzcygpIHsKKwkJQW50Q29yZVBsdWdpbi5nZXRQbHVnaW4oKS5zZXRSdW5uaW5nSGVhZGxlc3ModHJ1ZSk7CisJCXRyeSB7CisJCQlydW4oIkV4dGVuc2lvblBvaW50VGFzay54bWwiKTsKKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgeworCQkJYXNzZXJ0VHJ1ZSgiRXhjZXB0aW9uIGZyb20gdW5kZWZpbmVkIHRhc2sgaXMgaW5jb3JyZWN0IiwgY2UuZ2V0TWVzc2FnZSgpLnRyaW0oKS5lbmRzV2l0aCgiQWN0aW9uOiBDaGVjayB0aGF0IGFueSA8cHJlc2V0ZGVmPi88bWFjcm9kZWY+IGRlY2xhcmF0aW9ucyBoYXZlIHRha2VuIHBsYWNlLiIpKTsKKwkJCXJldHVybjsKKwkJfSBmaW5hbGx5IHsKKwkJCUFudENvcmVQbHVnaW4uZ2V0UGx1Z2luKCkuc2V0UnVubmluZ0hlYWRsZXNzKGZhbHNlKTsKKwkJfQorCQlhc3NlcnRUcnVlKCJCdWlsZCBzaG91bGQgaGF2ZSBmYWlsZWQgYXMgdGFzayB3YXMgbm90IGRlZmluZWQgdG8gcnVuIGluIGhlYWRsZXNzIiwgZmFsc2UpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0VGFza0RlZmluZWRJbkV4dGVuc2lvblBvaW50V2l0aFVSSSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJcnVuKCJFeHRlbnNpb25Qb2ludFRhc2sueG1sIik7CisJCVN0cmluZyBtc2c9IChTdHJpbmcpQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldE1lc3NhZ2VzKCkuZ2V0KDIpOworCQlhc3NlcnRFcXVhbHMoIk1lc3NhZ2UgaW5jb3JyZWN0OiAiICsgbXNnLCAiVGVzdGluZyBBbnQgaW4gRWNsaXBzZSB3aXRoIGEgY3VzdG9tIHRhc2siLCBtc2cpOworCQlhc3NlcnRTdWNjZXNzZnVsKCk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS90ZXN0cy9UeXBlVGVzdHMuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS90ZXN0cy9UeXBlVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTMwZmNjCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3Rlc3RzL1R5cGVUZXN0cy5qYXZhCkBAIC0wLDAgKzEsNzkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUudGVzdHM7CisKKworaW1wb3J0IGphdmEubmV0LlVSTDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5jb3JlLkFudENvcmVQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmNvcmUuQW50Q29yZVByZWZlcmVuY2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5jb3JlLlR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmNvcmUuQW50Q2xhc3NwYXRoRW50cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUuQWJzdHJhY3RBbnRUZXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLnRlc3RwbHVnaW4uQW50VGVzdENoZWNrZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CisKK3B1YmxpYyBjbGFzcyBUeXBlVGVzdHMgZXh0ZW5kcyBBYnN0cmFjdEFudFRlc3QgeworCisJcHVibGljIFR5cGVUZXN0cyhTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEFkZFR5cGUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCUFudENvcmVQcmVmZXJlbmNlcyBwcmVmcyA9QW50Q29yZVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRQcmVmZXJlbmNlcygpOworCQlVUkxbXSB1cmxzPSBwcmVmcy5nZXRFeHRyYUNsYXNzcGF0aFVSTHMoKTsKKwkJVHlwZSBuZXdUeXBlPSBuZXcgVHlwZSgpOworCQluZXdUeXBlLnNldExpYnJhcnlFbnRyeShuZXcgQW50Q2xhc3NwYXRoRW50cnkodXJsc1swXSkpOworCQluZXdUeXBlLnNldFR5cGVOYW1lKCJhbnR0ZXN0cGF0aCIpOworCQluZXdUeXBlLnNldENsYXNzTmFtZSgib3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUuc3VwcG9ydC50eXBlcy5BbnRUZXN0UGF0aCIpOworCQlwcmVmcy5zZXRDdXN0b21UeXBlcyhuZXcgVHlwZVtde25ld1R5cGV9KTsKKwkJCisJCXJ1bigiQ3VzdG9tVHlwZS54bWwiKTsKKwkJU3RyaW5nIG1zZz0gKFN0cmluZylBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0TWVzc2FnZXMoKS5nZXQoMSk7CisJCWFzc2VydEVxdWFscygiTWVzc2FnZSBpbmNvcnJlY3Q6ICIgKyBtc2csICJUZXN0IGFkZGluZyBhIGN1c3RvbSB0eXBlIiwgbXNnKTsKKwkJYXNzZXJ0U3VjY2Vzc2Z1bCgpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlVHlwZSgpIHsKKwkJQW50Q29yZVByZWZlcmVuY2VzIHByZWZzID1BbnRDb3JlUGx1Z2luLmdldFBsdWdpbigpLmdldFByZWZlcmVuY2VzKCk7CisJCXByZWZzLnNldEN1c3RvbVR5cGVzKG5ldyBUeXBlW117fSk7CisJCXRyeSB7CisJCQlydW4oIkN1c3RvbVR5cGUueG1sIik7CisJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKKwkJCWFzc2VydFRydWUoIkV4Y2VwdGlvbiBmcm9tIHVuZGVmaW5lZCB0eXBlIGlzIGluY29ycmVjdDogIisgY2UuZ2V0TWVzc2FnZSgpLCBjZS5nZXRNZXNzYWdlKCkudHJpbSgpLmVuZHNXaXRoKCJBY3Rpb246IENoZWNrIHRoYXQgYW55IDxwcmVzZXRkZWY+LzxtYWNyb2RlZj4gZGVjbGFyYXRpb25zIGhhdmUgdGFrZW4gcGxhY2UuIikpOworCQkJcmV0dXJuOworCQl9IGZpbmFsbHkgeworCQkJcmVzdG9yZVByZWZlcmVuY2VEZWZhdWx0cygpOwkKKwkJfQorCQlhc3NlcnRUcnVlKCJCdWlsZCBzaG91bGQgaGF2ZSBmYWlsZWQgYXMgdHlwZSBubyBsb25nZXIgZGVmaW5lZCIsIGZhbHNlKTsKKwkJCisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RUeXBlRGVmaW5lZEluRXh0ZW5zaW9uUG9pbnQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCXJ1bigiRXh0ZW5zaW9uUG9pbnRUeXBlLnhtbCIpOworCQlTdHJpbmcgbXNnPSAoU3RyaW5nKUFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRNZXNzYWdlcygpLmdldCgxKTsKKwkJYXNzZXJ0RXF1YWxzKCJNZXNzYWdlIGluY29ycmVjdDogIiArIG1zZywgIkVuc3VyZSB0aGF0IGFuIGV4dGVuc2lvbiBwb2ludCBkZWZpbmVkIHR5cGUgaXMgcHJlc2VudCIsIG1zZyk7CisJCWFzc2VydFN1Y2Nlc3NmdWwoKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFR5cGVEZWZpbmVkSW5FeHRlbnNpb25Qb2ludEhlYWRsZXNzKCkgeworCQlBbnRDb3JlUGx1Z2luLmdldFBsdWdpbigpLnNldFJ1bm5pbmdIZWFkbGVzcyh0cnVlKTsKKwkJdHJ5IHsKKwkJCXJ1bigiRXh0ZW5zaW9uUG9pbnRUeXBlLnhtbCIpOworCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7CisJCQlhc3NlcnRUcnVlKCJFeGNlcHRpb24gZnJvbSB1bmRlZmluZWQgdHlwZSBpcyBpbmNvcnJlY3Q6ICIgKyBjZS5nZXRNZXNzYWdlKCksIGNlLmdldE1lc3NhZ2UoKS50cmltKCkuZW5kc1dpdGgoIkFjdGlvbjogQ2hlY2sgdGhhdCBhbnkgPHByZXNldGRlZj4vPG1hY3JvZGVmPiBkZWNsYXJhdGlvbnMgaGF2ZSB0YWtlbiBwbGFjZS4iKSk7CisJCQlyZXR1cm47CisJCX0gZmluYWxseSB7CisJCQlBbnRDb3JlUGx1Z2luLmdldFBsdWdpbigpLnNldFJ1bm5pbmdIZWFkbGVzcyhmYWxzZSk7CisJCX0KKwkJYXNzZXJ0VHJ1ZSgiQnVpbGQgc2hvdWxkIGhhdmUgZmFpbGVkIGFzIHR5cGUgd2FzIG5vdCBkZWZpbmVkIHRvIHJ1biBpbiBoZWFkbGVzcyIsIGZhbHNlKTsKKwl9CQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvLmNsYXNzcGF0aCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvLmNsYXNzcGF0aApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjI2OTRjCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS8uY2xhc3NwYXRoCkBAIC0wLDAgKzEsMTIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8Y2xhc3NwYXRoPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9IkFudCBFZGl0b3IgVGVzdHMiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJBbnQgRGVidWcgVGVzdHMiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJ0ZXN0IHBsdWdpbiIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9IkFudCBUZXN0cyIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9IkV4dGVybmFsIFRvb2xzIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNCIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIG91dHB1dD0idGVzdF9zdXBwb3J0X2JpbiIgcGF0aD0idGVzdCBzdXBwb3J0Ii8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Cis8L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvLmV4dGVybmFsVG9vbEJ1aWxkZXJzL0J1aWxkIFRlc3QgU3VwcG9ydCBKQVIubGF1bmNoIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS8uZXh0ZXJuYWxUb29sQnVpbGRlcnMvQnVpbGQgVGVzdCBTdXBwb3J0IEpBUi5sYXVuY2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFmZDFmMwotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvLmV4dGVybmFsVG9vbEJ1aWxkZXJzL0J1aWxkIFRlc3QgU3VwcG9ydCBKQVIubGF1bmNoCkBAIC0wLDAgKzEsMTUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8bGF1bmNoQ29uZmlndXJhdGlvbiB0eXBlPSJvcmcuZWNsaXBzZS5hbnQuQW50QnVpbGRlckxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIj4KKzxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcudWkuQVRUUl9MQVVOQ0hfSU5fQkFDS0dST1VORCIgdmFsdWU9ImZhbHNlIi8+Cis8Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmFudC51aS5ERUZBVUxUX1ZNX0lOU1RBTEwiIHZhbHVlPSJmYWxzZSIvPgorPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkRFRkFVTFRfQ0xBU1NQQVRIIiB2YWx1ZT0idHJ1ZSIvPgorPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmFudC51aS5BVFRSX0FOVF9DTEVBTl9UQVJHRVRTIiB2YWx1ZT0iY2xlYW4sIi8+Cis8c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5BVFRSX0JVSUxEX1NDT1BFIiB2YWx1ZT0iJHt3b3JraW5nX3NldDombHQ7P3htbCB2ZXJzaW9uPSZxdW90OzEuMCZxdW90OyBlbmNvZGluZz0mcXVvdDtVVEYtOCZxdW90Oz8mZ3Q7JiMxMDsmbHQ7bGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdTZXQgZmFjdG9yeUlEPSZxdW90O29yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtpbmdTZXRGYWN0b3J5JnF1b3Q7IG5hbWU9JnF1b3Q7d29ya2luZ1NldCZxdW90OyBlZGl0UGFnZUlkPSZxdW90O29yZy5lY2xpcHNlLnVpLnJlc291cmNlV29ya2luZ1NldFBhZ2UmcXVvdDsmZ3Q7JiMxMDsmbHQ7aXRlbSBmYWN0b3J5SUQ9JnF1b3Q7b3JnLmVjbGlwc2UudWkuaW50ZXJuYWwubW9kZWwuUmVzb3VyY2VGYWN0b3J5JnF1b3Q7IHBhdGg9JnF1b3Q7L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9idWlsZGZpbGVzL2J1aWxkQW50VGVzdHNTdXBwb3J0SkFSLnhtbCZxdW90OyB0eXBlPSZxdW90OzEmcXVvdDsvJmd0OyYjMTA7Jmx0O2l0ZW0gZmFjdG9yeUlEPSZxdW90O29yZy5lY2xpcHNlLnVpLmludGVybmFsLm1vZGVsLlJlc291cmNlRmFjdG9yeSZxdW90OyBwYXRoPSZxdW90Oy9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdCBzdXBwb3J0JnF1b3Q7IHR5cGU9JnF1b3Q7MiZxdW90Oy8mZ3Q7JiMxMDsmbHQ7L2xhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nU2V0Jmd0OyYjMTA7fSIvPgorPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuQVRUUl9SVU5fQlVJTERfS0lORFMiIHZhbHVlPSJmdWxsLGluY3JlbWVudGFsLGF1dG8sY2xlYW4iLz4KKzxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuYW50LnVpLkFUVFJfVEFSR0VUU19VUERBVEVEIiB2YWx1ZT0idHJ1ZSIvPgorPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuQVRUUl9SRUZSRVNIX1NDT1BFIiB2YWx1ZT0iJHt3b3JraW5nX3NldDombHQ7P3htbCB2ZXJzaW9uPSZxdW90OzEuMCZxdW90OyBlbmNvZGluZz0mcXVvdDtVVEYtOCZxdW90Oz8mZ3Q7JiMxMDsmbHQ7bGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdTZXQgZmFjdG9yeUlEPSZxdW90O29yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtpbmdTZXRGYWN0b3J5JnF1b3Q7IG5hbWU9JnF1b3Q7d29ya2luZ1NldCZxdW90OyBlZGl0UGFnZUlkPSZxdW90O29yZy5lY2xpcHNlLnVpLnJlc291cmNlV29ya2luZ1NldFBhZ2UmcXVvdDsmZ3Q7JiMxMDsmbHQ7aXRlbSBmYWN0b3J5SUQ9JnF1b3Q7b3JnLmVjbGlwc2UudWkuaW50ZXJuYWwubW9kZWwuUmVzb3VyY2VGYWN0b3J5JnF1b3Q7IHBhdGg9JnF1b3Q7L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aSZxdW90OyB0eXBlPSZxdW90OzQmcXVvdDsvJmd0OyYjMTA7Jmx0Oy9sYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ1NldCZndDsmIzEwO30iLz4KKzxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLkFUVFJfTE9DQVRJT04iIHZhbHVlPSIke3dvcmtzcGFjZV9sb2M6L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9idWlsZGZpbGVzL2J1aWxkQW50VGVzdHNTdXBwb3J0SkFSLnhtbH0iLz4KKzxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5hcHBlbmRFbnZpcm9ubWVudFZhcmlhYmxlcyIgdmFsdWU9InRydWUiLz4KKzxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5BVFRSX1RSSUdHRVJTX0NPTkZJR1VSRUQiIHZhbHVlPSJ0cnVlIi8+Cis8c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5DTEFTU1BBVEhfUFJPVklERVIiIHZhbHVlPSJvcmcuZWNsaXBzZS5hbnQudWkuQW50Q2xhc3NwYXRoUHJvdmlkZXIiLz4KKzwvbGF1bmNoQ29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvLnByb2plY3QgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLy5wcm9qZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjNzU5YjAKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLy5wcm9qZWN0CkBAIC0wLDAgKzEsMzcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdERlc2NyaXB0aW9uPgorCTxuYW1lPm9yZy5lY2xpcHNlLmFudC50ZXN0cy51aTwvbmFtZT4KKwk8Y29tbWVudD48L2NvbW1lbnQ+CisJPHByb2plY3RzPgorCTwvcHJvamVjdHM+CisJPGJ1aWxkU3BlYz4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgkJCisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLkV4dGVybmFsVG9vbEJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJCTxkaWN0aW9uYXJ5PgorCQkJCQk8a2V5PkxhdW5jaENvbmZpZ0hhbmRsZTwva2V5PgorCQkJCQk8dmFsdWU+Jmx0O3Byb2plY3QmZ3Q7Ly5leHRlcm5hbFRvb2xCdWlsZGVycy9CdWlsZCBUZXN0IFN1cHBvcnQgSkFSLmxhdW5jaDwvdmFsdWU+CisJCQkJPC9kaWN0aW9uYXJ5PgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCTwvYnVpbGRTcGVjPgorCTxuYXR1cmVzPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+CisJPC9uYXR1cmVzPgorPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5jb3JlLnByZWZzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmNjU0Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcwpAQCAtMCwwICsxLDMgQEAKKyNUaHUgTWF5IDI3IDE0OjQ4OjM4IFBEVCAyMDA0DQorZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTENCitzZWxmaG9zdGluZy5iaW5FeGNsdWRlcz0vb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3Rfc3VwcG9ydF9iaW4NCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFjZDhkMgotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpAQCAtMCwwICsxLDI5IEBACisjTW9uIERlYyAxNCAxMTo0MTowMCBDU1QgMjAwOQ0KK2NvbXBpbGVycy5mLnVucmVzb2x2ZWQtZmVhdHVyZXM9MQ0KK2NvbXBpbGVycy5mLnVucmVzb2x2ZWQtcGx1Z2lucz0xDQorY29tcGlsZXJzLmluY29tcGF0aWJsZS1lbnZpcm9ubWVudD0xDQorY29tcGlsZXJzLnAuYnVpbGQ9MQ0KK2NvbXBpbGVycy5wLmJ1aWxkLm1pc3Npbmcub3V0cHV0PTENCitjb21waWxlcnMucC5kZXByZWNhdGVkPTENCitjb21waWxlcnMucC5kaXNjb3VyYWdlZC1jbGFzcz0xDQorY29tcGlsZXJzLnAuaWxsZWdhbC1hdHQtdmFsdWU9MA0KK2NvbXBpbGVycy5wLmludGVybmFsPTENCitjb21waWxlcnMucC5taXNzaW5nLXBhY2thZ2VzPTINCitjb21waWxlcnMucC5taXNzaW5nLXZlcnNpb24tZXhwb3J0LXBhY2thZ2U9Mg0KK2NvbXBpbGVycy5wLm1pc3NpbmctdmVyc2lvbi1pbXBvcnQtcGFja2FnZT0yDQorY29tcGlsZXJzLnAubWlzc2luZy12ZXJzaW9uLXJlcXVpcmUtYnVuZGxlPTINCitjb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MA0KK2NvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTENCitjb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wDQorY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0xDQorY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTANCitjb21waWxlcnMucC51bmtub3duLWlkZW50aWZpZXI9MQ0KK2NvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MQ0KK2NvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTANCitjb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wDQorY29tcGlsZXJzLnAudW51c2VkLWVsZW1lbnQtb3ItYXR0cmlidXRlPTENCitjb21waWxlcnMucy5jcmVhdGUtZG9jcz1mYWxzZQ0KK2NvbXBpbGVycy5zLmRvYy1mb2xkZXI9ZG9jDQorY29tcGlsZXJzLnMub3Blbi10YWdzPTENCitjb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQ0KK2VjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xDQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgRGVidWcgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL2RlYnVnL0JyZWFrcG9pbnRUZXN0cy5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgRGVidWcgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL2RlYnVnL0JyZWFrcG9pbnRUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4ZTUyMTQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBEZWJ1ZyBUZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvZGVidWcvQnJlYWtwb2ludFRlc3RzLmphdmEKQEAgLTAsMCArMSwyMTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQudGVzdHMudWkuZGVidWc7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmxhdW5jaGluZy5kZWJ1Zy5tb2RlbC5BbnREZWJ1Z1RhcmdldDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwubGF1bmNoaW5nLmRlYnVnLm1vZGVsLkFudFRocmVhZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nLklBbnRMYXVuY2hDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklCcmVha3BvaW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSUxpbmVCcmVha3BvaW50OworCisvKioKKyAqIFRlc3RzIEFudCBicmVha3BvaW50cy4KKyAqLworcHVibGljIGNsYXNzIEJyZWFrcG9pbnRUZXN0cyBleHRlbmRzIEFic3RyYWN0QW50RGVidWdUZXN0IHsKKwkKKwlwdWJsaWMgQnJlYWtwb2ludFRlc3RzKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3REZWZlcnJlZEJyZWFrcG9pbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWRlZmVycmVkQnJlYWtwb2ludHMoZmFsc2UpOwkJCisJfQorCisJcHVibGljIHZvaWQgdGVzdERlZmVycmVkQnJlYWtwb2ludHNTZXBWTSgpIHRocm93cyBFeGNlcHRpb24geworCQlkZWZlcnJlZEJyZWFrcG9pbnRzKHRydWUpOwkJCisJfQorCisJcHJpdmF0ZSB2b2lkIGRlZmVycmVkQnJlYWtwb2ludHMoYm9vbGVhbiBzZXBWTSkgdGhyb3dzIEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiwgRGVidWdFeGNlcHRpb24geworCQlTdHJpbmcgZmlsZU5hbWUgPSAiYnJlYWtwb2ludHMiOworCQlJRmlsZSBmaWxlPSBnZXRJRmlsZShmaWxlTmFtZSArICIueG1sIik7CisJCUxpc3QgYnBzID0gbmV3IEFycmF5TGlzdCgpOworCQlicHMuYWRkKGNyZWF0ZUxpbmVCcmVha3BvaW50KDUsIGZpbGUpKTsKKwkJYnBzLmFkZChjcmVhdGVMaW5lQnJlYWtwb2ludCgxNCwgZmlsZSkpOworCQlBbnRUaHJlYWQgdGhyZWFkPSBudWxsOworCQl0cnkgeworCQkJdGhyZWFkPSBsYXVuY2hUb0JyZWFrcG9pbnQoZmlsZU5hbWUsIHRydWUsIHNlcFZNKTsKKwkJCWFzc2VydE5vdE51bGwoIkJyZWFrcG9pbnQgbm90IGhpdCB3aXRoaW4gdGltZW91dCBwZXJpb2QiLCB0aHJlYWQpOworCQkJd2hpbGUgKCFicHMuaXNFbXB0eSgpKSB7CisJCQkJSUJyZWFrcG9pbnQgaGl0ID0gZ2V0QnJlYWtwb2ludCh0aHJlYWQpOworCQkJCWFzc2VydE5vdE51bGwoInN1c3BlbmRlZCwgYnV0IG5vdCBieSBicmVha3BvaW50IiwgaGl0KTsKKwkJCQlhc3NlcnRUcnVlKCJoaXQgdW4tcmVnaXN0ZXJlZCBicmVha3BvaW50IiwgYnBzLmNvbnRhaW5zKGhpdCkpOworCQkJCWFzc2VydFRydWUoInN1c3BlbmRlZCwgYnV0IG5vdCBieSBsaW5lIGJyZWFrcG9pbnQiLCBoaXQgaW5zdGFuY2VvZiBJTGluZUJyZWFrcG9pbnQpOworCQkJCUlMaW5lQnJlYWtwb2ludCBicmVha3BvaW50PSAoSUxpbmVCcmVha3BvaW50KSBoaXQ7CisJCQkJaW50IGxpbmVOdW1iZXIgPSBicmVha3BvaW50LmdldExpbmVOdW1iZXIoKTsKKwkJCQlpbnQgc3RhY2tMaW5lID0gdGhyZWFkLmdldFRvcFN0YWNrRnJhbWUoKS5nZXRMaW5lTnVtYmVyKCk7CisJCQkJYXNzZXJ0RXF1YWxzKCJsaW5lIG51bWJlcnMgb2YgYnJlYWtwb2ludCBhbmQgc3RhY2sgZnJhbWUgZG8gbm90IG1hdGNoIiwgbGluZU51bWJlciwgc3RhY2tMaW5lKTsKKwkJCQlicHMucmVtb3ZlKGJyZWFrcG9pbnQpOworCQkJCWJyZWFrcG9pbnQuZGVsZXRlKCk7CisJCQkJaWYgKCFicHMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzZXBWTSkgeworICAgICAgICAgICAgICAgICAgICAgICAgd2FpdEZvclRhcmdldCgpOworICAgICAgICAgICAgICAgICAgICB9CisJCQkJCXRocmVhZCA9IHJlc3VtZSh0aHJlYWQpOworCQkJCX0KKwkJCX0KKwkJfSBmaW5hbGx5IHsKKwkJCXRlcm1pbmF0ZUFuZFJlbW92ZSh0aHJlYWQpOworCQkJcmVtb3ZlQWxsQnJlYWtwb2ludHMoKTsKKwkJfQorCX0KKworCXB1YmxpYyB2b2lkIHRlc3REaXNhYmxlZEJyZWFrcG9pbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZGlzYWJsZWRCcmVha3BvaW50KGZhbHNlKTsJCQkJCisJfQorCisJcHVibGljIHZvaWQgdGVzdERpc2FibGVkQnJlYWtwb2ludFNlcFZNKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGRpc2FibGVkQnJlYWtwb2ludCh0cnVlKTsJCQkJCisJfQorCisJcHJpdmF0ZSB2b2lkIGRpc2FibGVkQnJlYWtwb2ludChib29sZWFuIHNlcGFyYXRlVk0pIHRocm93cyBFeGNlcHRpb24sIENvcmVFeGNlcHRpb24geworCQlTdHJpbmcgZmlsZU5hbWUgPSAiYnJlYWtwb2ludHMiOworCQlJTGluZUJyZWFrcG9pbnQgYnAgPSBjcmVhdGVMaW5lQnJlYWtwb2ludCg1LCBmaWxlTmFtZSArICIueG1sIik7CisJCWJwLnNldEVuYWJsZWQoZmFsc2UpOworCQlBbnREZWJ1Z1RhcmdldCBkZWJ1Z1RhcmdldCA9IG51bGw7CisJCXRyeSB7CisJCQlkZWJ1Z1RhcmdldD0gbGF1bmNoQW5kVGVybWluYXRlKGZpbGVOYW1lLCBzZXBhcmF0ZVZNKTsKKwkJfSBmaW5hbGx5IHsKKwkJCXRlcm1pbmF0ZUFuZFJlbW92ZShkZWJ1Z1RhcmdldCk7CisJCQlyZW1vdmVBbGxCcmVha3BvaW50cygpOworCQl9CisJfQorCisJcHVibGljIHZvaWQgdGVzdEVuYWJsZURpc2FibGVCcmVha3BvaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGVuYWJsZURpc2FibGVCcmVhcG9pbnQoZmFsc2UpOwkJCQkKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0RW5hYmxlRGlzYWJsZUJyZWFrcG9pbnRTZXBWTSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBlbmFibGVEaXNhYmxlQnJlYXBvaW50KHRydWUpOwkJCQkKKwl9CisKKwlwcml2YXRlIHZvaWQgZW5hYmxlRGlzYWJsZUJyZWFwb2ludChib29sZWFuIHNlcFZNKSB0aHJvd3MgRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKKwkJCisJCVN0cmluZyBmaWxlTmFtZSA9ICJicmVha3BvaW50cyI7CisJCUlMaW5lQnJlYWtwb2ludCBicCA9IGNyZWF0ZUxpbmVCcmVha3BvaW50KDUsIGZpbGVOYW1lICsgIi54bWwiKTsKKwkJYnAuc2V0RW5hYmxlZCh0cnVlKTsKKwkJQW50VGhyZWFkIHRocmVhZCA9IG51bGw7CisJCXRyeSB7CisJCQlpZiAoc2VwVk0pIHsKKwkJCQlmaWxlTmFtZSs9ICJTZXBWTSI7CisJCQl9CisgICAgICAgICAgICBJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWc9IGdldExhdW5jaENvbmZpZ3VyYXRpb24oZmlsZU5hbWUpOworICAgICAgICAgICAgSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb3B5PSBjb25maWcuZ2V0V29ya2luZ0NvcHkoKTsKKyAgICAgICAgICAgIGNvcHkuc2V0QXR0cmlidXRlKElBbnRMYXVuY2hDb25zdGFudHMuQVRUUl9BTlRfVEFSR0VUUywgImVudHJ5MSxlbnRyeTIiKTsKKwkJCXRocmVhZD0gbGF1bmNoVG9MaW5lQnJlYWtwb2ludChjb3B5LCBicCk7CisJCQlicC5zZXRFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgICAgIGlmIChzZXBWTSkgeworICAgICAgICAgICAgICAgIHdhaXRGb3JUYXJnZXQoKTsKKyAgICAgICAgICAgIH0KKwkJCXJlc3VtZUFuZEV4aXQodGhyZWFkKTsKKwkJfSBmaW5hbGx5IHsKKwkJCXRlcm1pbmF0ZUFuZFJlbW92ZSh0aHJlYWQpOworCQkJcmVtb3ZlQWxsQnJlYWtwb2ludHMoKTsKKwkJfQorCX0KKworICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgd2FpdEZvclRhcmdldCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vd2FpdCBmb3IgdGhlIHRhcmdldCB0byBnZXQgdXBkYXRlZCBmb3IgdGhlIG5ldyBicmVha3BvaW50IHN0YXRlIAorICAgICAgICAgICAgd2FpdCgxMDAwKTsKKyAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKKyAgICAgICAgfQorICAgIH0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0U2tpcExpbmVCcmVha3BvaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHNraXBMaW5lQnJlYWtwb2ludChmYWxzZSk7CQkJICAgIAorCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0U2tpcExpbmVCcmVha3BvaW50U2VwVk0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc2tpcExpbmVCcmVha3BvaW50KHRydWUpOwkJCSAgICAKKwl9CisKKwlwcml2YXRlIHZvaWQgc2tpcExpbmVCcmVha3BvaW50KGJvb2xlYW4gc2VwVk0pIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgZmlsZU5hbWUgPSAiYnJlYWtwb2ludHMiOworCQlJRmlsZSBmaWxlPSBnZXRJRmlsZShmaWxlTmFtZSArICIueG1sIik7CisJCUlMaW5lQnJlYWtwb2ludCBicCA9IGNyZWF0ZUxpbmVCcmVha3BvaW50KDUsIGZpbGUpOworCQljcmVhdGVMaW5lQnJlYWtwb2ludCgxNSwgZmlsZSk7CisJCUFudFRocmVhZCB0aHJlYWQgPSBudWxsOworCQl0cnkgeworCQkJaWYgKHNlcFZNKSB7CisJCQkJZmlsZU5hbWUrPSAiU2VwVk0iOworCQkJfQorCQkgICAgdGhyZWFkPSBsYXVuY2hUb0xpbmVCcmVha3BvaW50KGZpbGVOYW1lLCBicCk7CisJCSAgICBnZXRCcmVha3BvaW50TWFuYWdlcigpLnNldEVuYWJsZWQoZmFsc2UpOworCQkgICAgcmVzdW1lQW5kRXhpdCh0aHJlYWQpOworCQl9IGZpbmFsbHkgeworCQkJdGVybWluYXRlQW5kUmVtb3ZlKHRocmVhZCk7CisJCQlyZW1vdmVBbGxCcmVha3BvaW50cygpOworCQkJZ2V0QnJlYWtwb2ludE1hbmFnZXIoKS5zZXRFbmFibGVkKHRydWUpOworCQl9CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RCcmVha3BvaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWJyZWFrcG9pbnRzKGZhbHNlLCAiZGVmYXVsdCIsIDUsIDE1KTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEJyZWFrcG9pbnRTZXBWTSgpIHRocm93cyBFeGNlcHRpb24geworCQlicmVha3BvaW50cyh0cnVlLCAiZGVmYXVsdCIsIDUsIDE1KTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0VGFyZ2V0QnJlYWtwb2ludCgpIHRocm93cyBFeGNlcHRpb24geworCQlicmVha3BvaW50cyhmYWxzZSwgImVudHJ5MiIsIDQsIDI0KTsKKwl9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdFRhc2tPdXRPZlRhcmdldEJyZWFrcG9pbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYnJlYWtwb2ludHMoZmFsc2UsICJlbnRyeTIiLCAzNiwgNSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RUYXNrT3V0T2ZUYXJnZXRCcmVha3BvaW50U2VwVm0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYnJlYWtwb2ludHModHJ1ZSwgImVudHJ5MiIsIDM2LCA1KTsKKyAgICB9CisJCisJcHVibGljIHZvaWQgdGVzdFRhcmdldEJyZWFrcG9pbnRTZXBWTSgpIHRocm93cyBFeGNlcHRpb24geworCQlicmVha3BvaW50cyh0cnVlLCAiZW50cnkyIiwgNCwgMjQpOworCX0KKwkKKwlwcml2YXRlIHZvaWQgYnJlYWtwb2ludHMoYm9vbGVhbiBzZXBWTSwgU3RyaW5nIGRlZmF1bHRUYXJnZXROYW1lLCBpbnQgZmlyc3RMaW5lTnVtYmVyLCBpbnQgc2Vjb25kTGluZU51bWJlcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlTdHJpbmcgZmlsZU5hbWUgPSAiYnJlYWtwb2ludHMiOworCQlJRmlsZSBmaWxlPSBnZXRJRmlsZShmaWxlTmFtZSArICIueG1sIik7CisJCUlMaW5lQnJlYWtwb2ludCBicCA9IGNyZWF0ZUxpbmVCcmVha3BvaW50KGZpcnN0TGluZU51bWJlciwgZmlsZSk7CisJCUFudFRocmVhZCB0aHJlYWQgPSBudWxsOworCQl0cnkgeworCQkJaWYgKHNlcFZNKSB7CisJCQkJZmlsZU5hbWUrPSAiU2VwVk0iOworCQkJfQorCQkJSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlnPSBnZXRMYXVuY2hDb25maWd1cmF0aW9uKGZpbGVOYW1lKTsKKwkJCUlMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29weT0gY29uZmlnLmdldFdvcmtpbmdDb3B5KCk7CisJCQljb3B5LnNldEF0dHJpYnV0ZShJQW50TGF1bmNoQ29uc3RhbnRzLkFUVFJfQU5UX1RBUkdFVFMsIGRlZmF1bHRUYXJnZXROYW1lKTsKKyAgICAgICAgICAgIGlmICghc2VwVk0pIHsKKyAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMzAwMCk7IC8vVE9ETyBidWcgMTIxMjA3OiB3YWl0IGZvciBwcmV2aW91cyBsYXVuY2ggdG8gZnVsbHkgdGVybWluYXRlCisgICAgICAgICAgICB9CisJCSAgICB0aHJlYWQ9IGxhdW5jaFRvTGluZUJyZWFrcG9pbnQoY29weSwgYnApOworCQkJYnA9IGNyZWF0ZUxpbmVCcmVha3BvaW50KHNlY29uZExpbmVOdW1iZXIsIGZpbGUpOworCQkgICAgcmVzdW1lVG9MaW5lQnJlYWtwb2ludCh0aHJlYWQsIGJwKTsKKwkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAKKyAgICAgICAgfSBmaW5hbGx5IHsKKwkJCXRlcm1pbmF0ZUFuZFJlbW92ZSh0aHJlYWQpOworCQkJcmVtb3ZlQWxsQnJlYWtwb2ludHMoKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IERlYnVnIFRlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9kZWJ1Zy9EZWJ1Z0VsZW1lbnRFdmVudFdhaXRlci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgRGVidWcgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL2RlYnVnL0RlYnVnRWxlbWVudEV2ZW50V2FpdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY4YTg3ZAotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IERlYnVnIFRlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9kZWJ1Zy9EZWJ1Z0VsZW1lbnRFdmVudFdhaXRlci5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLmRlYnVnOworCitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLnRlc3RwbHVnaW4uRGVidWdFdmVudFdhaXRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnRXZlbnQ7CisKKy8qKgorICogV2FpdHMgZm9yIGFuIGV2ZW50IG9uIGEgc3BlY2lmaWMgZWxlbWVudAorICovCisKK3B1YmxpYyBjbGFzcyBEZWJ1Z0VsZW1lbnRFdmVudFdhaXRlciBleHRlbmRzIERlYnVnRXZlbnRXYWl0ZXIgeworCQorCXByb3RlY3RlZCBPYmplY3QgZkVsZW1lbnQ7CisJCisJcHVibGljIERlYnVnRWxlbWVudEV2ZW50V2FpdGVyKGludCBraW5kLCBPYmplY3QgZWxlbWVudCkgeworCQlzdXBlcihraW5kKTsKKwkJZkVsZW1lbnQgPSBlbGVtZW50OworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRGVidWdFdmVudCBldmVudCkgeworCQlyZXR1cm4gc3VwZXIuYWNjZXB0KGV2ZW50KSAmJiBmRWxlbWVudCA9PSBldmVudC5nZXRTb3VyY2UoKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IERlYnVnIFRlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9kZWJ1Zy9EZWJ1Z0VsZW1lbnRLaW5kRXZlbnREZXRhaWxXYWl0ZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IERlYnVnIFRlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9kZWJ1Zy9EZWJ1Z0VsZW1lbnRLaW5kRXZlbnREZXRhaWxXYWl0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2Q5NmFlCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgRGVidWcgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL2RlYnVnL0RlYnVnRWxlbWVudEtpbmRFdmVudERldGFpbFdhaXRlci5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLmRlYnVnOworCitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLnRlc3RwbHVnaW4uRGVidWdFbGVtZW50S2luZEV2ZW50V2FpdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdFdmVudDsKKworLyoqCisgKiBXYWl0IGZvciB0aGUgc3BlY2lmaWVkIGV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCBmcm9tIHRoZSBzcGVjaWZpZWQgZWxlbWVudC4KKyAqLworcHVibGljIGNsYXNzIERlYnVnRWxlbWVudEtpbmRFdmVudERldGFpbFdhaXRlciBleHRlbmRzIERlYnVnRWxlbWVudEtpbmRFdmVudFdhaXRlciB7CisKKwlwcm90ZWN0ZWQgaW50IGZEZXRhaWw7CisKKwlwdWJsaWMgRGVidWdFbGVtZW50S2luZEV2ZW50RGV0YWlsV2FpdGVyKGludCBldmVudEtpbmQsIENsYXNzIGVsZW1lbnRDbGFzcywgaW50IGRldGFpbCkgeworCQlzdXBlcihldmVudEtpbmQsIGVsZW1lbnRDbGFzcyk7CisJCWZEZXRhaWwgPSBkZXRhaWw7CisJfQorCQorCXB1YmxpYyBib29sZWFuIGFjY2VwdChEZWJ1Z0V2ZW50IGV2ZW50KSB7CisJCXJldHVybiBzdXBlci5hY2NlcHQoZXZlbnQpICYmIGZEZXRhaWwgPT0gZXZlbnQuZ2V0RGV0YWlsKCk7CisJfQorCQorfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgRGVidWcgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL2RlYnVnL1N0YWNrVGVzdHMuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IERlYnVnIFRlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9kZWJ1Zy9TdGFja1Rlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFmNWE1ZAotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IERlYnVnIFRlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9kZWJ1Zy9TdGFja1Rlc3RzLmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC50ZXN0cy51aS5kZWJ1ZzsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5sYXVuY2hpbmcuZGVidWcubW9kZWwuQW50VGhyZWFkOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSUxpbmVCcmVha3BvaW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVN0YWNrRnJhbWU7CisKK3B1YmxpYyBjbGFzcyBTdGFja1Rlc3RzIGV4dGVuZHMgQWJzdHJhY3RBbnREZWJ1Z1Rlc3QgeworCisgICAgcHVibGljIFN0YWNrVGVzdHMoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFN0YWNrRm9yQW50Q2FsbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhbnRDYWxsU3RhY2soZmFsc2UpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhY2tGb3JBbnRDYWxsVk0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYW50Q2FsbFN0YWNrKHRydWUpOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHZvaWQgYW50Q2FsbFN0YWNrKGJvb2xlYW4gc2VwVk0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gIjg1NzY5IjsKKyAgICAgICAgSUZpbGUgZmlsZT0gZ2V0SUZpbGUoZmlsZU5hbWUgKyAiLnhtbCIpOworICAgICAgICBJTGluZUJyZWFrcG9pbnQgYnAgPSBjcmVhdGVMaW5lQnJlYWtwb2ludCgxOCwgZmlsZSk7CisgICAgICAgIEFudFRocmVhZCB0aHJlYWQgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKHNlcFZNKSB7CisgICAgICAgICAgICAgICAgZmlsZU5hbWUrPSAiU2VwVk0iOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyZWFkPSBsYXVuY2hUb0xpbmVCcmVha3BvaW50KGZpbGVOYW1lLCBicCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIAorICAgICAgICAgICAgSVN0YWNrRnJhbWVbXSBmcmFtZXM9IHRocmVhZC5nZXRTdGFja0ZyYW1lcygpOworICAgICAgICAgICAKKyAgICAgICAgICAgIGFzc2VydFRydWUoZnJhbWVzLmxlbmd0aCA9PSAzKTsKKyAgICAgICAgICAgIElTdGFja0ZyYW1lIGZyYW1lID0gZnJhbWVzWzBdOworICAgICAgICAgICAgZnJhbWUuZ2V0TmFtZSgpLmVxdWFscygiIik7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB0ZXJtaW5hdGVBbmRSZW1vdmUodGhyZWFkKTsKKyAgICAgICAgICAgIHJlbW92ZUFsbEJyZWFrcG9pbnRzKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBEZWJ1ZyBUZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvZGVidWcvU3RlcHBpbmdUZXN0cy5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgRGVidWcgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL2RlYnVnL1N0ZXBwaW5nVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzZkMWE1Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgRGVidWcgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL2RlYnVnL1N0ZXBwaW5nVGVzdHMuamF2YQpAQCAtMCwwICsxLDIzNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC50ZXN0cy51aS5kZWJ1ZzsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5sYXVuY2hpbmcuZGVidWcubW9kZWwuQW50U3RhY2tGcmFtZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwubGF1bmNoaW5nLmRlYnVnLm1vZGVsLkFudFRocmVhZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSUxpbmVCcmVha3BvaW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVN0YWNrRnJhbWU7CisKK3B1YmxpYyBjbGFzcyBTdGVwcGluZ1Rlc3RzIGV4dGVuZHMgQWJzdHJhY3RBbnREZWJ1Z1Rlc3QgeworCisgICAgcHVibGljIFN0ZXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIGJ1ZyA4NDQwMAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RTdGVwQmFja0Zyb21BbnRDYWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWFudENhbGxTdGFjayhmYWxzZSwgMTIsIERlYnVnRXZlbnQuU1RFUF9PVkVSLCAiZGVmYXVsdDogZWNobyIsIDcpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBidWcgODQ0MDAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RlcEJhY2tGcm9tQW50Q2FsbFNlcFZNKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWFudENhbGxTdGFjayh0cnVlLCAxMiwgRGVidWdFdmVudC5TVEVQX09WRVIsICJkZWZhdWx0OiBlY2hvIiwgNyk7CisgICAgfQorCQorCSAvKioKKyAgICAgKiBidWcgODgyMTgsIDg1NzY5CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFN0ZXBJbnRvQW50Q2FsbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBBbnRUaHJlYWQgdGhyZWFkPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdGhyZWFkPSBhbnRDYWxsU3RhY2soZmFsc2UsIDUsIERlYnVnRXZlbnQuU1RFUF9JTlRPLCAicHJlLWNhbGw6IGVjaG8iLCAxNiwgZmFsc2UpOworICAgICAgICAgICAgSVN0YWNrRnJhbWVbXSBmcmFtZXM9IHRocmVhZC5nZXRTdGFja0ZyYW1lcygpOworICAgICAgICAgICAgYXNzZXJ0RnJhbWUoImNhbGwiLCAxMCwgKEFudFN0YWNrRnJhbWUpZnJhbWVzWzFdKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHRlcm1pbmF0ZUFuZFJlbW92ZSh0aHJlYWQpOworICAgICAgICAgICAgcmVtb3ZlQWxsQnJlYWtwb2ludHMoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBidWcgODgyMTgsIDg1NzY5CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFN0ZXBJbnRvQW50Q2FsbFNlcFZNKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEFudFRocmVhZCB0aHJlYWQ9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0aHJlYWQ9IGFudENhbGxTdGFjayh0cnVlLCA1LCBEZWJ1Z0V2ZW50LlNURVBfSU5UTywgInByZS1jYWxsOiBlY2hvIiwgMTYsIGZhbHNlKTsKKyAgICAgICAgICAgIElTdGFja0ZyYW1lW10gZnJhbWVzPSB0aHJlYWQuZ2V0U3RhY2tGcmFtZXMoKTsKKyAgICAgICAgICAgIGFzc2VydEZyYW1lKCJjYWxsIiwgMTAsIChBbnRTdGFja0ZyYW1lKWZyYW1lc1sxXSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB0ZXJtaW5hdGVBbmRSZW1vdmUodGhyZWFkKTsKKyAgICAgICAgICAgIHJlbW92ZUFsbEJyZWFrcG9pbnRzKCk7CisgICAgICAgIH0KKyAgICB9CisJCisJIHB1YmxpYyB2b2lkIHRlc3RTdGVwT3ZlckFudENhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJIGFudENhbGxTdGFjayhmYWxzZSwgNSwgRGVidWdFdmVudC5TVEVQX09WRVIsICJkZWZhdWx0OiBlY2hvIiwgNyk7CisJIH0KKwkgCisJIHB1YmxpYyB2b2lkIHRlc3RTdGVwT3ZlckFudENhbGxTZXBWTSgpIHRocm93cyBFeGNlcHRpb24geworCQkgYW50Q2FsbFN0YWNrKHRydWUsIDUsIERlYnVnRXZlbnQuU1RFUF9PVkVSLCAiZGVmYXVsdDogZWNobyIsIDcpOworCSB9CisgICAgIAorICAgICAvKioKKyAgICAgICogYnVnIDk2MDIyCisgICAgICAqLworICAgICBwdWJsaWMgdm9pZCB0ZXN0U3RlcE92ZXJBbnRDYWxsUGFzdE90aGVyQW50Q2FsbHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgIGRlYnVnU3RhY2soZmFsc2UsIDcsIERlYnVnRXZlbnQuU1RFUF9PVkVSLCAiZGVmYXVsdDogZWNobyIsIDksICI5NjAyMiIsIHRydWUpOworICAgICB9CisgICAgIC8qKgorICAgICAgKiBidWcgOTYwMjIKKyAgICAgICovCisgICAgIHB1YmxpYyB2b2lkIHRlc3RTdGVwT3ZlckFudENhbGxQYXN0T3RoZXJBbnRDYWxsc1NlcFZtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGRlYnVnU3RhY2sodHJ1ZSwgNywgRGVidWdFdmVudC5TVEVQX09WRVIsICJkZWZhdWx0OiBlY2hvIiwgOSwgIjk2MDIyIiwgdHJ1ZSk7CisgICAgIH0KKwkgCisJIHB1YmxpYyB2b2lkIHRlc3RTdGVwT3ZlckFudENhbGxIaXRCcmVha3BvaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCSBTdHJpbmcgZmlsZU5hbWUgPSAiZGVidWdBbnRDYWxsIjsKKwkJIGNyZWF0ZUxpbmVCcmVha3BvaW50KDEyLCBmaWxlTmFtZSArICIueG1sIik7CisJCSBhbnRDYWxsU3RhY2soZmFsc2UsIDUsIERlYnVnRXZlbnQuQlJFQUtQT0lOVCwgImNhbGw6IHNsZWVwIiwgMTIpOworCSB9CisJIAorCSBwdWJsaWMgdm9pZCB0ZXN0U3RlcE92ZXJBbnRDYWxsSGl0QnJlYWtwb2ludFNlcFZNKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCSBTdHJpbmcgZmlsZU5hbWUgPSAiZGVidWdBbnRDYWxsIjsKKwkJIGNyZWF0ZUxpbmVCcmVha3BvaW50KDEyLCBmaWxlTmFtZSArICIueG1sIik7CisJCSBhbnRDYWxsU3RhY2sodHJ1ZSwgNSwgRGVidWdFdmVudC5CUkVBS1BPSU5ULCAiY2FsbDogc2xlZXAiLCAxMik7CisJIH0KKyAgICAKKwlwcml2YXRlIEFudFRocmVhZCBhbnRDYWxsU3RhY2soYm9vbGVhbiBzZXBWTSwgaW50IGxpbmVOdW1iZXIsIGludCBraW5kLCBTdHJpbmcgZnJhbWVOYW1lLCBpbnQgZnJhbWVMaW5lTnVtYmVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBhbnRDYWxsU3RhY2soc2VwVk0sIGxpbmVOdW1iZXIsIGtpbmQsIGZyYW1lTmFtZSwgZnJhbWVMaW5lTnVtYmVyLCB0cnVlKTsKKwl9CisgICAgCisJcHJpdmF0ZSBBbnRUaHJlYWQgYW50Q2FsbFN0YWNrKGJvb2xlYW4gc2VwVk0sIGludCBsaW5lTnVtYmVyLCBpbnQga2luZCwgU3RyaW5nIGZyYW1lTmFtZSwgaW50IGZyYW1lTGluZU51bWJlciwgYm9vbGVhbiB0ZXJtaW5hdGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gImRlYnVnQW50Q2FsbCI7CisgICAgICAgIHJldHVybiBkZWJ1Z1N0YWNrKHNlcFZNLCBsaW5lTnVtYmVyLCBraW5kLCBmcmFtZU5hbWUsIGZyYW1lTGluZU51bWJlciwgZmlsZU5hbWUsIHRlcm1pbmF0ZSk7CisgICAgfQorCisJcHJpdmF0ZSBBbnRUaHJlYWQgZGVidWdTdGFjayhib29sZWFuIHNlcFZNLCBpbnQgbGluZU51bWJlciwgaW50IGtpbmQsIFN0cmluZyBmcmFtZU5hbWUsIGludCBmcmFtZUxpbmVOdW1iZXIsIFN0cmluZyBmaWxlTmFtZSwgYm9vbGVhbiB0ZXJtaW5hdGUpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBEZWJ1Z0V4Y2VwdGlvbiB7CisJCUlMaW5lQnJlYWtwb2ludCBicCA9IGNyZWF0ZUxpbmVCcmVha3BvaW50KGxpbmVOdW1iZXIsIGZpbGVOYW1lICsgIi54bWwiKTsKKwkJQW50VGhyZWFkIHRocmVhZD0gbnVsbDsKKwkJdHJ5IHsKKwkJCWlmIChzZXBWTSkgeworCQkJCWZpbGVOYW1lKz0iU2VwVk0iOworCQkJfQorCQkJSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlnPSBnZXRMYXVuY2hDb25maWd1cmF0aW9uKGZpbGVOYW1lKTsKKwkJCXRocmVhZD0gbGF1bmNoVG9MaW5lQnJlYWtwb2ludChjb25maWcsIGJwKTsgCisJCQlkZWJ1Z0ZyYW1lKGtpbmQsIGZyYW1lTmFtZSwgZnJhbWVMaW5lTnVtYmVyLCB0aHJlYWQpOworCQkJcmV0dXJuIHRocmVhZDsKKyAgICAgICAgfSBmaW5hbGx5IHsKKwkJCWlmICh0ZXJtaW5hdGUpIHsKKwkJCQl0ZXJtaW5hdGVBbmRSZW1vdmUodGhyZWFkKTsKKwkJCQlyZW1vdmVBbGxCcmVha3BvaW50cygpOworCQkJfQorCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIGRlYnVnRnJhbWUoaW50IGtpbmQsIFN0cmluZyBmcmFtZU5hbWUsIGludCBmcmFtZUxpbmVOdW1iZXIsIEFudFRocmVhZCB0aHJlYWQpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7CisJCUFudFN0YWNrRnJhbWUgZnJhbWUgPSAoQW50U3RhY2tGcmFtZSl0aHJlYWQuZ2V0VG9wU3RhY2tGcmFtZSgpOworCQlhc3NlcnROb3ROdWxsKGZyYW1lKTsKKwkJc3dpdGNoIChraW5kKSB7CisJCQljYXNlIERlYnVnRXZlbnQuQlJFQUtQT0lOVDogCisJCQkJc3RlcE92ZXJUb0hpdEJyZWFrcG9pbnQoZnJhbWUpOworCQkJCWJyZWFrOworCQkJY2FzZSBEZWJ1Z0V2ZW50LlNURVBfT1ZFUjoKKwkJCQlzdGVwT3ZlcihmcmFtZSk7CisJCQkJYnJlYWs7CisJCQljYXNlIERlYnVnRXZlbnQuU1RFUF9JTlRPOgorCQkJCXN0ZXBJbnRvKGZyYW1lKTsKKwkJCQlicmVhazsKKwkJfQorCQlhc3NlcnRGcmFtZSh0aHJlYWQsIGZyYW1lTmFtZSwgZnJhbWVMaW5lTnVtYmVyKTsKKwl9CisJCisgICAgcHJpdmF0ZSBBbnRTdGFja0ZyYW1lIGFzc2VydEZyYW1lKEFudFRocmVhZCB0aHJlYWQsIFN0cmluZyBmcmFtZU5hbWUsIGludCBsaW5lTnVtYmVyKSB0aHJvd3MgRGVidWdFeGNlcHRpb24geworICAgICAgICBBbnRTdGFja0ZyYW1lIGZyYW1lID0gKEFudFN0YWNrRnJhbWUpdGhyZWFkLmdldFRvcFN0YWNrRnJhbWUoKTsKKyAgICAgICAgcmV0dXJuIGFzc2VydEZyYW1lKGZyYW1lTmFtZSwgbGluZU51bWJlciwgZnJhbWUpOworICAgIH0KKworICAgIHByaXZhdGUgQW50U3RhY2tGcmFtZSBhc3NlcnRGcmFtZShTdHJpbmcgZnJhbWVOYW1lLCBpbnQgbGluZU51bWJlciwgQW50U3RhY2tGcmFtZSBmcmFtZSkgeworICAgICAgICBTdHJpbmcgYWN0dWFsRnJhbWVOYW1lPSBmcmFtZS5nZXROYW1lKCk7CisgICAgICAgIGludCBhY3R1YWxMaW5lTnVtYmVyPSBmcmFtZS5nZXRMaW5lTnVtYmVyKCk7CisgICAgICAgIGFzc2VydFRydWUoIk5hbWUgb2Ygc3RhY2sgZnJhbWUgaW5jb3JyZWN0LiBFeHBlY3RlZCAiICsgZnJhbWVOYW1lICsgIiB3YXM6ICIgKyBhY3R1YWxGcmFtZU5hbWUsIGZyYW1lTmFtZS5lcXVhbHMoYWN0dWFsRnJhbWVOYW1lKSk7CisgICAgICAgIGFzc2VydFRydWUoIkxpbmUgbnVtYmVyIG9mIHN0YWNrIGZyYW1lIGluY29ycmVjdC4gRXhwZWN0ZWQgIiArIGxpbmVOdW1iZXIgKyAiIHdhczogIiArIGFjdHVhbExpbmVOdW1iZXIsIGxpbmVOdW1iZXIgPT0gYWN0dWFsTGluZU51bWJlcik7CisgICAgICAgIHJldHVybiBmcmFtZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogYnVnIDg1MzA5CisgICAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFN0ZXBPdXRPZk1hY3JvZGVmKCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworICAgIAlTdHJpbmcgZmlsZU5hbWUgPSAibWFjcm9kZWYiOworCQlkZWJ1Z1N0YWNrKGZhbHNlLCA4ICwgRGVidWdFdmVudC5TVEVQX09WRVIsICJ0eXBlOiBlY2xpcHNlTWFjcm8iLCAxNiwgZmlsZU5hbWUsIHRydWUpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBidWcgODUzMDkKKyAgICAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RlcE91dE9mTWFjcm9kZWZTZXBWTSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKyAgICAJU3RyaW5nIGZpbGVOYW1lID0gIm1hY3JvZGVmIjsKKwkJZGVidWdTdGFjayh0cnVlLCA4ICwgRGVidWdFdmVudC5TVEVQX09WRVIsICJ0eXBlOiBlY2xpcHNlTWFjcm8iLCAxNiwgZmlsZU5hbWUsIHRydWUpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBidWcgOTQ3NjkKKyAgICAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RlcEludG9NYWNyb2RlZigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKyAgICAJdGVzdE1hY3JvRGVmKGZhbHNlKTsKKyAgICB9CisgICAgCisgLyoqCisgICAgICogYnVnIDk0NzY5CisgICAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFN0ZXBJbnRvTWFjcm9kZWZTZXBWTSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKyAgICAJdGVzdE1hY3JvRGVmKHRydWUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0TWFjcm9EZWYoYm9vbGVhbiBzZXBWTSkgdGhyb3dzIENvcmVFeGNlcHRpb24sIERlYnVnRXhjZXB0aW9uIHsKKyAgICAJQW50VGhyZWFkIHRocmVhZD0gbnVsbDsKKyAgICAJdHJ5IHsKKyAgICAJCVN0cmluZyBmaWxlTmFtZSA9ICJtYWNyb2RlZiI7CisgICAgCQl0aHJlYWQ9IGRlYnVnU3RhY2soc2VwVk0sIDE2ICwgRGVidWdFdmVudC5TVEVQX0lOVE8sICJ0eXBlOiBzZXF1ZW50aWFsIiwgMCwgZmlsZU5hbWUsIGZhbHNlKTsKKyAgICAJCWRlYnVnRnJhbWUoRGVidWdFdmVudC5TVEVQX0lOVE8sICJ0eXBlOiBlY2hvIiwgOCwgdGhyZWFkKTsKKyAgICAJCWRlYnVnRnJhbWUoRGVidWdFdmVudC5TVEVQX09WRVIsICJ0eXBlOiBlY2xpcHNlTWFjcm8iLCAxNywgdGhyZWFkKTsKKyAgICAJfSBmaW5hbGx5IHsKKwkJCXRlcm1pbmF0ZUFuZFJlbW92ZSh0aHJlYWQpOworCQkJcmVtb3ZlQWxsQnJlYWtwb2ludHMoKTsKKwkJfQorCX0KKyAgICAKKy8vICAgIHB1YmxpYyB2b2lkIHRlc3RTdGVwQmFja0Zyb21BbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKy8vICAgICAgICBhbnRDYWxsU3RhY2soZmFsc2UpOworLy8gICAgfQorLy8gICAgCisvLyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RlcEJhY2tGcm9tQW50U2VwVk0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKy8vICAgICAgICBhbnRDYWxsU3RhY2soZmFsc2UpOworLy8gICAgfQorLy8KKy8vICAgIAorLy8gICAgcHVibGljIHZvaWQgdGVzdFN0ZXBJbnRvQW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisvLyAgICAgICAgYW50Q2FsbFN0YWNrKGZhbHNlKTsKKy8vICAgIH0KKy8vICAgIAorLy8gICAgcHVibGljIHZvaWQgdGVzdFN0ZXBJbnRvQW50U2VwVk0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKy8vICAgICAgICBhbnRDYWxsU3RhY2soZmFsc2UpOworLy8gICAgfQorLy8KKy8vICAgIHB1YmxpYyB2b2lkIHRlc3RTdGVwT3ZlckFudCgpIHRocm93cyBFeGNlcHRpb24geworLy8gICAgICAgIGFudENhbGxTdGFjayhmYWxzZSk7CisvLyAgICB9CisvLyAgICAKKy8vICAgIHB1YmxpYyB2b2lkIHRlc3RTdGVwT3ZlckFudFNlcFZNKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisvLyAgICAgICAgYW50Q2FsbFN0YWNrKGZhbHNlKTsKKy8vICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IEVkaXRvciBUZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvZHRkL2R1bXBlci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgRWRpdG9yIFRlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9kdGQvZHVtcGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZkNmQxNgotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IEVkaXRvciBUZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvZHRkL2R1bXBlci5qYXZhCkBAIC0wLDAgKzEsMTQ3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA1IE9iamVjdCBGYWN0b3J5IEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgT2JqZWN0IEZhY3RvcnkgSW5jLiAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC50ZXN0cy51aS5kdGQ7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZHRkLklEZm07CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmR0ZC5JRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZHRkLklNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZHRkLklTY2hlbWE7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmR0ZC5QYXJzZUVycm9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5kdGQuUGFyc2VyOworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBmcm9tIHRoZSBjb21tYW5kIGxpbmUgKGhlbmNlIHRoZQorICogdW5jYXBpdGFsaXplZCBjbGFzcyBuYW1lKS4KKyAqIEBhdXRob3IgQm9iIEZvc3RlcgorICovCitwdWJsaWMgY2xhc3MgZHVtcGVyIHsKKworCXB1YmxpYyBzdGF0aWMgaW50IG1haW4oU3RyaW5nW10gYXJncykgeworCisJCWlmIChhcmdzLmxlbmd0aCA8PSAwKSB7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVzYWdlOiBqYXZhIERURE1lcmdlciBVUkwiKTsKKwkJCXJldHVybiAwOworCQl9CisJCVN0cmluZyBkb2N1bWVudCA9IGFyZ3NbMF07CisKKwkJUGFyc2VyIHBhcnNlciA9IG5ldyBQYXJzZXIoKTsKKwkJCisJCUlTY2hlbWEgc2NoZW1hOworCQl0cnkgeworCQkJc2NoZW1hID0gcGFyc2VyLnBhcnNlKGRvY3VtZW50KTsKKwkJfSBjYXRjaCAoUGFyc2VFcnJvciBlKSB7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oZS5nZXRNZXNzYWdlKCkpOworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCXJldHVybiAxOworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJU3lzdGVtLm91dC5wcmludGxuKCJEVEQgc3VjY2Vzc2Z1bGx5IHBhcnNlZCIpOworCQlkdW1wU2NoZW1hKHNjaGVtYSk7CisJCXJldHVybiAwOworCX0KKwkKKwkvKioKKwkgKiBXcml0ZSBzY2hlbWEgY29udGVudHMgdG8gc3RhbmRhcmQgb3V0cHV0LgorCSAqLworCXByaXZhdGUgc3RhdGljIHZvaWQgZHVtcFNjaGVtYShJU2NoZW1hIHNjaGVtYSkgeworCQlJRWxlbWVudFtdIGVsZW1lbnRzID0gc2NoZW1hLmdldEVsZW1lbnRzKCk7CisJCVN5c3RlbS5vdXQucHJpbnRsbigiIitlbGVtZW50cy5sZW5ndGgrIiBlbGVtZW50cyBkZWZpbmVkIik7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKKwkJCUlFbGVtZW50IGVsZW1lbnQgPSBlbGVtZW50c1tpXTsKKwkJCUlNb2RlbCBtb2RlbCA9IGVsZW1lbnQuZ2V0Q29udGVudE1vZGVsKCk7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVMRU1FTlQgIitlbGVtZW50LmdldE5hbWUoKQorCQkJCSsnIicrbW9kZWwuc3RyaW5nUmVwKCkrJyInKTsKKwkJCWR1bXBEZm0oZWxlbWVudC5nZXREZm0oKSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBEdW1wIGRmbSBhcyBhIHNlcmllcyBvZiBzdGF0ZXMuCisJICogPHByZT4KKwkgKiBTMCAgYT0+UzEgYj0+UzIgCisJICogUzEgIGM9PlMyCisJICogUzIqIGQ9PlMyCisJICogPC9wcmU+CisJICogV2hlcmUgKiBpbmRpY2F0ZXMgYWNjZXB0aW5nIHN0YXRlLgorCSAqIEBwYXJhbSBkZm0gdG8gZHVtcAorCSAqLworCXByaXZhdGUgc3RhdGljIHZvaWQgZHVtcERmbShJRGZtIGRmbSkgeworCQlIYXNoTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7CisJCWR1bXBEZm0oZGZtLCBtYXAsIDApOworCQlMaW5rZWRMaXN0IGxpc3QgPSBuZXcgTGlua2VkTGlzdCgpOworCQlJdGVyYXRvciBpdCA9IG1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7CisJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKKwkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKKwkJCWxpc3QuYWRkKG5ldyBTdGF0ZSgoSURmbSllbnRyeS5nZXRLZXkoKSwgKEludGVnZXIpZW50cnkuZ2V0VmFsdWUoKSkpOworCQl9CisJCVN0YXRlW10gc3RhdGVzID0gKFN0YXRlW10pIGxpc3QudG9BcnJheShuZXcgU3RhdGVbbGlzdC5zaXplKCldKTsKKwkJQXJyYXlzLnNvcnQoc3RhdGVzKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdGF0ZXMubGVuZ3RoOyBpKyspIHsKKwkJCXByaW50KHN0YXRlc1tpXSwgbWFwKTsKKwkJfQorCX0KKworCXByaXZhdGUgc3RhdGljIHZvaWQgcHJpbnQoU3RhdGUgc3RhdGUsIEhhc2hNYXAgbWFwKSB7CisJCVN5c3RlbS5vdXQucHJpbnQoIiAgUyIrc3RhdGUubi5pbnRWYWx1ZSgpCisJCQkrKHN0YXRlLmRmbS5pc0FjY2VwdGluZygpID8gIiogICIgOiAiICAiKSk7CisJCVN0cmluZ1tdIGFjY2VwdHMgPSBzdGF0ZS5kZm0uZ2V0QWNjZXB0cygpOworCQlmb3IgKGludCBpID0gMDsgaSA8IGFjY2VwdHMubGVuZ3RoOyBpKyspIHsKKwkJCVN0cmluZyBhY2NlcHQgPSBhY2NlcHRzW2ldOworCQkJSURmbSBuZXh0ID0gc3RhdGUuZGZtLmFkdmFuY2UoYWNjZXB0KTsKKwkJCWludCBuID0gKChJbnRlZ2VyKW1hcC5nZXQobmV4dCkpLmludFZhbHVlKCk7CisJCQlTeXN0ZW0ub3V0LnByaW50KCIgIithY2NlcHQrIj0+UyIrbik7CisJCX0KKwkJU3lzdGVtLm91dC5wcmludGxuKCk7CisJfQorCQorCXByaXZhdGUgc3RhdGljIGludCBkdW1wRGZtKElEZm0gZGZtLCBIYXNoTWFwIG1hcCwgaW50IG51bSkgeworCQlpZiAoIW1hcC5jb250YWluc0tleShkZm0pKSB7CisJCQltYXAucHV0KGRmbSwgbmV3IEludGVnZXIobnVtKyspKTsKKwkJCVN0cmluZ1tdIGFjY2VwdHMgPSBkZm0uZ2V0QWNjZXB0cygpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhY2NlcHRzLmxlbmd0aDsgaSsrKSB7CisJCQkJSURmbSBuZXh0ID0gZGZtLmFkdmFuY2UoYWNjZXB0c1tpXSk7CisJCQkJbnVtID0gZHVtcERmbShuZXh0LCBtYXAsIG51bSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bTsKKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU3RhdGUgaW1wbGVtZW50cyBDb21wYXJhYmxlIHsKKwkJcHVibGljIElEZm0gZGZtOworCQlwdWJsaWMgSW50ZWdlciBuOworCQlwdWJsaWMgU3RhdGUoSURmbSBkZm0sIEludGVnZXIgbikgeworCQkJdGhpcy5kZm0gPSBkZm07CisJCQl0aGlzLm4gPSBuOworCQl9CisJCS8qKgorCQkgKiBAc2VlIGphdmEubGFuZy5Db21wYXJhYmxlI2NvbXBhcmVUbyhqYXZhLmxhbmcuT2JqZWN0KQorCQkgKi8KKwkJcHVibGljIGludCBjb21wYXJlVG8oT2JqZWN0IG8pIHsKKwkJCVN0YXRlIG90aGVyID0gKFN0YXRlKSBvOworCQkJcmV0dXJuIG4uaW50VmFsdWUoKSA8IG90aGVyLm4uaW50VmFsdWUoKQorCQkJCT8gLTEgCisJCQkJOiAobi5pbnRWYWx1ZSgpID09IG90aGVyLm4uaW50VmFsdWUoKSAKKwkJCQkJPyAwIAorCQkJCQk6IDEpOworCQl9CisKKwl9Cit9CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBFZGl0b3IgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL2VkaXRvci9UYXNrRGVzY3JpcHRpb25Qcm92aWRlclRlc3QuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IEVkaXRvciBUZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvZWRpdG9yL1Rhc2tEZXNjcmlwdGlvblByb3ZpZGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwYzA5NGUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBFZGl0b3IgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL2VkaXRvci9UYXNrRGVzY3JpcHRpb25Qcm92aWRlclRlc3QuamF2YQpAQCAtMCwwICsxLDY1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA1IEdFQklUIEdlc2VsbHNjaGFmdCBmdWVyIEVEVi1CZXJhdHVuZworICogdW5kIEluZm9ybWF0aWstVGVjaG5vbG9naWVuIG1iSCwgCisgKiBCZXJsaW4sIER1ZXNzZWxkb3JmLCBGcmFua2Z1cnQgKEdlcm1hbnkpLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBHRUJJVCBHZXNlbGxzY2hhZnQgZnVlciBFRFYtQmVyYXR1bmcgdW5kIEluZm9ybWF0aWstVGVjaG5vbG9naWVuIG1iSCAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC50ZXN0cy51aS5lZGl0b3I7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLnRlc3RwbHVnaW4uQWJzdHJhY3RBbnRVSVRlc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5UYXNrRGVzY3JpcHRpb25Qcm92aWRlcjsKKworLyoqCisgKiBUZXN0cyB0aGUgdGFza3MgZGVzY3JpcHRpb24gcHJvdmlkZXIuCisgKiAKKyAqLworcHVibGljIGNsYXNzIFRhc2tEZXNjcmlwdGlvblByb3ZpZGVyVGVzdCBleHRlbmRzIEFic3RyYWN0QW50VUlUZXN0IHsKKworICAgIHB1YmxpYyBUYXNrRGVzY3JpcHRpb25Qcm92aWRlclRlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgLyoqIAorICAgICAqIFRlc3RzIGdldHRpbmcgdGhlIGRlc2NyaXB0aW9uIG9mIGEgdGFzay4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0dGluZ1Rhc2tEZXNjcmlwdGlvbigpIHsKKyAgICAgICAgVGFza0Rlc2NyaXB0aW9uUHJvdmlkZXIgcHJvdmlkZXIgPSBUYXNrRGVzY3JpcHRpb25Qcm92aWRlci5nZXREZWZhdWx0KCk7CisgICAgICAgIFN0cmluZyBkZXNjcmlwdGlvbiA9IHByb3ZpZGVyLmdldERlc2NyaXB0aW9uRm9yVGFzaygiYXBwbHkiKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChkZXNjcmlwdGlvbik7CisgICAgICAgIGFzc2VydFRydWUoZGVzY3JpcHRpb24ubGVuZ3RoKCkgPiAwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyBnZXR0aW5nIHRoZSBkZXNjcmlwdGlvbiBvZiBhbiBhdHRyaWJ1dGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEdldHRpbmdBdHRyaWJ1dGUoKSB7CisgICAgICAgIFRhc2tEZXNjcmlwdGlvblByb3ZpZGVyIHByb3ZpZGVyID0gVGFza0Rlc2NyaXB0aW9uUHJvdmlkZXIuZ2V0RGVmYXVsdCgpOworICAgICAgICBTdHJpbmcgZGVzY3JpcHRpb24gPSBwcm92aWRlci5nZXREZXNjcmlwdGlvbkZvclRhc2tBdHRyaWJ1dGUoImFwcGx5IiwgImV4ZWN1dGFibGUiKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChkZXNjcmlwdGlvbik7CisgICAgICAgIGFzc2VydFRydWUoZGVzY3JpcHRpb24ubGVuZ3RoKCkgPiAwKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVGVzdHMgZ2V0dGluZyB0aGUgcmVxdWlyZWQgdmFsdWUgb2YgYW4gYXR0cmlidXRlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXR0aW5nUmVxdWlyZWQoKSB7CisgICAgICAgIFRhc2tEZXNjcmlwdGlvblByb3ZpZGVyIHByb3ZpZGVyID0gVGFza0Rlc2NyaXB0aW9uUHJvdmlkZXIuZ2V0RGVmYXVsdCgpOworICAgICAgICBTdHJpbmcgcmVxdWlyZWQgPSBwcm92aWRlci5nZXRSZXF1aXJlZEF0dHJpYnV0ZUZvclRhc2tBdHRyaWJ1dGUoImFwcGx5IiwgImV4ZWN1dGFibGUiKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXF1aXJlZCk7CisgICAgICAgIGFzc2VydEVxdWFscygieWVzIiwgcmVxdWlyZWQpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKKwkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoVGFza0Rlc2NyaXB0aW9uUHJvdmlkZXJUZXN0LmNsYXNzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBFZGl0b3IgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL2VkaXRvci9mb3JtYXR0ZXIvRm9ybWF0dGluZ1ByZWZlcmVuY2VzVGVzdC5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgRWRpdG9yIFRlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9lZGl0b3IvZm9ybWF0dGVyL0Zvcm1hdHRpbmdQcmVmZXJlbmNlc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDZhNjliCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgRWRpdG9yIFRlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9lZGl0b3IvZm9ybWF0dGVyL0Zvcm1hdHRpbmdQcmVmZXJlbmNlc1Rlc3QuamF2YQpAQCAtMCwwICsxLDU5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IEpvaG4tTWFzb24gUC4gU2hhY2tlbGZvcmQgYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSm9obi1NYXNvbiBQLiBTaGFja2VsZm9yZCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC50ZXN0cy51aS5lZGl0b3IuZm9ybWF0dGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5mb3JtYXR0ZXIuRm9ybWF0dGluZ1ByZWZlcmVuY2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC50ZXN0cy51aS50ZXN0cGx1Z2luLkFic3RyYWN0QW50VUlUZXN0OworCitwdWJsaWMgY2xhc3MgRm9ybWF0dGluZ1ByZWZlcmVuY2VzVGVzdCBleHRlbmRzIEFic3RyYWN0QW50VUlUZXN0IHsKKworICAgIHB1YmxpYyBGb3JtYXR0aW5nUHJlZmVyZW5jZXNUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RHZXRDYW5vbmljYWxJbmRlbnQoKSB7CisgICAgIAorICAgICAgICBGb3JtYXR0aW5nUHJlZmVyZW5jZXMgcHJlZnM7CisgICAgICAgIAorICAgICAgICAvLyB0ZXN0IHNwYWNlcyAKKyAgICAgICAgcHJlZnMgPSBuZXcgRm9ybWF0dGluZ1ByZWZlcmVuY2VzKCl7CisgICAgICAgICAgICBwdWJsaWMgaW50IGdldFRhYldpZHRoKCkgeyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICByZXR1cm4gMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHVzZVNwYWNlc0luc3RlYWRPZlRhYnMoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH07ICAgICAgICAKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIgICAiLHByZWZzLmdldENhbm9uaWNhbEluZGVudCgpKTsKKyAgICAgICAgCisgICAgICAgIC8vIGVuc3VyZSB0aGUgdmFsdWUgaXMgbm90IGhhcmQgY29kZWQKKyAgICAgICAgcHJlZnMgPSBuZXcgRm9ybWF0dGluZ1ByZWZlcmVuY2VzKCl7CisgICAgICAgICAgICBwdWJsaWMgaW50IGdldFRhYldpZHRoKCkgeyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICByZXR1cm4gNzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHVzZVNwYWNlc0luc3RlYWRPZlRhYnMoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH07ICAgICAgICAKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIgICAgICAgIixwcmVmcy5nZXRDYW5vbmljYWxJbmRlbnQoKSk7CisgICAgICAgIAorICAgICAgICAvLyB1c2UgdGFiIGNoYXJhY3RlcgorICAgICAgICBwcmVmcyA9IG5ldyBGb3JtYXR0aW5nUHJlZmVyZW5jZXMoKXsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgZ2V0VGFiV2lkdGgoKSB7ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHJldHVybiA3OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gdXNlU3BhY2VzSW5zdGVhZE9mVGFicygpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH07ICAgICAgICAKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJcdCIscHJlZnMuZ2V0Q2Fub25pY2FsSW5kZW50KCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IEVkaXRvciBUZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvZWRpdG9yL2Zvcm1hdHRlci9YbWxEb2N1bWVudEZvcm1hdHRlclRlc3QuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IEVkaXRvciBUZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvZWRpdG9yL2Zvcm1hdHRlci9YbWxEb2N1bWVudEZvcm1hdHRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTAwN2FhCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgRWRpdG9yIFRlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9lZGl0b3IvZm9ybWF0dGVyL1htbERvY3VtZW50Rm9ybWF0dGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsODQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSm9obi1NYXNvbiBQLiBTaGFja2VsZm9yZCBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBKb2huLU1hc29uIFAuIFNoYWNrZWxmb3JkIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLmVkaXRvci5mb3JtYXR0ZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLmZvcm1hdHRlci5Gb3JtYXR0aW5nUHJlZmVyZW5jZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5mb3JtYXR0ZXIuWG1sRG9jdW1lbnRGb3JtYXR0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLnRlc3RwbHVnaW4uQWJzdHJhY3RBbnRVSVRlc3Q7CisKK3B1YmxpYyBjbGFzcyBYbWxEb2N1bWVudEZvcm1hdHRlclRlc3QgZXh0ZW5kcyBBYnN0cmFjdEFudFVJVGVzdCB7CisKKyAgICBwdWJsaWMgWG1sRG9jdW1lbnRGb3JtYXR0ZXJUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYWwgVGVzdCAKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0R2VuZXJhbEZvcm1hdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBGb3JtYXR0aW5nUHJlZmVyZW5jZXMgcHJlZnMgPSBuZXcgRm9ybWF0dGluZ1ByZWZlcmVuY2VzKCl7CisgICAgICAgICAgICBwdWJsaWMgaW50IGdldFRhYldpZHRoKCkgeyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICByZXR1cm4gMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHVzZVNwYWNlc0luc3RlYWRPZlRhYnMoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHNpbXBsZVRlc3QoImZvcm1hdFRlc3Rfc291cmNlMDEueG1sIiwiZm9ybWF0VGVzdF90YXJnZXQwMS54bWwiLHByZWZzKTsgICAgICAgIAorICAgIH0KKworICAgIC8qKgorICAgICAqIEluc3VyZSB0aGF0IHRhYiB3aWR0aCBpcyBub3QgaGFyZCBjb2RlZAorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RUYWJXaWR0aCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBGb3JtYXR0aW5nUHJlZmVyZW5jZXMgcHJlZnMgPSBuZXcgRm9ybWF0dGluZ1ByZWZlcmVuY2VzKCl7CisgICAgICAgICAgICBwdWJsaWMgaW50IGdldFRhYldpZHRoKCkgeyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICByZXR1cm4gNzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHVzZVNwYWNlc0luc3RlYWRPZlRhYnMoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHNpbXBsZVRlc3QoImZvcm1hdFRlc3Rfc291cmNlMDEueG1sIiwiZm9ybWF0VGVzdF90YXJnZXQwMi54bWwiLHByZWZzKTsgICAgICAgIAorICAgIH0KKworICAgIAorICAgIC8qKgorICAgICAqIFRlc3Qgd2l0aCB0YWIgY2hhcmFjdGVycyBpbnN0ZWFkIG9mIHNwYWNlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0VGFic0luc3RlYWRPZlNwYWNlcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBGb3JtYXR0aW5nUHJlZmVyZW5jZXMgcHJlZnMgPSBuZXcgRm9ybWF0dGluZ1ByZWZlcmVuY2VzKCl7CisgICAgICAgICAgICBwdWJsaWMgaW50IGdldFRhYldpZHRoKCkgeyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICByZXR1cm4gMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHVzZVNwYWNlc0luc3RlYWRPZlRhYnMoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBzaW1wbGVUZXN0KCJmb3JtYXRUZXN0X3NvdXJjZTAxLnhtbCIsImZvcm1hdFRlc3RfdGFyZ2V0MDMueG1sIixwcmVmcyk7ICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQHBhcmFtIHNvdXJjZUZpbGVOYW1lIC0gZmlsZSB0byBmb3JtYXQKKyAgICAgKiBAcGFyYW0gdGFyZ2V0RmlsZU5hbWUgLSB0aGUgc291cmNlIGZpbGUgYWZ0ZXIgYSBwcm9wZXJseSBleGVjdXRlZCBmb3JtYXQKKyAgICAgKiBAcGFyYW0gcHJlZnMgLSBnaXZlbiB0aGUgaW5jbHVkZWQgcHJlZmVyZW5jZSBpbnN0cnVjdGlvbnMKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzaW1wbGVUZXN0KFN0cmluZyBzb3VyY2VGaWxlTmFtZSwgU3RyaW5nIHRhcmdldEZpbGVOYW1lLCBGb3JtYXR0aW5nUHJlZmVyZW5jZXMgcHJlZnMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAKKyAgICAgICAgWG1sRG9jdW1lbnRGb3JtYXR0ZXIgeG1sRm9ybWF0dGVyID0gbmV3IFhtbERvY3VtZW50Rm9ybWF0dGVyKCk7CisgICAgICAgIHhtbEZvcm1hdHRlci5zZXREZWZhdWx0TGluZURlbGltaXRlcihTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIikpOworICAgICAgICBTdHJpbmcgcmVzdWx0ID0geG1sRm9ybWF0dGVyLmZvcm1hdChnZXRGaWxlQ29udGVudEFzU3RyaW5nKGdldEJ1aWxkRmlsZShzb3VyY2VGaWxlTmFtZSkpLHByZWZzKTsKKyAgICAgICAgU3RyaW5nIGV4cGVjdGVkUmVzdWx0ID0gZ2V0RmlsZUNvbnRlbnRBc1N0cmluZyhnZXRCdWlsZEZpbGUodGFyZ2V0RmlsZU5hbWUpKTsKKyAgICAgICAgCisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFJlc3VsdCwgcmVzdWx0KTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgRWRpdG9yIFRlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9lZGl0b3IvZm9ybWF0dGVyL1htbEZvcm1hdHRlclRlc3QuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IEVkaXRvciBUZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvZWRpdG9yL2Zvcm1hdHRlci9YbWxGb3JtYXR0ZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNkOGZjYgotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IEVkaXRvciBUZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvZWRpdG9yL2Zvcm1hdHRlci9YbWxGb3JtYXR0ZXJUZXN0LmphdmEKQEAgLTAsMCArMSw3MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBKb2huLU1hc29uIFAuIFNoYWNrZWxmb3JkIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIEpvaG4tTWFzb24gUC4gU2hhY2tlbGZvcmQgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBidWcgODQzNDIKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQudGVzdHMudWkuZWRpdG9yLmZvcm1hdHRlcjsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5BbnRVSVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLmZvcm1hdHRlci5Gb3JtYXR0aW5nUHJlZmVyZW5jZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5mb3JtYXR0ZXIuWG1sRm9ybWF0dGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5BbnRFZGl0b3JQcmVmZXJlbmNlQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKKworcHVibGljIGNsYXNzIFhtbEZvcm1hdHRlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0Rm9ybWF0VXNpbmdQcmVmZXJlbmNlU3RvcmUoKSB7CisgICAgICAgIFByZWZlcmVuY2VzIHByZWZzID0gQW50VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7CisgICAgICAgIHByZWZzLnNldFZhbHVlKEFudEVkaXRvclByZWZlcmVuY2VDb25zdGFudHMuRk9STUFUVEVSX1dSQVBfTE9ORywgdHJ1ZSk7CisgICAgICAgIHByZWZzLnNldFZhbHVlKEFudEVkaXRvclByZWZlcmVuY2VDb25zdGFudHMuRk9STUFUVEVSX01BWF9MSU5FX0xFTkdUSCwgNDApOworICAgICAgICBwcmVmcy5zZXRWYWx1ZShBbnRFZGl0b3JQcmVmZXJlbmNlQ29uc3RhbnRzLkZPUk1BVFRFUl9BTElHTiwgZmFsc2UpOworICAgICAgICBwcmVmcy5zZXRWYWx1ZShBbnRFZGl0b3JQcmVmZXJlbmNlQ29uc3RhbnRzLkZPUk1BVFRFUl9UQUJfQ0hBUiwgdHJ1ZSk7CisgICAgICAgIHByZWZzLnNldFZhbHVlKEFudEVkaXRvclByZWZlcmVuY2VDb25zdGFudHMuRk9STUFUVEVSX1RBQl9TSVpFLCA0KTsKKyAgICAgICAgU3RyaW5nIGxpbmVTZXA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKKyAgICAgICAgU3RyaW5nIHhtbERvYyA9ICI8cHJvamVjdCBkZWZhdWx0PVwiZ29cIj48dGFyZ2V0IG5hbWU9XCJnb1wiIGRlc2NyaXB0aW9uPVwiRGVtb25zdHJhdGUgdGhlIHdyYXBwaW5nIG9mIGxvbmcgdGFncy5cIj48ZWNobz5oaTwvZWNobz48L3RhcmdldD48L3Byb2plY3Q+IjsKKyAgICAgICAgU3RyaW5nIGZvcm1hdHRlZERvYyA9IFhtbEZvcm1hdHRlci5mb3JtYXQoeG1sRG9jKTsKKyAgICAgICAgU3RyaW5nIGV4cGVjdGVkID0gIjxwcm9qZWN0IGRlZmF1bHQ9XCJnb1wiPiIgKyBsaW5lU2VwICsgIlx0PHRhcmdldCBuYW1lPVwiZ29cIiIgKyBsaW5lU2VwICsgIlx0ICAgICAgICBkZXNjcmlwdGlvbj1cIkRlbW9uc3RyYXRlIHRoZSB3cmFwcGluZyBvZiBsb25nIHRhZ3MuXCI+IiArIGxpbmVTZXAgKyAiXHRcdDxlY2hvPmhpPC9lY2hvPiIgKyBsaW5lU2VwICsgIlx0PC90YXJnZXQ+IiArIGxpbmVTZXAgKyAiPC9wcm9qZWN0PiI7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgZm9ybWF0dGVkRG9jKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0Rm9ybWF0V2l0aFByZWZlcmVuY2VQYXJhbWV0ZXIoKSB7CisgICAgICAgIEZvcm1hdHRpbmdQcmVmZXJlbmNlcyBwcmVmcyA9IG5ldyBGb3JtYXR0aW5nUHJlZmVyZW5jZXMoKSB7CisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiB3cmFwTG9uZ1RhZ3MoKSB7IHJldHVybiB0cnVlO30KKyAgICAgICAgICAgIHB1YmxpYyBpbnQgZ2V0TWF4aW11bUxpbmVXaWR0aCgpIHsgcmV0dXJuIDQwO30KKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGFsaWduRWxlbWVudENsb3NlQ2hhcigpIHsgcmV0dXJuIGZhbHNlO30KKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHVzZVNwYWNlc0luc3RlYWRPZlRhYnMoKSB7IHJldHVybiB0cnVlO30KKyAgICAgICAgICAgIHB1YmxpYyBpbnQgZ2V0VGFiV2lkdGgoKSB7IHJldHVybiA2O30KKyAgICAgICAgfTsKKyAgICAgICAgU3RyaW5nIGxpbmVTZXA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKKyAgICAgICAgU3RyaW5nIHhtbERvYyA9ICI8cHJvamVjdCBkZWZhdWx0PVwiZ29cIj48dGFyZ2V0IG5hbWU9XCJnb1wiIGRlc2NyaXB0aW9uPVwiRGVtb25zdHJhdGUgdGhlIHdyYXBwaW5nIG9mIGxvbmcgdGFncy5cIj48ZWNobz5oaTwvZWNobz48L3RhcmdldD48L3Byb2plY3Q+IjsKKyAgICAgICAgU3RyaW5nIGZvcm1hdHRlZERvYyA9IFhtbEZvcm1hdHRlci5mb3JtYXQoeG1sRG9jLCBwcmVmcyk7CisgICAgICAgIFN0cmluZyBleHBlY3RlZCA9ICI8cHJvamVjdCBkZWZhdWx0PVwiZ29cIj4iICsgbGluZVNlcCArICIgICAgICA8dGFyZ2V0IG5hbWU9XCJnb1wiIiArIGxpbmVTZXAgKyAiICAgICAgICAgICAgICBkZXNjcmlwdGlvbj1cIkRlbW9uc3RyYXRlIHRoZSB3cmFwcGluZyBvZiBsb25nIHRhZ3MuXCI+IiArIGxpbmVTZXAgKyAiICAgICAgICAgICAgPGVjaG8+aGk8L2VjaG8+IiArIGxpbmVTZXAgKyAiICAgICAgPC90YXJnZXQ+IiArIGxpbmVTZXAgKyAiPC9wcm9qZWN0PiI7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgZm9ybWF0dGVkRG9jKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQnVnIDg0MzQyCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEZvcm1hdE1haW50YWluaW5nTGluZVNlcGFyYXRvcnMoKSB7CisgICAgICAgIEZvcm1hdHRpbmdQcmVmZXJlbmNlcyBwcmVmcyA9IG5ldyBGb3JtYXR0aW5nUHJlZmVyZW5jZXMoKSB7CisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiB3cmFwTG9uZ1RhZ3MoKSB7IHJldHVybiB0cnVlO30KKyAgICAgICAgICAgIHB1YmxpYyBpbnQgZ2V0TWF4aW11bUxpbmVXaWR0aCgpIHsgcmV0dXJuIDQwO30KKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGFsaWduRWxlbWVudENsb3NlQ2hhcigpIHsgcmV0dXJuIGZhbHNlO30KKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHVzZVNwYWNlc0luc3RlYWRPZlRhYnMoKSB7IHJldHVybiB0cnVlO30KKyAgICAgICAgICAgIHB1YmxpYyBpbnQgZ2V0VGFiV2lkdGgoKSB7IHJldHVybiA2O30KKyAgICAgICAgfTsKKyAgICAgICAgU3RyaW5nIGxpbmVTZXA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKKyAgICAgICAgU3RyaW5nIHhtbERvYyA9ICI8cHJvamVjdCBkZWZhdWx0PVwiZ29cIj48dGFyZ2V0IG5hbWU9XCJnb1wiIGRlc2NyaXB0aW9uPVwiRGVtb25zdHJhdGUgdGhlIHdyYXBwaW5nIG9mIGxvbmcgdGFncy5cIj48ZWNobz5oaTwvZWNobz48L3RhcmdldD4iICsgbGluZVNlcCArIGxpbmVTZXAgKyAiPC9wcm9qZWN0PiI7CisgICAgICAgIFN0cmluZyBmb3JtYXR0ZWREb2MgPSBYbWxGb3JtYXR0ZXIuZm9ybWF0KHhtbERvYywgcHJlZnMpOworICAgICAgICBTdHJpbmcgZXhwZWN0ZWQgPSAiPHByb2plY3QgZGVmYXVsdD1cImdvXCI+IiArIGxpbmVTZXAgKyAiICAgICAgPHRhcmdldCBuYW1lPVwiZ29cIiIgKyBsaW5lU2VwICsgIiAgICAgICAgICAgICAgZGVzY3JpcHRpb249XCJEZW1vbnN0cmF0ZSB0aGUgd3JhcHBpbmcgb2YgbG9uZyB0YWdzLlwiPiIgKyBsaW5lU2VwICsgIiAgICAgICAgICAgIDxlY2hvPmhpPC9lY2hvPiIgKyBsaW5lU2VwICsgIiAgICAgIDwvdGFyZ2V0PiIgKyBsaW5lU2VwICsgbGluZVNlcCArICI8L3Byb2plY3Q+IjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBmb3JtYXR0ZWREb2MpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgRWRpdG9yIFRlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9lZGl0b3IvZm9ybWF0dGVyL1htbFRhZ0Zvcm1hdHRlclRlc3QuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IEVkaXRvciBUZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvZWRpdG9yL2Zvcm1hdHRlci9YbWxUYWdGb3JtYXR0ZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJkM2UyOQotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IEVkaXRvciBUZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvZWRpdG9yL2Zvcm1hdHRlci9YbWxUYWdGb3JtYXR0ZXJUZXN0LmphdmEKQEAgLTAsMCArMSwzNzggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSm9obi1NYXNvbiBQLiBTaGFja2VsZm9yZCBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBKb2huLU1hc29uIFAuIFNoYWNrZWxmb3JkIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gQnVnIDg0MzQyCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLmVkaXRvci5mb3JtYXR0ZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IuZm9ybWF0dGVyLlhtbFRhZ0Zvcm1hdHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLmZvcm1hdHRlci5Gb3JtYXR0aW5nUHJlZmVyZW5jZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLnRlc3RwbHVnaW4uQWJzdHJhY3RBbnRVSVRlc3Q7CisKK3B1YmxpYyBjbGFzcyBYbWxUYWdGb3JtYXR0ZXJUZXN0IGV4dGVuZHMgQWJzdHJhY3RBbnRVSVRlc3QgeworCisgICAgLy8gVE9ETyBUaGlzIHRlc3QgaXMgdG9vIGxvdyBsZXZlbCBhbmQgdG9vIHRpZ2h0bHkgY291cGxlZCB0byBpbnRlcm5hbHMuCisKKyAgICAvKiAtLS0tLS0tLS0tLS0tLS0tIFRlc3QgRml4dHVyZSAtLS0tLS0tLS0tLS0tLS0tICovCisgICAgLy8gSW4gY2FzZSBhbnlvbmUgd29uZGVycyB3aHkgbWFueSBwZW9wbGUgcmVjb21tZW5kIGFnYWluc3QgdGVzdGluZworICAgIC8vIHByaXZhdGVzLCBJIHByb2R1Y2UgdGhpcyBleGFtcGxlLi4uCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSW5uZXJDbGFzc0ZhY3RvcnkgZXh0ZW5kcyBYbWxUYWdGb3JtYXR0ZXIgeworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGFyc2VFeGNlcHRpb24gZXh0ZW5kcyBYbWxUYWdGb3JtYXR0ZXIuUGFyc2VFeGNlcHRpb24geworCisJCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworCQkJcHVibGljIFBhcnNlRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgICAgICAgICAgc3VwZXIobWVzc2FnZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRhZyBleHRlbmRzIFhtbFRhZ0Zvcm1hdHRlci5UYWcgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUYWdGb3JtYXR0ZXIgZXh0ZW5kcyBYbWxUYWdGb3JtYXR0ZXIuVGFnRm9ybWF0dGVyIHsKKworICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gbGluZVJlcXVpcmVzV3JhcChTdHJpbmcgbGluZSwgaW50IGxpbmVXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgaW50IHRhYldpZHRoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmxpbmVSZXF1aXJlc1dyYXAobGluZSwgbGluZVdpZHRoLCB0YWJXaWR0aCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgdGFiRXhwYW5kZWRMaW5lV2lkdGgoU3RyaW5nIGxpbmUsIGludCB0YWJXaWR0aCkgeworICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci50YWJFeHBhbmRlZExpbmVXaWR0aChsaW5lLCB0YWJXaWR0aCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgd3JhcFRhZyhUYWcgdGFnLCBGb3JtYXR0aW5nUHJlZmVyZW5jZXMgcHJlZnMsCisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBpbmRlbnQsIFN0cmluZyBsaW5lRGVsaW1pdGVyKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLndyYXBUYWcodGFnLCBwcmVmcywgaW5kZW50LCBsaW5lRGVsaW1pdGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGFnUGFyc2VyIGV4dGVuZHMgWG1sVGFnRm9ybWF0dGVyLlRhZ1BhcnNlciB7CisKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoU3RyaW5nIHRhZ1RleHQpCisgICAgICAgICAgICAgICAgICAgIHRocm93cyBYbWxUYWdGb3JtYXR0ZXIuUGFyc2VFeGNlcHRpb24geworICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRFbGVtZW50TmFtZSh0YWdUZXh0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIExpc3QgZ2V0QXR0aWJ1dGVzKFN0cmluZyBlbGVtZW50VGV4dCkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3dzIFhtbFRhZ0Zvcm1hdHRlci5QYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldEF0dGlidXRlcyhlbGVtZW50VGV4dCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIFRhZyBjcmVhdGVUYWcoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFRhZygpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBUYWdGb3JtYXR0ZXIgY3JlYXRlVGFnRm9ybWF0dGVyKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBUYWdGb3JtYXR0ZXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgVGFnUGFyc2VyIGNyZWF0ZVRhZ1BhcnNlcigpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVGFnUGFyc2VyKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgdmFsaWRhdGVBdHRyaWJ1dGVQYWlyKE9iamVjdCBhdHRyaWJ1dGVQYWlyLCBTdHJpbmcgYXR0cmlidXRlLCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgIFhtbFRhZ0Zvcm1hdHRlci5BdHRyaWJ1dGVQYWlyIHBhaXIgPSAoWG1sVGFnRm9ybWF0dGVyLkF0dHJpYnV0ZVBhaXIpIGF0dHJpYnV0ZVBhaXI7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoYXR0cmlidXRlLCBwYWlyLmdldEF0dHJpYnV0ZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZSwgcGFpci5nZXRWYWx1ZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBYbWxUYWdGb3JtYXR0ZXJUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIHByaXZhdGUgRm9ybWF0dGluZ1ByZWZlcmVuY2VzIGdldFByZWZlcmVuY2VzKGZpbmFsIGJvb2xlYW4gd3JhcExvbmdUYWdzLAorICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBhbGlnbkNsb3NlQ2hhciwgZmluYWwgaW50IG1heExpbmVXaWR0aCkgeworCisgICAgICAgIHJldHVybiBuZXcgRm9ybWF0dGluZ1ByZWZlcmVuY2VzKCkgeworCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBhbGlnbkVsZW1lbnRDbG9zZUNoYXIoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFsaWduQ2xvc2VDaGFyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiB3cmFwTG9uZ1RhZ3MoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHdyYXBMb25nVGFnczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGludCBnZXRNYXhpbXVtTGluZVdpZHRoKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBtYXhMaW5lV2lkdGg7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNpbXBsZVRlc3QoU3RyaW5nIHNvdXJjZSwgU3RyaW5nIHRhcmdldCwKKyAgICAgICAgICAgIEZvcm1hdHRpbmdQcmVmZXJlbmNlcyBwcmVmcywgU3RyaW5nIGluZGVudCwgU3RyaW5nIGxpbmVEZWxpbWl0ZXIpIHRocm93cyBFeGNlcHRpb24geworICAgIAkKKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9IFhtbFRhZ0Zvcm1hdHRlci5mb3JtYXQoc291cmNlLCBwcmVmcywgaW5kZW50LCBsaW5lRGVsaW1pdGVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRhcmdldCwgcmVzdWx0KTsKKyAgICB9CisKKyAgICAvKiAtLS0tLS0tLS0tLS0tLS0tIFRlc3QgTWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tICovCisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VyR2V0RWxlbWVudE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBJbm5lckNsYXNzRmFjdG9yeS5UYWdQYXJzZXIgdGFnUGFyc2VyID0gSW5uZXJDbGFzc0ZhY3RvcnkKKyAgICAgICAgICAgICAgICAuY3JlYXRlVGFnUGFyc2VyKCk7CisKKyAgICAgICAgU3RyaW5nIGVsZW1lbnRGaXh0dXJlMSA9ICI8bXlFbGVtZW50IGF0dHJpYnV0ZTE9XCJ2YWx1ZTFcIiBhdHRyaWJ1dGUyPVwidmFsdWUyXCIgLz4iOyAvLyROT04tTkxTLTEkCisgICAgICAgIGFzc2VydEVxdWFscygibXlFbGVtZW50IiwgdGFnUGFyc2VyLmdldEVsZW1lbnROYW1lKGVsZW1lbnRGaXh0dXJlMSkpOyAvLyROT04tTkxTLTEkCisKKyAgICAgICAgU3RyaW5nIGVsZW1lbnRGaXh0dXJlMiA9ICI8bXlFbGVtZW50XHRcbmF0dHJpYnV0ZTE9XCJ2YWx1ZTFcIiBhdHRyaWJ1dGUyPVwidmFsdWUyXCIgLz4iOyAvLyROT04tTkxTLTEkCisgICAgICAgIGFzc2VydEVxdWFscygibXlFbGVtZW50IiwgdGFnUGFyc2VyLmdldEVsZW1lbnROYW1lKGVsZW1lbnRGaXh0dXJlMikpOyAvLyROT04tTkxTLTEkCisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ4IiwgdGFnUGFyc2VyLmdldEVsZW1lbnROYW1lKCI8eC8+IikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ4IiwgdGFnUGFyc2VyLmdldEVsZW1lbnROYW1lKCI8eD4iKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorICAgICAgICBhc3NlcnRFcXVhbHMoIng6eSIsIHRhZ1BhcnNlci5nZXRFbGVtZW50TmFtZSgiPHg6eS8+IikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ4OnkiLCB0YWdQYXJzZXIuZ2V0RWxlbWVudE5hbWUoIjx4OnkgYWJjLz4iKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCisgICAgICAgIEV4Y2VwdGlvbiBlMSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0YWdQYXJzZXIuZ2V0RWxlbWVudE5hbWUoIjw+Iik7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUxID0gZTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnROb3ROdWxsKGUxKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShlMS5nZXRDbGFzcygpLmlzQXNzaWduYWJsZUZyb20oCisgICAgICAgICAgICAgICAgSW5uZXJDbGFzc0ZhY3RvcnkuUGFyc2VFeGNlcHRpb24uY2xhc3MpKTsKKworICAgICAgICBFeGNlcHRpb24gZTIgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdGFnUGFyc2VyLmdldEVsZW1lbnROYW1lKCI8PiIpOyAvLyROT04tTkxTLTEkCisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlMiA9IGU7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0Tm90TnVsbChlMik7CisgICAgICAgIGFzc2VydFRydWUoZTIuZ2V0Q2xhc3MoKS5pc0Fzc2lnbmFibGVGcm9tKAorICAgICAgICAgICAgICAgIElubmVyQ2xhc3NGYWN0b3J5LlBhcnNlRXhjZXB0aW9uLmNsYXNzKSk7CisKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VyR2V0QXR0cmlidXRlcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBJbm5lckNsYXNzRmFjdG9yeS5UYWdQYXJzZXIgdGFnUGFyc2VyID0gSW5uZXJDbGFzc0ZhY3RvcnkKKyAgICAgICAgICAgICAgICAuY3JlYXRlVGFnUGFyc2VyKCk7CisKKyAgICAgICAgTGlzdCBhdHRyaWJ1dGVQYWlyczsKKworICAgICAgICAvLyB0ZXN0IG5vcm1hbCBzaXR1YXRpb24KKyAgICAgICAgYXR0cmlidXRlUGFpcnMgPSB0YWdQYXJzZXIKKyAgICAgICAgICAgICAgICAuZ2V0QXR0aWJ1dGVzKCI8bXlFbGVtZW50IGF0dHJpYnV0ZTE9XCJ2YWx1ZTFcIiBhdHRyaWJ1dGUyPVwidmFsdWUyXCIgLz4iKTsgLy8kTk9OLU5MUy0xJAorCisgICAgICAgIGFzc2VydEVxdWFscygyLCBhdHRyaWJ1dGVQYWlycy5zaXplKCkpOworICAgICAgICBJbm5lckNsYXNzRmFjdG9yeS52YWxpZGF0ZUF0dHJpYnV0ZVBhaXIoYXR0cmlidXRlUGFpcnMuZ2V0KDApLAorICAgICAgICAgICAgICAgICJhdHRyaWJ1dGUxIiwgInZhbHVlMSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKyAgICAgICAgSW5uZXJDbGFzc0ZhY3RvcnkudmFsaWRhdGVBdHRyaWJ1dGVQYWlyKGF0dHJpYnV0ZVBhaXJzLmdldCgxKSwKKyAgICAgICAgICAgICAgICAiYXR0cmlidXRlMiIsICJ2YWx1ZTIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisKKyAgICAgICAgCisgICAgICAgIC8vIHRlc3Qgd2l0aCBleHRyYSB3aGl0ZXNwYWNlIGFuZCBmdW5ueSBxdW90ZXMKKyAgICAgICAgYXR0cmlidXRlUGFpcnMgPSB0YWdQYXJzZXIKKyAgICAgICAgICAgICAgICAuZ2V0QXR0aWJ1dGVzKCI8bXlFbGVtZW50IFxuYXR0cmlidXRlMSA9ICAndmFsdWUxXCInXG5hdHRyaWJ1dGUyXHQ9XCJ2YWx1ZTInXCIgLz4iKTsgLy8kTk9OLU5MUy0xJAorCisgICAgICAgIGFzc2VydEVxdWFscygyLCBhdHRyaWJ1dGVQYWlycy5zaXplKCkpOworICAgICAgICBJbm5lckNsYXNzRmFjdG9yeS52YWxpZGF0ZUF0dHJpYnV0ZVBhaXIoYXR0cmlidXRlUGFpcnMuZ2V0KDApLAorICAgICAgICAgICAgICAgICJhdHRyaWJ1dGUxIiwgInZhbHVlMVwiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorICAgICAgICBJbm5lckNsYXNzRmFjdG9yeS52YWxpZGF0ZUF0dHJpYnV0ZVBhaXIoYXR0cmlidXRlUGFpcnMuZ2V0KDEpLAorICAgICAgICAgICAgICAgICJhdHRyaWJ1dGUyIiwgInZhbHVlMiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisKKy8vIFRPRE8gYXR0cmlidXRlcyB3aGljaCBjb250YWluIHdoaXRlc3BhY2Ugc2hvdWxkIHRocm93IGEgcGFyc2UgZXJyb3IKKy8vICAgICAgIAorLy8gICAgICAgIC8vIHRlc3QgcGFyc2UgZXJyb3JzIC0gd2hpdGVzcGFjZSBpbiBhdHRyaWJ1dGUgbmFtZQorLy8gICAgICAgIEV4Y2VwdGlvbiBlMSA9IG51bGw7CisvLyAgICAgICAgdHJ5IHsKKy8vICAgICAgICAgICAgYXR0cmlidXRlUGFpcnMgPSB0YWdQYXJzZXIKKy8vICAgICAgICAgICAgICAgICAgICAuZ2V0QXR0aWJ1dGVzKCI8bXlFbGVtZW50IGF0IHRyaWJ1dGUxID0gXCJ2YWx1ZTFcIiBhdHRyaWJ1dGUyPVwidmFsdWUyXCIgLz4iKTsKKy8vICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworLy8gICAgICAgICAgICBlMSA9IGU7CisvLyAgICAgICAgfQorLy8gICAgICAgIGFzc2VydE5vdE51bGwoZTEpOworLy8gICAgICAgIGFzc2VydFRydWUoZTEuZ2V0Q2xhc3MoKS5pc0Fzc2lnbmFibGVGcm9tKAorLy8gICAgICAgICAgICAgICAgSW5uZXJDbGFzc0ZhY3RvcnkuUGFyc2VFeGNlcHRpb24uY2xhc3MpKTsKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAvLyB0ZXN0IHBhcnNlIGVycm9ycyAtIGVxdWFscyBpbiB0aGUgd3JvbmcgcGxhY2UKKyAgICAgICAgRXhjZXB0aW9uIGUyID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGF0dHJpYnV0ZVBhaXJzID0gdGFnUGFyc2VyCisgICAgICAgICAgICAgICAgICAgIC5nZXRBdHRpYnV0ZXMoIjxteUVsZW1lbnQgYXR0cmlidXRlMT1cInZhbHVlMVwiID0gYXR0cmlidXRlMj1cInZhbHVlMlwiIC8+Iik7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUyID0gZTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnROb3ROdWxsKGUyKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShlMi5nZXRDbGFzcygpLmlzQXNzaWduYWJsZUZyb20oCisgICAgICAgICAgICAgICAgSW5uZXJDbGFzc0ZhY3RvcnkuUGFyc2VFeGNlcHRpb24uY2xhc3MpKTsKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAvLyB0ZXN0IHBhcnNlIGVycm9ycyAtIHF1b3RlcyBpbiB0aGUgd3JvbmcgcGxhY2UKKyAgICAgICAgRXhjZXB0aW9uIGUzID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGF0dHJpYnV0ZVBhaXJzID0gdGFnUGFyc2VyCisgICAgICAgICAgICAgICAgICAgIC5nZXRBdHRpYnV0ZXMoIjxteUVsZW1lbnQgYXR0cmlidXRlMT1cIlwidmFsdWUxXCIgIGF0dHJpYnV0ZTI9XCJ2YWx1ZTJcIiAvPiIpOyAvLyROT04tTkxTLTEkCisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlMyA9IGU7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0Tm90TnVsbChlMyk7CisgICAgICAgIGFzc2VydFRydWUoZTMuZ2V0Q2xhc3MoKS5pc0Fzc2lnbmFibGVGcm9tKElubmVyQ2xhc3NGYWN0b3J5LlBhcnNlRXhjZXB0aW9uLmNsYXNzKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEZvcm1hdDAxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgCVN0cmluZyBsaW5lU2VwPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7CisgICAgICAgIFN0cmluZyBpbmRlbnQgPSAiXHQiOyAvLyROT04tTkxTLTEkCisgICAgICAgIFN0cmluZyBzb3VyY2UgPSAiPHRhcmdldCBuYW1lPVwibXlUYXJnZXROYW1lXCIgZGVwZW5kcz1cImEsYixjLGQsZSxmLGdcIiBkZXNjcmlwdGlvbj1cIlRoaXMgaXMgYSB2ZXJ5IGxvbmcgZWxlbWVudCB3aGljaCBvdWdodCB0byBiZSB3cmFwcGVkLlwiPiI7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgU3RyaW5nIHRhcmdldCA9ICI8dGFyZ2V0IG5hbWU9XCJteVRhcmdldE5hbWVcIiIgKyBsaW5lU2VwIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICAgICArIGluZGVudAorICAgICAgICAgICAgICAgICsgIiAgICAgICAgZGVwZW5kcz1cImEsYixjLGQsZSxmLGdcIiIgKyBsaW5lU2VwIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICAgICArIGluZGVudAorICAgICAgICAgICAgICAgICsgIiAgICAgICAgZGVzY3JpcHRpb249XCJUaGlzIGlzIGEgdmVyeSBsb25nIGVsZW1lbnQgd2hpY2ggb3VnaHQgdG8gYmUgd3JhcHBlZC5cIj4iOyAvLyROT04tTkxTLTEkCisKKyAgICAgICAgc2ltcGxlVGVzdChzb3VyY2UsIHRhcmdldCwgZ2V0UHJlZmVyZW5jZXModHJ1ZSwgZmFsc2UsIDYwKSwgaW5kZW50LCBsaW5lU2VwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9ybWF0MDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAJU3RyaW5nIGxpbmVTZXA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKKyAgICAgICAgU3RyaW5nIGluZGVudCA9ICJcdCI7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgU3RyaW5nIHNvdXJjZSA9ICI8dGFyZ2V0IG5hbWU9XCJteVRhcmdldE5hbWVcIiBkZXBlbmRzPVwiYSxiLGMsZCxlLGYsZ1wiIGRlc2NyaXB0aW9uPVwiVGhpcyBpcyBhIHZlcnkgbG9uZyBlbGVtZW50IHdoaWNoIG91Z2h0IHRvIGJlIHdyYXBwZWQuXCI+IjsgLy8kTk9OLU5MUy0xJAorICAgICAgICBTdHJpbmcgdGFyZ2V0ID0gIjx0YXJnZXQgbmFtZT1cIm15VGFyZ2V0TmFtZVwiIiArIGxpbmVTZXAgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgICAgICsgaW5kZW50CisgICAgICAgICAgICAgICAgKyAiICAgICAgICBkZXBlbmRzPVwiYSxiLGMsZCxlLGYsZ1wiIiArIGxpbmVTZXAgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgICAgICsgaW5kZW50CisgICAgICAgICAgICAgICAgKyAiICAgICAgICBkZXNjcmlwdGlvbj1cIlRoaXMgaXMgYSB2ZXJ5IGxvbmcgZWxlbWVudCB3aGljaCBvdWdodCB0byBiZSB3cmFwcGVkLlwiIiArIGxpbmVTZXAgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgICAgICsgaW5kZW50ICsgIj4iOyAvLyROT04tTkxTLTEkCisKKyAgICAgICAgc2ltcGxlVGVzdChzb3VyY2UsIHRhcmdldCwgZ2V0UHJlZmVyZW5jZXModHJ1ZSwgdHJ1ZSwgNjApLCBpbmRlbnQsIGxpbmVTZXApOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QnVnNzM0MTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAJU3RyaW5nIGxpbmVTZXA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKKyAgICAgICAgU3RyaW5nIGluZGVudCA9ICJcdCI7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgU3RyaW5nIHNvdXJjZSA9ICI8dGFyZ2V0IG5hbWU9J215VGFyZ2V0TmFtZScgZGVwZW5kcz1cImEsYixjLGQsZSxmLGdcIiBkZXNjcmlwdGlvbj1cJ1RoaXMgaXMgYSB2ZXJ5IGxvbmcgZWxlbWVudCB3aGljaCBvdWdodCB0byBiZSBcIndyYXBwZWRcIi4nPiI7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgU3RyaW5nIHRhcmdldCA9ICI8dGFyZ2V0IG5hbWU9J215VGFyZ2V0TmFtZSciICsgbGluZVNlcCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAgICAgKyBpbmRlbnQKKyAgICAgICAgICAgICAgICArICIgICAgICAgIGRlcGVuZHM9XCJhLGIsYyxkLGUsZixnXCIiICsgbGluZVNlcCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAgICAgKyBpbmRlbnQKKyAgICAgICAgICAgICAgICArICIgICAgICAgIGRlc2NyaXB0aW9uPSdUaGlzIGlzIGEgdmVyeSBsb25nIGVsZW1lbnQgd2hpY2ggb3VnaHQgdG8gYmUgXCJ3cmFwcGVkXCIuJyIgKyBsaW5lU2VwIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICAgICArIGluZGVudCArICI+IjsgLy8kTk9OLU5MUy0xJAorCisgICAgICAgIHNpbXBsZVRlc3Qoc291cmNlLCB0YXJnZXQsIGdldFByZWZlcmVuY2VzKHRydWUsIHRydWUsIDYwKSwgaW5kZW50LCBsaW5lU2VwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGluZVJlcXVpcmVzV3JhcCgpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIElubmVyQ2xhc3NGYWN0b3J5LlRhZ0Zvcm1hdHRlciB0YWdGb3JtYXR0ZXIgPSBJbm5lckNsYXNzRmFjdG9yeS5jcmVhdGVUYWdGb3JtYXR0ZXIoKTsKKworICAgICAgICBib29sZWFuIHNob3VsZFdyYXAgPSB0YWdGb3JtYXR0ZXIubGluZVJlcXVpcmVzV3JhcCgKKyAgICAgICAgICAgICAgICAgICAgICAgICJcdFx0ICA8bXlFbGVtZW50IGF0dHJpYnV0ZTE9XCJ2YWx1ZTFcIiBhdHRyaWJ1dGUyPVwidmFsdWUyXCIgLz4iLCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAgICAgICAgICAgICA3MCwgOCk7CisgICAgICAgIGJvb2xlYW4gc2hvdWxkTm90V3JhcCA9IHRhZ0Zvcm1hdHRlci5saW5lUmVxdWlyZXNXcmFwKAorICAgICAgICAgICAgICAgICAgICAgICAgIlx0XHQgPG15RWxlbWVudCBhdHRyaWJ1dGUxPVwidmFsdWUxXCIgYXR0cmlidXRlMj1cInZhbHVlMlwiIC8+IiwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgICAgICAgICAgICAgNzAsIDgpOworICAgICAgICBhc3NlcnRUcnVlKHNob3VsZFdyYXApOworICAgICAgICBhc3NlcnRUcnVlKCFzaG91bGROb3RXcmFwKTsKKworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RUYWJFeHBhbmRlZExpbmVXaWR0aCgpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIElubmVyQ2xhc3NGYWN0b3J5LlRhZ0Zvcm1hdHRlciB0YWdGb3JtYXR0ZXIgPSBJbm5lckNsYXNzRmFjdG9yeS5jcmVhdGVUYWdGb3JtYXR0ZXIoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMjAsIHRhZ0Zvcm1hdHRlci50YWJFeHBhbmRlZExpbmVXaWR0aCgiXHQgIDEyMzQ1Njc4OTAiLCA4KSk7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEwLCB0YWdGb3JtYXR0ZXIudGFiRXhwYW5kZWRMaW5lV2lkdGgoIjEyMzQ1Njc4OTAiLCA4KSk7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDE5LCB0YWdGb3JtYXR0ZXIudGFiRXhwYW5kZWRMaW5lV2lkdGgoIlx0MVx0MgkzNDU2Nzg5MCIsIDMpKTsgLy8kTk9OLU5MUy0xJAorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RUYWJUb1N0cmluZ0FuZE1pbmltdW1MZW5ndGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgSW5uZXJDbGFzc0ZhY3RvcnkuVGFnIHRhZyA9IElubmVyQ2xhc3NGYWN0b3J5LmNyZWF0ZVRhZygpOworCisgICAgICAgIHRhZy5zZXRFbGVtZW50TmFtZSgibXlFbGVtZW50Iik7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgdGFnLnNldENsb3NlZChmYWxzZSk7CisgICAgICAgIGFzc2VydEVxdWFscygiPG15RWxlbWVudD4iLCB0YWcudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRhZy50b1N0cmluZygpLmxlbmd0aCgpLCB0YWcubWluaW11bUxlbmd0aCgpKTsKKworICAgICAgICB0YWcuc2V0Q2xvc2VkKHRydWUpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjxteUVsZW1lbnQgLz4iLCB0YWcudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRhZy50b1N0cmluZygpLmxlbmd0aCgpLCB0YWcubWluaW11bUxlbmd0aCgpKTsKKworICAgICAgICB0YWcuYWRkQXR0cmlidXRlKCJhdHRyaWJ1dGUxIiwgInZhbHVlMSIsICciJyk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorICAgICAgICB0YWcuYWRkQXR0cmlidXRlKCJhdHRyaWJ1dGUyIiwgInZhbHVlMiIsICciJyk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgIjxteUVsZW1lbnQgYXR0cmlidXRlMT1cInZhbHVlMVwiIGF0dHJpYnV0ZTI9XCJ2YWx1ZTJcIiAvPiIsIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICAgICB0YWcudG9TdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0YWcudG9TdHJpbmcoKS5sZW5ndGgoKSwgdGFnLm1pbmltdW1MZW5ndGgoKSk7CisKKyAgICAgICAgdGFnLnNldENsb3NlZChmYWxzZSk7CisgICAgICAgIGFzc2VydEVxdWFscygiPG15RWxlbWVudCBhdHRyaWJ1dGUxPVwidmFsdWUxXCIgYXR0cmlidXRlMj1cInZhbHVlMlwiPiIsIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICAgICB0YWcudG9TdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0YWcudG9TdHJpbmcoKS5sZW5ndGgoKSwgdGFnLm1pbmltdW1MZW5ndGgoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFdyYXBUYWcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBJbm5lckNsYXNzRmFjdG9yeS5UYWcgdGFnID0gSW5uZXJDbGFzc0ZhY3RvcnkuY3JlYXRlVGFnKCk7CisKKyAgICAgICAgSW5uZXJDbGFzc0ZhY3RvcnkuVGFnRm9ybWF0dGVyIHRhZ0Zvcm1hdHRlciA9IElubmVyQ2xhc3NGYWN0b3J5CisgICAgICAgICAgICAgICAgLmNyZWF0ZVRhZ0Zvcm1hdHRlcigpOworCisgICAgICAgIEZvcm1hdHRpbmdQcmVmZXJlbmNlcyBkb250QWxpZ25DbG9zZUNoYXIgPSBuZXcgRm9ybWF0dGluZ1ByZWZlcmVuY2VzKCkgeworCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBhbGlnbkVsZW1lbnRDbG9zZUNoYXIoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBGb3JtYXR0aW5nUHJlZmVyZW5jZXMgZG9BbGlnbkNsb3NlQ2hhciA9IG5ldyBGb3JtYXR0aW5nUHJlZmVyZW5jZXMoKSB7CisKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGFsaWduRWxlbWVudENsb3NlQ2hhcigpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICB0YWcuc2V0RWxlbWVudE5hbWUoIm15RWxlbWVudCIpOyAvLyROT04tTkxTLTEkCisgICAgICAgIHRhZy5hZGRBdHRyaWJ1dGUoImF0dHJpYnV0ZTEiLCAidmFsdWUxIiwgJyInKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisgICAgICAgIHRhZy5hZGRBdHRyaWJ1dGUoImF0dHJpYnV0ZTIiLCAidmFsdWUyIiwgJyInKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisKKyAgICAgICAgdGFnLnNldENsb3NlZCh0cnVlKTsKKworICAgICAgICBTdHJpbmcgbGluZVNlcD0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjxteUVsZW1lbnQgYXR0cmlidXRlMT1cInZhbHVlMVwiIiArIGxpbmVTZXAgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgICAgICsgIlx0XHQgICAgICAgICAgICAgYXR0cmlidXRlMj1cInZhbHVlMlwiIC8+IiwgdGFnRm9ybWF0dGVyIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICAgICAud3JhcFRhZyh0YWcsIGRvbnRBbGlnbkNsb3NlQ2hhciwgIlx0XHQgICIsIGxpbmVTZXApKTsgLy8kTk9OLU5MUy0xJAorCisgICAgICAgIGFzc2VydEVxdWFscygiPG15RWxlbWVudCBhdHRyaWJ1dGUxPVwidmFsdWUxXCIiICsgbGluZVNlcCAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAgICAgKyAiXHRcdCAgICAgICAgICAgICBhdHRyaWJ1dGUyPVwidmFsdWUyXCIiICsgbGluZVNlcCArICJcdFx0ICAvPiIsIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICAgICB0YWdGb3JtYXR0ZXIud3JhcFRhZyh0YWcsIGRvQWxpZ25DbG9zZUNoYXIsICJcdFx0ICAiLCBsaW5lU2VwKSk7IC8vJE5PTi1OTFMtMSQKKworICAgICAgICB0YWcuc2V0Q2xvc2VkKGZhbHNlKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIjxteUVsZW1lbnQgYXR0cmlidXRlMT1cInZhbHVlMVwiIiArIGxpbmVTZXAgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgICAgICsgIlx0XHQgICAgICAgICAgICAgYXR0cmlidXRlMj1cInZhbHVlMlwiPiIsIHRhZ0Zvcm1hdHRlciAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAgICAgLndyYXBUYWcodGFnLCBkb250QWxpZ25DbG9zZUNoYXIsICJcdFx0ICAiLCBsaW5lU2VwKSk7IC8vJE5PTi1OTFMtMSQKKworICAgICAgICBhc3NlcnRFcXVhbHMoIjxteUVsZW1lbnQgYXR0cmlidXRlMT1cInZhbHVlMVwiIiArIGxpbmVTZXAgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgICAgICsgIlx0XHQgICAgICAgICAgICAgYXR0cmlidXRlMj1cInZhbHVlMlwiIiArIGxpbmVTZXAgKyAiXHRcdCAgPiIsIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICAgICB0YWdGb3JtYXR0ZXIud3JhcFRhZyh0YWcsIGRvQWxpZ25DbG9zZUNoYXIsICJcdFx0ICAiLCBsaW5lU2VwKSk7IC8vJE5PTi1OTFMtMSQKKworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RCdWc2MzU1OCgpIHRocm93cyBFeGNlcHRpb24geworCQkKKwkJLy8gT3JkaW5hcmlseSB0aGUgZG91YmxlIHNwYWNlIGFmdGVyIHRoZSBlbGVtZW50IG5hbWUgd291bGQgYmUgcmVwYWlyZWQKKwkJLy8gYnV0IGlmIHRoZSBmb3JtYXR0ZXIgaXMgd29ya2luZyBjb3JyZWN0bHkgdGhlc2UgZXhhbXBsZXMgd2lsbCBiZQorCQkvLyBjb25zaWRlcmVkIG1hbGZvcm1lZCBhbmQgd2lsbCBiZSBwYXNzZWQgdGhyb3VnaCB1bnRvdWNoZWQuCisgICAgCSBTdHJpbmcgbGluZVNlcD0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOworCQlTdHJpbmcgc291cmNlMSA9ICI8ZWNobyAgZmlsZT1cImZvb1wiPiIgKyBsaW5lU2VwICsgIiZsdDtodG1sPiZsdDtib2R5PiZsdDtwcmU+IiAvLyROT04tTkxTLTEkCisJCQkJKyAiJHtjb21waWxlbG9nfSZsdDsvcHJlPiZsdDsvYm9keT4mbHQ7L2h0bWw+IjsgLy8kTk9OLU5MUy0xJAorCQlGb3JtYXR0aW5nUHJlZmVyZW5jZXMgcHJlZnMgPSBnZXRQcmVmZXJlbmNlcyh0cnVlLCBmYWxzZSwgNjApOyAvLyROT04tTkxTLTEkCisJCXNpbXBsZVRlc3Qoc291cmNlMSwgc291cmNlMSwgcHJlZnMsICJcdCIsIGxpbmVTZXApOworCQorCQlTdHJpbmcgc291cmNlMiA9ICI8ZWNobyAgZmlsZT1cImZvb1wiL2Jhci9iYXo+PC9lY2hvPiI7IC8vJE5PTi1OTFMtMSQJCQorCQlzaW1wbGVUZXN0KHNvdXJjZTIsIHNvdXJjZTIsIHByZWZzLCAiXHQiLCBsaW5lU2VwKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBFZGl0b3IgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL2VkaXRvci9wZXJmb3JtYW5jZS9FZGl0b3JUZXN0SGVscGVyLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBFZGl0b3IgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL2VkaXRvci9wZXJmb3JtYW5jZS9FZGl0b3JUZXN0SGVscGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE5NmNkNwotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IEVkaXRvciBUZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvZWRpdG9yL3BlcmZvcm1hbmNlL0VkaXRvclRlc3RIZWxwZXIuamF2YQpAQCAtMCwwICsxLDE0OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC50ZXN0cy51aS5lZGl0b3IucGVyZm9ybWFuY2U7CisKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklKb2JNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklEb2N1bWVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7CisKKworLyoqCisgKiBAc2luY2UgMy4xCisgKi8KK3B1YmxpYyBjbGFzcyBFZGl0b3JUZXN0SGVscGVyIHsKKworCXB1YmxpYyBzdGF0aWMgSUVkaXRvclBhcnQgb3BlbkluRWRpdG9yKElGaWxlIGZpbGUsIGJvb2xlYW4gcnVuRXZlbnRMb29wKSB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24geworCQlJRWRpdG9yUGFydCBwYXJ0PSBJREUub3BlbkVkaXRvcihnZXRBY3RpdmVQYWdlKCksIGZpbGUpOworCQlpZiAocnVuRXZlbnRMb29wKQorCQkJcnVuRXZlbnRRdWV1ZShwYXJ0KTsKKwkJcmV0dXJuIHBhcnQ7CisJfQorCisJcHVibGljIHN0YXRpYyBJRWRpdG9yUGFydCBvcGVuSW5FZGl0b3IoSUZpbGUgZmlsZSwgU3RyaW5nIGVkaXRvcklkLCBib29sZWFuIHJ1bkV2ZW50TG9vcCkgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKKwkJSUVkaXRvclBhcnQgcGFydD0gSURFLm9wZW5FZGl0b3IoZ2V0QWN0aXZlUGFnZSgpLCBmaWxlLCBlZGl0b3JJZCk7CisJCWlmIChydW5FdmVudExvb3ApCisJCQlydW5FdmVudFF1ZXVlKHBhcnQpOworCQlyZXR1cm4gcGFydDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIElEb2N1bWVudCBnZXREb2N1bWVudChJVGV4dEVkaXRvciBlZGl0b3IpIHsKKwkJSURvY3VtZW50UHJvdmlkZXIgcHJvdmlkZXI9IGVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCk7CisJCUlFZGl0b3JJbnB1dCBpbnB1dD0gZWRpdG9yLmdldEVkaXRvcklucHV0KCk7CisJCXJldHVybiBwcm92aWRlci5nZXREb2N1bWVudChpbnB1dCk7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIHJldmVydEVkaXRvcihJVGV4dEVkaXRvciBlZGl0b3IsIGJvb2xlYW4gcnVuRXZlbnRRdWV1ZSkgeworCQllZGl0b3IuZG9SZXZlcnRUb1NhdmVkKCk7CisJCWlmIChydW5FdmVudFF1ZXVlKQorCQkJcnVuRXZlbnRRdWV1ZShlZGl0b3IpOworCX0KKwkKKwlwdWJsaWMgc3RhdGljIHZvaWQgY2xvc2VBbGxFZGl0b3JzKCkgeworCQlJV29ya2JlbmNoUGFnZSBwYWdlPSBnZXRBY3RpdmVQYWdlKCk7CisJCWlmIChwYWdlICE9IG51bGwpCisJCQlwYWdlLmNsb3NlQWxsRWRpdG9ycyhmYWxzZSk7CisJfQorCQorCXB1YmxpYyBzdGF0aWMgdm9pZCBydW5FdmVudFF1ZXVlKCkgeworCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdz0gZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7CisJCWlmICh3aW5kb3cgIT0gbnVsbCkKKwkJCXJ1bkV2ZW50UXVldWUod2luZG93LmdldFNoZWxsKCkpOworCX0KKwkKKwlwdWJsaWMgc3RhdGljIHZvaWQgcnVuRXZlbnRRdWV1ZShJV29ya2JlbmNoUGFydCBwYXJ0KSB7CisJCXJ1bkV2ZW50UXVldWUocGFydC5nZXRTaXRlKCkuZ2V0U2hlbGwoKSk7CisJfQorCQorCXB1YmxpYyBzdGF0aWMgdm9pZCBydW5FdmVudFF1ZXVlKFNoZWxsIHNoZWxsKSB7CisJCXdoaWxlIChzaGVsbC5nZXREaXNwbGF5KCkucmVhZEFuZERpc3BhdGNoKCkpOworCX0KKwkKKwlwdWJsaWMgc3RhdGljIHZvaWQgcnVuRXZlbnRRdWV1ZShsb25nIG1pblRpbWUpIHsKKwkJbG9uZyBuZXh0Q2hlY2s9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgbWluVGltZTsKKwkJd2hpbGUgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIDwgbmV4dENoZWNrKSB7CisJCQlydW5FdmVudFF1ZXVlKCk7CisJCQlzbGVlcCgxKTsKKwkJfQorCX0KKwkKKwlwdWJsaWMgc3RhdGljIElXb3JrYmVuY2hXaW5kb3cgZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkgeworCQlyZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIElXb3JrYmVuY2hQYWdlIGdldEFjdGl2ZVBhZ2UoKSB7CisJCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93PSBnZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKKwkJcmV0dXJuIHdpbmRvdyAhPSBudWxsID8gd2luZG93LmdldEFjdGl2ZVBhZ2UoKSA6IG51bGw7CisJfQorCisJcHVibGljIHN0YXRpYyBEaXNwbGF5IGdldEFjdGl2ZURpc3BsYXkoKSB7CisJCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93PSBnZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKKwkJcmV0dXJuIHdpbmRvdyAhPSBudWxsID8gd2luZG93LmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpIDogbnVsbDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2FsbURvd24obG9uZyBtaW5UaW1lLCBsb25nIG1heFRpbWUsIGxvbmcgaW50ZXJ2YWxUaW1lKSB7CisJCWxvbmcgc3RhcnRUaW1lPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArIG1pblRpbWU7CisJCXJ1bkV2ZW50UXVldWUoKTsKKwkJd2hpbGUgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIDwgc3RhcnRUaW1lKQorCQkJcnVuRXZlbnRRdWV1ZShpbnRlcnZhbFRpbWUpOworCQkKKwkJbG9uZyBlbmRUaW1lPSBtYXhUaW1lID4gMCA/IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgbWF4VGltZSA6IExvbmcuTUFYX1ZBTFVFOworCQlib29sZWFuIGNhbG09IGlzQ2FsbSgpOworCQl3aGlsZSAoIWNhbG0gJiYgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgPCBlbmRUaW1lKSB7CisJCQlydW5FdmVudFF1ZXVlKGludGVydmFsVGltZSk7CisJCQljYWxtPSBpc0NhbG0oKTsKKwkJfQorLy8JCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKKwkJcmV0dXJuIGNhbG07CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIHNsZWVwKGludCBpbnRlcnZhbFRpbWUpIHsKKwkJdHJ5IHsKKwkJCVRocmVhZC5zbGVlcChpbnRlcnZhbFRpbWUpOworCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQl9CisJfQorCisJcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ2FsbSgpIHsKKwkJSUpvYk1hbmFnZXIgam9iTWFuYWdlcj0gSm9iLmdldEpvYk1hbmFnZXIoKTsKKwkJSm9iW10gam9icz0gam9iTWFuYWdlci5maW5kKG51bGwpOworCQlmb3IgKGludCBpPSAwOyBpIDwgam9icy5sZW5ndGg7IGkrKykgeworCQkJSm9iIGpvYj0gam9ic1tpXTsKKwkJCWludCBzdGF0ZT0gam9iLmdldFN0YXRlKCk7CisvLwkJCVN5c3RlbS5vdXQucHJpbnRsbihqb2IuZ2V0TmFtZSgpICsgIjogIiArIGdldFN0YXRlTmFtZShzdGF0ZSkpOworCQkJaWYgKHN0YXRlID09IEpvYi5SVU5OSU5HIHx8IHN0YXRlID09IEpvYi5XQUlUSU5HKSB7CisvLwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCX0KKy8vCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGJyaW5nVG9Ub3AoKSB7CisJCWdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCkuZm9yY2VBY3RpdmUoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBFZGl0b3IgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL2VkaXRvci9wZXJmb3JtYW5jZS9Ob25Jbml0aWFsVHlwaW5nVGVzdC5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgRWRpdG9yIFRlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9lZGl0b3IvcGVyZm9ybWFuY2UvTm9uSW5pdGlhbFR5cGluZ1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzliOTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgRWRpdG9yIFRlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9lZGl0b3IvcGVyZm9ybWFuY2UvTm9uSW5pdGlhbFR5cGluZ1Rlc3QuamF2YQpAQCAtMCwwICsxLDk0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLmVkaXRvci5wZXJmb3JtYW5jZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC50ZXN0cy51aS50ZXN0cGx1Z2luLkFic3RyYWN0QW50VUlUZXN0OworCisvKioKKyAqIE1lYXN1cmVzIHRoZSB0aW1lIHRvIHR5cGUgaW4gb25lIHNpbmdsZSB0YXJnZXQgaW50byBhIGxhcmdlIGJ1aWxkZmlsZQorICogQHNpbmNlIDMuMQorICovCitwdWJsaWMgY2xhc3MgTm9uSW5pdGlhbFR5cGluZ1Rlc3QgZXh0ZW5kcyBBYnN0cmFjdEFudFVJVGVzdCB7CisJCisJcHVibGljIE5vbkluaXRpYWxUeXBpbmdUZXN0KFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKworLy8JcHJpdmF0ZSBJVGV4dEVkaXRvciBmRWRpdG9yOworLy8JCisvLwlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gVEFSR0VUPSAoIjx0YXJnZXQgbmFtZT1cIm5ld1RhcmdldFwiID5cciIgKworLy8JCQkiPGVjaG8+XCJOZXcgVGFyZ2V0XCI8L2VjaG8+XHIiICsKKy8vCQkJIjwvdGFyZ2V0PlxyIikudG9DaGFyQXJyYXkoKTsKKy8vCisvLwlwcml2YXRlIFBlcmZvcm1hbmNlTWV0ZXIgZk1ldGVyOworLy8KKy8vCXByaXZhdGUgS2V5Ym9hcmRQcm9iZSBmS2V5Ym9hcmRQcm9iZTsKKy8vCisvLwlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiwgQmFkTG9jYXRpb25FeGNlcHRpb24geworLy8JCUVkaXRvclRlc3RIZWxwZXIucnVuRXZlbnRRdWV1ZSgpOworLy8JCUlGaWxlIGZpbGU9IGdldFByb2plY3QoKS5nZXRGb2xkZXIoImJ1aWxkZmlsZXMiKS5nZXRGb2xkZXIoInBlcmZvcm1hbmNlIikuZ2V0RmlsZSgiYnVpbGQueG1sIik7CQorLy8JCWZFZGl0b3I9IChJVGV4dEVkaXRvcikgRWRpdG9yVGVzdEhlbHBlci5vcGVuSW5FZGl0b3IoZmlsZSwgdHJ1ZSk7CisvLwkJLy8gZGlydHkgZWRpdG9yIHRvIGF2b2lkIGluaXRpYWwgZGlydHlpbmcgLyB2YWxpZGF0ZSBlZGl0IGNvc3RzCisvLwkJZGlydHlFZGl0b3IoKTsKKy8vCQlQZXJmb3JtYW5jZSBwZXJmb3JtYW5jZT0gUGVyZm9ybWFuY2UuZ2V0RGVmYXVsdCgpOworLy8JCWZNZXRlcj0gcGVyZm9ybWFuY2UuY3JlYXRlUGVyZm9ybWFuY2VNZXRlcihwZXJmb3JtYW5jZS5nZXREZWZhdWx0U2NlbmFyaW9JZCh0aGlzKSk7CisvLwkJZktleWJvYXJkUHJvYmU9IG5ldyBLZXlib2FyZFByb2JlKCk7CisvLworLy8JCWludCBvZmZzZXQ9IGdldEluc2VydFBvc2l0aW9uKCk7CisvLwkJZkVkaXRvci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLnNldFNlbGVjdGlvbihuZXcgVGV4dFNlbGVjdGlvbihvZmZzZXQsIDApKTsKKy8vCQlFZGl0b3JUZXN0SGVscGVyLnJ1bkV2ZW50UXVldWUoKTsKKy8vCQlzbGVlcCgxMDAwKTsKKy8vCX0KKy8vCQorLy8JcHJpdmF0ZSB2b2lkIGRpcnR5RWRpdG9yKCkgeworLy8JCWZFZGl0b3IuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5zZXRTZWxlY3Rpb24obmV3IFRleHRTZWxlY3Rpb24oMCwgMCkpOworLy8JCUVkaXRvclRlc3RIZWxwZXIucnVuRXZlbnRRdWV1ZSgpOworLy8JCXNsZWVwKDEwMDApOworLy8JCQorLy8JCURpc3BsYXkgZGlzcGxheT0gRWRpdG9yVGVzdEhlbHBlci5nZXRBY3RpdmVEaXNwbGF5KCk7CisvLwkJZktleWJvYXJkUHJvYmUucHJlc3NDaGFyKCd7JywgZGlzcGxheSk7CisvLwkJU1dURXZlbnRIZWxwZXIucHJlc3NLZXlDb2RlKGRpc3BsYXksIFNXVC5CUyk7CisvLwkJc2xlZXAoMTAwMCk7CisvLwl9CisvLworLy8JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKy8vCQlzbGVlcCgxMDAwKTsKKy8vCQlFZGl0b3JUZXN0SGVscGVyLnJldmVydEVkaXRvcihmRWRpdG9yLCB0cnVlKTsKKy8vCQlFZGl0b3JUZXN0SGVscGVyLmNsb3NlQWxsRWRpdG9ycygpOworLy8JCQorLy8JCWZNZXRlci5jb21taXQoKTsKKy8vCX0KKy8vCisvLwlwdWJsaWMgdm9pZCB0ZXN0VHlwZUFNZXRob2QoKSB7CisvLwkJRGlzcGxheSBkaXNwbGF5PSBFZGl0b3JUZXN0SGVscGVyLmdldEFjdGl2ZURpc3BsYXkoKTsKKy8vCQkKKy8vCQlmTWV0ZXIuc3RhcnQoKTsKKy8vCQlmb3IgKGludCBpPSAwOyBpIDwgVEFSR0VULmxlbmd0aDsgaSsrKSB7CisvLwkJCWZLZXlib2FyZFByb2JlLnByZXNzQ2hhcihUQVJHRVRbaV0sIGRpc3BsYXkpOworLy8JCX0KKy8vCQlmTWV0ZXIuc3RvcCgpOworLy8JfQorLy8KKy8vCXByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgc2xlZXAoaW50IHRpbWUpIHsKKy8vCQl0cnkgeworLy8JCQl3YWl0KHRpbWUpOworLy8JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKy8vCQl9CisvLwl9CisvLwkKKy8vCXByaXZhdGUgaW50IGdldEluc2VydFBvc2l0aW9uKCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKKy8vCQlJRG9jdW1lbnQgZG9jdW1lbnQ9IEVkaXRvclRlc3RIZWxwZXIuZ2V0RG9jdW1lbnQoZkVkaXRvcik7CisvLwkJaW50IGxpbmVzPSBkb2N1bWVudC5nZXROdW1iZXJPZkxpbmVzKCk7CisvLwkJaW50IG9mZnNldD0gZG9jdW1lbnQuZ2V0TGluZU9mZnNldChsaW5lcyAtIDIpOworLy8JCXJldHVybiBvZmZzZXQ7CisvLwl9Cit9CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBFZGl0b3IgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL2VkaXRvci9zdXBwb3J0L1Rlc3RMb2NhdGlvblByb3ZpZGVyLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBFZGl0b3IgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL2VkaXRvci9zdXBwb3J0L1Rlc3RMb2NhdGlvblByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y3YzYwOAotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IEVkaXRvciBUZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvZWRpdG9yL3N1cHBvcnQvVGVzdExvY2F0aW9uUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDM2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLmVkaXRvci5zdXBwb3J0OworCitpbXBvcnQgamF2YS5pby5GaWxlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLm1vZGVsLkxvY2F0aW9uUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOworCisKK3B1YmxpYyBjbGFzcyBUZXN0TG9jYXRpb25Qcm92aWRlciBleHRlbmRzIExvY2F0aW9uUHJvdmlkZXIgeworCisJcHJpdmF0ZSBGaWxlIGJ1aWxkRmlsZTsKKwkKKwlwdWJsaWMgVGVzdExvY2F0aW9uUHJvdmlkZXIoRmlsZSBidWlsZEZpbGUpIHsKKwkJc3VwZXIobnVsbCk7CisJCXRoaXMuYnVpbGRGaWxlPSBidWlsZEZpbGU7CisJfQorCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3Iub3V0bGluZS5JTG9jYXRpb25Qcm92aWRlciNnZXRMb2NhdGlvbigpCisJICovCisJcHVibGljIElQYXRoIGdldExvY2F0aW9uKCkgeworCQlyZXR1cm4gbmV3IFBhdGgoYnVpbGRGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBFZGl0b3IgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL2VkaXRvci9zdXBwb3J0L1Rlc3RQcm9ibGVtUmVxdWVzdG9yLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBFZGl0b3IgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL2VkaXRvci9zdXBwb3J0L1Rlc3RQcm9ibGVtUmVxdWVzdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI2NzhkYQotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IEVkaXRvciBUZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvZWRpdG9yL3N1cHBvcnQvVGVzdFByb2JsZW1SZXF1ZXN0b3IuamF2YQpAQCAtMCwwICsxLDM5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLmVkaXRvci5zdXBwb3J0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLm1vZGVsLklQcm9ibGVtOworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5tb2RlbC5JUHJvYmxlbVJlcXVlc3RvcjsKKworcHVibGljIGNsYXNzIFRlc3RQcm9ibGVtUmVxdWVzdG9yIGltcGxlbWVudHMgSVByb2JsZW1SZXF1ZXN0b3IgeworCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5vdXRsaW5lLklQcm9ibGVtUmVxdWVzdG9yI2FjY2VwdFByb2JsZW0ob3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5vdXRsaW5lLklQcm9ibGVtKQorCSAqLworCXB1YmxpYyB2b2lkIGFjY2VwdFByb2JsZW0oSVByb2JsZW0gcHJvYmxlbSkgeworCisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5vdXRsaW5lLklQcm9ibGVtUmVxdWVzdG9yI2JlZ2luUmVwb3J0aW5nKCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBiZWdpblJlcG9ydGluZygpIHsKKworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3Iub3V0bGluZS5JUHJvYmxlbVJlcXVlc3RvciNlbmRSZXBvcnRpbmcoKQorCSAqLworCXB1YmxpYyB2b2lkIGVuZFJlcG9ydGluZygpIHsKKworCX0KK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IEVkaXRvciBUZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvZWRpdG9yL3N1cHBvcnQvVGVzdFRleHRDb21wbGV0aW9uUHJvY2Vzc29yLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBFZGl0b3IgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL2VkaXRvci9zdXBwb3J0L1Rlc3RUZXh0Q29tcGxldGlvblByb2Nlc3Nvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNjExYWQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBFZGl0b3IgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL2VkaXRvci9zdXBwb3J0L1Rlc3RUZXh0Q29tcGxldGlvblByb2Nlc3Nvci5qYXZhCkBAIC0wLDAgKzEsMjI0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLmVkaXRvci5zdXBwb3J0OworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5BbnRFZGl0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5BbnRFZGl0b3JDb21wbGV0aW9uUHJvY2Vzc29yOworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5tb2RlbC5BbnRNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvbkxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdGFudEV4dGVuc2lvbjI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlcjsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworCitwdWJsaWMgY2xhc3MgVGVzdFRleHRDb21wbGV0aW9uUHJvY2Vzc29yIGV4dGVuZHMgQW50RWRpdG9yQ29tcGxldGlvblByb2Nlc3NvciB7CisKKwlwdWJsaWMgZmluYWwgc3RhdGljIGludCBURVNUX1BST1BPU0FMX01PREVfTk9ORSA9IEFudEVkaXRvckNvbXBsZXRpb25Qcm9jZXNzb3IuUFJPUE9TQUxfTU9ERV9OT05FOworCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFRFU1RfUFJPUE9TQUxfTU9ERV9CVUlMREZJTEUgPSBBbnRFZGl0b3JDb21wbGV0aW9uUHJvY2Vzc29yLlBST1BPU0FMX01PREVfQlVJTERGSUxFOworCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFRFU1RfUFJPUE9TQUxfTU9ERV9UQVNLX1BST1BPU0FMID0gQW50RWRpdG9yQ29tcGxldGlvblByb2Nlc3Nvci5QUk9QT1NBTF9NT0RFX1RBU0tfUFJPUE9TQUw7CisJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgVEVTVF9QUk9QT1NBTF9NT0RFX1BST1BFUlRZX1BST1BPU0FMID0gQW50RWRpdG9yQ29tcGxldGlvblByb2Nlc3Nvci5QUk9QT1NBTF9NT0RFX1BST1BFUlRZX1BST1BPU0FMOworCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFRFU1RfUFJPUE9TQUxfTU9ERV9BVFRSSUJVVEVfUFJPUE9TQUwgPSBBbnRFZGl0b3JDb21wbGV0aW9uUHJvY2Vzc29yLlBST1BPU0FMX01PREVfQVRUUklCVVRFX1BST1BPU0FMOworCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFRFU1RfUFJPUE9TQUxfTU9ERV9UQVNLX1BST1BPU0FMX0NMT1NJTkcgPSBBbnRFZGl0b3JDb21wbGV0aW9uUHJvY2Vzc29yLlBST1BPU0FMX01PREVfVEFTS19QUk9QT1NBTF9DTE9TSU5HOworCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFRFU1RfUFJPUE9TQUxfTU9ERV9BVFRSSUJVVEVfVkFMVUVfUFJPUE9TQUwgPSBBbnRFZGl0b3JDb21wbGV0aW9uUHJvY2Vzc29yLlBST1BPU0FMX01PREVfQVRUUklCVVRFX1ZBTFVFX1BST1BPU0FMOworCQorCXByaXZhdGUgRmlsZSBmRWRpdGVkRmlsZTsKKwlwcml2YXRlIElTb3VyY2VWaWV3ZXIgZlZpZXdlcjsKKyAgICBwcml2YXRlIGJvb2xlYW4gZk5lZWRzVG9EaXNwb3NlPSB0cnVlOworICAgIAorICAgIAorCisJcHVibGljIFRlc3RUZXh0Q29tcGxldGlvblByb2Nlc3NvcihBbnRNb2RlbCBtb2RlbCkgeworCQlzdXBlcihtb2RlbCk7CisgICAgICAgIGZDb250ZW50QXNzaXN0YW50PSBuZXcgSUNvbnRlbnRBc3Npc3RhbnRFeHRlbnNpb24yKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0RW1wdHlNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIAorICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0U3RhdHVzTWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldFN0YXR1c0xpbmVWaXNpYmxlKGJvb2xlYW4gc2hvdykgeworICAgICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldFNob3dFbXB0eUxpc3QoYm9vbGVhbiBzaG93RW1wdHkpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRSZXBlYXRlZEludm9jYXRpb25Nb2RlKGJvb2xlYW4gY3ljbGluZykgeworICAgICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZUNvbXBsZXRpb25MaXN0ZW5lcihJQ29tcGxldGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgICAgICB9CisgICAgICAgIAorICAgICAgICAgICAgcHVibGljIHZvaWQgYWRkQ29tcGxldGlvbkxpc3RlbmVyKElDb21wbGV0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgCisgICAgICAgICAgICB9ICAgICAgICAKKyAgICAgICAgfTsKKwl9CisJCisJcHVibGljIFRlc3RUZXh0Q29tcGxldGlvblByb2Nlc3NvcihBbnRFZGl0b3IgZWRpdG9yKSB7CisJCXRoaXMoZWRpdG9yLmdldEFudE1vZGVsKCkpOworCQlmVmlld2VyPSBlZGl0b3IuZ2V0Vmlld2VyKCk7CisgICAgICAgIGZOZWVkc1RvRGlzcG9zZT0gZmFsc2U7CisJfQorCQorCXB1YmxpYyBUZXN0VGV4dENvbXBsZXRpb25Qcm9jZXNzb3IoKSB7CisJCXRoaXMoKEFudE1vZGVsKW51bGwpOworCX0KKwkKKyAgICBwdWJsaWMgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGdldEF0dHJpYnV0ZVByb3Bvc2FscyhTdHJpbmcgdGFza05hbWUsIFN0cmluZyBwcmVmaXgpIHsKKyAgICAJaWYgKGN1cnNvclBvc2l0aW9uID09IC0xKSB7CisgICAgCQljdXJzb3JQb3NpdGlvbj0gdGFza05hbWUubGVuZ3RoKCk7CisgICAgCX0KKyAgICAgICAgcmV0dXJuIHN1cGVyLmdldEF0dHJpYnV0ZVByb3Bvc2Fscyh0YXNrTmFtZSwgcHJlZml4KTsKKyAgICB9CisKKyAgICBwdWJsaWMgRWxlbWVudCBmaW5kQ2hpbGRFbGVtZW50TmFtZWRPZihFbGVtZW50IGFuRWxlbWVudCwgU3RyaW5nIGNoaWxkRWxlbWVudE5hbWUpIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLmZpbmRDaGlsZEVsZW1lbnROYW1lZE9mKGFuRWxlbWVudCwgY2hpbGRFbGVtZW50TmFtZSk7CisgICAgfQorCisgICAgcHVibGljIElDb21wbGV0aW9uUHJvcG9zYWxbXSBnZXRUYXNrUHJvcG9zYWxzKFN0cmluZyB0ZXh0LCBTdHJpbmcgcGFyZW50TmFtZSwgU3RyaW5nIHByZWZpeCkgeworICAgIAljdXJzb3JQb3NpdGlvbj0gTWF0aC5tYXgoMCwgdGV4dC5sZW5ndGgoKSAtIDEpOworICAgICAgICByZXR1cm4gc3VwZXIuZ2V0VGFza1Byb3Bvc2FscyhuZXcgRG9jdW1lbnQodGV4dCksIHBhcmVudE5hbWUsIHByZWZpeCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBJQ29tcGxldGlvblByb3Bvc2FsW10gZ2V0VGFza1Byb3Bvc2FscyhJRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyBwYXJlbnROYW1lLCBTdHJpbmcgYVByZWZpeCkgeworICAgIAljdXJzb3JQb3NpdGlvbj0gTWF0aC5tYXgoMCwgZG9jdW1lbnQuZ2V0TGVuZ3RoKCkgLSAxKTsKKyAgICAJcmV0dXJuIHN1cGVyLmdldFRhc2tQcm9wb3NhbHMoZG9jdW1lbnQsIHBhcmVudE5hbWUsIGFQcmVmaXgpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZGV0ZXJtaW5lUHJvcG9zYWxNb2RlKFN0cmluZyB0ZXh0LCBpbnQgdGhlQ3Vyc29yUG9zaXRpb24sIFN0cmluZyBwcmVmaXgpIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLmRldGVybWluZVByb3Bvc2FsTW9kZShuZXcgRG9jdW1lbnQodGV4dCksIHRoZUN1cnNvclBvc2l0aW9uLCBwcmVmaXgpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFyZW50TmFtZShTdHJpbmcgdGV4dCwgaW50IGFMaW5lTnVtYmVyLCBpbnQgYUNvbHVtbk51bWJlcikgeworICAgICAgICByZXR1cm4gc3VwZXIuZ2V0UGFyZW50TmFtZShuZXcgRG9jdW1lbnQodGV4dCksIGFMaW5lTnVtYmVyLCBhQ29sdW1uTnVtYmVyKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIFN0cmluZyBnZXRQYXJlbnROYW1lKElEb2N1bWVudCBkb2MsIGludCBhTGluZU51bWJlciwgaW50IGFDb2x1bW5OdW1iZXIpIHsKKyAgICAJcmV0dXJuIHN1cGVyLmdldFBhcmVudE5hbWUoZG9jLCBhTGluZU51bWJlciwgYUNvbHVtbk51bWJlcik7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRQcmVmaXhGcm9tRG9jdW1lbnQoU3RyaW5nIGFEb2N1bWVudFRleHQsIGludCBhbk9mZnNldCkgeworICAgICAgICBTdHJpbmcgcHJlZml4PSBzdXBlci5nZXRQcmVmaXhGcm9tRG9jdW1lbnQoYURvY3VtZW50VGV4dCwgYW5PZmZzZXQpOworICAgICAgICBjdXJyZW50UHJlZml4PSBudWxsOworICAgICAgICByZXR1cm4gcHJlZml4OworICAgIH0KKworICAgIHB1YmxpYyBJQ29tcGxldGlvblByb3Bvc2FsW10gZ2V0UHJvcGVydHlQcm9wb3NhbHMoSURvY3VtZW50IGRvY3VtZW50LCBTdHJpbmcgcHJlZml4LCBpbnQgY3Vyc29yUG9zKSB7CisgICAgICAgIHJldHVybiBzdXBlci5nZXRQcm9wZXJ0eVByb3Bvc2Fscyhkb2N1bWVudCwgcHJlZml4LCBjdXJzb3JQb3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGVkaXRlZCBGaWxlIHRoYXQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5BbnRFZGl0b3JDb21wbGV0aW9uUHJvY2Vzc29yIHNldHMgb3IgYSB0ZW1wb3JhcnkgCisgICAgICogZmlsZSwgd2hpY2ggb25seSBzZXJ2ZXMgYXMgYSBkdW1teS4KKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IuQW50RWRpdG9yQ29tcGxldGlvblByb2Nlc3NvciNnZXRFZGl0ZWRGaWxlKCkKKyAgICAgKi8KKwlwdWJsaWMgRmlsZSBnZXRFZGl0ZWRGaWxlKCkgeworCQlpZiAoZkVkaXRlZEZpbGUgIT0gbnVsbCl7CisJCQlyZXR1cm4gZkVkaXRlZEZpbGU7CisJCX0KKwkJRmlsZSB0ZW1wRmlsZSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0ZW1wRmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoInRlc3QiLCBudWxsKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgQXNzZXJ0LmZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgICAgIHRlbXBGaWxlLmRlbGV0ZU9uRXhpdCgpOworICAgICAgICByZXR1cm4gdGVtcEZpbGU7CisgICAgfQorCisJcHVibGljIHZvaWQgc2V0TGluZU51bWJlcihpbnQgYUxpbmVOdW1iZXIpIHsKKyAgICAJbGluZU51bWJlciA9IGFMaW5lTnVtYmVyOworICAgIH0KKworCXB1YmxpYyB2b2lkIHNldENvbHVtbk51bWJlcihpbnQgYUNvbHVtbk51bWJlcikgeworICAgIAljb2x1bW5OdW1iZXIgPSBhQ29sdW1uTnVtYmVyOworICAgIH0KKwkKKwlwdWJsaWMgdm9pZCBzZXRDdXJzb3JQb3NpdGlvbihpbnQgY3Vyc29yUG9zaXRpb24pIHsKKwkJdGhpcy5jdXJzb3JQb3NpdGlvbiA9IGN1cnNvclBvc2l0aW9uOworCX0KKyAgICAKKwlwdWJsaWMgdm9pZCBzZXRFZGl0ZWRGaWxlKEZpbGUgYUZpbGUpIHsKKwkJZkVkaXRlZEZpbGU9IGFGaWxlOworCX0KKwkKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLkFudEVkaXRvckNvbXBsZXRpb25Qcm9jZXNzb3IjZ2V0VGFyZ2V0QXR0cmlidXRlVmFsdWVQcm9wb3NhbHMob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCisJICovCisJcHVibGljIElDb21wbGV0aW9uUHJvcG9zYWxbXSBnZXRUYXJnZXRBdHRyaWJ1dGVWYWx1ZVByb3Bvc2FscyhJRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyB0ZXh0VG9TZWFyY2gsIFN0cmluZyBwcmVmaXgsIFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7CisJCXJldHVybiBzdXBlci5nZXRUYXJnZXRBdHRyaWJ1dGVWYWx1ZVByb3Bvc2Fscyhkb2N1bWVudCwgdGV4dFRvU2VhcmNoLCBwcmVmaXgsIGF0dHJpYnV0ZU5hbWUpOworCX0KKyAgICAKKyAgICAvKiAobm9uLUphdmFkb2MpCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLkFudEVkaXRvckNvbXBsZXRpb25Qcm9jZXNzb3IjZ2V0QW50Q2FsbEF0dHJpYnV0ZVZhbHVlUHJvcG9zYWxzKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50LCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQorICAgICAqLworICAgIHB1YmxpYyBJQ29tcGxldGlvblByb3Bvc2FsW10gZ2V0QW50Q2FsbEF0dHJpYnV0ZVZhbHVlUHJvcG9zYWxzKElEb2N1bWVudCBkb2N1bWVudCwgU3RyaW5nIHByZWZpeCwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLmdldEFudENhbGxBdHRyaWJ1dGVWYWx1ZVByb3Bvc2Fscyhkb2N1bWVudCwgcHJlZml4LCBhdHRyaWJ1dGVOYW1lKTsKKyAgICB9CisJLyoqCisJICogU2luY2UgdGhlIHRlc3Rpbmcgb2NjdXJzIHdpdGhvdXQgbmVjZXNzYXJpbHkgaGF2aW5nIGFuIGFzc29jaWF0ZWQgdmlld2VyLCByZXR1cm4KKwkgKiBhIGR1bW15IHZhbHVlLgorCSAqLworCXByb3RlY3RlZCBjaGFyIGdldFByZXZpb3VzQ2hhcigpIHsKKwkJcmV0dXJuICc/JzsKKwl9CisJCisJIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgc3BlY2lmaWVkIHRhc2sgbmFtZSBpcyBrbm93bi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0tub3duRWxlbWVudChTdHJpbmcgZWxlbWVudE5hbWUpIHsKKyAgICAJaWYgKGFudE1vZGVsICE9IG51bGwpIHsKKyAgICAJCXJldHVybiBzdXBlci5pc0tub3duRWxlbWVudChlbGVtZW50TmFtZSk7CisgICAgCX0gCisgICAgCXJldHVybiBnZXREdGQoKS5nZXRFbGVtZW50KGVsZW1lbnROYW1lKSAhPSBudWxsIDsKKyAgICB9CisgICAgCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5BbnRFZGl0b3JDb21wbGV0aW9uUHJvY2Vzc29yI2dldFByb3Bvc2Fsc0Zyb21Eb2N1bWVudChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCwgamF2YS5sYW5nLlN0cmluZykKKwkgKi8KKwlwdWJsaWMgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGdldFByb3Bvc2Fsc0Zyb21Eb2N1bWVudChJRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyBwcmVmaXgpIHsKKwkJcmV0dXJuIHN1cGVyLmdldFByb3Bvc2Fsc0Zyb21Eb2N1bWVudChkb2N1bWVudCwgcHJlZml4KTsKKwl9CisJCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5BbnRFZGl0b3JDb21wbGV0aW9uUHJvY2Vzc29yI2dldEJ1aWxkRmlsZVByb3Bvc2FscyhvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCwgamF2YS5sYW5nLlN0cmluZykKKwkgKi8KKwlwdWJsaWMgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGdldEJ1aWxkRmlsZVByb3Bvc2FscyhTdHJpbmcgdGV4dCwgU3RyaW5nIHByZWZpeCkgeworCQlyZXR1cm4gc3VwZXIuZ2V0QnVpbGRGaWxlUHJvcG9zYWxzKG5ldyBEb2N1bWVudCh0ZXh0KSwgcHJlZml4KTsKKwl9CisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5BbnRFZGl0b3JDb21wbGV0aW9uUHJvY2Vzc29yI2RldGVybWluZVRlbXBsYXRlUHJvcG9zYWxzKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIsIGludCkKKwkgKi8KKwlwdWJsaWMgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGRldGVybWluZVRlbXBsYXRlUHJvcG9zYWxzKCkgeworCQlyZXR1cm4gc3VwZXIuZGV0ZXJtaW5lVGVtcGxhdGVQcm9wb3NhbHMoZlZpZXdlciwgY3Vyc29yUG9zaXRpb24pOworCX0KKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IjY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlciwgaW50KQorCSAqLworCXB1YmxpYyBJQ29tcGxldGlvblByb3Bvc2FsW10gY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoaW50IGRvY3VtZW50T2Zmc2V0KSB7CisJCXJldHVybiBzdXBlci5jb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhmVmlld2VyLCBkb2N1bWVudE9mZnNldCk7CisJfQorICAgIAorICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisgICAgICAgIGlmIChmTmVlZHNUb0Rpc3Bvc2UgJiYgYW50TW9kZWwgIT0gbnVsbCkgeworICAgICAgICAgICAgLy9ub3Qgd29ya2luZyB3aXRoIGFuIGVkaXRvcgorICAgICAgICAgICAgYW50TW9kZWwuZGlzcG9zZSgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL0Fic3RyYWN0QW50VUlCdWlsZFBlcmZvcm1hbmNlVGVzdC5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL0Fic3RyYWN0QW50VUlCdWlsZFBlcmZvcm1hbmNlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3NDc5MjAKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBUZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvQWJzdHJhY3RBbnRVSUJ1aWxkUGVyZm9ybWFuY2VUZXN0LmphdmEKQEAgLTAsMCArMSwxNDMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS50ZXN0LnBlcmZvcm1hbmNlLkRpbWVuc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS50ZXN0LnBlcmZvcm1hbmNlLlBlcmZvcm1hbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLnRlc3QucGVyZm9ybWFuY2UuUGVyZm9ybWFuY2VNZXRlcjsKKworcHVibGljIGNsYXNzIEFic3RyYWN0QW50VUlCdWlsZFBlcmZvcm1hbmNlVGVzdCBleHRlbmRzIEFic3RyYWN0QW50VUlCdWlsZFRlc3QgeworCisJcHJvdGVjdGVkIFBlcmZvcm1hbmNlTWV0ZXIgZlBlcmZvcm1hbmNlTWV0ZXI7CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGEgcGVyZm9ybWFuY2UgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCisJICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHBlcmZvcm1hbmNlIHRlc3QgY2FzZQorCSAqLworCXB1YmxpYyBBYnN0cmFjdEFudFVJQnVpbGRQZXJmb3JtYW5jZVRlc3QoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCQorCS8qKgorCSAqIE92ZXJyaWRkZW4gdG8gY3JlYXRlIGEgZGVmYXVsdCBwZXJmb3JtYW5jZSBtZXRlciBmb3IgdGhpcyB0ZXN0IGNhc2UuCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCQlzdXBlci5zZXRVcCgpOworCQlQZXJmb3JtYW5jZSBwZXJmb3JtYW5jZT0gUGVyZm9ybWFuY2UuZ2V0RGVmYXVsdCgpOworCQlmUGVyZm9ybWFuY2VNZXRlcj0gcGVyZm9ybWFuY2UuY3JlYXRlUGVyZm9ybWFuY2VNZXRlcihwZXJmb3JtYW5jZS5nZXREZWZhdWx0U2NlbmFyaW9JZCh0aGlzKSk7CisJfQorCisJLyoqCisJICogT3ZlcnJpZGRlbiB0byBkaXNwb3NlIG9mIHRoZSBwZXJmb3JtYW5jZSBtZXRlci4KKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWZQZXJmb3JtYW5jZU1ldGVyLmRpc3Bvc2UoKTsKKwl9CisKKwkvKioKKwkgKiBNYXJrIHRoZSBzY2VuYXJpbyBvZiB0aGlzIHRlc3QgY2FzZQorCSAqIHRvIGJlIGluY2x1ZGVkIGludG8gdGhlIGdsb2JhbCBwZXJmb3JtYW5jZSBzdW1tYXJ5LiBUaGUgc3VtbWFyeSBzaG93cworCSAqIHRoZSBnaXZlbiBkaW1lbnNpb24gb2YgdGhlIHNjZW5hcmlvIGFuZCBsYWJlbHMgdGhlIHNjZW5hcmlvIHdpdGggdGhlIHNob3J0IG5hbWUuCisJICogCisJICogQHBhcmFtIHNob3J0TmFtZSBhIHNob3J0IChzaG9ydGVyIHRoYW4gNDAgY2hhcmFjdGVycykgZGVzY3JpdGl2ZSBuYW1lIG9mIHRoZSBzY2VuYXJpbworCSAqIEBwYXJhbSBkaW1lbnNpb24gdGhlIGRpbWVuc2lvbiB0byBzaG93IGluIHRoZSBzdW1tYXJ5CisJICovCisJcHVibGljIHZvaWQgdGFnQXNHbG9iYWxTdW1tYXJ5KFN0cmluZyBzaG9ydE5hbWUsIERpbWVuc2lvbiBkaW1lbnNpb24pIHsKKwkJUGVyZm9ybWFuY2UgcGVyZm9ybWFuY2U9IFBlcmZvcm1hbmNlLmdldERlZmF1bHQoKTsKKwkJcGVyZm9ybWFuY2UudGFnQXNHbG9iYWxTdW1tYXJ5KGZQZXJmb3JtYW5jZU1ldGVyLCBzaG9ydE5hbWUsIG5ldyBEaW1lbnNpb25bXSB7IGRpbWVuc2lvbiB9ICk7CisJfQorCQorCS8qKgorCSAqIE1hcmsgdGhlIHNjZW5hcmlvIG9mIHRoaXMgdGVzdCBjYXNlCisJICogdG8gYmUgaW5jbHVkZWQgaW50byB0aGUgcGVyZm9ybWFuY2Ugc3VtbWFyeS4gVGhlIHN1bW1hcnkgc2hvd3MKKwkgKiB0aGUgZ2l2ZW4gZGltZW5zaW9uIG9mIHRoZSBzY2VuYXJpbyBhbmQgbGFiZWxzIHRoZSBzY2VuYXJpbyB3aXRoIHRoZSBzaG9ydCBuYW1lLgorCSAqIAorCSAqIEBwYXJhbSBzaG9ydE5hbWUgYSBzaG9ydCAoc2hvcnRlciB0aGFuIDQwIGNoYXJhY3RlcnMpIGRlc2NyaXB0aXZlIG5hbWUgb2YgdGhlIHNjZW5hcmlvCisJICogQHBhcmFtIGRpbWVuc2lvbiB0aGUgZGltZW5zaW9uIHRvIHNob3cgaW4gdGhlIHN1bW1hcnkKKwkgKi8KKwlwdWJsaWMgdm9pZCB0YWdBc1N1bW1hcnkoU3RyaW5nIHNob3J0TmFtZSwgRGltZW5zaW9uIGRpbWVuc2lvbikgeworCQlQZXJmb3JtYW5jZSBwZXJmb3JtYW5jZT0gUGVyZm9ybWFuY2UuZ2V0RGVmYXVsdCgpOworCQlwZXJmb3JtYW5jZS50YWdBc1N1bW1hcnkoZlBlcmZvcm1hbmNlTWV0ZXIsIHNob3J0TmFtZSwgbmV3IERpbWVuc2lvbltdIHsgZGltZW5zaW9uIH0gKTsKKwl9CisKKwkvKioKKwkgKiBNYXJrIHRoZSBzY2VuYXJpbyByZXByZXNlbnRlZCBieSB0aGUgZ2l2ZW4gUGVyZm9ybWFuY2VNZXRlcgorCSAqIHRvIGJlIGluY2x1ZGVkIGludG8gdGhlIGdsb2JhbCBwZXJmb3JtYW5jZSBzdW1tYXJ5LiBUaGUgc3VtbWFyeSBzaG93cworCSAqIHRoZSBnaXZlbiBkaW1lbnNpb25zIG9mIHRoZSBzY2VuYXJpbyBhbmQgbGFiZWxzIHRoZSBzY2VuYXJpbyB3aXRoIHRoZSBzaG9ydCBuYW1lLgorCSAqIAorCSAqIEBwYXJhbSBzaG9ydE5hbWUgYSBzaG9ydCAoc2hvcnRlciB0aGFuIDQwIGNoYXJhY3RlcnMpIGRlc2NyaXB0aXZlIG5hbWUgb2YgdGhlIHNjZW5hcmlvCisJICogQHBhcmFtIGRpbWVuc2lvbnMgYW4gYXJyYXkgb2YgZGltZW5zaW9ucyB0byBzaG93IGluIHRoZSBzdW1tYXJ5CisJICovCisJcHVibGljIHZvaWQgdGFnQXNHbG9iYWxTdW1tYXJ5KFN0cmluZyBzaG9ydE5hbWUsIERpbWVuc2lvbltdIGRpbWVuc2lvbnMpIHsKKwkJUGVyZm9ybWFuY2UgcGVyZm9ybWFuY2U9IFBlcmZvcm1hbmNlLmdldERlZmF1bHQoKTsKKwkJcGVyZm9ybWFuY2UudGFnQXNHbG9iYWxTdW1tYXJ5KGZQZXJmb3JtYW5jZU1ldGVyLCBzaG9ydE5hbWUsIGRpbWVuc2lvbnMgKTsKKwl9CisJCisJLyoqCisJICogQ2FsbGVkIGZyb20gd2l0aGluIGEgdGVzdCBjYXNlIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGUgY29kZSB0byBtZWFzdXJlIGlzIHJ1bi4KKwkgKiBJdCBzdGFydHMgY2FwdHVyaW5nIG9mIHBlcmZvcm1hbmNlIGRhdGEuCisJICogTXVzdCBiZSBmb2xsb3dlZCBieSBhIGNhbGwgdG8ge0BsaW5rIFBlcmZvcm1hbmNlVGVzdENhc2Ujc3RvcE1lYXN1cmluZygpfSBiZWZvcmUgc3Vic2VxdWVudCBjYWxscworCSAqIHRvIHRoaXMgbWV0aG9kIG9yIHtAbGluayBQZXJmb3JtYW5jZVRlc3RDYXNlI2NvbW1pdE1lYXN1cmVtZW50cygpfS4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzdGFydE1lYXN1cmluZygpIHsKKwkJZlBlcmZvcm1hbmNlTWV0ZXIuc3RhcnQoKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgc3RvcE1lYXN1cmluZygpIHsKKwkJZlBlcmZvcm1hbmNlTWV0ZXIuc3RvcCgpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBjb21taXRNZWFzdXJlbWVudHMoKSB7CisJCWZQZXJmb3JtYW5jZU1ldGVyLmNvbW1pdCgpOyAKKwl9CisKKwkvKioKKwkgKiBBc3NlcnRzIGRlZmF1bHQgcHJvcGVydGllcyBvZiB0aGUgbWVhc3VyZW1lbnRzIGNhcHR1cmVkIGZvciB0aGlzIHRlc3QgY2FzZS4KKwkgKiAKKwkgKiBAdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24gaWYgdGhlIHByb3BlcnRpZXMgZG8gbm90IGhvbGQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhc3NlcnRQZXJmb3JtYW5jZSgpIHsKKwkJUGVyZm9ybWFuY2UuZ2V0RGVmYXVsdCgpLmFzc2VydFBlcmZvcm1hbmNlKGZQZXJmb3JtYW5jZU1ldGVyKTsKKwl9CisKKwkvKioKKwkgKiBBc3NlcnRzIHRoYXQgdGhlIG1lYXN1cmVtZW50IHNwZWNpZmllZCBieSB0aGUgZ2l2ZW4gZGltZW5zaW9uCisJICogaXMgd2l0aGluIGEgY2VydGFpbiByYW5nZSB3aXRoIHJlc3BlY3QgdG8gc29tZSByZWZlcmVuY2UgdmFsdWUuCisJICogSWYgdGhlIHNwZWNpZmllZCBkaW1lbnNpb24gaXNuJ3QgYXZhaWxhYmxlLCB0aGUgY2FsbCBoYXMgbm8gZWZmZWN0LgorCSAqIAorCSAqIEBwYXJhbSBkaW0gdGhlIERpbWVuc2lvbiB0byBjaGVjaworCSAqIEBwYXJhbSBsb3dlclBlcmNlbnRhZ2UgYSBuZWdhdGl2ZSBudW1iZXIgaW5kaWNhdGluZyB0aGUgcGVyY2VudGFnZSB0aGUgbWVhc3VyZWQgdmFsdWUgaXMgYWxsb3dlZCB0byBiZSBzbWFsbGVyIHRoYW4gc29tZSByZWZlcmVuY2UgdmFsdWUKKwkgKiBAcGFyYW0gdXBwZXJQZXJjZW50YWdlIGEgcG9zaXRpdmUgbnVtYmVyIGluZGljYXRpbmcgdGhlIHBlcmNlbnRhZ2UgdGhlIG1lYXN1cmVkIHZhbHVlIGlzIGFsbG93ZWQgdG8gYmUgZ3JlYXRlciB0aGFuIHNvbWUgcmVmZXJlbmNlIHZhbHVlCisJICogQHRocm93cyBSdW50aW1lRXhjZXB0aW9uIGlmIHRoZSBwcm9wZXJ0aWVzIGRvIG5vdCBob2xkCisJICovCisJcHJvdGVjdGVkIHZvaWQgYXNzZXJ0UGVyZm9ybWFuY2VJblJlbGF0aXZlQmFuZChEaW1lbnNpb24gZGltLCBpbnQgbG93ZXJQZXJjZW50YWdlLCBpbnQgdXBwZXJQZXJjZW50YWdlKSB7CisJCVBlcmZvcm1hbmNlLmdldERlZmF1bHQoKS5hc3NlcnRQZXJmb3JtYW5jZUluUmVsYXRpdmVCYW5kKGZQZXJmb3JtYW5jZU1ldGVyLCBkaW0sIGxvd2VyUGVyY2VudGFnZSwgdXBwZXJQZXJjZW50YWdlKTsKKwl9CisJCisJLyoqCisJICogTGF1bmNoZXMgdGhlIEFudCBidWlsZCBmb3IgdGhpcyBjb25maWcuCisJICogV2FpdHMgZm9yIGFsbCBvZiB0aGUgbGluZXMgdG8gYmUgYXBwZW5kZWQgdG8gdGhlIGNvbnNvbGUuCisJICogCisJICogQHBhcmFtIGNvbmZpZyB0aGUgbGF1bmNoIGNvbmZpZ3VyYXRpb24gdG8gZXhlY3V0ZQorCSAqIEBwYXJhbSBpIHRoZSBudW1iZXIgb2YgdGltZXMgdG8gcGVyZm9ybSB0aGUgbGF1bmNoCisJICovCisJcHJvdGVjdGVkIHZvaWQgbGF1bmNoKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZywgaW50IGkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJc3RhcnRNZWFzdXJpbmcoKTsKKwkJZm9yIChpbnQgaiA9IDA7IGogPCBpOyBqKyspIHsKKwkJICAgIHN1cGVyLmxhdW5jaChjb25maWcpOyAgICAKKyAgICAgICAgfQorCQlzdG9wTWVhc3VyaW5nKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL0Fic3RyYWN0QW50VUlCdWlsZFRlc3QuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IFRlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9BYnN0cmFjdEFudFVJQnVpbGRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU0ZWNhNwotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IFRlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9BYnN0cmFjdEFudFVJQnVpbGRUZXN0LmphdmEKQEAgLTAsMCArMSwxMDAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQudGVzdHMudWk7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFJlc3VsdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC50ZXN0cy51aS50ZXN0cGx1Z2luLkFic3RyYWN0QW50VUlUZXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5jb25zb2xlLklIeXBlcmxpbms7CisKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0QW50VUlCdWlsZFRlc3QgZXh0ZW5kcyBBYnN0cmFjdEFudFVJVGVzdCB7CisKKwkvKioKKwkgKiBGbGFnIHRoYXQgaW5kaWNhdGVzIHRlc3QgYXJlIGluIHByb2dyZXNzCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gdGVzdGluZyA9IHRydWU7CisJCQorCXB1YmxpYyBBYnN0cmFjdEFudFVJQnVpbGRUZXN0KFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKwkKKwkvKioKKwkgKiBSdW5zIHRoZSB0ZXN0IGFuZCBjb2xsZWN0cyB0aGUgcmVzdWx0IGluIGEgVGVzdFJlc3VsdCB3aXRob3V0IGJsb2NraW5nCisJICogdGhlIFVJIHRocmVhZC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBydW4oZmluYWwgVGVzdFJlc3VsdCByZXN1bHQpIHsKKwkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7CisJCVRocmVhZCB0aHJlYWQgPSBudWxsOworCQl0cnkgeworCQkJUnVubmFibGUgciA9IG5ldyBSdW5uYWJsZSgpIHsKKwkJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCUFic3RyYWN0QW50VUlCdWlsZFRlc3Quc3VwZXIucnVuKHJlc3VsdCk7CQkKKwkJCQkJdGVzdGluZyA9IGZhbHNlOworCQkJCQlkaXNwbGF5Lndha2UoKTsKKwkJCQl9CisJCQl9OworCQkJdGhyZWFkID0gbmV3IFRocmVhZChyKTsKKwkJCXRocmVhZC5zdGFydCgpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJfQorCQkKKwkJd2hpbGUgKHRlc3RpbmcpIHsKKwkJCXRyeSB7CisJCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQorCQkJCQlkaXNwbGF5LnNsZWVwKCk7CisJCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgeworCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQl9CQkJCisJCX0JCQorCX0KKwkKKwkvKioKKwkgKiBMYXVuY2hlcyB0aGUgQW50IGJ1aWxkIHdpdGggdGhlIGJ1aWxkZmlsZSBuYW1lIChubyBleHRlbnNpb24pLgorCSAqIFdhaXRzIGZvciBhbGwgb2YgdGhlIGxpbmVzIHRvIGJlIGFwcGVuZGVkIHRvIHRoZSBjb25zb2xlLgorCSAqIAorCSAqIEBwYXJhbSBidWlsZEZpbGVOYW1lIHRoZSBidWlsZGZpbGUgdG8gZXhlY3V0ZQorCSAqIEByZXR1cm4gdGhyZWFkIGluIHdoaWNoIHRoZSBmaXJzdCBzdXNwZW5kIGV2ZW50IG9jY3VycmVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgbGF1bmNoKFN0cmluZyBidWlsZEZpbGVOYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCXN1cGVyLmxhdW5jaChidWlsZEZpbGVOYW1lKTsKKwl9CisJCisJLyoqCisJICogTGF1bmNoZXMgdGhlIGxhdW5jaCBjb25maWd1cmF0aW9uCisJICogV2FpdHMgZm9yIGFsbCBvZiB0aGUgbGluZXMgdG8gYmUgYXBwZW5kZWQgdG8gdGhlIGNvbnNvbGUuCisJICogCisJICogQHBhcmFtIGNvbmZpZyB0aGUgY29uZmlnIHRvIGV4ZWN1dGUKKwkgKiBAcmV0dXJuIHRocmVhZCBpbiB3aGljaCB0aGUgZmlyc3Qgc3VzcGVuZCBldmVudCBvY2N1cnJlZAorCSAqLworCXByb3RlY3RlZCB2b2lkIGxhdW5jaChJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWcpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkgICAgbGF1bmNoQW5kVGVybWluYXRlKGNvbmZpZywgMjAwMDApOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBhY3RpdmF0ZUxpbmsoZmluYWwgSUh5cGVybGluayBsaW5rKSB7CisJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7CisJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJbGluay5saW5rQWN0aXZhdGVkKCk7CisJCQl9CisJCX0pOworCX0KKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5hbnQudGVzdHMudWkudGVzdHBsdWdpbi5BYnN0cmFjdEFudFVJVGVzdCNsYXVuY2goamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBsYXVuY2goU3RyaW5nIGJ1aWxkRmlsZU5hbWUsIFN0cmluZyBhcmd1bWVudHMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJc3VwZXIubGF1bmNoKGJ1aWxkRmlsZU5hbWUsIGFyZ3VtZW50cyk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL0FudFV0aWxUZXN0cy5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL0FudFV0aWxUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmODkzM2MKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBUZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvQW50VXRpbFRlc3RzLmphdmEKQEAgLTAsMCArMSwxMjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuQW50VXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkubW9kZWwuQW50VGFyZ2V0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nLklBbnRMYXVuY2hDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLnRlc3RwbHVnaW4uQWJzdHJhY3RBbnRVSVRlc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHRlcm5hbHRvb2xzLmludGVybmFsLklFeHRlcm5hbFRvb2xDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHk7CisKK3B1YmxpYyBjbGFzcyBBbnRVdGlsVGVzdHMgZXh0ZW5kcyBBYnN0cmFjdEFudFVJVGVzdCB7CisKKyAgICBwdWJsaWMgQW50VXRpbFRlc3RzKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0VGFyZ2V0c0xhdW5jaENvbmZpZ3VyYXRpb24oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisgICAgICAgU3RyaW5nIGJ1aWxkRmlsZU5hbWU9ICJlY2hvaW5nIjsKKyAgICAgICBGaWxlIGJ1aWxkRmlsZT0gZ2V0QnVpbGRGaWxlKGJ1aWxkRmlsZU5hbWUgKyAiLnhtbCIpOworICAgICAgIFN0cmluZyBhcmd1bWVudHM9IG51bGw7CisgICAgICAgTWFwIHByb3BlcnRpZXM9IG51bGw7CisgICAgICAgU3RyaW5nIHByb3BlcnR5RmlsZXM9IG51bGw7CisgICAgICAgQW50VGFyZ2V0Tm9kZVtdIHRhcmdldHM9IEFudFV0aWwuZ2V0VGFyZ2V0cyhidWlsZEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIGdldExhdW5jaENvbmZpZ3VyYXRpb24oYnVpbGRGaWxlTmFtZSwgYXJndW1lbnRzLCBwcm9wZXJ0aWVzLCBwcm9wZXJ0eUZpbGVzKSk7CisgICAgICAgYXNzZXJ0VHJ1ZSh0YXJnZXRzICE9IG51bGwpOworICAgICAgIGFzc2VydFRydWUoIkluY29ycmVjdCBudW1iZXIgb2YgdGFyZ2V0cyByZXRyaWV2ZWQ7IHNob3VsZCBiZSA0IHdhczogIiArIHRhcmdldHMubGVuZ3RoLCB0YXJnZXRzLmxlbmd0aCA9PSA0KTsKKyAgICAgICBhc3NlcnRDb250YWlucygiZWNobzMiLCB0YXJnZXRzKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdEdldFRhcmdldHNMYXVuY2hDb25maWd1cmF0aW9uTWludXNEKCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgYnVpbGRGaWxlTmFtZT0gImltcG9ydFJlcXVpcmluZ1VzZXJQcm9wIjsKKyAgICAgICAgRmlsZSBidWlsZEZpbGU9IGdldEJ1aWxkRmlsZShidWlsZEZpbGVOYW1lICsgIi54bWwiKTsKKyAgICAgICAgU3RyaW5nIGFyZ3VtZW50cz0gIi1EaW1wb3J0RmlsZU5hbWU9dG9CZUltcG9ydGVkLnhtbCI7CisgICAgICAgIE1hcCBwcm9wZXJ0aWVzPSBudWxsOworICAgICAgICBTdHJpbmcgcHJvcGVydHlGaWxlcz0gbnVsbDsKKyAgICAgICAgQW50VGFyZ2V0Tm9kZVtdIHRhcmdldHM9IEFudFV0aWwuZ2V0VGFyZ2V0cyhidWlsZEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIGdldExhdW5jaENvbmZpZ3VyYXRpb24oYnVpbGRGaWxlTmFtZSwgYXJndW1lbnRzLCBwcm9wZXJ0aWVzLCBwcm9wZXJ0eUZpbGVzKSk7CisgICAgICAgIGFzc2VydFRydWUodGFyZ2V0cyAhPSBudWxsKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IG51bWJlciBvZiB0YXJnZXRzIHJldHJpZXZlZDsgc2hvdWxkIGJlIDMgd2FzOiAiICsgdGFyZ2V0cy5sZW5ndGgsIHRhcmdldHMubGVuZ3RoID09IDMpOworICAgICAgICBhc3NlcnRDb250YWlucygiaW1wb3J0LWRlZmF1bHQiLCB0YXJnZXRzKTsKKyAgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRUYXJnZXRzTGF1bmNoQ29uZmlndXJhdGlvbk1pbnVzREFuZFByb3BlcnR5KCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgYnVpbGRGaWxlTmFtZT0gImltcG9ydFJlcXVpcmluZ1VzZXJQcm9wIjsKKyAgICAgICAgRmlsZSBidWlsZEZpbGU9IGdldEJ1aWxkRmlsZShidWlsZEZpbGVOYW1lICsgIi54bWwiKTsKKyAgICAgICAgU3RyaW5nIGFyZ3VtZW50cz0gIi1EaW1wb3J0RmlsZU5hbWU9dG9CZUltcG9ydGVkLnhtbCI7CisgICAgICAgIC8vYXJndW1lbnRzIHNob3VsZCB3aW4KKyAgICAgICAgTWFwIHByb3BlcnRpZXM9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgIHByb3BlcnRpZXMucHV0KCJpbXBvcnRGaWxlTmFtZSIsICJub3RUb0JlSW1wb3J0ZWQueG1sIik7CisgICAgICAgIFN0cmluZyBwcm9wZXJ0eUZpbGVzPSBudWxsOworICAgICAgICBBbnRUYXJnZXROb2RlW10gdGFyZ2V0cz0gQW50VXRpbC5nZXRUYXJnZXRzKGJ1aWxkRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgZ2V0TGF1bmNoQ29uZmlndXJhdGlvbihidWlsZEZpbGVOYW1lLCBhcmd1bWVudHMsIHByb3BlcnRpZXMsIHByb3BlcnR5RmlsZXMpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh0YXJnZXRzICE9IG51bGwpOworICAgICAgICBhc3NlcnRUcnVlKCJJbmNvcnJlY3QgbnVtYmVyIG9mIHRhcmdldHMgcmV0cmlldmVkOyBzaG91bGQgYmUgMyB3YXM6ICIgKyB0YXJnZXRzLmxlbmd0aCwgdGFyZ2V0cy5sZW5ndGggPT0gMyk7CisgICAgICAgIGFzc2VydENvbnRhaW5zKCJpbXBvcnQtZGVmYXVsdCIsIHRhcmdldHMpOworICAgICB9CisgICAgCisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdEdldFRhcmdldHNMYXVuY2hDb25maWd1cmF0aW9uUHJvcGVydHkoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBidWlsZEZpbGVOYW1lPSAiaW1wb3J0UmVxdWlyaW5nVXNlclByb3AiOworICAgICAgICBGaWxlIGJ1aWxkRmlsZT0gZ2V0QnVpbGRGaWxlKGJ1aWxkRmlsZU5hbWUgKyAiLnhtbCIpOworICAgICAgICBTdHJpbmcgYXJndW1lbnRzPSBudWxsOworICAgICAgICBNYXAgcHJvcGVydGllcz0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgcHJvcGVydGllcy5wdXQoImltcG9ydEZpbGVOYW1lIiwgInRvQmVJbXBvcnRlZC54bWwiKTsKKyAgICAgICAgU3RyaW5nIHByb3BlcnR5RmlsZXM9IG51bGw7CisgICAgICAgIEFudFRhcmdldE5vZGVbXSB0YXJnZXRzPSBBbnRVdGlsLmdldFRhcmdldHMoYnVpbGRGaWxlLmdldEFic29sdXRlUGF0aCgpLCBnZXRMYXVuY2hDb25maWd1cmF0aW9uKGJ1aWxkRmlsZU5hbWUsIGFyZ3VtZW50cywgcHJvcGVydGllcywgcHJvcGVydHlGaWxlcykpOworICAgICAgICBhc3NlcnRUcnVlKHRhcmdldHMgIT0gbnVsbCk7CisgICAgICAgIGFzc2VydFRydWUoIkluY29ycmVjdCBudW1iZXIgb2YgdGFyZ2V0cyByZXRyaWV2ZWQ7IHNob3VsZCBiZSAzIHdhczogIiArIHRhcmdldHMubGVuZ3RoLCB0YXJnZXRzLmxlbmd0aCA9PSAzKTsKKyAgICAgICAgYXNzZXJ0Q29udGFpbnMoImltcG9ydC1kZWZhdWx0IiwgdGFyZ2V0cyk7CisgICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0VGFyZ2V0c0xhdW5jaENvbmZpZ3VyYXRpb25Qcm9wZXJ0eUZpbGUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBidWlsZEZpbGVOYW1lPSAiaW1wb3J0UmVxdWlyaW5nVXNlclByb3AiOworICAgICAgICBGaWxlIGJ1aWxkRmlsZT0gZ2V0QnVpbGRGaWxlKGJ1aWxkRmlsZU5hbWUgKyAiLnhtbCIpOworICAgICAgICBTdHJpbmcgYXJndW1lbnRzPSBudWxsOworICAgICAgICBNYXAgcHJvcGVydGllcz0gbnVsbDsKKyAgICAgICAgU3RyaW5nIHByb3BlcnR5RmlsZXM9ICJidWlsZHRlc3QxLnByb3BlcnRpZXMiOworICAgICAgICBBbnRUYXJnZXROb2RlW10gdGFyZ2V0cz0gQW50VXRpbC5nZXRUYXJnZXRzKGJ1aWxkRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgZ2V0TGF1bmNoQ29uZmlndXJhdGlvbihidWlsZEZpbGVOYW1lLCBhcmd1bWVudHMsIHByb3BlcnRpZXMsIHByb3BlcnR5RmlsZXMpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh0YXJnZXRzICE9IG51bGwpOworICAgICAgICBhc3NlcnRUcnVlKCJJbmNvcnJlY3QgbnVtYmVyIG9mIHRhcmdldHMgcmV0cmlldmVkOyBzaG91bGQgYmUgMyB3YXM6ICIgKyB0YXJnZXRzLmxlbmd0aCwgdGFyZ2V0cy5sZW5ndGggPT0gMyk7CisgICAgICAgIGFzc2VydENvbnRhaW5zKCJpbXBvcnQtZGVmYXVsdCIsIHRhcmdldHMpOworICAgICB9CisgICAgCisgICAgcHJvdGVjdGVkIElMYXVuY2hDb25maWd1cmF0aW9uIGdldExhdW5jaENvbmZpZ3VyYXRpb24oU3RyaW5nIGJ1aWxkRmlsZU5hbWUsIFN0cmluZyBhcmd1bWVudHMsIE1hcCBwcm9wZXJ0aWVzLCBTdHJpbmcgcHJvcGVydHlGaWxlcykgdGhyb3dzIENvcmVFeGNlcHRpb24geworICAgICAgICBJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWcgPSBnZXRMYXVuY2hDb25maWd1cmF0aW9uKGJ1aWxkRmlsZU5hbWUpOworCQlhc3NlcnROb3ROdWxsKCJDb3VsZCBub3QgbG9jYXRlIGxhdW5jaCBjb25maWd1cmF0aW9uIGZvciAiICsgYnVpbGRGaWxlTmFtZSwgY29uZmlnKTsKKwkJSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb3B5PSBjb25maWcuZ2V0V29ya2luZ0NvcHkoKTsKKwkJaWYgKGFyZ3VtZW50cyAhPSBudWxsKSB7CisJCSAgICBjb3B5LnNldEF0dHJpYnV0ZShJRXh0ZXJuYWxUb29sQ29uc3RhbnRzLkFUVFJfVE9PTF9BUkdVTUVOVFMsIGFyZ3VtZW50cyk7CisJCX0KKwkJaWYgKHByb3BlcnRpZXMgIT0gbnVsbCkgeworCQkgICAgY29weS5zZXRBdHRyaWJ1dGUoSUFudExhdW5jaENvbnN0YW50cy5BVFRSX0FOVF9QUk9QRVJUSUVTLCBwcm9wZXJ0aWVzKTsKKwkJfQorCQlpZiAocHJvcGVydHlGaWxlcyAhPSBudWxsKSB7CisJCSAgICBjb3B5LnNldEF0dHJpYnV0ZShJQW50TGF1bmNoQ29uc3RhbnRzLkFUVFJfQU5UX1BST1BFUlRZX0ZJTEVTLCBwcm9wZXJ0eUZpbGVzKTsKKwkJfQorCQlyZXR1cm4gY29weTsKKyAgICB9CisKKyAgICAvKioKKyAJICogQXNzZXJ0cyB0aGF0IDxjb2RlPmRpc3BsYXlTdHJpbmc8L2NvZGU+IGlzIGluIG9uZSBvZiB0aGUgCisgCSAqIGNvbXBsZXRpb24gcHJvcG9zYWxzLgorIAkgKi8KKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0Q29udGFpbnMoU3RyaW5nIHRhcmdldE5hbWUsIEFudFRhcmdldE5vZGVbXSB0YXJnZXRzKSB7CisgICAgICAgIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0YXJnZXRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBBbnRUYXJnZXROb2RlIHRhcmdldCA9IHRhcmdldHNbaV07CisgICAgICAgICAgICBTdHJpbmcgZm91bmROYW1lID0gdGFyZ2V0LmdldFRhcmdldE5hbWUoKTsKKyAgICAgICAgICAgIGlmKHRhcmdldE5hbWUuZXF1YWxzKGZvdW5kTmFtZSkpIHsKKyAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJEaWQgbm90IGZpbmQgdGFyZ2V0OiAiICsgdGFyZ2V0TmFtZSwgdHJ1ZSwgZm91bmQpOworICAgIH0gICAgICAgIAorfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL3BlcmZvcm1hbmNlL0Fic3RyYWN0QW50UGVyZm9ybWFuY2VUZXN0LmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBUZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvcGVyZm9ybWFuY2UvQWJzdHJhY3RBbnRQZXJmb3JtYW5jZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWZjZDZlCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL3BlcmZvcm1hbmNlL0Fic3RyYWN0QW50UGVyZm9ybWFuY2VUZXN0LmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogIENvbnRyaWJ1dG9yczoKKyAqICAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLnBlcmZvcm1hbmNlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLnRlc3RwbHVnaW4uQWJzdHJhY3RBbnRVSVRlc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UudGVzdC5wZXJmb3JtYW5jZS5QZXJmb3JtYW5jZVRlc3RDYXNlOworCisvKioKKyAqIEFic3RyYWN0IGNsYXNzIGZvciBhbnQgcGVyZm9ybWFuY2UgdGVzdHMsIGVuc3VyZXMgdGhlIHRlc3QgcHJvamVjdCBpcyBjcmVhdGVkIAorICogYW5kIHJlYWR5IGluIHRoZSB0ZXN0IHdvcmtzcGFjZS4KKyAqIAorICogQHNpbmNlIDMuNQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RBbnRQZXJmb3JtYW5jZVRlc3QgZXh0ZW5kcyBQZXJmb3JtYW5jZVRlc3RDYXNlIHsKKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnRlc3QucGVyZm9ybWFuY2UuUGVyZm9ybWFuY2VUZXN0Q2FzZSNzZXRVcCgpCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc3VwZXIuc2V0VXAoKTsKKwkJQWJzdHJhY3RBbnRVSVRlc3QuYXNzZXJ0UHJvamVjdCgpOworCX0KK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IFRlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9wZXJmb3JtYW5jZS9PcGVuTGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZ1Rlc3RzLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBUZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvcGVyZm9ybWFuY2UvT3BlbkxhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2dUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNjc4MTMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBUZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvcGVyZm9ybWFuY2UvT3BlbkxhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2dUZXN0cy5qYXZhCkBAIC0wLDAgKzEsMTA5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLnBlcmZvcm1hbmNlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLklBbnRVSUNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQudGVzdHMudWkuZWRpdG9yLnBlcmZvcm1hbmNlLkVkaXRvclRlc3RIZWxwZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLnRlc3RwbHVnaW4uQWJzdHJhY3RBbnRVSVRlc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmludGVybmFsLnVpLkRlYnVnVUlQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuaW50ZXJuYWwudWkuSUludGVybmFsRGVidWdVSUNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5pbnRlcm5hbC51aS5sYXVuY2hDb25maWd1cmF0aW9ucy5MYXVuY2hDb25maWd1cmF0aW9uc0RpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UudGVzdC5wZXJmb3JtYW5jZS5EaW1lbnNpb247CitpbXBvcnQgb3JnLmVjbGlwc2UudGVzdC5wZXJmb3JtYW5jZS5QZXJmb3JtYW5jZVRlc3RDYXNlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuaW50ZXJuYWwubW9kZWwuSUV4dGVybmFsVG9vbENvbnN0YW50czsKKworcHVibGljIGNsYXNzIE9wZW5MYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nVGVzdHMgZXh0ZW5kcyBQZXJmb3JtYW5jZVRlc3RDYXNlIHsKKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZnSWRlbnRpZmllcj0gSUV4dGVybmFsVG9vbENvbnN0YW50cy5JRF9FWFRFUk5BTF9UT09MU19MQVVOQ0hfR1JPVVA7CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdE9wZW5BbnRMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nMSgpIHsKKyAgICAgICAgLy9jb2xkIHJ1bgorICAgICAgICBJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uPSBnZXRMYXVuY2hDb25maWd1cmF0aW9uKCJiaWciKTsKKwkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihjb25maWd1cmF0aW9uKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisJCSAgICBvcGVuTENEKHNlbGVjdGlvbiwgZmdJZGVudGlmaWVyLCAyMCk7IAorICAgICAgICB9CisJCQorCQljb21taXRNZWFzdXJlbWVudHMoKTsKKwkJYXNzZXJ0UGVyZm9ybWFuY2UoKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdE9wZW5BbnRMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nMigpIHsKKyAgICAgICAgLy93YXJtIHJ1bgorICAgICAgICBJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uPSBnZXRMYXVuY2hDb25maWd1cmF0aW9uKCJiaWciKTsKKwkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihjb25maWd1cmF0aW9uKTsKKwkJdGFnQXNTdW1tYXJ5KCJPcGVuIExDRCBvbiBUYXJnZXRzIHRhYiIsIERpbWVuc2lvbi5FTEFQU0VEX1BST0NFU1MpOworCQlmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKKwkJICAgIG9wZW5MQ0Qoc2VsZWN0aW9uLCBmZ0lkZW50aWZpZXIsIDIwKTsgCisgICAgICAgIH0KKwkJCisJCWNvbW1pdE1lYXN1cmVtZW50cygpOworCQlhc3NlcnRQZXJmb3JtYW5jZSgpOworICAgIH0KKworICAgIHByaXZhdGUgSUxhdW5jaENvbmZpZ3VyYXRpb24gZ2V0TGF1bmNoQ29uZmlndXJhdGlvbihTdHJpbmcgYnVpbGRGaWxlTmFtZSkgeworICAgICAgICBJRmlsZSBmaWxlID0gQWJzdHJhY3RBbnRVSVRlc3QuZ2V0SmF2YVByb2plY3QoKS5nZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKCJsYXVuY2hDb25maWd1cmF0aW9ucyIpLmdldEZpbGUoYnVpbGRGaWxlTmFtZSArICIubGF1bmNoIik7CisJCUlMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZyA9IEFic3RyYWN0QW50VUlUZXN0LmdldExhdW5jaE1hbmFnZXIoKS5nZXRMYXVuY2hDb25maWd1cmF0aW9uKGZpbGUpOworCQlhc3NlcnRUcnVlKCJDb3VsZCBub3QgZmluZCBsYXVuY2ggY29uZmlndXJhdGlvbiBmb3IgIiArIGJ1aWxkRmlsZU5hbWUsIGNvbmZpZy5leGlzdHMoKSk7CisJCXJldHVybiBjb25maWc7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG9wZW5MQ0QoZmluYWwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uLCBmaW5hbCBTdHJpbmcgZ3JvdXBJZGVudGlmaWVyLCBpbnQgbnVtYmVyT2ZPcGVucykgeworICAgICAgICBzdGFydE1lYXN1cmluZygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bWJlck9mT3BlbnM7IGkrKykgeworCSAgICAgICAgLy9zZXQgYSBzdGF0dXMgdG8gZ28gdG8gdGhlIHRhcmdldHMgdGFiCisJCSAgICBJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5JTkZPLCBJQW50VUlDb25zdGFudHMuUExVR0lOX0lELCBJQW50VUlDb25zdGFudHMuU1RBVFVTX0lOSVRfUlVOX0FOVCwgIiIsIG51bGwpOyAvLyROT04tTkxTLTEkCisJCQlMYXVuY2hDb25maWd1cmF0aW9uc0RpYWxvZyBkaWFsb2c9IG5ldyBMYXVuY2hDb25maWd1cmF0aW9uc0RpYWxvZyhEZWJ1Z1VJUGx1Z2luLmdldFNoZWxsKCksIERlYnVnVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExhdW5jaENvbmZpZ3VyYXRpb25NYW5hZ2VyKCkuZ2V0TGF1bmNoR3JvdXAoZ3JvdXBJZGVudGlmaWVyKSk7CisJCQlkaWFsb2cuc2V0QmxvY2tPbk9wZW4oZmFsc2UpOworCQkJZGlhbG9nLnNldE9wZW5Nb2RlKExhdW5jaENvbmZpZ3VyYXRpb25zRGlhbG9nLkxBVU5DSF9DT05GSUdVUkFUSU9OX0RJQUxPR19PUEVOX09OX1NFTEVDVElPTik7CisJCQlkaWFsb2cuc2V0SW5pdGlhbFNlbGVjdGlvbihzZWxlY3Rpb24pOworCQkJZGlhbG9nLnNldEluaXRpYWxTdGF0dXMoc3RhdHVzKTsKKwkJCQorCQkJZGlhbG9nLm9wZW4oKTsKKyAgICAgICAgICAgIEVkaXRvclRlc3RIZWxwZXIucnVuRXZlbnRRdWV1ZShkaWFsb2cuZ2V0U2hlbGwoKSk7CisJCQlkaWFsb2cuY2xvc2UoKTsKKyAgICAgICAgfQorCQlzdG9wTWVhc3VyaW5nKCk7CisgICAgfQorCisgICAgLyogKG5vbi1KYXZhZG9jKQorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudGVzdC5wZXJmb3JtYW5jZS5QZXJmb3JtYW5jZVRlc3RDYXNlI3NldFVwKCkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgIHN1cGVyLnNldFVwKCk7CisgICAgICAgSVByZWZlcmVuY2VTdG9yZSBkZWJ1Z1ByZWZlcmVuY2VTdG9yZSA9IERlYnVnVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOworICAgICAgIGRlYnVnUHJlZmVyZW5jZVN0b3JlLnNldFZhbHVlKElJbnRlcm5hbERlYnVnVUlDb25zdGFudHMuUFJFRl9GSUxURVJfTEFVTkNIX0NMT1NFRCwgZmFsc2UpOworICAgICAgIGRlYnVnUHJlZmVyZW5jZVN0b3JlLnNldFZhbHVlKElJbnRlcm5hbERlYnVnVUlDb25zdGFudHMuUFJFRl9GSUxURVJfTEFVTkNIX0RFTEVURUQsIGZhbHNlKTsKKyAgICAgICBkZWJ1Z1ByZWZlcmVuY2VTdG9yZS5zZXRWYWx1ZShJSW50ZXJuYWxEZWJ1Z1VJQ29uc3RhbnRzLlBSRUZfRklMVEVSX0xBVU5DSF9UWVBFUywgZmFsc2UpOyAgICAgICAKKyAgICAgICBkZWJ1Z1ByZWZlcmVuY2VTdG9yZS5zZXRWYWx1ZShJSW50ZXJuYWxEZWJ1Z1VJQ29uc3RhbnRzLlBSRUZfRklMVEVSX1dPUktJTkdfU0VUUywgZmFsc2UpOworICAgICAgIEVkaXRvclRlc3RIZWxwZXIucnVuRXZlbnRRdWV1ZSgpOworICAgIH0KKyAgICAKKyAgICAvKiAobm9uLUphdmFkb2MpCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS50ZXN0LnBlcmZvcm1hbmNlLlBlcmZvcm1hbmNlVGVzdENhc2UjdGVhckRvd24oKQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgICAgIElQcmVmZXJlbmNlU3RvcmUgZGVidWdQcmVmZXJlbmNlU3RvcmUgPSBEZWJ1Z1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKKyAgICAgICAgZGVidWdQcmVmZXJlbmNlU3RvcmUuc2V0VG9EZWZhdWx0KElJbnRlcm5hbERlYnVnVUlDb25zdGFudHMuUFJFRl9GSUxURVJfTEFVTkNIX0NMT1NFRCk7CisgICAgICAgIGRlYnVnUHJlZmVyZW5jZVN0b3JlLnNldFRvRGVmYXVsdChJSW50ZXJuYWxEZWJ1Z1VJQ29uc3RhbnRzLlBSRUZfRklMVEVSX0xBVU5DSF9ERUxFVEVEKTsKKyAgICAgICAgZGVidWdQcmVmZXJlbmNlU3RvcmUuc2V0VG9EZWZhdWx0KElJbnRlcm5hbERlYnVnVUlDb25zdGFudHMuUFJFRl9GSUxURVJfTEFVTkNIX1RZUEVTKTsgICAgICAgCisgICAgICAgIGRlYnVnUHJlZmVyZW5jZVN0b3JlLnNldFRvRGVmYXVsdChJSW50ZXJuYWxEZWJ1Z1VJQ29uc3RhbnRzLlBSRUZfRklMVEVSX1dPUktJTkdfU0VUUyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL3BlcmZvcm1hbmNlL1NlcGFyYXRlVk1UZXN0cy5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL3BlcmZvcm1hbmNlL1NlcGFyYXRlVk1UZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2YWY3MWMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBUZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvcGVyZm9ybWFuY2UvU2VwYXJhdGVWTVRlc3RzLmphdmEKQEAgLTAsMCArMSwxMDUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQudGVzdHMudWkucGVyZm9ybWFuY2U7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLkFic3RyYWN0QW50VUlCdWlsZFBlcmZvcm1hbmNlVGVzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmV4dGVybmFsdG9vbHMuaW50ZXJuYWwuSUV4dGVybmFsVG9vbENvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5OworaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLklEZWJ1Z1VJQ29uc3RhbnRzOworCitwdWJsaWMgY2xhc3MgU2VwYXJhdGVWTVRlc3RzIGV4dGVuZHMgQWJzdHJhY3RBbnRVSUJ1aWxkUGVyZm9ybWFuY2VUZXN0IHsKKwkJCisgICAgcHVibGljIFNlcGFyYXRlVk1UZXN0cyhTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisgICAgCisJcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeworCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShTZXBhcmF0ZVZNVGVzdHMuY2xhc3MpOworCX0KKworICAgIC8qKgorICAgICAqIFBlcmZvcm1hbmNlIHRlc3QgZm9yIGxhdW5jaGluZyBBbnQgaW4gYSBzZXBhcmF0ZSB2bS4KKyAgICAgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0QnVpbGQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisgICAgCS8vdGFnQXNTdW1tYXJ5KCJTZXBhcmF0ZSBKUkUgQnVpbGQiLCBEaW1lbnNpb24uRUxBUFNFRF9QUk9DRVNTKTsKKyAgICAJSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlnPSBnZXRMYXVuY2hDb25maWd1cmF0aW9uKCJlY2hvaW5nU2VwVk0iKTsKKyAgICAJLy9wb3NzaWJsZSBmaXJzdCB0aW1lIGhpdCBvZiB0aGUgU1dUIHBpZWNlcyBnZXR0aW5nIHdyaXR0ZW4gZnJvbSB0aGUgSkFSIHRvIHRoZSAKKyAgICAJLy9tZXRhZGF0YSBhcmVhCisgICAgCWxhdW5jaEFuZFRlcm1pbmF0ZShjb25maWcsIDIwMDAwKTsKKyAgICAJZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisgICAgCQlsYXVuY2goY29uZmlnLCAxMCk7CisJCX0KKyAgICAJY29tbWl0TWVhc3VyZW1lbnRzKCk7CisJCWFzc2VydFBlcmZvcm1hbmNlKCk7IAkKKyAgICB9CisJCisJIC8qKgorICAgICAqIFBlcmZvcm1hbmNlIHRlc3QgZm9yIGxhdW5jaGluZyBBbnQgaW4gYSBzZXBhcmF0ZSB2bSB3aXRoIG5vIGNvbnNvbGUgb3V0cHV0LgorICAgICAqLworCXB1YmxpYyB2b2lkIHRlc3RCdWlsZE5vQ29uc29sZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKyAgICAJLy90YWdBc1N1bW1hcnkoIlNlcGFyYXRlIEpSRSBCdWlsZDsgY2FwdHVyZSBvdXRwdXQgb2ZmIiwgRGltZW5zaW9uLkVMQVBTRURfUFJPQ0VTUyk7CisgICAgCUlMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZyA9IGdldExhdW5jaENvbmZpZ3VyYXRpb24oImVjaG9pbmdTZXBWTSIpOworCQlhc3NlcnROb3ROdWxsKCJDb3VsZCBub3QgbG9jYXRlIGxhdW5jaCBjb25maWd1cmF0aW9uIGZvciAiICsgImVjaG9pbmdTZXBWTSIsIGNvbmZpZyk7CisJCUlMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29weT0gY29uZmlnLmdldFdvcmtpbmdDb3B5KCk7CisJCWNvcHkuc2V0QXR0cmlidXRlKElEZWJ1Z1VJQ29uc3RhbnRzLkFUVFJfQ0FQVFVSRV9JTl9DT05TT0xFLCBmYWxzZSk7CisJCWNvcHkuc2V0QXR0cmlidXRlKERlYnVnUGx1Z2luLkFUVFJfQ0FQVFVSRV9PVVRQVVQsIGZhbHNlKTsKKwkJLy9wb3NzaWJsZSBmaXJzdCB0aW1lIGhpdCBvZiB0aGUgU1dUIHBpZWNlcyBnZXR0aW5nIHdyaXR0ZW4gZnJvbSB0aGUgSkFSIHRvIHRoZSAKKyAgICAJLy9tZXRhZGF0YSBhcmVhCisJCWxhdW5jaEFuZFRlcm1pbmF0ZShjb3B5LCAyMDAwMCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgeworICAgIAkJbGF1bmNoKGNvcHksIDEwKTsKKyAgICAgICAgfQorICAgIAljb21taXRNZWFzdXJlbWVudHMoKTsKKwkJYXNzZXJ0UGVyZm9ybWFuY2UoKTsgCQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtYW5jZSB0ZXN0IGZvciBsYXVuY2hpbmcgQW50IGluIGEgc2VwYXJhdGUgdm0gd2l0aCBkZWJ1ZyBpbmZvcm1hdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QnVpbGRNaW51c0RlYnVnKCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworICAgIAkvL3RhZ0FzU3VtbWFyeSgiU2VwYXJhdGUgSlJFIEJ1aWxkOyAtZGVidWciLCBEaW1lbnNpb24uRUxBUFNFRF9QUk9DRVNTKTsKKyAgICAJSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlnID0gZ2V0TGF1bmNoQ29uZmlndXJhdGlvbigiZWNob2luZ1NlcFZNIik7CisJCWFzc2VydE5vdE51bGwoIkNvdWxkIG5vdCBsb2NhdGUgbGF1bmNoIGNvbmZpZ3VyYXRpb24gZm9yICIgKyAiZWNob2luZ1NlcFZNIiwgY29uZmlnKTsKKwkJSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb3B5PSBjb25maWcuZ2V0V29ya2luZ0NvcHkoKTsKKwkJY29weS5zZXRBdHRyaWJ1dGUoSUV4dGVybmFsVG9vbENvbnN0YW50cy5BVFRSX1RPT0xfQVJHVU1FTlRTLCAiLWRlYnVnIik7CisJCS8vcG9zc2libGUgZmlyc3QgdGltZSBoaXQgb2YgdGhlIFNXVCBwaWVjZXMgZ2V0dGluZyB3cml0dGVuIGZyb20gdGhlIEpBUiB0byB0aGUgCisgICAgCS8vbWV0YWRhdGEgYXJlYQorCQlsYXVuY2hBbmRUZXJtaW5hdGUoY29weSwgMjAwMDApOworICAgIAlmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKKyAgICAJCWxhdW5jaChjb3B5LCAxMCk7CisgICAgICAgIH0KKyAgICAJY29tbWl0TWVhc3VyZW1lbnRzKCk7CisJCWFzc2VydFBlcmZvcm1hbmNlKCk7CisJfSAgCQorICAgIAorICAgICAvKioKKyAgICAgKiBQZXJmb3JtYW5jZSB0ZXN0IGZvciBsYXVuY2hpbmcgQW50IGluIGEgc2VwYXJhdGUgdm0gd2l0aCBsb3RzIG9mIGxpbmtzCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEJ1aWxkV2l0aExvdHNPZkxpbmtzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworICAgICAgICAvL3RhZ0FzU3VtbWFyeSgiU2VwYXJhdGUgSlJFIEJ1aWxkOyBsaW5rcyIsIERpbWVuc2lvbi5FTEFQU0VEX1BST0NFU1MpOworICAgICAgICBJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWcgPSBnZXRMYXVuY2hDb25maWd1cmF0aW9uKCJlY2hvUHJvcGVydGllc1NlcFZNIik7CisgICAgICAgIC8vcG9zc2libGUgZmlyc3QgdGltZSBoaXQgb2YgdGhlIFNXVCBwaWVjZXMgZ2V0dGluZyB3cml0dGVuIGZyb20gdGhlIEpBUiB0byB0aGUgCisgICAgICAgIC8vbWV0YWRhdGEgYXJlYQorICAgICAgICBsYXVuY2hBbmRUZXJtaW5hdGUoY29uZmlnLCAyMDAwMCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgeworICAgICAgICAgICAgbGF1bmNoKGNvbmZpZywgMTApOworICAgICAgICB9CisgICAgICAgIGNvbW1pdE1lYXN1cmVtZW50cygpOworICAgICAgICBhc3NlcnRQZXJmb3JtYW5jZSgpOworICAgIH0gICAKK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvYWJvdXQuaHRtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvYWJvdXQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjAyMzMwCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9hYm91dC5odG1sCkBAIC0wLDAgKzEsMjggQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCisgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Cis8dGl0bGU+QWJvdXQ8L3RpdGxlPgorPC9oZWFkPgorPGJvZHkgbGFuZz0iRU4tVVMiPgorPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+CisgCis8cD5KdW5lIDIsIDIwMDY8L3A+CQorPGgzPkxpY2Vuc2U8L2gzPgorCis8cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKK2luZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKK0VjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCithdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgorRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KKworPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKK2JlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKK2FwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKK3Byb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQoraW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKK2FuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+CisKKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL2J1aWxkLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNlMDQyZAotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvYnVpbGQucHJvcGVydGllcwpAQCAtMCwwICsxLDMwIEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyMKKyMgQ29udHJpYnV0b3JzOgorIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitiaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKKyAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKKyAgICAgICAgICAgICAgIHRlc3QueG1sLFwKKyAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAorICAgICAgICAgICAgICAgdGVzdGJ1aWxkZmlsZXMvLFwKKyAgICAgICAgICAgICAgIGxpYi8sXAorICAgICAgICAgICAgICAgbGliLyouamFyLFwKKyAgICAgICAgICAgICAgICouamFyLFwKKyAgICAgICAgICAgICAgIE1FVEEtSU5GLworICAgICAgICAgICAgICAgCitzb3VyY2UuYW50dGVzdHN1aS5qYXIgPSB0ZXN0IHBsdWdpbi8sXAorICAgICAgICAgICAgICAgICAgICAgICAgQW50IEVkaXRvciBUZXN0cy8sXAorICAgICAgICAgICAgICAgICAgICAgICAgQW50IERlYnVnIFRlc3RzLyxcCisgICAgICAgICAgICAgICAgICAgICAgICBFeHRlcm5hbCBUb29scy8sXAorICAgICAgICAgICAgICAgICAgICAgICAgQW50IFRlc3RzLworCQkJCQkJCitzb3VyY2UubGliL2FudFVJVGVzdHNTdXBwb3J0LmphciA9IHRlc3Qgc3VwcG9ydC8KK2phcnMuY29tcGlsZS5vcmRlcj1hbnR0ZXN0c3VpLmphcixsaWIvYW50VUlUZXN0c1N1cHBvcnQuamFyCitvdXRwdXQubGliL2FudFVJVGVzdHNTdXBwb3J0LmphciA9IHRlc3Rfc3VwcG9ydF9iaW4vCitvdXRwdXQuYW50dGVzdHN1aS5qYXIgPSBiaW4vCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL2J1aWxkZmlsZXMvYnVpbGRBbnRUZXN0c1N1cHBvcnRKQVIueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9idWlsZGZpbGVzL2J1aWxkQW50VGVzdHNTdXBwb3J0SkFSLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGU1MTI3Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9idWlsZGZpbGVzL2J1aWxkQW50VGVzdHNTdXBwb3J0SkFSLnhtbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL2ljb25zL2FudC5naWYgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL2ljb25zL2FudC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRhMzY1YwotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvaWNvbnMvYW50LmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9wbHVnaW4ucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTA4ZTA3Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9wbHVnaW4ucHJvcGVydGllcwpAQCAtMCwwICsxLDEzIEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyMgCisjIENvbnRyaWJ1dG9yczoKKyMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitwbHVnaW5OYW1lPUFudCBVSSBUZXN0IFBsdWdpbgorcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3BsdWdpbi54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3BsdWdpbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQxOTYxZgotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvcGx1Z2luLnhtbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3QgcGx1Z2luL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS90ZXN0cGx1Z2luL0Fic3RyYWN0QW50VUlUZXN0LmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3QgcGx1Z2luL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS90ZXN0cGx1Z2luL0Fic3RyYWN0QW50VUlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZjYzgzOQotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdCBwbHVnaW4vb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL3Rlc3RwbHVnaW4vQWJzdHJhY3RBbnRVSVRlc3QuamF2YQpAQCAtMCwwICsxLDQ4MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQudGVzdHMudWkudGVzdHBsdWdpbjsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuQW50VUlQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLklBbnRVSVByZWZlcmVuY2VDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLm1vZGVsLkFudE1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC50ZXN0cy51aS5lZGl0b3Iuc3VwcG9ydC5UZXN0TG9jYXRpb25Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQudGVzdHMudWkuZWRpdG9yLnN1cHBvcnQuVGVzdFByb2JsZW1SZXF1ZXN0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHRlcm5hbHRvb2xzLmludGVybmFsLklFeHRlcm5hbFRvb2xDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z0V2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoOworaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5OworaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaE1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JUHJvY2VzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVR5cGVkUmVnaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNvbnNvbGUuSUh5cGVybGluazsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5jb25zb2xlLkNvbnNvbGVIeXBlcmxpbmtQb3NpdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5jb25zb2xlLklPQ29uc29sZVBhcnRpdGlvbjsKK2ltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CitpbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlcjsKKworLyoqCisgKiBBYnN0cmFjdCBBbnQgVUkgdGVzdCBjbGFzcworICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RBbnRVSVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgICAgCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQU5UX0VESVRPUl9JRD0gIm9yZy5lY2xpcHNlLmFudC51aS5pbnRlcm5hbC5lZGl0b3IuQW50RWRpdG9yIjsKKyAgICAKKyAgICBwcml2YXRlIElEb2N1bWVudCBjdXJyZW50RG9jdW1lbnQ7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvcgorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICovCisgICAgcHVibGljIEFic3RyYWN0QW50VUlUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKyAgICAgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUge0BsaW5rIElGaWxlfSBmb3IgdGhlIGdpdmVuIGJ1aWxkIGZpbGUgbmFtZQorICAgICAqIEBwYXJhbSBidWlsZEZpbGVOYW1lCisgICAgICogQHJldHVybiB0aGUgYXNzb2NpYXRlZCB7QGxpbmsgSUZpbGV9IGZvciB0aGUgZ2l2ZW4gYnVpbGQgZmlsZSBuYW1lCisgICAgICovCisgICAgcHJvdGVjdGVkIElGaWxlIGdldElGaWxlKFN0cmluZyBidWlsZEZpbGVOYW1lKSB7CisgICAgICAgIHJldHVybiBnZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKCJidWlsZGZpbGVzIikuZ2V0RmlsZShidWlsZEZpbGVOYW1lKTsgCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHtAbGluayBGaWxlfSBmb3IgdGhlIGdpdmVuIGJ1aWxkIGZpbGUgbmFtZQorICAgICAqIEBwYXJhbSBidWlsZEZpbGVOYW1lCisgICAgICogQHJldHVybiB0aGUge0BsaW5rIEZpbGV9IGZvciB0aGUgZ2l2ZW4gYnVpbGQgZmlsZSBuYW1lCisgICAgICovCisgICAgcHJvdGVjdGVkIEZpbGUgZ2V0QnVpbGRGaWxlKFN0cmluZyBidWlsZEZpbGVOYW1lKSB7CisgICAgICAgIElGaWxlIGZpbGUgPSBnZXRJRmlsZShidWlsZEZpbGVOYW1lKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiQ291bGQgbm90IGZpbmQgYnVpbGQgZmlsZSBuYW1lZDogIiArIGJ1aWxkRmlsZU5hbWUsIGZpbGUuZXhpc3RzKCkpOworICAgICAgICByZXR1cm4gZmlsZS5nZXRMb2NhdGlvbigpLnRvRmlsZSgpOworICAgIH0KKyAgICAKKyAgICAvKiAobm9uLUphdmFkb2MpCisgICAgICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgCXN1cGVyLnNldFVwKCk7CisgICAgCWFzc2VydFByb2plY3QoKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQXNzZXJ0cyB0aGF0IHRoZSB0ZXN0aW5nIHByb2plY3QgaGFzIGJlZW4gc2V0dXAgaW4gdGhlIHRlc3Qgd29ya3NwYWNlCisgICAgICogQHRocm93cyBFeGNlcHRpb24KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgMy41CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydFByb2plY3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSVByb2plY3QgcHJvID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KFByb2plY3RIZWxwZXIuUFJPSkVDVF9OQU1FKTsKKwkJaWYgKCFwcm8uZXhpc3RzKCkpIHsKKwkJCS8vIGNyZWF0ZSBwcm9qZWN0IGFuZCBpbXBvcnQgYnVpbGQgZmlsZXMgYW5kIHN1cHBvcnQgZmlsZXMKKwkJCUlQcm9qZWN0IHByb2plY3QgPSBQcm9qZWN0SGVscGVyLmNyZWF0ZVByb2plY3QoUHJvamVjdEhlbHBlci5QUk9KRUNUX05BTUUpOworCQkJSUZvbGRlciBmb2xkZXIgPSBQcm9qZWN0SGVscGVyLmFkZEZvbGRlcihwcm9qZWN0LCAiYnVpbGRmaWxlcyIpOworCQkJUHJvamVjdEhlbHBlci5hZGRGb2xkZXIocHJvamVjdCwgImxhdW5jaENvbmZpZ3VyYXRpb25zIik7CisJCQlGaWxlIHJvb3QgPSBBbnRVSVRlc3RQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEZpbGVJblBsdWdpbihQcm9qZWN0SGVscGVyLlRFU1RfQlVJTERGSUxFU19ESVIpOworCQkJUHJvamVjdEhlbHBlci5pbXBvcnRGaWxlc0Zyb21EaXJlY3Rvcnkocm9vdCwgZm9sZGVyLmdldEZ1bGxQYXRoKCksIG51bGwpOworCQkJCisJCQlQcm9qZWN0SGVscGVyLmNyZWF0ZUxhdW5jaENvbmZpZ3VyYXRpb25Gb3JCb3RoKCJlY2hvaW5nIik7CisJCQlQcm9qZWN0SGVscGVyLmNyZWF0ZUxhdW5jaENvbmZpZ3VyYXRpb25Gb3JCb3RoKCIxMDIyODIiKTsKKwkJCVByb2plY3RIZWxwZXIuY3JlYXRlTGF1bmNoQ29uZmlndXJhdGlvbkZvckJvdGgoIjc0ODQwIik7CisgICAgICAgICAgICBQcm9qZWN0SGVscGVyLmNyZWF0ZUxhdW5jaENvbmZpZ3VyYXRpb25Gb3JCb3RoKCJmYWlsaW5nVGFyZ2V0Iik7CisJCQlQcm9qZWN0SGVscGVyLmNyZWF0ZUxhdW5jaENvbmZpZ3VyYXRpb24oImJ1aWxkIik7CisJCQlQcm9qZWN0SGVscGVyLmNyZWF0ZUxhdW5jaENvbmZpZ3VyYXRpb24oImJhZCIpOworCQkJUHJvamVjdEhlbHBlci5jcmVhdGVMYXVuY2hDb25maWd1cmF0aW9uKCJpbXBvcnRSZXF1aXJpbmdVc2VyUHJvcCIpOworICAgICAgICAgICAgUHJvamVjdEhlbHBlci5jcmVhdGVMYXVuY2hDb25maWd1cmF0aW9uRm9yU2VwYXJhdGVWTSgiZWNob1Byb3BlcnRpZXNTZXBWTSIsICJlY2hvUHJvcGVydGllcyIpOworCQkJUHJvamVjdEhlbHBlci5jcmVhdGVMYXVuY2hDb25maWd1cmF0aW9uRm9yU2VwYXJhdGVWTSgiZXh0ZW5zaW9uUG9pbnRTZXBWTSIsIG51bGwpOworCQkJUHJvamVjdEhlbHBlci5jcmVhdGVMYXVuY2hDb25maWd1cmF0aW9uRm9yU2VwYXJhdGVWTSgiZXh0ZW5zaW9uUG9pbnRUYXNrU2VwVk0iLCBudWxsKTsKKwkJCVByb2plY3RIZWxwZXIuY3JlYXRlTGF1bmNoQ29uZmlndXJhdGlvbkZvclNlcGFyYXRlVk0oImV4dGVuc2lvblBvaW50VHlwZVNlcFZNIiwgbnVsbCk7CisJCQlQcm9qZWN0SGVscGVyLmNyZWF0ZUxhdW5jaENvbmZpZ3VyYXRpb25Gb3JTZXBhcmF0ZVZNKCJpbnB1dCIsIG51bGwpOworCQkJUHJvamVjdEhlbHBlci5jcmVhdGVMYXVuY2hDb25maWd1cmF0aW9uRm9yU2VwYXJhdGVWTSgiZW52aXJvbm1lbnRWYXIiLCBudWxsKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgUHJvamVjdEhlbHBlci5jcmVhdGVMYXVuY2hDb25maWd1cmF0aW9uRm9yQm90aCgiYnJlYWtwb2ludHMiKTsKKyAgICAgICAgICAgIFByb2plY3RIZWxwZXIuY3JlYXRlTGF1bmNoQ29uZmlndXJhdGlvbkZvckJvdGgoImRlYnVnQW50Q2FsbCIpOworICAgICAgICAgICAgUHJvamVjdEhlbHBlci5jcmVhdGVMYXVuY2hDb25maWd1cmF0aW9uRm9yQm90aCgiOTYwMjIiKTsKKyAgICAgICAgICAgIFByb2plY3RIZWxwZXIuY3JlYXRlTGF1bmNoQ29uZmlndXJhdGlvbkZvckJvdGgoIm1hY3JvZGVmIik7CisgICAgICAgICAgICBQcm9qZWN0SGVscGVyLmNyZWF0ZUxhdW5jaENvbmZpZ3VyYXRpb25Gb3JCb3RoKCI4NTc2OSIpOworCQkJCisJCQlQcm9qZWN0SGVscGVyLmNyZWF0ZUxhdW5jaENvbmZpZ3VyYXRpb24oImJpZyIsIFByb2plY3RIZWxwZXIuUFJPSkVDVF9OQU1FICsgIi9idWlsZGZpbGVzL3BlcmZvcm1hbmNlL2J1aWxkLnhtbCIpOworCQkJCisJCQkvL2RvIG5vdCBzaG93IHRoZSBBbnQgYnVpbGQgZmFpbGVkIGVycm9yIGRpYWxvZworCQkJQW50VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKElBbnRVSVByZWZlcmVuY2VDb25zdGFudHMuQU5UX0VSUk9SX0RJQUxPRywgZmFsc2UpOworCQl9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgJ0FudFVJVGVzdHMnIHByb2plY3QuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgdGVzdCBwcm9qZWN0CisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgeworICAgICAgICByZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KFByb2plY3RIZWxwZXIuUFJPSkVDVF9OQU1FKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdW5kZXJseWluZyB7QGxpbmsgSURvY3VtZW50fSBmb3IgdGhlIGdpdmVuIGZpbGUgbmFtZQorICAgICAqIEBwYXJhbSBmaWxlTmFtZQorICAgICAqIEByZXR1cm4gdGhlIHVuZGVybHlpbmcge0BsaW5rIElEb2N1bWVudH0gZm9yIHRoZSBnaXZlbiBmaWxlIG5hbWUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgSURvY3VtZW50IGdldERvY3VtZW50KFN0cmluZyBmaWxlTmFtZSkgeworICAgICAgICBGaWxlIGZpbGUgPSBnZXRCdWlsZEZpbGUoZmlsZU5hbWUpOworICAgICAgICBJbnB1dFN0cmVhbSBpbjsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKKyAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBpbml0aWFsQ29udGVudD0gZ2V0U3RyZWFtQ29udGVudEFzU3RyaW5nKGluKTsKKyAgICAgICAgcmV0dXJuIG5ldyBEb2N1bWVudChpbml0aWFsQ29udGVudCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY29udGVudHMgb2YgdGhlIGdpdmVuIHtAbGluayBJbnB1dFN0cmVhbX0gYXMgYSB7QGxpbmsgU3RyaW5nfQorICAgICAqIEBwYXJhbSBpbnB1dFN0cmVhbQorICAgICAqIEByZXR1cm4gdGhlIHtAbGluayBJbnB1dFN0cmVhbX0gYXMgYSB7QGxpbmsgU3RyaW5nfQorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0U3RyZWFtQ29udGVudEFzU3RyaW5nKElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB7CisgICAgICAgIElucHV0U3RyZWFtUmVhZGVyIHJlYWRlcjsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbnB1dFN0cmVhbSwgUmVzb3VyY2VzUGx1Z2luLmdldEVuY29kaW5nKCkpOworICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIEFudFVJUGx1Z2luLmxvZyhlKTsKKyAgICAgICAgICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAorICAgICAgICB9CisgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHRlbXBCdWZmZXJlZFJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihyZWFkZXIpOworCisgICAgICAgIHJldHVybiBnZXRSZWFkZXJDb250ZW50QXNTdHJpbmcodGVtcEJ1ZmZlcmVkUmVhZGVyKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY29udGVudHMgb2YgdGhlIGdpdmVuIHtAbGluayBCdWZmZXJlZFJlYWRlcn0gYXMgYSB7QGxpbmsgU3RyaW5nfQorICAgICAqIEBwYXJhbSBidWZmZXJlZFJlYWRlcgorICAgICAqIEByZXR1cm4gdGhlIGNvbnRlbnRzIG9mIHRoZSBnaXZlbiB7QGxpbmsgQnVmZmVyZWRSZWFkZXJ9IGFzIGEge0BsaW5rIFN0cmluZ30KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFJlYWRlckNvbnRlbnRBc1N0cmluZ05ldyhCdWZmZXJlZFJlYWRlciBidWZmZXJlZFJlYWRlcikgeworICAgICAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgY2hhcltdIHJlYWRCdWZmZXI9IG5ldyBjaGFyWzIwNDhdOworICAgICAgICAgICAgaW50IG49IGJ1ZmZlcmVkUmVhZGVyLnJlYWQocmVhZEJ1ZmZlcik7CisgICAgICAgICAgICB3aGlsZSAobiA+IDApIHsKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHJlYWRCdWZmZXIsIDAsIG4pOworICAgICAgICAgICAgICAgIG49IGJ1ZmZlcmVkUmVhZGVyLnJlYWQocmVhZEJ1ZmZlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIEFudFVJUGx1Z2luLmxvZyhlKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjb250ZW50cyBvZiB0aGUgZ2l2ZW4ge0BsaW5rIEJ1ZmZlcmVkUmVhZGVyfSBhcyBhIHtAbGluayBTdHJpbmd9CisgICAgICogQHBhcmFtIGJ1ZmZlcmVkUmVhZGVyCisgICAgICogQHJldHVybiB0aGUgY29udGVudHMgb2YgdGhlIGdpdmVuIHtAbGluayBCdWZmZXJlZFJlYWRlcn0gYXMgYSB7QGxpbmsgU3RyaW5nfQorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UmVhZGVyQ29udGVudEFzU3RyaW5nKEJ1ZmZlcmVkUmVhZGVyIGJ1ZmZlcmVkUmVhZGVyKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTdHJpbmcgbGluZT0gYnVmZmVyZWRSZWFkZXIucmVhZExpbmUoKTsKKworICAgICAgICAgICAgd2hpbGUobGluZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYocmVzdWx0Lmxlbmd0aCgpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIikpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQobGluZSk7CisgICAgICAgICAgICAgICAgbGluZSA9IGJ1ZmZlcmVkUmVhZGVyLnJlYWRMaW5lKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIEFudFVJUGx1Z2luLmxvZyhlKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworICAgIH0KKyAgICAgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUge0BsaW5rIEFudE1vZGVsfSBmb3IgdGhlIGdpdmVuIGZpbGUgbmFtZQorICAgICAqIEBwYXJhbSBmaWxlTmFtZQorICAgICAqIEByZXR1cm4gdGhlIHtAbGluayBBbnRNb2RlbH0gZm9yIHRoZSBnaXZlbiBmaWxlIG5hbWUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQW50TW9kZWwgZ2V0QW50TW9kZWwoU3RyaW5nIGZpbGVOYW1lKSB7CisgICAgICAgIGN1cnJlbnREb2N1bWVudD0gZ2V0RG9jdW1lbnQoZmlsZU5hbWUpOworICAgICAgICBBbnRNb2RlbCBtb2RlbD0gbmV3IEFudE1vZGVsKGN1cnJlbnREb2N1bWVudCwgbmV3IFRlc3RQcm9ibGVtUmVxdWVzdG9yKCksIG5ldyBUZXN0TG9jYXRpb25Qcm92aWRlcihnZXRCdWlsZEZpbGUoZmlsZU5hbWUpKSk7CisgICAgICAgIG1vZGVsLnJlY29uY2lsZSgpOworICAgICAgICByZXR1cm4gbW9kZWw7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIGN1cnJlbnQge0BsaW5rIElEb2N1bWVudH0gY29udGV4dAorICAgICAqLworICAgIHB1YmxpYyBJRG9jdW1lbnQgZ2V0Q3VycmVudERvY3VtZW50KCkgeworICAgICAgICByZXR1cm4gY3VycmVudERvY3VtZW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIEFsbG93cyB0aGUgY3VycmVudCB7QGxpbmsgSURvY3VtZW50fSBjb250ZXh0IHRvIGJlIHNldC4gVGhpcyBtZXRob2QgYWNjZXB0cyA8Y29kZT5udWxsPC9jb2RlPgorICAgICAqIEBwYXJhbSBjdXJyZW50RG9jdW1lbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDdXJyZW50RG9jdW1lbnQoSURvY3VtZW50IGN1cnJlbnREb2N1bWVudCkgeworICAgICAgICB0aGlzLmN1cnJlbnREb2N1bWVudCA9IGN1cnJlbnREb2N1bWVudDsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogTGF1bmNoZXMgdGhlIEFudCBidWlsZCB3aXRoIHRoZSBidWlsZCBmaWxlIG5hbWUgKG5vIGV4dGVuc2lvbikuCisgICAgICogCisgICAgICogQHBhcmFtIGJ1aWxkRmlsZU5hbWUgdGhlIGFudCBidWlsZCBmaWxlIG5hbWUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBsYXVuY2goU3RyaW5nIGJ1aWxkRmlsZU5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKyAgICAgICAgSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlnID0gZ2V0TGF1bmNoQ29uZmlndXJhdGlvbihidWlsZEZpbGVOYW1lKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiQ291bGQgbm90IGxvY2F0ZSBsYXVuY2ggY29uZmlndXJhdGlvbiBmb3IgIiArIGJ1aWxkRmlsZU5hbWUsIGNvbmZpZyk7CisgICAgICAgIGxhdW5jaEFuZFRlcm1pbmF0ZShjb25maWcsIDIwMDAwKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogTGF1bmNoZXMgdGhlIEFudCBidWlsZCB3aXRoIHRoZSBidWlsZCBmaWxlIG5hbWUgKG5vIGV4dGVuc2lvbikuCisgICAgICogCisgICAgICogQHBhcmFtIGJ1aWxkRmlsZU5hbWUgdGhlIGJ1aWxkIGZpbGUKKyAgICAgKiBAcGFyYW0gYXJndW1lbnRzIHRoZSBhbnQgYXJndW1lbnRzCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgbGF1bmNoKFN0cmluZyBidWlsZEZpbGVOYW1lLCBTdHJpbmcgYXJndW1lbnRzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisgICAgICAgIElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZyA9IGdldExhdW5jaENvbmZpZ3VyYXRpb24oYnVpbGRGaWxlTmFtZSk7CisgICAgICAgIGFzc2VydE5vdE51bGwoIkNvdWxkIG5vdCBsb2NhdGUgbGF1bmNoIGNvbmZpZ3VyYXRpb24gZm9yICIgKyBidWlsZEZpbGVOYW1lLCBjb25maWcpOworICAgICAgICBJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvcHk9IGNvbmZpZy5nZXRXb3JraW5nQ29weSgpOworICAgICAgICBjb3B5LnNldEF0dHJpYnV0ZShJRXh0ZXJuYWxUb29sQ29uc3RhbnRzLkFUVFJfVE9PTF9BUkdVTUVOVFMsIGFyZ3VtZW50cyk7CisgICAgICAgIGxhdW5jaEFuZFRlcm1pbmF0ZShjb3B5LCAyMDAwMCk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICogTGF1bmNoZXMgdGhlIEFudCBidWlsZCBpbiBkZWJ1ZyBvdXRwdXQgbW9kZSB3aXRoIHRoZSBidWlsZCBmaWxlIG5hbWUgKG5vIGV4dGVuc2lvbikuCisgICAgKiAKKyAgICAqIEBwYXJhbSBtYWluVHlwZU5hbWUgdGhlIHByb2dyYW0gdG8gbGF1bmNoCisgICAgKiBAcmV0dXJuIHRocmVhZCBpbiB3aGljaCB0aGUgZmlyc3Qgc3VzcGVuZCBldmVudCBvY2N1cnJlZAorICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgbGF1bmNoV2l0aERlYnVnKFN0cmluZyBidWlsZEZpbGVOYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisgICAgICAgIElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZyA9IGdldExhdW5jaENvbmZpZ3VyYXRpb24oYnVpbGRGaWxlTmFtZSk7CisgICAgICAgIGFzc2VydE5vdE51bGwoIkNvdWxkIG5vdCBsb2NhdGUgbGF1bmNoIGNvbmZpZ3VyYXRpb24gZm9yICIgKyBidWlsZEZpbGVOYW1lLCBjb25maWcpOworICAgICAgICBJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvcHk9IGNvbmZpZy5nZXRXb3JraW5nQ29weSgpOworICAgICAgICBjb3B5LnNldEF0dHJpYnV0ZShJRXh0ZXJuYWxUb29sQ29uc3RhbnRzLkFUVFJfVE9PTF9BUkdVTUVOVFMsICItZGVidWciKTsKKyAgICAgICAgbGF1bmNoQW5kVGVybWluYXRlKGNvcHksIDEwMDAwKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbGF1bmNoIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBnaXZlbiBidWlsZCBmaWxlCisgICAgICogCisgICAgICogQHBhcmFtIGJ1aWxkRmlsZU5hbWUgYnVpbGQgZmlsZSB0byBsYXVuY2gKKyAgICAgKiBAc2VlIFByb2plY3RDcmVhdGlvbkRlY29yYXRvcgorICAgICAqLworICAgIHByb3RlY3RlZCBJTGF1bmNoQ29uZmlndXJhdGlvbiBnZXRMYXVuY2hDb25maWd1cmF0aW9uKFN0cmluZyBidWlsZEZpbGVOYW1lKSB7CisgICAgICAgIElGaWxlIGZpbGUgPSBnZXRKYXZhUHJvamVjdCgpLmdldFByb2plY3QoKS5nZXRGb2xkZXIoImxhdW5jaENvbmZpZ3VyYXRpb25zIikuZ2V0RmlsZShidWlsZEZpbGVOYW1lICsgIi5sYXVuY2giKTsKKyAgICAgICAgSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlnID0gZ2V0TGF1bmNoTWFuYWdlcigpLmdldExhdW5jaENvbmZpZ3VyYXRpb24oZmlsZSk7CisgICAgICAgIGFzc2VydFRydWUoIkNvdWxkIG5vdCBmaW5kIGxhdW5jaCBjb25maWd1cmF0aW9uIGZvciAiICsgYnVpbGRGaWxlTmFtZSwgY29uZmlnLmV4aXN0cygpKTsKKyAgICAgICAgcmV0dXJuIGNvbmZpZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjb250ZW50IG9mIHRoZSBzcGVjaWZpZWQgZmlsZSBhcyA8Y29kZT5TdHJpbmc8L2NvZGU+LgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RmlsZUNvbnRlbnRBc1N0cmluZyhGaWxlIGFGaWxlKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShhRmlsZSk7CisgICAgICAgIElucHV0U3RyZWFtUmVhZGVyIHJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihzdHJlYW0pOworICAgICAgICBCdWZmZXJlZFJlYWRlciBidWZmZXJlZFJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihyZWFkZXIpOworICAgIAorICAgICAgICByZXR1cm4gZ2V0UmVhZGVyQ29udGVudEFzU3RyaW5nKGJ1ZmZlcmVkUmVhZGVyKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQHJldHVybiBhIG5ldyBTQVggcGFyc2VyIGluc3RyYW5jZQorICAgICAqLworICAgIHByb3RlY3RlZCBTQVhQYXJzZXIgZ2V0U0FYUGFyc2VyKCkgeworICAgICAgICBTQVhQYXJzZXIgcGFyc2VyID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHBhcnNlciA9IFNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdTQVhQYXJzZXIoKTsKKyAgICAgICAgfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBBbnRVSVBsdWdpbi5sb2coZSk7CisgICAgICAgIH0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBBbnRVSVBsdWdpbi5sb2coZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBhcnNlcjsKKyAgICB9CisKKyAgICAKKyAgICAvKioKKyAgICAgKiBQYXJzZXMgdGhlIGdpdmVuIGlucHV0IHN0cmVhbSB3aXRoIHRoZSBnaXZlbiBwYXJzZXIgdXNpbmcgdGhlIGdpdmVuIGhhbmRsZXIKKyAgICAgKiBAcGFyYW0gc3RyZWFtCisgICAgICogQHBhcmFtIHBhcnNlcgorICAgICAqIEBwYXJhbSBoYW5kbGVyCisgICAgICogQHBhcmFtIGVkaXRlZEZpbGUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBwYXJzZShJbnB1dFN0cmVhbSBzdHJlYW0sIFNBWFBhcnNlciBwYXJzZXIsIERlZmF1bHRIYW5kbGVyIGhhbmRsZXIsIEZpbGUgZWRpdGVkRmlsZSkgeworICAgICAgICBJbnB1dFNvdXJjZSBpbnB1dFNvdXJjZT0gbmV3IElucHV0U291cmNlKHN0cmVhbSk7CisgICAgICAgIGlmIChlZGl0ZWRGaWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vbmVlZGVkIGZvciByZXNvbHZpbmcgcmVsYXRpdmUgZXh0ZXJuYWwgZW50aXRpZXMKKyAgICAgICAgICAgIGlucHV0U291cmNlLnNldFN5c3RlbUlkKGVkaXRlZEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHBhcnNlci5wYXJzZShpbnB1dFNvdXJjZSwgaGFuZGxlcik7CisgICAgICAgIH0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBsYXVuY2ggbWFuYWdlcgorICAgICAqIAorICAgICAqIEByZXR1cm4gbGF1bmNoIG1hbmFnZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIElMYXVuY2hNYW5hZ2VyIGdldExhdW5jaE1hbmFnZXIoKSB7CisgICAgICAgIHJldHVybiBEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TGF1bmNoTWFuYWdlcigpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSAnQW50VUlUZXN0cycgcHJvamVjdC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSB0ZXN0IHByb2plY3QKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdCgpIHsKKyAgICAgICAgcmV0dXJuIEphdmFDb3JlLmNyZWF0ZSggZ2V0UHJvamVjdCgpKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogTGF1bmNoZXMgdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24gYW5kIHdhaXRzIGZvciB0aGUgdGVybWluYXRlZCBldmVudCBvciB0aGUgbGVuZ3RoIG9mIHRoZSBnaXZlbiB0aW1lb3V0LCAKKyAgICAgKiB3aGljaGV2ZXIgY29tZXMgZmlyc3QgCisgICAgICogQHBhcmFtIGNvbmZpZworICAgICAqIEBwYXJhbSB0aW1lb3V0CisgICAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgbGF1bmNoQW5kVGVybWluYXRlKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZywgaW50IHRpbWVvdXQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKyAgICAgICAgRGVidWdFdmVudFdhaXRlciB3YWl0ZXI9IG5ldyBEZWJ1Z0VsZW1lbnRLaW5kRXZlbnRXYWl0ZXIoRGVidWdFdmVudC5URVJNSU5BVEUsIElQcm9jZXNzLmNsYXNzKTsKKyAgICAgICAgd2FpdGVyLnNldFRpbWVvdXQodGltZW91dCk7CisKKyAgICAgICAgT2JqZWN0IHRlcm1pbmF0ZWUgPSBsYXVuY2hBbmRXYWl0KGNvbmZpZywgd2FpdGVyKTsgICAgICAKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiUHJvZ3JhbSBkaWQgbm90IHRlcm1pbmF0ZS4iLCB0ZXJtaW5hdGVlKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgidGVybWluYXRlZSBpcyBub3QgYW4gSVByb2Nlc3MiLCB0ZXJtaW5hdGVlIGluc3RhbmNlb2YgSVByb2Nlc3MpOworICAgICAgICBJUHJvY2VzcyBwcm9jZXNzID0gKElQcm9jZXNzKSB0ZXJtaW5hdGVlOworICAgICAgICBib29sZWFuIHRlcm1pbmF0ZWQgPSBwcm9jZXNzLmlzVGVybWluYXRlZCgpOworICAgICAgICBhc3NlcnRUcnVlKCJwcm9jZXNzIGlzIG5vdCB0ZXJtaW5hdGVkIiwgdGVybWluYXRlZCk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIExhdW5jaGVzIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uIGFuZCB3YWl0cyBmb3IgYW4gZXZlbnQuIFJldHVybnMgdGhlCisgICAgICogc291cmNlIG9mIHRoZSBldmVudC4gSWYgdGhlIGV2ZW50IGlzIG5vdCByZWNlaXZlZCwgdGhlIGxhdW5jaCBpcworICAgICAqIHRlcm1pbmF0ZWQgYW5kIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAgICogCisgICAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gdGhlIGNvbmZpZ3VyYXRpb24gdG8gbGF1bmNoCisgICAgICogQHBhcmFtIHdhaXRlciB0aGUgZXZlbnQgd2FpdGVyIHRvIHVzZQorICAgICAqIEByZXR1cm4gT2JqZWN0IHRoZSBzb3VyY2Ugb2YgdGhlIGV2ZW50CisgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgdGhlIGV2ZW50IGlzIG5ldmVyIHJlY2VpdmVkLgorICAgICAqLworICAgIHByb3RlY3RlZCBPYmplY3QgbGF1bmNoQW5kV2FpdChJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLCBEZWJ1Z0V2ZW50V2FpdGVyIHdhaXRlcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworICAgICAgICBJTGF1bmNoIGxhdW5jaCA9IGNvbmZpZ3VyYXRpb24ubGF1bmNoKElMYXVuY2hNYW5hZ2VyLlJVTl9NT0RFLCBudWxsKTsKKyAgICAgICAgT2JqZWN0IHN1c3BlbmRlZT0gd2FpdGVyLndhaXRGb3JFdmVudCgpOworICAgICAgICBpZiAoc3VzcGVuZGVlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbGF1bmNoLnRlcm1pbmF0ZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICBmYWlsKCJQcm9ncmFtIGRpZCBub3Qgc3VzcGVuZCwgYW5kIHVuYWJsZSB0byB0ZXJtaW5hdGUgbGF1bmNoLiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGFzc2VydE5vdE51bGwoIlByb2dyYW0gZGlkIG5vdCBzdXNwZW5kLCBsYXVuY2ggdGVybWluYXRlZC4iLCBzdXNwZW5kZWUpOworICAgICAgICBib29sZWFuIHRlcm1pbmF0ZWQgPSBsYXVuY2guaXNUZXJtaW5hdGVkKCk7CisgICAgICAgIGFzc2VydFRydWUoImxhdW5jaCBkaWQgbm90IHRlcm1pbmF0ZSIsIHRlcm1pbmF0ZWQpOworICAgICAgICBpZiAodGVybWluYXRlZCAmJiAhQ29uc29sZUxpbmVUcmFja2VyLmlzQ2xvc2VkKCkpIHsKKyAgICAgICAgICAgIENvbnNvbGVMaW5lVHJhY2tlci53YWl0Rm9yQ29uc29sZSgpOworICAgICAgICB9CisgICAgICAgIGFzc2VydFRydWUoIkNvbnNvbGUgaXMgbm90IGNsb3NlZCIsIENvbnNvbGVMaW5lVHJhY2tlci5pc0Nsb3NlZCgpKTsgCisgICAgICAgIHJldHVybiBzdXNwZW5kZWU7ICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgSUh5cGVybGlua30gYXQgdGhlIGdpdmVuIG9mZnNldCBvbiB0aGUgZ2l2ZW4gZG9jdW1lbnQsCisgICAgICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8ge0BsaW5rIElIeXBlcmxpbmt9IGF0IHRoYXQgb2Zmc2V0IG9uIHRoZSBkb2N1bWVudC4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0CisgICAgICogQHBhcmFtIGRvYworICAgICAqIEByZXR1cm4gdGhlIHtAbGluayBJSHlwZXJsaW5rfSBhdCB0aGUgZ2l2ZW4gb2Zmc2V0IG9uIHRoZSBnaXZlbiBkb2N1bWVudCBvciA8Y29kZT5udWxsPC9jb2RlPgorICAgICAqLworICAgIHByb3RlY3RlZCBJSHlwZXJsaW5rIGdldEh5cGVybGluayhpbnQgb2Zmc2V0LCBJRG9jdW1lbnQgZG9jKSB7CisgICAgICAgIGlmIChvZmZzZXQgPj0gMCAmJiBkb2MgIT0gbnVsbCkgeworICAgICAgICAgICAgUG9zaXRpb25bXSBwb3NpdGlvbnMgPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBwb3NpdGlvbnMgPSBkb2MuZ2V0UG9zaXRpb25zKENvbnNvbGVIeXBlcmxpbmtQb3NpdGlvbi5IWVBFUl9MSU5LX0NBVEVHT1JZKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAvLyBubyBsaW5rcyBoYXZlIGJlZW4gYWRkZWQKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgUG9zaXRpb24gcG9zaXRpb24gPSBwb3NpdGlvbnNbaV07CisgICAgICAgICAgICAgICAgaWYgKG9mZnNldCA+PSBwb3NpdGlvbi5nZXRPZmZzZXQoKSAmJiBvZmZzZXQgPD0gKHBvc2l0aW9uLmdldE9mZnNldCgpICsgcG9zaXRpb24uZ2V0TGVuZ3RoKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoKENvbnNvbGVIeXBlcmxpbmtQb3NpdGlvbilwb3NpdGlvbikuZ2V0SHlwZXJMaW5rKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgQ29sb3J9IGF0IHRoZSBnaXZlbiBvZmZzZXQgb24gdGhlIGdpdmVuIGRvY3VtZW50LAorICAgICAqIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vIHtAbGluayBDb2xvcn0gYXQgdGhhdCBvZmZzZXQgb24gdGhlIGRvY3VtZW50LgorICAgICAqIEBwYXJhbSBvZmZzZXQKKyAgICAgKiBAcGFyYW0gZG9jCisgICAgICogQHJldHVybiB0aGUge0BsaW5rIENvbG9yfSBhdCB0aGUgZ2l2ZW4gb2Zmc2V0IG9uIHRoZSBnaXZlbiBkb2N1bWVudCBvciA8Y29kZT5udWxsPC9jb2RlPgorICAgICAqLworICAgIHByb3RlY3RlZCBDb2xvciBnZXRDb2xvckF0T2Zmc2V0KGludCBvZmZzZXQsIElEb2N1bWVudCBkb2N1bWVudCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGRvY3VtZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIElEb2N1bWVudFBhcnRpdGlvbmVyIHBhcnRpdGlvbmVyID0gZG9jdW1lbnQuZ2V0RG9jdW1lbnRQYXJ0aXRpb25lcigpOworICAgICAgICAgICAgaWYgKHBhcnRpdGlvbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBJVHlwZWRSZWdpb25bXSByZWdpb25zPSBwYXJ0aXRpb25lci5jb21wdXRlUGFydGl0aW9uaW5nKG9mZnNldCwgZG9jdW1lbnQuZ2V0TGluZUluZm9ybWF0aW9uT2ZPZmZzZXQob2Zmc2V0KS5nZXRMZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgaWYgKHJlZ2lvbnMubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgICAgICBJT0NvbnNvbGVQYXJ0aXRpb24gcGFydGl0aW9uID0gKElPQ29uc29sZVBhcnRpdGlvbilyZWdpb25zWzBdOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFydGl0aW9uLmdldENvbG9yKCk7CisgICAgICAgICAgICAgICAgfSAgIAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3QgcGx1Z2luL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS90ZXN0cGx1Z2luL0FudFVJUGVyZm9ybWFuY2VUZXN0cy5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0IHBsdWdpbi9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvdGVzdHBsdWdpbi9BbnRVSVBlcmZvcm1hbmNlVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTlkYTY0Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0IHBsdWdpbi9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvdGVzdHBsdWdpbi9BbnRVSVBlcmZvcm1hbmNlVGVzdHMuamF2YQpAQCAtMCwwICsxLDM4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiAgQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLnRlc3RwbHVnaW47CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLmVkaXRvci5wZXJmb3JtYW5jZS5PcGVuQW50RWRpdG9yVGVzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQudGVzdHMudWkucGVyZm9ybWFuY2UuU2VwYXJhdGVWTVRlc3RzOworCisvKioKKyAqIFBlcmZvcm1hbmNlIFRlc3Qgc3VpdGUgZm9yIHRoZSBBbnQgVUkuCisgKiBBbGwgb2YgdGhlIHRlc3RzIGluIHRoaXMgc3VpdGUgcmVseSBvbiB0aGUgc2V0dXAgdGhhdCBvY2N1cnMgaW4gdGhlIAorICogUHJvamVjdENyZWF0aW9uRGVjb3JhdG9yIHN1aXRlLiBJdCBtdXN0IGFsd2F5cyBydW4gYmVmb3JlIGFueSBvZiB0aGUgb3RoZXIKKyAqIHRlc3Qgc3VpdGVzLgorICovCitwdWJsaWMgY2xhc3MgQW50VUlQZXJmb3JtYW5jZVRlc3RzIGV4dGVuZHMgVGVzdFN1aXRlIHsKKworICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKKworICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgQW50VUlQZXJmb3JtYW5jZVRlc3RzKCk7CisgICAgICAgIHN1aXRlLnNldE5hbWUoIkFudCBVSSBQZXJmb3JtYW5jZSBVbml0IFRlc3RzIik7CisJCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShPcGVuQW50RWRpdG9yVGVzdC5jbGFzcykpOworCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoU2VwYXJhdGVWTVRlc3RzLmNsYXNzKSk7CisJCS8vc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKE5vbkluaXRpYWxUeXBpbmdUZXN0LmNsYXNzKSk7CisJCS8vc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKE9wZW5MYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nVGVzdHMuY2xhc3MpKTsKKyAgICAgICAgcmV0dXJuIHN1aXRlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdCBwbHVnaW4vb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL3Rlc3RwbHVnaW4vQW50VUlUZXN0UGx1Z2luLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3QgcGx1Z2luL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS90ZXN0cGx1Z2luL0FudFVJVGVzdFBsdWdpbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmNDI5NzUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3QgcGx1Z2luL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS90ZXN0cGx1Z2luL0FudFVJVGVzdFBsdWdpbi5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQudGVzdHMudWkudGVzdHBsdWdpbjsKKworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlRGVzY3JpcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47CitpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKKworCitwdWJsaWMgY2xhc3MgQW50VUlUZXN0UGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7CisJCisJcHJpdmF0ZSBzdGF0aWMgQW50VUlUZXN0UGx1Z2luIGRlZmx0OworCQorCXB1YmxpYyBBbnRVSVRlc3RQbHVnaW4oKSB7CisJCXN1cGVyKCk7CisJCWRlZmx0PSB0aGlzOworCX0KKwkKKwlwdWJsaWMgc3RhdGljIEFudFVJVGVzdFBsdWdpbiBnZXREZWZhdWx0KCkgeworCQlyZXR1cm4gZGVmbHQ7CisJfQorCQorCXB1YmxpYyBzdGF0aWMgSVdvcmtzcGFjZSBnZXRXb3Jrc3BhY2UoKSB7CisJCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7CisJfQorCQorCXB1YmxpYyBzdGF0aWMgdm9pZCBlbmFibGVBdXRvYnVpbGQoYm9vbGVhbiBlbmFibGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJLy8gZGlzYWJsZSBhdXRvIGJ1aWxkCisJCUlXb3Jrc3BhY2Ugd29ya3NwYWNlPSBBbnRVSVRlc3RQbHVnaW4uZ2V0V29ya3NwYWNlKCk7CisJCUlXb3Jrc3BhY2VEZXNjcmlwdGlvbiBkZXNjPSB3b3Jrc3BhY2UuZ2V0RGVzY3JpcHRpb24oKTsKKwkJZGVzYy5zZXRBdXRvQnVpbGRpbmcoZW5hYmxlKTsKKwkJd29ya3NwYWNlLnNldERlc2NyaXB0aW9uKGRlc2MpOworCX0KKwkKKwlwdWJsaWMgRmlsZSBnZXRGaWxlSW5QbHVnaW4oSVBhdGggcGF0aCkgeworCQl0cnkgeworCQkJQnVuZGxlIGJ1bmRsZSA9IGdldERlZmF1bHQoKS5nZXRCdW5kbGUoKTsKKwkJCVVSTCBpbnN0YWxsVVJMPSBuZXcgVVJMKGJ1bmRsZS5nZXRFbnRyeSgiLyIpLCBwYXRoLnRvU3RyaW5nKCkpOworCQkJVVJMIGxvY2FsVVJMPSBGaWxlTG9jYXRvci50b0ZpbGVVUkwoaW5zdGFsbFVSTCk7CisJCQlyZXR1cm4gbmV3IEZpbGUobG9jYWxVUkwuZ2V0RmlsZSgpKTsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3QgcGx1Z2luL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS90ZXN0cGx1Z2luL0NvbnNvbGVMaW5lVHJhY2tlci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0IHBsdWdpbi9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvdGVzdHBsdWdpbi9Db25zb2xlTGluZVRyYWNrZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzFjZmM0Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0IHBsdWdpbi9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvdGVzdHBsdWdpbi9Db25zb2xlTGluZVRyYWNrZXIuamF2YQpAQCAtMCwwICsxLDExNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQudGVzdHMudWkudGVzdHBsdWdpbjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5jb25zb2xlLklDb25zb2xlOworaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLmNvbnNvbGUuSUNvbnNvbGVMaW5lVHJhY2tlckV4dGVuc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKKworLyoqCisgKiBTaW1wbGUgY29uc29sZSBsaW5lIHRyYWNrZXIgZXh0ZW5zaW9uIHBvaW50IHRoYXQgY29sbGVjdHMgdGhlIGxpbmVzCisgKiBhcHBlbmRlZCB0byB0aGUgY29uc29sZS4gCisgKi8KK3B1YmxpYyBjbGFzcyBDb25zb2xlTGluZVRyYWNrZXIgaW1wbGVtZW50cyBJQ29uc29sZUxpbmVUcmFja2VyRXh0ZW5zaW9uIHsKKwkKKwlwcml2YXRlIHN0YXRpYyBJQ29uc29sZSBjb25zb2xlOworCXByaXZhdGUgc3RhdGljIExpc3QgbGluZXM9IG5ldyBBcnJheUxpc3QoKTsgCisJCisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjb25zb2xlQ2xvc2VkPSB0cnVlOworCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5jb25zb2xlLklDb25zb2xlTGluZVRyYWNrZXIjZGlzcG9zZSgpCisJICovCisJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLmNvbnNvbGUuSUNvbnNvbGVMaW5lVHJhY2tlciNpbml0KG9yZy5lY2xpcHNlLmRlYnVnLnVpLmNvbnNvbGUuSUNvbnNvbGUpCisJICovCisJcHVibGljIHZvaWQgaW5pdChJQ29uc29sZSBjKSB7CisJICAgIHN5bmNocm9uaXplZChsaW5lcykgeworCSAgICAgICAgQ29uc29sZUxpbmVUcmFja2VyLmNvbnNvbGU9IGM7CisJICAgICAgICBsaW5lcz0gbmV3IEFycmF5TGlzdCgpOworCSAgICAgICAgY29uc29sZUNsb3NlZD0gZmFsc2U7CisJICAgIH0KKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLmNvbnNvbGUuSUNvbnNvbGVMaW5lVHJhY2tlciNsaW5lQXBwZW5kZWQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uKQorCSAqLworCXB1YmxpYyB2b2lkIGxpbmVBcHBlbmRlZChJUmVnaW9uIGxpbmUpIHsKKwkJbGluZXMuYWRkKGxpbmUpOworCX0KKwkKKwlwdWJsaWMgc3RhdGljIGludCBnZXROdW1iZXJPZk1lc3NhZ2VzKCkgeworCQlyZXR1cm4gbGluZXMuc2l6ZSgpOworCX0KKwkKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlKGludCBpbmRleCkgeworCQlpZiAoaW5kZXggPCBsaW5lcy5zaXplKCkpeworCQkJSVJlZ2lvbiBsaW5lUmVnaW9uPSAoSVJlZ2lvbilsaW5lcy5nZXQoaW5kZXgpOworCQkJdHJ5IHsKKwkJCQlyZXR1cm4gY29uc29sZS5nZXREb2N1bWVudCgpLmdldChsaW5lUmVnaW9uLmdldE9mZnNldCgpLCBsaW5lUmVnaW9uLmdldExlbmd0aCgpKTsKKwkJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJcHVibGljIHN0YXRpYyBMaXN0IGdldEFsbE1lc3NhZ2VzKCkgeworCQlMaXN0IGFsbD0gbmV3IEFycmF5TGlzdChsaW5lcy5zaXplKCkpOworCQlmb3IgKGludCBpID0gMDsgaSA8IGxpbmVzLnNpemUoKTsgaSsrKSB7CisJCQlJUmVnaW9uIGxpbmVSZWdpb249IChJUmVnaW9uKWxpbmVzLmdldChpKTsKKwkJCXRyeSB7CisJCQkJYWxsLmFkZChjb25zb2xlLmdldERvY3VtZW50KCkuZ2V0KGxpbmVSZWdpb24uZ2V0T2Zmc2V0KCksIGxpbmVSZWdpb24uZ2V0TGVuZ3RoKCkpKTsKKwkJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gYWxsOworCX0KKwkKKwlwdWJsaWMgc3RhdGljIElEb2N1bWVudCBnZXREb2N1bWVudCgpIHsKKwkJcmV0dXJuIGNvbnNvbGUuZ2V0RG9jdW1lbnQoKTsKKwl9CisJCisJcHVibGljIHN0YXRpYyB2b2lkIHdhaXRGb3JDb25zb2xlKCkgeworCQlzeW5jaHJvbml6ZWQgKGxpbmVzKSB7CisJCQlpZiAoY29uc29sZUNsb3NlZCkgeworCQkJCXJldHVybjsKKwkJCX0KKwkJCXRyeSB7CisJCQkJbGluZXMud2FpdCgyMDAwMCk7CisJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgeworCQkJfQorCQl9CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuY29uc29sZS5JQ29uc29sZUxpbmVUcmFja2VyRXh0ZW5zaW9uI2NvbnNvbGVDbG9zZWQoKQorCSAqLworCXB1YmxpYyB2b2lkIGNvbnNvbGVDbG9zZWQoKSB7CisJCXN5bmNocm9uaXplZCAobGluZXMpIHsKKwkJCWNvbnNvbGVDbG9zZWQ9IHRydWU7CisJCQlsaW5lcy5ub3RpZnlBbGwoKTsKKwkJfQorCX0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDbG9zZWQoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobGluZXMpIHsKKyAgICAgICAgICAgIHJldHVybiBjb25zb2xlQ2xvc2VkOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0IHBsdWdpbi9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvdGVzdHBsdWdpbi9EZWJ1Z0VsZW1lbnRLaW5kRXZlbnRXYWl0ZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdCBwbHVnaW4vb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL3Rlc3RwbHVnaW4vRGVidWdFbGVtZW50S2luZEV2ZW50V2FpdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk0YTMyZgotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdCBwbHVnaW4vb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL3Rlc3RwbHVnaW4vRGVidWdFbGVtZW50S2luZEV2ZW50V2FpdGVyLmphdmEKQEAgLTAsMCArMSwzNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQudGVzdHMudWkudGVzdHBsdWdpbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdFdmVudDsKKworLyoqCisgKiBXYWl0cyBmb3IgYSB0eXBlIG9mIGV2ZW50IG9uIGEga2luZCBvZiBlbGVtZW50LiAgQ29tcGFyZSB0aGlzIHRvIFNwZWNpZmljRGVidWdFbGVtZW50RXZlbnRXYWl0ZXIgd2hpY2ggaXMKKyAqIHVzZWQgdG8gd2FpdCBmb3IgYSB0eXBlIG9mIGV2ZW50IG9uIGEgc3BlY2lmaWMgZGVidWcgZWxlbWVudCBvYmplY3QuCisgKi8KKworcHVibGljIGNsYXNzIERlYnVnRWxlbWVudEtpbmRFdmVudFdhaXRlciBleHRlbmRzIERlYnVnRXZlbnRXYWl0ZXIgeworCQorCXByb3RlY3RlZCBDbGFzcyBmRWxlbWVudENsYXNzOworCQorCXB1YmxpYyBEZWJ1Z0VsZW1lbnRLaW5kRXZlbnRXYWl0ZXIoaW50IGV2ZW50S2luZCwgQ2xhc3MgZWxlbWVudENsYXNzKSB7CisJCXN1cGVyKGV2ZW50S2luZCk7CisJCWZFbGVtZW50Q2xhc3MgPSBlbGVtZW50Q2xhc3M7CisJfQorCQorCXB1YmxpYyBib29sZWFuIGFjY2VwdChEZWJ1Z0V2ZW50IGV2ZW50KSB7CisJCU9iamVjdCBvID0gZXZlbnQuZ2V0U291cmNlKCk7CisJCXJldHVybiBzdXBlci5hY2NlcHQoZXZlbnQpICYmIGZFbGVtZW50Q2xhc3MuaXNJbnN0YW5jZShvKTsKKwl9CisKK30KKworCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3QgcGx1Z2luL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS90ZXN0cGx1Z2luL0RlYnVnRXZlbnRXYWl0ZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdCBwbHVnaW4vb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL3Rlc3RwbHVnaW4vRGVidWdFdmVudFdhaXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjZDJhNjgKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3QgcGx1Z2luL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS90ZXN0cGx1Z2luL0RlYnVnRXZlbnRXYWl0ZXIuamF2YQpAQCAtMCwwICsxLDE3MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQudGVzdHMudWkudGVzdHBsdWdpbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSURlYnVnRXZlbnRTZXRMaXN0ZW5lcjsKKworLyoqCisgKiBUaGUgPGNvZGU+RGVidWdFdmVudFdhaXRlcjwvY29kZT4gaXMKKyAqIHRvIHdhaXQgZm9yIGEgc3BlY2lmaWMga2luZCBvZiBkZWJ1ZyBldmVudC4KKyAqIDxwPgorICogV2hlbiBhIDxjb2RlPkRlYnVnRXZlbnRXYWl0ZXI8L2NvZGU+IGlzIGNyZWF0ZWQsIGl0CisgKiByZWdpc3RlcnMgaXRzZWxmIHdpdGggdGhlIDxjb2RlPkRlYnVnUGx1Z2luPC9jb2RlPiBhcworICogYW4gPGNvZGU+SURlYnVnRXZlbnRTZXRMaXN0ZW5lcjwvY29kZT4uCisgKiA8cD4KKyAqIE5PVEU6IDxjb2RlPkRlYnVnRXZlbnRXYWl0ZXI8L2NvZGU+IG9iamVjdHMgYXJlIGludGVuZGVkIGZvcgorICogb25lIHRpbWUgdXNlIG9ubHkhCisgKi8KK3B1YmxpYyBjbGFzcyBEZWJ1Z0V2ZW50V2FpdGVyIGltcGxlbWVudHMgSURlYnVnRXZlbnRTZXRMaXN0ZW5lciB7CisJLyoqCisJICogVGhlIGtpbmQgb2YgZXZlbnQgdGhlIHdhaXRlciBpcyB3YWl0aW5nIGZvcgorCSAqLworCXByb3RlY3RlZCBpbnQgZkV2ZW50VHlwZTsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRoZSB3YWl0ZXIgd2lsbCB3YWl0IGJlZm9yZSB0aW1pbmcgb3V0LgorCSAqLworCXByb3RlY3RlZCBsb25nIGZUaW1lb3V0OworCisJLyoqCisJICogVGhlIDxjb2RlPklEZWJ1Z01vZGVsTWFuYWdlcjwvY29kZT4gdGhpcyB3YWl0ZXIgaXMgbGlzdGVuaW5nIHRvLgorCSAqLworCXByb3RlY3RlZCBEZWJ1Z1BsdWdpbiBmRGVidWdQbHVnaW47CisKKwkvKioKKwkgKiBUaGUgPGNvZGU+RGVidWdFdmVudDwvY29kZT4gcmVjZWl2ZWQuCisJICovCisJcHJvdGVjdGVkIERlYnVnRXZlbnQgZkV2ZW50OworCQorCS8qKgorCSAqIFRoZSBldmVudCBzZXQgdGhhdCB3YXMgYWNjZXB0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRGVidWdFdmVudFtdIGZFdmVudFNldDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHRpbWVvdXQgdmFsdWUgaWYgbm9uZSBpcyBnaXZlbiAoNTAwMCkuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIERFRkFVTFRfVElNRU9VVD0gNTAwMDsKKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RGVidWdFdmVudFdhaXRlcjwvY29kZT4gd2hpY2gKKwkgKiB3YWl0cyBmb3IgZXZlbnRzIG9mIGEga2luZCA8Y29kZT5ldmVudFR5cGU8L2NvZGU+LgorCSAqIFRoZSB3YWl0IG1ldGhvZCB3aWxsIHdhaXQgdGhlIGRlZmF1bHQgdGltZW91dCB2YWx1ZS4KKwkgKi8KKwlwdWJsaWMgRGVidWdFdmVudFdhaXRlcihpbnQgZXZlbnRUeXBlKSB7CisJCWZEZWJ1Z1BsdWdpbj0gRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpOworCQlmRXZlbnRUeXBlPSBldmVudFR5cGU7CisJCWZUaW1lb3V0PSBERUZBVUxUX1RJTUVPVVQ7CisKKwkJZkRlYnVnUGx1Z2luLmFkZERlYnVnRXZlbnRMaXN0ZW5lcih0aGlzKTsKKwl9CisKKwkvKioKKwkgKiBBbnN3ZXJzIHRydWUgaWYgdGhlIDxjb2RlPkRlYnVnRXZlbnQ8L2NvZGU+IGlzIGFjY2VwdGFibGUuCisJICovCisJcHVibGljIGJvb2xlYW4gYWNjZXB0KERlYnVnRXZlbnQgZXZlbnQpIHsKKwkJcmV0dXJuIGV2ZW50LmdldEtpbmQoKSA9PSBmRXZlbnRUeXBlICYmIGV2ZW50LmdldERldGFpbCgpICE9IERlYnVnRXZlbnQuRVZBTFVBVElPTl9JTVBMSUNJVDsKKwl9CisJLyoqCisJICogQW5zd2VycyB0aGUgZXZlbnQgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGZsYWcuCisJICovCisJcHVibGljIFN0cmluZyBnZXRFdmVudE5hbWUoaW50IGZsYWcpIHsKKwkJc3dpdGNoIChmbGFnKSB7CisJCQljYXNlIERlYnVnRXZlbnQuQ1JFQVRFIDoKKwkJCQlyZXR1cm4gIkNyZWF0ZSI7CisJCQljYXNlIERlYnVnRXZlbnQuVEVSTUlOQVRFIDoKKwkJCQlyZXR1cm4gIlRlcm1pbmF0ZSI7CisJCQljYXNlIERlYnVnRXZlbnQuUkVTVU1FIDoKKwkJCQlyZXR1cm4gIlJlc3VtZSI7CisJCQljYXNlIERlYnVnRXZlbnQuU1VTUEVORCA6CisJCQkJcmV0dXJuICJTdXNwZW5kIjsKKwkJCWRlZmF1bHQgOgorCQkJCXJldHVybiAiVU5LTk9XTiI7CisJCX0KKwl9CisKKwkvKioKKwkgKiBIYW5kbGVzIGRlYnVnIGV2ZW50cy4KKwkgKgorCSAqIEBzZWUgSURlYnVnRXZlbnRMaXN0ZW5lcgorCSAqIEBzZWUgI2FjY2VwdChEZWJ1Z0V2ZW50KQorCSAqLworCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBoYW5kbGVEZWJ1Z0V2ZW50cyhEZWJ1Z0V2ZW50W10gZXZlbnRzKSB7CisJCS8vcHJpbnRSZWNlaXZlZChldmVudHMpOworCQlmb3IgKGludCBpID0gMDsgaSA8IGV2ZW50cy5sZW5ndGg7IGkrKykgeworCQkJaWYgKGFjY2VwdChldmVudHNbaV0pKSB7CisJCQkJZkV2ZW50PSBldmVudHNbaV07CisJCQkJZkV2ZW50U2V0ID0gZXZlbnRzOworCQkJCXVucmVnaXN0ZXIoKTsKKwkJCQlub3RpZnlBbGwoKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBQcmludHMgYSBtZXNzYWdlIGluZGljYXRpbmcgd2hpY2ggZXZlbnQgd2FzIHJlY2VpdmVkLgorCSAqLworCXByb3RlY3RlZCB2b2lkIHByaW50UmVjZWl2ZWQoRGVidWdFdmVudFtdIGV2ZW50cykgeworCQlmb3IgKGludCBpID0gMDsgaSA8IGV2ZW50cy5sZW5ndGg7IGkrKykgeworCQkJU3lzdGVtLm91dC5wcmludGxuKHRoaXMgKyIgZ290ICIgKyBldmVudHNbaV0pOworCQl9CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0IGZvciB0aGlzIGNhbGxiYWNrCisJICovCisJcHVibGljIHZvaWQgc2V0VGltZW91dChsb25nIG1pbGxpc2Vjb25kcykgeworCQlmVGltZW91dD0gbWlsbGlzZWNvbmRzOworCX0KKworCS8qKgorCSAqIFVucmVnaXN0ZXJzIHRoaXMgd2FpdGVyIGFzIGEgbGlzdGVuZXIKKwkgKi8KKwlwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyKCkgeworCQlmRGVidWdQbHVnaW4ucmVtb3ZlRGVidWdFdmVudExpc3RlbmVyKHRoaXMpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHNvdXJjZSBvZiB0aGUgYWNjZXB0ZWQgZXZlbnQsIG9yIDxjb2RlPm51bGw8L2NvZGU+CisJICogaWYgbm8gZXZlbnQgd2FzIGFjY2VwdGVkLgorCSAqLworCXB1YmxpYyBzeW5jaHJvbml6ZWQgT2JqZWN0IHdhaXRGb3JFdmVudCgpIHsKKwkJaWYgKGZFdmVudCA9PSBudWxsKSB7CisJCQl0cnkgeworCQkJCXdhaXQoZlRpbWVvdXQpOworCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKKwkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIkludGVycnVwdGVkIHdhaXRpbmcgZm9yIGV2ZW50Iik7CisJCQl9CisJCX0KKwkJdW5yZWdpc3RlcigpOworCQlpZiAoZkV2ZW50ID09IG51bGwpCisJCQlyZXR1cm4gbnVsbDsKKwkJcmV0dXJuIGZFdmVudC5nZXRTb3VyY2UoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBhY2NlcHRlZCBldmVudCwgaWYgYW55LgorCSAqLworCXB1YmxpYyBEZWJ1Z0V2ZW50IGdldEV2ZW50KCkgeworCQlyZXR1cm4gZkV2ZW50OworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBhY2NlcHRlZCBldmVudCBzZXQsIGlmIGFueS4KKwkgKi8KKwlwdWJsaWMgRGVidWdFdmVudFtdIGdldEV2ZW50U2V0KCkgeworCQlyZXR1cm4gZkV2ZW50U2V0OworCX0JCit9CisKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdCBwbHVnaW4vb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL3Rlc3RwbHVnaW4vUHJvamVjdENyZWF0aW9uRGVjb3JhdG9yLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3QgcGx1Z2luL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS90ZXN0cGx1Z2luL1Byb2plY3RDcmVhdGlvbkRlY29yYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjNGEyOTEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3QgcGx1Z2luL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS90ZXN0cGx1Z2luL1Byb2plY3RDcmVhdGlvbkRlY29yYXRvci5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQudGVzdHMudWkudGVzdHBsdWdpbjsKKworCisKKy8qKgorICogVXRpbGl0eSBjbGFzcworICovCitwdWJsaWMgY2xhc3MgUHJvamVjdENyZWF0aW9uRGVjb3JhdG9yIHsKKwkKKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGZnSXNKMlNFMTVDb21wYXRpYmxlID0gZmFsc2UgOworCQorCXN0YXRpYyB7CisJCVN0cmluZyB2ZXJzaW9uID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLnNwZWNpZmljYXRpb24udmVyc2lvbiIpOworCQlpZiAodmVyc2lvbiAhPSBudWxsKSB7CisJCQlTdHJpbmdbXSBudW1zID0gdmVyc2lvbi5zcGxpdCgiXFwuIik7CisJCQlpZiAobnVtcy5sZW5ndGggPT0gMikgeworCQkJCXRyeSB7CisJCQkJCWludCBtYWpvciA9IEludGVnZXIucGFyc2VJbnQobnVtc1swXSk7CisJCQkJCWludCBtaW5vciA9IEludGVnZXIucGFyc2VJbnQobnVtc1sxXSk7CisJCQkJCWlmIChtYWpvciA+PSAxKSB7CisJCQkJCQlpZiAobWlub3IgPj0gNSkgeworCQkJCQkJCWZnSXNKMlNFMTVDb21wYXRpYmxlID0gdHJ1ZTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisJCQkJfQorCQkJfQorCQl9CisJfTsKKwkKKwkvKioKKwkgKiBAcmV0dXJuIGlmIHRoZSBzeXN0ZW0gcHJvcGVydHkgImphdmEuc3BlY2lmaWNhdGlvbi52ZXJzaW9uIiBpcyAxLjUgb3IgZ3JlYXRlcgorCSAqLworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0oyU0UxNUNvbXBhdGlibGUoKSB7CisJCXJldHVybiBmZ0lzSjJTRTE1Q29tcGF0aWJsZTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3QgcGx1Z2luL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS90ZXN0cGx1Z2luL1Byb2plY3RIZWxwZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdCBwbHVnaW4vb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL3Rlc3RwbHVnaW4vUHJvamVjdEhlbHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmMGM3YmEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3QgcGx1Z2luL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS90ZXN0cGx1Z2luL1Byb2plY3RIZWxwZXIuamF2YQpAQCAtMCwwICsxLDIyOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQudGVzdHMudWkudGVzdHBsdWdpbjsKKworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5JQW50VUlDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy5JQW50TGF1bmNoQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXh0ZXJuYWx0b29scy5pbnRlcm5hbC5JRXh0ZXJuYWxUb29sQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3REZXNjcmlwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvblR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5OworaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLklEZWJ1Z1VJQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVZNSW5zdGFsbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkphdmFSdW50aW1lOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuSU92ZXJ3cml0ZVF1ZXJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLndpemFyZHMuZGF0YXRyYW5zZmVyLkZpbGVTeXN0ZW1TdHJ1Y3R1cmVQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS53aXphcmRzLmRhdGF0cmFuc2Zlci5JSW1wb3J0U3RydWN0dXJlUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkud2l6YXJkcy5kYXRhdHJhbnNmZXIuSW1wb3J0T3BlcmF0aW9uOworCisvKioKKyAqIEhlbHBlciBtZXRob2RzIHRvIHNldCB1cCBhbiBJUHJvamVjdC4KKyAqLworcHVibGljIGNsYXNzIFByb2plY3RIZWxwZXIgeworCQorCXB1YmxpYyBzdGF0aWMgZmluYWwgSVBhdGggVEVTVF9CVUlMREZJTEVTX0RJUj0gbmV3IFBhdGgoInRlc3RidWlsZGZpbGVzIik7CisJcHVibGljIHN0YXRpYyBmaW5hbCBJUGF0aCBURVNUX1JFU09VUkNFU19ESVI9IG5ldyBQYXRoKCJ0ZXN0cmVzb3VyY2VzIik7CQorCXB1YmxpYyBzdGF0aWMgZmluYWwgSVBhdGggVEVTVF9MSUJfRElSPSBuZXcgUGF0aCgidGVzdGxpYiIpOworCQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfTkFNRT0gIkFudCBVSSBUZXN0cyI7CisJCisJLyoqCisJICogQ3JlYXRlcyBhIElQcm9qZWN0LgorCSAqLwkKKwlwdWJsaWMgc3RhdGljIElQcm9qZWN0IGNyZWF0ZVByb2plY3QoU3RyaW5nIHByb2plY3ROYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCUlXb3Jrc3BhY2VSb290IHJvb3Q9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7CisJCUlQcm9qZWN0IHByb2plY3Q9IHJvb3QuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7CisJCWlmICghcHJvamVjdC5leGlzdHMoKSkgeworCQkJcHJvamVjdC5jcmVhdGUobnVsbCk7CisJCX0gZWxzZSB7CisJCQlwcm9qZWN0LnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUsIG51bGwpOworCQl9CisJCQorCQlpZiAoIXByb2plY3QuaXNPcGVuKCkpIHsKKwkJCXByb2plY3Qub3BlbihudWxsKTsKKwkJfQorCQkKKwkJaWYgKCFwcm9qZWN0Lmhhc05hdHVyZShKYXZhQ29yZS5OQVRVUkVfSUQpKSB7CisJCQlhZGROYXR1cmVUb1Byb2plY3QocHJvamVjdCwgSmF2YUNvcmUuTkFUVVJFX0lELCBudWxsKTsKKwkJfQorCQkKKwkJcmV0dXJuIHByb2plY3Q7CisJfQorCQorCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkTmF0dXJlVG9Qcm9qZWN0KElQcm9qZWN0IHByb2osIFN0cmluZyBuYXR1cmVJZCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBwcm9qLmdldERlc2NyaXB0aW9uKCk7CisJCVN0cmluZ1tdIHByZXZOYXR1cmVzPSBkZXNjcmlwdGlvbi5nZXROYXR1cmVJZHMoKTsKKwkJU3RyaW5nW10gbmV3TmF0dXJlcz0gbmV3IFN0cmluZ1twcmV2TmF0dXJlcy5sZW5ndGggKyAxXTsKKwkJU3lzdGVtLmFycmF5Y29weShwcmV2TmF0dXJlcywgMCwgbmV3TmF0dXJlcywgMCwgcHJldk5hdHVyZXMubGVuZ3RoKTsKKwkJbmV3TmF0dXJlc1twcmV2TmF0dXJlcy5sZW5ndGhdPSBuYXR1cmVJZDsKKwkJZGVzY3JpcHRpb24uc2V0TmF0dXJlSWRzKG5ld05hdHVyZXMpOworCQlwcm9qLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uLCBtb25pdG9yKTsKKwl9CisJCisJLyoqCisJICogUmVtb3ZlcyBhbiBJUHJvamVjdC4KKwkgKi8JCQorCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWxldGUoSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlwcm9qZWN0LmRlbGV0ZSh0cnVlLCB0cnVlLCBudWxsKTsKKwl9CisKKworCS8qKgorCSAqIEFkZHMgYSBmb2xkZXIgdG8gYW4gSVByb2plY3QuCisJICovCQkKKwlwdWJsaWMgc3RhdGljIElGb2xkZXIgYWRkRm9sZGVyKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBjb250YWluZXJOYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCQorCQkJSUZvbGRlciBmb2xkZXI9IHByb2plY3QuZ2V0Rm9sZGVyKGNvbnRhaW5lck5hbWUpOworCQkJaWYgKCFmb2xkZXIuZXhpc3RzKCkpIHsKKwkJCQlmb2xkZXIuY3JlYXRlKGZhbHNlLCB0cnVlLCBudWxsKTsKKwkJCX0KKwkJCisJCXJldHVybiBmb2xkZXI7CisJCQorCX0KKwkKKwlwdWJsaWMgc3RhdGljIHZvaWQgaW1wb3J0RmlsZXNGcm9tRGlyZWN0b3J5KEZpbGUgcm9vdERpciwgSVBhdGggZGVzdFBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsJCQorCQlJSW1wb3J0U3RydWN0dXJlUHJvdmlkZXIgc3RydWN0dXJlUHJvdmlkZXIgPSBGaWxlU3lzdGVtU3RydWN0dXJlUHJvdmlkZXIuSU5TVEFOQ0U7CisJCUxpc3QgZmlsZXMgPSBuZXcgQXJyYXlMaXN0KDEwMCk7CisJCWFkZEZpbGVzKHJvb3REaXIsIGZpbGVzKTsKKwkJdHJ5IHsKKwkJCUltcG9ydE9wZXJhdGlvbiBvcD0gbmV3IEltcG9ydE9wZXJhdGlvbihkZXN0UGF0aCwgcm9vdERpciwgc3RydWN0dXJlUHJvdmlkZXIsIG5ldyBJbXBvcnRPdmVyd3JpdGVRdWVyeSgpLCBmaWxlcyk7CisJCQlvcC5zZXRDcmVhdGVDb250YWluZXJTdHJ1Y3R1cmUoZmFsc2UpOworCQkJb3AucnVuKG1vbml0b3IpOworCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisJCQkvLyBzaG91bGQgbm90IGhhcHBlbgorCQl9CisJfQkKKwkKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZEZpbGVzKEZpbGUgZGlyLCBMaXN0IGNvbGxlY3Rpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUZpbGVbXSBmaWxlcyA9IGRpci5saXN0RmlsZXMoKTsKKwkJTGlzdCBzdWJEaXJzID0gbmV3IEFycmF5TGlzdCgyKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgeworCQkJaWYgKGZpbGVzW2ldLmlzRmlsZSgpKSB7CisJCQkJY29sbGVjdGlvbi5hZGQoZmlsZXNbaV0pOworCQkJfSBlbHNlIGlmIChmaWxlc1tpXS5pc0RpcmVjdG9yeSgpKSB7CisJCQkJc3ViRGlycy5hZGQoZmlsZXNbaV0pOworCQkJfQorCQl9CisJCUl0ZXJhdG9yIGl0ZXIgPSBzdWJEaXJzLml0ZXJhdG9yKCk7CisJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgeworCQkJRmlsZSBzdWJEaXIgPSAoRmlsZSlpdGVyLm5leHQoKTsKKwkJCWFkZEZpbGVzKHN1YkRpciwgY29sbGVjdGlvbik7CisJCX0KKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSW1wb3J0T3ZlcndyaXRlUXVlcnkgaW1wbGVtZW50cyBJT3ZlcndyaXRlUXVlcnkgeworCQlwdWJsaWMgU3RyaW5nIHF1ZXJ5T3ZlcndyaXRlKFN0cmluZyBmaWxlKSB7CisJCQlyZXR1cm4gQUxMOworCQl9CQorCX0KKworCS8qKgorCSAqIENyZWF0ZXMgdHdvIGxhdW5jaCBjb25maWd1cmF0aW9ucyBvbmUgc3RhbmRhcmQgb25lIGFuZCBvbmUgZm9yIGEgc2VwYXJhdGUgVk0KKwkgKiBAcGFyYW0gbGF1bmNoQ29uZmlnTmFtZQorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICogCisJICogQHNpbmNlIDMuNQorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVMYXVuY2hDb25maWd1cmF0aW9uRm9yQm90aChTdHJpbmcgbGF1bmNoQ29uZmlnTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVByb2plY3RIZWxwZXIuY3JlYXRlTGF1bmNoQ29uZmlndXJhdGlvbihsYXVuY2hDb25maWdOYW1lKTsKKwkJUHJvamVjdEhlbHBlci5jcmVhdGVMYXVuY2hDb25maWd1cmF0aW9uRm9yU2VwYXJhdGVWTShsYXVuY2hDb25maWdOYW1lICsgIlNlcFZNIiwgbGF1bmNoQ29uZmlnTmFtZSk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIHNoYXJlZCBsYXVuY2ggY29uZmlndXJhdGlvbiBmb3IgbGF1bmNoaW5nIEFudCBpbiBhIHNlcGFyYXRlIFZNIHdpdGggdGhlIGdpdmVuCisJICogbmFtZS4KKwkgKiAKKwkgKiBAc2luY2UgMy41CisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZUxhdW5jaENvbmZpZ3VyYXRpb25Gb3JTZXBhcmF0ZVZNKFN0cmluZyBsYXVuY2hDb25maWdOYW1lLCBTdHJpbmcgYnVpbGRGaWxlTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBiZiA9IGJ1aWxkRmlsZU5hbWU7CisJCUlMYXVuY2hDb25maWd1cmF0aW9uVHlwZSB0eXBlID0gQWJzdHJhY3RBbnRVSVRlc3QuZ2V0TGF1bmNoTWFuYWdlcigpLmdldExhdW5jaENvbmZpZ3VyYXRpb25UeXBlKElBbnRMYXVuY2hDb25zdGFudHMuSURfQU5UX0xBVU5DSF9DT05GSUdVUkFUSU9OX1RZUEUpOworCQlJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZyA9IHR5cGUubmV3SW5zdGFuY2UoQWJzdHJhY3RBbnRVSVRlc3QuZ2V0SmF2YVByb2plY3QoKS5nZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKCJsYXVuY2hDb25maWd1cmF0aW9ucyIpLCBsYXVuY2hDb25maWdOYW1lKTsKKwkJCisJCWNvbmZpZy5zZXRBdHRyaWJ1dGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfTUFJTl9UWVBFX05BTUUsICJvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwubGF1bmNoaW5nLnJlbW90ZS5JbnRlcm5hbEFudFJ1bm5lciIpOyAvLyROT04tTkxTLTEkCisJCWNvbmZpZy5zZXRBdHRyaWJ1dGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfQ0xBU1NQQVRIX1BST1ZJREVSLCAib3JnLmVjbGlwc2UuYW50LnVpLkFudENsYXNzcGF0aFByb3ZpZGVyIik7IC8vJE5PTi1OTFMtMSQKKwkJY29uZmlnLnNldEF0dHJpYnV0ZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9QUk9KRUNUX05BTUUsIEFic3RyYWN0QW50VUlUZXN0LmdldEphdmFQcm9qZWN0KCkuZ2V0RWxlbWVudE5hbWUoKSk7CisJCWlmIChiZiA9PSBudWxsKSB7CisJCQliZj0gbGF1bmNoQ29uZmlnTmFtZTsKKwkJfSAKKwkJY29uZmlnLnNldEF0dHJpYnV0ZShJRXh0ZXJuYWxUb29sQ29uc3RhbnRzLkFUVFJfTE9DQVRJT04sICIke3dvcmtzcGFjZV9sb2M6LyIgKyBQUk9KRUNUX05BTUUgKyAiL2J1aWxkZmlsZXMvIiArIGJmICsgIi54bWx9Iik7CisJCQorCQljb25maWcuc2V0QXR0cmlidXRlKElEZWJ1Z1VJQ29uc3RhbnRzLkFUVFJfTEFVTkNIX0lOX0JBQ0tHUk9VTkQsIHRydWUpOworCQljb25maWcuc2V0QXR0cmlidXRlKERlYnVnUGx1Z2luLkFUVFJfUFJPQ0VTU19GQUNUT1JZX0lELCBJQW50VUlDb25zdGFudHMuUkVNT1RFX0FOVF9QUk9DRVNTX0ZBQ1RPUllfSUQpOworCQkgCisJCVByb2plY3RIZWxwZXIuc2V0Vk0oY29uZmlnKTsKKwkJCQkKKwkJY29uZmlnLmRvU2F2ZSgpOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHdvcmtzcGFjZSBkZWZhdWx0IFZNIG9uIHRoZSBnaXZlbiB3b3JraW5nIGNvcHkKKwkgKiBAcGFyYW0gY29uZmlnCisJICogCisJICogQHNpbmNlIDMuNQorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRWTShJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZykgeworCQlJVk1JbnN0YWxsIHZtID0gSmF2YVJ1bnRpbWUuZ2V0RGVmYXVsdFZNSW5zdGFsbCgpOworCQlTdHJpbmcgdm1OYW1lPSB2bS5nZXROYW1lKCk7CisJCVN0cmluZyB2bVR5cGVJRD0gdm0uZ2V0Vk1JbnN0YWxsVHlwZSgpLmdldElkKCk7CQkJCisJCWNvbmZpZy5zZXRBdHRyaWJ1dGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfVk1fSU5TVEFMTF9OQU1FLCB2bU5hbWUpOworCQljb25maWcuc2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1ZNX0lOU1RBTExfVFlQRSwgdm1UeXBlSUQpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBzaGFyZWQgbGF1bmNoIGNvbmZpZ3VyYXRpb24gZm9yIGxhdW5jaGluZyBBbnQgaW4gYSBzZXBhcmF0ZSBWTSB3aXRoIHRoZSBnaXZlbgorCSAqIG5hbWUuCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZUxhdW5jaENvbmZpZ3VyYXRpb24oU3RyaW5nIGxhdW5jaENvbmZpZ05hbWUpIHRocm93cyBFeGNlcHRpb24geworCSAgICBQcm9qZWN0SGVscGVyLmNyZWF0ZUxhdW5jaENvbmZpZ3VyYXRpb24obGF1bmNoQ29uZmlnTmFtZSwgUFJPSkVDVF9OQU1FICsgIi9idWlsZGZpbGVzLyIgKyBsYXVuY2hDb25maWdOYW1lICsgIi54bWwiKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbGF1bmNoIGNvbmZpZ3VyYXRpb24gd2l0aCB0aGUgZ2l2ZW4gbmFtZSBpbiB0aGUgZ2l2ZW4gbG9jYXRpb24KKwkgKiBAcGFyYW0gbGF1bmNoQ29uZmlnTmFtZQorCSAqIEBwYXJhbSBwYXRoCisJICogQHJldHVybiB0aGUgaGFuZGxlIHRvIHRoZSBuZXcgbGF1bmNoIGNvbmZpZ3VyYXRpb24KKwkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgc3RhdGljIElMYXVuY2hDb25maWd1cmF0aW9uIGNyZWF0ZUxhdW5jaENvbmZpZ3VyYXRpb24oU3RyaW5nIGxhdW5jaENvbmZpZ05hbWUsIFN0cmluZyBwYXRoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJICAgIElMYXVuY2hDb25maWd1cmF0aW9uVHlwZSB0eXBlID0gQWJzdHJhY3RBbnRVSVRlc3QuZ2V0TGF1bmNoTWFuYWdlcigpLmdldExhdW5jaENvbmZpZ3VyYXRpb25UeXBlKElBbnRMYXVuY2hDb25zdGFudHMuSURfQU5UX0xBVU5DSF9DT05GSUdVUkFUSU9OX1RZUEUpOworCQlJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZyA9IHR5cGUubmV3SW5zdGFuY2UoQWJzdHJhY3RBbnRVSVRlc3QuZ2V0SmF2YVByb2plY3QoKS5nZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKCJsYXVuY2hDb25maWd1cmF0aW9ucyIpLCBsYXVuY2hDb25maWdOYW1lKTsKKwkKKwkJY29uZmlnLnNldEF0dHJpYnV0ZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9QUk9KRUNUX05BTUUsIEFic3RyYWN0QW50VUlUZXN0LmdldEphdmFQcm9qZWN0KCkuZ2V0RWxlbWVudE5hbWUoKSk7CisJCWNvbmZpZy5zZXRBdHRyaWJ1dGUoSUV4dGVybmFsVG9vbENvbnN0YW50cy5BVFRSX0xPQ0FUSU9OLCAiJHt3b3Jrc3BhY2VfbG9jOi8iICsgcGF0aCArICJ9Iik7CisJCWNvbmZpZy5zZXRBdHRyaWJ1dGUoSURlYnVnVUlDb25zdGFudHMuQVRUUl9MQVVOQ0hfSU5fQkFDS0dST1VORCwgdHJ1ZSk7CisJCQkKKwkJY29uZmlnLmRvU2F2ZSgpOworCQlyZXR1cm4gY29uZmlnOworCX0JCQkKK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdCBzdXBwb3J0L29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9zdXBwb3J0L2lucHV0SGFuZGxlcnMvVGVzdFNXVElucHV0SGFuZGxlci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0IHN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL3N1cHBvcnQvaW5wdXRIYW5kbGVycy9UZXN0U1dUSW5wdXRIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUzODhjNAotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdCBzdXBwb3J0L29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9zdXBwb3J0L2lucHV0SGFuZGxlcnMvVGVzdFNXVElucHV0SGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQudGVzdHMudWkuc3VwcG9ydC5pbnB1dEhhbmRsZXJzOworCisKK3B1YmxpYyBjbGFzcyBUZXN0U1dUSW5wdXRIYW5kbGVyIHsvL2V4dGVuZHMgU1dUSW5wdXRIYW5kbGVyIHsKKwkKKyAgIAorLy8gICAgLyogKG5vbi1KYXZhZG9jKQorLy8gICAgICogQHNlZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuYW50c3VwcG9ydC5pbnB1dGhhbmRsZXIuU1dUSW5wdXRIYW5kbGVyI29wZW4oamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgYm9vbGVhbltdKQorLy8gICAgICovCisvLyAgICBwcm90ZWN0ZWQgdm9pZCBvcGVuKFN0cmluZyB0aXRsZSwgU3RyaW5nIHByb21wdCwgYm9vbGVhbltdIHJlc3VsdCkgeworLy8gICAgICAgIGZSZXF1ZXN0LnNldElucHV0KCJUZXN0U1dUSW5wdXRIYW5kbGVyIik7CisvLyAgICAgICAgcmVzdWx0WzBdPSB0cnVlOworLy8gICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0IHN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL3N1cHBvcnQvdGFza3MvQW50VGVzdFRhc2suamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdCBzdXBwb3J0L29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9zdXBwb3J0L3Rhc2tzL0FudFRlc3RUYXNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU4YjBkYwotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdCBzdXBwb3J0L29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9zdXBwb3J0L3Rhc2tzL0FudFRlc3RUYXNrLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQudGVzdHMudWkuc3VwcG9ydC50YXNrczsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRWNobzsKKworCitwdWJsaWMgY2xhc3MgQW50VGVzdFRhc2sgZXh0ZW5kcyBUYXNrIHsKKwkKKwlwdWJsaWMgQW50VGVzdFRhc2soKSB7CisJCXN1cGVyKCk7CisJfQorCQorCS8qKgorCSAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzayNleGVjdXRlKCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKwkJRWNobyBlY2hvPSBuZXcgRWNobygpOworCQllY2hvLnNldFByb2plY3QoZ2V0UHJvamVjdCgpKTsKKwkJZWNoby5zZXRNZXNzYWdlKCJUZXN0aW5nIEFudCBpbiBFY2xpcHNlIHdpdGggYSBjdXN0b20gdGFzayIpOworCQllY2hvLmV4ZWN1dGUoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3Qgc3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvc3VwcG9ydC90YXNrcy9BbnRUZXN0VGFzazIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdCBzdXBwb3J0L29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9zdXBwb3J0L3Rhc2tzL0FudFRlc3RUYXNrMi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyODYxYzEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3Qgc3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvc3VwcG9ydC90YXNrcy9BbnRUZXN0VGFzazIuamF2YQpAQCAtMCwwICsxLDU1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC50ZXN0cy51aS5zdXBwb3J0LnRhc2tzOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5FY2hvOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkVudW1lcmF0ZWRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVmZXJlbmNlOworCisKK3B1YmxpYyBjbGFzcyBBbnRUZXN0VGFzazIgZXh0ZW5kcyBUYXNrIHsKKwkKKwlTdHJpbmcgZk1lc3NhZ2U9ICJEZWZhdWx0IjsKKwlSZWZlcmVuY2UgZlJlZj0gbnVsbDsKKwkKKwlwdWJsaWMgQW50VGVzdFRhc2syKCkgeworCQlzdXBlcigpOworCX0KKwkKKwkvKioKKwkgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2sjZXhlY3V0ZSgpCisJICovCisJcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisJCUVjaG8gZWNobz0gbmV3IEVjaG8oKTsKKwkJZWNoby5zZXRQcm9qZWN0KGdldFByb2plY3QoKSk7CisJCWVjaG8uc2V0TWVzc2FnZSgiVGVzdGluZyBBbnQgaW4gRWNsaXBzZSB3aXRoIGEgY3VzdG9tIHRhc2syOiAiICsgZk1lc3NhZ2UpOworCQllY2hvLmV4ZWN1dGUoKTsKKwl9CisJCisgICAgcHVibGljIHZvaWQgc2V0TWVzc2FnZShDb29sIGF0dHIpIHsKKyAgICAgICAgZk1lc3NhZ2UgPSBhdHRyLmdldFZhbHVlKCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHNldFJlZmVyZW5jZShSZWZlcmVuY2UgcmVmKSB7CisgICAgICAgIGZSZWY9IHJlZjsKKyAgICB9CisJCisJLyoqCisgICAgICogRW51bWVyYXRlZCBhdHRyaWJ1dGUgd2l0aCB0aGUgdmFsdWVzICJjb29sIiwgImNoaWxsaW4iIGFuZCAiYXdlc29tZSIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDb29sIGV4dGVuZHMgRW51bWVyYXRlZEF0dHJpYnV0ZSB7CisgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWx1ZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHsiY29vbCIsICJjaGlsbGluIiwgImF3ZXNvbWUifTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdCBzdXBwb3J0L29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9zdXBwb3J0L3Rhc2tzL05lc3RFbGVtZW50VGFzay5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0IHN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL3N1cHBvcnQvdGFza3MvTmVzdEVsZW1lbnRUYXNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZhNzExOQotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdCBzdXBwb3J0L29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9zdXBwb3J0L3Rhc2tzL05lc3RFbGVtZW50VGFzay5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQudGVzdHMudWkuc3VwcG9ydC50YXNrczsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRWNobzsKKworcHVibGljIGNsYXNzIE5lc3RFbGVtZW50VGFzayBleHRlbmRzIFRhc2sgeyAgCisJCisJU3RyaW5nIG1lc3NhZ2U9ICJiYXIiOworCU5lc3RlZEVsZW1lbnQgZTsKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE5lc3RlZEVsZW1lbnR7CisgICAgCUJvb2xlYW4gd29ya3M9IEJvb2xlYW4uRkFMU0U7CisgICAgCXB1YmxpYyBOZXN0ZWRFbGVtZW50KCkgewkKKyAgICAJfQorICAgIAkKKyAgICAgICAgcHVibGljIHZvaWQgc2V0V29ya3MoQm9vbGVhbiBib29sZWFuVmFsdWUpIHsKKyAgICAgICAgCXdvcmtzPSBib29sZWFuVmFsdWU7CisgICAgICAgIH0KKworCQlwdWJsaWMgYm9vbGVhbiB3b3JrcygpIHsKKwkJCXJldHVybiB3b3Jrcy5ib29sZWFuVmFsdWUoKTsKKwkJfQorICAgIH0KKyAgICBwdWJsaWMgdm9pZCBhZGROZXN0ZWRFbGVtZW50KE5lc3RlZEVsZW1lbnQgbmVzdGVkRWxlbWVudCkgeworICAgIAllPSBuZXN0ZWRFbGVtZW50OworICAgIH0KKyAgIAorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2sjZXhlY3V0ZSgpCisJICovCisJcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisJCUVjaG8gZWNobz0gbmV3IEVjaG8oKTsKKwkJZWNoby5zZXRQcm9qZWN0KGdldFByb2plY3QoKSk7CisJCWlmIChlLndvcmtzKCkpIHsKKwkJCWVjaG8uc2V0TWVzc2FnZShtZXNzYWdlKTsKKwkJfSBlbHNlIHsKKwkJCWVjaG8uc2V0TWVzc2FnZSgiYWNrIik7CisJCX0KKwkJZWNoby5leGVjdXRlKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0IHN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL3N1cHBvcnQvdHlwZXMvQW50VGVzdFBhdGguamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdCBzdXBwb3J0L29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9zdXBwb3J0L3R5cGVzL0FudFRlc3RQYXRoLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNkNDI4YwotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdCBzdXBwb3J0L29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9zdXBwb3J0L3R5cGVzL0FudFRlc3RQYXRoLmphdmEKQEAgLTAsMCArMSwzMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQudGVzdHMudWkuc3VwcG9ydC50eXBlczsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aDsKKworcHVibGljIGNsYXNzIEFudFRlc3RQYXRoIGV4dGVuZHMgUGF0aCB7CisJCisJU3RyaW5nIG1lc3NhZ2U7CisJCisJcHVibGljIEFudFRlc3RQYXRoKFByb2plY3QgcHJvamVjdCkgeworCQlzdXBlcihwcm9qZWN0KTsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0TWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgeworCQl0aGlzLm1lc3NhZ2U9IG1lc3NhZ2U7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKKwkJcmV0dXJuIG1lc3NhZ2U7CisJfQorCQorfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0LnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZmMTU2MwotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdC54bWwKQEAgLTAsMCArMSw3MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+CisKKzxwcm9qZWN0IG5hbWU9InRlc3RzdWl0ZSIgZGVmYXVsdD0icnVuIiBiYXNlZGlyPSIuIj4KKyAgPCEtLSBzZXRzIHRoZSBwcm9wZXJ0aWVzIGVjbGlwc2UtaG9tZSwgYW5kIGxpYnJhcnktZmlsZSAtLT4KKyAgPCEtLSBUaGUgcHJvcGVydHkgJHtlY2xpcHNlLWhvbWV9IHNob3VsZCBiZSBwYXNzZWQgaW50byB0aGlzIHNjcmlwdCAtLT4KKyAgPCEtLSBTZXQgYSBtZWFuaW5nZnVsIGRlZmF1bHQgdmFsdWUgZm9yIHdoZW4gaXQgaXMgbm90LiAtLT4KKyAgPHByb3BlcnR5IG5hbWU9ImVjbGlwc2UtaG9tZSIgdmFsdWU9IiR7YmFzZWRpcn1cLi5cLi4iLz4KKzxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLmFudC50ZXN0cy51aSIvPgorICA8cHJvcGVydHkgbmFtZT0ibGlicmFyeS1maWxlIgorICAgICAgICAgICAgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9wbHVnaW5zL29yZy5lY2xpcHNlLnRlc3QvbGlicmFyeS54bWwiLz4KKyAKKyAgPCEtLSBUaGlzIHRhcmdldCBob2xkcyBhbGwgaW5pdGlhbGl6YXRpb24gY29kZSB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgZm9yIC0tPgorICA8IS0tIGFsbCB0ZXN0cyB0aGF0IGFyZSB0byBiZSBydW4uIEluaXRpYWxpemF0aW9uIGZvciBpbmRpdmlkdWFsIHRlc3RzIC0tPgorICA8IS0tIHNob3VsZCBiZSBkb25lIHdpdGhpbiB0aGUgYm9keSBvZiB0aGUgc3VpdGUgdGFyZ2V0LiAtLT4KKyAgPHRhcmdldCBuYW1lPSJpbml0Ij4KKyAgICA8dHN0YW1wLz4KKyAgICA8ZGVsZXRlPgorICAgICAgPGZpbGVzZXQgZGlyPSIke2VjbGlwc2UtaG9tZX0iIGluY2x1ZGVzPSJvcmcqLnhtbCIvPgorICAgIDwvZGVsZXRlPgorICA8L3RhcmdldD4KKworICA8IS0tIFRoaXMgdGFyZ2V0IGRlZmluZXMgdGhlIHRlc3RzIHRoYXQgbmVlZCB0byBiZSBydW4uIC0tPgorICA8dGFyZ2V0IG5hbWU9InN1aXRlIj4KKyAgICA8cHJvcGVydHkgbmFtZT0iamR0LWZvbGRlciIgCisgICAgICAgICAgICAgIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vamR0X2ZvbGRlciIvPgorICAgIDxkZWxldGUgZGlyPSIke2pkdC1mb2xkZXJ9IiBxdWlldD0idHJ1ZSIvPgorICAgIDxhbnQgdGFyZ2V0PSJ1aS10ZXN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkYXRhLWRpciIgdmFsdWU9IiR7amR0LWZvbGRlcn0iLz4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9Ii8+CisgICAgICA8cHJvcGVydHkgbmFtZT0iY2xhc3NuYW1lIiAKKyAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLnRlc3RwbHVnaW4uQW50VUlUZXN0cyIvPgorICAgIDwvYW50PgorICA8L3RhcmdldD4KKwkKKyA8IS0tIFRoaXMgdGFyZ2V0IGRlZmluZXMgdGhlIHBlcmZvcm1hbmNlIHRlc3RzIHRoYXQgbmVlZCB0byBiZSBydW4uIC0tPgorCSAgPHRhcmdldCBuYW1lPSJwZXJmc3VpdGUiPgorCSAgICA8cHJvcGVydHkgbmFtZT0iamR0LWZvbGRlciIgCisJICAgICAgICAgICAgICB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L2pkdF9mb2xkZXIiLz4KKwkgICAgPGRlbGV0ZSBkaXI9IiR7amR0LWZvbGRlcn0iIHF1aWV0PSJ0cnVlIi8+CisJICAgIDxhbnQgdGFyZ2V0PSJ1aS10ZXN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KKwkgICAgICA8cHJvcGVydHkgbmFtZT0iZGF0YS1kaXIiIHZhbHVlPSIke2pkdC1mb2xkZXJ9Ii8+CisJICAgICAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0iLz4KKwkgICAgICA8cHJvcGVydHkgbmFtZT0iY2xhc3NuYW1lIiAKKwkgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmFudC50ZXN0cy51aS50ZXN0cGx1Z2luLkFudFVJUGVyZm9ybWFuY2VUZXN0cyIvPgorCSAgICA8L2FudD4KKwkgIDwvdGFyZ2V0PgorCisgIDwhLS0gVGhpcyB0YXJnZXQgaG9sZHMgY29kZSB0byBjbGVhbnVwIHRoZSB0ZXN0aW5nIGVudmlyb25tZW50IGFmdGVyIC0tPgorICA8IS0tIGFmdGVyIGFsbCBvZiB0aGUgdGVzdHMgaGF2ZSBiZWVuIHJ1bi4gWW91IGNhbiB1c2UgdGhpcyB0YXJnZXQgdG8gLS0+CisgIDwhLS0gZGVsZXRlIHRlbXBvcmFyeSBmaWxlcyB0aGF0IGhhdmUgYmVlbiBjcmVhdGVkLiAtLT4KKyAgPHRhcmdldCBuYW1lPSJjbGVhbnVwIj4KKyAgPC90YXJnZXQ+CisKKyAgPCEtLSBUaGlzIHRhcmdldCBydW5zIHRoZSB0ZXN0IHN1aXRlLiBBbnkgYWN0aW9ucyB0aGF0IG5lZWQgdG8gaGFwcGVuIC0tPgorICA8IS0tIGFmdGVyIGFsbCB0aGUgdGVzdHMgaGF2ZSBiZWVuIHJ1biBzaG91bGQgZ28gaGVyZS4gLS0+CisgIDx0YXJnZXQgbmFtZT0icnVuIiBkZXBlbmRzPSJpbml0LHN1aXRlLGNsZWFudXAiPgorICAgIDxhbnQgdGFyZ2V0PSJjb2xsZWN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJpbmNsdWRlcyIgdmFsdWU9Im9yZyoueG1sIi8+CisgICAgICA8cHJvcGVydHkgbmFtZT0ib3V0cHV0LWZpbGUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfS54bWwiLz4KKyAgICA8L2FudD4KKyAgPC90YXJnZXQ+CisKKyAgPCEtLVRoaXMgdGFyZ2V0IHJ1bnMgdGhlIHBlcmZvcm1hbmNlIHRlc3Qgc3VpdGVzIGFuZCBjb2xsZWN0cyByZXN1bHRzLi0tPgorICA8dGFyZ2V0IG5hbWU9InBlcmZvcm1hbmNlIiBkZXBlbmRzPSJpbml0LCBwZXJmc3VpdGUsIGNsZWFudXAiPgorICAJPGFudCB0YXJnZXQ9ImNvbGxlY3QiIGFudGZpbGU9IiR7bGlicmFyeS1maWxlfSIgZGlyPSIke2VjbGlwc2UtaG9tZX0iPgorCQk8cHJvcGVydHkgbmFtZT0iaW5jbHVkZXMiIHZhbHVlPSJvcmcqLnhtbCIvPgorCQk8cHJvcGVydHkgbmFtZT0ib3V0cHV0LWZpbGUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfS54bWwiLz4KKwk8L2FudD4KKyAgPC90YXJnZXQ+CisJCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzLzEwMjI4Mi54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzLzEwMjI4Mi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJlMTNlZQotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvMTAyMjgyLnhtbApAQCAtMCwwICsxLDIzIEBACis8IS0tCisgICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAgICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAgICAKKyAgICAgQ29udHJpYnV0b3JzOgorICAgICAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgLS0+Cis8cHJvamVjdCBuYW1lPSJwcm9qZWN0IiBkZWZhdWx0PSJkZWZhdWx0Ij4KKyAgICA8dGFyZ2V0IG5hbWU9ImRlZmF1bHQiID4KKyAgICAgICAgPGFudGNhbGwgdGFyZ2V0PSJhbnRDYWxsZWQiPjwvYW50Y2FsbD4KKyAgICA8L3RhcmdldD4KKwk8dGFyZ2V0IG5hbWU9ImFudENhbGxlZCI+CisJCTxqYXZhYyBzcmNkaXI9InNyYyIKKwkgICAgICAgICBkZXN0ZGlyPSJkc3QiCisJICAgICAgICAgY2xhc3NwYXRoPSJqYXJmaWxlIgorCSAgICAgICAgIGRlYnVnPSJvbiIKKwkJLz4KKwk8L3RhcmdldD4KKzwvcHJvamVjdD4KKwpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy83NDg0MC54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzLzc0ODQwLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjE0NDNmCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy83NDg0MC54bWwKQEAgLTAsMCArMSw1IEBACis8cHJvamVjdCBuYW1lPSJwcm9qZWN0IiBkZWZhdWx0PSJkZWZhdWx0Ij4KKwk8dGFyZ2V0IG5hbWU9ImRlZmF1bHQiPgorCQk8ZWNobz4ke3BsYXRmb3JtLmxvY2F0aW9ufTwvZWNobz4KKwk8L3RhcmdldD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvODU3NjkueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy84NTc2OS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI2MjIyNgotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvODU3NjkueG1sCkBAIC0wLDAgKzEsMjAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorCis8cHJvamVjdCBuYW1lPSJkZWJ1Z0FudENhbGwiCisgICAgICAgICBkZWZhdWx0PSJkZWZhdWx0Ij4KKwkKKwk8dGFyZ2V0IG5hbWU9ImRlZmF1bHQiPgorCQk8YW50Y2FsbCB0YXJnZXQ9ImNhbGwiPgorCQk8L2FudGNhbGw+CisJCTxlY2hvPmRlZmF1bHQ8L2VjaG8+CisJPC90YXJnZXQ+CisKKwk8dGFyZ2V0IG5hbWU9ImNhbGwiIGRlcGVuZHM9InByZS1jYWxsIj4KKwkJPGVjaG8+Y2FsbDE8L2VjaG8+CisJCTxzbGVlcCBtaWxsaXNlY29uZHM9IjE1MDAiIC8+CisJPC90YXJnZXQ+CisJCisJPHRhcmdldCBuYW1lPSJwcmUtY2FsbCI+CisJCTxlY2hvPnByZS1jYWxsMTwvZWNobz4KKwk8L3RhcmdldD4KKzwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzLzg5MTE1LnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvODkxMTUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0MTY0OGMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzLzg5MTE1LnhtbApAQCAtMCwwICsxLDkgQEAKKzxwcm9qZWN0IG5hbWU9ICJkZWZhdWx0IiBkZWZhdWx0PSJkZWZhdWx0Ij4KKyAgICA8dGFyZ2V0IGRlc2NyaXB0aW9uPSJkZXBlbmRzIiBuYW1lPSJkZWZhdWx0IiBkZXBlbmRzPSJkZXBlbmRzIj4KKyAgICAgICAgCisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImRlcGVuZHMiPgorICAgIDwvdGFyZ2V0PgorCis8L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy84OTkwMS54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzLzg5OTAxLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzM0NjdjCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy84OTkwMS54bWwKQEAgLTAsMCArMSwxMiBAQAorPHByb2plY3QgbmFtZT0icHJvamVjdCIgZGVmYXVsdD0iZGVmYXVsdCI+CisJCisgICAgPHRhcmdldCBuYW1lPSJkZWZhdWx0IiBkZXBlbmRzPSJ0ZXN0IiBkZXNjcmlwdGlvbj0iLS0+IGRlc2NyaXB0aW9uIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InRlc3QiIHZhbHVlPSJ5byIvPgorICAgIDwvdGFyZ2V0PgorCisJPHRhcmdldCBuYW1lPSJ0ZXN0Ij4KKwkJPGVjaG8+JHt0ZXN0fTwvZWNobz4KKyAgICA8L3RhcmdldD4KKworPC9wcm9qZWN0PgorCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzLzk2MDIyLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvOTYwMjIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNDRhYTgKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzLzk2MDIyLnhtbApAQCAtMCwwICsxLDMxIEBACis8cHJvamVjdCBuYW1lPSJkZWJ1Z0FudENhbGwiCisgICAgICAgICBkZWZhdWx0PSJkZWZhdWx0Ij4KKwkKKwk8cHJvcGVydHkgbmFtZT0iaGV5IiB2YWx1ZT0idGhlcmUiLz4KKyAKKwk8dGFyZ2V0IG5hbWU9ImRlZmF1bHQiPgorCQk8YW50Y2FsbCB0YXJnZXQ9IjEiPgorCQk8L2FudGNhbGw+CisJCTxlY2hvPmRlZmF1bHQ8L2VjaG8+CisJPC90YXJnZXQ+CisKKwk8dGFyZ2V0IG5hbWU9IjEiIGRlcGVuZHM9IjIiPgorCQk8ZWNobz4xPC9lY2hvPgorCQk8c2xlZXAgbWlsbGlzZWNvbmRzPSI1IiAvPgorCTwvdGFyZ2V0PgorCQorCTx0YXJnZXQgbmFtZT0iMiI+CisJCTxhbnRjYWxsIHRhcmdldD0iMyI+CisJCQkJPC9hbnRjYWxsPgorCQk8ZWNobz4yPC9lY2hvPgorCTwvdGFyZ2V0PgorCQorCTx0YXJnZXQgbmFtZT0iMyIgZGVwZW5kcz0iNCI+CisJCTxlY2hvPjM8L2VjaG8+CisJCTxzbGVlcCBtaWxsaXNlY29uZHM9IjUiIC8+CisJPC90YXJnZXQ+CisJCisJPHRhcmdldCBuYW1lPSI0Ij4KKwkJPGVjaG8+NDwvZWNobz4KKwk8L3RhcmdldD4KKzwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzLzk4ODUzLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvOTg4NTMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5YzhmYmQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzLzk4ODUzLnhtbApAQCAtMCwwICsxLDI3IEBACis8cHJvamVjdCBuYW1lPSJ0ZXN0IgorICAgICAgICAgZGVmYXVsdD0icnVuLW1hY3JvIgorICAgICAgICAgeG1sbnM6eHl6PSJodHRwOi8veHl6Ij4KKworCTxtYWNyb2RlZiBuYW1lPSJlY2hvLW1hY3JvIgorCSAgICAgICAgICB1cmk9Imh0dHA6Ly94eXoiPgorCQk8YXR0cmlidXRlIG5hbWU9InN0ciIgLz4KKwkJPGVsZW1lbnQgbmFtZT0ic29tZS10YXNrcyIgLz4KKwkJPHNlcXVlbnRpYWw+CisJCQk8ZWNobz5Ae3N0cn08L2VjaG8+CisJCQk8c29tZS10YXNrcy8+CisJCTwvc2VxdWVudGlhbD4KKwk8L21hY3JvZGVmPgorCisJPHRhcmdldCBuYW1lPSJydW4tbWFjcm8iPgorCQkKKwkJPHh5ejplY2hvLW1hY3JvIHN0cj0icyI+CisJCQkKKwkJPC94eXo6ZWNoby1tYWNybz4KKwk8L3RhcmdldD4KKwkKKwk8cHJlc2V0ZGVmIG5hbWU9Im15LWphdmFjIiB1cmk9Imh0dHA6Ly94eXoiPgorCQk8amF2YWMgZm9yaz0ieWVzIj48L2phdmFjPgorCTwvcHJlc2V0ZGVmPgorCQorCQorPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvYW50VUlUZXN0c1N1cHBvcnQuamFyIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9hbnRVSVRlc3RzU3VwcG9ydC5qYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU0ZWVjOAotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvYW50VUlUZXN0c1N1cHBvcnQuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvYmFkLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvYmFkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWM0ZDUxCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9iYWQueG1sCkBAIC0wLDAgKzEsMTQgQEAKKzxwcm9qZWN0IG5hbWU9IkVjaG9pbmciIGRlZmF1bHQ9ImVjaG8xIiBiYXNlZGlyPSIuLiI+CisKKwk8dGFyZ2V0IG5hbWU9ImVjaG8xIj4KKwkJPGVjaG8gbWVzc2dlPSJlY2hvMSIvPgorCTwvdGFyZ2V0PgorCQorCTx0YXJnZXQgbmFtZT0iZWNobzIiPgorCQk8ZWNobyBtZXNzYWdlPSJlY2hvMiIvPgorCTwvdGFyZ2V0PgorCQorCTx0YXJnZXQgbmFtZT0iZWNobzMiIGRlc2NyaXB0aW9uPSAiQW4gZWNobzMhIj4KKwkJPGVjaG8gbWVzc2FnZT0iZWNobzMiLz4KKwk8L3RhcmdldD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvYmFkcHJvamVjdC54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2JhZHByb2plY3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwYTc5YTgKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2JhZHByb2plY3QueG1sCkBAIC0wLDAgKzEsNCBAQAorPHByb2plY3QgbmRlZmF1bHQ9Im1ha2UiPgorCTx0YXJnZXQgbmFtZT0ibWFrZSI+CisJPC90YXJnZXQ+Cis8L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9icmVha3BvaW50cy54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2JyZWFrcG9pbnRzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDZjMzgyCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9icmVha3BvaW50cy54bWwKQEAgLTAsMCArMSwzNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+CisKKzxwcm9qZWN0IG5hbWU9ImRlYnVnRWNobyIgZGVmYXVsdD0iZGVmYXVsdCI+CisJPHRhcmdldCBuYW1lPSJkZWZhdWx0Ij4KKwkJPGVjaG8+MTwvZWNobz4KKwkJPGVjaG8+MjwvZWNobz4KKwkJPHByb3BlcnR5IG5hbWU9IlpaWiIgdmFsdWU9IlpaWiIgLz4KKwkJPHNsZWVwIG1pbGxpc2Vjb25kcz0iNSIgLz4KKwkJPGVjaG8+MzwvZWNobz4KKwkJPGVjaG8+NDwvZWNobz4KKwkJPGVjaG8+NTwvZWNobz4KKwkJPGVjaG8+NjwvZWNobz4KKwkJPGVjaG8+NzwvZWNobz4KKwkJPGVjaG8+ODwvZWNobz4KKwkJPGVjaG8+OTwvZWNobz4KKwkJPCEtLTxzbGVlcCBtaWxsaXNlY29uZHM9IjIwMCIgLz4tLT4KKwk8L3RhcmdldD4KKworCTx0YXJnZXQgbmFtZT0iZW50cnkxIiBkZXBlbmRzPSJkZWZhdWx0Ij4KKwkJPGVjaG8+MTwvZWNobz4KKwkJPGVjaG8+MjwvZWNobz4KKwk8L3RhcmdldD4KKworCTx0YXJnZXQgbmFtZT0iZW50cnkyIiBkZXBlbmRzPSJkZWZhdWx0Ij4KKwkJPGVjaG8+MTwvZWNobz4KKwkJPGVjaG8+MjwvZWNobz4KKwk8L3RhcmdldD4KKwkKKwk8dGFyZ2V0IG5hbWU9InByb3BlcnRpZXMiPgorCQk8cHJvcGVydHkgbmFtZT0iQUFBIiB2YWx1ZT0iYWFhIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iQkJCIiB2YWx1ZT0iYmJiIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iQ0NDIiB2YWx1ZT0iY2NjIiAvPgorCQk8ZWNobz5hbGwgZG9uZTwvZWNobz4KKwk8L3RhcmdldD4KKwkKKwk8cHJvcGVydHkgbmFtZT0ibmFtZSIgdmFsdWU9InZhbHVlIi8+Cis8L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9idWlsZC5DcDEyNTEueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9idWlsZC5DcDEyNTEueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmZjk1MzkKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2J1aWxkLkNwMTI1MS54bWwKQEAgLTAsMCArMSwxMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0id2luZG93cy0xMjUxIj8+Cis8cHJvamVjdCBuYW1lPSJ0ZXN0IiBkZWZhdWx0PSJpbml0IiBiYXNlZGlyPSIuIj4KKworICAgICA8dGFyZ2V0IG5hbWU9ImluaXQiPgorICAgICAgICAgIDwhLS0gZGlzcGxheXMgSGVsbG8gaW4gUnVzc2lhbiAtLT4KKyAgICAgICAgICA8ZWNobyBtZXNzYWdlPSLH5PDg4vHy4vPp8uUiLz4KKyAgICAgPC90YXJnZXQ+CisKKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9idWlsZC5VVEY4LnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvYnVpbGQuVVRGOC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhlNDczMwotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvYnVpbGQuVVRGOC54bWwKQEAgLTAsMCArMSw5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHByb2plY3QgbmFtZT0idGVzdCIgZGVmYXVsdD0iaW5pdCIgYmFzZWRpcj0iLiI+CisKKyAgICAgPHRhcmdldCBuYW1lPSJpbml0Ij4KKyAgICAgICAgICA8IS0tIGRpc3BsYXlzIEhlbGxvIGluIFJ1c3NpYW4gLS0+CisgICAgICAgICAgPGVjaG8gbWVzc2FnZT0i0JfQtNGA0LDQstE/0YLQstGD0LnRgtC1Ii8+CisgICAgIDwvdGFyZ2V0PgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2J1aWxkLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvYnVpbGQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjZGQ2NGQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2J1aWxkLnhtbApAQCAtMCwwICsxLDE0IEBACis8cHJvamVjdCBuYW1lPSJFY2hvaW5nIiBkZWZhdWx0PSJlY2hvMSIgYmFzZWRpcj0iLi4iPgorCisJPHRhcmdldCBuYW1lPSJlY2hvMSI+CisJCTxlY2hvIG1lc3NhZ2U9ImVjaG8xIi8+CisJPC90YXJnZXQ+CisJCisJPHRhcmdldCBuYW1lPSJlY2hvMiI+CisJCTxlY2hvIG1lc3NhZ2U9ImVjaG8yIi8+CisJPC90YXJnZXQ+CisJCisJPHRhcmdldCBuYW1lPSJlY2hvMyIgZGVzY3JpcHRpb249ICJBbiBlY2hvMyEiPgorCQk8ZWNobyBtZXNzYWdlPSJlY2hvMyIvPgorCTwvdGFyZ2V0PgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9idWlsZHRlc3QxLnByb3BlcnRpZXMgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2J1aWxkdGVzdDEucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2MzZWYxCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9idWlsZHRlc3QxLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxMyBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisjIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjIAorIyBDb250cmlidXRvcnM6CisjICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3Byb3AxPXZhbDEKK3Byb3AyID0gdmFsMgoraW1wb3J0RmlsZU5hbWU9IHRvQmVJbXBvcnRlZC54bWwKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvYnVpbGR0ZXN0MS54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2J1aWxkdGVzdDEueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllMDQyZmYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2J1aWxkdGVzdDEueG1sCkBAIC0wLDAgKzEsMjEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdCBuYW1lPSJ0ZXN0cHJvamVjdCIgYmFzZWRpcj0iLiIgZGVmYXVsdD0ibWFpbiI+CisJPHByb3BlcnR5IG5hbWU9InByb3BEIiB2YWx1ZT0idmFsRCIgLz4KKyAgICA8cHJvcGVydHkgZmlsZT0iYnVpbGR0ZXN0MS5wcm9wZXJ0aWVzIiAvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJwcm9wViIgdmFsdWU9InZhbFYiIC8+CisgICAgPHRhcmdldCBuYW1lPSJtYWluIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InByb3BlcnR5X2luX3RhcmdldCIgdmFsdWU9InZhbCIvPgorICAgICAgICA8ZWNobz4kezwvZWNobz4KKyAgICA8L3RhcmdldD4KKwk8dGFyZ2V0IG5hbWU9InByZXRlc3QiPjwvdGFyZ2V0PgorCTx0YXJnZXQgbmFtZT0idGVzdCIgZGVwZW5kcz0iIj4KKwkJPGVjaG8+ZGVwZW5kczwvZWNobz4KKwk8L3RhcmdldD4KKwk8dGFyZ2V0IG5hbWU9InRlc3QyIj48L3RhcmdldD4KKwk8dGFyZ2V0IG5hbWU9InRlc3QzIj48L3RhcmdldD4KKwk8dGFyZ2V0IG5hbWU9InRlc3RJZiIgaWY9IiI+PC90YXJnZXQ+CisJPHRhcmdldCBuYW1lPSJ0ZXN0VW5sZXNzIiB1bmxlc3M9InByb3AiPjwvdGFyZ2V0PgorCTx0YXJnZXQgbmFtZT0idGVzdE1vcmVEZXBlbmRzIiBkZXBlbmRzPSJwcmV0ZXN0LCAiPgorCQk8ZWNobyBtZXNzYWdlPSIkIj48L2VjaG8+CisJPC90YXJnZXQ+Cis8L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9idWlsZHRlc3QyLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvYnVpbGR0ZXN0Mi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFlMzFjMgotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvYnVpbGR0ZXN0Mi54bWwKQEAgLTAsMCArMSw1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHByb2plY3QgbmFtZT0idGVzdHByb2plY3QiIGJhc2VkaXI9Ii4iIGRlZmF1bHQ9Im1haW4iPgorCTxwcm9wZXJ0eSBuYW1lPSJwcm9wRCIgdmFsdWU9InZhbEQiIC8+CisJPHByb3BlcnR5IGZpbGU9ImJ1aWxkdGVzdDEucHJvcGVydGllcyIgLz4KKwk8dGFyZ2V0IG5hbWU9Im1haW4iIGRlcGVuZHM9InByb3BlcnRpZXMiPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvYnVpbGR0ZXN0My54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2J1aWxkdGVzdDMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1NzlkYzQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2J1aWxkdGVzdDMueG1sCkBAIC0wLDAgKzEsMTAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdCBuYW1lPSJ0ZXN0cHJvamVjdCIgYmFzZWRpcj0iLiIgZGVmYXVsdD0ibWFpbiI+CisJPHRhcmdldCBuYW1lPSJtYWluIiAvPgorCTx0YXJnZXQgbmFtZT0icHJldGVzdCIgZGVzY3JpcHRpb249ImRlc2NyaXB0aW9uIj4KKwk8L3RhcmdldD4KKyAgICA8dGFyZ2V0IG5hbWU9InRlc3QiIGRlcGVuZHM9IiI+CisJCTxlY2hvPmRlcGVuZHM8L2VjaG8+CisJPC90YXJnZXQ+CisJPHRhcmdldCBuYW1lPSJ0ZXN0MiIgLz4KKzwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2J1aWxkdGVzdDQueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9idWlsZHRlc3Q0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTNiOWYxCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9idWlsZHRlc3Q0LnhtbApAQCAtMCwwICsxLDggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdCBkZWZhdWx0PSJ0YXNrMyI+CisgICAgPHRhcmdldCBuYW1lPSJ0YXNrIiBkZXNjcmlwdGlvbj0iIi8+CisgICAgPHRhcmdldCBuYW1lPSJ0YXNrMiI+CisgICAgICAgIDxhbnRjYWxsIHRhcmdldD0iIj48L2FudGNhbGw+CisJPC90YXJnZXQ+CisgICAgPHRhcmdldCBuYW1lPSJ0YXNrMyIgZGVwZW5kcz0iIi8+Cis8L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9jdXN0b21Cb29sZWFuLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvY3VzdG9tQm9vbGVhbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRkMzdhMAotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvY3VzdG9tQm9vbGVhbi54bWwKQEAgLTAsMCArMSw1IEBACis8cHJvamVjdCBkZWZhdWx0PSJkZWZhdWx0VGFyZ2V0TmFtZSI+CisJPHRhcmdldCBuYW1lPSJkZWZhdWx0VGFyZ2V0TmFtZSI+CisJCTxlY2xpcHNlLmJ1aWxkU2NyaXB0IHJlY3Vyc2l2ZWdlbmVyYXRpb249IiIvPgorCTwvdGFyZ2V0PgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9kZWJ1Z0FudENhbGwueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9kZWJ1Z0FudENhbGwueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2OGE0ODYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2RlYnVnQW50Q2FsbC54bWwKQEAgLTAsMCArMSwxOCBAQAorPHByb2plY3QgbmFtZT0iZGVidWdBbnRDYWxsIgorICAgICAgICAgZGVmYXVsdD0iZGVmYXVsdCI+CisJCisJPHRhcmdldCBuYW1lPSJkZWZhdWx0Ij4KKwkJPGFudGNhbGwgdGFyZ2V0PSJjYWxsIj4KKwkJPC9hbnRjYWxsPgorCQk8ZWNobz5kZWZhdWx0PC9lY2hvPgorCTwvdGFyZ2V0PgorCisJPHRhcmdldCBuYW1lPSJjYWxsIiBkZXBlbmRzPSJwcmUtY2FsbCI+CisJCTxlY2hvPmNhbGwxPC9lY2hvPgorCQk8c2xlZXAgbWlsbGlzZWNvbmRzPSIzMCIgLz4KKwk8L3RhcmdldD4KKwkKKwk8dGFyZ2V0IG5hbWU9InByZS1jYWxsIj4KKwkJPGVjaG8+cHJlLWNhbGwxPC9lY2hvPgorCTwvdGFyZ2V0PgorPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvZGVwZW5kZW5jeXRlc3QueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9kZXBlbmRlbmN5dGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI2YmE1NwotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvZGVwZW5kZW5jeXRlc3QueG1sCkBAIC0wLDAgKzEsMzggQEAKKzwhLS0gRWluIHRlc3QgY2FzZSBzb2xsdGUgZGllIHByb3BlcnR5IHByb3Bvc2FscyBpbiBtYWluICAgICAgIC0tPgorPCEtLSBVZWJlcnBydWVmZW4sIHVuZCBvYiBkaWUgZGl2ZXJzZW4gcHJvcGVydGllcyBlbnRzcHJlY2hlbmQgLS0+Cis8IS0tIGRlciBkZXBlbmRlbmNpZXMgZ2VzZXR6dCBzaW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKworPHByb2plY3QgZGVmYXVsdD0ibWFpbiI+CisKKwk8cHJvcGVydHkgbmFtZT0iZG9faW5pdCIgdmFsdWU9InZhbCI+PC9wcm9wZXJ0eT4KKwkKKwk8dGFyZ2V0IG5hbWU9InByb3BlcnRpZXMiPgorCQk8cHJvcGVydHkgbmFtZT0icHJvcF9wcm9wIiB2YWx1ZT0idmFsIj48L3Byb3BlcnR5PgorCQk8cHJvcGVydHkgbmFtZT0iZG9fbm90X2NvbXBpbGUiIHZhbHVlPSJ2YWwiPjwvcHJvcGVydHk+CisJCTxlY2hvIG1lc3NhZ2U9ImV4ZWN1dGluZyBwcm9wZXJ0aWVzIj48L2VjaG8+CisJPC90YXJnZXQ+CisKKwk8IS0tIHNob3VsZCBuZXZlciBiZSBleGVjdXRlZCBzaW5jZSBwcm9wZXJ0eSBpcyBub3Qgc2V0ICAgICAgLS0+IAorCTx0YXJnZXQgbmFtZT0iYWRkaXRpb25hbF9wcm9wZXJ0aWVzIiBpZj0iZG9fYWRkaXRfcHJvcHMiPgorCQk8cHJvcGVydHkgbmFtZT0iYWRpdF9wcm9wIiB2YWx1ZT0idmFsIiAvPgorCQk8ZWNobyBtZXNzYWdlPSJleGVjdXRpbmcgYWRkaXRpb25hbF9wcm9wZXJ0aWVzIj48L2VjaG8+CisJPC90YXJnZXQ+CisJCisJPHRhcmdldCBuYW1lPSJpbml0IiBpZj0iZG9pbml0IiBkZXBlbmRzPSJwcm9wZXJ0aWVzLGFkZGl0aW9uYWxfcHJvcGVydGllcyI+CisJCTxwcm9wZXJ0eSBuYW1lPSJpbml0X3Byb3AiIHZhbHVlPSJ2YWwiPjwvcHJvcGVydHk+CisJCTxlY2hvIG1lc3NhZ2U9ImV4ZWN1dGluZyBpbml0Ij48L2VjaG8+CisJPC90YXJnZXQ+CisJCisJPCEtLSBzaG91bGQgbmV2ZXIgYmUgZXhlY3V0ZWQgc2luY2UgcHJvcGVydHkgc2hvdWxkIGJlIHNldCAgIC0tPgorCTwhLS0gYnkgcHJvcGVydGllcyBiZWNhdXNlIG9mIGRlcGVuZGVuY2llcyBiZWZvcmUgICAgICAgICAgICAtLT4gCisJPHRhcmdldCBuYW1lPSJjb21waWxlIiB1bmxlc3M9ImRvX25vdF9jb21waWxlIj4KKwkJPHByb3BlcnR5IG5hbWU9ImNvbXBpbGVfcHJvcCIgdmFsdWU9InZhbCI+PC9wcm9wZXJ0eT4KKwkJPGVjaG8gbWVzc2FnZT0iZXhlY3V0aW5nIGNvbXBpbGUiPjwvZWNobz4KKwk8L3RhcmdldD4KKworCTx0YXJnZXQgbmFtZT0ibWFpbiIgZGVwZW5kcz0iaW5pdCwgY29tcGlsZSI+CisJCTxwcm9wZXJ0eSBuYW1lPSJtYWluX3Byb3AiIHZhbHVlPSJ2YWwiPjwvcHJvcGVydHk+CisJCTxlY2hvIG1lc3NhZ2U9ImV4ZWN1dGluZyBtYWluICR7d2VsbH0iPjwvZWNobz4KKwk8L3RhcmdldD4KKwkKKzwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2VjaG9Qcm9wZXJ0aWVzLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvZWNob1Byb3BlcnRpZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0NzNjNjUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2VjaG9Qcm9wZXJ0aWVzLnhtbApAQCAtMCwwICsxLDYgQEAKKzxwcm9qZWN0IG5hbWU9IkVjaG9pbmcgcHJvcGVydGllcyIgZGVmYXVsdD0iZWNobzEiIGJhc2VkaXI9Ii4uIj4KKwk8dGFyZ2V0IG5hbWU9ImVjaG8xIj4KKwkJPGVjaG8gbWVzc2FnZT0iYWJvdXQgdG8gZWNobyBwcm9wZXJ0aWVzIi8+CisJCTxlY2hvcHJvcGVydGllcy8+CisJPC90YXJnZXQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2VjaG9pbmcueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9lY2hvaW5nLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2I0OTg0Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9lY2hvaW5nLnhtbApAQCAtMCwwICsxLDE5IEBACis8cHJvamVjdCBuYW1lPSJFY2hvaW5nIiBkZWZhdWx0PSJlY2hvMSIgYmFzZWRpcj0iLi4iPgorCisJPHRhcmdldCBuYW1lPSJlY2hvMSI+CisJCTxlY2hvIG1lc3NhZ2U9ImVjaG8xIi8+CisJPC90YXJnZXQ+CisJCisJPHRhcmdldCBuYW1lPSJlY2hvMiI+CisJCTxlY2hvIG1lc3NhZ2U9ImVjaG8yIi8+CisJPC90YXJnZXQ+CisJCisJPHRhcmdldCBuYW1lPSJlY2hvMyIgZGVzY3JpcHRpb249ICJBbiBlY2hvMyEiPgorCQk8ZWNobyBtZXNzYWdlPSJlY2hvMyIvPgorCTwvdGFyZ2V0PgorCQorCTx0YXJnZXQgbmFtZT0iQnVnNDI5ODQiPgorCQk8ZWNobyBtZXNzYWdlPSJ1c2VyLmRpcjogJHt1c2VyLmRpcn0iLz4KKwk8L3RhcmdldD4KKwkKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvZW1wdHkueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9lbXB0eS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvZW1wdHkueG1sCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2Vudmlyb25tZW50VmFyLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvZW52aXJvbm1lbnRWYXIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ODQ0MzIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2Vudmlyb25tZW50VmFyLnhtbApAQCAtMCwwICsxLDUgQEAKKzxwcm9qZWN0PgorCTxwcm9wZXJ0eSBlbnZpcm9ubWVudD0iZW52Ii8+CisJPGVjaG8+JHtlbnYuQU5UX0hPTUV9PC9lY2hvPgorCTxlY2hvPiR7YW50LmhvbWV9PC9lY2hvPgorPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvZXh0ZW5zaW9uUG9pbnRTZXBWTS54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2V4dGVuc2lvblBvaW50U2VwVk0ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3MzVlZDAKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2V4dGVuc2lvblBvaW50U2VwVk0ueG1sCkBAIC0wLDAgKzEsMTQgQEAKKzxwcm9qZWN0IG5hbWU9IkV4dGVuc2lvbiBwb2ludCB0ZXN0aW5nIGluIHNlcGFyYXRlIFZNIgorICAgICAgICAgZGVmYXVsdD0iRXh0ZW5zaW9uIFBvaW50cyIKKyAgICAgICAgIGJhc2VkaXI9Ii4iCisgPgorICAgIDx0YXNrZGVmIG5hbWU9InNlcGFyYXRlVk1UYXNrIiBjbGFzc25hbWU9Im9yZy5lY2xpcHNlLmFudC50ZXN0cy51aS5zdXBwb3J0LnRhc2tzLkFudFRlc3RUYXNrIj4KKyAgICA8L3Rhc2tkZWY+CisgICAgPHRhcmdldCBuYW1lPSJFeHRlbnNpb24gUG9pbnRzIgorICAgICAgICAgICAgZGVzY3JpcHRpb249ICJFbnN1cmUgdGhhdCBhbiBleHRyYSBjbGFzc3BhdGggZW50cnkgZGVzaWduYXRlZCBhcyBub3QgcmVxdWlyaW5nIHRoZSBFY2xpcHNlIHJ1bnRpbWUgc2hvd3MgdXAgaW4gYSBzZXBhcmF0ZSBWTSBidWlsZCIKKyAgICAgPgorICAgICAgICA8c2VwYXJhdGVWTVRhc2svPgorICAgICAgICAgPGVjaG8+JHtwcm9wZXJ0eS51aS50ZXN0aW5nfTwvZWNobz4KKyAgICAgICAgPGVjaG8+JHtwcm9wZXJ0eS51aS50ZXN0aW5nMn08L2VjaG8+CisgICAgPC90YXJnZXQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2V4dGVuc2lvblBvaW50VGFza1NlcFZNLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvZXh0ZW5zaW9uUG9pbnRUYXNrU2VwVk0ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjNmM2YWEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2V4dGVuc2lvblBvaW50VGFza1NlcFZNLnhtbApAQCAtMCwwICsxLDYgQEAKKzxwcm9qZWN0IG5hbWU9IkV4dGVuc2lvbiBQb2ludCBUYXNrIiBkZWZhdWx0PSJFeHRlbnNpb24gUG9pbnQgVGFzayIgYmFzZWRpcj0iLiI+CisJPHRhcmdldCBuYW1lPSJFeHRlbnNpb24gUG9pbnQgVGFzayIgZGVzY3JpcHRpb249ICJFbnN1cmUgdGhhdCBhbiBleHRlbnNpb24gcG9pbnQgZGVmaW5lZCB0YXNrIGlzIHByZXNlbnQiPgorCQk8Y29vbFVJVGFzayBtZXNzYWdlPSJjb29sIiByZWZlcmVuY2U9IiIvPgorCQk8bXk6Y29vbFVJVGFzayB4bWxuczpteT0idGVzdGluZyIvPgorCTwvdGFyZ2V0PgorPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvZXh0ZW5zaW9uUG9pbnRUeXBlU2VwVk0ueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9leHRlbnNpb25Qb2ludFR5cGVTZXBWTS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJhOTU1ZQotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvZXh0ZW5zaW9uUG9pbnRUeXBlU2VwVk0ueG1sCkBAIC0wLDAgKzEsMTIgQEAKKzxwcm9qZWN0IG5hbWU9IkV4dGVuc2lvbiBQb2ludCBUeXBlIiBkZWZhdWx0PSJFeHRlbnNpb24gUG9pbnQgVHlwZSIgYmFzZWRpcj0iLiI+CisKKwk8Y29vbFVJVHlwZSBpZD0iY29tcGlsZS5jbGFzc3BhdGgiPgorICAgICAgPGZpbGVzZXQgZGlyPSJsaWIiPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmphciIvPgorICAgICAgPC9maWxlc2V0PgorICAgIDwvY29vbFVJVHlwZT4KKyAgICAKKwk8dGFyZ2V0IG5hbWU9IkV4dGVuc2lvbiBQb2ludCBUeXBlIiBkZXNjcmlwdGlvbj0gIkVuc3VyZSB0aGF0IGFuIGV4dGVuc2lvbiBwb2ludCBkZWZpbmVkIHR5cGUgaXMgcHJlc2VudCI+CisJCTxlY2hvIG1lc3NhZ2U9IkVuc3VyZSB0aGF0IGFuIGV4dGVuc2lvbiBwb2ludCBkZWZpbmVkIHR5cGUgaXMgcHJlc2VudCIvPgorCTwvdGFyZ2V0PgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9mYWlsaW5nVGFyZ2V0LnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvZmFpbGluZ1RhcmdldC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ0MThlMAotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvZmFpbGluZ1RhcmdldC54bWwKQEAgLTAsMCArMSw5IEBACis8cHJvamVjdCBkZWZhdWx0PSJhbGwiPgorCTx0YXJnZXQgbmFtZT0iYWxsIiBkZXBlbmRzPSJmYWlscywgZWNob3MiLz4KKwk8dGFyZ2V0IG5hbWU9ImZhaWxzIj4KKwkJPGphciBqYXJmaWxlPSJqYXIxNi5qYXIiIGJhc2VkaXI9ImRvZXNOb3RFeGlzdCIvPgorCTwvdGFyZ2V0PgorCTx0YXJnZXQgbmFtZT0iZWNob3MiPgorCQk8ZWNobz5TdGlsbCBlY2hvIG9uIGZhaWx1cmU8L2VjaG8+CisJPC90YXJnZXQ+Cis8L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9mb3JtYXRUZXN0X3NvdXJjZTAxLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvZm9ybWF0VGVzdF9zb3VyY2UwMS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjczMmE0OQotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvZm9ybWF0VGVzdF9zb3VyY2UwMS54bWwKQEAgLTAsMCArMSwyNCBAQAorPCEtLQorICAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAgICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgICAgCisgICAgIENvbnRyaWJ1dG9yczoKKyAgICAgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIC0tPgorPHByb2plY3QgZGVmYXVsdD0iZm9ybWF0VGVzdCI+CisKKzwhLS0gPSA9ID0gPSA9ID0gLS0+PCEtLSBmb3JtYXRUZXN0ICAtLT48IS0tID0gPSA9ID0gPSA9IC0tPjx0YXJnZXQgbmFtZT0iZm9ybWF0VGVzdCIgZGVwZW5kcz0iaW5pdCIgZGVzY3JpcHRpb249Ii0tPiB0ZXN0IHRhcmdldCBvbmUiPjwhLS0gaGVsbG8gd29ybGQgLS0+PGdyZWV0aW5nIC8+PC90YXJnZXQ+CisKKzwhLS0gLSAtIC0gLSAtIC0gLS0+Cis8IS0tIGluaXQgICAgICAgIC0tPgorPCEtLSAtIC0gLSAtIC0gLSAtLT4KKzx0YXJnZXQgbmFtZT0iaW5pdCI+CisgIDxwcm9wZXJ0eSBuYW1lPSJncmVldGluZyIgdmFsdWU9ImhpIiAvPgorICA8cHJlc2V0ZGVmIG5hbWU9ImdyZWV0aW5nIj48ZWNobz4ke2dyZWV0aW5nfTwvZWNobz4KKzwvcHJlc2V0ZGVmPgorICAgPC90YXJnZXQ+CisKKzwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2Zvcm1hdFRlc3RfdGFyZ2V0MDEueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9mb3JtYXRUZXN0X3RhcmdldDAxLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTg1ZTg1Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9mb3JtYXRUZXN0X3RhcmdldDAxLnhtbApAQCAtMCwwICsxLDMxIEBACis8IS0tCisgICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAgICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAgICAKKyAgICAgQ29udHJpYnV0b3JzOgorICAgICAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgLS0+Cis8cHJvamVjdCBkZWZhdWx0PSJmb3JtYXRUZXN0Ij4KKworICAgPCEtLSA9ID0gPSA9ID0gPSAtLT4KKyAgIDwhLS0gZm9ybWF0VGVzdCAgLS0+CisgICA8IS0tID0gPSA9ID0gPSA9IC0tPgorICAgPHRhcmdldCBuYW1lPSJmb3JtYXRUZXN0IiBkZXBlbmRzPSJpbml0IiBkZXNjcmlwdGlvbj0iLS0+IHRlc3QgdGFyZ2V0IG9uZSI+CisgICAgICA8IS0tIGhlbGxvIHdvcmxkIC0tPgorICAgICAgPGdyZWV0aW5nIC8+CisgICA8L3RhcmdldD4KKworICAgPCEtLSAtIC0gLSAtIC0gLSAtLT4KKyAgIDwhLS0gaW5pdCAgICAgICAgLS0+CisgICA8IS0tIC0gLSAtIC0gLSAtIC0tPgorICAgPHRhcmdldCBuYW1lPSJpbml0Ij4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJncmVldGluZyIgdmFsdWU9ImhpIiAvPgorICAgICAgPHByZXNldGRlZiBuYW1lPSJncmVldGluZyI+CisgICAgICAgICA8ZWNobz4ke2dyZWV0aW5nfTwvZWNobz4KKyAgICAgIDwvcHJlc2V0ZGVmPgorICAgPC90YXJnZXQ+CisKKzwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2Zvcm1hdFRlc3RfdGFyZ2V0MDIueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9mb3JtYXRUZXN0X3RhcmdldDAyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzk4Mjc1Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9mb3JtYXRUZXN0X3RhcmdldDAyLnhtbApAQCAtMCwwICsxLDMxIEBACis8IS0tCisgICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAgICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAgICAKKyAgICAgQ29udHJpYnV0b3JzOgorICAgICAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgLS0+Cis8cHJvamVjdCBkZWZhdWx0PSJmb3JtYXRUZXN0Ij4KKworICAgICAgIDwhLS0gPSA9ID0gPSA9ID0gLS0+CisgICAgICAgPCEtLSBmb3JtYXRUZXN0ICAtLT4KKyAgICAgICA8IS0tID0gPSA9ID0gPSA9IC0tPgorICAgICAgIDx0YXJnZXQgbmFtZT0iZm9ybWF0VGVzdCIgZGVwZW5kcz0iaW5pdCIgZGVzY3JpcHRpb249Ii0tPiB0ZXN0IHRhcmdldCBvbmUiPgorICAgICAgICAgICAgICA8IS0tIGhlbGxvIHdvcmxkIC0tPgorICAgICAgICAgICAgICA8Z3JlZXRpbmcgLz4KKyAgICAgICA8L3RhcmdldD4KKworICAgICAgIDwhLS0gLSAtIC0gLSAtIC0gLS0+CisgICAgICAgPCEtLSBpbml0ICAgICAgICAtLT4KKyAgICAgICA8IS0tIC0gLSAtIC0gLSAtIC0tPgorICAgICAgIDx0YXJnZXQgbmFtZT0iaW5pdCI+CisgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJncmVldGluZyIgdmFsdWU9ImhpIiAvPgorICAgICAgICAgICAgICA8cHJlc2V0ZGVmIG5hbWU9ImdyZWV0aW5nIj4KKyAgICAgICAgICAgICAgICAgICAgIDxlY2hvPiR7Z3JlZXRpbmd9PC9lY2hvPgorICAgICAgICAgICAgICA8L3ByZXNldGRlZj4KKyAgICAgICA8L3RhcmdldD4KKworPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvZm9ybWF0VGVzdF90YXJnZXQwMy54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2Zvcm1hdFRlc3RfdGFyZ2V0MDMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhZDUxYjkKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2Zvcm1hdFRlc3RfdGFyZ2V0MDMueG1sCkBAIC0wLDAgKzEsMzEgQEAKKzwhLS0KKyAgICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICAgIAorICAgICBDb250cmlidXRvcnM6CisgICAgICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAtLT4KKzxwcm9qZWN0IGRlZmF1bHQ9ImZvcm1hdFRlc3QiPgorCisJPCEtLSA9ID0gPSA9ID0gPSAtLT4KKwk8IS0tIGZvcm1hdFRlc3QgIC0tPgorCTwhLS0gPSA9ID0gPSA9ID0gLS0+CisJPHRhcmdldCBuYW1lPSJmb3JtYXRUZXN0IiBkZXBlbmRzPSJpbml0IiBkZXNjcmlwdGlvbj0iLS0+IHRlc3QgdGFyZ2V0IG9uZSI+CisJCTwhLS0gaGVsbG8gd29ybGQgLS0+CisJCTxncmVldGluZyAvPgorCTwvdGFyZ2V0PgorCisJPCEtLSAtIC0gLSAtIC0gLSAtLT4KKwk8IS0tIGluaXQgICAgICAgIC0tPgorCTwhLS0gLSAtIC0gLSAtIC0gLS0+CisJPHRhcmdldCBuYW1lPSJpbml0Ij4KKwkJPHByb3BlcnR5IG5hbWU9ImdyZWV0aW5nIiB2YWx1ZT0iaGkiIC8+CisJCTxwcmVzZXRkZWYgbmFtZT0iZ3JlZXRpbmciPgorCQkJPGVjaG8+JHtncmVldGluZ308L2VjaG8+CisJCTwvcHJlc2V0ZGVmPgorCTwvdGFyZ2V0PgorCis8L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9pbXBvcnQueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9pbXBvcnQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkNzVhODEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2ltcG9ydC54bWwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9pbXBvcnRSZXF1aXJpbmdVc2VyUHJvcC54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2ltcG9ydFJlcXVpcmluZ1VzZXJQcm9wLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGExMjcxCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9pbXBvcnRSZXF1aXJpbmdVc2VyUHJvcC54bWwKQEAgLTAsMCArMSwxMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8cHJvamVjdCBuYW1lPSJpbXBvcnRSZXF1aXJpbmdVc2VyUHJvcGVydGllcyIgZGVmYXVsdD0iaW1wb3J0LWRlZmF1bHQiPgorCTxkZXNjcmlwdGlvbj4ke2ltcG9ydEZpbGVOYW1lIHRvIGJlIGRlZmluZWQgYXMgYW4gYXJndW1lbnQsIGNvbmZpZyBwcm9wZXJ0eSBvciBpbiBhIGNvbmZpZyBwcm9wZXJ0eSBmaWxlPC9kZXNjcmlwdGlvbj4KKwk8aW1wb3J0IGZpbGU9IiR7aW1wb3J0RmlsZU5hbWV9IiAvPgorCTx0YXJnZXQgbmFtZT0ib25lIiBkZXBlbmRzPSJpbXBvcnQtZGVmYXVsdCI+CisJCTxlY2hvPm9uZTwvZWNobz4KKwk8L3RhcmdldD4KKworPC9wcm9qZWN0PgorCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2ltcG9ydFdpdGhCeXRlT3JkZXJNYXJrLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvaW1wb3J0V2l0aEJ5dGVPcmRlck1hcmsueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ODYyYWUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2ltcG9ydFdpdGhCeXRlT3JkZXJNYXJrLnhtbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2lucHV0LnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvaW5wdXQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkNzBhYjUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2lucHV0LnhtbApAQCAtMCwwICsxLDcgQEAKKzxwcm9qZWN0IG5hbWU9ImlucHV0IHRlc3RpbmciIGRlZmF1bHQ9ICJpbnB1dCB0ZXN0Ij4KKwk8dGFyZ2V0IG5hbWU9ImlucHV0IHRlc3QiPgorCQk8aW5wdXQgbWVzc2FnZT0iRW50ZXIgZm9yIGVjaG8iIGFkZHByb3BlcnR5PSAiaW5wdXRUZXN0Ij4KKwkJPC9pbnB1dD4KKwkJPGVjaG8gbWVzc2FnZT0iJHtpbnB1dFRlc3R9Ii8+CisJPC90YXJnZXQ+CQorPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvaW50ZXJuYWxUYXJnZXRzLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvaW50ZXJuYWxUYXJnZXRzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDExMjUzCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9pbnRlcm5hbFRhcmdldHMueG1sCkBAIC0wLDAgKzEsMTggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdCBuYW1lPSJwcm9qZWN0IiBkZWZhdWx0PSItZGVmYXVsdCI+CisJPHRhcmdldCBuYW1lPSJpbnRlcm5hbDEiPgorCQk8IS0tIGludGVybmFsIGJlY2F1c2UgZG9lcyBpdCBkb2VzIG5vdCBoYXZlIGRlc2NyaXB0aW9uIGF0dHJpYnV0ZSAtLT4KKwk8L3RhcmdldD4KKwkKKwk8dGFyZ2V0IG5hbWU9Ii1pbnRlcm5hbDIiIGRlc2NyaXB0aW9uPSJzb21ldGhpbmciPgorCQk8IS0tIGludGVybmFsIGJlY2F1c2UgaXQgaGFzIG5hbWUgc3RhcnRpbmcgd2l0aCAnLScgLS0+CisJPC90YXJnZXQ+CisKKwk8dGFyZ2V0IG5hbWU9Im5vbi1pbnRlcm5hbCIgZGVzY3JpcHRpb249InNvbWV0aGluZyI+CisJCTwhLS0gbm9uIGludGVybmFsIGJlY2F1c2UgaXQgaGFzIGRlc2NyaXB0aW9uIGF0dHJpYnV0ZSAtLT4KKwk8L3RhcmdldD4KKworCTx0YXJnZXQgbmFtZT0iLWRlZmF1bHQiIGRlcGVuZHM9ImludGVybmFsMSwtaW50ZXJuYWwyLG5vbi1pbnRlcm5hbCI+CisJCTwhLS0gbm9uLWludGVybmFsIHRhcmdldCBiZWNhdXNlIGl0IGlzIGRlZmF1bHQgdGFyZ2V0IC0tPgorCTwvdGFyZ2V0PgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9qYXZhYy54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2phdmFjLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWUwMGMyCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9qYXZhYy54bWwKQEAgLTAsMCArMSw3IEBACis8cHJvamVjdCBkZWZhdWx0PSJqYXZhY0l0Ij4KKwk8dGFyZ2V0IG5hbWU9ImphdmFjSXQiPgorCQk8amF2YWMgaW5jbHVkZWphdmFydW50aW1lPSIiCisJCQlmb2xsb3dzeW1saW5rcz0iIgorCQkJaW5jbHVkZWFudHJ1bnRpbWU9IiIvPgorCTwvdGFyZ2V0PgorPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvbWFjcm9kZWYueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9tYWNyb2RlZi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJlMzczMwotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvbWFjcm9kZWYueG1sCkBAIC0wLDAgKzEsMjIgQEAKKzxwcm9qZWN0IGRlZmF1bHQ9InR5cGUiPgorCisJPG1hY3JvZGVmIG5hbWU9ImVjbGlwc2VNYWNybyI+CisJCTxhdHRyaWJ1dGUgbmFtZT0idiIgZGVmYXVsdD0iTk9UIFNFVCIgLz4KKwkJPGF0dHJpYnV0ZSBuYW1lPSJlY2xpcHNlIiBkZWZhdWx0PSJ5ZXMiIGRlc2NyaXB0aW9uPSJUZXN0aW5nIEVjbGlwc2UiLz4KKwkJPGVsZW1lbnQgbmFtZT0ic29tZS10YXNrcyIgb3B0aW9uYWw9InllcyIgLz4KKwkJPHNlcXVlbnRpYWw+CisJCQk8ZWNobz5FY2xpcHNlITogQHt2fTwvZWNobz4KKwkJPC9zZXF1ZW50aWFsPgorCTwvbWFjcm9kZWY+CisKKwk8dGFyZ2V0IG5hbWU9InR5cGUiPgorCQk8ZWNsaXBzZU1hY3JvIHY9IlRoaXMgaXMgdiI+CisJCQkKKwkJPC9lY2xpcHNlTWFjcm8+CisJCTxlY2xpcHNlTWFjcm8gdj0iVGhpcyBpcyB2MiIvPgorCQk8ZWNsaXBzZU1hY3JvIHY9IlRoaXMgaXMgdjMiLz4KKwkJPGVjbGlwc2VNYWNybyB2PSJUaGlzIGlzIHY0Ii8+CisJCTxlY2xpcHNlTWFjcm8vPgorCTwvdGFyZ2V0PgorCis8L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9taXhlZC54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL21peGVkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjhlZGJiCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9taXhlZC54bWwKQEAgLTAsMCArMSBAQAorPHByb2plY3Q+PHRhcmdldD48c3FsIGRyaXZlcj0iIiBwYXNzd29yZD0iIiB1cmw9IiIgdXNlcmlkPSIiPjwvc3FsPjxjb25jYXQ+PC9jb25jYXQ+PC90YXJnZXQ+PC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvbmVzdGVkRWxlbWVudEF0dHJpYnV0ZXMueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9uZXN0ZWRFbGVtZW50QXR0cmlidXRlcy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IwZDkxOQotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvbmVzdGVkRWxlbWVudEF0dHJpYnV0ZXMueG1sCkBAIC0wLDAgKzEsOCBAQAorPHByb2plY3QgZGVmYXVsdD0iZ28iPgorCTx0YXNrZGVmIG5hbWU9Im5lc3RlZFRlc3QiIGNsYXNzbmFtZT0ib3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLnN1cHBvcnQudGFza3MuTmVzdEVsZW1lbnRUYXNrIiAvPgorCTx0YXJnZXQgbmFtZT0iZ28iPgorCQk8bmVzdGVkVGVzdD4KKwkJCTxuZXN0ZWRlbGVtZW50IHdvcmtzPSIiIC8+CisJCTwvbmVzdGVkVGVzdD4KKwk8L3RhcmdldD4KKzwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL29jY3VycmVuY2VzVGVzdC54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL29jY3VycmVuY2VzVGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM4NzkzYgotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvb2NjdXJyZW5jZXNUZXN0LnhtbApAQCAtMCwwICsxLDQ5IEBACis8cHJvamVjdCBuYW1lPSJkZWZhdWx0IiBkZWZhdWx0PSJkZWZhdWx0Ij4KKwk8ZGVzY3JpcHRpb24+CisgICAgICAgICAgICBkZWZhdWx0CisgICAgPC9kZXNjcmlwdGlvbj4KKwk8cHJvcGVydHkgbmFtZT0iZGVzdEJhc2UiIGxvY2F0aW9uPSJjOlx0ZW1wXGV4YW1wbGUiIC8+CisJPHByb3BlcnR5IG5hbWU9IndvcmtzcGFjZSIgbG9jYXRpb249ImM6XGVjbGlwc2UzLjFcZGV2IiAvPgorCTxwcm9wZXJ0eSBuYW1lPSJjb3JlU291cmNlIiBsb2NhdGlvbj0iJHt3b3Jrc3BhY2V9JHtkZXN0QmFzZX0KK1xleGFtcGxlLmRlYnVnLmNvcmUiIC8+CisJPHByb3BlcnR5IG5hbWU9InVpU291cmNlIiBsb2NhdGlvbj0iJHt3b3Jrc3BhY2V9XGV4YW1wbGUuZGVidWcudWkiIC8+CisKKwk8dGFyZ2V0IG5hbWU9ImRlZmF1bHQiIGRlc2NyaXB0aW9uPSJkZWZhdWx0Ij4KKwkJCisgICAgPG1hY3JvZGVmIG5hbWU9InByb2Nlc3MiPgorICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlc3RkaXIiLz4KKyAgICAJPGF0dHJpYnV0ZSBuYW1lPSJzeW1ib2xzIi8+CisgICAgICAgIDxzZXF1ZW50aWFsPgorICAgICAgICAgICAgPGRlbGV0ZSBkaXI9IkB7ZGVzdGRpcn0iLz4KKyAgICAgICAgCTxta2RpciBkaXI9IkB7ZGVzdGRpcn1cZXhhbXBsZS5kZWJ1Zy5jb3JlIi8+CisgICAgICAgIAk8bWtkaXIgZGlyPSJAe2Rlc3RkaXJ9XGV4YW1wbGUuZGVidWcudWkiLz4KKyAgICAgICAgCTxwcmVwcm9jZXNzIGRlc3RkaXI9IkB7ZGVzdGRpcn1cZXhhbXBsZS5kZWJ1Zy5jb3JlIiBzeW1ib2xzPSJACit7c3ltYm9sc30iPgorICAgICAgICAJCTxmaWxlc2V0IGRpcj0iJHtjb3JlU291cmNlfSI+CisgICAgICAgIAkJCTxleGNsdWRlIG5hbWU9IioqLyouY2xhc3MiLz4KKyAgICAgICAgCQk8L2ZpbGVzZXQ+CisgICAgICAgIAk8L3ByZXByb2Nlc3M+CisgICAgICAgIAk8cHJlcHJvY2VzcyBkZXN0ZGlyPSJAe2Rlc3RkaXJ9XGV4YW1wbGUuZGVidWcudWkiIHN5bWJvbHM9IkAKK3tzeW1ib2xzfSI+CisgICAgICAgIAkJPGZpbGVzZXQgZGlyPSIke3VpU291cmNlfSI+CisgICAgICAgIAkJCTxleGNsdWRlIG5hbWU9IioqLyouY2xhc3MiLz4KKyAgICAgICAgCQk8L2ZpbGVzZXQ+CisgICAgICAgIAk8L3ByZXByb2Nlc3M+CisgICAgICAgIDwvc2VxdWVudGlhbD4KKyAgICA8L21hY3JvZGVmPgorCisJPHByb2Nlc3MgZGVzdGRpcj0iJHtkZXN0QmFzZX1cZXhlcmNpc2UxLjEiIHN5bWJvbHM9ImV4MSIvPgorCTxwcm9jZXNzIGRlc3RkaXI9IiR7ZGVzdEJhc2V9XGV4ZXJjaXNlMi4xIiBzeW1ib2xzPSJleDIiLz4JCQorCQkKKwkJPHByb3BlcnR5IG5hbWU9InNhbWVOYW1lQXNQcm9wIiB2YWx1ZT0iaGFyZFRvRGlzdGluZ3Vpc2giLz4KKwkJCis8cHJvcGVydHkgbmFtZT0iZXh0ZW5kc0Rlc3RCYXNlIiB2YWx1ZT0iJHtkZXN0QmFzZX0vZXh0ZW5zaW9uIi8+CisJCTxlY2hvPiR7ZXh0ZW5kc0Rlc3RCYXNlfTwvZWNobz4KKwkJCisJCTxhbnQgdGFyZ2V0PSJkZWZhdWx0Ij48L2FudD4KKwkJPGFudGNhbGwgdGFyZ2V0PSJkZWZhdWx0Ij48L2FudGNhbGw+CisJPC90YXJnZXQ+CisJCisJPHRhcmdldCBuYW1lPSJzYW1lTmFtZUFzUHJvcCIgdW5sZXNzPSJleHRlbmRzRGVzdEJhc2UiIGlmPSJkZXN0QmFzZSI+PC90YXJnZXQ+CisJPGZhaWwgdW5sZXNzPSJkZXN0QmFzZSIgbWVzc2FnZT0iUHJvcGVydHkgbm90IHNldC4iLz4KKzwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL291dGxpbmVfc2VsZWN0X3Rlc3RfYnVpbGQueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9vdXRsaW5lX3NlbGVjdF90ZXN0X2J1aWxkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGYwZjVlCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9vdXRsaW5lX3NlbGVjdF90ZXN0X2J1aWxkLnhtbApAQCAtMCwwICsxLDIwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHByb2plY3QgbmFtZT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5pbnRlcm5hbC5hbnQuZWRpdG9yIiBkZWZhdWx0PSJ6aXAucGx1Z2luIiBiYXNlZGlyPSIuIj4KKwk8dGFyZ2V0IG5hbWU9ImluaXQiIGRlcGVuZHM9InByb3BlcnRpZXMiPgorCSAgICA8cHJvcGVydHkgZmlsZT0iYnVpbGQucHJvcGVydGllcyIgLz4KKwkJPHByb3BlcnR5IG5hbWU9InZlcnNpb24uc3VmZml4IiB2YWx1ZT0iXzAuNC41IiAvPgorCQk8cHJvcGVydHkgbmFtZT0icGx1Z2luc19kaXIiIHZhbHVlPSIke2VjbGlwc2VfZGlyfS9wbHVnaW5zIiAvPgorCQk8cHJvcGVydHkgbmFtZT0icGx1Z2luIiB2YWx1ZT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5pbnRlcm5hbC5hbnQuZWRpdG9yIiAvPgorCQk8cHJvcGVydHkgbmFtZT0iZnVsbC5uYW1lIiB2YWx1ZT0iJHtwbHVnaW59JHt2ZXJzaW9uLnN1ZmZpeH0iIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJ0ZW1wLmZvbGRlciIgdmFsdWU9IiR7YmFzZWRpcn0vdGVtcC5mb2xkZXIiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4uZGVzdGluYXRpb24iIHZhbHVlPSIke2Jhc2VkaXJ9IiAvPgorCQk8cHJvcGVydHkgbmFtZT0iYnVpbGQucmVzdWx0LmZvbGRlciIgdmFsdWU9IiR7YmFzZWRpcn0iIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJzb3VyY2UuYW50RWRpdG9yLmphciIgdmFsdWU9InNyYy8iIC8+CisJCTxlY2hvIG1lc3NhZ2U9IlZhbHVlIGlzICR7cGx1Z2luc19kaXJ9IiAvPgorCTwvdGFyZ2V0PgorCisJPHRhcmdldCBuYW1lPSJwcm9wZXJ0aWVzIiBpZj0iZWNsaXBzZS5ydW5uaW5nIj4KKwkJPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmNvbXBpbGVyIiB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSkRUQ29tcGlsZXJBZGFwdGVyIi8+CisJPC90YXJnZXQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvcGVyZm9ybWFuY2UvYnVpbGQueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9wZXJmb3JtYW5jZS9idWlsZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODEzNDkwMwotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvcGVyZm9ybWFuY2UvYnVpbGQueG1sCkBAIC0wLDAgKzEsMjM2MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tIENvcHlyaWdodCAoQykgMTk5My0yMDAzIFNFQUdVTEwgLS0+Cis8P3htLXdlbGxfZm9ybWVkIHBhdGggPSAiIj8+Cis8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworQnVpbGQgZmlsZSBmb3IgdGhlIFRyYW5zaWRpb20gSmF2YSBjb21wb25lbnRzOiBBSVMsIElEVCwgSUZULCBldGMuCisKK05vdGVzOgorCisgICAtIFRoaXMgaXMgYSBidWlsZCBmaWxlIGZvciB1c2Ugd2l0aCB0aGUgSmFrYXJ0YSBBbnQgYnVpbGQgdG9vbC4KKyAgIC0gbmFtaW5nIGd1aWRlbGluZXM6CisgICAgIC0gRm9yIHByb3BlcnRpZXMsIHRoZSBuYW1lcyBhcmUgZ2VuZXJhbGx5IG1vZHVsZU5hbWUucHJvcGVydHlUeXBlLCBlLmcuIGFpcy5maWxlcy4KKyAgICAgLSBGb3IgdGFyZ2V0cywgdGhlIG5hbWVzIGFyZSBnZW5lcmFsbHkgYWN0aW9uLm1vZHVsZU5hbWUsIGUuZy4gY29tcGlsZS5haXMuCisKK1ByZXJlcXVpc2l0ZXM6CisKKyAgIGpha2FydGEtYW50IGZyb20gaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZworICAgQSBKQVhQLWNvbXBsaWFudCBYU0xUIHRyYW5zZm9ybWVyLgorICAgICAtIFhhbGFuLCBmcm9tIGh0dHA6Ly94bWwuYXBhY2hlLm9yZy4KKyAgIEEgSkFYUC1jb21wbGlhbnQgRE9NIHBhcnNlci4KKyAgICAgLSBYZXJjZXMsIGZyb20gaHR0cDovL3htbC5hcGFjaGUub3JnLgorCitNYWluIHRhcmdldHM6CisKKyBjbGVhbiAgICAgICAgICBSZW1vdmVzIGFsbCB0aGUgZ2VuZXJhdGVkIGZpbGVzIGFuZCBkaXJlY3RvcmllcworIGNsZWFuLmNsYXNzZXMgIFJlbW92ZXMgYWxsIC5jbGFzcyBmaWxlcworIGNvbXBpbGUgICAgICAgIENvbXBpbGVzIGFsbCB0aGUgc291cmNlcyBpbnRvICR7YnVpbGQuY2xhc3Nlc30KKyBkaXN0ICAgICAgICAgICBDcmVhdGVzIHRoZSBkaXN0cmlidXRpb24gaW4gJHtidWlsZC5kaXN0fQorIGphcnMgICAgICAgICAgIENyZWF0ZXMgdGhlIGphciBmaWxlcyBpbiAke2J1aWxkLmxpYn0KKyBuaWdodGx5LWJ1aWxkICBDcmVhdGVzIGEgbmlnaHRseSBidWlsZCAoZG9lcyBpdCBhbGwpCisgdGVzdCAgICAgICAgICAgUnVucyB0aGUgdGVzdHMuCisgdGVzdC5jb21waWxlICAgQ29tcGlsZXMgdGhlIHVuaXQgdGVzdHMgd2l0aG91dCB0cmlnZ2VyaW5nIGFueSBkZXBlbmRlbmNpZXMuCisgdmVyaWZ5ICAgICAgICAgVmVyaWZpZXMgdGhlIGJ1aWxkIGJ5IHBlcmZvcm1pbmcgYSBsb2FkIHRlc3RzIG9uIGphciBmaWxlcyAoZG9lcyBub3QgdHJpZ2dlciB0aGUgamFyIGRlcGVuZGVuY2llcy4pCisgemlwICAgICAgICAgICAgQ3JlYXRlcyB0aGUgZmluYWwgJHt6aXAtZmlsZX0gKGRvZXMgaXQgYWxsKQorCitUT0RPOgorICAgIERpc3Rpbmd1aXNoIGJldHdlZW4gY29tcGlsZSBhbmQgcnVudGltZSBjbGFzc3BhdGg6CisgICAgLSBjb21wb25lbnQuY2xhc3NwYXRoLmNvbXBpbGUKKyAgICAtIGNvbXBvbmVudC5jbGFzc3BhdGgucnQKKworQXV0aG9yczoKKworICBMZWUgQnJlaXNhY2hlcjogbGJyZWlzYWNoZXJAc2VhZ3VsbHN3LmNvbQorICBHYXJ5IEdyZWdvcnk6IGdncmVnb3J5QHNlYWd1bGxzdy5jb20KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Cis8cHJvamVjdCBkZWZhdWx0PSJ6aXAiIGJhc2VkaXI9Ii4iIG5hbWU9InRyYW5zaWRpb20iPgorICAgIDwhLS0gR2VuZXJhbCBwcm9wZXJ0aWVzIC0tPgorICAgIDxwcm9wZXJ0eSBmaWxlPSJsb2NhbC1idWlsZC5wcm9wZXJ0aWVzIi8+CisgICAgPHByb3BlcnR5IGZpbGU9ImJ1aWxkLnByb3BlcnRpZXMiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iQ09NUEFOWS53b3JkIiB2YWx1ZT0iU0VBR1VMTCIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJwcm9kdWN0Lm5hbWUiIHZhbHVlPSJBcHBsaWNhdGlvbiBJbnRlcmZhY2UgU2VydmVyIi8+CisgICAgPHByb3BlcnR5IG5hbWU9Ik5hbWUiIHZhbHVlPSJBcHBsaWNhdGlvbiBJbnRlcmZhY2UgU2VydmVyIi8+CisgICAgPHByb3BlcnR5IG5hbWU9InNyYy5yb290LmRpciIgdmFsdWU9Ii4uIi8+CisgICAgPHByb3BlcnR5IG5hbWU9ImJpbmFyeS5yb290LmRpciIgdmFsdWU9IiR7c3JjLnJvb3QuZGlyfS8uLi8uLi9CaW5FIi8+CisgICAgPCEtLSBVR0xZISEgVGhpcyBjcmVhdGVzIGEgZGVwZW5kZW5jeSB0byB0aGUgJ0UnIHRyZWUuIE5vdCBzdXJlIGhvdyB0byBzb2x2ZSBpdCwgdGhvdWdoIC0tPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzcmMuZGlyIiB2YWx1ZT0iJHtzcmMucm9vdC5kaXJ9L1NvdXJjZSIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJqYXZhLnJlc291cmNlLmRpciIgdmFsdWU9IiR7c3JjLnJvb3QuZGlyfS9SZXNvdXJjZXMiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ieHNsdC5yZXNvdXJjZS5kaXIiIHZhbHVlPSIuLi8uLi9SZXNvdXJjZXMvWFNMVCIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJmZGVmLmRpcm5hbWUiIHZhbHVlPSJjb25maWcvZnVuY3Rpb25zIi8+CisgICAgPHByb3BlcnR5IG5hbWU9InJvb3QuZGlyIiB2YWx1ZT0iJHtzcmMucm9vdC5kaXJ9L1Jvb3QiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0icm9vdC5kaXIuc3lzIiB2YWx1ZT0iJHtyb290LmRpcn0vU3lzdGVtIi8+CisgICAgPHByb3BlcnR5IG5hbWU9InJvb3QuZGlyLnN5c2RlZiIgdmFsdWU9IiR7cm9vdC5kaXIuc3lzfS9EZWZhdWx0cyIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyb290LmRpci5zZXJ2ZXIiIHZhbHVlPSIke3Jvb3QuZGlyfS9zZXJ2ZXIiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0icm9vdC5kaXIuc2VydmVyLWNvbmZpZyIgdmFsdWU9IiR7cm9vdC5kaXIuc2VydmVyfS9jb25maWciLz4KKyAgICA8cHJvcGVydHkgbmFtZT0icm9vdC5kaXIudG9vbHMtY29uZmlnIiB2YWx1ZT0iJHtyb290LmRpcn0vdG9vbHMvY29uZmlnIi8+CisgICAgPHByb3BlcnR5IG5hbWU9InJvb3QuZGlyLm1xIiB2YWx1ZT0iJHtyb290LmRpcn0vbXEiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0icm9vdC5kaXIuc2VydmVyLWxvZyIgdmFsdWU9IiR7cm9vdC5kaXIuc2VydmVyLWNvbmZpZ30vbG9nIi8+CisgICAgPHByb3BlcnR5IG5hbWU9InJvb3QuZGlyLnNlcnZlci10cmFuc2Zvcm0iIHZhbHVlPSIke3Jvb3QuZGlyLnNlcnZlci1jb25maWd9L3RyYW5zZm9ybSIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyb290LmRpci50b29scy1sb2ciIHZhbHVlPSIke3Jvb3QuZGlyLnRvb2xzLWNvbmZpZ30vbG9nIi8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRvYy5kaXIiIHZhbHVlPSIke3NyYy5yb290LmRpcn0vRG9jL0RlbGl2ZXIiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0idGVzdC5kaXIiIHZhbHVlPSIke3NyYy5yb290LmRpcn0vVGVzdCIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzcmMudGVzdC5kaXIiIHZhbHVlPSIke3Rlc3QuZGlyfS9Tb3VyY2UiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iYnVpbGQuZGlyIiBsb2NhdGlvbj0iJHtiYXNlZGlyfS8uLi9idWlsZG91dHB1dCIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5jbGFzc2VzIiB2YWx1ZT0iJHtidWlsZC5kaXJ9L2NsYXNzZXMiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iYnVpbGQuZXRjIiB2YWx1ZT0iJHtidWlsZC5kaXJ9L2V0YyIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5saWIiIHZhbHVlPSIke2J1aWxkLmRpcn0vbGliIi8+CisgICAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmNoZWNrc3VtIiBsb2NhdGlvbj0iJHtidWlsZC5saWJ9L2NoZWNrc3VtIi8+CisgICAgPHByb3BlcnR5IG5hbWU9ImFsbC1qYXJzLnhtbCIgbG9jYXRpb249IiR7YnVpbGQuY2hlY2tzdW19L2FsbC1qYXJzLnhtbCIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5kaXN0IiB2YWx1ZT0iJHtidWlsZC5kaXJ9L2Rpc3QiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iemlwRmlsZUJhc2VOYW1lIiB2YWx1ZT0iQXBwSW50ZXJmYWNlIi8+CisgICAgPHByb3BlcnR5IG5hbWU9InRoaXJkcGFydHkuZGlyIiB2YWx1ZT0iLi4vLi4vLi4vLi4vVGhpcmRQYXJ0eSIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJtb2RpZmllZHRoaXJkcGFydHkuZGlyIiB2YWx1ZT0iLi4vLi4vTW9kaWZpZWRUaGlyZFBhcnR5Ii8+CisgICAgPHByb3BlcnR5IG5hbWU9InNvdXJjZXNhZmVtaXJyb3IuZGlyIiB2YWx1ZT0iLi4vLi4vU291cmNlU2FmZU1pcnJvciIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzcmMuc291cmNlc2FmZW1pcnJvci5kaXIiIHZhbHVlPSIke3NvdXJjZXNhZmVtaXJyb3IuZGlyfS9KYXZhL1NvdXJjZSIvPgorICAgIDwhLS0gM3JkIHBhcnR5IGphciByZWZlcmVuY2VzIC0tPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJhcGFjaGUuZGlyIiB2YWx1ZT0iJHt0aGlyZHBhcnR5LmRpcn0vYXBhY2hlLm9yZyIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ4YWxhbi5kaXIiIHZhbHVlPSIke2FwYWNoZS5kaXJ9L3hhbGFuLWovMi41LjEvYmluIi8+CisgICAgPHByb3BlcnR5IG5hbWU9ImFudC5qYXJuYW1lIiB2YWx1ZT0iYW50LmphciIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJhbnQuamFyIiB2YWx1ZT0iJHthcGFjaGUuZGlyfS9qYWthcnRhLWFudC8xLjUuMi8ke2FudC5qYXJuYW1lfSIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ4ZXJjZXMuamFybmFtZSIgdmFsdWU9InhlcmNlc0ltcGwuamFyIi8+CisgICAgPHByb3BlcnR5IG5hbWU9InhlcmNlcy5qYXIiIHZhbHVlPSIke3hhbGFuLmRpcn0vJHt4ZXJjZXMuamFybmFtZX0iLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ieGFsYW4uamFybmFtZSIgdmFsdWU9InhhbGFuLmphciIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ4YWxhbi5qYXIiIHZhbHVlPSIke3hhbGFuLmRpcn0vJHt4YWxhbi5qYXJuYW1lfSIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ4c2x0Yy5qYXJuYW1lIiB2YWx1ZT0ieHNsdGMuamFyIi8+CisgICAgPHByb3BlcnR5IG5hbWU9InhzbHRjLmphciIgdmFsdWU9IiR7eGFsYW4uZGlyfS8ke3hzbHRjLmphcm5hbWV9Ii8+CisgICAgPHByb3BlcnR5IG5hbWU9InhtbC1hcGlzLmphcm5hbWUiIHZhbHVlPSJ4bWwtYXBpcy5qYXIiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ieG1sLWFwaXMuamFyIiB2YWx1ZT0iJHt4YWxhbi5kaXJ9LyR7eG1sLWFwaXMuamFybmFtZX0iLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ic29hcC5qYXJuYW1lIiB2YWx1ZT0ic29hcC5qYXIiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ic29hcC5qYXIiIHZhbHVlPSIke21vZGlmaWVkdGhpcmRwYXJ0eS5kaXJ9L1NvYXAvMi4yL2phdmEvYnVpbGQvbGliLyR7c29hcC5qYXJuYW1lfSIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJtYWlsLmphcm5hbWUiIHZhbHVlPSJtYWlsYXBpLmphciIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJtYWlsLmphciIgdmFsdWU9IiR7dGhpcmRwYXJ0eS5kaXJ9L3N1bi9KYXZhTWFpbC8xLjMvbGliLyR7bWFpbC5qYXJuYW1lfSIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJhY3RpdmF0aW9uLmphcm5hbWUiIHZhbHVlPSJhY3RpdmF0aW9uLmphciIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJhY3RpdmF0aW9uLmphciIgdmFsdWU9IiR7dGhpcmRwYXJ0eS5kaXJ9L3N1bi9qYWYvMS4wLjIvJHthY3RpdmF0aW9uLmphcm5hbWV9Ii8+CisgICAgPHByb3BlcnR5IG5hbWU9InNlcnZsZXQuamFybmFtZSIgdmFsdWU9InNlcnZsZXQuamFyIi8+CisgICAgPHByb3BlcnR5IG5hbWU9InNlcnZsZXQuZGlyIiB2YWx1ZT0iJHthcGFjaGUuZGlyfS9qYWthcnRhLXRvbWNhdC8zLjIuMS9TZXJ2bGV0QVBJL2xpYiIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzZXJ2bGV0LmphciIgdmFsdWU9IiR7c2VydmxldC5kaXJ9LyR7c2VydmxldC5qYXJuYW1lfSIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJjb21tb25zLWh0dHBjbGllbnQuamFybmFtZSIgdmFsdWU9ImNvbW1vbnMtaHR0cGNsaWVudC0yLjAtcmMyLmphciIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJjb21tb25zLWh0dHBjbGllbnQuZGlyIiB2YWx1ZT0iJHthcGFjaGUuZGlyfS9jb21tb25zLWh0dHBjbGllbnQvMi4wLXJjMiIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJjb21tb25zLWh0dHBjbGllbnQuamFyIiB2YWx1ZT0iJHtjb21tb25zLWh0dHBjbGllbnQuZGlyfS8ke2NvbW1vbnMtaHR0cGNsaWVudC5qYXJuYW1lfSIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJjb21tb25zLWxvZ2dpbmcuamFybmFtZSIgdmFsdWU9ImNvbW1vbnMtbG9nZ2luZy5qYXIiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iY29tbW9ucy1sb2dnaW5nLmRpciIgdmFsdWU9IiR7YXBhY2hlLmRpcn0vY29tbW9ucy1sb2dnaW5nLzEuMC4zIi8+CisgICAgPHByb3BlcnR5IG5hbWU9ImNvbW1vbnMtbG9nZ2luZy5qYXIiIHZhbHVlPSIke2NvbW1vbnMtbG9nZ2luZy5kaXJ9LyR7Y29tbW9ucy1sb2dnaW5nLmphcm5hbWV9Ii8+CisgICAgPHByb3BlcnR5IG5hbWU9ImlibS5tcS5qYXJuYW1lIiB2YWx1ZT0iY29tLmlibS5tcS5qYXIiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaWJtLm1xLmphciIgdmFsdWU9IiR7dGhpcmRwYXJ0eS5kaXJ9L0lCTS9NUVNlcmllcy81LjIuMi8ke2libS5tcS5qYXJuYW1lfSIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJpYm0ubXFiaW5kLmphciIgdmFsdWU9IiR7dGhpcmRwYXJ0eS5kaXJ9L0lCTS9NUVNlcmllcy81LjIuMi9jb20uaWJtLm1xYmluZC5qYXIiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaWJtLm1xam1zLmphciIgdmFsdWU9IiR7dGhpcmRwYXJ0eS5kaXJ9L0lCTS9NUVNlcmllcy81LjIuMi9jb20uaWJtLm1xam1zLmphciIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJpYm0ubXEuY29ubmVjdG9yLmphciIgdmFsdWU9IiR7dGhpcmRwYXJ0eS5kaXJ9L0lCTS9NUVNlcmllcy81LjIuMi9jb25uZWN0b3IuamFyIi8+CisgICAgPHByb3BlcnR5IG5hbWU9ImlibS5tcS5qdGEuamFyIiB2YWx1ZT0iJHt0aGlyZHBhcnR5LmRpcn0vSUJNL01RU2VyaWVzLzUuMi4yL2p0YS5qYXIiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibWljcm9zb2Z0c2VjdXJpdHljbGFzc2VzLnppcCIgdmFsdWU9IiR7dGhpcmRwYXJ0eS5kaXJ9L01pY3Jvc29mdC9zZWN1cml0eS81LjAwLjI5MjIuMC9NaWNyb3NvZnRTZWN1cml0eUNsYXNzZXMuemlwIi8+CisgICAgPHByb3BlcnR5IG5hbWU9ImNvbW1vbnMtY29kZWMuamFybmFtZSIgdmFsdWU9ImNvbW1vbnMtY29kZWMtMS4xLjEtZGV2LmphciIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJjb21tb25zLWNvZGVjLmphciIgdmFsdWU9IiR7YXBhY2hlLmRpcn0vY29tbW9ucy1jb2RlYy8yMDAzMDUxNi8ke2NvbW1vbnMtY29kZWMuamFybmFtZX0iLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iY29tbW9ucy1jb2xsZWN0aW9ucy5qYXJuYW1lIiB2YWx1ZT0iY29tbW9ucy1jb2xsZWN0aW9ucy0yXzEuamFyIi8+CisgICAgPHByb3BlcnR5IG5hbWU9ImNvbW1vbnMtY29sbGVjdGlvbnMuamFyIiB2YWx1ZT0iJHthcGFjaGUuZGlyfS9jb21tb25zLWNvbGxlY3Rpb25zLzIuMS8ke2NvbW1vbnMtY29sbGVjdGlvbnMuamFybmFtZX0iLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iY29tbW9ucy1jbGkuamFybmFtZSIgdmFsdWU9ImNvbW1vbnMtY2xpLTFfMC5qYXIiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iY29tbW9ucy1jbGkuamFyIiB2YWx1ZT0iJHthcGFjaGUuZGlyfS9jb21tb25zLWNsaS8xLjAvJHtjb21tb25zLWNsaS5qYXJuYW1lfSIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJjb21tb25zLWxhbmcuamFybmFtZSIgdmFsdWU9ImNvbW1vbnMtbGFuZy0yLjAuamFyIi8+CisgICAgPHByb3BlcnR5IG5hbWU9ImNvbW1vbnMtbGFuZy5qYXIiIHZhbHVlPSIke2FwYWNoZS5kaXJ9L2NvbW1vbnMtbGFuZy8yLjAvJHtjb21tb25zLWxhbmcuamFybmFtZX0iLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iY29tbW9ucy1wb29sLmphcm5hbWUiIHZhbHVlPSJjb21tb25zLXBvb2wuamFyIi8+CisgICAgPHByb3BlcnR5IG5hbWU9ImNvbW1vbnMtcG9vbC5qYXIiIHZhbHVlPSIke2FwYWNoZS5kaXJ9L2NvbW1vbnMtcG9vbC8yMDAzMDQyOS8ke2NvbW1vbnMtcG9vbC5qYXJuYW1lfSIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJjdGdjbGllbnQuamFybmFtZSIgdmFsdWU9ImN0Z2NsaWVudC5qYXIiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iY3RnY2xpZW50LmRpciIgdmFsdWU9IiR7dGhpcmRwYXJ0eS5kaXJ9L0lCTS9DSUNTIFRyYW5zYWN0aW9uIEdhdGV3YXkvNS4wIi8+CisgICAgPHByb3BlcnR5IG5hbWU9ImN0Z2NsaWVudC5qYXIiIHZhbHVlPSIke2N0Z2NsaWVudC5kaXJ9LyR7Y3RnY2xpZW50Lmphcm5hbWV9Ii8+CisgICAgPHByb3BlcnR5IG5hbWU9Impha2FydGEtb3JvLmphcm5hbWUiIHZhbHVlPSJqYWthcnRhLW9yby0yLjAuNy5qYXIiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iamFrYXJ0YS1vcm8uamFyIiB2YWx1ZT0iJHthcGFjaGUuZGlyfS9qYWthcnRhLW9yby8yLjAuNy8ke2pha2FydGEtb3JvLmphcm5hbWV9Ii8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvZzRqLmphcm5hbWUiIHZhbHVlPSJsb2c0ai0xXzJfNy5qYXIiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibG9nNGouamFyIiB2YWx1ZT0iJHthcGFjaGUuZGlyfS9qYWthcnRhLWxvZzRqLzEuMi43LyR7bG9nNGouamFybmFtZX0iLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZ29YTUxFbmdpbmUuamFyIiB2YWx1ZT0iJHt0aGlyZHBhcnR5LmRpcn0vWE1MR2xvYmFsL0dvWE1MVHJhbnNmb3JtLzNfMF8wL2xpYi9lbmdpbmUuamFyIi8+CisgICAgPHByb3BlcnR5IG5hbWU9ImdvWE1MUmVzb3VyY2UuemlwIiB2YWx1ZT0iJHt0aGlyZHBhcnR5LmRpcn0vWE1MR2xvYmFsL0dvWE1MVHJhbnNmb3JtLzNfMF8wL2xpYi9yZXNvdXJjZS56aXAiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZ29YTUxjb25maWcuZGlyIiB2YWx1ZT0iJHt0aGlyZHBhcnR5LmRpcn0vWE1MR2xvYmFsL0dvWE1MVHJhbnNmb3JtLzNfMF8wL2NvbmZpZyIvPgorICAgIDwhLS0gSkRvbSBiZXRhIDggaXMgbm90IGNvbXBhdGlibGUgd2l0aCBHb1hNTFRyYW5zZm9ybSAzLjAuMCwgdXNlIGJldGEgNyBmcm9tIEdvWE1MVHJhbnNmb3JtIDMuMC4wIC0tPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJqZG9tLmphcm5hbWUiIHZhbHVlPSJqZG9tLmphciIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJqZG9tLmphciIgdmFsdWU9IiR7dGhpcmRwYXJ0eS5kaXJ9L1hNTEdsb2JhbC9Hb1hNTFRyYW5zZm9ybS8zXzBfMC9saWIvJHtqZG9tLmphcm5hbWV9Ii8+CisgICAgPHByb3BlcnR5IG5hbWU9ImpheGIxLmphcm5hbWUiIHZhbHVlPSJqYXhiLWFwaS5qYXIiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iamF4YjIuamFybmFtZSIgdmFsdWU9ImpheGItaW1wbC5qYXIiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iamF4YjMuamFybmFtZSIgdmFsdWU9ImpheGItbGlicy5qYXIiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iamF4YjQuamFybmFtZSIgdmFsdWU9ImpheC1xbmFtZS5qYXIiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iamF4YjUuamFybmFtZSIgdmFsdWU9Im5hbWVzcGFjZS5qYXIiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iamF4YjYuamFybmFtZSIgdmFsdWU9InhzZGxpYi5qYXIiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iamF4YjcuamFybmFtZSIgdmFsdWU9InJlbGF4bmdEYXRhdHlwZS5qYXIiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iamF4Yi5qYXJuYW1lcyIgdmFsdWU9IiR7amF4YjEuamFybmFtZX0gJHtqYXhiMi5qYXJuYW1lfSAke2pheGIzLmphcm5hbWV9ICR7amF4YjQuamFybmFtZX0gJHtqYXhiNS5qYXJuYW1lfSAke2pheGI2Lmphcm5hbWV9ICR7amF4YjcuamFybmFtZX0gIi8+CisgICAgPHByb3BlcnR5IG5hbWU9Imp3c2RwLmRpciIgdmFsdWU9IiR7dGhpcmRwYXJ0eS5kaXJ9L3N1bi9qd3NkcC8xLjIiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iamF4Yi5kaXIiIHZhbHVlPSIke2p3c2RwLmRpcn0vamF4Yi9saWIiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iamF4Yi5zaGFyZWQuZGlyIiB2YWx1ZT0iJHtqd3NkcC5kaXJ9L2p3c2RwLXNoYXJlZC9saWIiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iamF4YjEuamFyIiB2YWx1ZT0iJHtqYXhiLmRpcn0vJHtqYXhiMS5qYXJuYW1lfSIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJqYXhiMi5qYXIiIHZhbHVlPSIke2pheGIuZGlyfS8ke2pheGIyLmphcm5hbWV9Ii8+CisgICAgPHByb3BlcnR5IG5hbWU9ImpheGIzLmphciIgdmFsdWU9IiR7amF4Yi5kaXJ9LyR7amF4YjMuamFybmFtZX0iLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iamF4YjQuamFyIiB2YWx1ZT0iJHtqYXhiLnNoYXJlZC5kaXJ9LyR7amF4YjQuamFybmFtZX0iLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iamF4YjUuamFyIiB2YWx1ZT0iJHtqYXhiLnNoYXJlZC5kaXJ9LyR7amF4YjUuamFybmFtZX0iLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iamF4YjYuamFyIiB2YWx1ZT0iJHtqYXhiLnNoYXJlZC5kaXJ9LyR7amF4YjYuamFybmFtZX0iLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iamF4YjcuamFyIiB2YWx1ZT0iJHtqYXhiLnNoYXJlZC5kaXJ9LyR7amF4YjcuamFybmFtZX0iLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iam1zLmphcm5hbWUiIHZhbHVlPSJqbXMtMV8wXzJfYi5qYXIiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iam1zLmphciIgdmFsdWU9IiR7dGhpcmRwYXJ0eS5kaXJ9L3N1bi9qbXMvMS4wLjJiLyR7am1zLmphcm5hbWV9Ii8+CisgICAgPHByb3BlcnR5IG5hbWU9ImpjZS5qYXJuYW1lIiB2YWx1ZT0iamNlMV8yXzIuamFyIi8+CisgICAgPHByb3BlcnR5IG5hbWU9ImpjZS5qYXIiIHZhbHVlPSIke3RoaXJkcGFydHkuZGlyfS9zdW4vamNlLzEuMi4yL2xpYi8ke2pjZS5qYXJuYW1lfSIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJqY2VfcHJvdmlkZXIuamFybmFtZSIgdmFsdWU9InN1bmpjZV9wcm92aWRlci5qYXIiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iamNlX3Byb3ZpZGVyLmphciIgdmFsdWU9IiR7dGhpcmRwYXJ0eS5kaXJ9L3N1bi9qY2UvMS4yLjIvbGliLyR7amNlX3Byb3ZpZGVyLmphcm5hbWV9Ii8+CisgICAgPHByb3BlcnR5IG5hbWU9ImpjZXJ0Lmphcm5hbWUiIHZhbHVlPSJqY2VydC5qYXIiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iam5ldC5qYXJuYW1lIiB2YWx1ZT0iam5ldC5qYXIiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ianNzZS5qYXJuYW1lIiB2YWx1ZT0ianNzZS5qYXIiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ianNzZS5kaXIiIHZhbHVlPSIke3RoaXJkcGFydHkuZGlyfS9zdW4vanNzZS8xLjAuM18wMi1nbC9saWIiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iamNlcnQuamFyIiB2YWx1ZT0iJHtqc3NlLmRpcn0vJHtqY2VydC5qYXJuYW1lfSIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJqbmV0LmphciIgdmFsdWU9IiR7anNzZS5kaXJ9LyR7am5ldC5qYXJuYW1lfSIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJqc3NlLmphciIgdmFsdWU9IiR7anNzZS5kaXJ9LyR7anNzZS5qYXJuYW1lfSIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJqYWFzLmphcm5hbWUiIHZhbHVlPSJqYWFzLTFfMC5qYXIiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iamFhcy5qYXIiIHZhbHVlPSIke3RoaXJkcGFydHkuZGlyfS9zdW4vamFhcy8xLjAvbGliLyR7amFhcy5qYXJuYW1lfSIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJqdGEuamFybmFtZSIgdmFsdWU9Imp0YS0xXzBfMUItY2xhc3Nlcy56aXAiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ianRhLmphciIgdmFsdWU9IiR7dGhpcmRwYXJ0eS5kaXJ9L3N1bi9qdGEvanRhLTFfMF8xYi8ke2p0YS5qYXJuYW1lfSIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJjb25jdXJyZW50Lmphcm5hbWUiIHZhbHVlPSJjb25jdXJyZW50LTFfM18yLmphciIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJjb25jdXJyZW50LmphciIgdmFsdWU9IiR7dGhpcmRwYXJ0eS5kaXJ9L29zd2Vnby5lZHUvdXRpbC5jb25jdXJyZW50LzEuMy4yLyR7Y29uY3VycmVudC5qYXJuYW1lfSIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ4bWxzZWMuamFyIiB2YWx1ZT0iJHthcGFjaGUuZGlyfS94bWwtc2VjdXJpdHkveG1sLXNlY3VyaXR5LTFfMF80L2J1aWxkL3htbHNlYy0xXzBfNC5qYXIiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaW1zaWNvLmphcm5hbWUiIHZhbHVlPSJpbXNpY28tMV8yXzUuamFyIi8+CisgICAgPHByb3BlcnR5IG5hbWU9Imltc2ljby5qYXIiIHZhbHVlPSIke3RoaXJkcGFydHkuZGlyfS9JQk0vSU1TSUNPLzEuMi41LyR7aW1zaWNvLmphcm5hbWV9Ii8+CisgICAgPHByb3BlcnR5IG5hbWU9Imltc2ljby1jb25uZWN0b3IuamFybmFtZSIgdmFsdWU9Imltc2ljby1jb25uZWN0b3ItMV8yXzUuamFyIi8+CisgICAgPHByb3BlcnR5IG5hbWU9Imltc2ljby1jb25uZWN0b3IuamFyIiB2YWx1ZT0iJHt0aGlyZHBhcnR5LmRpcn0vSUJNL0lNU0lDTy8xLjIuNS8ke2ltc2ljby1jb25uZWN0b3IuamFybmFtZX0iLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ianVuaXQuamFyIiB2YWx1ZT0iJHt0aGlyZHBhcnR5LmRpcn0vanVuaXQvMy44LjEvanVuaXQuamFyIi8+CisgICAgPHByb3BlcnR5IG5hbWU9Im10anVuaXQuamFyIiB2YWx1ZT0iJHt0aGlyZHBhcnR5LmRpcn0vTVRKVW5pdC8xLjAvTVRKVW5pdC0xLmphciIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXRyb2d1YXJkLmphciIgdmFsdWU9IiR7dGhpcmRwYXJ0eS5kaXJ9L1JldHJvZ3VhcmQvMS4xLjEzL3JldHJvZ3VhcmQuamFyIi8+CisgICAgPHByb3BlcnR5IG5hbWU9Imoyc2UudG9vbHMuamFybmFtZSIgdmFsdWU9InRvb2xzLmphciIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJqMnNlLnRvb2xzLmphciIgdmFsdWU9IiR7dGhpcmRwYXJ0eS5kaXJ9L3N1bi9qMnNlLzEuMy4xXzA4L2xpYi8ke2oyc2UudG9vbHMuamFybmFtZX0iLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ib2JmdXNjYXRlLnNjcmlwdCIgdmFsdWU9IiR7c3JjLnJvb3QuZGlyfS9CdWlsZC9vYmZ1c2NhdGVfaHNjLnJncyIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJvYmZ1c2NhdGUubG9nIiB2YWx1ZT0iJHtidWlsZC5saWJ9L29iZnVzY2F0ZV9oc2MubG9nIi8+CisgICAgPHByb3BlcnR5IG5hbWU9ImV4dGVuc2lvbi5kaXIubmFtZSIgdmFsdWU9ImV4dCIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJjb21waWxlLmRlYnVnIiB2YWx1ZT0ib24iLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iY29tcGlsZS5vcHRpbWl6ZSIgdmFsdWU9Im9mZiIvPgorICAgIDwhLS0gVGhlc2UgdHdvIHdpbGwgbm9ybWFsbHkgYmUgc2V0IG91dHNpZGUgdGhpcyBmaWxlIGluIHRoZSBidWlsZC5wcm9wZXJ0aWVzIGZpbGUuIC0tPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ2ZXJzaW9uIiB2YWx1ZT0iMi4zLlguV0lQIi8+CisgICAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmlkIiB2YWx1ZT0iMCIvPgorICAgIDwhLS0gSmFyIE1hbmlmZXN0IHN0YW5kYXJkIHByb3BlcnRpZXMgLS0+CisgICAgPHByb3BlcnR5IG5hbWU9Im1hbmlmZXN0LmtleS5tYWluLWNsYXNzIiB2YWx1ZT0iTWFpbi1DbGFzcyIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJtYW5pZmVzdC5rZXkuY2xhc3MtcGF0aCIgdmFsdWU9IkNsYXNzLVBhdGgiLz4KKyAgICA8IS0tIEphciBNYW5pZmVzdCBTZWFndWxsIHByb3BlcnRpZXMgLS0+CisgICAgPHByb3BlcnR5IG5hbWU9Im1hbmlmZXN0LmtleS5wcm9kdWN0IiB2YWx1ZT0iJHtDT01QQU5ZLndvcmR9LVByb2R1Y3QiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibWFuaWZlc3Qua2V5LmNvbXBvbmVudCIgdmFsdWU9IiR7Q09NUEFOWS53b3JkfS1Db21wb25lbnQiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibWFuaWZlc3Qua2V5LnZlcnNpb24iIHZhbHVlPSIke0NPTVBBTlkud29yZH0tVmVyc2lvbiIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJtYW5pZmVzdC5rZXkuYnVpbGQiIHZhbHVlPSIke0NPTVBBTlkud29yZH0tQnVpbGQiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibWFuaWZlc3Qua2V5LmJ1aWxkLXRzIiB2YWx1ZT0iJHtDT01QQU5ZLndvcmR9LUJ1aWxkLVRpbWVzdGFtcCIvPgorICAgIDwhLS0gSmF2YWRvYyAtLT4KKyAgICA8cHJvcGVydHkgbmFtZT0iamF2YWRvYy5qMnNlLmxpbmsiIHZhbHVlPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS4zL2RvY3MvYXBpLyIvPgorICAgIDwhLS0gQ2hlY2tzdW0gLS0+CisgICAgPHByb3BlcnR5IG5hbWU9ImNoZWNrc3VtLmFsZ29yaXRobS5tZDUiIHZhbHVlPSJNRDUiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iY2hlY2tzdW0uYWxnb3JpdGhtLnNoYSIgdmFsdWU9IlNIQSIvPgorICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgICA8IS0tIFNvdXJjZSBmaWxlcyBhbmQgY2xhc3MgcGF0aHMgLS0+CisgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICAgIDwhLS0gQUlTIC0tPgorICAgIDxwYXR0ZXJuc2V0IGlkPSJhaXMuZmlsZXMiPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJjb20vc2VhZ3VsbHN3L2FwcGludGVyZmFjZS9zZXJ2ZXIvKioiLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iY29tL3NlYWd1bGxzdy9wZXJmdGVzdC8iLz4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iY29tL3NlYWd1bGxzdy9hcHBpbnRlcmZhY2Uvc2VydmVyL2JhY2tlbmQvY2ljcy8iLz4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iY29tL3NlYWd1bGxzdy9hcHBpbnRlcmZhY2Uvc2VydmVyL2JhY2tlbmQvY29ib2wvIi8+CisgICAgICAgIDxleGNsdWRlIG5hbWU9ImNvbS9zZWFndWxsc3cvYXBwaW50ZXJmYWNlL3NlcnZlci9iYWNrZW5kL2ltcy8iLz4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iY29tL3NlYWd1bGxzdy9hcHBpbnRlcmZhY2Uvc2VydmVyL2JhY2tlbmQvaG9zdGNvbm5lY3Rvci8iLz4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iY29tL3NlYWd1bGxzdy9hcHBpbnRlcmZhY2Uvc2VydmVyL2JhY2tlbmQvaG9zdGNvbm5lY3RvcjIvIi8+CisgICAgICAgIDxleGNsdWRlIG5hbWU9ImNvbS9zZWFndWxsc3cvYXBwaW50ZXJmYWNlL3NlcnZlci9iYWNrZW5kL2hjNTI1MC8iLz4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iY29tL3NlYWd1bGxzdy9hcHBpbnRlcmZhY2Uvc2VydmVyL2JhY2tlbmQvaGMzMjcwLyIvPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSJjb20vc2VhZ3VsbHN3L2FwcGludGVyZmFjZS9zZXJ2ZXIvYWRtaW4vIi8+CisgICAgICAgIDxleGNsdWRlIG5hbWU9ImNvbS9zZWFndWxsc3cvYXBwaW50ZXJmYWNlL3NlcnZlci9JbnZvY2F0aW9uVW5pdFRlc3RzLioiLz4KKyAgICA8L3BhdHRlcm5zZXQ+CisgICAgPHByb3BlcnR5IG5hbWU9ImFpcy1jb3JlLmphcm5hbWUiIHZhbHVlPSJhaXMtY29yZS5qYXIiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iYWlzLWNvcmUuamFyIiB2YWx1ZT0iJHtidWlsZC5saWJ9LyR7YWlzLWNvcmUuamFybmFtZX0iLz4KKyAgICA8cGF0aCBpZD0iamF4Yi5jbGFzc3BhdGgiPgorICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7amF4YjEuamFyfSIvPgorICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7amF4YjIuamFyfSIvPgorICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7amF4YjMuamFyfSIvPgorICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7amF4YjQuamFyfSIvPgorICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7amF4YjUuamFyfSIvPgorICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7amF4YjYuamFyfSIvPgorICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7amF4YjcuamFyfSIvPgorICAgIDwvcGF0aD4KKyAgICA8cGF0aCBpZD0ianNzZS5jbGFzc3BhdGgiPgorICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7amNlcnQuamFyfSIvPgorICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7am5ldC5qYXJ9Ii8+CisgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtqc3NlLmphcn0iLz4KKyAgICA8L3BhdGg+CisgICAgPHBhdGggaWQ9ImpjZS5jbGFzc3BhdGgucnQiPgorICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7amNlLmphcn0iLz4KKyAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2pjZV9wcm92aWRlci5qYXJ9Ii8+CisgICAgPC9wYXRoPgorICAgIDxwYXRoIGlkPSJhaXMuY2xhc3NwYXRoIj4KKyAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2libS5tcS5qYXJ9Ii8+CisgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtpYm0ubXFiaW5kLmphcn0iLz4KKyAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2libS5tcWptcy5qYXJ9Ii8+CisgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt4ZXJjZXMuamFyfSIvPgorICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7eG1sLWFwaXMuamFyfSIvPgorICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7eGFsYW4uamFyfSIvPgorICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7c29hcC5qYXJ9Ii8+CisgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHttYWlsLmphcn0iLz4KKyAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NvbW1vbnMtY29kZWMuamFyfSIvPgorICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y29tbW9ucy1jb2xsZWN0aW9ucy5qYXJ9Ii8+CisgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjb21tb25zLWh0dHBjbGllbnQuamFyfSIvPgorICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y29tbW9ucy1sYW5nLmphcn0iLz4KKyAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NvbW1vbnMtcG9vbC5qYXJ9Ii8+CisgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjb21tb25zLWNsaS5qYXJ9Ii8+CisgICAgICAgIDxwYXRoIHJlZmlkPSJqYXhiLmNsYXNzcGF0aCIvPgorICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7am1zLmphcn0iLz4KKyAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NvbmN1cnJlbnQuamFyfSIvPgorICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7amNlLmphcn0iLz4KKyAgICA8L3BhdGg+CisgICAgPHBhdGggaWQ9InhtbC5jbGFzc3BhdGguY29tcGlsZSI+CisgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt4bWwtYXBpcy5qYXJ9Ii8+CisgICAgPC9wYXRoPgorICAgIDxwYXRoIGlkPSJ4bWwuY2xhc3NwYXRoLnJ0Ij4KKyAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3htbC1hcGlzLmphcn0iLz4KKyAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3hlcmNlcy5qYXJ9Ii8+CisgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt4YWxhbi5qYXJ9Ii8+CisgICAgPC9wYXRoPgorICAgIDxwYXRoIGlkPSJ0cmFuc2Zvcm1zLmNsYXNzcGF0aCI+CisgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtqYWthcnRhLW9yby5qYXJ9Ii8+CisgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt4bWwtYXBpcy5qYXJ9Ii8+CisgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt4ZXJjZXMuamFyfSIvPgorICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7eGFsYW4uamFyfSIvPgorICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Z29YTUxFbmdpbmUuamFyfSIvPgorICAgICAgICA8cGF0aCByZWZpZD0iamF4Yi5jbGFzc3BhdGgiLz4KKyAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NvbW1vbnMtbGFuZy5qYXJ9Ii8+CisgICAgPC9wYXRoPgorICAgIDxwYXRoIGlkPSJhaXMuY2xpZW50LmNsYXNzcGF0aCI+CisgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtpYm0ubXEuamFyfSIvPgorICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7aWJtLm1xYmluZC5qYXJ9Ii8+CisgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtpYm0ubXFqbXMuamFyfSIvPgorICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7eG1sLWFwaXMuamFyfSIvPgorICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y29tbW9ucy1jb2xsZWN0aW9ucy5qYXJ9Ii8+CisgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjb21tb25zLWxhbmcuamFyfSIvPgorICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y29tbW9ucy1wb29sLmphcn0iLz4KKyAgICAgICAgPHBhdGggcmVmaWQ9ImpheGIuY2xhc3NwYXRoIi8+CisgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtqbXMuamFyfSIvPgorICAgIDwvcGF0aD4KKyAgICA8IS0tIEFwcEludGVyZmFjZSBDb21tdW5pY2F0aW9ucyAtLT4KKyAgICA8cGF0dGVybnNldCBpZD0iYXBwaW50ZXJmYWNlY29tbS5maWxlcyI+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9ImNvbS9zZWFndWxsc3cvYXBwaW50ZXJmYWNlL2NvbW0vIi8+CisgICAgICAgIDxleGNsdWRlIG5hbWU9ImNvbS9zZWFndWxsc3cvYXBwaW50ZXJmYWNlL2NvbW0vc2VydmxldC8qIi8+CisgICAgPC9wYXR0ZXJuc2V0PgorICAgIDwhLS0gTVRhbGsgQ29tbXVuaWNhdGlvbnMgLS0+CisgICAgPHBhdHRlcm5zZXQgaWQ9Im10YWxrY29tbS5maWxlcyI+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9ImNvbS9zZWFndWxsc3cvbmV0L2NsaWVudC9tdGFsay8iLz4KKyAgICA8L3BhdHRlcm5zZXQ+CisgICAgPCEtLSBBcHBJbnRlcmZhY2UgU2V0dGluZyAtLT4KKyAgICA8cGF0dGVybnNldCBpZD0iYXBwaW50ZXJmYWNlc2V0dGluZ3MuZmlsZXMiPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJjb20vc2VhZ3VsbHN3L2FwcGludGVyZmFjZS9zZXR0aW5ncy8qIi8+CisgICAgPC9wYXR0ZXJuc2V0PgorICAgIDxwYXRoIGlkPSJhcHBpbnRlcmZhY2VzZXR0aW5ncy5jbGFzc3BhdGgiPgorICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7eG1sLWFwaXMuamFyfSIvPgorICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y29tbW9ucy1sYW5nLmphcn0iLz4KKyAgICA8L3BhdGg+CisgICAgPCEtLSBBcHBJbnRlcmZhY2UgU2VydmVyIFNldHRpbmdzIC0tPgorICAgIDxwYXR0ZXJuc2V0IGlkPSJhcHBpbnRlcmZhY2VzZXJ2ZXJzZXR0aW5ncy5maWxlcyI+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9ImNvbS9zZWFndWxsc3cvYXBwaW50ZXJmYWNlL3NlcnZlci9zZXR0aW5ncy8iLz4KKyAgICA8L3BhdHRlcm5zZXQ+CisgICAgPCEtLSBBcHBJbnRlcmZhY2UgQ2xpZW50IC0tPgorICAgIDxwYXR0ZXJuc2V0IGlkPSJhaXMuY2xpZW50LmZpbGVzIj4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iY29tL3NlYWd1bGxzdy9hcHBpbnRlcmZhY2UvY2xpZW50LyIvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJjb20vc2VhZ3VsbHN3L3Rvb2xib3gvY29uZmlnLyIvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJjb20vc2VhZ3VsbHN3L3Rvb2xib3gveG1sLyIvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJjb20vc2VhZ3VsbHN3L3Rvb2xib3gvbG9nLyIvPgorICAgIDwvcGF0dGVybnNldD4KKyAgICA8cHJvcGVydHkgbmFtZT0iYWlzLmNsaWVudC5qYXJuYW1lIiB2YWx1ZT0iYWlzLWNsaWVudC5qYXIiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iYWlzLmNsaWVudC5qYXIiIHZhbHVlPSIke2J1aWxkLmxpYn0vJHthaXMuY2xpZW50Lmphcm5hbWV9Ii8+CisgICAgPCEtLSBBcHBJbnRlcmZhY2UgQWRtaW4gQ2xpZW50LS0+CisgICAgPHBhdHRlcm5zZXQgaWQ9ImFpcy5hZG1pbmNsaWVudC5maWxlcyI+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9ImNvbS9zZWFndWxsc3cvYXBwaW50ZXJmYWNlL3NlcnZlci9hZG1pbi8qIi8+CisgICAgPC9wYXR0ZXJuc2V0PgorICAgIDxwYXRoIGlkPSJhaXMuYWRtaW5jbGllbnQuY2xhc3NwYXRoIj4KKyAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NvbW1vbnMtbGFuZy5qYXJ9Ii8+CisgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjb21tb25zLWNsaS5qYXJ9Ii8+CisgICAgPC9wYXRoPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJhaXMtYWRtaW5jbGllbnQuamFybmFtZSIgdmFsdWU9ImFpcy1hZG1pbi1jbGllbnQuamFyIi8+CisgICAgPHByb3BlcnR5IG5hbWU9ImFpcy1hZG1pbmNsaWVudC5qYXIiIHZhbHVlPSIke2J1aWxkLmxpYn0vJHthaXMtYWRtaW5jbGllbnQuamFybmFtZX0iLz4KKyAgICA8IS0tIEFwcEludGVyZmFjZSBNb2RlbHMgLS0+CisgICAgPHBhdHRlcm5zZXQgaWQ9ImFwcGludGVyZmFjZW1vZGVscy5maWxlcyI+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9ImNvbS9zZWFndWxsc3cvYXBwaW50ZXJmYWNlL21vZGVsLyIvPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSJjb20vc2VhZ3VsbHN3L2FwcGludGVyZmFjZS9tb2RlbC9jaWNzLyIvPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSJjb20vc2VhZ3VsbHN3L2FwcGludGVyZmFjZS9tb2RlbC9jb2JvbC8iLz4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iY29tL3NlYWd1bGxzdy9hcHBpbnRlcmZhY2UvbW9kZWwvaW1zLyIvPgorICAgIDwvcGF0dGVybnNldD4KKyAgICA8IS0tIEphdmEgRXh0ZW5zaW9ucyAtLT4KKyAgICA8cGF0dGVybnNldCBpZD0iamF2YWV4dGVuc2lvbnMuZmlsZXMiPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJjb20vc2VhZ3VsbHN3L2RlYnVnLyoiLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iY29tL3NlYWd1bGxzdy9qYXZheC8iLz4KKyAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iY29tL3NlYWd1bGxzdy9qYXZheC9zd2luZy8iLz4KKyAgICA8L3BhdHRlcm5zZXQ+CisgICAgPHBhdGggaWQ9ImphdmFleHRlbnNpb25zLmNsYXNzcGF0aCI+CisgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjb21tb25zLWxhbmcuamFyfSIvPgorICAgIDwvcGF0aD4KKyAgICA8IS0tIFVJRmFjaWxpdGllcyAtLT4KKyAgICA8cGF0dGVybnNldCBpZD0idWlmYWNpbGl0aWVzLmZpbGVzIj4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iY29tL3BhcmNwbGFjZS9wamF2YS9GcmFtZXIvIi8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9ImNvbS9zZWFndWxsc3cvamF2YXgvc3dpbmcvU3dpbmdVdGlsaXRpZXNYLioiLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iY29tL3NlYWd1bGxzdy9qYXZheC9zd2luZy9KVGV4dFBhbmVYLioiLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iY29tL3NlYWd1bGxzdy9qYXZheC9zd2luZy9ib3JkZXIvIi8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9ImNvbS9zZWFndWxsc3cvdWkvIi8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9ImNvbS9zZWFndWxsc3cvZGVidWcvdWkvIi8+CisgICAgPC9wYXR0ZXJuc2V0PgorICAgIDxwYXRoIGlkPSJ1aWZhY2lsaXRpZXMuY2xhc3NwYXRoIj4KKyAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NvbW1vbnMtbGFuZy5qYXJ9Ii8+CisgICAgPC9wYXRoPgorICAgIDwhLS0gWE1MIFNlcnZpY2VzIC0tPgorICAgIDxwYXR0ZXJuc2V0IGlkPSJ4bWxzZXJ2aWNlcy5maWxlcyI+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9ImNvbS9zZWFndWxsc3cvaW8veG1sLyIvPgorICAgIDwvcGF0dGVybnNldD4KKyAgICA8cGF0aCBpZD0ieG1sc2VydmljZXMuY2xhc3NwYXRoIj4KKyAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3htbC1hcGlzLmphcn0iLz4KKyAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3hlcmNlcy5qYXJ9Ii8+CisgICAgPC9wYXRoPgorICAgIDwhLS0gVHJhbnNmb3JtcyAtLT4KKyAgICA8cGF0dGVybnNldCBpZD0idHJhbnNmb3Jtcy5maWxlcyI+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9ImNvbS9zZWFndWxsc3cvYXBwaW50ZXJmYWNlL3RyYW5zZm9ybXMvIi8+CisgICAgPC9wYXR0ZXJuc2V0PgorICAgIDwhLS0gU2VhZ3VsbCBUb29sYm94IC0tPgorICAgIDxwYXR0ZXJuc2V0IGlkPSJzZWFndWxsdG9vbGJveC5maWxlcyI+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9ImNvbS9zZWFndWxsc3cvdG9vbGJveC8iLz4KKyAgICA8L3BhdHRlcm5zZXQ+CisgICAgPHBhdGggaWQ9InNlYWd1bGx0b29sYm94LmNsYXNzcGF0aCI+CisgICAgICAgIDxwYXRoIHJlZmlkPSJ4bWwuY2xhc3NwYXRoLnJ0Ii8+CisgICAgICAgIDxwYXRoIHJlZmlkPSJqYXhiLmNsYXNzcGF0aCIvPgorICAgICAgICA8cGF0aCByZWZpZD0ianNzZS5jbGFzc3BhdGgiLz4KKyAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NvbW1vbnMtaHR0cGNsaWVudC5qYXJ9Ii8+CisgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjb21tb25zLWxhbmcuamFyfSIvPgorICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y29tbW9ucy1jbGkuamFyfSIvPgorICAgIDwvcGF0aD4KKyAgICA8IS0tIFdpbjMyIEludGVyZmFjZSAtLT4KKyAgICA8cGF0dGVybnNldCBpZD0id2luMzJpbnRlcmZhY2UuZmlsZXMiPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJjb20vc2VhZ3VsbHN3L2FwcGludGVyZmFjZS93aW4zMi8iLz4KKyAgICA8L3BhdHRlcm5zZXQ+CisgICAgPCEtLSBQcm94eSBTZXJ2bGV0IC0tPgorICAgIDxwYXR0ZXJuc2V0IGlkPSJwcm94eXNlcnZsZXQuZmlsZXMiPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJjb20vc2VhZ3VsbHN3L2FwcGludGVyZmFjZS9jb21tL3NlcnZsZXQvIi8+CisgICAgPC9wYXR0ZXJuc2V0PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJwcm94eXNlcnZsZXQuamFybmFtZSIgdmFsdWU9ImFpcy1zZXJ2bGV0LXByb3h5LmphciIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJwcm94eXNlcnZsZXQuamFyIiB2YWx1ZT0iJHtidWlsZC5saWJ9LyR7cHJveHlzZXJ2bGV0Lmphcm5hbWV9Ii8+CisgICAgPHBhdGggaWQ9InByb3h5c2VydmxldC5jbGFzc3BhdGgiPgorICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7c2VydmxldC5qYXJ9Ii8+CisgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt4ZXJjZXMuamFyfSIvPgorICAgIDwvcGF0aD4KKyAgICA8IS0tIEFkbWluIENvbnNvbGUgLS0+CisgICAgPHBhdHRlcm5zZXQgaWQ9ImFkbWluY29uc29sZS5maWxlcyI+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9ImNvbS9zZWFndWxsc3cvYXBwaW50ZXJmYWNlL3NlcnZlci9hZG1pbi9jbGllbnQvIi8+CisgICAgPC9wYXR0ZXJuc2V0PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJhZG1pbmNvbnNvbGUuamFybmFtZSIgdmFsdWU9ImFpcy1hZG1pbi5qYXIiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iYWRtaW5jb25zb2xlLmphciIgdmFsdWU9IiR7YnVpbGQubGlifS8ke2FkbWluY29uc29sZS5qYXJuYW1lfSIvPgorICAgIDwhLS0gSmF2YSBDb25uZWN0b3IgR2VuZXJhdG9yIC0tPgorICAgIDxwYXR0ZXJuc2V0IGlkPSJqYXZhY29ubmVjdG9yZ2VuZXJhdG9yLmZpbGVzIj4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iY29tL3NlYWd1bGxzdy9hcHBpbnRlcmZhY2UvdG9vbHMvamF2YWNvbm5lY3RvcmdlbmVyYXRvci8iLz4KKyAgICA8L3BhdHRlcm5zZXQ+CisgICAgPHByb3BlcnR5IG5hbWU9ImphdmFjb25uZWN0b3JnZW5lcmF0b3IuamFybmFtZSIgdmFsdWU9IkphdmFDb25uZWN0b3JHZW5lcmF0b3IuamFyIi8+CisgICAgPHByb3BlcnR5IG5hbWU9ImphdmFjb25uZWN0b3JnZW5lcmF0b3IuamFyIiB2YWx1ZT0iJHtidWlsZC5saWJ9LyR7amF2YWNvbm5lY3RvcmdlbmVyYXRvci5qYXJuYW1lfSIvPgorICAgIDwhLS0gU2VjdXJpdHkgVG9vbGtpdCAtLT4KKyAgICA8cGF0dGVybnNldCBpZD0ic2VjdXJpdHl0b29sa2l0LmZpbGVzIj4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iY29tL3NlYWd1bGxzdy9hcHBpbnRlcmZhY2UvdG9vbHMvc2VjdXJpdHkvIi8+CisgICAgPC9wYXR0ZXJuc2V0PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzZWN1cml0eXRvb2xraXQuamFybmFtZSIgdmFsdWU9IlNlY3VyaXR5VG9vbGtpdC5qYXIiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2VjdXJpdHl0b29sa2l0LmphciIgdmFsdWU9IiR7YnVpbGQubGlifS8ke3NlY3VyaXR5dG9vbGtpdC5qYXJuYW1lfSIvPgorICAgIDwhLS0gVG9vbHMgRnJhbWV3b3JrIC0tPgorICAgIDxwYXR0ZXJuc2V0IGlkPSJkZXZ0b29scy5mcmFtZXdvcmsuZmlsZXMiPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJjb20vc2VhZ3VsbHN3L2FwcGludGVyZmFjZS90b29scy9mcmFtZXdvcmsvIi8+CisgICAgPC9wYXR0ZXJuc2V0PgorICAgIDxwYXRoIGlkPSJkZXZ0b29scy5mcmFtZXdvcmsuY2xhc3NwYXRoIj4KKyAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NvbW1vbnMtbGFuZy5qYXJ9Ii8+CisgICAgPC9wYXRoPgorICAgIDwhLS0gRGV2IFRvb2xzIC0tPgorICAgIDxwYXR0ZXJuc2V0IGlkPSJkZXZ0b29scy5maWxlcyI+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9ImNvbS9zZWFndWxsc3cvYXBwaW50ZXJmYWNlL3Rvb2xzLyIvPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSJjb20vc2VhZ3VsbHN3L2FwcGludGVyZmFjZS90b29scy9zZWN1cml0eS8iLz4KKyAgICA8L3BhdHRlcm5zZXQ+CisgICAgPHBhdGggaWQ9ImRldnRvb2xzLmNsYXNzcGF0aCI+CisgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt4bWwtYXBpcy5qYXJ9Ii8+CisgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtzb2FwLmphcn0iLz4KKyAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NvbW1vbnMtbGFuZy5qYXJ9Ii8+CisgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtqY2UuamFyfSIvPgorICAgIDwvcGF0aD4KKyAgICA8cHJvcGVydHkgbmFtZT0iYWlzLXRvb2xzLmphcm5hbWUiIHZhbHVlPSJhaXMtdG9vbHMuamFyIi8+CisgICAgPHByb3BlcnR5IG5hbWU9ImFpcy10b29scy5qYXIiIHZhbHVlPSIke2J1aWxkLmxpYn0vJHthaXMtdG9vbHMuamFybmFtZX0iLz4KKyAgICA8IS0tIEphdmFUb29scyAoZS5nLiBpbnZva2luZyB0aGUgSmF2YSBjb21waWxlcikgLS0+CisgICAgPHBhdHRlcm5zZXQgaWQ9ImphdmF0b29scy5maWxlcyI+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9ImNvbS9zZWFndWxsc3cvamF2YXRvb2xzLyIvPgorICAgIDwvcGF0dGVybnNldD4KKyAgICA8cGF0aCBpZD0iamF2YXRvb2xzLmNsYXNzcGF0aCI+CisgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtqMnNlLnRvb2xzLmphcn0iLz4KKyAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2pjZS5qYXJ9Ii8+CisgICAgICAgIDxwYXRoIHJlZmlkPSJqYXhiLmNsYXNzcGF0aCIvPgorICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y29tbW9ucy1sYW5nLmphcn0iLz4KKyAgICA8L3BhdGg+CisgICAgPCEtLSBCYWNrZW5kcyAtLT4KKyAgICA8cGF0dGVybnNldCBpZD0iaGNiYWNrZW5kLmZpbGVzIj4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iY29tL3NlYWd1bGxzdy9hcHBpbnRlcmZhY2UvKiovKmhvc3Rjb25uZWN0b3IqLyIvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJjb20vc2VhZ3VsbHN3L2FwcGludGVyZmFjZS9zZXJ2ZXIvYmFja2VuZC9oc2MvKioiLz4KKyAgICA8L3BhdHRlcm5zZXQ+CisgICAgPHBhdHRlcm5zZXQgaWQ9ImNvYm9sLmZpbGVzIj4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iY29tL3NlYWd1bGxzdy9hcHBpbnRlcmZhY2Uvc2VydmVyL2JhY2tlbmQvY29ib2wvIi8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9ImNvbS9zZWFndWxsc3cvYXBwaW50ZXJmYWNlL21vZGVsL2NvYm9sLyIvPgorICAgIDwvcGF0dGVybnNldD4KKyAgICA8cGF0aCBpZD0iY29ib2wuY2xhc3NwYXRoIj4KKyAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3htbC1hcGlzLmphcn0iLz4KKyAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NvbW1vbnMtbGFuZy5qYXJ9Ii8+CisgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjb21tb25zLWh0dHBjbGllbnQuamFyfSIvPgorICAgIDwvcGF0aD4KKyAgICA8cGF0dGVybnNldCBpZD0iY2ljcy5maWxlcyI+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9ImNvbS9zZWFndWxsc3cvYXBwaW50ZXJmYWNlL3NlcnZlci9iYWNrZW5kL2NpY3MvIi8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9ImNvbS9zZWFndWxsc3cvYXBwaW50ZXJmYWNlL21vZGVsL2NpY3MvIi8+CisgICAgPC9wYXR0ZXJuc2V0PgorICAgIDxwYXR0ZXJuc2V0IGlkPSJpbXMuYmFja2VuZC5maWxlcyI+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9ImNvbS9zZWFndWxsc3cvYXBwaW50ZXJmYWNlL3NlcnZlci9iYWNrZW5kL2ltcy8iLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iY29tL3NlYWd1bGxzdy9hcHBpbnRlcmZhY2UvbW9kZWwvaW1zLyIvPgorICAgIDwvcGF0dGVybnNldD4KKyAgICA8cGF0aCBpZD0iY2ljcy5iYWNrZW5kLmNsYXNzcGF0aCI+CisgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjdGdjbGllbnQuamFyfSIvPgorICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7eG1sLWFwaXMuamFyfSIvPgorICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7eGVyY2VzLmphcn0iLz4KKyAgICAgICAgPHBhdGggcmVmaWQ9ImpheGIuY2xhc3NwYXRoIi8+CisgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtqY2UuamFyfSIvPgorICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y29tbW9ucy1jb2RlYy5qYXJ9Ii8+CisgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjb21tb25zLWxhbmcuamFyfSIvPgorICAgIDwvcGF0aD4KKyAgICA8cGF0aCBpZD0iaW1zLmJhY2tlbmQuY2xhc3NwYXRoIj4KKyAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3htbC1hcGlzLmphcn0iLz4KKyAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2phYXMuamFyfSIvPgorICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7aW1zaWNvLmphcn0iLz4KKyAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2ltc2ljby1jb25uZWN0b3IuamFyfSIvPgorICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7amNlLmphcn0iLz4KKyAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2p0YS5qYXJ9Ii8+CisgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjb21tb25zLWh0dHBjbGllbnQuamFyfSIvPgorICAgICAgICA8cGF0aCByZWZpZD0iamF4Yi5jbGFzc3BhdGgiLz4KKyAgICA8L3BhdGg+CisgICAgPHByb3BlcnR5IG5hbWU9ImFpcy01MjUwLmphcm5hbWUiIHZhbHVlPSJhaXMtNTI1MC5qYXIiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iYWlzLTUyNTAuamFyIiB2YWx1ZT0iJHtidWlsZC5saWJ9LyR7YWlzLTUyNTAuamFybmFtZX0iLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iYWlzLTMyNzAuamFybmFtZSIgdmFsdWU9ImFpcy0zMjcwLmphciIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJhaXMtMzI3MC5qYXIiIHZhbHVlPSIke2J1aWxkLmxpYn0vJHthaXMtMzI3MC5qYXJuYW1lfSIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJhaXMtY29ib2wuamFybmFtZSIgdmFsdWU9ImFpcy1jb2JvbC5qYXIiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iYWlzLWNvYm9sLmphciIgdmFsdWU9IiR7YnVpbGQubGlifS8ke2Fpcy1jb2JvbC5qYXJuYW1lfSIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJhaXMtY2ljcy5qYXJuYW1lIiB2YWx1ZT0iYWlzLWNpY3MuamFyIi8+CisgICAgPHByb3BlcnR5IG5hbWU9ImFpcy1jaWNzLmphciIgdmFsdWU9IiR7YnVpbGQubGlifS8ke2Fpcy1jaWNzLmphcm5hbWV9Ii8+CisgICAgPHByb3BlcnR5IG5hbWU9ImFpcy1pbXMuamFybmFtZSIgdmFsdWU9ImFpcy1pbXMuamFyIi8+CisgICAgPHByb3BlcnR5IG5hbWU9ImFpcy1pbXMuamFyIiB2YWx1ZT0iJHtidWlsZC5saWJ9LyR7YWlzLWltcy5qYXJuYW1lfSIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoc2MuamFybmFtZSIgdmFsdWU9Imd3aHNjLmphciIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoc2MuamFyIiB2YWx1ZT0iJHtidWlsZC5saWJ9LyR7aHNjLmphcm5hbWV9Ii8+CisgICAgPHByb3BlcnR5IG5hbWU9ImhzY3UuamFybmFtZSIgdmFsdWU9Imd3aHNjdS5qYXIiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaHNjdS5qYXIiIHZhbHVlPSIke2J1aWxkLmxpYn0vJHtoc2N1Lmphcm5hbWV9Ii8+CisgICAgPCEtLSBIU0MgLS0+CisgICAgPHBhdHRlcm5zZXQgaWQ9ImhzYy5maWxlcyI+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9ImNvbS9zZWFndWxsc3cvZ2F0ZXdheS8iLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iY29tL3NlYWd1bGxzdy9uZXQvIi8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9ImNvbS9zZWFndWxsc3cvc2VjdXJpdHkvIi8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9ImNvbS9zZWFndWxsc3cvc3lzdGVtLyIvPgorICAgICAgICA8ZXhjbHVkZSBuYW1lPSJjb20vc2VhZ3VsbHN3L25ldC9jbGllbnQvbXRhbGsvIi8+CisgICAgPC9wYXR0ZXJuc2V0PgorICAgIDwhLS0gQWxsIHRoZSBYU0xUIGZpbGVzIC0tPgorICAgIDxmaWxlc2V0IGlkPSJ4c2x0LmZpbGVzIiBkaXI9IiR7eHNsdC5yZXNvdXJjZS5kaXJ9Ij4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi54c2wiLz4KKyAgICA8L2ZpbGVzZXQ+CisgICAgPCEtLSBBbGwgdGhlIEFwcEludGVyZmFjZSAiYmFzZSIgY2xhc3NlcyAtLT4KKyAgICA8ZmlsZXNldCBpZD0iYXBwaW50ZXJmYWNlLmJhc2UuZmlsZXMiIGRpcj0iJHtidWlsZC5jbGFzc2VzfSI+CisgICAgICAgIDxwYXR0ZXJuc2V0IHJlZmlkPSJhcHBpbnRlcmZhY2Vjb21tLmZpbGVzIi8+CisgICAgICAgIDxwYXR0ZXJuc2V0IHJlZmlkPSJhcHBpbnRlcmZhY2Vtb2RlbHMuZmlsZXMiLz4KKyAgICAgICAgPHBhdHRlcm5zZXQgcmVmaWQ9ImphdmFleHRlbnNpb25zLmZpbGVzIi8+CisgICAgICAgIDxwYXR0ZXJuc2V0IHJlZmlkPSJ4bWxzZXJ2aWNlcy5maWxlcyIvPgorICAgICAgICA8cGF0dGVybnNldCByZWZpZD0ibXRhbGtjb21tLmZpbGVzIi8+CisgICAgPC9maWxlc2V0PgorICAgIDwhLS0gQWxsIHRoZSBBcHBJbnRlcmZhY2UgImJhc2UiIGNsYXNzZXMgLS0+CisgICAgPGZpbGVzZXQgaWQ9ImFwcGludGVyZmFjZS5iYXNlcGx1cy5maWxlcyIgZGlyPSIke2J1aWxkLmNsYXNzZXN9Ij4KKyAgICAgICAgPCEtLSBXaGF0IEkgcmVhbGx5IHdhbnQgdG8gZG8gaGVyZSBpcyByZWZlciB0byB0aGUgLmJhc2UuZmlsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVzZXQsIGJ1dCBhbnQgZG9lc24ndCBhbGxvdyBuZXN0ZWQgZmlsZXNldHMuIFNpZ2guCisgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCByZWZpZD0iYXBwaW50ZXJmYWNlLmJhc2UuZmlsZXMiLz4gLS0+CisgICAgICAgIDxwYXR0ZXJuc2V0IHJlZmlkPSJhcHBpbnRlcmZhY2Vjb21tLmZpbGVzIi8+CisgICAgICAgIDxwYXR0ZXJuc2V0IHJlZmlkPSJhcHBpbnRlcmZhY2Vtb2RlbHMuZmlsZXMiLz4KKyAgICAgICAgPHBhdHRlcm5zZXQgcmVmaWQ9ImphdmFleHRlbnNpb25zLmZpbGVzIi8+CisgICAgICAgIDxwYXR0ZXJuc2V0IHJlZmlkPSJ4bWxzZXJ2aWNlcy5maWxlcyIvPgorICAgICAgICA8cGF0dGVybnNldCByZWZpZD0iYXBwaW50ZXJmYWNlc2V0dGluZ3MuZmlsZXMiLz4KKyAgICAgICAgPHBhdHRlcm5zZXQgcmVmaWQ9InVpZmFjaWxpdGllcy5maWxlcyIvPgorICAgICAgICA8cGF0dGVybnNldCByZWZpZD0ic2VhZ3VsbHRvb2xib3guZmlsZXMiLz4KKyAgICAgICAgPHBhdHRlcm5zZXQgcmVmaWQ9Im10YWxrY29tbS5maWxlcyIvPgorICAgICAgICA8cGF0dGVybnNldCByZWZpZD0idHJhbnNmb3Jtcy5maWxlcyIvPgorICAgIDwvZmlsZXNldD4KKyAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgICAgPCEtLSBTZXQgZmlsZSBjb3B5IGZpbHRlcnMgLS0+CisgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXh0LmNvcHlyaWdodC4xIiB2YWx1ZT0iKGMpIDE5OTMgLSAyMDAzIFNlYWd1bGwgQnVzaW5lc3MgU29mdHdhcmUgSXJlbGFuZCBMdGQuIi8+CisgICAgPHByb3BlcnR5IG5hbWU9InRleHQuY29weXJpZ2h0LjIiIHZhbHVlPSJBbGwgUmlnaHRzIFJlc2VydmVkLiIvPgorICAgIDx0YXJnZXQgbmFtZT0iaW5pdC5maWx0ZXJzIj4KKyAgICAgICAgPGZpbHRlciB0b2tlbj0iUFJPRFVDVCIgdmFsdWU9IiR7cHJvZHVjdC5uYW1lfSIvPgorICAgICAgICA8ZmlsdGVyIHRva2VuPSJWRVJTSU9OIiB2YWx1ZT0iJHt2ZXJzaW9ufSIvPgorICAgICAgICA8ZmlsdGVyIHRva2VuPSJCVUlMRElEIiB2YWx1ZT0iJHtidWlsZC5pZH0iLz4KKyAgICAgICAgPGZpbHRlciB0b2tlbj0iQlVJTERUSU1FU1RBTVAiIHZhbHVlPSIke0J1aWxkVGltZVN0YW1wfSIvPgorICAgICAgICA8ZmlsdGVyIHRva2VuPSJDT1BZUklHSFQtMSIgdmFsdWU9IiR7dGV4dC5jb3B5cmlnaHQuMX0iLz4KKyAgICAgICAgPGZpbHRlciB0b2tlbj0iQ09QWVJJR0hULTIiIHZhbHVlPSIke3RleHQuY29weXJpZ2h0LjJ9Ii8+CisgICAgPC90YXJnZXQ+CisgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICAgIDwhLS0gQ29tcGlsZXMgLS0+CisgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICAgIDx0YXJnZXQgbmFtZT0iY29tcGlsZSIgZGVwZW5kcz0iY29tcGlsZS5haXMsIGNvbXBpbGUuYWlzLmNsaWVudCwgY29tcGlsZS5haXMuYWRtaW5jbGllbnQsIGNvbXBpbGUuZGV2dG9vbHMsIGNvbXBpbGUucHJveHlzZXJ2bGV0LCBjb21waWxlLmFkbWluY29uc29sZSwgY29tcGlsZS5qYXZhY29ubmVjdG9yZ2VuZXJhdG9yLCBjb21waWxlLnNlY3VyaXR5dG9vbGtpdCwgY29tcGlsZS5oY2JhY2tlbmQsIGNvbXBpbGUuY29ib2wsIGNvbXBpbGUuY2ljcywgY29tcGlsZS5JTVNiYWNrZW5kIiBkZXNjcmlwdGlvbj0iQ29tcGlsZXMgYWxsIHRoZSBzb3VyY2VzIGludG8gJHtidWlsZC5jbGFzc2VzfSIvPgorICAgIDwhLS0gZG9BQ29tcGlsZSAtIGEgY29tcGlsZSAic3Vicm91dGluZSIgLS0+CisgICAgPHRhcmdldCBuYW1lPSJkb0FDb21waWxlIj4KKyAgICAgICAgPGphdmFjIHNyY2Rpcj0iJHtzcmMuZGlyfSIgZGVzdGRpcj0iJHtidWlsZC5jbGFzc2VzfSIgZGVidWc9IiR7Y29tcGlsZS5kZWJ1Z30iIG9wdGltaXplPSIke2NvbXBpbGUub3B0aW1pemV9IiBmYWlsb25lcnJvcj0idHJ1ZSIgaW5jbHVkZUFudFJ1bnRpbWU9ImZhbHNlIj4KKyAgICAgICAgICAgIDxwYXR0ZXJuc2V0IHJlZmlkPSIke2RvQUNvbXBpbGUuZmlsZXN9Ii8+CisgICAgICAgIDwvamF2YWM+CisgICAgPC90YXJnZXQ+CisgICAgPCEtLSBkb0FDb21waWxlV2l0aENsYXNzcGF0aCAtIGEgY29tcGlsZSAic3Vicm91dGluZSIgLS0+CisgICAgPHRhcmdldCBuYW1lPSJkb0FDb21waWxlV2l0aENsYXNzcGF0aCI+CisgICAgICAgIDxqYXZhYyBzcmNkaXI9IiR7c3JjLmRpcn0iIGRlc3RkaXI9IiR7YnVpbGQuY2xhc3Nlc30iIGRlYnVnPSIke2NvbXBpbGUuZGVidWd9IiBvcHRpbWl6ZT0iJHtjb21waWxlLm9wdGltaXplfSIgZmFpbG9uZXJyb3I9InRydWUiIGluY2x1ZGVBbnRSdW50aW1lPSJmYWxzZSI+CisgICAgICAgICAgICA8cGF0dGVybnNldCByZWZpZD0iJHtkb0FDb21waWxlLmZpbGVzfSIvPgorICAgICAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0iJHtkb0FDb21waWxlLmNsYXNzcGF0aH0iLz4KKyAgICAgICAgPC9qYXZhYz4KKyAgICA8L3RhcmdldD4KKyAgICA8IS0tIEFJUyAtLT4KKyAgICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUuYWlzIiBkZXBlbmRzPSJjb21waWxlLnRvb2xib3gsIGNvbXBpbGUueG1sc2VydmljZXMsIGNvbXBpbGUudHJhbnNmb3JtcywgY29tcGlsZS51aWZhY2lsaXRpZXMsIGNvbXBpbGUuYXBwaW50ZXJmYWNlc2V0dGluZ3MsIGNvbXBpbGUuYXBwaW50ZXJmYWNlbW9kZWxzLCBjb21waWxlLmFwcGludGVyZmFjZWNvbW0sIGNvbXBpbGUuaHNjLCBjb21waWxlLm10YWxrY29tbSI+CisgICAgICAgIDxhbnRjYWxsIHRhcmdldD0iZG9BQ29tcGlsZVdpdGhDbGFzc3BhdGgiPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImRvQUNvbXBpbGUuZmlsZXMiIHZhbHVlPSJhaXMuZmlsZXMiLz4KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkb0FDb21waWxlLmNsYXNzcGF0aCIgdmFsdWU9ImFpcy5jbGFzc3BhdGgiLz4KKyAgICAgICAgPC9hbnRjYWxsPgorICAgIDwvdGFyZ2V0PgorICAgIDwhLS0gQXBwSW50ZXJmYWNlIE1vZGVscyAtLT4KKyAgICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUuYXBwaW50ZXJmYWNlbW9kZWxzIiBkZXBlbmRzPSJwcmVwYXJlLCBjb21waWxlLnhtbHNlcnZpY2VzIj4KKyAgICAgICAgPGFudGNhbGwgdGFyZ2V0PSJkb0FDb21waWxlV2l0aENsYXNzcGF0aCI+CisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZG9BQ29tcGlsZS5maWxlcyIgdmFsdWU9ImFwcGludGVyZmFjZW1vZGVscy5maWxlcyIvPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImRvQUNvbXBpbGUuY2xhc3NwYXRoIiB2YWx1ZT0iYWlzLmNsYXNzcGF0aCIvPgorICAgICAgICA8L2FudGNhbGw+CisgICAgPC90YXJnZXQ+CisgICAgPCEtLSBBcHBJbnRlcmZhY2UgQ29tbXVuaWNhdGlvbnMgLS0+CisgICAgPHRhcmdldCBuYW1lPSJjb21waWxlLmFwcGludGVyZmFjZWNvbW0iIGRlcGVuZHM9InByZXBhcmUiPgorICAgICAgICA8YW50Y2FsbCB0YXJnZXQ9ImRvQUNvbXBpbGVXaXRoQ2xhc3NwYXRoIj4KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkb0FDb21waWxlLmZpbGVzIiB2YWx1ZT0iYXBwaW50ZXJmYWNlY29tbS5maWxlcyIvPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImRvQUNvbXBpbGUuY2xhc3NwYXRoIiB2YWx1ZT0iYWlzLmNsYXNzcGF0aCIvPgorICAgICAgICA8L2FudGNhbGw+CisgICAgPC90YXJnZXQ+CisgICAgPCEtLSBNVGFsayBDb21tdW5pY2F0aW9uIC0tPgorICAgIDx0YXJnZXQgbmFtZT0iY29tcGlsZS5tdGFsa2NvbW0iIGRlcGVuZHM9InByZXBhcmUiPgorICAgICAgICA8YW50Y2FsbCB0YXJnZXQ9ImRvQUNvbXBpbGUiPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImRvQUNvbXBpbGUuZmlsZXMiIHZhbHVlPSJtdGFsa2NvbW0uZmlsZXMiLz4KKyAgICAgICAgPC9hbnRjYWxsPgorICAgIDwvdGFyZ2V0PgorICAgIDwhLS0gQXBwSW50ZXJmYWNlIFNldHRpbmcgLS0+CisgICAgPHRhcmdldCBuYW1lPSJjb21waWxlLmFwcGludGVyZmFjZXNldHRpbmdzIiBkZXBlbmRzPSJwcmVwYXJlIj4KKyAgICAgICAgPGFudGNhbGwgdGFyZ2V0PSJkb0FDb21waWxlV2l0aENsYXNzcGF0aCI+CisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZG9BQ29tcGlsZS5maWxlcyIgdmFsdWU9ImFwcGludGVyZmFjZXNldHRpbmdzLmZpbGVzIi8+CisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZG9BQ29tcGlsZS5jbGFzc3BhdGgiIHZhbHVlPSJhcHBpbnRlcmZhY2VzZXR0aW5ncy5jbGFzc3BhdGgiLz4KKyAgICAgICAgPC9hbnRjYWxsPgorICAgIDwvdGFyZ2V0PgorICAgIDwhLS0gVUkgRmFjaWxpdGllcyAtLT4KKyAgICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUudWlmYWNpbGl0aWVzIiBkZXBlbmRzPSJwcmVwYXJlIj4KKyAgICAgICAgPGFudGNhbGwgdGFyZ2V0PSJkb0FDb21waWxlV2l0aENsYXNzcGF0aCI+CisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZG9BQ29tcGlsZS5maWxlcyIgdmFsdWU9InVpZmFjaWxpdGllcy5maWxlcyIvPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImRvQUNvbXBpbGUuY2xhc3NwYXRoIiB2YWx1ZT0idWlmYWNpbGl0aWVzLmNsYXNzcGF0aCIvPgorICAgICAgICA8L2FudGNhbGw+CisgICAgPC90YXJnZXQ+CisgICAgPCEtLSBKYXZhIEV4dGVuc2lvbnMgLS0+CisgICAgPHRhcmdldCBuYW1lPSJjb21waWxlLmphdmFleHRlbnNpb25zIiBkZXBlbmRzPSJwcmVwYXJlIj4KKyAgICAgICAgPGFudGNhbGwgdGFyZ2V0PSJkb0FDb21waWxlV2l0aENsYXNzcGF0aCI+CisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZG9BQ29tcGlsZS5maWxlcyIgdmFsdWU9ImphdmFleHRlbnNpb25zLmZpbGVzIi8+CisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZG9BQ29tcGlsZS5jbGFzc3BhdGgiIHZhbHVlPSJqYXZhZXh0ZW5zaW9ucy5jbGFzc3BhdGgiLz4KKyAgICAgICAgPC9hbnRjYWxsPgorICAgIDwvdGFyZ2V0PgorICAgIDwhLS0gWE1MIFNlcnZpY2VzIC0tPgorICAgIDx0YXJnZXQgbmFtZT0iY29tcGlsZS54bWxzZXJ2aWNlcyIgZGVwZW5kcz0iY29tcGlsZS5qYXZhZXh0ZW5zaW9ucyI+CisgICAgICAgIDxhbnRjYWxsIHRhcmdldD0iZG9BQ29tcGlsZVdpdGhDbGFzc3BhdGgiPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImRvQUNvbXBpbGUuZmlsZXMiIHZhbHVlPSJ4bWxzZXJ2aWNlcy5maWxlcyIvPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImRvQUNvbXBpbGUuY2xhc3NwYXRoIiB2YWx1ZT0ieG1sc2VydmljZXMuY2xhc3NwYXRoIi8+CisgICAgICAgIDwvYW50Y2FsbD4KKyAgICA8L3RhcmdldD4KKyAgICA8IS0tIFRyYW5zZm9ybXMgLS0+CisgICAgPHRhcmdldCBuYW1lPSJjb21waWxlLnRyYW5zZm9ybXMiIGRlcGVuZHM9ImNvbXBpbGUuamF2YWV4dGVuc2lvbnMiPgorICAgICAgICA8YW50Y2FsbCB0YXJnZXQ9ImRvQUNvbXBpbGVXaXRoQ2xhc3NwYXRoIj4KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkb0FDb21waWxlLmZpbGVzIiB2YWx1ZT0idHJhbnNmb3Jtcy5maWxlcyIvPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImRvQUNvbXBpbGUuY2xhc3NwYXRoIiB2YWx1ZT0idHJhbnNmb3Jtcy5jbGFzc3BhdGgiLz4KKyAgICAgICAgPC9hbnRjYWxsPgorICAgIDwvdGFyZ2V0PgorICAgIDwhLS0gU2VhZ3VsbCBUb29sYm94IC0tPgorICAgIDx0YXJnZXQgbmFtZT0iY29tcGlsZS50b29sYm94IiBkZXBlbmRzPSJjb21waWxlLmphdmFleHRlbnNpb25zIj4KKyAgICAgICAgPGFudGNhbGwgdGFyZ2V0PSJkb0FDb21waWxlV2l0aENsYXNzcGF0aCI+CisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZG9BQ29tcGlsZS5maWxlcyIgdmFsdWU9InNlYWd1bGx0b29sYm94LmZpbGVzIi8+CisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZG9BQ29tcGlsZS5jbGFzc3BhdGgiIHZhbHVlPSJzZWFndWxsdG9vbGJveC5jbGFzc3BhdGgiLz4KKyAgICAgICAgPC9hbnRjYWxsPgorICAgIDwvdGFyZ2V0PgorICAgIDwhLS0gV2luMzIgSW50ZXJmYWNlIC0tPgorICAgIDx0YXJnZXQgbmFtZT0iY29tcGlsZS53aW4zMmludGVyZmFjZSIgZGVwZW5kcz0icHJlcGFyZSI+CisgICAgICAgIDxhbnRjYWxsIHRhcmdldD0iZG9BQ29tcGlsZSI+CisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZG9BQ29tcGlsZS5maWxlcyIgdmFsdWU9IndpbjMyaW50ZXJmYWNlLmZpbGVzIi8+CisgICAgICAgIDwvYW50Y2FsbD4KKyAgICA8L3RhcmdldD4KKyAgICA8IS0tIEFwcEludGVyZmFjZSBDbGllbnQgLS0+CisgICAgPHRhcmdldCBuYW1lPSJjb21waWxlLmFpcy5jbGllbnQiIGRlcGVuZHM9InByZXBhcmUsIGNvbXBpbGUueG1sc2VydmljZXMsIGNvbXBpbGUuYXBwaW50ZXJmYWNlY29tbSwgY29tcGlsZS5hcHBpbnRlcmZhY2Vtb2RlbHMiPgorICAgICAgICA8YW50Y2FsbCB0YXJnZXQ9ImRvQUNvbXBpbGVXaXRoQ2xhc3NwYXRoIj4KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkb0FDb21waWxlLmZpbGVzIiB2YWx1ZT0iYWlzLmNsaWVudC5maWxlcyIvPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImRvQUNvbXBpbGUuY2xhc3NwYXRoIiB2YWx1ZT0iYWlzLmNsaWVudC5jbGFzc3BhdGgiLz4KKyAgICAgICAgPC9hbnRjYWxsPgorICAgIDwvdGFyZ2V0PgorICAgIDwhLS0gQXBwSW50ZXJmYWNlIEFkbWluIENsaWVudCAtLT4KKyAgICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUuYWlzLmFkbWluY2xpZW50IiBkZXBlbmRzPSJwcmVwYXJlLCBjb21waWxlLnhtbHNlcnZpY2VzLCBjb21waWxlLmFwcGludGVyZmFjZWNvbW0sIGNvbXBpbGUuYXBwaW50ZXJmYWNlbW9kZWxzLCBjb21waWxlLmFpcy5jbGllbnQiPgorICAgICAgICA8YW50Y2FsbCB0YXJnZXQ9ImRvQUNvbXBpbGVXaXRoQ2xhc3NwYXRoIj4KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkb0FDb21waWxlLmZpbGVzIiB2YWx1ZT0iYWlzLmFkbWluY2xpZW50LmZpbGVzIi8+CisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZG9BQ29tcGlsZS5jbGFzc3BhdGgiIHZhbHVlPSJhaXMuY2xhc3NwYXRoIi8+CisgICAgICAgIDwvYW50Y2FsbD4KKyAgICA8L3RhcmdldD4KKyAgICA8IS0tIFByb3h5IFNlcnZsZXQgLS0+CisgICAgPHRhcmdldCBuYW1lPSJjb21waWxlLnByb3h5c2VydmxldCIgZGVwZW5kcz0icHJlcGFyZSI+CisgICAgICAgIDxhbnRjYWxsIHRhcmdldD0iZG9BQ29tcGlsZVdpdGhDbGFzc3BhdGgiPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImRvQUNvbXBpbGUuZmlsZXMiIHZhbHVlPSJwcm94eXNlcnZsZXQuZmlsZXMiLz4KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkb0FDb21waWxlLmNsYXNzcGF0aCIgdmFsdWU9InByb3h5c2VydmxldC5jbGFzc3BhdGgiLz4KKyAgICAgICAgPC9hbnRjYWxsPgorICAgIDwvdGFyZ2V0PgorICAgIDwhLS0gQWRtaW4gQ29uc29sZSAtLT4KKyAgICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUuYWRtaW5jb25zb2xlIiBkZXBlbmRzPSJwcmVwYXJlLCBjb21waWxlLmRldnRvb2xzLmZyYW1ld29yayI+CisgICAgICAgIDxhbnRjYWxsIHRhcmdldD0iZG9BQ29tcGlsZVdpdGhDbGFzc3BhdGgiPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImRvQUNvbXBpbGUuZmlsZXMiIHZhbHVlPSJhZG1pbmNvbnNvbGUuZmlsZXMiLz4KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkb0FDb21waWxlLmNsYXNzcGF0aCIgdmFsdWU9ImFpcy5hZG1pbmNsaWVudC5jbGFzc3BhdGgiLz4KKyAgICAgICAgPC9hbnRjYWxsPgorICAgIDwvdGFyZ2V0PgorICAgIDwhLS0gSmF2YSBDb25uZWN0b3IgR2VuZXJhdG9yIC0tPgorICAgIDx0YXJnZXQgbmFtZT0iY29tcGlsZS5qYXZhY29ubmVjdG9yZ2VuZXJhdG9yIiBkZXBlbmRzPSJwcmVwYXJlLCBjb21waWxlLmRldnRvb2xzLmZyYW1ld29yaywgY29tcGlsZS5hcHBpbnRlcmZhY2Vtb2RlbHMsIGNvbXBpbGUuamF2YXRvb2xzIj4KKyAgICAgICAgPGFudGNhbGwgdGFyZ2V0PSJkb0FDb21waWxlIj4KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkb0FDb21waWxlLmZpbGVzIiB2YWx1ZT0iamF2YWNvbm5lY3RvcmdlbmVyYXRvci5maWxlcyIvPgorICAgICAgICA8L2FudGNhbGw+CisgICAgPC90YXJnZXQ+CisgICAgPCEtLSBTZWN1cml0eSBUb29sa2l0IC0tPgorICAgIDx0YXJnZXQgbmFtZT0iY29tcGlsZS5zZWN1cml0eXRvb2xraXQiIGRlcGVuZHM9InByZXBhcmUsIGNvbXBpbGUuZGV2dG9vbHMuZnJhbWV3b3JrLCBjb21waWxlLmFwcGludGVyZmFjZW1vZGVscywgY29tcGlsZS5qYXZhdG9vbHMiPgorICAgICAgICA8YW50Y2FsbCB0YXJnZXQ9ImRvQUNvbXBpbGVXaXRoQ2xhc3NwYXRoIj4KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkb0FDb21waWxlLmZpbGVzIiB2YWx1ZT0ic2VjdXJpdHl0b29sa2l0LmZpbGVzIi8+CisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZG9BQ29tcGlsZS5jbGFzc3BhdGgiIHZhbHVlPSJkZXZ0b29scy5jbGFzc3BhdGgiLz4KKyAgICAgICAgPC9hbnRjYWxsPgorICAgIDwvdGFyZ2V0PgorICAgIDwhLS0gVG9vbHMgRnJhbWV3b3JrIC0tPgorICAgIDx0YXJnZXQgbmFtZT0iY29tcGlsZS5kZXZ0b29scy5mcmFtZXdvcmsiIGRlcGVuZHM9InByZXBhcmUsIGNvbXBpbGUudG9vbGJveCwgY29tcGlsZS54bWxzZXJ2aWNlcywgY29tcGlsZS51aWZhY2lsaXRpZXMsIGNvbXBpbGUuYXBwaW50ZXJmYWNlc2V0dGluZ3MiPgorICAgICAgICA8YW50Y2FsbCB0YXJnZXQ9ImRvQUNvbXBpbGVXaXRoQ2xhc3NwYXRoIj4KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkb0FDb21waWxlLmZpbGVzIiB2YWx1ZT0iZGV2dG9vbHMuZnJhbWV3b3JrLmZpbGVzIi8+CisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZG9BQ29tcGlsZS5jbGFzc3BhdGgiIHZhbHVlPSJkZXZ0b29scy5mcmFtZXdvcmsuY2xhc3NwYXRoIi8+CisgICAgICAgIDwvYW50Y2FsbD4KKyAgICA8L3RhcmdldD4KKyAgICA8IS0tIERldlRvb2xzIC0tPgorICAgIDx0YXJnZXQgbmFtZT0iY29tcGlsZS5kZXZ0b29scyIgZGVwZW5kcz0icHJlcGFyZSwgY29tcGlsZS5kZXZ0b29scy5mcmFtZXdvcmssIGNvbXBpbGUuYWlzLmNsaWVudCwgY29tcGlsZS5hcHBpbnRlcmZhY2Vtb2RlbHMsIGNvbXBpbGUuamF2YXRvb2xzIj4KKyAgICAgICAgPGFudGNhbGwgdGFyZ2V0PSJkb0FDb21waWxlV2l0aENsYXNzcGF0aCI+CisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZG9BQ29tcGlsZS5maWxlcyIgdmFsdWU9ImRldnRvb2xzLmZpbGVzIi8+CisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZG9BQ29tcGlsZS5jbGFzc3BhdGgiIHZhbHVlPSJkZXZ0b29scy5jbGFzc3BhdGgiLz4KKyAgICAgICAgPC9hbnRjYWxsPgorICAgIDwvdGFyZ2V0PgorICAgIDwhLS0gSmF2YVRvb2xzIChlLmcuIGludm9raW5nIHRoZSBKYXZhIGNvbXBpbGVyKSAtLT4KKyAgICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUuamF2YXRvb2xzIiBkZXBlbmRzPSJwcmVwYXJlIj4KKyAgICAgICAgPGFudGNhbGwgdGFyZ2V0PSJkb0FDb21waWxlV2l0aENsYXNzcGF0aCI+CisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZG9BQ29tcGlsZS5maWxlcyIgdmFsdWU9ImphdmF0b29scy5maWxlcyIvPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImRvQUNvbXBpbGUuY2xhc3NwYXRoIiB2YWx1ZT0iamF2YXRvb2xzLmNsYXNzcGF0aCIvPgorICAgICAgICA8L2FudGNhbGw+CisgICAgPC90YXJnZXQ+CisgICAgPCEtLSBCYWNrZW5kcyAtLT4KKyAgICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUuaGNiYWNrZW5kIiBkZXBlbmRzPSJwcmVwYXJlLCBjb21waWxlLmFpcyI+CisgICAgICAgIDxhbnRjYWxsIHRhcmdldD0iZG9BQ29tcGlsZVdpdGhDbGFzc3BhdGgiPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImRvQUNvbXBpbGUuZmlsZXMiIHZhbHVlPSJoY2JhY2tlbmQuZmlsZXMiLz4KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkb0FDb21waWxlLmNsYXNzcGF0aCIgdmFsdWU9ImFpcy5jbGFzc3BhdGgiLz4KKyAgICAgICAgPC9hbnRjYWxsPgorICAgIDwvdGFyZ2V0PgorICAgIDx0YXJnZXQgbmFtZT0iY29tcGlsZS5jb2JvbCIgZGVwZW5kcz0icHJlcGFyZSwgY29tcGlsZS5haXMiPgorICAgICAgICA8YW50Y2FsbCB0YXJnZXQ9ImRvQUNvbXBpbGVXaXRoQ2xhc3NwYXRoIj4KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkb0FDb21waWxlLmZpbGVzIiB2YWx1ZT0iY29ib2wuZmlsZXMiLz4KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkb0FDb21waWxlLmNsYXNzcGF0aCIgdmFsdWU9ImNvYm9sLmNsYXNzcGF0aCIvPgorICAgICAgICA8L2FudGNhbGw+CisgICAgPC90YXJnZXQ+CisgICAgPHRhcmdldCBuYW1lPSJjb21waWxlLmNpY3MiIGRlcGVuZHM9InByZXBhcmUsIGNvbXBpbGUuYWlzIj4KKyAgICAgICAgPGFudGNhbGwgdGFyZ2V0PSJkb0FDb21waWxlV2l0aENsYXNzcGF0aCI+CisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZG9BQ29tcGlsZS5maWxlcyIgdmFsdWU9ImNpY3MuZmlsZXMiLz4KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkb0FDb21waWxlLmNsYXNzcGF0aCIgdmFsdWU9ImNpY3MuYmFja2VuZC5jbGFzc3BhdGgiLz4KKyAgICAgICAgPC9hbnRjYWxsPgorICAgIDwvdGFyZ2V0PgorICAgIDx0YXJnZXQgbmFtZT0iY29tcGlsZS5JTVNiYWNrZW5kIiBkZXBlbmRzPSJwcmVwYXJlLCBjb21waWxlLmFpcyI+CisgICAgICAgIDxhbnRjYWxsIHRhcmdldD0iZG9BQ29tcGlsZVdpdGhDbGFzc3BhdGgiPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImRvQUNvbXBpbGUuZmlsZXMiIHZhbHVlPSJpbXMuYmFja2VuZC5maWxlcyIvPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImRvQUNvbXBpbGUuY2xhc3NwYXRoIiB2YWx1ZT0iaW1zLmJhY2tlbmQuY2xhc3NwYXRoIi8+CisgICAgICAgIDwvYW50Y2FsbD4KKyAgICA8L3RhcmdldD4KKyAgICA8IS0tIEhTQyAtLT4KKyAgICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUuaHNjIiBkZXBlbmRzPSJwcmVwYXJlIj4KKyAgICAgICAgPGphdmFjIHNyY2Rpcj0iJHtzcmMuc291cmNlc2FmZW1pcnJvci5kaXJ9IiBjbGFzc3BhdGg9IiR7bWljcm9zb2Z0c2VjdXJpdHljbGFzc2VzLnppcH0iIGRlc3RkaXI9IiR7YnVpbGQuY2xhc3Nlc30iIGRlYnVnPSIke2NvbXBpbGUuZGVidWd9IiBpbmNsdWRlQW50UnVudGltZT0iZmFsc2UiPgorICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iY29tL3NlYWd1bGxzdy8iLz4KKyAgICAgICAgPC9qYXZhYz4KKyAgICA8L3RhcmdldD4KKyAgICA8IS0tIEphdmFEb2MgZG9jbGV0IC0tPgorICAgIDx0YXJnZXQgbmFtZT0iY29tcGlsZS5kb2NsZXQiPgorICAgICAgICA8amF2YWMgc3JjZGlyPSIke3NyYy5kaXJ9IiBkZXN0ZGlyPSIke2J1aWxkLmNsYXNzZXN9IiBkZWJ1Zz0iJHtjb21waWxlLmRlYnVnfSIgaW5jbHVkZUFudFJ1bnRpbWU9InRydWUiPgorICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iY29tL3NlYWd1bGxzdy9pbnRlcm5hbGRldi90b29scy9hcGlkb2NsZXQvLyIvPgorICAgICAgICA8L2phdmFjPgorICAgIDwvdGFyZ2V0PgorICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgICA8IS0tIENyZWF0ZSBqYXIgZmlsZXMgLS0+CisgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICAgIDx0YXJnZXQgbmFtZT0iY29tcHV0ZS1jaGVja3N1bSI+CisgICAgICAgIDxjaGVja3N1bSBmaWxlPSIke2ZpbGV9IiBhbGdvcml0aG09IiR7Y2hlY2tzdW0uYWxnb3JpdGhtLm1kNX0iIHByb3BlcnR5PSJjc192YWx1ZSIvPgorICAgICAgICA8ZWNobyBsZXZlbD0iaW5mbyIgbWVzc2FnZT0iJHtjaGVja3N1bS5hbGdvcml0aG0ubWQ1fSAtPiAke2NzX3ZhbHVlfSIvPgorICAgICAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmNoZWNrc3VtfSIvPgorICAgICAgICA8IS0tIENyZWF0ZSBhIHRleHQgZmlsZSB3aXRoIHRoZSBjaGVja3N1bSB2YWx1ZS4gLS0+CisgICAgICAgIDxjb25jYXQgZGVzdGZpbGU9IiR7YnVpbGQuY2hlY2tzdW19LyR7ZmlsZW5hbWV9LiR7Y2hlY2tzdW0uYWxnb3JpdGhtLm1kNX0udHh0Ij4ke2NzX3ZhbHVlfTwvY29uY2F0PgorICAgICAgICA8IS0tIENyZWF0ZSBhbiBYTUwgZmlsZSB3aXRoIHRoZSBjaGVja3N1bSB2YWx1ZS4gLS0+CisgICAgICAgIDxjb25jYXQgZGVzdGZpbGU9IiR7YnVpbGQuY2hlY2tzdW19LyR7ZmlsZW5hbWV9LiR7Y2hlY2tzdW0uYWxnb3JpdGhtLm1kNX0ueG1sIj4mbHQ7P3htbCB2ZXJzaW9uPSIxLjAiPz4KKyZsdDshLS0gQnVpbGQgYXV0by1nZW5lcmF0ZWQgLS0+CismbHQ7Y2hlY2tzdW0gZmlsZT0iJHtmaWxlbmFtZX0iIGFsZ29yaXRobT0iJHtjaGVja3N1bS5hbGdvcml0aG0ubWQ1fSI+JHtjc192YWx1ZX0mbHQ7L2NoZWNrc3VtPjwvY29uY2F0PgorICAgICAgICA8eG1sdmFsaWRhdGUgZmlsZT0iJHtidWlsZC5jaGVja3N1bX0vJHtmaWxlbmFtZX0uJHtjaGVja3N1bS5hbGdvcml0aG0ubWQ1fS54bWwiIGxlbmllbnQ9InRydWUiLz4KKyAgICA8L3RhcmdldD4KKyAgICA8IS0tIENyZWF0ZSBhbGwtamFycy54bWwgLS0+CisgICAgPHRhcmdldCBuYW1lPSJjcmVhdGUtYWxsLWphcnMueG1sIj4KKyAgICAgICAgPCEtLSBDcmVhdGUgYW4gWE1MIGZpbGUgd2l0aCB0aGUgamFyIGZpbGUgbmFtZXMgY3JlYXRlZC4gLS0+CisgICAgICAgIDxjb25jYXQgZGVzdGZpbGU9IiR7YWxsLWphcnMueG1sfSI+Jmx0Oz94bWwgdmVyc2lvbj0iMS4wIj8+CismbHQ7IS0tIEJ1aWxkIGF1dG8tZ2VuZXJhdGVkIC0tPgorJmx0O2phcnM+CisgICAgJmx0O2phcj4ke2Fpcy1jb3JlLmphcm5hbWV9Jmx0Oy9qYXI+CisgICAgJmx0O2phcj4ke2Fpcy5jbGllbnQuamFybmFtZX0mbHQ7L2phcj4KKyAgICAmbHQ7amFyPiR7YWlzLWFkbWluY2xpZW50Lmphcm5hbWV9Jmx0Oy9qYXI+CisgICAgJmx0O2phcj4ke3Byb3h5c2VydmxldC5qYXJuYW1lfSZsdDsvamFyPgorICAgICZsdDtqYXI+JHthZG1pbmNvbnNvbGUuamFybmFtZX0mbHQ7L2phcj4KKyAgICAmbHQ7amFyPiR7amF2YWNvbm5lY3RvcmdlbmVyYXRvci5qYXJuYW1lfSZsdDsvamFyPgorICAgICZsdDtqYXI+JHtzZWN1cml0eXRvb2xraXQuamFybmFtZX0mbHQ7L2phcj4KKyAgICAmbHQ7amFyPiR7YWlzLXRvb2xzLmphcm5hbWV9Jmx0Oy9qYXI+CisgICAgJmx0O2phcj4ke2Fpcy01MjUwLmphcm5hbWV9Jmx0Oy9qYXI+CisgICAgJmx0O2phcj4ke2Fpcy0zMjcwLmphcm5hbWV9Jmx0Oy9qYXI+CisgICAgJmx0O2phcj4ke2Fpcy1jb2JvbC5qYXJuYW1lfSZsdDsvamFyPgorICAgICZsdDtqYXI+JHthaXMtY2ljcy5qYXJuYW1lfSZsdDsvamFyPgorICAgICZsdDtqYXI+JHthaXMtaW1zLmphcm5hbWV9Jmx0Oy9qYXI+CisgICAgJmx0O2phcj4ke2hzYy5qYXJuYW1lfSZsdDsvamFyPgorICAgICZsdDtqYXI+JHtoc2N1Lmphcm5hbWV9Jmx0Oy9qYXI+CismbHQ7L2phcnM+CisgICAgICAgIDwvY29uY2F0PgorICAgICAgICA8ZWNobyBsZXZlbD0iaW5mbyIgbWVzc2FnZT0iQ3JlYXRlZCAke2FsbC1qYXJzLnhtbH0iLz4KKyAgICAgICAgPHhtbHZhbGlkYXRlIGZpbGU9IiR7YWxsLWphcnMueG1sfSIgbGVuaWVudD0idHJ1ZSIvPgorICAgIDwvdGFyZ2V0PgorICAgIDwhLS0gQ29weSBjaGVja3N1bSBmaWxlcyB0byByZXBvcnQgZGlyIC0tPgorICAgIDx0YXJnZXQgbmFtZT0iY29weS1jaGVja3N1bXMiPgorICAgICAgICA8YW50Y2FsbCB0YXJnZXQ9ImNyZWF0ZS1hbGwtamFycy54bWwiLz4KKyAgICAgICAgPGNvcHkgdG9kaXI9IiR7cmVwb3J0cy5jaGVja3N1bX0iPgorICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2J1aWxkLmNoZWNrc3VtfSIvPgorICAgICAgICA8L2NvcHk+CisgICAgPC90YXJnZXQ+CisgICAgPHRhcmdldCBuYW1lPSJqYXJzIiBkZXBlbmRzPSJqYXIuYWlzLWNvcmUsIGphci5haXMuY2xpZW50LCBqYXIuYWlzLmFkbWluY2xpZW50LCBqYXIucHJveHlzZXJ2bGV0LCBqYXIuYWRtaW5jb25zb2xlLCBqYXIuamF2YWNvbm5lY3RvcmdlbmVyYXRvciwgamFyLnNlY3VyaXR5dG9vbGtpdCwgamFyLmFpcy10b29scywgamFyLmFpcy01MjUwLCBqYXIuYWlzLTMyNzAsIGphci5haXMtY29ib2wsIGphci5haXMtY2ljcywgamFyLmFpcy1pbXMsIGphci5oc2MiIGRlc2NyaXB0aW9uPSJDcmVhdGVzIHRoZSBqYXIgZmlsZXMgaW4gJHtidWlsZC5saWJ9Ij4KKyAgICAgICAgPGFudGNhbGwgdGFyZ2V0PSJjb3B5LWNoZWNrc3VtcyIvPgorICAgIDwvdGFyZ2V0PgorICAgIDx0YXJnZXQgbmFtZT0iamFyLmFpcy1jb3JlIiBkZXBlbmRzPSJpbml0LCBjb21waWxlLmFpcywgY3JlYXRlU3BsYXNoLmFpcy5zcGxhc2hzY3JlZW5zIj4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtidWlsZC5saWJ9Ii8+CisgICAgICAgIDxqYXIgamFyZmlsZT0iJHthaXMtY29yZS5qYXJ9IiBiYXNlZGlyPSIke2J1aWxkLmNsYXNzZXN9Ij4KKyAgICAgICAgICAgIDxwYXR0ZXJuc2V0IHJlZmlkPSJhaXMuZmlsZXMiLz4KKyAgICAgICAgICAgIDxmaWxlc2V0IHJlZmlkPSJhcHBpbnRlcmZhY2UuYmFzZXBsdXMuZmlsZXMiLz4KKyAgICAgICAgICAgIDxwYXR0ZXJuc2V0PgorICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9ImNvbS9zZWFndWxsc3cvamF2YXgvc3dpbmcvIi8+CisgICAgICAgICAgICAgICAgPCEtLSBOb3Qgc3VyZSB3aHkgdGhpcyBpc24ndCBnZXR0aW5nIGluY2x1ZGVkIGFzIHBhcnQgb2YgdWlmYWNpbGl0aWVzLmZpbGVzIHZpYSBhcHBpbnRlcmZhY2UuYmFzZXBsdXMuZmlsZXMuIC0tPgorICAgICAgICAgICAgPC9wYXR0ZXJuc2V0PgorICAgICAgICAgICAgPGZpbGVzZXQgcmVmaWQ9InhzbHQuZmlsZXMiLz4KKyAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtqYXZhLnJlc291cmNlLmRpcn0iPgorICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9ImNvbS9zZWFndWxsc3cvYXBwaW50ZXJmYWNlL3NlcnZlci8qKiIvPgorICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9ImNvbS9zZWFndWxsc3cvYXBwaW50ZXJmYWNlL2NvbW0vKioiLz4KKyAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJjb20vc2VhZ3VsbHN3L2FwcGludGVyZmFjZS9zZXJ2ZXIvYWRtaW4vKioiLz4KKyAgICAgICAgICAgIDwvZmlsZXNldD4KKyAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtzcmMuZGlyfSI+CisgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iY29tL3NlYWd1bGxzdy8qKi9qYXhiLnByb3BlcnRpZXMiLz4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJjb20vc2VhZ3VsbHN3LyoqL2JnbS5zZXIiLz4KKyAgICAgICAgICAgIDwvZmlsZXNldD4KKyAgICAgICAgICAgIDxtYW5pZmVzdD4KKyAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IkJ1aWx0LUJ5IiB2YWx1ZT0iJHt1c2VyLm5hbWV9Ii8+CisgICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSIke21hbmlmZXN0LmtleS5tYWluLWNsYXNzfSIgdmFsdWU9ImNvbS5zZWFndWxsc3cuYXBwaW50ZXJmYWNlLnNlcnZlci5BcHBJbnRlcmZhY2VTZXJ2ZXIiLz4KKyAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IiR7bWFuaWZlc3Qua2V5LmNsYXNzLXBhdGh9IiB2YWx1ZT0iJHthaXMtNTI1MC5qYXJuYW1lfSAke2Fpcy0zMjcwLmphcm5hbWV9ICR7YWlzLWNvYm9sLmphcm5hbWV9ICR7YWlzLWNpY3MuamFybmFtZX0gJHthaXMtaW1zLmphcm5hbWV9ICR7eGFsYW4uamFybmFtZX0gJHtzb2FwLmphcm5hbWV9ICR7YWN0aXZhdGlvbi5qYXJuYW1lfSAke21haWwuamFybmFtZX0gJHtjb21tb25zLWNvbGxlY3Rpb25zLmphcm5hbWV9ICR7Y29tbW9ucy1wb29sLmphcm5hbWV9ICR7eGVyY2VzLmphcm5hbWV9ICR7eG1sLWFwaXMuamFybmFtZX0gJHtjb21tb25zLWxhbmcuamFybmFtZX0gJHtjb21tb25zLWNsaS5qYXJuYW1lfSAke2pheGIuamFybmFtZXN9ICR7amFrYXJ0YS1vcm8uamFybmFtZX0gJHtjb25jdXJyZW50Lmphcm5hbWV9ICR7Y29tbW9ucy1odHRwY2xpZW50Lmphcm5hbWV9ICR7am1zLmphcm5hbWV9ICR7ZXh0ZW5zaW9uLmRpci5uYW1lfS9lbmdpbmUuamFyICR7ZXh0ZW5zaW9uLmRpci5uYW1lfS9yZXNvdXJjZS56aXAgJHtleHRlbnNpb24uZGlyLm5hbWV9L2pkb20uamFyICAuLi8ke2ZkZWYuZGlybmFtZX0vIC4uL0phdmFDb25uZWN0b3JzL0NsYXNzZXMvIi8+CisgICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSIke21hbmlmZXN0LmtleS5wcm9kdWN0fSIgdmFsdWU9IiR7cHJvZHVjdC5uYW1lfSIvPgorICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iJHttYW5pZmVzdC5rZXkuY29tcG9uZW50fSIgdmFsdWU9IkFJUyBDb3JlIi8+CisgICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSIke21hbmlmZXN0LmtleS52ZXJzaW9ufSIgdmFsdWU9IiR7dmVyc2lvbn0iLz4KKyAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IiR7bWFuaWZlc3Qua2V5LmJ1aWxkfSIgdmFsdWU9IiR7YnVpbGQuaWR9Ii8+CisgICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSIke21hbmlmZXN0LmtleS5idWlsZC10c30iIHZhbHVlPSIke0J1aWxkVGltZVN0YW1wfSIvPgorICAgICAgICAgICAgPC9tYW5pZmVzdD4KKyAgICAgICAgPC9qYXI+CisgICAgICAgIDxhbnRjYWxsIHRhcmdldD0iY29tcHV0ZS1jaGVja3N1bSI+CisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZmlsZSIgdmFsdWU9IiR7YWlzLWNvcmUuamFyfSIvPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImZpbGVuYW1lIiB2YWx1ZT0iJHthaXMtY29yZS5qYXJuYW1lfSIvPgorICAgICAgICA8L2FudGNhbGw+CisgICAgPC90YXJnZXQ+CisgICAgPHRhcmdldCBuYW1lPSJqYXIuYWlzLmNsaWVudCIgZGVwZW5kcz0iaW5pdCwgY29tcGlsZS5haXMuY2xpZW50Ij4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtidWlsZC5saWJ9Ii8+CisgICAgICAgIDxqYXIgamFyZmlsZT0iJHthaXMuY2xpZW50Lmphcn0iIGJhc2VkaXI9IiR7YnVpbGQuY2xhc3Nlc30iPgorICAgICAgICAgICAgPHBhdHRlcm5zZXQgcmVmaWQ9ImFpcy5jbGllbnQuZmlsZXMiLz4KKyAgICAgICAgICAgIDxmaWxlc2V0IHJlZmlkPSJhcHBpbnRlcmZhY2UuYmFzZS5maWxlcyIvPgorICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3NyYy5kaXJ9Ij4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJjb20vc2VhZ3VsbHN3L3Rvb2xib3gvY29uZmlnLyoqL2pheGIucHJvcGVydGllcyIvPgorICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9ImNvbS9zZWFndWxsc3cvdG9vbGJveC9jb25maWcvKiovYmdtLnNlciIvPgorICAgICAgICAgICAgPC9maWxlc2V0PgorICAgICAgICAgICAgPG1hbmlmZXN0PgorICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iQnVpbHQtQnkiIHZhbHVlPSIke3VzZXIubmFtZX0iLz4KKyAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IiR7bWFuaWZlc3Qua2V5LmNsYXNzLXBhdGh9IiB2YWx1ZT0iJHt4ZXJjZXMuamFybmFtZX0gJHt4bWwtYXBpcy5qYXJuYW1lfSAke2NvbW1vbnMtbGFuZy5qYXJuYW1lfSAke2pheGIuamFybmFtZXN9ICR7aWJtLm1xLmphcm5hbWV9ICR7am1zLmphcm5hbWV9ICR7bWFpbC5qYXJuYW1lfSAke3NvYXAuamFybmFtZX0iLz4KKyAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IiR7bWFuaWZlc3Qua2V5LnByb2R1Y3R9IiB2YWx1ZT0iJHtwcm9kdWN0Lm5hbWV9Ii8+CisgICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSIke21hbmlmZXN0LmtleS5jb21wb25lbnR9IiB2YWx1ZT0iSmF2YSBDbGllbnQiLz4KKyAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IiR7bWFuaWZlc3Qua2V5LnZlcnNpb259IiB2YWx1ZT0iJHt2ZXJzaW9ufSIvPgorICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iJHttYW5pZmVzdC5rZXkuYnVpbGR9IiB2YWx1ZT0iJHtidWlsZC5pZH0iLz4KKyAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IiR7bWFuaWZlc3Qua2V5LmJ1aWxkLXRzfSIgdmFsdWU9IiR7QnVpbGRUaW1lU3RhbXB9Ii8+CisgICAgICAgICAgICA8L21hbmlmZXN0PgorICAgICAgICA8L2phcj4KKyAgICAgICAgPGFudGNhbGwgdGFyZ2V0PSJjb21wdXRlLWNoZWNrc3VtIj4KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJmaWxlIiB2YWx1ZT0iJHthaXMuY2xpZW50Lmphcn0iLz4KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJmaWxlbmFtZSIgdmFsdWU9IiR7YWlzLmNsaWVudC5qYXJuYW1lfSIvPgorICAgICAgICA8L2FudGNhbGw+CisgICAgPC90YXJnZXQ+CisgICAgPHRhcmdldCBuYW1lPSJqYXIuYWlzLmFkbWluY2xpZW50IiBkZXBlbmRzPSJpbml0LCBjb21waWxlLmFpcy5hZG1pbmNsaWVudCI+CisgICAgICAgIDxta2RpciBkaXI9IiR7YnVpbGQubGlifSIvPgorICAgICAgICA8amFyIGphcmZpbGU9IiR7YWlzLWFkbWluY2xpZW50Lmphcn0iIGJhc2VkaXI9IiR7YnVpbGQuY2xhc3Nlc30iPgorICAgICAgICAgICAgPHBhdHRlcm5zZXQgcmVmaWQ9ImFpcy5hZG1pbmNsaWVudC5maWxlcyIvPgorICAgICAgICAgICAgPG1hbmlmZXN0PgorICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iQnVpbHQtQnkiIHZhbHVlPSIke3VzZXIubmFtZX0iLz4KKyAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IiR7bWFuaWZlc3Qua2V5LmNsYXNzLXBhdGh9IiB2YWx1ZT0iJHthaXMuY2xpZW50Lmphcm5hbWV9ICR7eGVyY2VzLmphcm5hbWV9ICR7eG1sLWFwaXMuamFybmFtZX0iLz4KKyAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IiR7bWFuaWZlc3Qua2V5LnByb2R1Y3R9IiB2YWx1ZT0iJHtwcm9kdWN0Lm5hbWV9Ii8+CisgICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSIke21hbmlmZXN0LmtleS5jb21wb25lbnR9IiB2YWx1ZT0iSmF2YSBBZG1pbiBDbGllbnQiLz4KKyAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IiR7bWFuaWZlc3Qua2V5LnZlcnNpb259IiB2YWx1ZT0iJHt2ZXJzaW9ufSIvPgorICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iJHttYW5pZmVzdC5rZXkuYnVpbGR9IiB2YWx1ZT0iJHtidWlsZC5pZH0iLz4KKyAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IiR7bWFuaWZlc3Qua2V5LmJ1aWxkLXRzfSIgdmFsdWU9IiR7QnVpbGRUaW1lU3RhbXB9Ii8+CisgICAgICAgICAgICA8L21hbmlmZXN0PgorICAgICAgICA8L2phcj4KKyAgICAgICAgPGFudGNhbGwgdGFyZ2V0PSJjb21wdXRlLWNoZWNrc3VtIj4KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJmaWxlIiB2YWx1ZT0iJHthaXMtYWRtaW5jbGllbnQuamFyfSIvPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImZpbGVuYW1lIiB2YWx1ZT0iJHthaXMtYWRtaW5jbGllbnQuamFybmFtZX0iLz4KKyAgICAgICAgPC9hbnRjYWxsPgorICAgIDwvdGFyZ2V0PgorICAgIDx0YXJnZXQgbmFtZT0iamFyLnByb3h5c2VydmxldCIgZGVwZW5kcz0iaW5pdCwgY29tcGlsZS5wcm94eXNlcnZsZXQiPgorICAgICAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmxpYn0iLz4KKyAgICAgICAgPGphciBqYXJmaWxlPSIke3Byb3h5c2VydmxldC5qYXJ9IiBiYXNlZGlyPSIke2J1aWxkLmNsYXNzZXN9Ij4KKyAgICAgICAgICAgIDxwYXR0ZXJuc2V0IHJlZmlkPSJwcm94eXNlcnZsZXQuZmlsZXMiLz4KKyAgICAgICAgICAgIDxtYW5pZmVzdD4KKyAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IkJ1aWx0LUJ5IiB2YWx1ZT0iJHt1c2VyLm5hbWV9Ii8+CisgICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSIke21hbmlmZXN0LmtleS5jbGFzcy1wYXRofSIgdmFsdWU9IiR7YWlzLmNsaWVudC5qYXJuYW1lfSAke3NlcnZsZXQuamFybmFtZX0gJHt4ZXJjZXMuamFybmFtZX0gJHt4bWwtYXBpcy5qYXJuYW1lfSIvPgorICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iJHttYW5pZmVzdC5rZXkucHJvZHVjdH0iIHZhbHVlPSIke3Byb2R1Y3QubmFtZX0iLz4KKyAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IiR7bWFuaWZlc3Qua2V5LmNvbXBvbmVudH0iIHZhbHVlPSJTZXJ2bGV0IFByb3h5Ii8+CisgICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSIke21hbmlmZXN0LmtleS52ZXJzaW9ufSIgdmFsdWU9IiR7dmVyc2lvbn0iLz4KKyAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IiR7bWFuaWZlc3Qua2V5LmJ1aWxkfSIgdmFsdWU9IiR7YnVpbGQuaWR9Ii8+CisgICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSIke21hbmlmZXN0LmtleS5idWlsZC10c30iIHZhbHVlPSIke0J1aWxkVGltZVN0YW1wfSIvPgorICAgICAgICAgICAgPC9tYW5pZmVzdD4KKyAgICAgICAgPC9qYXI+CisgICAgICAgIDxhbnRjYWxsIHRhcmdldD0iY29tcHV0ZS1jaGVja3N1bSI+CisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZmlsZSIgdmFsdWU9IiR7cHJveHlzZXJ2bGV0Lmphcn0iLz4KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJmaWxlbmFtZSIgdmFsdWU9IiR7cHJveHlzZXJ2bGV0Lmphcm5hbWV9Ii8+CisgICAgICAgIDwvYW50Y2FsbD4KKyAgICA8L3RhcmdldD4KKyAgICA8dGFyZ2V0IG5hbWU9Imphci5hZG1pbmNvbnNvbGUiIGRlcGVuZHM9ImluaXQsIGNvbXBpbGUuYWRtaW5jb25zb2xlLCBjcmVhdGVTcGxhc2guYWlzLnNwbGFzaHNjcmVlbnMiPgorICAgICAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmxpYn0iLz4KKyAgICAgICAgPCEtLSBDb3B5ICJyZXNvdXJjZSIgZmlsZXMgdGhhdCBnbyBpbiB0aGUgamFyIGZpbGUuIC0tPgorICAgICAgICA8Y29weSB0b0Rpcj0iJHtidWlsZC5jbGFzc2VzfSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiPgorICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2phdmEucmVzb3VyY2UuZGlyfSI+CisgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iY29tL3NlYWd1bGxzdy9hcHBpbnRlcmZhY2Uvc2VydmVyL2FkbWluL2NsaWVudC8iLz4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJjb20vc2VhZ3VsbHN3L2FwcGludGVyZmFjZS9zZXJ2ZXIvKi5qcGciLz4KKyAgICAgICAgICAgIDwvZmlsZXNldD4KKyAgICAgICAgPC9jb3B5PgorICAgICAgICA8amFyIGphcmZpbGU9IiR7YWRtaW5jb25zb2xlLmphcn0iIGJhc2VkaXI9IiR7YnVpbGQuY2xhc3Nlc30iPgorICAgICAgICAgICAgPHBhdHRlcm5zZXQgcmVmaWQ9ImFkbWluY29uc29sZS5maWxlcyIvPgorICAgICAgICAgICAgPHBhdHRlcm5zZXQgcmVmaWQ9ImRldnRvb2xzLmZyYW1ld29yay5maWxlcyIvPgorICAgICAgICAgICAgPHBhdHRlcm5zZXQgcmVmaWQ9ImFpcy5jbGllbnQuZmlsZXMiLz4KKyAgICAgICAgICAgIDxwYXR0ZXJuc2V0IHJlZmlkPSJhcHBpbnRlcmZhY2VzZXJ2ZXJzZXR0aW5ncy5maWxlcyIvPgorICAgICAgICAgICAgPGZpbGVzZXQgcmVmaWQ9ImFwcGludGVyZmFjZS5iYXNlcGx1cy5maWxlcyIvPgorICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iY29tL3NlYWd1bGxzdy9hcHBpbnRlcmZhY2Uvc2VydmVyLyouanBnIi8+CisgICAgICAgICAgICA8bWFuaWZlc3Q+CisgICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJCdWlsdC1CeSIgdmFsdWU9IiR7dXNlci5uYW1lfSIvPgorICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iJHttYW5pZmVzdC5rZXkubWFpbi1jbGFzc30iIHZhbHVlPSJjb20uc2VhZ3VsbHN3LmFwcGludGVyZmFjZS5zZXJ2ZXIuYWRtaW4uY2xpZW50LkFwcEludGVyZmFjZVNlcnZlckFkbWluVUlDbGllbnQiLz4KKyAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IiR7bWFuaWZlc3Qua2V5LmNsYXNzLXBhdGh9IiB2YWx1ZT0iJHthaXMtY29yZS5qYXJuYW1lfSAke3hlcmNlcy5qYXJuYW1lfSAke3htbC1hcGlzLmphcm5hbWV9ICR7eGFsYW4uamFybmFtZX0gJHtzb2FwLmphcm5hbWV9ICR7YWN0aXZhdGlvbi5qYXJuYW1lfSAke21haWwuamFybmFtZX0gJHtjb21tb25zLWNsaS5qYXJuYW1lfSIvPgorICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iJHttYW5pZmVzdC5rZXkucHJvZHVjdH0iIHZhbHVlPSIke3Byb2R1Y3QubmFtZX0iLz4KKyAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IiR7bWFuaWZlc3Qua2V5LmNvbXBvbmVudH0iIHZhbHVlPSJBZG1pbmlzdHJhdGl2ZSBDb25zb2xlIi8+CisgICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSIke21hbmlmZXN0LmtleS52ZXJzaW9ufSIgdmFsdWU9IiR7dmVyc2lvbn0iLz4KKyAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IiR7bWFuaWZlc3Qua2V5LmJ1aWxkfSIgdmFsdWU9IiR7YnVpbGQuaWR9Ii8+CisgICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSIke21hbmlmZXN0LmtleS5idWlsZC10c30iIHZhbHVlPSIke0J1aWxkVGltZVN0YW1wfSIvPgorICAgICAgICAgICAgPC9tYW5pZmVzdD4KKyAgICAgICAgPC9qYXI+CisgICAgICAgIDxhbnRjYWxsIHRhcmdldD0iY29tcHV0ZS1jaGVja3N1bSI+CisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZmlsZSIgdmFsdWU9IiR7YWRtaW5jb25zb2xlLmphcn0iLz4KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJmaWxlbmFtZSIgdmFsdWU9IiR7YWRtaW5jb25zb2xlLmphcm5hbWV9Ii8+CisgICAgICAgIDwvYW50Y2FsbD4KKyAgICA8L3RhcmdldD4KKyAgICA8dGFyZ2V0IG5hbWU9Imphci5qYXZhY29ubmVjdG9yZ2VuZXJhdG9yIiBkZXBlbmRzPSJpbml0LCBjb21waWxlLmphdmFjb25uZWN0b3JnZW5lcmF0b3IiPgorICAgICAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmxpYn0iLz4KKyAgICAgICAgPCEtLSBDb3B5ICJyZXNvdXJjZSIgZmlsZXMgdGhhdCBnbyBpbiB0aGUgamFyIGZpbGUuIC0tPgorICAgICAgICA8Y29weSB0b0Rpcj0iJHtidWlsZC5jbGFzc2VzfSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiIGZpbHRlcmluZz0idHJ1ZSI+CisgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7amF2YS5yZXNvdXJjZS5kaXJ9Ij4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJjb20vc2VhZ3VsbHN3L2FwcGludGVyZmFjZS90b29scy9qYXZhY29ubmVjdG9yZ2VuZXJhdG9yLyIvPgorICAgICAgICAgICAgPC9maWxlc2V0PgorICAgICAgICA8L2NvcHk+CisgICAgICAgIDxqYXIgamFyZmlsZT0iJHtqYXZhY29ubmVjdG9yZ2VuZXJhdG9yLmphcn0iIGJhc2VkaXI9IiR7YnVpbGQuY2xhc3Nlc30iPgorICAgICAgICAgICAgPHBhdHRlcm5zZXQgcmVmaWQ9ImphdmFjb25uZWN0b3JnZW5lcmF0b3IuZmlsZXMiLz4KKyAgICAgICAgICAgIDxtYW5pZmVzdD4KKyAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IkJ1aWx0LUJ5IiB2YWx1ZT0iJHt1c2VyLm5hbWV9Ii8+CisgICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSIke21hbmlmZXN0LmtleS5tYWluLWNsYXNzfSIgdmFsdWU9ImNvbS5zZWFndWxsc3cuYXBwaW50ZXJmYWNlLnRvb2xzLmphdmFjb25uZWN0b3JnZW5lcmF0b3IuSmF2YUNvbm5lY3RvckdlbmVyYXRvciIvPgorICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iJHttYW5pZmVzdC5rZXkuY2xhc3MtcGF0aH0iIHZhbHVlPSIke2Fpcy10b29scy5qYXJuYW1lfSAke3htbC1hcGlzLmphcm5hbWV9Ii8+CisgICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSIke21hbmlmZXN0LmtleS5wcm9kdWN0fSIgdmFsdWU9IiR7cHJvZHVjdC5uYW1lfSIvPgorICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iJHttYW5pZmVzdC5rZXkuY29tcG9uZW50fSIgdmFsdWU9IkphdmEgQ29ubmVjdG9yIEdlbmVyYXRvciIvPgorICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iJHttYW5pZmVzdC5rZXkudmVyc2lvbn0iIHZhbHVlPSIke3ZlcnNpb259Ii8+CisgICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSIke21hbmlmZXN0LmtleS5idWlsZH0iIHZhbHVlPSIke2J1aWxkLmlkfSIvPgorICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iJHttYW5pZmVzdC5rZXkuYnVpbGQtdHN9IiB2YWx1ZT0iJHtCdWlsZFRpbWVTdGFtcH0iLz4KKyAgICAgICAgICAgIDwvbWFuaWZlc3Q+CisgICAgICAgIDwvamFyPgorICAgICAgICA8YW50Y2FsbCB0YXJnZXQ9ImNvbXB1dGUtY2hlY2tzdW0iPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImZpbGUiIHZhbHVlPSIke2phdmFjb25uZWN0b3JnZW5lcmF0b3IuamFyfSIvPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImZpbGVuYW1lIiB2YWx1ZT0iJHtqYXZhY29ubmVjdG9yZ2VuZXJhdG9yLmphcm5hbWV9Ii8+CisgICAgICAgIDwvYW50Y2FsbD4KKyAgICA8L3RhcmdldD4KKyAgICA8dGFyZ2V0IG5hbWU9Imphci5zZWN1cml0eXRvb2xraXQiIGRlcGVuZHM9ImluaXQsIGNvbXBpbGUuc2VjdXJpdHl0b29sa2l0Ij4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtidWlsZC5saWJ9Ii8+CisgICAgICAgIDwhLS0gQ29weSAicmVzb3VyY2UiIGZpbGVzIHRoYXQgZ28gaW4gdGhlIGphciBmaWxlLiAtLT4KKyAgICAgICAgPGNvcHkgdG9EaXI9IiR7YnVpbGQuY2xhc3Nlc30iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIiBmaWx0ZXJpbmc9InRydWUiPgorICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2phdmEucmVzb3VyY2UuZGlyfSI+CisgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iY29tL3NlYWd1bGxzdy9hcHBpbnRlcmZhY2UvdG9vbHMvc2VjdXJpdHkvIi8+CisgICAgICAgICAgICA8L2ZpbGVzZXQ+CisgICAgICAgIDwvY29weT4KKyAgICAgICAgPGphciBqYXJmaWxlPSIke3NlY3VyaXR5dG9vbGtpdC5qYXJ9IiBiYXNlZGlyPSIke2J1aWxkLmNsYXNzZXN9Ij4KKyAgICAgICAgICAgIDxwYXR0ZXJuc2V0IHJlZmlkPSJzZWN1cml0eXRvb2xraXQuZmlsZXMiLz4KKyAgICAgICAgICAgIDxtYW5pZmVzdD4KKyAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IkJ1aWx0LUJ5IiB2YWx1ZT0iJHt1c2VyLm5hbWV9Ii8+CisgICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSIke21hbmlmZXN0LmtleS5tYWluLWNsYXNzfSIgdmFsdWU9ImNvbS5zZWFndWxsc3cuYXBwaW50ZXJmYWNlLnRvb2xzLnNlY3VyaXR5LlNlY3VyaXR5VG9vbGtpdCIvPgorICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iJHttYW5pZmVzdC5rZXkuY2xhc3MtcGF0aH0iIHZhbHVlPSIke2Fpcy1jb3JlLmphcm5hbWV9ICR7YWlzLXRvb2xzLmphcm5hbWV9ICR7eG1sLWFwaXMuamFybmFtZX0gJHtjb21tb25zLWxhbmcuamFybmFtZX0iLz4KKyAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IiR7bWFuaWZlc3Qua2V5LnByb2R1Y3R9IiB2YWx1ZT0iJHtwcm9kdWN0Lm5hbWV9Ii8+CisgICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSIke21hbmlmZXN0LmtleS5jb21wb25lbnR9IiB2YWx1ZT0iU2VjdXJpdHkgVG9vbGtpdCIvPgorICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iJHttYW5pZmVzdC5rZXkudmVyc2lvbn0iIHZhbHVlPSIke3ZlcnNpb259Ii8+CisgICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSIke21hbmlmZXN0LmtleS5idWlsZH0iIHZhbHVlPSIke2J1aWxkLmlkfSIvPgorICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iJHttYW5pZmVzdC5rZXkuYnVpbGQtdHN9IiB2YWx1ZT0iJHtCdWlsZFRpbWVTdGFtcH0iLz4KKyAgICAgICAgICAgIDwvbWFuaWZlc3Q+CisgICAgICAgIDwvamFyPgorICAgICAgICA8YW50Y2FsbCB0YXJnZXQ9ImNvbXB1dGUtY2hlY2tzdW0iPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImZpbGUiIHZhbHVlPSIke3NlY3VyaXR5dG9vbGtpdC5qYXJ9Ii8+CisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZmlsZW5hbWUiIHZhbHVlPSIke3NlY3VyaXR5dG9vbGtpdC5qYXJuYW1lfSIvPgorICAgICAgICA8L2FudGNhbGw+CisgICAgPC90YXJnZXQ+CisgICAgPHRhcmdldCBuYW1lPSJqYXIuYWlzLXRvb2xzIiBkZXBlbmRzPSJpbml0LCBjb21waWxlLmRldnRvb2xzLCBjcmVhdGVTcGxhc2gudG9vbHMuc3BsYXNoc2NyZWVucywgY29tcGlsZS53aW4zMmludGVyZmFjZSwgY29tcGlsZS5qYXZhdG9vbHMiPgorICAgICAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmxpYn0iLz4KKyAgICAgICAgPCEtLSBDb3B5ICJyZXNvdXJjZSIgZmlsZXMgdGhhdCBnbyBpbiB0aGUgamFyIGZpbGUuIC0tPgorICAgICAgICA8Y29weSB0b0Rpcj0iJHtidWlsZC5jbGFzc2VzfSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiPgorICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2phdmEucmVzb3VyY2UuZGlyfSI+CisgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iY29tL3NlYWd1bGxzdy9hcHBpbnRlcmZhY2UvKiovKi5naWYiLz4KKyAgICAgICAgICAgIDwvZmlsZXNldD4KKyAgICAgICAgPC9jb3B5PgorICAgICAgICA8amFyIGphcmZpbGU9IiR7YWlzLXRvb2xzLmphcn0iIGJhc2VkaXI9IiR7YnVpbGQuY2xhc3Nlc30iPgorICAgICAgICAgICAgPHBhdHRlcm5zZXQgcmVmaWQ9ImRldnRvb2xzLmZpbGVzIi8+CisgICAgICAgICAgICA8cGF0dGVybnNldCByZWZpZD0iYWRtaW5jb25zb2xlLmZpbGVzIi8+CisgICAgICAgICAgICA8ZmlsZXNldCByZWZpZD0iYXBwaW50ZXJmYWNlLmJhc2VwbHVzLmZpbGVzIi8+CisgICAgICAgICAgICA8cGF0dGVybnNldD4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJjb20vc2VhZ3VsbHN3L2FwcGludGVyZmFjZS8qKi8qc2V0dGluZ3MqLyIvPgorICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9ImNvbS9zZWFndWxsc3cvamF2YXgvc3dpbmcvIi8+CisgICAgICAgICAgICAgICAgPCEtLSBOb3Qgc3VyZSB3aHkgdGhpcyBpc24ndCBnZXR0aW5nIGluY2x1ZGVkIGFzIHBhcnQgb2YgdWlmYWNpbGl0aWVzLmZpbGVzIHZpYSBhcHBpbnRlcmZhY2UuYmFzZXBsdXMuZmlsZXMuIC0tPgorICAgICAgICAgICAgPC9wYXR0ZXJuc2V0PgorICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iY29tL3NlYWd1bGxzdy9hcHBpbnRlcmZhY2UvdG9vbHMvaW1hZ2VzLyouanBnIi8+CisgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJjb20vc2VhZ3VsbHN3L2FwcGludGVyZmFjZS8qKi8qLmdpZiIvPgorICAgICAgICAgICAgPHBhdHRlcm5zZXQgcmVmaWQ9ImphdmF0b29scy5maWxlcyIvPgorICAgICAgICAgICAgPHBhdHRlcm5zZXQgcmVmaWQ9IndpbjMyaW50ZXJmYWNlLmZpbGVzIi8+CisgICAgICAgICAgICA8cGF0dGVybnNldCByZWZpZD0iYWlzLmNsaWVudC5maWxlcyIvPgorICAgICAgICAgICAgPGZpbGVzZXQgcmVmaWQ9InhzbHQuZmlsZXMiLz4KKyAgICAgICAgICAgIDxtYW5pZmVzdD4KKyAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IkJ1aWx0LUJ5IiB2YWx1ZT0iJHt1c2VyLm5hbWV9Ii8+CisgICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSIke21hbmlmZXN0LmtleS5tYWluLWNsYXNzfSIgdmFsdWU9ImNvbS5zZWFndWxsc3cuYXBwaW50ZXJmYWNlLnRvb2xzLnNlcnZlcmRlZi5EZWZpbml0aW9uVG9vbCIvPgorICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iJHttYW5pZmVzdC5rZXkuY2xhc3MtcGF0aH0iIHZhbHVlPSIke2Fpcy1jb2JvbC5qYXJuYW1lfSAke2Fpcy1jaWNzLmphcm5hbWV9ICR7YWlzLWltcy5qYXJuYW1lfSAke3hlcmNlcy5qYXJuYW1lfSAke3htbC1hcGlzLmphcm5hbWV9ICR7eGFsYW4uamFybmFtZX0gJHtzb2FwLmphcm5hbWV9ICR7YWN0aXZhdGlvbi5qYXJuYW1lfSAke21haWwuamFybmFtZX0gJHtqYXhiLmphcm5hbWVzfSAke2NvbW1vbnMtbGFuZy5qYXJuYW1lfSAke2V4dGVuc2lvbi5kaXIubmFtZX0vJHtqMnNlLnRvb2xzLmphcm5hbWV9ICR7YWlzLXRvb2xzLmphcm5hbWV9Ii8+CisgICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSIke21hbmlmZXN0LmtleS5wcm9kdWN0fSIgdmFsdWU9IiR7cHJvZHVjdC5uYW1lfSIvPgorICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iJHttYW5pZmVzdC5rZXkuY29tcG9uZW50fSIgdmFsdWU9IlRvb2xzIi8+CisgICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSIke21hbmlmZXN0LmtleS52ZXJzaW9ufSIgdmFsdWU9IiR7dmVyc2lvbn0iLz4KKyAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IiR7bWFuaWZlc3Qua2V5LmJ1aWxkfSIgdmFsdWU9IiR7YnVpbGQuaWR9Ii8+CisgICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSIke21hbmlmZXN0LmtleS5idWlsZC10c30iIHZhbHVlPSIke0J1aWxkVGltZVN0YW1wfSIvPgorICAgICAgICAgICAgPC9tYW5pZmVzdD4KKyAgICAgICAgPC9qYXI+CisgICAgICAgIDxhbnRjYWxsIHRhcmdldD0iY29tcHV0ZS1jaGVja3N1bSI+CisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZmlsZSIgdmFsdWU9IiR7YWlzLXRvb2xzLmphcn0iLz4KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJmaWxlbmFtZSIgdmFsdWU9IiR7YWlzLXRvb2xzLmphcm5hbWV9Ii8+CisgICAgICAgIDwvYW50Y2FsbD4KKyAgICA8L3RhcmdldD4KKyAgICA8dGFyZ2V0IG5hbWU9Imphci5haXMtNTI1MCIgZGVwZW5kcz0iaW5pdCwgY29tcGlsZS5oY2JhY2tlbmQiPgorICAgICAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmxpYn0iLz4KKyAgICAgICAgPGphciBqYXJmaWxlPSIke2Fpcy01MjUwLmphcn0iIGJhc2VkaXI9IiR7YnVpbGQuY2xhc3Nlc30iPgorICAgICAgICAgICAgPHBhdHRlcm5zZXQgcmVmaWQ9ImhjYmFja2VuZC5maWxlcyIvPgorICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iY29tL3NlYWd1bGxzdy9hcHBpbnRlcmZhY2UvdG9vbHMvIi8+CisgICAgICAgICAgICA8bWFuaWZlc3Q+CisgICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJCdWlsdC1CeSIgdmFsdWU9IiR7dXNlci5uYW1lfSIvPgorICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iJHttYW5pZmVzdC5rZXkuY2xhc3MtcGF0aH0iIHZhbHVlPSIke2Fpcy1jb3JlLmphcm5hbWV9ICR7aHNjLmphcm5hbWV9ICR7aHNjdS5qYXJuYW1lfSIvPgorICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iJHttYW5pZmVzdC5rZXkucHJvZHVjdH0iIHZhbHVlPSIke3Byb2R1Y3QubmFtZX0iLz4KKyAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IiR7bWFuaWZlc3Qua2V5LmNvbXBvbmVudH0iIHZhbHVlPSI1MjUwIENvbm5lY3RvciIvPgorICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iJHttYW5pZmVzdC5rZXkudmVyc2lvbn0iIHZhbHVlPSIke3ZlcnNpb259Ii8+CisgICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSIke21hbmlmZXN0LmtleS5idWlsZH0iIHZhbHVlPSIke2J1aWxkLmlkfSIvPgorICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iJHttYW5pZmVzdC5rZXkuYnVpbGQtdHN9IiB2YWx1ZT0iJHtCdWlsZFRpbWVTdGFtcH0iLz4KKyAgICAgICAgICAgIDwvbWFuaWZlc3Q+CisgICAgICAgIDwvamFyPgorICAgICAgICA8YW50Y2FsbCB0YXJnZXQ9ImNvbXB1dGUtY2hlY2tzdW0iPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImZpbGUiIHZhbHVlPSIke2Fpcy01MjUwLmphcn0iLz4KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJmaWxlbmFtZSIgdmFsdWU9IiR7YWlzLTUyNTAuamFybmFtZX0iLz4KKyAgICAgICAgPC9hbnRjYWxsPgorICAgIDwvdGFyZ2V0PgorICAgIDx0YXJnZXQgbmFtZT0iamFyLmFpcy0zMjcwIiBkZXBlbmRzPSJpbml0LCBjb21waWxlLmhjYmFja2VuZCI+CisgICAgICAgIDxta2RpciBkaXI9IiR7YnVpbGQubGlifSIvPgorICAgICAgICA8amFyIGphcmZpbGU9IiR7YWlzLTMyNzAuamFyfSIgYmFzZWRpcj0iJHtidWlsZC5jbGFzc2VzfSI+CisgICAgICAgICAgICA8cGF0dGVybnNldCByZWZpZD0iaGNiYWNrZW5kLmZpbGVzIi8+CisgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJjb20vc2VhZ3VsbHN3L2FwcGludGVyZmFjZS90b29scy8iLz4KKyAgICAgICAgICAgIDxtYW5pZmVzdD4KKyAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IkJ1aWx0LUJ5IiB2YWx1ZT0iJHt1c2VyLm5hbWV9Ii8+CisgICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSIke21hbmlmZXN0LmtleS5jbGFzcy1wYXRofSIgdmFsdWU9IiR7YWlzLWNvcmUuamFybmFtZX0gJHtoc2MuamFybmFtZX0gJHtoc2N1Lmphcm5hbWV9Ii8+CisgICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSIke21hbmlmZXN0LmtleS5wcm9kdWN0fSIgdmFsdWU9IiR7cHJvZHVjdC5uYW1lfSIvPgorICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iJHttYW5pZmVzdC5rZXkuY29tcG9uZW50fSIgdmFsdWU9IjMyNzAgQ29ubmVjdG9yIi8+CisgICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSIke21hbmlmZXN0LmtleS52ZXJzaW9ufSIgdmFsdWU9IiR7dmVyc2lvbn0iLz4KKyAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IiR7bWFuaWZlc3Qua2V5LmJ1aWxkfSIgdmFsdWU9IiR7YnVpbGQuaWR9Ii8+CisgICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSIke21hbmlmZXN0LmtleS5idWlsZC10c30iIHZhbHVlPSIke0J1aWxkVGltZVN0YW1wfSIvPgorICAgICAgICAgICAgPC9tYW5pZmVzdD4KKyAgICAgICAgPC9qYXI+CisgICAgICAgIDxhbnRjYWxsIHRhcmdldD0iY29tcHV0ZS1jaGVja3N1bSI+CisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZmlsZSIgdmFsdWU9IiR7YWlzLTMyNzAuamFyfSIvPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImZpbGVuYW1lIiB2YWx1ZT0iJHthaXMtMzI3MC5qYXJuYW1lfSIvPgorICAgICAgICA8L2FudGNhbGw+CisgICAgPC90YXJnZXQ+CisgICAgPHRhcmdldCBuYW1lPSJqYXIuYWlzLWNvYm9sIiBkZXBlbmRzPSJpbml0LCBjb21waWxlLmNvYm9sIj4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtidWlsZC5saWJ9Ii8+CisgICAgICAgIDxqYXIgamFyZmlsZT0iJHthaXMtY29ib2wuamFyfSIgYmFzZWRpcj0iJHtidWlsZC5jbGFzc2VzfSI+CisgICAgICAgICAgICA8cGF0dGVybnNldCByZWZpZD0iY29ib2wuZmlsZXMiLz4KKyAgICAgICAgICAgIDxtYW5pZmVzdD4KKyAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IkJ1aWx0LUJ5IiB2YWx1ZT0iJHt1c2VyLm5hbWV9Ii8+CisgICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSIke21hbmlmZXN0LmtleS5jbGFzcy1wYXRofSIgdmFsdWU9IiR7YWlzLWNvcmUuamFybmFtZX0gJHthaXMtY2ljcy5qYXJuYW1lfSAke2Fpcy1pbXMuamFybmFtZX0iLz4KKyAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IiR7bWFuaWZlc3Qua2V5LnByb2R1Y3R9IiB2YWx1ZT0iJHtwcm9kdWN0Lm5hbWV9Ii8+CisgICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSIke21hbmlmZXN0LmtleS5jb21wb25lbnR9IiB2YWx1ZT0iQ29ib2wgQ29ubmVjdG9yIi8+CisgICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSIke21hbmlmZXN0LmtleS52ZXJzaW9ufSIgdmFsdWU9IiR7dmVyc2lvbn0iLz4KKyAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IiR7bWFuaWZlc3Qua2V5LmJ1aWxkfSIgdmFsdWU9IiR7YnVpbGQuaWR9Ii8+CisgICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSIke21hbmlmZXN0LmtleS5idWlsZC10c30iIHZhbHVlPSIke0J1aWxkVGltZVN0YW1wfSIvPgorICAgICAgICAgICAgPC9tYW5pZmVzdD4KKyAgICAgICAgPC9qYXI+CisgICAgICAgIDxhbnRjYWxsIHRhcmdldD0iY29tcHV0ZS1jaGVja3N1bSI+CisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZmlsZSIgdmFsdWU9IiR7YWlzLWNvYm9sLmphcn0iLz4KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJmaWxlbmFtZSIgdmFsdWU9IiR7YWlzLWNvYm9sLmphcm5hbWV9Ii8+CisgICAgICAgIDwvYW50Y2FsbD4KKyAgICA8L3RhcmdldD4KKyAgICA8dGFyZ2V0IG5hbWU9Imphci5haXMtY2ljcyIgZGVwZW5kcz0iaW5pdCwgY29tcGlsZS5jaWNzIj4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtidWlsZC5saWJ9Ii8+CisgICAgICAgIDxjb3B5IHRvRGlyPSIke2J1aWxkLmNsYXNzZXN9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSI+CisgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7c3JjLmRpcn0iPgorICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9ImNvbS9zZWFndWxsc3cvKiovamF4Yi5wcm9wZXJ0aWVzIi8+CisgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iY29tL3NlYWd1bGxzdy8qKi9iZ20uc2VyIi8+CisgICAgICAgICAgICA8L2ZpbGVzZXQ+CisgICAgICAgIDwvY29weT4KKyAgICAgICAgPGphciBqYXJmaWxlPSIke2Fpcy1jaWNzLmphcn0iIGJhc2VkaXI9IiR7YnVpbGQuY2xhc3Nlc30iPgorICAgICAgICAgICAgPHBhdHRlcm5zZXQgcmVmaWQ9ImNpY3MuZmlsZXMiLz4KKyAgICAgICAgICAgIDxtYW5pZmVzdD4KKyAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IkJ1aWx0LUJ5IiB2YWx1ZT0iJHt1c2VyLm5hbWV9Ii8+CisgICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSIke21hbmlmZXN0LmtleS5jbGFzcy1wYXRofSIgdmFsdWU9IiR7YWlzLWNvcmUuamFybmFtZX0gJHthaXMtY29ib2wuamFybmFtZX0gJHtleHRlbnNpb24uZGlyLm5hbWV9LyR7Y3RnY2xpZW50Lmphcm5hbWV9ICR7Y29tbW9ucy1jb2RlYy5qYXJuYW1lfSAke2NvbW1vbnMtbG9nZ2luZy5qYXJuYW1lfSIvPgorICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iJHttYW5pZmVzdC5rZXkucHJvZHVjdH0iIHZhbHVlPSIke3Byb2R1Y3QubmFtZX0iLz4KKyAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IiR7bWFuaWZlc3Qua2V5LmNvbXBvbmVudH0iIHZhbHVlPSJDSUNTIENvbm5lY3RvciIvPgorICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iJHttYW5pZmVzdC5rZXkudmVyc2lvbn0iIHZhbHVlPSIke3ZlcnNpb259Ii8+CisgICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSIke21hbmlmZXN0LmtleS5idWlsZH0iIHZhbHVlPSIke2J1aWxkLmlkfSIvPgorICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iJHttYW5pZmVzdC5rZXkuYnVpbGQtdHN9IiB2YWx1ZT0iJHtCdWlsZFRpbWVTdGFtcH0iLz4KKyAgICAgICAgICAgIDwvbWFuaWZlc3Q+CisgICAgICAgIDwvamFyPgorICAgICAgICA8YW50Y2FsbCB0YXJnZXQ9ImNvbXB1dGUtY2hlY2tzdW0iPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImZpbGUiIHZhbHVlPSIke2Fpcy1jaWNzLmphcn0iLz4KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJmaWxlbmFtZSIgdmFsdWU9IiR7YWlzLWNpY3MuamFybmFtZX0iLz4KKyAgICAgICAgPC9hbnRjYWxsPgorICAgIDwvdGFyZ2V0PgorICAgIDx0YXJnZXQgbmFtZT0iamFyLmFpcy1pbXMiIGRlcGVuZHM9ImluaXQsIGNvbXBpbGUuSU1TYmFja2VuZCI+CisgICAgICAgIDxta2RpciBkaXI9IiR7YnVpbGQubGlifSIvPgorICAgICAgICA8amFyIGphcmZpbGU9IiR7YWlzLWltcy5qYXJ9IiBiYXNlZGlyPSIke2J1aWxkLmNsYXNzZXN9Ij4KKyAgICAgICAgICAgIDxwYXR0ZXJuc2V0IHJlZmlkPSJpbXMuYmFja2VuZC5maWxlcyIvPgorICAgICAgICAgICAgPG1hbmlmZXN0PgorICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iQnVpbHQtQnkiIHZhbHVlPSIke3VzZXIubmFtZX0iLz4KKyAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IiR7bWFuaWZlc3Qua2V5LmNsYXNzLXBhdGh9IiB2YWx1ZT0iJHthaXMtY29yZS5qYXJuYW1lfSAke2Fpcy1jb2JvbC5qYXJuYW1lfSAke2ltc2ljby5qYXJuYW1lfSAke2ltc2ljby1jb25uZWN0b3IuamFybmFtZX0gJHtqYWFzLmphcm5hbWV9ICR7anRhLmphcm5hbWV9Ii8+CisgICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSIke21hbmlmZXN0LmtleS5wcm9kdWN0fSIgdmFsdWU9IiR7cHJvZHVjdC5uYW1lfSIvPgorICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iJHttYW5pZmVzdC5rZXkuY29tcG9uZW50fSIgdmFsdWU9IklNUyBDb25uZWN0b3IiLz4KKyAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IiR7bWFuaWZlc3Qua2V5LnZlcnNpb259IiB2YWx1ZT0iJHt2ZXJzaW9ufSIvPgorICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iJHttYW5pZmVzdC5rZXkuYnVpbGR9IiB2YWx1ZT0iJHtidWlsZC5pZH0iLz4KKyAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IiR7bWFuaWZlc3Qua2V5LmJ1aWxkLXRzfSIgdmFsdWU9IiR7QnVpbGRUaW1lU3RhbXB9Ii8+CisgICAgICAgICAgICA8L21hbmlmZXN0PgorICAgICAgICA8L2phcj4KKyAgICAgICAgPGFudGNhbGwgdGFyZ2V0PSJjb21wdXRlLWNoZWNrc3VtIj4KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJmaWxlIiB2YWx1ZT0iJHthaXMtaW1zLmphcn0iLz4KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJmaWxlbmFtZSIgdmFsdWU9IiR7YWlzLWltcy5qYXJuYW1lfSIvPgorICAgICAgICA8L2FudGNhbGw+CisgICAgPC90YXJnZXQ+CisgICAgPHRhcmdldCBuYW1lPSJqYXIuaHNjIiBkZXBlbmRzPSJpbml0LCBjb21waWxlLmhzYyI+CisgICAgICAgIDxta2RpciBkaXI9IiR7YnVpbGQubGlifSIvPgorICAgICAgICA8amFyIGphcmZpbGU9IiR7aHNjdS5qYXJ9IiBiYXNlZGlyPSIke2J1aWxkLmNsYXNzZXN9Ij4KKyAgICAgICAgICAgIDxwYXR0ZXJuc2V0IHJlZmlkPSJoc2MuZmlsZXMiLz4KKyAgICAgICAgICAgIDxtYW5pZmVzdD4KKyAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IkJ1aWx0LUJ5IiB2YWx1ZT0iJHt1c2VyLm5hbWV9Ii8+CisgICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSIke21hbmlmZXN0LmtleS5wcm9kdWN0fSIgdmFsdWU9IiR7cHJvZHVjdC5uYW1lfSIvPgorICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iJHttYW5pZmVzdC5rZXkuY29tcG9uZW50fSIgdmFsdWU9Ikhvc3QgU2Vzc2lvbiBDb25uZWN0b3IiLz4KKyAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IiR7bWFuaWZlc3Qua2V5LnZlcnNpb259IiB2YWx1ZT0iJHt2ZXJzaW9ufSIvPgorICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iJHttYW5pZmVzdC5rZXkuYnVpbGR9IiB2YWx1ZT0iJHtidWlsZC5pZH0iLz4KKyAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IiR7bWFuaWZlc3Qua2V5LmJ1aWxkLXRzfSIgdmFsdWU9IiR7QnVpbGRUaW1lU3RhbXB9Ii8+CisgICAgICAgICAgICA8L21hbmlmZXN0PgorICAgICAgICA8L2phcj4KKyAgICAgICAgPGFudGNhbGwgdGFyZ2V0PSJjb21wdXRlLWNoZWNrc3VtIj4KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJmaWxlIiB2YWx1ZT0iJHtoc2N1Lmphcn0iLz4KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJmaWxlbmFtZSIgdmFsdWU9IiR7aHNjdS5qYXJuYW1lfSIvPgorICAgICAgICA8L2FudGNhbGw+CisgICAgICAgIDxlY2hvIGxldmVsPSJpbmZvIiBtZXNzYWdlPSJSdW5uaW5nIFJldHJvR3VhcmQuLi4iLz4KKyAgICAgICAgPGphdmEgY2xhc3NuYW1lPSJSZXRyb0d1YXJkIiBmb3JrPSJ5ZXMiPgorICAgICAgICAgICAgPGFyZyB2YWx1ZT0iJHtoc2N1Lmphcn0iLz4KKyAgICAgICAgICAgIDxhcmcgdmFsdWU9IiR7aHNjLmphcn0iLz4KKyAgICAgICAgICAgIDxhcmcgdmFsdWU9IiR7b2JmdXNjYXRlLnNjcmlwdH0iLz4KKyAgICAgICAgICAgIDxhcmcgdmFsdWU9IiR7b2JmdXNjYXRlLmxvZ30iLz4KKyAgICAgICAgICAgIDxjbGFzc3BhdGg+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7cmV0cm9ndWFyZC5qYXJ9Ii8+CisgICAgICAgICAgICA8L2NsYXNzcGF0aD4KKyAgICAgICAgPC9qYXZhPgorICAgICAgICA8YW50Y2FsbCB0YXJnZXQ9ImNvbXB1dGUtY2hlY2tzdW0iPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImZpbGUiIHZhbHVlPSIke2hzYy5qYXJ9Ii8+CisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iZmlsZW5hbWUiIHZhbHVlPSIke2hzYy5qYXJuYW1lfSIvPgorICAgICAgICA8L2FudGNhbGw+CisgICAgPC90YXJnZXQ+CisgICAgPHRhcmdldCBuYW1lPSJqYXIudGVzdGJhY2tlbmQiIGRlcGVuZHM9InRlc3QuY29tcGlsZSI+CisgICAgICAgIDxqYXIgamFyZmlsZT0iJHtidWlsZC5saWJ9L2Fpcy10ZXN0YmFja2VuZC5qYXIiIGJhc2VkaXI9IiR7dGVzdC5iaW59Ij4KKyAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9ImNvbS9zZWFndWxsc3cvYXBwaW50ZXJmYWNlL3NlcnZlci9iYWNrZW5kL2Fpc3Rlc3QvKioiLz4KKyAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtzcmMudGVzdC5kaXJ9Ij4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJjb20vc2VhZ3VsbHN3L2FwcGludGVyZmFjZS9zZXJ2ZXIvYmFja2VuZC9haXN0ZXN0LyoqL2pheGIucHJvcGVydGllcyIvPgorICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9ImNvbS9zZWFndWxsc3cvYXBwaW50ZXJmYWNlL3NlcnZlci9iYWNrZW5kL2Fpc3Rlc3QvKiovYmdtLnNlciIvPgorICAgICAgICAgICAgPC9maWxlc2V0PgorICAgICAgICA8L2phcj4KKyAgICA8L3RhcmdldD4KKyAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgICAgPCEtLSBQcmVwYXJlcyB0aGUgYnVpbGQgZGlyZWN0b3J5IC0tPgorICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgICA8dGFyZ2V0IG5hbWU9InByZXBhcmUiIGRlcGVuZHM9ImluaXQiPgorICAgICAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmRpcn0iLz4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtidWlsZC5jbGFzc2VzfSIvPgorICAgIDwvdGFyZ2V0PgorICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgICA8IS0tIENsZWFucyAtLT4KKyAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgICAgPHRhcmdldCBuYW1lPSJjbGVhbiIgZGVzY3JpcHRpb249IlJlbW92ZXMgYWxsIHRoZSBnZW5lcmF0ZWQgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIj4KKyAgICAgICAgPGRlbGV0ZSBkaXI9IiR7YnVpbGQuZGlyfSIvPgorICAgIDwvdGFyZ2V0PgorICAgIDx0YXJnZXQgbmFtZT0iY2xlYW4uamFycyI+CisgICAgICAgIDxkZWxldGUgZGlyPSIke2J1aWxkLmxpYn0iLz4KKyAgICA8L3RhcmdldD4KKyAgICA8dGFyZ2V0IG5hbWU9ImNsZWFuLmNsYXNzZXMiIGRlc2NyaXB0aW9uPSJSZW1vdmVzIGFsbCAuY2xhc3MgZmlsZXMiPgorICAgICAgICA8ZGVsZXRlIGRpcj0iJHtidWlsZC5jbGFzc2VzfSIvPgorICAgIDwvdGFyZ2V0PgorICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgICA8IS0tIEluaXQgLS0+CisgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICAgIDx0YXJnZXQgbmFtZT0iaW5pdCIgZGVwZW5kcz0iYmFubmVyIj4KKyAgICAgICAgPHRzdGFtcD4KKyAgICAgICAgICAgIDwhLS0gVGhlIGRhdGUvdGltZSBwYXR0ZXJucyBhcmUgYXMgZGVmaW5lZCBpbiB0aGUgSmF2YSBTaW1wbGVEYXRlRm9ybWF0IGNsYXNzLiAtLT4KKyAgICAgICAgICAgIDxmb3JtYXQgcHJvcGVydHk9IkJ1aWxkVGltZVN0YW1wIiBwYXR0ZXJuPSJ5eXl5LU1NTU1NLWRkIEhIOm1tIHoiLz4KKyAgICAgICAgPC90c3RhbXA+CisgICAgICAgIDxmaWx0ZXIgdG9rZW49IlBST0RVQ1QiIHZhbHVlPSIke3Byb2R1Y3QubmFtZX0iLz4KKyAgICAgICAgPGZpbHRlciB0b2tlbj0iVkVSU0lPTiIgdmFsdWU9IiR7dmVyc2lvbn0iLz4KKyAgICAgICAgPGZpbHRlciB0b2tlbj0iQlVJTERJRCIgdmFsdWU9IiR7YnVpbGQuaWR9Ii8+CisgICAgICAgIDxmaWx0ZXIgdG9rZW49IkJVSUxEVElNRVNUQU1QIiB2YWx1ZT0iJHtCdWlsZFRpbWVTdGFtcH0iLz4KKyAgICAgICAgPGZpbHRlciB0b2tlbj0iQ09QWVJJR0hULTEiIHZhbHVlPSIke3RleHQuY29weXJpZ2h0LjF9Ii8+CisgICAgICAgIDxmaWx0ZXIgdG9rZW49IkNPUFlSSUdIVC0yIiB2YWx1ZT0iJHt0ZXh0LmNvcHlyaWdodC4yfSIvPgorICAgIDwvdGFyZ2V0PgorICAgIDx0YXJnZXQgbmFtZT0iYmFubmVyIiB1bmxlc3M9ImJhbm5lci1zZXQiPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0ibG9neHNsLXByb3Atc2VwIiB2YWx1ZT0iLT4iLz4KKyAgICAgICAgPGVjaG8gbGV2ZWw9ImluZm8iIG1lc3NhZ2U9ImFudC5maWxlICR7bG9neHNsLXByb3Atc2VwfSAke2FudC5maWxlfSIvPgorICAgICAgICA8ZWNobyBsZXZlbD0iaW5mbyIgbWVzc2FnZT0iYW50LnZlcnNpb24gJHtsb2d4c2wtcHJvcC1zZXB9ICR7YW50LnZlcnNpb259Ii8+CisgICAgICAgIDxlY2hvIGxldmVsPSJpbmZvIiBtZXNzYWdlPSJqYXZhLnZtLnZlcnNpb24gJHtsb2d4c2wtcHJvcC1zZXB9ICR7YW50LmphdmEudmVyc2lvbn0iLz4KKyAgICAgICAgPGVjaG8gbGV2ZWw9ImluZm8iIG1lc3NhZ2U9ImphdmEudmVyc2lvbiAke2xvZ3hzbC1wcm9wLXNlcH0gJHtqYXZhLnZlcnNpb259Ii8+CisgICAgICAgIDxlY2hvIGxldmVsPSJpbmZvIiBtZXNzYWdlPSJvcy5uYW1lICR7bG9neHNsLXByb3Atc2VwfSAke29zLm5hbWV9Ii8+CisgICAgICAgIDxlY2hvIGxldmVsPSJpbmZvIiBtZXNzYWdlPSJCdWlsZCBJRDogJHtidWlsZC5pZH0iLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImJhbm5lci1zZXQiIHZhbHVlPSJ0cnVlIi8+CisgICAgPC90YXJnZXQ+CisgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICAgIDwhLS0gU3BsYXNoIFNjcmVlbnMgLS0+CisgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJpbnRlcm5hbGRldi5jbGFzc2VzIiB2YWx1ZT0iJHtidWlsZC5kaXJ9L2ludGVybmFsZGV2Ii8+CisgICAgPHByb3BlcnR5IG5hbWU9InNwbGFzaC5zcmMiIHZhbHVlPSIke3NyYy5yb290LmRpcn0vQnVpbGQvc3BsYXNoc2NyZWVuIi8+CisgICAgPHByb3BlcnR5IG5hbWU9InNwbGFzaC5kZXN0IiB2YWx1ZT0iJHtidWlsZC5kaXJ9L3NwbGFzaHNjcmVlbnMiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2VydmVyLnNwbGFzaHNjcmVlbi5saW5lLTEiIHZhbHVlPSJBcHBsaWNhdGlvbiBJbnRlcmZhY2UgU2VydmVyIi8+CisgICAgPHByb3BlcnR5IG5hbWU9InRvb2xzLnNwbGFzaHNjcmVlbi5saW5lLTEiIHZhbHVlPSJUcmFuc2lkaW9tIERldmVsb3BlciIvPgorICAgIDwhLS0gVGFzayBjb21waWxlLnNwbGFzaFNjcmVlbkNyZWF0b3IgLS0+CisgICAgPHRhcmdldCBuYW1lPSJjb21waWxlLnNwbGFzaFNjcmVlbkNyZWF0b3IiPgorICAgICAgICA8bWtkaXIgZGlyPSIke2ludGVybmFsZGV2LmNsYXNzZXN9Ii8+CisgICAgICAgIDxqYXZhYyBzcmNkaXI9IiR7c3JjLnRlc3QuZGlyfSIgZGVzdGRpcj0iJHtpbnRlcm5hbGRldi5jbGFzc2VzfSIgZGVidWc9IiR7Y29tcGlsZS5kZWJ1Z30iPgorICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iY29tL3NlYWd1bGxzdy9pbnRlcm5hbGRldi9idWlsZC9TcGxhc2hzY3JlZW5DcmVhdG9yLmphdmEiLz4KKyAgICAgICAgPC9qYXZhYz4KKyAgICA8L3RhcmdldD4KKyAgICA8IS0tCisgICAgICAgICAgICAgUnVuIFNwbGFzaHNjcmVlbkNyZWF0b3IgcHJvZ3JhbSB3aGljaCB0YWtlcyBhICJ2YW5pbGxhIiBqcGcgcGx1cworICAgICAgICAgICAgIHNvbWUgdGV4dCBhbmQgY3JlYXRlcyBhIG5ldyAibWVyZ2VkIiBqcGcuCisgICAgICAgICAgICAgVGhpcyBpcyB1c2VkIGJ5IHRoZSBjcmVhdGVTcGxhc2gueHh4LnNwbGFzaHNjcmVlbiB0YXJnZXRzLgorICAgICAgICAtLT4KKyAgICA8dGFyZ2V0IG5hbWU9ImNyZWF0ZVNwbGFzaCIgZGVwZW5kcz0iY29tcGlsZS5zcGxhc2hTY3JlZW5DcmVhdG9yIj4KKyAgICAgICAgPCEtLSAgamF2YSB0YXNrOiBmYWlsb25lcnJvciB3b3JrcyBvbmx5IGlmIGZvcmsgaXMgdHJ1ZSAtLT4KKyAgICAgICAgPGphdmEgY2xhc3NuYW1lPSJjb20uc2VhZ3VsbHN3LmludGVybmFsZGV2LmJ1aWxkLlNwbGFzaHNjcmVlbkNyZWF0b3IiIGZhaWxvbmVycm9yPSJ0cnVlIiBmb3JrPSJ0cnVlIj4KKyAgICAgICAgICAgIDwhLS0gPHN5c3Byb3BlcnR5IGtleT0iY29tLnNlYWd1bGxzdy5kZWJ1ZyIgdmFsdWU9InRydWUiLz4gIC0tPgorICAgICAgICAgICAgPHN5c3Byb3BlcnR5IGtleT0iY29tLnNlYWd1bGxzdy5xdWlldCIgdmFsdWU9ImZhbHNlIi8+CisgICAgICAgICAgICA8c3lzcHJvcGVydHkga2V5PSJjb20uc2VhZ3VsbHN3LngiIHZhbHVlPSI4Ii8+CisgICAgICAgICAgICA8c3lzcHJvcGVydHkga2V5PSJjb20uc2VhZ3VsbHN3LnkiIHZhbHVlPSIxOTYiLz4KKyAgICAgICAgICAgIDxzeXNwcm9wZXJ0eSBrZXk9ImNvbS5zZWFndWxsc3cuZm9udHNpemUiIHZhbHVlPSIxMSIvPgorICAgICAgICAgICAgPHN5c3Byb3BlcnR5IGtleT0iY29tLnNlYWd1bGxzdy5zb3VyY2VTY3JlZW5GaWxlIiB2YWx1ZT0iJHtjcmVhdGVTcGxhc2guc291cmNlU2NyZWVuRmlsZX0iLz4KKyAgICAgICAgICAgIDxzeXNwcm9wZXJ0eSBrZXk9ImNvbS5zZWFndWxsc3cudGFyZ2V0U2NyZWVuRmlsZSIgdmFsdWU9IiR7Y3JlYXRlU3BsYXNoLnRhcmdldFNjcmVlbkZpbGV9Ii8+CisgICAgICAgICAgICA8c3lzcHJvcGVydHkga2V5PSJjb20uc2VhZ3VsbHN3LnNjcmVlblRleHRGaWxlIiB2YWx1ZT0iJHtjcmVhdGVTcGxhc2guc2NyZWVuVGV4dEZpbGV9Ii8+CisgICAgICAgICAgICA8Y2xhc3NwYXRoPgorICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtpbnRlcm5hbGRldi5jbGFzc2VzfSIvPgorICAgICAgICAgICAgPC9jbGFzc3BhdGg+CisgICAgICAgIDwvamF2YT4KKyAgICA8L3RhcmdldD4KKyAgICA8IS0tIENyZWF0ZSBBSVMgc3BsYXNoc2NyZWVucyAtLT4KKyAgICA8dGFyZ2V0IG5hbWU9ImNyZWF0ZVNwbGFzaC5haXMuc3BsYXNoc2NyZWVucyIgZGVwZW5kcz0iaW5pdCI+CisgICAgICAgIDxmaWx0ZXIgdG9rZW49IlNFUlZFUi5TUExBU0hTQ1JFRU4uTElORS0xIiB2YWx1ZT0iJHtzZXJ2ZXIuc3BsYXNoc2NyZWVuLmxpbmUtMX0iLz4KKyAgICAgICAgPCEtLSBMaW5lIDIgaXMgaW4gdGhlIHRlbXBsYXRlIGFuZCB1c2VzIHRoZSBWZXJzaW9uLCBCdWlsZCBhbmQgQnVpbGQgZGF0ZSB0b2tlbnMuIC0tPgorICAgICAgICA8ZmlsdGVyIHRva2VuPSJTRVJWRVIuU1BMQVNIU0NSRUVOLkxJTkUtMyIgdmFsdWU9IiR7dGV4dC5jb3B5cmlnaHQuMX0iLz4KKyAgICAgICAgPGZpbHRlciB0b2tlbj0iU0VSVkVSLlNQTEFTSFNDUkVFTi5MSU5FLTQiIHZhbHVlPSIke3RleHQuY29weXJpZ2h0LjJ9Ii8+CisgICAgICAgIDxta2RpciBkaXI9IiR7c3BsYXNoLmRlc3R9Ii8+CisgICAgICAgIDxjb3B5IGZpbGU9IiR7c3BsYXNoLnNyY30vc3BsYXNoc2NyZWVuLXRlbXBsYXRlLXNlcnZlci50eHQiIHRvZmlsZT0iJHtzcGxhc2guZGVzdH0vc3BsYXNoc2NyZWVuLXNlcnZlci50eHQiIG92ZXJ3cml0ZT0idHJ1ZSIgZmlsdGVyaW5nPSJ0cnVlIi8+CisgICAgICAgIDxhbnRjYWxsIHRhcmdldD0iY3JlYXRlU3BsYXNoIj4KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjcmVhdGVTcGxhc2guc291cmNlU2NyZWVuRmlsZSIgdmFsdWU9IiR7c3BsYXNoLnNyY30vQmFzaWNTcGxhc2hTY3JlZW4uanBnIi8+CisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY3JlYXRlU3BsYXNoLnNjcmVlblRleHRGaWxlIiB2YWx1ZT0iJHtzcGxhc2guZGVzdH0vc3BsYXNoc2NyZWVuLXNlcnZlci50eHQiLz4KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjcmVhdGVTcGxhc2gudGFyZ2V0U2NyZWVuRmlsZSIgdmFsdWU9IiR7c3BsYXNoLmRlc3R9L1NlcnZlclNwbGFzaFNjcmVlbi5qcGciLz4KKyAgICAgICAgPC9hbnRjYWxsPgorICAgICAgICA8IS0tIENvcHkgdGhlIHNwbGFzaCB0byB0aGUgQUlTIGFuZCBTQUMgY2xhc3MgcGF0aCAtLT4KKyAgICAgICAgPGNvcHkgZmlsZT0iJHtzcGxhc2guZGVzdH0vU2VydmVyU3BsYXNoU2NyZWVuLmpwZyIgdG9maWxlPSIke2J1aWxkLmNsYXNzZXN9L2NvbS9zZWFndWxsc3cvYXBwaW50ZXJmYWNlL3NlcnZlci9TZXJ2ZXJTZXNzaW9uU3BsYXNoU2NyZWVuLmpwZyIgb3ZlcndyaXRlPSJ5ZXMiLz4KKyAgICA8L3RhcmdldD4KKyAgICA8IS0tIENyZWF0ZSBUb29scyBzcGxhc2hzY3JlZW5zIC0tPgorICAgIDx0YXJnZXQgbmFtZT0iY3JlYXRlU3BsYXNoLnRvb2xzLnNwbGFzaHNjcmVlbnMiIGRlcGVuZHM9ImluaXQiPgorICAgICAgICA8ZmlsdGVyIHRva2VuPSJUT09MUy5TUExBU0hTQ1JFRU4uTElORS0xIiB2YWx1ZT0iJHt0b29scy5zcGxhc2hzY3JlZW4ubGluZS0xfSIvPgorICAgICAgICA8IS0tIExpbmUgMiBpcyBpbiB0aGUgdGVtcGxhdGUgYW5kIHVzZXMgdGhlIFZlcnNpb24sIEJ1aWxkIGFuZCBCdWlsZCBkYXRlIHRva2Vucy4gLS0+CisgICAgICAgIDxmaWx0ZXIgdG9rZW49IlRPT0xTLlNQTEFTSFNDUkVFTi5MSU5FLTMiIHZhbHVlPSIke3RleHQuY29weXJpZ2h0LjF9Ii8+CisgICAgICAgIDxmaWx0ZXIgdG9rZW49IlRPT0xTLlNQTEFTSFNDUkVFTi5MSU5FLTQiIHZhbHVlPSIke3RleHQuY29weXJpZ2h0LjJ9Ii8+CisgICAgICAgIDxta2RpciBkaXI9IiR7c3BsYXNoLmRlc3R9Ii8+CisgICAgICAgIDxjb3B5IGZpbGU9IiR7c3BsYXNoLnNyY30vc3BsYXNoc2NyZWVuLXRlbXBsYXRlLWRldmVsb3Blci50eHQiIHRvZmlsZT0iJHtzcGxhc2guZGVzdH0vc3BsYXNoc2NyZWVuLWRldmVsb3Blci50eHQiIG92ZXJ3cml0ZT0idHJ1ZSIgZmlsdGVyaW5nPSJ0cnVlIi8+CisgICAgICAgIDxhbnRjYWxsIHRhcmdldD0iY3JlYXRlU3BsYXNoIj4KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjcmVhdGVTcGxhc2guc291cmNlU2NyZWVuRmlsZSIgdmFsdWU9IiR7c3BsYXNoLnNyY30vQmFzaWNTcGxhc2hTY3JlZW4uanBnIi8+CisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY3JlYXRlU3BsYXNoLnNjcmVlblRleHRGaWxlIiB2YWx1ZT0iJHtzcGxhc2guZGVzdH0vc3BsYXNoc2NyZWVuLWRldmVsb3Blci50eHQiLz4KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjcmVhdGVTcGxhc2gudGFyZ2V0U2NyZWVuRmlsZSIgdmFsdWU9IiR7c3BsYXNoLmRlc3R9L1Rvb2xTZXNzaW9uU3BsYXNoU2NyZWVuLmpwZyIvPgorICAgICAgICA8L2FudGNhbGw+CisgICAgICAgIDwhLS0gQ29weSB0aGUgc3BsYXNoIHRvIHRoZSBUb29scyBjbGFzcyBwYXRoIC0tPgorICAgICAgICA8Y29weSBmaWxlPSIke3NwbGFzaC5kZXN0fS9Ub29sU2Vzc2lvblNwbGFzaFNjcmVlbi5qcGciIHRvZmlsZT0iJHtidWlsZC5jbGFzc2VzfS9jb20vc2VhZ3VsbHN3L2FwcGludGVyZmFjZS90b29scy9pbWFnZXMvVG9vbFNlc3Npb25TcGxhc2hTY3JlZW4uanBnIiBvdmVyd3JpdGU9InllcyIvPgorICAgIDwvdGFyZ2V0PgorICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgICA8IS0tIEphdmFkb2MgZm9yIGNsaWVudCBBUEkgLS0+CisgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICAgIDx0YXJnZXQgbmFtZT0iamF2YWRvY19jaGVjay5haXMuY2xpZW50Ij4KKyAgICAgICAgPHVwdG9kYXRlIHByb3BlcnR5PSJhaXMuY2xpZW50LmphdmFkb2Mubm90cmVxdWlyZWQiIHRhcmdldGZpbGU9IiR7YWlzLmNsaWVudC5kaXN0LmphdmFkb2N9L3BhY2thZ2VzLmh0bWwiPgorICAgICAgICAgICAgPHNyY2ZpbGVzIGRpcj0iJHtzcmMuZGlyfSI+CisgICAgICAgICAgICAgICAgPHBhdHRlcm5zZXQgcmVmaWQ9ImFpcy5jbGllbnQuZmlsZXMiLz4KKyAgICAgICAgICAgIDwvc3JjZmlsZXM+CisgICAgICAgIDwvdXB0b2RhdGU+CisgICAgPC90YXJnZXQ+CisgICAgPHRhcmdldCBuYW1lPSJqYXZhZG9jLmFpcy5jbGllbnQiIGRlcGVuZHM9InByZXBhcmUsIGphdmFkb2NfY2hlY2suYWlzLmNsaWVudCIgdW5sZXNzPSJhaXMuY2xpZW50LmphdmFkb2Mubm90cmVxdWlyZWQiPgorICAgICAgICA8ZGVsZXRlIGRpcj0iJHthaXMuY2xpZW50LmRpc3QuamF2YWRvY30iIGluY2x1ZGVFbXB0eURpcnM9InRydWUiIHF1aWV0PSJ0cnVlIi8+CisgICAgICAgIDxta2RpciBkaXI9IiR7YWlzLmNsaWVudC5kaXN0LmphdmFkb2N9Ii8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJiYXNpYy1oZWFkZXIiIHZhbHVlPSIke05hbWV9JiN4MjEyMjssIEFJUyBDbGllbnQiLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImhlYWRlcit2ZXJzaW9uIiB2YWx1ZT0iJHtiYXNpYy1oZWFkZXJ9LCB2JHt2ZXJzaW9ufSIvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0id2luLXRpdGxlIiB2YWx1ZT0iJHtoZWFkZXIrdmVyc2lvbn0gQVBJIFNwZWNpZmljYXRpb24iLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImRvYy10aXRsZSIgdmFsdWU9IiR7aGVhZGVyK3ZlcnNpb259Jmx0O2JyLyZndDtBUEkgU3BlY2lmaWNhdGlvbiIvPgorICAgICAgICA8amF2YWRvYyBwYWNrYWdlbmFtZXM9ImNvbS5zZWFndWxsc3cuYXBwaW50ZXJmYWNlLmNsaWVudCwgY29tLnNlYWd1bGxzdy5hcHBpbnRlcmZhY2UuY2xpZW50LmphdmEsIGNvbS5zZWFndWxsc3cuYXBwaW50ZXJmYWNlLmNsaWVudC5pYm1tcSwgY29tLnNlYWd1bGxzdy5hcHBpbnRlcmZhY2UuY29tbS5pYm1tcSIgc291cmNlcGF0aD0iJHtzcmMuZGlyfSIgZGVzdGRpcj0iJHthaXMuY2xpZW50LmRpc3QuamF2YWRvY30iIHdpbmRvd3RpdGxlPSIke3dpbi10aXRsZX0iIGRvY3RpdGxlPSIke2RvYy10aXRsZX0iIGhlYWRlcj0iJHtiYXNpYy1oZWFkZXJ9IiBib3R0b209IiZsdDtmb250IHNpemU9JnF1b3Q7LTEmcXVvdDsmZ3Q7JHtOYW1lfSBpcyBhIHRyYWRlbWFyayBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU2VhZ3VsbCBIb2xkaW5nIE5WIGluIHRoZSBVUyBhbmQgb3RoZXIgY291bnRyaWVzLiZsdDtici8mZ3Q7Q29weXJpZ2h0ICYjMTY5OyAxOTkzIC0gMjAwMyBTZWFndWxsIEJ1c2luZXNzIFNvZnR3YXJlIElyZWxhbmQgTHRkLiBBbGwgUmlnaHRzIFJlc2VydmVkLiZsdDsvZm9udCZndDsiIGF1dGhvcj0iZmFsc2UiIHZlcnNpb249InRydWUiIHVzZT0idHJ1ZSI+CisgICAgICAgICAgICA8Y2xhc3NwYXRoPgorICAgICAgICAgICAgICAgIDxwYXRoIHJlZmlkPSJhaXMuY2xhc3NwYXRoIi8+CisgICAgICAgICAgICA8L2NsYXNzcGF0aD4KKyAgICAgICAgICAgIDwhLS0gVGhlIGZvbGxvd2luZyBncm91cCBlbGVtZW50cyBkbyBub3Qgc2VlbSB0byB3b3JrLiAtLT4KKyAgICAgICAgICAgIDxncm91cCB0aXRsZT0iQ2xpZW50IiBwYWNrYWdlcz0iY29tLnNlYWd1bGxzdy5hcHBpbnRlcmZhY2UuY2xpZW50LCBjb20uc2VhZ3VsbHN3LmFwcGludGVyZmFjZS5jbGllbnQuamF2YSIvPgorICAgICAgICAgICAgPGdyb3VwIHRpdGxlPSJJQk0gTVEgU2VyaWVzIENsaWVudCIgcGFja2FnZXM9ImNvbS5zZWFndWxsc3cuYXBwaW50ZXJmYWNlLmNsaWVudC5pYm1tcSwgY29tLnNlYWd1bGxzdy5hcHBpbnRlcmZhY2UuY29tbS5pYm1tcSIvPgorICAgICAgICAgICAgPGxpbmsgaHJlZj0iJHtqYXZhZG9jLmoyc2UubGlua30iLz4KKyAgICAgICAgPC9qYXZhZG9jPgorICAgIDwvdGFyZ2V0PgorICAgIDx0YXJnZXQgbmFtZT0iamF2YWRvY19jaGVjay5haXMuYWRtaW5jbGllbnQiPgorICAgICAgICA8dXB0b2RhdGUgcHJvcGVydHk9ImFpcy5hZG1pbmNsaWVudC5qYXZhZG9jLm5vdHJlcXVpcmVkIiB0YXJnZXRmaWxlPSIke2Fpcy5hZG1pbmNsaWVudC5kaXN0LmphdmFkb2N9L3BhY2thZ2VzLmh0bWwiPgorICAgICAgICAgICAgPHNyY2ZpbGVzIGRpcj0iJHtzcmMuZGlyfSI+CisgICAgICAgICAgICAgICAgPHBhdHRlcm5zZXQgcmVmaWQ9ImFpcy5hZG1pbmNsaWVudC5maWxlcyIvPgorICAgICAgICAgICAgPC9zcmNmaWxlcz4KKyAgICAgICAgPC91cHRvZGF0ZT4KKyAgICA8L3RhcmdldD4KKyAgICA8dGFyZ2V0IG5hbWU9ImphdmFkb2MuYWlzLmFkbWluY2xpZW50IiBkZXBlbmRzPSJwcmVwYXJlLCBqYXZhZG9jX2NoZWNrLmFpcy5hZG1pbmNsaWVudCIgdW5sZXNzPSJhaXMuYWRtaW5jbGllbnQuamF2YWRvYy5ub3RyZXF1aXJlZCI+CisgICAgICAgIDxkZWxldGUgZGlyPSIke2Fpcy5hZG1pbmNsaWVudC5kaXN0LmphdmFkb2N9IiBpbmNsdWRlRW1wdHlEaXJzPSJ0cnVlIiBxdWlldD0idHJ1ZSIvPgorICAgICAgICA8bWtkaXIgZGlyPSIke2Fpcy5hZG1pbmNsaWVudC5kaXN0LmphdmFkb2N9Ii8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJiYXNpYy1oZWFkZXIiIHZhbHVlPSIke05hbWV9JiN4MjEyMjssIEFJUyBBZG1pbiBDbGllbnQiLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImhlYWRlcit2ZXJzaW9uIiB2YWx1ZT0iJHtiYXNpYy1oZWFkZXJ9LCB2JHt2ZXJzaW9ufSIvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0id2luLXRpdGxlIiB2YWx1ZT0iJHtoZWFkZXIrdmVyc2lvbn0gQVBJIFNwZWNpZmljYXRpb24iLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImRvYy10aXRsZSIgdmFsdWU9IiR7aGVhZGVyK3ZlcnNpb259Jmx0O2JyLyZndDtBUEkgU3BlY2lmaWNhdGlvbiIvPgorICAgICAgICA8amF2YWRvYyBwYWNrYWdlbmFtZXM9ImNvbS5zZWFndWxsc3cuYXBwaW50ZXJmYWNlLnNlcnZlci5hZG1pbiIgc291cmNlcGF0aD0iJHtzcmMuZGlyfSIgZGVzdGRpcj0iJHthaXMuYWRtaW5jbGllbnQuZGlzdC5qYXZhZG9jfSIgd2luZG93dGl0bGU9IiR7d2luLXRpdGxlfSIgZG9jdGl0bGU9IiR7ZG9jLXRpdGxlfSIgaGVhZGVyPSIke2Jhc2ljLWhlYWRlcn0iIGJvdHRvbT0iJmx0O2ZvbnQgc2l6ZT0mcXVvdDstMSZxdW90OyZndDske05hbWV9IGlzIGEgdHJhZGVtYXJrIG9yIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBTZWFndWxsIEhvbGRpbmcgTlYgaW4gdGhlIFVTIGFuZCBvdGhlciBjb3VudHJpZXMuJmx0O2JyLyZndDtDb3B5cmlnaHQgJiMxNjk7IDE5OTMgLSAyMDAzIFNlYWd1bGwgQnVzaW5lc3MgU29mdHdhcmUgSXJlbGFuZCBMdGQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuJmx0Oy9mb250Jmd0OyIgYXV0aG9yPSJmYWxzZSIgdmVyc2lvbj0idHJ1ZSIgdXNlPSJ0cnVlIj4KKyAgICAgICAgICAgIDxjbGFzc3BhdGg+CisgICAgICAgICAgICAgICAgPHBhdGggcmVmaWQ9ImFpcy5jbGFzc3BhdGgiLz4KKyAgICAgICAgICAgIDwvY2xhc3NwYXRoPgorICAgICAgICAgICAgPCEtLSBUaGUgZm9sbG93aW5nIGdyb3VwIGVsZW1lbnRzIGRvIG5vdCBzZWVtIHRvIHdvcmsuIC0tPgorICAgICAgICAgICAgPGdyb3VwIHRpdGxlPSJDbGllbnQiIHBhY2thZ2VzPSJjb20uc2VhZ3VsbHN3LmFwcGludGVyZmFjZS5zZXJ2ZXIuYWRtaW4iLz4KKyAgICAgICAgICAgIDxsaW5rIGhyZWY9IiR7amF2YWRvYy5qMnNlLmxpbmt9Ii8+CisgICAgICAgIDwvamF2YWRvYz4KKyAgICA8L3RhcmdldD4KKyAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgICAgPCEtLSBEaXN0cmlidXRpb24gdGFyZ2V0cyAtLT4KKyAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgICAgPHRhcmdldCBuYW1lPSJkaXN0IiBkZXBlbmRzPSJkaXN0LmFpcy5jb3JlLCBkaXN0LmFpcy5jbGllbnQsIGRpc3QuYWlzVU5JWCwgZGlzdC5wcm94eXNlcnZsZXQsIGRpc3QudHJhbnNpZGlvbWNlbnRyYWwsIGRpc3QuZGV2dG9vbHMsIGRpc3QuZG9jcyIgZGVzY3JpcHRpb249IkNyZWF0ZXMgdGhlIGRpc3RyaWJ1dGlvbiBpbiAke2J1aWxkLmRpc3R9Ii8+CisgICAgPHByb3BlcnR5IG5hbWU9ImFpcy5kaXN0IiB2YWx1ZT0iJHtidWlsZC5kaXN0fS9zZXJ2ZXIiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iYWlzVU5JWC5kaXN0IiB2YWx1ZT0iJHtidWlsZC5kaXN0fS9zZXJ2ZXItVU5JWCIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJhaXMuY2xpZW50LmRpc3QiIHZhbHVlPSIke2J1aWxkLmRpc3R9L2NsaWVudC9qYXZhIi8+CisgICAgPHByb3BlcnR5IG5hbWU9InByb3h5c2VydmxldC5kaXN0IiB2YWx1ZT0iJHtidWlsZC5kaXN0fS9zZXJ2ZXIvc2VydmxldCIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXZ0b29scy5kaXN0IiB2YWx1ZT0iJHtidWlsZC5kaXN0fS90b29scyIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0cmFuc2lkaW9tY2VudHJhbC5kaXN0IiB2YWx1ZT0iJHtidWlsZC5kaXN0fS9UcmFuc2lkaW9tQ2VudHJhbCIvPgorICAgIDwhLS0gY29weSAzcmQgcGFydHkgamFyIGZpbGVzIC0gYSBkaXN0ICJzdWJyb3V0aW5lIi4gLS0+CisgICAgPCEtLSBDb21tb24gZmlsZXMgdG8gdGhlIEFJUyBhbmQgVG9vbHM/IEdhcnlHIDIwMDMtMDQtMDMgLS0+CisgICAgPHRhcmdldCBuYW1lPSJjb3B5M3JkUGFydHlKYXJzIj4KKyAgICAgICAgPGNvcHkgZmlsZT0iJHt4ZXJjZXMuamFyfSIgdG9kaXI9IiR7Y29weTNyZFBhcnR5SmFycy5kaXN0LmxpYn0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+CisgICAgICAgIDxjb3B5IGZpbGU9IiR7eG1sLWFwaXMuamFyfSIgdG9kaXI9IiR7Y29weTNyZFBhcnR5SmFycy5kaXN0LmxpYn0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+CisgICAgICAgIDxjb3B5IGZpbGU9IiR7eGFsYW4uamFyfSIgdG9kaXI9IiR7Y29weTNyZFBhcnR5SmFycy5kaXN0LmxpYn0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+CisgICAgICAgIDxjb3B5IGZpbGU9IiR7c29hcC5qYXJ9IiB0b2Rpcj0iJHtjb3B5M3JkUGFydHlKYXJzLmRpc3QubGlifSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KKyAgICAgICAgPGNvcHkgZmlsZT0iJHthY3RpdmF0aW9uLmphcn0iIHRvZGlyPSIke2NvcHkzcmRQYXJ0eUphcnMuZGlzdC5saWJ9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIvPgorICAgICAgICA8Y29weSBmaWxlPSIke21haWwuamFyfSIgdG9kaXI9IiR7Y29weTNyZFBhcnR5SmFycy5kaXN0LmxpYn0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+CisgICAgICAgIDxjb3B5IGZpbGU9IiR7Y29tbW9ucy1jb2xsZWN0aW9ucy5qYXJ9IiB0b2Rpcj0iJHtjb3B5M3JkUGFydHlKYXJzLmRpc3QubGlifSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KKyAgICAgICAgPGNvcHkgZmlsZT0iJHtjb21tb25zLWxhbmcuamFyfSIgdG9kaXI9IiR7Y29weTNyZFBhcnR5SmFycy5kaXN0LmxpYn0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+CisgICAgICAgIDxjb3B5IGZpbGU9IiR7Y29tbW9ucy1jb2RlYy5qYXJ9IiB0b2Rpcj0iJHtjb3B5M3JkUGFydHlKYXJzLmRpc3QubGlifSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KKyAgICAgICAgPGNvcHkgZmlsZT0iJHtjb21tb25zLWxvZ2dpbmcuamFyfSIgdG9kaXI9IiR7Y29weTNyZFBhcnR5SmFycy5kaXN0LmxpYn0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+CisgICAgICAgIDxjb3B5IGZpbGU9IiR7Y29tbW9ucy1odHRwY2xpZW50Lmphcn0iIHRvZGlyPSIke2NvcHkzcmRQYXJ0eUphcnMuZGlzdC5saWJ9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIvPgorICAgICAgICA8Y29weSBmaWxlPSIke2NvbW1vbnMtcG9vbC5qYXJ9IiB0b2Rpcj0iJHtjb3B5M3JkUGFydHlKYXJzLmRpc3QubGlifSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KKyAgICAgICAgPGNvcHkgZmlsZT0iJHtjb21tb25zLWNsaS5qYXJ9IiB0b2Rpcj0iJHtjb3B5M3JkUGFydHlKYXJzLmRpc3QubGlifSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KKyAgICAgICAgPGNvcHkgZmlsZT0iJHtqYWthcnRhLW9yby5qYXJ9IiB0b2Rpcj0iJHtjb3B5M3JkUGFydHlKYXJzLmRpc3QubGlifSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KKyAgICAgICAgPGNvcHkgZmlsZT0iJHtqYXhiMS5qYXJ9IiB0b2Rpcj0iJHtjb3B5M3JkUGFydHlKYXJzLmRpc3QubGlifSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KKyAgICAgICAgPGNvcHkgZmlsZT0iJHtqYXhiMi5qYXJ9IiB0b2Rpcj0iJHtjb3B5M3JkUGFydHlKYXJzLmRpc3QubGlifSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KKyAgICAgICAgPGNvcHkgZmlsZT0iJHtqYXhiMy5qYXJ9IiB0b2Rpcj0iJHtjb3B5M3JkUGFydHlKYXJzLmRpc3QubGlifSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KKyAgICAgICAgPGNvcHkgZmlsZT0iJHtqYXhiNC5qYXJ9IiB0b2Rpcj0iJHtjb3B5M3JkUGFydHlKYXJzLmRpc3QubGlifSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KKyAgICAgICAgPGNvcHkgZmlsZT0iJHtqYXhiNS5qYXJ9IiB0b2Rpcj0iJHtjb3B5M3JkUGFydHlKYXJzLmRpc3QubGlifSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KKyAgICAgICAgPGNvcHkgZmlsZT0iJHtqYXhiNi5qYXJ9IiB0b2Rpcj0iJHtjb3B5M3JkUGFydHlKYXJzLmRpc3QubGlifSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KKyAgICAgICAgPGNvcHkgZmlsZT0iJHtqYXhiNy5qYXJ9IiB0b2Rpcj0iJHtjb3B5M3JkUGFydHlKYXJzLmRpc3QubGlifSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KKyAgICAgICAgPGNvcHkgZmlsZT0iJHtqbXMuamFyfSIgdG9kaXI9IiR7Y29weTNyZFBhcnR5SmFycy5kaXN0LmxpYn0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+CisgICAgICAgIDxjb3B5IGZpbGU9IiR7Y29uY3VycmVudC5qYXJ9IiB0b2Rpcj0iJHtjb3B5M3JkUGFydHlKYXJzLmRpc3QubGlifSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KKyAgICAgICAgPGNvcHkgZmlsZT0iJHtqYWFzLmphcn0iIHRvZGlyPSIke2NvcHkzcmRQYXJ0eUphcnMuZGlzdC5saWJ9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIvPgorICAgICAgICA8Y29weSBmaWxlPSIke2ltc2ljby5qYXJ9IiB0b2Rpcj0iJHtjb3B5M3JkUGFydHlKYXJzLmRpc3QubGlifSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KKyAgICAgICAgPGNvcHkgZmlsZT0iJHtpbXNpY28tY29ubmVjdG9yLmphcn0iIHRvZGlyPSIke2NvcHkzcmRQYXJ0eUphcnMuZGlzdC5saWJ9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIvPgorICAgICAgICA8Y29weSBmaWxlPSIke2p0YS5qYXJ9IiB0b2Rpcj0iJHtjb3B5M3JkUGFydHlKYXJzLmRpc3QubGlifSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KKyAgICA8L3RhcmdldD4KKyAgICA8IS0tIEphdmEgQ2xpZW50IC0tPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJhaXMuY2xpZW50LmRpc3QuamF2YWRvYyIgdmFsdWU9IiR7YWlzLmNsaWVudC5kaXN0fS9kb2NzL2FwaSIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJhaXMuY2xpZW50LmRpc3QubGliIiB2YWx1ZT0iJHthaXMuY2xpZW50LmRpc3R9L2xpYiIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJhaXMuY2xpZW50LmRpc3QubXEiIHZhbHVlPSIke2Fpcy5jbGllbnQuZGlzdH0vbXEiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iYWlzLmFkbWluY2xpZW50LmRpc3QuamF2YWRvYyIgdmFsdWU9IiR7YWlzLmNsaWVudC5kaXN0fS9hZG1pbi9kb2NzL2FwaSIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJhaXMuYWRtaW5jbGllbnQuZGlzdC5zZmQiIHZhbHVlPSIke2Fpcy5jbGllbnQuZGlzdH0vYWRtaW4vc2ZkIi8+CisgICAgPCEtLSBkaXN0LmFpcy5jbGllbnQgLS0+CisgICAgPHRhcmdldCBuYW1lPSJkaXN0LmFpcy5jbGllbnQiIGRlcGVuZHM9Imphci5haXMuY2xpZW50LCBqYXIuYWlzLmFkbWluY2xpZW50LCBqYXZhZG9jLmFpcy5jbGllbnQsIGphdmFkb2MuYWlzLmFkbWluY2xpZW50Ij4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHthaXMuY2xpZW50LmRpc3R9Ii8+CisgICAgICAgIDxta2RpciBkaXI9IiR7YWlzLmNsaWVudC5kaXN0LmphdmFkb2N9Ii8+CisgICAgICAgIDxta2RpciBkaXI9IiR7YWlzLmNsaWVudC5kaXN0LmxpYn0iLz4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHthaXMuY2xpZW50LmRpc3QubXF9Ii8+CisgICAgICAgIDxta2RpciBkaXI9IiR7YWlzLmFkbWluY2xpZW50LmRpc3QuamF2YWRvY30iLz4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHthaXMuYWRtaW5jbGllbnQuZGlzdC5zZmR9Ii8+CisgICAgICAgIDxjb3B5IGZpbGU9IiR7YWlzLmNsaWVudC5qYXJ9IiB0b2Rpcj0iJHthaXMuY2xpZW50LmRpc3QubGlifSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KKyAgICAgICAgPGNvcHkgZmlsZT0iJHthaXMtYWRtaW5jbGllbnQuamFyfSIgdG9kaXI9IiR7YWlzLmNsaWVudC5kaXN0LmxpYn0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+CisgICAgICAgIDxjb3B5IGZpbGU9IiR7eGVyY2VzLmphcn0iIHRvZGlyPSIke2Fpcy5jbGllbnQuZGlzdC5saWJ9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIvPgorICAgICAgICA8Y29weSBmaWxlPSIke3htbC1hcGlzLmphcn0iIHRvZGlyPSIke2Fpcy5jbGllbnQuZGlzdC5saWJ9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIvPgorICAgICAgICA8Y29weSBmaWxlPSIke2NvbW1vbnMtbGFuZy5qYXJ9IiB0b2Rpcj0iJHthaXMuY2xpZW50LmRpc3QubGlifSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KKyAgICAgICAgPGNvcHkgZmlsZT0iJHtqYXhiMS5qYXJ9IiB0b2Rpcj0iJHthaXMuY2xpZW50LmRpc3QubGlifSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KKyAgICAgICAgPGNvcHkgZmlsZT0iJHtqYXhiMi5qYXJ9IiB0b2Rpcj0iJHthaXMuY2xpZW50LmRpc3QubGlifSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KKyAgICAgICAgPGNvcHkgZmlsZT0iJHtqYXhiMy5qYXJ9IiB0b2Rpcj0iJHthaXMuY2xpZW50LmRpc3QubGlifSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KKyAgICAgICAgPGNvcHkgZmlsZT0iJHtqYXhiNC5qYXJ9IiB0b2Rpcj0iJHthaXMuY2xpZW50LmRpc3QubGlifSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KKyAgICAgICAgPGNvcHkgZmlsZT0iJHtqYXhiNS5qYXJ9IiB0b2Rpcj0iJHthaXMuY2xpZW50LmRpc3QubGlifSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KKyAgICAgICAgPGNvcHkgZmlsZT0iJHtqYXhiNi5qYXJ9IiB0b2Rpcj0iJHthaXMuY2xpZW50LmRpc3QubGlifSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KKyAgICAgICAgPGNvcHkgZmlsZT0iJHtqYXhiNy5qYXJ9IiB0b2Rpcj0iJHthaXMuY2xpZW50LmRpc3QubGlifSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KKyAgICAgICAgPGNvcHkgZmlsZT0iJHtyb290LmRpcn0vbXEvTVFDbGllbnRDb25uZWN0aW9uLnByb3BlcnRpZXMiIHRvZGlyPSIke2Fpcy5jbGllbnQuZGlzdC5tcX0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+CisgICAgICAgIDxjb3B5IHRvZGlyPSIke2Fpcy5hZG1pbmNsaWVudC5kaXN0LnNmZH0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIj4KKyAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtzcmMucm9vdC5kaXJ9L1NlcnZlckFkbWluRnVuY3Rpb25zL0ludGVyZmFjZVNjaGVtYXMiLz4KKyAgICAgICAgPC9jb3B5PgorICAgIDwvdGFyZ2V0PgorICAgIDwhLS0gQUlTIC0tPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJhaXMuZGlzdC5jb25maWciIHZhbHVlPSIke2Fpcy5kaXN0fS9jb25maWciLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iYWlzLmRpc3QuY29uZmlnLmNvcHkiIHZhbHVlPSIke2Fpcy5kaXN0fS9jb25maWctZGVmYXVsdCIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJhaXMuZGlzdC5sb2ciIHZhbHVlPSIke2Fpcy5kaXN0LmNvbmZpZ30vbG9nIi8+CisgICAgPHByb3BlcnR5IG5hbWU9ImFpcy5kaXN0LnRyYW5zZm9ybSIgdmFsdWU9IiR7YWlzLmRpc3QuY29uZmlnfS90cmFuc2Zvcm0iLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iYWlzLmRpc3QubGliIiB2YWx1ZT0iJHthaXMuZGlzdH0vbGliIi8+CisgICAgPHByb3BlcnR5IG5hbWU9ImFpcy5kaXN0LmxpYi5leHQiIHZhbHVlPSIke2Fpcy5kaXN0LmxpYn0vJHtleHRlbnNpb24uZGlyLm5hbWV9Ii8+CisgICAgPHByb3BlcnR5IG5hbWU9ImFpcy5kaXN0Lm1xIiB2YWx1ZT0iJHthaXMuZGlzdH0vbXEiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iYWlzLmRpc3Quc3lzIiB2YWx1ZT0iJHthaXMuZGlzdH0vc3lzdGVtIi8+CisgICAgPHByb3BlcnR5IG5hbWU9ImFpcy5kaXN0LnN5c2RlZiIgdmFsdWU9IiR7YWlzLmRpc3Quc3lzfS9kZWZhdWx0cyIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyb290LnNlcnZlclNldHRpbmdzIiB2YWx1ZT0iJHtyb290LmRpcn0vQWx0ZXJuYXRpdmVTZXJ2ZXJTZXR0aW5ncyIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyb290LnRvb2xTZXR0aW5ncyIgdmFsdWU9IiR7cm9vdC5kaXJ9L0FsdGVybmF0aXZlVG9vbFNldHRpbmdzIi8+CisgICAgPCEtLSBkaXN0LmFpcy5jb3JlIC0tPgorICAgIDx0YXJnZXQgbmFtZT0iZGlzdC5haXMuY29yZSIgZGVwZW5kcz0iaW5pdCwgamFyLmFpcy1jb3JlLCBqYXIuYWlzLXRvb2xzLCBqYXIuYWlzLTUyNTAsIGphci5haXMtMzI3MCwgamFyLmFpcy1jb2JvbCwgamFyLmFpcy1jaWNzLCBqYXIuYWlzLWltcywgamFyLmhzYywgamFyLmFkbWluY29uc29sZSwgamF2YWRvYy5vcGVuYmFja2VuZCI+CisgICAgICAgIDxta2RpciBkaXI9IiR7YWlzLmRpc3R9Ii8+CisgICAgICAgIDxta2RpciBkaXI9IiR7YWlzLmRpc3QubGlifSIvPgorICAgICAgICA8bWtkaXIgZGlyPSIke2Fpcy5kaXN0LmxpYi5leHR9Ii8+CisgICAgICAgIDxta2RpciBkaXI9IiR7YWlzLmRpc3Quc3lzfSIvPgorICAgICAgICA8bWtkaXIgZGlyPSIke2Fpcy5kaXN0Lm1xfSIvPgorICAgICAgICA8Y29weSBmaWxlPSIke2Fpcy1jb3JlLmphcn0iIHRvZGlyPSIke2Fpcy5kaXN0LmxpYn0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+CisgICAgICAgIDxjb3B5IGZpbGU9IiR7YWlzLTUyNTAuamFyfSIgdG9kaXI9IiR7YWlzLmRpc3QubGlifSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KKyAgICAgICAgPGNvcHkgZmlsZT0iJHthaXMtMzI3MC5qYXJ9IiB0b2Rpcj0iJHthaXMuZGlzdC5saWJ9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIvPgorICAgICAgICA8Y29weSBmaWxlPSIke2Fpcy1jb2JvbC5qYXJ9IiB0b2Rpcj0iJHthaXMuZGlzdC5saWJ9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIvPgorICAgICAgICA8Y29weSBmaWxlPSIke2Fpcy1jaWNzLmphcn0iIHRvZGlyPSIke2Fpcy5kaXN0LmxpYn0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+CisgICAgICAgIDxjb3B5IGZpbGU9IiR7YWlzLWltcy5qYXJ9IiB0b2Rpcj0iJHthaXMuZGlzdC5saWJ9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIvPgorICAgICAgICA8Y29weSBmaWxlPSIke2hzYy5qYXJ9IiB0b2Rpcj0iJHthaXMuZGlzdC5saWJ9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIvPgorICAgICAgICA8Y29weSBmaWxlPSIke2FkbWluY29uc29sZS5qYXJ9IiB0b2Rpcj0iJHthaXMuZGlzdC5saWJ9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIvPgorICAgICAgICA8YW50Y2FsbCB0YXJnZXQ9ImNvcHkzcmRQYXJ0eUphcnMiPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNvcHkzcmRQYXJ0eUphcnMuZGlzdC5saWIiIHZhbHVlPSIke2Fpcy5kaXN0LmxpYn0iLz4KKyAgICAgICAgPC9hbnRjYWxsPgorICAgICAgICA8IS0tIEZvciBTQ1QgLS0+CisgICAgICAgIDxjb3B5IGZpbGU9IiR7YWlzLXRvb2xzLmphcn0iIHRvZGlyPSIke2Fpcy5kaXN0LmxpYn0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+CisgICAgICAgIDxjb3B5IGZpbGU9IiR7cm9vdC5kaXJ9L1Rvb2xVc2VyU2V0dGluZ3MuY2ZnIiB0b2Rpcj0iJHthaXMuZGlzdH0iIGZpbHRlcmluZz0idHJ1ZSIvPgorICAgICAgICA8Y29weSBmaWxlPSIke3Jvb3QuZGlyfS9zdGFydC1haXMuYmF0IiB0b2Rpcj0iJHthaXMuZGlzdH0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+CisgICAgICAgIDxjb3B5IGZpbGU9IiR7cm9vdC5kaXJ9L3N0YXJ0LWFpcy1tcS5iYXQiIHRvZGlyPSIke2Fpcy5kaXN0fSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KKyAgICAgICAgPGNvcHkgZmlsZT0iJHtyb290LmRpcn0vc3RvcC1haXMuYmF0IiB0b2Rpcj0iJHthaXMuZGlzdH0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+CisgICAgICAgIDxjb3B5IGZpbGU9IiR7cm9vdC5kaXIuc2VydmVyfS9TZXJ2ZXJTZXR0aW5ncy5jZmciIHRvZGlyPSIke2Fpcy5kaXN0fSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KKyAgICAgICAgPGNvcHkgZmlsZT0iJHtyb290LmRpcn0vU2VydmVyQmFja0VuZFNldHRpbmdzLmNmZyIgdG9kaXI9IiR7YWlzLmRpc3R9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIvPgorICAgICAgICA8Y29weSBmaWxlPSIke3Jvb3Quc2VydmVyU2V0dGluZ3N9L1NlcnZlckRlYnVnU2V0dGluZ3MuY2ZnIiB0b2Rpcj0iJHthaXMuZGlzdC5zeXN9IiBmaWx0ZXJpbmc9InRydWUiLz4KKyAgICAgICAgPGNvcHkgZmlsZT0iJHtyb290LnNlcnZlclNldHRpbmdzfS9TZXJ2ZXJEZXZlbG9wZXJTZXR0aW5ncy5jZmciIHRvZGlyPSIke2Fpcy5kaXN0LnN5c30iIGZpbHRlcmluZz0idHJ1ZSIvPgorICAgICAgICA8Y29weSBmaWxlPSIke3Jvb3Quc2VydmVyU2V0dGluZ3N9L1NlcnZlckluc3RhbGxhdGlvblNldHRpbmdzLmNmZyIgdG9kaXI9IiR7YWlzLmRpc3Quc3lzfSIgZmlsdGVyaW5nPSJ0cnVlIi8+CisgICAgICAgIDxjb3B5IGZpbGU9IiR7cm9vdC5kaXIuc3lzfS9Ub29sRGVidWdTZXR0aW5ncy5jZmciIHRvZGlyPSIke2Fpcy5kaXN0LnN5c30iIGZpbHRlcmluZz0idHJ1ZSIvPgorICAgICAgICA8Y29weSB0b2Rpcj0iJHthaXMuZGlzdC5zeXN9L0FkbWluRnVuY3Rpb25EZWZpbml0aW9ucyIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiPgorICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3NyYy5yb290LmRpcn0vU2VydmVyQWRtaW5GdW5jdGlvbnMvTWFwcGluZ1NjaGVtYXMiLz4KKyAgICAgICAgPC9jb3B5PgorICAgICAgICA8Y29weSB0b2Rpcj0iJHthaXMuZGlzdC50cmFuc2Zvcm19IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSI+CisgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7cm9vdC5kaXIuc2VydmVyLXRyYW5zZm9ybX0iLz4KKyAgICAgICAgPC9jb3B5PgorICAgICAgICA8Y29weSB0b2Rpcj0iJHthaXMuZGlzdC5jb25maWd9L2NvbW0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIj4KKyAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtyb290LmRpci5zZXJ2ZXItY29uZmlnfS9jb21tIi8+CisgICAgICAgIDwvY29weT4KKyAgICAgICAgPGNvcHkgdG9kaXI9IiR7YWlzLmRpc3QuY29uZmlnLmNvcHl9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSI+CisgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7YWlzLmRpc3QuY29uZmlnfSIvPgorICAgICAgICA8L2NvcHk+CisgICAgICAgIDxjb3B5IGZpbGU9IiR7cm9vdC5kaXIuc2VydmVyLWxvZ30vbG9nLWNhdGVnb3J5LnByb3BlcnRpZXMiIHRvZGlyPSIke2Fpcy5kaXN0LmxvZ30iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+CisgICAgICAgIDxjb3B5IGZpbGU9IiR7cm9vdC5kaXIuc2VydmVyLWxvZ30vbG9nLXN0eWxlLnByb3BlcnRpZXMiIHRvZGlyPSIke2Fpcy5kaXN0LmxvZ30iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+CisgICAgICAgIDwhLS0gVG9vbHMgZmlsZXMgLS0+CisgICAgICAgIDxjb3B5IGZpbGU9IiR7cm9vdC50b29sU2V0dGluZ3N9L1Rvb2xJbnN0YWxsYXRpb25TZXR0aW5ncy1BbGwuY2ZnIiB0b2ZpbGU9IiR7YWlzLmRpc3Quc3lzfS9Ub29sSW5zdGFsbGF0aW9uU2V0dGluZ3MuY2ZnIiBmaWx0ZXJpbmc9InRydWUiLz4KKyAgICAgICAgPGNvcHkgZmlsZT0iJHtyb290LnRvb2xTZXR0aW5nc30vU0NUVG9vbEluc3RhbGxhdGlvblNldHRpbmdzLUhDLmNmZyIgdG9kaXI9IiR7YWlzLmRpc3Quc3lzfSIgZmlsdGVyaW5nPSJ0cnVlIi8+CisgICAgICAgIDxjb3B5IGZpbGU9IiR7cm9vdC50b29sU2V0dGluZ3N9L1NDVFRvb2xJbnN0YWxsYXRpb25TZXR0aW5ncy1IQzMyNzBPbmx5LmNmZyIgdG9kaXI9IiR7YWlzLmRpc3Quc3lzfSIgZmlsdGVyaW5nPSJ0cnVlIi8+CisgICAgICAgIDxjb3B5IGZpbGU9IiR7cm9vdC50b29sU2V0dGluZ3N9L1NDVFRvb2xJbnN0YWxsYXRpb25TZXR0aW5ncy1IQzUyNTBPbmx5LmNmZyIgdG9kaXI9IiR7YWlzLmRpc3Quc3lzfSIgZmlsdGVyaW5nPSJ0cnVlIi8+CisgICAgICAgIDxjb3B5IGZpbGU9IiR7cm9vdC50b29sU2V0dGluZ3N9L1NDVFRvb2xJbnN0YWxsYXRpb25TZXR0aW5ncy1DSUNTT25seS5jZmciIHRvZGlyPSIke2Fpcy5kaXN0LnN5c30iIGZpbHRlcmluZz0idHJ1ZSIvPgorICAgICAgICA8Y29weSBmaWxlPSIke3Jvb3QuZGlyLnN5c2RlZn0vQXBwSW50ZXJmYWNlVGVzdGVyLURlZmF1bHRTZXR0aW5ncy5jZmciIHRvZGlyPSIke2Fpcy5kaXN0LnN5c2RlZn0iIGZpbHRlcmluZz0idHJ1ZSIvPgorICAgICAgICA8Y29weSBmaWxlPSIke3Jvb3QuZGlyLnN5c2RlZn0vQ2xpZW50Q29udHJvbGxlZDMyNzBTZXJ2ZXJTZXR0aW5ncy1EZWZhdWx0U2V0dGluZ3MuY2ZnIiB0b2Rpcj0iJHthaXMuZGlzdC5zeXNkZWZ9IiBmaWx0ZXJpbmc9InRydWUiLz4KKyAgICAgICAgPGNvcHkgZmlsZT0iJHtyb290LmRpci5zeXNkZWZ9L0NsaWVudENvbnRyb2xsZWQ1MjUwU2VydmVyU2V0dGluZ3MtRGVmYXVsdFNldHRpbmdzLmNmZyIgdG9kaXI9IiR7YWlzLmRpc3Quc3lzZGVmfSIgZmlsdGVyaW5nPSJ0cnVlIi8+CisgICAgICAgIDxjb3B5IGZpbGU9IiR7cm9vdC5kaXIuc3lzZGVmfS9EZWZpbml0aW9uVG9vbC1EZWZhdWx0U2V0dGluZ3MuY2ZnIiB0b2Rpcj0iJHthaXMuZGlzdC5zeXNkZWZ9IiBmaWx0ZXJpbmc9InRydWUiLz4KKyAgICAgICAgPGNvcHkgZmlsZT0iJHtyb290LmRpci5zeXNkZWZ9L1NFQUdVTExQcm9qZWN0LmRpciIgdG9kaXI9IiR7YWlzLmRpc3Quc3lzZGVmfSIvPgorICAgICAgICA8Y29weSBmaWxlPSIke3Jvb3QuZGlyLnN5c2RlZn0vU2VydmVyQ29udHJvbGxlZDMyNzBTZXJ2ZXJTZXR0aW5ncy1EZWZhdWx0U2V0dGluZ3MuY2ZnIiB0b2Rpcj0iJHthaXMuZGlzdC5zeXNkZWZ9IiBmaWx0ZXJpbmc9InRydWUiLz4KKyAgICAgICAgPGNvcHkgZmlsZT0iJHtyb290LmRpci5zeXNkZWZ9L1NlcnZlckNvbnRyb2xsZWQ1MjUwU2VydmVyU2V0dGluZ3MtRGVmYXVsdFNldHRpbmdzLmNmZyIgdG9kaXI9IiR7YWlzLmRpc3Quc3lzZGVmfSIgZmlsdGVyaW5nPSJ0cnVlIi8+CisgICAgICAgIDxjb3B5IGZpbGU9IiR7cm9vdC5kaXIuc3lzZGVmfS9TZXJ2ZXJPcHRpb25zLURlZmF1bHRTZXR0aW5ncy5jZmciIHRvZGlyPSIke2Fpcy5kaXN0LnN5c2RlZn0iIGZpbHRlcmluZz0idHJ1ZSIvPgorICAgICAgICA8Y29weSBmaWxlPSIke3Jvb3QuZGlyLnN5c2RlZn0vU2VydmVyU2V0dGluZ3MtU2tlbGV0b24uY2ZnIiB0b2Rpcj0iJHthaXMuZGlzdC5zeXNkZWZ9IiBmaWx0ZXJpbmc9InRydWUiLz4KKyAgICAgICAgPGNvcHkgZmlsZT0iJHtyb290LmRpci5zeXNkZWZ9L1dvcmtpbmdTZXRTZXR0aW5ncy5jZmciIHRvZGlyPSIke2Fpcy5kaXN0LnN5c2RlZn0iIGZpbHRlcmluZz0idHJ1ZSIvPgorICAgICAgICA8IS0tIEphdmEgQ29ubmVjdG9ycyAtLT4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHthaXMuZGlzdH0vSmF2YUNvbm5lY3RvcnMvQ2xhc3NlcyIvPgorICAgIDwvdGFyZ2V0PgorICAgIDwhLS0gQUlTIFVOSVgtc3BlY2lmaWMgLS0+CisgICAgPHByb3BlcnR5IG5hbWU9ImFpc1VOSVguZGlzdC5jb25maWciIHZhbHVlPSIke2Fpc1VOSVguZGlzdH0vY29uZmlnIi8+CisgICAgPHByb3BlcnR5IG5hbWU9ImFpc1VOSVguZGlzdC5sb2ciIHZhbHVlPSIke2Fpc1VOSVguZGlzdC5jb25maWd9L2xvZyIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJhaXNVTklYLmRpc3QubGliIiB2YWx1ZT0iJHthaXNVTklYLmRpc3R9L2xpYiIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJhaXNVTklYLmRpc3QubXEiIHZhbHVlPSIke2Fpc1VOSVguZGlzdH0vbXEiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iYWlzVU5JWC5kaXN0LnN5cyIgdmFsdWU9IiR7YWlzVU5JWC5kaXN0fS9zeXN0ZW0iLz4KKyAgICA8dGFyZ2V0IG5hbWU9ImRpc3QuYWlzVU5JWCIgZGVwZW5kcz0iaW5pdCwgZGlzdC5haXMuY29yZSwgamFyLmFkbWluY29uc29sZSI+CisgICAgICAgIDxta2RpciBkaXI9IiR7YWlzVU5JWC5kaXN0fSIvPgorICAgICAgICA8bWtkaXIgZGlyPSIke2Fpc1VOSVguZGlzdC5saWJ9Ii8+CisgICAgICAgIDxta2RpciBkaXI9IiR7YWlzVU5JWC5kaXN0LnN5c30iLz4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHthaXNVTklYLmRpc3QubXF9Ii8+CisgICAgICAgIDxjb3B5IGZpbGU9IiR7YWlzLWNvcmUuamFyfSIgdG9kaXI9IiR7YWlzVU5JWC5kaXN0LmxpYn0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+CisgICAgICAgIDxjb3B5IGZpbGU9IiR7YWlzLTUyNTAuamFyfSIgdG9kaXI9IiR7YWlzVU5JWC5kaXN0LmxpYn0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+CisgICAgICAgIDxjb3B5IGZpbGU9IiR7YWlzLTMyNzAuamFyfSIgdG9kaXI9IiR7YWlzVU5JWC5kaXN0LmxpYn0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+CisgICAgICAgIDxjb3B5IGZpbGU9IiR7YWlzLWNvYm9sLmphcn0iIHRvZGlyPSIke2Fpc1VOSVguZGlzdC5saWJ9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIvPgorICAgICAgICA8Y29weSBmaWxlPSIke2Fpcy1jaWNzLmphcn0iIHRvZGlyPSIke2Fpc1VOSVguZGlzdC5saWJ9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIvPgorICAgICAgICA8Y29weSBmaWxlPSIke2Fpcy1pbXMuamFyfSIgdG9kaXI9IiR7YWlzVU5JWC5kaXN0LmxpYn0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+CisgICAgICAgIDxjb3B5IGZpbGU9IiR7YWRtaW5jb25zb2xlLmphcn0iIHRvZGlyPSIke2Fpc1VOSVguZGlzdC5saWJ9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIvPgorICAgICAgICA8Y29weSBmaWxlPSIke2hzYy5qYXJ9IiB0b2Rpcj0iJHthaXNVTklYLmRpc3QubGlifSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KKyAgICAgICAgPGFudGNhbGwgdGFyZ2V0PSJjb3B5M3JkUGFydHlKYXJzIj4KKyAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb3B5M3JkUGFydHlKYXJzLmRpc3QubGliIiB2YWx1ZT0iJHthaXNVTklYLmRpc3QubGlifSIvPgorICAgICAgICA8L2FudGNhbGw+CisgICAgICAgIDxjb3B5IGZpbGU9IiR7cm9vdC5kaXJ9L1VOSVhTZXJ2ZXJGaWxlcy9zdGFydC1haXMuc2giIHRvZGlyPSIke2Fpc1VOSVguZGlzdH0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+CisgICAgICAgIDxjb3B5IGZpbGU9IiR7cm9vdC5kaXJ9L1VOSVhTZXJ2ZXJGaWxlcy9zdGFydC1haXMtbXEuc2giIHRvZGlyPSIke2Fpc1VOSVguZGlzdH0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+CisgICAgICAgIDxjb3B5IGZpbGU9IiR7cm9vdC5kaXJ9L1VOSVhTZXJ2ZXJGaWxlcy9zdG9wLWFpcy5zaCIgdG9kaXI9IiR7YWlzVU5JWC5kaXN0fSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KKyAgICAgICAgPGNvcHkgZmlsZT0iJHtyb290LmRpci5zZXJ2ZXJ9L1NlcnZlclNldHRpbmdzLmNmZyIgdG9kaXI9IiR7YWlzVU5JWC5kaXN0fSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KKyAgICAgICAgPGNvcHkgZmlsZT0iJHtyb290LmRpcn0vU2VydmVyQmFja0VuZFNldHRpbmdzLmNmZyIgdG9kaXI9IiR7YWlzVU5JWC5kaXN0fSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KKyAgICAgICAgPGNvcHkgZmlsZT0iJHtyb290LnNlcnZlclNldHRpbmdzfS9TZXJ2ZXJEZWJ1Z1NldHRpbmdzLmNmZyIgdG9kaXI9IiR7YWlzVU5JWC5kaXN0LnN5c30iIGZpbHRlcmluZz0idHJ1ZSIvPgorICAgICAgICA8Y29weSBmaWxlPSIke3Jvb3QuZGlyfS9VTklYU2VydmVyRmlsZXMvU2VydmVySW5zdGFsbGF0aW9uU2V0dGluZ3MuY2ZnIiB0b2Rpcj0iJHthaXNVTklYLmRpc3Quc3lzfSIgZmlsdGVyaW5nPSJ0cnVlIi8+CisgICAgICAgIDxjb3B5IHRvZGlyPSIke2Fpc1VOSVguZGlzdC5zeXN9L0FkbWluRnVuY3Rpb25EZWZpbml0aW9ucyIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiPgorICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3NyYy5yb290LmRpcn0vU2VydmVyQWRtaW5GdW5jdGlvbnMvTWFwcGluZ1NjaGVtYXMiLz4KKyAgICAgICAgPC9jb3B5PgorICAgICAgICA8Y29weSB0b2Rpcj0iJHthaXNVTklYLmRpc3R9L2NvbmZpZy90cmFuc2Zvcm0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIj4KKyAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtyb290LmRpcn0vc2VydmVyL2NvbmZpZy90cmFuc2Zvcm0iLz4KKyAgICAgICAgPC9jb3B5PgorICAgICAgICA8Y29weSBmaWxlPSIke3Jvb3QuZGlyLnNlcnZlci1sb2d9L2xvZy1jYXRlZ29yeS5wcm9wZXJ0aWVzIiB0b2Rpcj0iJHthaXNVTklYLmRpc3QubG9nfSIvPgorICAgICAgICA8Y29weSBmaWxlPSIke3Jvb3QuZGlyLnNlcnZlci1sb2d9L2xvZy1zdHlsZS5wcm9wZXJ0aWVzIiB0b2Rpcj0iJHthaXNVTklYLmRpc3QubG9nfSIvPgorICAgIDwvdGFyZ2V0PgorICAgIDwhLS0gUHJveHkgU2VydmxldCAtLT4KKyAgICA8cHJvcGVydHkgbmFtZT0icHJveHlzZXJ2bGV0LmRpc3QubGliIiB2YWx1ZT0iJHtwcm94eXNlcnZsZXQuZGlzdH0vbGliIi8+CisgICAgPHRhcmdldCBuYW1lPSJkaXN0LnByb3h5c2VydmxldCIgZGVwZW5kcz0iamFyLnByb3h5c2VydmxldCwgamFyLmFpcy5jbGllbnQiPgorICAgICAgICA8Y29weSBmaWxlPSIke3Byb3h5c2VydmxldC5qYXJ9IiB0b2Rpcj0iJHtwcm94eXNlcnZsZXQuZGlzdC5saWJ9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIvPgorICAgICAgICA8Y29weSBmaWxlPSIke2Fpcy5jbGllbnQuamFyfSIgdG9kaXI9IiR7cHJveHlzZXJ2bGV0LmRpc3QubGlifSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KKyAgICAgICAgPGNvcHkgZmlsZT0iJHt4ZXJjZXMuamFyfSIgdG9kaXI9IiR7cHJveHlzZXJ2bGV0LmRpc3QubGlifSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KKyAgICAgICAgPGNvcHkgZmlsZT0iJHt4bWwtYXBpcy5qYXJ9IiB0b2Rpcj0iJHtwcm94eXNlcnZsZXQuZGlzdC5saWJ9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIvPgorICAgICAgICA8Y29weSBmaWxlPSIke3Jvb3QuZGlyfS9TZXJ2bGV0Q29uZmlnRmlsZXMvQUlTUHJveHlTZXJ2bGV0UmVhZG1lLnR4dCIgdG9kaXI9IiR7cHJveHlzZXJ2bGV0LmRpc3R9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIvPgorICAgICAgICA8Y29weSBmaWxlPSIke3Jvb3QuZGlyfS9TZXJ2bGV0Q29uZmlnRmlsZXMvd2ViLnhtbCIgdG9kaXI9IiR7cHJveHlzZXJ2bGV0LmRpc3R9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIvPgorICAgICAgICA8Y29weSBmaWxlPSIke2RvYy5kaXJ9L1RyYW5zaWRpb20gSFRUUFMgU3VwcG9ydC5kb2MiIHRvZGlyPSIke3Byb3h5c2VydmxldC5kaXN0fSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KKyAgICAgICAgPGNvcHkgZmlsZT0iJHtkb2MuZGlyfS9UcmFuc2lkaW9tIEhUVFAgUmVxdWVzdHMgUmVkaXJlY3Rpb24gb24gSUlTLmRvYyIgdG9kaXI9IiR7cHJveHlzZXJ2bGV0LmRpc3R9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIvPgorICAgIDwvdGFyZ2V0PgorICAgIDwhLS0gRGV2VG9vbHMgLS0+CisgICAgPHByb3BlcnR5IG5hbWU9ImRldnRvb2xzLmRpc3QuY29uZmlnIiB2YWx1ZT0iJHtkZXZ0b29scy5kaXN0fS9jb25maWciLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGV2dG9vbHMuZGlzdC5sb2ciIHZhbHVlPSIke2RldnRvb2xzLmRpc3QuY29uZmlnfS9sb2ciLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZGV2dG9vbHMuZGlzdC5saWIiIHZhbHVlPSIke2RldnRvb2xzLmRpc3R9L2xpYiIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXZ0b29scy5kaXN0LnN5cyIgdmFsdWU9IiR7ZGV2dG9vbHMuZGlzdH0vc3lzdGVtIi8+CisgICAgPHByb3BlcnR5IG5hbWU9ImRldnRvb2xzLmRpc3Quc3lzZGVmIiB2YWx1ZT0iJHtkZXZ0b29scy5kaXN0LnN5c30vZGVmYXVsdHMiLz4KKyAgICA8dGFyZ2V0IG5hbWU9ImRpc3QuZGV2dG9vbHMiIGRlcGVuZHM9ImluaXQsIGphci5haXMtY29yZSwgamFyLmFpcy10b29scyI+CisgICAgICAgIDxta2RpciBkaXI9IiR7ZGV2dG9vbHMuZGlzdH0iLz4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtkZXZ0b29scy5kaXN0LmxpYn0iLz4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtkZXZ0b29scy5kaXN0LnN5c30iLz4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtkZXZ0b29scy5kaXN0LnN5c2RlZn0iLz4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtkZXZ0b29scy5kaXN0LmxvZ30iLz4KKyAgICAgICAgPGNvcHkgZmlsZT0iJHthaXMtdG9vbHMuamFyfSIgdG9kaXI9IiR7ZGV2dG9vbHMuZGlzdC5saWJ9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIvPgorICAgICAgICA8Y29weSBmaWxlPSIke2Fpcy1jb3JlLmphcn0iIHRvZGlyPSIke2RldnRvb2xzLmRpc3QubGlifSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KKyAgICAgICAgPGNvcHkgZmlsZT0iJHthaXMtNTI1MC5qYXJ9IiB0b2Rpcj0iJHtkZXZ0b29scy5kaXN0LmxpYn0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+CisgICAgICAgIDxjb3B5IGZpbGU9IiR7YWlzLTMyNzAuamFyfSIgdG9kaXI9IiR7ZGV2dG9vbHMuZGlzdC5saWJ9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIvPgorICAgICAgICA8Y29weSBmaWxlPSIke2Fpcy1jb2JvbC5qYXJ9IiB0b2Rpcj0iJHtkZXZ0b29scy5kaXN0LmxpYn0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+CisgICAgICAgIDxjb3B5IGZpbGU9IiR7YWlzLWNpY3MuamFyfSIgdG9kaXI9IiR7ZGV2dG9vbHMuZGlzdC5saWJ9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIvPgorICAgICAgICA8Y29weSBmaWxlPSIke2Fpcy1pbXMuamFyfSIgdG9kaXI9IiR7ZGV2dG9vbHMuZGlzdC5saWJ9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIvPgorICAgICAgICA8Y29weSBmaWxlPSIke2Fpcy5jbGllbnQuamFyfSIgdG9kaXI9IiR7ZGV2dG9vbHMuZGlzdC5saWJ9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIvPgorICAgICAgICA8Y29weSBmaWxlPSIke2Fpcy1hZG1pbmNsaWVudC5qYXJ9IiB0b2Rpcj0iJHtkZXZ0b29scy5kaXN0LmxpYn0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+CisgICAgICAgIDxhbnRjYWxsIHRhcmdldD0iY29weTNyZFBhcnR5SmFycyI+CisgICAgICAgICAgICA8cGFyYW0gbmFtZT0iY29weTNyZFBhcnR5SmFycy5kaXN0LmxpYiIgdmFsdWU9IiR7ZGV2dG9vbHMuZGlzdC5saWJ9Ii8+CisgICAgICAgIDwvYW50Y2FsbD4KKyAgICAgICAgPCEtLSBSb290IC0tPgorICAgICAgICA8Y29weSBmaWxlPSIke3Jvb3QuZGlyfS9EaXJlY3QgUHVibGlzaC5iYXQiIHRvZGlyPSIke2RldnRvb2xzLmRpc3R9Ii8+CisgICAgICAgIDxjb3B5IGZpbGU9IiR7cm9vdC5kaXJ9L0RpcmVjdFB1Ymxpc2guYXJncyIgdG9kaXI9IiR7ZGV2dG9vbHMuZGlzdH0iLz4KKyAgICAgICAgPGNvcHkgZmlsZT0iJHtyb290LmRpcn0vSW50ZXJmYWNlIERlZmluaXRpb24gVG9vbC5iYXQiIHRvZGlyPSIke2RldnRvb2xzLmRpc3R9Ii8+CisgICAgICAgIDxjb3B5IGZpbGU9IiR7cm9vdC5kaXJ9L0NJQ1MgQ29ubmVjdG9yIEJ1aWxkZXIuYmF0IiB0b2Rpcj0iJHtkZXZ0b29scy5kaXN0fSIvPgorICAgICAgICA8Y29weSBmaWxlPSIke3Jvb3QuZGlyfS9JTVMgQ29ubmVjdG9yIEJ1aWxkZXIuYmF0IiB0b2Rpcj0iJHtkZXZ0b29scy5kaXN0fSIvPgorICAgICAgICA8Y29weSBmaWxlPSIke3Jvb3QuZGlyfS9JbnRlcmZhY2UgRnVuY3Rpb24gVGVzdGVyLmJhdCIgdG9kaXI9IiR7ZGV2dG9vbHMuZGlzdH0iLz4KKyAgICAgICAgPGNvcHkgZmlsZT0iJHtyb290LmRpcn0vVG9vbFVzZXJTZXR0aW5ncy5jZmciIHRvZGlyPSIke2RldnRvb2xzLmRpc3R9IiBmaWx0ZXJpbmc9InRydWUiLz4KKyAgICAgICAgPGNvcHkgZmlsZT0iJHtiaW5hcnkucm9vdC5kaXJ9L0phdmEvV2luMzIvQmluL1dpbjMyUmVnaXN0cnlJbnRlcmZhY2UuZGxsIiB0b2Rpcj0iJHtkZXZ0b29scy5kaXN0fSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KKyAgICAgICAgPCEtLSBzeXN0ZW0gKGZpbGVzIGFyZSBpbiBhbHBoYSBvcmRlciBoZXJlKSAtLT4KKyAgICAgICAgPGNvcHkgZmlsZT0iJHtyb290LnRvb2xTZXR0aW5nc30vREZQVG9vbEluc3RhbGxhdGlvblNldHRpbmdzLUhDLmNmZyIgdG9maWxlPSIke2RldnRvb2xzLmRpc3Quc3lzfS9ERlBUb29sSW5zdGFsbGF0aW9uU2V0dGluZ3MuY2ZnIiBmaWx0ZXJpbmc9InRydWUiLz4KKyAgICAgICAgPGNvcHkgZmlsZT0iJHtyb290LnRvb2xTZXR0aW5nc30vU0NUVG9vbEluc3RhbGxhdGlvblNldHRpbmdzLUhDLmNmZyIgdG9kaXI9IiR7ZGV2dG9vbHMuZGlzdC5zeXN9IiBmaWx0ZXJpbmc9InRydWUiLz4KKyAgICAgICAgPGNvcHkgZmlsZT0iJHtyb290LnRvb2xTZXR0aW5nc30vU0NUVG9vbEluc3RhbGxhdGlvblNldHRpbmdzLUhDMzI3ME9ubHkuY2ZnIiB0b2Rpcj0iJHtkZXZ0b29scy5kaXN0LnN5c30iIGZpbHRlcmluZz0idHJ1ZSIvPgorICAgICAgICA8Y29weSBmaWxlPSIke3Jvb3QudG9vbFNldHRpbmdzfS9TQ1RUb29sSW5zdGFsbGF0aW9uU2V0dGluZ3MtSEM1MjUwT25seS5jZmciIHRvZGlyPSIke2RldnRvb2xzLmRpc3Quc3lzfSIgZmlsdGVyaW5nPSJ0cnVlIi8+CisgICAgICAgIDxjb3B5IGZpbGU9IiR7cm9vdC50b29sU2V0dGluZ3N9L1NDVFRvb2xJbnN0YWxsYXRpb25TZXR0aW5ncy1DSUNTT25seS5jZmciIHRvZGlyPSIke2RldnRvb2xzLmRpc3Quc3lzfSIgZmlsdGVyaW5nPSJ0cnVlIi8+CisgICAgICAgIDxjb3B5IGZpbGU9IiR7cm9vdC5kaXIuc3lzfS9Ub29sRGVidWdTZXR0aW5ncy5jZmciIHRvZGlyPSIke2RldnRvb2xzLmRpc3Quc3lzfSIgZmlsdGVyaW5nPSJ0cnVlIi8+CisgICAgICAgIDxjb3B5IGZpbGU9IiR7cm9vdC50b29sU2V0dGluZ3N9L1Rvb2xJbnN0YWxsYXRpb25TZXR0aW5ncy1BbGwuY2ZnIiB0b2ZpbGU9IiR7ZGV2dG9vbHMuZGlzdC5zeXN9L1Rvb2xJbnN0YWxsYXRpb25TZXR0aW5ncy5jZmciIGZpbHRlcmluZz0idHJ1ZSIvPgorICAgICAgICA8Y29weSBmaWxlPSIke3Jvb3QudG9vbFNldHRpbmdzfS9Ub29sSW5zdGFsbGF0aW9uU2V0dGluZ3MtRGVmVG9vbEhDLmNmZyIgdG9kaXI9IiR7ZGV2dG9vbHMuZGlzdC5zeXN9IiBmaWx0ZXJpbmc9InRydWUiLz4KKyAgICAgICAgPGNvcHkgZmlsZT0iJHtyb290LnRvb2xTZXR0aW5nc30vVG9vbEluc3RhbGxhdGlvblNldHRpbmdzLURlZlRvb2xIQzMyNzBPbmx5LmNmZyIgdG9kaXI9IiR7ZGV2dG9vbHMuZGlzdC5zeXN9IiBmaWx0ZXJpbmc9InRydWUiLz4KKyAgICAgICAgPGNvcHkgZmlsZT0iJHtyb290LnRvb2xTZXR0aW5nc30vVG9vbEluc3RhbGxhdGlvblNldHRpbmdzLURlZlRvb2xIQzUyNTBPbmx5LmNmZyIgdG9kaXI9IiR7ZGV2dG9vbHMuZGlzdC5zeXN9IiBmaWx0ZXJpbmc9InRydWUiLz4KKyAgICAgICAgPGNvcHkgZmlsZT0iJHtyb290LnRvb2xTZXR0aW5nc30vVG9vbEluc3RhbGxhdGlvblNldHRpbmdzLURlZlRvb2xDSUNTT25seS5jZmciIHRvZGlyPSIke2RldnRvb2xzLmRpc3Quc3lzfSIgZmlsdGVyaW5nPSJ0cnVlIi8+CisgICAgICAgIDxjb3B5IGZpbGU9IiR7cm9vdC50b29sU2V0dGluZ3N9L1Rvb2xJbnN0YWxsYXRpb25TZXR0aW5ncy1EZWZUb29sSU1TT25seS5jZmciIHRvZGlyPSIke2RldnRvb2xzLmRpc3Quc3lzfSIgZmlsdGVyaW5nPSJ0cnVlIi8+CisgICAgICAgIDwhLS0gc3lzdGVtIGRlZmF1bHRzIC0tPgorICAgICAgICA8Y29weSBmaWxlPSIke3Jvb3QuZGlyLnN5c2RlZn0vQXBwSW50ZXJmYWNlVGVzdGVyLURlZmF1bHRTZXR0aW5ncy5jZmciIHRvZGlyPSIke2RldnRvb2xzLmRpc3Quc3lzZGVmfSIgZmlsdGVyaW5nPSJ0cnVlIi8+CisgICAgICAgIDxjb3B5IGZpbGU9IiR7cm9vdC5kaXIuc3lzZGVmfS9DbGllbnRDb250cm9sbGVkMzI3MFNlcnZlclNldHRpbmdzLURlZmF1bHRTZXR0aW5ncy5jZmciIHRvZGlyPSIke2RldnRvb2xzLmRpc3Quc3lzZGVmfSIgZmlsdGVyaW5nPSJ0cnVlIi8+CisgICAgICAgIDxjb3B5IGZpbGU9IiR7cm9vdC5kaXIuc3lzZGVmfS9DbGllbnRDb250cm9sbGVkNTI1MFNlcnZlclNldHRpbmdzLURlZmF1bHRTZXR0aW5ncy5jZmciIHRvZGlyPSIke2RldnRvb2xzLmRpc3Quc3lzZGVmfSIgZmlsdGVyaW5nPSJ0cnVlIi8+CisgICAgICAgIDxjb3B5IGZpbGU9IiR7cm9vdC5kaXIuc3lzZGVmfS9EZWZpbml0aW9uVG9vbC1EZWZhdWx0U2V0dGluZ3MuY2ZnIiB0b2Rpcj0iJHtkZXZ0b29scy5kaXN0LnN5c2RlZn0iIGZpbHRlcmluZz0idHJ1ZSIvPgorICAgICAgICA8Y29weSBmaWxlPSIke3Jvb3QuZGlyLnN5c2RlZn0vU0VBR1VMTFByb2plY3QuZGlyIiB0b2Rpcj0iJHtkZXZ0b29scy5kaXN0LnN5c2RlZn0iLz4KKyAgICAgICAgPGNvcHkgZmlsZT0iJHtyb290LmRpci5zeXNkZWZ9L1NlcnZlckNvbnRyb2xsZWQzMjcwU2VydmVyU2V0dGluZ3MtRGVmYXVsdFNldHRpbmdzLmNmZyIgdG9kaXI9IiR7ZGV2dG9vbHMuZGlzdC5zeXNkZWZ9IiBmaWx0ZXJpbmc9InRydWUiLz4KKyAgICAgICAgPGNvcHkgZmlsZT0iJHtyb290LmRpci5zeXNkZWZ9L1NlcnZlckNvbnRyb2xsZWQ1MjUwU2VydmVyU2V0dGluZ3MtRGVmYXVsdFNldHRpbmdzLmNmZyIgdG9kaXI9IiR7ZGV2dG9vbHMuZGlzdC5zeXNkZWZ9IiBmaWx0ZXJpbmc9InRydWUiLz4KKyAgICAgICAgPGNvcHkgZmlsZT0iJHtyb290LmRpci5zeXNkZWZ9L1NlcnZlck9wdGlvbnMtRGVmYXVsdFNldHRpbmdzLmNmZyIgdG9kaXI9IiR7ZGV2dG9vbHMuZGlzdC5zeXNkZWZ9IiBmaWx0ZXJpbmc9InRydWUiLz4KKyAgICAgICAgPGNvcHkgZmlsZT0iJHtyb290LmRpci5zeXNkZWZ9L1NlcnZlclNldHRpbmdzLVNrZWxldG9uLmNmZyIgdG9kaXI9IiR7ZGV2dG9vbHMuZGlzdC5zeXNkZWZ9IiBmaWx0ZXJpbmc9InRydWUiLz4KKyAgICAgICAgPGNvcHkgZmlsZT0iJHtyb290LmRpci5zeXNkZWZ9L1dvcmtpbmdTZXRTZXR0aW5ncy5jZmciIHRvZGlyPSIke2RldnRvb2xzLmRpc3Quc3lzZGVmfSIgZmlsdGVyaW5nPSJ0cnVlIi8+CisgICAgICAgIDxjb3B5IGZpbGU9IiR7cm9vdC5kaXIudG9vbHMtbG9nfS9sb2ctY2F0ZWdvcnkucHJvcGVydGllcyIgdG9kaXI9IiR7ZGV2dG9vbHMuZGlzdC5sb2d9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIvPgorICAgICAgICA8Y29weSBmaWxlPSIke3Jvb3QuZGlyLnRvb2xzLWxvZ30vbG9nLXN0eWxlLnByb3BlcnRpZXMiIHRvZGlyPSIke2RldnRvb2xzLmRpc3QubG9nfSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KKyAgICA8L3RhcmdldD4KKyAgICA8IS0tIEFJUyBDZW50cmFsIC0tPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0cmFuc2lkaW9tY2VudHJhbC5kaXN0LmxpYiIgdmFsdWU9IiR7dHJhbnNpZGlvbWNlbnRyYWwuZGlzdH0vbGliIi8+CisgICAgPHRhcmdldCBuYW1lPSJkaXN0LnRyYW5zaWRpb21jZW50cmFsIiBkZXBlbmRzPSJpbml0LCBqYXIuYWlzLWNvcmUsIGphci5haXMtdG9vbHMsIGphci5qYXZhY29ubmVjdG9yZ2VuZXJhdG9yLCBqYXIuc2VjdXJpdHl0b29sa2l0Ij4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHt0cmFuc2lkaW9tY2VudHJhbC5kaXN0fSIvPgorICAgICAgICA8bWtkaXIgZGlyPSIke3RyYW5zaWRpb21jZW50cmFsLmRpc3QubGlifSIvPgorICAgICAgICA8Y29weSBmaWxlPSIke2Fpcy1jb3JlLmphcn0iIHRvZGlyPSIke3RyYW5zaWRpb21jZW50cmFsLmRpc3QubGlifSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KKyAgICAgICAgPGNvcHkgZmlsZT0iJHthaXMtNTI1MC5qYXJ9IiB0b2Rpcj0iJHt0cmFuc2lkaW9tY2VudHJhbC5kaXN0LmxpYn0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+CisgICAgICAgIDxjb3B5IGZpbGU9IiR7YWlzLTMyNzAuamFyfSIgdG9kaXI9IiR7dHJhbnNpZGlvbWNlbnRyYWwuZGlzdC5saWJ9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIvPgorICAgICAgICA8Y29weSBmaWxlPSIke2Fpcy1jb2JvbC5qYXJ9IiB0b2Rpcj0iJHt0cmFuc2lkaW9tY2VudHJhbC5kaXN0LmxpYn0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+CisgICAgICAgIDxjb3B5IGZpbGU9IiR7YWlzLWNpY3MuamFyfSIgdG9kaXI9IiR7dHJhbnNpZGlvbWNlbnRyYWwuZGlzdC5saWJ9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIvPgorICAgICAgICA8Y29weSBmaWxlPSIke2Fpcy1pbXMuamFyfSIgdG9kaXI9IiR7dHJhbnNpZGlvbWNlbnRyYWwuZGlzdC5saWJ9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIvPgorICAgICAgICA8Y29weSBmaWxlPSIke2Fpcy10b29scy5qYXJ9IiB0b2Rpcj0iJHt0cmFuc2lkaW9tY2VudHJhbC5kaXN0LmxpYn0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+CisgICAgICAgIDxjb3B5IGZpbGU9IiR7YWlzLmNsaWVudC5qYXJ9IiB0b2Rpcj0iJHt0cmFuc2lkaW9tY2VudHJhbC5kaXN0LmxpYn0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+CisgICAgICAgIDxjb3B5IGZpbGU9IiR7c2VjdXJpdHl0b29sa2l0Lmphcn0iIHRvZGlyPSIke3RyYW5zaWRpb21jZW50cmFsLmRpc3QubGlifSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KKyAgICAgICAgPGNvcHkgZmlsZT0iJHtqYXZhY29ubmVjdG9yZ2VuZXJhdG9yLmphcn0iIHRvZGlyPSIke3RyYW5zaWRpb21jZW50cmFsLmRpc3QubGlifSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KKyAgICAgICAgPGNvcHkgZmlsZT0iJHtjb21tb25zLWNvZGVjLmphcn0iIHRvZGlyPSIke3RyYW5zaWRpb21jZW50cmFsLmRpc3QubGlifSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KKyAgICAgICAgPGNvcHkgZmlsZT0iJHtjb21tb25zLWxhbmcuamFyfSIgdG9kaXI9IiR7dHJhbnNpZGlvbWNlbnRyYWwuZGlzdC5saWJ9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIvPgorICAgICAgICA8Y29weSBmaWxlPSIke3hlcmNlcy5qYXJ9IiB0b2Rpcj0iJHt0cmFuc2lkaW9tY2VudHJhbC5kaXN0LmxpYn0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+CisgICAgICAgIDxjb3B5IGZpbGU9IiR7eGFsYW4uamFyfSIgdG9kaXI9IiR7dHJhbnNpZGlvbWNlbnRyYWwuZGlzdC5saWJ9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIvPgorICAgICAgICA8Y29weSBmaWxlPSIke3htbC1hcGlzLmphcn0iIHRvZGlyPSIke3RyYW5zaWRpb21jZW50cmFsLmRpc3QubGlifSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KKyAgICAgICAgPGNvcHkgZmlsZT0iJHtqYXhiMS5qYXJ9IiB0b2Rpcj0iJHt0cmFuc2lkaW9tY2VudHJhbC5kaXN0LmxpYn0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+CisgICAgICAgIDxjb3B5IGZpbGU9IiR7amF4YjIuamFyfSIgdG9kaXI9IiR7dHJhbnNpZGlvbWNlbnRyYWwuZGlzdC5saWJ9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIvPgorICAgICAgICA8Y29weSBmaWxlPSIke2pheGIzLmphcn0iIHRvZGlyPSIke3RyYW5zaWRpb21jZW50cmFsLmRpc3QubGlifSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KKyAgICAgICAgPGNvcHkgZmlsZT0iJHtqYXhiNC5qYXJ9IiB0b2Rpcj0iJHt0cmFuc2lkaW9tY2VudHJhbC5kaXN0LmxpYn0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+CisgICAgICAgIDxjb3B5IGZpbGU9IiR7amF4YjUuamFyfSIgdG9kaXI9IiR7dHJhbnNpZGlvbWNlbnRyYWwuZGlzdC5saWJ9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIvPgorICAgICAgICA8Y29weSBmaWxlPSIke2pheGI2Lmphcn0iIHRvZGlyPSIke3RyYW5zaWRpb21jZW50cmFsLmRpc3QubGlifSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KKyAgICAgICAgPGNvcHkgZmlsZT0iJHtqYXhiNy5qYXJ9IiB0b2Rpcj0iJHt0cmFuc2lkaW9tY2VudHJhbC5kaXN0LmxpYn0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+CisgICAgPC90YXJnZXQ+CisgICAgPCEtLSBVc2VyIERvY3MgLS0+CisgICAgPHRhcmdldCBuYW1lPSJkaXN0LmRvY3MiPgorICAgICAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmRpc3R9L2RvY3MiLz4KKyAgICAgICAgPGNvcHkgdG9kaXI9IiR7YnVpbGQuZGlzdH0vZG9jcyI+CisgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7ZG9jLmRpcn0iPgorICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9IlRyYW5zaWRpb20gSFRUUCouZG9jIi8+CisgICAgICAgICAgICA8L2ZpbGVzZXQ+CisgICAgICAgIDwvY29weT4KKyAgICA8L3RhcmdldD4KKyAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgICAgPCEtLSBKYXZhZG9jIGZvciBvcGVuIGJhY2stZW5kIEFQSSAtLT4KKyAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgICAgPHByb3BlcnR5IG5hbWU9ImFpcy5kaXN0LmphdmFkb2MiIHZhbHVlPSIke2Fpcy5kaXN0fS9KYXZhQ29ubmVjdG9ycy9Eb2N1bWVudGF0aW9uL0phdmFEb2MiLz4KKyAgICA8dGFyZ2V0IG5hbWU9ImphdmFkb2Mub3BlbmJhY2tlbmQiIGRlcGVuZHM9ImNvbXBpbGUuZG9jbGV0Ij4KKyAgICAgICAgPGRlbGV0ZSBkaXI9IiR7YWlzLmRpc3QuamF2YWRvY30iIGluY2x1ZGVFbXB0eURpcnM9InRydWUiIHF1aWV0PSJ0cnVlIi8+CisgICAgICAgIDxta2RpciBkaXI9IiR7YWlzLmRpc3QuamF2YWRvY30iLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImJhc2ljLWhlYWRlciIgdmFsdWU9IiR7TmFtZX0mI3gyMTIyOywgQUlTIEphdmEgQ29ubmVjdG9yIi8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJoZWFkZXIrdmVyc2lvbiIgdmFsdWU9IiR7YmFzaWMtaGVhZGVyfSwgdiR7dmVyc2lvbn0iLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9Indpbi10aXRsZSIgdmFsdWU9IiR7aGVhZGVyK3ZlcnNpb259IEFQSSBTcGVjaWZpY2F0aW9uIi8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkb2MtdGl0bGUiIHZhbHVlPSIke2hlYWRlcit2ZXJzaW9ufSZsdDtici8mZ3Q7QVBJIFNwZWNpZmljYXRpb24iLz4KKyAgICAgICAgPGphdmFkb2Mgc291cmNlcGF0aD0iJHtzcmMuZGlyfSIgZGVzdGRpcj0iJHthaXMuZGlzdC5qYXZhZG9jfSIgd2luZG93dGl0bGU9IiR7d2luLXRpdGxlfSIgZG9jdGl0bGU9IiR7ZG9jLXRpdGxlfSIgaGVhZGVyPSIke2Jhc2ljLWhlYWRlcn0iIGJvdHRvbT0iJmx0O2ZvbnQgc2l6ZT0mcXVvdDstMSZxdW90OyZndDske05hbWV9IGlzIGEgdHJhZGVtYXJrIG9yIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBTZWFndWxsIEhvbGRpbmcgTlYgaW4gdGhlIFVTIGFuZCBvdGhlciBjb3VudHJpZXMuJmx0O2JyLyZndDtDb3B5cmlnaHQgJiMxNjk7IDE5OTMgLSAyMDAzIFNlYWd1bGwgQnVzaW5lc3MgU29mdHdhcmUgSXJlbGFuZCBMdGQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuJmx0Oy9mb250Jmd0OyIgYXV0aG9yPSJmYWxzZSIgdmVyc2lvbj0idHJ1ZSIgdXNlPSJ0cnVlIiBkb2NsZXQ9ImNvbS5zZWFndWxsc3cuaW50ZXJuYWxkZXYudG9vbHMuYXBpZG9jbGV0LnN0YW5kYXJkLlN0YW5kYXJkIiBkb2NsZXRwYXRoPSIke2J1aWxkLmNsYXNzZXN9OyR7amF2YS5yZXNvdXJjZS5kaXJ9Ij4KKyAgICAgICAgICAgIDwhLS0gSSBkb24ndCB1bmRlcnN0YW5kIGl0LCBidXQgaWYgSSBsZWF2ZSBvZmYgdGhlICR7c3JjLmRpcn0gYmVsb3csIGl0IGRvZXNuJ3Qgd29yay4gLS0+CisgICAgICAgICAgICA8c291cmNlIGZpbGU9IiR7c3JjLmRpcn0vY29tL3NlYWd1bGxzdy9hcHBpbnRlcmZhY2Uvc2VydmVyL2JhY2tlbmQvQmFja0VuZC5qYXZhIi8+CisgICAgICAgICAgICA8c291cmNlIGZpbGU9IiR7c3JjLmRpcn0vY29tL3NlYWd1bGxzdy9hcHBpbnRlcmZhY2Uvc2VydmVyL2JhY2tlbmQvQmFja0VuZEluZm8uamF2YSIvPgorICAgICAgICAgICAgPHNvdXJjZSBmaWxlPSIke3NyYy5kaXJ9L2NvbS9zZWFndWxsc3cvYXBwaW50ZXJmYWNlL3NlcnZlci9iYWNrZW5kL0JhY2tFbmRIYW5kbGVyLmphdmEiLz4KKyAgICAgICAgICAgIDxzb3VyY2UgZmlsZT0iJHtzcmMuZGlyfS9jb20vc2VhZ3VsbHN3L2FwcGludGVyZmFjZS9zZXJ2ZXIvYmFja2VuZC9CYWNrRW5kU2V0dGluZ3MuamF2YSIvPgorICAgICAgICAgICAgPHNvdXJjZSBmaWxlPSIke3NyYy5kaXJ9L2NvbS9zZWFndWxsc3cvYXBwaW50ZXJmYWNlL3NlcnZlci9iYWNrZW5kL0NhbGxiYWNrLmphdmEiLz4KKyAgICAgICAgICAgIDxzb3VyY2UgZmlsZT0iJHtzcmMuZGlyfS9jb20vc2VhZ3VsbHN3L2FwcGludGVyZmFjZS9zZXJ2ZXIvYmFja2VuZC9DbGllbnRTZXNzaW9uLmphdmEiLz4KKyAgICAgICAgICAgIDxzb3VyY2UgZmlsZT0iJHtzcmMuZGlyfS9jb20vc2VhZ3VsbHN3L2FwcGludGVyZmFjZS9zZXJ2ZXIvYmFja2VuZC9JbnZvY2F0aW9uQ29udGV4dC5qYXZhIi8+CisgICAgICAgICAgICA8c291cmNlIGZpbGU9IiR7c3JjLmRpcn0vY29tL3NlYWd1bGxzdy9hcHBpbnRlcmZhY2UvbW9kZWwvQWdncmVnYXRlTW9kZWwuamF2YSIvPgorICAgICAgICAgICAgPHNvdXJjZSBmaWxlPSIke3NyYy5kaXJ9L2NvbS9zZWFndWxsc3cvYXBwaW50ZXJmYWNlL21vZGVsL0FwcEludGVyZmFjZVJ1bnRpbWVFeGNlcHRpb24uamF2YSIvPgorICAgICAgICAgICAgPHNvdXJjZSBmaWxlPSIke3NyYy5kaXJ9L2NvbS9zZWFndWxsc3cvYXBwaW50ZXJmYWNlL21vZGVsL0RhdGFFbGVtZW50TW9kZWwuamF2YSIvPgorICAgICAgICAgICAgPHNvdXJjZSBmaWxlPSIke3NyYy5kaXJ9L2NvbS9zZWFndWxsc3cvYXBwaW50ZXJmYWNlL21vZGVsL0ZpZWxkTW9kZWwuamF2YSIvPgorICAgICAgICAgICAgPHNvdXJjZSBmaWxlPSIke3NyYy5kaXJ9L2NvbS9zZWFndWxsc3cvYXBwaW50ZXJmYWNlL21vZGVsL0lsbGVnYWxFbGVtZW50RXhjZXB0aW9uLmphdmEiLz4KKyAgICAgICAgICAgIDxzb3VyY2UgZmlsZT0iJHtzcmMuZGlyfS9jb20vc2VhZ3VsbHN3L2FwcGludGVyZmFjZS9tb2RlbC9JbGxlZ2FsUGF0aEV4Y2VwdGlvbi5qYXZhIi8+CisgICAgICAgICAgICA8c291cmNlIGZpbGU9IiR7c3JjLmRpcn0vY29tL3NlYWd1bGxzdy9hcHBpbnRlcmZhY2UvbW9kZWwvTW9kZWxFbGVtZW50LmphdmEiLz4KKyAgICAgICAgICAgIDxzb3VyY2UgZmlsZT0iJHtzcmMuZGlyfS9jb20vc2VhZ3VsbHN3L2FwcGludGVyZmFjZS9tb2RlbC9TZXF1ZW5jZU1vZGVsLmphdmEiLz4KKyAgICAgICAgICAgIDxzb3VyY2UgZmlsZT0iJHtzcmMuZGlyfS9jb20vc2VhZ3VsbHN3L2FwcGludGVyZmFjZS9tb2RlbC9TdHJ1Y3R1cmVNb2RlbC5qYXZhIi8+CisgICAgICAgICAgICA8c291cmNlIGZpbGU9IiR7c3JjLmRpcn0vY29tL3NlYWd1bGxzdy9hcHBpbnRlcmZhY2UvbW9kZWwvZGF0YS9BZ2dyZWdhdGUuamF2YSIvPgorICAgICAgICAgICAgPHNvdXJjZSBmaWxlPSIke3NyYy5kaXJ9L2NvbS9zZWFndWxsc3cvYXBwaW50ZXJmYWNlL21vZGVsL2RhdGEvRGF0YUVsZW1lbnQuamF2YSIvPgorICAgICAgICAgICAgPHNvdXJjZSBmaWxlPSIke3NyYy5kaXJ9L2NvbS9zZWFndWxsc3cvYXBwaW50ZXJmYWNlL21vZGVsL2RhdGEvRGF0YUVsZW1lbnRMaXN0LmphdmEiLz4KKyAgICAgICAgICAgIDxzb3VyY2UgZmlsZT0iJHtzcmMuZGlyfS9jb20vc2VhZ3VsbHN3L2FwcGludGVyZmFjZS9tb2RlbC9kYXRhL0ZpZWxkLmphdmEiLz4KKyAgICAgICAgICAgIDxzb3VyY2UgZmlsZT0iJHtzcmMuZGlyfS9jb20vc2VhZ3VsbHN3L2FwcGludGVyZmFjZS9tb2RlbC9kYXRhL1NlcXVlbmNlLmphdmEiLz4KKyAgICAgICAgICAgIDxzb3VyY2UgZmlsZT0iJHtzcmMuZGlyfS9jb20vc2VhZ3VsbHN3L2FwcGludGVyZmFjZS9tb2RlbC9kYXRhL1N0cnVjdHVyZS5qYXZhIi8+CisgICAgICAgICAgICA8Y2xhc3NwYXRoPgorICAgICAgICAgICAgICAgIDxwYXRoIHJlZmlkPSJhaXMuY2xhc3NwYXRoIi8+CisgICAgICAgICAgICA8L2NsYXNzcGF0aD4KKyAgICAgICAgICAgIDxsaW5rIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvamRrLzEuMy4xL2RvY3MvYXBpLyIvPgorICAgICAgICA8L2phdmFkb2M+CisgICAgPC90YXJnZXQ+CisgICAgPCEtLSBWRVJJRlkgLS0+CisgICAgPHBhdGggaWQ9InBhdGguQW50VGFza3MiPgorICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7anVuaXQuamFyfSIvPgorICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y29tbW9ucy1jbGkuamFyfSIvPgorICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y29tbW9ucy1odHRwY2xpZW50Lmphcn0iLz4KKyAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2J1aWxkLmNsYXNzZXN9Ii8+CisgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtpbnRlcm5hbGRldi5jbGFzc2VzfSIvPgorICAgIDwvcGF0aD4KKyAgICA8dGFyZ2V0IG5hbWU9ImJ1aWxkLkFudFRhc2tzIj4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtpbnRlcm5hbGRldi5jbGFzc2VzfSIvPgorICAgICAgICA8amF2YWMgc3JjZGlyPSIke3NyYy50ZXN0LmRpcn0iIGRlc3RkaXI9IiR7aW50ZXJuYWxkZXYuY2xhc3Nlc30iIGRlYnVnPSIke2NvbXBpbGUuZGVidWd9IiBjbGFzc3BhdGhyZWY9InBhdGguQW50VGFza3MiPgorICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iY29tL3NlYWd1bGxzdy9pbnRlcm5hbGRldi9idWlsZC9KYXJGaWxlVmVyaWZpZXIuamF2YSIvPgorICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iY29tL3NlYWd1bGxzdy9pbnRlcm5hbGRldi9idWlsZC9KYXJGaWxlVmVyaWZpZXJUYXNrLmphdmEiLz4KKyAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9ImNvbS9zZWFndWxsc3cvaW50ZXJuYWxkZXYvYnVpbGQvSXNVcmxPcGVuLmphdmEiLz4KKyAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9ImNvbS9zZWFndWxsc3cvaW50ZXJuYWxkZXYvYnVpbGQvSXNVcmxPcGVuVGFzay5qYXZhIi8+CisgICAgICAgIDwvamF2YWM+CisgICAgPC90YXJnZXQ+CisgICAgPHRhcmdldCBuYW1lPSJkZWNsYXJlLkFudFRhc2tzIiBkZXBlbmRzPSJidWlsZC5BbnRUYXNrcyI+CisgICAgICAgIDx0YXNrZGVmIG5hbWU9InZlcmlmeWphciIgY2xhc3NuYW1lPSJjb20uc2VhZ3VsbHN3LmludGVybmFsZGV2LmJ1aWxkLkphckZpbGVWZXJpZmllclRhc2siIGNsYXNzcGF0aHJlZj0icGF0aC5BbnRUYXNrcyIvPgorICAgICAgICA8dGFza2RlZiBuYW1lPSJpc1VybE9wZW4iIGNsYXNzbmFtZT0iY29tLnNlYWd1bGxzdy5pbnRlcm5hbGRldi5idWlsZC5Jc1VybE9wZW5UYXNrIiBjbGFzc3BhdGhyZWY9InBhdGguQW50VGFza3MiLz4KKyAgICA8L3RhcmdldD4KKyAgICA8dGFyZ2V0IG5hbWU9InByZXBhcmUudGVzdC5leHQiPgorICAgICAgICA8bWtkaXIgZGlyPSIke3Rlc3QubGlifSIvPgorICAgICAgICA8ZGVsZXRlIGRpcj0iJHt0ZXN0LmxpYi5leHR9Ii8+CisgICAgICAgIDxta2RpciBkaXI9IiR7dGVzdC5saWIuZXh0fSIvPgorICAgIDwvdGFyZ2V0PgorICAgIDx0YXJnZXQgbmFtZT0idmVyaWZ5LmFpcy5qYXIiIGRlcGVuZHM9ImRlY2xhcmUuQW50VGFza3MsIHByZXBhcmUudGVzdC5leHQiPgorICAgICAgICA8bWtkaXIgZGlyPSIke3Rlc3QuZmRlZn0iLz4KKyAgICAgICAgPGNvcHkgZmlsZT0iJHtnb1hNTEVuZ2luZS5qYXJ9IiB0b2Rpcj0iJHt0ZXN0LmxpYi5leHR9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIvPgorICAgICAgICA8Y29weSBmaWxlPSIke2dvWE1MUmVzb3VyY2UuemlwfSIgdG9kaXI9IiR7dGVzdC5saWIuZXh0fSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KKyAgICAgICAgPGNvcHkgZmlsZT0iJHtqZG9tLmphcn0iIHRvZGlyPSIke3Rlc3QubGliLmV4dH0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+CisgICAgICAgIDxjb3B5IGZpbGU9IiR7aWJtLm1xLmphcn0iIHRvZGlyPSIke3Rlc3QubGliLmV4dH0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+CisgICAgICAgIDxjb3B5IGZpbGU9IiR7aWJtLm1xLmNvbm5lY3Rvci5qYXJ9IiB0b2Rpcj0iJHt0ZXN0LmxpYi5leHR9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIvPgorICAgICAgICA8Y29weSBmaWxlPSIke2libS5tcS5qdGEuamFyfSIgdG9kaXI9IiR7dGVzdC5saWIuZXh0fSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KKyAgICAgICAgPHZlcmlmeWphciBmaWxlPSIke2Fpcy1jb3JlLmphcn0iIHZlcmJvc2U9ImZhbHNlIiBkZWJ1Zz0iZmFsc2UiPgorICAgICAgICAgICAgPGNsYXNzcGF0aD4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7YWlzLmRpc3QubGlifSIvPgorICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHthaXMuZGlzdC5saWIuZXh0fSIvPgorICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt0ZXN0LmxpYn0iLz4KKyAgICAgICAgICAgIDwvY2xhc3NwYXRoPgorICAgICAgICA8L3ZlcmlmeWphcj4KKyAgICAgICAgPGRlbGV0ZSBkaXI9IiR7dGVzdC5saWIuZXh0fSIvPgorICAgICAgICA8ZGVsZXRlIGRpcj0iJHt0ZXN0LmZkZWZ9Ii8+CisgICAgPC90YXJnZXQ+CisgICAgPHRhcmdldCBuYW1lPSJ2ZXJpZnkuY2xpZW50LmphciIgZGVwZW5kcz0iZGVjbGFyZS5BbnRUYXNrcywgcHJlcGFyZS50ZXN0LmV4dCI+CisgICAgICAgIDxjb3B5IGZpbGU9IiR7aWJtLm1xLmphcn0iIHRvZGlyPSIke3Rlc3QubGliLmV4dH0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+CisgICAgICAgIDxjb3B5IGZpbGU9IiR7am1zLmphcn0iIHRvZGlyPSIke3Rlc3QubGliLmV4dH0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+CisgICAgICAgIDxjb3B5IGZpbGU9IiR7bWFpbC5qYXJ9IiB0b2Rpcj0iJHt0ZXN0LmxpYi5leHR9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIvPgorICAgICAgICA8Y29weSBmaWxlPSIke3NvYXAuamFyfSIgdG9kaXI9IiR7dGVzdC5saWIuZXh0fSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KKyAgICAgICAgPHZlcmlmeWphciBmaWxlPSIke2Fpcy5jbGllbnQuamFyfSIgdmVyYm9zZT0iZmFsc2UiIGRlYnVnPSJmYWxzZSI+CisgICAgICAgICAgICA8Y2xhc3NwYXRoPgorICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHthaXMuY2xpZW50LmRpc3QubGlifSIvPgorICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt0ZXN0LmxpYi5leHR9Ii8+CisgICAgICAgICAgICA8L2NsYXNzcGF0aD4KKyAgICAgICAgPC92ZXJpZnlqYXI+CisgICAgICAgIDxkZWxldGUgZGlyPSIke3Rlc3QubGliLmV4dH0iLz4KKyAgICA8L3RhcmdldD4KKyAgICA8dGFyZ2V0IG5hbWU9InZlcmlmeS41MjUwLmphciIgZGVwZW5kcz0iZGVjbGFyZS5BbnRUYXNrcyI+CisgICAgICAgIDx2ZXJpZnlqYXIgZmlsZT0iJHthaXMtNTI1MC5qYXJ9IiBpZ25vcmVVbnJlc29sdmVkPSJ0cnVlIiB2ZXJib3NlPSJmYWxzZSIgZGVidWc9ImZhbHNlIj4KKyAgICAgICAgICAgIDxjbGFzc3BhdGggbG9jYXRpb249IiR7YWlzLmRpc3QubGlifSIvPgorICAgICAgICA8L3ZlcmlmeWphcj4KKyAgICA8L3RhcmdldD4KKyAgICA8dGFyZ2V0IG5hbWU9InZlcmlmeS4zMjcwLmphciIgZGVwZW5kcz0iZGVjbGFyZS5BbnRUYXNrcyI+CisgICAgICAgIDx2ZXJpZnlqYXIgZmlsZT0iJHthaXMtMzI3MC5qYXJ9IiBpZ25vcmVVbnJlc29sdmVkPSJ0cnVlIiB2ZXJib3NlPSJmYWxzZSIgZGVidWc9ImZhbHNlIj4KKyAgICAgICAgICAgIDxjbGFzc3BhdGggbG9jYXRpb249IiR7YWlzLmRpc3QubGlifSIvPgorICAgICAgICA8L3ZlcmlmeWphcj4KKyAgICA8L3RhcmdldD4KKyAgICA8dGFyZ2V0IG5hbWU9InZlcmlmeS5jb2JvbC5qYXIiIGRlcGVuZHM9ImRlY2xhcmUuQW50VGFza3MiPgorICAgICAgICA8dmVyaWZ5amFyIGZpbGU9IiR7YWlzLWNvYm9sLmphcn0iIHZlcmJvc2U9ImZhbHNlIiBkZWJ1Zz0iZmFsc2UiPgorICAgICAgICAgICAgPGNsYXNzcGF0aCBsb2NhdGlvbj0iJHthaXMuZGlzdC5saWJ9Ii8+CisgICAgICAgIDwvdmVyaWZ5amFyPgorICAgIDwvdGFyZ2V0PgorICAgIDx0YXJnZXQgbmFtZT0idmVyaWZ5LmNpY3MuamFyIiBkZXBlbmRzPSJkZWNsYXJlLkFudFRhc2tzLCBwcmVwYXJlLnRlc3QuZXh0Ij4KKyAgICAgICAgPGNvcHkgZmlsZT0iJHtjdGdjbGllbnQuamFyfSIgdG9kaXI9IiR7dGVzdC5saWIuZXh0fSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KKyAgICAgICAgPHZlcmlmeWphciBmaWxlPSIke2Fpcy1jaWNzLmphcn0iIHZlcmJvc2U9ImZhbHNlIiBkZWJ1Zz0iZmFsc2UiPgorICAgICAgICAgICAgPGNsYXNzcGF0aCBsb2NhdGlvbj0iJHthaXMuZGlzdC5saWJ9Ii8+CisgICAgICAgICAgICA8Y2xhc3NwYXRoIGxvY2F0aW9uPSIke3Rlc3QubGlifSIvPgorICAgICAgICA8L3ZlcmlmeWphcj4KKyAgICAgICAgPGRlbGV0ZSBkaXI9IiR7dGVzdC5saWIuZXh0fSIvPgorICAgIDwvdGFyZ2V0PgorICAgIDx0YXJnZXQgbmFtZT0idmVyaWZ5Lmltcy5qYXIiIGRlcGVuZHM9ImRlY2xhcmUuQW50VGFza3MiPgorICAgICAgICA8dmVyaWZ5amFyIGZpbGU9IiR7YWlzLWltcy5qYXJ9IiB2ZXJib3NlPSJmYWxzZSIgZGVidWc9ImZhbHNlIj4KKyAgICAgICAgICAgIDxjbGFzc3BhdGggbG9jYXRpb249IiR7YWlzLmRpc3QubGlifSIvPgorICAgICAgICA8L3ZlcmlmeWphcj4KKyAgICA8L3RhcmdldD4KKyAgICA8dGFyZ2V0IG5hbWU9InZlcmlmeS5hZG1pbmNsaWVudC5qYXIiIGRlcGVuZHM9ImRlY2xhcmUuQW50VGFza3MiPgorICAgICAgICA8dmVyaWZ5amFyIGZpbGU9IiR7YWlzLWFkbWluY2xpZW50Lmphcn0iIHZlcmJvc2U9ImZhbHNlIiBkZWJ1Zz0iZmFsc2UiPgorICAgICAgICAgICAgPGNsYXNzcGF0aCBsb2NhdGlvbj0iJHtkZXZ0b29scy5kaXN0LmxpYn0iLz4KKyAgICAgICAgPC92ZXJpZnlqYXI+CisgICAgPC90YXJnZXQ+CisgICAgPHRhcmdldCBuYW1lPSJ2ZXJpZnkucHJveHlzZXJ2bGV0LmphciIgZGVwZW5kcz0iZGVjbGFyZS5BbnRUYXNrcyI+CisgICAgICAgIDx2ZXJpZnlqYXIgZmlsZT0iJHtwcm94eXNlcnZsZXQuamFyfSIgdmVyYm9zZT0iZmFsc2UiIGRlYnVnPSJmYWxzZSI+CisgICAgICAgICAgICA8Y2xhc3NwYXRoPgorICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtwcm94eXNlcnZsZXQuZGlzdC5saWJ9Ii8+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3NlcnZsZXQuZGlyfSIvPgorICAgICAgICAgICAgPC9jbGFzc3BhdGg+CisgICAgICAgIDwvdmVyaWZ5amFyPgorICAgIDwvdGFyZ2V0PgorICAgIDx0YXJnZXQgbmFtZT0idmVyaWZ5LmFkbWluY29uc29sZS5qYXIiIGRlcGVuZHM9ImRlY2xhcmUuQW50VGFza3MiPgorICAgICAgICA8dmVyaWZ5amFyIGZpbGU9IiR7YWRtaW5jb25zb2xlLmphcn0iIHZlcmJvc2U9ImZhbHNlIiBkZWJ1Zz0iZmFsc2UiPgorICAgICAgICAgICAgPGNsYXNzcGF0aCBsb2NhdGlvbj0iJHthaXMuZGlzdC5saWJ9Ii8+CisgICAgICAgIDwvdmVyaWZ5amFyPgorICAgIDwvdGFyZ2V0PgorICAgIDx0YXJnZXQgbmFtZT0idmVyaWZ5LmphdmFjb25uZWN0b3JnZW5lcmF0b3IuamFyIiBkZXBlbmRzPSJkZWNsYXJlLkFudFRhc2tzIj4KKyAgICAgICAgPHZlcmlmeWphciBmaWxlPSIke2phdmFjb25uZWN0b3JnZW5lcmF0b3IuamFyfSIgdmVyYm9zZT0iZmFsc2UiIGRlYnVnPSJmYWxzZSI+CisgICAgICAgICAgICA8Y2xhc3NwYXRoIGxvY2F0aW9uPSIke2RldnRvb2xzLmRpc3QubGlifSIvPgorICAgICAgICA8L3ZlcmlmeWphcj4KKyAgICA8L3RhcmdldD4KKyAgICA8dGFyZ2V0IG5hbWU9InZlcmlmeS5zZWN1cml0eXRvb2xraXQuamFyIiBkZXBlbmRzPSJkZWNsYXJlLkFudFRhc2tzIj4KKyAgICAgICAgPHZlcmlmeWphciBmaWxlPSIke3NlY3VyaXR5dG9vbGtpdC5qYXJ9IiB2ZXJib3NlPSJmYWxzZSIgZGVidWc9ImZhbHNlIj4KKyAgICAgICAgICAgIDxjbGFzc3BhdGggbG9jYXRpb249IiR7ZGV2dG9vbHMuZGlzdC5saWJ9Ii8+CisgICAgICAgIDwvdmVyaWZ5amFyPgorICAgIDwvdGFyZ2V0PgorICAgIDx0YXJnZXQgbmFtZT0idmVyaWZ5LnRvb2xzLmphciIgZGVwZW5kcz0iZGVjbGFyZS5BbnRUYXNrcywgcHJlcGFyZS50ZXN0LmV4dCI+CisgICAgICAgIDxjb3B5IGZpbGU9IiR7ajJzZS50b29scy5qYXJ9IiB0b2Rpcj0iJHt0ZXN0LmxpYi5leHR9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIvPgorICAgICAgICA8dmVyaWZ5amFyIGZpbGU9IiR7YWlzLXRvb2xzLmphcn0iIHZlcmJvc2U9ImZhbHNlIiBkZWJ1Zz0iZmFsc2UiPgorICAgICAgICAgICAgPGNsYXNzcGF0aCBsb2NhdGlvbj0iJHtkZXZ0b29scy5kaXN0LmxpYn0iLz4KKyAgICAgICAgICAgIDxjbGFzc3BhdGggbG9jYXRpb249IiR7dGVzdC5saWJ9Ii8+CisgICAgICAgIDwvdmVyaWZ5amFyPgorICAgICAgICA8ZGVsZXRlIGRpcj0iJHt0ZXN0LmxpYi5leHR9Ii8+CisgICAgPC90YXJnZXQ+CisgICAgPHRhcmdldCBuYW1lPSJ2ZXJpZnkuZ3doc2MuamFyIiBkZXBlbmRzPSJkZWNsYXJlLkFudFRhc2tzIj4KKyAgICAgICAgPHZlcmlmeWphciBmaWxlPSIke2hzYy5qYXJ9IiB2ZXJib3NlPSJmYWxzZSIgZGVidWc9ImZhbHNlIi8+CisgICAgPC90YXJnZXQ+CisgICAgPHRhcmdldCBuYW1lPSJ2ZXJpZnkuZ3doc2N1LmphciIgZGVwZW5kcz0iZGVjbGFyZS5BbnRUYXNrcyI+CisgICAgICAgIDx2ZXJpZnlqYXIgZmlsZT0iJHtoc2N1Lmphcn0iIHZlcmJvc2U9ImZhbHNlIiBkZWJ1Zz0iZmFsc2UiLz4KKyAgICA8L3RhcmdldD4KKyAgICA8dGFyZ2V0IG5hbWU9InZlcmlmeS54bWwiIGRlcGVuZHM9ImJhbm5lciI+CisgICAgICAgIDwhLS0gT25seSBjaGVjayBmb3Igd2VsbC1mb3JtZWQgWE1MIGhlcmUuIC0tPgorICAgICAgICA8eG1sdmFsaWRhdGUgbGVuaWVudD0ieWVzIiB3YXJuPSJ5ZXMiPgorICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2J1aWxkLmRpc3R9IiBpbmNsdWRlcz0iKiovKi54bWwiLz4KKyAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtidWlsZC5kaXN0fSIgaW5jbHVkZXM9IioqLyouY2ZnIi8+CisgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7YnVpbGQuZGlzdH0iIGluY2x1ZGVzPSIqKi8qLnNmZCIvPgorICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2J1aWxkLmRpc3R9IiBpbmNsdWRlcz0iKiovKi5zamNkIi8+CisgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7YnVpbGQuZGlzdH0iIGluY2x1ZGVzPSIqKi8qLnNmbWQiLz4KKyAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtidWlsZC5kaXN0fSIgaW5jbHVkZXM9IioqLyoueHNkIi8+CisgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7YnVpbGQuZGlzdH0iIGluY2x1ZGVzPSIqKi8qLnhzbCIvPgorICAgICAgICA8L3htbHZhbGlkYXRlPgorICAgIDwvdGFyZ2V0PgorICAgIDx0YXJnZXQgbmFtZT0idmVyaWZ5IiBkZXNjcmlwdGlvbj0iVmVyaWZpZXMgdGhlIGJ1aWxkIGJ5IHBlcmZvcm1pbmcgYSBsb2FkIHRlc3RzIG9uIGphciBmaWxlcyAoZG9lcyBub3QgdHJpZ2dlciB0aGUgamFyIGRlcGVuZGVuY2llcy4pIiBkZXBlbmRzPSJiYW5uZXIsIHZlcmlmeS5haXMuamFyLCB2ZXJpZnkuY2xpZW50LmphciwgdmVyaWZ5LjUyNTAuamFyLCB2ZXJpZnkuMzI3MC5qYXIsIHZlcmlmeS5jb2JvbC5qYXIsIHZlcmlmeS5jaWNzLmphciwgdmVyaWZ5Lmltcy5qYXIsIHZlcmlmeS5hZG1pbmNsaWVudC5qYXIsIHZlcmlmeS5wcm94eXNlcnZsZXQuamFyLCB2ZXJpZnkuYWRtaW5jb25zb2xlLmphciwgdmVyaWZ5LmphdmFjb25uZWN0b3JnZW5lcmF0b3IuamFyLCB2ZXJpZnkuc2VjdXJpdHl0b29sa2l0LmphciwgdmVyaWZ5LnRvb2xzLmphciwgdmVyaWZ5Lmd3aHNjLmphciwgdmVyaWZ5Lmd3aHNjdS5qYXIsIHZlcmlmeS54bWwiLz4KKyAgICA8IS0tIEVuZCBWRVJJRlkgdGFyZ2V0cyAtLT4KKyAgICA8IS0tIFRFU1QgVEFSR0VUUyAtLT4KKyAgICA8dGFyZ2V0IG5hbWU9Imp1bml0X2NoZWNrIj4KKyAgICAgICAgPGF2YWlsYWJsZSBjbGFzc25hbWU9Imp1bml0LmZyYW1ld29yay5UZXN0IiBwcm9wZXJ0eT0ianVuaXQucHJlc2VudCIvPgorICAgICAgICA8ZmFpbCBtZXNzYWdlPSJKVW5pdCBjYW5ub3QgYmUgZm91bmQuIiB1bmxlc3M9Imp1bml0LnByZXNlbnQiLz4KKyAgICA8L3RhcmdldD4KKyAgICA8cHJvcGVydHkgbmFtZT0idGVzdCIgdmFsdWU9IiR7YnVpbGQuZGlyfS90ZXN0Ii8+CisgICAgPHByb3BlcnR5IG5hbWU9InRlc3QuYmluIiB2YWx1ZT0iJHt0ZXN0fS9iaW4iLz4KKyAgICA8cHJvcGVydHkgbmFtZT0idGVzdC5yZXNvdXJjZXMiIHZhbHVlPSIke3Rlc3QuZGlyfS9yZXNvdXJjZXMiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0idGVzdC5mZGVmIiB2YWx1ZT0iJHt0ZXN0fS8ke2ZkZWYuZGlybmFtZX0iLz4KKyAgICA8cHJvcGVydHkgbmFtZT0idGVzdC5saWIiIHZhbHVlPSIke3Rlc3R9L2xpYiIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0LmxpYi5leHQiIHZhbHVlPSIke3Rlc3QubGlifS9leHQiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVwb3J0cy5kaXIiIHZhbHVlPSIke2J1aWxkLmRpcn0vcmVwb3J0cyIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXBvcnRzLmNoZWNrc3VtIiB2YWx1ZT0iJHtyZXBvcnRzLmRpcn0vY2hlY2tzdW0iLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ianVuaXQucmVwb3J0cy5zcmNkaXIiIGxvY2F0aW9uPSJyZXBvcnRzIi8+CisgICAgPHByb3BlcnR5IG5hbWU9Imp1bml0LnJlcG9ydHMiIGxvY2F0aW9uPSIke3JlcG9ydHMuZGlyfS9qdW5pdCIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJqdW5pdC5mb3JtYXR0ZXIiIHZhbHVlPSJ4bWwiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ianVuaXQuZm9yayIgdmFsdWU9InRydWUiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ianVuaXQucHJpbnRzdW1tYXJ5IiB2YWx1ZT0idHJ1ZSIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJqdW5pdC5pbmNsdWRlYW50cnVudGltZSIgdmFsdWU9ImZhbHNlIi8+CisgICAgPHByb3BlcnR5IG5hbWU9Imp1bml0LmRpciIgdmFsdWU9Ii4uLy4uIi8+CisgICAgPHByb3BlcnR5IG5hbWU9Imp1bml0LnJlcG9ydHMueG1sIiBsb2NhdGlvbj0iJHtqdW5pdC5yZXBvcnRzfS8ke2p1bml0LmZvcm1hdHRlcn0iLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ianVuaXQucmVwb3J0LmV4dCIgdmFsdWU9Ii1qdW5pdC54bWwiLz4KKyAgICA8dGFyZ2V0IG5hbWU9InRlc3QuY29tcGlsZSIgZGVzY3JpcHRpb249IkNvbXBpbGVzIHRoZSB1bml0IHRlc3RzIHdpdGhvdXQgdHJpZ2dlcmluZyBhbnkgZGVwZW5kZW5jaWVzLiI+CisgICAgICAgIDxta2RpciBkaXI9IiR7dGVzdC5iaW59Ii8+CisgICAgICAgIDxqYXZhYyBkZXN0ZGlyPSIke3Rlc3QuYmlufSIgZGVidWc9IiR7Y29tcGlsZS5kZWJ1Z30iIGluY2x1ZGVBbnRSdW50aW1lPSJmYWxzZSI+CisgICAgICAgICAgICA8c3JjIHBhdGg9IiR7c3JjLnRlc3QuZGlyfSIvPgorICAgICAgICAgICAgPHNyYyBwYXRoPSIke3NyYy5kaXJ9L2NvbS9zZWFndWxsc3cvaW50ZXJuYWxkZXYvYXBwaW50ZXJmYWNlL21vZGVsIi8+CisgICAgICAgICAgICA8IS0tIFRlc3RpbmcgZnJhbWV3b3JrIC0tPgorICAgICAgICAgICAgPGNsYXNzcGF0aCBsb2NhdGlvbj0iJHtqdW5pdC5qYXJ9Ii8+CisgICAgICAgICAgICA8Y2xhc3NwYXRoIGxvY2F0aW9uPSIke210anVuaXQuamFyfSIvPgorICAgICAgICAgICAgPGNsYXNzcGF0aCBsb2NhdGlvbj0iJHt4bWxzZWMuamFyfSIvPgorICAgICAgICAgICAgPCEtLSBKYXJzIHRvIHRlc3QsIHdoaWNoIHRoZSB0ZXN0IGNhc2VzIHJlZmVyIHRvLiAtLT4KKyAgICAgICAgICAgIDxjbGFzc3BhdGggbG9jYXRpb249IiR7YWlzLWNvcmUuamFyfSIvPgorICAgICAgICAgICAgPGNsYXNzcGF0aCBsb2NhdGlvbj0iJHtwcm94eXNlcnZsZXQuamFyfSIvPgorICAgICAgICAgICAgPGNsYXNzcGF0aCBsb2NhdGlvbj0iJHthaXMuY2xpZW50Lmphcn0iLz4KKyAgICAgICAgICAgIDxjbGFzc3BhdGggbG9jYXRpb249IiR7amF2YWNvbm5lY3RvcmdlbmVyYXRvci5qYXJ9Ii8+CisgICAgICAgICAgICA8Y2xhc3NwYXRoIGxvY2F0aW9uPSIke3NlY3VyaXR5dG9vbGtpdC5qYXJ9Ii8+CisgICAgICAgICAgICA8Y2xhc3NwYXRoIGxvY2F0aW9uPSIke2Fpcy10b29scy5qYXJ9Ii8+CisgICAgICAgICAgICA8Y2xhc3NwYXRoIGxvY2F0aW9uPSIke2Fpcy01MjUwLmphcn0iLz4KKyAgICAgICAgICAgIDxjbGFzc3BhdGggbG9jYXRpb249IiR7YWlzLTMyNzAuamFyfSIvPgorICAgICAgICAgICAgPGNsYXNzcGF0aCBsb2NhdGlvbj0iJHthaXMtY29ib2wuamFyfSIvPgorICAgICAgICAgICAgPGNsYXNzcGF0aCBsb2NhdGlvbj0iJHthaXMtY2ljcy5qYXJ9Ii8+CisgICAgICAgICAgICA8Y2xhc3NwYXRoIGxvY2F0aW9uPSIke2Fpcy1pbXMuamFyfSIvPgorICAgICAgICAgICAgPGNsYXNzcGF0aCBsb2NhdGlvbj0iJHthaXMtYWRtaW5jbGllbnQuamFyfSIvPgorICAgICAgICAgICAgPGNsYXNzcGF0aCBsb2NhdGlvbj0iJHtoc2MuamFyfSIvPgorICAgICAgICAgICAgPCEtLSBkZXBlbmRlbmNpZXMgLS0+CisgICAgICAgICAgICA8Y2xhc3NwYXRoIGxvY2F0aW9uPSIke2FudC5qYXJ9Ii8+CisgICAgICAgICAgICA8Y2xhc3NwYXRoIGxvY2F0aW9uPSIke2NvbW1vbnMtY2xpLmphcn0iLz4KKyAgICAgICAgICAgIDxjbGFzc3BhdGggbG9jYXRpb249IiR7Y29tbW9ucy1odHRwY2xpZW50Lmphcn0iLz4KKyAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9ImFpcy5jbGFzc3BhdGgiLz4KKyAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9InByb3h5c2VydmxldC5jbGFzc3BhdGgiLz4KKyAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9ImNvYm9sLmNsYXNzcGF0aCIvPgorICAgICAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0iY2ljcy5iYWNrZW5kLmNsYXNzcGF0aCIvPgorICAgICAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0iaW1zLmJhY2tlbmQuY2xhc3NwYXRoIi8+CisgICAgICAgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJ0cmFuc2Zvcm1zLmNsYXNzcGF0aCIvPgorICAgICAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0ianNzZS5jbGFzc3BhdGgiLz4KKyAgICAgICAgPC9qYXZhYz4KKyAgICA8L3RhcmdldD4KKyAgICA8dGFyZ2V0IG5hbWU9InRlc3QubWtkaXIiIGRlcGVuZHM9ImluaXQiPgorICAgICAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmRpcn0iLz4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHt0ZXN0fSIvPgorICAgICAgICA8bWtkaXIgZGlyPSIke3Rlc3QuYmlufSIvPgorICAgIDwvdGFyZ2V0PgorICAgIDx0YXJnZXQgbmFtZT0iZWNoby54YWxhbi52ZXJzaW9uIj4KKyAgICAgICAgPGVjaG8gbGV2ZWw9ImluZm8iIG1lc3NhZ2U9IlRlc3Rpbmcgd2l0aCAke1RyYW5zZm9ybWVyRmFjdG9yeX0iLz4KKyAgICAgICAgPGphdmEgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnhhbGFuLlZlcnNpb24iLz4KKyAgICA8L3RhcmdldD4KKyAgICA8dGFyZ2V0IG5hbWU9InJlcG9ydC5pbml0IiBkZXBlbmRzPSJpbml0LCB0ZXN0LmNvbXBpbGUiPgorICAgICAgICA8bWtkaXIgZGlyPSIke2p1bml0LnJlcG9ydHMueG1sfSIvPgorICAgICAgICA8ZWNobyBsZXZlbD0iaW5mbyIgbWVzc2FnZT0iUmVwb3J0aW5nIHRvICR7anVuaXQucmVwb3J0cy54bWx9Ii8+CisgICAgPC90YXJnZXQ+CisgICAgPHBhdGggaWQ9Imp1bml0LmNsYXNzcGF0aCI+CisgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHthbnQuaG9tZX0vbGliL2FudC5qYXIiLz4KKyAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2FudC5ob21lfS9saWIvb3B0aW9uYWwuamFyIi8+CisgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHthbnQuaG9tZX0vbGliL2p1bml0LmphciIvPgorICAgIDwvcGF0aD4KKyAgICA8IS0tIFVuaXQgVGVzdHM6IGZyb20gbG93LWxldmVsIHRvIGhpZ2gtbGV2ZWwgLS0+CisgICAgPCEtLSBVbml0IFRlc3RzOiBqYXZheC5sYW5nIC0tPgorICAgIDx0YXJnZXQgbmFtZT0ianVuaXQuamF2YXgubGFuZyIgZGVwZW5kcz0icmVwb3J0LmluaXQiPgorICAgICAgICA8bWtkaXIgZGlyPSIke2p1bml0LnJlcG9ydHMueG1sfSIvPgorICAgICAgICA8anVuaXQgcHJpbnRzdW1tYXJ5PSIke2p1bml0LnByaW50c3VtbWFyeX0iIGZvcms9IiR7anVuaXQuZm9ya30iIGRpcj0iJHtqdW5pdC5kaXJ9IiBpbmNsdWRlYW50cnVudGltZT0iJHtqdW5pdC5pbmNsdWRlYW50cnVudGltZX0iPgorICAgICAgICAgICAgPGZvcm1hdHRlciB0eXBlPSIke2p1bml0LmZvcm1hdHRlcn0iIGV4dGVuc2lvbj0iJHtqdW5pdC5yZXBvcnQuZXh0fSIvPgorICAgICAgICAgICAgPGNsYXNzcGF0aD4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7YWlzLWNvcmUuamFyfSIvPgorICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHthaXMtdG9vbHMuamFyfSIvPgorICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtqMnNlLnRvb2xzLmphcn0iLz4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y29tbW9ucy1sYW5nLmphcn0iLz4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7dGVzdC5iaW59Ii8+CisgICAgICAgICAgICAgICAgPHBhdGggcmVmaWQ9Imp1bml0LmNsYXNzcGF0aCIvPgorICAgICAgICAgICAgPC9jbGFzc3BhdGg+CisgICAgICAgICAgICA8dGVzdCBuYW1lPSJjb20uc2VhZ3VsbHN3LnVuaXR0ZXN0LmphdmF4LmxhbmcuQWxsVGVzdHMiIHRvZGlyPSIke2p1bml0LnJlcG9ydHMueG1sfSIvPgorICAgICAgICA8L2p1bml0PgorICAgIDwvdGFyZ2V0PgorICAgIDwhLS0gVW5pdCBUZXN0czogamF2YXguaW8gLS0+CisgICAgPHRhcmdldCBuYW1lPSJqdW5pdC5qYXZheC5pbyIgZGVwZW5kcz0icmVwb3J0LmluaXQiPgorICAgICAgICA8bWtkaXIgZGlyPSIke2p1bml0LnJlcG9ydHMueG1sfSIvPgorICAgICAgICA8anVuaXQgcHJpbnRzdW1tYXJ5PSIke2p1bml0LnByaW50c3VtbWFyeX0iIGZvcms9IiR7anVuaXQuZm9ya30iIGRpcj0iJHtqdW5pdC5kaXJ9IiBpbmNsdWRlYW50cnVudGltZT0iJHtqdW5pdC5pbmNsdWRlYW50cnVudGltZX0iPgorICAgICAgICAgICAgPGZvcm1hdHRlciB0eXBlPSIke2p1bml0LmZvcm1hdHRlcn0iIGV4dGVuc2lvbj0iJHtqdW5pdC5yZXBvcnQuZXh0fSIvPgorICAgICAgICAgICAgPGNsYXNzcGF0aD4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7YWlzLWNvcmUuamFyfSIvPgorICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjb21tb25zLWxhbmcuamFyfSIvPgorICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt0ZXN0LmJpbn0iLz4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7dGVzdC5yZXNvdXJjZXN9Ii8+CisgICAgICAgICAgICAgICAgPHBhdGggcmVmaWQ9Imp1bml0LmNsYXNzcGF0aCIvPgorICAgICAgICAgICAgPC9jbGFzc3BhdGg+CisgICAgICAgICAgICA8dGVzdCBuYW1lPSJjb20uc2VhZ3VsbHN3LmphdmF4LmlvLkFsbFRlc3RzIiB0b2Rpcj0iJHtqdW5pdC5yZXBvcnRzLnhtbH0iLz4KKyAgICAgICAgICAgIDx0ZXN0IG5hbWU9ImNvbS5zZWFndWxsc3cudW5pdHRlc3QuamF2YXguaW8uQWxsVGVzdHMiIHRvZGlyPSIke2p1bml0LnJlcG9ydHMueG1sfSIvPgorICAgICAgICA8L2p1bml0PgorICAgIDwvdGFyZ2V0PgorICAgIDwhLS0gVW5pdCBUZXN0czogamF2YXgudXRpbCAtLT4KKyAgICA8dGFyZ2V0IG5hbWU9Imp1bml0LmphdmF4LnV0aWwiIGRlcGVuZHM9InJlcG9ydC5pbml0Ij4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtqdW5pdC5yZXBvcnRzLnhtbH0iLz4KKyAgICAgICAgPGp1bml0IHByaW50c3VtbWFyeT0iJHtqdW5pdC5wcmludHN1bW1hcnl9IiBmb3JrPSIke2p1bml0LmZvcmt9IiBkaXI9IiR7anVuaXQuZGlyfSIgaW5jbHVkZWFudHJ1bnRpbWU9IiR7anVuaXQuaW5jbHVkZWFudHJ1bnRpbWV9Ij4KKyAgICAgICAgICAgIDxmb3JtYXR0ZXIgdHlwZT0iJHtqdW5pdC5mb3JtYXR0ZXJ9IiBleHRlbnNpb249IiR7anVuaXQucmVwb3J0LmV4dH0iLz4KKyAgICAgICAgICAgIDxjbGFzc3BhdGg+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2Fpcy1jb3JlLmphcn0iLz4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7dGVzdC5iaW59Ii8+CisgICAgICAgICAgICAgICAgPHBhdGggcmVmaWQ9Imp1bml0LmNsYXNzcGF0aCIvPgorICAgICAgICAgICAgPC9jbGFzc3BhdGg+CisgICAgICAgICAgICA8dGVzdCBuYW1lPSJjb20uc2VhZ3VsbHN3LnVuaXR0ZXN0LmphdmF4LnV0aWwuQWxsVGVzdHMiIHRvZGlyPSIke2p1bml0LnJlcG9ydHMueG1sfSIvPgorICAgICAgICA8L2p1bml0PgorICAgIDwvdGFyZ2V0PgorICAgIDwhLS0gVW5pdCBUZXN0czogVG9vbGJveCBYTUwgIC0tPgorICAgIDx0YXJnZXQgbmFtZT0ianVuaXQudG9vbGJveC54bWwiIGRlcGVuZHM9InJlcG9ydC5pbml0Ij4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtqdW5pdC5yZXBvcnRzLnhtbH0iLz4KKyAgICAgICAgPGp1bml0IHByaW50c3VtbWFyeT0iJHtqdW5pdC5wcmludHN1bW1hcnl9IiBmb3JrPSIke2p1bml0LmZvcmt9IiBkaXI9IiR7anVuaXQuZGlyfSIgaW5jbHVkZWFudHJ1bnRpbWU9IiR7anVuaXQuaW5jbHVkZWFudHJ1bnRpbWV9Ij4KKyAgICAgICAgICAgIDxmb3JtYXR0ZXIgdHlwZT0iJHtqdW5pdC5mb3JtYXR0ZXJ9IiBleHRlbnNpb249IiR7anVuaXQucmVwb3J0LmV4dH0iLz4KKyAgICAgICAgICAgIDxjbGFzc3BhdGg+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7c3VuLmJvb3QuY2xhc3MucGF0aH0iLz4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7YWlzLWNvcmUuamFyfSIvPgorICAgICAgICAgICAgICAgIDxwYXRoIHJlZmlkPSJ4bWwuY2xhc3NwYXRoLnJ0Ii8+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NvbW1vbnMtbGFuZy5qYXJ9Ii8+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3htbHNlYy5qYXJ9Ii8+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2pjZS5qYXJ9Ii8+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2xvZzRqLmphcn0iLz4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7dGVzdC5iaW59Ii8+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3Rlc3QucmVzb3VyY2VzfSIvPgorICAgICAgICAgICAgICAgIDxwYXRoIHJlZmlkPSJqdW5pdC5jbGFzc3BhdGgiLz4KKyAgICAgICAgICAgIDwvY2xhc3NwYXRoPgorICAgICAgICAgICAgPHRlc3QgbmFtZT0iY29tLnNlYWd1bGxzdy51bml0dGVzdC50b29sYm94LnhtbC5TdHJpbmdQcm94eVRlc3RTdWl0ZSIgdG9kaXI9IiR7anVuaXQucmVwb3J0cy54bWx9Ii8+CisgICAgICAgICAgICA8dGVzdCBuYW1lPSJjb20uc2VhZ3VsbHN3LnVuaXR0ZXN0LnRvb2xib3gueG1sLkRvY3VtZW50UHJveHlUZXN0U3VpdGUiIHRvZGlyPSIke2p1bml0LnJlcG9ydHMueG1sfSIvPgorICAgICAgICAgICAgPHRlc3QgbmFtZT0iY29tLnNlYWd1bGxzdy51bml0dGVzdC50b29sYm94LnhtbC5SZWFkRG9jdW1lbnRXaXRoRW5jb2RpbmdUZXN0U3VpdGUiIHRvZGlyPSIke2p1bml0LnJlcG9ydHMueG1sfSIvPgorICAgICAgICA8L2p1bml0PgorICAgIDwvdGFyZ2V0PgorICAgIDwhLS0gVW5pdCBUZXN0czogVG9vbGJveCBjb25maWcgIC0tPgorICAgIDx0YXJnZXQgbmFtZT0ianVuaXQudG9vbGJveC5jb25maWciIGRlcGVuZHM9InJlcG9ydC5pbml0Ij4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtqdW5pdC5yZXBvcnRzLnhtbH0iLz4KKyAgICAgICAgPGp1bml0IHByaW50c3VtbWFyeT0iJHtqdW5pdC5wcmludHN1bW1hcnl9IiBmb3JrPSIke2p1bml0LmZvcmt9IiBkaXI9IiR7anVuaXQuZGlyfSIgaW5jbHVkZWFudHJ1bnRpbWU9IiR7anVuaXQuaW5jbHVkZWFudHJ1bnRpbWV9Ij4KKyAgICAgICAgICAgIDxmb3JtYXR0ZXIgdHlwZT0iJHtqdW5pdC5mb3JtYXR0ZXJ9IiBleHRlbnNpb249IiR7anVuaXQucmVwb3J0LmV4dH0iLz4KKyAgICAgICAgICAgIDxjbGFzc3BhdGg+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3Rlc3QuYmlufSIvPgorICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt0ZXN0LnJlc291cmNlc30iLz4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHtzdW4uYm9vdC5jbGFzcy5wYXRofSIvPgorICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHthaXMtY29yZS5qYXJ9Ii8+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NvbW1vbnMtbGFuZy5qYXJ9Ii8+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NvbW1vbnMtY2xpLmphcn0iLz4KKyAgICAgICAgICAgICAgICA8cGF0aCByZWZpZD0ianVuaXQuY2xhc3NwYXRoIi8+CisgICAgICAgICAgICA8L2NsYXNzcGF0aD4KKyAgICAgICAgICAgIDx0ZXN0IG5hbWU9ImNvbS5zZWFndWxsc3cudG9vbGJveC5jb25maWcuQ29uZmlndXJhdGlvbkRpcmVjdG9yeVRlc3RDYXNlIiB0b2Rpcj0iJHtqdW5pdC5yZXBvcnRzLnhtbH0iLz4KKyAgICAgICAgICAgIDx0ZXN0IG5hbWU9ImNvbS5zZWFndWxsc3cudG9vbGJveC5jb25maWcuQ29uZmlnVmFsaWRhdG9yVGVzdCIgdG9kaXI9IiR7anVuaXQucmVwb3J0cy54bWx9Ii8+CisgICAgICAgIDwvanVuaXQ+CisgICAgPC90YXJnZXQ+CisgICAgPCEtLSBVbml0IFRlc3RzOiBUb29sYm94IGxvZ2dpbmcgIC0tPgorICAgIDx0YXJnZXQgbmFtZT0ianVuaXQudG9vbGJveC5sb2ciIGRlcGVuZHM9InJlcG9ydC5pbml0Ij4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtqdW5pdC5yZXBvcnRzLnhtbH0iLz4KKyAgICAgICAgPGp1bml0IHByaW50c3VtbWFyeT0iJHtqdW5pdC5wcmludHN1bW1hcnl9IiBmb3JrPSIke2p1bml0LmZvcmt9IiBkaXI9IiR7anVuaXQuZGlyfSIgaW5jbHVkZWFudHJ1bnRpbWU9IiR7anVuaXQuaW5jbHVkZWFudHJ1bnRpbWV9Ij4KKyAgICAgICAgICAgIDxmb3JtYXR0ZXIgdHlwZT0iJHtqdW5pdC5mb3JtYXR0ZXJ9IiBleHRlbnNpb249IiR7anVuaXQucmVwb3J0LmV4dH0iLz4KKyAgICAgICAgICAgIDxjbGFzc3BhdGg+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3Rlc3QuYmlufSIvPgorICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHthaXMtY29yZS5qYXJ9Ii8+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NvbW1vbnMtbGFuZy5qYXJ9Ii8+CisgICAgICAgICAgICAgICAgPHBhdGggcmVmaWQ9Imp1bml0LmNsYXNzcGF0aCIvPgorICAgICAgICAgICAgPC9jbGFzc3BhdGg+CisgICAgICAgICAgICA8dGVzdCBuYW1lPSJjb20uc2VhZ3VsbHN3LnRvb2xib3gubG9nLkxvZ1VuaXRUZXN0cyIgdG9kaXI9IiR7anVuaXQucmVwb3J0cy54bWx9Ii8+CisgICAgICAgIDwvanVuaXQ+CisgICAgPC90YXJnZXQ+CisgICAgPCEtLSBVbml0IFRlc3RzOiBjb25maWcvbG9nIC0tPgorICAgIDx0YXJnZXQgbmFtZT0ianVuaXQuc2VydmVyLmNvbmZpZy5sb2ciIGRlcGVuZHM9InJlcG9ydC5pbml0Ij4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtqdW5pdC5yZXBvcnRzLnhtbH0iLz4KKyAgICAgICAgPGp1bml0IHByaW50c3VtbWFyeT0iJHtqdW5pdC5wcmludHN1bW1hcnl9IiBmb3JrPSIke2p1bml0LmZvcmt9IiBkaXI9IiR7anVuaXQuZGlyfSIgaW5jbHVkZWFudHJ1bnRpbWU9IiR7anVuaXQuaW5jbHVkZWFudHJ1bnRpbWV9Ij4KKyAgICAgICAgICAgIDxmb3JtYXR0ZXIgdHlwZT0iJHtqdW5pdC5mb3JtYXR0ZXJ9IiBleHRlbnNpb249IiR7anVuaXQucmVwb3J0LmV4dH0iLz4KKyAgICAgICAgICAgIDxjbGFzc3BhdGg+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2Fpcy1jb3JlLmphcn0iLz4KKyAgICAgICAgICAgICAgICA8cGF0aCByZWZpZD0iYWlzLmNsYXNzcGF0aCIvPgorICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt0ZXN0LmJpbn0iLz4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7dGVzdC5yZXNvdXJjZXN9Ii8+CisgICAgICAgICAgICAgICAgPHBhdGggcmVmaWQ9Imp1bml0LmNsYXNzcGF0aCIvPgorICAgICAgICAgICAgPC9jbGFzc3BhdGg+CisgICAgICAgICAgICA8dGVzdCBuYW1lPSJjb20uc2VhZ3VsbHN3LmFwcGludGVyZmFjZS5zZXJ2ZXIuY29uZmlnLmJpbmQubG9nLkFsbFRlc3RzIiB0b2Rpcj0iJHtqdW5pdC5yZXBvcnRzLnhtbH0iLz4KKyAgICAgICAgPC9qdW5pdD4KKyAgICA8L3RhcmdldD4KKyAgICA8IS0tIFVuaXQgVGVzdHM6IGNvbmZpZy9iaW5kL3RocmVhZHBvb2wgLS0+CisgICAgPHRhcmdldCBuYW1lPSJqdW5pdC5zZXJ2ZXIuY29uZmlnLnRocmVhZHBvb2wiIGRlcGVuZHM9InJlcG9ydC5pbml0Ij4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtqdW5pdC5yZXBvcnRzLnhtbH0iLz4KKyAgICAgICAgPGp1bml0IHByaW50c3VtbWFyeT0iJHtqdW5pdC5wcmludHN1bW1hcnl9IiBmb3JrPSIke2p1bml0LmZvcmt9IiBkaXI9IiR7anVuaXQuZGlyfSIgaW5jbHVkZWFudHJ1bnRpbWU9IiR7anVuaXQuaW5jbHVkZWFudHJ1bnRpbWV9Ij4KKyAgICAgICAgICAgIDxmb3JtYXR0ZXIgdHlwZT0iJHtqdW5pdC5mb3JtYXR0ZXJ9IiBleHRlbnNpb249IiR7anVuaXQucmVwb3J0LmV4dH0iLz4KKyAgICAgICAgICAgIDxjbGFzc3BhdGg+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2Fpcy1jb3JlLmphcn0iLz4KKyAgICAgICAgICAgICAgICA8cGF0aCByZWZpZD0iYWlzLmNsYXNzcGF0aCIvPgorICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt0ZXN0LmJpbn0iLz4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7dGVzdC5yZXNvdXJjZXN9Ii8+CisgICAgICAgICAgICAgICAgPHBhdGggcmVmaWQ9Imp1bml0LmNsYXNzcGF0aCIvPgorICAgICAgICAgICAgPC9jbGFzc3BhdGg+CisgICAgICAgICAgICA8dGVzdCBuYW1lPSJjb20uc2VhZ3VsbHN3LmFwcGludGVyZmFjZS5zZXJ2ZXIuY29uZmlnLmJpbmQudGhyZWFkcG9vbC5BbGxUZXN0cyIgdG9kaXI9IiR7anVuaXQucmVwb3J0cy54bWx9Ii8+CisgICAgICAgIDwvanVuaXQ+CisgICAgPC90YXJnZXQ+CisgICAgPCEtLSBVbml0IFRlc3RzOiBjb25maWcvYmluZC90cmFuc2Zvcm0gLS0+CisgICAgPHRhcmdldCBuYW1lPSJqdW5pdC5zZXJ2ZXIuY29uZmlnLnRyYW5zZm9ybSIgZGVwZW5kcz0icmVwb3J0LmluaXQiPgorICAgICAgICA8bWtkaXIgZGlyPSIke2p1bml0LnJlcG9ydHMueG1sfSIvPgorICAgICAgICA8anVuaXQgcHJpbnRzdW1tYXJ5PSIke2p1bml0LnByaW50c3VtbWFyeX0iIGZvcms9IiR7anVuaXQuZm9ya30iIGRpcj0iJHtqdW5pdC5kaXJ9IiBpbmNsdWRlYW50cnVudGltZT0iJHtqdW5pdC5pbmNsdWRlYW50cnVudGltZX0iPgorICAgICAgICAgICAgPGZvcm1hdHRlciB0eXBlPSIke2p1bml0LmZvcm1hdHRlcn0iIGV4dGVuc2lvbj0iJHtqdW5pdC5yZXBvcnQuZXh0fSIvPgorICAgICAgICAgICAgPGNsYXNzcGF0aD4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7YWlzLWNvcmUuamFyfSIvPgorICAgICAgICAgICAgICAgIDxwYXRoIHJlZmlkPSJhaXMuY2xhc3NwYXRoIi8+CisgICAgICAgICAgICAgICAgPHBhdGggcmVmaWQ9InRyYW5zZm9ybXMuY2xhc3NwYXRoIi8+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3Rlc3QuYmlufSIvPgorICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt0ZXN0LnJlc291cmNlc30iLz4KKyAgICAgICAgICAgICAgICA8cGF0aCByZWZpZD0ianVuaXQuY2xhc3NwYXRoIi8+CisgICAgICAgICAgICA8L2NsYXNzcGF0aD4KKyAgICAgICAgICAgIDx0ZXN0IG5hbWU9ImNvbS5zZWFndWxsc3cuYXBwaW50ZXJmYWNlLnNlcnZlci5jb25maWcuYmluZC50cmFuc2Zvcm0uQWxsVGVzdHMiIHRvZGlyPSIke2p1bml0LnJlcG9ydHMueG1sfSIvPgorICAgICAgICA8L2p1bml0PgorICAgIDwvdGFyZ2V0PgorICAgIDwhLS0gVW5pdCBUZXN0czogY29uZmlnL2JpbmQvY29yZSAtLT4KKyAgICA8dGFyZ2V0IG5hbWU9Imp1bml0LnNlcnZlci5jb25maWcuY29yZSIgZGVwZW5kcz0icmVwb3J0LmluaXQiPgorICAgICAgICA8bWtkaXIgZGlyPSIke2p1bml0LnJlcG9ydHMueG1sfSIvPgorICAgICAgICA8anVuaXQgcHJpbnRzdW1tYXJ5PSIke2p1bml0LnByaW50c3VtbWFyeX0iIGZvcms9IiR7anVuaXQuZm9ya30iIGRpcj0iJHtqdW5pdC5kaXJ9IiBpbmNsdWRlYW50cnVudGltZT0iJHtqdW5pdC5pbmNsdWRlYW50cnVudGltZX0iPgorICAgICAgICAgICAgPGZvcm1hdHRlciB0eXBlPSIke2p1bml0LmZvcm1hdHRlcn0iIGV4dGVuc2lvbj0iJHtqdW5pdC5yZXBvcnQuZXh0fSIvPgorICAgICAgICAgICAgPGNsYXNzcGF0aD4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7YWlzLWNvcmUuamFyfSIvPgorICAgICAgICAgICAgICAgIDxwYXRoIHJlZmlkPSJhaXMuY2xhc3NwYXRoIi8+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3Rlc3QuYmlufSIvPgorICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt0ZXN0LnJlc291cmNlc30iLz4KKyAgICAgICAgICAgICAgICA8cGF0aCByZWZpZD0ianVuaXQuY2xhc3NwYXRoIi8+CisgICAgICAgICAgICA8L2NsYXNzcGF0aD4KKyAgICAgICAgICAgIDx0ZXN0IG5hbWU9ImNvbS5zZWFndWxsc3cuYXBwaW50ZXJmYWNlLnNlcnZlci5jb25maWcuYmluZC5jb3JlLkFsbFRlc3RzIiB0b2Rpcj0iJHtqdW5pdC5yZXBvcnRzLnhtbH0iLz4KKyAgICAgICAgPC9qdW5pdD4KKyAgICA8L3RhcmdldD4KKyAgICA8IS0tIFVuaXQgVGVzdHM6IGNvbmZpZy9iaW5kL21hbmFnZW1lbnQgLS0+CisgICAgPHRhcmdldCBuYW1lPSJqdW5pdC5zZXJ2ZXIuY29uZmlnLm1hbmFnZW1lbnQiIGRlcGVuZHM9InJlcG9ydC5pbml0Ij4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtqdW5pdC5yZXBvcnRzLnhtbH0iLz4KKyAgICAgICAgPGp1bml0IHByaW50c3VtbWFyeT0iJHtqdW5pdC5wcmludHN1bW1hcnl9IiBmb3JrPSIke2p1bml0LmZvcmt9IiBkaXI9IiR7anVuaXQuZGlyfSIgaW5jbHVkZWFudHJ1bnRpbWU9IiR7anVuaXQuaW5jbHVkZWFudHJ1bnRpbWV9Ij4KKyAgICAgICAgICAgIDxmb3JtYXR0ZXIgdHlwZT0iJHtqdW5pdC5mb3JtYXR0ZXJ9IiBleHRlbnNpb249IiR7anVuaXQucmVwb3J0LmV4dH0iLz4KKyAgICAgICAgICAgIDxjbGFzc3BhdGg+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2Fpcy1jb3JlLmphcn0iLz4KKyAgICAgICAgICAgICAgICA8cGF0aCByZWZpZD0iYWlzLmNsYXNzcGF0aCIvPgorICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt0ZXN0LmJpbn0iLz4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7dGVzdC5yZXNvdXJjZXN9Ii8+CisgICAgICAgICAgICAgICAgPHBhdGggcmVmaWQ9Imp1bml0LmNsYXNzcGF0aCIvPgorICAgICAgICAgICAgPC9jbGFzc3BhdGg+CisgICAgICAgICAgICA8dGVzdCBuYW1lPSJjb20uc2VhZ3VsbHN3LmFwcGludGVyZmFjZS5zZXJ2ZXIuY29uZmlnLmJpbmQubWFuYWdlbWVudC5KYXhiVW5tYXJzaGFsVGVzdENhc2UiIHRvZGlyPSIke2p1bml0LnJlcG9ydHMueG1sfSIvPgorICAgICAgICAgICAgPHRlc3QgbmFtZT0iY29tLnNlYWd1bGxzdy5hcHBpbnRlcmZhY2Uuc2VydmVyLmNvbmZpZy5iaW5kLm1hbmFnZW1lbnQuQ29uZmlndXJhdGlvbkRpcmVjdG9yeVVubWFyc2hhbFRlc3RDYXNlIiB0b2Rpcj0iJHtqdW5pdC5yZXBvcnRzLnhtbH0iLz4KKyAgICAgICAgPC9qdW5pdD4KKyAgICA8L3RhcmdldD4KKyAgICA8IS0tIFVuaXQgVGVzdHM6IENoYW1lbGVvbiAtLT4KKyAgICA8dGFyZ2V0IG5hbWU9Imp1bml0LmFpcy1jb3JlLnRyYW5zZm9ybXMiIGRlcGVuZHM9InJlcG9ydC5pbml0Ij4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtqdW5pdC5yZXBvcnRzLnhtbH0iLz4KKyAgICAgICAgPGp1bml0IHByaW50c3VtbWFyeT0iJHtqdW5pdC5wcmludHN1bW1hcnl9IiBmb3JrPSIke2p1bml0LmZvcmt9IiBkaXI9IiR7anVuaXQuZGlyfSIgaW5jbHVkZWFudHJ1bnRpbWU9IiR7anVuaXQuaW5jbHVkZWFudHJ1bnRpbWV9Ij4KKyAgICAgICAgICAgIDxmb3JtYXR0ZXIgdHlwZT0iJHtqdW5pdC5mb3JtYXR0ZXJ9IiBleHRlbnNpb249IiR7anVuaXQucmVwb3J0LmV4dH0iLz4KKyAgICAgICAgICAgIDxjbGFzc3BhdGg+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7c3VuLmJvb3QuY2xhc3MucGF0aH0iLz4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7YWlzLWNvcmUuamFyfSIvPgorICAgICAgICAgICAgICAgIDxwYXRoIHJlZmlkPSJ0cmFuc2Zvcm1zLmNsYXNzcGF0aCIvPgorICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt4bWxzZWMuamFyfSIvPgorICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtqY2UuamFyfSIvPgorICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtsb2c0ai5qYXJ9Ii8+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2dvWE1MUmVzb3VyY2UuemlwfSIvPgorICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtnb1hNTGNvbmZpZy5kaXJ9Ii8+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2pkb20uamFyfSIvPgorICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt0ZXN0LmJpbn0iLz4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7dGVzdC5yZXNvdXJjZXN9Ii8+CisgICAgICAgICAgICAgICAgPHBhdGggcmVmaWQ9Imp1bml0LmNsYXNzcGF0aCIvPgorICAgICAgICAgICAgPC9jbGFzc3BhdGg+CisgICAgICAgICAgICA8dGVzdCBuYW1lPSJjb20uc2VhZ3VsbHN3LnVuaXR0ZXN0LmFwcGludGVyZmFjZS50cmFuc2Zvcm1zLkFwYWNoZVhQYXRoTmFtZXNwYWNlVGVzdFN1aXRlIiB0b2Rpcj0iJHtqdW5pdC5yZXBvcnRzLnhtbH0iLz4KKyAgICAgICAgICAgIDx0ZXN0IG5hbWU9ImNvbS5zZWFndWxsc3cudW5pdHRlc3QuYXBwaW50ZXJmYWNlLnRyYW5zZm9ybXMuU2ltcGxlQXdrVGVzdFN1aXRlIiB0b2Rpcj0iJHtqdW5pdC5yZXBvcnRzLnhtbH0iLz4KKyAgICAgICAgICAgIDx0ZXN0IG5hbWU9ImNvbS5zZWFndWxsc3cudW5pdHRlc3QuYXBwaW50ZXJmYWNlLnRyYW5zZm9ybXMuVHJhbnNmb3JtYXRpb25NYW5hZ2VyQmluZGluZ1Rlc3RTdWl0ZSIgdG9kaXI9IiR7anVuaXQucmVwb3J0cy54bWx9Ii8+CisgICAgICAgICAgICA8dGVzdCBuYW1lPSJjb20uc2VhZ3VsbHN3LnVuaXR0ZXN0LmFwcGludGVyZmFjZS50cmFuc2Zvcm1zLlRyYW5zZm9ybWF0aW9uTWFuYWdlclRlc3RTdWl0ZSIgdG9kaXI9IiR7anVuaXQucmVwb3J0cy54bWx9Ii8+CisgICAgICAgICAgICA8dGVzdCBuYW1lPSJjb20uc2VhZ3VsbHN3LnVuaXR0ZXN0LmFwcGludGVyZmFjZS50cmFuc2Zvcm1zLkdvWE1MVHJhbnNmb3JtYXRpb25NYW5hZ2VyVGVzdFN1aXRlIiB0b2Rpcj0iJHtqdW5pdC5yZXBvcnRzLnhtbH0iLz4KKyAgICAgICAgPC9qdW5pdD4KKyAgICA8L3RhcmdldD4KKyAgICA8IS0tIFVuaXQgVGVzdHM6IGNvbS5zZWFndWxsc3cuYXBwaW50ZXJmYWNlLnNlcnZlci5zZWN1cml0eS5hdXRoICAtLT4KKyAgICA8dGFyZ2V0IG5hbWU9Imp1bml0LnNlY3VyaXR5LmF1dGgiIGRlcGVuZHM9InJlcG9ydC5pbml0Ij4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtqdW5pdC5yZXBvcnRzLnhtbH0iLz4KKyAgICAgICAgPGp1bml0IHByaW50c3VtbWFyeT0iJHtqdW5pdC5wcmludHN1bW1hcnl9IiBmb3JrPSIke2p1bml0LmZvcmt9IiBkaXI9IiR7anVuaXQuZGlyfSIgaW5jbHVkZWFudHJ1bnRpbWU9IiR7anVuaXQuaW5jbHVkZWFudHJ1bnRpbWV9Ij4KKyAgICAgICAgICAgIDxmb3JtYXR0ZXIgdHlwZT0iJHtqdW5pdC5mb3JtYXR0ZXJ9IiBleHRlbnNpb249IiR7anVuaXQucmVwb3J0LmV4dH0iLz4KKyAgICAgICAgICAgIDxjbGFzc3BhdGg+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2Fpcy1jb3JlLmphcn0iLz4KKyAgICAgICAgICAgICAgICA8cGF0aCByZWZpZD0iYWlzLmNsYXNzcGF0aCIvPgorICAgICAgICAgICAgICAgIDxwYXRoIHJlZmlkPSJqY2UuY2xhc3NwYXRoLnJ0Ii8+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3Rlc3QuYmlufSIvPgorICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt0ZXN0LnJlc291cmNlc30iLz4KKyAgICAgICAgICAgICAgICA8cGF0aCByZWZpZD0ianVuaXQuY2xhc3NwYXRoIi8+CisgICAgICAgICAgICA8L2NsYXNzcGF0aD4KKyAgICAgICAgICAgIDx0ZXN0IG5hbWU9ImNvbS5zZWFndWxsc3cuYXBwaW50ZXJmYWNlLnNlcnZlci5zZWN1cml0eS5hdXRoLkFsbFRlc3RzIiB0b2Rpcj0iJHtqdW5pdC5yZXBvcnRzLnhtbH0iLz4KKyAgICAgICAgPC9qdW5pdD4KKyAgICA8L3RhcmdldD4KKyAgICA8IS0tIFVuaXQgVGVzdHM6IGNvbS5zZWFndWxsc3cuYXBwaW50ZXJmYWNlLnNlcnZlci5jcnlwdG8gIC0tPgorICAgIDx0YXJnZXQgbmFtZT0ianVuaXQuY3J5cHRvIiBkZXBlbmRzPSJyZXBvcnQuaW5pdCI+CisgICAgICAgIDxta2RpciBkaXI9IiR7anVuaXQucmVwb3J0cy54bWx9Ii8+CisgICAgICAgIDxqdW5pdCBwcmludHN1bW1hcnk9IiR7anVuaXQucHJpbnRzdW1tYXJ5fSIgZm9yaz0iJHtqdW5pdC5mb3JrfSIgZGlyPSIke2p1bml0LmRpcn0iIGluY2x1ZGVhbnRydW50aW1lPSIke2p1bml0LmluY2x1ZGVhbnRydW50aW1lfSI+CisgICAgICAgICAgICA8Zm9ybWF0dGVyIHR5cGU9IiR7anVuaXQuZm9ybWF0dGVyfSIgZXh0ZW5zaW9uPSIke2p1bml0LnJlcG9ydC5leHR9Ii8+CisgICAgICAgICAgICA8Y2xhc3NwYXRoPgorICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHthaXMtY29yZS5qYXJ9Ii8+CisgICAgICAgICAgICAgICAgPHBhdGggcmVmaWQ9ImFpcy5jbGFzc3BhdGgiLz4KKyAgICAgICAgICAgICAgICA8cGF0aCByZWZpZD0iamNlLmNsYXNzcGF0aC5ydCIvPgorICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt0ZXN0LmJpbn0iLz4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7dGVzdC5yZXNvdXJjZXN9Ii8+CisgICAgICAgICAgICAgICAgPHBhdGggcmVmaWQ9Imp1bml0LmNsYXNzcGF0aCIvPgorICAgICAgICAgICAgPC9jbGFzc3BhdGg+CisgICAgICAgICAgICA8dGVzdCBuYW1lPSJjb20uc2VhZ3VsbHN3LmFwcGludGVyZmFjZS5zZXJ2ZXIuY3J5cHRvLkFsbFRlc3RzIiB0b2Rpcj0iJHtqdW5pdC5yZXBvcnRzLnhtbH0iLz4KKyAgICAgICAgPC9qdW5pdD4KKyAgICA8L3RhcmdldD4KKyAgICA8IS0tIFVuaXQgVGVzdHM6IGNvbS5zZWFndWxsc3cudG9vbGJveC5uZXQgIC0tPgorICAgIDx0YXJnZXQgbmFtZT0ianVuaXQudG9vbGJveC5uZXQiIGRlcGVuZHM9InJlcG9ydC5pbml0Ij4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtqdW5pdC5yZXBvcnRzLnhtbH0iLz4KKyAgICAgICAgPGp1bml0IHByaW50c3VtbWFyeT0iJHtqdW5pdC5wcmludHN1bW1hcnl9IiBmb3JrPSIke2p1bml0LmZvcmt9IiBkaXI9IiR7anVuaXQuZGlyfSIgaW5jbHVkZWFudHJ1bnRpbWU9IiR7anVuaXQuaW5jbHVkZWFudHJ1bnRpbWV9Ij4KKyAgICAgICAgICAgIDxmb3JtYXR0ZXIgdHlwZT0iJHtqdW5pdC5mb3JtYXR0ZXJ9IiBleHRlbnNpb249IiR7anVuaXQucmVwb3J0LmV4dH0iLz4KKyAgICAgICAgICAgIDxjbGFzc3BhdGg+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2Fpcy1jb3JlLmphcn0iLz4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y29tbW9ucy1jb2RlYy5qYXJ9Ii8+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NvbW1vbnMtaHR0cGNsaWVudC5qYXJ9Ii8+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NvbW1vbnMtbG9nZ2luZy5qYXJ9Ii8+CisgICAgICAgICAgICAgICAgPHBhdGggcmVmaWQ9ImpjZS5jbGFzc3BhdGgucnQiLz4KKyAgICAgICAgICAgICAgICA8cGF0aCByZWZpZD0ianNzZS5jbGFzc3BhdGgiLz4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7dGVzdC5iaW59Ii8+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3Rlc3QucmVzb3VyY2VzfSIvPgorICAgICAgICAgICAgICAgIDxwYXRoIHJlZmlkPSJqdW5pdC5jbGFzc3BhdGgiLz4KKyAgICAgICAgICAgIDwvY2xhc3NwYXRoPgorICAgICAgICAgICAgPHRlc3QgbmFtZT0iY29tLnNlYWd1bGxzdy50b29sYm94Lm5ldC5BbGxUZXN0cyIgdG9kaXI9IiR7anVuaXQucmVwb3J0cy54bWx9Ii8+CisgICAgICAgIDwvanVuaXQ+CisgICAgPC90YXJnZXQ+CisgICAgPCEtLSBVbml0IFRlc3RzOiBjb20uc2VhZ3VsbHN3LnVuaXR0ZXN0LmFwcGludGVyZmFjZS5tb2RlbCAgLS0+CisgICAgPHRhcmdldCBuYW1lPSJqdW5pdC5tb2RlbCIgZGVwZW5kcz0icmVwb3J0LmluaXQiPgorICAgICAgICA8bWtkaXIgZGlyPSIke2p1bml0LnJlcG9ydHMueG1sfSIvPgorICAgICAgICA8anVuaXQgcHJpbnRzdW1tYXJ5PSIke2p1bml0LnByaW50c3VtbWFyeX0iIGZvcms9IiR7anVuaXQuZm9ya30iIGRpcj0iJHtqdW5pdC5kaXJ9IiBpbmNsdWRlYW50cnVudGltZT0iJHtqdW5pdC5pbmNsdWRlYW50cnVudGltZX0iPgorICAgICAgICAgICAgPGZvcm1hdHRlciB0eXBlPSIke2p1bml0LmZvcm1hdHRlcn0iIGV4dGVuc2lvbj0iJHtqdW5pdC5yZXBvcnQuZXh0fSIvPgorICAgICAgICAgICAgPGNsYXNzcGF0aD4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7YWlzLWNvcmUuamFyfSIvPgorICAgICAgICAgICAgICAgIDxwYXRoIHJlZmlkPSJhaXMuY2xhc3NwYXRoIi8+CisgICAgICAgICAgICAgICAgPHBhdGggcmVmaWQ9InRyYW5zZm9ybXMuY2xhc3NwYXRoIi8+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3Rlc3QuYmlufSIvPgorICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt0ZXN0LnJlc291cmNlc30iLz4KKyAgICAgICAgICAgICAgICA8cGF0aCByZWZpZD0ianVuaXQuY2xhc3NwYXRoIi8+CisgICAgICAgICAgICA8L2NsYXNzcGF0aD4KKyAgICAgICAgICAgIDx0ZXN0IG5hbWU9ImNvbS5zZWFndWxsc3cudW5pdHRlc3QuYXBwaW50ZXJmYWNlLm1vZGVsLkFsbFRlc3RzIiB0b2Rpcj0iJHtqdW5pdC5yZXBvcnRzLnhtbH0iLz4KKyAgICAgICAgPC9qdW5pdD4KKyAgICA8L3RhcmdldD4KKyAgICA8dGFyZ2V0IG5hbWU9Imp1bml0LnNlcnZlciIgZGVwZW5kcz0icmVwb3J0LmluaXQiPgorICAgICAgICA8bWtkaXIgZGlyPSIke2p1bml0LnJlcG9ydHMueG1sfSIvPgorICAgICAgICA8anVuaXQgcHJpbnRzdW1tYXJ5PSIke2p1bml0LnByaW50c3VtbWFyeX0iIGZvcms9IiR7anVuaXQuZm9ya30iIGRpcj0iJHtqdW5pdC5kaXJ9IiBpbmNsdWRlYW50cnVudGltZT0iJHtqdW5pdC5pbmNsdWRlYW50cnVudGltZX0iPgorICAgICAgICAgICAgPGZvcm1hdHRlciB0eXBlPSIke2p1bml0LmZvcm1hdHRlcn0iIGV4dGVuc2lvbj0iJHtqdW5pdC5yZXBvcnQuZXh0fSIvPgorICAgICAgICAgICAgPGNsYXNzcGF0aD4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7YWlzLWNvcmUuamFyfSIvPgorICAgICAgICAgICAgICAgIDxwYXRoIHJlZmlkPSJhaXMuY2xhc3NwYXRoIi8+CisgICAgICAgICAgICAgICAgPHBhdGggcmVmaWQ9Imltcy5iYWNrZW5kLmNsYXNzcGF0aCIvPgorICAgICAgICAgICAgICAgIDxwYXRoIHJlZmlkPSJjaWNzLmJhY2tlbmQuY2xhc3NwYXRoIi8+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3Rlc3QuYmlufSIvPgorICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt0ZXN0LnJlc291cmNlc30iLz4KKyAgICAgICAgICAgICAgICA8cGF0aCByZWZpZD0ianVuaXQuY2xhc3NwYXRoIi8+CisgICAgICAgICAgICA8L2NsYXNzcGF0aD4KKyAgICAgICAgICAgIDx0ZXN0IG5hbWU9ImNvbS5zZWFndWxsc3cuYXBwaW50ZXJmYWNlLnNlcnZlci5Mb2FkRnVuY3Rpb25zVGVzdCIgdG9kaXI9IiR7anVuaXQucmVwb3J0cy54bWx9Ii8+CisgICAgICAgIDwvanVuaXQ+CisgICAgPC90YXJnZXQ+CisgICAgPCEtLSBVbml0IFRlc3RzOiBjb20uc2VhZ3VsbHN3LnVuaXR0ZXN0LmFwcGludGVyZmFjZS5zZXJ2ZXIuYmFja2VuZC5ob3N0Y29ubmVjdG9yMiAgLS0+CisgICAgPHRhcmdldCBuYW1lPSJqdW5pdC5ob3N0Y29ubmVjdG9yMiIgZGVwZW5kcz0icmVwb3J0LmluaXQiPgorICAgICAgICA8bWtkaXIgZGlyPSIke2p1bml0LnJlcG9ydHMueG1sfSIvPgorICAgICAgICA8anVuaXQgcHJpbnRzdW1tYXJ5PSIke2p1bml0LnByaW50c3VtbWFyeX0iIGZvcms9IiR7anVuaXQuZm9ya30iIGRpcj0iJHtqdW5pdC5kaXJ9IiBpbmNsdWRlYW50cnVudGltZT0iJHtqdW5pdC5pbmNsdWRlYW50cnVudGltZX0iPgorICAgICAgICAgICAgPGZvcm1hdHRlciB0eXBlPSIke2p1bml0LmZvcm1hdHRlcn0iIGV4dGVuc2lvbj0iJHtqdW5pdC5yZXBvcnQuZXh0fSIvPgorICAgICAgICAgICAgPGNsYXNzcGF0aD4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7YWlzLWNvcmUuamFyfSIvPgorICAgICAgICAgICAgICAgIDxwYXRoIHJlZmlkPSJhaXMuY2xhc3NwYXRoIi8+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3Rlc3QuYmlufSIvPgorICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHthaXMtNTI1MC5qYXJ9Ii8+CisgICAgICAgICAgICAgICAgPHBhdGggcmVmaWQ9Imp1bml0LmNsYXNzcGF0aCIvPgorICAgICAgICAgICAgPC9jbGFzc3BhdGg+CisgICAgICAgICAgICA8dGVzdCBuYW1lPSJjb20uc2VhZ3VsbHN3LnVuaXR0ZXN0LmFwcGludGVyZmFjZS5zZXJ2ZXIuYmFja2VuZC5ob3N0Y29ubmVjdG9yMi5BbGxUZXN0cyIgdG9kaXI9IiR7anVuaXQucmVwb3J0cy54bWx9Ii8+CisgICAgICAgIDwvanVuaXQ+CisgICAgPC90YXJnZXQ+CisgICAgPHRhcmdldCBuYW1lPSJqdW5pdC5iYWNrZW5kLmhzYyIgZGVwZW5kcz0icmVwb3J0LmluaXQiPgorICAgICAgICA8bWtkaXIgZGlyPSIke2p1bml0LnJlcG9ydHMueG1sfSIvPgorICAgICAgICA8IS0tIFRoZSB0aW1lb3V0IGlzIGV4cHJlc3NlZCBpbiBtaWxsaXNlY29uZHMuIC0tPgorICAgICAgICA8anVuaXQgcHJpbnRzdW1tYXJ5PSIke2p1bml0LnByaW50c3VtbWFyeX0iIGZvcms9IiR7anVuaXQuZm9ya30iIGRpcj0iJHtqdW5pdC5kaXJ9IiBpbmNsdWRlYW50cnVudGltZT0iJHtqdW5pdC5pbmNsdWRlYW50cnVudGltZX0iPgorICAgICAgICAgICAgPGZvcm1hdHRlciB0eXBlPSIke2p1bml0LmZvcm1hdHRlcn0iIGV4dGVuc2lvbj0iJHtqdW5pdC5yZXBvcnQuZXh0fSIvPgorICAgICAgICAgICAgPGNsYXNzcGF0aD4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7YWlzLWNvcmUuamFyfSIvPgorICAgICAgICAgICAgICAgIDxwYXRoIHJlZmlkPSJhaXMuY2xhc3NwYXRoIi8+CisgICAgICAgICAgICAgICAgPHBhdGggcmVmaWQ9ImpjZS5jbGFzc3BhdGgucnQiLz4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7YWlzLTUyNTAuamFyfSIvPgorICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHthaXMtMzI3MC5qYXJ9Ii8+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NvbW1vbnMtaHR0cGNsaWVudC5qYXJ9Ii8+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3Rlc3QuYmlufSIvPgorICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt0ZXN0LnJlc291cmNlc30iLz4KKyAgICAgICAgICAgICAgICA8cGF0aCByZWZpZD0ianVuaXQuY2xhc3NwYXRoIi8+CisgICAgICAgICAgICA8L2NsYXNzcGF0aD4KKyAgICAgICAgICAgIDx0ZXN0IG5hbWU9ImNvbS5zZWFndWxsc3cuYXBwaW50ZXJmYWNlLnNlcnZlci5jb25maWcuYmluZC5jb25uZWN0b3JzLmhzYy5BbGxUZXN0cyIgdG9kaXI9IiR7anVuaXQucmVwb3J0cy54bWx9Ii8+CisgICAgICAgIDwvanVuaXQ+CisgICAgPC90YXJnZXQ+CisgICAgPCEtLSBVbml0IFRlc3RzOiBJTVMgYmFjay1lbmQgLS0+CisgICAgPHRhcmdldCBuYW1lPSJqdW5pdC5iYWNrZW5kLmltcyIgZGVwZW5kcz0icmVwb3J0LmluaXQiPgorICAgICAgICA8bWtkaXIgZGlyPSIke2p1bml0LnJlcG9ydHMueG1sfSIvPgorICAgICAgICA8IS0tIFRoZSB0aW1lb3V0IGlzIGV4cHJlc3NlZCBpbiBtaWxsaXNlY29uZHMuIC0tPgorICAgICAgICA8anVuaXQgcHJpbnRzdW1tYXJ5PSIke2p1bml0LnByaW50c3VtbWFyeX0iIGZvcms9IiR7anVuaXQuZm9ya30iIGRpcj0iJHtqdW5pdC5kaXJ9IiBpbmNsdWRlYW50cnVudGltZT0iJHtqdW5pdC5pbmNsdWRlYW50cnVudGltZX0iPgorICAgICAgICAgICAgPGZvcm1hdHRlciB0eXBlPSIke2p1bml0LmZvcm1hdHRlcn0iIGV4dGVuc2lvbj0iJHtqdW5pdC5yZXBvcnQuZXh0fSIvPgorICAgICAgICAgICAgPGNsYXNzcGF0aD4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7YWlzLWNvcmUuamFyfSIvPgorICAgICAgICAgICAgICAgIDxwYXRoIHJlZmlkPSJhaXMuY2xhc3NwYXRoIi8+CisgICAgICAgICAgICAgICAgPHBhdGggcmVmaWQ9Imltcy5iYWNrZW5kLmNsYXNzcGF0aCIvPgorICAgICAgICAgICAgICAgIDxwYXRoIHJlZmlkPSJqY2UuY2xhc3NwYXRoLnJ0Ii8+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2Fpcy1pbXMuamFyfSIvPgorICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt0ZXN0LmJpbn0iLz4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7dGVzdC5yZXNvdXJjZXN9Ii8+CisgICAgICAgICAgICAgICAgPHBhdGggcmVmaWQ9Imp1bml0LmNsYXNzcGF0aCIvPgorICAgICAgICAgICAgPC9jbGFzc3BhdGg+CisgICAgICAgICAgICA8dGVzdCBuYW1lPSJjb20uc2VhZ3VsbHN3LmFwcGludGVyZmFjZS5zZXJ2ZXIuY29uZmlnLmJpbmQuY29ubmVjdG9ycy5pbXMuQWxsVGVzdHMiIHRvZGlyPSIke2p1bml0LnJlcG9ydHMueG1sfSIvPgorICAgICAgICA8L2p1bml0PgorICAgIDwvdGFyZ2V0PgorICAgIDx0YXJnZXQgbmFtZT0ianVuaXQuYmFja2VuZC5pbXMubGl2ZSIgZGVwZW5kcz0icmVwb3J0LmluaXQiPgorICAgICAgICA8bWtkaXIgZGlyPSIke2p1bml0LnJlcG9ydHMueG1sfSIvPgorICAgICAgICA8IS0tIFRoZSB0aW1lb3V0IGlzIGV4cHJlc3NlZCBpbiBtaWxsaXNlY29uZHMuIC0tPgorICAgICAgICA8anVuaXQgcHJpbnRzdW1tYXJ5PSIke2p1bml0LnByaW50c3VtbWFyeX0iIGZvcms9InRydWUiIHRpbWVvdXQ9IjQ1MDAwIiBkaXI9IiR7anVuaXQuZGlyfSIgaW5jbHVkZWFudHJ1bnRpbWU9IiR7anVuaXQuaW5jbHVkZWFudHJ1bnRpbWV9Ij4KKyAgICAgICAgICAgIDxmb3JtYXR0ZXIgdHlwZT0iJHtqdW5pdC5mb3JtYXR0ZXJ9IiBleHRlbnNpb249IiR7anVuaXQucmVwb3J0LmV4dH0iLz4KKyAgICAgICAgICAgIDxjbGFzc3BhdGg+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2Fpcy1jb3JlLmphcn0iLz4KKyAgICAgICAgICAgICAgICA8cGF0aCByZWZpZD0iYWlzLmNsYXNzcGF0aCIvPgorICAgICAgICAgICAgICAgIDxwYXRoIHJlZmlkPSJpbXMuYmFja2VuZC5jbGFzc3BhdGgiLz4KKyAgICAgICAgICAgICAgICA8cGF0aCByZWZpZD0iamNlLmNsYXNzcGF0aC5ydCIvPgorICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHthaXMtaW1zLmphcn0iLz4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7dGVzdC5iaW59Ii8+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3Rlc3QucmVzb3VyY2VzfSIvPgorICAgICAgICAgICAgICAgIDxwYXRoIHJlZmlkPSJqdW5pdC5jbGFzc3BhdGgiLz4KKyAgICAgICAgICAgIDwvY2xhc3NwYXRoPgorICAgICAgICAgICAgPHRlc3QgbmFtZT0iY29tLnNlYWd1bGxzdy5hcHBpbnRlcmZhY2Uuc2VydmVyLmJhY2tlbmQuaW1zLkFsbExpdmVJbXNJY29UZXN0cyIgdG9kaXI9IiR7anVuaXQucmVwb3J0cy54bWx9Ii8+CisgICAgICAgIDwvanVuaXQ+CisgICAgPC90YXJnZXQ+CisgICAgPCEtLSBVbml0IFRlc3RzOiBDSUNTIGJhY2stZW5kIC0tPgorICAgIDx0YXJnZXQgbmFtZT0ianVuaXQuYmFja2VuZC5jaWNzIiBkZXBlbmRzPSJqdW5pdC5iYWNrZW5kLmNpY3MuY29tbW9uLCBqdW5pdC5iYWNrZW5kLmNpY3MuY3RnLmxpdmUsIGp1bml0LmJhY2tlbmQuY2ljcy5oYiwganVuaXQuYmFja2VuZC5jaWNzLmhiLmxpdmUiLz4KKyAgICA8dGFyZ2V0IG5hbWU9Imp1bml0LmJhY2tlbmQuY2ljcy5jb21tb24iIGRlcGVuZHM9InJlcG9ydC5pbml0Ij4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtqdW5pdC5yZXBvcnRzLnhtbH0iLz4KKyAgICAgICAgPGp1bml0IHByaW50c3VtbWFyeT0iJHtqdW5pdC5wcmludHN1bW1hcnl9IiBmb3JrPSIke2p1bml0LmZvcmt9IiBkaXI9IiR7anVuaXQuZGlyfSIgaW5jbHVkZWFudHJ1bnRpbWU9IiR7anVuaXQuaW5jbHVkZWFudHJ1bnRpbWV9Ij4KKyAgICAgICAgICAgIDxmb3JtYXR0ZXIgdHlwZT0iJHtqdW5pdC5mb3JtYXR0ZXJ9IiBleHRlbnNpb249IiR7anVuaXQucmVwb3J0LmV4dH0iLz4KKyAgICAgICAgICAgIDxjbGFzc3BhdGg+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2Fpcy1jb3JlLmphcn0iLz4KKyAgICAgICAgICAgICAgICA8cGF0aCByZWZpZD0iYWlzLmNsYXNzcGF0aCIvPgorICAgICAgICAgICAgICAgIDxwYXRoIHJlZmlkPSJqY2UuY2xhc3NwYXRoLnJ0Ii8+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2Fpcy1jaWNzLmphcn0iLz4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y3RnY2xpZW50Lmphcn0iLz4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y29tbW9ucy1odHRwY2xpZW50Lmphcn0iLz4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y29tbW9ucy1sb2dnaW5nLmphcn0iLz4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7dGVzdC5iaW59Ii8+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3Rlc3QucmVzb3VyY2VzfSIvPgorICAgICAgICAgICAgICAgIDxwYXRoIHJlZmlkPSJqdW5pdC5jbGFzc3BhdGgiLz4KKyAgICAgICAgICAgIDwvY2xhc3NwYXRoPgorICAgICAgICAgICAgPHRlc3QgbmFtZT0iY29tLnNlYWd1bGxzdy5hcHBpbnRlcmZhY2Uuc2VydmVyLmNvbmZpZy5iaW5kLmNvbm5lY3RvcnMuY2ljcy5BbGxUZXN0cyIgdG9kaXI9IiR7anVuaXQucmVwb3J0cy54bWx9Ii8+CisgICAgICAgIDwvanVuaXQ+CisgICAgPC90YXJnZXQ+CisgICAgPHRhcmdldCBuYW1lPSJqdW5pdC5iYWNrZW5kLmNpY3MuY3RnLmxpdmUiIGRlcGVuZHM9InJlcG9ydC5pbml0Ij4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtqdW5pdC5yZXBvcnRzLnhtbH0iLz4KKyAgICAgICAgPCEtLSBUaGUgdGltZW91dCBpcyBleHByZXNzZWQgaW4gbWlsbGlzZWNvbmRzLiAtLT4KKyAgICAgICAgPGp1bml0IHByaW50c3VtbWFyeT0iJHtqdW5pdC5wcmludHN1bW1hcnl9IiBmb3JrPSJ0cnVlIiB0aW1lb3V0PSI2MDAwMDAiIGRpcj0iJHtqdW5pdC5kaXJ9IiBpbmNsdWRlYW50cnVudGltZT0iJHtqdW5pdC5pbmNsdWRlYW50cnVudGltZX0iPgorICAgICAgICAgICAgPGZvcm1hdHRlciB0eXBlPSIke2p1bml0LmZvcm1hdHRlcn0iIGV4dGVuc2lvbj0iJHtqdW5pdC5yZXBvcnQuZXh0fSIvPgorICAgICAgICAgICAgPGNsYXNzcGF0aD4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7YWlzLWNvcmUuamFyfSIvPgorICAgICAgICAgICAgICAgIDxwYXRoIHJlZmlkPSJhaXMuY2xhc3NwYXRoIi8+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2Fpcy1jaWNzLmphcn0iLz4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y3RnY2xpZW50Lmphcn0iLz4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y29tbW9ucy1odHRwY2xpZW50Lmphcn0iLz4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7dGVzdC5iaW59Ii8+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3Rlc3QucmVzb3VyY2VzfSIvPgorICAgICAgICAgICAgICAgIDxwYXRoIHJlZmlkPSJqdW5pdC5jbGFzc3BhdGgiLz4KKyAgICAgICAgICAgIDwvY2xhc3NwYXRoPgorICAgICAgICAgICAgPHRlc3QgbmFtZT0iY29tLnNlYWd1bGxzdy5hcHBpbnRlcmZhY2Uuc2VydmVyLmJhY2tlbmQuY2ljcy5BbGxMaXZlSWJtQ3RnVGVzdHMiIHRvZGlyPSIke2p1bml0LnJlcG9ydHMueG1sfSIvPgorICAgICAgICA8L2p1bml0PgorICAgIDwvdGFyZ2V0PgorICAgIDx0YXJnZXQgbmFtZT0ianVuaXQuYmFja2VuZC5jaWNzLmhiIiBkZXBlbmRzPSJyZXBvcnQuaW5pdCI+CisgICAgICAgIDxta2RpciBkaXI9IiR7anVuaXQucmVwb3J0cy54bWx9Ii8+CisgICAgICAgIDxqdW5pdCBwcmludHN1bW1hcnk9IiR7anVuaXQucHJpbnRzdW1tYXJ5fSIgZm9yaz0iJHtqdW5pdC5mb3JrfSIgZGlyPSIke2p1bml0LmRpcn0iIGluY2x1ZGVhbnRydW50aW1lPSIke2p1bml0LmluY2x1ZGVhbnRydW50aW1lfSI+CisgICAgICAgICAgICA8Zm9ybWF0dGVyIHR5cGU9IiR7anVuaXQuZm9ybWF0dGVyfSIgZXh0ZW5zaW9uPSIke2p1bml0LnJlcG9ydC5leHR9Ii8+CisgICAgICAgICAgICA8Y2xhc3NwYXRoPgorICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHthaXMtY29yZS5qYXJ9Ii8+CisgICAgICAgICAgICAgICAgPHBhdGggcmVmaWQ9ImFpcy5jbGFzc3BhdGgiLz4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7YWlzLWNpY3MuamFyfSIvPgorICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjb21tb25zLWh0dHBjbGllbnQuamFyfSIvPgorICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjb21tb25zLWxvZ2dpbmcuamFyfSIvPgorICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt0ZXN0LmJpbn0iLz4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7dGVzdC5yZXNvdXJjZXN9Ii8+CisgICAgICAgICAgICAgICAgPHBhdGggcmVmaWQ9Imp1bml0LmNsYXNzcGF0aCIvPgorICAgICAgICAgICAgPC9jbGFzc3BhdGg+CisgICAgICAgICAgICA8dGVzdCBuYW1lPSJjb20uc2VhZ3VsbHN3LmFwcGludGVyZmFjZS5zZXJ2ZXIuYmFja2VuZC5jaWNzLkhvc3RCcmlkZ2VCeXRlQnVmZmVyU3RyYXRlZ3lUZXN0IiB0b2Rpcj0iJHtqdW5pdC5yZXBvcnRzLnhtbH0iLz4KKyAgICAgICAgPC9qdW5pdD4KKyAgICA8L3RhcmdldD4KKyAgICA8dGFyZ2V0IG5hbWU9Imp1bml0LmJhY2tlbmQuY2ljcy5oYi5saXZlIiBkZXBlbmRzPSJyZXBvcnQuaW5pdCI+CisgICAgICAgIDxta2RpciBkaXI9IiR7anVuaXQucmVwb3J0cy54bWx9Ii8+CisgICAgICAgIDxqdW5pdCBwcmludHN1bW1hcnk9IiR7anVuaXQucHJpbnRzdW1tYXJ5fSIgZm9yaz0idHJ1ZSIgdGltZW91dD0iNjAwMDAwIiBkaXI9IiR7anVuaXQuZGlyfSIgaW5jbHVkZWFudHJ1bnRpbWU9IiR7anVuaXQuaW5jbHVkZWFudHJ1bnRpbWV9Ij4KKyAgICAgICAgICAgIDxmb3JtYXR0ZXIgdHlwZT0iJHtqdW5pdC5mb3JtYXR0ZXJ9IiBleHRlbnNpb249IiR7anVuaXQucmVwb3J0LmV4dH0iLz4KKyAgICAgICAgICAgIDxjbGFzc3BhdGg+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2Fpcy1jb3JlLmphcn0iLz4KKyAgICAgICAgICAgICAgICA8cGF0aCByZWZpZD0iYWlzLmNsYXNzcGF0aCIvPgorICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHthaXMtY2ljcy5qYXJ9Ii8+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NvbW1vbnMtaHR0cGNsaWVudC5qYXJ9Ii8+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NvbW1vbnMtbG9nZ2luZy5qYXJ9Ii8+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3Rlc3QuYmlufSIvPgorICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt0ZXN0LnJlc291cmNlc30iLz4KKyAgICAgICAgICAgICAgICA8cGF0aCByZWZpZD0ianVuaXQuY2xhc3NwYXRoIi8+CisgICAgICAgICAgICA8L2NsYXNzcGF0aD4KKyAgICAgICAgICAgIDx0ZXN0IG5hbWU9ImNvbS5zZWFndWxsc3cuYXBwaW50ZXJmYWNlLnNlcnZlci5iYWNrZW5kLmNpY3MuQWxsTGl2ZUhvc3RCcmlkZ2VUZXN0cyIgdG9kaXI9IiR7anVuaXQucmVwb3J0cy54bWx9Ii8+CisgICAgICAgIDwvanVuaXQ+CisgICAgPC90YXJnZXQ+CisgICAgPCEtLSBDbGVhbiByZXBvcnRzIC0tPgorICAgIDx0YXJnZXQgbmFtZT0ianVuaXQucmVwb3J0LmNsZWFuIj4KKyAgICAgICAgPGRlbGV0ZSBkaXI9IiR7anVuaXQucmVwb3J0c30iLz4KKyAgICA8L3RhcmdldD4KKyAgICA8IS0tIENyZWF0ZSB0aGUgdW5pdCB0ZXN0cyByZXBvcnQgLS0+CisgICAgPHRhcmdldCBuYW1lPSJqdW5pdC5yZXBvcnQiIGRlcGVuZHM9ImluaXQiPgorICAgICAgICA8bWtkaXIgZGlyPSIke2p1bml0LnJlcG9ydHN9Ii8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJqdW5pdC5yZXBvcnRzLmZyYW1lcyIgbG9jYXRpb249IiR7anVuaXQucmVwb3J0c30vZnJhbWVzIi8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJqdW5pdC5yZXBvcnRzLm5vZnJhbWVzIiBsb2NhdGlvbj0iJHtqdW5pdC5yZXBvcnRzfS9ub2ZyYW1lcyIvPgorICAgICAgICA8bWtkaXIgZGlyPSIke2p1bml0LnJlcG9ydHMueG1sfSIvPgorICAgICAgICA8bWtkaXIgZGlyPSIke2p1bml0LnJlcG9ydHMuZnJhbWVzfSIvPgorICAgICAgICA8bWtkaXIgZGlyPSIke2p1bml0LnJlcG9ydHMubm9mcmFtZXN9Ii8+CisgICAgICAgIDxlY2hvIGxldmVsPSJpbmZvIiBtZXNzYWdlPSJDb21waWxpbmcgYWxsIHJlcG9ydHMgdG8gJHtqdW5pdC5yZXBvcnRzfS4uLiIvPgorICAgICAgICA8anVuaXRyZXBvcnQgdG9kaXI9IiR7anVuaXQucmVwb3J0cy54bWx9Ij4KKyAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtqdW5pdC5yZXBvcnRzLnhtbH0iPgorICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoke2p1bml0LnJlcG9ydC5leHR9Ii8+CisgICAgICAgICAgICA8L2ZpbGVzZXQ+CisgICAgICAgICAgICA8cmVwb3J0IGZvcm1hdD0ibm9mcmFtZXMiIHRvZGlyPSIke2p1bml0LnJlcG9ydHMubm9mcmFtZXN9Ii8+CisgICAgICAgICAgICA8cmVwb3J0IGZvcm1hdD0iZnJhbWVzIiB0b2Rpcj0iJHtqdW5pdC5yZXBvcnRzLmZyYW1lc30iLz4KKyAgICAgICAgPC9qdW5pdHJlcG9ydD4KKyAgICAgICAgPGVjaG8gbGV2ZWw9ImluZm8iIG1lc3NhZ2U9IlRoZSBYTUwgcmVwb3J0IGlzIGluOiAke2p1bml0LnJlcG9ydHMueG1sfSIvPgorICAgICAgICA8ZWNobyBsZXZlbD0iaW5mbyIgbWVzc2FnZT0iVGhlIEhUTUwgcmVwb3J0ICh3aXRoIGZyYW1lcykgaXMgaW46ICR7anVuaXQucmVwb3J0cy5mcmFtZXN9Ii8+CisgICAgICAgIDxlY2hvIGxldmVsPSJpbmZvIiBtZXNzYWdlPSJUaGUgSFRNTCByZXBvcnQgKG5vIGZyYW1lcykgaXMgaW46ICR7anVuaXQucmVwb3J0cy5ub2ZyYW1lc30iLz4KKyAgICAgICAgPCEtLSBSZW5hbWUgZmlsZSB0byBpbmRleC5odG1sIC0tPgorICAgICAgICA8bW92ZSBmaWxlPSIke2p1bml0LnJlcG9ydHMubm9mcmFtZXN9L2p1bml0LW5vZnJhbWVzLmh0bWwiIHRvZmlsZT0iJHtqdW5pdC5yZXBvcnRzLm5vZnJhbWVzfS9pbmRleC5odG1sIi8+CisgICAgICAgIDwhLS0gQ29weSB0ZXN0IHJlcG9ydHMgaG9tZSBwYWdlIC0tPgorICAgICAgICA8Y29weSBmaWxlPSIke2p1bml0LnJlcG9ydHMuc3JjZGlyfS9pbmRleC5odG1sIiB0b2Rpcj0iJHtyZXBvcnRzLmRpcn0iIG92ZXJ3cml0ZT0idHJ1ZSIgZmlsdGVyaW5nPSJ0cnVlIi8+CisgICAgICAgIDxjb3B5IHRvZGlyPSIke3JlcG9ydHMuZGlyfS9pbWFnZXMiIG92ZXJ3cml0ZT0idHJ1ZSI+CisgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7anVuaXQucmVwb3J0cy5zcmNkaXJ9L2ltYWdlcyIvPgorICAgICAgICA8L2NvcHk+CisgICAgICAgIDxhbnRjYWxsIHRhcmdldD0icmVwb3J0LmNoZWNrc3VtcyIvPgorICAgIDwvdGFyZ2V0PgorICAgIDx0YXJnZXQgbmFtZT0icmVwb3J0LmNoZWNrc3VtcyI+CisgICAgICAgIDxhbnRjYWxsIHRhcmdldD0iY29weS1jaGVja3N1bXMiLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InRlbXAuaW5kZXgiIHZhbHVlPSIke3JlcG9ydHMuZGlyfS9pbmRleC10ZW1wLmh0bWwiLz4KKyAgICAgICAgPHhzbHQgaW49IiR7cmVwb3J0cy5kaXJ9L2luZGV4Lmh0bWwiIG91dD0iJHt0ZW1wLmluZGV4fSIgZm9yY2U9InRydWUiIHN0eWxlPSIke2p1bml0LnJlcG9ydHMuc3JjZGlyfS9hcHBseS1kYXRhLnhzbHQiPgorICAgICAgICAgICAgPHBhcmFtIG5hbWU9InJlcG9ydERpciIgZXhwcmVzc2lvbj0iJHtyZXBvcnRzLmRpcn0iLz4KKyAgICAgICAgPC94c2x0PgorICAgICAgICA8ZGVsZXRlIGZpbGU9IiR7cmVwb3J0cy5kaXJ9L2luZGV4Lmh0bWwiLz4KKyAgICAgICAgPG1vdmUgZmlsZT0iJHt0ZW1wLmluZGV4fSIgdG9maWxlPSIke3JlcG9ydHMuZGlyfS9pbmRleC5odG1sIi8+CisgICAgPC90YXJnZXQ+CisgICAgPHRhcmdldCBuYW1lPSJqdW5pdC5qYXZheCIgZGVwZW5kcz0ianVuaXQuamF2YXguaW8sIGp1bml0LmphdmF4LnV0aWwsIGp1bml0LmphdmF4LmxhbmciLz4KKyAgICA8dGFyZ2V0IG5hbWU9Imp1bml0LnNlcnZlci5jb25maWciIGRlcGVuZHM9Imp1bml0LnNlcnZlci5jb25maWcubG9nLCBqdW5pdC5zZXJ2ZXIuY29uZmlnLnRocmVhZHBvb2wsIGp1bml0LnNlcnZlci5jb25maWcudHJhbnNmb3JtLCBqdW5pdC5zZXJ2ZXIuY29uZmlnLmNvcmUsIGp1bml0LnNlcnZlci5jb25maWcubWFuYWdlbWVudCIvPgorICAgIDx0YXJnZXQgbmFtZT0ianVuaXQudG9vbGJveCIgZGVwZW5kcz0ianVuaXQudG9vbGJveC5jb25maWcsIGp1bml0LnRvb2xib3gueG1sLCBqdW5pdC50b29sYm94Lm5ldCwganVuaXQudG9vbGJveC5sb2ciLz4KKyAgICA8dGFyZ2V0IG5hbWU9Imp1bml0LmFpcy1jb3JlIiBkZXBlbmRzPSJqdW5pdC5qYXZheCwganVuaXQudG9vbGJveCwganVuaXQuc2VydmVyLmNvbmZpZywganVuaXQuYWlzLWNvcmUudHJhbnNmb3JtcywganVuaXQuc2VjdXJpdHkuYXV0aCwganVuaXQuY3J5cHRvLCBqdW5pdC5tb2RlbCwganVuaXQuc2VydmVyIi8+CisgICAgPHRhcmdldCBuYW1lPSJqdW5pdC5iYWNrZW5kIiBkZXBlbmRzPSJqdW5pdC5iYWNrZW5kLmhzYywganVuaXQuYmFja2VuZC5pbXMsIGp1bml0LmJhY2tlbmQuaW1zLmxpdmUsIGp1bml0LmJhY2tlbmQuY2ljcywganVuaXQuaG9zdGNvbm5lY3RvcjIiLz4KKyAgICA8dGFyZ2V0IG5hbWU9InRlc3QiIGRlc2NyaXB0aW9uPSJSdW5zIHRoZSB0ZXN0cy4iIGRlcGVuZHM9ImluaXQsIHRlc3QuY29tcGlsZSwganVuaXQucmVwb3J0LmNsZWFuLCBqdW5pdC5haXMtY29yZSwganVuaXQuYmFja2VuZCwganVuaXQucmVwb3J0Ii8+CisgICAgPCEtLSBCdWlsZCBhbmQgWmlwIC0tPgorICAgIDx0YXJnZXQgbmFtZT0iemlwIiBkZXBlbmRzPSJkaXN0IiBkZXNjcmlwdGlvbj0iQ3JlYXRlcyB0aGUgZmluYWwgJHt6aXAtZmlsZX0gKGRvZXMgaXQgYWxsKSI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ6aXAtZmlsZSIgbG9jYXRpb249IiR7YnVpbGQuZGlyfS8ke3ppcEZpbGVCYXNlTmFtZX0tYnVpbGQke2J1aWxkLmlkfS56aXAiLz4KKyAgICAgICAgPGRlbGV0ZSBmaWxlPSIke3ppcC1maWxlfSIgcXVpZXQ9InRydWUiLz4KKyAgICAgICAgPHppcCB6aXBmaWxlPSIke3ppcC1maWxlfSIgYmFzZWRpcj0iJHtidWlsZC5kaXN0fSIvPgorICAgIDwvdGFyZ2V0PgorICAgIDx0YXJnZXQgbmFtZT0ibmlnaHRseS1idWlsZCIgZGVwZW5kcz0iaW5pdCwgY2xlYW4sIGRpc3QsIHZlcmlmeSwgdGVzdCIgZGVzY3JpcHRpb249IkNyZWF0ZXMgYSBuaWdodGx5IGJ1aWxkIChkb2VzIGl0IGFsbCkiPgorICAgIDwvdGFyZ2V0PgorPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvcHJvamVjdE9ubHkueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9wcm9qZWN0T25seS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVlY2U1YgotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvcHJvamVjdE9ubHkueG1sCkBAIC0wLDAgKzEsNCBAQAorCisKKworPHByb2plY3QgPjwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL3JlZmlkLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvcmVmaWQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5ZjRhZTEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL3JlZmlkLnhtbApAQCAtMCwwICsxLDQ5IEBACis8cHJvamVjdCBkZWZhdWx0PSIxIj4KKwk8cGF0aCBpZD0icHJvamVjdC5jbGFzcy5wYXRoIj4KKwkJPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJsaWIvIiAvPgorCQk8cGF0aGVsZW1lbnQgcGF0aD0iJHtqYXZhLmNsYXNzLnBhdGh9LyIgLz4KKwkJPHBhdGhlbGVtZW50IHBhdGg9IiR7YWRkaXRpb25hbC5wYXRofSIgLz4KKwk8L3BhdGg+CisKKwk8dGFyZ2V0IG5hbWU9IjEiPgorCQk8cGF0aCBpZD0icHJvamVjdC5jbGFzcy5wYXRoMiI+CisJCQk8cGF0aCByZWZpZD0icHJvamVjdC5jbGFzcy5wYXRoIiAvPgorCQk8L3BhdGg+CisJPC90YXJnZXQ+CisJCisJPHRhcmdldCBuYW1lPSJjb21waWxlIj4KKwkJCTxqYXZhYyBzcmNkaXI9InNyYyIKKwkJCSAgICAgICBkZXN0ZGlyPSJkc3QiCisJCQkgICAgICAgY2xhc3NwYXRocmVmPSIiCisJCQkgICAgICAgc291cmNlcGF0aHJlZj0iIgorCQkJICAgICAgIGJvb3RjbGFzc3BhdGhyZWY9IiIKKwkJCSAgICAgICBkZWJ1Zz0ib24iIC8+CisJCTwvdGFyZ2V0PgorCQorCTx0YXJnZXQgbmFtZT0gImRlcGVuZHMiIGRlcGVuZHM9IiBjb21waWxlICAsIDEgIj4KKwk8L3RhcmdldD4KKwkKKwk8cHJvcGVydHkgbmFtZT0ibmFtZSB3aXRoIHNwYWNlcyIgdmFsdWU9InZhbHVlIHdpdGggc3BhY2VzIi8+CisKKwkKKwk8ZmlsZXNldCBkaXI9ImRpciIgaWQ9ImZpbGVzZXRUZXN0Ij4KKwkgICAgPGluY2x1ZGUgbmFtZT0iaW5jbHVkZSIvPgorCSAgICA8ZXhjbHVkZSBuYW1lPSJleGNsdWRlIi8+CisJPC9maWxlc2V0PgorCQorCTxwYXR0ZXJuc2V0IGlkPSJwYXR0ZXJuU2V0VGVzdCI+CisJCQk8aW5jbHVkZSBuYW1lPSIqLnhtbCIvPgorCQkJPGV4Y2x1ZGUgbmFtZT0iKiovKlRlc3QqIi8+CisJPC9wYXR0ZXJuc2V0PgorCQorCTxwYXR0ZXJuc2V0IGlkPSJwYXR0ZXJuU2V0VGVzdEJhZCI+CisJCTxpbmNsdWRlc2ZpbGUgbmFtZT0ibm90aGVyZSIvPgorCTwvcGF0dGVybnNldD4KKworCTxlY2hvPiR7bmFtZSB3aXRoIHNwYWNlc308L2VjaG8+CisJCisJPGZpbGVzZXQgcmVmaWQ9ImZpbGVzZXRUZXN0Ij4KKwkJPHBhdHRlcm5zZXQgcmVmaWQ9InBhdHRlcm5TZXRUZXN0Ij48L3BhdHRlcm5zZXQ+CisJCTxwYXR0ZXJuc2V0IHJlZmlkPSJwYXR0ZXJuU2V0VGVzdEJhZCI+PC9wYXR0ZXJuc2V0PgorCTwvZmlsZXNldD4KKzwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL3J1c3NpYW5idWlsZC54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL3J1c3NpYW5idWlsZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg1MzU2NgotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvcnVzc2lhbmJ1aWxkLnhtbApAQCAtMCwwICsxLDggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IndpbmRvd3MtMTI1MSI/PgorPHByb2plY3QgbmFtZT0idGVzdCIgZGVmYXVsdD0iaW5pdCIgYmFzZWRpcj0iLiI+CisKKwk8dGFyZ2V0IG5hbWU9ImluaXQiPgorCQk8IS0tIGRpc3BsYXlzIEhlbGxvIGluIFJ1c3NpYW4gLS0+CisJCTxlY2hvIG1lc3NhZ2U9IsOHw6TDsMOgw6LDscOyw6LDs8Opw7LDpSIvPgorCTwvdGFyZ2V0PgorPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvdGFza2RlZi54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL3Rhc2tkZWYueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5MTJiNzEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL3Rhc2tkZWYueG1sCkBAIC0wLDAgKzEsMTEgQEAKKzxwcm9qZWN0IGRlZmF1bHQ9InR5cGUiPgorCisJPHRhc2tkZWYgbmFtZT0ibWluZSIgY2xhc3NuYW1lPSJvcmcuZWNsaXBzZS5hbnQudGVzdHMudWkuc3VwcG9ydC50YXNrcy5BbnRUZXN0VGFzayIgY2xhc3NwYXRoPSJhbnRVSVRlc3RzU3VwcG9ydC5qYXIiPgorCTwvdGFza2RlZj4KKworCTx0YXJnZXQgbmFtZT0idHlwZSI+CisKKwk8L3RhcmdldD4KKworCTxtaW5lPjwvbWluZT4KKzwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL3Rlc3QxLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvdGVzdDEueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmNjBhMzIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL3Rlc3QxLnhtbApAQCAtMCwwICsxLDEwIEBACisKKzxibGE+CisgIDxibHViPjwvYmx1Yj4KKyAgPGtsaWNrPgorICAgIDxndXJnZWw+PC9ndXJnZWw+CisgICAgPGhhbAorICAgIDxrbGFjay8+CisgICAgPGh1bXBmLz4KKyAgPC9rbGljaz4KKzwvYmxhPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvdGVzdDIueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy90ZXN0Mi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNhODc2NQotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvdGVzdDIueG1sCkBAIC0wLDAgKzEsOSBAQAorPGJsYT4KKyAgPGJsdWI+PC9ibHViPgorICA8a2xpY2s+CisgICAgPGd1cmdlbD48L2d1cmdlbD4KKyAgICA8aGFsPjwvaGFsPgorICAgIDxrbGFjay8+CisgICAgPGh1bXBmLz4KKyAgPC9rbGljaz4KKzwvYmxhPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvdGVzdDMueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy90ZXN0My54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc0MDg4ZQotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvdGVzdDMueG1sCkBAIC0wLDAgKzEsNCBAQAorPGJsYT4KKyAgPGJsdWI+CisgIDwvYmx1Yj4KKzwvCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL3Rlc3Q0LnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvdGVzdDQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkNjBmNzkKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL3Rlc3Q0LnhtbApAQCAtMCwwICsxIEBACis8dGFyZ2V0IG5hbWU9Im1haW4iPjxtawpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvdGVzdDUueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy90ZXN0NS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI5N2Q5NQotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvdGVzdDUueG1sCkBAIC0wLDAgKzEsNiBAQAorPHByb2plY3QgbmFtZT0ibWFpbiI+CisJPHRhcmdldCBuYW1lPSJibGEiIC8+CisJPHByb3BlcnR5IG5hbWU9InByb3AxIiB2YWx1ZT0idmFsMSIvPgorCTxwcm9wZXJ0eSBuYW1lPSJwcm9wMiIgdmFsdWU9InZhbDIiLz4KKwk8cHJvcGVydHkgbmFtZT0icHJvcDMiIHZhbHVlPSJ2YWwzIi8+Cis8ZwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvdG9CZUltcG9ydGVkLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvdG9CZUltcG9ydGVkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjAzZjgwCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy90b0JlSW1wb3J0ZWQueG1sCkBAIC0wLDAgKzEsMTIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPHByb2plY3QgbmFtZT0idG9CZUltcG9ydGVkIiBkZWZhdWx0PSJpbXBvcnQtZGVmYXVsdCI+CisKKwk8dGFyZ2V0IG5hbWU9ImltcG9ydC1kZWZhdWx0IiBkZXBlbmRzPSJkZXBlbmRzIj4KKwkJPGVjaG8+aW1wb3J0LWRlZmF1bHQ8L2VjaG8+CisJPC90YXJnZXQ+CisKKwk8dGFyZ2V0IG5hbWU9ImRlcGVuZHMiPgorCQk8ZWNobz5kZXBlbmRzPC9lY2hvPgorCTwvdGFyZ2V0PgorPC9wcm9qZWN0PgorCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL3RvQmVJbXBvcnRlZFdpdGhCeXRlT3JkZXJNYXJrLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvdG9CZUltcG9ydGVkV2l0aEJ5dGVPcmRlck1hcmsueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhMGE4YmEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL3RvQmVJbXBvcnRlZFdpdGhCeXRlT3JkZXJNYXJrLnhtbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RyZXNvdXJjZXMvVGVzdDIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdHJlc291cmNlcy9UZXN0Mi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0N2M0NjgKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RyZXNvdXJjZXMvVGVzdDIuamF2YQpAQCAtMCwwICsxLDMwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogQ3JlYXRlZCBvbiBTZXAgMjEsIDIwMDQKKyAqCisgKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KKyAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCisgKi8KKworLyoqCisgKiBAYXV0aG9yIEFkbWluaXN0cmF0b3IKKyAqCisgKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bworICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKKyAqLworcHVibGljIGNsYXNzIFRlc3QyIHsKKworCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKwkJCisJCVN5c3RlbS5vdXQucHJpbnRsbigicHJlUnVudGVzdCIpOworCX0KK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvLmNsYXNzcGF0aCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvLmNsYXNzcGF0aApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjFhZjNiCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS8uY2xhc3NwYXRoCkBAIC0wLDAgKzEsMTAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8Y2xhc3NwYXRoPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9IkFudCBUb29scyBTdXBwb3J0Ii8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgb3V0cHV0PSJhbnRfcnVubmVyX3N1cHBvcnRfYmluIiBwYXRoPSJBbnQgUnVubmVyIFN1cHBvcnQiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJBbnQgRWRpdG9yIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgb3V0cHV0PSJyZW1vdGVfc3VwcG9ydF9iaW4iIHBhdGg9IlJlbW90ZSBBbnQgU3VwcG9ydCIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjQiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KKzwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS8uZXh0ZXJuYWxUb29sQnVpbGRlcnMvQnVpbGQgQW50IFJ1bm5lciBTdXBwb3J0IEpBUi5sYXVuY2ggYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpLy5leHRlcm5hbFRvb2xCdWlsZGVycy9CdWlsZCBBbnQgUnVubmVyIFN1cHBvcnQgSkFSLmxhdW5jaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzY3NzlkCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS8uZXh0ZXJuYWxUb29sQnVpbGRlcnMvQnVpbGQgQW50IFJ1bm5lciBTdXBwb3J0IEpBUi5sYXVuY2gKQEAgLTAsMCArMSwxNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxsYXVuY2hDb25maWd1cmF0aW9uIHR5cGU9Im9yZy5lY2xpcHNlLmFudC5BbnRCdWlsZGVyTGF1bmNoQ29uZmlndXJhdGlvblR5cGUiPgorPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5BVFRSX0xBVU5DSF9JTl9CQUNLR1JPVU5EIiB2YWx1ZT0iZmFsc2UiLz4KKzxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5ERUZBVUxUX0NMQVNTUEFUSCIgdmFsdWU9InRydWUiLz4KKzxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuYW50LnVpLkRFRkFVTFRfVk1fSU5TVEFMTCIgdmFsdWU9ImZhbHNlIi8+Cis8c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5BVFRSX1JVTl9CVUlMRF9LSU5EUyIgdmFsdWU9ImZ1bGwsaW5jcmVtZW50YWwsYXV0byxjbGVhbiIvPgorPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5hbnQudWkuQVRUUl9UQVJHRVRTX1VQREFURUQiIHZhbHVlPSJ0cnVlIi8+Cis8Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuQVRUUl9UUklHR0VSU19DT05GSUdVUkVEIiB2YWx1ZT0idHJ1ZSIvPgorPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLmFwcGVuZEVudmlyb25tZW50VmFyaWFibGVzIiB2YWx1ZT0idHJ1ZSIvPgorPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuQ0xBU1NQQVRIX1BST1ZJREVSIiB2YWx1ZT0ib3JnLmVjbGlwc2UuYW50LnVpLkFudENsYXNzcGF0aFByb3ZpZGVyIi8+Cis8c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcudWkudGFyZ2V0X3J1bl9wZXJzcGVjdGl2ZSIgdmFsdWU9InBlcnNwZWN0aXZlX25vbmUiLz4KKzxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5hbnQudWkuQVRUUl9BTlRfQ0xFQU5fVEFSR0VUUyIgdmFsdWU9ImNsZWFuLCIvPgorPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuQVRUUl9CVUlMRF9TQ09QRSIgdmFsdWU9IiR7d29ya2luZ19zZXQ6Jmx0Oz94bWwgdmVyc2lvbj0mcXVvdDsxLjAmcXVvdDsgZW5jb2Rpbmc9JnF1b3Q7VVRGLTgmcXVvdDs/Jmd0OyYjMTA7Jmx0O2xhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nU2V0IGZhY3RvcnlJRD0mcXVvdDtvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JraW5nU2V0RmFjdG9yeSZxdW90OyBuYW1lPSZxdW90O3dvcmtpbmdTZXQmcXVvdDsgZWRpdFBhZ2VJZD0mcXVvdDtvcmcuZWNsaXBzZS51aS5yZXNvdXJjZVdvcmtpbmdTZXRQYWdlJnF1b3Q7Jmd0OyYjMTA7Jmx0O2l0ZW0gZmFjdG9yeUlEPSZxdW90O29yZy5lY2xpcHNlLnVpLmludGVybmFsLm1vZGVsLlJlc291cmNlRmFjdG9yeSZxdW90OyBwYXRoPSZxdW90Oy9vcmcuZWNsaXBzZS5hbnQudWkvQ29tbW9uIEFudCBTdXBwb3J0JnF1b3Q7IHR5cGU9JnF1b3Q7MiZxdW90Oy8mZ3Q7JiMxMDsmbHQ7aXRlbSBmYWN0b3J5SUQ9JnF1b3Q7b3JnLmVjbGlwc2UudWkuaW50ZXJuYWwubW9kZWwuUmVzb3VyY2VGYWN0b3J5JnF1b3Q7IHBhdGg9JnF1b3Q7L29yZy5lY2xpcHNlLmFudC51aS9BbnQgUnVubmVyIFN1cHBvcnQmcXVvdDsgdHlwZT0mcXVvdDsyJnF1b3Q7LyZndDsmIzEwOyZsdDtpdGVtIGZhY3RvcnlJRD0mcXVvdDtvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5tb2RlbC5SZXNvdXJjZUZhY3RvcnkmcXVvdDsgcGF0aD0mcXVvdDsvb3JnLmVjbGlwc2UuYW50LnVpL2J1aWxkZmlsZXMvYnVpbGRFeHRyYUpBUi54bWwmcXVvdDsgdHlwZT0mcXVvdDsxJnF1b3Q7LyZndDsmIzEwOyZsdDsvbGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdTZXQmZ3Q7JiMxMDt9Ii8+Cis8c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5BVFRSX1JFRlJFU0hfU0NPUEUiIHZhbHVlPSIke3Byb2plY3R9Ii8+Cis8c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5BVFRSX0xPQ0FUSU9OIiB2YWx1ZT0iJHt3b3Jrc3BhY2VfbG9jOi9vcmcuZWNsaXBzZS5hbnQudWkvYnVpbGRmaWxlcy9idWlsZEV4dHJhSkFSLnhtbH0iLz4KKzxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcudWkuQVRUUl9SVU5fSU5fQkFDS0dST1VORCIgdmFsdWU9ImZhbHNlIi8+Cis8L2xhdW5jaENvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpLy5leHRlcm5hbFRvb2xCdWlsZGVycy9CdWlsZCBSZW1vdGUgQW50IEpBUi5sYXVuY2ggYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpLy5leHRlcm5hbFRvb2xCdWlsZGVycy9CdWlsZCBSZW1vdGUgQW50IEpBUi5sYXVuY2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJjNTgxNAotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvLmV4dGVybmFsVG9vbEJ1aWxkZXJzL0J1aWxkIFJlbW90ZSBBbnQgSkFSLmxhdW5jaApAQCAtMCwwICsxLDE2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGxhdW5jaENvbmZpZ3VyYXRpb24gdHlwZT0ib3JnLmVjbGlwc2UuYW50LkFudEJ1aWxkZXJMYXVuY2hDb25maWd1cmF0aW9uVHlwZSI+Cis8Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLkFUVFJfTEFVTkNIX0lOX0JBQ0tHUk9VTkQiIHZhbHVlPSJmYWxzZSIvPgorPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkRFRkFVTFRfQ0xBU1NQQVRIIiB2YWx1ZT0idHJ1ZSIvPgorPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5hbnQudWkuREVGQVVMVF9WTV9JTlNUQUxMIiB2YWx1ZT0iZmFsc2UiLz4KKzxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLkFUVFJfUlVOX0JVSUxEX0tJTkRTIiB2YWx1ZT0iZnVsbCxpbmNyZW1lbnRhbCxhdXRvLGNsZWFuIi8+Cis8Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmFudC51aS5BVFRSX1RBUkdFVFNfVVBEQVRFRCIgdmFsdWU9InRydWUiLz4KKzxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5hcHBlbmRFbnZpcm9ubWVudFZhcmlhYmxlcyIgdmFsdWU9InRydWUiLz4KKzxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5BVFRSX1RSSUdHRVJTX0NPTkZJR1VSRUQiIHZhbHVlPSJ0cnVlIi8+Cis8c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5DTEFTU1BBVEhfUFJPVklERVIiIHZhbHVlPSJvcmcuZWNsaXBzZS5hbnQudWkuQW50Q2xhc3NwYXRoUHJvdmlkZXIiLz4KKzxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLkFUVFJfQlVJTERfU0NPUEUiIHZhbHVlPSIke3dvcmtpbmdfc2V0OiZsdDs/eG1sIHZlcnNpb249JnF1b3Q7MS4wJnF1b3Q7IGVuY29kaW5nPSZxdW90O1VURi04JnF1b3Q7PyZndDsmIzEwOyZsdDtsYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ1NldCBmYWN0b3J5SUQ9JnF1b3Q7b3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuV29ya2luZ1NldEZhY3RvcnkmcXVvdDsgbmFtZT0mcXVvdDt3b3JraW5nU2V0JnF1b3Q7IGVkaXRQYWdlSWQ9JnF1b3Q7b3JnLmVjbGlwc2UudWkucmVzb3VyY2VXb3JraW5nU2V0UGFnZSZxdW90OyZndDsmIzEwOyZsdDtpdGVtIGZhY3RvcnlJRD0mcXVvdDtvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5tb2RlbC5SZXNvdXJjZUZhY3RvcnkmcXVvdDsgcGF0aD0mcXVvdDsvb3JnLmVjbGlwc2UuYW50LnVpL2J1aWxkZmlsZXMvYnVpbGRSZW1vdGVFeHRyYUpBUi54bWwmcXVvdDsgdHlwZT0mcXVvdDsxJnF1b3Q7LyZndDsmIzEwOyZsdDtpdGVtIGZhY3RvcnlJRD0mcXVvdDtvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5tb2RlbC5SZXNvdXJjZUZhY3RvcnkmcXVvdDsgcGF0aD0mcXVvdDsvb3JnLmVjbGlwc2UuYW50LnVpL0NvbW1vbiBBbnQgU3VwcG9ydCZxdW90OyB0eXBlPSZxdW90OzImcXVvdDsvJmd0OyYjMTA7Jmx0O2l0ZW0gZmFjdG9yeUlEPSZxdW90O29yZy5lY2xpcHNlLnVpLmludGVybmFsLm1vZGVsLlJlc291cmNlRmFjdG9yeSZxdW90OyBwYXRoPSZxdW90Oy9vcmcuZWNsaXBzZS5hbnQudWkvUmVtb3RlIEFudCBTdXBwb3J0JnF1b3Q7IHR5cGU9JnF1b3Q7MiZxdW90Oy8mZ3Q7JiMxMDsmbHQ7L2xhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nU2V0Jmd0OyYjMTA7fSIvPgorPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmFudC51aS5BVFRSX0FOVF9DTEVBTl9UQVJHRVRTIiB2YWx1ZT0iY2xlYW4sIi8+Cis8c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5BVFRSX1JFRlJFU0hfU0NPUEUiIHZhbHVlPSIke3Byb2plY3R9Ii8+Cis8c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5BVFRSX0xPQ0FUSU9OIiB2YWx1ZT0iJHt3b3Jrc3BhY2VfbG9jOi9vcmcuZWNsaXBzZS5hbnQudWkvYnVpbGRmaWxlcy9idWlsZFJlbW90ZUV4dHJhSkFSLnhtbH0iLz4KKzxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcudWkuQVRUUl9SVU5fSU5fQkFDS0dST1VORCIgdmFsdWU9ImZhbHNlIi8+Cis8L2xhdW5jaENvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpLy5wcm9qZWN0IGIvYW50L29yZy5lY2xpcHNlLmFudC51aS8ucHJvamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGE1OGY2Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS8ucHJvamVjdApAQCAtMCwwICsxLDUzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHByb2plY3REZXNjcmlwdGlvbj4KKwk8bmFtZT5vcmcuZWNsaXBzZS5hbnQudWk8L25hbWU+CisJPGNvbW1lbnQ+PC9jb21tZW50PgorCTxwcm9qZWN0cz4KKwk8L3Byb2plY3RzPgorCTxidWlsZFNwZWM+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLkV4dGVybmFsVG9vbEJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJCTxkaWN0aW9uYXJ5PgorCQkJCQk8a2V5PkxhdW5jaENvbmZpZ0hhbmRsZTwva2V5PgorCQkJCQk8dmFsdWU+Jmx0O3Byb2plY3QmZ3Q7Ly5leHRlcm5hbFRvb2xCdWlsZGVycy9CdWlsZCBBbnQgUnVubmVyIFN1cHBvcnQgSkFSLmxhdW5jaDwvdmFsdWU+CisJCQkJPC9kaWN0aW9uYXJ5PgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLkV4dGVybmFsVG9vbEJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJCTxkaWN0aW9uYXJ5PgorCQkJCQk8a2V5PkxhdW5jaENvbmZpZ0hhbmRsZTwva2V5PgorCQkJCQk8dmFsdWU+Jmx0O3Byb2plY3QmZ3Q7Ly5leHRlcm5hbFRvb2xCdWlsZGVycy9CdWlsZCBSZW1vdGUgQW50IEpBUi5sYXVuY2g8L3ZhbHVlPgorCQkJCTwvZGljdGlvbmFyeT4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5hcGkudG9vbHMuYXBpQW5hbHlzaXNCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwk8L2J1aWxkU3BlYz4KKwk8bmF0dXJlcz4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UudGVhbS5jdnMuY29yZS5jdnNuYXR1cmU8L25hdHVyZT4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLmFwaS50b29scy5hcGlBbmFseXNpc05hdHVyZTwvbmF0dXJlPgorCTwvbmF0dXJlcz4KKzwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTQ0MTZmCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMKQEAgLTAsMCArMSwzIEBACisjRnJpIEphbiAyMSAxOTo0MDo1MiBHTVQtMDg6MDAgMjAwNQ0KK2VjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xDQorc2VsZmhvc3RpbmcuYmluRXhjbHVkZXM9L29yZy5lY2xpcHNlLmFudC51aS9hbnRfcnVubmVyX3N1cHBvcnRfYmluLC9vcmcuZWNsaXBzZS5hbnQudWkvY29tbW9uX2FudF9zdXBwb3J0X2Jpbiwvb3JnLmVjbGlwc2UuYW50LnVpL3JlbW90ZV9zdXBwb3J0X2Jpbg0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvciBDb250ZW50IEFzc2lzdCBEZXYvWERPQ3Rhc2tzLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvciBDb250ZW50IEFzc2lzdCBEZXYvWERPQ3Rhc2tzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODIwNzVlCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yIENvbnRlbnQgQXNzaXN0IERldi9YRE9DdGFza3MueG1sCkBAIC0wLDAgKzEsMTg2ODggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8dGFza3M+Cis8dGFzayBuYW1lPSJhbnQiIGNhdGVnb3J5PSJjb250cm9sIgorICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5BbnQiCisgICAgICA+CisKKyAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0J1aWxkIGEgc3ViLXByb2plY3QuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgPGRlc2NyaXB0aW9uPgorICAgIDwhW0NEQVRBW0J1aWxkIGEgc3ViLXByb2plY3QuCisKKyAgPHByZT4KKyAgJmx0O3RhcmdldCBuYW1lPSZxdW90O2ZvbyZxdW90OyBkZXBlbmRzPSZxdW90O2luaXQmcXVvdDsmZ3Q7CisgICAgJmx0O2FudCBhbnRmaWxlPSZxdW90O2J1aWxkLnhtbCZxdW90OyB0YXJnZXQ9JnF1b3Q7YmFyJnF1b3Q7ICZndDsKKyAgICAgICZsdDtwcm9wZXJ0eSBuYW1lPSZxdW90O3Byb3BlcnR5MSZxdW90OyB2YWx1ZT0mcXVvdDthYWFhYSZxdW90OyAvJmd0OworICAgICAgJmx0O3Byb3BlcnR5IG5hbWU9JnF1b3Q7Zm9vJnF1b3Q7IHZhbHVlPSZxdW90O2JheiZxdW90OyAvJmd0OworICAgICZsdDsvYW50Jmd0OzwvU1BBTj4KKyAgJmx0Oy90YXJnZXQmZ3Q7PC9TUEFOPgorCisgICZsdDt0YXJnZXQgbmFtZT0mcXVvdDtiYXImcXVvdDsgZGVwZW5kcz0mcXVvdDtpbml0JnF1b3Q7Jmd0OworICAgICZsdDtlY2hvIG1lc3NhZ2U9JnF1b3Q7cHJvcCBpcyAke3Byb3BlcnR5MX0gJHtmb299JnF1b3Q7IC8mZ3Q7CisgICZsdDsvdGFyZ2V0Jmd0OworIDwvcHJlPl1dPgorICA8L2Rlc2NyaXB0aW9uPgorCisgIDxzdHJ1Y3R1cmU+CisKKyAgICA8YXR0cmlidXRlcz4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYW50ZmlsZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBidWlsZGZpbGUgdG8gdXNlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBUaGUgYnVpbGRmaWxlIHRvIHVzZS4KKyBEZWZhdWx0cyB0byAiYnVpbGQueG1sIi4gVGhpcyBmaWxlIGlzIGV4cGVjdGVkIHRvIGJlIGEgZmlsZW5hbWUgcmVsYXRpdmUKKyB0byB0aGUgZGlyIGF0dHJpYnV0ZSBnaXZlbi4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkaXIiIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgZGlyZWN0b3J5IHRvIHVzZSBhcyBhIGJhc2UgZGlyZWN0b3J5IGZvciB0aGUgbmV3IEFudCBwcm9qZWN0Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBUaGUgZGlyZWN0b3J5IHRvIHVzZSBhcyBhIGJhc2UgZGlyZWN0b3J5IGZvciB0aGUgbmV3IEFudCBwcm9qZWN0LgorIERlZmF1bHRzIHRvIHRoZSBjdXJyZW50IHByb2plY3QncyBiYXNlZGlyLCB1bmxlc3MgaW5oZXJpdGFsbAorIGhhcyBiZWVuIHNldCB0byBmYWxzZSwgaW4gd2hpY2ggY2FzZSBpdCBkb2Vzbid0IGhhdmUgYSBkZWZhdWx0CisgdmFsdWUuIFRoaXMgd2lsbCBvdmVycmlkZSB0aGUgYmFzZWRpciBzZXR0aW5nIG9mIHRoZSBjYWxsZWQgcHJvamVjdC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpbmhlcml0YWxsIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIHBhc3MgYWxsIHByb3BlcnRpZXMgdG8gdGhlIG5ldyBBbnQgcHJvamVjdC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgSWYgdHJ1ZSwgcGFzcyBhbGwgcHJvcGVydGllcyB0byB0aGUgbmV3IEFudCBwcm9qZWN0LgorIERlZmF1bHRzIHRvIHRydWUuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaW5oZXJpdHJlZnMiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgdHJ1ZSwgcGFzcyBhbGwgcmVmZXJlbmNlcyB0byB0aGUgbmV3IEFudCBwcm9qZWN0Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBJZiB0cnVlLCBwYXNzIGFsbCByZWZlcmVuY2VzIHRvIHRoZSBuZXcgQW50IHByb2plY3QuCisgRGVmYXVsdHMgdG8gZmFsc2UuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ib3V0cHV0IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRmlsZW5hbWUgdG8gd3JpdGUgdGhlIG91dHB1dCB0by5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgRmlsZW5hbWUgdG8gd3JpdGUgdGhlIG91dHB1dCB0by4KKyBUaGlzIGlzIHJlbGF0aXZlIHRvIHRoZSB2YWx1ZSBvZiB0aGUgZGlyIGF0dHJpYnV0ZQorIGlmIGl0IGhhcyBiZWVuIHNldCBvciB0byB0aGUgYmFzZSBkaXJlY3Rvcnkgb2YgdGhlCisgY3VycmVudCBwcm9qZWN0IG90aGVyd2lzZS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgdGFyZ2V0IG9mIHRoZSBuZXcgQW50IHByb2plY3QgdG8gZXhlY3V0ZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgVGhlIHRhcmdldCBvZiB0aGUgbmV3IEFudCBwcm9qZWN0IHRvIGV4ZWN1dGUuCisgRGVmYXVsdHMgdG8gdGhlIG5ldyBwcm9qZWN0J3MgZGVmYXVsdCB0YXJnZXQuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICA8L2F0dHJpYnV0ZXM+CisKKyAgICA8ZWxlbWVudHM+CisgICAgICA8ZWxlbWVudCBuYW1lPSJyZWZlcmVuY2UiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkFudC5SZWZlcmVuY2UiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IiIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1JlZmVyZW5jZSBlbGVtZW50IGlkZW50aWZ5aW5nIGEgZGF0YSB0eXBlIHRvIGNhcnJ5Cisgb3ZlciB0byB0aGUgbmV3IHByb2plY3QuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW1JlZmVyZW5jZSBlbGVtZW50IGlkZW50aWZ5aW5nIGEgZGF0YSB0eXBlIHRvIGNhcnJ5Cisgb3ZlciB0byB0aGUgbmV3IHByb2plY3QuXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICAgIDxlbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5Qcm9wZXJ0eSIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0ic2VlICZsdDtwcm9wZXJ0eSZndDsiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtQcm9wZXJ0eSB0byBwYXNzIHRvIHRoZSBuZXcgcHJvamVjdC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbUHJvcGVydHkgdG8gcGFzcyB0byB0aGUgbmV3IHByb2plY3QuCisgVGhlIHByb3BlcnR5IGlzIHBhc3NlZCBhcyBhICd1c2VyIHByb3BlcnR5J11dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgPC9lbGVtZW50cz4KKworICA8L3N0cnVjdHVyZT4KKworPC90YXNrPgorCisKKzx0YXNrIG5hbWU9ImFudGNhbGwiIGNhdGVnb3J5PSJjb250cm9sIgorICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5DYWxsVGFyZ2V0IgorICAgICAgPgorCisgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDYWxsIGFub3RoZXIgdGFyZ2V0IGluIHRoZSBzYW1lIHByb2plY3QuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgPGRlc2NyaXB0aW9uPgorICAgIDwhW0NEQVRBW0NhbGwgYW5vdGhlciB0YXJnZXQgaW4gdGhlIHNhbWUgcHJvamVjdC4KKworICA8cHJlPgorICAgICZsdDt0YXJnZXQgbmFtZT0iZm9vIiZndDsKKyAgICAgICZsdDthbnRjYWxsIHRhcmdldD0iYmFyIiZndDsKKyAgICAgICAgJmx0O3BhcmFtIG5hbWU9InByb3BlcnR5MSIgdmFsdWU9ImFhYWFhIiAvJmd0OworICAgICAgICAmbHQ7cGFyYW0gbmFtZT0iZm9vIiB2YWx1ZT0iYmF6IiAvJmd0OworICAgICAgICZsdDsvYW50Y2FsbCZndDsKKyAgICAmbHQ7L3RhcmdldCZndDsKKworICAgICZsdDt0YXJnZXQgbmFtZT0iYmFyIiBkZXBlbmRzPSJpbml0IiZndDsKKyAgICAgICZsdDtlY2hvIG1lc3NhZ2U9InByb3AgaXMgJHtwcm9wZXJ0eTF9ICR7Zm9vfSIgLyZndDsKKyAgICAmbHQ7L3RhcmdldCZndDsKKyA8L3ByZT4KKworIDxwPlRoaXMgb25seSB3b3JrcyBhcyBleHBlY3RlZCBpZiBuZWl0aGVyIHByb3BlcnR5MSBub3IgZm9vIGFyZQorIGRlZmluZWQgaW4gdGhlIHByb2plY3QgaXRzZWxmLl1dPgorICA8L2Rlc2NyaXB0aW9uPgorCisgIDxzdHJ1Y3R1cmU+CisKKyAgICA8YXR0cmlidXRlcz4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaW5oZXJpdGFsbCIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlLCBwYXNzIGFsbCBwcm9wZXJ0aWVzIHRvIHRoZSBuZXcgQW50IHByb2plY3QuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIElmIHRydWUsIHBhc3MgYWxsIHByb3BlcnRpZXMgdG8gdGhlIG5ldyBBbnQgcHJvamVjdC4KKyBEZWZhdWx0cyB0byB0cnVlLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImluaGVyaXRyZWZzIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIHBhc3MgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIG5ldyBBbnQgcHJvamVjdC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgSWYgdHJ1ZSwgcGFzcyBhbGwgcmVmZXJlbmNlcyB0byB0aGUgbmV3IEFudCBwcm9qZWN0LgorIERlZmF1bHRzIHRvIGZhbHNlCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idGFyZ2V0IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGFyZ2V0IHRvIGV4ZWN1dGUsIHJlcXVpcmVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBUYXJnZXQgdG8gZXhlY3V0ZSwgcmVxdWlyZWQuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICA8L2F0dHJpYnV0ZXM+CisKKyAgICA8ZWxlbWVudHM+CisgICAgICA8ZWxlbWVudCBuYW1lPSJyZWZlcmVuY2UiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkFudC5SZWZlcmVuY2UiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IiIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1JlZmVyZW5jZSBlbGVtZW50IGlkZW50aWZ5aW5nIGEgZGF0YSB0eXBlIHRvIGNhcnJ5Cisgb3ZlciB0byB0aGUgaW52b2tlZCB0YXJnZXQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW1JlZmVyZW5jZSBlbGVtZW50IGlkZW50aWZ5aW5nIGEgZGF0YSB0eXBlIHRvIGNhcnJ5Cisgb3ZlciB0byB0aGUgaW52b2tlZCB0YXJnZXQuXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICAgIDxlbGVtZW50IG5hbWU9InBhcmFtIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5Qcm9wZXJ0eSIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0ic2VlICZsdDtwcm9wZXJ0eSZndDsiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtQcm9wZXJ0eSB0byBwYXNzIHRvIHRoZSBpbnZva2VkIHRhcmdldC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbUHJvcGVydHkgdG8gcGFzcyB0byB0aGUgaW52b2tlZCB0YXJnZXQuXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICA8L2VsZW1lbnRzPgorCisgIDwvc3RydWN0dXJlPgorCis8L3Rhc2s+CisKKworPHRhc2sgbmFtZT0iYW50bHIiIGNhdGVnb3J5PSJvdGhlciIKKyAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuQU5UTFIiCisgICAgICA+CisKKyAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0ludm9rZXMgdGhlIEFOVExSIFRyYW5zbGF0b3IgZ2VuZXJhdG9yIG9uIGEgZ3JhbW1hciBmaWxlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgIDxkZXNjcmlwdGlvbj4KKyAgICA8IVtDREFUQVtJbnZva2VzIHRoZSBBTlRMUiBUcmFuc2xhdG9yIGdlbmVyYXRvciBvbiBhIGdyYW1tYXIgZmlsZS5dXT4KKyAgPC9kZXNjcmlwdGlvbj4KKworICA8c3RydWN0dXJlPgorCisgICAgPGF0dHJpYnV0ZXM+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlYnVnIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0ZsYWcgdG8gZW5hYmxlIFBhcnNlVmlldyBkZWJ1Z2dpbmcuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldHMgYSBmbGFnIHRvIGVuYWJsZSBQYXJzZVZpZXcgZGVidWdnaW5nCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGlhZ25vc3RpYyIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtGbGFnIHRvIGVtaXQgZGlhZ25vc3RpYyB0ZXh0Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXRzIGEgZmxhZyB0byBlbWl0IGRpYWdub3N0aWMgdGV4dAorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImRpciIgdHlwZT0iamF2YS5pby5GaWxlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSB3b3JraW5nIGRpcmVjdG9yeSBvZiB0aGUgcHJvY2Vzcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgVGhlIHdvcmtpbmcgZGlyZWN0b3J5IG9mIHRoZSBwcm9jZXNzCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZ2xpYiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NldHMgYW4gb3B0aW9uYWwgc3VwZXIgZ3JhbW1hciBmaWxlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXRzIGFuIG9wdGlvbmFsIHN1cGVyIGdyYW1tYXIgZmlsZS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJodG1sIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIGVtaXQgaHRtbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgSWYgdHJ1ZSwgZW1pdCBodG1sCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ib3V0cHV0ZGlyZWN0b3J5IiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGRpcmVjdG9yeSB0byB3cml0ZSB0aGUgZ2VuZXJhdGVkIGZpbGVzIHRvLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBUaGUgZGlyZWN0b3J5IHRvIHdyaXRlIHRoZSBnZW5lcmF0ZWQgZmlsZXMgdG8uCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idGFyZ2V0IiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGdyYW1tYXIgZmlsZSB0byBwcm9jZXNzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBUaGUgZ3JhbW1hciBmaWxlIHRvIHByb2Nlc3MuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHJhY2UiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgdHJ1ZSwgZW5hYmxlcyBhbGwgdHJhY2luZy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgSWYgdHJ1ZSwgZW5hYmxlcyBhbGwgdHJhY2luZy4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0cmFjZWxleGVyIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIGVuYWJsZXMgbGV4ZXIgdHJhY2luZy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgSWYgdHJ1ZSwgZW5hYmxlcyBsZXhlciB0cmFjaW5nLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InRyYWNlcGFyc2VyIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIGVuYWJsZXMgcGFyc2VyIHRyYWNpbmcuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIElmIHRydWUsIGVuYWJsZXMgcGFyc2VyIHRyYWNpbmcuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHJhY2V0cmVld2Fsa2VyIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0ZsYWcgdG8gYWxsb3cgdGhlIHVzZXIgdG8gZW5hYmxlIHRyZWUgd2Fsa2VyIHRyYWNpbmcuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldHMgYSBmbGFnIHRvIGFsbG93IHRoZSB1c2VyIHRvIGVuYWJsZSB0cmVlIHdhbGtlciB0cmFjaW5nCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICA8L2F0dHJpYnV0ZXM+CisKKyAgICA8ZWxlbWVudHM+CisgICAgICA8ZWxlbWVudCBuYW1lPSJjbGFzc3BhdGgiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IlBhdGgiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIGEgY2xhc3NwYXRoIHRvIGJlIHNldAorIGJlY2F1c2UgYSBkaXJlY3RvcnkgbWlnaHQgYmUgZ2l2ZW4gZm9yIEFudGxyIGRlYnVnLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtBZGRzIGEgY2xhc3NwYXRoIHRvIGJlIHNldAorIGJlY2F1c2UgYSBkaXJlY3RvcnkgbWlnaHQgYmUgZ2l2ZW4gZm9yIEFudGxyIGRlYnVnLl1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgICA8ZWxlbWVudCBuYW1lPSJqdm1hcmciIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkNvbW1hbmRsaW5lLkFyZ3VtZW50IgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIGEgbmV3IEpWTSBhcmd1bWVudC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbQWRkcyBhIG5ldyBKVk0gYXJndW1lbnQuXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICA8L2VsZW1lbnRzPgorCisgIDwvc3RydWN0dXJlPgorCis8L3Rhc2s+CisKKworPHRhc2sgbmFtZT0iYW50c3RydWN0dXJlIiBjYXRlZ29yeT0ieG1sIgorICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5BbnRTdHJ1Y3R1cmUiCisgICAgICA+CisKKyAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NyZWF0ZXMgYSBwYXJ0aWFsIERURCBmb3IgQW50IGZyb20gdGhlIGN1cnJlbnRseSBrbm93biB0YXNrcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICA8ZGVzY3JpcHRpb24+CisgICAgPCFbQ0RBVEFbQ3JlYXRlcyBhIHBhcnRpYWwgRFREIGZvciBBbnQgZnJvbSB0aGUgY3VycmVudGx5IGtub3duIHRhc2tzLl1dPgorICA8L2Rlc2NyaXB0aW9uPgorCisgIDxzdHJ1Y3R1cmU+CisKKyAgICA8YXR0cmlidXRlcz4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ib3V0cHV0IiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIG91dHB1dCBmaWxlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBUaGUgb3V0cHV0IGZpbGUuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICA8L2F0dHJpYnV0ZXM+CisKKyAgICA8ZWxlbWVudHM+CisgICAgPC9lbGVtZW50cz4KKworICA8L3N0cnVjdHVyZT4KKworPC90YXNrPgorCisKKzx0YXNrIG5hbWU9ImFwcGx5IiBjYXRlZ29yeT0iY29udHJvbCIKKyAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRXhlY3V0ZU9uIgorICAgICAgPgorCisgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtFeGVjdXRlcyBhIGdpdmVuIGNvbW1hbmQsIHN1cHBseWluZyBhIHNldCBvZiBmaWxlcyBhcyBhcmd1bWVudHMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgPGRlc2NyaXB0aW9uPgorICAgIDwhW0NEQVRBW0V4ZWN1dGVzIGEgZ2l2ZW4gY29tbWFuZCwgc3VwcGx5aW5nIGEgc2V0IG9mIGZpbGVzIGFzIGFyZ3VtZW50cy5dXT4KKyAgPC9kZXNjcmlwdGlvbj4KKworICA8c3RydWN0dXJlPgorCisgICAgPGF0dHJpYnV0ZXM+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImFwcGVuZCIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtXaGV0aGVyIG91dHB1dCBzaG91bGQgYmUgYXBwZW5kZWQgdG8gb3Igb3ZlcndyaXRlIGFuIGV4aXN0aW5nIGZpbGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFdoZXRoZXIgb3V0cHV0IHNob3VsZCBiZSBhcHBlbmRlZCB0byBvciBvdmVyd3JpdGUgYW4gZXhpc3RpbmcgZmlsZS4KKyBEZWZhdWx0cyB0byBmYWxzZS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXN0IiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGRpcmVjdG9yeSB3aGVyZSB0YXJnZXQgZmlsZXMgYXJlIHRvIGJlIHBsYWNlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgVGhlIGRpcmVjdG9yeSB3aGVyZSB0YXJnZXQgZmlsZXMgYXJlIHRvIGJlIHBsYWNlZC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkaXIiIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgd29ya2luZyBkaXJlY3Rvcnkgb2YgdGhlIHByb2Nlc3MuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRoZSB3b3JraW5nIGRpcmVjdG9yeSBvZiB0aGUgcHJvY2Vzcy4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJleGVjdXRhYmxlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGNvbW1hbmQgdG8gZXhlY3V0ZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgVGhlIGNvbW1hbmQgdG8gZXhlY3V0ZS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmYWlsaWZleGVjdXRpb25mYWlscyIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTdG9wIHRoZSBidWlsZCBpZiBwcm9ncmFtIGNhbm5vdCBiZSBzdGFydGVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTdG9wIHRoZSBidWlsZCBpZiBwcm9ncmFtIGNhbm5vdCBiZSBzdGFydGVkLiBEZWZhdWx0cyB0byB0cnVlLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImZhaWxvbmVycm9yIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0ZhaWwgaWYgdGhlIGNvbW1hbmQgZXhpdHMgd2l0aCBhIG5vbi16ZXJvIHJldHVybiBjb2RlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBGYWlsIGlmIHRoZSBjb21tYW5kIGV4aXRzIHdpdGggYSBub24temVybyByZXR1cm4gY29kZS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuZXdlbnZpcm9ubWVudCIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtEbyBub3QgcHJvcGFnYXRlIG9sZCBlbnZpcm9ubWVudCB3aGVuIG5ldyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIHNwZWNpZmllZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgRG8gbm90IHByb3BhZ2F0ZSBvbGQgZW52aXJvbm1lbnQgd2hlbiBuZXcgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBzcGVjaWZpZWQuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ib3MiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtMaXN0IG9mIG9wZXJhdGluZyBzeXN0ZW1zIG9uIHdoaWNoIHRoZSBjb21tYW5kIG1heSBiZSBleGVjdXRlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgTGlzdCBvZiBvcGVyYXRpbmcgc3lzdGVtcyBvbiB3aGljaCB0aGUgY29tbWFuZCBtYXkgYmUgZXhlY3V0ZWQuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ib3V0cHV0IiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRmlsZSB0aGUgb3V0cHV0IG9mIHRoZSBwcm9jZXNzIGlzIHJlZGlyZWN0ZWQgdG8uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIEZpbGUgdGhlIG91dHB1dCBvZiB0aGUgcHJvY2VzcyBpcyByZWRpcmVjdGVkIHRvLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9Im91dHB1dHByb3BlcnR5IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbUHJvcGVydHkgbmFtZSB3aG9zZSB2YWx1ZSBzaG91bGQgYmUgc2V0IHRvIHRoZSBvdXRwdXQgb2YKKyB0aGUgcHJvY2Vzcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgUHJvcGVydHkgbmFtZSB3aG9zZSB2YWx1ZSBzaG91bGQgYmUgc2V0IHRvIHRoZSBvdXRwdXQgb2YKKyB0aGUgcHJvY2Vzcy4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwYXJhbGxlbCIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlLCBydW4gdGhlIGNvbW1hbmQgb25seSBvbmNlLCBhcHBlbmRpbmcgYWxsIGZpbGVzIGFzIGFyZ3VtZW50cy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgSWYgdHJ1ZSwgcnVuIHRoZSBjb21tYW5kIG9ubHkgb25jZSwgYXBwZW5kaW5nIGFsbCBmaWxlcyBhcyBhcmd1bWVudHMuCisgSWYgZmFsc2UsIGNvbW1hbmQgd2lsbCBiZSBleGVjdXRlZCBvbmNlIGZvciBldmVyeSBmaWxlLiBEZWZhdWx0cyB0byBmYWxzZS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJyZWxhdGl2ZSIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtXaGV0aGVyIHRoZSBmaWxlbmFtZXMgc2hvdWxkIGJlIHBhc3NlZCBvbiB0aGUgY29tbWFuZCBsaW5lIGFzCisgYWJzb2x1dGUgb3IgcmVsYXRpdmUgcGF0aG5hbWVzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBXaGV0aGVyIHRoZSBmaWxlbmFtZXMgc2hvdWxkIGJlIHBhc3NlZCBvbiB0aGUgY29tbWFuZCBsaW5lIGFzCisgYWJzb2x1dGUgb3IgcmVsYXRpdmUgcGF0aG5hbWVzLiBQYXRocyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJhc2UKKyBkaXJlY3Rvcnkgb2YgdGhlIGNvcnJlc3BvbmRpbmcgZmlsZXNldCBmb3Igc291cmNlIGZpbGVzIG9yIHRoZQorIGRlc3QgYXR0cmlidXRlIGZvciB0YXJnZXQgZmlsZXMuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icmVzdWx0cHJvcGVydHkiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgbmFtZSBvZiBhIHByb3BlcnR5IGluIHdoaWNoIHRoZSByZXR1cm4gY29kZSBvZiB0aGUKKyBjb21tYW5kIHNob3VsZCBiZSBzdG9yZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRoZSBuYW1lIG9mIGEgcHJvcGVydHkgaW4gd2hpY2ggdGhlIHJldHVybiBjb2RlIG9mIHRoZQorIGNvbW1hbmQgc2hvdWxkIGJlIHN0b3JlZC4gT25seSBvZiBpbnRlcmVzdCBpZiBmYWlsb25lcnJvcj1mYWxzZS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJza2lwZW1wdHlmaWxlc2V0cyIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiBubyBzb3VyY2UgZmlsZXMgaGF2ZSBiZWVuIGZvdW5kIG9yIGFyZSBuZXdlciB0aGFuIHRoZWlyCisgY29ycmVzcG9uZGluZyB0YXJnZXQgZmlsZXMsIGRvIG5vdCBydW4gdGhlIGNvbW1hbmQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIElmIG5vIHNvdXJjZSBmaWxlcyBoYXZlIGJlZW4gZm91bmQgb3IgYXJlIG5ld2VyIHRoYW4gdGhlaXIKKyBjb3JyZXNwb25kaW5nIHRhcmdldCBmaWxlcywgZG8gbm90IHJ1biB0aGUgY29tbWFuZC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5FeGVjdXRlT24uRmlsZURpckJvdGgiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iJnF1b3Q7ZmlsZSZxdW90OywgJnF1b3Q7ZGlyJnF1b3Q7LCAmcXVvdDtib3RoJnF1b3Q7IiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtXaGV0aGVyIHRoZSBjb21tYW5kIHdvcmtzIG9ubHkgb24gZmlsZXMsIGRpcmVjdG9yaWVzIG9yIGJvdGg/Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBXaGV0aGVyIHRoZSBjb21tYW5kIHdvcmtzIG9ubHkgb24gZmlsZXMsIGRpcmVjdG9yaWVzIG9yIGJvdGg/CisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idm1sYXVuY2hlciIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlLCBsYXVuY2ggbmV3IHByb2Nlc3Mgd2l0aCBWTSwgb3RoZXJ3aXNlIHVzZSB0aGUgT1MncyBzaGVsbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgSWYgdHJ1ZSwgbGF1bmNoIG5ldyBwcm9jZXNzIHdpdGggVk0sIG90aGVyd2lzZSB1c2UgdGhlIE9TJ3Mgc2hlbGwuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICA8L2F0dHJpYnV0ZXM+CisKKyAgICA8ZWxlbWVudHM+CisgICAgICA8ZWxlbWVudCBuYW1lPSJlbnYiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkVudmlyb25tZW50LlZhcmlhYmxlIgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGQgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gdGhlIGxhdW5jaGVkIHByb2Nlc3MuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0FkZCBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byB0aGUgbGF1bmNoZWQgcHJvY2Vzcy5dXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgICAgPGVsZW1lbnQgbmFtZT0iZmlsZXNldCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldCIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZXNldCIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NvdXJjZSBmaWxlcyB0byBvcGVyYXRlIHVwb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW1NvdXJjZSBmaWxlcyB0byBvcGVyYXRlIHVwb24uXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICAgIDxlbGVtZW50IG5hbWU9ImFyZyIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQ29tbWFuZGxpbmUuQXJndW1lbnQiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IiIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgYSBjb21tYW5kLWxpbmUgYXJndW1lbnQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0FkZHMgYSBjb21tYW5kLWxpbmUgYXJndW1lbnQuXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICAgIDxlbGVtZW50IG5hbWU9Im1hcHBlciIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuTWFwcGVyIgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJNYXBwZXIiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtNYXBwZXIgdG8gdXNlIGZvciBtYXBwaW5nIHNvdXJjZSBmaWxlcyB0byB0YXJnZXQgZmlsZXMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW01hcHBlciB0byB1c2UgZm9yIG1hcHBpbmcgc291cmNlIGZpbGVzIHRvIHRhcmdldCBmaWxlcy5dXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgICAgPGVsZW1lbnQgbmFtZT0ic3JjZmlsZSIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQ29tbWFuZGxpbmUuTWFya2VyIgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtNYXJrZXIgdGhhdCBpbmRpY2F0ZXMgd2hlcmUgdGhlIG5hbWUgb2YgdGhlIHNvdXJjZSBmaWxlIHNob3VsZAorIGJlIHB1dCBvbiB0aGUgY29tbWFuZCBsaW5lLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtNYXJrZXIgdGhhdCBpbmRpY2F0ZXMgd2hlcmUgdGhlIG5hbWUgb2YgdGhlIHNvdXJjZSBmaWxlIHNob3VsZAorIGJlIHB1dCBvbiB0aGUgY29tbWFuZCBsaW5lLl1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgICA8ZWxlbWVudCBuYW1lPSJ0YXJnZXRmaWxlIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Db21tYW5kbGluZS5NYXJrZXIiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IiIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW01hcmtlciB0aGF0IGluZGljYXRlcyB3aGVyZSB0aGUgbmFtZSBvZiB0aGUgdGFyZ2V0IGZpbGUgc2hvdWxkCisgYmUgcHV0IG9uIHRoZSBjb21tYW5kIGxpbmUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW01hcmtlciB0aGF0IGluZGljYXRlcyB3aGVyZSB0aGUgbmFtZSBvZiB0aGUgdGFyZ2V0IGZpbGUgc2hvdWxkCisgYmUgcHV0IG9uIHRoZSBjb21tYW5kIGxpbmUuXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICA8L2VsZW1lbnRzPgorCisgIDwvc3RydWN0dXJlPgorCis8L3Rhc2s+CisKKworPHRhc2sgbmFtZT0iYXZhaWxhYmxlIiBjYXRlZ29yeT0iY29udHJvbCIKKyAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuQXZhaWxhYmxlIgorICAgICAgPgorCisgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtXaWxsIHNldCB0aGUgZ2l2ZW4gcHJvcGVydHkgaWYgdGhlIHJlcXVlc3RlZCByZXNvdXJjZSBpcyBhdmFpbGFibGUgYXQgcnVudGltZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICA8ZGVzY3JpcHRpb24+CisgICAgPCFbQ0RBVEFbV2lsbCBzZXQgdGhlIGdpdmVuIHByb3BlcnR5IGlmIHRoZSByZXF1ZXN0ZWQgcmVzb3VyY2UgaXMgYXZhaWxhYmxlIGF0IAorIHJ1bnRpbWUuIFRoaXMgdGFzayBtYXkgYWxzbyBiZSB1c2VkIGFzIGEgY29uZGl0aW9uIGJ5IHRoZSBjb25kaXRpb24gdGFzay5dXT4KKyAgPC9kZXNjcmlwdGlvbj4KKworICA8c3RydWN0dXJlPgorCisgICAgPGF0dHJpYnV0ZXM+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzbmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NsYXNzbmFtZSBvZiBhIGNsYXNzIHdoaWNoIG11c3QgYmUgYXZhaWxhYmxlIHRvIHNldCB0aGUgZ2l2ZW4gCisgcHJvcGVydHkuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCBhIGNsYXNzbmFtZSBvZiBhIGNsYXNzIHdoaWNoIG11c3QgYmUgYXZhaWxhYmxlIHRvIHNldCB0aGUgZ2l2ZW4gCisgcHJvcGVydHkuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NwYXRoIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlBhdGgiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NsYXNzcGF0aCB0byBiZSB1c2VkIHdoZW4gc2VhcmNoaW5nIGZvciBjbGFzc2VzIGFuZCByZXNvdXJjZXMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCB0aGUgY2xhc3NwYXRoIHRvIGJlIHVzZWQgd2hlbiBzZWFyY2hpbmcgZm9yIGNsYXNzZXMgYW5kIHJlc291cmNlcy4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc3BhdGhyZWYiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlZmVyZW5jZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJSZWZlcmVuY2UiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NsYXNzcGF0aCBieSByZWZlcmVuY2UuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCB0aGUgY2xhc3NwYXRoIGJ5IHJlZmVyZW5jZS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmaWxlIiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRmlsZSB3aGljaCBtdXN0IGJlIHByZXNlbnQgaW4gdGhlIGZpbGUgc3lzdGVtIHRvIHNldCB0aGUgZ2l2ZW4KKyBwcm9wZXJ0eS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBmaWxlIHdoaWNoIG11c3QgYmUgcHJlc2VudCBpbiB0aGUgZmlsZSBzeXN0ZW0gdG8gc2V0IHRoZSBnaXZlbgorIHByb3BlcnR5LgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImZpbGVwYXRoIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlBhdGgiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1BhdGggdG8gdXNlIHdoZW4gbG9va2luZyBmb3IgYSBmaWxlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIHBhdGggdG8gdXNlIHdoZW4gbG9va2luZyBmb3IgYSBmaWxlLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9Imlnbm9yZXN5c3RlbWNsYXNzZXMiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2V0IHdoZXRoZXIgdGhlIHNlYXJjaCBmb3IgY2xhc3NlcyBzaG91bGQgaWdub3JlIHRoZSBydW50aW1lIGNsYXNzZXMgYW5kCisganVzdCB1c2UgdGhlIGdpdmVuIGNsYXNzcGF0aC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHdoZXRoZXIgdGhlIHNlYXJjaCBmb3IgY2xhc3NlcyBzaG91bGQgaWdub3JlIHRoZSBydW50aW1lIGNsYXNzZXMgYW5kCisganVzdCB1c2UgdGhlIGdpdmVuIGNsYXNzcGF0aC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW05hbWUgb2YgdGhlIHByb3BlcnR5IHdoaWNoIHdpbGwgYmUgc2V0IGlmIHRoZSBwYXJ0aWN1bGFyIHJlc291cmNlCisgaXMgYXZhaWxhYmxlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHdoaWNoIHdpbGwgYmUgc2V0IGlmIHRoZSBwYXJ0aWN1bGFyIHJlc291cmNlCisgaXMgYXZhaWxhYmxlLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InJlc291cmNlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTmFtZSBvZiBhIEphdmEgcmVzb3VyY2Ugd2hpY2ggaXMgcmVxdWlyZWQgdG8gc2V0IHRoZSBwcm9wZXJ0eS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBuYW1lIG9mIGEgSmF2YSByZXNvdXJjZSB3aGljaCBpcyByZXF1aXJlZCB0byBzZXQgdGhlIHByb3BlcnR5LgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkF2YWlsYWJsZS5GaWxlRGlyIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IiZxdW90O2ZpbGUmcXVvdDssICZxdW90O2RpciZxdW90OyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2V0IHdoYXQgdHlwZSBvZiBmaWxlIGlzIHJlcXVpcmVkIC0gZWl0aGVyIGRpcmVjdG9yeSBvciBmaWxlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgd2hhdCB0eXBlIG9mIGZpbGUgaXMgcmVxdWlyZWQgLSBlaXRoZXIgZGlyZWN0b3J5IG9yIGZpbGUuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtWYWx1ZSB0byBiZSBnaXZlbiB0byB0aGUgcHJvcGVydHkgaWYgdGhlIGRlc2lyZWQgcmVzb3VyY2UgaXMKKyBhdmFpbGFibGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCB0aGUgdmFsdWUgdG8gYmUgZ2l2ZW4gdG8gdGhlIHByb3BlcnR5IGlmIHRoZSBkZXNpcmVkIHJlc291cmNlIGlzCisgYXZhaWxhYmxlLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgPC9hdHRyaWJ1dGVzPgorCisgICAgPGVsZW1lbnRzPgorICAgICAgPGVsZW1lbnQgbmFtZT0iY2xhc3NwYXRoIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoIgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJQYXRoIgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ2xhc3NwYXRoIHRvIGJlIHVzZWQgd2hlbiBzZWFyY2hpbmcgZm9yIGNsYXNzZXMgYW5kIHJlc291cmNlcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbQ2xhc3NwYXRoIHRvIGJlIHVzZWQgd2hlbiBzZWFyY2hpbmcgZm9yIGNsYXNzZXMgYW5kIHJlc291cmNlcy5dXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgICAgPGVsZW1lbnQgbmFtZT0iZmlsZXBhdGgiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IlBhdGgiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtQYXRoIHRvIHNlYXJjaCBmb3IgZmlsZSByZXNvdXJjZXMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW1BhdGggdG8gc2VhcmNoIGZvciBmaWxlIHJlc291cmNlcy5dXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgIDwvZWxlbWVudHM+CisKKyAgPC9zdHJ1Y3R1cmU+CisKKzwvdGFzaz4KKworCis8dGFzayBuYW1lPSJiYXNlbmFtZSIgY2F0ZWdvcnk9InByb3BlcnR5IgorICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5CYXNlbmFtZSIKKyAgICAgID4KKworICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2V0cyBhIHByb3BlcnR5IHRvIHRoZSBiYXNlIG5hbWUgb2YgYSBzcGVjaWZpZWQgZmlsZSwgb3B0aW9uYWxseSBtaW51cyBhIHN1ZmZpeC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICA8ZGVzY3JpcHRpb24+CisgICAgPCFbQ0RBVEFbU2V0cyBhIHByb3BlcnR5IHRvIHRoZSBiYXNlIG5hbWUgb2YgYSBzcGVjaWZpZWQgZmlsZSwgb3B0aW9uYWxseSBtaW51cyBhCisgc3VmZml4LgorCisgVGhpcyB0YXNrIGNhbiBhY2NlcHQgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOgorIDx1bD4KKyA8bGk+ZmlsZQorIDxsaT5wcm9wZXJ0eQorIDxsaT5zdWZmaXgKKyA8L3VsPgorIFRoZSA8Yj5maWxlPC9iPiBhbmQgPGI+cHJvcGVydHk8L2I+IGF0dHJpYnV0ZXMgYXJlIHJlcXVpcmVkLiBUaGUKKyA8Yj5zdWZmaXg8L2I+IGF0dHJpYnV0ZSBjYW4gYmUgc3BlY2lmaWVkIGVpdGhlciB3aXRoIG9yIHdpdGhvdXQKKyB0aGUgJnF1b3Q7LiZxdW90OywgYW5kIHRoZSByZXN1bHQgd2lsbCBiZSB0aGUgc2FtZSAoaWUuLCB0aGUKKyByZXR1cm5lZCBmaWxlIG5hbWUgd2lsbCBiZSBtaW51cyB0aGUgLnN1ZmZpeCkuCisgPHA+CisgV2hlbiB0aGlzIHRhc2sgZXhlY3V0ZXMsIGl0IHdpbGwgc2V0IHRoZSBzcGVjaWZpZWQgcHJvcGVydHkgdG8gdGhlCisgdmFsdWUgb2YgdGhlIGxhc3QgZWxlbWVudCBpbiB0aGUgc3BlY2lmaWVkIGZpbGUuIElmIGZpbGUgaXMgYQorIGRpcmVjdG9yeSwgdGhlIGJhc2VuYW1lIHdpbGwgYmUgdGhlIGxhc3QgZGlyZWN0b3J5IGVsZW1lbnQuIElmIGZpbGUKKyBpcyBhIGZ1bGwtcGF0aCBmaWxlbmFtZSwgdGhlIGJhc2VuYW1lIHdpbGwgYmUgdGhlIHNpbXBsZSBmaWxlIG5hbWUuCisgSWYgYSBzdWZmaXggaXMgc3BlY2lmaWVkLCBhbmQgdGhlIHNwZWNpZmllZCBmaWxlIGVuZHMgaW4gdGhhdCBzdWZmaXgsCisgdGhlIGJhc2VuYW1lIHdpbGwgYmUgdGhlIHNpbXBsZSBmaWxlIG5hbWUgd2l0aG91dCB0aGUgc3VmZml4Ll1dPgorICA8L2Rlc2NyaXB0aW9uPgorCisgIDxzdHJ1Y3R1cmU+CisKKyAgICA8YXR0cmlidXRlcz4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmlsZSIgdHlwZT0iamF2YS5pby5GaWxlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0ZpbGUgb3IgZGlyZWN0b3J5IHRvIGdldCBiYXNlIG5hbWUgZnJvbS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgRmlsZSBvciBkaXJlY3RvcnkgdG8gZ2V0IGJhc2UgbmFtZSBmcm9tLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InByb3BlcnR5IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbUHJvcGVydHkgdG8gc2V0IGJhc2UgbmFtZSB0by5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgUHJvcGVydHkgdG8gc2V0IGJhc2UgbmFtZSB0by4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzdWZmaXgiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtPcHRpb25hbCBzdWZmaXggdG8gcmVtb3ZlIGZyb20gYmFzZSBuYW1lLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBPcHRpb25hbCBzdWZmaXggdG8gcmVtb3ZlIGZyb20gYmFzZSBuYW1lLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgPC9hdHRyaWJ1dGVzPgorCisgICAgPGVsZW1lbnRzPgorICAgIDwvZWxlbWVudHM+CisKKyAgPC9zdHJ1Y3R1cmU+CisKKzwvdGFzaz4KKworCis8dGFzayBuYW1lPSJibGdlbmNsaWVudCIgY2F0ZWdvcnk9ImVqYiIKKyAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZWpiLkJvcmxhbmRHZW5lcmF0ZUNsaWVudCIKKyAgICAgID4KKworICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbR2VuZXJhdGVzIGEgQm9ybGFuZCBBcHBsaWNhdGlvbiBTZXJ2ZXIgNC41IGNsaWVudCBKQVIgdXNpbmcgYXMgaW5wdXQgdGhlIEVKQiBKQVIgZmlsZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICA8ZGVzY3JpcHRpb24+CisgICAgPCFbQ0RBVEFbR2VuZXJhdGVzIGEgQm9ybGFuZCBBcHBsaWNhdGlvbiBTZXJ2ZXIgNC41IGNsaWVudCBKQVIgdXNpbmcgYXMKKyBpbnB1dCB0aGUgRUpCIEpBUiBmaWxlLgorCisgVHdvIG1vZGUgYXJlIGF2YWlsYWJsZTogamF2YSBtb2RlIChkZWZhdWx0KSBhbmQgZm9yayBtb2RlLiBXaXRoIHRoZSBmb3JrIG1vZGUsCisgaXQgaXMgaW1wb3NzaWJsZSB0byBhZGQgY2xhc3NwYXRoIHRvIHRoZSBjb21tbWFuZCBsaW5lLl1dPgorICA8L2Rlc2NyaXB0aW9uPgorCisgIDxzdHJ1Y3R1cmU+CisKKyAgICA8YXR0cmlidXRlcz4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NwYXRoIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlBhdGgiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1BhdGggdG8gdXNlIGZvciBjbGFzc3BhdGguXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFBhdGggdG8gdXNlIGZvciBjbGFzc3BhdGguCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NwYXRocmVmIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZWZlcmVuY2UiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUmVmZXJlbmNlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtSZWZlcmVuY2UgdG8gZXhpc3RpbmcgcGF0aCwgdG8gdXNlIGFzIGEgY2xhc3NwYXRoLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBSZWZlcmVuY2UgdG8gZXhpc3RpbmcgcGF0aCwgdG8gdXNlIGFzIGEgY2xhc3NwYXRoLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsaWVudGphciIgdHlwZT0iamF2YS5pby5GaWxlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NsaWVudCBKQVIgZmlsZSBuYW1lLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBDbGllbnQgSkFSIGZpbGUgbmFtZS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZWJ1ZyIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlLCB0dXJuIG9uIHRoZSBkZWJ1ZyBtb2RlIGZvciBlYWNoIG9mIHRoZSBCb3JsYW5kIHRvb2xzIGxhdW5jaGVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBJZiB0cnVlLCB0dXJuIG9uIHRoZSBkZWJ1ZyBtb2RlIGZvciBlYWNoIG9mIHRoZSBCb3JsYW5kIHRvb2xzIGxhdW5jaGVkLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImVqYmphciIgdHlwZT0iamF2YS5pby5GaWxlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0VKQiBKQVIgZmlsZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgRUpCIEpBUiBmaWxlLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9Im1vZGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDb21tYW5kIGxhdW5jaGluZyBtb2RlOiBqYXZhIG9yIGZvcmsuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIENvbW1hbmQgbGF1bmNoaW5nIG1vZGU6IGphdmEgb3IgZm9yay4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJpbnQiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iaW50IiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtObyBkZXNjcmlwdGlvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICA8L2F0dHJpYnV0ZXM+CisKKyAgICA8ZWxlbWVudHM+CisgICAgICA8ZWxlbWVudCBuYW1lPSJjbGFzc3BhdGgiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IlBhdGgiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIHBhdGggdG8gdGhlIGNsYXNzcGF0aC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbQWRkcyBwYXRoIHRvIHRoZSBjbGFzc3BhdGguXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICA8L2VsZW1lbnRzPgorCisgIDwvc3RydWN0dXJlPgorCis8L3Rhc2s+CisKKworPHRhc2sgbmFtZT0iYnVpbGRudW1iZXIiIGNhdGVnb3J5PSJvdGhlciIKKyAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuQnVpbGROdW1iZXIiCisgICAgICA+CisKKyAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1JlYWQsIGluY3JlbWVudCwgYW5kIHdyaXRlIGEgYnVpbGQgbnVtYmVyIGluIGEgZmlsZSBJdCB3aWxsIGZpcnN0IGF0dGVtcHQgdG8gcmVhZCBhIGJ1aWxkIG51bWJlciBmcm9tIGEgZmlsZSwgdGhlbiBzZXQgdGhlIHByb3BlcnR5ICJidWlsZC5udW1iZXIiIHRvIHRoZSB2YWx1ZSB0aGF0IHdhcyByZWFkIGluIChvciAwIGlmIG5vIHN1Y2ggdmFsdWUpLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgIDxkZXNjcmlwdGlvbj4KKyAgICA8IVtDREFUQVtSZWFkLCBpbmNyZW1lbnQsIGFuZCB3cml0ZSBhIGJ1aWxkIG51bWJlciBpbiBhIGZpbGUKKyBJdCB3aWxsIGZpcnN0CisgYXR0ZW1wdCB0byByZWFkIGEgYnVpbGQgbnVtYmVyIGZyb20gYSBmaWxlLCB0aGVuIHNldCB0aGUgcHJvcGVydHkKKyAiYnVpbGQubnVtYmVyIiB0byB0aGUgdmFsdWUgdGhhdCB3YXMgcmVhZCBpbiAob3IgMCBpZiBubyBzdWNoIHZhbHVlKS4gVGhlbgorIGl0IHdpbGwgaW5jcmVtZW50IHRoZSBidWlsZCBudW1iZXIgYnkgb25lIGFuZCB3cml0ZSBpdCBiYWNrIG91dCBpbnRvIHRoZQorIGZpbGUuXV0+CisgIDwvZGVzY3JpcHRpb24+CisKKyAgPHN0cnVjdHVyZT4KKworICAgIDxhdHRyaWJ1dGVzPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmaWxlIiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGZpbGUgaW4gd2hpY2ggdGhlIGJ1aWxkIG51bWJlciBpcyBzdG9yZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRoZSBmaWxlIGluIHdoaWNoIHRoZSBidWlsZCBudW1iZXIgaXMgc3RvcmVkLiBEZWZhdWx0cyB0bworICJidWlsZC5udW1iZXIiIGlmIG5vdCBzcGVjaWZpZWQuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICA8L2F0dHJpYnV0ZXM+CisKKyAgICA8ZWxlbWVudHM+CisgICAgPC9lbGVtZW50cz4KKworICA8L3N0cnVjdHVyZT4KKworPC90YXNrPgorCisKKzx0YXNrIG5hbWU9ImJ1bnppcDIiIGNhdGVnb3J5PSJwYWNrYWdpbmciCisgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkJVbnppcDIiCisgICAgICA+CisKKyAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0V4cGFuZHMgYSBmaWxlIHRoYXQgaGFzIGJlZW4gY29tcHJlc3NlZCB3aXRoIHRoZSBCWklQMiBhbGdvcml0aG0uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgPGRlc2NyaXB0aW9uPgorICAgIDwhW0NEQVRBW0V4cGFuZHMgYSBmaWxlIHRoYXQgaGFzIGJlZW4gY29tcHJlc3NlZCB3aXRoIHRoZSBCWklQMgorIGFsZ29yaXRobS4gTm9ybWFsbHkgdXNlZCB0byBjb21wcmVzcyBub24tY29tcHJlc3NlZCBhcmNoaXZlcyBzdWNoCisgYXMgVEFSIGZpbGVzLl1dPgorICA8L2Rlc2NyaXB0aW9uPgorCisgIDxzdHJ1Y3R1cmU+CisKKyAgICA8YXR0cmlidXRlcz4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVzdCIgdHlwZT0iamF2YS5pby5GaWxlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBkZXN0aW5hdGlvbiBmaWxlIG9yIGRpcmVjdG9yeTsgb3B0aW9uYWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRoZSBkZXN0aW5hdGlvbiBmaWxlIG9yIGRpcmVjdG9yeTsgb3B0aW9uYWwuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3JjIiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGZpbGUgdG8gZXhwYW5kOyByZXF1aXJlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgVGhlIGZpbGUgdG8gZXhwYW5kOyByZXF1aXJlZC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgIDwvYXR0cmlidXRlcz4KKworICAgIDxlbGVtZW50cz4KKyAgICA8L2VsZW1lbnRzPgorCisgIDwvc3RydWN0dXJlPgorCis8L3Rhc2s+CisKKworPHRhc2sgbmFtZT0iYnppcDIiIGNhdGVnb3J5PSJwYWNrYWdpbmciCisgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkJaaXAyIgorICAgICAgPgorCisgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDb21wcmVzc2VzIGEgZmlsZSB3aXRoIHRoZSBCWklQMiBhbGdvcml0aG0uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgPGRlc2NyaXB0aW9uPgorICAgIDwhW0NEQVRBW0NvbXByZXNzZXMgYSBmaWxlIHdpdGggdGhlIEJaSVAyIGFsZ29yaXRobS4gTm9ybWFsbHkgdXNlZCB0byBjb21wcmVzcworIG5vbi1jb21wcmVzc2VkIGFyY2hpdmVzIHN1Y2ggYXMgVEFSIGZpbGVzLl1dPgorICA8L2Rlc2NyaXB0aW9uPgorCisgIDxzdHJ1Y3R1cmU+CisKKyAgICA8YXR0cmlidXRlcz4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3JjIiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGZpbGUgdG8gY29tcHJlc3M7IHJlcXVpcmVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICB0aGUgZmlsZSB0byBjb21wcmVzczsgcmVxdWlyZWQuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iemlwZmlsZSIgdHlwZT0iamF2YS5pby5GaWxlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSByZXF1aXJlZCBkZXN0aW5hdGlvbiBmaWxlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICB0aGUgcmVxdWlyZWQgZGVzdGluYXRpb24gZmlsZS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgIDwvYXR0cmlidXRlcz4KKworICAgIDxlbGVtZW50cz4KKyAgICA8L2VsZW1lbnRzPgorCisgIDwvc3RydWN0dXJlPgorCis8L3Rhc2s+CisKKworPHRhc2sgbmFtZT0iY2FiIiBjYXRlZ29yeT0ib3RoZXIiCisgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLkNhYiIKKyAgICAgIG1hdGNoaW5nVGFzaz0idHJ1ZSI+CisKKyAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NyZWF0ZSBhIENBQiBhcmNoaXZlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgIDxkZXNjcmlwdGlvbj4KKyAgICA8IVtDREFUQVtDcmVhdGUgYSBDQUIgYXJjaGl2ZS5dXT4KKyAgPC9kZXNjcmlwdGlvbj4KKworICA8c3RydWN0dXJlPgorCisgICAgPGF0dHJpYnV0ZXM+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImJhc2VkaXIiIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtCYXNlIGRpcmVjdG9yeSB0byBsb29rIGluIGZvciBmaWxlcyB0byBDQUIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIEJhc2UgZGlyZWN0b3J5IHRvIGxvb2sgaW4gZm9yIGZpbGVzIHRvIENBQi4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjYWJmaWxlIiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIG5hbWUvbG9jYXRpb24gb2Ygd2hlcmUgdG8gY3JlYXRlIHRoZSAuY2FiIGZpbGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRoZSBuYW1lL2xvY2F0aW9uIG9mIHdoZXJlIHRvIGNyZWF0ZSB0aGUgLmNhYiBmaWxlLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNvbXByZXNzIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIGNvbXByZXNzIHRoZSBmaWxlcyBvdGhlcndpc2Ugb25seSBzdG9yZSB0aGVtLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBJZiB0cnVlLCBjb21wcmVzcyB0aGUgZmlsZXMgb3RoZXJ3aXNlIG9ubHkgc3RvcmUgdGhlbS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJvcHRpb25zIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2V0cyBhZGRpdGlvbmFsIGNhYmFyYyBvcHRpb25zIHRoYXQgYXJlIG5vdCBzdXBwb3J0ZWQgZGlyZWN0bHkuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldHMgYWRkaXRpb25hbCBjYWJhcmMgb3B0aW9ucyB0aGF0IGFyZSBub3Qgc3VwcG9ydGVkIGRpcmVjdGx5LgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InZlcmJvc2UiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgdHJ1ZSwgZGlzcGxheSBjYWJhcmMgb3V0cHV0Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBJZiB0cnVlLCBkaXNwbGF5IGNhYmFyYyBvdXRwdXQuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICA8L2F0dHJpYnV0ZXM+CisKKyAgICA8ZWxlbWVudHM+CisgICAgICA8ZWxlbWVudCBuYW1lPSJmaWxlc2V0IiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0IgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlc2V0IgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBhIHNldCBvZiBmaWxlcyB0byBhcmNoaXZlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtBZGRzIGEgc2V0IG9mIGZpbGVzIHRvIGFyY2hpdmUuXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICA8L2VsZW1lbnRzPgorCisgIDwvc3RydWN0dXJlPgorCis8L3Rhc2s+CisKKworPHRhc2sgbmFtZT0iY2NjaGVja2luIiBjYXRlZ29yeT0ib3RoZXIiCisgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmNsZWFyY2FzZS5DQ0NoZWNraW4iCisgICAgICA+CisKKyAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1BlcmZvcm1zIENsZWFyQ2FzZSBjaGVja2luLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgIDxkZXNjcmlwdGlvbj4KKyAgICA8IVtDREFUQVtQZXJmb3JtcyBDbGVhckNhc2UgY2hlY2tpbi4KKworIDxwPgorIFRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgaW50ZXJwcmV0ZWQ6CisgPHRhYmxlIGJvcmRlcj0iMSI+CisgICA8dHI+CisgICAgIDx0aD5BdHRyaWJ1dGU8L3RoPgorICAgICA8dGg+VmFsdWVzPC90aD4KKyAgICAgPHRoPlJlcXVpcmVkPC90aD4KKyAgIDwvdHI+CisgICA8dHI+CisgICAgICA8dGQ+dmlld3BhdGg8L3RkPgorICAgICAgPHRkPlBhdGggdG8gdGhlIENsZWFyQ2FzZSB2aWV3IGZpbGUgb3IgZGlyZWN0b3J5IHRoYXQgdGhlIGNvbW1hbmQgd2lsbCBvcGVyYXRlIG9uPC90ZD4KKyAgICAgIDx0ZD5ObzwvdGQ+CisgICA8dHI+CisgICA8dHI+CisgICAgICA8dGQ+Y29tbWVudDwvdGQ+CisgICAgICA8dGQ+U3BlY2lmeSBhIGNvbW1lbnQuIE9ubHkgb25lIG9mIGNvbW1lbnQgb3IgY2ZpbGUgbWF5IGJlIHVzZWQuPC90ZD4KKyAgICAgIDx0ZD5ObzwvdGQ+CisgICA8dHI+CisgICA8dHI+CisgICAgICA8dGQ+Y29tbWVudGZpbGU8L3RkPgorICAgICAgPHRkPlNwZWNpZnkgYSBmaWxlIGNvbnRhaW5pbmcgYSBjb21tZW50LiBPbmx5IG9uZSBvZiBjb21tZW50IG9yIGNmaWxlIG1heSBiZSB1c2VkLjwvdGQ+CisgICAgICA8dGQ+Tm88L3RkPgorICAgPHRyPgorICAgPHRyPgorICAgICAgPHRkPm5vd2FybjwvdGQ+CisgICAgICA8dGQ+U3VwcHJlc3Mgd2FybmluZyBtZXNzYWdlczwvdGQ+CisgICAgICA8dGQ+Tm88L3RkPgorICAgPHRyPgorICAgPHRyPgorICAgICAgPHRkPnByZXNlcnZldGltZTwvdGQ+CisgICAgICA8dGQ+UHJlc2VydmUgdGhlIG1vZGlmaWNhdGlvbiB0aW1lPC90ZD4KKyAgICAgIDx0ZD5ObzwvdGQ+CisgICA8dHI+CisgICA8dHI+CisgICAgICA8dGQ+a2VlcGNvcHk8L3RkPgorICAgICAgPHRkPktlZXBzIGEgY29weSBvZiB0aGUgZmlsZSB3aXRoIGEgLmtlZXAgZXh0ZW5zaW9uPC90ZD4KKyAgICAgIDx0ZD5ObzwvdGQ+CisgICA8dHI+CisgICA8dHI+CisgICAgICA8dGQ+aWRlbnRpY2FsPC90ZD4KKyAgICAgIDx0ZD5BbGxvd3MgdGhlIGZpbGUgdG8gYmUgY2hlY2tlZCBpbiBldmVuIGlmIGl0IGlzIGlkZW50aWNhbCB0byB0aGUgb3JpZ2luYWw8L3RkPgorICAgICAgPHRkPk5vPC90ZD4KKyAgIDx0cj4KKyA8L3RhYmxlPl1dPgorICA8L2Rlc2NyaXB0aW9uPgorCisgIDxzdHJ1Y3R1cmU+CisKKyAgICA8YXR0cmlidXRlcz4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xlYXJ0b29sZGlyIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRGlyZWN0b3J5IHdoZXJlIHRoZSBjbGVhcnRvb2wgZXhlY3V0YWJsZSBpcyBsb2NhdGVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgY2xlYXJ0b29sIGV4ZWN1dGFibGUgaXMgbG9jYXRlZC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb21tZW50IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ29tbWVudCBzdHJpbmcuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldHMgdGhlIGNvbW1lbnQgc3RyaW5nLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNvbW1lbnRmaWxlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU3BlY2lmaWVzIGEgZmlsZSBjb250YWluaW5nIGEgY29tbWVudC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU3BlY2lmaWVzIGEgZmlsZSBjb250YWluaW5nIGEgY29tbWVudC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZGVudGljYWwiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgdHJ1ZSwgYWxsb3dzIHRoZSBmaWxlIHRvIGJlIGNoZWNrZWQgaW4gZXZlbgorIGlmIGl0IGlzIGlkZW50aWNhbCB0byB0aGUgb3JpZ2luYWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIElmIHRydWUsIGFsbG93cyB0aGUgZmlsZSB0byBiZSBjaGVja2VkIGluIGV2ZW4KKyBpZiBpdCBpcyBpZGVudGljYWwgdG8gdGhlIG9yaWdpbmFsLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImtlZXBjb3B5IiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIGtlZXBzIGEgY29weSBvZiB0aGUgZmlsZSB3aXRoIGEgLmtlZXAgZXh0ZW5zaW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBJZiB0cnVlLCBrZWVwcyBhIGNvcHkgb2YgdGhlIGZpbGUgd2l0aCBhIC5rZWVwIGV4dGVuc2lvbi4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJub3dhcm4iIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgdHJ1ZSwgc3VwcHJlc3Mgd2FybmluZyBtZXNzYWdlcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgSWYgdHJ1ZSwgc3VwcHJlc3Mgd2FybmluZyBtZXNzYWdlcy4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwcmVzZXJ2ZXRpbWUiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgdHJ1ZSwgcHJlc2VydmUgdGhlIG1vZGlmaWNhdGlvbiB0aW1lLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBJZiB0cnVlLCBwcmVzZXJ2ZSB0aGUgbW9kaWZpY2F0aW9uIHRpbWUuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmlld3BhdGgiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtQYXRoIHRvIHRoZSBpdGVtIGluIGEgQ2xlYXJDYXNlIHZpZXcgdG8gb3BlcmF0ZSBvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBwYXRoIHRvIHRoZSBpdGVtIGluIGEgQ2xlYXJDYXNlIHZpZXcgdG8gb3BlcmF0ZSBvbi4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgIDwvYXR0cmlidXRlcz4KKworICAgIDxlbGVtZW50cz4KKyAgICA8L2VsZW1lbnRzPgorCisgIDwvc3RydWN0dXJlPgorCis8L3Rhc2s+CisKKworPHRhc2sgbmFtZT0iY2NjaGVja291dCIgY2F0ZWdvcnk9Im90aGVyIgorICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5jbGVhcmNhc2UuQ0NDaGVja291dCIKKyAgICAgID4KKworICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbUGVyZm9ybXMgQ2xlYXJDYXNlIGNoZWNrb3V0Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgIDxkZXNjcmlwdGlvbj4KKyAgICA8IVtDREFUQVtQZXJmb3JtcyBDbGVhckNhc2UgY2hlY2tvdXQuCisKKyA8cD4KKyBUaGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgYXJlIGludGVycHJldHRlZDoKKyA8dGFibGUgYm9yZGVyPSIxIj4KKyAgIDx0cj4KKyAgICAgPHRoPkF0dHJpYnV0ZTwvdGg+CisgICAgIDx0aD5WYWx1ZXM8L3RoPgorICAgICA8dGg+UmVxdWlyZWQ8L3RoPgorICAgPC90cj4KKyAgIDx0cj4KKyAgICAgIDx0ZD52aWV3cGF0aDwvdGQ+CisgICAgICA8dGQ+UGF0aCB0byB0aGUgQ2xlYXJDYXNlIHZpZXcgZmlsZSBvciBkaXJlY3RvcnkgdGhhdCB0aGUgY29tbWFuZCB3aWxsIG9wZXJhdGUgb248L3RkPgorICAgICAgPHRkPk5vPC90ZD4KKyAgIDx0cj4KKyAgIDx0cj4KKyAgICAgIDx0ZD5yZXNlcnZlZDwvdGQ+CisgICAgICA8dGQ+U3BlY2lmaWVzIHdoZXRoZXIgdG8gY2hlY2sgb3V0IHRoZSBmaWxlIGFzIHJlc2VydmVkIG9yIG5vdDwvdGQ+CisgICAgICA8dGQ+WWVzPC90ZD4KKyAgIDx0cj4KKyAgIDx0cj4KKyAgICAgIDx0ZD5vdXQ8L3RkPgorICAgICAgPHRkPkNyZWF0ZXMgYSB3cml0YWJsZSBmaWxlIHVuZGVyIGEgZGlmZmVyZW50IGZpbGVuYW1lPC90ZD4KKyAgICAgIDx0ZD5ObzwvdGQ+CisgICA8dHI+CisgICA8dHI+CisgICAgICA8dGQ+bm9kYXRhPC90ZD4KKyAgICAgIDx0ZD5DaGVja3Mgb3V0IHRoZSBmaWxlIGJ1dCBkb2VzIG5vdCBjcmVhdGUgYW4gZWRpdGFibGUgZmlsZSBjb250YWluaW5nIGl0cyBkYXRhPC90ZD4KKyAgICAgIDx0ZD5ObzwvdGQ+CisgICA8dHI+CisgICA8dHI+CisgICAgICA8dGQ+YnJhbmNoPC90ZD4KKyAgICAgIDx0ZD5TcGVjaWZ5IGEgYnJhbmNoIHRvIGNoZWNrIG91dCB0aGUgZmlsZSB0bzwvdGQ+CisgICAgICA8dGQ+Tm88L3RkPgorICAgPHRyPgorICAgPHRyPgorICAgICAgPHRkPnZlcnNpb248L3RkPgorICAgICAgPHRkPkFsbG93cyBjaGVja291dCBvZiBhIHZlcnNpb24gb3RoZXIgdGhhbiBtYWluIGxhdGVzdDwvdGQ+CisgICAgICA8dGQ+Tm88L3RkPgorICAgPHRyPgorICAgPHRyPgorICAgICAgPHRkPm5vd2FybjwvdGQ+CisgICAgICA8dGQ+U3VwcHJlc3Mgd2FybmluZyBtZXNzYWdlczwvdGQ+CisgICAgICA8dGQ+Tm88L3RkPgorICAgPHRyPgorICAgPHRyPgorICAgICAgPHRkPmNvbW1lbnQ8L3RkPgorICAgICAgPHRkPlNwZWNpZnkgYSBjb21tZW50LiBPbmx5IG9uZSBvZiBjb21tZW50IG9yIGNmaWxlIG1heSBiZSB1c2VkLjwvdGQ+CisgICAgICA8dGQ+Tm88L3RkPgorICAgPHRyPgorICAgPHRyPgorICAgICAgPHRkPmNvbW1lbnRmaWxlPC90ZD4KKyAgICAgIDx0ZD5TcGVjaWZ5IGEgZmlsZSBjb250YWluaW5nIGEgY29tbWVudC4gT25seSBvbmUgb2YgY29tbWVudCBvciBjZmlsZSBtYXkgYmUgdXNlZC48L3RkPgorICAgICAgPHRkPk5vPC90ZD4KKyAgIDx0cj4KKyA8L3RhYmxlPl1dPgorICA8L2Rlc2NyaXB0aW9uPgorCisgIDxzdHJ1Y3R1cmU+CisKKyAgICA8YXR0cmlidXRlcz4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYnJhbmNoIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU3BlY2lmeSBhIGJyYW5jaCB0byBjaGVjayBvdXQgdGhlIGZpbGUgdG8uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNwZWNpZnkgYSBicmFuY2ggdG8gY2hlY2sgb3V0IHRoZSBmaWxlIHRvLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsZWFydG9vbGRpciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0RpcmVjdG9yeSB3aGVyZSB0aGUgY2xlYXJ0b29sIGV4ZWN1dGFibGUgaXMgbG9jYXRlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIGNsZWFydG9vbCBleGVjdXRhYmxlIGlzIGxvY2F0ZWQuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29tbWVudCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NvbW1lbnQgc3RyaW5nLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXRzIHRoZSBjb21tZW50IHN0cmluZy4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb21tZW50ZmlsZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NwZWNpZmllcyBhIGZpbGUgY29udGFpbmluZyBhIGNvbW1lbnQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNwZWNpZmllcyBhIGZpbGUgY29udGFpbmluZyBhIGNvbW1lbnQuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibm9kYXRhIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIGNoZWNrcyBvdXQgdGhlIGZpbGUgYnV0IGRvZXMgbm90IGNyZWF0ZSBhbgorIGVkaXRhYmxlIGZpbGUgY29udGFpbmluZyBpdHMgZGF0YS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgSWYgdHJ1ZSwgY2hlY2tzIG91dCB0aGUgZmlsZSBidXQgZG9lcyBub3QgY3JlYXRlIGFuCisgZWRpdGFibGUgZmlsZSBjb250YWluaW5nIGl0cyBkYXRhLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9Im5vd2FybiIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlLCB3YXJuaW5nIG1lc3NhZ2VzIGFyZSBzdXBwcmVzc2VkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBJZiB0cnVlLCB3YXJuaW5nIG1lc3NhZ2VzIGFyZSBzdXBwcmVzc2VkLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9Im91dCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NyZWF0ZXMgYSB3cml0YWJsZSBmaWxlIHVuZGVyIGEgZGlmZmVyZW50IGZpbGVuYW1lLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBDcmVhdGVzIGEgd3JpdGFibGUgZmlsZSB1bmRlciBhIGRpZmZlcmVudCBmaWxlbmFtZS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJyZXNlcnZlZCIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlLCBjaGVja3Mgb3V0IHRoZSBmaWxlIGFzIHJlc2VydmVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBJZiB0cnVlLCBjaGVja3Mgb3V0IHRoZSBmaWxlIGFzIHJlc2VydmVkLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InZlcnNpb24iIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgdHJ1ZSwgYWxsb3dzIGNoZWNrb3V0IG9mIGEgdmVyc2lvbiBvdGhlciB0aGFuIG1haW4gbGF0ZXN0Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBJZiB0cnVlLCBhbGxvd3MgY2hlY2tvdXQgb2YgYSB2ZXJzaW9uIG90aGVyIHRoYW4gbWFpbiBsYXRlc3QuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmlld3BhdGgiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtQYXRoIHRvIHRoZSBpdGVtIGluIGEgQ2xlYXJDYXNlIHZpZXcgdG8gb3BlcmF0ZSBvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBwYXRoIHRvIHRoZSBpdGVtIGluIGEgQ2xlYXJDYXNlIHZpZXcgdG8gb3BlcmF0ZSBvbi4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgIDwvYXR0cmlidXRlcz4KKworICAgIDxlbGVtZW50cz4KKyAgICA8L2VsZW1lbnRzPgorCisgIDwvc3RydWN0dXJlPgorCis8L3Rhc2s+CisKKworPHRhc2sgbmFtZT0iY2NtY2hlY2tpbiIgY2F0ZWdvcnk9Im90aGVyIgorICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5jY20uQ0NNQ2hlY2tpbiIKKyAgICAgID4KKworICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbUGVyZm9ybXMgQ29udGludXVzIGNoZWNraW4gY29tbWFuZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICA8ZGVzY3JpcHRpb24+CisgICAgPCFbQ0RBVEFbUGVyZm9ybXMgQ29udGludXVzIGNoZWNraW4gY29tbWFuZC5dXT4KKyAgPC9kZXNjcmlwdGlvbj4KKworICA8c3RydWN0dXJlPgorCisgICAgPGF0dHJpYnV0ZXM+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNjbWRpciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0RpcmVjdG9yeSB3aGVyZSB0aGUgY2NtIGV4ZWN1dGFibGUgaXMgbG9jYXRlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIGNjbSBleGVjdXRhYmxlIGlzIGxvY2F0ZWQuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29tbWVudCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NwZWNpZmllcyBhIGNvbW1lbnQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNwZWNpZmllcyBhIGNvbW1lbnQuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmlsZSIgdHlwZT0iamF2YS5pby5GaWxlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1BhdGggdG8gdGhlIGZpbGUgdGhhdCB0aGUgY29tbWFuZCB3aWxsIG9wZXJhdGUgb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldHMgdGhlIHBhdGggdG8gdGhlIGZpbGUgdGhhdCB0aGUgY29tbWFuZCB3aWxsIG9wZXJhdGUgb24uCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idGFzayIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NwZWNpZmllcyB0aGUgdGFzayBudW1iZXIgdXNlZCB0byBjaGVjaworIGluIHRoZSBmaWxlIChtYXkgdXNlICdkZWZhdWx0JykuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNwZWNpZmllcyB0aGUgdGFzayBudW1iZXIgdXNlZCB0byBjaGVjaworIGluIHRoZSBmaWxlIChtYXkgdXNlICdkZWZhdWx0JykuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICA8L2F0dHJpYnV0ZXM+CisKKyAgICA8ZWxlbWVudHM+CisgICAgPC9lbGVtZW50cz4KKworICA8L3N0cnVjdHVyZT4KKworPC90YXNrPgorCisKKzx0YXNrIG5hbWU9ImNjbWNoZWNraW50YXNrIiBjYXRlZ29yeT0ic2NtIgorICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5jY20uQ0NNQ2hlY2tpbkRlZmF1bHQiCisgICAgICA+CisKKyAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1BlcmZvcm1zIENvbnRpbnV1cyBDaGVja2luIERlZmF1bHQgdGFzayBjb21tYW5kLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgIDxkZXNjcmlwdGlvbj4KKyAgICA8IVtDREFUQVtQZXJmb3JtcyBDb250aW51dXMgQ2hlY2tpbiBEZWZhdWx0IHRhc2sgY29tbWFuZC5dXT4KKyAgPC9kZXNjcmlwdGlvbj4KKworICA8c3RydWN0dXJlPgorCisgICAgPGF0dHJpYnV0ZXM+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNjbWRpciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0RpcmVjdG9yeSB3aGVyZSB0aGUgY2NtIGV4ZWN1dGFibGUgaXMgbG9jYXRlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIGNjbSBleGVjdXRhYmxlIGlzIGxvY2F0ZWQuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29tbWVudCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NwZWNpZmllcyBhIGNvbW1lbnQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNwZWNpZmllcyBhIGNvbW1lbnQuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmlsZSIgdHlwZT0iamF2YS5pby5GaWxlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1BhdGggdG8gdGhlIGZpbGUgdGhhdCB0aGUgY29tbWFuZCB3aWxsIG9wZXJhdGUgb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldHMgdGhlIHBhdGggdG8gdGhlIGZpbGUgdGhhdCB0aGUgY29tbWFuZCB3aWxsIG9wZXJhdGUgb24uCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idGFzayIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NwZWNpZmllcyB0aGUgdGFzayBudW1iZXIgdXNlZCB0byBjaGVjaworIGluIHRoZSBmaWxlIChtYXkgdXNlICdkZWZhdWx0JykuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNwZWNpZmllcyB0aGUgdGFzayBudW1iZXIgdXNlZCB0byBjaGVjaworIGluIHRoZSBmaWxlIChtYXkgdXNlICdkZWZhdWx0JykuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICA8L2F0dHJpYnV0ZXM+CisKKyAgICA8ZWxlbWVudHM+CisgICAgPC9lbGVtZW50cz4KKworICA8L3N0cnVjdHVyZT4KKworPC90YXNrPgorCisKKzx0YXNrIG5hbWU9ImNjbWNoZWNrb3V0IiBjYXRlZ29yeT0ib3RoZXIiCisgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmNjbS5DQ01DaGVja291dCIKKyAgICAgID4KKworICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbUGVyZm9ybXMgQ29udGludXVzIGNoZWNrb3V0IGNvbW1hbmQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgPGRlc2NyaXB0aW9uPgorICAgIDwhW0NEQVRBW1BlcmZvcm1zIENvbnRpbnV1cyBjaGVja291dCBjb21tYW5kLl1dPgorICA8L2Rlc2NyaXB0aW9uPgorCisgIDxzdHJ1Y3R1cmU+CisKKyAgICA8YXR0cmlidXRlcz4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2NtZGlyIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRGlyZWN0b3J5IHdoZXJlIHRoZSBjY20gZXhlY3V0YWJsZSBpcyBsb2NhdGVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgY2NtIGV4ZWN1dGFibGUgaXMgbG9jYXRlZC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb21tZW50IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU3BlY2lmaWVzIGEgY29tbWVudC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU3BlY2lmaWVzIGEgY29tbWVudC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmaWxlIiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbUGF0aCB0byB0aGUgZmlsZSB0aGF0IHRoZSBjb21tYW5kIHdpbGwgb3BlcmF0ZSBvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0cyB0aGUgcGF0aCB0byB0aGUgZmlsZSB0aGF0IHRoZSBjb21tYW5kIHdpbGwgb3BlcmF0ZSBvbi4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0YXNrIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU3BlY2lmaWVzIHRoZSB0YXNrIG51bWJlciB1c2VkIHRvIGNoZWNrCisgaW4gdGhlIGZpbGUgKG1heSB1c2UgJ2RlZmF1bHQnKS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU3BlY2lmaWVzIHRoZSB0YXNrIG51bWJlciB1c2VkIHRvIGNoZWNrCisgaW4gdGhlIGZpbGUgKG1heSB1c2UgJ2RlZmF1bHQnKS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgIDwvYXR0cmlidXRlcz4KKworICAgIDxlbGVtZW50cz4KKyAgICA8L2VsZW1lbnRzPgorCisgIDwvc3RydWN0dXJlPgorCis8L3Rhc2s+CisKKworPHRhc2sgbmFtZT0iY2NtY3JlYXRldGFzayIgY2F0ZWdvcnk9InNjbSIKKyAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuY2NtLkNDTUNyZWF0ZVRhc2siCisgICAgICA+CisKKyAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NyZWF0ZXMgbmV3IENvbnRpbnV1cyBjY20gdGFzayBhbmQgc2V0cyBpdCBhcyB0aGUgZGVmYXVsdC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICA8ZGVzY3JpcHRpb24+CisgICAgPCFbQ0RBVEFbQ3JlYXRlcyBuZXcgQ29udGludXVzIGNjbSB0YXNrIGFuZCBzZXRzIGl0IGFzIHRoZSBkZWZhdWx0Ll1dPgorICA8L2Rlc2NyaXB0aW9uPgorCisgIDxzdHJ1Y3R1cmU+CisKKyAgICA8YXR0cmlidXRlcz4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2NtZGlyIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRGlyZWN0b3J5IHdoZXJlIHRoZSBjY20gZXhlY3V0YWJsZSBpcyBsb2NhdGVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgY2NtIGV4ZWN1dGFibGUgaXMgbG9jYXRlZC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb21tZW50IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU3BlY2lmaWVzIGEgY29tbWVudC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU3BlY2lmaWVzIGEgY29tbWVudC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwbGF0Zm9ybSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NwZWNpZmllcyB0aGUgdGFyZ2V0IHBsYXRmb3JtLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTcGVjaWZpZXMgdGhlIHRhcmdldCBwbGF0Zm9ybS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJyZWxlYXNlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU3BlY2lmeSB0aGUgQ0NNIHJlbGVhc2UuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNwZWNpZnkgdGhlIENDTSByZWxlYXNlLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InJlc29sdmVyIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU3BlY2lmaWVzIHRoZSByZXNvbHZlci5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU3BlY2lmaWVzIHRoZSByZXNvbHZlci4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzdWJzeXN0ZW0iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTcGVjaWZpZXMgdGhlIHN1YnN5c3RlbS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU3BlY2lmaWVzIHRoZSBzdWJzeXN0ZW0uCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idGFzayIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NwZWNpZmllcyB0aGUgdGFzayBudW1iZXIgdXNlZCB0byBjaGVja2luCisgdGhlIGZpbGUgKG1heSB1c2UgJ2RlZmF1bHQnKS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU3BlY2lmaWVzIHRoZSB0YXNrIG51bWJlciB1c2VkIHRvIGNoZWNraW4KKyB0aGUgZmlsZSAobWF5IHVzZSAnZGVmYXVsdCcpLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgPC9hdHRyaWJ1dGVzPgorCisgICAgPGVsZW1lbnRzPgorICAgIDwvZWxlbWVudHM+CisKKyAgPC9zdHJ1Y3R1cmU+CisKKzwvdGFzaz4KKworCis8dGFzayBuYW1lPSJjY21yZWNvbmZpZ3VyZSIgY2F0ZWdvcnk9Im90aGVyIgorICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5jY20uQ0NNUmVjb25maWd1cmUiCisgICAgICA+CisKKyAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1Rhc2sgYWxsb3dzIHRvIHJlY29uZmlndXJlIGEgcHJvamVjdCwgcmVjdXJjaXZlbHkgb3Igbm90XV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgPGRlc2NyaXB0aW9uPgorICAgIDwhW0NEQVRBW1Rhc2sgYWxsb3dzIHRvIHJlY29uZmlndXJlIGEgcHJvamVjdCwgcmVjdXJjaXZlbHkgb3Igbm90XV0+CisgIDwvZGVzY3JpcHRpb24+CisKKyAgPHN0cnVjdHVyZT4KKworICAgIDxhdHRyaWJ1dGVzPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjY21kaXIiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtEaXJlY3Rvcnkgd2hlcmUgdGhlIGNjbSBleGVjdXRhYmxlIGlzIGxvY2F0ZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBjY20gZXhlY3V0YWJsZSBpcyBsb2NhdGVkLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNjbXByb2plY3QiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDY20gcHJvamVjdCBvbiB3aGljaCB0aGUgb3BlcmF0aW9uIGlzIGFwcGxpZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldHMgdGhlIGNjbSBwcm9qZWN0IG9uIHdoaWNoIHRoZSBvcGVyYXRpb24gaXMgYXBwbGllZC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJyZWN1cnNlIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIHJlY3Vyc2Ugb24gc3VicHJvamVjdCAoZGVmYXVsdCBmYWxzZSkuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIElmIHRydWUsIHJlY3Vyc2Ugb24gc3VicHJvamVjdCAoZGVmYXVsdCBmYWxzZSkuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmVyYm9zZSIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlLCBkbyBhIHZlcmJvc2UgcmVjb25maWd1cmUgb3BlcmF0aW9uIChkZWZhdWx0IGZhbHNlKS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgSWYgdHJ1ZSwgZG8gYSB2ZXJib3NlIHJlY29uZmlndXJlIG9wZXJhdGlvbiAoZGVmYXVsdCBmYWxzZSkuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICA8L2F0dHJpYnV0ZXM+CisKKyAgICA8ZWxlbWVudHM+CisgICAgPC9lbGVtZW50cz4KKworICA8L3N0cnVjdHVyZT4KKworPC90YXNrPgorCisKKzx0YXNrIG5hbWU9ImNjdW5jaGVja291dCIgY2F0ZWdvcnk9Im90aGVyIgorICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5jbGVhcmNhc2UuQ0NVbkNoZWNrb3V0IgorICAgICAgPgorCisgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtQZXJmb3JtcyBDbGVhckNhc2UgVW5DaGVja291dCBjb21tYW5kLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgIDxkZXNjcmlwdGlvbj4KKyAgICA8IVtDREFUQVtQZXJmb3JtcyBDbGVhckNhc2UgVW5DaGVja291dCBjb21tYW5kLgorCisgPHA+CisgVGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIGFyZSBpbnRlcnByZXR0ZWQ6CisgPHRhYmxlIGJvcmRlcj0iMSI+CisgICA8dHI+CisgICAgIDx0aD5BdHRyaWJ1dGU8L3RoPgorICAgICA8dGg+VmFsdWVzPC90aD4KKyAgICAgPHRoPlJlcXVpcmVkPC90aD4KKyAgIDwvdHI+CisgICA8dHI+CisgICAgICA8dGQ+dmlld3BhdGg8L3RkPgorICAgICAgPHRkPlBhdGggdG8gdGhlIENsZWFyQ2FzZSB2aWV3IGZpbGUgb3IgZGlyZWN0b3J5IHRoYXQgdGhlIGNvbW1hbmQgd2lsbCBvcGVyYXRlIG9uPC90ZD4KKyAgICAgIDx0ZD5ObzwvdGQ+CisgICA8dHI+CisgICA8dHI+CisgICAgICA8dGQ+a2VlcGNvcHk8L3RkPgorICAgICAgPHRkPlNwZWNpZmllcyB3aGV0aGVyIHRvIGtlZXAgYSBjb3B5IG9mIHRoZSBmaWxlIHdpdGggYSAua2VlcCBleHRlbnNpb24gb3Igbm90PC90ZD4KKyAgICAgIDx0ZD5ObzwvdGQ+CisgICA8dHI+CisgPC90YWJsZT5dXT4KKyAgPC9kZXNjcmlwdGlvbj4KKworICA8c3RydWN0dXJlPgorCisgICAgPGF0dHJpYnV0ZXM+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsZWFydG9vbGRpciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0RpcmVjdG9yeSB3aGVyZSB0aGUgY2xlYXJ0b29sIGV4ZWN1dGFibGUgaXMgbG9jYXRlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIGNsZWFydG9vbCBleGVjdXRhYmxlIGlzIGxvY2F0ZWQuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ia2VlcGNvcHkiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgdHJ1ZSwga2VlcCBhIGNvcHkgb2YgdGhlIGZpbGUgd2l0aCBhIC5rZWVwIGV4dGVuc2lvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgSWYgdHJ1ZSwga2VlcCBhIGNvcHkgb2YgdGhlIGZpbGUgd2l0aCBhIC5rZWVwIGV4dGVuc2lvbi4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2aWV3cGF0aCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1BhdGggdG8gdGhlIGl0ZW0gaW4gYSBDbGVhckNhc2UgdmlldyB0byBvcGVyYXRlIG9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIHBhdGggdG8gdGhlIGl0ZW0gaW4gYSBDbGVhckNhc2UgdmlldyB0byBvcGVyYXRlIG9uLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgPC9hdHRyaWJ1dGVzPgorCisgICAgPGVsZW1lbnRzPgorICAgIDwvZWxlbWVudHM+CisKKyAgPC9zdHJ1Y3R1cmU+CisKKzwvdGFzaz4KKworCis8dGFzayBuYW1lPSJjY3VwZGF0ZSIgY2F0ZWdvcnk9Im90aGVyIgorICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5jbGVhcmNhc2UuQ0NVcGRhdGUiCisgICAgICA+CisKKyAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1BlcmZvcm1zIGEgQ2xlYXJDYXNlIFVwZGF0ZSBjb21tYW5kLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgIDxkZXNjcmlwdGlvbj4KKyAgICA8IVtDREFUQVtQZXJmb3JtcyBhIENsZWFyQ2FzZSBVcGRhdGUgY29tbWFuZC4KKworIDxwPgorIFRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgaW50ZXJwcmV0dGVkOgorIDx0YWJsZSBib3JkZXI9IjEiPgorICAgPHRyPgorICAgICA8dGg+QXR0cmlidXRlPC90aD4KKyAgICAgPHRoPlZhbHVlczwvdGg+CisgICAgIDx0aD5SZXF1aXJlZDwvdGg+CisgICA8L3RyPgorICAgPHRyPgorICAgICAgPHRkPnZpZXdwYXRoPC90ZD4KKyAgICAgIDx0ZD5QYXRoIHRvIHRoZSBDbGVhckNhc2UgdmlldyBmaWxlIG9yIGRpcmVjdG9yeSB0aGF0IHRoZSBjb21tYW5kIHdpbGwgb3BlcmF0ZSBvbjwvdGQ+CisgICAgICA8dGQ+Tm88L3RkPgorICAgPHRyPgorICAgPHRyPgorICAgICAgPHRkPmdyYXBoaWNhbDwvdGQ+CisgICAgICA8dGQ+RGlzcGxheXMgYSBncmFwaGljYWwgZGlhbG9nIGR1cmluZyB0aGUgdXBkYXRlPC90ZD4KKyAgICAgIDx0ZD5ObzwvdGQ+CisgICA8dHI+CisgICA8dHI+CisgICAgICA8dGQ+bG9nPC90ZD4KKyAgICAgIDx0ZD5TcGVjaWZpZXMgYSBsb2cgZmlsZSBmb3IgQ2xlYXJDYXNlIHRvIHdyaXRlIHRvPC90ZD4KKyAgICAgIDx0ZD5ObzwvdGQ+CisgICA8dHI+CisgICA8dHI+CisgICAgICA8dGQ+b3ZlcndyaXRlPC90ZD4KKyAgICAgIDx0ZD5TcGVjaWZpZXMgd2hldGhlciB0byBvdmVyd3JpdGUgaGlqYWNrZWQgZmlsZXMgb3Igbm90PC90ZD4KKyAgICAgIDx0ZD5ObzwvdGQ+CisgICA8dHI+CisgICA8dHI+CisgICAgICA8dGQ+cmVuYW1lPC90ZD4KKyAgICAgIDx0ZD5TcGVjaWZpZXMgdGhhdCBoaWphY2tlZCBmaWxlcyBzaG91bGQgYmUgcmVuYW1lZCB3aXRoIGEgLmtlZXAgZXh0ZW5zaW9uPC90ZD4KKyAgICAgIDx0ZD5ObzwvdGQ+CisgICA8dHI+CisgICA8dHI+CisgICAgICA8dGQ+Y3VycmVudHRpbWU8L3RkPgorICAgICAgPHRkPlNwZWNpZmllcyB0aGF0IG1vZGlmaWNhdGlvbiB0aW1lIHNob3VsZCBiZSB3cml0dGVuIGFzIHRoZSBjdXJyZW50IHRpbWUuIEVpdGhlciBjdXJyZW50dGltZSBvciBwcmVzZXJ2ZXRpbWUgY2FuIGJlIHNwZWNpZmllZC48L3RkPgorICAgICAgPHRkPk5vPC90ZD4KKyAgIDx0cj4KKyAgIDx0cj4KKyAgICAgIDx0ZD5wcmVzZXJ2ZXRpbWU8L3RkPgorICAgICAgPHRkPlNwZWNpZmllcyB0aGF0IG1vZGlmaWNhdGlvbiB0aW1lIHNob3VsZCBwcmVzZXJ2ZWQgZnJvbSB0aGUgVk9CIHRpbWUuIEVpdGhlciBjdXJyZW50dGltZSBvciBwcmVzZXJ2ZXRpbWUgY2FuIGJlIHNwZWNpZmllZC48L3RkPgorICAgICAgPHRkPk5vPC90ZD4KKyAgIDx0cj4KKyA8L3RhYmxlPl1dPgorICA8L2Rlc2NyaXB0aW9uPgorCisgIDxzdHJ1Y3R1cmU+CisKKyAgICA8YXR0cmlidXRlcz4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xlYXJ0b29sZGlyIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRGlyZWN0b3J5IHdoZXJlIHRoZSBjbGVhcnRvb2wgZXhlY3V0YWJsZSBpcyBsb2NhdGVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgY2xlYXJ0b29sIGV4ZWN1dGFibGUgaXMgbG9jYXRlZC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjdXJyZW50dGltZSIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlLCBtb2RpZmljYXRpb24gdGltZSBzaG91bGQgYmUgd3JpdHRlbiBhcyB0aGUgY3VycmVudCB0aW1lLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBJZiB0cnVlLCBtb2RpZmljYXRpb24gdGltZSBzaG91bGQgYmUgd3JpdHRlbiBhcyB0aGUgY3VycmVudCB0aW1lLgorIEVpdGhlciBjdXJyZW50dGltZSBvciBwcmVzZXJ2ZXRpbWUgY2FuIGJlIHNwZWNpZmllZC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJncmFwaGljYWwiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgdHJ1ZSwgZGlzcGxheXMgYSBncmFwaGljYWwgZGlhbG9nIGR1cmluZyB0aGUgdXBkYXRlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBJZiB0cnVlLCBkaXNwbGF5cyBhIGdyYXBoaWNhbCBkaWFsb2cgZHVyaW5nIHRoZSB1cGRhdGUuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibG9nIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTG9nIGZpbGUgd2hlcmUgY2xlYXJ0b29sIHJlY29yZHMKKyB0aGUgc3RhdHVzIG9mIHRoZSBjb21tYW5kLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXRzIHRoZSBsb2cgZmlsZSB3aGVyZSBjbGVhcnRvb2wgcmVjb3JkcworIHRoZSBzdGF0dXMgb2YgdGhlIGNvbW1hbmQuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ib3ZlcndyaXRlIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIG92ZXJ3cml0ZSBoaWphY2tlZCBmaWxlcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgSWYgdHJ1ZSwgb3ZlcndyaXRlIGhpamFja2VkIGZpbGVzLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InByZXNlcnZldGltZSIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlLCBtb2RpZmljYXRpb24gdGltZSBzaG91bGQgYmUgcHJlc2VydmVkIGZyb20gdGhlIFZPQiB0aW1lLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBJZiB0cnVlLCBtb2RpZmljYXRpb24gdGltZSBzaG91bGQgYmUgcHJlc2VydmVkIGZyb20gdGhlIFZPQiB0aW1lLgorIEVpdGhlciBjdXJyZW50dGltZSBvciBwcmVzZXJ2ZXRpbWUgY2FuIGJlIHNwZWNpZmllZC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJyZW5hbWUiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgdHJ1ZSwgaGlqYWNrZWQgZmlsZXMgYXJlIHJlbmFtZWQgd2l0aCBhIC5rZWVwIGV4dGVuc2lvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgSWYgdHJ1ZSwgaGlqYWNrZWQgZmlsZXMgYXJlIHJlbmFtZWQgd2l0aCBhIC5rZWVwIGV4dGVuc2lvbi4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2aWV3cGF0aCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1BhdGggdG8gdGhlIGl0ZW0gaW4gYSBDbGVhckNhc2UgdmlldyB0byBvcGVyYXRlIG9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIHBhdGggdG8gdGhlIGl0ZW0gaW4gYSBDbGVhckNhc2UgdmlldyB0byBvcGVyYXRlIG9uLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgPC9hdHRyaWJ1dGVzPgorCisgICAgPGVsZW1lbnRzPgorICAgIDwvZWxlbWVudHM+CisKKyAgPC9zdHJ1Y3R1cmU+CisKKzwvdGFzaz4KKworCis8dGFzayBuYW1lPSJjaGVja3N1bSIgY2F0ZWdvcnk9ImNvbnRyb2wiCisgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkNoZWNrc3VtIgorICAgICAgbWF0Y2hpbmdUYXNrPSJ0cnVlIj4KKworICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVXNlZCB0byBjcmVhdGUgb3IgdmVyaWZ5IGZpbGUgY2hlY2tzdW1zLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgIDxkZXNjcmlwdGlvbj4KKyAgICA8IVtDREFUQVtVc2VkIHRvIGNyZWF0ZSBvciB2ZXJpZnkgZmlsZSBjaGVja3N1bXMuXV0+CisgIDwvZGVzY3JpcHRpb24+CisKKyAgPHN0cnVjdHVyZT4KKworICAgIDxhdHRyaWJ1dGVzPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJhbGdvcml0aG0iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTcGVjaWZpZXMgdGhlIGFsZ29yaXRobSB0byBiZSB1c2VkIHRvIGNvbXB1dGUgdGhlIGNoZWNrc3VtLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTcGVjaWZpZXMgdGhlIGFsZ29yaXRobSB0byBiZSB1c2VkIHRvIGNvbXB1dGUgdGhlIGNoZWNrc3VtLgorIERlZmF1bHRzIHRvICJNRDUiLiBPdGhlciBwb3B1bGFyIGFsZ29yaXRobXMgbGlrZSAiU0hBIiBtYXkgYmUgdXNlZCBhcyB3ZWxsLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImZpbGUiIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtGaWxlIGZvciB3aGljaCB0aGUgY2hlY2tzdW0gaXMgdG8gYmUgY2FsY3VsYXRlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0cyB0aGUgZmlsZSBmb3Igd2hpY2ggdGhlIGNoZWNrc3VtIGlzIHRvIGJlIGNhbGN1bGF0ZWQuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmlsZWV4dCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0ZpbGUgZXh0ZW5zaW9uIHRoYXQgaXMgYmUgdG8gdXNlZCB0bworIGNyZWF0ZSBvciBpZGVudGlmeSBkZXN0aW5hdGlvbiBmaWxlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXRzIHRoZSBmaWxlIGV4dGVuc2lvbiB0aGF0IGlzIGJlIHRvIHVzZWQgdG8KKyBjcmVhdGUgb3IgaWRlbnRpZnkgZGVzdGluYXRpb24gZmlsZS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmb3JjZW92ZXJ3cml0ZSIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtXaGV0aGVyIG9yIG5vdCB0byBvdmVyd3JpdGUgZXhpc3RpbmcgZmlsZSBpcnJlc3BlY3RpdmUgb2YgCisgd2hldGhlciBpdCBpcyBuZXdlciB0aGFuCisgdGhlIHNvdXJjZSBmaWxlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBXaGV0aGVyIG9yIG5vdCB0byBvdmVyd3JpdGUgZXhpc3RpbmcgZmlsZSBpcnJlc3BlY3RpdmUgb2YgCisgd2hldGhlciBpdCBpcyBuZXdlciB0aGFuCisgdGhlIHNvdXJjZSBmaWxlLiAgRGVmYXVsdHMgdG8gZmFsc2UuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icHJvcGVydHkiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtQcm9wZXJ0eSB0byBob2xkIHRoZSBnZW5lcmF0ZWQgY2hlY2tzdW0uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldHMgdGhlIHByb3BlcnR5IHRvIGhvbGQgdGhlIGdlbmVyYXRlZCBjaGVja3N1bS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwcm92aWRlciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW01lc3NhZ2VEaWdlc3QgYWxnb3JpdGhtIHByb3ZpZGVyIHRvIGJlIHVzZWQKKyB0byBjYWxjdWxhdGUgdGhlIGNoZWNrc3VtLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXRzIHRoZSBNZXNzYWdlRGlnZXN0IGFsZ29yaXRobSBwcm92aWRlciB0byBiZSB1c2VkCisgdG8gY2FsY3VsYXRlIHRoZSBjaGVja3N1bS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJyZWFkYnVmZmVyc2l6ZSIgdHlwZT0iaW50IgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImludCIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIHNpemUgb2YgdGhlIHJlYWQgYnVmZmVyIHRvIHVzZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgVGhlIHNpemUgb2YgdGhlIHJlYWQgYnVmZmVyIHRvIHVzZS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2ZXJpZnlwcm9wZXJ0eSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1ZlcmlmeSBwcm9wZXJ0eS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0cyB0aGUgdmVyaWZ5IHByb3BlcnR5LiAgVGhpcyBwcm9qZWN0IHByb3BlcnR5IGhvbGRzCisgdGhlIHJlc3VsdCBvZiBhIGNoZWNrc3VtIHZlcmlmaWNhdGlvbiAtICJ0cnVlIiBvciAiZmFsc2UiCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICA8L2F0dHJpYnV0ZXM+CisKKyAgICA8ZWxlbWVudHM+CisgICAgICA8ZWxlbWVudCBuYW1lPSJmaWxlc2V0IiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0IgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlc2V0IgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRmlsZXMgdG8gZ2VuZXJhdGUgY2hlY2tzdW1zIGZvci5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbRmlsZXMgdG8gZ2VuZXJhdGUgY2hlY2tzdW1zIGZvci5dXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgIDwvZWxlbWVudHM+CisKKyAgPC9zdHJ1Y3R1cmU+CisKKzwvdGFzaz4KKworCis8dGFzayBuYW1lPSJjaG1vZCIgY2F0ZWdvcnk9ImZpbGVzeXN0ZW0iCisgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkNobW9kIgorICAgICAgPgorCisgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDaG1vZCBlcXVpdmFsZW50IGZvciB1bml4LWxpa2UgZW52aXJvbm1lbnRzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgIDxkZXNjcmlwdGlvbj4KKyAgICA8IVtDREFUQVtDaG1vZCBlcXVpdmFsZW50IGZvciB1bml4LWxpa2UgZW52aXJvbm1lbnRzLl1dPgorICA8L2Rlc2NyaXB0aW9uPgorCisgIDxzdHJ1Y3R1cmU+CisKKyAgICA8YXR0cmlidXRlcz4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYXBwZW5kIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1doZXRoZXIgb3V0cHV0IHNob3VsZCBiZSBhcHBlbmRlZCB0byBvciBvdmVyd3JpdGUgYW4gZXhpc3RpbmcgZmlsZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgV2hldGhlciBvdXRwdXQgc2hvdWxkIGJlIGFwcGVuZGVkIHRvIG9yIG92ZXJ3cml0ZSBhbiBleGlzdGluZyBmaWxlLgorIERlZmF1bHRzIHRvIGZhbHNlLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlZmF1bHRleGNsdWRlcyIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTZXRzIHdoZXRoZXIgZGVmYXVsdCBleGNsdXNpb25zIHNob3VsZCBiZSB1c2VkIG9yIG5vdC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0cyB3aGV0aGVyIGRlZmF1bHQgZXhjbHVzaW9ucyBzaG91bGQgYmUgdXNlZCBvciBub3QuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVzdCIgdHlwZT0iamF2YS5pby5GaWxlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBkaXJlY3Rvcnkgd2hlcmUgdGFyZ2V0IGZpbGVzIGFyZSB0byBiZSBwbGFjZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRoZSBkaXJlY3Rvcnkgd2hlcmUgdGFyZ2V0IGZpbGVzIGFyZSB0byBiZSBwbGFjZWQuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGlyIiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGRpcmVjdG9yeSB3aGljaCBob2xkcyB0aGUgZmlsZXMgd2hvc2UgcGVybWlzc2lvbnMgbXVzdCBiZSBjaGFuZ2VkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBUaGUgZGlyZWN0b3J5IHdoaWNoIGhvbGRzIHRoZSBmaWxlcyB3aG9zZSBwZXJtaXNzaW9ucyBtdXN0IGJlIGNoYW5nZWQuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZXhjbHVkZXMiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTZXQgb2YgZXhjbHVkZSBwYXR0ZXJucy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0cyB0aGUgc2V0IG9mIGV4Y2x1ZGUgcGF0dGVybnMuIFBhdHRlcm5zIG1heSBiZSBzZXBhcmF0ZWQgYnkgYSBjb21tYQorIG9yIGEgc3BhY2UuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZXhlY3V0YWJsZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBjb21tYW5kIHRvIGV4ZWN1dGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRoZSBjb21tYW5kIHRvIGV4ZWN1dGUuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmFpbGlmZXhlY3V0aW9uZmFpbHMiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU3RvcCB0aGUgYnVpbGQgaWYgcHJvZ3JhbSBjYW5ub3QgYmUgc3RhcnRlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU3RvcCB0aGUgYnVpbGQgaWYgcHJvZ3JhbSBjYW5ub3QgYmUgc3RhcnRlZC4gRGVmYXVsdHMgdG8gdHJ1ZS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmYWlsb25lcnJvciIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtGYWlsIGlmIHRoZSBjb21tYW5kIGV4aXRzIHdpdGggYSBub24temVybyByZXR1cm4gY29kZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgRmFpbCBpZiB0aGUgY29tbWFuZCBleGl0cyB3aXRoIGEgbm9uLXplcm8gcmV0dXJuIGNvZGUuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmlsZSIgdHlwZT0iamF2YS5pby5GaWxlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBmaWxlIG9yIHNpbmdsZSBkaXJlY3Rvcnkgb2Ygd2hpY2ggdGhlIHBlcm1pc3Npb25zIG11c3QgYmUgY2hhbmdlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgVGhlIGZpbGUgb3Igc2luZ2xlIGRpcmVjdG9yeSBvZiB3aGljaCB0aGUgcGVybWlzc2lvbnMgbXVzdCBiZSBjaGFuZ2VkLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImluY2x1ZGVzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2V0IG9mIGluY2x1ZGUgcGF0dGVybnMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldHMgdGhlIHNldCBvZiBpbmNsdWRlIHBhdHRlcm5zLiBQYXR0ZXJucyBtYXkgYmUgc2VwYXJhdGVkIGJ5IGEgY29tbWEKKyBvciBhIHNwYWNlLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9Im5ld2Vudmlyb25tZW50IiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0RvIG5vdCBwcm9wYWdhdGUgb2xkIGVudmlyb25tZW50IHdoZW4gbmV3IGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgc3BlY2lmaWVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBEbyBub3QgcHJvcGFnYXRlIG9sZCBlbnZpcm9ubWVudCB3aGVuIG5ldyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIHNwZWNpZmllZC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJvcyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0xpc3Qgb2Ygb3BlcmF0aW5nIHN5c3RlbXMgb24gd2hpY2ggdGhlIGNvbW1hbmQgbWF5IGJlIGV4ZWN1dGVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBMaXN0IG9mIG9wZXJhdGluZyBzeXN0ZW1zIG9uIHdoaWNoIHRoZSBjb21tYW5kIG1heSBiZSBleGVjdXRlZC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJvdXRwdXQiIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtGaWxlIHRoZSBvdXRwdXQgb2YgdGhlIHByb2Nlc3MgaXMgcmVkaXJlY3RlZCB0by5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgRmlsZSB0aGUgb3V0cHV0IG9mIHRoZSBwcm9jZXNzIGlzIHJlZGlyZWN0ZWQgdG8uCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ib3V0cHV0cHJvcGVydHkiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtQcm9wZXJ0eSBuYW1lIHdob3NlIHZhbHVlIHNob3VsZCBiZSBzZXQgdG8gdGhlIG91dHB1dCBvZgorIHRoZSBwcm9jZXNzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBQcm9wZXJ0eSBuYW1lIHdob3NlIHZhbHVlIHNob3VsZCBiZSBzZXQgdG8gdGhlIG91dHB1dCBvZgorIHRoZSBwcm9jZXNzLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InBhcmFsbGVsIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIHJ1biB0aGUgY29tbWFuZCBvbmx5IG9uY2UsIGFwcGVuZGluZyBhbGwgZmlsZXMgYXMgYXJndW1lbnRzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBJZiB0cnVlLCBydW4gdGhlIGNvbW1hbmQgb25seSBvbmNlLCBhcHBlbmRpbmcgYWxsIGZpbGVzIGFzIGFyZ3VtZW50cy4KKyBJZiBmYWxzZSwgY29tbWFuZCB3aWxsIGJlIGV4ZWN1dGVkIG9uY2UgZm9yIGV2ZXJ5IGZpbGUuIERlZmF1bHRzIHRvIGZhbHNlLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InBlcm0iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgbmV3IHBlcm1pc3Npb25zLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBUaGUgbmV3IHBlcm1pc3Npb25zLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InJlbGF0aXZlIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1doZXRoZXIgdGhlIGZpbGVuYW1lcyBzaG91bGQgYmUgcGFzc2VkIG9uIHRoZSBjb21tYW5kIGxpbmUgYXMKKyBhYnNvbHV0ZSBvciByZWxhdGl2ZSBwYXRobmFtZXMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFdoZXRoZXIgdGhlIGZpbGVuYW1lcyBzaG91bGQgYmUgcGFzc2VkIG9uIHRoZSBjb21tYW5kIGxpbmUgYXMKKyBhYnNvbHV0ZSBvciByZWxhdGl2ZSBwYXRobmFtZXMuIFBhdGhzIGFyZSByZWxhdGl2ZSB0byB0aGUgYmFzZQorIGRpcmVjdG9yeSBvZiB0aGUgY29ycmVzcG9uZGluZyBmaWxlc2V0IGZvciBzb3VyY2UgZmlsZXMgb3IgdGhlCisgZGVzdCBhdHRyaWJ1dGUgZm9yIHRhcmdldCBmaWxlcy4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJyZXN1bHRwcm9wZXJ0eSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBuYW1lIG9mIGEgcHJvcGVydHkgaW4gd2hpY2ggdGhlIHJldHVybiBjb2RlIG9mIHRoZQorIGNvbW1hbmQgc2hvdWxkIGJlIHN0b3JlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgVGhlIG5hbWUgb2YgYSBwcm9wZXJ0eSBpbiB3aGljaCB0aGUgcmV0dXJuIGNvZGUgb2YgdGhlCisgY29tbWFuZCBzaG91bGQgYmUgc3RvcmVkLiBPbmx5IG9mIGludGVyZXN0IGlmIGZhaWxvbmVycm9yPWZhbHNlLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InNraXBlbXB0eWZpbGVzZXRzIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIG5vIHNvdXJjZSBmaWxlcyBoYXZlIGJlZW4gZm91bmQgb3IgYXJlIG5ld2VyIHRoYW4gdGhlaXIKKyBjb3JyZXNwb25kaW5nIHRhcmdldCBmaWxlcywgZG8gbm90IHJ1biB0aGUgY29tbWFuZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgSWYgbm8gc291cmNlIGZpbGVzIGhhdmUgYmVlbiBmb3VuZCBvciBhcmUgbmV3ZXIgdGhhbiB0aGVpcgorIGNvcnJlc3BvbmRpbmcgdGFyZ2V0IGZpbGVzLCBkbyBub3QgcnVuIHRoZSBjb21tYW5kLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkV4ZWN1dGVPbi5GaWxlRGlyQm90aCIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSImcXVvdDtmaWxlJnF1b3Q7LCAmcXVvdDtkaXImcXVvdDssICZxdW90O2JvdGgmcXVvdDsiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1doZXRoZXIgdGhlIGNvbW1hbmQgd29ya3Mgb25seSBvbiBmaWxlcywgZGlyZWN0b3JpZXMgb3IgYm90aD8uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFdoZXRoZXIgdGhlIGNvbW1hbmQgd29ya3Mgb25seSBvbiBmaWxlcywgZGlyZWN0b3JpZXMgb3IgYm90aD8KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2bWxhdW5jaGVyIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIGxhdW5jaCBuZXcgcHJvY2VzcyB3aXRoIFZNLCBvdGhlcndpc2UgdXNlIHRoZSBPUydzIHNoZWxsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBJZiB0cnVlLCBsYXVuY2ggbmV3IHByb2Nlc3Mgd2l0aCBWTSwgb3RoZXJ3aXNlIHVzZSB0aGUgT1MncyBzaGVsbC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgIDwvYXR0cmlidXRlcz4KKworICAgIDxlbGVtZW50cz4KKyAgICAgIDxlbGVtZW50IG5hbWU9ImVudiIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRW52aXJvbm1lbnQuVmFyaWFibGUiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IiIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZCBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byB0aGUgbGF1bmNoZWQgcHJvY2Vzcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbQWRkIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHRoZSBsYXVuY2hlZCBwcm9jZXNzLl1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgICA8ZWxlbWVudCBuYW1lPSJmaWxlc2V0IiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0IgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlc2V0IgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU291cmNlIGZpbGVzIHRvIG9wZXJhdGUgdXBvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbU291cmNlIGZpbGVzIHRvIG9wZXJhdGUgdXBvbi5dXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgICAgPGVsZW1lbnQgbmFtZT0iYXJnIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Db21tYW5kbGluZS5Bcmd1bWVudCIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBhIGNvbW1hbmQtbGluZSBhcmd1bWVudC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbQWRkcyBhIGNvbW1hbmQtbGluZSBhcmd1bWVudC5dXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgICAgPGVsZW1lbnQgbmFtZT0iZXhjbHVkZSIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0dGVyblNldC5OYW1lRW50cnkiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IiIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZCBhIG5hbWUgZW50cnkgb24gdGhlIGV4Y2x1ZGUgbGlzdC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbQWRkIGEgbmFtZSBlbnRyeSBvbiB0aGUgZXhjbHVkZSBsaXN0Ll1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgICA8ZWxlbWVudCBuYW1lPSJpbmNsdWRlIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXR0ZXJuU2V0Lk5hbWVFbnRyeSIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkIGEgbmFtZSBlbnRyeSBvbiB0aGUgaW5jbHVkZSBsaXN0Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtBZGQgYSBuYW1lIGVudHJ5IG9uIHRoZSBpbmNsdWRlIGxpc3QuXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICAgIDxlbGVtZW50IG5hbWU9Im1hcHBlciIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuTWFwcGVyIgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJNYXBwZXIiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtNYXBwZXIgdG8gdXNlIGZvciBtYXBwaW5nIHNvdXJjZSBmaWxlcyB0byB0YXJnZXQgZmlsZXMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW01hcHBlciB0byB1c2UgZm9yIG1hcHBpbmcgc291cmNlIGZpbGVzIHRvIHRhcmdldCBmaWxlcy5dXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgICAgPGVsZW1lbnQgbmFtZT0icGF0dGVybnNldCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0dGVyblNldCIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUGF0dGVybnNldCIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZCBhIHNldCBvZiBwYXR0ZXJucy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbQWRkIGEgc2V0IG9mIHBhdHRlcm5zLl1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgICA8ZWxlbWVudCBuYW1lPSJzcmNmaWxlIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Db21tYW5kbGluZS5NYXJrZXIiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IiIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW01hcmtlciB0aGF0IGluZGljYXRlcyB3aGVyZSB0aGUgbmFtZSBvZiB0aGUgc291cmNlIGZpbGUgc2hvdWxkCisgYmUgcHV0IG9uIHRoZSBjb21tYW5kIGxpbmUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW01hcmtlciB0aGF0IGluZGljYXRlcyB3aGVyZSB0aGUgbmFtZSBvZiB0aGUgc291cmNlIGZpbGUgc2hvdWxkCisgYmUgcHV0IG9uIHRoZSBjb21tYW5kIGxpbmUuXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICAgIDxlbGVtZW50IG5hbWU9InRhcmdldGZpbGUiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkNvbW1hbmRsaW5lLk1hcmtlciIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTWFya2VyIHRoYXQgaW5kaWNhdGVzIHdoZXJlIHRoZSBuYW1lIG9mIHRoZSB0YXJnZXQgZmlsZSBzaG91bGQKKyBiZSBwdXQgb24gdGhlIGNvbW1hbmQgbGluZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbTWFya2VyIHRoYXQgaW5kaWNhdGVzIHdoZXJlIHRoZSBuYW1lIG9mIHRoZSB0YXJnZXQgZmlsZSBzaG91bGQKKyBiZSBwdXQgb24gdGhlIGNvbW1hbmQgbGluZS5dXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgIDwvZWxlbWVudHM+CisKKyAgPC9zdHJ1Y3R1cmU+CisKKzwvdGFzaz4KKworCis8dGFzayBuYW1lPSJjb25jYXQiIGNhdGVnb3J5PSJvdGhlciIKKyAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuQ29uY2F0IgorICAgICAgPgorCisgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGlzIGNsYXNzIGNvbnRhaW5zIHRoZSAnY29uY2F0JyB0YXNrLCB1c2VkIHRvIGNvbmNhdGVuYXRlIGEgc2VyaWVzIG9mIGZpbGVzIGludG8gYSBzaW5nbGUgc3RyZWFtLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgIDxkZXNjcmlwdGlvbj4KKyAgICA8IVtDREFUQVtUaGlzIGNsYXNzIGNvbnRhaW5zIHRoZSAnY29uY2F0JyB0YXNrLCB1c2VkIHRvIGNvbmNhdGVuYXRlIGEgc2VyaWVzCisgb2YgZmlsZXMgaW50byBhIHNpbmdsZSBzdHJlYW0uIFRoZSBkZXN0aW5hdGlvbiBvZiB0aGlzIHN0cmVhbSBtYXkKKyBiZSB0aGUgc3lzdGVtIGNvbnNvbGUsIG9yIGEgZmlsZS4gVGhlIGZvbGxvd2luZyBpcyBhIHNhbXBsZQorIGludm9jYXRpb246CisKKyA8cHJlPgorICZsdDtjb25jYXQgZGVzdGZpbGU9JnF1b3Q7JHtidWlsZC5kaXJ9L2luZGV4LnhtbCZxdW90OworICAgYXBwZW5kPSZxdW90O2ZhbHNlJnF1b3Q7Jmd0OworCisgICAmbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7JHt4bWwucm9vdC5kaXJ9JnF1b3Q7CisgICAgIGluY2x1ZGVzPSZxdW90OyoueG1sJnF1b3Q7IC8mZ3Q7CisKKyAmbHQ7L2NvbmNhdCZndDsKKyA8L3ByZT5dXT4KKyAgPC9kZXNjcmlwdGlvbj4KKworICA8c3RydWN0dXJlPgorCisgICAgPGF0dHJpYnV0ZXM+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImFwcGVuZCIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtCZWhhdmlvciB3aGVuIHRoZSBkZXN0aW5hdGlvbiBmaWxlIGV4aXN0cy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0cyB0aGUgYmVoYXZpb3Igd2hlbiB0aGUgZGVzdGluYXRpb24gZmlsZSBleGlzdHMuIElmIHNldCB0bworIDxjb2RlPnRydWU8L2NvZGU+IHRoZSBzdHJlYW0gZGF0YSB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZQorIGV4aXN0aW5nIGZpbGUsIG90aGVyd2lzZSB0aGUgZXhpc3RpbmcgZmlsZSB3aWxsIGJlCisgb3ZlcndyaXR0ZW4uIERlZmF1bHRzIHRvIDxjb2RlPmZhbHNlPC9jb2RlPi4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXN0ZmlsZSIgdHlwZT0iamF2YS5pby5GaWxlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0Rlc3RpbmF0aW9uIGZpbGUsIG9yIHVzZXMgdGhlIGNvbnNvbGUgaWYgbm90IHNwZWNpZmllZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0cyB0aGUgZGVzdGluYXRpb24gZmlsZSwgb3IgdXNlcyB0aGUgY29uc29sZSBpZiBub3Qgc3BlY2lmaWVkLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImVuY29kaW5nIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRW5jb2RpbmcgZm9yIHRoZSBpbnB1dCBmaWxlcywgdXNlZCB3aGVuIGRpc3BsYXlpbmcgdGhlCisgZGF0YSB2aWEgdGhlIGNvbnNvbGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldHMgdGhlIGVuY29kaW5nIGZvciB0aGUgaW5wdXQgZmlsZXMsIHVzZWQgd2hlbiBkaXNwbGF5aW5nIHRoZQorIGRhdGEgdmlhIHRoZSBjb25zb2xlLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgPC9hdHRyaWJ1dGVzPgorCisgICAgPGVsZW1lbnRzPgorICAgICAgPGVsZW1lbnQgbmFtZT0iZmlsZWxpc3QiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVMaXN0IgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlbGlzdCIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0xpc3Qgb2YgZmlsZXMgdG8gY29uY2F0ZW5hdGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0xpc3Qgb2YgZmlsZXMgdG8gY29uY2F0ZW5hdGUuXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICAgIDxlbGVtZW50IG5hbWU9ImZpbGVzZXQiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVTZXQiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGVzZXQiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTZXQgb2YgZmlsZXMgdG8gY29uY2F0ZW5hdGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW1NldCBvZiBmaWxlcyB0byBjb25jYXRlbmF0ZS5dXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgIDwvZWxlbWVudHM+CisKKyAgICAgIDxib2R5ID4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRoaXMgbWV0aG9kIGFkZHMgdGV4dCB3aGljaCBhcHBlYXJzIGluIHRoZSAnY29uY2F0JyBlbGVtZW50LgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9ib2R5PgorCisgIDwvc3RydWN0dXJlPgorCis8L3Rhc2s+CisKKworPHRhc2sgbmFtZT0iY29uZGl0aW9uIiBjYXRlZ29yeT0iY29udHJvbCIKKyAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuQ29uZGl0aW9uVGFzayIKKyAgICAgID4KKworICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGFzayB0byBzZXQgYSBwcm9wZXJ0eSBjb25kaXRpb25hbGx5IHVzaW5nICZsdDt1cHRvZGF0ZSZndDssICZsdDthdmFpbGFibGUmZ3Q7LCBhbmQgbWFueSBvdGhlciBzdXBwb3J0ZWQgY29uZGl0aW9ucy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICA8ZGVzY3JpcHRpb24+CisgICAgPCFbQ0RBVEFbVGFzayB0byBzZXQgYSBwcm9wZXJ0eSBjb25kaXRpb25hbGx5IHVzaW5nICZsdDt1cHRvZGF0ZSZndDssICZsdDthdmFpbGFibGUmZ3Q7LAorIGFuZCBtYW55IG90aGVyIHN1cHBvcnRlZCBjb25kaXRpb25zLgorCisgPHA+VGhpcyB0YXNrIHN1cHBvcnRzIGJvb2xlYW4gbG9naWMgYXMgd2VsbCBhcyBwbHVnZ2FibGUgY29uZGl0aW9ucworIHRvIGRlY2lkZSwgd2hldGhlciBhIHByb3BlcnR5IHNob3VsZCBiZSBzZXQuPC9wPgorCisgPHA+VGhpcyB0YXNrIGRvZXMgbm90IGV4dGVuZCBUYXNrIHRvIHRha2UgYWR2YW50YWdlIG9mCisgQ29uZGl0aW9uQmFzZS48L3A+XV0+CisgIDwvZGVzY3JpcHRpb24+CisKKyAgPHN0cnVjdHVyZT4KKworICAgIDxhdHRyaWJ1dGVzPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQuIFJlcXVpcmVkLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIHZhbHVlIGZvciB0aGUgcHJvcGVydHkgdG8gc2V0LCBpZiBjb25kaXRpb24gZXZhbHVhdGVzIHRvIHRydWUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRoZSB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5IHRvIHNldCwgaWYgY29uZGl0aW9uIGV2YWx1YXRlcyB0byB0cnVlLgorIERlZmF1bHRzIHRvICJ0cnVlIi4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgIDwvYXR0cmlidXRlcz4KKworICAgIDxlbGVtZW50cz4KKyAgICAgIDxlbGVtZW50IG5hbWU9ImFuZCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uLkFuZCIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkIGFuICZsdDthbmQmZ3Q7IGNvbmRpdGlvbiAiY29udGFpbmVyIi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbQWRkIGFuICZsdDthbmQmZ3Q7IGNvbmRpdGlvbiAiY29udGFpbmVyIi5dXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgICAgPGVsZW1lbnQgbmFtZT0iYXZhaWxhYmxlIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5BdmFpbGFibGUiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IiIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZCBhbiAmbHQ7YXZhaWxhYmxlJmd0OyBjb25kaXRpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0FkZCBhbiAmbHQ7YXZhaWxhYmxlJmd0OyBjb25kaXRpb24uXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICAgIDxlbGVtZW50IG5hbWU9ImNoZWNrc3VtIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5DaGVja3N1bSIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkIGFuICZsdDtjaGVja3N1bSZndDsgY29uZGl0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtBZGQgYW4gJmx0O2NoZWNrc3VtJmd0OyBjb25kaXRpb24uXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICAgIDxlbGVtZW50IG5hbWU9ImNvbnRhaW5zIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb24uQ29udGFpbnMiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IiIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZCBhICZsdDtjb250YWlucyZndDsgY29uZGl0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtBZGQgYSAmbHQ7Y29udGFpbnMmZ3Q7IGNvbmRpdGlvbi5dXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgICAgPGVsZW1lbnQgbmFtZT0iZXF1YWxzIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb24uRXF1YWxzIgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGQgYW4gJmx0O2VxdWFscyZndDsgY29uZGl0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtBZGQgYW4gJmx0O2VxdWFscyZndDsgY29uZGl0aW9uLl1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgICA8ZWxlbWVudCBuYW1lPSJmaWxlc21hdGNoIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb24uRmlsZXNNYXRjaCIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkIGEgJmx0O2ZpbGVzbWF0Y2gmZ3Q7IGNvbmRpdGlvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbQWRkIGEgJmx0O2ZpbGVzbWF0Y2gmZ3Q7IGNvbmRpdGlvbi5dXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgICAgPGVsZW1lbnQgbmFtZT0iaHR0cCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uLkh0dHAiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IiIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZCBhbiAmbHQ7aHR0cCZndDsgY29uZGl0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtBZGQgYW4gJmx0O2h0dHAmZ3Q7IGNvbmRpdGlvbi5dXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgICAgPGVsZW1lbnQgbmFtZT0iaXNmYWxzZSIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uLklzRmFsc2UiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IiIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZCBhICZsdDtpc2ZhbHNlJmd0OyBjb25kaXRpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0FkZCBhICZsdDtpc2ZhbHNlJmd0OyBjb25kaXRpb24uXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICAgIDxlbGVtZW50IG5hbWU9Imlzc2V0IiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb24uSXNTZXQiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IiIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZCBhbiAmbHQ7aXNzZXQmZ3Q7IGNvbmRpdGlvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbQWRkIGFuICZsdDtpc3NldCZndDsgY29uZGl0aW9uLl1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgICA8ZWxlbWVudCBuYW1lPSJpc3RydWUiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbi5Jc1RydWUiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IiIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZCBhICZsdDtpc3RydWUmZ3Q7IGNvbmRpdGlvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbQWRkIGEgJmx0O2lzdHJ1ZSZndDsgY29uZGl0aW9uLl1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgICA8ZWxlbWVudCBuYW1lPSJub3QiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbi5Ob3QiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IiIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZCBhbiAmbHQ7bm90Jmd0OyBjb25kaXRpb24gImNvbnRhaW5lciIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0FkZCBhbiAmbHQ7bm90Jmd0OyBjb25kaXRpb24gImNvbnRhaW5lciIuXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICAgIDxlbGVtZW50IG5hbWU9Im9yIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb24uT3IiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IiIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZCBhbiAmbHQ7b3ImZ3Q7IGNvbmRpdGlvbiAiY29udGFpbmVyIi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbQWRkIGFuICZsdDtvciZndDsgY29uZGl0aW9uICJjb250YWluZXIiLl1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgICA8ZWxlbWVudCBuYW1lPSJvcyIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uLk9zIgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGQgYW4gJmx0O29zJmd0OyBjb25kaXRpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0FkZCBhbiAmbHQ7b3MmZ3Q7IGNvbmRpdGlvbi5dXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgICAgPGVsZW1lbnQgbmFtZT0ic29ja2V0IiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb24uU29ja2V0IgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGQgYSAmbHQ7c29ja2V0Jmd0OyBjb25kaXRpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0FkZCBhICZsdDtzb2NrZXQmZ3Q7IGNvbmRpdGlvbi5dXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgICAgPGVsZW1lbnQgbmFtZT0idXB0b2RhdGUiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlVwVG9EYXRlIgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGQgYW4gJmx0O3VwdG9kYXRlJmd0OyBjb25kaXRpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0FkZCBhbiAmbHQ7dXB0b2RhdGUmZ3Q7IGNvbmRpdGlvbi5dXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgIDwvZWxlbWVudHM+CisKKyAgPC9zdHJ1Y3R1cmU+CisKKzwvdGFzaz4KKworCis8dGFzayBuYW1lPSJjb3B5IiBjYXRlZ29yeT0iZmlsZXN5c3RlbSIKKyAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuQ29weSIKKyAgICAgID4KKworICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ29waWVzIGEgZmlsZSBvciBkaXJlY3RvcnkgdG8gYSBuZXcgZmlsZSBvciBkaXJlY3RvcnkuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgPGRlc2NyaXB0aW9uPgorICAgIDwhW0NEQVRBW0NvcGllcyBhIGZpbGUgb3IgZGlyZWN0b3J5IHRvIGEgbmV3IGZpbGUKKyBvciBkaXJlY3RvcnkuICBGaWxlcyBhcmUgb25seSBjb3BpZWQgaWYgdGhlIHNvdXJjZSBmaWxlIGlzIG5ld2VyCisgdGhhbiB0aGUgZGVzdGluYXRpb24gZmlsZSwgb3Igd2hlbiB0aGUgZGVzdGluYXRpb24gZmlsZSBkb2VzIG5vdAorIGV4aXN0LiAgSXQgaXMgcG9zc2libGUgdG8gZXhwbGljaXRseSBvdmVyd3JpdGUgZXhpc3RpbmcgZmlsZXMuPC9wPgorCisgPHA+VGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiBBcm5vdXQgS3VpcGVyJ3MgaW5pdGlhbCBkZXNpZ24KKyBkb2N1bWVudCwgdGhlIGZvbGxvd2luZyBtYWlsaW5nIGxpc3QgZGlzY3Vzc2lvbnMsIGFuZCB0aGUKKyBjb3B5ZmlsZS9jb3B5ZGlyIHRhc2tzLjwvcD5dXT4KKyAgPC9kZXNjcmlwdGlvbj4KKworICA8c3RydWN0dXJlPgorCisgICAgPGF0dHJpYnV0ZXM+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImVuY29kaW5nIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ2hhcmFjdGVyIGVuY29kaW5nLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXRzIHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmYWlsb25lcnJvciIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiBmYWxzZSwgbm90ZSBlcnJvcnMgdG8gdGhlIG91dHB1dCBidXQga2VlcCBnb2luZy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgSWYgZmFsc2UsIG5vdGUgZXJyb3JzIHRvIHRoZSBvdXRwdXQgYnV0IGtlZXAgZ29pbmcuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmlsZSIgdHlwZT0iamF2YS5pby5GaWxlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NpbmdsZSBzb3VyY2UgZmlsZSB0byBjb3B5Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXRzIGEgc2luZ2xlIHNvdXJjZSBmaWxlIHRvIGNvcHkuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmlsdGVyaW5nIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIGVuYWJsZXMgZmlsdGVyaW5nLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBJZiB0cnVlLCBlbmFibGVzIGZpbHRlcmluZy4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmbGF0dGVuIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1doZW4gY29weWluZyBkaXJlY3RvcnkgdHJlZXMsIHRoZSBmaWxlcyBjYW4gYmUgImZsYXR0ZW5lZCIKKyBpbnRvIGEgc2luZ2xlIGRpcmVjdG9yeS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgV2hlbiBjb3B5aW5nIGRpcmVjdG9yeSB0cmVlcywgdGhlIGZpbGVzIGNhbiBiZSAiZmxhdHRlbmVkIgorIGludG8gYSBzaW5nbGUgZGlyZWN0b3J5LiAgSWYgdGhlcmUgYXJlIG11bHRpcGxlIGZpbGVzIHdpdGgKKyB0aGUgc2FtZSBuYW1lIGluIHRoZSBzb3VyY2UgZGlyZWN0b3J5IHRyZWUsIG9ubHkgdGhlIGZpcnN0CisgZmlsZSB3aWxsIGJlIGNvcGllZCBpbnRvIHRoZSAiZmxhdHRlbmVkIiBkaXJlY3RvcnksIHVubGVzcworIHRoZSBmb3JjZW92ZXJ3cml0ZSBhdHRyaWJ1dGUgaXMgdHJ1ZS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpbmNsdWRlZW1wdHlkaXJzIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1VzZWQgdG8gY29weSBlbXB0eSBkaXJlY3Rvcmllcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgVXNlZCB0byBjb3B5IGVtcHR5IGRpcmVjdG9yaWVzLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9Im92ZXJ3cml0ZSIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtPdmVyd3JpdGUgYW55IGV4aXN0aW5nIGRlc3RpbmF0aW9uIGZpbGUocykuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIE92ZXJ3cml0ZSBhbnkgZXhpc3RpbmcgZGVzdGluYXRpb24gZmlsZShzKS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwcmVzZXJ2ZWxhc3Rtb2RpZmllZCIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtHaXZlIHRoZSBjb3BpZWQgZmlsZXMgdGhlIHNhbWUgbGFzdCBtb2RpZmllZCB0aW1lIGFzIHRoZSBvcmlnaW5hbCBmaWxlcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgR2l2ZSB0aGUgY29waWVkIGZpbGVzIHRoZSBzYW1lIGxhc3QgbW9kaWZpZWQgdGltZSBhcyB0aGUgb3JpZ2luYWwgZmlsZXMuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idG9kaXIiIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtEZXN0aW5hdGlvbiBkaXJlY3RvcnkuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldHMgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0b2ZpbGUiIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtEZXN0aW5hdGlvbiBmaWxlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXRzIHRoZSBkZXN0aW5hdGlvbiBmaWxlLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InZlcmJvc2UiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVXNlZCB0byBmb3JjZSBsaXN0aW5nIG9mIGFsbCBuYW1lcyBvZiBjb3BpZWQgZmlsZXMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFVzZWQgdG8gZm9yY2UgbGlzdGluZyBvZiBhbGwgbmFtZXMgb2YgY29waWVkIGZpbGVzLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgPC9hdHRyaWJ1dGVzPgorCisgICAgPGVsZW1lbnRzPgorICAgICAgPGVsZW1lbnQgbmFtZT0iZmlsZXNldCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldCIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZXNldCIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgYSBzZXQgb2YgZmlsZXMgdG8gY29weS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbQWRkcyBhIHNldCBvZiBmaWxlcyB0byBjb3B5Ll1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgICA8ZWxlbWVudCBuYW1lPSJmaWx0ZXJjaGFpbiIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsdGVyQ2hhaW4iCisgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbHRlckNoYWluIgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBhIEZpbHRlckNoYWluLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtBZGRzIGEgRmlsdGVyQ2hhaW4uXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICAgIDxlbGVtZW50IG5hbWU9ImZpbHRlcnNldCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsdGVyU2V0IgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWx0ZXJzZXQiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIGEgZmlsdGVyc2V0Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtBZGRzIGEgZmlsdGVyc2V0Ll1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgICA8ZWxlbWVudCBuYW1lPSJtYXBwZXIiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLk1hcHBlciIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iTWFwcGVyIgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRGVmaW5lcyB0aGUgbWFwcGVyIHRvIG1hcCBzb3VyY2UgdG8gZGVzdGluYXRpb24gZmlsZXMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0RlZmluZXMgdGhlIG1hcHBlciB0byBtYXAgc291cmNlIHRvIGRlc3RpbmF0aW9uIGZpbGVzLl1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgPC9lbGVtZW50cz4KKworICA8L3N0cnVjdHVyZT4KKworPC90YXNrPgorCisKKzx0YXNrIG5hbWU9ImNvcHlkaXIiIGNhdGVnb3J5PSJvdGhlciIKKyAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuQ29weWRpciIKKyAgICAgIGRlcHJlY2F0ZWQ9InRydWUiCisgICAgICBtYXRjaGluZ1Rhc2s9InRydWUiPgorCisgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDb3BpZXMgYSBkaXJlY3RvcnkuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgPGRlc2NyaXB0aW9uPgorICAgIDwhW0NEQVRBW0NvcGllcyBhIGRpcmVjdG9yeS5dXT4KKyAgPC9kZXNjcmlwdGlvbj4KKworICA8c3RydWN0dXJlPgorCisgICAgPGF0dHJpYnV0ZXM+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlc3QiIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtObyBkZXNjcmlwdGlvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmlsdGVyaW5nIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW05vIGRlc2NyaXB0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmbGF0dGVuIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW05vIGRlc2NyaXB0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmb3JjZW92ZXJ3cml0ZSIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtObyBkZXNjcmlwdGlvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3JjIiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTm8gZGVzY3JpcHRpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgPC9hdHRyaWJ1dGVzPgorCisgICAgPGVsZW1lbnRzPgorICAgIDwvZWxlbWVudHM+CisKKyAgPC9zdHJ1Y3R1cmU+CisKKzwvdGFzaz4KKworCis8dGFzayBuYW1lPSJjb3B5ZmlsZSIgY2F0ZWdvcnk9Im90aGVyIgorICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5Db3B5ZmlsZSIKKyAgICAgIGRlcHJlY2F0ZWQ9InRydWUiCisgICAgICA+CisKKyAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NvcGllcyBhIGZpbGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgPGRlc2NyaXB0aW9uPgorICAgIDwhW0NEQVRBW0NvcGllcyBhIGZpbGUuXV0+CisgIDwvZGVzY3JpcHRpb24+CisKKyAgPHN0cnVjdHVyZT4KKworICAgIDxhdHRyaWJ1dGVzPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXN0IiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTm8gZGVzY3JpcHRpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImZpbHRlcmluZyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW05vIGRlc2NyaXB0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmb3JjZW92ZXJ3cml0ZSIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtObyBkZXNjcmlwdGlvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3JjIiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTm8gZGVzY3JpcHRpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgPC9hdHRyaWJ1dGVzPgorCisgICAgPGVsZW1lbnRzPgorICAgIDwvZWxlbWVudHM+CisKKyAgPC9zdHJ1Y3R1cmU+CisKKzwvdGFzaz4KKworCis8dGFzayBuYW1lPSJjc2MiIGNhdGVnb3J5PSJkb3RuZXQiCisgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmRvdG5ldC5DU2hhcnAiCisgICAgICBtYXRjaGluZ1Rhc2s9InRydWUiPgorCisgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDb21waWxlcyBDIyBzb3VyY2UgaW50byBleGVjdXRhYmxlcyBvciBtb2R1bGVzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgIDxkZXNjcmlwdGlvbj4KKyAgICA8IVtDREFUQVtDb21waWxlcyBDIyBzb3VyY2UgaW50byBleGVjdXRhYmxlcyBvciBtb2R1bGVzLgorCisgIFRoZSB0YXNrIHdpbGwgb25seSB3b3JrIG9uIHdpbjJLIHVudGlsIG90aGVyIHBsYXRmb3JtcyBzdXBwb3J0CisgIGNzYy5leGUgb3IgYW4gZXF1aXZhbGVudC4gQ1NDLmV4ZSBtdXN0IGJlIG9uIHRoZSBleGVjdXRlIHBhdGggdG9vLiA8cD4KKworICBBbGwgcGFyYW1ldGVycyBhcmUgb3B0aW9uYWw6ICZsdDtjc2MvJmd0OyBzaG91bGQgc3VmZmljZSB0byBwcm9kdWNlIGEgZGVidWcKKyAgYnVpbGQgb2YgYWxsICouY3MgZmlsZXMuIFJlZmVyZW5jZXMgdG8gZXh0ZXJuYWwgZmlsZXMgZG8gcmVxdWlyZSBleHBsaWNpdAorICBlbnVtZXJhdGlvbiwgc28gYXJlIG9uZSBvZiB0aGUgZmlyc3QgYXR0cmlidXRlcyB0byBjb25zaWRlciBhZGRpbmcuIDxwPgorCisgIFRoZSB0YXNrIGlzIGEgZGlyZWN0b3J5IGJhc2VkIHRhc2ssIHNvIGF0dHJpYnV0ZXMgbGlrZSA8Yj5pbmNsdWRlcz0iKi5jcyIKKyAgPC9iPiBhbmQgPGI+ZXhjbHVkZXM9ImJyb2tlbi5jcyI8L2I+IGNhbiBiZSB1c2VkIHRvIGNvbnRyb2wgdGhlIGZpbGVzIHB1bGxlZAorICBpbi4gQnkgZGVmYXVsdCwgYWxsICouY3MgZmlsZXMgZnJvbSB0aGUgcHJvamVjdCBmb2xkZXIgZG93biBhcmUgaW5jbHVkZWQgaW4KKyAgdGhlIGNvbW1hbmQuIFdoZW4gdGhpcyBoYXBwZW5zIHRoZSBvdXRwdXQgZmlsZSAtaWYgbm90IHNwZWNpZmllZC0gaXMgdGFrZW4KKyAgYXMgdGhlIGZpcnN0IGZpbGUgaW4gdGhlIGxpc3QsIHdoaWNoIG1heSBiZSBzb21ld2hhdCBoYXJkIHRvIGNvbnRyb2wuCisgIFNwZWNpZnlpbmcgdGhlIG91dHB1dCBmaWxlIHdpdGggPGI+J291dGZpbGUnPC9iPiBzZWVtcyBwcnVkZW50LiA8cD4KKworICA8cD4KKworICBUT0RPCisgIDxvbD4KKyAgICA8bGk+IGlzIGluY3JlbWVudGFsIGJ1aWxkIHN0aWxsIGJyb2tlbiBpbiBiZXRhLTE/CisgICAgPGxpPiBpcyBXaW4zMkljb24gYnJva2VuPworICAgIDxsaT4gYWxsIHRoZSBtaXNzaW5nIG9wdGlvbnMKKyAgPC9vbD4KKyAgPHA+CisKKyAgSGlzdG9yeQorICA8VGFibGU+CisKKyAgICA8dHI+CisKKyAgICAgIDx0ZD4KKyAgICAgICAgMC4zCisgICAgICA8L3RkPgorCisgICAgICA8dGQ+CisgICAgICAgIEJldGEgMSBlZGl0aW9uCisgICAgICA8L3RkPgorCisgICAgICA8dGQ+CisgICAgICAgIFRvIGF2b2lkIGhhdmluZyB0byByZW1lbWJlciB3aGljaCBhc3NlbWJsaWVzIHRvIGluY2x1ZGUsIHRoZSB0YXNrCisgICAgICAgIGF1dG9tYXRpY2FsbHkgcmVmZXJzIHRvIHRoZSBtYWluIGRvdG5ldCBsaWJyYXJpZXMgaW4gQmV0YTEuCisgICAgICA8L3RyPgorCisgICAgICA8dHI+CisKKyAgICAgICAgPHRkPgorICAgICAgICAgIDAuMgorICAgICAgICA8L3RkPgorCisgICAgICAgIDx0ZD4KKyAgICAgICAgICBTbGlnaHRseSBkaWZmZXJlbnQKKyAgICAgICAgPC90ZD4KKworICAgICAgICA8dGQ+CisgICAgICAgICAgU3BsaXQgY29tbWFuZCBleGVjdXRpb24gdG8gYSBzZXBhcmF0ZSBjbGFzczsKKyAgICAgICAgPC90cj4KKworICAgICAgICA8dHI+CisKKyAgICAgICAgICA8dGQ+CisgICAgICAgICAgICAwLjEKKyAgICAgICAgICA8L3RkPgorCisgICAgICAgICAgPHRkPgorICAgICAgICAgICAgIkkgY2FuJ3QgYmVsaWV2ZSBpdCdzIHNvIHJ1ZGltZW50YXJ5IgorICAgICAgICAgIDwvdGQ+CisKKyAgICAgICAgICA8dGQ+CisgICAgICAgICAgICBGaXJzdCBwYXNzOyBtaW5pbWFsIGJ1aWxkcyBvbmx5IHN1cHBvcnQ7CisgICAgICAgICAgPC90cj4KKworICAgICAgICA8L3RhYmxlPl1dPgorICA8L2Rlc2NyaXB0aW9uPgorCisgIDxzdHJ1Y3R1cmU+CisKKyAgICA8YXR0cmlidXRlcz4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYWRkaXRpb25hbG1vZHVsZXMiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTZW1pY29sb24gc2VwYXJhdGVkIGxpc3Qgb2YgbW9kdWxlcyB0byByZWZlciB0by5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2VtaWNvbG9uIHNlcGFyYXRlZCBsaXN0IG9mIG1vZHVsZXMgdG8gcmVmZXIgdG8uCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVidWciIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRGVidWcgZmxhZyBvbiBvciBvZmYuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIHNldCB0aGUgZGVidWcgZmxhZyBvbiBvciBvZmYuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVmaW5pdGlvbnMiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTZW1pY29sb24gc2VwYXJhdGVkIGxpc3Qgb2YgZGVmaW5lZCBjb25zdGFudHMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNlbWljb2xvbiBzZXBhcmF0ZWQgbGlzdCBvZiBkZWZpbmVkIGNvbnN0YW50cy4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXN0ZGlyIiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRGVzdGluYXRpb24gZGlyZWN0b3J5IG9mIGZpbGVzIHRvIGJlIGNvbXBpbGVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBvZiBmaWxlcyB0byBiZSBjb21waWxlZC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXN0ZmlsZSIgdHlwZT0iamF2YS5pby5GaWxlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW05hbWUgb2YgZXhlL2xpYnJhcnkgdG8gY3JlYXRlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIG5hbWUgb2YgZXhlL2xpYnJhcnkgdG8gY3JlYXRlLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImRvY2ZpbGUiIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtGaWxlIGZvciBnZW5lcmF0ZWQgWE1MIGRvY3VtZW50YXRpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIGZpbGUgZm9yIGdlbmVyYXRlZCBYTUwgZG9jdW1lbnRhdGlvbgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImV4dHJhb3B0aW9ucyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FueSBleHRyYSBvcHRpb25zIHdoaWNoIGFyZSBub3QgZXhwbGljaXRseSBzdXBwb3J0ZWQKKyBieSB0aGlzIHRhc2suXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIEFueSBleHRyYSBvcHRpb25zIHdoaWNoIGFyZSBub3QgZXhwbGljaXRseSBzdXBwb3J0ZWQKKyBieSB0aGlzIHRhc2suCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmFpbG9uZXJyb3IiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgdHJ1ZSwgZmFpbCBvbiBjb21waWxhdGlvbiBlcnJvcnMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIElmIHRydWUsIGZhaWwgb24gY29tcGlsYXRpb24gZXJyb3JzLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImZpbGVhbGlnbiIgdHlwZT0iaW50IgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImludCIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRmlsZSBhbGlnbm1lbnQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCB0aGUgZmlsZSBhbGlnbm1lbnQuCisgVmFsaWQgdmFsdWVzIGFyZSAwLDUxMiwgMTAyNCwgMjA0OCwgNDA5NiwgODE5MiwKKyBhbmQgMTYzODQsIDAgbWVhbnMgJ2xlYXZlIHRvIHRoZSBjb21waWxlcicKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmdWxscGF0aHMiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgdHJ1ZSwgcHJpbnQgdGhlIGZ1bGwgcGF0aCBvZiBmaWxlcyBvbiBlcnJvcnMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIElmIHRydWUsIHByaW50IHRoZSBmdWxsIHBhdGggb2YgZmlsZXMgb24gZXJyb3JzLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImluY2x1ZGVkZWZhdWx0cmVmZXJlbmNlcyIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlLCBhdXRvbWF0aWNhbGx5IGluY2x1ZGVzIHRoZSBjb21tb24gYXNzZW1ibGllcworIGluIGRvdG5ldCwgYW5kIHRlbGxzIHRoZSBjb21waWxlciB0byBsaW5rIGluIG1zY29yZS5kbGwuCisKKyAgc2V0IHRoZSBhdXRvbWF0aWMgcmVmZXJlbmNlIGluY2x1c2lvbiBmbGFnIG9uIG9yIG9mZiB0aGlzIGZsYWcgY29udHJvbHMKKyAgdGhlIHN0cmluZyBvZiByZWZlcmVuY2VzIGFuZCB0aGUgL25vc3RkbGliIG9wdGlvbiBpbiBDU0MuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIElmIHRydWUsIGF1dG9tYXRpY2FsbHkgaW5jbHVkZXMgdGhlIGNvbW1vbiBhc3NlbWJsaWVzCisgaW4gZG90bmV0LCBhbmQgdGVsbHMgdGhlIGNvbXBpbGVyIHRvIGxpbmsgaW4gbXNjb3JlLmRsbC4KKworICBzZXQgdGhlIGF1dG9tYXRpYyByZWZlcmVuY2UgaW5jbHVzaW9uIGZsYWcgb24gb3Igb2ZmIHRoaXMgZmxhZyBjb250cm9scworICB0aGUgc3RyaW5nIG9mIHJlZmVyZW5jZXMgYW5kIHRoZSAvbm9zdGRsaWIgb3B0aW9uIGluIENTQworICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImluY3JlbWVudGFsIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0luY3JlbWVudGFsIGNvbXBpbGF0aW9uIGZsYWcgb24gb3Igb2ZmLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBzZXQgdGhlIGluY3JlbWVudGFsIGNvbXBpbGF0aW9uIGZsYWcgb24gb3Igb2ZmLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9Im1haW5jbGFzcyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW05hbWUgb2YgbWFpbiBjbGFzcyBmb3IgZXhlY3V0YWJsZXMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldHMgdGhlIG5hbWUgb2YgbWFpbiBjbGFzcyBmb3IgZXhlY3V0YWJsZXMuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibm9jb25maWciIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQSBmbGFnIHRoYXQgdGVsbHMgdGhlIGNvbXBpbGVyIG5vdCB0byByZWFkIGluIHRoZSBjb21waWxlciAKKyBzZXR0aW5ncyBmaWxlcyAnY3NjLnJzcCcgaW4gaXRzIGJpbiBkaXJlY3RvcnkgYW5kIHRoZW4gdGhlIGxvY2FsIGRpcmVjdG9yeS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgQSBmbGFnIHRoYXQgdGVsbHMgdGhlIGNvbXBpbGVyIG5vdCB0byByZWFkIGluIHRoZSBjb21waWxlciAKKyBzZXR0aW5ncyBmaWxlcyAnY3NjLnJzcCcgaW4gaXRzIGJpbiBkaXJlY3RvcnkgYW5kIHRoZW4gdGhlIGxvY2FsIGRpcmVjdG9yeQorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9Im9wdGltaXplIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIGVuYWJsZXMgb3B0aW1pemF0aW9uIGZsYWcuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIElmIHRydWUsIGVuYWJsZXMgb3B0aW1pemF0aW9uIGZsYWcuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ib3V0cHV0ZmlsZSIgdHlwZT0iamF2YS5pby5GaWxlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW091dHB1dCBmaWxlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIG91dHB1dCBmaWxlCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icmVmZXJlbmNlZmlsZXMiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUGF0aCIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbUGF0aCBvZiByZWZlcmVuY2VzIHRvIGluY2x1ZGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFBhdGggb2YgcmVmZXJlbmNlcyB0byBpbmNsdWRlLgorIFdpbGRjYXJkcyBzaG91bGQgd29yay4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJyZWZlcmVuY2VzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2VtaWNvbG9uIHNlcGFyYXRlZCBsaXN0IG9mIERMTHMgdG8gcmVmZXIgdG8uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNlbWljb2xvbiBzZXBhcmF0ZWQgbGlzdCBvZiBETExzIHRvIHJlZmVyIHRvLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InNyY2RpciIgdHlwZT0iamF2YS5pby5GaWxlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NvdXJjZSBkaXJlY3Rvcnkgb2YgdGhlIGZpbGVzIHRvIGJlIGNvbXBpbGVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIHNvdXJjZSBkaXJlY3Rvcnkgb2YgdGhlIGZpbGVzIHRvIGJlIGNvbXBpbGVkLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InRhcmdldHR5cGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUeXBlIG9mIHRhcmdldC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSB0eXBlIG9mIHRhcmdldC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1bnNhZmUiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgdHJ1ZSwgZW5hYmxlcyB0aGUgdW5zYWZlIGtleXdvcmQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIElmIHRydWUsIGVuYWJsZXMgdGhlIHVuc2FmZSBrZXl3b3JkLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InV0ZjhvdXRwdXQiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgdHJ1ZSwgcmVxdWlyZSBhbGwgY29tcGlsZXIgb3V0cHV0IHRvIGJlIGluIFVURjggZm9ybWF0Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBJZiB0cnVlLCByZXF1aXJlIGFsbCBjb21waWxlciBvdXRwdXQgdG8gYmUgaW4gVVRGOCBmb3JtYXQuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0id2FybmxldmVsIiB0eXBlPSJpbnQiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iaW50IiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtMZXZlbCBvZiB3YXJuaW5nIGN1cnJlbnRseSBiZXR3ZWVuIDEgYW5kIDQKKyB3aXRoIDQgYmVpbmcgdGhlIHN0cmljdGVzdC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgTGV2ZWwgb2Ygd2FybmluZyBjdXJyZW50bHkgYmV0d2VlbiAxIGFuZCA0Cisgd2l0aCA0IGJlaW5nIHRoZSBzdHJpY3Rlc3QuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0id2luMzJpY29uIiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRmlsZW5hbWUgb2YgaWNvbiB0byBpbmNsdWRlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIGZpbGVuYW1lIG9mIGljb24gdG8gaW5jbHVkZS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ3aW4zMnJlcyIgdHlwZT0iamF2YS5pby5GaWxlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0ZpbGVuYW1lIG9mIGEgd2luMzIgcmVzb3VyY2UgKC5SRVMpIGZpbGUgdG8gaW5jbHVkZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0cyB0aGUgZmlsZW5hbWUgb2YgYSB3aW4zMiByZXNvdXJjZSAoLlJFUykgZmlsZSB0byBpbmNsdWRlLgorIFRoaXMgaXMgbm90IGEgLk5FVCByZXNvdXJjZSwgYnV0IHdoYXQgV2luZG93cyBpcyB1c2VkIHRvLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgPC9hdHRyaWJ1dGVzPgorCisgICAgPGVsZW1lbnRzPgorICAgIDwvZWxlbWVudHM+CisKKyAgPC9zdHJ1Y3R1cmU+CisKKzwvdGFzaz4KKworCis8dGFzayBuYW1lPSJjdnMiIGNhdGVnb3J5PSJzY20iCisgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkN2cyIKKyAgICAgID4KKworICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbUGVyZm9ybXMgb3BlcmF0aW9ucyBvbiBhIENWUyByZXBvc2l0b3J5LiBvcmlnaW5hbCAxLjIwIE5PVEU6IFRoaXMgaW1wbGVtZW50YXRpb24gaGFzIGJlZW4gbW92ZWQgdG8gQWJzdHJhY3RDdnNUYXNrIHdpdGggdGhlIGFkZGl0aW9uIG9mIHNvbWUgYWNjZXNzb3JzIGZvciBleHRlbnNpYmlsaXR5Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgIDxkZXNjcmlwdGlvbj4KKyAgICA8IVtDREFUQVtQZXJmb3JtcyBvcGVyYXRpb25zIG9uIGEgQ1ZTIHJlcG9zaXRvcnkuCisKKyBvcmlnaW5hbCAxLjIwCisKKyAgTk9URTogVGhpcyBpbXBsZW1lbnRhdGlvbiBoYXMgYmVlbiBtb3ZlZCB0byBBYnN0cmFjdEN2c1Rhc2sgd2l0aAorICB0aGUgYWRkaXRpb24gb2Ygc29tZSBhY2Nlc3NvcnMgZm9yIGV4dGVuc2liaWxpdHkuXV0+CisgIDwvZGVzY3JpcHRpb24+CisKKyAgPHN0cnVjdHVyZT4KKworICAgIDxhdHRyaWJ1dGVzPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJhcHBlbmQiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbV2hldGhlciB0byBhcHBlbmQgb3V0cHV0L2Vycm9yIHdoZW4gcmVkaXJlY3RpbmcgdG8gYSBmaWxlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBXaGV0aGVyIHRvIGFwcGVuZCBvdXRwdXQvZXJyb3Igd2hlbiByZWRpcmVjdGluZyB0byBhIGZpbGUuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29tbWFuZCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBDVlMgY29tbWFuZCB0byBleGVjdXRlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBUaGUgQ1ZTIGNvbW1hbmQgdG8gZXhlY3V0ZS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb21wcmVzc2lvbiIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlLCB0aGlzIGlzIHRoZSBzYW1lIGFzIGNvbXByZXNzaW9ubGV2ZWw9IjMiLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBJZiB0cnVlLCB0aGlzIGlzIHRoZSBzYW1lIGFzIGNvbXByZXNzaW9ubGV2ZWw9IjMiLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNvbXByZXNzaW9ubGV2ZWwiIHR5cGU9ImludCIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJpbnQiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHNldCB0byBhIHZhbHVlIDEtOSBpdCBhZGRzIC16TiB0byB0aGUgY3ZzIGNvbW1hbmQgbGluZSwgZWxzZQorIGl0IGRpc2FibGVzIGNvbXByZXNzaW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBJZiBzZXQgdG8gYSB2YWx1ZSAxLTkgaXQgYWRkcyAtek4gdG8gdGhlIGN2cyBjb21tYW5kIGxpbmUsIGVsc2UKKyBpdCBkaXNhYmxlcyBjb21wcmVzc2lvbi4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjdnNyb290IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIENWU1JPT1QgdmFyaWFibGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRoZSBDVlNST09UIHZhcmlhYmxlLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImN2c3JzaCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBDVlNfUlNIIHZhcmlhYmxlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBUaGUgQ1ZTX1JTSCB2YXJpYWJsZS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkYXRlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVXNlIHRoZSBtb3N0IHJlY2VudCByZXZpc2lvbiBubyBsYXRlciB0aGFuIHRoZSBnaXZlbiBkYXRlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBVc2UgdGhlIG1vc3QgcmVjZW50IHJldmlzaW9uIG5vIGxhdGVyIHRoYW4gdGhlIGdpdmVuIGRhdGUuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVzdCIgdHlwZT0iamF2YS5pby5GaWxlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIGNoZWNrZWQgb3V0IGZpbGVzIHNob3VsZCBiZSBwbGFjZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIGNoZWNrZWQgb3V0IGZpbGVzIHNob3VsZCBiZSBwbGFjZWQuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZXJyb3IiIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgZmlsZSB0byBkaXJlY3Qgc3RhbmRhcmQgZXJyb3IgZnJvbSB0aGUgY29tbWFuZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgVGhlIGZpbGUgdG8gZGlyZWN0IHN0YW5kYXJkIGVycm9yIGZyb20gdGhlIGNvbW1hbmQuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmFpbG9uZXJyb3IiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU3RvcCB0aGUgYnVpbGQgcHJvY2VzcyBpZiB0aGUgY29tbWFuZCBleGl0cyB3aXRoCisgYSByZXR1cm4gY29kZSBvdGhlciB0aGFuIDAuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFN0b3AgdGhlIGJ1aWxkIHByb2Nlc3MgaWYgdGhlIGNvbW1hbmQgZXhpdHMgd2l0aAorIGEgcmV0dXJuIGNvZGUgb3RoZXIgdGhhbiAwLgorIERlZmF1bHRzIHRvIGZhbHNlLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9Im5vZXhlYyIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlLCByZXBvcnQgb25seSBhbmQgZG9uJ3QgY2hhbmdlIGFueSBmaWxlcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgSWYgdHJ1ZSwgcmVwb3J0IG9ubHkgYW5kIGRvbid0IGNoYW5nZSBhbnkgZmlsZXMuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ib3V0cHV0IiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGZpbGUgdG8gZGlyZWN0IHN0YW5kYXJkIG91dHB1dCBmcm9tIHRoZSBjb21tYW5kLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBUaGUgZmlsZSB0byBkaXJlY3Qgc3RhbmRhcmQgb3V0cHV0IGZyb20gdGhlIGNvbW1hbmQuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icGFja2FnZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBwYWNrYWdlL21vZHVsZSB0byBvcGVyYXRlIHVwb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRoZSBwYWNrYWdlL21vZHVsZSB0byBvcGVyYXRlIHVwb24uCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icGFzc2ZpbGUiIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtQYXNzd29yZCBmaWxlIHRvIHJlYWQgcGFzc3dvcmRzIGZyb20uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFBhc3N3b3JkIGZpbGUgdG8gcmVhZCBwYXNzd29yZHMgZnJvbS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb3J0IiB0eXBlPSJpbnQiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iaW50IiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtQb3J0IHVzZWQgYnkgQ1ZTIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIHNlcnZlci5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgUG9ydCB1c2VkIGJ5IENWUyB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBzZXJ2ZXIuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icXVpZXQiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgdHJ1ZSwgc3VwcHJlc3MgaW5mb3JtYXRpb25hbCBtZXNzYWdlcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgSWYgdHJ1ZSwgc3VwcHJlc3MgaW5mb3JtYXRpb25hbCBtZXNzYWdlcy4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0YWciIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgdGFnIG9mIHRoZSBwYWNrYWdlL21vZHVsZSB0byBvcGVyYXRlIHVwb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRoZSB0YWcgb2YgdGhlIHBhY2thZ2UvbW9kdWxlIHRvIG9wZXJhdGUgdXBvbi4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgIDwvYXR0cmlidXRlcz4KKworICAgIDxlbGVtZW50cz4KKyAgICAgIDxlbGVtZW50IG5hbWU9ImNvbW1hbmRsaW5lIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Db21tYW5kbGluZSIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBkaXJlY3QgY29tbWFuZC1saW5lIHRvIGV4ZWN1dGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0FkZHMgZGlyZWN0IGNvbW1hbmQtbGluZSB0byBleGVjdXRlLl1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgPC9lbGVtZW50cz4KKworICA8L3N0cnVjdHVyZT4KKworPC90YXNrPgorCisKKzx0YXNrIG5hbWU9ImN2c2NoYW5nZWxvZyIgY2F0ZWdvcnk9Im90aGVyIgorICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jdnNsaWIuQ2hhbmdlTG9nVGFzayIKKyAgICAgID4KKworICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRXhhbWluZXMgdGhlIG91dHB1dCBvZiBjdnMgbG9nIGFuZCBncm91cCByZWxhdGVkIGNoYW5nZXMgdG9nZXRoZXIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgPGRlc2NyaXB0aW9uPgorICAgIDwhW0NEQVRBW0V4YW1pbmVzIHRoZSBvdXRwdXQgb2YgY3ZzIGxvZyBhbmQgZ3JvdXAgcmVsYXRlZCBjaGFuZ2VzIHRvZ2V0aGVyLgorCisgSXQgcHJvZHVjZXMgYW4gWE1MIG91dHB1dCByZXByZXNlbnRpbmcgdGhlIGxpc3Qgb2YgY2hhbmdlcy4KKyA8UFJFPgorIDxGT05UIGNvbG9yPSMwMDAwZmY+Jmx0OyEtLSBSb290IGVsZW1lbnQgLS0mZ3Q7PC9GT05UPgorIDxGT05UIGNvbG9yPSM2YTVhY2Q+Jmx0OyFFTEVNRU5UPC9GT05UPiBjaGFuZ2Vsb2cgPEZPTlQgY29sb3I9I2ZmMDBmZj4oZW50cnk8L0ZPTlQ+PEZPTlQgY29sb3I9I2ZmMDBmZj4rPC9GT05UPjxGT05UIGNvbG9yPSNmZjAwZmY+KTwvRk9OVD48Rk9OVCBjb2xvcj0jNmE1YWNkPiZndDs8L0ZPTlQ+CisgPEZPTlQgY29sb3I9IzAwMDBmZj4mbHQ7IS0tIENWUyBFbnRyeSAtLSZndDs8L0ZPTlQ+CisgPEZPTlQgY29sb3I9IzZhNWFjZD4mbHQ7IUVMRU1FTlQ8L0ZPTlQ+IGVudHJ5IDxGT05UIGNvbG9yPSNmZjAwZmY+KGRhdGUsYXV0aG9yLGZpbGU8L0ZPTlQ+PEZPTlQgY29sb3I9I2ZmMDBmZj4rPC9GT05UPjxGT05UIGNvbG9yPSNmZjAwZmY+LG1zZyk8L0ZPTlQ+PEZPTlQgY29sb3I9IzZhNWFjZD4mZ3Q7PC9GT05UPgorIDxGT05UIGNvbG9yPSMwMDAwZmY+Jmx0OyEtLSBEYXRlIG9mIGN2cyBlbnRyeSAtLSZndDs8L0ZPTlQ+CisgPEZPTlQgY29sb3I9IzZhNWFjZD4mbHQ7IUVMRU1FTlQ8L0ZPTlQ+IGRhdGUgPEZPTlQgY29sb3I9I2ZmMDBmZj4oI1BDREFUQSk8L0ZPTlQ+PEZPTlQgY29sb3I9IzZhNWFjZD4mZ3Q7PC9GT05UPgorIDxGT05UIGNvbG9yPSMwMDAwZmY+Jmx0OyEtLSBBdXRob3Igb2YgY2hhbmdlIC0tJmd0OzwvRk9OVD4KKyA8Rk9OVCBjb2xvcj0jNmE1YWNkPiZsdDshRUxFTUVOVDwvRk9OVD4gYXV0aG9yIDxGT05UIGNvbG9yPSNmZjAwZmY+KCNQQ0RBVEEpPC9GT05UPjxGT05UIGNvbG9yPSM2YTVhY2Q+Jmd0OzwvRk9OVD4KKyA8Rk9OVCBjb2xvcj0jMDAwMGZmPiZsdDshLS0gTGlzdCBvZiBmaWxlcyBhZmZlY3RlZCAtLSZndDs8L0ZPTlQ+CisgPEZPTlQgY29sb3I9IzZhNWFjZD4mbHQ7IUVMRU1FTlQ8L0ZPTlQ+IG1zZyA8Rk9OVCBjb2xvcj0jZmYwMGZmPigjUENEQVRBKTwvRk9OVD48Rk9OVCBjb2xvcj0jNmE1YWNkPiZndDs8L0ZPTlQ+CisgPEZPTlQgY29sb3I9IzAwMDBmZj4mbHQ7IS0tIEZpbGUgY2hhbmdlZCAtLSZndDs8L0ZPTlQ+CisgPEZPTlQgY29sb3I9IzZhNWFjZD4mbHQ7IUVMRU1FTlQ8L0ZPTlQ+IGZpbGUgPEZPTlQgY29sb3I9I2ZmMDBmZj4obmFtZSxyZXZpc2lvbixwcmV2cmV2aXNpb248L0ZPTlQ+PEZPTlQgY29sb3I9I2ZmMDBmZj4/PC9GT05UPjxGT05UIGNvbG9yPSNmZjAwZmY+KTwvRk9OVD48Rk9OVCBjb2xvcj0jNmE1YWNkPiZndDs8L0ZPTlQ+CisgPEZPTlQgY29sb3I9IzAwMDBmZj4mbHQ7IS0tIE5hbWUgb2YgdGhlIGZpbGUgLS0mZ3Q7PC9GT05UPgorIDxGT05UIGNvbG9yPSM2YTVhY2Q+Jmx0OyFFTEVNRU5UPC9GT05UPiBuYW1lIDxGT05UIGNvbG9yPSNmZjAwZmY+KCNQQ0RBVEEpPC9GT05UPjxGT05UIGNvbG9yPSM2YTVhY2Q+Jmd0OzwvRk9OVD4KKyA8Rk9OVCBjb2xvcj0jMDAwMGZmPiZsdDshLS0gUmV2aXNpb24gbnVtYmVyIC0tJmd0OzwvRk9OVD4KKyA8Rk9OVCBjb2xvcj0jNmE1YWNkPiZsdDshRUxFTUVOVDwvRk9OVD4gcmV2aXNpb24gPEZPTlQgY29sb3I9I2ZmMDBmZj4oI1BDREFUQSk8L0ZPTlQ+PEZPTlQgY29sb3I9IzZhNWFjZD4mZ3Q7PC9GT05UPgorIDxGT05UIGNvbG9yPSMwMDAwZmY+Jmx0OyEtLSBQcmV2aW91cyByZXZpc2lvbiBudW1iZXIgLS0mZ3Q7PC9GT05UPgorIDxGT05UIGNvbG9yPSM2YTVhY2Q+Jmx0OyFFTEVNRU5UPC9GT05UPiBwcmV2cmV2aXNpb24gPEZPTlQgY29sb3I9I2ZmMDBmZj4oI1BDREFUQSk8L0ZPTlQ+PEZPTlQgY29sb3I9IzZhNWFjZD4mZ3Q7PC9GT05UPgorIDwvUFJFPl1dPgorICA8L2Rlc2NyaXB0aW9uPgorCisgIDxzdHJ1Y3R1cmU+CisKKyAgICA8YXR0cmlidXRlcz4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGF5c2lucGFzdCIgdHlwZT0iaW50IgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImludCIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTnVtYmVyIG9mIGRheXMgd29ydGggb2YgbG9nIGVudHJpZXMgdG8gcHJvY2Vzcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBudW1iZXIgb2YgZGF5cyB3b3J0aCBvZiBsb2cgZW50cmllcyB0byBwcm9jZXNzLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlc3RmaWxlIiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbT3V0cHV0IGZpbGUgZm9yIHRoZSBsb2cuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCB0aGUgb3V0cHV0IGZpbGUgZm9yIHRoZSBsb2cuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGlyIiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQmFzZSBkaXIgZm9yIGN2cy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBiYXNlIGRpciBmb3IgY3ZzLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImVuZCIgdHlwZT0iamF2YS51dGlsLkRhdGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRGF0ZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRGF0ZSBhdCB3aGljaCB0aGUgY2hhbmdlbG9nIHNob3VsZCBzdG9wLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIGRhdGUgYXQgd2hpY2ggdGhlIGNoYW5nZWxvZyBzaG91bGQgc3RvcC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzdGFydCIgdHlwZT0iamF2YS51dGlsLkRhdGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRGF0ZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRGF0ZSBhdCB3aGljaCB0aGUgY2hhbmdlbG9nIHNob3VsZCBzdGFydC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBkYXRlIGF0IHdoaWNoIHRoZSBjaGFuZ2Vsb2cgc2hvdWxkIHN0YXJ0LgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InVzZXJzZmlsZSIgdHlwZT0iamF2YS5pby5GaWxlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0xvb2t1cCBsaXN0IG9mIHVzZXIgbmFtZXMgJiBhZGRyZXNzZXMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCBhIGxvb2t1cCBsaXN0IG9mIHVzZXIgbmFtZXMgJiBhZGRyZXNzZXMKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgIDwvYXR0cmlidXRlcz4KKworICAgIDxlbGVtZW50cz4KKyAgICAgIDxlbGVtZW50IG5hbWU9ImZpbGVzZXQiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVTZXQiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGVzZXQiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIGEgc2V0IG9mIGZpbGVzIGFib3V0IHdoaWNoIGN2cyBsb2dzIHdpbGwgYmUgZ2VuZXJhdGVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtBZGRzIGEgc2V0IG9mIGZpbGVzIGFib3V0IHdoaWNoIGN2cyBsb2dzIHdpbGwgYmUgZ2VuZXJhdGVkLl1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgICA8ZWxlbWVudCBuYW1lPSJ1c2VyIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jdnNsaWIuQ3ZzVXNlciIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkIGEgdXNlciB0byBsaXN0IGNoYW5nZWxvZyBrbm93cyBhYm91dC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbQWRkIGEgdXNlciB0byBsaXN0IGNoYW5nZWxvZyBrbm93cyBhYm91dC5dXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgIDwvZWxlbWVudHM+CisKKyAgPC9zdHJ1Y3R1cmU+CisKKzwvdGFzaz4KKworCis8dGFzayBuYW1lPSJjdnNwYXNzIiBjYXRlZ29yeT0ic2NtIgorICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5DVlNQYXNzIgorICAgICAgPgorCisgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIGFuIG5ldyBlbnRyeSB0byBhIENWUyBwYXNzd29yZCBmaWxlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgIDxkZXNjcmlwdGlvbj4KKyAgICA8IVtDREFUQVtBZGRzIGFuIG5ldyBlbnRyeSB0byBhIENWUyBwYXNzd29yZCBmaWxlLl1dPgorICA8L2Rlc2NyaXB0aW9uPgorCisgIDxzdHJ1Y3R1cmU+CisKKyAgICA8YXR0cmlidXRlcz4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY3Zzcm9vdCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBDVlMgcmVwb3NpdG9yeSB0byBhZGQgYW4gZW50cnkgZm9yLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBUaGUgQ1ZTIHJlcG9zaXRvcnkgdG8gYWRkIGFuIGVudHJ5IGZvci4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwYXNzZmlsZSIgdHlwZT0iamF2YS5pby5GaWxlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1Bhc3N3b3JkIGZpbGUgdG8gYWRkIHRoZSBlbnRyeSB0by5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgUGFzc3dvcmQgZmlsZSB0byBhZGQgdGhlIGVudHJ5IHRvLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InBhc3N3b3JkIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbUGFzc3dvcmQgdG8gYmUgYWRkZWQgdG8gdGhlIHBhc3N3b3JkIGZpbGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFBhc3N3b3JkIHRvIGJlIGFkZGVkIHRvIHRoZSBwYXNzd29yZCBmaWxlLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgPC9hdHRyaWJ1dGVzPgorCisgICAgPGVsZW1lbnRzPgorICAgIDwvZWxlbWVudHM+CisKKyAgPC9zdHJ1Y3R1cmU+CisKKzwvdGFzaz4KKworCis8dGFzayBuYW1lPSJjdnN0YWdkaWZmIiBjYXRlZ29yeT0ib3RoZXIiCisgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmN2c2xpYi5DdnNUYWdEaWZmIgorICAgICAgPgorCisgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtFeGFtaW5lcyB0aGUgb3V0cHV0IG9mIGN2cyByZGlmZiBiZXR3ZWVuIHR3byB0YWdzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgIDxkZXNjcmlwdGlvbj4KKyAgICA8IVtDREFUQVtFeGFtaW5lcyB0aGUgb3V0cHV0IG9mIGN2cyByZGlmZiBiZXR3ZWVuIHR3byB0YWdzLgorCisgSXQgcHJvZHVjZXMgYW4gWE1MIG91dHB1dCByZXByZXNlbnRpbmcgdGhlIGxpc3Qgb2YgY2hhbmdlcy4KKyA8UFJFPgorICZsdDshLS0gUm9vdCBlbGVtZW50IC0tJmd0OworICZsdDshRUxFTUVOVCB0YWdkaWZmICggZW50cnkrICkgJmd0OworICZsdDshLS0gU3RhcnQgdGFnIG9mIHRoZSByZXBvcnQgLS0mZ3Q7CisgJmx0OyFBVFRMSVNUIHRhZ2RpZmYgc3RhcnRUYWcgTk1UT0tFTiAjSU1QTElFRCAmZ3Q7CisgJmx0OyEtLSBFbmQgdGFnIG9mIHRoZSByZXBvcnQgLS0mZ3Q7CisgJmx0OyFBVFRMSVNUIHRhZ2RpZmYgZW5kVGFnIE5NVE9LRU4gI0lNUExJRUQgJmd0OworICZsdDshLS0gU3RhcnQgZGF0ZSBvZiB0aGUgcmVwb3J0IC0tJmd0OworICZsdDshQVRUTElTVCB0YWdkaWZmIHN0YXJ0RGF0ZSBOTVRPS0VOICNJTVBMSUVEICZndDsKKyAmbHQ7IS0tIEVuZCBkYXRlIG9mIHRoZSByZXBvcnQgLS0mZ3Q7CisgJmx0OyFBVFRMSVNUIHRhZ2RpZmYgZW5kRGF0ZSBOTVRPS0VOICNJTVBMSUVEICZndDsKKworICZsdDshLS0gQ1ZTIHRhZyBlbnRyeSAtLSZndDsKKyAmbHQ7IUVMRU1FTlQgZW50cnkgKCBmaWxlICkgJmd0OworICZsdDshLS0gRmlsZSBhZGRlZCwgY2hhbmdlZCBvciByZW1vdmVkIC0tJmd0OworICZsdDshRUxFTUVOVCBmaWxlICggbmFtZSwgcmV2aXNpb24/LCBwcmV2cmV2aXNpb24/ICkgJmd0OworICZsdDshLS0gTmFtZSBvZiB0aGUgZmlsZSAtLSZndDsKKyAmbHQ7IUVMRU1FTlQgbmFtZSAoICNQQ0RBVEEgKSAmZ3Q7CisgJmx0OyEtLSBSZXZpc2lvbiBudW1iZXIgLS0mZ3Q7CisgJmx0OyFFTEVNRU5UIHJldmlzaW9uICggI1BDREFUQSApICZndDsKKyAmbHQ7IS0tIFByZXZpb3VzIHJldmlzaW9uIG51bWJlciAtLSZndDsKKyAmbHQ7IUVMRU1FTlQgcHJldnJldmlzaW9uICggI1BDREFUQSApICZndDsKKyA8L1BSRT5dXT4KKyAgPC9kZXNjcmlwdGlvbj4KKworICA8c3RydWN0dXJlPgorCisgICAgPGF0dHJpYnV0ZXM+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNvbXByZXNzaW9uIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIHRoaXMgaXMgdGhlIHNhbWUgYXMgY29tcHJlc3Npb25sZXZlbD0iMyIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIElmIHRydWUsIHRoaXMgaXMgdGhlIHNhbWUgYXMgY29tcHJlc3Npb25sZXZlbD0iMyIuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29tcHJlc3Npb25sZXZlbCIgdHlwZT0iaW50IgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImludCIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgc2V0IHRvIGEgdmFsdWUgMS05IGl0IGFkZHMgLXpOIHRvIHRoZSBjdnMgY29tbWFuZCBsaW5lLCBlbHNlCisgaXQgZGlzYWJsZXMgY29tcHJlc3Npb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIElmIHNldCB0byBhIHZhbHVlIDEtOSBpdCBhZGRzIC16TiB0byB0aGUgY3ZzIGNvbW1hbmQgbGluZSwgZWxzZQorIGl0IGRpc2FibGVzIGNvbXByZXNzaW9uLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImN2c3Jvb3QiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgQ1ZTUk9PVCB2YXJpYWJsZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgVGhlIENWU1JPT1QgdmFyaWFibGUuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY3ZzcnNoIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIENWU19SU0ggdmFyaWFibGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRoZSBDVlNfUlNIIHZhcmlhYmxlLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlc3RmaWxlIiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbT3V0cHV0IGZpbGUgZm9yIHRoZSBkaWZmLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIG91dHB1dCBmaWxlIGZvciB0aGUgZGlmZi4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJlbmRkYXRlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRW5kIGRhdGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCB0aGUgZW5kIGRhdGUuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZW5kdGFnIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRW5kIHRhZy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBlbmQgdGFnLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImZhaWxvbmVycm9yIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1N0b3AgdGhlIGJ1aWxkIHByb2Nlc3MgaWYgdGhlIGNvbW1hbmQgZXhpdHMgd2l0aAorIGEgcmV0dXJuIGNvZGUgb3RoZXIgdGhhbiAwLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTdG9wIHRoZSBidWlsZCBwcm9jZXNzIGlmIHRoZSBjb21tYW5kIGV4aXRzIHdpdGgKKyBhIHJldHVybiBjb2RlIG90aGVyIHRoYW4gMC4KKyBEZWZhdWx0cyB0byBmYWxzZS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwYWNrYWdlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIHBhY2thZ2UvbW9kdWxlIHRvIGFuYWx5emUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRoZSBwYWNrYWdlL21vZHVsZSB0byBhbmFseXplLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InBhc3NmaWxlIiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbUGFzc3dvcmQgZmlsZSB0byByZWFkIHBhc3N3b3JkcyBmcm9tLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBQYXNzd29yZCBmaWxlIHRvIHJlYWQgcGFzc3dvcmRzIGZyb20uCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9ydCIgdHlwZT0iaW50IgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImludCIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbUG9ydCB1c2VkIGJ5IENWUyB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBzZXJ2ZXIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFBvcnQgdXNlZCBieSBDVlMgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgc2VydmVyLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InF1aWV0IiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIHN1cHByZXNzIGluZm9ybWF0aW9uYWwgbWVzc2FnZXMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIElmIHRydWUsIHN1cHByZXNzIGluZm9ybWF0aW9uYWwgbWVzc2FnZXMuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3RhcnRkYXRlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU3RhcnQgZGF0ZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBzdGFydCBkYXRlLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InN0YXJ0dGFnIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU3RhcnQgdGFnLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIHN0YXJ0IHRhZy4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgIDwvYXR0cmlidXRlcz4KKworICAgIDxlbGVtZW50cz4KKyAgICA8L2VsZW1lbnRzPgorCisgIDwvc3RydWN0dXJlPgorCis8L3Rhc2s+CisKKworPHRhc2sgbmFtZT0iZGRjcmVhdG9yIiBjYXRlZ29yeT0ib3RoZXIiCisgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmVqYi5ERENyZWF0b3IiCisgICAgICBtYXRjaGluZ1Rhc2s9InRydWUiPgorCisgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtCdWlsZHMgYSBzZXJpYWxpemVkIGRlcGxveW1lbnQgZGVzY3JpcHRvciBnaXZlbiBhIHRleHQgZmlsZSBkZXNjcmlwdGlvbiBvZiB0aGUgZGVzY3JpcHRvciBpbiB0aGUgZm9ybWF0IHN1cHBvcnRlZCBieSBXZWJMb2dpYy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICA8ZGVzY3JpcHRpb24+CisgICAgPCFbQ0RBVEFbQnVpbGRzIGEgc2VyaWFsaXplZCBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZ2l2ZW4gYSB0ZXh0IGZpbGUgZGVzY3JpcHRpb24gb2YgdGhlCisgZGVzY3JpcHRvciBpbiB0aGUgZm9ybWF0IHN1cHBvcnRlZCBieSBXZWJMb2dpYy4KKworIFRoaXMgYW50IHRhc2sgaXMgYSBmcm9udCBlbmQgZm9yIHRoZSB3ZWJsb2dpYyBERENyZWF0b3IgdG9vbC5dXT4KKyAgPC9kZXNjcmlwdGlvbj4KKworICA8c3RydWN0dXJlPgorCisgICAgPGF0dHJpYnV0ZXM+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzcGF0aCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NsYXNzcGF0aCB0byBiZSB1c2VkIGZvciB0aGlzIGNvbXBpbGF0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIGNsYXNzcGF0aCB0byBiZSB1c2VkIGZvciB0aGlzIGNvbXBpbGF0aW9uLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlc2NyaXB0b3JzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRGlyZWN0b3J5IGZyb20gd2hlcmUgdGhlIHRleHQgZGVzY3JpcHRpb25zIG9mIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIGFyZQorIHRvIGJlIHJlYWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCB0aGUgZGlyZWN0b3J5IGZyb20gd2hlcmUgdGhlIHRleHQgZGVzY3JpcHRpb25zIG9mIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIGFyZQorIHRvIGJlIHJlYWQuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVzdCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0RpcmVjdG9yeSBpbnRvIHdoaWNoIHRoZSBzZXJpYWxpemVkIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgYXJlIHRvCisgYmUgd3JpdHRlbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBkaXJlY3RvcnkgaW50byB3aGljaCB0aGUgc2VyaWFsaXplZCBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIGFyZSB0bworIGJlIHdyaXR0ZW4uCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICA8L2F0dHJpYnV0ZXM+CisKKyAgICA8ZWxlbWVudHM+CisgICAgPC9lbGVtZW50cz4KKworICA8L3N0cnVjdHVyZT4KKworPC90YXNrPgorCisKKzx0YXNrIG5hbWU9ImRlbGV0ZSIgY2F0ZWdvcnk9ImZpbGVzeXN0ZW0iCisgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkRlbGV0ZSIKKyAgICAgIG1hdGNoaW5nVGFzaz0idHJ1ZSI+CisKKyAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0RlbGV0ZXMgYSBmaWxlIG9yIGRpcmVjdG9yeSwgb3Igc2V0IG9mIGZpbGVzIGRlZmluZWQgYnkgYSBmaWxlc2V0Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgIDxkZXNjcmlwdGlvbj4KKyAgICA8IVtDREFUQVtEZWxldGVzIGEgZmlsZSBvciBkaXJlY3RvcnksIG9yIHNldCBvZiBmaWxlcyBkZWZpbmVkIGJ5IGEgZmlsZXNldC4KKyBUaGUgb3JpZ2luYWwgZGVsZXRlIHRhc2sgd291bGQgZGVsZXRlIGEgZmlsZSwgb3IgYSBzZXQgb2YgZmlsZXMgCisgdXNpbmcgdGhlIGluY2x1ZGUvZXhjbHVkZSBzeW50YXguICBUaGUgZGVsdHJlZSB0YXNrIHdvdWxkIGRlbGV0ZSBhIAorIGRpcmVjdG9yeSB0cmVlLiAgVGhpcyB0YXNrIGNvbWJpbmVzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoZXNlIHR3bworIG9yaWdpbmFsbHkgZGlzdGluY3QgdGFza3MuCisgPHA+Q3VycmVudGx5IERlbGV0ZSBleHRlbmRzIE1hdGNoaW5nVGFzay4gIFRoaXMgaXMgaW50ZW5kIDxpPm9ubHk8L2k+CisgdG8gcHJvdmlkZSBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBmb3IgYSByZWxlYXNlLiAgVGhlIGZ1dHVyZSBwb3NpdGlvbgorIGlzIHRvIHVzZSBuZXN0ZWQgZmlsZXNldHMgZXhjbHVzaXZlbHkuPC9wPl1dPgorICA8L2Rlc2NyaXB0aW9uPgorCisgIDxzdHJ1Y3R1cmU+CisKKyAgICA8YXR0cmlidXRlcz4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVmYXVsdGV4Y2x1ZGVzIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NldHMgd2hldGhlciBkZWZhdWx0IGV4Y2x1c2lvbnMgc2hvdWxkIGJlIHVzZWQgb3Igbm90Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXRzIHdoZXRoZXIgZGVmYXVsdCBleGNsdXNpb25zIHNob3VsZCBiZSB1c2VkIG9yIG5vdC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkaXIiIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtEaXJlY3RvcnkgZnJvbSB3aGljaCBmaWxlcyBhcmUgdG8gYmUgZGVsZXRlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBkaXJlY3RvcnkgZnJvbSB3aGljaCBmaWxlcyBhcmUgdG8gYmUgZGVsZXRlZAorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImV4Y2x1ZGVzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2V0IG9mIGV4Y2x1ZGUgcGF0dGVybnMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldHMgdGhlIHNldCBvZiBleGNsdWRlIHBhdHRlcm5zLiBQYXR0ZXJucyBtYXkgYmUgc2VwYXJhdGVkIGJ5IGEgY29tbWEKKyBvciBhIHNwYWNlLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImV4Y2x1ZGVzZmlsZSIgdHlwZT0iamF2YS5pby5GaWxlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW05hbWUgb2YgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgaW5jbHVkZXMgcGF0dGVybnMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldHMgdGhlIG5hbWUgb2YgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgaW5jbHVkZXMgcGF0dGVybnMuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmFpbG9uZXJyb3IiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgZmFsc2UsIG5vdGUgZXJyb3JzIGJ1dCBjb250aW51ZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgSWYgZmFsc2UsIG5vdGUgZXJyb3JzIGJ1dCBjb250aW51ZS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmaWxlIiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTmFtZSBvZiBhIHNpbmdsZSBmaWxlIHRvIGJlIHJlbW92ZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCB0aGUgbmFtZSBvZiBhIHNpbmdsZSBmaWxlIHRvIGJlIHJlbW92ZWQuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaW5jbHVkZWVtcHR5ZGlycyIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlLCBkZWxldGUgZW1wdHkgZGlyZWN0b3JpZXMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIElmIHRydWUsIGRlbGV0ZSBlbXB0eSBkaXJlY3Rvcmllcy4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpbmNsdWRlcyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NldCBvZiBpbmNsdWRlIHBhdHRlcm5zLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXRzIHRoZSBzZXQgb2YgaW5jbHVkZSBwYXR0ZXJucy4gUGF0dGVybnMgbWF5IGJlIHNlcGFyYXRlZCBieSBhIGNvbW1hCisgb3IgYSBzcGFjZS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpbmNsdWRlc2ZpbGUiIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtOYW1lIG9mIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGluY2x1ZGVzIHBhdHRlcm5zLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXRzIHRoZSBuYW1lIG9mIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGluY2x1ZGVzIHBhdHRlcm5zLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InF1aWV0IiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUgYW5kIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0LCBkbyBub3QgZGlzcGxheSBhIGRpYWdub3N0aWMKKyBtZXNzYWdlIG9yIG1vZGlmeSB0aGUgZXhpdCBzdGF0dXMgdG8gcmVmbGVjdCBhbiBlcnJvci5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgSWYgdHJ1ZSBhbmQgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QsIGRvIG5vdCBkaXNwbGF5IGEgZGlhZ25vc3RpYworIG1lc3NhZ2Ugb3IgbW9kaWZ5IHRoZSBleGl0IHN0YXR1cyB0byByZWZsZWN0IGFuIGVycm9yLgorIFRoaXMgbWVhbnMgdGhhdCBpZiBhIGZpbGUgb3IgZGlyZWN0b3J5IGNhbm5vdCBiZSBkZWxldGVkLAorIHRoZW4gbm8gZXJyb3IgaXMgcmVwb3J0ZWQuIFRoaXMgc2V0dGluZyBlbXVsYXRlcyB0aGUKKyAtZiBvcHRpb24gdG8gdGhlIFVuaXggJnF1b3Q7cm0mcXVvdDsgY29tbWFuZC4KKyBEZWZhdWx0IGlzIGZhbHNlIG1lYW5pbmcgdGhpbmdzIGFyZSAmcXVvdDtub2lzeSZxdW90OworICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InZlcmJvc2UiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgdHJ1ZSwgbGlzdCBhbGwgbmFtZXMgb2YgZGVsZXRlZCBmaWxlcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgSWYgdHJ1ZSwgbGlzdCBhbGwgbmFtZXMgb2YgZGVsZXRlZCBmaWxlcy4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgIDwvYXR0cmlidXRlcz4KKworICAgIDxlbGVtZW50cz4KKyAgICAgIDxlbGVtZW50IG5hbWU9ImZpbGVzZXQiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVTZXQiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGVzZXQiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIGEgc2V0IG9mIGZpbGVzIHRvIGJlIGRlbGV0ZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0FkZHMgYSBzZXQgb2YgZmlsZXMgdG8gYmUgZGVsZXRlZC5dXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgICAgPGVsZW1lbnQgbmFtZT0iZXhjbHVkZSIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0dGVyblNldC5OYW1lRW50cnkiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IiIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZCBhIG5hbWUgZW50cnkgb24gdGhlIGV4Y2x1ZGUgbGlzdC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbYWRkIGEgbmFtZSBlbnRyeSBvbiB0aGUgZXhjbHVkZSBsaXN0XV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICAgIDxlbGVtZW50IG5hbWU9ImV4Y2x1ZGVzZmlsZSIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0dGVyblNldC5OYW1lRW50cnkiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IiIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZCBhIG5hbWUgZW50cnkgb24gdGhlIGluY2x1ZGUgZmlsZXMgbGlzdC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbYWRkIGEgbmFtZSBlbnRyeSBvbiB0aGUgaW5jbHVkZSBmaWxlcyBsaXN0XV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICAgIDxlbGVtZW50IG5hbWU9ImluY2x1ZGUiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdHRlcm5TZXQuTmFtZUVudHJ5IgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGQgYSBuYW1lIGVudHJ5IG9uIHRoZSBpbmNsdWRlIGxpc3QuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW2FkZCBhIG5hbWUgZW50cnkgb24gdGhlIGluY2x1ZGUgbGlzdF1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgICA8ZWxlbWVudCBuYW1lPSJpbmNsdWRlc2ZpbGUiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdHRlcm5TZXQuTmFtZUVudHJ5IgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGQgYSBuYW1lIGVudHJ5IG9uIHRoZSBpbmNsdWRlIGZpbGVzIGxpc3QuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW2FkZCBhIG5hbWUgZW50cnkgb24gdGhlIGluY2x1ZGUgZmlsZXMgbGlzdF1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgICA8ZWxlbWVudCBuYW1lPSJwYXR0ZXJuc2V0IiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXR0ZXJuU2V0IgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJQYXR0ZXJuc2V0IgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkIGEgc2V0IG9mIHBhdHRlcm5zLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVthZGQgYSBzZXQgb2YgcGF0dGVybnNdXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgIDwvZWxlbWVudHM+CisKKyAgPC9zdHJ1Y3R1cmU+CisKKzwvdGFzaz4KKworCis8dGFzayBuYW1lPSJkZWx0cmVlIiBjYXRlZ29yeT0ib3RoZXIiCisgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkRlbHRyZWUiCisgICAgICBkZXByZWNhdGVkPSJ0cnVlIgorICAgICAgPgorCisgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtObyBEZXNjcmlwdGlvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICA8ZGVzY3JpcHRpb24+CisgICAgPCFbQ0RBVEFbXV0+CisgIDwvZGVzY3JpcHRpb24+CisKKyAgPHN0cnVjdHVyZT4KKworICAgIDxhdHRyaWJ1dGVzPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkaXIiIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtEaXJlY3RvcnkgdG8gYmUgZGVsZXRlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBkaXJlY3RvcnkgdG8gYmUgZGVsZXRlZAorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgPC9hdHRyaWJ1dGVzPgorCisgICAgPGVsZW1lbnRzPgorICAgIDwvZWxlbWVudHM+CisKKyAgPC9zdHJ1Y3R1cmU+CisKKzwvdGFzaz4KKworCis8dGFzayBuYW1lPSJkZXBlbmQiIGNhdGVnb3J5PSJvdGhlciIKKyAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZGVwZW5kLkRlcGVuZCIKKyAgICAgIG1hdGNoaW5nVGFzaz0idHJ1ZSI+CisKKyAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0dlbmVyYXRlcyBhIGRlcGVuZGVuY3kgZmlsZSBmb3IgYSBnaXZlbiBzZXQgb2YgY2xhc3Nlcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICA8ZGVzY3JpcHRpb24+CisgICAgPCFbQ0RBVEFbR2VuZXJhdGVzIGEgZGVwZW5kZW5jeSBmaWxlIGZvciBhIGdpdmVuIHNldCBvZiBjbGFzc2VzLl1dPgorICA8L2Rlc2NyaXB0aW9uPgorCisgIDxzdHJ1Y3R1cmU+CisKKyAgICA8YXR0cmlidXRlcz4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2FjaGUiIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtEZXBlbmRlbmN5IGNhY2hlIGZpbGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldHMgdGhlIGRlcGVuZGVuY3kgY2FjaGUgZmlsZS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc3BhdGgiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUGF0aCIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ2xhc3NwYXRoIHRvIGJlIHVzZWQgZm9yIHRoaXMgZGVwZW5kZW5jeSBjaGVjay5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBjbGFzc3BhdGggdG8gYmUgdXNlZCBmb3IgdGhpcyBkZXBlbmRlbmN5IGNoZWNrLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzcGF0aHJlZiIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVmZXJlbmNlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlJlZmVyZW5jZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBhIHJlZmVyZW5jZSB0byBhIGNsYXNzcGF0aCBkZWZpbmVkIGVsc2V3aGVyZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgQWRkcyBhIHJlZmVyZW5jZSB0byBhIGNsYXNzcGF0aCBkZWZpbmVkIGVsc2V3aGVyZS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbG9zdXJlIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIHRyYW5zaXRpdmUgZGVwZW5kZW5jaWVzIGFyZSBmb2xsb3dlZCB1bnRpbCB0aGUKKyBjbG9zdXJlIG9mIHRoZSBkZXBlbmRlbmN5IHNldCBpZiByZWFjaGVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBJZiB0cnVlLCB0cmFuc2l0aXZlIGRlcGVuZGVuY2llcyBhcmUgZm9sbG93ZWQgdW50aWwgdGhlCisgY2xvc3VyZSBvZiB0aGUgZGVwZW5kZW5jeSBzZXQgaWYgcmVhY2hlZC4KKyBXaGVuIG5vdCBzZXQsIHRoZSBkZXBlbmQgdGFzayB3aWxsIG9ubHkgZm9sbG93CisgZGlyZWN0IGRlcGVuZGVuY2llcyBiZXR3ZWVuIGNsYXNzZXMuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVzdGRpciIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aCIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJQYXRoIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtEZXN0aW5hdGlvbiBkaXJlY3Rvcnkgd2hlcmUgdGhlIGNvbXBpbGVkIEphdmEgZmlsZXMgZXhpc3QuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5IHdoZXJlIHRoZSBjb21waWxlZCBKYXZhIGZpbGVzIGV4aXN0LgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImR1bXAiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgdHJ1ZSwgdGhlIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24gd2lsbCBiZSB3cml0dGVuCisgdG8gdGhlIGRlYnVnIGxldmVsIGxvZy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgSWYgdHJ1ZSwgdGhlIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24gd2lsbCBiZSB3cml0dGVuCisgdG8gdGhlIGRlYnVnIGxldmVsIGxvZy4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzcmNkaXIiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUGF0aCIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRGlyZWN0b3JpZXMgcGF0aCB0byBmaW5kIHRoZSBKYXZhIHNvdXJjZSBmaWxlcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBkaXJlY3RvcmllcyBwYXRoIHRvIGZpbmQgdGhlIEphdmEgc291cmNlIGZpbGVzLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgPC9hdHRyaWJ1dGVzPgorCisgICAgPGVsZW1lbnRzPgorICAgICAgPGVsZW1lbnQgbmFtZT0iY2xhc3NwYXRoIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoIgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJQYXRoIgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBhIGNsYXNzcGF0aCB0byBiZSB1c2VkIGZvciB0aGlzIGRlcGVuZGVuY3kgY2hlY2suXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0FkZHMgYSBjbGFzc3BhdGggdG8gYmUgdXNlZCBmb3IgdGhpcyBkZXBlbmRlbmN5IGNoZWNrLl1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgPC9lbGVtZW50cz4KKworICA8L3N0cnVjdHVyZT4KKworPC90YXNrPgorCisKKzx0YXNrIG5hbWU9ImRlcGVuZHNldCIgY2F0ZWdvcnk9ImZpbGVzeXN0ZW0iCisgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkRlcGVuZFNldCIKKyAgICAgIG1hdGNoaW5nVGFzaz0idHJ1ZSI+CisKKyAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0V4YW1pbmVzIGFuZCByZW1vdmVzIG91dCBvZiBkYXRlIHRhcmdldCBmaWxlcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICA8ZGVzY3JpcHRpb24+CisgICAgPCFbQ0RBVEFbRXhhbWluZXMgYW5kIHJlbW92ZXMgb3V0IG9mIGRhdGUgdGFyZ2V0IGZpbGVzLiAgSWYgYW55IG9mIHRoZSB0YXJnZXQgZmlsZXMKKyBhcmUgb3V0IG9mIGRhdGUgd2l0aCByZXNwZWN0IHRvIGFueSBvZiB0aGUgc291cmNlIGZpbGVzLCBhbGwgdGFyZ2V0CisgZmlsZXMgYXJlIHJlbW92ZWQuICBUaGlzIGlzIHVzZWZ1bCB3aGVyZSBkZXBlbmRlbmNpZXMgY2Fubm90IGJlCisgY29tcHV0ZWQgKGZvciBleGFtcGxlLCBkeW5hbWljYWxseSBpbnRlcnByZXRlZCBwYXJhbWV0ZXJzIG9yIGZpbGVzCisgdGhhdCBuZWVkIHRvIHN0YXkgaW4gc3luY2ggYnV0IGFyZSBub3QgZGlyZWN0bHkgbGlua2VkKSBvciB3aGVyZQorIHRoZSBhbnQgdGFzayBpbiBxdWVzdGlvbiBjb3VsZCBjb21wdXRlIHRoZW0gYnV0IGRvZXMgbm90IChmb3IKKyBleGFtcGxlLCB0aGUgbGlua2VkIERURCBmb3IgYW4gWE1MIGZpbGUgdXNpbmcgdGhlIHN0eWxlIHRhc2spLgorCisgbmVzdGVkIGFyZ3VtZW50czoKKyA8dWw+CisgPGxpPnNyY2ZpbGVzZXQgICAgIChmaWxlc2V0IGRlc2NyaWJpbmcgdGhlIHNvdXJjZSBmaWxlcyB0byBleGFtaW5lKQorIDxsaT5zcmNmaWxlbGlzdCAgICAoZmlsZWxpc3QgZGVzY3JpYmluZyB0aGUgc291cmNlIGZpbGVzIHRvIGV4YW1pbmUpCisgPGxpPnRhcmdldGZpbGVzZXQgIChmaWxlc2V0IGRlc2NyaWJpbmcgdGhlIHRhcmdldCBmaWxlcyB0byBleGFtaW5lKQorIDxsaT50YXJnZXRmaWxlbGlzdCAoZmlsZWxpc3QgZGVzY3JpYmluZyB0aGUgdGFyZ2V0IGZpbGVzIHRvIGV4YW1pbmUpCisgPC91bD4KKyBBdCBsZWFzdCBvbmUgaW5zdGFuY2Ugb2YgZWl0aGVyIGEgZmlsZXNldCBvciBmaWxlbGlzdCBmb3IgYm90aCBzb3VyY2UgYW5kIAorIHRhcmdldCBhcmUgcmVxdWlyZWQuCisgPHA+CisgVGhpcyB0YXNrIHdpbGwgZXhhbWluZSBlYWNoIG9mIHRoZSBzb3VyY2UgZmlsZXMgYWdhaW5zdCBlYWNoIG9mIHRoZSB0YXJnZXQgCisgZmlsZXMuIElmIGFueSB0YXJnZXQgZmlsZXMgYXJlIG91dCBvZiBkYXRlIHdpdGggcmVzcGVjdCB0byBhbnkgb2YgdGhlIHNvdXJjZSAKKyBmaWxlcywgYWxsIHRhcmdldHMgYXJlIHJlbW92ZWQuIElmIGFueSBmaWxlcyBuYW1lZCBpbiBhIChzcmMgb3IgdGFyZ2V0KSAKKyBmaWxlbGlzdCBkbyBub3QgZXhpc3QsIGFsbCB0YXJnZXRzIGFyZSByZW1vdmVkLgorIEhpbnQ6IElmIG1pc3NpbmcgZmlsZXMgc2hvdWxkIGJlIGlnbm9yZWQsIHNwZWNpZnkgdGhlbSBhcyBpbmNsdWRlIHBhdHRlcm5zIAorIGluIGZpbGVzZXRzLCByYXRoZXIgdGhhbiB1c2luZyBmaWxlbGlzdHMuCisgPC9wPjxwPgorIFRoaXMgdGFzayBhdHRlbXB0cyB0byBvcHRpbWl6ZSBzcGVlZCBvZiBkZXBlbmRlbmN5IGNoZWNraW5nLiAgSXQgd2lsbCBzdG9wIAorIGFmdGVyIHRoZSBmaXJzdCBvdXQgb2YgZGF0ZSBmaWxlIGlzIGZvdW5kIGFuZCByZW1vdmUgYWxsIHRhcmdldHMsIHJhdGhlciAKKyB0aGFuIGV4aGF1c3RpdmVseSBjaGVja2luZyBldmVyeSBzb3VyY2UgdnMgdGFyZ2V0IGNvbWJpbmF0aW9uIHVubmVjZXNzYXJpbHkuCisgPC9wPjxwPgorIEV4YW1wbGUgdXNlczogCisgPHVsPjxsaT4KKyBSZWNvcmQgdGhlIGZhY3QgdGhhdCBhbiBYTUwgZmlsZSBtdXN0IGJlIHVwIHRvIGRhdGUKKyB3aXRoIHJlc3BlY3QgdG8gaXRzIFhTRCAoU2NoZW1hIGZpbGUpLCBldmVuIHRob3VnaCB0aGUgWE1MIGZpbGUKKyBpdHNlbGYgaW5jbHVkZXMgbm8gcmVmZXJlbmNlIHRvIGl0cyBYU0QuCisgPC9saT48bGk+CisgUmVjb3JkIHRoZSBmYWN0IHRoYXQgYW4gWFNMIHN0eWxlc2hlZXQgaW5jbHVkZXMgb3RoZXIKKyBzdWItc3R5bGVzaGVldHMKKyA8L2xpPjxsaT4KKyBSZWNvcmQgdGhlIGZhY3QgdGhhdCBqYXZhIGZpbGVzIG11c3QgYmUgcmVjb21waWxlZCBpZiB0aGUgYW50IGJ1aWxkCisgZmlsZSBjaGFuZ2VzCisgPC9saT48L3VsPl1dPgorICA8L2Rlc2NyaXB0aW9uPgorCisgIDxzdHJ1Y3R1cmU+CisKKyAgICA8YXR0cmlidXRlcz4KKyAgICA8L2F0dHJpYnV0ZXM+CisKKyAgICA8ZWxlbWVudHM+CisgICAgICA8ZWxlbWVudCBuYW1lPSJzcmNmaWxlbGlzdCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZUxpc3QiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGVsaXN0IgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkIGEgbGlzdCBvZiBzb3VyY2UgZmlsZXMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0FkZCBhIGxpc3Qgb2Ygc291cmNlIGZpbGVzLl1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgICA8ZWxlbWVudCBuYW1lPSJzcmNmaWxlc2V0IiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0IgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlc2V0IgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkIGEgc2V0IG9mIHNvdXJjZSBmaWxlcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbQWRkIGEgc2V0IG9mIHNvdXJjZSBmaWxlcy5dXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgICAgPGVsZW1lbnQgbmFtZT0idGFyZ2V0ZmlsZWxpc3QiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVMaXN0IgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlbGlzdCIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZCBhIGxpc3Qgb2YgdGFyZ2V0IGZpbGVzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtBZGQgYSBsaXN0IG9mIHRhcmdldCBmaWxlcy5dXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgICAgPGVsZW1lbnQgbmFtZT0idGFyZ2V0ZmlsZXNldCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldCIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZXNldCIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZCBhIHNldCBvZiB0YXJnZXQgZmlsZXMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0FkZCBhIHNldCBvZiB0YXJnZXQgZmlsZXMuXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICA8L2VsZW1lbnRzPgorCisgIDwvc3RydWN0dXJlPgorCis8L3Rhc2s+CisKKworPHRhc2sgbmFtZT0iZGlybmFtZSIgY2F0ZWdvcnk9InByb3BlcnR5IgorICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5EaXJuYW1lIgorICAgICAgPgorCisgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtEZXRlcm1pbmVzIHRoZSBkaXJlY3RvcnkgbmFtZSBvZiB0aGUgc3BlY2lmaWVkIGZpbGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgPGRlc2NyaXB0aW9uPgorICAgIDwhW0NEQVRBW0RldGVybWluZXMgdGhlIGRpcmVjdG9yeSBuYW1lIG9mIHRoZSBzcGVjaWZpZWQgZmlsZS4KKworIFRoaXMgdGFzayBjYW4gYWNjZXB0IHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczoKKyA8dWw+CisgPGxpPmZpbGUKKyA8bGk+cHJvcGVydHkKKyA8L3VsPgorIEJvdGggPGI+ZmlsZTwvYj4gYW5kIDxiPnByb3BlcnR5PC9iPiBhcmUgcmVxdWlyZWQuCisgPHA+CisgV2hlbiB0aGlzIHRhc2sgZXhlY3V0ZXMsIGl0IHdpbGwgc2V0IHRoZSBzcGVjaWZpZWQgcHJvcGVydHkgdG8gdGhlCisgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBmaWxlIHVwIHRvLCBidXQgbm90IGluY2x1ZGluZywgdGhlIGxhc3QgcGF0aAorIGVsZW1lbnQuIElmIGZpbGUgaXMgYSBmaWxlLCB0aGUgZGlyZWN0b3J5IHdpbGwgYmUgdGhlIGN1cnJlbnQKKyBkaXJlY3RvcnkuXV0+CisgIDwvZGVzY3JpcHRpb24+CisKKyAgPHN0cnVjdHVyZT4KKworICAgIDxhdHRyaWJ1dGVzPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmaWxlIiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbUGF0aCB0byB0YWtlIHRoZSBkaXJuYW1lIG9mLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBQYXRoIHRvIHRha2UgdGhlIGRpcm5hbWUgb2YuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icHJvcGVydHkiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gc2V0Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gc2V0LgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgPC9hdHRyaWJ1dGVzPgorCisgICAgPGVsZW1lbnRzPgorICAgIDwvZWxlbWVudHM+CisKKyAgPC9zdHJ1Y3R1cmU+CisKKzwvdGFzaz4KKworCis8dGFzayBuYW1lPSJlYXIiIGNhdGVnb3J5PSJwYWNrYWdpbmciCisgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkVhciIKKyAgICAgIG1hdGNoaW5nVGFzaz0idHJ1ZSI+CisKKyAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NyZWF0ZXMgYSBFQVIgYXJjaGl2ZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICA8ZGVzY3JpcHRpb24+CisgICAgPCFbQ0RBVEFbQ3JlYXRlcyBhIEVBUiBhcmNoaXZlLiBCYXNlZCBvbiBXQVIgdGFza11dPgorICA8L2Rlc2NyaXB0aW9uPgorCisgIDxzdHJ1Y3R1cmU+CisKKyAgICA8YXR0cmlidXRlcz4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYXBweG1sIiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRmlsZSB0byBpbmNvcnBvcmF0ZSBhcyBhcHBsaWNhdGlvbi54bWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIEZpbGUgdG8gaW5jb3Jwb3JhdGUgYXMgYXBwbGljYXRpb24ueG1sLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImJhc2VkaXIiIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtEaXJlY3RvcnkgZnJvbSB3aGljaCB0byBhcmNoaXZlIGZpbGVzOyBvcHRpb25hbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgRGlyZWN0b3J5IGZyb20gd2hpY2ggdG8gYXJjaGl2ZSBmaWxlczsgb3B0aW9uYWwuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29tcHJlc3MiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbV2hldGhlciB3ZSB3YW50IHRvIGNvbXByZXNzIHRoZSBmaWxlcyBvciBvbmx5IHN0b3JlIHRoZW07Cisgb3B0aW9uYWwsIGRlZmF1bHQ9dHJ1ZTsuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFdoZXRoZXIgd2Ugd2FudCB0byBjb21wcmVzcyB0aGUgZmlsZXMgb3Igb25seSBzdG9yZSB0aGVtOworIG9wdGlvbmFsLCBkZWZhdWx0PXRydWU7CisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVzdGZpbGUiIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgZmlsZSB0byBjcmVhdGU7IHJlcXVpcmVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBUaGUgZmlsZSB0byBjcmVhdGU7IHJlcXVpcmVkLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImR1cGxpY2F0ZSIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuWmlwLkR1cGxpY2F0ZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSImcXVvdDthZGQmcXVvdDssICZxdW90O3ByZXNlcnZlJnF1b3Q7LCAmcXVvdDtmYWlsJnF1b3Q7IiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTZXRzIGJlaGF2aW9yIGZvciB3aGVuIGEgZHVwbGljYXRlIGZpbGUgaXMgYWJvdXQgdG8gYmUgYWRkZWQgLQorIG9uZSBvZiA8Y29kZT5rZWVwPC9jb2RlPiwgPGNvZGU+c2tpcDwvY29kZT4gb3IgPGNvZGU+b3ZlcndyaXRlPC9jb2RlPi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0cyBiZWhhdmlvciBmb3Igd2hlbiBhIGR1cGxpY2F0ZSBmaWxlIGlzIGFib3V0IHRvIGJlIGFkZGVkIC0KKyBvbmUgb2YgPGNvZGU+a2VlcDwvY29kZT4sIDxjb2RlPnNraXA8L2NvZGU+IG9yIDxjb2RlPm92ZXJ3cml0ZTwvY29kZT4uCisgUG9zc2libGUgdmFsdWVzIGFyZTogPGNvZGU+a2VlcDwvY29kZT4gKGtlZXAgYm90aAorIG9mIHRoZSBmaWxlcyk7IDxjb2RlPnNraXA8L2NvZGU+IChrZWVwIHRoZSBmaXJzdCB2ZXJzaW9uCisgb2YgdGhlIGZpbGUgZm91bmQpOyA8Y29kZT5vdmVyd3JpdGU8L2NvZGU+IG92ZXJ3cml0ZSB0aGUgZmlsZQorIHdpdGggdGhlIG5ldyBmaWxlCisgRGVmYXVsdCBmb3IgemlwIHRhc2tzIGlzIDxjb2RlPmtlZXA8L2NvZGU+CisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZW5jb2RpbmciIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtFbmNvZGluZyB0byB1c2UgZm9yIGZpbGVuYW1lcywgZGVmYXVsdHMgdG8gdGhlIHBsYXRmb3JtJ3MKKyBkZWZhdWx0IGVuY29kaW5nLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBFbmNvZGluZyB0byB1c2UgZm9yIGZpbGVuYW1lcywgZGVmYXVsdHMgdG8gdGhlIHBsYXRmb3JtJ3MKKyBkZWZhdWx0IGVuY29kaW5nLgorCisgPHA+Rm9yIGEgbGlzdCBvZiBwb3NzaWJsZSB2YWx1ZXMgc2VlIDxhCisgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9qZGsvMS4yL2RvY3MvZ3VpZGUvaW50ZXJuYXQvZW5jb2RpbmcuZG9jLmh0bWwiPmh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvamRrLzEuMi9kb2NzL2d1aWRlL2ludGVybmF0L2VuY29kaW5nLmRvYy5odG1sPC9hPi48L3A+CisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmlsZXNvbmx5IiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIGVtdWxhdGUgU3VuJ3MgamFyIHV0aWxpdHkgYnkgbm90IGFkZGluZyBwYXJlbnQgZGlyZWN0b3JpZXM7Cisgb3B0aW9uYWwsIGRlZmF1bHRzIHRvIGZhbHNlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBJZiB0cnVlLCBlbXVsYXRlIFN1bidzIGphciB1dGlsaXR5IGJ5IG5vdCBhZGRpbmcgcGFyZW50IGRpcmVjdG9yaWVzOworIG9wdGlvbmFsLCBkZWZhdWx0cyB0byBmYWxzZS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpbmRleCIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTZXQgd2hldGhlciBvciBub3QgdG8gY3JlYXRlIGFuIGluZGV4IGxpc3QgZm9yIGNsYXNzZXMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCB3aGV0aGVyIG9yIG5vdCB0byBjcmVhdGUgYW4gaW5kZXggbGlzdCBmb3IgY2xhc3Nlcy4KKyBUaGlzIG1heSBzcGVlZCB1cCBjbGFzc2xvYWRpbmcgaW4gc29tZSBjYXNlcy4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJtYW5pZmVzdCIgdHlwZT0iamF2YS5pby5GaWxlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBtYW5pZmVzdCBmaWxlIHRvIHVzZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgVGhlIG1hbmlmZXN0IGZpbGUgdG8gdXNlLiBUaGlzIGNhbiBiZSBlaXRoZXIgdGhlIGxvY2F0aW9uIG9mIGEgbWFuaWZlc3QsCisgb3IgdGhlIG5hbWUgb2YgYSBqYXIgYWRkZWQgdGhyb3VnaCBhIGZpbGVzZXQuIElmIGl0cyB0aGUgbmFtZSBvZiBhbiBhZGRlZAorIGphciwgdGhlIHRhc2sgZXhwZWN0cyB0aGUgbWFuaWZlc3QgdG8gYmUgaW4gdGhlIGphciBhdCBNRVRBLUlORi9NQU5JRkVTVC5NRi4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1cGRhdGUiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgdHJ1ZSwgdXBkYXRlcyBhbiBleGlzdGluZyBmaWxlLCBvdGhlcndpc2Ugb3ZlcndyaXRlCisgYW55IGV4aXN0aW5nIG9uZTsgb3B0aW9uYWwgZGVmYXVsdHMgdG8gZmFsc2UuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIElmIHRydWUsIHVwZGF0ZXMgYW4gZXhpc3RpbmcgZmlsZSwgb3RoZXJ3aXNlIG92ZXJ3cml0ZQorIGFueSBleGlzdGluZyBvbmU7IG9wdGlvbmFsIGRlZmF1bHRzIHRvIGZhbHNlLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9IndoZW5lbXB0eSIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuWmlwLldoZW5FbXB0eSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSImcXVvdDtmYWlsJnF1b3Q7LCAmcXVvdDtza2lwJnF1b3Q7LCAmcXVvdDtjcmVhdGUmcXVvdDsiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NldHMgYmVoYXZpb3Igb2YgdGhlIHRhc2sgd2hlbiBubyBmaWxlcyBtYXRjaC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0cyBiZWhhdmlvciBvZiB0aGUgdGFzayB3aGVuIG5vIGZpbGVzIG1hdGNoLgorIFBvc3NpYmxlIHZhbHVlcyBhcmU6IDxjb2RlPmZhaWw8L2NvZGU+ICh0aHJvdyBhbiBleGNlcHRpb24KKyBhbmQgaGFsdCB0aGUgYnVpbGQpOyA8Y29kZT5za2lwPC9jb2RlPiAoZG8gbm90IGNyZWF0ZQorIGFueSBhcmNoaXZlLCBidXQgaXNzdWUgYSB3YXJuaW5nKTsgPGNvZGU+Y3JlYXRlPC9jb2RlPgorIChtYWtlIGFuIGFyY2hpdmUgd2l0aCBubyBlbnRyaWVzKS4KKyBEZWZhdWx0IGZvciB6aXAgdGFza3MgaXMgPGNvZGU+c2tpcDwvY29kZT47CisgZm9yIGphciB0YXNrcywgPGNvZGU+Y3JlYXRlPC9jb2RlPi4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgIDwvYXR0cmlidXRlcz4KKworICAgIDxlbGVtZW50cz4KKyAgICAgIDxlbGVtZW50IG5hbWU9ImFyY2hpdmVzIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5aaXBGaWxlU2V0IgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJaaXBGaWxlc2V0IgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyB6aXBmaWxlc2V0Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtBZGRzIHppcGZpbGVzZXQuXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICAgIDxlbGVtZW50IG5hbWU9Im1hbmlmZXN0IiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5NYW5pZmVzdCIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWxsb3dzIHRoZSBtYW5pZmVzdCBmb3IgdGhlIGFyY2hpdmUgZmlsZSB0byBiZSBwcm92aWRlZCBpbmxpbmUKKyBpbiB0aGUgYnVpbGRmaWxlIHJhdGhlciB0aGFuIGluIGFuIGV4dGVybmFsIGZpbGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0FsbG93cyB0aGUgbWFuaWZlc3QgZm9yIHRoZSBhcmNoaXZlIGZpbGUgdG8gYmUgcHJvdmlkZWQgaW5saW5lCisgaW4gdGhlIGJ1aWxkZmlsZSByYXRoZXIgdGhhbiBpbiBhbiBleHRlcm5hbCBmaWxlLl1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgICA8ZWxlbWVudCBuYW1lPSJmaWxlc2V0IiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0IgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlc2V0IgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBhIHNldCBvZiBmaWxlcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbQWRkcyBhIHNldCBvZiBmaWxlcy5dXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgICAgPGVsZW1lbnQgbmFtZT0ibWV0YWluZiIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuWmlwRmlsZVNldCIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iWmlwRmlsZXNldCIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgYSB6aXBmaWxlc2V0IHRvIGluY2x1ZGUgaW4gdGhlIE1FVEEtSU5GIGRpcmVjdG9yeS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbQWRkcyBhIHppcGZpbGVzZXQgdG8gaW5jbHVkZSBpbiB0aGUgTUVUQS1JTkYgZGlyZWN0b3J5Ll1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgICA8ZWxlbWVudCBuYW1lPSJ6aXBncm91cGZpbGVzZXQiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVTZXQiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGVzZXQiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIGEgZ3JvdXAgb2YgemlwIGZpbGVzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtBZGRzIGEgZ3JvdXAgb2YgemlwIGZpbGVzLl1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgICA8ZWxlbWVudCBuYW1lPSJ6aXBmaWxlc2V0IiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5aaXBGaWxlU2V0IgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJaaXBGaWxlc2V0IgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBhIHNldCBvZiBmaWxlcyB0aGF0IGNhbiBiZQorIHJlYWQgZnJvbSBhbiBhcmNoaXZlIGFuZCBiZSBnaXZlbiBhIHByZWZpeC9mdWxscGF0aC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbQWRkcyBhIHNldCBvZiBmaWxlcyB0aGF0IGNhbiBiZQorIHJlYWQgZnJvbSBhbiBhcmNoaXZlIGFuZCBiZSBnaXZlbiBhIHByZWZpeC9mdWxscGF0aC5dXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgIDwvZWxlbWVudHM+CisKKyAgPC9zdHJ1Y3R1cmU+CisKKzwvdGFzaz4KKworCis8dGFzayBuYW1lPSJlY2hvIiBjYXRlZ29yeT0idXRpbGl0eSIKKyAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRWNobyIKKyAgICAgID4KKworICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbV3JpdGVzIGEgbWVzc2FnZSB0byB0aGUgQW50IGxvZ2dpbmcgZmFjaWxpdGllcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICA8ZGVzY3JpcHRpb24+CisgICAgPCFbQ0RBVEFbV3JpdGVzIGEgbWVzc2FnZSB0byB0aGUgQW50IGxvZ2dpbmcgZmFjaWxpdGllcy5dXT4KKyAgPC9kZXNjcmlwdGlvbj4KKworICA8c3RydWN0dXJlPgorCisgICAgPGF0dHJpYnV0ZXM+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImFwcGVuZCIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlLCBhcHBlbmQgdG8gZXhpc3RpbmcgZmlsZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgSWYgdHJ1ZSwgYXBwZW5kIHRvIGV4aXN0aW5nIGZpbGUuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmlsZSIgdHlwZT0iamF2YS5pby5GaWxlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0ZpbGUgdG8gd3JpdGUgdG8uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIEZpbGUgdG8gd3JpdGUgdG8uCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibGV2ZWwiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkVjaG8uRWNob0xldmVsIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IiZxdW90O2Vycm9yJnF1b3Q7LCAmcXVvdDt3YXJuaW5nJnF1b3Q7LCAmcXVvdDtpbmZvJnF1b3Q7LCAmcXVvdDt2ZXJib3NlJnF1b3Q7LCAmcXVvdDtkZWJ1ZyZxdW90OyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTG9nZ2luZyBsZXZlbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBsb2dnaW5nIGxldmVsLiBMZXZlbCBzaG91bGQgYmUgb25lIG9mCisgPHVsPgorICA8bGk+ZXJyb3I8L2xpPgorICA8bGk+d2FybmluZzwvbGk+CisgIDxsaT5pbmZvPC9saT4KKyAgPGxpPnZlcmJvc2U8L2xpPgorICA8bGk+ZGVidWc8L2xpPgorIDwvdWw+CisgPHA+VGhlIGRlZmF1bHQgaXMgJnF1b3Q7d2FybmluZyZxdW90OyB0byBlbnN1cmUgdGhhdCBtZXNzYWdlcyBhcmUKKyBkaXNwbGF5ZWQgYnkgZGVmYXVsdCB3aGVuIHVzaW5nIHRoZSAtcXVpZXQgY29tbWFuZCBsaW5lIG9wdGlvbi48L3A+CisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibWVzc2FnZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW01lc3NhZ2UgdG8gd3JpdGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIE1lc3NhZ2UgdG8gd3JpdGUuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICA8L2F0dHJpYnV0ZXM+CisKKyAgICA8ZWxlbWVudHM+CisgICAgPC9lbGVtZW50cz4KKworICAgICAgPGJvZHkgPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IGEgbXVsdGlsaW5lIG1lc3NhZ2UuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2JvZHk+CisKKyAgPC9zdHJ1Y3R1cmU+CisKKzwvdGFzaz4KKworCis8dGFzayBuYW1lPSJlY2hvcHJvcGVydGllcyIgY2F0ZWdvcnk9Im90aGVyIgorICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5FY2hvUHJvcGVydGllcyIKKyAgICAgID4KKworICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRGlzcGxheXMgYWxsIHRoZSBjdXJyZW50IHByb3BlcnRpZXMgaW4gdGhlIGJ1aWxkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgIDxkZXNjcmlwdGlvbj4KKyAgICA8IVtDREFUQVtEaXNwbGF5cyBhbGwgdGhlIGN1cnJlbnQgcHJvcGVydGllcyBpbiB0aGUgYnVpbGQuIFRoZSBvdXRwdXQgY2FuIGJlIHNlbnQgdG8KKyAgYSBmaWxlIGlmIGRlc2lyZWQuIDxQPgorCisgIEF0dHJpYnV0ZSAiZGVzdGZpbGUiIGRlZmluZXMgYSBmaWxlIHRvIHNlbmQgdGhlIHByb3BlcnRpZXMgdG8uIFRoaXMgY2FuIGJlCisgIHByb2Nlc3NlZCBhcyBhIHN0YW5kYXJkIHByb3BlcnR5IGZpbGUgbGF0ZXIuIDxQPgorCisgIEF0dHJpYnV0ZSAicHJlZml4IiBkZWZpbmVzIGEgcHJlZml4IHdoaWNoIGlzIHVzZWQgdG8gZmlsdGVyIHRoZSBwcm9wZXJ0aWVzCisgIG9ubHkgdGhvc2UgcHJvcGVydGllcyBzdGFydGluZyB3aXRoIHRoaXMgcHJlZml4IHdpbGwgYmUgZWNob2VkLiA8UD4KKworICBCeSBkZWZhdWx0LCB0aGUgImZhaWxvbmVycm9yIiBhdHRyaWJ1dGUgaXMgZW5hYmxlZC4gSWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCisgIHdyaXRpbmcgdGhlIHByb3BlcnRpZXMgdG8gYSBmaWxlLCBhbmQgdGhpcyBhdHRyaWJ1dGUgaXMgZW5hYmxlZCwgdGhlbiBhCisgIEJ1aWxkRXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLiBJZiBkaXNhYmxlZCwgdGhlbiBJTyBlcnJvcnMgd2lsbCBiZSByZXBvcnRlZAorICBhcyBhIGxvZyBzdGF0ZW1lbnQsIGJ1dCBubyBlcnJvciB3aWxsIGJlIHRocm93bi4gPFA+CisKKyAgRXhhbXBsZXM6IDxwcmU+CisgICZsdDtlY2hvcHJvcGVydGllcyAgLyZndDsKKyA8L3ByZT4gUmVwb3J0IHRoZSBjdXJyZW50IHByb3BlcnRpZXMgdG8gdGhlIGxvZy4gPFA+CisKKyAgPHByZT4KKyAgJmx0O2VjaG9wcm9wZXJ0aWVzIGRlc3RmaWxlPSJteS5wcm9wZXJ0aWVzIiAvJmd0OworIDwvcHJlPiBSZXBvcnQgdGhlIGN1cnJlbnQgcHJvcGVydGllcyB0byB0aGUgZmlsZSAibXkucHJvcGVydGllcyIsIGFuZCB3aWxsCisgIGZhaWwgdGhlIGJ1aWxkIGlmIHRoZSBmaWxlIGNvdWxkIG5vdCBiZSBjcmVhdGVkIG9yIHdyaXR0ZW4gdG8uIDxQPgorCisgIDxwcmU+CisgICZsdDtlY2hvcHJvcGVydGllcyBkZXN0ZmlsZT0ibXkucHJvcGVydGllcyIgZmFpbG9uZXJyb3I9ImZhbHNlIgorICAgICAgcHJlZml4PSJhbnQiIC8mZ3Q7CisgPC9wcmU+IFJlcG9ydCBhbGwgcHJvcGVydGllcyBiZWdpbm5pbmcgd2l0aCAnYW50JyB0byB0aGUgZmlsZQorICAibXkucHJvcGVydGllcyIsIGFuZCB3aWxsIGxvZyBhIG1lc3NhZ2UgaWYgdGhlIGZpbGUgY291bGQgbm90IGJlIGNyZWF0ZWQgb3IKKyAgd3JpdHRlbiB0bywgYnV0IHdpbGwgc3RpbGwgYWxsb3cgdGhlIGJ1aWxkIHRvIGNvbnRpbnVlLl1dPgorICA8L2Rlc2NyaXB0aW9uPgorCisgIDxzdHJ1Y3R1cmU+CisKKyAgICA8YXR0cmlidXRlcz4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVzdGZpbGUiIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtGaWxlIHRvIHN0b3JlIHRoZSBwcm9wZXJ0eSBvdXRwdXQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCBhIGZpbGUgdG8gc3RvcmUgdGhlIHByb3BlcnR5IG91dHB1dC4gIElmIHRoaXMgaXMgbmV2ZXIgc3BlY2lmaWVkLAorICB0aGVuIHRoZSBvdXRwdXQgd2lsbCBiZSBzZW50IHRvIHRoZSBBbnQgbG9nLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImZhaWxvbmVycm9yIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIHRoZSB0YXNrIHdpbGwgZmFpbCBpZiBhbiBlcnJvciBvY2N1cnMgd3JpdGluZyB0aGUgcHJvcGVydGllcworIGZpbGUsIG90aGVyd2lzZSBlcnJvcnMgYXJlIGp1c3QgbG9nZ2VkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBJZiB0cnVlLCB0aGUgdGFzayB3aWxsIGZhaWwgaWYgYW4gZXJyb3Igb2NjdXJzIHdyaXRpbmcgdGhlIHByb3BlcnRpZXMKKyBmaWxlLCBvdGhlcndpc2UgZXJyb3JzIGFyZSBqdXN0IGxvZ2dlZC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwcmVmaXgiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0aGUgcHJlZml4IGlzIHNldCwgdGhlbiBvbmx5IHByb3BlcnRpZXMgd2hpY2ggc3RhcnQgd2l0aCB0aGlzCisgIHByZWZpeCBzdHJpbmcgd2lsbCBiZSByZWNvcmRlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgSWYgdGhlIHByZWZpeCBpcyBzZXQsIHRoZW4gb25seSBwcm9wZXJ0aWVzIHdoaWNoIHN0YXJ0IHdpdGggdGhpcworICBwcmVmaXggc3RyaW5nIHdpbGwgYmUgcmVjb3JkZWQuICBJZiB0aGlzIGlzIG5ldmVyIHNldCwgb3IgaXQgaXMgc2V0CisgIHRvIGFuIGVtcHR5IHN0cmluZyBvciA8dHQ+bnVsbDwvdHQ+LCB0aGVuIGFsbCBwcm9wZXJ0aWVzIHdpbGwgYmUKKyAgcmVjb3JkZWQuIDxQPgorCisgIEZvciBleGFtcGxlLCBpZiB0aGUgcHJvcGVydHkgaXMgc2V0IGFzOgorICAgIDxQUkU+Jmx0O2VjaG9wcm9wZXJ0aWVzICBwcmVmaXg9ImFudC4iIC8mZ3Q7PC9QUkU+CisgIHRoZW4gdGhlIHByb3BlcnR5ICJhbnQuaG9tZSIgd2lsbCBiZSByZWNvcmRlZCwgYnV0ICJhbnQtZXhhbXBsZSIKKyAgd2lsbCBub3QuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICA8L2F0dHJpYnV0ZXM+CisKKyAgICA8ZWxlbWVudHM+CisgICAgPC9lbGVtZW50cz4KKworICA8L3N0cnVjdHVyZT4KKworPC90YXNrPgorCisKKzx0YXNrIG5hbWU9ImVqYmMiIGNhdGVnb3J5PSJvdGhlciIKKyAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZWpiLkVqYmMiCisgICAgICBtYXRjaGluZ1Rhc2s9InRydWUiPgorCisgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtCdWlsZHMgRUpCIHN1cHBvcnQgY2xhc3NlcyB1c2luZyBXZWJMb2dpYydzIGVqYmMgdG9vbCBmcm9tIGEgZGlyZWN0b3J5IGNvbnRhaW5pbmcgYSBzZXQgb2YgZGVwbG95bWVudCBkZXNjcmlwdG9ycy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICA8ZGVzY3JpcHRpb24+CisgICAgPCFbQ0RBVEFbQnVpbGRzIEVKQiBzdXBwb3J0IGNsYXNzZXMgdXNpbmcgV2ViTG9naWMncyBlamJjIHRvb2wgZnJvbSBhIGRpcmVjdG9yeSBjb250YWluaW5nCisgYSBzZXQgb2YgZGVwbG95bWVudCBkZXNjcmlwdG9ycy5dXT4KKyAgPC9kZXNjcmlwdGlvbj4KKworICA8c3RydWN0dXJlPgorCisgICAgPGF0dHJpYnV0ZXM+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzcGF0aCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NsYXNzcGF0aCB0byBiZSB1c2VkIGZvciB0aGlzIGNvbXBpbGF0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIGNsYXNzcGF0aCB0byBiZSB1c2VkIGZvciB0aGlzIGNvbXBpbGF0aW9uLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlc2NyaXB0b3JzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRGlyZWN0b3J5IGZyb20gd2hlcmUgdGhlIHNlcmlhbGl6ZWQgZGVwbG95bWVudCBkZXNjcmlwdG9ycyBhcmUKKyB0byBiZSByZWFkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIGRpcmVjdG9yeSBmcm9tIHdoZXJlIHRoZSBzZXJpYWxpemVkIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgYXJlCisgdG8gYmUgcmVhZC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXN0IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRGlyZWN0b3J5IGludG8gd2hpY2ggdGhlIHN1cHBvcnQgY2xhc3NlcywgUk1JIHN0dWJzLCBldGMgYXJlIHRvIGJlIHdyaXR0ZW4uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCB0aGUgZGlyZWN0b3J5IGludG8gd2hpY2ggdGhlIHN1cHBvcnQgY2xhc3NlcywgUk1JIHN0dWJzLCBldGMgYXJlIHRvIGJlIHdyaXR0ZW4uCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ia2VlcGdlbmVyYXRlZCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIGVqYmMgd2lsbCBrZWVwIHRoZQorIGludGVybWVkaWF0ZSBKYXZhIGZpbGVzIHVzZWQgdG8gYnVpbGQgdGhlIGNsYXNzIGZpbGVzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBJZiB0cnVlLCBlamJjIHdpbGwga2VlcCB0aGUKKyBpbnRlcm1lZGlhdGUgSmF2YSBmaWxlcyB1c2VkIHRvIGJ1aWxkIHRoZSBjbGFzcyBmaWxlcy4KKyBUaGlzIGNhbiBiZSB1c2VmdWwgd2hlbiBkZWJ1Z2dpbmcuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibWFuaWZlc3QiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtOYW1lIG9mIHRoZSBnZW5lcmF0ZWQgbWFuaWZlc3QgZmlsZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBuYW1lIG9mIHRoZSBnZW5lcmF0ZWQgbWFuaWZlc3QgZmlsZS4KKworIEZvciBlYWNoIEVKQiB0aGF0IGlzIHByb2Nlc3NlZCBhbiBlbnRyeSBpcyBjcmVhdGVkIGluIHRoaXMgZmlsZS4gVGhpcyBjYW4gdGhlbiBiZSB1c2VkCisgdG8gY3JlYXRlIGEgamFyIGZpbGUgZm9yIGRwbG95aW5nIHRoZSBiZWFucy4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzcmMiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtEaXJlY3RvcnkgY29udGFpbmluZyB0aGUgc291cmNlIGNvZGUgZm9yIHRoZSBob21lIGludGVyZmFjZSwgcmVtb3RlIGludGVyZmFjZQorIGFuZCBwdWJsaWMga2V5IGNsYXNzIGRlZmluaXRpb25zLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBzb3VyY2UgY29kZSBmb3IgdGhlIGhvbWUgaW50ZXJmYWNlLCByZW1vdGUgaW50ZXJmYWNlCisgYW5kIHB1YmxpYyBrZXkgY2xhc3MgZGVmaW5pdGlvbnMuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICA8L2F0dHJpYnV0ZXM+CisKKyAgICA8ZWxlbWVudHM+CisgICAgPC9lbGVtZW50cz4KKworICA8L3N0cnVjdHVyZT4KKworPC90YXNrPgorCisKKzx0YXNrIG5hbWU9ImVqYmphciIgY2F0ZWdvcnk9Im90aGVyIgorICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5lamIuRWpiSmFyIgorICAgICAgbWF0Y2hpbmdUYXNrPSJ0cnVlIj4KKworICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbUHJvdmlkZXMgYXV0b21hdGVkIEVKQiBKQVIgZmlsZSBjcmVhdGlvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICA8ZGVzY3JpcHRpb24+CisgICAgPCFbQ0RBVEFbUHJvdmlkZXMgYXV0b21hdGVkIEVKQiBKQVIgZmlsZSBjcmVhdGlvbi4KKyA8cD4KKyBFeHRlbmRzIHRoZQorIE1hdGNoaW5nVGFzayBjbGFzcyBwcm92aWRlZCBpbiB0aGUgZGVmYXVsdCBhbnQgZGlzdHJpYnV0aW9uIHRvIHByb3ZpZGUgYQorIGRpcmVjdG9yeSBzY2FubmluZyBFSkIgamFyZmlsZSBnZW5lcmF0b3IuCisgPC9wPgorCisgPHA+CisgVGhlIHRhc2sgd29ya3MgYnkgdGFraW5nIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIG9uZSBhdCBhIHRpbWUgYW5kCisgcGFyc2luZyB0aGVtIHRvIGxvY2F0ZSB0aGUgbmFtZXMgb2YgdGhlIGNsYXNzZXMgd2hpY2ggc2hvdWxkIGJlIHBsYWNlZCBpbgorIHRoZSBqYXIuIFRoZSBjbGFzc25hbWVzIGFyZSB0cmFuc2xhdGVkIHRvIGphdmEuaW8uRmlsZXMgYnkgcmVwbGFjaW5nCisgcGVyaW9kcyB3aXRoIEZpbGUuc2VwYXJhdG9yQ2hhciBhbmQgcmVzb2x2aW5nIHRoZSBnZW5lcmF0ZWQgZmlsZW5hbWUgYXMgYQorIHJlbGF0aXZlIHBhdGggdW5kZXIgdGhlIHNyY0RpciBhdHRyaWJ1dGUuIEFsbCBuZWNlc3NhcnkgZmlsZXMgYXJlIHRoZW4KKyBhc3NlbWJsZWQgaW50byBhIGphcmZpbGUuIE9uZSBqYXJmaWxlIGlzIGNvbnN0cnVjdGVkIGZvciBlYWNoIGRlcGxveW1lbnQKKyBkZXNjcmlwdG9yIGZvdW5kLgorIDwvcD5dXT4KKyAgPC9kZXNjcmlwdGlvbj4KKworICA8c3RydWN0dXJlPgorCisgICAgPGF0dHJpYnV0ZXM+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImJhc2VqYXJuYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQmFzZSBuYW1lIG9mIHRoZSBFSkIgSkFSIHRoYXQgaXMgdG8gYmUgY3JlYXRlZCBpZiBpdCBpcyBub3QKKyB0byBiZSBkZXRlcm1pbmVkIGZyb20gdGhlIG5hbWUgb2YgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmaWxlcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBiYXNlIG5hbWUgb2YgdGhlIEVKQiBKQVIgdGhhdCBpcyB0byBiZSBjcmVhdGVkIGlmIGl0IGlzIG5vdAorIHRvIGJlIGRldGVybWluZWQgZnJvbSB0aGUgbmFtZSBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGZpbGVzLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImJhc2VuYW1ldGVybWluYXRvciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBzdHJpbmcgd2hpY2ggdGVybWluYXRlcyB0aGUgYmVhbiBuYW1lLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBUaGUgc3RyaW5nIHdoaWNoIHRlcm1pbmF0ZXMgdGhlIGJlYW4gbmFtZS4KKyBUaGUgY29udmVudGlvbiB1c2VkIGJ5IHRoaXMgdGFzayBpcworIHRoYXQgYmVhbiBkZXNjcmlwdG9ycyBhcmUgbmFtZWQgYXMgdGhlIEJlYW5OYW1lIHdpdGggc29tZSBzdWZmaXguIFRoZQorIGJhc2VOYW1lVGVybWluYXRvciBzdHJpbmcgc2VwYXJhdGVzIHRoZSBiZWFuIG5hbWUgYW5kIHRoZSBzdWZmaXggYW5kCisgaXMgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGJlYW4gbmFtZS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc3BhdGgiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUGF0aCIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ2xhc3NwYXRoIHRvIHVzZSB3aGVuIHJlc29sdmluZyBjbGFzc2VzIGZvciBpbmNsdXNpb24gaW4gdGhlIGphci5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBjbGFzc3BhdGggdG8gdXNlIHdoZW4gcmVzb2x2aW5nIGNsYXNzZXMgZm9yIGluY2x1c2lvbiBpbiB0aGUgamFyLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlcGVuZGVuY3kiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBbmFseXplciB0byB1c2Ugd2hlbiBhZGRpbmcgaW4gZGVwZW5kZW5jaWVzIHRvIHRoZSBKQVIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCB0aGUgYW5hbHl6ZXIgdG8gdXNlIHdoZW4gYWRkaW5nIGluIGRlcGVuZGVuY2llcyB0byB0aGUgSkFSLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlc2NyaXB0b3JkaXIiIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtEZXNjcmlwdG9yIGRpcmVjdG9yeS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBkZXNjcmlwdG9yIGRpcmVjdG9yeS4gVGhlIGRlc2NyaXB0b3IgZGlyZWN0b3J5IGNvbnRhaW5zIHRoZQorIEVKQiBkZXBsb3ltZW50IGRlc2NyaXB0b3JzLiBUaGVzZSBhcmUgWE1MIGZpbGVzIHRoYXQgZGVjbGFyZSB0aGUKKyBwcm9wZXJ0aWVzIG9mIGEgYmVhbiBpbiBhIHBhcnRpY3VsYXIgZGVwbG95bWVudCBzY2VuYXJpby4gU3VjaAorIHByb3BlcnRpZXMgaW5jbHVkZSwgZm9yIGV4YW1wbGUsIHRoZSB0cmFuc2FjdGlvbmFsIG5hdHVyZSBvZiB0aGUgYmVhbgorIGFuZCB0aGUgc2VjdXJpdHkgYWNjZXNzIGNvbnRyb2wgdG8gdGhlIGJlYW4ncyBtZXRob2RzLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlc3RkaXIiIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtEZXN0aW5hdGlvbiBkaXJlY3RvcnkuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5LiBUaGUgRUpCIGphciBmaWxlcyB3aWxsIGJlIHdyaXR0ZW4gaW50bworIHRoaXMgZGlyZWN0b3J5LiBUaGUgamFyIGZpbGVzIHRoYXQgZXhpc3QgaW4gdGhpcyBkaXJlY3RvcnkgYXJlIGFsc28KKyB1c2VkIHdoZW4gZGV0ZXJtaW5pbmcgaWYgdGhlIGNvbnRlbnRzIG9mIHRoZSBqYXIgZmlsZSBoYXZlIGNoYW5nZWQuCisgTm90ZSB0aGF0IHRoaXMgcGFyYW1ldGVyIGlzIG9ubHkgdXNlZCBpZiBubyBkZXBsb3ltZW50IHRvb2xzIGFyZQorIHNwZWNpZmllZC4gVHlwaWNhbGx5IGVhY2ggZGVwbG95bWVudCB0b29sIHdpbGwgc3BlY2lmeSBpdHMgb3duCisgZGVzdGluYXRpb24gZGlyZWN0b3J5LgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImZsYXRkZXN0ZGlyIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NvbnRyb2xzIHdoZXRoZXIgdGhlCisgZGVzdGluYXRpb24gSkFScyBhcmUgd3JpdHRlbiBvdXQgaW4gdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSB3aXRoCisgdGhlIHNhbWUgaGllcmFyY2hpY2FsIHN0cnVjdHVyZSBmcm9tIHdoaWNoIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3JzCisgaGF2ZSBiZWVuIHJlYWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIENvbnRyb2xzIHdoZXRoZXIgdGhlCisgZGVzdGluYXRpb24gSkFScyBhcmUgd3JpdHRlbiBvdXQgaW4gdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSB3aXRoCisgdGhlIHNhbWUgaGllcmFyY2hpY2FsIHN0cnVjdHVyZSBmcm9tIHdoaWNoIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3JzCisgaGF2ZSBiZWVuIHJlYWQuIElmIHRoaXMgaXMgc2V0IHRvIHRydWUgdGhlIGdlbmVyYXRlZCBFSkIgamFycyBhcmUKKyB3cml0dGVuIGludG8gdGhlIHJvb3Qgb2YgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSwgb3RoZXJ3aXNlIHRoZXkKKyBhcmUgd3JpdHRlbiBvdXQgaW4gdGhlIHNhbWUgcmVsYXRpdmUgcG9zaXRpb24gYXMgdGhlIGRlcGxveW1lbnQKKyBkZXNjcmlwdG9ycyBpbiB0aGUgZGVzY3JpcHRvciBkaXJlY3RvcnkuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZ2VuZXJpY2phcnN1ZmZpeCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1N1ZmZpeCBmb3IgdGhlIGdlbmVyYXRlZCBqYXIgZmlsZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBzdWZmaXggZm9yIHRoZSBnZW5lcmF0ZWQgamFyIGZpbGUuIFdoZW4gZ2VuZXJpYyBqYXJzIGFyZQorIGdlbmVyYXRlZCwgdGhleSBoYXZlIGEgc3VmZml4IHdoaWNoIGlzIGFwcGVuZGVkIHRvIHRoZSB0aGUgYmVhbiBuYW1lCisgdG8gY3JlYXRlIHRoZSBuYW1lIG9mIHRoZSBqYXIgZmlsZS4gTm90ZSB0aGF0IHRoaXMgc3VmZml4IGluY2x1ZGVzCisgdGhlIGV4dGVuc2lvbiBmbyB0ZSBqYXIgZmlsZSBhbmQgc2hvdWxkIHRoZXJlZm9yZSBlbmQgd2l0aCBhbgorIGFwcHJvcHJpYXRlIGV4dGVuc2lvbiBzdWNoIGFzIC5qYXIgb3IgLmVhcgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9Im1hbmlmZXN0IiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTWFuaWZlc3QgZmlsZSB0byB1c2Ugd2hlbiBqYXJyaW5nLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIE1hbmlmZXN0IGZpbGUgdG8gdXNlIHdoZW4gamFycmluZy4gQXMgb2YgRUpCIDEuMSwgbWFuaWZlc3QKKyBmaWxlcyBhcmUgbm8gbG9uZ2VyIHVzZWQgdG8gY29uZmlndXJlIHRoZSBFSkIuIEhvd2V2ZXIsIHRoZXkgc3RpbGwKKyBoYXZlIGEgdml0YWwgaW1wb3J0YW5jZSBpZiB0aGUgRUpCIGlzIGludGVuZGVkIHRvIGJlIHBhY2thZ2VkIGluIGFuCisgRUFSIGZpbGUuIEJ5IGFkZGluZyAiQ2xhc3MtUGF0aCIgc2V0dGluZ3MgdG8gYSBNYW5pZmVzdCBmaWxlLCB0aGUgRUpCCisgY2FuIGxvb2sgZm9yIGNsYXNzZXMgaW5zaWRlIHRoZSBFQVIgZmlsZSBpdHNlbGYsIGFsbG93aW5nIGZvciBlYXNpZXIKKyBkZXBsb3ltZW50LiBUaGlzIGlzIG91dGxpbmVkIGluIHRoZSBKMkVFIHNwZWNpZmljYXRpb24sIGFuZCBhbGwgSjJFRQorIGNvbXBvbmVudHMgYXJlIG1lYW50IHRvIHN1cHBvcnQgaXQuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtaW5nIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5lamIuRWpiSmFyLk5hbWluZ1NjaGVtZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSImcXVvdDtlamItbmFtZSZxdW90OywgJnF1b3Q7ZGlyZWN0b3J5JnF1b3Q7LCAmcXVvdDtkZXNjcmlwdG9yJnF1b3Q7LCAmcXVvdDtiYXNlamFybmFtZSZxdW90OyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTmFtaW5nIHNjaGVtZSB1c2VkIHRvIGRldGVybWluZSB0aGUgbmFtZSBvZiB0aGUgZ2VuZXJhdGVkIGphcnMKKyBmcm9tIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCB0aGUgbmFtaW5nIHNjaGVtZSB1c2VkIHRvIGRldGVybWluZSB0aGUgbmFtZSBvZiB0aGUgZ2VuZXJhdGVkIGphcnMKKyBmcm9tIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzcmNkaXIiIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTb3VyY2UgZGlyZWN0b3J5LCB3aGljaCBpcyB0aGUgZGlyZWN0b3J5IHRoYXQKKyBjb250YWlucyB0aGUgY2xhc3NlcyB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIEVKQiBqYXIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldHMgdGhlIHNvdXJjZSBkaXJlY3RvcnksIHdoaWNoIGlzIHRoZSBkaXJlY3RvcnkgdGhhdAorIGNvbnRhaW5zIHRoZSBjbGFzc2VzIHRoYXQgd2lsbCBiZSBhZGRlZCB0byB0aGUgRUpCIGphci4gVHlwaWNhbGx5CisgdGhpcyB3aWxsIGluY2x1ZGUgdGhlIGhvbWUgYW5kIHJlbW90ZSBpbnRlcmZhY2VzIGFuZCB0aGUgYmVhbiBjbGFzcy4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgIDwvYXR0cmlidXRlcz4KKworICAgIDxlbGVtZW50cz4KKyAgICAgIDxlbGVtZW50IG5hbWU9ImJvcmxhbmQiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmVqYi5Cb3JsYW5kRGVwbG95bWVudFRvb2wiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IiIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgYSBkZXBsb3ltZW50IHRvb2wgZm9yIEJvcmxhbmQgc2VydmVyLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtBZGRzIGEgZGVwbG95bWVudCB0b29sIGZvciBCb3JsYW5kIHNlcnZlci5dXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgICAgPGVsZW1lbnQgbmFtZT0iY2xhc3NwYXRoIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoIgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJQYXRoIgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyB0byB0aGUgY2xhc3NwYXRoIHVzZWQgdG8gbG9jYXRlIHRoZSBzdXBlciBjbGFzc2VzIGFuZAorIGludGVyZmFjZXMgb2YgdGhlIGNsYXNzZXMgdGhhdCB3aWxsIG1ha2UgdXAgdGhlIEVKQiBKQVIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0FkZHMgdG8gdGhlIGNsYXNzcGF0aCB1c2VkIHRvIGxvY2F0ZSB0aGUgc3VwZXIgY2xhc3NlcyBhbmQKKyBpbnRlcmZhY2VzIG9mIHRoZSBjbGFzc2VzIHRoYXQgd2lsbCBtYWtlIHVwIHRoZSBFSkIgSkFSLl1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgICA8ZWxlbWVudCBuYW1lPSJkdGQiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmVqYi5FamJKYXIuRFRETG9jYXRpb24iCisgICAgICAgICAgICAgICBicmllZlR5cGU9IiIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NyZWF0ZSBhIERURCBsb2NhdGlvbiByZWNvcmQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0NyZWF0ZSBhIERURCBsb2NhdGlvbiByZWNvcmQuIFRoaXMgc3RvcmVzIHRoZSBsb2NhdGlvbiBvZiBhIERURC4gVGhlCisgRFREIGlzIGlkZW50aWZpZWQgYnkgaXRzIHB1YmxpYyBJZC4gVGhlIGxvY2F0aW9uIG1heSBlaXRoZXIgYmUgYSBmaWxlCisgbG9jYXRpb24gb3IgYSByZXNvdXJjZSBsb2NhdGlvbi5dXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgICAgPGVsZW1lbnQgbmFtZT0iaXBsYW5ldCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZWpiLklQbGFuZXREZXBsb3ltZW50VG9vbCIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBhIGRlcGxveW1lbnQgdG9vbCBmb3IgaVBsYW5ldCBBcHBsaWNhdGlvbiBTZXJ2ZXIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0FkZHMgYSBkZXBsb3ltZW50IHRvb2wgZm9yIGlQbGFuZXQgQXBwbGljYXRpb24gU2VydmVyLl1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgICA8ZWxlbWVudCBuYW1lPSJqYm9zcyIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZWpiLkpib3NzRGVwbG95bWVudFRvb2wiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IiIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgYSBkZXBsb3ltZW50IHRvb2wgZm9yIEpCb3NzIHNlcnZlci5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbQWRkcyBhIGRlcGxveW1lbnQgdG9vbCBmb3IgSkJvc3Mgc2VydmVyLl1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgICA8ZWxlbWVudCBuYW1lPSJqb25hcyIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZWpiLkpvbmFzRGVwbG95bWVudFRvb2wiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IiIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgYSBkZXBsb3ltZW50IHRvb2wgZm9yIEpPbkFTIHNlcnZlci5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbQWRkcyBhIGRlcGxveW1lbnQgdG9vbCBmb3IgSk9uQVMgc2VydmVyLl1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgICA8ZWxlbWVudCBuYW1lPSJzdXBwb3J0IiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0IgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlc2V0IgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBhIGZpbGVzZXQgZm9yIHN1cHBvcnQgZWxlbWVudHMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0FkZHMgYSBmaWxlc2V0IGZvciBzdXBwb3J0IGVsZW1lbnRzLl1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgICA8ZWxlbWVudCBuYW1lPSJ3ZWJsb2dpYyIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZWpiLldlYmxvZ2ljRGVwbG95bWVudFRvb2wiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IiIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgYSBkZXBsb3ltZW50IHRvb2wgZm9yIFdlYmxvZ2ljIHNlcnZlci5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbQWRkcyBhIGRlcGxveW1lbnQgdG9vbCBmb3IgV2VibG9naWMgc2VydmVyLl1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgICA8ZWxlbWVudCBuYW1lPSJ3ZWJsb2dpY3RvcGxpbmsiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmVqYi5XZWJsb2dpY1RPUExpbmtEZXBsb3ltZW50VG9vbCIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBhIGRlcGxveW1lbnQgdG9vbCBmb3IgV2VibG9naWMgd2hlbiB1c2luZyB0aGUgVG9wbGluaworIE9iamVjdC1SZWxhdGlvbmFsIG1hcHBpbmcuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0FkZHMgYSBkZXBsb3ltZW50IHRvb2wgZm9yIFdlYmxvZ2ljIHdoZW4gdXNpbmcgdGhlIFRvcGxpbmsKKyBPYmplY3QtUmVsYXRpb25hbCBtYXBwaW5nLl1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgICA8ZWxlbWVudCBuYW1lPSJ3ZWJzcGhlcmUiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmVqYi5XZWJzcGhlcmVEZXBsb3ltZW50VG9vbCIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBhIGRlcGxveW1lbnQgdG9vbCBmb3IgV2Vic3BoZXJlIDQuMCBzZXJ2ZXIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0FkZHMgYSBkZXBsb3ltZW50IHRvb2wgZm9yIFdlYnNwaGVyZSA0LjAgc2VydmVyLl1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgPC9lbGVtZW50cz4KKworICA8L3N0cnVjdHVyZT4KKworPC90YXNrPgorCisKKzx0YXNrIG5hbWU9ImV4ZWMiIGNhdGVnb3J5PSJjb250cm9sIgorICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5FeGVjVGFzayIKKyAgICAgID4KKworICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRXhlY3V0ZXMgYSBnaXZlbiBjb21tYW5kIGlmIHRoZSBvcyBwbGF0Zm9ybSBpcyBhcHByb3ByaWF0ZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICA8ZGVzY3JpcHRpb24+CisgICAgPCFbQ0RBVEFbRXhlY3V0ZXMgYSBnaXZlbiBjb21tYW5kIGlmIHRoZSBvcyBwbGF0Zm9ybSBpcyBhcHByb3ByaWF0ZS5dXT4KKyAgPC9kZXNjcmlwdGlvbj4KKworICA8c3RydWN0dXJlPgorCisgICAgPGF0dHJpYnV0ZXM+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImFwcGVuZCIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtXaGV0aGVyIG91dHB1dCBzaG91bGQgYmUgYXBwZW5kZWQgdG8gb3Igb3ZlcndyaXRlIGFuIGV4aXN0aW5nIGZpbGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFdoZXRoZXIgb3V0cHV0IHNob3VsZCBiZSBhcHBlbmRlZCB0byBvciBvdmVyd3JpdGUgYW4gZXhpc3RpbmcgZmlsZS4KKyBEZWZhdWx0cyB0byBmYWxzZS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkaXIiIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgd29ya2luZyBkaXJlY3Rvcnkgb2YgdGhlIHByb2Nlc3MuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRoZSB3b3JraW5nIGRpcmVjdG9yeSBvZiB0aGUgcHJvY2Vzcy4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJleGVjdXRhYmxlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGNvbW1hbmQgdG8gZXhlY3V0ZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgVGhlIGNvbW1hbmQgdG8gZXhlY3V0ZS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmYWlsaWZleGVjdXRpb25mYWlscyIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTdG9wIHRoZSBidWlsZCBpZiBwcm9ncmFtIGNhbm5vdCBiZSBzdGFydGVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTdG9wIHRoZSBidWlsZCBpZiBwcm9ncmFtIGNhbm5vdCBiZSBzdGFydGVkLiBEZWZhdWx0cyB0byB0cnVlLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImZhaWxvbmVycm9yIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0ZhaWwgaWYgdGhlIGNvbW1hbmQgZXhpdHMgd2l0aCBhIG5vbi16ZXJvIHJldHVybiBjb2RlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBGYWlsIGlmIHRoZSBjb21tYW5kIGV4aXRzIHdpdGggYSBub24temVybyByZXR1cm4gY29kZS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuZXdlbnZpcm9ubWVudCIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtEbyBub3QgcHJvcGFnYXRlIG9sZCBlbnZpcm9ubWVudCB3aGVuIG5ldyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIHNwZWNpZmllZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgRG8gbm90IHByb3BhZ2F0ZSBvbGQgZW52aXJvbm1lbnQgd2hlbiBuZXcgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBzcGVjaWZpZWQuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ib3MiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtMaXN0IG9mIG9wZXJhdGluZyBzeXN0ZW1zIG9uIHdoaWNoIHRoZSBjb21tYW5kIG1heSBiZSBleGVjdXRlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgTGlzdCBvZiBvcGVyYXRpbmcgc3lzdGVtcyBvbiB3aGljaCB0aGUgY29tbWFuZCBtYXkgYmUgZXhlY3V0ZWQuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ib3V0cHV0IiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRmlsZSB0aGUgb3V0cHV0IG9mIHRoZSBwcm9jZXNzIGlzIHJlZGlyZWN0ZWQgdG8uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIEZpbGUgdGhlIG91dHB1dCBvZiB0aGUgcHJvY2VzcyBpcyByZWRpcmVjdGVkIHRvLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9Im91dHB1dHByb3BlcnR5IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbUHJvcGVydHkgbmFtZSB3aG9zZSB2YWx1ZSBzaG91bGQgYmUgc2V0IHRvIHRoZSBvdXRwdXQgb2YKKyB0aGUgcHJvY2Vzcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgUHJvcGVydHkgbmFtZSB3aG9zZSB2YWx1ZSBzaG91bGQgYmUgc2V0IHRvIHRoZSBvdXRwdXQgb2YKKyB0aGUgcHJvY2Vzcy4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJyZXN1bHRwcm9wZXJ0eSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBuYW1lIG9mIGEgcHJvcGVydHkgaW4gd2hpY2ggdGhlIHJldHVybiBjb2RlIG9mIHRoZQorIGNvbW1hbmQgc2hvdWxkIGJlIHN0b3JlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgVGhlIG5hbWUgb2YgYSBwcm9wZXJ0eSBpbiB3aGljaCB0aGUgcmV0dXJuIGNvZGUgb2YgdGhlCisgY29tbWFuZCBzaG91bGQgYmUgc3RvcmVkLiBPbmx5IG9mIGludGVyZXN0IGlmIGZhaWxvbmVycm9yPWZhbHNlLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InZtbGF1bmNoZXIiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgdHJ1ZSwgbGF1bmNoIG5ldyBwcm9jZXNzIHdpdGggVk0sIG90aGVyd2lzZSB1c2UgdGhlIE9TJ3Mgc2hlbGwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIElmIHRydWUsIGxhdW5jaCBuZXcgcHJvY2VzcyB3aXRoIFZNLCBvdGhlcndpc2UgdXNlIHRoZSBPUydzIHNoZWxsLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgPC9hdHRyaWJ1dGVzPgorCisgICAgPGVsZW1lbnRzPgorICAgICAgPGVsZW1lbnQgbmFtZT0iZW52IiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5FbnZpcm9ubWVudC5WYXJpYWJsZSIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHRoZSBsYXVuY2hlZCBwcm9jZXNzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtBZGQgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gdGhlIGxhdW5jaGVkIHByb2Nlc3MuXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICAgIDxlbGVtZW50IG5hbWU9ImFyZyIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQ29tbWFuZGxpbmUuQXJndW1lbnQiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IiIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgYSBjb21tYW5kLWxpbmUgYXJndW1lbnQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0FkZHMgYSBjb21tYW5kLWxpbmUgYXJndW1lbnQuXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICA8L2VsZW1lbnRzPgorCisgIDwvc3RydWN0dXJlPgorCis8L3Rhc2s+CisKKworPHRhc2sgbmFtZT0iZmFpbCIgY2F0ZWdvcnk9ImNvbnRyb2wiCisgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkV4aXQiCisgICAgICA+CisKKyAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0V4aXRzIHRoZSBhY3RpdmUgYnVpbGQsIGdpdmluZyBhbiBhZGRpdGlvbmFsIG1lc3NhZ2UgaWYgYXZhaWxhYmxlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgIDxkZXNjcmlwdGlvbj4KKyAgICA8IVtDREFUQVtFeGl0cyB0aGUgYWN0aXZlIGJ1aWxkLCBnaXZpbmcgYW4gYWRkaXRpb25hbCBtZXNzYWdlCisgaWYgYXZhaWxhYmxlLl1dPgorICA8L2Rlc2NyaXB0aW9uPgorCisgIDxzdHJ1Y3R1cmU+CisKKyAgICA8YXR0cmlidXRlcz4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWYiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtPbmx5IGZhaWwgaWYgYSBwcm9wZXJ0eSBvZiB0aGUgZ2l2ZW4gbmFtZSBleGlzdHMgaW4gdGhlIGN1cnJlbnQgcHJvamVjdC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgT25seSBmYWlsIGlmIGEgcHJvcGVydHkgb2YgdGhlIGdpdmVuIG5hbWUgZXhpc3RzIGluIHRoZSBjdXJyZW50IHByb2plY3QuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibWVzc2FnZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0EgbWVzc2FnZSBnaXZpbmcgZnVydGhlciBpbmZvcm1hdGlvbiBvbiB3aHkgdGhlIGJ1aWxkIGV4aXRlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgQSBtZXNzYWdlIGdpdmluZyBmdXJ0aGVyIGluZm9ybWF0aW9uIG9uIHdoeSB0aGUgYnVpbGQgZXhpdGVkLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InVubGVzcyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW09ubHkgZmFpbCBpZiBhIHByb3BlcnR5IG9mIHRoZSBnaXZlbiBuYW1lIGRvZXMgbm90CisgZXhpc3QgaW4gdGhlIGN1cnJlbnQgcHJvamVjdC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgT25seSBmYWlsIGlmIGEgcHJvcGVydHkgb2YgdGhlIGdpdmVuIG5hbWUgZG9lcyBub3QKKyBleGlzdCBpbiB0aGUgY3VycmVudCBwcm9qZWN0LgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgPC9hdHRyaWJ1dGVzPgorCisgICAgPGVsZW1lbnRzPgorICAgIDwvZWxlbWVudHM+CisKKyAgICAgIDxib2R5ID4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCBhIG11bHRpbGluZSBtZXNzYWdlLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9ib2R5PgorCisgIDwvc3RydWN0dXJlPgorCis8L3Rhc2s+CisKKworPHRhc2sgbmFtZT0iZmlsdGVyIiBjYXRlZ29yeT0iZmlsZXN5c3RlbSIKKyAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRmlsdGVyIgorICAgICAgPgorCisgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTZXRzIGEgdG9rZW4gZmlsdGVyIHRoYXQgaXMgdXNlZCBieSB0aGUgZmlsZSBjb3B5IHRhc2tzIHRvIGRvIHRva2VuIHN1YnN0aXR1dGlvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICA8ZGVzY3JpcHRpb24+CisgICAgPCFbQ0RBVEFbU2V0cyBhIHRva2VuIGZpbHRlciB0aGF0IGlzIHVzZWQgYnkgdGhlIGZpbGUgY29weSB0YXNrcworIHRvIGRvIHRva2VuIHN1YnN0aXR1dGlvbi4gU2V0cyBtdXRpcGxlIHRva2VucyBieQorIHJlYWRpbmcgdGhlc2UgZnJvbSBhIGZpbGUuXV0+CisgIDwvZGVzY3JpcHRpb24+CisKKyAgPHN0cnVjdHVyZT4KKworICAgIDxhdHRyaWJ1dGVzPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmaWx0ZXJzZmlsZSIgdHlwZT0iamF2YS5pby5GaWxlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBmaWxlIGZyb20gd2hpY2ggdGhlIGZpbHRlcnMgbXVzdCBiZSByZWFkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBUaGUgZmlsZSBmcm9tIHdoaWNoIHRoZSBmaWx0ZXJzIG11c3QgYmUgcmVhZC4KKyBUaGlzIGZpbGUgbXVzdCBiZSBhIGZvcm1hdHRlZCBhcyBhIHByb3BlcnR5IGZpbGUuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idG9rZW4iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgdG9rZW4gc3RyaW5nIHdpdGhvdXQgQCBkZWxpbWl0ZXJzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBUaGUgdG9rZW4gc3RyaW5nIHdpdGhvdXQgQCBkZWxpbWl0ZXJzLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIHN0cmluZyB0aGF0IHNob3VsZCByZXBsYWNlIHRoZSB0b2tlbiBkdXJpbmcgZmlsdGVyZWQgY29waWVzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBUaGUgc3RyaW5nIHRoYXQgc2hvdWxkIHJlcGxhY2UgdGhlIHRva2VuIGR1cmluZyBmaWx0ZXJlZCBjb3BpZXMuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICA8L2F0dHJpYnV0ZXM+CisKKyAgICA8ZWxlbWVudHM+CisgICAgPC9lbGVtZW50cz4KKworICA8L3N0cnVjdHVyZT4KKworPC90YXNrPgorCisKKzx0YXNrIG5hbWU9ImZpeGNybGYiIGNhdGVnb3J5PSJmaWxlc3lzdGVtIgorICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5GaXhDUkxGIgorICAgICAgbWF0Y2hpbmdUYXNrPSJ0cnVlIj4KKworICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ29udmVydHMgdGV4dCBzb3VyY2UgZmlsZXMgdG8gbG9jYWwgT1MgZm9ybWF0dGluZyBjb252ZW50aW9ucywgYXMgd2VsbCBhcyByZXBhaXIgdGV4dCBmaWxlcyBkYW1hZ2VkIGJ5IG1pc2NvbmZpZ3VyZWQgb3IgbWlzZ3VpZGVkIGVkaXRvcnMgb3IgZmlsZSB0cmFuc2ZlciBwcm9ncmFtcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICA8ZGVzY3JpcHRpb24+CisgICAgPCFbQ0RBVEFbQ29udmVydHMgdGV4dCBzb3VyY2UgZmlsZXMgdG8gbG9jYWwgT1MgZm9ybWF0dGluZyBjb252ZW50aW9ucywgYXMKKyB3ZWxsIGFzIHJlcGFpciB0ZXh0IGZpbGVzIGRhbWFnZWQgYnkgbWlzY29uZmlndXJlZCBvciBtaXNndWlkZWQgZWRpdG9ycyBvcgorIGZpbGUgdHJhbnNmZXIgcHJvZ3JhbXMuCisgPHA+CisgVGhpcyB0YXNrIGNhbiB0YWtlIHRoZSBmb2xsb3dpbmcgYXJndW1lbnRzOgorIDx1bD4KKyA8bGk+c3JjZGlyCisgPGxpPmRlc3RkaXIKKyA8bGk+aW5jbHVkZQorIDxsaT5leGNsdWRlCisgPGxpPmNyCisgPGxpPmVvbAorIDxsaT50YWIKKyA8bGk+ZW9mCisgPGxpPmVuY29kaW5nCisgPC91bD4KKyBPZiB0aGVzZSBhcmd1bWVudHMsIG9ubHkgPGI+c291cmNlZGlyPC9iPiBpcyByZXF1aXJlZC4KKyA8cD4KKyBXaGVuIHRoaXMgdGFzayBleGVjdXRlcywgaXQgd2lsbCBzY2FuIHRoZSBzcmNkaXIgYmFzZWQgb24gdGhlIGluY2x1ZGUKKyBhbmQgZXhjbHVkZSBwcm9wZXJ0aWVzLgorIDxwPgorIFRoaXMgdmVyc2lvbiBnZW5lcmFsaXNlcyB0aGUgaGFuZGxpbmcgb2YgRU9MIGNoYXJhY3RlcnMsIGFuZCBhbGxvd3MKKyBmb3IgQ1Itb25seSBsaW5lIGVuZGluZ3MgKHdoaWNoIEkgc3VzcGVjdCBpcyB0aGUgc3RhbmRhcmQgb24gTWFjcy4pCisgVGFiIGhhbmRsaW5nIGhhcyBhbHNvIGJlZW4gZ2VuZXJhbGlzZWQgdG8gYWNjb21tb2RhdGUgYW55IHRhYndpZHRoCisgZnJvbSAyIHRvIDgwLCBpbmNsdXNpdmUuICBJbXBvcnRhbnRseSwgaXQgd2lsbCBsZWF2ZSB1bnRvdWNoZWQgYW55CisgbGl0ZXJhbCBUQUIgY2hhcmFjdGVycyBlbWJlZGRlZCB3aXRoaW4gc3RyaW5nIG9yIGNoYXJhY3RlciBjb25zdGFudHMuCisgPHA+CisgPGVtPldhcm5pbmc6PC9lbT4gZG8gbm90IHJ1biBvbiBiaW5hcnkgZmlsZXMuCisgPGVtPkNhdXRpb246PC9lbT4gcnVuIHdpdGggY2FyZSBvbiBjYXJlZnVsbHkgZm9ybWF0dGVkIGZpbGVzLgorIFRoaXMgbWF5IHNvdW5kIG9idmlvdXMsIGJ1dCBpZiB5b3UgZG9uJ3Qgc3BlY2lmeSBhc2lzLCBwcmVzdW1lIHRoYXQKKyB5b3VyIGZpbGVzIGFyZSBnb2luZyB0byBiZSBtb2RpZmllZC4gIElmICJ0YWJzIiBpcyAiYWRkIiBvciAicmVtb3ZlIiwKKyB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgbWF5IGJlIGFkZGVkIG9yIHJlbW92ZWQgYXMgbmVjZXNzYXJ5LiAgU2ltaWxhcmx5LAorIGZvciBDUidzIC0gaW4gZmFjdCAiZW9sIj0iY3JsZiIgb3IgY3I9ImFkZCIgY2FuIHJlc3VsdCBpbiBjcgorIGNoYXJhY3RlcnMgYmVpbmcgcmVtb3ZlZCBpbiBvbmUgc3BlY2lhbCBjYXNlIGFjY29tbW9kYXRlZCwgaS5lLiwKKyBDUkNSTEYgaXMgcmVnYXJkZWQgYXMgYSBzaW5nbGUgRU9MIHRvIGhhbmRsZSBjYXNlcyB3aGVyZSBvdGhlcgorIHByb2dyYW1zIGhhdmUgY29udmVydGVkIENSTEYgaW50byBDUkNSTEYuXV0+CisgIDwvZGVzY3JpcHRpb24+CisKKyAgPHN0cnVjdHVyZT4KKworICAgIDxhdHRyaWJ1dGVzPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXN0ZGlyIiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRGVzdGluYXRpb24gd2hlcmUgdGhlIGZpeGVkIGZpbGVzIHNob3VsZCBiZSBwbGFjZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCB0aGUgZGVzdGluYXRpb24gd2hlcmUgdGhlIGZpeGVkIGZpbGVzIHNob3VsZCBiZSBwbGFjZWQuCisgRGVmYXVsdCBpcyB0byByZXBsYWNlIHRoZSBvcmlnaW5hbCBmaWxlLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImVuY29kaW5nIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU3BlY2lmaWVzIHRoZSBlbmNvZGluZyBBbnQgZXhwZWN0cyB0aGUgZmlsZXMgdG8gYmUgaW4gLQorIGRlZmF1bHRzIHRvIHRoZSBwbGF0Zm9ybXMgZGVmYXVsdCBlbmNvZGluZy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU3BlY2lmaWVzIHRoZSBlbmNvZGluZyBBbnQgZXhwZWN0cyB0aGUgZmlsZXMgdG8gYmUgaW4gLQorIGRlZmF1bHRzIHRvIHRoZSBwbGF0Zm9ybXMgZGVmYXVsdCBlbmNvZGluZy4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJlb2YiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkZpeENSTEYuQWRkQXNpc1JlbW92ZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSImcXVvdDthZGQmcXVvdDssICZxdW90O2FzaXMmcXVvdDssICZxdW90O3JlbW92ZSZxdW90OyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU3BlY2lmeSBob3cgRE9TIEVPRiAoY29udHJvbC16KSBjaGFyYWN0ZXJzIGFyZSB0byBiZSBoYW5kbGVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTcGVjaWZ5IGhvdyBET1MgRU9GIChjb250cm9sLXopIGNoYXJhY3RlcnMgYXJlIHRvIGJlIGhhbmRsZWQuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZW9sIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5GaXhDUkxGLkNyTGYiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iJnF1b3Q7YXNpcyZxdW90OywgJnF1b3Q7Y3ImcXVvdDssICZxdW90O2xmJnF1b3Q7LCAmcXVvdDtjcmxmJnF1b3Q7IiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTcGVjaWZ5IGhvdyBFbmRPZkxpbmUgY2hhcmFjdGVycyBhcmUgdG8gYmUgaGFuZGxlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU3BlY2lmeSBob3cgRW5kT2ZMaW5lIGNoYXJhY3RlcnMgYXJlIHRvIGJlIGhhbmRsZWQuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iamF2YWZpbGVzIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NldCB0byB0cnVlIGlmIG1vZGlmeWluZyBKYXZhIHNvdXJjZSBmaWxlcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRvIHRydWUgaWYgbW9kaWZ5aW5nIEphdmEgc291cmNlIGZpbGVzLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InNyY2RpciIgdHlwZT0iamF2YS5pby5GaWxlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NvdXJjZSBkaXIgdG8gZmluZCB0aGUgc291cmNlIHRleHQgZmlsZXMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCB0aGUgc291cmNlIGRpciB0byBmaW5kIHRoZSBzb3VyY2UgdGV4dCBmaWxlcy4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0YWIiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkZpeENSTEYuQWRkQXNpc1JlbW92ZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSImcXVvdDthZGQmcXVvdDssICZxdW90O2FzaXMmcXVvdDssICZxdW90O3JlbW92ZSZxdW90OyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU3BlY2lmeSBob3cgdGFiIGNoYXJhY3RlcnMgYXJlIHRvIGJlIGhhbmRsZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNwZWNpZnkgaG93IHRhYiBjaGFyYWN0ZXJzIGFyZSB0byBiZSBoYW5kbGVkLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InRhYmxlbmd0aCIgdHlwZT0iaW50IgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImludCIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU3BlY2lmeSB0YWIgbGVuZ3RoIGluIGNoYXJhY3RlcnMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNwZWNpZnkgdGFiIGxlbmd0aCBpbiBjaGFyYWN0ZXJzLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgPC9hdHRyaWJ1dGVzPgorCisgICAgPGVsZW1lbnRzPgorICAgIDwvZWxlbWVudHM+CisKKyAgPC9zdHJ1Y3R1cmU+CisKKzwvdGFzaz4KKworCis8dGFzayBuYW1lPSJmdHAiIGNhdGVnb3J5PSJvdGhlciIKKyAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwubmV0LkZUUCIKKyAgICAgID4KKworICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQmFzaWMgRlRQIGNsaWVudC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICA8ZGVzY3JpcHRpb24+CisgICAgPCFbQ0RBVEFbQmFzaWMgRlRQIGNsaWVudC4gUGVyZm9ybXMgdGhlIGZvbGxvd2luZyBhY3Rpb25zOgorIDx1bD4KKyAgIDxsaT4gPHN0cm9uZz5zZW5kPC9zdHJvbmc+IC0gc2VuZCBmaWxlcyB0byBhIHJlbW90ZSBzZXJ2ZXIuIFRoaXMgaXMgdGhlCisgICBkZWZhdWx0IGFjdGlvbi48L2xpPgorICAgPGxpPiA8c3Ryb25nPmdldDwvc3Ryb25nPiAtIHJldHJpdmUgZmlsZXMgZnJvbSBhIHJlbW90ZSBzZXJ2ZXIuPC9saT4KKyAgIDxsaT4gPHN0cm9uZz5kZWw8L3N0cm9uZz4gLSBkZWxldGUgZmlsZXMgZnJvbSBhIHJlbW90ZSBzZXJ2ZXIuPC9saT4KKyAgIDxsaT4gPHN0cm9uZz5saXN0PC9zdHJvbmc+IC0gY3JlYXRlIGEgZmlsZSBsaXN0aW5nLjwvbGk+CisgICA8bGk+IDxzdHJvbmc+Y2htb2Q8L3N0cm9uZz4gLSBjaGFuZ2UgdW5peCBmaWxlIHBlcm1pc3Npb25zLjwvbGk+CisgPC91bD4KKyA8c3Ryb25nPk5vdGU6PC9zdHJvbmc+IFNvbWUgRlRQIHNlcnZlcnMgLSBub3RhYmx5IHRoZSBTb2xhcmlzIHNlcnZlciAtIHNlZW0KKyB0byBob2xkIGRhdGEgcG9ydHMgb3BlbiBhZnRlciBhICJyZXRyIiBvcGVyYXRpb24sIGFsbG93aW5nIHRoZW0gdG8gdGltZW91dAorIGluc3RlYWQgb2Ygc2h1dHRpbmcgdGhlbSBkb3duIGNsZWFubHkuIFRoaXMgaGFwcGVucyBpbiBhY3RpdmUgb3IgcGFzc2l2ZQorIG1vZGUsIGFuZCB0aGUgcG9ydHMgd2lsbCByZW1haW4gb3BlbiBldmVuIGFmdGVyIGVuZGluZyB0aGUgRlRQIHNlc3Npb24uIEZUUAorICJzZW5kIiBvcGVyYXRpb25zIHNlZW0gdG8gY2xvc2UgcG9ydHMgaW1tZWRpYXRlbHkuIFRoaXMgYmVoYXZpb3IgbWF5IGNhdXNlCisgcHJvYmxlbXMgb24gc29tZSBzeXN0ZW1zIHdoZW4gZG93bmxvYWRpbmcgbGFyZ2Ugc2V0cyBvZiBmaWxlcy5dXT4KKyAgPC9kZXNjcmlwdGlvbj4KKworICA8c3RydWN0dXJlPgorCisgICAgPGF0dHJpYnV0ZXM+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImFjdGlvbiIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwubmV0LkZUUC5BY3Rpb24iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iJnF1b3Q7c2VuZCZxdW90OywgJnF1b3Q7cHV0JnF1b3Q7LCAmcXVvdDtyZWN2JnF1b3Q7LCAmcXVvdDtnZXQmcXVvdDssICZxdW90O2RlbCZxdW90OywgJnF1b3Q7ZGVsZXRlJnF1b3Q7LCAmcXVvdDtsaXN0JnF1b3Q7LCAmcXVvdDtta2RpciZxdW90OywgJnF1b3Q7Y2htb2QmcXVvdDsiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0ZUUCBhY3Rpb24gdG8gYmUgdGFrZW4uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldHMgdGhlIEZUUCBhY3Rpb24gdG8gYmUgdGFrZW4uIEN1cnJlbnRseSBhY2NlcHRzICJwdXQiLCAiZ2V0IiwgImRlbCIsCisgIm1rZGlyIiwgImNobW9kIiBhbmQgImxpc3QiLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImJpbmFyeSIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlLCB1c2VzIGJpbmFyeSBtb2RlLCBvdGhlcndpc2UgdGV4dCBtb2RlIChkZWZhdWx0IGlzIGJpbmFyeSkuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIElmIHRydWUsIHVzZXMgYmluYXJ5IG1vZGUsIG90aGVyd2lzZSB0ZXh0IG1vZGUgKGRlZmF1bHQgaXMgYmluYXJ5KS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjaG1vZCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0ZpbGUgcGVybWlzc2lvbiBtb2RlIChVbml4IG9ubHkpIGZvciBmaWxlcyBzZW50IHRvIHRoZSBzZXJ2ZXIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldHMgdGhlIGZpbGUgcGVybWlzc2lvbiBtb2RlIChVbml4IG9ubHkpIGZvciBmaWxlcyBzZW50IHRvIHRoZSBzZXJ2ZXIuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVwZW5kcyIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTZXQgdG8gdHJ1ZSB0byB0cmFuc21pdCBvbmx5IGZpbGVzIHRoYXQgYXJlIG5ldyBvciBjaGFuZ2VkIGZyb20gdGhlaXIKKyByZW1vdGUgY291bnRlcnBhcnRzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdG8gdHJ1ZSB0byB0cmFuc21pdCBvbmx5IGZpbGVzIHRoYXQgYXJlIG5ldyBvciBjaGFuZ2VkIGZyb20gdGhlaXIKKyByZW1vdGUgY291bnRlcnBhcnRzLiBUaGUgZGVmYXVsdCBpcyB0byB0cmFuc21pdCBhbGwgZmlsZXMuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWdub3Jlbm9uY3JpdGljYWxlcnJvcnMiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRmxhZyB0byBza2lwIGVycm9ycyBvbiBkaXJlY3RvcnkgY3JlYXRpb24uCisgKGFuZCBtYXliZSBsYXRlciBvdGhlciBzZXJ2ZXIgc3BlY2lmaWMgZXJyb3JzKS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgc2V0IHRoZSBmbGFnIHRvIHNraXAgZXJyb3JzIG9uIGRpcmVjdG9yeSBjcmVhdGlvbi4KKyAoYW5kIG1heWJlIGxhdGVyIG90aGVyIHNlcnZlciBzcGVjaWZpYyBlcnJvcnMpCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibGlzdGluZyIgdHlwZT0iamF2YS5pby5GaWxlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBvdXRwdXQgZmlsZSBmb3IgdGhlICJsaXN0IiBhY3Rpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRoZSBvdXRwdXQgZmlsZSBmb3IgdGhlICJsaXN0IiBhY3Rpb24uIFRoaXMgYXR0cmlidXRlIGlzIGlnbm9yZWQgZm9yCisgYW55IG90aGVyIGFjdGlvbnMuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmV3ZXIiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQSBzeW5vbnltIGZvciA8dHQ+ZGVwZW5kczwvdHQ+Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBBIHN5bm9ueW0gZm9yIDx0dD5kZXBlbmRzPC90dD4uIFNldCB0byB0cnVlIHRvIHRyYW5zbWl0IG9ubHkgbmV3IG9yIGNoYW5nZWQKKyBmaWxlcy4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwYXNzaXZlIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NwZWNpZmllcyB3aGV0aGVyIHRvIHVzZSBwYXNzaXZlIG1vZGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNwZWNpZmllcyB3aGV0aGVyIHRvIHVzZSBwYXNzaXZlIG1vZGUuIFNldCB0byB0cnVlIGlmIHlvdSBhcmUgYmVoaW5kIGEKKyBmaXJld2FsbCBhbmQgY2Fubm90IGNvbm5lY3Qgd2l0aG91dCBpdC4gUGFzc2l2ZSBtb2RlIGlzIGRpc2FibGVkIGJ5CisgZGVmYXVsdC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwYXNzd29yZCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0xvZ2luIHBhc3N3b3JkIGZvciB0aGUgZ2l2ZW4gdXNlciBpZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0cyB0aGUgbG9naW4gcGFzc3dvcmQgZm9yIHRoZSBnaXZlbiB1c2VyIGlkLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InBvcnQiIHR5cGU9ImludCIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJpbnQiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0ZUUCBwb3J0IHVzZWQgYnkgdGhlIHJlbW90ZSBzZXJ2ZXIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldHMgdGhlIEZUUCBwb3J0IHVzZWQgYnkgdGhlIHJlbW90ZSBzZXJ2ZXIuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icmVtb3RlZGlyIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbUmVtb3RlIGRpcmVjdG9yeSB3aGVyZSBmaWxlcyB3aWxsIGJlIHBsYWNlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0cyB0aGUgcmVtb3RlIGRpcmVjdG9yeSB3aGVyZSBmaWxlcyB3aWxsIGJlIHBsYWNlZC4gVGhpcyBtYXkgYmUgYQorIHJlbGF0aXZlIG9yIGFic29sdXRlIHBhdGgsIGFuZCBtdXN0IGJlIGluIHRoZSBwYXRoIHN5bnRheCBleHBlY3RlZCBieQorIHRoZSByZW1vdGUgc2VydmVyLiBObyBjb3JyZWN0aW9uIG9mIHBhdGggc3ludGF4IHdpbGwgYmUgcGVyZm9ybWVkLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InNlcGFyYXRvciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1JlbW90ZSBmaWxlIHNlcGFyYXRvciBjaGFyYWN0ZXIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldHMgdGhlIHJlbW90ZSBmaWxlIHNlcGFyYXRvciBjaGFyYWN0ZXIuIFRoaXMgbm9ybWFsbHkgZGVmYXVsdHMgdG8gdGhlCisgVW5peCBzdGFuZGFyZCBmb3J3YXJkIHNsYXNoLCBidXQgY2FuIGJlIG1hbnVhbGx5IG92ZXJyaWRkZW4gdXNpbmcgdGhpcworIGNhbGwgaWYgdGhlIHJlbW90ZSBzZXJ2ZXIgcmVxdWlyZXMgc29tZSBvdGhlciBzZXBhcmF0b3IuIE9ubHkgdGhlIGZpcnN0CisgY2hhcmFjdGVyIG9mIHRoZSBzdHJpbmcgaXMgdXNlZC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzZXJ2ZXIiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtGVFAgc2VydmVyIHRvIHNlbmQgZmlsZXMgdG8uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldHMgdGhlIEZUUCBzZXJ2ZXIgdG8gc2VuZCBmaWxlcyB0by4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJza2lwZmFpbGVkdHJhbnNmZXJzIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIGVuYWJsZXMgdW5zdWNjZXNzZnVsIGZpbGUgcHV0LCBkZWxldGUgYW5kIGdldAorIG9wZXJhdGlvbnMgdG8gYmUgc2tpcHBlZCB3aXRoIGEgd2FybmluZyBhbmQgdGhlIHJlbWFpbmRlcgorIG9mIHRoZSBmaWxlcyBzdGlsbCB0cmFuc2ZlcnJlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgSWYgdHJ1ZSwgZW5hYmxlcyB1bnN1Y2Nlc3NmdWwgZmlsZSBwdXQsIGRlbGV0ZSBhbmQgZ2V0Cisgb3BlcmF0aW9ucyB0byBiZSBza2lwcGVkIHdpdGggYSB3YXJuaW5nIGFuZCB0aGUgcmVtYWluZGVyCisgb2YgdGhlIGZpbGVzIHN0aWxsIHRyYW5zZmVycmVkLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InVtYXNrIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRGVmYXVsdCBtYXNrIGZvciBmaWxlIGNyZWF0aW9uIG9uIGEgdW5peCBzZXJ2ZXIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldHMgdGhlIGRlZmF1bHQgbWFzayBmb3IgZmlsZSBjcmVhdGlvbiBvbiBhIHVuaXggc2VydmVyLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InVzZXJpZCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0xvZ2luIHVzZXIgaWQgdG8gdXNlIG9uIHRoZSBzcGVjaWZpZWQgc2VydmVyLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXRzIHRoZSBsb2dpbiB1c2VyIGlkIHRvIHVzZSBvbiB0aGUgc3BlY2lmaWVkIHNlcnZlci4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2ZXJib3NlIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NldCB0byB0cnVlIHRvIHJlY2VpdmUgbm90aWZpY2F0aW9uIGFib3V0IGVhY2ggZmlsZSBhcyBpdCBpcworIHRyYW5zZmVycmVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdG8gdHJ1ZSB0byByZWNlaXZlIG5vdGlmaWNhdGlvbiBhYm91dCBlYWNoIGZpbGUgYXMgaXQgaXMKKyB0cmFuc2ZlcnJlZC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgIDwvYXR0cmlidXRlcz4KKworICAgIDxlbGVtZW50cz4KKyAgICAgIDxlbGVtZW50IG5hbWU9ImZpbGVzZXQiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVTZXQiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGVzZXQiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBIHNldCBvZiBmaWxlcyB0byB1cGxvYWQgb3IgZG93bmxvYWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0Egc2V0IG9mIGZpbGVzIHRvIHVwbG9hZCBvciBkb3dubG9hZF1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgPC9lbGVtZW50cz4KKworICA8L3N0cnVjdHVyZT4KKworPC90YXNrPgorCisKKzx0YXNrIG5hbWU9ImdlbmtleSIgY2F0ZWdvcnk9ImphdmEiCisgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkdlbmVyYXRlS2V5IgorICAgICAgPgorCisgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtHZW5lcmF0ZXMgYSBrZXkgaW4gYSBrZXlzdG9yZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICA8ZGVzY3JpcHRpb24+CisgICAgPCFbQ0RBVEFbR2VuZXJhdGVzIGEga2V5IGluIGEga2V5c3RvcmUuXV0+CisgIDwvZGVzY3JpcHRpb24+CisKKyAgPHN0cnVjdHVyZT4KKworICAgIDxhdHRyaWJ1dGVzPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJhbGlhcyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBhbGlhcyB0byBhZGQgdW5kZXIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRoZSBhbGlhcyB0byBhZGQgdW5kZXIuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZG5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgZGlzdGluZ3Vpc2hlZCBuYW1lIGZvciBlbnRpdHkuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRoZSBkaXN0aW5ndWlzaGVkIG5hbWUgZm9yIGVudGl0eS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJrZXlhbGciIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgbWV0aG9kIHRvIHVzZSB3aGVuIGdlbmVyYXRpbmcgbmFtZS12YWx1ZSBwYWlyLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBUaGUgbWV0aG9kIHRvIHVzZSB3aGVuIGdlbmVyYXRpbmcgbmFtZS12YWx1ZSBwYWlyLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImtleXBhc3MiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtQYXNzd29yZCBmb3IgcHJpdmF0ZSBrZXkgKGlmIGRpZmZlcmVudCkuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFBhc3N3b3JkIGZvciBwcml2YXRlIGtleSAoaWYgZGlmZmVyZW50KS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJrZXlzaXplIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSW5kaWNhdGVzIHRoZSBzaXplIG9mIGtleSBnZW5lcmF0ZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIEluZGljYXRlcyB0aGUgc2l6ZSBvZiBrZXkgZ2VuZXJhdGVkLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImtleXN0b3JlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbS2V5c3RvcmUgbG9jYXRpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIEtleXN0b3JlIGxvY2F0aW9uLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InNpZ2FsZyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBhbGdvcml0aG0gdG8gdXNlIGluIHNpZ25pbmcuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRoZSBhbGdvcml0aG0gdG8gdXNlIGluIHNpZ25pbmcuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3RvcmVwYXNzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbUGFzc3dvcmQgZm9yIGtleXN0b3JlIGludGVncml0eS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgUGFzc3dvcmQgZm9yIGtleXN0b3JlIGludGVncml0eS4KKyBNdXN0IGJlIGF0IGxlYXN0IDYgY2hhcmFjdGVycyBsb25nLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InN0b3JldHlwZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0tleXN0b3JlIHR5cGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIEtleXN0b3JlIHR5cGUuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmFsaWRpdHkiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJbmRpY2F0ZXMgaG93IG1hbnkgZGF5cyBjZXJ0aWZpY2F0ZSBpcyB2YWxpZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgSW5kaWNhdGVzIGhvdyBtYW55IGRheXMgY2VydGlmaWNhdGUgaXMgdmFsaWQuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmVyYm9zZSIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlLCB2ZXJib3NlIG91dHB1dCB3aGVuIHNpZ25pbmcuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIElmIHRydWUsIHZlcmJvc2Ugb3V0cHV0IHdoZW4gc2lnbmluZy4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgIDwvYXR0cmlidXRlcz4KKworICAgIDxlbGVtZW50cz4KKyAgICAgIDxlbGVtZW50IG5hbWU9ImRuYW1lIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5HZW5lcmF0ZUtleS5EaXN0aW5ndWlzaGVkTmFtZSIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRGlzdGluZ3Vpc2hlZCBuYW1lIGxpc3QuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0Rpc3Rpbmd1aXNoZWQgbmFtZSBsaXN0Ll1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgPC9lbGVtZW50cz4KKworICA8L3N0cnVjdHVyZT4KKworPC90YXNrPgorCisKKzx0YXNrIG5hbWU9ImdldCIgY2F0ZWdvcnk9Im5ldHdvcmsiCisgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkdldCIKKyAgICAgID4KKworICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbR2V0cyBhIHBhcnRpY3VsYXIgZmlsZSBmcm9tIGEgVVJMIHNvdXJjZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICA8ZGVzY3JpcHRpb24+CisgICAgPCFbQ0RBVEFbR2V0cyBhIHBhcnRpY3VsYXIgZmlsZSBmcm9tIGEgVVJMIHNvdXJjZS4KKyBPcHRpb25zIGluY2x1ZGUgdmVyYm9zZSByZXBvcnRpbmcsIHRpbWVzdGFtcCBiYXNlZCBmZXRjaGVzIGFuZCBjb250cm9sbGluZworIGFjdGlvbnMgb24gZmFpbHVyZXMuIE5COiBhY2Nlc3MgdGhyb3VnaCBhIGZpcmV3YWxsIG9ubHkgd29ya3MgaWYgdGhlIHdob2xlCisgSmF2YSBydW50aW1lIGlzIGNvcnJlY3RseSBjb25maWd1cmVkLl1dPgorICA8L2Rlc2NyaXB0aW9uPgorCisgIDxzdHJ1Y3R1cmU+CisKKyAgICA8YXR0cmlidXRlcz4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVzdCIgdHlwZT0iamF2YS5pby5GaWxlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1doZXJlIHRvIGNvcHkgdGhlIHNvdXJjZSBmaWxlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBXaGVyZSB0byBjb3B5IHRoZSBzb3VyY2UgZmlsZS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZ25vcmVlcnJvcnMiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgdHJ1ZSwgbG9nIGVycm9ycyBidXQgZG8gbm90IHRyZWF0IGFzIGZhdGFsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBJZiB0cnVlLCBsb2cgZXJyb3JzIGJ1dCBkbyBub3QgdHJlYXQgYXMgZmF0YWwuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icGFzc3dvcmQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtQYXNzd29yZCBmb3IgdGhlIGJhc2ljIGF1dGhlbnRpY2F0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBwYXNzd29yZCBmb3IgdGhlIGJhc2ljIGF1dGhlbnRpY2F0aW9uLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InNyYyIgdHlwZT0iamF2YS5uZXQuVVJMIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlVSTCIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVVJMIHRvIGdldC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBVUkwgdG8gZ2V0LgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InVzZXRpbWVzdGFtcCIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlLCBjb25kaXRpb25hbGx5IGRvd25sb2FkIGEgZmlsZSBiYXNlZCBvbiB0aGUgdGltZXN0YW1wCisgb2YgdGhlIGxvY2FsIGNvcHkuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIElmIHRydWUsIGNvbmRpdGlvbmFsbHkgZG93bmxvYWQgYSBmaWxlIGJhc2VkIG9uIHRoZSB0aW1lc3RhbXAKKyBvZiB0aGUgbG9jYWwgY29weS4KKworIDxwPkluIHRoaXMgc2l0dWF0aW9uLCB0aGUgaWYtbW9kaWZpZWQtc2luY2UgaGVhZGVyIGlzIHNldCBzbworIHRoYXQgdGhlIGZpbGUgaXMgb25seSBmZXRjaGVkIGlmIGl0IGlzIG5ld2VyIHRoYW4gdGhlIGxvY2FsCisgZmlsZSAob3IgdGhlcmUgaXMgbm8gbG9jYWwgZmlsZSkgVGhpcyBmbGFnIGlzIG9ubHkgdmFsaWQgb24KKyBIVFRQIGNvbm5lY3Rpb25zLCBpdCBpcyBpZ25vcmVkIGluIG90aGVyIGNhc2VzLiAgV2hlbiB0aGUgZmxhZworIGlzIHNldCwgdGhlIGxvY2FsIGNvcHkgb2YgdGhlIGRvd25sb2FkZWQgZmlsZSB3aWxsIGFsc28gaGF2ZQorIGl0cyB0aW1lc3RhbXAgc2V0IHRvIHRoZSByZW1vdGUgZmlsZSB0aW1lLjwvcD4KKworIDxwPk5vdGUgdGhhdCByZW1vdGUgZmlsZXMgb2YgZGF0ZSAxLzEvMTk3MCAoR01UKSBhcmUgdHJlYXRlZCBhcworICdubyB0aW1lc3RhbXAnLCBhbmQgd2ViIHNlcnZlcnMgb2Z0ZW4gc2VydmUgZmlsZXMgd2l0aCBhCisgdGltZXN0YW1wIGluIHRoZSBmdXR1cmUgYnkgcmVwbGFjaW5nIHRoZWlyIHRpbWVzdGFtcCB3aXRoIHRoYXQKKyBvZiB0aGUgY3VycmVudCB0aW1lLiBBbHNvLCBpbnRlci1jb21wdXRlciBjbG9jayBkaWZmZXJlbmNlcyBjYW4KKyBjYXVzZSBubyBlbmQgb2YgZ3JpZWYuPC9wPgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InVzZXJuYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVXNlcm5hbWUgZm9yIGJhc2ljIGF1dGguXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFVzZXJuYW1lIGZvciBiYXNpYyBhdXRoLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InZlcmJvc2UiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgdHJ1ZSwgc2hvdyB2ZXJib3NlIHByb2dyZXNzIGluZm9ybWF0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBJZiB0cnVlLCBzaG93IHZlcmJvc2UgcHJvZ3Jlc3MgaW5mb3JtYXRpb24uCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICA8L2F0dHJpYnV0ZXM+CisKKyAgICA8ZWxlbWVudHM+CisgICAgPC9lbGVtZW50cz4KKworICA8L3N0cnVjdHVyZT4KKworPC90YXNrPgorCisKKzx0YXNrIG5hbWU9Imd1bnppcCIgY2F0ZWdvcnk9InBhY2thZ2luZyIKKyAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuR1VuemlwIgorICAgICAgPgorCisgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtFeHBhbmRzIGEgZmlsZSB0aGF0IGhhcyBiZWVuIGNvbXByZXNzZWQgd2l0aCB0aGUgR1pJUCBhbGdvcml0aG0uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgPGRlc2NyaXB0aW9uPgorICAgIDwhW0NEQVRBW0V4cGFuZHMgYSBmaWxlIHRoYXQgaGFzIGJlZW4gY29tcHJlc3NlZCB3aXRoIHRoZSBHWklQCisgYWxnb3JpdGhtLiBOb3JtYWxseSB1c2VkIHRvIGNvbXByZXNzIG5vbi1jb21wcmVzc2VkIGFyY2hpdmVzIHN1Y2gKKyBhcyBUQVIgZmlsZXMuXV0+CisgIDwvZGVzY3JpcHRpb24+CisKKyAgPHN0cnVjdHVyZT4KKworICAgIDxhdHRyaWJ1dGVzPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXN0IiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGRlc3RpbmF0aW9uIGZpbGUgb3IgZGlyZWN0b3J5OyBvcHRpb25hbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgVGhlIGRlc3RpbmF0aW9uIGZpbGUgb3IgZGlyZWN0b3J5OyBvcHRpb25hbC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzcmMiIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgZmlsZSB0byBleHBhbmQ7IHJlcXVpcmVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBUaGUgZmlsZSB0byBleHBhbmQ7IHJlcXVpcmVkLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgPC9hdHRyaWJ1dGVzPgorCisgICAgPGVsZW1lbnRzPgorICAgIDwvZWxlbWVudHM+CisKKyAgPC9zdHJ1Y3R1cmU+CisKKzwvdGFzaz4KKworCis8dGFzayBuYW1lPSJnemlwIiBjYXRlZ29yeT0icGFja2FnaW5nIgorICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5HWmlwIgorICAgICAgPgorCisgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDb21wcmVzc2VzIGEgZmlsZSB3aXRoIHRoZSBHWklQIGFsZ29yaXRobS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICA8ZGVzY3JpcHRpb24+CisgICAgPCFbQ0RBVEFbQ29tcHJlc3NlcyBhIGZpbGUgd2l0aCB0aGUgR1pJUCBhbGdvcml0aG0uIE5vcm1hbGx5IHVzZWQgdG8gY29tcHJlc3MKKyBub24tY29tcHJlc3NlZCBhcmNoaXZlcyBzdWNoIGFzIFRBUiBmaWxlcy5dXT4KKyAgPC9kZXNjcmlwdGlvbj4KKworICA8c3RydWN0dXJlPgorCisgICAgPGF0dHJpYnV0ZXM+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InNyYyIgdHlwZT0iamF2YS5pby5GaWxlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBmaWxlIHRvIGNvbXByZXNzOyByZXF1aXJlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgdGhlIGZpbGUgdG8gY29tcHJlc3M7IHJlcXVpcmVkLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InppcGZpbGUiIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgcmVxdWlyZWQgZGVzdGluYXRpb24gZmlsZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgdGhlIHJlcXVpcmVkIGRlc3RpbmF0aW9uIGZpbGUuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICA8L2F0dHJpYnV0ZXM+CisKKyAgICA8ZWxlbWVudHM+CisgICAgPC9lbGVtZW50cz4KKworICA8L3N0cnVjdHVyZT4KKworPC90YXNrPgorCisKKzx0YXNrIG5hbWU9Imljb250cmFjdCIgY2F0ZWdvcnk9Im90aGVyIgorICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5JQ29udHJhY3QiCisgICAgICBtYXRjaGluZ1Rhc2s9InRydWUiPgorCisgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJbnN0cnVtZW50cyBKYXZhIGNsYXNzZXMgd2l0aCBpQ29udHJhY3QgREJDIHByZXByb2Nlc3Nvci5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICA8ZGVzY3JpcHRpb24+CisgICAgPCFbQ0RBVEFbSW5zdHJ1bWVudHMgSmF2YSBjbGFzc2VzIHdpdGggaUNvbnRyYWN0IERCQyBwcmVwcm9jZXNzb3IuCisgPGJyLz4KKyBUaGUgdGFzayBjYW4gZ2VuZXJhdGUgYSBwcm9wZXJ0aWVzIGZpbGUgZm9yIDxhIGhyZWY9Imh0dHA6Ly9oamVtLnNvbC5uby9oZWxsZXNveS9pY29udHJvbC5odG1sIj5pQ29udHJvbDwvYT4sCisgYSBncmFwaGljYWwgdXNlciBpbnRlcmZhY2UgdGhhdCBsZXRzIHlvdSB0dXJuIG9uL29mZiBhc3NlcnRpb25zLiBpQ29udHJvbCBnZW5lcmF0ZXMgYSBjb250cm9sIGZpbGUgdGhhdCB5b3UgY2FuIHJlZmVyIHRvCisgZnJvbSB0aGlzIHRhc2sgdXNpbmcgdGhlIGNvbnRyb2xmaWxlIGF0dHJpYnV0ZS4KKyBpQ29udHJhY3QgaXMgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5yZWxpYWJsZS1zeXN0ZW1zLmNvbS90b29scy8iPmh0dHA6Ly93d3cucmVsaWFibGUtc3lzdGVtcy5jb20vdG9vbHMvPC9hPgorIDxwLz4KKyBUaGFua3MgdG8gUmFpbmVyIFNjaG1pdHogZm9yIGVuaGFuY2VtZW50cyBhbmQgY29tbWVudHMuXV0+CisgIDwvZGVzY3JpcHRpb24+CisKKyAgPHN0cnVjdHVyZT4KKworICAgIDxhdHRyaWJ1dGVzPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJidWlsZGRpciIgdHlwZT0iamF2YS5pby5GaWxlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0J1aWxkIGRpcmVjdG9yeSBmb3IgaW5zdHJ1bWVudGVkIGNsYXNzZXMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldHMgdGhlIGJ1aWxkIGRpcmVjdG9yeSBmb3IgaW5zdHJ1bWVudGVkIGNsYXNzZXMuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NkaXIiIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDbGFzcyBkaXJlY3RvcnkgKHVuaW5zdHJ1bWVudGVkIGNsYXNzZXMpLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXRzIHRoZSBjbGFzcyBkaXJlY3RvcnkgKHVuaW5zdHJ1bWVudGVkIGNsYXNzZXMpLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzcGF0aCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aCIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJQYXRoIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDbGFzc3BhdGggdG8gYmUgdXNlZCBmb3IgaW52b2NhdGlvbiBvZiBpQ29udHJhY3QuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldHMgdGhlIGNsYXNzcGF0aCB0byBiZSB1c2VkIGZvciBpbnZvY2F0aW9uIG9mIGlDb250cmFjdC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc3BhdGhyZWYiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlZmVyZW5jZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJSZWZlcmVuY2UiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgYSByZWZlcmVuY2UgdG8gYSBjbGFzc3BhdGggZGVmaW5lZCBlbHNld2hlcmUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIEFkZHMgYSByZWZlcmVuY2UgdG8gYSBjbGFzc3BhdGggZGVmaW5lZCBlbHNld2hlcmUuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29udHJvbGZpbGUiIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDb250cm9sIGZpbGUgdG8gcGFzcyB0byBpQ29udHJhY3QuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldHMgdGhlIGNvbnRyb2wgZmlsZSB0byBwYXNzIHRvIGlDb250cmFjdC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmYWlsdGhyb3dhYmxlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhyb3dhYmxlIChFeGNlcHRpb24pIHRvIGJlIHRocm93biBvbiBhc3NlcnRpb24gdmlvbGF0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXRzIHRoZSBUaHJvd2FibGUgKEV4Y2VwdGlvbikgdG8gYmUgdGhyb3duIG9uIGFzc2VydGlvbiB2aW9sYXRpb24uCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaW5zdHJ1bWVudGRpciIgdHlwZT0iamF2YS5pby5GaWxlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0luc3RydW1lbnRhdGlvbiBkaXJlY3RvcnkuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldHMgdGhlIGluc3RydW1lbnRhdGlvbiBkaXJlY3RvcnkuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaW52YXJpYW50IiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1R1cm5zIG9uL29mZiBpbnZhcmlhbnQgaW5zdHJ1bWVudGF0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBUdXJucyBvbi9vZmYgaW52YXJpYW50IGluc3RydW1lbnRhdGlvbi4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb3N0IiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1R1cm5zIG9uL29mZiBwb3N0Y29uZGl0aW9uIGluc3RydW1lbnRhdGlvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgVHVybnMgb24vb2ZmIHBvc3Rjb25kaXRpb24gaW5zdHJ1bWVudGF0aW9uLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InByZSIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUdXJucyBvbi9vZmYgcHJlY29uZGl0aW9uIGluc3RydW1lbnRhdGlvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgVHVybnMgb24vb2ZmIHByZWNvbmRpdGlvbiBpbnN0cnVtZW50YXRpb24uCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icXVpZXQiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGVsbHMgaUNvbnRyYWN0IHRvIGJlIHF1aWV0Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBUZWxscyBpQ29udHJhY3QgdG8gYmUgcXVpZXQuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icmVwYnVpbGRkaXIiIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtCdWlsZCBkaXJlY3RvcnkgZm9yIGluc3RydW1lbnRlZCBjbGFzc2VzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXRzIHRoZSBidWlsZCBkaXJlY3RvcnkgZm9yIGluc3RydW1lbnRlZCBjbGFzc2VzLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InJlcG9zaXRvcnlkaXIiIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtCdWlsZCBkaXJlY3RvcnkgZm9yIHJlcG9zaXRvcnkgY2xhc3Nlcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0cyB0aGUgYnVpbGQgZGlyZWN0b3J5IGZvciByZXBvc2l0b3J5IGNsYXNzZXMuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3JjZGlyIiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU291cmNlIGRpcmVjdG9yeS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0cyB0aGUgc291cmNlIGRpcmVjdG9yeS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXRzIiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTmFtZSBvZiB0aGUgZmlsZSB3aGVyZSB0YXJnZXRzIHdpbGwgYmUgd3JpdHRlbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0cyB0aGUgbmFtZSBvZiB0aGUgZmlsZSB3aGVyZSB0YXJnZXRzIHdpbGwgYmUgd3JpdHRlbi4gVGhhdCBpcyB0aGUKKyBmaWxlIHRoYXQgdGVsbHMgaUNvbnRyYWN0IHdoYXQgZmlsZXMgdG8gcHJvY2Vzcy4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1cGRhdGVpY29udHJvbCIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlLCB1cGRhdGVzIGlDb250cm9sIHByb3BlcnRpZXMgZmlsZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgSWYgdHJ1ZSwgdXBkYXRlcyBpQ29udHJvbCBwcm9wZXJ0aWVzIGZpbGUKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2ZXJib3NpdHkiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtWZXJib3NpdHkgbGV2ZWwgb2YgaUNvbnRyYWN0Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXRzIHRoZSB2ZXJib3NpdHkgbGV2ZWwgb2YgaUNvbnRyYWN0LiBBbnkgY29tYmluYXRpb24gb2YKKyBlcnJvciosd2FybmluZyosbm90ZSosaW5mbyoscHJvZ3Jlc3MqLGRlYnVnKiAoY29tbWEgc2VwYXJhdGVkKSBjYW4gYmUKKyB1c2VkLiBEZWZhdWx0cyB0byBlcnJvciosd2FybmluZyoKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgIDwvYXR0cmlidXRlcz4KKworICAgIDxlbGVtZW50cz4KKyAgICAgIDxlbGVtZW50IG5hbWU9ImNsYXNzcGF0aCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aCIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUGF0aCIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NsYXNzcGF0aC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbU2V0cyB0aGUgY2xhc3NwYXRoLl1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgPC9lbGVtZW50cz4KKworICA8L3N0cnVjdHVyZT4KKworPC90YXNrPgorCisKKzx0YXNrIG5hbWU9ImlsYXNtIiBjYXRlZ29yeT0ib3RoZXIiCisgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmRvdG5ldC5JbGFzbSIKKyAgICAgIG1hdGNoaW5nVGFzaz0idHJ1ZSI+CisKKyAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0Fzc2VtYmxlcyAuTkVUIEludGVybWVkaWF0ZSBMYW5ndWFnZSBmaWxlcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICA8ZGVzY3JpcHRpb24+CisgICAgPCFbQ0RBVEFbQXNzZW1ibGVzIC5ORVQgSW50ZXJtZWRpYXRlIExhbmd1YWdlIGZpbGVzLiBUaGUgdGFzayB3aWxsIG9ubHkgd29yaworICBvbiB3aW4ySyB1bnRpbCBvdGhlciBwbGF0Zm9ybXMgc3VwcG9ydCBjc2MuZXhlIG9yIGFuIGVxdWl2YWxlbnQuIGlsYXNtLmV4ZQorICBtdXN0IGJlIG9uIHRoZSBleGVjdXRlIHBhdGggdG9vLiA8cD4KKworICA8cD4KKworICBBbGwgcGFyYW1ldGVycyBhcmUgb3B0aW9uYWw6ICZsdDtpbC8mZ3Q7IHNob3VsZCBzdWZmaWNlIHRvIHByb2R1Y2UgYSBkZWJ1ZworICBidWlsZCBvZiBhbGwgKi5pbCBmaWxlcy4gVGhlIG9wdGlvbiBzZXQgaXMgcm91Z2hseSBjb21wYXRpYmxlIHdpdGggdGhlCisgIENTaGFycCBjbGFzczsgZXZlbiB0aG91Z2ggdGhlIGNvbW1hbmQgbGluZSBvcHRpb25zIGFyZSBvbmx5IHZhZ3VlbHkKKyAgZXF1aXZhbGVudC4gW1RoZSBsb3cgbGV2ZWwgY29tbWFuZHMgdGFrZSB0aGluZ3MgbGlrZSAvT1VUPWZpbGUsIGNzYyB3YW50cworICAvb3V0OmZpbGUgLi4uIC92ZXJib3NlIGlzIHVzZWQgc29tZSBwbGFjZXM7IC9xdWlldCBoZXJlIGluIGlsZGFzbS4uLiBldGMuXQorICBJdCB3b3VsZCBiZSBuaWNlIGlmIHNvbWVvbmUgbWFkZSBhbGwgdGhlIGNvbW1hbmQgbGluZSB0b29scyBjb25zaXN0ZW50IChhbmQKKyAgbm90IGFzIGJyaXR0bGUgYXMgdGhlIGphdmEgY21kbGluZSB0b29scykgPHA+CisKKyAgVGhlIHRhc2sgaXMgYSBkaXJlY3RvcnkgYmFzZWQgdGFzaywgc28gYXR0cmlidXRlcyBsaWtlIDxiPmluY2x1ZGVzPSIqLmlsIgorICA8L2I+IGFuZCA8Yj5leGNsdWRlcz0iYnJva2VuLmlsIjwvYj4gY2FuIGJlIHVzZWQgdG8gY29udHJvbCB0aGUgZmlsZXMgcHVsbGVkCisgIGluLiBFYWNoIGZpbGUgaXMgYnVpbHQgb24gaXRzIG93biwgcHJvZHVjaW5nIGFuIGFwcHJvcHJpYXRlbHkgbmFtZWQgb3V0cHV0CisgIGZpbGUgdW5sZXNzIG1hbnVhbGx5IHNwZWNpZmllZCB3aXRoIDxiPm91dGZpbGU8L2I+XV0+CisgIDwvZGVzY3JpcHRpb24+CisKKyAgPHN0cnVjdHVyZT4KKworICAgIDxhdHRyaWJ1dGVzPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZWJ1ZyIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtEZWJ1ZyBmbGFnIG9uIG9yIG9mZi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgc2V0IHRoZSBkZWJ1ZyBmbGFnIG9uIG9yIG9mZi4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJleHRyYW9wdGlvbnMiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBbnkgZXh0cmEgb3B0aW9ucyB3aGljaCBhcmUgbm90IGV4cGxpY2l0bHkKKyBzdXBwb3J0ZWQgYnkgdGhpcyB0YXNrLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBBbnkgZXh0cmEgb3B0aW9ucyB3aGljaCBhcmUgbm90IGV4cGxpY2l0bHkKKyBzdXBwb3J0ZWQgYnkgdGhpcyB0YXNrLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImZhaWxvbmVycm9yIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIGZhaWxzIGlmIGlsYXNtIHRvb2wgZmFpbHMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIElmIHRydWUsIGZhaWxzIGlmIGlsYXNtIHRvb2wgZmFpbHMuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ia2V5ZmlsZSIgdHlwZT0iamF2YS5pby5GaWxlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBuYW1lIG9mIGEgZmlsZSBjb250YWluaW5nIGEgcHJpdmF0ZSBrZXkuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIHRoZSBuYW1lIG9mIGEgZmlsZSBjb250YWluaW5nIGEgcHJpdmF0ZSBrZXkuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibGlzdGluZyIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlLCBwcm9kdWNlIGEgbGlzdGluZyAob2ZmIGJ5IGRlZmF1bHQpLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBJZiB0cnVlLCBwcm9kdWNlIGEgbGlzdGluZyAob2ZmIGJ5IGRlZmF1bHQpLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9Im91dHB1dGZpbGUiIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtPdXRwdXQgZmlsZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBvdXRwdXQgZmlsZS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJyZXNvdXJjZWZpbGUiIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtOYW1lIG9mIHJlc291cmNlIGZpbGUgdG8gaW5jbHVkZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgbmFtZSBvZiByZXNvdXJjZSBmaWxlIHRvIGluY2x1ZGUuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3JjZGlyIiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU291cmNlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBmaWxlcyB0byBiZSBjb21waWxlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBzb3VyY2UgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGZpbGVzIHRvIGJlIGNvbXBpbGVkLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InRhcmdldHR5cGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUeXBlIG9mIHRhcmdldCwgZWl0aGVyICJleGUiIG9yICJsaWJyYXJ5Ii5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0cyB0aGUgdHlwZSBvZiB0YXJnZXQsIGVpdGhlciAiZXhlIiBvciAibGlicmFyeSIuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmVyYm9zZSIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlLCBlbmFibGUgdmVyYm9zZSBJTEFTTSBvdXRwdXQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIElmIHRydWUsIGVuYWJsZSB2ZXJib3NlIElMQVNNIG91dHB1dC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgIDwvYXR0cmlidXRlcz4KKworICAgIDxlbGVtZW50cz4KKyAgICA8L2VsZW1lbnRzPgorCisgIDwvc3RydWN0dXJlPgorCis8L3Rhc2s+CisKKworPHRhc2sgbmFtZT0iaW5wdXQiIGNhdGVnb3J5PSJjb250cm9sIgorICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5JbnB1dCIKKyAgICAgID4KKworICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbUmVhZHMgYW4gaW5wdXQgbGluZSBmcm9tIHRoZSBjb25zb2xlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgIDxkZXNjcmlwdGlvbj4KKyAgICA8IVtDREFUQVtSZWFkcyBhbiBpbnB1dCBsaW5lIGZyb20gdGhlIGNvbnNvbGUuXV0+CisgIDwvZGVzY3JpcHRpb24+CisKKyAgPHN0cnVjdHVyZT4KKworICAgIDxhdHRyaWJ1dGVzPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJhZGRwcm9wZXJ0eSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0RlZmluZXMgdGhlIG5hbWUgb2YgYSBwcm9wZXJ0eSB0byBiZSBjcmVhdGVkIGZyb20gaW5wdXQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIERlZmluZXMgdGhlIG5hbWUgb2YgYSBwcm9wZXJ0eSB0byBiZSBjcmVhdGVkIGZyb20gaW5wdXQuIEJlaGF2aW91ciBpcworIGFjY29yZGluZyB0byBwcm9wZXJ0eSB0YXNrIHdoaWNoIG1lYW5zIHRoYXQgZXhpc3RpbmcgcHJvcGVydGllcworIGNhbm5vdCBiZSBvdmVycmlkZW4uCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibWVzc2FnZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW01lc3NhZ2Ugd2hpY2ggZ2V0cyBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIgZHVyaW5nIHRoZSBidWlsZCBydW4uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldHMgdGhlIE1lc3NhZ2Ugd2hpY2ggZ2V0cyBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIgZHVyaW5nIHRoZSBidWlsZCBydW4uCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmFsaWRhcmdzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRGVmaW5lcyB2YWxpZCBpbnB1dCBwYXJhbWV0ZXJzIGFzIGNvbW1hIHNlcGFyYXRlZCBzdHJpbmdzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBEZWZpbmVzIHZhbGlkIGlucHV0IHBhcmFtZXRlcnMgYXMgY29tbWEgc2VwYXJhdGVkIHN0cmluZ3MuIElmIHNldCwgaW5wdXQKKyB0YXNrIHdpbGwgcmVqZWN0IGFueSBpbnB1dCBub3QgZGVmaW5lZCBhcyBhY2NlcHRlZCBhbmQgcmVxdWlyZXMgdGhlIHVzZXIKKyB0byByZWVudGVyIGl0LiBWYWxpZGFyZ3MgYXJlIGNhc2Ugc2Vuc2l0aXZlLiBJZiB5b3Ugd2FudCAnYScgYW5kICdBJyB0bworIGJlIGFjY2VwdGVkIHlvdSBuZWVkIHRvIGRlZmluZSBib3RoIHZhbHVlcyBhcyBhY2NlcHRlZCBhcmd1bWVudHMuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICA8L2F0dHJpYnV0ZXM+CisKKyAgICA8ZWxlbWVudHM+CisgICAgPC9lbGVtZW50cz4KKworICAgICAgPGJvZHkgPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IGEgbXVsdGlsaW5lIG1lc3NhZ2UuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2JvZHk+CisKKyAgPC9zdHJ1Y3R1cmU+CisKKzwvdGFzaz4KKworCis8dGFzayBuYW1lPSJpcGxhbmV0LWVqYmMiIGNhdGVnb3J5PSJlamIiCisgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmVqYi5JUGxhbmV0RWpiY1Rhc2siCisgICAgICA+CisKKyAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NvbXBpbGVzIEVKQiBzdHVicyBhbmQgc2tlbGV0b25zIGZvciB0aGUgaVBsYW5ldCBBcHBsaWNhdGlvbiBTZXJ2ZXIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgPGRlc2NyaXB0aW9uPgorICAgIDwhW0NEQVRBW0NvbXBpbGVzIEVKQiBzdHVicyBhbmQgc2tlbGV0b25zIGZvciB0aGUgaVBsYW5ldCBBcHBsaWNhdGlvbiBTZXJ2ZXIuCisgVGhlIEVKQnMgdG8gYmUgcHJvY2Vzc2VkIGFyZSBzcGVjaWZpZWQgYnkgdGhlIEVKQiAxLjEgc3RhbmRhcmQgWE1MCisgZGVzY3JpcHRvciwgYW5kIGFkZGl0aW9uYWwgYXR0cmlidXRlcyBhcmUgb2J0YWluZWQgZnJvbSB0aGUgaVBsYW5ldCBBcHBsaWNhdGlvbgorIFNlcnZlci1zcGVjaWZpYyBYTUwgZGVzY3JpcHRvci4gIFNpbmNlIHRoZSBYTUwgZGVzY3JpcHRvcnMgY2FuIGluY2x1ZGUKKyBtdWx0aXBsZSBFSkJzLCB0aGlzIGlzIGEgY29udmVuaWVudCB3YXkgb2Ygc3BlY2lmeWluZyBtYW55IEVKQnMgaW4gYSBzaW5nbGUKKyBBbnQgdGFzay4gIFRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgYWxsb3dlZDoKKyAgIDx1bD4KKyAgICAgPGxpPjxpPmVqYmRlc2NyaXB0b3I8L2k+IC0tIFN0YW5kYXJkIEVKQiAxLjEgWE1MIGRlc2NyaXB0b3IgKHR5cGljYWxseQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGVkICJlamItamFyLnhtbCIpLiAgVGhpcyBhdHRyaWJ1dGUgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkLgorICAgICA8bGk+PGk+aWFzZGVzY3JpcHRvcjwvaT4gLS0gRUpCIFhNTCBkZXNjcmlwdG9yIGZvciBpUGxhbmV0IEFwcGxpY2F0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2ZXIgKHR5cGljYWxseSB0aXRsZWQgImlhcy1lamItamFyLnhtbCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGF0dHJpYnV0ZSBpcyByZXF1aXJlZC4KKyAgICAgPGxpPjxpPmRlc3Q8L2k+IC0tIFRoZSBpcyB0aGUgYmFzZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIFJNSSBzdHVicyBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgIHNrZWxldG9ucyBhcmUgd3JpdHRlbi4gIEluIGFkZGl0aW9uLCB0aGUgY2xhc3MgZmlsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciBlYWNoIGJlYW4gKGhvbWUgaW50ZXJmYWNlLCByZW1vdGUgaW50ZXJmYWNlLCBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgIEVKQiBpbXBsZW1lbnRhdGlvbikgbXVzdCBiZSBmb3VuZCBpbiB0aGlzIGRpcmVjdG9yeS4KKyAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgYXR0cmlidXRlIGlzIHJlcXVpcmVkLgorICAgICA8bGk+PGk+Y2xhc3NwYXRoPC9pPiAtLSBUaGUgY2xhc3NwYXRoIHVzZWQgd2hlbiBnZW5lcmF0aW5nIEVKQiBzdHVicyBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tlbGV0b25zLiAgVGhpcyBpcyBhbiBvcHRpb25hbCBhdHRyaWJ1dGUgKGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9taXR0ZWQsIHRoZSBjbGFzc3BhdGggc3BlY2lmaWVkIHdoZW4gQW50IHdhcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydGVkIHdpbGwgYmUgdXNlZCkuICBOZXN0ZWQgImNsYXNzcGF0aCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudHMgbWF5IGFsc28gYmUgdXNlZC4KKyAgICAgPGxpPjxpPmtlZXBnZW5lcmF0ZWQ8L2k+IC0tIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0aGUgSmF2YSBzb3VyY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVzIHdoaWNoIGFyZSBnZW5lcmF0ZWQgYnkgZWpiYyB3aWxsIGJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYXZlZCBvciBhdXRvbWF0aWNhbGx5IGRlbGV0ZWQuICBJZiAieWVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzb3VyY2UgZmlsZXMgd2lsbCBiZSByZXRhaW5lZC4gIFRoaXMgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGF0dHJpYnV0ZSAoaWYgb21pdHRlZCwgaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRzIHRvICJubyIpLgorICAgICA8bGk+PGk+ZGVidWc8L2k+IC0tIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0aGUgZWpiYyB1dGlsaXR5IHNob3VsZAorICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyBhZGRpdGlvbmFsIGRlYnVnZ2luZyBzdGF0ZW1lbnRzIHRvIHRoZSBzdGFuZGFyZAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC4gIElmICJ5ZXMiLCB0aGUgYWRkaXRpb25hbCBkZWJ1Z2dpbmcgc3RhdGVtZW50cworICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgZ2VuZXJhdGVkIChpZiBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0byAibm8iKS4KKyAgICAgPGxpPjxpPmlhc2hvbWU8L2k+IC0tIE1heSBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlICJob21lIiBkaXJlY3RvcnkgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGlQbGFuZXQgQXBwbGljYXRpb24gU2VydmVyIGluc3RhbGxhdGlvbi4gIFRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIHVzZWQgdG8gZmluZCB0aGUgZWpiYyB1dGlsaXR5IGlmIGl0IGlzbid0CisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlZCBpbiB0aGUgdXNlcidzIHN5c3RlbSBwYXRoLiAgVGhpcyBpcyBhbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWwgYXR0cmlidXRlIChpZiBzcGVjaWZpZWQsIGl0IHNob3VsZCByZWZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIDxjb2RlPltpbnN0YWxsLWxvY2F0aW9uXS9pcGxhbmV0L2lhczYvaWFzCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvZGU+IGRpcmVjdG9yeSkuICBJZiBvbWl0dGVkLCB0aGUgZWpiYyB1dGlsaXR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXN0IGJlIG9uIHRoZSB1c2VyJ3Mgc3lzdGVtIHBhdGguCisgICA8L3VsPgorIDxwPgorIEZvciBlYWNoIEVKQiBzcGVjaWZpZWQsIHRoaXMgdGFzayB3aWxsIGxvY2F0ZSB0aGUgdGhyZWUgY2xhc3NlcyB0aGF0IGNvbXByaXNlCisgdGhlIEVKQi4gIElmIHRoZXNlIGNsYXNzIGZpbGVzIGNhbm5vdCBiZSBsb2NhdGVkIGluIHRoZSA8Y29kZT5kZXN0PC9jb2RlPgorIGRpcmVjdG9yeSwgdGhlIHRhc2sgd2lsbCBmYWlsLiAgVGhlIHRhc2sgd2lsbCBhbHNvIGF0dGVtcHQgdG8gbG9jYXRlIHRoZSBFSkIKKyBzdHVicyBhbmQgc2tlbGV0b25zIGluIHRoaXMgZGlyZWN0b3J5LiAgSWYgZm91bmQsIHRoZSB0aW1lc3RhbXBzIG9uIHRoZQorIHN0dWJzIGFuZCBza2VsZXRvbnMgd2lsbCBiZSBjaGVja2VkIHRvIGVuc3VyZSB0aGV5IGFyZSB1cCB0byBkYXRlLiAgT25seSBpZgorIHRoZXNlIGZpbGVzIGNhbm5vdCBiZSBmb3VuZCBvciBpZiB0aGV5IGFyZSBvdXQgb2YgZGF0ZSB3aWxsIGVqYmMgYmUgY2FsbGVkCisgdG8gZ2VuZXJhdGUgbmV3IHN0dWJzIGFuZCBza2VsZXRvbnMuXV0+CisgIDwvZGVzY3JpcHRpb24+CisKKyAgPHN0cnVjdHVyZT4KKworICAgIDxhdHRyaWJ1dGVzPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc3BhdGgiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUGF0aCIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ2xhc3NwYXRoIHRvIGJlIHVzZWQgd2hlbiBjb21waWxpbmcgdGhlIEVKQiBzdHVicyBhbmQgc2tlbGV0b25zLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXRzIHRoZSBjbGFzc3BhdGggdG8gYmUgdXNlZCB3aGVuIGNvbXBpbGluZyB0aGUgRUpCIHN0dWJzIGFuZCBza2VsZXRvbnMuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVidWciIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgdHJ1ZSwgZGVidWdnaW5nIG91dHB1dCB3aWxsIGJlIGdlbmVyYXRlZCB3aGVuIGVqYmMgaXMKKyBleGVjdXRlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgSWYgdHJ1ZSwgZGVidWdnaW5nIG91dHB1dCB3aWxsIGJlIGdlbmVyYXRlZCB3aGVuIGVqYmMgaXMKKyBleGVjdXRlZC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXN0IiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRGVzdGluYXRpb24gZGlyZWN0b3J5IHdoZXJlIHRoZSBFSkIgc291cmNlIGNsYXNzZXMgbXVzdCBleGlzdAorIGFuZCB3aGVyZSB0aGUgc3R1YnMgYW5kIHNrZWxldG9ucyB3aWxsIGJlIHdyaXR0ZW4uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldHMgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSB3aGVyZSB0aGUgRUpCIHNvdXJjZSBjbGFzc2VzIG11c3QgZXhpc3QKKyBhbmQgd2hlcmUgdGhlIHN0dWJzIGFuZCBza2VsZXRvbnMgd2lsbCBiZSB3cml0dGVuLiAgVGhlIGRlc3RpbmF0aW9uCisgZGlyZWN0b3J5IG11c3QgZXhpc3QgYmVmb3JlIHRoaXMgdGFzayBpcyBleGVjdXRlZC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJlamJkZXNjcmlwdG9yIiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTG9jYXRpb24gb2YgdGhlIHN0YW5kYXJkIFhNTCBFSkIgZGVzY3JpcHRvci5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0cyB0aGUgbG9jYXRpb24gb2YgdGhlIHN0YW5kYXJkIFhNTCBFSkIgZGVzY3JpcHRvci4gIFR5cGljYWxseSwgdGhpcworIGZpbGUgaXMgbmFtZWQgImVqYi1qYXIueG1sIi4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpYXNkZXNjcmlwdG9yIiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTG9jYXRpb24gb2YgdGhlIGlBUy1zcGVjaWZpYyBYTUwgRUpCIGRlc2NyaXB0b3IuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldHMgdGhlIGxvY2F0aW9uIG9mIHRoZSBpQVMtc3BlY2lmaWMgWE1MIEVKQiBkZXNjcmlwdG9yLiAgVHlwaWNhbGx5LAorIHRoaXMgZmlsZSBpcyBuYW1lZCAiaWFzLWVqYi1qYXIueG1sIi4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpYXNob21lIiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTWF5IGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgImhvbWUiIGRpcmVjdG9yeSBmb3IgdGhpcyBpQVMgaW5zdGFsbGF0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBNYXkgYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSAiaG9tZSIgZGlyZWN0b3J5IGZvciB0aGlzIGlBUyBpbnN0YWxsYXRpb24uCisgVGhlIGRpcmVjdG9yeSBzcGVjaWZpZWQgc2hvdWxkIHR5cGljYWxseSBiZQorIDxjb2RlPltpbnN0YWxsLWxvY2F0aW9uXS9pcGxhbmV0L2lhczYvaWFzPC9jb2RlPi4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJrZWVwZ2VuZXJhdGVkIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIHRoZSBKYXZhIHNvdXJjZSBmaWxlcyB3aGljaCBhcmUgZ2VuZXJhdGVkIGJ5IGVqYmMgd2lsbCBiZSBzYXZlZCAuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIElmIHRydWUsIHRoZSBKYXZhIHNvdXJjZSBmaWxlcyB3aGljaCBhcmUgZ2VuZXJhdGVkIGJ5IGVqYmMgd2lsbCBiZSBzYXZlZCAuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICA8L2F0dHJpYnV0ZXM+CisKKyAgICA8ZWxlbWVudHM+CisgICAgICA8ZWxlbWVudCBuYW1lPSJjbGFzc3BhdGgiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IlBhdGgiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIHRvIHRoZSBjbGFzc3BhdGggdXNlZCB3aGVuIGNvbXBpbGluZyB0aGUgRUpCIHN0dWJzIGFuZCBza2VsZXRvbnMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0FkZHMgdG8gdGhlIGNsYXNzcGF0aCB1c2VkIHdoZW4gY29tcGlsaW5nIHRoZSBFSkIgc3R1YnMgYW5kIHNrZWxldG9ucy5dXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgIDwvZWxlbWVudHM+CisKKyAgPC9zdHJ1Y3R1cmU+CisKKzwvdGFzaz4KKworCis8dGFzayBuYW1lPSJqYXIiIGNhdGVnb3J5PSJwYWNrYWdpbmciCisgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkphciIKKyAgICAgIG1hdGNoaW5nVGFzaz0idHJ1ZSI+CisKKyAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NyZWF0ZXMgYSBKQVIgYXJjaGl2ZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICA8ZGVzY3JpcHRpb24+CisgICAgPCFbQ0RBVEFbQ3JlYXRlcyBhIEpBUiBhcmNoaXZlLl1dPgorICA8L2Rlc2NyaXB0aW9uPgorCisgIDxzdHJ1Y3R1cmU+CisKKyAgICA8YXR0cmlidXRlcz4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYmFzZWRpciIgdHlwZT0iamF2YS5pby5GaWxlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0RpcmVjdG9yeSBmcm9tIHdoaWNoIHRvIGFyY2hpdmUgZmlsZXM7IG9wdGlvbmFsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBEaXJlY3RvcnkgZnJvbSB3aGljaCB0byBhcmNoaXZlIGZpbGVzOyBvcHRpb25hbC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb21wcmVzcyIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtXaGV0aGVyIHdlIHdhbnQgdG8gY29tcHJlc3MgdGhlIGZpbGVzIG9yIG9ubHkgc3RvcmUgdGhlbTsKKyBvcHRpb25hbCwgZGVmYXVsdD10cnVlOy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgV2hldGhlciB3ZSB3YW50IHRvIGNvbXByZXNzIHRoZSBmaWxlcyBvciBvbmx5IHN0b3JlIHRoZW07Cisgb3B0aW9uYWwsIGRlZmF1bHQ9dHJ1ZTsKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXN0ZmlsZSIgdHlwZT0iamF2YS5pby5GaWxlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBmaWxlIHRvIGNyZWF0ZTsgcmVxdWlyZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRoZSBmaWxlIHRvIGNyZWF0ZTsgcmVxdWlyZWQuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZHVwbGljYXRlIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5aaXAuRHVwbGljYXRlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IiZxdW90O2FkZCZxdW90OywgJnF1b3Q7cHJlc2VydmUmcXVvdDssICZxdW90O2ZhaWwmcXVvdDsiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NldHMgYmVoYXZpb3IgZm9yIHdoZW4gYSBkdXBsaWNhdGUgZmlsZSBpcyBhYm91dCB0byBiZSBhZGRlZCAtCisgb25lIG9mIDxjb2RlPmtlZXA8L2NvZGU+LCA8Y29kZT5za2lwPC9jb2RlPiBvciA8Y29kZT5vdmVyd3JpdGU8L2NvZGU+Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXRzIGJlaGF2aW9yIGZvciB3aGVuIGEgZHVwbGljYXRlIGZpbGUgaXMgYWJvdXQgdG8gYmUgYWRkZWQgLQorIG9uZSBvZiA8Y29kZT5rZWVwPC9jb2RlPiwgPGNvZGU+c2tpcDwvY29kZT4gb3IgPGNvZGU+b3ZlcndyaXRlPC9jb2RlPi4KKyBQb3NzaWJsZSB2YWx1ZXMgYXJlOiA8Y29kZT5rZWVwPC9jb2RlPiAoa2VlcCBib3RoCisgb2YgdGhlIGZpbGVzKTsgPGNvZGU+c2tpcDwvY29kZT4gKGtlZXAgdGhlIGZpcnN0IHZlcnNpb24KKyBvZiB0aGUgZmlsZSBmb3VuZCk7IDxjb2RlPm92ZXJ3cml0ZTwvY29kZT4gb3ZlcndyaXRlIHRoZSBmaWxlCisgd2l0aCB0aGUgbmV3IGZpbGUKKyBEZWZhdWx0IGZvciB6aXAgdGFza3MgaXMgPGNvZGU+a2VlcDwvY29kZT4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJlbmNvZGluZyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0VuY29kaW5nIHRvIHVzZSBmb3IgZmlsZW5hbWVzLCBkZWZhdWx0cyB0byB0aGUgcGxhdGZvcm0ncworIGRlZmF1bHQgZW5jb2RpbmcuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIEVuY29kaW5nIHRvIHVzZSBmb3IgZmlsZW5hbWVzLCBkZWZhdWx0cyB0byB0aGUgcGxhdGZvcm0ncworIGRlZmF1bHQgZW5jb2RpbmcuCisKKyA8cD5Gb3IgYSBsaXN0IG9mIHBvc3NpYmxlIHZhbHVlcyBzZWUgPGEKKyBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL2pkay8xLjIvZG9jcy9ndWlkZS9pbnRlcm5hdC9lbmNvZGluZy5kb2MuaHRtbCI+aHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9qZGsvMS4yL2RvY3MvZ3VpZGUvaW50ZXJuYXQvZW5jb2RpbmcuZG9jLmh0bWw8L2E+LjwvcD4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmaWxlc29ubHkiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgdHJ1ZSwgZW11bGF0ZSBTdW4ncyBqYXIgdXRpbGl0eSBieSBub3QgYWRkaW5nIHBhcmVudCBkaXJlY3RvcmllczsKKyBvcHRpb25hbCwgZGVmYXVsdHMgdG8gZmFsc2UuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIElmIHRydWUsIGVtdWxhdGUgU3VuJ3MgamFyIHV0aWxpdHkgYnkgbm90IGFkZGluZyBwYXJlbnQgZGlyZWN0b3JpZXM7Cisgb3B0aW9uYWwsIGRlZmF1bHRzIHRvIGZhbHNlLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImluZGV4IiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NldCB3aGV0aGVyIG9yIG5vdCB0byBjcmVhdGUgYW4gaW5kZXggbGlzdCBmb3IgY2xhc3Nlcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHdoZXRoZXIgb3Igbm90IHRvIGNyZWF0ZSBhbiBpbmRleCBsaXN0IGZvciBjbGFzc2VzLgorIFRoaXMgbWF5IHNwZWVkIHVwIGNsYXNzbG9hZGluZyBpbiBzb21lIGNhc2VzLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9Im1hbmlmZXN0IiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIG1hbmlmZXN0IGZpbGUgdG8gdXNlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBUaGUgbWFuaWZlc3QgZmlsZSB0byB1c2UuIFRoaXMgY2FuIGJlIGVpdGhlciB0aGUgbG9jYXRpb24gb2YgYSBtYW5pZmVzdCwKKyBvciB0aGUgbmFtZSBvZiBhIGphciBhZGRlZCB0aHJvdWdoIGEgZmlsZXNldC4gSWYgaXRzIHRoZSBuYW1lIG9mIGFuIGFkZGVkCisgamFyLCB0aGUgdGFzayBleHBlY3RzIHRoZSBtYW5pZmVzdCB0byBiZSBpbiB0aGUgamFyIGF0IE1FVEEtSU5GL01BTklGRVNULk1GLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InVwZGF0ZSIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlLCB1cGRhdGVzIGFuIGV4aXN0aW5nIGZpbGUsIG90aGVyd2lzZSBvdmVyd3JpdGUKKyBhbnkgZXhpc3Rpbmcgb25lOyBvcHRpb25hbCBkZWZhdWx0cyB0byBmYWxzZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgSWYgdHJ1ZSwgdXBkYXRlcyBhbiBleGlzdGluZyBmaWxlLCBvdGhlcndpc2Ugb3ZlcndyaXRlCisgYW55IGV4aXN0aW5nIG9uZTsgb3B0aW9uYWwgZGVmYXVsdHMgdG8gZmFsc2UuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0id2hlbmVtcHR5IiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5aaXAuV2hlbkVtcHR5IgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IiZxdW90O2ZhaWwmcXVvdDssICZxdW90O3NraXAmcXVvdDssICZxdW90O2NyZWF0ZSZxdW90OyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2V0cyBiZWhhdmlvciBvZiB0aGUgdGFzayB3aGVuIG5vIGZpbGVzIG1hdGNoLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXRzIGJlaGF2aW9yIG9mIHRoZSB0YXNrIHdoZW4gbm8gZmlsZXMgbWF0Y2guCisgUG9zc2libGUgdmFsdWVzIGFyZTogPGNvZGU+ZmFpbDwvY29kZT4gKHRocm93IGFuIGV4Y2VwdGlvbgorIGFuZCBoYWx0IHRoZSBidWlsZCk7IDxjb2RlPnNraXA8L2NvZGU+IChkbyBub3QgY3JlYXRlCisgYW55IGFyY2hpdmUsIGJ1dCBpc3N1ZSBhIHdhcm5pbmcpOyA8Y29kZT5jcmVhdGU8L2NvZGU+CisgKG1ha2UgYW4gYXJjaGl2ZSB3aXRoIG5vIGVudHJpZXMpLgorIERlZmF1bHQgZm9yIHppcCB0YXNrcyBpcyA8Y29kZT5za2lwPC9jb2RlPjsKKyBmb3IgamFyIHRhc2tzLCA8Y29kZT5jcmVhdGU8L2NvZGU+LgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgPC9hdHRyaWJ1dGVzPgorCisgICAgPGVsZW1lbnRzPgorICAgICAgPGVsZW1lbnQgbmFtZT0ibWFuaWZlc3QiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLk1hbmlmZXN0IgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBbGxvd3MgdGhlIG1hbmlmZXN0IGZvciB0aGUgYXJjaGl2ZSBmaWxlIHRvIGJlIHByb3ZpZGVkIGlubGluZQorIGluIHRoZSBidWlsZGZpbGUgcmF0aGVyIHRoYW4gaW4gYW4gZXh0ZXJuYWwgZmlsZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbQWxsb3dzIHRoZSBtYW5pZmVzdCBmb3IgdGhlIGFyY2hpdmUgZmlsZSB0byBiZSBwcm92aWRlZCBpbmxpbmUKKyBpbiB0aGUgYnVpbGRmaWxlIHJhdGhlciB0aGFuIGluIGFuIGV4dGVybmFsIGZpbGUuXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICAgIDxlbGVtZW50IG5hbWU9ImZpbGVzZXQiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVTZXQiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGVzZXQiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIGEgc2V0IG9mIGZpbGVzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtBZGRzIGEgc2V0IG9mIGZpbGVzLl1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgICA8ZWxlbWVudCBuYW1lPSJtZXRhaW5mIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5aaXBGaWxlU2V0IgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJaaXBGaWxlc2V0IgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBhIHppcGZpbGVzZXQgdG8gaW5jbHVkZSBpbiB0aGUgTUVUQS1JTkYgZGlyZWN0b3J5Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtBZGRzIGEgemlwZmlsZXNldCB0byBpbmNsdWRlIGluIHRoZSBNRVRBLUlORiBkaXJlY3RvcnkuXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICAgIDxlbGVtZW50IG5hbWU9InppcGdyb3VwZmlsZXNldCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldCIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZXNldCIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgYSBncm91cCBvZiB6aXAgZmlsZXMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0FkZHMgYSBncm91cCBvZiB6aXAgZmlsZXMuXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICAgIDxlbGVtZW50IG5hbWU9InppcGZpbGVzZXQiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlppcEZpbGVTZXQiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IlppcEZpbGVzZXQiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIGEgc2V0IG9mIGZpbGVzIHRoYXQgY2FuIGJlCisgcmVhZCBmcm9tIGFuIGFyY2hpdmUgYW5kIGJlIGdpdmVuIGEgcHJlZml4L2Z1bGxwYXRoLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtBZGRzIGEgc2V0IG9mIGZpbGVzIHRoYXQgY2FuIGJlCisgcmVhZCBmcm9tIGFuIGFyY2hpdmUgYW5kIGJlIGdpdmVuIGEgcHJlZml4L2Z1bGxwYXRoLl1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgPC9lbGVtZW50cz4KKworICA8L3N0cnVjdHVyZT4KKworPC90YXNrPgorCisKKzx0YXNrIG5hbWU9ImphcmxpYi1hdmFpbGFibGUiIGNhdGVnb3J5PSJvdGhlciIKKyAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZXh0ZW5zaW9uLkphckxpYkF2YWlsYWJsZVRhc2siCisgICAgICA+CisKKyAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NoZWNrcyB3aGV0aGVyIGFuIGV4dGVuc2lvbiBpcyBwcmVzZW50IGluIGEgZmlsZXNldCBvciBhbiBleHRlbnNpb25TZXQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgPGRlc2NyaXB0aW9uPgorICAgIDwhW0NEQVRBW0NoZWNrcyB3aGV0aGVyIGFuIGV4dGVuc2lvbiBpcyBwcmVzZW50IGluIGEgZmlsZXNldCBvciBhbiBleHRlbnNpb25TZXQuXV0+CisgIDwvZGVzY3JpcHRpb24+CisKKyAgPHN0cnVjdHVyZT4KKworICAgIDxhdHRyaWJ1dGVzPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmaWxlIiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIEpBUiBsaWJyYXJ5IHRvIGNoZWNrLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBUaGUgSkFSIGxpYnJhcnkgdG8gY2hlY2suCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icHJvcGVydHkiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgbmFtZSBvZiBwcm9wZXJ0eSB0byBzZXQgaWYgZXh0ZW5zaW9ucyBhcmUgYXZhaWxhYmxlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBUaGUgbmFtZSBvZiBwcm9wZXJ0eSB0byBzZXQgaWYgZXh0ZW5zaW9ucyBhcmUgYXZhaWxhYmxlLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgPC9hdHRyaWJ1dGVzPgorCisgICAgPGVsZW1lbnRzPgorICAgICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5leHRlbnNpb24uRXh0ZW5zaW9uQWRhcHRlciIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRXh0ZW5zaW9uIGxvb2tpbmcgZm9yLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtTZXQgdGhlIEV4dGVuc2lvbiBsb29raW5nIGZvci5dXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uc2V0IiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5leHRlbnNpb24uRXh0ZW5zaW9uU2V0IgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIGEgc2V0IG9mIGV4dGVuc2lvbnMgdG8gc2VhcmNoIGluLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtBZGRzIGEgc2V0IG9mIGV4dGVuc2lvbnMgdG8gc2VhcmNoIGluLl1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgPC9lbGVtZW50cz4KKworICA8L3N0cnVjdHVyZT4KKworPC90YXNrPgorCisKKzx0YXNrIG5hbWU9ImphcmxpYi1kaXNwbGF5IiBjYXRlZ29yeT0ib3RoZXIiCisgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmV4dGVuc2lvbi5KYXJMaWJEaXNwbGF5VGFzayIKKyAgICAgID4KKworICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRGlzcGxheXMgdGhlICJPcHRpb25hbCBQYWNrYWdlIiBhbmQgIlBhY2thZ2UgU3BlY2lmaWNhdGlvbiIgaW5mb3JtYXRpb24gY29udGFpbmVkIHdpdGhpbiB0aGUgc3BlY2lmaWVkIEpBUnMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgPGRlc2NyaXB0aW9uPgorICAgIDwhW0NEQVRBW0Rpc3BsYXlzIHRoZSAiT3B0aW9uYWwgUGFja2FnZSIgYW5kICJQYWNrYWdlIFNwZWNpZmljYXRpb24iIGluZm9ybWF0aW9uCisgY29udGFpbmVkIHdpdGhpbiB0aGUgc3BlY2lmaWVkIEpBUnMuCisKKyA8cD5QcmlvciB0byBKREsxLjMsIGFuICJPcHRpb25hbCBQYWNrYWdlIiB3YXMga25vd24gYXMgYW4gRXh0ZW5zaW9uLgorIFRoZSBzcGVjaWZpY2F0aW9uIGZvciB0aGlzIG1lY2hhbmlzbSBpcyBhdmFpbGFibGUgaW4gdGhlIEpESzEuMworIGRvY3VtZW50YXRpb24gaW4gdGhlIGRpcmVjdG9yeQorICRKREtfSE9NRS9kb2NzL2d1aWRlL2V4dGVuc2lvbnMvdmVyc2lvbmluZy5odG1sLiBBbHRlcm5hdGl2ZWx5IGl0IGlzCisgYXZhaWxhYmxlIG9ubGluZSBhdCA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS4zL2RvY3MvZ3VpZGUvZXh0ZW5zaW9ucy92ZXJzaW9uaW5nLmh0bWwiPgorIGh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjMvZG9jcy9ndWlkZS9leHRlbnNpb25zL3ZlcnNpb25pbmcuaHRtbDwvYT4uPC9wPl1dPgorICA8L2Rlc2NyaXB0aW9uPgorCisgIDxzdHJ1Y3R1cmU+CisKKyAgICA8YXR0cmlidXRlcz4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmlsZSIgdHlwZT0iamF2YS5pby5GaWxlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBKQVIgbGlicmFyeSB0byBkaXNwbGF5IGluZm9ybWF0aW9uIGZvci5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgVGhlIEpBUiBsaWJyYXJ5IHRvIGRpc3BsYXkgaW5mb3JtYXRpb24gZm9yLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgPC9hdHRyaWJ1dGVzPgorCisgICAgPGVsZW1lbnRzPgorICAgICAgPGVsZW1lbnQgbmFtZT0iZmlsZXNldCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldCIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZXNldCIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgYSBzZXQgb2YgZmlsZXMgYWJvdXQgd2hpY2ggbGlicmFyeSBkYXRhIHdpbGwgYmUgZGlzcGxheWVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtBZGRzIGEgc2V0IG9mIGZpbGVzIGFib3V0IHdoaWNoIGxpYnJhcnkgZGF0YSB3aWxsIGJlIGRpc3BsYXllZC5dXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgIDwvZWxlbWVudHM+CisKKyAgPC9zdHJ1Y3R1cmU+CisKKzwvdGFzaz4KKworCis8dGFzayBuYW1lPSJqYXJsaWItbWFuaWZlc3QiIGNhdGVnb3J5PSJvdGhlciIKKyAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZXh0ZW5zaW9uLkphckxpYk1hbmlmZXN0VGFzayIKKyAgICAgID4KKworICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbR2VuZXJhdGVzIGEgbWFuaWZlc3QgdGhhdCBkZWNsYXJlcyBhbGwgdGhlIGRlcGVuZGVuY2llcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICA8ZGVzY3JpcHRpb24+CisgICAgPCFbQ0RBVEFbR2VuZXJhdGVzIGEgbWFuaWZlc3QgdGhhdCBkZWNsYXJlcyBhbGwgdGhlIGRlcGVuZGVuY2llcy4KKyBUaGUgZGVwZW5kZW5jaWVzIGFyZSBkZXRlcm1pbmVkIGJ5IGxvb2tpbmcgaW4gdGhlCisgc3BlY2lmaWVkIHBhdGggYW5kIHNlYXJjaGluZyBmb3IgRXh0ZW5zaW9uIC8gIk9wdGlvbmFsIFBhY2thZ2UiCisgc3BlY2lmaWNhdGlvbnMgaW4gdGhlIG1hbmlmZXN0cyBvZiB0aGUgamFycy4KKworIDxwPlByaW9yIHRvIEpESzEuMywgYW4gIk9wdGlvbmFsIFBhY2thZ2UiIHdhcyBrbm93biBhcyBhbiBFeHRlbnNpb24uCisgVGhlIHNwZWNpZmljYXRpb24gZm9yIHRoaXMgbWVjaGFuaXNtIGlzIGF2YWlsYWJsZSBpbiB0aGUgSkRLMS4zCisgZG9jdW1lbnRhdGlvbiBpbiB0aGUgZGlyZWN0b3J5CisgJEpES19IT01FL2RvY3MvZ3VpZGUvZXh0ZW5zaW9ucy92ZXJzaW9uaW5nLmh0bWwuIEFsdGVybmF0aXZlbHkgaXQgaXMKKyBhdmFpbGFibGUgb25saW5lIGF0IDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjMvZG9jcy9ndWlkZS9leHRlbnNpb25zL3ZlcnNpb25pbmcuaHRtbCI+CisgaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuMy9kb2NzL2d1aWRlL2V4dGVuc2lvbnMvdmVyc2lvbmluZy5odG1sPC9hPi48L3A+XV0+CisgIDwvZGVzY3JpcHRpb24+CisKKyAgPHN0cnVjdHVyZT4KKworICAgIDxhdHRyaWJ1dGVzPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXN0ZmlsZSIgdHlwZT0iamF2YS5pby5GaWxlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBsb2NhdGlvbiB3aGVyZSBnZW5lcmF0ZWQgbWFuaWZlc3QgaXMgcGxhY2VkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBUaGUgbG9jYXRpb24gd2hlcmUgZ2VuZXJhdGVkIG1hbmlmZXN0IGlzIHBsYWNlZC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgIDwvYXR0cmlidXRlcz4KKworICAgIDxlbGVtZW50cz4KKyAgICAgIDxlbGVtZW50IG5hbWU9ImF0dHJpYnV0ZSIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZXh0ZW5zaW9uLkV4dHJhQXR0cmlidXRlIgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIGFuIGF0dHJpYnV0ZSB0aGF0IGlzIHRvIGJlIHB1dCBpbiBtYWluIHNlY3Rpb24gb2YgbWFuaWZlc3QuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0FkZHMgYW4gYXR0cmlidXRlIHRoYXQgaXMgdG8gYmUgcHV0IGluIG1haW4gc2VjdGlvbiBvZiBtYW5pZmVzdC5dXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgICAgPGVsZW1lbnQgbmFtZT0iZGVwZW5kcyIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZXh0ZW5zaW9uLkV4dGVuc2lvblNldCIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBhIHNldCBvZiBleHRlbnNpb25zIHRoYXQgdGhpcyBsaWJyYXJ5IHJlcXVpcmVzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtBZGRzIGEgc2V0IG9mIGV4dGVuc2lvbnMgdGhhdCB0aGlzIGxpYnJhcnkgcmVxdWlyZXMuXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZXh0ZW5zaW9uLkV4dGVuc2lvbkFkYXB0ZXIiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IiIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgYW4gZXh0ZW5zaW9uIHRoYXQgdGhpcyBsaWJyYXJ5IGltcGxlbWVudHMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0FkZHMgYW4gZXh0ZW5zaW9uIHRoYXQgdGhpcyBsaWJyYXJ5IGltcGxlbWVudHMuXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICAgIDxlbGVtZW50IG5hbWU9Im9wdGlvbnMiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmV4dGVuc2lvbi5FeHRlbnNpb25TZXQiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IiIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgYSBzZXQgb2YgZXh0ZW5zaW9ucyB0aGF0IHRoaXMgbGlicmFyeSBvcHRpb25hbGx5IHJlcXVpcmVzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtBZGRzIGEgc2V0IG9mIGV4dGVuc2lvbnMgdGhhdCB0aGlzIGxpYnJhcnkgb3B0aW9uYWxseSByZXF1aXJlcy5dXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgIDwvZWxlbWVudHM+CisKKyAgPC9zdHJ1Y3R1cmU+CisKKzwvdGFzaz4KKworCis8dGFzayBuYW1lPSJqYXJsaWItcmVzb2x2ZSIgY2F0ZWdvcnk9Im90aGVyIgorICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5leHRlbnNpb24uSmFyTGliUmVzb2x2ZVRhc2siCisgICAgICA+CisKKyAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RyaWVzIHRvIGxvY2F0ZSBhIEpBUiB0byBzYXRpc2Z5IGFuIGV4dGVuc2lvbiBhbmQgcGxhY2UgbG9jYXRpb24gb2YgSkFSIGludG8gcHJvcGVydHkuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgPGRlc2NyaXB0aW9uPgorICAgIDwhW0NEQVRBW1RyaWVzIHRvIGxvY2F0ZSBhIEpBUiB0byBzYXRpc2Z5IGFuIGV4dGVuc2lvbiBhbmQgcGxhY2UKKyBsb2NhdGlvbiBvZiBKQVIgaW50byBwcm9wZXJ0eS5dXT4KKyAgPC9kZXNjcmlwdGlvbj4KKworICA8c3RydWN0dXJlPgorCisgICAgPGF0dHJpYnV0ZXM+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNoZWNrZXh0ZW5zaW9uIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIGxpYnJhcmllcyByZXR1cm5lZCBieSBuZXN0ZWQgcmVzb2x2ZXJzIHNob3VsZCBiZQorIGNoZWNrZWQgdG8gc2VlIGlmIHRoZXkgc3VwcGx5IGV4dGVuc2lvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgSWYgdHJ1ZSwgbGlicmFyaWVzIHJldHVybmVkIGJ5IG5lc3RlZCByZXNvbHZlcnMgc2hvdWxkIGJlCisgY2hlY2tlZCB0byBzZWUgaWYgdGhleSBzdXBwbHkgZXh0ZW5zaW9uLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImZhaWxvbmVycm9yIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIGZhaWx1cmUgdG8gbG9jYXRlIGxpYnJhcnkgc2hvdWxkIGZhaWwgYnVpbGQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIElmIHRydWUsIGZhaWx1cmUgdG8gbG9jYXRlIGxpYnJhcnkgc2hvdWxkIGZhaWwgYnVpbGQuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icHJvcGVydHkiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgaW4gd2hpY2ggdGhlIGxvY2F0aW9uIG9mCisgbGlicmFyeSBpcyBzdG9yZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBpbiB3aGljaCB0aGUgbG9jYXRpb24gb2YKKyBsaWJyYXJ5IGlzIHN0b3JlZC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgIDwvYXR0cmlidXRlcz4KKworICAgIDxlbGVtZW50cz4KKyAgICAgIDxlbGVtZW50IG5hbWU9ImFudCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZXh0ZW5zaW9uLnJlc29sdmVycy5BbnRSZXNvbHZlciIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBBbnQgcmVzb2x2ZXIgdG8gcnVuIGFuIEFudCBidWlsZGZpbGUgdG8gZ2VuZXJhdGUgYSBsaWJyYXJ5Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtBZGRzIEFudCByZXNvbHZlciB0byBydW4gYW4gQW50IGJ1aWxkZmlsZSB0byBnZW5lcmF0ZSBhIGxpYnJhcnkuXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZXh0ZW5zaW9uLkV4dGVuc2lvbkFkYXB0ZXIiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IiIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0V4dGVuc2lvbiBsb29raW5nIGZvci5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbU2V0IHRoZSBFeHRlbnNpb24gbG9va2luZyBmb3IuXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICAgIDxlbGVtZW50IG5hbWU9ImxvY2F0aW9uIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5leHRlbnNpb24ucmVzb2x2ZXJzLkxvY2F0aW9uUmVzb2x2ZXIiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IiIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgbG9jYXRpb24gcmVzb2x2ZXIgdG8gbG9vayBmb3IgYSBsaWJyYXJ5IGluIGEgbG9jYXRpb24KKyByZWxhdGl2ZSB0byBwcm9qZWN0IGRpcmVjdG9yeS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbQWRkcyBsb2NhdGlvbiByZXNvbHZlciB0byBsb29rIGZvciBhIGxpYnJhcnkgaW4gYSBsb2NhdGlvbgorIHJlbGF0aXZlIHRvIHByb2plY3QgZGlyZWN0b3J5Ll1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgICA8ZWxlbWVudCBuYW1lPSJ1cmwiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmV4dGVuc2lvbi5yZXNvbHZlcnMuVVJMUmVzb2x2ZXIiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IiIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgYSBVUkwgcmVzb2x2ZXIgdG8gZG93bmxvYWQgYSBsaWJyYXJ5IGZyb20gYSBVUkwKKyB0byBhIGxvY2FsIGZpbGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0FkZHMgYSBVUkwgcmVzb2x2ZXIgdG8gZG93bmxvYWQgYSBsaWJyYXJ5IGZyb20gYSBVUkwKKyB0byBhIGxvY2FsIGZpbGUuXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICA8L2VsZW1lbnRzPgorCisgIDwvc3RydWN0dXJlPgorCis8L3Rhc2s+CisKKworPHRhc2sgbmFtZT0iamF2YSIgY2F0ZWdvcnk9ImphdmEiCisgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkphdmEiCisgICAgICA+CisKKyAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0xhdW5jaGVyIGZvciBKYXZhIGFwcGxpY2F0aW9ucy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICA8ZGVzY3JpcHRpb24+CisgICAgPCFbQ0RBVEFbTGF1bmNoZXIgZm9yIEphdmEgYXBwbGljYXRpb25zLiBBbGxvd3MgdXNlIG9mCisgdGhlIHNhbWUgSlZNIGZvciB0aGUgY2FsbGVkIGFwcGxpY2F0aW9uIHRodXMgcmVzdWx0aW5nIGluIG11Y2gKKyBmYXN0ZXIgb3BlcmF0aW9uLl1dPgorICA8L2Rlc2NyaXB0aW9uPgorCisgIDxzdHJ1Y3R1cmU+CisKKyAgICA8YXR0cmlidXRlcz4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYXBwZW5kIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIGFwcGVuZCBvdXRwdXQgdG8gZXhpc3RpbmcgZmlsZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgSWYgdHJ1ZSwgYXBwZW5kIG91dHB1dCB0byBleGlzdGluZyBmaWxlLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzbmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0phdmEgY2xhc3MgdG8gZXhlY3V0ZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0cyB0aGUgSmF2YSBjbGFzcyB0byBleGVjdXRlLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzcGF0aCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aCIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJQYXRoIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDbGFzc3BhdGggdG8gYmUgdXNlZCB3aGVuIHJ1bm5pbmcgdGhlIEphdmEgY2xhc3MuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCB0aGUgY2xhc3NwYXRoIHRvIGJlIHVzZWQgd2hlbiBydW5uaW5nIHRoZSBKYXZhIGNsYXNzCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NwYXRocmVmIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZWZlcmVuY2UiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUmVmZXJlbmNlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDbGFzc3BhdGggdG8gdXNlLCBieSByZWZlcmVuY2UuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIENsYXNzcGF0aCB0byB1c2UsIGJ5IHJlZmVyZW5jZS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkaXIiIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgd29ya2luZyBkaXJlY3Rvcnkgb2YgdGhlIHByb2Nlc3MuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRoZSB3b3JraW5nIGRpcmVjdG9yeSBvZiB0aGUgcHJvY2VzcworICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImZhaWxvbmVycm9yIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIHRoZW4gZmFpbCBpZiB0aGUgY29tbWFuZCBleGl0cyB3aXRoIGEKKyByZXR1cm5jb2RlIG90aGVyIHRoYW4gMC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgSWYgdHJ1ZSwgdGhlbiBmYWlsIGlmIHRoZSBjb21tYW5kIGV4aXRzIHdpdGggYQorIHJldHVybmNvZGUgb3RoZXIgdGhhbiAwCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZm9yayIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlLCBleGVjdXRlIGluIGEgbmV3IFZNLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBJZiB0cnVlLCBleGVjdXRlIGluIGEgbmV3IFZNLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9Imp2bXZlcnNpb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtKVk0gdmVyc2lvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0cyB0aGUgSlZNIHZlcnNpb24uCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iamFyIiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGxvY2F0aW9uIG9mIHRoZSBKQVIgZmlsZSB0byBleGVjdXRlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBUaGUgbG9jYXRpb24gb2YgdGhlIEpBUiBmaWxlIHRvIGV4ZWN1dGUuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ianZtIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ29tbWFuZCB1c2VkIHRvIHN0YXJ0IHRoZSBWTSAob25seSBpZiBub3QgZm9ya2luZykuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCB0aGUgY29tbWFuZCB1c2VkIHRvIHN0YXJ0IHRoZSBWTSAob25seSBpZiBub3QgZm9ya2luZykuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ianZtYXJncyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NvbW1hbmQgbGluZSBhcmd1bWVudHMgZm9yIHRoZSBKVk0uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBmb3IgdGhlIEpWTS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJtYXhtZW1vcnkiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDb3JyZXNwb25kcyB0byAtbXggb3IgLVhteCBkZXBlbmRpbmcgb24gVk0gdmVyc2lvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgQ29ycmVzcG9uZHMgdG8gLW14IG9yIC1YbXggZGVwZW5kaW5nIG9uIFZNIHZlcnNpb24uCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmV3ZW52aXJvbm1lbnQiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgdHJ1ZSwgdXNlIGEgY29tcGxldGVseSBuZXcgZW52aXJvbm1lbnQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIElmIHRydWUsIHVzZSBhIGNvbXBsZXRlbHkgbmV3IGVudmlyb25tZW50LgorCisgPHA+V2lsbCBiZSBpZ25vcmVkIGlmIHdlIGFyZSBub3QgZm9ya2luZyBhIG5ldyBWTS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJvdXRwdXQiIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtGaWxlIHRoZSBvdXRwdXQgb2YgdGhlIHByb2Nlc3MgaXMgcmVkaXJlY3RlZCB0by5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgRmlsZSB0aGUgb3V0cHV0IG9mIHRoZSBwcm9jZXNzIGlzIHJlZGlyZWN0ZWQgdG8uCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idGltZW91dCIgdHlwZT0iamF2YS5sYW5nLkxvbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0ibG9uZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGltZW91dCBpbiBtaWxsaXNlY29uZHMgYWZ0ZXIgd2hpY2ggdGhlIHByb2Nlc3Mgd2lsbCBiZSBraWxsZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGFmdGVyIHdoaWNoIHRoZSBwcm9jZXNzIHdpbGwgYmUga2lsbGVkLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgPC9hdHRyaWJ1dGVzPgorCisgICAgPGVsZW1lbnRzPgorICAgICAgPGVsZW1lbnQgbmFtZT0iZW52IiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5FbnZpcm9ubWVudC5WYXJpYWJsZSIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbQWRkcyBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKworIDxwPldpbGwgYmUgaWdub3JlZCBpZiB3ZSBhcmUgbm90IGZvcmtpbmcgYSBuZXcgVk0uXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICAgIDxlbGVtZW50IG5hbWU9InN5c3Byb3BlcnR5IiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5FbnZpcm9ubWVudC5WYXJpYWJsZSIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBhIHN5c3RlbSBwcm9wZXJ0eS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbQWRkcyBhIHN5c3RlbSBwcm9wZXJ0eS5dXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgICAgPGVsZW1lbnQgbmFtZT0iYXJnIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Db21tYW5kbGluZS5Bcmd1bWVudCIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBhIGNvbW1hbmQtbGluZSBhcmd1bWVudC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbQWRkcyBhIGNvbW1hbmQtbGluZSBhcmd1bWVudC5dXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgICAgPGVsZW1lbnQgbmFtZT0iY2xhc3NwYXRoIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoIgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJQYXRoIgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBhIHBhdGggdG8gdGhlIGNsYXNzcGF0aC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbQWRkcyBhIHBhdGggdG8gdGhlIGNsYXNzcGF0aC5dXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgICAgPGVsZW1lbnQgbmFtZT0ianZtYXJnIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Db21tYW5kbGluZS5Bcmd1bWVudCIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBhIEpWTSBhcmd1bWVudC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbQWRkcyBhIEpWTSBhcmd1bWVudC5dXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgIDwvZWxlbWVudHM+CisKKyAgPC9zdHJ1Y3R1cmU+CisKKzwvdGFzaz4KKworCis8dGFzayBuYW1lPSJqYXZhYyIgY2F0ZWdvcnk9ImphdmEiCisgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkphdmFjIgorICAgICAgbWF0Y2hpbmdUYXNrPSJ0cnVlIj4KKworICA8IS0tIGphdmFjIHRhc2sgLS0+Cis8ZXh0ZXJuYWw+Cis8ZGVzY3JpcHRpb24+CisKKzxwPkNvbXBpbGVzIGEgSmF2YSBzb3VyY2UgdHJlZS48L3A+CisKKzxwPlRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSB3aWxsIGJlIHJlY3Vyc2l2ZWx5IHNjYW5uZWQgZm9yIEphdmEKK3NvdXJjZSBmaWxlcyB0byBjb21waWxlLiBPbmx5IEphdmEgZmlsZXMgdGhhdCBoYXZlIG5vIGNvcnJlc3BvbmRpbmcgY2xhc3MgZmlsZQorb3Igd2hlcmUgdGhlIGNsYXNzIGZpbGUgaXMgb2xkZXIgdGhhbiB0aGUgamF2YSBmaWxlIHdpbGwgYmUgY29tcGlsZWQuPC9wPgorCis8cD5Ob3RlOiBBbnQgdXNlcyBvbmx5IHRoZSBuYW1lcyBvZiB0aGUgc291cmNlIGFuZCBjbGFzcyBmaWxlcyB0byBmaW5kCit0aGUgY2xhc3NlcyB0aGF0IG5lZWQgYSByZWJ1aWxkLiBJdCB3aWxsIG5vdCBzY2FuIHRoZSBzb3VyY2UgYW5kIHRoZXJlZm9yCit3aWxsIGhhdmUgbm8ga25vd2xlZGdlIGFib3V0IG5lc3RlZCBjbGFzc2VzLCBjbGFzc2VzIHRoYXQgYXJlIG5hbWVkIGRpZmZlcmVudAorZnJvbSB0aGUgc291cmNlIGZpbGUgYW5kIHNvIG9uLjwvcD4KKworPHA+VGhlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgb2YgdGhlIHNvdXJjZSB0cmVlIHNob3VsZCBmb2xsb3cgdGhlIHBhY2thZ2UKK2hpZXJhcmNoeS48L3A+CisKKzxwPkl0IGlzIHBvc3NpYmxlIHRvIHJlZmluZSB0aGUgc2V0IG9mIGZpbGVzIHRoYXQgYXJlIGJlaW5nIGNvbXBpbGVkL2NvcGllZC4KK1RoaXMgY2FuIGJlIGRvbmUgd2l0aCB0aGUgPGk+aW5jbHVkZXM8L2k+LCA8aT5pbmNsdWRlc2ZpbGU8L2k+LCA8aT5leGNsdWRlczwvaT4sIDxpPmV4Y2x1ZGVzZmlsZTwvaT4gYW5kIDxpPmRlZmF1bHRleGNsdWRlczwvaT4KK2F0dHJpYnV0ZXMuIFdpdGggdGhlIDxpPmluY2x1ZGVzPC9pPiBvciA8aT5pbmNsdWRlc2ZpbGU8L2k+IGF0dHJpYnV0ZSB5b3Ugc3BlY2lmeSB0aGUgZmlsZXMgeW91IHdhbnQgdG8KK2hhdmUgaW5jbHVkZWQgYnkgdXNpbmcgcGF0dGVybnMuIFRoZSA8aT5leGNsdWRlPC9pPiBvciA8aT5leGNsdWRlc2ZpbGU8L2k+IGF0dHJpYnV0ZSBpcyB1c2VkIHRvIHNwZWNpZnkKK3RoZSBmaWxlcyB5b3Ugd2FudCB0byBoYXZlIGV4Y2x1ZGVkLiBUaGlzIGlzIGFsc28gZG9uZSB3aXRoIHBhdHRlcm5zLiBBbmQKK2ZpbmFsbHkgd2l0aCB0aGUgPGk+ZGVmYXVsdGV4Y2x1ZGVzPC9pPiBhdHRyaWJ1dGUsIHlvdSBjYW4gc3BlY2lmeSB3aGV0aGVyIHlvdQord2FudCB0byB1c2UgZGVmYXVsdCBleGNsdXNpb25zIG9yIG5vdC4gU2VlIHRoZSBzZWN0aW9uIG9uIDxhCitocmVmPSIuLi9kaXJ0YXNrcy5odG1sI2RpcmVjdG9yeWJhc2VkdGFza3MiPmRpcmVjdG9yeSBiYXNlZCB0YXNrczwvYT4sIG9uIGhvdyB0aGUKK2luY2x1c2lvbi9leGNsdXNpb24gb2YgZmlsZXMgd29ya3MsIGFuZCBob3cgdG8gd3JpdGUgcGF0dGVybnMuPC9wPgorCis8cD5JdCBpcyBwb3NzaWJsZSB0byB1c2UgZGlmZmVyZW50IGNvbXBpbGVycy4gVGhpcyBjYW4gYmUgc2VsZWN0ZWQgd2l0aCB0aGUKKyZxdW90O2J1aWxkLmNvbXBpbGVyJnF1b3Q7IHByb3BlcnR5IG9yIHRoZSBjb21waWxlciBhdHRyaWJ1dGUuIEhlcmUgYXJlIHRoZSBjaG9pY2VzOi08L3A+Cis8dWw+CisgIDxsaT5jbGFzc2ljICh0aGUgc3RhbmRhcmQgY29tcGlsZXIgb2YgSkRLIDEuMS8xLjIpIC0gamF2YWMxLjEgYW5kCisgICAgIGphdmFjMS4yIGNhbiBiZSB1c2VkIGFzIGFsaWFzZXM8L2xpPgorICA8bGk+bW9kZXJuICh0aGUgc3RhbmRhcmQgY29tcGlsZXIgb2YgSkRLIDEuMy8xLjQpIC0gamF2YWMxLjMgYW5kCisgICAgIGphdmFjMS40IGNhbiBiZSB1c2VkIGFzIGFsaWFzZXM8L2xpPgorICA8bGk+amlrZXMgKHRoZSA8YQorICAgIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2ppa2VzL3Byb2plY3QiIHRhcmdldD0iX3RvcCI+SmlrZXM8L2E+CisgICAgY29tcGlsZXIpPC9saT4KKyAgPGxpPmp2YyAodGhlIENvbW1hbmQtTGluZSBDb21waWxlciBmcm9tIE1pY3Jvc29mdCdzIFNESyBmb3IgSmF2YSAvCisgICAgVmlzdWFsIEorKykgLSBtaWNyb3NvZnQgY2FuIGJlIHVzZWQgYXMgYW4gYWxpYXM8L2xpPgorICA8bGk+a2pjICh0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5kbXMuYXQva29waS8iIHRhcmdldD0iX3RvcCI+a29waTwvYT4KKyAgICBjb21waWxlcik8L2xpPgorICA8bGk+Z2NqICh0aGUgZ2NqIGNvbXBpbGVyIGZyb20gZ2NjKTwvbGk+CisgIDxsaT5zaiAoU3ltYW50ZWMgamF2YSBjb21waWxlcikgLSBzeW1hbnRlYyBjYW4gYmUgdXNlZCBhcyBhbiBhbGlhczwvbGk+CisgIDxsaT5leHRKYXZhYyAocnVuIGVpdGhlciBtb2Rlcm4gb3IgY2xhc3NpYyBpbiBhIEpWTSBvZiBpdHMgb3duKTwvbGk+Cis8L3VsPgorPHA+Rm9yIEpESyAxLjEvMS4yLCBjbGFzc2ljIGlzIHRoZSBkZWZhdWx0LiBGb3IgSkRLIDEuMy8xLjQsIG1vZGVybiBpcyB0aGUgZGVmYXVsdC4KK0lmIHlvdSB3aXNoIHRvIHVzZSBhIGRpZmZlcmVudCBjb21waWxlciBpbnRlcmZhY2UgdGhhbiB0aG9zZQorc3VwcGxpZWQsIHdyaXRlIGEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBDb21waWxlckFkYXB0ZXIgaW50ZXJmYWNlCisocGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb21waWxlcnMpLiBTdXBwbHkgdGhlIGZ1bGwKK2NsYXNzbmFtZSBpbiB0aGUgJnF1b3Q7YnVpbGQuY29tcGlsZXImcXVvdDsgcHJvcGVydHkuPC9wPgorCis8cD5UaGUgZm9yayBhdHRyaWJ1dGUgb3ZlcnJpZGVzIHRoZSBidWlsZC5jb21waWxlciBzZXR0aW5nIGFuZCBleHBlY3RzCithIEpESzEuMSBvciBoaWdoZXIgdG8gYmUgc2V0IGluIGphdmEuaG9tZS48L3A+CisKKzxwPlRoaXMgdGFzayB3aWxsIGRyb3AgYWxsIGVudHJpZXMgdGhhdCBwb2ludCB0byBub24tZXhpc3RlbnQKK2ZpbGVzL2RpcmVjdG9yaWVzIGZyb20gdGhlIENMQVNTUEFUSCBpdCBwYXNzZXMgdG8gdGhlIGNvbXBpbGVyLjwvcD4KKworPHA+PHN0cm9uZz5XaW5kb3dzIE5vdGU6PC9zdHJvbmc+V2hlbiB0aGUgbW9kZXJuIGNvbXBpbGVyIGlzIHVzZWQKK2luIHVuZm9ya2VkIG1vZGUgb24gV2luZG93cywgaXQgbG9ja3MgdXAgdGhlIGZpbGVzIHByZXNlbnQgaW4gdGhlCitjbGFzc3BhdGggb2YgdGhlICZsdDtqYXZhYyZndDsgdGFzaywgYW5kIGRvZXMgbm90IHJlbGVhc2UgdGhlbS4gIFRoZSBzaWRlCitlZmZlY3Qgb2YgdGhpcyBpcyB0aGF0IHlvdSB3aWxsIG5vdCBiZSBhYmxlIHRvIGRlbGV0ZSBvciBtb3ZlCit0aG9zZSBmaWxlcyBsYXRlciBvbiBpbiB0aGUgYnVpbGQuICBUaGUgd29ya2Fyb3VuZCBpcyB0byBmb3JrIHdoZW4KK2ludm9raW5nIHRoZSBjb21waWxlci48L3A+CisKKzwvZGVzY3JpcHRpb24+CisKKzxzZWN0aW9uIGFuY2hvcj0iZXhhbXBsZXMiIG5hbWU9IkV4YW1wbGVzIj4KKzxwcmU+ICAmbHQ7amF2YWMgc3JjZGlyPSZxdW90OyR7c3JjfSZxdW90OworICAgICAgICAgZGVzdGRpcj0mcXVvdDske2J1aWxkfSZxdW90OworICAgICAgICAgY2xhc3NwYXRoPSZxdW90O3h5ei5qYXImcXVvdDsKKyAgICAgICAgIGRlYnVnPSZxdW90O29uJnF1b3Q7CisgIC8mZ3Q7PC9wcmU+Cis8cD5jb21waWxlcyBhbGwgPGNvZGU+LmphdmE8L2NvZGU+IGZpbGVzIHVuZGVyIHRoZSA8Y29kZT4ke3NyY308L2NvZGU+CitkaXJlY3RvcnksIGFuZCBzdG9yZXMKK3RoZSA8Y29kZT4uY2xhc3M8L2NvZGU+IGZpbGVzIGluIHRoZSA8Y29kZT4ke2J1aWxkfTwvY29kZT4gZGlyZWN0b3J5LgorVGhlIGNsYXNzcGF0aCB1c2VkIGNvbnRhaW5zIDxjb2RlPnh5ei5qYXI8L2NvZGU+LCBhbmQgZGVidWcgaW5mb3JtYXRpb24gaXMgb24uPC9wPgorCis8cHJlPiAgJmx0O2phdmFjIHNyY2Rpcj0mcXVvdDske3NyY30mcXVvdDsKKyAgICAgICAgIGRlc3RkaXI9JnF1b3Q7JHtidWlsZH0mcXVvdDsKKyAgICAgICAgIGZvcms9JnF1b3Q7dHJ1ZSZxdW90OworICAvJmd0OzwvcHJlPgorPHA+Y29tcGlsZXMgYWxsIDxjb2RlPi5qYXZhPC9jb2RlPiBmaWxlcyB1bmRlciB0aGUgPGNvZGU+JHtzcmN9PC9jb2RlPgorZGlyZWN0b3J5LCBhbmQgc3RvcmVzIHRoZSA8Y29kZT4uY2xhc3M8L2NvZGU+IGZpbGVzIGluIHRoZQorPGNvZGU+JHtidWlsZH08L2NvZGU+IGRpcmVjdG9yeS4gIFRoaXMgd2lsbCBmb3JrIG9mZiB0aGUgamF2YWMKK2NvbXBpbGVyIHVzaW5nIHRoZSBkZWZhdWx0IGphdmFjIGV4ZWN1dGFibGUuPC9wPgorCis8cHJlPiAgJmx0O2phdmFjIHNyY2Rpcj0mcXVvdDske3NyY30mcXVvdDsKKyAgICAgICAgIGRlc3RkaXI9JnF1b3Q7JHtidWlsZH0mcXVvdDsKKyAgICAgICAgIGZvcms9JnF1b3Q7amF2YSQkamF2YWMuZXhlJnF1b3Q7CisgIC8mZ3Q7PC9wcmU+Cis8cD5jb21waWxlcyBhbGwgPGNvZGU+LmphdmE8L2NvZGU+IGZpbGVzIHVuZGVyIHRoZSA8Y29kZT4ke3NyY308L2NvZGU+CitkaXJlY3RvcnksIGFuZCBzdG9yZXMgdGhlIDxjb2RlPi5jbGFzczwvY29kZT4gZmlsZXMgaW4gdGhlCis8Y29kZT4ke2J1aWxkfTwvY29kZT4gZGlyZWN0b3J5LiAgVGhpcyB3aWxsIGZvcmsgb2ZmIHRoZSBqYXZhYworY29tcGlsZXIgdXNpbmcgdGhlIGV4ZWN1dGFibGUgbmFtZWQgPGNvZGU+amF2YSRqYXZhYy5leGU8L2NvZGU+LiAgTm90ZQordGhhdCB0aGUgPGNvZGU+JDwvY29kZT4gc2lnbiBuZWVkcyB0byBiZSBlc2NhcGVkIGJ5IGEgc2Vjb25kIG9uZS48L3A+CisKKzxwcmU+ICAmbHQ7amF2YWMgc3JjZGlyPSZxdW90OyR7c3JjfSZxdW90OworICAgICAgICAgZGVzdGRpcj0mcXVvdDske2J1aWxkfSZxdW90OworICAgICAgICAgaW5jbHVkZXM9JnF1b3Q7bXlwYWNrYWdlL3AxLyoqLG15cGFja2FnZS9wMi8qKiZxdW90OworICAgICAgICAgZXhjbHVkZXM9JnF1b3Q7bXlwYWNrYWdlL3AxL3Rlc3RwYWNrYWdlLyoqJnF1b3Q7CisgICAgICAgICBjbGFzc3BhdGg9JnF1b3Q7eHl6LmphciZxdW90OworICAgICAgICAgZGVidWc9JnF1b3Q7b24mcXVvdDsKKyAgLyZndDs8L3ByZT4KKzxwPmNvbXBpbGVzIDxjb2RlPi5qYXZhPC9jb2RlPiBmaWxlcyB1bmRlciB0aGUgPGNvZGU+JHtzcmN9PC9jb2RlPgorZGlyZWN0b3J5LCBhbmQgc3RvcmVzIHRoZQorPGNvZGU+LmNsYXNzPC9jb2RlPiBmaWxlcyBpbiB0aGUgPGNvZGU+JHtidWlsZH08L2NvZGU+IGRpcmVjdG9yeS4KK1RoZSBjbGFzc3BhdGggdXNlZCBjb250YWlucyA8Y29kZT54eXouamFyPC9jb2RlPiwgYW5kIGRlYnVnIGluZm9ybWF0aW9uIGlzIG9uLgorT25seSBmaWxlcyB1bmRlciA8Y29kZT5teXBhY2thZ2UvcDE8L2NvZGU+IGFuZCA8Y29kZT5teXBhY2thZ2UvcDI8L2NvZGU+IGFyZQordXNlZC4gRmlsZXMgaW4gdGhlIDxjb2RlPm15cGFja2FnZS9wMS90ZXN0cGFja2FnZTwvY29kZT4gZGlyZWN0b3J5IGFyZSBleGNsdWRlZAorZnJvbSBjb21waWxhdGlvbi48L3A+CisKKzxwcmU+ICAmbHQ7amF2YWMgc3JjZGlyPSZxdW90OyR7c3JjfToke3NyYzJ9JnF1b3Q7CisgICAgICAgICBkZXN0ZGlyPSZxdW90OyR7YnVpbGR9JnF1b3Q7CisgICAgICAgICBpbmNsdWRlcz0mcXVvdDtteXBhY2thZ2UvcDEvKiosbXlwYWNrYWdlL3AyLyoqJnF1b3Q7CisgICAgICAgICBleGNsdWRlcz0mcXVvdDtteXBhY2thZ2UvcDEvdGVzdHBhY2thZ2UvKiomcXVvdDsKKyAgICAgICAgIGNsYXNzcGF0aD0mcXVvdDt4eXouamFyJnF1b3Q7CisgICAgICAgICBkZWJ1Zz0mcXVvdDtvbiZxdW90OworICAvJmd0OzwvcHJlPgorCis8cD5pcyB0aGUgc2FtZSBhcyB0aGUgcHJldmlvdXMgZXhhbXBsZSwgd2l0aCB0aGUgYWRkaXRpb24gb2YgYSBzZWNvbmQKK3NvdXJjZSBwYXRoLCBkZWZpbmVkIGJ5Cit0aGUgcHJvcGVydHkgPGNvZGU+c3JjMjwvY29kZT4uIFRoaXMgY2FuIGFsc28gYmUgcmVwcmVzZW50ZWQgdXNpbmcgbmVzdGVkCis8Y29kZT4mbHQ7c3JjJmd0OzwvY29kZT4gZWxlbWVudHMgYXMgZm9sbG93czo8L3A+CisKKzxwcmU+ICAmbHQ7amF2YWMgZGVzdGRpcj0mcXVvdDske2J1aWxkfSZxdW90OworICAgICAgICAgY2xhc3NwYXRoPSZxdW90O3h5ei5qYXImcXVvdDsKKyAgICAgICAgIGRlYnVnPSZxdW90O29uJnF1b3Q7Jmd0OworICAgICZsdDtzcmMgcGF0aD0mcXVvdDske3NyY30mcXVvdDsvJmd0OworICAgICZsdDtzcmMgcGF0aD0mcXVvdDske3NyYzJ9JnF1b3Q7LyZndDsKKyAgICAmbHQ7aW5jbHVkZSBuYW1lPSZxdW90O215cGFja2FnZS9wMS8qKiZxdW90Oy8mZ3Q7CisgICAgJmx0O2luY2x1ZGUgbmFtZT0mcXVvdDtteXBhY2thZ2UvcDIvKiomcXVvdDsvJmd0OworICAgICZsdDtleGNsdWRlIG5hbWU9JnF1b3Q7bXlwYWNrYWdlL3AxL3Rlc3RwYWNrYWdlLyoqJnF1b3Q7LyZndDsKKyAgJmx0Oy9qYXZhYyZndDs8L3ByZT4KKworPHA+PGI+Tm90ZTo8L2I+IElmIHlvdSBhcmUgdXNpbmcgQW50IG9uIFdpbmRvd3MgYW5kIGEgbmV3IERPUyB3aW5kb3cgcG9wcyB1cAorZm9yIGV2ZXJ5IHVzZSBvZiBhbiBleHRlcm5hbCBjb21waWxlciwgdGhpcyBtYXkgYmUgYSBwcm9ibGVtIG9mIHRoZSBKREsgeW91IGFyZSB1c2luZy4KK1RoaXMgcHJvYmxlbSBtYXkgb2NjdXIgd2l0aCBhbGwgSkRLcyAmbHQ7IDEuMi48L3A+CisKKzxwPjxiPk5vdGU6PC9iPiBJZiB5b3Ugd2lzaCB0byBjb21waWxlIG9ubHkgc291cmNlLWZpbGVzIGxvY2F0ZWQgaW4gc29tZSBwYWNrYWdlcyBiZWxvdyBhCitjb21tb24gcm9vdCB5b3Ugc2hvdWxkIG5vdCBpbmNsdWRlIHRoZXNlIHBhY2thZ2VzIGluIHRoZSBzcmNkaXItYXR0cmlidXRlLiBVc2UgaW5jbHVkZS9leGNsdWRlLWF0dHJpYnV0ZXMKK29yIGVsZW1lbnRzIHRvIGZpbHRlciBmb3IgdGhlc2UgcGFja2FnZXMuIElmIHlvdSBpbmNsdWRlIHBhcnQgb2YgeW91ciBwYWNrYWdlLXN0cnVjdHVyZSBpbnNpZGUgdGhlIHNyY2Rpci1hdHRyaWJ1dGUKKyhvciBuZXN0ZWQgc3JjLWVsZW1lbnRzKSBBbnQgd2lsbCBzdGFydCB0byByZWNvbXBpbGUgeW91ciBzb3VyY2VzIGV2ZXJ5IHRpbWUgeW91IGNhbGwgaXQuPC9wPgorCis8L3NlY3Rpb24+CisKKzxzZWN0aW9uIGFuY2hvcj0iamlrZXMiIG5hbWU9Ikppa2VzIE5vdGVzIj4KKworPHA+SmlrZXMgc3VwcG9ydHMgc29tZSBleHRyYSBvcHRpb25zLCB3aGljaCBjYW4gYmUgc2V0IGJlIGRlZmluaW5nCitwcm9wZXJ0aWVzIHByaW9yIHRvIGludm9raW5nIHRoZSB0YXNrLiBUaGUgYW50IGRldmVsb3BlcnMgYXJlIGF3YXJlIHRoYXQKK3RoaXMgaXMgdWdseSBhbmQgaW5mbGV4aWJsZSAtZXhwZWN0IGEgYmV0dGVyIHNvbHV0aW9uIGluIHRoZSBmdXR1cmUuIEFsbAordGhlIG9wdGlvbnMgYXJlIGJvb2xlYW4sIGFuZCBtdXN0IGJlIHNldCB0byAmcXVvdDt0cnVlJnF1b3Q7IG9yICZxdW90O3llcyZxdW90OyB0byBiZQoraW50ZXJwcmV0ZWQgYXMgYW55dGhpbmcgb3RoZXIgdGhhbiBmYWxzZTsgYnkgZGVmYXVsdAorYnVpbGQuY29tcGlsZXIud2FybmluZ3MgaXMgJnF1b3Q7dHJ1ZSZxdW90OyB3aGlsZSBhbGwgb3RoZXJzIGFyZSAmcXVvdDtmYWxzZSZxdW90OzwvcD4KKworPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgPHRyPgorICAgIDx0ZCB2YWxpZ249InRvcCI+CisJYnVpbGQuY29tcGlsZXIuZW1hY3MKKwk8L3RkPgorCTx0ZCB2YWxpZ249InRvcCI+CisJRW5hYmxlIGVtYWNzIGNvbXBhdGlibGUgZXJyb3IgbWVzc2FnZXMKKyAgICA8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIHZhbGlnbj0idG9wIj4KKwlidWlsZC5jb21waWxlci53YXJuaW5nczxiciAvPgorICAgICAgICA8Yj5UaGlzIHByb3BlcnR5IGhhcyBiZWVuIGRlcHJlY2F0ZWQsIHVzZSB0aGUgbm93YXJuIGF0dHJpYnV0ZQorICAgICAgICAgIGluc3RlYWQ8L2I+CisJPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiPgorCWRvbid0IGRpc2FibGUgd2FybmluZyBtZXNzYWdlcworICAgIDwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPgorCWJ1aWxkLmNvbXBpbGVyLnBlZGFudGljCisJPC90ZD4KKwk8dGQgdmFsaWduPSJ0b3AiPgorCWVuYWJsZSBwZWRhbnRpYyB3YXJuaW5ncworICAgIDwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQgdmFsaWduPSJ0b3AiPgorCWJ1aWxkLmNvbXBpbGVyLmZ1bGxkZXBlbmQKKwk8L3RkPgorCTx0ZCB2YWxpZ249InRvcCI+CisJZW5hYmxlIGZ1bGwgZGVwZW5kZW5jeSBjaGVja2luZyw8YnIgLz4KKwkmcXVvdDsrRiZxdW90OyBpbiB0aGUgamlrZXMgbWFudWFsLgorICAgIDwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCis8L3NlY3Rpb24+Cis8L2V4dGVybmFsPgorCisgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDb21waWxlcyBKYXZhIHNvdXJjZSBmaWxlcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICA8ZGVzY3JpcHRpb24+CisgICAgPCFbQ0RBVEFbQ29tcGlsZXMgSmF2YSBzb3VyY2UgZmlsZXMuIFRoaXMgdGFzayBjYW4gdGFrZSB0aGUgZm9sbG93aW5nCisgYXJndW1lbnRzOgorIDx1bD4KKyA8bGk+c291cmNlZGlyCisgPGxpPmRlc3RkaXIKKyA8bGk+ZGVwcmVjYXRpb24KKyA8bGk+Y2xhc3NwYXRoCisgPGxpPmJvb3RjbGFzc3BhdGgKKyA8bGk+ZXh0ZGlycworIDxsaT5vcHRpbWl6ZQorIDxsaT5kZWJ1ZworIDxsaT5lbmNvZGluZworIDxsaT50YXJnZXQKKyA8bGk+ZGVwZW5kCisgPGxpPnZlYm9zZQorIDxsaT5mYWlsb25lcnJvcgorIDxsaT5pbmNsdWRlYW50cnVudGltZQorIDxsaT5pbmNsdWRlamF2YXJ1bnRpbWUKKyA8bGk+c291cmNlCisgPGxpPmNvbXBpbGVyCisgPC91bD4KKyBPZiB0aGVzZSBhcmd1bWVudHMsIHRoZSA8Yj5zb3VyY2VkaXI8L2I+IGFuZCA8Yj5kZXN0ZGlyPC9iPiBhcmUgcmVxdWlyZWQuCisgPHA+CisgV2hlbiB0aGlzIHRhc2sgZXhlY3V0ZXMsIGl0IHdpbGwgcmVjdXJzaXZlbHkgc2NhbiB0aGUgc291cmNlZGlyIGFuZAorIGRlc3RkaXIgbG9va2luZyBmb3IgSmF2YSBzb3VyY2UgZmlsZXMgdG8gY29tcGlsZS4gVGhpcyB0YXNrIG1ha2VzIGl0cworIGNvbXBpbGUgZGVjaXNpb24gYmFzZWQgb24gdGltZXN0YW1wLl1dPgorICA8L2Rlc2NyaXB0aW9uPgorCisgIDxzdHJ1Y3R1cmU+CisKKyAgICA8YXR0cmlidXRlcz4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYm9vdGNsYXNzcGF0aHJlZiIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVmZXJlbmNlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlJlZmVyZW5jZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBhIHJlZmVyZW5jZSB0byBhIGNsYXNzcGF0aCBkZWZpbmVkIGVsc2V3aGVyZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgQWRkcyBhIHJlZmVyZW5jZSB0byBhIGNsYXNzcGF0aCBkZWZpbmVkIGVsc2V3aGVyZS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJib290Y2xhc3NwYXRoIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlBhdGgiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0Jvb3RjbGFzc3BhdGggdGhhdCB3aWxsIGJlIHVzZWQgdG8gY29tcGlsZSB0aGUgY2xhc3NlcworIGFnYWluc3QuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldHMgdGhlIGJvb3RjbGFzc3BhdGggdGhhdCB3aWxsIGJlIHVzZWQgdG8gY29tcGlsZSB0aGUgY2xhc3NlcworIGFnYWluc3QuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NwYXRoIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlBhdGgiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NsYXNzcGF0aCB0byBiZSB1c2VkIGZvciB0aGlzIGNvbXBpbGF0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIGNsYXNzcGF0aCB0byBiZSB1c2VkIGZvciB0aGlzIGNvbXBpbGF0aW9uLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzcGF0aHJlZiIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVmZXJlbmNlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlJlZmVyZW5jZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBhIHJlZmVyZW5jZSB0byBhIGNsYXNzcGF0aCBkZWZpbmVkIGVsc2V3aGVyZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgQWRkcyBhIHJlZmVyZW5jZSB0byBhIGNsYXNzcGF0aCBkZWZpbmVkIGVsc2V3aGVyZS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb21waWxlciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0Nob29zZSB0aGUgaW1wbGVtZW50YXRpb24gZm9yIHRoaXMgcGFydGljdWxhciB0YXNrLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBDaG9vc2UgdGhlIGltcGxlbWVudGF0aW9uIGZvciB0aGlzIHBhcnRpY3VsYXIgdGFzay4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZWJ1ZyIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJbmRpY2F0ZXMgd2hldGhlciBzb3VyY2Ugc2hvdWxkIGJlIGNvbXBpbGVkCisgd2l0aCBkZWJ1ZyBpbmZvcm1hdGlvbjsgZGVmYXVsdHMgdG8gb2ZmLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBJbmRpY2F0ZXMgd2hldGhlciBzb3VyY2Ugc2hvdWxkIGJlIGNvbXBpbGVkCisgd2l0aCBkZWJ1ZyBpbmZvcm1hdGlvbjsgZGVmYXVsdHMgdG8gb2ZmLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlYnVnbGV2ZWwiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtLZXl3b3JkIGxpc3QgdG8gYmUgYXBwZW5kZWQgdG8gdGhlIC1nIGNvbW1hbmQtbGluZSBzd2l0Y2guXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIEtleXdvcmQgbGlzdCB0byBiZSBhcHBlbmRlZCB0byB0aGUgLWcgY29tbWFuZC1saW5lIHN3aXRjaC4KKworIFRoaXMgd2lsbCBiZSBpZ25vcmVkIGJ5IGFsbCBpbXBsZW1lbnRhdGlvbnMgZXhjZXB0IG1vZGVybgorIGFuZCBjbGFzc2ljKHZlciA+PSAxLjIpLiBMZWdhbCB2YWx1ZXMgYXJlIG5vbmUgb3IgYQorIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHRoZSBmb2xsb3dpbmcga2V5d29yZHM6IGxpbmVzLCB2YXJzLAorIGFuZCBzb3VyY2UuIElmIGRlYnVnbGV2ZWwgaXMgbm90IHNwZWNpZmllZCwgYnkgZGVmYXVsdCwgOm5vbmUKKyB3aWxsIGJlIGFwcGVuZGVkIHRvIC1nLiBJZiBkZWJ1ZyBpcyBub3QgdHVybmVkIG9uLCB0aGlzIGF0dHJpYnV0ZQorIHdpbGwgYmUgaWdub3JlZC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXBlbmQiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRW5hYmxlcyBkZXBlbmRlbmN5LXRyYWNraW5nIGZvciBjb21waWxlcnMKKyB0aGF0IHN1cHBvcnQgdGhpcyAoamlrZXMgYW5kIGNsYXNzaWMpLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBFbmFibGVzIGRlcGVuZGVuY3ktdHJhY2tpbmcgZm9yIGNvbXBpbGVycworIHRoYXQgc3VwcG9ydCB0aGlzIChqaWtlcyBhbmQgY2xhc3NpYykuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVwcmVjYXRpb24iIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSW5kaWNhdGVzIHdoZXRoZXIgc291cmNlIHNob3VsZCBiZQorIGNvbXBpbGVkIHdpdGggZGVwcmVjYXRpb24gaW5mb3JtYXRpb247IGRlZmF1bHRzIHRvIG9mZi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgSW5kaWNhdGVzIHdoZXRoZXIgc291cmNlIHNob3VsZCBiZQorIGNvbXBpbGVkIHdpdGggZGVwcmVjYXRpb24gaW5mb3JtYXRpb247IGRlZmF1bHRzIHRvIG9mZi4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXN0ZGlyIiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRGVzdGluYXRpb24gZGlyZWN0b3J5IGludG8gd2hpY2ggdGhlIEphdmEgc291cmNlCisgZmlsZXMgc2hvdWxkIGJlIGNvbXBpbGVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBpbnRvIHdoaWNoIHRoZSBKYXZhIHNvdXJjZQorIGZpbGVzIHNob3VsZCBiZSBjb21waWxlZC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJlbmNvZGluZyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0phdmEgc291cmNlIGZpbGUgZW5jb2RpbmcgbmFtZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBKYXZhIHNvdXJjZSBmaWxlIGVuY29kaW5nIG5hbWUuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZXhlY3V0YWJsZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBuYW1lIG9mIHRoZSBqYXZhYyBleGVjdXRhYmxlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXRzIHRoZSB0aGUgbmFtZSBvZiB0aGUgamF2YWMgZXhlY3V0YWJsZS4KKworIDxwPklnbm9yZWQgdW5sZXNzIGZvcmsgaXMgdHJ1ZSBvciBleHRKYXZhYyBoYXMgYmVlbiBzcGVjaWZpZWQKKyBhcyB0aGUgY29tcGlsZXIuPC9wPgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImV4dGRpcnMiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUGF0aCIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRXh0ZW5zaW9uIGRpcmVjdG9yaWVzIHRoYXQgd2lsbCBiZSB1c2VkIGR1cmluZyB0aGUKKyBjb21waWxhdGlvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0cyB0aGUgZXh0ZW5zaW9uIGRpcmVjdG9yaWVzIHRoYXQgd2lsbCBiZSB1c2VkIGR1cmluZyB0aGUKKyBjb21waWxhdGlvbi4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmYWlsb25lcnJvciIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJbmRpY2F0ZXMgd2hldGhlciB0aGUgYnVpbGQgd2lsbCBjb250aW51ZQorIGV2ZW4gaWYgdGhlcmUgYXJlIGNvbXBpbGF0aW9uIGVycm9yczsgZGVmYXVsdHMgdG8gdHJ1ZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGJ1aWxkIHdpbGwgY29udGludWUKKyBldmVuIGlmIHRoZXJlIGFyZSBjb21waWxhdGlvbiBlcnJvcnM7IGRlZmF1bHRzIHRvIHRydWUuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZm9yayIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlLCBmb3JrcyB0aGUgamF2YWMgY29tcGlsZXIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIElmIHRydWUsIGZvcmtzIHRoZSBqYXZhYyBjb21waWxlci4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpbmNsdWRlYW50cnVudGltZSIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlLCBpbmNsdWRlcyBBbnQncyBvd24gY2xhc3NwYXRoIGluIHRoZSBjbGFzc3BhdGguXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIElmIHRydWUsIGluY2x1ZGVzIEFudCdzIG93biBjbGFzc3BhdGggaW4gdGhlIGNsYXNzcGF0aC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpbmNsdWRlamF2YXJ1bnRpbWUiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgdHJ1ZSwgaW5jbHVkZXMgdGhlIEphdmEgcnVudGltZSBsaWJyYXJpZXMgaW4gdGhlIGNsYXNzcGF0aC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgSWYgdHJ1ZSwgaW5jbHVkZXMgdGhlIEphdmEgcnVudGltZSBsaWJyYXJpZXMgaW4gdGhlIGNsYXNzcGF0aC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsaXN0ZmlsZXMiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgdHJ1ZSwgbGlzdCB0aGUgc291cmNlIGZpbGVzIGJlaW5nIGhhbmRlZCBvZmYgdG8gdGhlIGNvbXBpbGVyLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBJZiB0cnVlLCBsaXN0IHRoZSBzb3VyY2UgZmlsZXMgYmVpbmcgaGFuZGVkIG9mZiB0byB0aGUgY29tcGlsZXIuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibWVtb3J5aW5pdGlhbHNpemUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgaW5pdGlhbCBzaXplIG9mIHRoZSBtZW1vcnkgZm9yIHRoZSB1bmRlcmx5aW5nIFZNCisgaWYgamF2YWMgaXMgcnVuIGV4dGVybmFsbHk7IGlnbm9yZWQgb3RoZXJ3aXNlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBUaGUgaW5pdGlhbCBzaXplIG9mIHRoZSBtZW1vcnkgZm9yIHRoZSB1bmRlcmx5aW5nIFZNCisgaWYgamF2YWMgaXMgcnVuIGV4dGVybmFsbHk7IGlnbm9yZWQgb3RoZXJ3aXNlLgorIERlZmF1bHRzIHRvIHRoZSBzdGFuZGFyZCBWTSBtZW1vcnkgc2V0dGluZy4KKyAoRXhhbXBsZXM6IDgzODg2MDgwLCA4MTkyMGssIG9yIDgwbSkKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJtZW1vcnltYXhpbXVtc2l6ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBtYXhpbXVtIHNpemUgb2YgdGhlIG1lbW9yeSBmb3IgdGhlIHVuZGVybHlpbmcgVk0KKyBpZiBqYXZhYyBpcyBydW4gZXh0ZXJuYWxseTsgaWdub3JlZCBvdGhlcndpc2UuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIG1lbW9yeSBmb3IgdGhlIHVuZGVybHlpbmcgVk0KKyBpZiBqYXZhYyBpcyBydW4gZXh0ZXJuYWxseTsgaWdub3JlZCBvdGhlcndpc2UuCisgRGVmYXVsdHMgdG8gdGhlIHN0YW5kYXJkIFZNIG1lbW9yeSBzZXR0aW5nLgorIChFeGFtcGxlczogODM4ODYwODAsIDgxOTIwaywgb3IgODBtKQorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9Im5vd2FybiIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlLCBlbmFibGVzIHRoZSAtbm93YXJuIG9wdGlvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgSWYgdHJ1ZSwgZW5hYmxlcyB0aGUgLW5vd2FybiBvcHRpb24uCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ib3B0aW1pemUiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgdHJ1ZSwgY29tcGlsZXMgd2l0aCBvcHRpbWl6YXRpb24gZW5hYmxlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgSWYgdHJ1ZSwgY29tcGlsZXMgd2l0aCBvcHRpbWl6YXRpb24gZW5hYmxlZC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzb3VyY2UiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtWYWx1ZSBvZiB0aGUgLXNvdXJjZSBjb21tYW5kLWxpbmUgc3dpdGNoOyB3aWxsIGJlIGlnbm9yZWQKKyBieSBhbGwgaW1wbGVtZW50YXRpb25zIGV4Y2VwdCBtb2Rlcm4gYW5kIGppa2VzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBWYWx1ZSBvZiB0aGUgLXNvdXJjZSBjb21tYW5kLWxpbmUgc3dpdGNoOyB3aWxsIGJlIGlnbm9yZWQKKyBieSBhbGwgaW1wbGVtZW50YXRpb25zIGV4Y2VwdCBtb2Rlcm4gYW5kIGppa2VzLgorCisgSWYgeW91IHVzZSB0aGlzIGF0dHJpYnV0ZSB0b2dldGhlciB3aXRoIGppa2VzLCB5b3UgbXVzdAorIG1ha2Ugc3VyZSB0aGF0IHlvdXIgdmVyc2lvbiBvZiBqaWtlcyBzdXBwb3J0cyB0aGUgLXNvdXJjZSBzd2l0Y2guCisgTGVnYWwgdmFsdWVzIGFyZSAxLjMgYW5kIDEuNCAtIGJ5IGRlZmF1bHQsIG5vIC1zb3VyY2UgYXJndW1lbnQKKyB3aWxsIGJlIHVzZWQgYXQgYWxsLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InNvdXJjZXBhdGgiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUGF0aCIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU291cmNlcGF0aCB0byBiZSB1c2VkIGZvciB0aGlzIGNvbXBpbGF0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIHNvdXJjZXBhdGggdG8gYmUgdXNlZCBmb3IgdGhpcyBjb21waWxhdGlvbi4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzb3VyY2VwYXRocmVmIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZWZlcmVuY2UiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUmVmZXJlbmNlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIGEgcmVmZXJlbmNlIHRvIGEgc291cmNlIHBhdGggZGVmaW5lZCBlbHNld2hlcmUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIEFkZHMgYSByZWZlcmVuY2UgdG8gYSBzb3VyY2UgcGF0aCBkZWZpbmVkIGVsc2V3aGVyZS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzcmNkaXIiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUGF0aCIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU291cmNlIGRpcmVjdG9yaWVzIHRvIGZpbmQgdGhlIHNvdXJjZSBKYXZhIGZpbGVzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIHNvdXJjZSBkaXJlY3RvcmllcyB0byBmaW5kIHRoZSBzb3VyY2UgSmF2YSBmaWxlcy4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUYXJnZXQgVk0gdGhhdCB0aGUgY2xhc3NlcyB3aWxsIGJlIGNvbXBpbGVkIGZvci5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0cyB0aGUgdGFyZ2V0IFZNIHRoYXQgdGhlIGNsYXNzZXMgd2lsbCBiZSBjb21waWxlZCBmb3IuIFZhbGlkCisgc3RyaW5ncyBhcmUgIjEuMSIsICIxLjIiLCBhbmQgIjEuMyIuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmVyYm9zZSIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlLCBhc2tzIHRoZSBjb21waWxlciBmb3IgdmVyYm9zZSBvdXRwdXQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIElmIHRydWUsIGFza3MgdGhlIGNvbXBpbGVyIGZvciB2ZXJib3NlIG91dHB1dC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgIDwvYXR0cmlidXRlcz4KKworICAgIDxlbGVtZW50cz4KKyAgICAgIDxlbGVtZW50IG5hbWU9ImJvb3RjbGFzc3BhdGgiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IlBhdGgiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIGEgcGF0aCB0byB0aGUgYm9vdGNsYXNzcGF0aC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbQWRkcyBhIHBhdGggdG8gdGhlIGJvb3RjbGFzc3BhdGguXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICAgIDxlbGVtZW50IG5hbWU9ImNsYXNzcGF0aCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aCIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUGF0aCIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgYSBwYXRoIHRvIHRoZSBjbGFzc3BhdGguXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0FkZHMgYSBwYXRoIHRvIHRoZSBjbGFzc3BhdGguXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICAgIDxlbGVtZW50IG5hbWU9ImNvbXBpbGVyYXJnIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5KYXZhYy5JbXBsZW1lbnRhdGlvblNwZWNpZmljQXJndW1lbnQiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IiIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgYW4gaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgY29tbWFuZC1saW5lIGFyZ3VtZW50Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtBZGRzIGFuIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIGNvbW1hbmQtbGluZSBhcmd1bWVudC5dXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgICAgPGVsZW1lbnQgbmFtZT0iZXh0ZGlycyIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aCIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUGF0aCIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgYSBwYXRoIHRvIGV4dGRpcnMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0FkZHMgYSBwYXRoIHRvIGV4dGRpcnMuXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICAgIDxlbGVtZW50IG5hbWU9InNvdXJjZXBhdGgiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IlBhdGgiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIGEgcGF0aCB0byBzb3VyY2VwYXRoLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtBZGRzIGEgcGF0aCB0byBzb3VyY2VwYXRoLl1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgICA8ZWxlbWVudCBuYW1lPSJzcmMiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IlBhdGgiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIGEgcGF0aCBmb3Igc291cmNlIGNvbXBpbGF0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtBZGRzIGEgcGF0aCBmb3Igc291cmNlIGNvbXBpbGF0aW9uLl1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgPC9lbGVtZW50cz4KKworICA8L3N0cnVjdHVyZT4KKworPC90YXNrPgorCisKKzx0YXNrIG5hbWU9ImphdmFjYyIgY2F0ZWdvcnk9Im90aGVyIgorICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qYXZhY2MuSmF2YUNDIgorICAgICAgPgorCisgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtKYXZhQ0MgY29tcGlsZXIgY29tcGlsZXIgdGFzay5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICA8ZGVzY3JpcHRpb24+CisgICAgPCFbQ0RBVEFbSmF2YUNDIGNvbXBpbGVyIGNvbXBpbGVyIHRhc2suXV0+CisgIDwvZGVzY3JpcHRpb24+CisKKyAgPHN0cnVjdHVyZT4KKworICAgIDxhdHRyaWJ1dGVzPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJidWlsZHBhcnNlciIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtCVUlMRF9QQVJTRVIgZ3JhbW1hciBvcHRpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldHMgdGhlIEJVSUxEX1BBUlNFUiBncmFtbWFyIG9wdGlvbi4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJidWlsZHRva2VubWFuYWdlciIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtCVUlMRF9UT0tFTl9NQU5BR0VSIGdyYW1tYXIgb3B0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXRzIHRoZSBCVUlMRF9UT0tFTl9NQU5BR0VSIGdyYW1tYXIgb3B0aW9uLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNhY2hldG9rZW5zIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NBQ0hFX1RPS0VOUyBncmFtbWFyIG9wdGlvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0cyB0aGUgQ0FDSEVfVE9LRU5TIGdyYW1tYXIgb3B0aW9uLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNob2ljZWFtYmlndWl0eWNoZWNrIiB0eXBlPSJpbnQiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iaW50IiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDSE9JQ0VfQU1CSUdVSVRZX0NIRUNLIGdyYW1tYXIgb3B0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXRzIHRoZSBDSE9JQ0VfQU1CSUdVSVRZX0NIRUNLIGdyYW1tYXIgb3B0aW9uLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNvbW1vbnRva2VuYWN0aW9uIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NPTU1PTl9UT0tFTl9BQ1RJT04gZ3JhbW1hciBvcHRpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldHMgdGhlIENPTU1PTl9UT0tFTl9BQ1RJT04gZ3JhbW1hciBvcHRpb24uCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVidWdsb29rYWhlYWQiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbREVCVUdfTE9PS0FIRUFEIGdyYW1tYXIgb3B0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXRzIHRoZSBERUJVR19MT09LQUhFQUQgZ3JhbW1hciBvcHRpb24uCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVidWdwYXJzZXIiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbREVCVUdfUEFSU0VSIGdyYW1tYXIgb3B0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXRzIHRoZSBERUJVR19QQVJTRVIgZ3JhbW1hciBvcHRpb24uCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVidWd0b2tlbm1hbmFnZXIiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbREVCVUdfVE9LRU5fTUFOQUdFUiBncmFtbWFyIG9wdGlvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0cyB0aGUgREVCVUdfVE9LRU5fTUFOQUdFUiBncmFtbWFyIG9wdGlvbi4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJlcnJvcnJlcG9ydGluZyIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtFUlJPUl9SRVBPUlRJTkcgZ3JhbW1hciBvcHRpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldHMgdGhlIEVSUk9SX1JFUE9SVElORyBncmFtbWFyIG9wdGlvbi4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmb3JjZWxhY2hlY2siIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRk9SQ0VfTEFfQ0hFQ0sgZ3JhbW1hciBvcHRpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldHMgdGhlIEZPUkNFX0xBX0NIRUNLIGdyYW1tYXIgb3B0aW9uLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9Imlnbm9yZWNhc2UiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSUdOT1JFX0NBU0UgZ3JhbW1hciBvcHRpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldHMgdGhlIElHTk9SRV9DQVNFIGdyYW1tYXIgb3B0aW9uLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImphdmFjY2hvbWUiIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIEphdmFDQyBkaXN0cmlidXRpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgSmF2YUNDIGRpc3RyaWJ1dGlvbi4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJqYXZhdW5pY29kZWVzY2FwZSIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtKQVZBX1VOSUNPREVfRVNDQVBFIGdyYW1tYXIgb3B0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXRzIHRoZSBKQVZBX1VOSUNPREVfRVNDQVBFIGdyYW1tYXIgb3B0aW9uLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9Imxvb2thaGVhZCIgdHlwZT0iaW50IgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImludCIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTE9PS0FIRUFEIGdyYW1tYXIgb3B0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXRzIHRoZSBMT09LQUhFQUQgZ3JhbW1hciBvcHRpb24uCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ib3B0aW1pemV0b2tlbm1hbmFnZXIiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbT1BUSU1JWkVfVE9LRU5fTUFOQUdFUiBncmFtbWFyIG9wdGlvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0cyB0aGUgT1BUSU1JWkVfVE9LRU5fTUFOQUdFUiBncmFtbWFyIG9wdGlvbi4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJvdGhlcmFtYmlndWl0eWNoZWNrIiB0eXBlPSJpbnQiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iaW50IiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtPVEhFUl9BTUJJR1VJVFlfQ0hFQ0sgZ3JhbW1hciBvcHRpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldHMgdGhlIE9USEVSX0FNQklHVUlUWV9DSEVDSyBncmFtbWFyIG9wdGlvbi4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJvdXRwdXRkaXJlY3RvcnkiIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgZGlyZWN0b3J5IHRvIHdyaXRlIHRoZSBnZW5lcmF0ZWQgZmlsZXMgdG8uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRoZSBkaXJlY3RvcnkgdG8gd3JpdGUgdGhlIGdlbmVyYXRlZCBmaWxlcyB0by4KKyBJZiBub3Qgc2V0LCB0aGUgZmlsZXMgYXJlIHdyaXR0ZW4gdG8gdGhlIGRpcmVjdG9yeQorIGNvbnRhaW5pbmcgdGhlIGdyYW1tYXIgZmlsZS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzYW5pdHljaGVjayIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTQU5JVFlfQ0hFQ0sgZ3JhbW1hciBvcHRpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldHMgdGhlIFNBTklUWV9DSEVDSyBncmFtbWFyIG9wdGlvbi4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzdGF0aWMiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU1RBVElDIGdyYW1tYXIgb3B0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXRzIHRoZSBTVEFUSUMgZ3JhbW1hciBvcHRpb24uCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idGFyZ2V0IiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGdyYW1tYXIgZmlsZSB0byBwcm9jZXNzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBUaGUgZ3JhbW1hciBmaWxlIHRvIHByb2Nlc3MuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idW5pY29kZWlucHV0IiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1VOSUNPREVfSU5QVVQgZ3JhbW1hciBvcHRpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldHMgdGhlIFVOSUNPREVfSU5QVVQgZ3JhbW1hciBvcHRpb24uCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idXNlcmNoYXJzdHJlYW0iIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVVNFUl9DSEFSX1NUUkVBTSBncmFtbWFyIG9wdGlvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0cyB0aGUgVVNFUl9DSEFSX1NUUkVBTSBncmFtbWFyIG9wdGlvbi4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1c2VydG9rZW5tYW5hZ2VyIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1VTRVJfVE9LRU5fTUFOQUdFUiBncmFtbWFyIG9wdGlvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0cyB0aGUgVVNFUl9UT0tFTl9NQU5BR0VSIGdyYW1tYXIgb3B0aW9uLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgPC9hdHRyaWJ1dGVzPgorCisgICAgPGVsZW1lbnRzPgorICAgIDwvZWxlbWVudHM+CisKKyAgPC9zdHJ1Y3R1cmU+CisKKzwvdGFzaz4KKworCis8dGFzayBuYW1lPSJqYXZhZG9jIiBjYXRlZ29yeT0iamF2YSIKKyAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuSmF2YWRvYyIKKyAgICAgID4KKworICA8IS0tIGphdmFkb2MgdGFzayAtLT4KKzxleHRlcm5hbD4KKzxkZXNjcmlwdGlvbj4KKworPHA+R2VuZXJhdGVzIGNvZGUgZG9jdW1lbnRhdGlvbiB1c2luZyB0aGUgamF2YWRvYyB0b29sLjwvcD4KKworPHA+VGhlIHNvdXJjZSBkaXJlY3Rvcnkgd2lsbCBiZSByZWN1cnNpdmVseSBzY2FubmVkIGZvciBKYXZhIHNvdXJjZSBmaWxlcyB0byBwcm9jZXNzCitidXQgb25seSB0aG9zZSBtYXRjaGluZyB0aGUgaW5jbHVzaW9uIHJ1bGVzLCBhbmQgbm90IG1hdGNoaW5nIHRoZSBleGNsdXNpb25zIHJ1bGVzCit3aWxsIGJlIHBhc3NlZCB0byB0aGUgamF2YWRvYyB0b29sLiBUaGlzCithbGxvd3Mgd2lsZGNhcmRzIHRvIGJlIHVzZWQgdG8gY2hvb3NlIGJldHdlZW4gcGFja2FnZSBuYW1lcywgcmVkdWNpbmcgdmVyYm9zaXR5CithbmQgbWFuYWdlbWVudCBjb3N0cyBvdmVyIHRpbWUuIFRoaXMgdGFzaywgaG93ZXZlciwgaGFzIG5vIG5vdGlvbiBvZgorJnF1b3Q7Y2hhbmdlZCZxdW90OyBmaWxlcywgdW5saWtlIHRoZSA8YSBocmVmPSJqYXZhYy5odG1sIj5qYXZhYzwvYT4gdGFzay4gVGhpcyBtZWFucworYWxsIHBhY2thZ2VzIHdpbGwgYmUgcHJvY2Vzc2VkIGVhY2ggdGltZSB0aGlzIHRhc2sgaXMgcnVuLiBJbiBnZW5lcmFsLCBob3dldmVyLAordGhpcyB0YXNrIGlzIHVzZWQgbXVjaCBsZXNzIGZyZXF1ZW50bHkuPC9wPgorCis8cD5UaGlzIHRhc2sgd29ya3Mgc2VhbWxlc3NseSBiZXR3ZWVuIGRpZmZlcmVudCBqYXZhZG9jIHZlcnNpb25zICgxLjEgYW5kIDEuMiksCit3aXRoIHRoZSBvYnZpb3VzIHJlc3RyaWN0aW9uIHRoYXQgdGhlIDEuMiBhdHRyaWJ1dGVzIHdpbGwgYmUgaWdub3JlZCBpZiBydW4gaW4gYQorMS4xIFZNLjwvcD4KKworPHA+Tk9URTogc2luY2UgamF2YWRvYyBjYWxscyBTeXN0ZW0uZXhpdCgpLCBqYXZhZG9jIGNhbm5vdCBiZSBydW4gaW5zaWRlIHRoZQorc2FtZSBWTSBhcyBhbnQgd2l0aG91dCBicmVha2luZyBmdW5jdGlvbmFsaXR5LiBGb3IgdGhpcyByZWFzb24sIHRoaXMgdGFzaworYWx3YXlzIGZvcmtzIHRoZSBWTS4gVGhpcyBvdmVyaGVhZCBpcyBub3Qgc2lnbmlmaWNhbnQgc2luY2UgamF2YWRvYyBpcyBub3JtYWxseSBhIGhlYXZ5CithcHBsaWNhdGlvbiBhbmQgd2lsbCBiZSBjYWxsZWQgaW5mcmVxdWVudGx5LjwvcD4KKworPHA+Tk9URTogdGhlIHBhY2thZ2VsaXN0IGF0dHJpYnV0ZSBhbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlIGxpc3Qgb2YgcGFja2FnZXMgdG8KK2RvY3VtZW50IG91dHNpZGUgb2YgdGhlIEFudCBmaWxlLiBJdCdzIGEgbXVjaCBiZXR0ZXIgcHJhY3RpY2UgdG8gaW5jbHVkZSBldmVyeXRoaW5nCitpbnNpZGUgdGhlIGJ1aWxkLnhtbCBmaWxlLiBUaGlzIG9wdGlvbiB3YXMgYWRkZWQgaW4gb3JkZXIgdG8gbWFrZSBpdCBlYXNpZXIgdG8KK21pZ3JhdGUgZnJvbSByZWd1bGFyIG1ha2VmaWxlcywgd2hlcmUgeW91IHdvdWxkIHVzZSB0aGlzIG9wdGlvbiBvZiBqYXZhZG9jLgorVGhlIHBhY2thZ2VzIGxpc3RlZCBpbiBwYWNrYWdlbGlzdCBhcmUgbm90IGNoZWNrZWQsIHNvIHRoZSB0YXNrIHBlcmZvcm1zIGV2ZW4KK2lmIHNvbWUgcGFja2FnZXMgYXJlIG1pc3Npbmcgb3IgYnJva2VuLiBVc2UgdGhpcyBvcHRpb24gaWYgeW91IHdpc2ggdG8gY29udmVydCBmcm9tCithbiBleGlzdGluZyBtYWtlZmlsZS4gT25jZSB0aGluZ3MgYXJlIHJ1bm5pbmcgeW91IHNob3VsZCB0aGVuIHN3aXRjaCB0byB0aGUgcmVndWxhcgorbm90YXRpb24uIDwvcD4KKworPHA+PGk+PGI+REVQUkVDQVRJT046PC9iPiB0aGUgamF2YWRvYzIgdGFzayBzaW1wbHkgcG9pbnRzIHRvIHRoZSBqYXZhZG9jIHRhc2sgYW5kIGl0J3MKK3RoZXJlIGZvciBiYWNrIGNvbXBhdGliaWxpdHkgcmVhc29ucy4gU2luY2UgdGhpcyB0YXNrIHdpbGwgYmUgcmVtb3ZlZCBpbiBmdXR1cmUKK3ZlcnNpb25zLCB5b3UgYXJlIHN0cm9uZ2x5IGVuY291cmFnZWQgdG8gdXNlIDxhIGhyZWY9ImphdmFkb2MuaHRtbCI+amF2YWRvYzwvYT4KK2luc3RlYWQuPC9pPjwvcD4KKzwvZGVzY3JpcHRpb24+CisKKzxzZWN0aW9uIGFuY2hvcj0iZXhhbXBsZXMiIG5hbWU9IkV4YW1wbGUiPgorPHByZT4gICZsdDtqYXZhZG9jIHBhY2thZ2VuYW1lcz0mcXVvdDtjb20uZHVtbXkudGVzdC4qJnF1b3Q7CisgICAgICAgICAgIHNvdXJjZXBhdGg9JnF1b3Q7c3JjJnF1b3Q7CisgICAgICAgICAgIGV4Y2x1ZGVwYWNrYWdlbmFtZXM9JnF1b3Q7Y29tLmR1bW15LnRlc3QuZG9jLWZpbGVzLiomcXVvdDsKKyAgICAgICAgICAgZGVmYXVsdGV4Y2x1ZGVzPSZxdW90O3llcyZxdW90OworICAgICAgICAgICBkZXN0ZGlyPSZxdW90O2RvY3MvYXBpJnF1b3Q7CisgICAgICAgICAgIGF1dGhvcj0mcXVvdDt0cnVlJnF1b3Q7CisgICAgICAgICAgIHZlcnNpb249JnF1b3Q7dHJ1ZSZxdW90OworICAgICAgICAgICB1c2U9JnF1b3Q7dHJ1ZSZxdW90OworICAgICAgICAgICB3aW5kb3d0aXRsZT0mcXVvdDtUZXN0IEFQSSZxdW90OyZndDsKKyAgICAmbHQ7ZG9jdGl0bGUmZ3Q7Jmx0OyFbQ0RBVEFbJmx0O2gxJmd0O1Rlc3QmbHQ7L2gxJmd0O11dJmd0OyZsdDsvZG9jdGl0bGUmZ3Q7CisgICAgJmx0O2JvdHRvbSZndDsmbHQ7IVtDREFUQVsmbHQ7aSZndDtDb3B5cmlnaHQgJmFtcDsjMTY5OyAyMDAwIER1bW15IENvcnAuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuJmx0Oy9pJmd0O11dJmd0OyZsdDsvYm90dG9tJmd0OworICAgICZsdDt0YWcgbmFtZT0mcXVvdDt0b2RvJnF1b3Q7IHNjb3BlPSZxdW90O2FsbCZxdW90OyBkZXNjcmlwdGlvbj0mcXVvdDtUbyBkbzomcXVvdDsgLyZndDsKKyAgICAmbHQ7Z3JvdXAgdGl0bGU9JnF1b3Q7R3JvdXAgMSBQYWNrYWdlcyZxdW90OyBwYWNrYWdlcz0mcXVvdDtjb20uZHVtbXkudGVzdC5hKiZxdW90Oy8mZ3Q7CisgICAgJmx0O2dyb3VwIHRpdGxlPSZxdW90O0dyb3VwIDIgUGFja2FnZXMmcXVvdDsgcGFja2FnZXM9JnF1b3Q7Y29tLmR1bW15LnRlc3QuYio6Y29tLmR1bW15LnRlc3QuYyomcXVvdDsvJmd0OworICAgICZsdDtsaW5rIG9mZmxpbmU9JnF1b3Q7dHJ1ZSZxdW90OyBocmVmPSZxdW90O2h0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvamRrLzEuMi9kb2NzL2FwaS8mcXVvdDsgcGFja2FnZWxpc3RMb2M9JnF1b3Q7QzpcdG1wJnF1b3Q7LyZndDsKKyAgICAmbHQ7bGluayBocmVmPSZxdW90O2h0dHA6Ly9kZXZlbG9wZXIuamF2YS5zdW4uY29tL2RldmVsb3Blci9wcm9kdWN0cy94bWwvZG9jcy9hcGkvJnF1b3Q7LyZndDsKKyAgJmx0Oy9qYXZhZG9jJmd0OzwvcHJlPgorPC9zZWN0aW9uPgorPC9leHRlcm5hbD4KKworICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbR2VuZXJhdGVzIEphdmFkb2MgZG9jdW1lbnRhdGlvbiBmb3IgYSBjb2xsZWN0aW9uIG9mIHNvdXJjZSBjb2RlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgIDxkZXNjcmlwdGlvbj4KKyAgICA8IVtDREFUQVtHZW5lcmF0ZXMgSmF2YWRvYyBkb2N1bWVudGF0aW9uIGZvciBhIGNvbGxlY3Rpb24KKyBvZiBzb3VyY2UgY29kZS4KKworIDxQPkN1cnJlbnQga25vd24gbGltaXRhdGlvbnMgYXJlOgorCisgPFA+PFVMPgorICAgIDxMST5wYXR0ZXJucyBtdXN0IGJlIG9mIHRoZSBmb3JtICJ4eHguKiIsIGV2ZXJ5IG90aGVyIHBhdHRlcm4gZG9lc24ndAorICAgICAgICB3b3JrLgorICAgIDxMST50aGVyZSBpcyBubyBjb250cm9sIG9uIGFyZ3VtZW50cyBzYW5pdHkgc2luY2UgdGhleSBhcmUgbGVmdAorICAgICAgICB0byB0aGUgamF2YWRvYyBpbXBsZW1lbnRhdGlvbi4KKyAgICA8TEk+YXJndW1lbnQgSiBpbiBqYXZhZG9jMSBpcyBub3Qgc3VwcG9ydGVkICh3aGF0IGlzIHRoYXQgZm9yIGFueXdheT8pCisgPC9VTD4KKworIDxQPklmIG5vIDxDT0RFPmRvY2xldDwvQ09ERT4gaXMgc2V0LCB0aGVuIHRoZSA8Q09ERT52ZXJzaW9uPC9DT0RFPiBhbmQKKyA8Q09ERT5hdXRob3I8L0NPREU+IGFyZSBieSBkZWZhdWx0IDxDT0RFPiJ5ZXMiPC9DT0RFPi4KKworIDxQPk5vdGU6IFRoaXMgdGFzayBpcyBydW4gb24gYW5vdGhlciBWTSBiZWNhdXNlIHRoZSBKYXZhZG9jIGNvZGUgY2FsbHMKKyA8Q09ERT5TeXN0ZW0uZXhpdCgpPC9DT0RFPiB3aGljaCB3b3VsZCBicmVhayBBbnQgZnVuY3Rpb25hbGl0eS5dXT4KKyAgPC9kZXNjcmlwdGlvbj4KKworICA8c3RydWN0dXJlPgorCisgICAgPGF0dHJpYnV0ZXM+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuSmF2YWRvYy5BY2Nlc3NUeXBlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IiZxdW90O3Byb3RlY3RlZCZxdW90OywgJnF1b3Q7cHVibGljJnF1b3Q7LCAmcXVvdDtwYWNrYWdlJnF1b3Q7LCAmcXVvdDtwcml2YXRlJnF1b3Q7IiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTY29wZSB0byBiZSBwcm9jZXNzZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCB0aGUgc2NvcGUgdG8gYmUgcHJvY2Vzc2VkLiBUaGlzIGlzIGFuIGFsdGVybmF0aXZlIHRvIHRoZQorIHVzZSBvZiB0aGUgc2V0UHVibGljLCBzZXRQcml2YXRlLCBldGMgbWV0aG9kcy4gSXQgZ2l2ZXMgYmV0dGVyIGJ1aWxkCisgZmlsZSBjb250cm9sIG92ZXIgd2hhdCBzY29wZSBpcyBwcm9jZXNzZWQuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYWRkaXRpb25hbHBhcmFtIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2V0IGFuIGFkZGl0aW9uYWwgcGFyYW1ldGVyIG9uIHRoZSBjb21tYW5kIGxpbmUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCBhbiBhZGRpdGlvbmFsIHBhcmFtZXRlciBvbiB0aGUgY29tbWFuZCBsaW5lCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYXV0aG9yIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0luY2x1ZGUgdGhlIGF1dGhvciB0YWcgaW4gdGhlIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBJbmNsdWRlIHRoZSBhdXRob3IgdGFnIGluIHRoZSBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbi4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJib290Y2xhc3NwYXRocmVmIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZWZlcmVuY2UiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUmVmZXJlbmNlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIGEgcmVmZXJlbmNlIHRvIGEgQ0xBU1NQQVRIIGRlZmluZWQgZWxzZXdoZXJlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBBZGRzIGEgcmVmZXJlbmNlIHRvIGEgQ0xBU1NQQVRIIGRlZmluZWQgZWxzZXdoZXJlLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImJvb3RjbGFzc3BhdGgiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUGF0aCIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQm9vdCBjbGFzc3BhdGggdG8gdXNlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIGJvb3QgY2xhc3NwYXRoIHRvIHVzZS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJib3R0b20iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUZXh0IHRvIGJlIHBsYWNlZCBhdCB0aGUgYm90dG9tIG9mIGVhY2ggb3V0cHV0IGZpbGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCB0aGUgdGV4dCB0byBiZSBwbGFjZWQgYXQgdGhlIGJvdHRvbSBvZiBlYWNoIG91dHB1dCBmaWxlLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNoYXJzZXQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDaGFyc2V0IGZvciBjcm9zcy1wbGF0Zm9ybSB2aWV3aW5nIG9mIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBDaGFyc2V0IGZvciBjcm9zcy1wbGF0Zm9ybSB2aWV3aW5nIG9mIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzcGF0aCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aCIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJQYXRoIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDbGFzc3BhdGggdG8gYmUgdXNlZCBmb3IgdGhpcyBqYXZhZG9jIHJ1bi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBjbGFzc3BhdGggdG8gYmUgdXNlZCBmb3IgdGhpcyBqYXZhZG9jIHJ1bi4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc3BhdGhyZWYiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlZmVyZW5jZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJSZWZlcmVuY2UiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgYSByZWZlcmVuY2UgdG8gYSBDTEFTU1BBVEggZGVmaW5lZCBlbHNld2hlcmUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIEFkZHMgYSByZWZlcmVuY2UgdG8gYSBDTEFTU1BBVEggZGVmaW5lZCBlbHNld2hlcmUuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVmYXVsdGV4Y2x1ZGVzIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NldHMgd2hldGhlciBkZWZhdWx0IGV4Y2x1c2lvbnMgc2hvdWxkIGJlIHVzZWQgb3Igbm90Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXRzIHdoZXRoZXIgZGVmYXVsdCBleGNsdXNpb25zIHNob3VsZCBiZSB1c2VkIG9yIG5vdC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXN0ZGlyIiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRGlyZWN0b3J5IHdoZXJlIHRoZSBKYXZhZG9jIG91dHB1dCB3aWxsIGJlIGdlbmVyYXRlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIEphdmFkb2Mgb3V0cHV0IHdpbGwgYmUgZ2VuZXJhdGVkLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImRvY2VuY29kaW5nIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbT3V0cHV0IGZpbGUgZW5jb2RpbmcgbmFtZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgT3V0cHV0IGZpbGUgZW5jb2RpbmcgbmFtZS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkb2NsZXQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDbGFzcyB0aGF0IHN0YXJ0cyB0aGUgZG9jbGV0IHVzZWQgaW4gZ2VuZXJhdGluZyB0aGUgCisgZG9jdW1lbnRhdGlvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBjbGFzcyB0aGF0IHN0YXJ0cyB0aGUgZG9jbGV0IHVzZWQgaW4gZ2VuZXJhdGluZyB0aGUgCisgZG9jdW1lbnRhdGlvbi4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkb2NsZXRwYXRoIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlBhdGgiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NsYXNzcGF0aCB1c2VkIHRvIGZpbmQgdGhlIGRvY2xldCBjbGFzcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBjbGFzc3BhdGggdXNlZCB0byBmaW5kIHRoZSBkb2NsZXQgY2xhc3MuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZG9jbGV0cGF0aHJlZiIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVmZXJlbmNlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlJlZmVyZW5jZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ2xhc3NwYXRoIHVzZWQgdG8gZmluZCB0aGUgZG9jbGV0IGNsYXNzIGJ5IHJlZmVyZW5jZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBjbGFzc3BhdGggdXNlZCB0byBmaW5kIHRoZSBkb2NsZXQgY2xhc3MgYnkgcmVmZXJlbmNlLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImRvY3RpdGxlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGl0bGUgb2YgdGhlIGdlbmVyYXRlZCBvdmVydmlldyBwYWdlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIHRpdGxlIG9mIHRoZSBnZW5lcmF0ZWQgb3ZlcnZpZXcgcGFnZS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJlbmNvZGluZyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0VuY29kaW5nIG5hbWUgb2YgdGhlIHNvdXJjZSBmaWxlcywuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCB0aGUgZW5jb2RpbmcgbmFtZSBvZiB0aGUgc291cmNlIGZpbGVzLAorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImV4Y2x1ZGVwYWNrYWdlbmFtZXMiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtMaXN0IG9mIHBhY2thZ2VzIHRvIGJlIGV4Y2x1ZGVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIGxpc3Qgb2YgcGFja2FnZXMgdG8gYmUgZXhjbHVkZWQuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZXh0ZGlycyIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aCIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJQYXRoIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtMb2NhdGlvbiBvZiB0aGUgZXh0ZW5zaW9ucyBkaXJlY3Rvcmllcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgZXh0ZW5zaW9ucyBkaXJlY3Rvcmllcy4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmYWlsb25lcnJvciIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTaG91bGQgdGhlIGJ1aWxkIHByb2Nlc3MgZmFpbCBpZiBqYXZhZG9jIGZhaWxzIChhcyBpbmRpY2F0ZWQgYnkKKyBhIG5vbiB6ZXJvIHJldHVybiBjb2RlKT8uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNob3VsZCB0aGUgYnVpbGQgcHJvY2VzcyBmYWlsIGlmIGphdmFkb2MgZmFpbHMgKGFzIGluZGljYXRlZCBieQorIGEgbm9uIHplcm8gcmV0dXJuIGNvZGUpPworCisgPHA+RGVmYXVsdCBpcyBmYWxzZS48L3A+CisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZm9vdGVyIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRm9vdGVyIHRleHQgdG8gYmUgcGxhY2VkIGF0IHRoZSBib3R0b20gb2YgZWFjaCBvdXRwdXQgZmlsZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBmb290ZXIgdGV4dCB0byBiZSBwbGFjZWQgYXQgdGhlIGJvdHRvbSBvZiBlYWNoIG91dHB1dCBmaWxlLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9Imdyb3VwIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbR3JvdXAgc3BlY2lmaWVkIHBhY2thZ2VzIHRvZ2V0aGVyIGluIG92ZXJ2aWV3IHBhZ2UuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIEdyb3VwIHNwZWNpZmllZCBwYWNrYWdlcyB0b2dldGhlciBpbiBvdmVydmlldyBwYWdlLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImhlYWRlciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0hlYWRlciB0ZXh0IHRvIGJlIHBsYWNlZCBhdCB0aGUgdG9wIG9mIGVhY2ggb3V0cHV0IGZpbGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCB0aGUgaGVhZGVyIHRleHQgdG8gYmUgcGxhY2VkIGF0IHRoZSB0b3Agb2YgZWFjaCBvdXRwdXQgZmlsZS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJoZWxwZmlsZSIgdHlwZT0iamF2YS5pby5GaWxlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NwZWNpZmllcyB0aGUgSFRNTCBoZWxwIGZpbGUgdG8gdXNlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTcGVjaWZpZXMgdGhlIEhUTUwgaGVscCBmaWxlIHRvIHVzZS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsaW5rIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ3JlYXRlIGxpbmtzIHRvIGphdmFkb2Mgb3V0cHV0IGF0IHRoZSBnaXZlbiBVUkwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIENyZWF0ZSBsaW5rcyB0byBqYXZhZG9jIG91dHB1dCBhdCB0aGUgZ2l2ZW4gVVJMLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImxpbmtvZmZsaW5lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTGluayB0byBkb2NzIGF0ICJ1cmwiIHVzaW5nIHBhY2thZ2UgbGlzdCBhdCAidXJsMiIKKyAtIHNlcGFyYXRlIHRoZSBVUkxzIGJ5IHVzaW5nIGEgc3BhY2UgY2hhcmFjdGVyLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBMaW5rIHRvIGRvY3MgYXQgInVybCIgdXNpbmcgcGFja2FnZSBsaXN0IGF0ICJ1cmwyIgorIC0gc2VwYXJhdGUgdGhlIFVSTHMgYnkgdXNpbmcgYSBzcGFjZSBjaGFyYWN0ZXIuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibG9jYWxlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTG9jYWwgdG8gdXNlIGluIGRvY3VtZW50YXRpb24gZ2VuZXJhdGlvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBsb2NhbCB0byB1c2UgaW4gZG9jdW1lbnRhdGlvbiBnZW5lcmF0aW9uLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9Im1heG1lbW9yeSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW01heGltdW0gbWVtb3J5IHRvIGJlIHVzZWQgYnkgdGhlIGphdmFkb2MgcHJvY2Vzcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBtYXhpbXVtIG1lbW9yeSB0byBiZSB1c2VkIGJ5IHRoZSBqYXZhZG9jIHByb2Nlc3MKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJub2RlcHJlY2F0ZWQiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgdHJ1ZSwgZG8gbm90IGluY2x1ZGUgQGRlcHJlY2F0ZWQgaW5mb3JtYXRpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIElmIHRydWUsIGRvIG5vdCBpbmNsdWRlIEBkZXByZWNhdGVkIGluZm9ybWF0aW9uLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9Im5vZGVwcmVjYXRlZGxpc3QiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgdHJ1ZSwgZG8gbm90IGdlbmVyYXRlIGRlcHJlY2F0ZWQgbGlzdC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgSWYgdHJ1ZSwgZG8gbm90IGdlbmVyYXRlIGRlcHJlY2F0ZWQgbGlzdC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJub2hlbHAiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgdHJ1ZSwgZG8gbm90IGdlbmVyYXRlIGhlbHAgbGluay5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgSWYgdHJ1ZSwgZG8gbm90IGdlbmVyYXRlIGhlbHAgbGluaworICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9Im5vaW5kZXgiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgdHJ1ZSwgZG8gbm90IGdlbmVyYXRlIGluZGV4Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBJZiB0cnVlLCBkbyBub3QgZ2VuZXJhdGUgaW5kZXguCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibm9uYXZiYXIiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgdHJ1ZSwgZG8gbm90IGdlbmVyYXRlIG5hdmlnYXRpb24gYmFyLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBJZiB0cnVlLCBkbyBub3QgZ2VuZXJhdGUgbmF2aWdhdGlvbiBiYXIuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibm90cmVlIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIGRvIG5vdCBnZW5lcmF0ZSBjbGFzcyBoaWVyYXJjaHkuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIElmIHRydWUsIGRvIG5vdCBnZW5lcmF0ZSBjbGFzcyBoaWVyYXJjaHkuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ib2xkIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0luZGljYXRlIHdoZXRoZXIgSmF2YWRvYyBzaG91bGQgcHJvZHVjZSBvbGQgc3R5bGUgKEpESyAxLjEpIAorIGRvY3VtZW50YXRpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIEluZGljYXRlIHdoZXRoZXIgSmF2YWRvYyBzaG91bGQgcHJvZHVjZSBvbGQgc3R5bGUgKEpESyAxLjEpIAorIGRvY3VtZW50YXRpb24uCisKKyBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQgYnkgSkRLIDEuMSBhbmQgaGFzIGJlZW4gcGhhc2VkIG91dCBpbiBKREsgMS40CisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ib3ZlcnZpZXciIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTcGVjaWZ5IHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIG92ZXJ2aWV3IHRvIGJlIGluY2x1ZGVkIGluIHRoZSBnZW5lcmF0ZWQKKyBkb2N1bWVudGF0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTcGVjaWZ5IHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIG92ZXJ2aWV3IHRvIGJlIGluY2x1ZGVkIGluIHRoZSBnZW5lcmF0ZWQKKyBkb2N1bWVudGF0aW9uLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InBhY2thZ2UiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSW5kaWNhdGUgd2hldGhlciBvbmx5IHBhY2thZ2UsIHByb3RlY3RlZCBhbmQgcHVibGljIGNsYXNzZXMgYW5kIAorIG1lbWJlcnMgYXJlIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBzY29wZSBwcm9jZXNzZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIEluZGljYXRlIHdoZXRoZXIgb25seSBwYWNrYWdlLCBwcm90ZWN0ZWQgYW5kIHB1YmxpYyBjbGFzc2VzIGFuZCAKKyBtZW1iZXJzIGFyZSB0byBiZSBpbmNsdWRlZCBpbiB0aGUgc2NvcGUgcHJvY2Vzc2VkCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icGFja2FnZWxpc3QiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgbmFtZSBvZiBhIGZpbGUgY29udGFpbmluZyB0aGUgcGFja2FnZXMgdG8gcHJvY2Vzcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgVGhlIG5hbWUgb2YgYSBmaWxlIGNvbnRhaW5pbmcgdGhlIHBhY2thZ2VzIHRvIHByb2Nlc3MuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icGFja2FnZW5hbWVzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbUGFja2FnZSBuYW1lcyB0byBiZSBwcm9jZXNzZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCB0aGUgcGFja2FnZSBuYW1lcyB0byBiZSBwcm9jZXNzZWQuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icHJpdmF0ZSIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJbmRpY2F0ZSB3aGV0aGVyIGFsbCBjbGFzc2VzIGFuZCAKKyBtZW1iZXJzIGFyZSB0byBiZSBpbmNsdWRlZCBpbiB0aGUgc2NvcGUgcHJvY2Vzc2VkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBJbmRpY2F0ZSB3aGV0aGVyIGFsbCBjbGFzc2VzIGFuZCAKKyBtZW1iZXJzIGFyZSB0byBiZSBpbmNsdWRlZCBpbiB0aGUgc2NvcGUgcHJvY2Vzc2VkCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icHJvdGVjdGVkIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0luZGljYXRlIHdoZXRoZXIgb25seSBwcm90ZWN0ZWQgYW5kIHB1YmxpYyBjbGFzc2VzIGFuZCBtZW1iZXJzIGFyZSB0byAKKyBiZSBpbmNsdWRlZCBpbiB0aGUgc2NvcGUgcHJvY2Vzc2VkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBJbmRpY2F0ZSB3aGV0aGVyIG9ubHkgcHJvdGVjdGVkIGFuZCBwdWJsaWMgY2xhc3NlcyBhbmQgbWVtYmVycyBhcmUgdG8gCisgYmUgaW5jbHVkZWQgaW4gdGhlIHNjb3BlIHByb2Nlc3NlZAorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InB1YmxpYyIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJbmRpY2F0ZSB3aGV0aGVyIG9ubHkgcHVibGljIGNsYXNzZXMgYW5kIG1lbWJlcnMgYXJlIHRvIGJlIGluY2x1ZGVkIGluIAorIHRoZSBzY29wZSBwcm9jZXNzZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIEluZGljYXRlIHdoZXRoZXIgb25seSBwdWJsaWMgY2xhc3NlcyBhbmQgbWVtYmVycyBhcmUgdG8gYmUgaW5jbHVkZWQgaW4gCisgdGhlIHNjb3BlIHByb2Nlc3NlZAorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InNlcmlhbHdhcm4iIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgdHJ1ZSwgZ2VuZXJhdGUgd2FybmluZyBhYm91dCBAc2VyaWFsIHRhZy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgSWYgdHJ1ZSwgZ2VuZXJhdGUgd2FybmluZyBhYm91dCBAc2VyaWFsIHRhZy4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzb3VyY2UiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtFbmFibGVzIHRoZSAtc291cmNlIHN3aXRjaCwgd2lsbCBiZSBpZ25vcmVkIGlmIGphdmFkb2MgaXMgbm90CisgdGhlIDEuNCB2ZXJzaW9uIG9yIGEgZGlmZmVyZW50IGRvY2xldCB0aGFuIHRoZSBzdGFuZGFyZCBkb2NsZXQKKyBpcyB1c2VkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBFbmFibGVzIHRoZSAtc291cmNlIHN3aXRjaCwgd2lsbCBiZSBpZ25vcmVkIGlmIGphdmFkb2MgaXMgbm90CisgdGhlIDEuNCB2ZXJzaW9uIG9yIGEgZGlmZmVyZW50IGRvY2xldCB0aGFuIHRoZSBzdGFuZGFyZCBkb2NsZXQKKyBpcyB1c2VkLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InNvdXJjZWZpbGVzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTGlzdCBvZiBzb3VyY2UgZmlsZXMgdG8gcHJvY2Vzcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBsaXN0IG9mIHNvdXJjZSBmaWxlcyB0byBwcm9jZXNzLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InNvdXJjZXBhdGgiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUGF0aCIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU3BlY2lmeSB3aGVyZSB0byBmaW5kIHNvdXJjZSBmaWxlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTcGVjaWZ5IHdoZXJlIHRvIGZpbmQgc291cmNlIGZpbGUKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzb3VyY2VwYXRocmVmIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZWZlcmVuY2UiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUmVmZXJlbmNlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIGEgcmVmZXJlbmNlIHRvIGEgQ0xBU1NQQVRIIGRlZmluZWQgZWxzZXdoZXJlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBBZGRzIGEgcmVmZXJlbmNlIHRvIGEgQ0xBU1NQQVRIIGRlZmluZWQgZWxzZXdoZXJlLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InNwbGl0aW5kZXgiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbR2VuZXJhdGUgYSBzcGxpdCBpbmRleC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgR2VuZXJhdGUgYSBzcGxpdCBpbmRleAorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InN0eWxlc2hlZXRmaWxlIiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU3BlY2lmaWVzIHRoZSBDU1Mgc3R5bGVzaGVldCBmaWxlIHRvIHVzZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU3BlY2lmaWVzIHRoZSBDU1Mgc3R5bGVzaGVldCBmaWxlIHRvIHVzZS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1c2UiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbR2VuZXJhdGUgdGhlICZxdW90O3VzZSZxdW90IHBhZ2UgZm9yIGVhY2ggcGFja2FnZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgR2VuZXJhdGUgdGhlICZxdW90O3VzZSZxdW90IHBhZ2UgZm9yIGVhY2ggcGFja2FnZS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1c2VleHRlcm5hbGZpbGUiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbV29yayBhcm91bmQgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdCBieSB1c2luZyBhbiBleHRlcm5hbCBmaWxlCisgZm9yIHRoZSBzb3VyY2VmaWxlcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgV29yayBhcm91bmQgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdCBieSB1c2luZyBhbiBleHRlcm5hbCBmaWxlCisgZm9yIHRoZSBzb3VyY2VmaWxlcy4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2ZXJib3NlIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1J1biBqYXZhZG9jIGluIHZlcmJvc2UgbW9kZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgUnVuIGphdmFkb2MgaW4gdmVyYm9zZSBtb2RlCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJbmNsdWRlIHRoZSB2ZXJzaW9uIHRhZyBpbiB0aGUgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIEluY2x1ZGUgdGhlIHZlcnNpb24gdGFnIGluIHRoZSBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbi4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ3aW5kb3d0aXRsZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RpdGxlIHRvIGJlIHBsYWNlZCBpbiB0aGUgSFRNTCAmbHQ7dGl0bGUmZ3Q7IHRhZyBvZiB0aGUgCisgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCB0aGUgdGl0bGUgdG8gYmUgcGxhY2VkIGluIHRoZSBIVE1MICZsdDt0aXRsZSZndDsgdGFnIG9mIHRoZSAKKyBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbi4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgIDwvYXR0cmlidXRlcz4KKworICAgIDxlbGVtZW50cz4KKyAgICAgIDxlbGVtZW50IG5hbWU9ImJvdHRvbSIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuSmF2YWRvYy5IdG1sIgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUZXh0IHRvIGJlIHBsYWNlZCBhdCB0aGUgYm90dG9tIG9mIGVhY2ggb3V0cHV0IGZpbGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW1NldCB0aGUgdGV4dCB0byBiZSBwbGFjZWQgYXQgdGhlIGJvdHRvbSBvZiBlYWNoIG91dHB1dCBmaWxlLl1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgICA8ZWxlbWVudCBuYW1lPSJkb2N0aXRsZSIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuSmF2YWRvYy5IdG1sIgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGQgYSBkb2N1bWVudCB0aXRsZSB0byB1c2UgZm9yIHRoZSBvdmVydmlldyBwYWdlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtBZGQgYSBkb2N1bWVudCB0aXRsZSB0byB1c2UgZm9yIHRoZSBvdmVydmlldyBwYWdlLl1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgICA8ZWxlbWVudCBuYW1lPSJleGNsdWRlcGFja2FnZSIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuSmF2YWRvYy5QYWNrYWdlTmFtZSIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkIGEgcGFja2FnZSB0byBiZSBleGNsdWRlZCBmcm9tIHRoZSBqYXZhZG9jIHJ1bi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbQWRkIGEgcGFja2FnZSB0byBiZSBleGNsdWRlZCBmcm9tIHRoZSBqYXZhZG9jIHJ1bi5dXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgICAgPGVsZW1lbnQgbmFtZT0iZmlsZXNldCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldCIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZXNldCIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgYSBmaWxlc2V0Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtBZGRzIGEgZmlsZXNldC4KKworIDxwPkFsbCBpbmNsdWRlZCBmaWxlcyB3aWxsIGJlIGFkZGVkIGFzIHNvdXJjZWZpbGVzLiAgVGhlIHRhc2sKKyB3aWxsIGF1dG9tYXRpY2FsbHkgYWRkCisgPGNvZGU+aW5jbHVkZXM9JnF1b3Q7KiomIzQ3OyouamF2YSZxdW90OzwvY29kZT4gdG8gdGhlCisgZmlsZXNldC48L3A+XV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICAgIDxlbGVtZW50IG5hbWU9ImZvb3RlciIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuSmF2YWRvYy5IdG1sIgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtGb290ZXIgdGV4dCB0byBiZSBwbGFjZWQgYXQgdGhlIGJvdHRvbSBvZiBlYWNoIG91dHB1dCBmaWxlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtTZXQgdGhlIGZvb3RlciB0ZXh0IHRvIGJlIHBsYWNlZCBhdCB0aGUgYm90dG9tIG9mIGVhY2ggb3V0cHV0IGZpbGUuXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICAgIDxlbGVtZW50IG5hbWU9ImhlYWRlciIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuSmF2YWRvYy5IdG1sIgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtIZWFkZXIgdGV4dCB0byBiZSBwbGFjZWQgYXQgdGhlIHRvcCBvZiBlYWNoIG91dHB1dCBmaWxlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtTZXQgdGhlIGhlYWRlciB0ZXh0IHRvIGJlIHBsYWNlZCBhdCB0aGUgdG9wIG9mIGVhY2ggb3V0cHV0IGZpbGUuXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICAgIDxlbGVtZW50IG5hbWU9InBhY2thZ2UiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkphdmFkb2MuUGFja2FnZU5hbWUiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IiIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZCBhIHNpbmdsZSBwYWNrYWdlIHRvIGJlIHByb2Nlc3NlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbQWRkIGEgc2luZ2xlIHBhY2thZ2UgdG8gYmUgcHJvY2Vzc2VkLgorCisgSWYgdGhlIHBhY2thZ2UgbmFtZSBlbmRzIHdpdGggJnF1b3Q7LiomcXVvdDsgdGhlIEphdmFkb2MgdGFzaworIHdpbGwgZmluZCBhbmQgcHJvY2VzcyBhbGwgc3VicGFja2FnZXMuXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICAgIDxlbGVtZW50IG5hbWU9InBhY2thZ2VzZXQiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkRpclNldCIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRGlyc2V0IgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBhIHBhY2thZ2VzZXQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0FkZHMgYSBwYWNrYWdlc2V0LgorCisgPHA+QWxsIGluY2x1ZGVkIGRpcmVjdG9yaWVzIHdpbGwgYmUgdHJhbnNsYXRlZCBpbnRvIHBhY2thZ2UKKyBuYW1lcyBiZSBjb252ZXJ0aW5nIHRoZSBkaXJlY3Rvcnkgc2VwYXJhdG9yIGludG8gZG90cy48L3A+XV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICAgIDxlbGVtZW50IG5hbWU9InNvdXJjZSIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuSmF2YWRvYy5Tb3VyY2VGaWxlIgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGQgYSBzaW5nbGUgc291cmNlIGZpbGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0FkZCBhIHNpbmdsZSBzb3VyY2UgZmlsZS5dXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgICAgPGVsZW1lbnQgbmFtZT0idGFnbGV0IiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5KYXZhZG9jLkV4dGVuc2lvbkluZm8iCisgICAgICAgICAgICAgICBicmllZlR5cGU9IiIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZCBhIHRhZ2xldC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbQWRkIGEgdGFnbGV0XV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICAgIDxlbGVtZW50IG5hbWU9ImJvb3RjbGFzc3BhdGgiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IlBhdGgiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDcmVhdGUgYSBQYXRoIHRvIGJlIGNvbmZpZ3VyZWQgd2l0aCB0aGUgYm9vdCBjbGFzc3BhdGguXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0NyZWF0ZSBhIFBhdGggdG8gYmUgY29uZmlndXJlZCB3aXRoIHRoZSBib290IGNsYXNzcGF0aF1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgICA8ZWxlbWVudCBuYW1lPSJjbGFzc3BhdGgiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IlBhdGgiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDcmVhdGUgYSBQYXRoIHRvIGJlIGNvbmZpZ3VyZWQgd2l0aCB0aGUgY2xhc3NwYXRoIHRvIHVzZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbQ3JlYXRlIGEgUGF0aCB0byBiZSBjb25maWd1cmVkIHdpdGggdGhlIGNsYXNzcGF0aCB0byB1c2VdXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgICAgPGVsZW1lbnQgbmFtZT0iZG9jbGV0IiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5KYXZhZG9jLkRvY2xldEluZm8iCisgICAgICAgICAgICAgICBicmllZlR5cGU9IiIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NyZWF0ZSBhIGRvY2xldCB0byBiZSB1c2VkIGluIHRoZSBkb2N1bWVudGF0aW9uIGdlbmVyYXRpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0NyZWF0ZSBhIGRvY2xldCB0byBiZSB1c2VkIGluIHRoZSBkb2N1bWVudGF0aW9uIGdlbmVyYXRpb24uXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICAgIDxlbGVtZW50IG5hbWU9Imdyb3VwIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5KYXZhZG9jLkdyb3VwQXJndW1lbnQiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IiIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NlcGFyYXRlcyBwYWNrYWdlcyBvbiB0aGUgb3ZlcnZpZXcgcGFnZSBpbnRvIHdoYXRldmVyCisgZ3JvdXBzIHlvdSBzcGVjaWZ5LCBvbmUgZ3JvdXAgcGVyIHRhYmxlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtTZXBhcmF0ZXMgcGFja2FnZXMgb24gdGhlIG92ZXJ2aWV3IHBhZ2UgaW50byB3aGF0ZXZlcgorIGdyb3VwcyB5b3Ugc3BlY2lmeSwgb25lIGdyb3VwIHBlciB0YWJsZS5dXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgICAgPGVsZW1lbnQgbmFtZT0ibGluayIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuSmF2YWRvYy5MaW5rQXJndW1lbnQiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IiIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NyZWF0ZSBsaW5rIHRvIGphdmFkb2Mgb3V0cHV0IGF0IHRoZSBnaXZlbiBVUkwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0NyZWF0ZSBsaW5rIHRvIGphdmFkb2Mgb3V0cHV0IGF0IHRoZSBnaXZlbiBVUkwuXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICAgIDxlbGVtZW50IG5hbWU9InNvdXJjZXBhdGgiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IlBhdGgiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDcmVhdGUgYSBwYXRoIHRvIGJlIGNvbmZpZ3VyZWQgd2l0aCB0aGUgbG9jYXRpb25zIG9mIHRoZSBzb3VyY2UKKyBmaWxlcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbQ3JlYXRlIGEgcGF0aCB0byBiZSBjb25maWd1cmVkIHdpdGggdGhlIGxvY2F0aW9ucyBvZiB0aGUgc291cmNlCisgZmlsZXMuXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICAgIDxlbGVtZW50IG5hbWU9InRhZyIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuSmF2YWRvYy5UYWdBcmd1bWVudCIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ3JlYXRlcyBhbmQgYWRkcyBhIC10YWcgYXJndW1lbnQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0NyZWF0ZXMgYW5kIGFkZHMgYSAtdGFnIGFyZ3VtZW50LiBUaGlzIGlzIHVzZWQgdG8gc3BlY2lmeQorIGN1c3RvbSB0YWdzLiBUaGlzIGFyZ3VtZW50IGlzIG9ubHkgYXZhaWxhYmxlIGZvciBKYXZhRG9jIDEuNCwKKyBhbmQgd2lsbCBnZW5lcmF0ZSBhIHZlcmJvc2UgbWVzc2FnZSAoYW5kIHRoZW4gYmUgaWdub3JlZCkKKyB3aGVuIHJ1biBvbiBKYXZhIHZlcnNpb25zIGJlbG93IDEuNC5dXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgIDwvZWxlbWVudHM+CisKKyAgPC9zdHJ1Y3R1cmU+CisKKzwvdGFzaz4KKworCis8dGFzayBuYW1lPSJqYXZhaCIgY2F0ZWdvcnk9Im90aGVyIgorICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5KYXZhaCIKKyAgICAgID4KKworICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbR2VuZXJhdGVzIEpOSSBoZWFkZXIgZmlsZXMgdXNpbmcgamF2YWguXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgPGRlc2NyaXB0aW9uPgorICAgIDwhW0NEQVRBW0dlbmVyYXRlcyBKTkkgaGVhZGVyIGZpbGVzIHVzaW5nIGphdmFoLgorCisgVGhpcyB0YXNrIGNhbiB0YWtlIHRoZSBmb2xsb3dpbmcgYXJndW1lbnRzOgorIDx1bD4KKyA8bGk+Y2xhc3NuYW1lIC0gdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIGEgY2xhc3M8L2xpPgorIDxsaT5vdXRwdXRGaWxlIC0gQ29uY2F0ZW5hdGVzIHRoZSByZXN1bHRpbmcgaGVhZGVyIG9yIHNvdXJjZSBmaWxlcyBmb3IgYWxsCisgICAgIHRoZSBjbGFzc2VzIGxpc3RlZCBpbnRvIHRoaXMgZmlsZTwvbGk+CisgPGxpPmRlc3RkaXIgLSBTZXRzIHRoZSBkaXJlY3Rvcnkgd2hlcmUgamF2YWggc2F2ZXMgdGhlIGhlYWRlciBmaWxlcyBvciB0aGUKKyAgICAgc3R1YiBmaWxlczwvbGk+CisgPGxpPmNsYXNzcGF0aDwvbGk+CisgPGxpPmJvb3RjbGFzc3BhdGg8L2xpPgorIDxsaT5mb3JjZSAtIFNwZWNpZmllcyB0aGF0IG91dHB1dCBmaWxlcyBzaG91bGQgYWx3YXlzIGJlIHdyaXR0ZW4KKyhKREsxLjIgb25seSk8L2xpPgorIDxsaT5vbGQgLSBTcGVjaWZpZXMgdGhhdCBvbGQgSkRLMS4wLXN0eWxlIGhlYWRlciBmaWxlcyBzaG91bGQgYmUgZ2VuZXJhdGVkCisgICAgIChvdGhlcndpc2Ugb3V0cHV0IGZpbGUgY29udGFpbiBKTkktc3R5bGUgbmF0aXZlIG1ldGhvZAorICAgICAgZnVuY3Rpb24gcHJvdG90eXBlcykgKEpESzEuMiBvbmx5KTwvbGk+CisgPGxpPnN0dWJzIC0gZ2VuZXJhdGUgQyBkZWNsYXJhdGlvbnMgZnJvbSB0aGUgSmF2YSBvYmplY3QgZmlsZSAodXNlZCB3aXRoIG9sZCk8L2xpPgorIDxsaT52ZXJib3NlIC0gY2F1c2VzIGphdmFoIHRvIHByaW50IGEgbWVzc2FnZSB0byBzdGRvdXQgY29uY2VybmluZyB0aGUgc3RhdHVzCisgICAgIG9mIHRoZSBnZW5lcmF0ZWQgZmlsZXM8L2xpPgorIDxsaT5leHRkaXJzIC0gT3ZlcnJpZGUgbG9jYXRpb24gb2YgaW5zdGFsbGVkIGV4dGVuc2lvbnM8L2xpPgorIDwvdWw+CisgT2YgdGhlc2UgYXJndW1lbnRzLCBlaXRoZXIgPGI+b3V0cHV0RmlsZTwvYj4gb3IgPGI+ZGVzdGRpcjwvYj4gaXMgcmVxdWlyZWQsCisgYnV0IG5vdCBib3RoLiBNb3JlIHRoYW4gb25lIGNsYXNzbmFtZSBtYXkgYmUgc3BlY2lmaWVkLCB1c2luZyBhIGNvbW1hLXNlcGFyYXRlZAorIGxpc3Qgb3IgYnkgdXNpbmcgPGNvZGU+Jmx0O2NsYXNzIG5hbWU9Inh4eCImZ3Q7PC9jb2RlPiBlbGVtZW50cyB3aXRoaW4gdGhlIHRhc2suCisgPHA+CisgV2hlbiB0aGlzIHRhc2sgZXhlY3V0ZXMsIGl0IHdpbGwgZ2VuZXJhdGUgQyBoZWFkZXIgYW5kIHNvdXJjZSBmaWxlcyB0aGF0CisgYXJlIG5lZWRlZCB0byBpbXBsZW1lbnQgbmF0aXZlIG1ldGhvZHMuXV0+CisgIDwvZGVzY3JpcHRpb24+CisKKyAgPHN0cnVjdHVyZT4KKworICAgIDxhdHRyaWJ1dGVzPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJib290Y2xhc3NwYXRocmVmIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZWZlcmVuY2UiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUmVmZXJlbmNlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIGEgcmVmZXJlbmNlIHRvIGEgY2xhc3NwYXRoIGRlZmluZWQgZWxzZXdoZXJlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBBZGRzIGEgcmVmZXJlbmNlIHRvIGEgY2xhc3NwYXRoIGRlZmluZWQgZWxzZXdoZXJlLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImJvb3RjbGFzc3BhdGgiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUGF0aCIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTG9jYXRpb24gb2YgYm9vdHN0cmFwIGNsYXNzIGZpbGVzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBsb2NhdGlvbiBvZiBib290c3RyYXAgY2xhc3MgZmlsZXMuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGNsYXNzIChvciBjbGFzc2VzLCBzZXBhcmF0ZWQgYnkgY29tbWFzKS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBjbGFzcyAob3IgY2xhc3Nlcywgc2VwYXJhdGVkIGJ5IGNvbW1hcykuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NwYXRoIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlBhdGgiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBjbGFzc3BhdGggdG8gdXNlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICB0aGUgY2xhc3NwYXRoIHRvIHVzZS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc3BhdGhyZWYiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlZmVyZW5jZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJSZWZlcmVuY2UiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgYSByZWZlcmVuY2UgdG8gYSBjbGFzc3BhdGggZGVmaW5lZCBlbHNld2hlcmUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIEFkZHMgYSByZWZlcmVuY2UgdG8gYSBjbGFzc3BhdGggZGVmaW5lZCBlbHNld2hlcmUuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVzdGRpciIgdHlwZT0iamF2YS5pby5GaWxlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0Rlc3RpbmF0aW9uIGRpcmVjdG9yeSBpbnRvIHdoaWNoIHRoZSBKYXZhIHNvdXJjZQorIGZpbGVzIHNob3VsZCBiZSBjb21waWxlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgaW50byB3aGljaCB0aGUgSmF2YSBzb3VyY2UKKyBmaWxlcyBzaG91bGQgYmUgY29tcGlsZWQuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZm9yY2UiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgdHJ1ZSwgb3V0cHV0IGZpbGVzIHNob3VsZCBhbHdheXMgYmUgd3JpdHRlbiAoSkRLMS4yIG9ubHkpLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBJZiB0cnVlLCBvdXRwdXQgZmlsZXMgc2hvdWxkIGFsd2F5cyBiZSB3cml0dGVuIChKREsxLjIgb25seSkuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ib2xkIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIHNwZWNpZmllcyB0aGF0IG9sZCBKREsxLjAtc3R5bGUgaGVhZGVyIGZpbGVzIHNob3VsZCBiZQorIGdlbmVyYXRlZC4KKyAob3RoZXJ3aXNlIG91dHB1dCBmaWxlIGNvbnRhaW4gSk5JLXN0eWxlIG5hdGl2ZSBtZXRob2QgZnVuY3Rpb24gcHJvdG90eXBlcykgKEpESzEuMiBvbmx5KS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgSWYgdHJ1ZSwgc3BlY2lmaWVzIHRoYXQgb2xkIEpESzEuMC1zdHlsZSBoZWFkZXIgZmlsZXMgc2hvdWxkIGJlCisgZ2VuZXJhdGVkLgorIChvdGhlcndpc2Ugb3V0cHV0IGZpbGUgY29udGFpbiBKTkktc3R5bGUgbmF0aXZlIG1ldGhvZCBmdW5jdGlvbiBwcm90b3R5cGVzKSAoSkRLMS4yIG9ubHkpCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ib3V0cHV0ZmlsZSIgdHlwZT0iamF2YS5pby5GaWxlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NvbmNhdGVuYXRlcyB0aGUgcmVzdWx0aW5nIGhlYWRlciBvciBzb3VyY2UgZmlsZXMgZm9yIGFsbAorIHRoZSBjbGFzc2VzIGxpc3RlZCBpbnRvIHRoaXMgZmlsZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgQ29uY2F0ZW5hdGVzIHRoZSByZXN1bHRpbmcgaGVhZGVyIG9yIHNvdXJjZSBmaWxlcyBmb3IgYWxsCisgdGhlIGNsYXNzZXMgbGlzdGVkIGludG8gdGhpcyBmaWxlLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InN0dWJzIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIGdlbmVyYXRlIEMgZGVjbGFyYXRpb25zIGZyb20gdGhlIEphdmEgb2JqZWN0IGZpbGUgKHVzZWQgd2l0aCBvbGQpLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBJZiB0cnVlLCBnZW5lcmF0ZSBDIGRlY2xhcmF0aW9ucyBmcm9tIHRoZSBKYXZhIG9iamVjdCBmaWxlICh1c2VkIHdpdGggb2xkKS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2ZXJib3NlIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIGNhdXNlcyBKYXZhaCB0byBwcmludCBhIG1lc3NhZ2UgY29uY2VybmluZworIHRoZSBzdGF0dXMgb2YgdGhlIGdlbmVyYXRlZCBmaWxlcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgSWYgdHJ1ZSwgY2F1c2VzIEphdmFoIHRvIHByaW50IGEgbWVzc2FnZSBjb25jZXJuaW5nCisgdGhlIHN0YXR1cyBvZiB0aGUgZ2VuZXJhdGVkIGZpbGVzLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgPC9hdHRyaWJ1dGVzPgorCisgICAgPGVsZW1lbnRzPgorICAgICAgPGVsZW1lbnQgbmFtZT0iYm9vdGNsYXNzcGF0aCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aCIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUGF0aCIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgcGF0aCB0byBib290c3RyYXAgY2xhc3MgZmlsZXMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0FkZHMgcGF0aCB0byBib290c3RyYXAgY2xhc3MgZmlsZXMuXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICAgIDxlbGVtZW50IG5hbWU9ImNsYXNzIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5KYXZhaC5DbGFzc0FyZ3VtZW50IgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIGNsYXNzIHRvIHByb2Nlc3MuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0FkZHMgY2xhc3MgdG8gcHJvY2Vzcy5dXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgICAgPGVsZW1lbnQgbmFtZT0iY2xhc3NwYXRoIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoIgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJQYXRoIgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbUGF0aCB0byB1c2UgZm9yIGNsYXNzcGF0aC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbUGF0aCB0byB1c2UgZm9yIGNsYXNzcGF0aC5dXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgIDwvZWxlbWVudHM+CisKKyAgPC9zdHJ1Y3R1cmU+CisKKzwvdGFzaz4KKworCis8dGFzayBuYW1lPSJqZGVwZW5kIiBjYXRlZ29yeT0ib3RoZXIiCisgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmpkZXBlbmQuSkRlcGVuZFRhc2siCisgICAgICA+CisKKyAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1J1bnMgSkRlcGVuZCB0ZXN0cy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICA8ZGVzY3JpcHRpb24+CisgICAgPCFbQ0RBVEFbUnVucyBKRGVwZW5kIHRlc3RzLgorCisgPHA+SkRlcGVuZCBpcyBhIHRvb2wgdG8gZ2VuZXJhdGUgZGVzaWduIHF1YWxpdHkgbWV0cmljcyBmb3IgZWFjaCBKYXZhIHBhY2thZ2UuCisgSXQgaGFzIGJlZW4gaW5pdGlhbGx5IGNyZWF0ZWQgYnkgTWlrZSBDbGFyay4gSkRlcGVuZCBjYW4gYmUgZm91bmQgYXQgPGEKKyBocmVmPSJodHRwOi8vd3d3LmNsYXJrd2FyZS5jb20vc29mdHdhcmUvSkRlcGVuZC5odG1sIj5odHRwOi8vd3d3LmNsYXJrd2FyZS5jb20vc29mdHdhcmUvSkRlcGVuZC5odG1sPC9hPi4KKworIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIHNwYXduIGEgbmV3IEphdmEgVk0uXV0+CisgIDwvZGVzY3JpcHRpb24+CisKKyAgPHN0cnVjdHVyZT4KKworICAgIDxhdHRyaWJ1dGVzPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc3BhdGgiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUGF0aCIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ2xhc3NwYXRoIHRvIGJlIHVzZWQgZm9yIHRoaXMgY29tcGlsYXRpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCB0aGUgY2xhc3NwYXRoIHRvIGJlIHVzZWQgZm9yIHRoaXMgY29tcGlsYXRpb24uCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NwYXRocmVmIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZWZlcmVuY2UiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUmVmZXJlbmNlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIGEgcmVmZXJlbmNlIHRvIGEgY2xhc3NwYXRoIGRlZmluZWQgZWxzZXdoZXJlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBBZGRzIGEgcmVmZXJlbmNlIHRvIGEgY2xhc3NwYXRoIGRlZmluZWQgZWxzZXdoZXJlLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImRpciIgdHlwZT0iamF2YS5pby5GaWxlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBkaXJlY3RvcnkgdG8gaW52b2tlIHRoZSBWTSBpbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgVGhlIGRpcmVjdG9yeSB0byBpbnZva2UgdGhlIFZNIGluLiBJZ25vcmVkIGlmIG5vIEpWTSBpcyBmb3JrZWQuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZm9yayIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlLCBmb3JrcyBpbnRvIGEgbmV3IEpWTS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgSWYgdHJ1ZSwgZm9ya3MgaW50byBhIG5ldyBKVk0uIERlZmF1bHQ6IGZhbHNlLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImZvcm1hdCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuamRlcGVuZC5KRGVwZW5kVGFzay5Gb3JtYXRBdHRyaWJ1dGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iJnF1b3Q7eG1sJnF1b3Q7LCAmcXVvdDt0ZXh0JnF1b3Q7IiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgZm9ybWF0IHRvIHdyaXRlIHRoZSBvdXRwdXQgaW4sICJ4bWwiIG9yICJ0ZXh0Ii5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgVGhlIGZvcm1hdCB0byB3cml0ZSB0aGUgb3V0cHV0IGluLCAieG1sIiBvciAidGV4dCIuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaGFsdG9uZXJyb3IiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbV2hldGhlciBvciBub3QgdG8gaGFsdCBvbiBmYWlsdXJlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBXaGV0aGVyIG9yIG5vdCB0byBoYWx0IG9uIGZhaWx1cmUuIERlZmF1bHQ6IGZhbHNlLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9Imp2bSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBjb21tYW5kIHVzZWQgdG8gaW52b2tlIGEgZm9ya2VkIEphdmEgVmlydHVhbCBNYWNoaW5lLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBUaGUgY29tbWFuZCB1c2VkIHRvIGludm9rZSBhIGZvcmtlZCBKYXZhIFZpcnR1YWwgTWFjaGluZS4KKworIERlZmF1bHQgaXMgPHR0PmphdmE8L3R0Pi4gSWdub3JlZCBpZiBubyBKVk0gaXMgZm9ya2VkLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9Im91dHB1dGZpbGUiIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgb3V0cHV0IGZpbGUgbmFtZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgVGhlIG91dHB1dCBmaWxlIG5hbWUuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICA8L2F0dHJpYnV0ZXM+CisKKyAgICA8ZWxlbWVudHM+CisgICAgICA8ZWxlbWVudCBuYW1lPSJjbGFzc3BhdGgiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IlBhdGgiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIGEgcGF0aCB0byB0aGUgY2xhc3NwYXRoLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtBZGRzIGEgcGF0aCB0byB0aGUgY2xhc3NwYXRoLl1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgICA8ZWxlbWVudCBuYW1lPSJzb3VyY2VzcGF0aCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aCIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUGF0aCIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgYSBwYXRoIHRvIHNvdXJjZSBjb2RlIHRvIGFuYWx5emUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0FkZHMgYSBwYXRoIHRvIHNvdXJjZSBjb2RlIHRvIGFuYWx5emUuXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICA8L2VsZW1lbnRzPgorCisgIDwvc3RydWN0dXJlPgorCis8L3Rhc2s+CisKKworPHRhc2sgbmFtZT0iamp0cmVlIiBjYXRlZ29yeT0ib3RoZXIiCisgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmphdmFjYy5KSlRyZWUiCisgICAgICA+CisKKyAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1J1bnMgdGhlIEpKVHJlZSBjb21waWxlciBjb21waWxlci5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICA8ZGVzY3JpcHRpb24+CisgICAgPCFbQ0RBVEFbUnVucyB0aGUgSkpUcmVlIGNvbXBpbGVyIGNvbXBpbGVyLl1dPgorICA8L2Rlc2NyaXB0aW9uPgorCisgIDxzdHJ1Y3R1cmU+CisKKyAgICA8YXR0cmlidXRlcz4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYnVpbGRub2RlZmlsZXMiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQlVJTERfTk9ERV9GSUxFUyBncmFtbWFyIG9wdGlvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0cyB0aGUgQlVJTERfTk9ERV9GSUxFUyBncmFtbWFyIG9wdGlvbi4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJqYXZhY2Nob21lIiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBKYXZhQ0MgZGlzdHJpYnV0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBUaGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIEphdmFDQyBkaXN0cmlidXRpb24uCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibXVsdGkiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTVVMVEkgZ3JhbW1hciBvcHRpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldHMgdGhlIE1VTFRJIGdyYW1tYXIgb3B0aW9uLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9Im5vZGVkZWZhdWx0dm9pZCIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtOT0RFX0RFRkFVTFRfVk9JRCBncmFtbWFyIG9wdGlvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0cyB0aGUgTk9ERV9ERUZBVUxUX1ZPSUQgZ3JhbW1hciBvcHRpb24uCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibm9kZWZhY3RvcnkiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTk9ERV9GQUNUT1JZIGdyYW1tYXIgb3B0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXRzIHRoZSBOT0RFX0ZBQ1RPUlkgZ3JhbW1hciBvcHRpb24uCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibm9kZXBhY2thZ2UiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtOT0RFX1BBQ0tBR0UgZ3JhbW1hciBvcHRpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldHMgdGhlIE5PREVfUEFDS0FHRSBncmFtbWFyIG9wdGlvbi4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJub2RlcHJlZml4IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTk9ERV9QUkVGSVggZ3JhbW1hciBvcHRpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldHMgdGhlIE5PREVfUFJFRklYIGdyYW1tYXIgb3B0aW9uLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9Im5vZGVzY29wZWhvb2siIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTk9ERV9TQ09QRV9IT09LIGdyYW1tYXIgb3B0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXRzIHRoZSBOT0RFX1NDT1BFX0hPT0sgZ3JhbW1hciBvcHRpb24uCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibm9kZXVzZXNwYXJzZXIiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTk9ERV9VU0VTX1BBUlNFUiBncmFtbWFyIG9wdGlvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0cyB0aGUgTk9ERV9VU0VTX1BBUlNFUiBncmFtbWFyIG9wdGlvbi4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJvdXRwdXRkaXJlY3RvcnkiIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgZGlyZWN0b3J5IHRvIHdyaXRlIHRoZSBnZW5lcmF0ZWQgZmlsZSB0by5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgVGhlIGRpcmVjdG9yeSB0byB3cml0ZSB0aGUgZ2VuZXJhdGVkIGZpbGUgdG8uCisgSWYgbm90IHNldCwgdGhlIGZpbGVzIGFyZSB3cml0dGVuIHRvIHRoZSBkaXJlY3RvcnkKKyBjb250YWluaW5nIHRoZSBncmFtbWFyIGZpbGUuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3RhdGljIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NUQVRJQyBncmFtbWFyIG9wdGlvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0cyB0aGUgU1RBVElDIGdyYW1tYXIgb3B0aW9uLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InRhcmdldCIgdHlwZT0iamF2YS5pby5GaWxlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBqanRyZWUgZ3JhbW1hciBmaWxlIHRvIHByb2Nlc3MuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRoZSBqanRyZWUgZ3JhbW1hciBmaWxlIHRvIHByb2Nlc3MuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmlzaXRvciIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtWSVNJVE9SIGdyYW1tYXIgb3B0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXRzIHRoZSBWSVNJVE9SIGdyYW1tYXIgb3B0aW9uLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InZpc2l0b3JleGNlcHRpb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtWSVNJVE9SX0VYQ0VQVElPTiBncmFtbWFyIG9wdGlvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0cyB0aGUgVklTSVRPUl9FWENFUFRJT04gZ3JhbW1hciBvcHRpb24uCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICA8L2F0dHJpYnV0ZXM+CisKKyAgICA8ZWxlbWVudHM+CisgICAgPC9lbGVtZW50cz4KKworICA8L3N0cnVjdHVyZT4KKworPC90YXNrPgorCisKKzx0YXNrIG5hbWU9ImpwY292ZXJhZ2UiIGNhdGVnb3J5PSJtZXRyaWNzIgorICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5zaXRyYWthLkNvdmVyYWdlIgorICAgICAgPgorCisgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtSdW5zIFNpdHJha2EgSlByb2JlIENvdmVyYWdlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgIDxkZXNjcmlwdGlvbj4KKyAgICA8IVtDREFUQVtSdW5zIFNpdHJha2EgSlByb2JlIENvdmVyYWdlLgorCisgT3B0aW9ucyBhcmUgcHJldHR5IG51bWVyb3VzLCB5b3UnZCBiZXR0ZXIgY2hlY2sgdGhlIG1hbnVhbCBmb3IgYSBmdWxsCisgZGVzY3JpcHRpb25zIG9mIG9wdGlvbnMuIChub3QgdGhhdCBzaW1wbGUgc2luY2UgdGhleSBkaWZmZXIgZnJvbSB0aGUgb25saW5lCisgaGVscCwgZnJvbSB0aGUgdXNhZ2UgY29tbWFuZCBsaW5lIGFuZCBmcm9tIHRoZSBleGFtcGxlcy4uLikKKyA8cD4KKyBGb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiwgdmlzaXQgPGEgaHJlZj0iaHR0cDovL3d3dy5zaXRyYWthLmNvbSI+d3d3LnNpdHJha2EuY29tPC9hPl1dPgorICA8L2Rlc2NyaXB0aW9uPgorCisgIDxzdHJ1Y3R1cmU+CisKKyAgICA8YXR0cmlidXRlcz4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYXBwbGV0IiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIHJ1biBhbiBhcHBsZXQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIElmIHRydWUsIHJ1biBhbiBhcHBsZXQuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NuYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ2xhc3NuYW1lIHRvIHJ1biBhcyBzdGFuZGFsb25lIG9yIHJ1bm5lciBmb3IgZmlsZXNldHMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIGNsYXNzbmFtZSB0byBydW4gYXMgc3RhbmRhbG9uZSBvciBydW5uZXIgZm9yIGZpbGVzZXRzLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImV4aXRwcm9tcHQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUb2dnbGVzIGRpc3BsYXkgb2YgdGhlIGNvbnNvbGUgcHJvbXB0OiBhbHdheXMsIGVycm9yLCBuZXZlci5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgVG9nZ2xlcyBkaXNwbGF5IG9mIHRoZSBjb25zb2xlIHByb21wdDogYWx3YXlzLCBlcnJvciwgbmV2ZXIKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmaW5hbHNuYXBzaG90IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVHlwZSBvZiBzbmFwc2hvdCB0byBzZW5kIGF0IHByb2dyYW0gdGVybWluYXRpb246IG5vbmUsIGNvdmVyYWdlLCBhbGwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFR5cGUgb2Ygc25hcHNob3QgdG8gc2VuZCBhdCBwcm9ncmFtIHRlcm1pbmF0aW9uOiBub25lLCBjb3ZlcmFnZSwgYWxsLgorIENhbiBiZSBudWxsLCBkZWZhdWx0IHRvIG5vbmUKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJob21lIiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGRpcmVjdG9yeSB3aGVyZSBKUHJvYmUgaXMgaW5zdGFsbGVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBUaGUgZGlyZWN0b3J5IHdoZXJlIEpQcm9iZSBpcyBpbnN0YWxsZWQuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iamF2YWV4ZSIgdHlwZT0iamF2YS5pby5GaWxlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1BhdGggdG8gdGhlIGphdmEgZXhlY3V0YWJsZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgUGF0aCB0byB0aGUgamF2YSBleGVjdXRhYmxlLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InJlY29yZGZyb21zdGFydCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuc2l0cmFrYS5Db3ZlcmFnZS5SZWNvcmRmcm9tc3RhcnQiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iJnF1b3Q7Y292ZXJhZ2UmcXVvdDssICZxdW90O25vbmUmcXVvdDssICZxdW90O2FsbCZxdW90OyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbImFsbCIsICJjb3ZlcmFnZSIsICBvciAibm9uZSIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgICJhbGwiLCAiY292ZXJhZ2UiLCAgb3IgIm5vbmUiLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InNlZWRuYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2VlZCBuYW1lIGZvciBzbmFwc2hvdCBmaWxlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBzZWVkIG5hbWUgZm9yIHNuYXBzaG90IGZpbGUuIENhbiBiZSBudWxsLCBkZWZhdWx0IHRvIHNuYXAKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzbmFwc2hvdGRpciIgdHlwZT0iamF2YS5pby5GaWxlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBwYXRoIHRvIHRoZSBkaXJlY3Rvcnkgd2hlcmUgc25hcHNob3QgZmlsZXMgYXJlIHN0b3JlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgVGhlIHBhdGggdG8gdGhlIGRpcmVjdG9yeSB3aGVyZSBzbmFwc2hvdCBmaWxlcyBhcmUgc3RvcmVkLgorIENob29zZSBhIGRpcmVjdG9yeSB0aGF0IGlzIHJlYWNoYWJsZSBieSBib3RoIHRoZSByZW1vdGUKKyBhbmQgbG9jYWwgY29tcHV0ZXJzLCBhbmQgZW50ZXIgdGhlIHNhbWUgcGF0aCBvbiB0aGUgY29tbWFuZC1saW5lCisgYW5kIGluIHRoZSB2aWV3ZXIuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHJhY2tuYXRpdmVzIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIHRyYWNrIG5hdGl2ZSBtZXRob2RzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBJZiB0cnVlLCB0cmFjayBuYXRpdmUgbWV0aG9kcy4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2bSIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuc2l0cmFrYS5Db3ZlcmFnZS5KYXZhdm0iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iJnF1b3Q7amF2YTImcXVvdDssICZxdW90O2pkazExOCZxdW90OywgJnF1b3Q7amRrMTE3JnF1b3Q7IiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJbmRpY2F0ZXMgd2hpY2ggdmlydHVhbCBtYWNoaW5lIHRvIHJ1bjogImpkazExNyIsICJqZGsxMTgiIG9yICJqYXZhMiIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIEluZGljYXRlcyB3aGljaCB2aXJ0dWFsIG1hY2hpbmUgdG8gcnVuOiAiamRrMTE3IiwgImpkazExOCIgb3IgImphdmEyIi4KKyBDYW4gYmUgbnVsbCwgZGVmYXVsdCB0byAiamF2YTIiLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9Indhcm5sZXZlbCIgdHlwZT0iamF2YS5sYW5nLkludGVnZXIiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iaW50IiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTZXQgd2FybmluZyBsZXZlbCAoMC0zLCB3aGVyZSAwIGlzIHRoZSBsZWFzdCBhbW91bnQgb2Ygd2FybmluZ3MpLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgd2FybmluZyBsZXZlbCAoMC0zLCB3aGVyZSAwIGlzIHRoZSBsZWFzdCBhbW91bnQgb2Ygd2FybmluZ3MpLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9IndvcmtpbmdkaXIiIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgcGh5c2ljYWwgcGF0aCB0byB0aGUgd29ya2luZyBkaXJlY3RvcnkgZm9yIHRoZSBWTS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgVGhlIHBoeXNpY2FsIHBhdGggdG8gdGhlIHdvcmtpbmcgZGlyZWN0b3J5IGZvciB0aGUgVk0uCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICA8L2F0dHJpYnV0ZXM+CisKKyAgICA8ZWxlbWVudHM+CisgICAgICA8ZWxlbWVudCBuYW1lPSJmaWxlc2V0IiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0IgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlc2V0IgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGNsYXNzbmFtZXMgdG8gZXhlY3V0ZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbdGhlIGNsYXNzbmFtZXMgdG8gZXhlY3V0ZS5dXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgICAgPGVsZW1lbnQgbmFtZT0iYXJnIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Db21tYW5kbGluZS5Bcmd1bWVudCIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBhIGNvbW1hbmQgYXJndW1lbnQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0FkZHMgYSBjb21tYW5kIGFyZ3VtZW50Ll1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgICA8ZWxlbWVudCBuYW1lPSJjbGFzc3BhdGgiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IlBhdGgiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDbGFzc3BhdGggdG8gcnVuIHRoZSBmaWxlcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbY2xhc3NwYXRoIHRvIHJ1biB0aGUgZmlsZXMuXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICAgIDxlbGVtZW50IG5hbWU9ImZpbHRlcnMiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnNpdHJha2EuRmlsdGVycyIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRGVmaW5lcyBjbGFzcy9tZXRob2QgZmlsdGVycyBiYXNlZCBvbiBwYXR0ZXJuIG1hdGNoaW5nLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtEZWZpbmVzIGNsYXNzL21ldGhvZCBmaWx0ZXJzIGJhc2VkIG9uIHBhdHRlcm4gbWF0Y2hpbmcuCisgVGhlIHN5bnRheCBpcyBmaWx0ZXJzIGlzIHNpbWlsYXIgdG8gYSBmaWxlc2V0Ll1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgICA8ZWxlbWVudCBuYW1lPSJqdm1hcmciIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkNvbW1hbmRsaW5lLkFyZ3VtZW50IgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIGEgSlZNIGFyZ3VtZW50Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtBZGRzIGEgSlZNIGFyZ3VtZW50Ll1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgICA8ZWxlbWVudCBuYW1lPSJzb2NrZXQiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnNpdHJha2EuU29ja2V0IgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtEZWZpbmUgYSBob3N0IGFuZCBwb3J0IHRvIGNvbm5lY3QgdG8gaWYgeW91IHdhbnQgdG8gZG8KKyByZW1vdGUgdmlld2luZy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbRGVmaW5lIGEgaG9zdCBhbmQgcG9ydCB0byBjb25uZWN0IHRvIGlmIHlvdSB3YW50IHRvIGRvCisgcmVtb3RlIHZpZXdpbmcuXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICAgIDxlbGVtZW50IG5hbWU9InRyaWdnZXJzIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5zaXRyYWthLlRyaWdnZXJzIgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtEZWZpbmVzIGV2ZW50cyB0byB1c2UgZm9yIGludGVyYWN0aW5nIHdpdGggdGhlCisgY29sbGVjdGlvbiBvZiBkYXRhIHBlcmZvcm1lZCBkdXJpbmcgY292ZXJhZ2UuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0RlZmluZXMgZXZlbnRzIHRvIHVzZSBmb3IgaW50ZXJhY3Rpbmcgd2l0aCB0aGUKKyBjb2xsZWN0aW9uIG9mIGRhdGEgcGVyZm9ybWVkIGR1cmluZyBjb3ZlcmFnZS4KKworIEZvciBleGFtcGxlIHlvdSBtYXkgcnVuIGEgd2hvbGUgYXBwbGljYXRpb24gYnV0IG9ubHkgZGVjaWRlCisgdG8gY29sbGVjdCBkYXRhIG9uY2UgaXQgcmVhY2hlcyBhIGNlcnRhaW4gbWV0aG9kIGFuZCBvbmNlIGl0CisgZXhpdHMgYW5vdGhlciBvbmUuXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICA8L2VsZW1lbnRzPgorCisgIDwvc3RydWN0dXJlPgorCis8L3Rhc2s+CisKKworPHRhc2sgbmFtZT0ianBjb3ZtZXJnZSIgY2F0ZWdvcnk9Im1ldHJpY3MiCisgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnNpdHJha2EuQ292TWVyZ2UiCisgICAgICA+CisKKyAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1J1bnMgdGhlIHNuYXBzaG90IG1lcmdlIHV0aWxpdHkgZm9yIEpQcm9iZSBDb3ZlcmFnZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICA8ZGVzY3JpcHRpb24+CisgICAgPCFbQ0RBVEFbUnVucyB0aGUgc25hcHNob3QgbWVyZ2UgdXRpbGl0eSBmb3IgSlByb2JlIENvdmVyYWdlLl1dPgorICA8L2Rlc2NyaXB0aW9uPgorCisgIDxzdHJ1Y3R1cmU+CisKKyAgICA8YXR0cmlidXRlcz4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaG9tZSIgdHlwZT0iamF2YS5pby5GaWxlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBkaXJlY3Rvcnkgd2hlcmUgSlByb2JlIGlzIGluc3RhbGxlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgVGhlIGRpcmVjdG9yeSB3aGVyZSBKUHJvYmUgaXMgaW5zdGFsbGVkLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InRvZmlsZSIgdHlwZT0iamF2YS5pby5GaWxlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW091dHB1dCBzbmFwc2hvdCBmaWxlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIG91dHB1dCBzbmFwc2hvdCBmaWxlLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InZlcmJvc2UiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgdHJ1ZSwgcGVyZm9ybSB0aGUgbWVyZ2UgaW4gdmVyYm9zZSBtb2RlIGdpdmluZyBkZXRhaWxzCisgYWJvdXQgdGhlIHNuYXBzaG90IHByb2Nlc3NpbmcuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIElmIHRydWUsIHBlcmZvcm0gdGhlIG1lcmdlIGluIHZlcmJvc2UgbW9kZSBnaXZpbmcgZGV0YWlscworIGFib3V0IHRoZSBzbmFwc2hvdCBwcm9jZXNzaW5nLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgPC9hdHRyaWJ1dGVzPgorCisgICAgPGVsZW1lbnRzPgorICAgICAgPGVsZW1lbnQgbmFtZT0iZmlsZXNldCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldCIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZXNldCIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZCBhIGZpbGVzZXQgY29udGFpbmluZyB0aGUgc25hcHNob3RzIHRvIGluY2x1ZGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW2FkZCBhIGZpbGVzZXQgY29udGFpbmluZyB0aGUgc25hcHNob3RzIHRvIGluY2x1ZGUuXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICA8L2VsZW1lbnRzPgorCisgIDwvc3RydWN0dXJlPgorCis8L3Rhc2s+CisKKworPHRhc2sgbmFtZT0ianBjb3ZyZXBvcnQiIGNhdGVnb3J5PSJtZXRyaWNzIgorICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5zaXRyYWthLkNvdlJlcG9ydCIKKyAgICAgID4KKworICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbUnVucyB0aGUgSlByb2JlIENvdmVyYWdlIDMuMCBzbmFwc2hvdCBtZXJnZSB1dGlsaXR5Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgIDxkZXNjcmlwdGlvbj4KKyAgICA8IVtDREFUQVtSdW5zIHRoZSBKUHJvYmUgQ292ZXJhZ2UgMy4wIHNuYXBzaG90IG1lcmdlIHV0aWxpdHkuXV0+CisgIDwvZGVzY3JpcHRpb24+CisKKyAgPHN0cnVjdHVyZT4KKworICAgIDxhdHRyaWJ1dGVzPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmb3JtYXQiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnNpdHJha2EuQ292UmVwb3J0LlJlcG9ydEZvcm1hdCIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSImcXVvdDtodG1sJnF1b3Q7LCAmcXVvdDt0ZXh0JnF1b3Q7LCAmcXVvdDt4bWwmcXVvdDsiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0Zvcm1hdCBvZiB0aGUgcmVwb3J0OiAiaHRtbCIsICJ0ZXh0Iiwgb3IgInhtbCIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIHNldCB0aGUgZm9ybWF0IG9mIHRoZSByZXBvcnQ6ICJodG1sIiwgInRleHQiLCBvciAieG1sIgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImhvbWUiIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgZGlyZWN0b3J5IHdoZXJlIEpQcm9iZSBpcyBpbnN0YWxsZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRoZSBkaXJlY3Rvcnkgd2hlcmUgSlByb2JlIGlzIGluc3RhbGxlZC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpbmNsdWRlc291cmNlIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIGluY2x1ZGUgdGV4dCBvZiB0aGUgc291cmNlIGNvZGUgbGluZXMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIElmIHRydWUsIGluY2x1ZGUgdGV4dCBvZiB0aGUgc291cmNlIGNvZGUgbGluZXMuCisgT25seSBhcHBsaWVzIHRvIGZvcm1hdD0ieG1sIiBhbmQgdHlwZT0idmVyeWRldGFpbGVkIgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InBlcmNlbnQiIHR5cGU9ImphdmEubGFuZy5JbnRlZ2VyIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImludCIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQSBudW1lcmljIHZhbHVlIGZvciB0aGUgdGhyZXNob2xkIGZvciBwcmludGluZyBtZXRob2RzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBBIG51bWVyaWMgdmFsdWUgZm9yIHRoZSB0aHJlc2hvbGQgZm9yIHByaW50aW5nIG1ldGhvZHMuCisgTXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEwMC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzbmFwc2hvdCIgdHlwZT0iamF2YS5pby5GaWxlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBuYW1lIG9mIHRoZSBzbmFwc2hvdCBmaWxlIHRoYXQgaXMgdGhlIHNvdXJjZSB0byB0aGUgcmVwb3J0Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgc25hcHNob3QgZmlsZSB0aGF0IGlzIHRoZSBzb3VyY2UgdG8gdGhlIHJlcG9ydC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0b2ZpbGUiIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgbmFtZSBvZiB0aGUgZ2VuZXJhdGVkIG91dHB1dCBmaWxlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgZ2VuZXJhdGVkIG91dHB1dCBmaWxlLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnNpdHJha2EuQ292UmVwb3J0LlJlcG9ydFR5cGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iJnF1b3Q7ZXhlY3V0aXZlJnF1b3Q7LCAmcXVvdDtzdW1tYXJ5JnF1b3Q7LCAmcXVvdDtkZXRhaWxlZCZxdW90OywgJnF1b3Q7dmVyeWRldGFpbGVkJnF1b3Q7IiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgdHlwZSBvZiByZXBvcnQgdG8gYmUgZ2VuZXJhdGVkOiAiZXhlY3V0aXZlIiwgInN1bW1hcnkiLAorICJkZXRhaWxlZCIgb3IgInZlcnlkZXRhaWxlZCIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRoZSB0eXBlIG9mIHJlcG9ydCB0byBiZSBnZW5lcmF0ZWQ6ICJleGVjdXRpdmUiLCAic3VtbWFyeSIsCisgImRldGFpbGVkIiBvciAidmVyeWRldGFpbGVkIi4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgIDwvYXR0cmlidXRlcz4KKworICAgIDxlbGVtZW50cz4KKyAgICAgIDxlbGVtZW50IG5hbWU9InJlZmVyZW5jZSIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuc2l0cmFrYS5Db3ZSZXBvcnQuUmVmZXJlbmNlIgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIGEgc2V0IG9mIGNsYXNzZXMgd2hvc2UgY292ZXJhZ2UgaW5mb3JtYXRpb24gd2lsbCBiZQorIGNoZWNrZWQgYWdhaW5zdC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbQWRkcyBhIHNldCBvZiBjbGFzc2VzIHdob3NlIGNvdmVyYWdlIGluZm9ybWF0aW9uIHdpbGwgYmUKKyBjaGVja2VkIGFnYWluc3QuXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICAgIDxlbGVtZW50IG5hbWU9InNvdXJjZXBhdGgiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IlBhdGgiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIGEgcGF0aCB0byBzb3VyY2UgZmlsZXMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0FkZHMgYSBwYXRoIHRvIHNvdXJjZSBmaWxlcy5dXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgIDwvZWxlbWVudHM+CisKKyAgPC9zdHJ1Y3R1cmU+CisKKzwvdGFzaz4KKworCis8dGFzayBuYW1lPSJqc3BjIiBjYXRlZ29yeT0ib3RoZXIiCisgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmpzcC5Kc3BDIgorICAgICAgbWF0Y2hpbmdUYXNrPSJ0cnVlIj4KKworICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbUnVucyBhIEpTUCBjb21waWxlci5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICA8ZGVzY3JpcHRpb24+CisgICAgPCFbQ0RBVEFbUnVucyBhIEpTUCBjb21waWxlci4KKworIDxwPiBUaGlzIHRhc2sgdGFrZXMgdGhlIGdpdmVuIGpzcCBmaWxlcyBhbmQgY29tcGlsZXMgdGhlbSBpbnRvIGphdmEKKyBmaWxlcy4gSXQgaXMgdGhlbiB1cCB0byB0aGUgdXNlciB0byBjb21waWxlIHRoZSBqYXZhIGZpbGVzIGludG8gY2xhc3Nlcy4KKworIDxwPiBUaGUgdGFzayByZXF1aXJlcyB0aGUgc3JjZGlyIGFuZCBkZXN0ZGlyIGF0dHJpYnV0ZXMgdG8gYmUKKyBzZXQuIFRoaXMgVGFzayBpcyBhIE1hdGNoaW5nVGFzaywgc28gdGhlIGZpbGVzIHRvIGJlIGNvbXBpbGVkIGNhbiBiZQorIHNwZWNpZmllZCB1c2luZyBpbmNsdWRlcy9leGNsdWRlcyBhdHRyaWJ1dGVzIG9yIG5lc3RlZCBpbmNsdWRlL2V4Y2x1ZGUKKyBlbGVtZW50cy4gT3B0aW9uYWwgYXR0cmlidXRlcyBhcmUgdmVyYm9zZSAoc2V0IHRoZSB2ZXJib3NpdHkgbGV2ZWwgcGFzc2VkCisgdG8gamFzcGVyKSwgcGFja2FnZSAobmFtZSBvZiB0aGUgZGVzdGluYXRpb24gcGFja2FnZSBmb3IgZ2VuZXJhdGVkIGphdmEKKyBjbGFzc2VzIGFuZCBjbGFzc3BhdGggKHRoZSBjbGFzc3BhdGggdG8gdXNlIHdoZW4gcnVubmluZyB0aGUganNwCisgY29tcGlsZXIpLgorIDxwPiBUaGlzIHRhc2sgc3VwcG9ydHMgdGhlIG5lc3RlZCBlbGVtZW50cyBjbGFzc3BhdGggKEEgUGF0aCkgYW5kCisgY2xhc3NwYXRocmVmIChBIFJlZmVyZW5jZSkgd2hpY2ggY2FuIGJlIHVzZWQgaW4gcHJlZmVyZW5jZSB0byB0aGUKKyBhdHRyaWJ1dGUgY2xhc3NwYXRoLCBpZiB0aGUganNwIGNvbXBpbGVyIGlzIG5vdCBhbHJlYWR5IGluIHRoZSBhbnQKKyBjbGFzc3BhdGguCisKKyA8cD48aDQ+VXNhZ2U8L2g0PgorIDxwcmU+CisgJmx0O2pzcGMgc3JjZGlyPSIke2Jhc2VkaXJ9L3NyYy93YXIiCisgICAgICAgZGVzdGRpcj0iJHtiYXNlZGlyfS9nZW5zcmMiCisgICAgICAgcGFja2FnZT0iY29tLmkzc3AuanNwIgorICAgICAgIHZlcmJvc2U9IjkiJmd0OworICAgJmx0O2luY2x1ZGUgbmFtZT0iKipcLyouanNwIiAvJmd0OworICZsdDsvanNwYyZndDsKKyA8L3ByZT5dXT4KKyAgPC9kZXNjcmlwdGlvbj4KKworICA8c3RydWN0dXJlPgorCisgICAgPGF0dHJpYnV0ZXM+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzcGF0aCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aCIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJQYXRoIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDbGFzc3BhdGggdG8gYmUgdXNlZCBmb3IgdGhpcyBjb21waWxhdGlvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBjbGFzc3BhdGggdG8gYmUgdXNlZCBmb3IgdGhpcyBjb21waWxhdGlvbi4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc3BhdGhyZWYiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlZmVyZW5jZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJSZWZlcmVuY2UiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgYSByZWZlcmVuY2UgdG8gYSBjbGFzc3BhdGggZGVmaW5lZCBlbHNld2hlcmUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIEFkZHMgYSByZWZlcmVuY2UgdG8gYSBjbGFzc3BhdGggZGVmaW5lZCBlbHNld2hlcmUKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb21waWxlciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NsYXNzIG5hbWUgb2YgYSBKU1AgY29tcGlsZXIgYWRhcHRlci5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgQ2xhc3MgbmFtZSBvZiBhIEpTUCBjb21waWxlciBhZGFwdGVyLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNvbXBpbGVyY2xhc3NwYXRoIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlBhdGgiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NsYXNzcGF0aCB0byBiZSB1c2VkIHRvIGZpbmQgdGhpcyBjb21waWxlciBhZGFwdGVyLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIGNsYXNzcGF0aCB0byBiZSB1c2VkIHRvIGZpbmQgdGhpcyBjb21waWxlciBhZGFwdGVyCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVzdGRpciIgdHlwZT0iamF2YS5pby5GaWxlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0Rlc3RpbmF0aW9uIGRpcmVjdG9yeSBpbnRvIHdoaWNoIHRoZSBKU1Agc291cmNlCisgZmlsZXMgc2hvdWxkIGJlIGNvbXBpbGVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBpbnRvIHdoaWNoIHRoZSBKU1Agc291cmNlCisgZmlsZXMgc2hvdWxkIGJlIGNvbXBpbGVkLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImZhaWxvbmVycm9yIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1doZXRoZXIgb3Igbm90IHRoZSBidWlsZCBzaG91bGQgaGFsdCBpZiBjb21waWxhdGlvbiBmYWlscy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgV2hldGhlciBvciBub3QgdGhlIGJ1aWxkIHNob3VsZCBoYWx0IGlmIGNvbXBpbGF0aW9uIGZhaWxzLgorIERlZmF1bHRzIHRvIDxjb2RlPnRydWU8L2NvZGU+LgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImllcGx1Z2luIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSmF2YSBQbHVnaW4gQ0xBU1NJRCBmb3IgSW50ZXJuZXQgRXhwbG9yZXIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIEphdmEgUGx1Z2luIENMQVNTSUQgZm9yIEludGVybmV0IEV4cGxvcmVyCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibWFwcGVkIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIGdlbmVyYXRlIHNlcGFyYXRlIHdyaXRlKCkgY2FsbHMgZm9yIGVhY2ggSFRNTCBsaW5lCisgaW4gdGhlIEpTUC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgSWYgdHJ1ZSwgZ2VuZXJhdGUgc2VwYXJhdGUgd3JpdGUoKSBjYWxscyBmb3IgZWFjaCBIVE1MIGxpbmUKKyBpbiB0aGUgSlNQLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InBhY2thZ2UiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtOYW1lIG9mIHRoZSBwYWNrYWdlIHRoZSBjb21waWxlZCBqc3AgZmlsZXMgc2hvdWxkIGJlIGluLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UgdGhlIGNvbXBpbGVkIGpzcCBmaWxlcyBzaG91bGQgYmUgaW4uCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3JjZGlyIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlBhdGgiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1BhdGggZm9yIHNvdXJjZSBKU1AgZmlsZXMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFBhdGggZm9yIHNvdXJjZSBKU1AgZmlsZXMuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idXJpYmFzZSIgdHlwZT0iamF2YS5pby5GaWxlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBVUkkgY29udGV4dCBvZiByZWxhdGl2ZSBVUkkgcmVmZXJlbmNlcyBpbiB0aGUgSlNQIHBhZ2VzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBUaGUgVVJJIGNvbnRleHQgb2YgcmVsYXRpdmUgVVJJIHJlZmVyZW5jZXMgaW4gdGhlIEpTUCBwYWdlcy4KKyBJZiBpdCBkb2VzIG5vdCBleGlzdCB0aGVuIGl0IGlzIGRlcml2ZWQgZnJvbSB0aGUgbG9jYXRpb24KKyBvZiB0aGUgZmlsZSByZWxhdGl2ZSB0byB0aGUgZGVjbGFyZWQgb3IgZGVyaXZlZCB2YWx1ZSBvZiB1cmlyb290LgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InVyaXJvb3QiIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgcm9vdCBkaXJlY3RvcnkgdGhhdCB1cmkgZmlsZXMgc2hvdWxkIGJlIHJlc29sdmVkCisgIGFnYWluc3QuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRoZSByb290IGRpcmVjdG9yeSB0aGF0IHVyaSBmaWxlcyBzaG91bGQgYmUgcmVzb2x2ZWQKKyAgYWdhaW5zdC4gKERlZmF1bHQgaXMgdGhlIGRpcmVjdG9yeSBqc3BjIGlzIGludm9rZWQgZnJvbSkKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2ZXJib3NlIiB0eXBlPSJpbnQiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iaW50IiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtWZXJib3NlIGxldmVsIG9mIHRoZSBjb21waWxlci5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSB2ZXJib3NlIGxldmVsIG9mIHRoZSBjb21waWxlcgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9IndlYmluYyIgdHlwZT0iamF2YS5pby5GaWxlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW091dHB1dCBmaWxlbmFtZSBmb3IgdGhlIGZyYWN0aW9uIG9mIHdlYi54bWwgdGhhdCBsaXN0cworICBzZXJ2bGV0cy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgb3V0cHV0IGZpbGVuYW1lIGZvciB0aGUgZnJhY3Rpb24gb2Ygd2ViLnhtbCB0aGF0IGxpc3RzCisgIHNlcnZsZXRzLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9IndlYnhtbCIgdHlwZT0iamF2YS5pby5GaWxlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0ZpbGVuYW1lIGZvciB3ZWIueG1sLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBGaWxlbmFtZSBmb3Igd2ViLnhtbC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgIDwvYXR0cmlidXRlcz4KKworICAgIDxlbGVtZW50cz4KKyAgICAgIDxlbGVtZW50IG5hbWU9IndlYmFwcCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanNwLkpzcEMuV2ViQXBwUGFyYW1ldGVyIgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIGEgc2luZ2xlIHdlYmFwcC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbQWRkcyBhIHNpbmdsZSB3ZWJhcHAuXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICAgIDxlbGVtZW50IG5hbWU9ImNsYXNzcGF0aCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aCIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUGF0aCIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgYSBwYXRoIHRvIHRoZSBjbGFzc3BhdGguXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0FkZHMgYSBwYXRoIHRvIHRoZSBjbGFzc3BhdGguXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICAgIDxlbGVtZW50IG5hbWU9ImNvbXBpbGVyY2xhc3NwYXRoIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoIgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJQYXRoIgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU3VwcG9ydCBuZXN0ZWQgY29tcGlsZXIgY2xhc3NwYXRoLCB1c2VkIHRvIGxvY2F0ZSBjb21waWxlciBhZGFwdGVyLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtTdXBwb3J0IG5lc3RlZCBjb21waWxlciBjbGFzc3BhdGgsIHVzZWQgdG8gbG9jYXRlIGNvbXBpbGVyIGFkYXB0ZXJdXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgIDwvZWxlbWVudHM+CisKKyAgPC9zdHJ1Y3R1cmU+CisKKzwvdGFzaz4KKworCis8dGFzayBuYW1lPSJqdW5pdCIgY2F0ZWdvcnk9Im90aGVyIgorICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdC5KVW5pdFRhc2siCisgICAgICA+CisKKyAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1J1bnMgSlVuaXQgdGVzdHMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgPGRlc2NyaXB0aW9uPgorICAgIDwhW0NEQVRBW1J1bnMgSlVuaXQgdGVzdHMuCisKKyA8cD4gSlVuaXQgaXMgYSBmcmFtZXdvcmsgdG8gY3JlYXRlIHVuaXQgdGVzdC4gSXQgaGFzIGJlZW4gaW5pdGlhbGx5CisgY3JlYXRlZCBieSBFcmljaCBHYW1tYSBhbmQgS2VudCBCZWNrLiAgSlVuaXQgY2FuIGJlIGZvdW5kIGF0IDxhCisgaHJlZj0iaHR0cDovL3d3dy5qdW5pdC5vcmciPmh0dHA6Ly93d3cuanVuaXQub3JnPC9hPi4KKworIDxwPiA8Y29kZT5KVW5pdFRhc2s8L2NvZGU+IGNhbiBydW4gYSBzaW5nbGUgc3BlY2lmaWMKKyA8Y29kZT5KVW5pdFRlc3Q8L2NvZGU+IHVzaW5nIHRoZSA8Y29kZT50ZXN0PC9jb2RlPiBlbGVtZW50LjwvcD4KKyBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyB0YXJnZXQgPGNvZGU+PHByZT4KKyAgICZsdDt0YXJnZXQgbmFtZT0idGVzdC1pbnQtY2hhcnMiIGRlcGVuZHM9Imphci10ZXN0IiZndDsKKyAgICAgICAmbHQ7ZWNobyBtZXNzYWdlPSJ0ZXN0aW5nIGludGVybmF0aW9uYWwgY2hhcmFjdGVycyIvJmd0OworICAgICAgICZsdDtqdW5pdCBwcmludHN1bW1hcnk9Im5vIiBoYWx0b25mYWlsdXJlPSJ5ZXMiIGZvcms9ImZhbHNlIiZndDsKKyAgICAgICAgICAgJmx0O2NsYXNzcGF0aCByZWZpZD0iY2xhc3NwYXRoIi8mZ3Q7CisgICAgICAgICAgICZsdDtmb3JtYXR0ZXIgdHlwZT0icGxhaW4iIHVzZWZpbGU9ImZhbHNlIiAvJmd0OworICAgICAgICAgICAmbHQ7dGVzdCBuYW1lPSJvcmcuYXBhY2hlLmVjcy5JbnRlcm5hdGlvbmFsQ2hhclRlc3QiIC8mZ3Q7CisgICAgICAgJmx0Oy9qdW5pdCZndDsKKyAgICZsdDsvdGFyZ2V0Jmd0OworIDwvcHJlPjwvY29kZT4KKyA8cD5ydW5zIGEgc2luZ2xlIGp1bml0IHRlc3QKKyAoPGNvZGU+b3JnLmFwYWNoZS5lY3MuSW50ZXJuYXRpb25hbENoYXJUZXN0PC9jb2RlPikgaW4gdGhlIGN1cnJlbnQKKyBWTSB1c2luZyB0aGUgcGF0aCB3aXRoIGlkIDxjb2RlPmNsYXNzcGF0aDwvY29kZT4gYXMgY2xhc3NwYXRoIGFuZAorIHByZXNlbnRzIHRoZSByZXN1bHRzIGZvcm1hdHRlZCB1c2luZyB0aGUgc3RhbmRhcmQKKyA8Y29kZT5wbGFpbjwvY29kZT4gZm9ybWF0dGVyIG9uIHRoZSBjb21tYW5kIGxpbmUuPC9wPgorCisgPHA+IFRoaXMgdGFzayBjYW4gYWxzbyBydW4gYmF0Y2hlcyBvZiB0ZXN0cy4gIFRoZQorIDxjb2RlPmJhdGNodGVzdDwvY29kZT4gZWxlbWVudCBjcmVhdGVzIGEgPGNvZGU+QmF0Y2hUZXN0PC9jb2RlPgorIGJhc2VkIG9uIGEgZmlsZXNldC4gIFRoaXMgYWxsb3dzLCBmb3IgZXhhbXBsZSwgYWxsIGNsYXNzZXMgZm91bmQgaW4KKyBkaXJlY3RvcnkgdG8gYmUgcnVuIGFzIHRlc3RjYXNlcy48L3A+CisKKyA8cD5Gb3IgZXhhbXBsZSw8L3A+PGNvZGU+PHByZT4KKyAmbHQ7dGFyZ2V0IG5hbWU9InJ1bi10ZXN0cyIgZGVwZW5kcz0iZHVtcC1pbmZvLGNvbXBpbGUtdGVzdHMiIGlmPSJqdW5pdC5wcmVzZW50IiZndDsKKyAgICZsdDtqdW5pdCBwcmludHN1bW1hcnk9Im5vIiBoYWx0b25mYWlsdXJlPSJ5ZXMiIGZvcms9IiR7anVuaXQuZm9ya30iJmd0OworICAgICAmbHQ7anZtYXJnIHZhbHVlPSItY2xhc3NpYyIvJmd0OworICAgICAmbHQ7Y2xhc3NwYXRoIHJlZmlkPSJ0ZXN0cy1jbGFzc3BhdGgiLyZndDsKKyAgICAgJmx0O3N5c3Byb3BlcnR5IGtleT0iYnVpbGQudGVzdHMiIHZhbHVlPSIke2J1aWxkLnRlc3RzfSIvJmd0OworICAgICAmbHQ7Zm9ybWF0dGVyIHR5cGU9ImJyaWVmIiB1c2VmaWxlPSJmYWxzZSIgLyZndDsKKyAgICAgJmx0O2JhdGNodGVzdCZndDsKKyAgICAgICAmbHQ7ZmlsZXNldCBkaXI9IiR7dGVzdHMuZGlyfSImZ3Q7CisgICAgICAgICAmbHQ7aW5jbHVkZSBuYW1lPSIqKiYjMDQ3OypUZXN0KiIgLyZndDsKKyAgICAgICAmbHQ7L2ZpbGVzZXQmZ3Q7CisgICAgICZsdDsvYmF0Y2h0ZXN0Jmd0OworICAgJmx0Oy9qdW5pdCZndDsKKyAmbHQ7L3RhcmdldCZndDsKKyA8L3ByZT48L2NvZGU+CisgPHA+dGhpcyB0YXJnZXQgZmluZHMgYW55IGNsYXNzZXMgd2l0aCBhIDxjb2RlPnRlc3Q8L2NvZGU+IGRpcmVjdG9yeQorIGFueXdoZXJlIGluIHRoZWlyIHBhdGggKHVuZGVyIHRoZSB0b3AgPGNvZGU+JHt0ZXN0cy5kaXJ9PC9jb2RlPiwgb2YKKyBjb3Vyc2UpIGFuZCBjcmVhdGVzIDxjb2RlPkpVbml0VGVzdDwvY29kZT4ncyBmb3IgZWFjaCBvbmUuPC9wPgorCisgPHA+IE9mIGNvdXJzZSwgPGNvZGU+Jmx0O2p1bml0Jmd0OzwvY29kZT4gYW5kCisgPGNvZGU+Jmx0O2JhdGNoJmd0OzwvY29kZT4gZWxlbWVudHMgY2FuIGJlIGNvbWJpbmVkIGZvciBtb3JlCisgY29tcGxleCB0ZXN0cy4gRm9yIGFuIGV4YW1wbGUsIHNlZSB0aGUgYW50IDxjb2RlPmJ1aWxkLnhtbDwvY29kZT4KKyB0YXJnZXQgPGNvZGU+cnVuLXRlc3RzPC9jb2RlPiAodGhlIHNlY29uZCBleGFtcGxlIGlzIGFuIGVkaXRlZAorIHZlcnNpb24pLjwvcD4KKworIDxwPiBUbyBzcGF3biBhIG5ldyBKYXZhIFZNIHRvIHByZXZlbnQgaW50ZXJmZXJlbmNlcyBiZXR3ZWVuCisgZGlmZmVyZW50IHRlc3RjYXNlcywgeW91IG5lZWQgdG8gZW5hYmxlIDxjb2RlPmZvcms8L2NvZGU+LiAgQQorIG51bWJlciBvZiBhdHRyaWJ1dGVzIGFuZCBlbGVtZW50cyBhbGxvdyB5b3UgdG8gc2V0IHVwIGhvdyB0aGlzIEpWTQorIHJ1bnMuXV0+CisgIDwvZGVzY3JpcHRpb24+CisKKyAgPHN0cnVjdHVyZT4KKworICAgIDxhdHRyaWJ1dGVzPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkaXIiIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgZGlyZWN0b3J5IHRvIGludm9rZSB0aGUgVk0gaW4uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRoZSBkaXJlY3RvcnkgdG8gaW52b2tlIHRoZSBWTSBpbi4gSWdub3JlZCBpZiBubyBKVk0gaXMgZm9ya2VkLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImVycm9ycHJvcGVydHkiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtQcm9wZXJ0eSB0byBzZXQgdG8gInRydWUiIGlmIHRoZXJlIGlzIGEgZXJyb3IgaW4gYSB0ZXN0Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBQcm9wZXJ0eSB0byBzZXQgdG8gInRydWUiIGlmIHRoZXJlIGlzIGEgZXJyb3IgaW4gYSB0ZXN0LgorCisgPHA+VGhpcyBwcm9wZXJ0eSBpcyBhcHBsaWVkIG9uIGFsbCBCYXRjaFRlc3QgKGJhdGNodGVzdCkgYW5kCisgSlVuaXRUZXN0ICh0ZXN0KSwgaG93ZXZlciwgaXQgY2FuIHBvc3NpYmx5IGJlIG92ZXJyaWRlbiBieQorIHRoZWlyIG93biBwcm9wZXJ0aWVzLjwvcD4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmYWlsdXJlcHJvcGVydHkiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtQcm9wZXJ0eSB0byBzZXQgdG8gInRydWUiIGlmIHRoZXJlIGlzIGEgZmFpbHVyZSBpbiBhIHRlc3QuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFByb3BlcnR5IHRvIHNldCB0byAidHJ1ZSIgaWYgdGhlcmUgaXMgYSBmYWlsdXJlIGluIGEgdGVzdC4KKworIDxwPlRoaXMgcHJvcGVydHkgaXMgYXBwbGllZCBvbiBhbGwgQmF0Y2hUZXN0IChiYXRjaHRlc3QpIGFuZAorIEpVbml0VGVzdCAodGVzdCksIGhvd2V2ZXIsIGl0IGNhbiBwb3NzaWJseSBiZSBvdmVycmlkZW4gYnkKKyB0aGVpciBvd24gcHJvcGVydGllcy48L3A+CisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmlsdGVydHJhY2UiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgdHJ1ZSwgc21hcnRseSBmaWx0ZXIgdGhlIHN0YWNrIGZyYW1lcyBvZgorIEpVbml0IGVycm9ycyBhbmQgZmFpbHVyZXMgYmVmb3JlIHJlcG9ydGluZyB0aGVtLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBJZiB0cnVlLCBzbWFydGx5IGZpbHRlciB0aGUgc3RhY2sgZnJhbWVzIG9mCisgSlVuaXQgZXJyb3JzIGFuZCBmYWlsdXJlcyBiZWZvcmUgcmVwb3J0aW5nIHRoZW0uCisKKyA8cD5UaGlzIHByb3BlcnR5IGlzIGFwcGxpZWQgb24gYWxsIEJhdGNoVGVzdCAoYmF0Y2h0ZXN0KSBhbmQKKyBKVW5pdFRlc3QgKHRlc3QpIGhvd2V2ZXIgaXQgY2FuIHBvc3NpYmx5IGJlIG92ZXJyaWRkZW4gYnkgdGhlaXIKKyBvd24gcHJvcGVydGllcy48L3A+CisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZm9yayIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlLCBKVk0gc2hvdWxkIGJlIGZvcmtlZCBmb3IgZWFjaCB0ZXN0Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBJZiB0cnVlLCBKVk0gc2hvdWxkIGJlIGZvcmtlZCBmb3IgZWFjaCB0ZXN0LgorCisgPHA+SXQgYXZvaWRzIGludGVyZmVyZW5jZSBiZXR3ZWVuIHRlc3RjYXNlcyBhbmQgcG9zc2libHkgYXZvaWRzCisgaGFuZ2luZyB0aGUgYnVpbGQuICB0aGlzIHByb3BlcnR5IGlzIGFwcGxpZWQgb24gYWxsIEJhdGNoVGVzdAorIChiYXRjaHRlc3QpIGFuZCBKVW5pdFRlc3QgKHRlc3QpIGhvd2V2ZXIgaXQgY2FuIHBvc3NpYmx5IGJlCisgb3ZlcnJpZGRlbiBieSB0aGVpciBvd24gcHJvcGVydGllcy48L3A+CisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaGFsdG9uZXJyb3IiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgdHJ1ZSwgc3RvcCB0aGUgYnVpbGQgcHJvY2VzcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIGEgdGVzdC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgSWYgdHJ1ZSwgc3RvcCB0aGUgYnVpbGQgcHJvY2VzcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIGEgdGVzdC4KKyBUaGlzIHByb3BlcnR5IGlzIGFwcGxpZWQgb24gYWxsIEJhdGNoVGVzdCAoYmF0Y2h0ZXN0KSBhbmQgSlVuaXRUZXN0CisgKHRlc3QpIGhvd2V2ZXIgaXQgY2FuIHBvc3NpYmx5IGJlIG92ZXJyaWRkZW4gYnkgdGhlaXIgb3duCisgcHJvcGVydGllcy4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJoYWx0b25mYWlsdXJlIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIHN0b3AgdGhlIGJ1aWxkIHByb2Nlc3MgaWYgYSB0ZXN0IGZhaWxzCisgKGVycm9ycyBhcmUgY29uc2lkZXJlZCBmYWlsdXJlcyBhcyB3ZWxsKS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgSWYgdHJ1ZSwgc3RvcCB0aGUgYnVpbGQgcHJvY2VzcyBpZiBhIHRlc3QgZmFpbHMKKyAoZXJyb3JzIGFyZSBjb25zaWRlcmVkIGZhaWx1cmVzIGFzIHdlbGwpLgorIFRoaXMgcHJvcGVydHkgaXMgYXBwbGllZCBvbiBhbGwgQmF0Y2hUZXN0IChiYXRjaHRlc3QpIGFuZAorIEpVbml0VGVzdCAodGVzdCkgaG93ZXZlciBpdCBjYW4gcG9zc2libHkgYmUgb3ZlcnJpZGRlbiBieSB0aGVpcgorIG93biBwcm9wZXJ0aWVzLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImluY2x1ZGVhbnRydW50aW1lIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIGluY2x1ZGUgYW50Lmphciwgb3B0aW9uYWwuamFyIGFuZCBqdW5pdC5qYXIgaW4gdGhlIGZvcmtlZCBWTS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgSWYgdHJ1ZSwgaW5jbHVkZSBhbnQuamFyLCBvcHRpb25hbC5qYXIgYW5kIGp1bml0LmphciBpbiB0aGUgZm9ya2VkIFZNLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9Imp2bSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBjb21tYW5kIHVzZWQgdG8gaW52b2tlIHRoZSBKYXZhIFZpcnR1YWwgTWFjaGluZSwKKyBkZWZhdWx0IGlzICdqYXZhJy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgVGhlIGNvbW1hbmQgdXNlZCB0byBpbnZva2UgdGhlIEphdmEgVmlydHVhbCBNYWNoaW5lLAorIGRlZmF1bHQgaXMgJ2phdmEnLiBUaGUgY29tbWFuZCBpcyByZXNvbHZlZCBieQorIGphdmEubGFuZy5SdW50aW1lLmV4ZWMoKS4gSWdub3JlZCBpZiBmb3JrIGlzIGRpc2FibGVkLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9Im1heG1lbW9yeSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW01heGltdW0gbWVtb3J5IHRvIGJlIHVzZWQgYnkgYWxsIGZvcmtlZCBKVk1zLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIG1heGltdW0gbWVtb3J5IHRvIGJlIHVzZWQgYnkgYWxsIGZvcmtlZCBKVk1zLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9Im5ld2Vudmlyb25tZW50IiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIHVzZSBhIG5ldyBlbnZpcm9ubWVudCB3aGVuIGZvcmtlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgSWYgdHJ1ZSwgdXNlIGEgbmV3IGVudmlyb25tZW50IHdoZW4gZm9ya2VkLgorCisgPHA+V2lsbCBiZSBpZ25vcmVkIGlmIHdlIGFyZSBub3QgZm9ya2luZyBhIG5ldyBWTS48L3A+CisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icHJpbnRzdW1tYXJ5IiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdC5KVW5pdFRhc2suU3VtbWFyeUF0dHJpYnV0ZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSImcXVvdDt0cnVlJnF1b3Q7LCAmcXVvdDt5ZXMmcXVvdDssICZxdW90O2ZhbHNlJnF1b3Q7LCAmcXVvdDtubyZxdW90OywgJnF1b3Q7b24mcXVvdDssICZxdW90O29mZiZxdW90OywgJnF1b3Q7d2l0aE91dEFuZEVyciZxdW90OyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgdHJ1ZSwgcHJpbnQgb25lLWxpbmUgc3RhdGlzdGljcyBmb3IgZWFjaCB0ZXN0LCBvciAid2l0aE91dEFuZEVyciIKKyB0byBhbHNvIHNob3cgc3RhbmRhcmQgb3V0cHV0IGFuZCBlcnJvci5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgSWYgdHJ1ZSwgcHJpbnQgb25lLWxpbmUgc3RhdGlzdGljcyBmb3IgZWFjaCB0ZXN0LCBvciAid2l0aE91dEFuZEVyciIKKyB0byBhbHNvIHNob3cgc3RhbmRhcmQgb3V0cHV0IGFuZCBlcnJvci4KKworIENhbiB0YWtlIHRoZSB2YWx1ZXMgb24sIG9mZiwgYW5kIHdpdGhPdXRBbmRFcnIuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic2hvd291dHB1dCIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlLCBzZW5kIGFueSBvdXRwdXQgZ2VuZXJhdGVkIGJ5IHRlc3RzIHRvIEFudCdzIGxvZ2dpbmcgc3lzdGVtCisgYXMgd2VsbCBhcyB0byB0aGUgZm9ybWF0dGVycy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgSWYgdHJ1ZSwgc2VuZCBhbnkgb3V0cHV0IGdlbmVyYXRlZCBieSB0ZXN0cyB0byBBbnQncyBsb2dnaW5nIHN5c3RlbQorIGFzIHdlbGwgYXMgdG8gdGhlIGZvcm1hdHRlcnMuCisgQnkgZGVmYXVsdCBvbmx5IHRoZSBmb3JtYXR0ZXJzIHJlY2VpdmUgdGhlIG91dHB1dC4KKworIDxwPk91dHB1dCB3aWxsIGFsd2F5cyBiZSBwYXNzZWQgdG8gdGhlIGZvcm1hdHRlcnMgYW5kIG5vdCBieQorIHNob3duIGJ5IGRlZmF1bHQuICBUaGlzIG9wdGlvbiBzaG91bGQgZm9yIGV4YW1wbGUgYmUgc2V0IGZvcgorIHRlc3RzIHRoYXQgYXJlIGludGVyYWN0aXZlIGFuZCBwcm9tcHQgdGhlIHVzZXIgdG8gZG8KKyBzb21ldGhpbmcuPC9wPgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InRpbWVvdXQiIHR5cGU9ImphdmEubGFuZy5JbnRlZ2VyIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImludCIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGltZW91dCB2YWx1ZSAoaW4gbWlsbGlzZWNvbmRzKS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSB0aW1lb3V0IHZhbHVlIChpbiBtaWxsaXNlY29uZHMpLgorCisgPHA+SWYgdGhlIHRlc3QgaXMgcnVubmluZyBmb3IgbW9yZSB0aGFuIHRoaXMgdmFsdWUsIHRoZSB0ZXN0Cisgd2lsbCBiZSBjYW5jZWxlZC4gKHdvcmtzIG9ubHkgd2hlbiBpbiAnZm9yaycgbW9kZSkuPC9wPgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgPC9hdHRyaWJ1dGVzPgorCisgICAgPGVsZW1lbnRzPgorICAgICAgPGVsZW1lbnQgbmFtZT0iZW52IiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5FbnZpcm9ubWVudC5WYXJpYWJsZSIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZTsgdXNlZCB3aGVuIGZvcmtpbmcuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0FkZHMgYW4gZW52aXJvbm1lbnQgdmFyaWFibGU7IHVzZWQgd2hlbiBmb3JraW5nLgorCisgPHA+V2lsbCBiZSBpZ25vcmVkIGlmIHdlIGFyZSBub3QgZm9ya2luZyBhIG5ldyBWTS48L3A+XV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICAgIDxlbGVtZW50IG5hbWU9ImZvcm1hdHRlciIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXQuRm9ybWF0dGVyRWxlbWVudCIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkIGEgbmV3IGZvcm1hdHRlciB0byBhbGwgdGVzdHMgb2YgdGhpcyB0YXNrLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtBZGQgYSBuZXcgZm9ybWF0dGVyIHRvIGFsbCB0ZXN0cyBvZiB0aGlzIHRhc2suXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICAgIDxlbGVtZW50IG5hbWU9InN5c3Byb3BlcnR5IiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5FbnZpcm9ubWVudC5WYXJpYWJsZSIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBhIHN5c3RlbSBwcm9wZXJ0eSB0aGF0IHRlc3RzIGNhbiBhY2Nlc3MuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0FkZHMgYSBzeXN0ZW0gcHJvcGVydHkgdGhhdCB0ZXN0cyBjYW4gYWNjZXNzLgorIFRoaXMgbWlnaHQgYmUgdXNlZnVsIHRvIHRyYW5mZXIgQW50IHByb3BlcnRpZXMgdG8gdGhlCisgdGVzdGNhc2VzIHdoZW4gSlZNIGZvcmtpbmcgaXMgbm90IGVuYWJsZWQuXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICAgIDxlbGVtZW50IG5hbWU9InRlc3QiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0LkpVbml0VGVzdCIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkIGEgbmV3IHNpbmdsZSB0ZXN0Y2FzZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbQWRkIGEgbmV3IHNpbmdsZSB0ZXN0Y2FzZS5dXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgICAgPGVsZW1lbnQgbmFtZT0iYmF0Y2h0ZXN0IiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdC5CYXRjaFRlc3QiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IiIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgYSBzZXQgb2YgdGVzdHMgYmFzZWQgb24gcGF0dGVybiBtYXRjaGluZy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbQWRkcyBhIHNldCBvZiB0ZXN0cyBiYXNlZCBvbiBwYXR0ZXJuIG1hdGNoaW5nLl1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgICA8ZWxlbWVudCBuYW1lPSJjbGFzc3BhdGgiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IlBhdGgiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIHBhdGggdG8gY2xhc3NwYXRoIHVzZWQgZm9yIHRlc3RzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtBZGRzIHBhdGggdG8gY2xhc3NwYXRoIHVzZWQgZm9yIHRlc3RzLl1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgICA8ZWxlbWVudCBuYW1lPSJqdm1hcmciIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkNvbW1hbmRsaW5lLkFyZ3VtZW50IgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIGEgSlZNIGFyZ3VtZW50OyBpZ25vcmVkIGlmIG5vdCBmb3JraW5nLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtBZGRzIGEgSlZNIGFyZ3VtZW50OyBpZ25vcmVkIGlmIG5vdCBmb3JraW5nLl1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgPC9lbGVtZW50cz4KKworICA8L3N0cnVjdHVyZT4KKworPC90YXNrPgorCisKKzx0YXNrIG5hbWU9Imp1bml0cmVwb3J0IiBjYXRlZ29yeT0idGVzdGluZyIKKyAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXQuWE1MUmVzdWx0QWdncmVnYXRvciIKKyAgICAgID4KKworICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWdncmVnYXRlcyBhbGwgJmx0O2p1bml0Jmd0OyBYTUwgZm9ybWF0dGVyIHRlc3RzdWl0ZSBkYXRhIHVuZGVyIGEgc3BlY2lmaWMgZGlyZWN0b3J5IGFuZCB0cmFuc2Zvcm1zIHRoZSByZXN1bHRzIHZpYSBYU0xULl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgIDxkZXNjcmlwdGlvbj4KKyAgICA8IVtDREFUQVtBZ2dyZWdhdGVzIGFsbCAmbHQ7anVuaXQmZ3Q7IFhNTCBmb3JtYXR0ZXIgdGVzdHN1aXRlIGRhdGEgdW5kZXIKKyBhIHNwZWNpZmljIGRpcmVjdG9yeSBhbmQgdHJhbnNmb3JtcyB0aGUgcmVzdWx0cyB2aWEgWFNMVC4KKyBJdCBpcyBub3QgcGFydGljdWxhcnkgY2xlYW4gYnV0Cisgc2hvdWxkIGJlIGhlbHBmdWwgd2hpbGUgSSBhbSB0aGlua2luZyBhYm91dCBhbm90aGVyIHRlY2huaXF1ZS4KKworIDxwPiBUaGUgbWFpbiBwcm9ibGVtIGlzIGR1ZSB0byB0aGUgZmFjdCB0aGF0IGEgSlZNIGNhbiBiZSBmb3JrZWQgZm9yIGEgdGVzdGNhc2UKKyB0aHVzIG1ha2luZyBpdCBpbXBvc3NpYmxlIHRvIGFnZ3JlZ2F0ZSBhbGwgdGVzdGNhc2VzIHNpbmNlIHRoZSBsaXN0ZW5lciBpcworIChvYnZpb3VzbHkpIGluIHRoZSBmb3JrZWQgSlZNLiBBIHNvbHV0aW9uIGNvdWxkIGJlIHRvIHdyaXRlIGEKKyBUZXN0TGlzdGVuZXIgdGhhdCB3aWxsIHJlY2VpdmUgZXZlbnRzIGZyb20gdGhlIFRlc3RSdW5uZXIgdmlhIHNvY2tldHMuIFRoaXMKKyBpcyBJTUhPIHRoZSBzaW1wbGVzdCB3YXkgdG8gZG8gaXQgdG8gYXZvaWQgdGhpcyBmaWxlIGhhY2tpbmcgdGhpbmcuXV0+CisgIDwvZGVzY3JpcHRpb24+CisKKyAgPHN0cnVjdHVyZT4KKworICAgIDxhdHRyaWJ1dGVzPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0b2RpciIgdHlwZT0iamF2YS5pby5GaWxlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0Rlc3RpbmF0aW9uIGRpcmVjdG9yeSB3aGVyZSB0aGUgcmVzdWx0cyBzaG91bGQgYmUgd3JpdHRlbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBkZXN0aW5hdGlvbiBkaXJlY3Rvcnkgd2hlcmUgdGhlIHJlc3VsdHMgc2hvdWxkIGJlIHdyaXR0ZW4uIElmIG5vdAorIHNldCBpZiB3aWxsIHVzZSB7QGxpbmsgI0RFRkFVTFRfRElSfS4gV2hlbiBnaXZlbiBhIHJlbGF0aXZlIGRpcmVjdG9yeQorIGl0IHdpbGwgcmVzb2x2ZSBpdCBmcm9tIHRoZSBwcm9qZWN0IGRpcmVjdG9yeS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0b2ZpbGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtOYW1lIG9mIHRoZSBhZ2dyZWdlZ2F0ZWQgcmVzdWx0cyBmaWxlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIG5hbWUgb2YgdGhlIGFnZ3JlZ2VnYXRlZCByZXN1bHRzIGZpbGUuIEl0IG11c3QgYmUgcmVsYXRpdmUKKyBmcm9tIHRoZSA8dHQ+dG9kaXI8L3R0PiBhdHRyaWJ1dGUuIElmIG5vdCBzZXQgaXQgd2lsbCB1c2Uge0BsaW5rICNERUZBVUxUX0ZJTEVOQU1FfQorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgPC9hdHRyaWJ1dGVzPgorCisgICAgPGVsZW1lbnRzPgorICAgICAgPGVsZW1lbnQgbmFtZT0iZmlsZXNldCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldCIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZXNldCIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZCBhIG5ldyBmaWxlc2V0IGNvbnRhaW5pbmcgdGhlIFhNTCByZXN1bHRzIHRvIGFnZ3JlZ2F0ZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbQWRkIGEgbmV3IGZpbGVzZXQgY29udGFpbmluZyB0aGUgWE1MIHJlc3VsdHMgdG8gYWdncmVnYXRlXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICAgIDxlbGVtZW50IG5hbWU9InJlcG9ydCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXQuQWdncmVnYXRlVHJhbnNmb3JtZXIiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IiIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0dlbmVyYXRlIGEgcmVwb3J0IGJhc2VkIG9uIHRoZSBkb2N1bWVudCBjcmVhdGVkIGJ5IHRoZSBtZXJnZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbR2VuZXJhdGUgYSByZXBvcnQgYmFzZWQgb24gdGhlIGRvY3VtZW50IGNyZWF0ZWQgYnkgdGhlIG1lcmdlLl1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgPC9lbGVtZW50cz4KKworICA8L3N0cnVjdHVyZT4KKworPC90YXNrPgorCisKKzx0YXNrIG5hbWU9ImtleXN1YnN0IiBjYXRlZ29yeT0ib3RoZXIiCisgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLktleVN1YnN0IgorICAgICAgZGVwcmVjYXRlZD0idHJ1ZSIKKyAgICAgID4KKworICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbS2V5d29yZCBzdWJzdGl0dXRpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgPGRlc2NyaXB0aW9uPgorICAgIDwhW0NEQVRBW0tleXdvcmQgc3Vic3RpdHV0aW9uLiBJbnB1dCBmaWxlIGlzIHdyaXR0ZW4gdG8gb3V0cHV0IGZpbGUuCisgRG8gbm90IG1ha2UgaW5wdXQgZmlsZSBzYW1lIGFzIG91dHB1dCBmaWxlLgorIEtleXdvcmRzIGluIGlucHV0IGZpbGVzIGxvb2sgbGlrZSB0aGlzOiBAZm9vQC4gU2VlIHRoZSBkb2NzIGZvciB0aGUgCisgc2V0S2V5cyBtZXRob2QgdG8gdW5kZXJzdGFuZCBob3cgdG8gZG8gdGhlIHN1YnN0aXR1dGlvbnMuXV0+CisgIDwvZGVzY3JpcHRpb24+CisKKyAgPHN0cnVjdHVyZT4KKworICAgIDxhdHRyaWJ1dGVzPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXN0IiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRGVzdGluYXRpb24gZmlsZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBkZXN0aW5hdGlvbiBmaWxlLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImtleXMiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtLZXlzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXRzIHRoZSBrZXlzLgorRm9ybWF0IHN0cmluZyBpcyBsaWtlIHRoaXM6Cis8cD4KK25hbWU9dmFsdWUqbmFtZTI9dmFsdWUKKzxwPgorTmFtZXMgYXJlIGNhc2Ugc2Vuc2l0aXZlLgorPHA+CitVc2UgdGhlIHNldFNlcCgpIG1ldGhvZCB0byBjaGFuZ2UgdGhlICogdG8gc29tZXRoaW5nIGVsc2UKK2lmIHlvdSBuZWVkIHRvIHVzZSAqIGFzIGEgbmFtZSBvciB2YWx1ZS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzZXAiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTZXBlcmF0b3IgYmV0d2VlbiBuYW1lPXZhbHVlIGFyZ3VtZW50cworaW4gc2V0S2V5cygpLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXRzIHRoZSBzZXBlcmF0b3IgYmV0d2VlbiBuYW1lPXZhbHVlIGFyZ3VtZW50cworaW4gc2V0S2V5cygpLiBCeSBkZWZhdWx0IGl0IGlzICIqIi4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzcmMiIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTb3VyY2UgZmlsZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBzb3VyY2UgZmlsZS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgIDwvYXR0cmlidXRlcz4KKworICAgIDxlbGVtZW50cz4KKyAgICA8L2VsZW1lbnRzPgorCisgIDwvc3RydWN0dXJlPgorCis8L3Rhc2s+CisKKworPHRhc2sgbmFtZT0ibG9hZGZpbGUiIGNhdGVnb3J5PSJ1dGlsaXR5IgorICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5Mb2FkRmlsZSIKKyAgICAgID4KKworICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTG9hZCBhIGZpbGUgaW50byBhIHByb3BlcnR5XV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgPGRlc2NyaXB0aW9uPgorICAgIDwhW0NEQVRBW0xvYWQgYSBmaWxlIGludG8gYSBwcm9wZXJ0eV1dPgorICA8L2Rlc2NyaXB0aW9uPgorCisgIDxzdHJ1Y3R1cmU+CisKKyAgICA8YXR0cmlidXRlcz4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZW5jb2RpbmciIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtFbmNvZGluZyB0byB1c2UgZm9yIGlucHV0LCBkZWZhdWx0cyB0byB0aGUgcGxhdGZvcm0ncyBkZWZhdWx0CisgZW5jb2RpbmcuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIEVuY29kaW5nIHRvIHVzZSBmb3IgaW5wdXQsIGRlZmF1bHRzIHRvIHRoZSBwbGF0Zm9ybSdzIGRlZmF1bHQKKyBlbmNvZGluZy4gPHA+CisKKyBGb3IgYSBsaXN0IG9mIHBvc3NpYmxlIHZhbHVlcyBzZWUgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9qZGsvMS4yL2RvY3MvZ3VpZGUvaW50ZXJuYXQvZW5jb2RpbmcuZG9jLmh0bWwiPgorIGh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvamRrLzEuMi9kb2NzL2d1aWRlL2ludGVybmF0L2VuY29kaW5nLmRvYy5odG1sCisgPC9hPi48L3A+CisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmFpbG9uZXJyb3IiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgdHJ1ZSwgZmFpbCBvbiBsb2FkIGVycm9yLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBJZiB0cnVlLCBmYWlsIG9uIGxvYWQgZXJyb3IuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icHJvcGVydHkiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtQcm9wZXJ0eSBuYW1lIHRvIHNhdmUgdG8uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFByb3BlcnR5IG5hbWUgdG8gc2F2ZSB0by4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzcmNmaWxlIiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRmlsZSB0byBsb2FkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXRzIHRoZSBmaWxlIHRvIGxvYWQuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICA8L2F0dHJpYnV0ZXM+CisKKyAgICA8ZWxlbWVudHM+CisgICAgICA8ZWxlbWVudCBuYW1lPSJmaWx0ZXJjaGFpbiIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsdGVyQ2hhaW4iCisgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbHRlckNoYWluIgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkIHRoZSBGaWx0ZXJDaGFpbiBlbGVtZW50Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtBZGQgdGhlIEZpbHRlckNoYWluIGVsZW1lbnQuXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICA8L2VsZW1lbnRzPgorCisgIDwvc3RydWN0dXJlPgorCis8L3Rhc2s+CisKKworPHRhc2sgbmFtZT0ibG9hZHByb3BlcnRpZXMiIGNhdGVnb3J5PSJ1dGlsaXR5IgorICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5Mb2FkUHJvcGVydGllcyIKKyAgICAgID4KKworICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTG9hZCBhIGZpbGUncyBjb250ZW50cyBhcyBBbnQgcHJvcGVydGllcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICA8ZGVzY3JpcHRpb24+CisgICAgPCFbQ0RBVEFbTG9hZCBhIGZpbGUncyBjb250ZW50cyBhcyBBbnQgcHJvcGVydGllcy5dXT4KKyAgPC9kZXNjcmlwdGlvbj4KKworICA8c3RydWN0dXJlPgorCisgICAgPGF0dHJpYnV0ZXM+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InNyY2ZpbGUiIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtGaWxlIHRvIGxvYWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldHMgdGhlIGZpbGUgdG8gbG9hZC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgIDwvYXR0cmlidXRlcz4KKworICAgIDxlbGVtZW50cz4KKyAgICAgIDxlbGVtZW50IG5hbWU9ImZpbHRlcmNoYWluIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWx0ZXJDaGFpbiIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsdGVyQ2hhaW4iCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIGEgRmlsdGVyQ2hhaW4uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0FkZHMgYSBGaWx0ZXJDaGFpbi5dXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgIDwvZWxlbWVudHM+CisKKyAgPC9zdHJ1Y3R1cmU+CisKKzwvdGFzaz4KKworCis8dGFzayBuYW1lPSJtYWlsIiBjYXRlZ29yeT0ibmV0d29yayIKKyAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuZW1haWwuRW1haWxUYXNrIgorICAgICAgPgorCisgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBIHRhc2sgdG8gc2VuZCBTTVRQIGVtYWlsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgIDxkZXNjcmlwdGlvbj4KKyAgICA8IVtDREFUQVtBIHRhc2sgdG8gc2VuZCBTTVRQIGVtYWlsLiBUaGlzIGlzIGEgcmVmYWN0b3Jpbmcgb2YgdGhlIFNlbmRNYWlsIGFuZAorIE1pbWVNYWlsIHRhc2tzIHN1Y2ggdGhhdCBib3RoIGFyZSB3aXRoaW4gYSBzaW5nbGUgdGFzay5dXT4KKyAgPC9kZXNjcmlwdGlvbj4KKworICA8c3RydWN0dXJlPgorCisgICAgPGF0dHJpYnV0ZXM+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImJjY2xpc3QiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzICJiY2MiIGFkZHJlc3MgZWxlbWVudHMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIEFkZHMgImJjYyIgYWRkcmVzcyBlbGVtZW50cworICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNjbGlzdCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgImNjIiBhZGRyZXNzIGVsZW1lbnRzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBBZGRzICJjYyIgYWRkcmVzcyBlbGVtZW50cworICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImVuY29kaW5nIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5lbWFpbC5FbWFpbFRhc2suRW5jb2RpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iJnF1b3Q7YXV0byZxdW90OywgJnF1b3Q7bWltZSZxdW90OywgJnF1b3Q7dXUmcXVvdDssICZxdW90O3BsYWluJnF1b3Q7IiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBbGxvd3MgdGhlIGJ1aWxkIHdyaXRlciB0byBjaG9vc2UgdGhlIHByZWZlcnJlZCBlbmNvZGluZyBtZXRob2QuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIEFsbG93cyB0aGUgYnVpbGQgd3JpdGVyIHRvIGNob29zZSB0aGUgcHJlZmVycmVkIGVuY29kaW5nIG1ldGhvZAorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImZhaWxvbmVycm9yIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0luZGljYXRlcyB3aGV0aGVyIEJ1aWxkRXhjZXB0aW9ucyBzaG91bGQgYmUgcGFzc2VkIGJhY2sgdG8gdGhlIGNvcmUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIEluZGljYXRlcyB3aGV0aGVyIEJ1aWxkRXhjZXB0aW9ucyBzaG91bGQgYmUgcGFzc2VkIGJhY2sgdG8gdGhlIGNvcmUKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmaWxlcyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgYSBsaXN0IG9mIGZpbGVzIHRvIGJlIGF0dGFjaGVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBBZGRzIGEgbGlzdCBvZiBmaWxlcyB0byBiZSBhdHRhY2hlZAorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImZyb20iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTaG9ydGhhbmQgdG8gc2V0IHRoZSBmcm9tIGFkZHJlc3MgZWxlbWVudC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2hvcnRoYW5kIHRvIHNldCB0aGUgZnJvbSBhZGRyZXNzIGVsZW1lbnQKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpbmNsdWRlZmlsZW5hbWVzIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NldHMgSW5jbHVkZWZpbGVuYW1lcyBhdHRyaWJ1dGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldHMgSW5jbHVkZWZpbGVuYW1lcyBhdHRyaWJ1dGUKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJtYWlsaG9zdCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0hvc3QuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldHMgdGhlIGhvc3QKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJtYWlscG9ydCIgdHlwZT0iaW50IgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImludCIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTWFpbCBzZXJ2ZXIgcG9ydC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0cyB0aGUgbWFpbCBzZXJ2ZXIgcG9ydAorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9Im1lc3NhZ2UiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTaG9ydGhhbmQgbWV0aG9kIHRvIHNldCB0aGUgbWVzc2FnZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2hvcnRoYW5kIG1ldGhvZCB0byBzZXQgdGhlIG1lc3NhZ2UKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJtZXNzYWdlZmlsZSIgdHlwZT0iamF2YS5pby5GaWxlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1Nob3J0aGFuZCBtZXRob2QgdG8gc2V0IHRoZSBtZXNzYWdlIGZyb20gYSBmaWxlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTaG9ydGhhbmQgbWV0aG9kIHRvIHNldCB0aGUgbWVzc2FnZSBmcm9tIGEgZmlsZQorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9Im1lc3NhZ2VtaW1ldHlwZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1Nob3J0aGFuZCBtZXRob2QgdG8gc2V0IHR5cGUgb2YgdGhlIHRleHQgbWVzc2FnZSwgdGV4dC9wbGFpbiBieSBkZWZhdWx0CisgYnV0IHRleHQvaHRtbCBvciB0ZXh0L3htbCBpcyBxdWl0ZSBmZWFzaWJsZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2hvcnRoYW5kIG1ldGhvZCB0byBzZXQgdHlwZSBvZiB0aGUgdGV4dCBtZXNzYWdlLCB0ZXh0L3BsYWluIGJ5IGRlZmF1bHQKKyBidXQgdGV4dC9odG1sIG9yIHRleHQveG1sIGlzIHF1aXRlIGZlYXNpYmxlLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InN1YmplY3QiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTdWJqZWN0IGxpbmUgb2YgdGhlIGVtYWlsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXRzIHRoZSBzdWJqZWN0IGxpbmUgb2YgdGhlIGVtYWlsCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idG9saXN0IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyAidG8iIGFkZHJlc3MgZWxlbWVudHMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIEFkZHMgInRvIiBhZGRyZXNzIGVsZW1lbnRzCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICA8L2F0dHJpYnV0ZXM+CisKKyAgICA8ZWxlbWVudHM+CisgICAgICA8ZWxlbWVudCBuYW1lPSJiY2MiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmVtYWlsLkVtYWlsQWRkcmVzcyIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyAiYmNjIiBhZGRyZXNzIGVsZW1lbnRzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtBZGRzICJiY2MiIGFkZHJlc3MgZWxlbWVudHNdXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgICAgPGVsZW1lbnQgbmFtZT0iY2MiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmVtYWlsLkVtYWlsQWRkcmVzcyIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyAiY2MiIGFkZHJlc3MgZWxlbWVudC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbQWRkcyAiY2MiIGFkZHJlc3MgZWxlbWVudF1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgICA8ZWxlbWVudCBuYW1lPSJmaWxlc2V0IiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0IgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlc2V0IgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBhIHNldCBvZiBmaWxlcyAobmVzdGVkIGZpbGVzZXQgYXR0cmlidXRlKS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbQWRkcyBhIHNldCBvZiBmaWxlcyAobmVzdGVkIGZpbGVzZXQgYXR0cmlidXRlKS5dXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgICAgPGVsZW1lbnQgbmFtZT0iZnJvbSIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuZW1haWwuRW1haWxBZGRyZXNzIgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIGEgZnJvbSBhZGRyZXNzIGVsZW1lbnQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0FkZHMgYSBmcm9tIGFkZHJlc3MgZWxlbWVudF1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgICA8ZWxlbWVudCBuYW1lPSJtZXNzYWdlIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5lbWFpbC5NZXNzYWdlIgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGQgYSBtZXNzYWdlIGVsZW1udC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbQWRkIGEgbWVzc2FnZSBlbGVtbnRdXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgICAgPGVsZW1lbnQgbmFtZT0idG8iIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmVtYWlsLkVtYWlsQWRkcmVzcyIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBhIHRvIGFkZHJlc3MgZWxlbWVudC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbQWRkcyBhIHRvIGFkZHJlc3MgZWxlbWVudF1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgPC9lbGVtZW50cz4KKworICA8L3N0cnVjdHVyZT4KKworPC90YXNrPgorCisKKzx0YXNrIG5hbWU9Im1hbmlmZXN0IiBjYXRlZ29yeT0iamF2YSIKKyAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuTWFuaWZlc3RUYXNrIgorICAgICAgPgorCisgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDcmVhdGVzIGEgbWFuaWZlc3QgZmlsZSBmb3IgaW5jbHVzaW9uIGluIGEgSkFSLCBBbnQgdGFzayB3cmFwcGVyIGFyb3VuZF1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgIDxkZXNjcmlwdGlvbj4KKyAgICA8IVtDREFUQVtDcmVhdGVzIGEgbWFuaWZlc3QgZmlsZSBmb3IgaW5jbHVzaW9uIGluIGEgSkFSLCBBbnQgdGFzayB3cmFwcGVyCisgYXJvdW5kIHtAbGluayBNYW5pZmVzdCBNYW5pZmVzdH0uICBUaGlzIHRhc2sgY2FuIGJlIHVzZWQgdG8gd3JpdGUgYQorIE1hbmlmZXN0IGZpbGUsIG9wdGlvbmFsbHkgcmVwbGFjaW5nIG9yIHVwZGF0aW5nIGFuIGV4aXN0aW5nIGZpbGUuXV0+CisgIDwvZGVzY3JpcHRpb24+CisKKyAgPHN0cnVjdHVyZT4KKworICAgIDxhdHRyaWJ1dGVzPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmaWxlIiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIG5hbWUgb2YgdGhlIG1hbmlmZXN0IGZpbGUgdG8gY3JlYXRlL3VwZGF0ZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIG1hbmlmZXN0IGZpbGUgdG8gY3JlYXRlL3VwZGF0ZS4KKyBSZXF1aXJlZCBpZiB1c2VkIGFzIGEgdGFzay4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJtb2RlIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5NYW5pZmVzdFRhc2suTW9kZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSImcXVvdDt1cGRhdGUmcXVvdDssICZxdW90O3JlcGxhY2UmcXVvdDsiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1VwZGF0ZSBwb2xpY3k6IGVpdGhlciAidXBkYXRlIiBvciAicmVwbGFjZSI7IGRlZmF1bHQgaXMgInJlcGxhY2UiLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBVcGRhdGUgcG9saWN5OiBlaXRoZXIgInVwZGF0ZSIgb3IgInJlcGxhY2UiOyBkZWZhdWx0IGlzICJyZXBsYWNlIi4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgIDwvYXR0cmlidXRlcz4KKworICAgIDxlbGVtZW50cz4KKyAgICAgIDxlbGVtZW50IG5hbWU9ImF0dHJpYnV0ZSIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuTWFuaWZlc3QuQXR0cmlidXRlIgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGQgYW4gYXR0cmlidXRlIHRvIHRoZSBtYW5pZmVzdCAtIGl0IGlzIGFkZGVkIHRvIHRoZSBtYWluIHNlY3Rpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0FkZCBhbiBhdHRyaWJ1dGUgdG8gdGhlIG1hbmlmZXN0IC0gaXQgaXMgYWRkZWQgdG8gdGhlIG1haW4gc2VjdGlvbi5dXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgICAgPGVsZW1lbnQgbmFtZT0ic2VjdGlvbiIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuTWFuaWZlc3QuU2VjdGlvbiIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkIGEgc2VjdGlvbiB0byB0aGUgbWFuaWZlc3QuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0FkZCBhIHNlY3Rpb24gdG8gdGhlIG1hbmlmZXN0XV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICA8L2VsZW1lbnRzPgorCisgIDwvc3RydWN0dXJlPgorCis8L3Rhc2s+CisKKworPHRhc2sgbmFtZT0ibWF1ZGl0IiBjYXRlZ29yeT0ib3RoZXIiCisgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLm1ldGFtYXRhLk1BdWRpdCIKKyAgICAgID4KKworICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSW52b2tlcyB0aGUgTWV0YW1hdGEgQXVkaXQvIFdlYmdhaW4gUXVhbGl0eSBBbmFseXplciBvbiBhIHNldCBvZiBKYXZhIGZpbGVzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgIDxkZXNjcmlwdGlvbj4KKyAgICA8IVtDREFUQVtJbnZva2VzIHRoZSBNZXRhbWF0YSBBdWRpdC8gV2ViZ2FpbiBRdWFsaXR5IEFuYWx5emVyIG9uIGEgc2V0IG9mIEphdmEgZmlsZXMuCisgPHA+CisgPGk+bWF1ZGl0PC9pPiBwZXJmb3JtcyBzdGF0aWMgYW5hbHlzaXMgb2YgdGhlIEphdmEgc291cmNlIGNvZGUgYW5kIGJ5dGUgY29kZSBmaWxlcyB0byBmaW5kIGFuZCByZXBvcnQKKyBlcnJvcnMgb2Ygc3R5bGUgYW5kIHBvdGVudGlhbCBwcm9ibGVtcyByZWxhdGVkIHRvIHBlcmZvcm1hbmNlLCBtYWludGVuYW5jZSBhbmQgcm9idXN0bmVzcy4KKyAgQXMgYSBjb252ZW5pZW5jZSwgYSBzdHlsZXNoZWV0IGlzIGdpdmVuIGluIDx0dD5ldGM8L3R0PiBkaXJlY3RvcnksIHNvIHRoYXQgYW4gSFRNTCByZXBvcnQgCisgY2FuIGJlIGdlbmVyYXRlZCBmcm9tIHRoZSBYTUwgZmlsZS5dXT4KKyAgPC9kZXNjcmlwdGlvbj4KKworICA8c3RydWN0dXJlPgorCisgICAgPGF0dHJpYnV0ZXM+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImZpeCIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBdXRvbWF0aWNhbGx5IGZpeCBjZXJ0YWluIGVycm9ycyAKKyAodGhvc2UgbWFya2VkIGFzIGZpeGFibGUgaW4gdGhlIG1hbnVhbCk7Cisgb3B0aW9uYWwsIGRlZmF1bHQ9ZmFsc2UuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIEF1dG9tYXRpY2FsbHkgZml4IGNlcnRhaW4gZXJyb3JzIAorICh0aG9zZSBtYXJrZWQgYXMgZml4YWJsZSBpbiB0aGUgbWFudWFsKTsKKyBvcHRpb25hbCwgZGVmYXVsdD1mYWxzZQorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9Imxpc3QiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ3JlYXRlcyBsaXN0aW5nIGZpbGUgZm9yIGVhY2ggYXVkaXRlZCBmaWxlOyBvcHRpb25hbCwgZGVmYXVsdCBmYWxzZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgQ3JlYXRlcyBsaXN0aW5nIGZpbGUgZm9yIGVhY2ggYXVkaXRlZCBmaWxlOyBvcHRpb25hbCwgZGVmYXVsdCBmYWxzZS4gCisgV2hlbiBzZXQsIGEgLm1hdWRpdCBmaWxlIHdpbGwgYmUgZ2VuZXJhdGVkIGluIHRoZQorIHNhbWUgbG9jYXRpb24gYXMgdGhlIHNvdXJjZSBmaWxlLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9Im1heG1lbW9yeSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW01heGltdW0gbWVtb3J5IGZvciB0aGUgSlZNOyBvcHRpb25hbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBtYXhpbXVtIG1lbW9yeSBmb3IgdGhlIEpWTTsgb3B0aW9uYWwuCisgLW14IG9yIC1YbXggZGVwZW5kaW5nIG9uIFZNIHZlcnNpb24KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJtZXRhbWF0YWhvbWUiIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgaG9tZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgTWV0YW1hdGEgZGlzdHJpYnV0aW9uOyByZXF1aXJlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgVGhlIGhvbWUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIE1ldGFtYXRhIGRpc3RyaWJ1dGlvbjsgcmVxdWlyZWQKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0b2ZpbGUiIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgWE1MIGZpbGUgdG8gd2hpY2ggdGhlIEF1ZGl0IHJlc3VsdCBzaG91bGQgYmUgd3JpdHRlbiB0bzsgcmVxdWlyZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRoZSBYTUwgZmlsZSB0byB3aGljaCB0aGUgQXVkaXQgcmVzdWx0IHNob3VsZCBiZSB3cml0dGVuIHRvOyByZXF1aXJlZAorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InVudXNlZCIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtGaW5kcyBkZWNsYXJhdGlvbnMgdW51c2VkIGluIHNlYXJjaCBwYXRoczsgb3B0aW9uYWwsIGRlZmF1bHQgZmFsc2UuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIEZpbmRzIGRlY2xhcmF0aW9ucyB1bnVzZWQgaW4gc2VhcmNoIHBhdGhzOyBvcHRpb25hbCwgZGVmYXVsdCBmYWxzZS4gCisgSXQgd2lsbCBsb29rIGZvciB1bnVzZWQgZ2xvYmFsIGRlY2xhcmF0aW9ucworIGluIHRoZSBzb3VyY2UgY29kZSB3aXRoaW4gYSB1c2UgZG9tYWluIHNwZWNpZmllZCBieSB0aGUgCisgPHR0PnNlYXJjaHBhdGg8L3R0PiBlbGVtZW50LgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgPC9hdHRyaWJ1dGVzPgorCisgICAgPGVsZW1lbnRzPgorICAgICAgPGVsZW1lbnQgbmFtZT0iZmlsZXNldCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldCIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZXNldCIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBqYXZhIGZpbGVzIG9yIGRpcmVjdG9yeSB0byBhdWRpdC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbVGhlIGphdmEgZmlsZXMgb3IgZGlyZWN0b3J5IHRvIGF1ZGl0LgorIFdoYXRldmVyIHRoZSBmaWx0ZXIgaXMsIG9ubHkgdGhlIGZpbGVzIHRoYXQgZW5kIAorIHdpdGggLmphdmEgd2lsbCBiZSBpbmNsdWRlZCBmb3IgcHJvY2Vzc2luZy4gCisgTm90ZSB0aGF0IHRoZSBiYXNlIGRpcmVjdG9yeSB1c2VkIGZvciB0aGUgZmlsZXNldCAKKyBNVVNUIGJlIHRoZSByb290IG9mIHRoZSBzb3VyY2UgZmlsZXMgb3RoZXJ3aXNlIHBhY2thZ2UgbmFtZXMKKyBkZWR1Y2VkIGZyb20gdGhlIGZpbGUgcGF0aCB3aWxsIGJlIGluY29ycmVjdC5dXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgICAgPGVsZW1lbnQgbmFtZT0iY2xhc3NwYXRoIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoIgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJQYXRoIgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ2xhc3MgcGF0aCAoYWxzbyBzb3VyY2UgcGF0aCB1bmxlc3Mgb25lIGV4cGxpY2l0bHkgc2V0KS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbU2V0cyB0aGUgY2xhc3MgcGF0aCAoYWxzbyBzb3VyY2UgcGF0aCB1bmxlc3Mgb25lIGV4cGxpY2l0bHkgc2V0KS4KKyBPdmVycmlkZXMgTUVUQVBBVEgvQ0xBU1NQQVRIIGVudmlyb25tZW50IHZhcmlhYmxlcy5dXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgICAgPGVsZW1lbnQgbmFtZT0ianZtYXJnIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Db21tYW5kbGluZS5Bcmd1bWVudCIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkaXRpb25hbCBvcHRpb25hbCBwYXJhbWV0ZXJzIHRvIHBhc3MgdG8gdGhlIEpWTS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbQWRkaXRpb25hbCBvcHRpb25hbCBwYXJhbWV0ZXJzIHRvIHBhc3MgdG8gdGhlIEpWTS4gCisgWW91IGNhbiBhdm9pZCB1c2luZyB0aGUgIDxjb2RlPiZsdDtqdm1hcmcmZ3Q7PC9jb2RlPiBieSBhZGRpbmcgdGhlc2UgZW1wdHkgCisgZW50cmllcyB0byA8Y29kZT5tZXRhbWF0YS5wcm9wZXJ0aWVzPC9jb2RlPiBsb2NhdGVkIGF0IDxjb2RlPiR7bWV0YW1hdGEuaG9tZX0vYmluPC9jb2RlPgorCisgPHByZT5tZXRhbWF0YS5jbGFzc3BhdGg9CisgbWV0YW1hdGEuc291cmNlcGF0aD0KKyBtZXRhbWF0YS5iYXNlY2xhc3NwYXRoPQorIDwvcHJlPl1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgICA8ZWxlbWVudCBuYW1lPSJydWxlc3BhdGgiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IlBhdGgiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDbGFzc3BhdGggZm9yIGFkZGl0aW9uYWwgYXVkaXQgcnVsZXMKKyB0aGVzZSBtdXN0IGJlIHBsYWNlZCBiZWZvcmUgbWV0YW1hdGEuamFyICEhLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtjbGFzc3BhdGggZm9yIGFkZGl0aW9uYWwgYXVkaXQgcnVsZXMKKyB0aGVzZSBtdXN0IGJlIHBsYWNlZCBiZWZvcmUgbWV0YW1hdGEuamFyICEhXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICAgIDxlbGVtZW50IG5hbWU9InNlYXJjaHBhdGgiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IlBhdGgiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTZWFyY2ggcGF0aCB0byB1c2UgZm9yIHVudXNlZCBnbG9iYWwgZGVjbGFyYXRpb25zOyAKKyByZXF1aXJlZCB3aGVuIDx0dD51bnVzZWQ8L3R0PiBpcyBzZXQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW3NlYXJjaCBwYXRoIHRvIHVzZSBmb3IgdW51c2VkIGdsb2JhbCBkZWNsYXJhdGlvbnM7IAorIHJlcXVpcmVkIHdoZW4gPHR0PnVudXNlZDwvdHQ+IGlzIHNldC5dXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgICAgPGVsZW1lbnQgbmFtZT0ic291cmNlcGF0aCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aCIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUGF0aCIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NvdXJjZSBwYXRoLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtTZXRzIHRoZSBzb3VyY2UgcGF0aC4gCisgT3ZlcnJpZGVzIHRoZSBTT1VSQ0VQQVRIIGVudmlyb25tZW50IHZhcmlhYmxlLl1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgPC9lbGVtZW50cz4KKworICA8L3N0cnVjdHVyZT4KKworPC90YXNrPgorCisKKzx0YXNrIG5hbWU9Im1pbWVtYWlsIiBjYXRlZ29yeT0ib3RoZXIiCisgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLm5ldC5NaW1lTWFpbCIKKyAgICAgIGRlcHJlY2F0ZWQ9InRydWUiCisgICAgICA+CisKKyAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0EgdGFzayB0byBzZW5kIFNNVFAgZW1haWw7IFVzZSA8dHQ+bWFpbDwvdHQ+IGluc3RlYWRdXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICA8ZGVzY3JpcHRpb24+CisgICAgPCFbQ0RBVEFbQSB0YXNrIHRvIHNlbmQgU01UUCBlbWFpbDsgVXNlIDx0dD5tYWlsPC90dD4gaW5zdGVhZF1dPgorICA8L2Rlc2NyaXB0aW9uPgorCisgIDxzdHJ1Y3R1cmU+CisKKyAgICA8YXR0cmlidXRlcz4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYmNjbGlzdCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgImJjYyIgYWRkcmVzcyBlbGVtZW50cy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgQWRkcyAiYmNjIiBhZGRyZXNzIGVsZW1lbnRzCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2NsaXN0IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyAiY2MiIGFkZHJlc3MgZWxlbWVudHMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIEFkZHMgImNjIiBhZGRyZXNzIGVsZW1lbnRzCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZW5jb2RpbmciIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmVtYWlsLkVtYWlsVGFzay5FbmNvZGluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSImcXVvdDthdXRvJnF1b3Q7LCAmcXVvdDttaW1lJnF1b3Q7LCAmcXVvdDt1dSZxdW90OywgJnF1b3Q7cGxhaW4mcXVvdDsiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FsbG93cyB0aGUgYnVpbGQgd3JpdGVyIHRvIGNob29zZSB0aGUgcHJlZmVycmVkIGVuY29kaW5nIG1ldGhvZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgQWxsb3dzIHRoZSBidWlsZCB3cml0ZXIgdG8gY2hvb3NlIHRoZSBwcmVmZXJyZWQgZW5jb2RpbmcgbWV0aG9kCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmFpbG9uZXJyb3IiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSW5kaWNhdGVzIHdoZXRoZXIgQnVpbGRFeGNlcHRpb25zIHNob3VsZCBiZSBwYXNzZWQgYmFjayB0byB0aGUgY29yZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgSW5kaWNhdGVzIHdoZXRoZXIgQnVpbGRFeGNlcHRpb25zIHNob3VsZCBiZSBwYXNzZWQgYmFjayB0byB0aGUgY29yZQorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImZpbGVzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBhIGxpc3Qgb2YgZmlsZXMgdG8gYmUgYXR0YWNoZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIEFkZHMgYSBsaXN0IG9mIGZpbGVzIHRvIGJlIGF0dGFjaGVkCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZnJvbSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1Nob3J0aGFuZCB0byBzZXQgdGhlIGZyb20gYWRkcmVzcyBlbGVtZW50Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTaG9ydGhhbmQgdG8gc2V0IHRoZSBmcm9tIGFkZHJlc3MgZWxlbWVudAorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImluY2x1ZGVmaWxlbmFtZXMiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2V0cyBJbmNsdWRlZmlsZW5hbWVzIGF0dHJpYnV0ZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0cyBJbmNsdWRlZmlsZW5hbWVzIGF0dHJpYnV0ZQorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9Im1haWxob3N0IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSG9zdC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0cyB0aGUgaG9zdAorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9Im1haWxwb3J0IiB0eXBlPSJpbnQiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iaW50IiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtNYWlsIHNlcnZlciBwb3J0Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXRzIHRoZSBtYWlsIHNlcnZlciBwb3J0CisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibWVzc2FnZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1Nob3J0aGFuZCBtZXRob2QgdG8gc2V0IHRoZSBtZXNzYWdlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTaG9ydGhhbmQgbWV0aG9kIHRvIHNldCB0aGUgbWVzc2FnZQorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9Im1lc3NhZ2VmaWxlIiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2hvcnRoYW5kIG1ldGhvZCB0byBzZXQgdGhlIG1lc3NhZ2UgZnJvbSBhIGZpbGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNob3J0aGFuZCBtZXRob2QgdG8gc2V0IHRoZSBtZXNzYWdlIGZyb20gYSBmaWxlCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibWVzc2FnZW1pbWV0eXBlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2hvcnRoYW5kIG1ldGhvZCB0byBzZXQgdHlwZSBvZiB0aGUgdGV4dCBtZXNzYWdlLCB0ZXh0L3BsYWluIGJ5IGRlZmF1bHQKKyBidXQgdGV4dC9odG1sIG9yIHRleHQveG1sIGlzIHF1aXRlIGZlYXNpYmxlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTaG9ydGhhbmQgbWV0aG9kIHRvIHNldCB0eXBlIG9mIHRoZSB0ZXh0IG1lc3NhZ2UsIHRleHQvcGxhaW4gYnkgZGVmYXVsdAorIGJ1dCB0ZXh0L2h0bWwgb3IgdGV4dC94bWwgaXMgcXVpdGUgZmVhc2libGUuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3ViamVjdCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1N1YmplY3QgbGluZSBvZiB0aGUgZW1haWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldHMgdGhlIHN1YmplY3QgbGluZSBvZiB0aGUgZW1haWwKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0b2xpc3QiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzICJ0byIgYWRkcmVzcyBlbGVtZW50cy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgQWRkcyAidG8iIGFkZHJlc3MgZWxlbWVudHMKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgIDwvYXR0cmlidXRlcz4KKworICAgIDxlbGVtZW50cz4KKyAgICAgIDxlbGVtZW50IG5hbWU9ImJjYyIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuZW1haWwuRW1haWxBZGRyZXNzIgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzICJiY2MiIGFkZHJlc3MgZWxlbWVudHMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0FkZHMgImJjYyIgYWRkcmVzcyBlbGVtZW50c11dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgICA8ZWxlbWVudCBuYW1lPSJjYyIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuZW1haWwuRW1haWxBZGRyZXNzIgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzICJjYyIgYWRkcmVzcyBlbGVtZW50Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtBZGRzICJjYyIgYWRkcmVzcyBlbGVtZW50XV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICAgIDxlbGVtZW50IG5hbWU9ImZpbGVzZXQiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVTZXQiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGVzZXQiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIGEgc2V0IG9mIGZpbGVzIChuZXN0ZWQgZmlsZXNldCBhdHRyaWJ1dGUpLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtBZGRzIGEgc2V0IG9mIGZpbGVzIChuZXN0ZWQgZmlsZXNldCBhdHRyaWJ1dGUpLl1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgICA8ZWxlbWVudCBuYW1lPSJmcm9tIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5lbWFpbC5FbWFpbEFkZHJlc3MiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IiIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgYSBmcm9tIGFkZHJlc3MgZWxlbWVudC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbQWRkcyBhIGZyb20gYWRkcmVzcyBlbGVtZW50XV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICAgIDxlbGVtZW50IG5hbWU9Im1lc3NhZ2UiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmVtYWlsLk1lc3NhZ2UiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IiIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZCBhIG1lc3NhZ2UgZWxlbW50Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtBZGQgYSBtZXNzYWdlIGVsZW1udF1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgICA8ZWxlbWVudCBuYW1lPSJ0byIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuZW1haWwuRW1haWxBZGRyZXNzIgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIGEgdG8gYWRkcmVzcyBlbGVtZW50Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtBZGRzIGEgdG8gYWRkcmVzcyBlbGVtZW50XV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICA8L2VsZW1lbnRzPgorCisgIDwvc3RydWN0dXJlPgorCis8L3Rhc2s+CisKKworPHRhc2sgbmFtZT0ibWtkaXIiIGNhdGVnb3J5PSJmaWxlc3lzdGVtIgorICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5Na2RpciIKKyAgICAgID4KKworICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ3JlYXRlcyBhIGdpdmVuIGRpcmVjdG9yeS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICA8ZGVzY3JpcHRpb24+CisgICAgPCFbQ0RBVEFbQ3JlYXRlcyBhIGdpdmVuIGRpcmVjdG9yeS4KKyBDcmVhdGVzIGEgZGlyZWN0b3J5IGFuZCBhbnkgbm9uLWV4aXN0ZW50IHBhcmVudCBkaXJlY3Rvcmllcywgd2hlbgorIG5lY2Vzc2FyeV1dPgorICA8L2Rlc2NyaXB0aW9uPgorCisgIDxzdHJ1Y3R1cmU+CisKKyAgICA8YXR0cmlidXRlcz4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGlyIiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGRpcmVjdG9yeSB0byBjcmVhdGU7IHJlcXVpcmVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICB0aGUgZGlyZWN0b3J5IHRvIGNyZWF0ZTsgcmVxdWlyZWQuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICA8L2F0dHJpYnV0ZXM+CisKKyAgICA8ZWxlbWVudHM+CisgICAgPC9lbGVtZW50cz4KKworICA8L3N0cnVjdHVyZT4KKworPC90YXNrPgorCisKKzx0YXNrIG5hbWU9Im1tZXRyaWNzIiBjYXRlZ29yeT0ib3RoZXIiCisgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLm1ldGFtYXRhLk1NZXRyaWNzIgorICAgICAgPgorCisgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDb21wdXRlcyB0aGUgbWV0cmljcyBvZiBhIHNldCBvZiBKYXZhIGZpbGVzIGFuZCB3cml0ZSB0aGUgcmVzdWx0cyB0byBhbiBYTUwgZmlsZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICA8ZGVzY3JpcHRpb24+CisgICAgPCFbQ0RBVEFbQ29tcHV0ZXMgdGhlIG1ldHJpY3Mgb2YgYSBzZXQgb2YgSmF2YSBmaWxlcyBhbmQgd3JpdGUgdGhlIHJlc3VsdHMgdG8gYW4gWE1MCisgZmlsZS4gQXMgYSBjb252ZW5pZW5jZSwgYSBzdHlsZXNoZWV0IGlzIGdpdmVuIGluIDx0dD5ldGM8L3R0PiBkaXJlY3RvcnksCisgc28gdGhhdCBhbiBIVE1MIHJlcG9ydCBjYW4gYmUgZ2VuZXJhdGVkIGZyb20gdGhlIFhNTCBmaWxlLgorIDxwPgorIFlvdSB3aWxsIG5vdCBiZSBhYmxlIHRvIHVzZSB0aGlzIHRhc2sgd2l0aCB0aGUgZXZhbHVhdGlvbiB2ZXJzaW9uIHNpbmNlCisgYXMgb2YgTWV0YW1hdGEgMi4wLCBNZXRyaWNzIGRvZXMgbm90IHN1cHBvcnQgY29tbWFuZCBsaW5lIDotKF1dPgorICA8L2Rlc2NyaXB0aW9uPgorCisgIDxzdHJ1Y3R1cmU+CisKKyAgICA8YXR0cmlidXRlcz4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZ3JhbnVsYXJpdHkiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLm1ldGFtYXRhLk1NZXRyaWNzLkdyYW51bGFyaXR5QXR0cmlidXRlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IiZxdW90O2NvbXBpbGF0aW9uLXVuaXRzJnF1b3Q7LCAmcXVvdDtmaWxlcyZxdW90OywgJnF1b3Q7bWV0aG9kcyZxdW90OywgJnF1b3Q7dHlwZXMmcXVvdDssICZxdW90O3BhY2thZ2VzJnF1b3Q7IiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtHcmFudWxhcml0eSBvZiB0aGUgYXVkaXQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIHNldCB0aGUgZ3JhbnVsYXJpdHkgb2YgdGhlIGF1ZGl0LiBTaG91bGQgYmUgb25lIG9mICdmaWxlcycsICdtZXRob2RzJworIG9yICd0eXBlcycuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibWF4bWVtb3J5IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTWF4aW11bSBtZW1vcnkgZm9yIHRoZSBKVk07IG9wdGlvbmFsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIG1heGltdW0gbWVtb3J5IGZvciB0aGUgSlZNOyBvcHRpb25hbC4KKyAtbXggb3IgLVhteCBkZXBlbmRpbmcgb24gVk0gdmVyc2lvbgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9Im1ldGFtYXRhaG9tZSIgdHlwZT0iamF2YS5pby5GaWxlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBob21lIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBNZXRhbWF0YSBkaXN0cmlidXRpb247IHJlcXVpcmVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBUaGUgaG9tZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgTWV0YW1hdGEgZGlzdHJpYnV0aW9uOyByZXF1aXJlZAorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InRvZmlsZSIgdHlwZT0iamF2YS5pby5GaWxlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW091dHB1dCBYTUwgZmlsZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBvdXRwdXQgWE1MIGZpbGUKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgIDwvYXR0cmlidXRlcz4KKworICAgIDxlbGVtZW50cz4KKyAgICAgIDxlbGVtZW50IG5hbWU9ImZpbGVzZXQiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVTZXQiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGVzZXQiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgamF2YSBmaWxlcyBvciBkaXJlY3RvcnkgdG8gYXVkaXQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW1RoZSBqYXZhIGZpbGVzIG9yIGRpcmVjdG9yeSB0byBhdWRpdC4KKyBXaGF0ZXZlciB0aGUgZmlsdGVyIGlzLCBvbmx5IHRoZSBmaWxlcyB0aGF0IGVuZCAKKyB3aXRoIC5qYXZhIHdpbGwgYmUgaW5jbHVkZWQgZm9yIHByb2Nlc3NpbmcuIAorIE5vdGUgdGhhdCB0aGUgYmFzZSBkaXJlY3RvcnkgdXNlZCBmb3IgdGhlIGZpbGVzZXQgCisgTVVTVCBiZSB0aGUgcm9vdCBvZiB0aGUgc291cmNlIGZpbGVzIG90aGVyd2lzZSBwYWNrYWdlIG5hbWVzCisgZGVkdWNlZCBmcm9tIHRoZSBmaWxlIHBhdGggd2lsbCBiZSBpbmNvcnJlY3QuXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICAgIDxlbGVtZW50IG5hbWU9ImNsYXNzcGF0aCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aCIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUGF0aCIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NsYXNzIHBhdGggKGFsc28gc291cmNlIHBhdGggdW5sZXNzIG9uZSBleHBsaWNpdGx5IHNldCkuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW1NldHMgdGhlIGNsYXNzIHBhdGggKGFsc28gc291cmNlIHBhdGggdW5sZXNzIG9uZSBleHBsaWNpdGx5IHNldCkuCisgT3ZlcnJpZGVzIE1FVEFQQVRIL0NMQVNTUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZXMuXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICAgIDxlbGVtZW50IG5hbWU9Imp2bWFyZyIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQ29tbWFuZGxpbmUuQXJndW1lbnQiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IiIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZGl0aW9uYWwgb3B0aW9uYWwgcGFyYW1ldGVycyB0byBwYXNzIHRvIHRoZSBKVk0uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0FkZGl0aW9uYWwgb3B0aW9uYWwgcGFyYW1ldGVycyB0byBwYXNzIHRvIHRoZSBKVk0uIAorIFlvdSBjYW4gYXZvaWQgdXNpbmcgdGhlICA8Y29kZT4mbHQ7anZtYXJnJmd0OzwvY29kZT4gYnkgYWRkaW5nIHRoZXNlIGVtcHR5IAorIGVudHJpZXMgdG8gPGNvZGU+bWV0YW1hdGEucHJvcGVydGllczwvY29kZT4gbG9jYXRlZCBhdCA8Y29kZT4ke21ldGFtYXRhLmhvbWV9L2JpbjwvY29kZT4KKworIDxwcmU+bWV0YW1hdGEuY2xhc3NwYXRoPQorIG1ldGFtYXRhLnNvdXJjZXBhdGg9CisgbWV0YW1hdGEuYmFzZWNsYXNzcGF0aD0KKyA8L3ByZT5dXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgICAgPGVsZW1lbnQgbmFtZT0icGF0aCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aCIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUGF0aCIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW05ldyBwYXRoIChkaXJlY3RvcnkpIHRvIG1lYXN1cmUgbWV0cmljcyBmcm9tLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtTZXQgYSBuZXcgcGF0aCAoZGlyZWN0b3J5KSB0byBtZWFzdXJlIG1ldHJpY3MgZnJvbS5dXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgICAgPGVsZW1lbnQgbmFtZT0ic291cmNlcGF0aCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aCIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUGF0aCIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NvdXJjZSBwYXRoLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtTZXRzIHRoZSBzb3VyY2UgcGF0aC4gCisgT3ZlcnJpZGVzIHRoZSBTT1VSQ0VQQVRIIGVudmlyb25tZW50IHZhcmlhYmxlLl1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgPC9lbGVtZW50cz4KKworICA8L3N0cnVjdHVyZT4KKworPC90YXNrPgorCisKKzx0YXNrIG5hbWU9Im1vdmUiIGNhdGVnb3J5PSJmaWxlc3lzdGVtIgorICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5Nb3ZlIgorICAgICAgPgorCisgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtNb3ZlcyBhIGZpbGUgb3IgZGlyZWN0b3J5IHRvIGEgbmV3IGZpbGUgb3IgZGlyZWN0b3J5Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgIDxkZXNjcmlwdGlvbj4KKyAgICA8IVtDREFUQVtNb3ZlcyBhIGZpbGUgb3IgZGlyZWN0b3J5IHRvIGEgbmV3IGZpbGUgb3IgZGlyZWN0b3J5LgorIEJ5IGRlZmF1bHQsIHRoZQorIGRlc3RpbmF0aW9uIGZpbGUgaXMgb3ZlcndyaXR0ZW4gaWYgaXQgYWxyZWFkeSBleGlzdHMuCisgV2hlbiA8aT5vdmVyd3JpdGU8L2k+IGlzCisgdHVybmVkIG9mZiwgdGhlbiBmaWxlcyBhcmUgb25seSBtb3ZlZCBpZiB0aGUgc291cmNlIGZpbGUgaXMKKyBuZXdlciB0aGFuIHRoZSBkZXN0aW5hdGlvbiBmaWxlLCBvciB3aGVuIHRoZSBkZXN0aW5hdGlvbiBmaWxlIGRvZXMKKyBub3QgZXhpc3QuCisKKyA8cD5Tb3VyY2UgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIGFyZSBvbmx5IGRlbGV0ZWQgd2hlbiB0aGUgZmlsZSBvcgorIGRpcmVjdG9yeSBoYXMgYmVlbiBjb3BpZWQgdG8gdGhlIGRlc3RpbmF0aW9uIHN1Y2Nlc3NmdWxseS4gIEZpbHRlcmluZworIGFsc28gd29ya3MuPC9wPgorCisgPHA+VGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiBBcm5vdXQgS3VpcGVyJ3MgaW5pdGlhbCBkZXNpZ24KKyBkb2N1bWVudCwgdGhlIGZvbGxvd2luZyBtYWlsaW5nIGxpc3QgZGlzY3Vzc2lvbnMsIGFuZCB0aGUKKyBjb3B5ZmlsZS9jb3B5ZGlyIHRhc2tzLjwvcD5dXT4KKyAgPC9kZXNjcmlwdGlvbj4KKworICA8c3RydWN0dXJlPgorCisgICAgPGF0dHJpYnV0ZXM+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImVuY29kaW5nIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ2hhcmFjdGVyIGVuY29kaW5nLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXRzIHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmYWlsb25lcnJvciIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiBmYWxzZSwgbm90ZSBlcnJvcnMgdG8gdGhlIG91dHB1dCBidXQga2VlcCBnb2luZy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgSWYgZmFsc2UsIG5vdGUgZXJyb3JzIHRvIHRoZSBvdXRwdXQgYnV0IGtlZXAgZ29pbmcuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmlsZSIgdHlwZT0iamF2YS5pby5GaWxlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NpbmdsZSBzb3VyY2UgZmlsZSB0byBjb3B5Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXRzIGEgc2luZ2xlIHNvdXJjZSBmaWxlIHRvIGNvcHkuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmlsdGVyaW5nIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIGVuYWJsZXMgZmlsdGVyaW5nLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBJZiB0cnVlLCBlbmFibGVzIGZpbHRlcmluZy4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmbGF0dGVuIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1doZW4gY29weWluZyBkaXJlY3RvcnkgdHJlZXMsIHRoZSBmaWxlcyBjYW4gYmUgImZsYXR0ZW5lZCIKKyBpbnRvIGEgc2luZ2xlIGRpcmVjdG9yeS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgV2hlbiBjb3B5aW5nIGRpcmVjdG9yeSB0cmVlcywgdGhlIGZpbGVzIGNhbiBiZSAiZmxhdHRlbmVkIgorIGludG8gYSBzaW5nbGUgZGlyZWN0b3J5LiAgSWYgdGhlcmUgYXJlIG11bHRpcGxlIGZpbGVzIHdpdGgKKyB0aGUgc2FtZSBuYW1lIGluIHRoZSBzb3VyY2UgZGlyZWN0b3J5IHRyZWUsIG9ubHkgdGhlIGZpcnN0CisgZmlsZSB3aWxsIGJlIGNvcGllZCBpbnRvIHRoZSAiZmxhdHRlbmVkIiBkaXJlY3RvcnksIHVubGVzcworIHRoZSBmb3JjZW92ZXJ3cml0ZSBhdHRyaWJ1dGUgaXMgdHJ1ZS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpbmNsdWRlZW1wdHlkaXJzIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1VzZWQgdG8gY29weSBlbXB0eSBkaXJlY3Rvcmllcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgVXNlZCB0byBjb3B5IGVtcHR5IGRpcmVjdG9yaWVzLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9Im92ZXJ3cml0ZSIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtPdmVyd3JpdGUgYW55IGV4aXN0aW5nIGRlc3RpbmF0aW9uIGZpbGUocykuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIE92ZXJ3cml0ZSBhbnkgZXhpc3RpbmcgZGVzdGluYXRpb24gZmlsZShzKS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwcmVzZXJ2ZWxhc3Rtb2RpZmllZCIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtHaXZlIHRoZSBjb3BpZWQgZmlsZXMgdGhlIHNhbWUgbGFzdCBtb2RpZmllZCB0aW1lIGFzIHRoZSBvcmlnaW5hbCBmaWxlcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgR2l2ZSB0aGUgY29waWVkIGZpbGVzIHRoZSBzYW1lIGxhc3QgbW9kaWZpZWQgdGltZSBhcyB0aGUgb3JpZ2luYWwgZmlsZXMuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idG9kaXIiIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtEZXN0aW5hdGlvbiBkaXJlY3RvcnkuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldHMgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0b2ZpbGUiIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtEZXN0aW5hdGlvbiBmaWxlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXRzIHRoZSBkZXN0aW5hdGlvbiBmaWxlLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InZlcmJvc2UiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVXNlZCB0byBmb3JjZSBsaXN0aW5nIG9mIGFsbCBuYW1lcyBvZiBjb3BpZWQgZmlsZXMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFVzZWQgdG8gZm9yY2UgbGlzdGluZyBvZiBhbGwgbmFtZXMgb2YgY29waWVkIGZpbGVzLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgPC9hdHRyaWJ1dGVzPgorCisgICAgPGVsZW1lbnRzPgorICAgICAgPGVsZW1lbnQgbmFtZT0iZmlsZXNldCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldCIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZXNldCIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgYSBzZXQgb2YgZmlsZXMgdG8gY29weS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbQWRkcyBhIHNldCBvZiBmaWxlcyB0byBjb3B5Ll1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgICA8ZWxlbWVudCBuYW1lPSJmaWx0ZXJjaGFpbiIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsdGVyQ2hhaW4iCisgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbHRlckNoYWluIgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBhIEZpbHRlckNoYWluLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtBZGRzIGEgRmlsdGVyQ2hhaW4uXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICAgIDxlbGVtZW50IG5hbWU9ImZpbHRlcnNldCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsdGVyU2V0IgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWx0ZXJzZXQiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIGEgZmlsdGVyc2V0Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtBZGRzIGEgZmlsdGVyc2V0Ll1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgICA8ZWxlbWVudCBuYW1lPSJtYXBwZXIiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLk1hcHBlciIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iTWFwcGVyIgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRGVmaW5lcyB0aGUgbWFwcGVyIHRvIG1hcCBzb3VyY2UgdG8gZGVzdGluYXRpb24gZmlsZXMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0RlZmluZXMgdGhlIG1hcHBlciB0byBtYXAgc291cmNlIHRvIGRlc3RpbmF0aW9uIGZpbGVzLl1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgPC9lbGVtZW50cz4KKworICA8L3N0cnVjdHVyZT4KKworPC90YXNrPgorCisKKzx0YXNrIG5hbWU9Im1wYXJzZSIgY2F0ZWdvcnk9Im90aGVyIgorICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5tZXRhbWF0YS5NUGFyc2UiCisgICAgICA+CisKKyAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NpbXBsZSBNZXRhbWF0YSBNUGFyc2UgdGFzay5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICA8ZGVzY3JpcHRpb24+CisgICAgPCFbQ0RBVEFbU2ltcGxlIE1ldGFtYXRhIE1QYXJzZSB0YXNrLgorIEJhc2VkIG9uIHRoZSBvcmlnaW5hbCB3cml0dGVuIGJ5CisgPGEgaHJlZj0ibWFpbHRvOnRob21hcy5oYWFzQHNvZnR3aXJlZC1pbmMuY29tIj5UaG9tYXMgSGFhczwvYT4uCisgVGhpcyB2ZXJzaW9uIHdhcyB3cml0dGVuIGZvciBNZXRhbWF0YSAyLjAgYXZhaWxhYmxlIGF0CisgPGEgaHJlZj0iaHR0cDovL3d3dy5tZXRhbWF0YS5jb20iPmh0dHA6Ly93d3cubWV0YW1hdGEuY29tPC9hPl1dPgorICA8L2Rlc2NyaXB0aW9uPgorCisgIDxzdHJ1Y3R1cmU+CisKKyAgICA8YXR0cmlidXRlcz4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xlYW51cCIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtSZW1vdmUgdGhlIGludGVybWVkaWF0ZSBTdW4gSmF2YUNDIGZpbGUgCisgOyBvcHRpb25hbCwgZGVmYXVsdCBmYWxzZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgUmVtb3ZlIHRoZSBpbnRlcm1lZGlhdGUgU3VuIEphdmFDQyBmaWxlIAorIDsgb3B0aW9uYWwsIGRlZmF1bHQgZmFsc2UuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVidWdwYXJzZXIiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2V0IHBhcnNlciBkZWJ1ZyBtb2RlOyBvcHRpb25hbCwgZGVmYXVsdCBmYWxzZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgc2V0IHBhcnNlciBkZWJ1ZyBtb2RlOyBvcHRpb25hbCwgZGVmYXVsdCBmYWxzZQorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlYnVnc2Nhbm5lciIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTZXQgc2Nhbm5lciBkZWJ1ZyBtb2RlOyBvcHRpb25hbCwgZGVmYXVsdCBmYWxzZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgc2V0IHNjYW5uZXIgZGVidWcgbW9kZTsgb3B0aW9uYWwsIGRlZmF1bHQgZmFsc2UKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJtYXhtZW1vcnkiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtNYXhpbXVtIG1lbW9yeSBmb3IgdGhlIEpWTTsgb3B0aW9uYWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCB0aGUgbWF4aW11bSBtZW1vcnkgZm9yIHRoZSBKVk07IG9wdGlvbmFsLgorIC1teCBvciAtWG14IGRlcGVuZGluZyBvbiBWTSB2ZXJzaW9uCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibWV0YW1hdGFob21lIiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGhvbWUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIE1ldGFtYXRhIGRpc3RyaWJ1dGlvbjsgcmVxdWlyZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRoZSBob21lIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBNZXRhbWF0YSBkaXN0cmlidXRpb247IHJlcXVpcmVkCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idGFyZ2V0IiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIC5qaiBmaWxlIHRvIHByb2Nlc3M7IHJlcXVpcmVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBUaGUgLmpqIGZpbGUgdG8gcHJvY2VzczsgcmVxdWlyZWQuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmVyYm9zZSIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTZXQgdmVyYm9zZSBtb2RlOyBvcHRpb25hbCwgZGVmYXVsdCBmYWxzZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgc2V0IHZlcmJvc2UgbW9kZTsgb3B0aW9uYWwsIGRlZmF1bHQgZmFsc2UKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgIDwvYXR0cmlidXRlcz4KKworICAgIDxlbGVtZW50cz4KKyAgICAgIDxlbGVtZW50IG5hbWU9ImNsYXNzcGF0aCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aCIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUGF0aCIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NyZWF0ZSBhIGNsYXNzcGF0aCBlbnRyeS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbY3JlYXRlIGEgY2xhc3NwYXRoIGVudHJ5XV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICAgIDxlbGVtZW50IG5hbWU9Imp2bWFyZyIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQ29tbWFuZGxpbmUuQXJndW1lbnQiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IiIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZGl0aW9uYWwgb3B0aW9uYWwgcGFyYW1ldGVycyB0byBwYXNzIHRvIHRoZSBKVk0uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0FkZGl0aW9uYWwgb3B0aW9uYWwgcGFyYW1ldGVycyB0byBwYXNzIHRvIHRoZSBKVk0uXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICAgIDxlbGVtZW50IG5hbWU9InNvdXJjZXBhdGgiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IlBhdGgiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDcmVhdGVzIGEgc291cmNlcGF0aCBlbnRyeS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbY3JlYXRlcyBhIHNvdXJjZXBhdGggZW50cnldXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgIDwvZWxlbWVudHM+CisKKyAgPC9zdHJ1Y3R1cmU+CisKKzwvdGFzaz4KKworCis8dGFzayBuYW1lPSJuYXRpdmUyYXNjaWkiIGNhdGVnb3J5PSJvdGhlciIKKyAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuTmF0aXZlMkFzY2lpIgorICAgICAgbWF0Y2hpbmdUYXNrPSJ0cnVlIj4KKworICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ29udmVydHMgZmlsZXMgZnJvbSBuYXRpdmUgZW5jb2RpbmdzIHRvIEFTQ0lJLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgIDxkZXNjcmlwdGlvbj4KKyAgICA8IVtDREFUQVtDb252ZXJ0cyBmaWxlcyBmcm9tIG5hdGl2ZSBlbmNvZGluZ3MgdG8gQVNDSUkuXV0+CisgIDwvZGVzY3JpcHRpb24+CisKKyAgPHN0cnVjdHVyZT4KKworICAgIDxhdHRyaWJ1dGVzPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXN0IiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRGVzdGluYXRpb24gZGlyZWN0b3J5IHRvIHBsYWNlIGNvbnZlcnRlZCBmaWxlcyBpbnRvLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSB0byBwbGFjZSBjb252ZXJ0ZWQgZmlsZXMgaW50by4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJlbmNvZGluZyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0VuY29kaW5nIHRvIHRyYW5zbGF0ZSB0by9mcm9tLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIGVuY29kaW5nIHRvIHRyYW5zbGF0ZSB0by9mcm9tLgorIElmIHVuc2V0LCB0aGUgZGVmYXVsdCBlbmNvZGluZyBmb3IgdGhlIEpWTSBpcyB1c2VkLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImV4dCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0V4dGVuc2lvbiB3aGljaCBjb252ZXJ0ZWQgZmlsZXMgc2hvdWxkIGhhdmUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCB0aGUgZXh0ZW5zaW9uIHdoaWNoIGNvbnZlcnRlZCBmaWxlcyBzaG91bGQgaGF2ZS4KKyBJZiB1bnNldCwgZmlsZXMgd2lsbCBub3QgYmUgcmVuYW1lZC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJyZXZlcnNlIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0ZsYWcgdGhlIGNvbnZlcnNpb24gdG8gcnVuIGluIHRoZSByZXZlcnNlIHNlbnNlLAorIHRoYXQgaXMgQXNjaWkgdG8gTmF0aXZlIGVuY29kaW5nLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBGbGFnIHRoZSBjb252ZXJzaW9uIHRvIHJ1biBpbiB0aGUgcmV2ZXJzZSBzZW5zZSwKKyB0aGF0IGlzIEFzY2lpIHRvIE5hdGl2ZSBlbmNvZGluZy4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzcmMiIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTb3VyY2UgZGlyZWN0b3J5IGluIHdoaWNoIHRvIGZpbmQgZmlsZXMgdG8gY29udmVydC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBzb3VyY2UgZGlyZWN0b3J5IGluIHdoaWNoIHRvIGZpbmQgZmlsZXMgdG8gY29udmVydC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgIDwvYXR0cmlidXRlcz4KKworICAgIDxlbGVtZW50cz4KKyAgICAgIDxlbGVtZW50IG5hbWU9Im1hcHBlciIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuTWFwcGVyIgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJNYXBwZXIiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtEZWZpbmVzIHRoZSBGaWxlTmFtZU1hcHBlciB0byB1c2UgKG5lc3RlZCBtYXBwZXIgZWxlbWVudCkuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0RlZmluZXMgdGhlIEZpbGVOYW1lTWFwcGVyIHRvIHVzZSAobmVzdGVkIG1hcHBlciBlbGVtZW50KS5dXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgIDwvZWxlbWVudHM+CisKKyAgPC9zdHJ1Y3R1cmU+CisKKzwvdGFzaz4KKworCis8dGFzayBuYW1lPSJuZXRyZXh4YyIgY2F0ZWdvcnk9Im90aGVyIgorICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5OZXRSZXh4QyIKKyAgICAgIG1hdGNoaW5nVGFzaz0idHJ1ZSI+CisKKyAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NvbXBpbGVzIE5ldFJleHggc291cmNlIGZpbGVzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgIDxkZXNjcmlwdGlvbj4KKyAgICA8IVtDREFUQVtDb21waWxlcyBOZXRSZXh4IHNvdXJjZSBmaWxlcy4KKyBUaGlzIHRhc2sgY2FuIHRha2UgdGhlIGZvbGxvd2luZworIGFyZ3VtZW50czoKKyA8dWw+CisgPGxpPmJpbmFyeTwvbGk+CisgPGxpPmNsYXNzcGF0aDwvbGk+CisgPGxpPmNvbW1lbnRzPC9saT4KKyA8bGk+Y29tcGlsZTwvbGk+CisgPGxpPmNvbnNvbGU8L2xpPgorIDxsaT5jcm9zc3JlZjwvbGk+CisgPGxpPmRlY2ltYWw8L2xpPgorIDxsaT5kZXN0ZGlyPC9saT4KKyA8bGk+ZGlhZzwvbGk+CisgPGxpPmV4cGxpY2l0PC9saT4KKyA8bGk+Zm9ybWF0PC9saT4KKyA8bGk+a2VlcDwvbGk+CisgPGxpPmxvZ288L2xpPgorIDxsaT5yZXBsYWNlPC9saT4KKyA8bGk+c2F2ZWxvZzwvbGk+CisgPGxpPnNyY2RpcjwvbGk+CisgPGxpPnNvdXJjZWRpcjwvbGk+CisgPGxpPnN0cmljdGFyZ3M8L2xpPgorIDxsaT5zdHJpY3Rhc3NpZ248L2xpPgorIDxsaT5zdHJpY3RjYXNlPC9saT4KKyA8bGk+c3RyaWN0aW1wb3J0PC9saT4KKyA8bGk+c3ltYm9sczwvbGk+CisgPGxpPnRpbWU8L2xpPgorIDxsaT50cmFjZTwvbGk+CisgPGxpPnV0Zjg8L2xpPgorIDxsaT52ZXJib3NlPC9saT4KKyA8bGk+c3VwcHJlc3NNZXRob2RBcmd1bWVudE5vdFVzZWQ8L2xpPgorIDxsaT5zdXBwcmVzc1ByaXZhdGVQcm9wZXJ0eU5vdFVzZWQ8L2xpPgorIDxsaT5zdXBwcmVzc1ZhcmlhYmxlTm90VXNlZDwvbGk+CisgPGxpPnN1cHByZXNzRXhjZXB0aW9uTm90U2lnbmFsbGVkPC9saT4KKyA8bGk+c3VwcHJlc3NEZXByZWNhdGlvbjwvbGk+CisgPC91bD4KKyBPZiB0aGVzZSBhcmd1bWVudHMsIHRoZSA8Yj5zcmNkaXI8L2I+IGFyZ3VtZW50IGlzIHJlcXVpcmVkLgorCisgPHA+V2hlbiB0aGlzIHRhc2sgZXhlY3V0ZXMsIGl0IHdpbGwgcmVjdXJzaXZlbHkgc2NhbiB0aGUgc3JjZGlyCisgbG9va2luZyBmb3IgTmV0UmV4eCBzb3VyY2UgZmlsZXMgdG8gY29tcGlsZS4gVGhpcyB0YXNrIG1ha2VzIGl0cworIGNvbXBpbGUgZGVjaXNpb24gYmFzZWQgb24gdGltZXN0YW1wLgorIDxwPkJlZm9yZSBmaWxlcyBhcmUgY29tcGlsZWQgdGhleSBhbmQgYW55IG90aGVyIGZpbGUgaW4gdGhlCisgc3JjZGlyIHdpbGwgYmUgY29waWVkIHRvIHRoZSBkZXN0ZGlyIGFsbG93aW5nIHN1cHBvcnQgZmlsZXMgdG8gYmUKKyBsb2NhdGVkIHByb3Blcmx5IGluIHRoZSBjbGFzc3BhdGguIFRoZSByZWFzb24gZm9yIGNvcHlpbmcgdGhlIHNvdXJjZSBmaWxlcworIGJlZm9yZSB0aGUgY29tcGlsZSBpcyB0aGF0IE5ldFJleHhDIGhhcyBvbmx5IHR3byBkZXN0aW5hdGlvbnMgZm9yIGNsYXNzZmlsZXM6CisgPG9sPgorIDxsaT5UaGUgY3VycmVudCBkaXJlY3RvcnksIGFuZCw8L2xpPgorIDxsaT5UaGUgZGlyZWN0b3J5IHRoZSBzb3VyY2UgaXMgaW4gKHNlZSBzb3VyY2VkaXIgb3B0aW9uKQorIDwvb2w+XV0+CisgIDwvZGVzY3JpcHRpb24+CisKKyAgPHN0cnVjdHVyZT4KKworICAgIDxhdHRyaWJ1dGVzPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJiaW5hcnkiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2V0IHdoZXRoZXIgbGl0ZXJhbHMgYXJlIHRyZWF0ZWQgYXMgYmluYXJ5LCByYXRoZXIgdGhhbiBOZXRSZXh4IHR5cGVzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgd2hldGhlciBsaXRlcmFscyBhcmUgdHJlYXRlZCBhcyBiaW5hcnksIHJhdGhlciB0aGFuIE5ldFJleHggdHlwZXMKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc3BhdGgiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDbGFzc3BhdGggdXNlZCBmb3IgTmV0UmV4eCBjb21waWxhdGlvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBjbGFzc3BhdGggdXNlZCBmb3IgTmV0UmV4eCBjb21waWxhdGlvbgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNvbW1lbnRzIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NldCB3aGV0aGVyIGNvbW1lbnRzIGFyZSBwYXNzZWQgdGhyb3VnaCB0byB0aGUgZ2VuZXJhdGVkIGphdmEgc291cmNlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgd2hldGhlciBjb21tZW50cyBhcmUgcGFzc2VkIHRocm91Z2ggdG8gdGhlIGdlbmVyYXRlZCBqYXZhIHNvdXJjZS4KKyBWYWxpZCB0cnVlIHZhbHVlcyBhcmUgIm9uIiBvciAidHJ1ZSIuIEFueXRoaW5nIGVsc2Ugc2V0cyB0aGUgZmxhZyB0bworIGZhbHNlLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBmYWxzZQorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNvbXBhY3QiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2V0IHdoZXRoZXIgZXJyb3IgbWVzc2FnZXMgY29tZSBvdXQgaW4gY29tcGFjdCBvciB2ZXJib3NlIGZvcm1hdC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHdoZXRoZXIgZXJyb3IgbWVzc2FnZXMgY29tZSBvdXQgaW4gY29tcGFjdCBvciB2ZXJib3NlIGZvcm1hdC4gVmFsaWQKKyB0cnVlIHZhbHVlcyBhcmUgIm9uIiBvciAidHJ1ZSIuIEFueXRoaW5nIGVsc2Ugc2V0cyB0aGUgZmxhZyB0byBmYWxzZS4KKyBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBmYWxzZQorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNvbXBpbGUiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2V0IHdoZXRoZXIgdGhlIE5ldFJleHggY29tcGlsZXIgc2hvdWxkIGNvbXBpbGUgdGhlIGdlbmVyYXRlZCBqYXZhIGNvZGUKKyBWYWxpZCB0cnVlIHZhbHVlcyBhcmUgIm9uIiBvciAidHJ1ZSIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCB3aGV0aGVyIHRoZSBOZXRSZXh4IGNvbXBpbGVyIHNob3VsZCBjb21waWxlIHRoZSBnZW5lcmF0ZWQgamF2YSBjb2RlCisgVmFsaWQgdHJ1ZSB2YWx1ZXMgYXJlICJvbiIgb3IgInRydWUiLiBBbnl0aGluZyBlbHNlIHNldHMgdGhlIGZsYWcgdG8KKyBmYWxzZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgdHJ1ZS4gU2V0dGluZyB0aGlzIGZsYWcgdG8gZmFsc2UsIHdpbGwKKyBhdXRvbWF0aWNhbGx5IHNldCB0aGUga2VlcCBmbGFnIHRvIHRydWUuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29uc29sZSIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTZXQgd2hldGhlciBvciBub3QgbWVzc2FnZXMgc2hvdWxkIGJlIGRpc3BsYXllZCBvbiB0aGUgJ2NvbnNvbGUnIFZhbGlkCisgdHJ1ZSB2YWx1ZXMgYXJlICJvbiIgb3IgInRydWUiLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgd2hldGhlciBvciBub3QgbWVzc2FnZXMgc2hvdWxkIGJlIGRpc3BsYXllZCBvbiB0aGUgJ2NvbnNvbGUnIFZhbGlkCisgdHJ1ZSB2YWx1ZXMgYXJlICJvbiIgb3IgInRydWUiLiBBbnl0aGluZyBlbHNlIHNldHMgdGhlIGZsYWcgdG8gZmFsc2UuCisgVGhlIGRlZmF1bHQgdmFsdWUgaXMgdHJ1ZS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjcm9zc3JlZiIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtXaGV0aGVyIHZhcmlhYmxlIGNyb3NzIHJlZmVyZW5jZXMgYXJlIGdlbmVyYXRlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgV2hldGhlciB2YXJpYWJsZSBjcm9zcyByZWZlcmVuY2VzIGFyZSBnZW5lcmF0ZWQKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZWNpbWFsIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NldCB3aGV0aGVyIGRlY2ltYWwgYXJpdGhtZXRpYyBzaG91bGQgYmUgdXNlZCBmb3IgdGhlIG5ldHJleHggY29kZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHdoZXRoZXIgZGVjaW1hbCBhcml0aG1ldGljIHNob3VsZCBiZSB1c2VkIGZvciB0aGUgbmV0cmV4eCBjb2RlLgorIEJpbmFyeSBhcml0aG1ldGljIGlzIHVzZWQgd2hlbiB0aGlzIGZsYWcgaXMgdHVybmVkIG9mZi4gVmFsaWQgdHJ1ZQorIHZhbHVlcyBhcmUgIm9uIiBvciAidHJ1ZSIuIEFueXRoaW5nIGVsc2Ugc2V0cyB0aGUgZmxhZyB0byBmYWxzZS4gVGhlCisgZGVmYXVsdCB2YWx1ZSBpcyB0cnVlLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlc3RkaXIiIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtEZXN0aW5hdGlvbiBkaXJlY3RvcnkgaW50byB3aGljaCB0aGUgTmV0UmV4eCBzb3VyY2UgZmlsZXMKKyBzaG91bGQgYmUgY29waWVkIGFuZCB0aGVuIGNvbXBpbGVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBpbnRvIHdoaWNoIHRoZSBOZXRSZXh4IHNvdXJjZSBmaWxlcworIHNob3VsZCBiZSBjb3BpZWQgYW5kIHRoZW4gY29tcGlsZWQuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGlhZyIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtXaGV0aGVyIGRpYWdub3N0aWMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbXBpbGUgaXMgZ2VuZXJhdGVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBXaGV0aGVyIGRpYWdub3N0aWMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbXBpbGUgaXMgZ2VuZXJhdGVkCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZXhwbGljaXQiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2V0cyB3aGV0aGVyIHZhcmlhYmxlcyBtdXN0IGJlIGRlY2xhcmVkIGV4cGxpY2l0bHkgYmVmb3JlIHVzZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0cyB3aGV0aGVyIHZhcmlhYmxlcyBtdXN0IGJlIGRlY2xhcmVkIGV4cGxpY2l0bHkgYmVmb3JlIHVzZS4gVmFsaWQKKyB0cnVlIHZhbHVlcyBhcmUgIm9uIiBvciAidHJ1ZSIuIEFueXRoaW5nIGVsc2Ugc2V0cyB0aGUgZmxhZyB0byBmYWxzZS4KKyBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBmYWxzZS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmb3JtYXQiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbV2hldGhlciB0aGUgZ2VuZXJhdGVkIGphdmEgY29kZSBpcyBmb3JtYXR0ZWQgbmljZWx5IG9yIGxlZnQgdG8gbWF0Y2gKKyBOZXRSZXh4IGxpbmUgbnVtYmVycyBmb3IgY2FsbCBzdGFjayBkZWJ1Z2dpbmcuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFdoZXRoZXIgdGhlIGdlbmVyYXRlZCBqYXZhIGNvZGUgaXMgZm9ybWF0dGVkIG5pY2VseSBvciBsZWZ0IHRvIG1hdGNoCisgTmV0UmV4eCBsaW5lIG51bWJlcnMgZm9yIGNhbGwgc3RhY2sgZGVidWdnaW5nCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iamF2YSIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtXaGV0aGVyIHRoZSBnZW5lcmF0ZWQgamF2YSBjb2RlIGlzIHByb2R1Y2VkIFZhbGlkIHRydWUgdmFsdWVzIGFyZSAib24iCisgb3IgInRydWUiLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBXaGV0aGVyIHRoZSBnZW5lcmF0ZWQgamF2YSBjb2RlIGlzIHByb2R1Y2VkIFZhbGlkIHRydWUgdmFsdWVzIGFyZSAib24iCisgb3IgInRydWUiLiBBbnl0aGluZyBlbHNlIHNldHMgdGhlIGZsYWcgdG8gZmFsc2UuIFRoZSBkZWZhdWx0IHZhbHVlIGlzCisgZmFsc2UuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ia2VlcCIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTZXRzIHdoZXRoZXIgdGhlIGdlbmVyYXRlZCBqYXZhIHNvdXJjZSBmaWxlIHNob3VsZCBiZSBrZXB0IGFmdGVyCisgY29tcGlsYXRpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldHMgd2hldGhlciB0aGUgZ2VuZXJhdGVkIGphdmEgc291cmNlIGZpbGUgc2hvdWxkIGJlIGtlcHQgYWZ0ZXIKKyBjb21waWxhdGlvbi4gVGhlIGdlbmVyYXRlZCBmaWxlcyB3aWxsIGhhdmUgYW4gZXh0ZW5zaW9uIG9mIC5qYXZhLmtlZXAsCisgPGI+bm90PC9iPiAuamF2YSBWYWxpZCB0cnVlIHZhbHVlcyBhcmUgIm9uIiBvciAidHJ1ZSIuIEFueXRoaW5nIGVsc2UKKyBzZXRzIHRoZSBmbGFnIHRvIGZhbHNlLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBmYWxzZS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsb2dvIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1doZXRoZXIgdGhlIGNvbXBpbGVyIHRleHQgbG9nbyBpcyBkaXNwbGF5ZWQgd2hlbiBjb21waWxpbmcuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFdoZXRoZXIgdGhlIGNvbXBpbGVyIHRleHQgbG9nbyBpcyBkaXNwbGF5ZWQgd2hlbiBjb21waWxpbmcKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJyZXBsYWNlIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1doZXRoZXIgdGhlIGdlbmVyYXRlZCAuamF2YSBmaWxlIHNob3VsZCBiZSByZXBsYWNlZCB3aGVuIGNvbXBpbGluZworIFZhbGlkIHRydWUgdmFsdWVzIGFyZSAib24iIG9yICJ0cnVlIi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgV2hldGhlciB0aGUgZ2VuZXJhdGVkIC5qYXZhIGZpbGUgc2hvdWxkIGJlIHJlcGxhY2VkIHdoZW4gY29tcGlsaW5nCisgVmFsaWQgdHJ1ZSB2YWx1ZXMgYXJlICJvbiIgb3IgInRydWUiLiBBbnl0aGluZyBlbHNlIHNldHMgdGhlIGZsYWcgdG8KKyBmYWxzZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgZmFsc2UuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic2F2ZWxvZyIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTZXRzIHdoZXRoZXIgdGhlIGNvbXBpbGVyIG1lc3NhZ2VzIHdpbGwgYmUgd3JpdHRlbiB0byBOZXRSZXh4Qy5sb2cgYXMKKyB3ZWxsIGFzIHRvIHRoZSBjb25zb2xlIFZhbGlkIHRydWUgdmFsdWVzIGFyZSAib24iIG9yICJ0cnVlIi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0cyB3aGV0aGVyIHRoZSBjb21waWxlciBtZXNzYWdlcyB3aWxsIGJlIHdyaXR0ZW4gdG8gTmV0UmV4eEMubG9nIGFzCisgd2VsbCBhcyB0byB0aGUgY29uc29sZSBWYWxpZCB0cnVlIHZhbHVlcyBhcmUgIm9uIiBvciAidHJ1ZSIuIEFueXRoaW5nCisgZWxzZSBzZXRzIHRoZSBmbGFnIHRvIGZhbHNlLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBmYWxzZS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzb3VyY2VkaXIiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGVsbHMgdGhlIE5ldFJleHggY29tcGlsZXIgdG8gc3RvcmUgdGhlIGNsYXNzIGZpbGVzIGluIHRoZSBzYW1lCisgZGlyZWN0b3J5IGFzIHRoZSBzb3VyY2UgZmlsZXMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRlbGxzIHRoZSBOZXRSZXh4IGNvbXBpbGVyIHRvIHN0b3JlIHRoZSBjbGFzcyBmaWxlcyBpbiB0aGUgc2FtZQorIGRpcmVjdG9yeSBhcyB0aGUgc291cmNlIGZpbGVzLiBUaGUgYWx0ZXJuYXRpdmUgaXMgdGhlIHdvcmtpbmcgZGlyZWN0b3J5CisgVmFsaWQgdHJ1ZSB2YWx1ZXMgYXJlICJvbiIgb3IgInRydWUiLiBBbnl0aGluZyBlbHNlIHNldHMgdGhlIGZsYWcgdG8KKyBmYWxzZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgdHJ1ZS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzcmNkaXIiIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTb3VyY2UgZGlyIHRvIGZpbmQgdGhlIHNvdXJjZSBKYXZhIGZpbGVzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIHNvdXJjZSBkaXIgdG8gZmluZCB0aGUgc291cmNlIEphdmEgZmlsZXMuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3RyaWN0YXJncyIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUZWxscyB0aGUgTmV0UmV4eCBjb21waWxlciB0aGF0IG1ldGhvZCBjYWxscyBhbHdheXMgbmVlZCBwYXJlbnRoZXNlcywKKyBldmVuIGlmIG5vIGFyZ3VtZW50cyBhcmUgbmVlZGVkLCBlLmcuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRlbGxzIHRoZSBOZXRSZXh4IGNvbXBpbGVyIHRoYXQgbWV0aG9kIGNhbGxzIGFsd2F5cyBuZWVkIHBhcmVudGhlc2VzLAorIGV2ZW4gaWYgbm8gYXJndW1lbnRzIGFyZSBuZWVkZWQsIGUuZy4gPGNvZGU+YVN0cmluZ1Zhci5nZXRCeXRlczwvY29kZT4KKyB2cy4gPGNvZGU+YVN0cmluZ1Zhci5nZXRCeXRlcygpPC9jb2RlPiBWYWxpZCB0cnVlIHZhbHVlcyBhcmUgIm9uIiBvcgorICJ0cnVlIi4gQW55dGhpbmcgZWxzZSBzZXRzIHRoZSBmbGFnIHRvIGZhbHNlLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcworIGZhbHNlLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InN0cmljdGFzc2lnbiIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUZWxscyB0aGUgTmV0UmV4eCBjb21waWxlIHRoYXQgYXNzaWdubWVudHMgbXVzdCBtYXRjaCBleGFjdGx5IG9uIHR5cGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRlbGxzIHRoZSBOZXRSZXh4IGNvbXBpbGUgdGhhdCBhc3NpZ25tZW50cyBtdXN0IG1hdGNoIGV4YWN0bHkgb24gdHlwZQorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InN0cmljdGNhc2UiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU3BlY2lmaWVzIHdoZXRoZXIgdGhlIE5ldFJleHggY29tcGlsZXIgc2hvdWxkIGJlIGNhc2Ugc2Vuc2l0aXZlIG9yIG5vdC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIE5ldFJleHggY29tcGlsZXIgc2hvdWxkIGJlIGNhc2Ugc2Vuc2l0aXZlIG9yIG5vdAorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InN0cmljdGltcG9ydCIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTZXRzIHdoZXRoZXIgY2xhc3NlcyBuZWVkIHRvIGJlIGltcG9ydGVkIGV4cGxpY2l0bHkgdXNpbmcgYW4gPGNvZGU+aW1wb3J0PC9jb2RlPgorIHN0YXRlbWVudC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0cyB3aGV0aGVyIGNsYXNzZXMgbmVlZCB0byBiZSBpbXBvcnRlZCBleHBsaWNpdGx5IHVzaW5nIGFuIDxjb2RlPmltcG9ydDwvY29kZT4KKyBzdGF0ZW1lbnQuIEJ5IGRlZmF1bHQgdGhlIE5ldFJleHggY29tcGlsZXIgd2lsbCBpbXBvcnQgY2VydGFpbiBwYWNrYWdlcworIGF1dG9tYXRpY2FsbHkgVmFsaWQgdHJ1ZSB2YWx1ZXMgYXJlICJvbiIgb3IgInRydWUiLiBBbnl0aGluZyBlbHNlIHNldHMKKyB0aGUgZmxhZyB0byBmYWxzZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgZmFsc2UuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3RyaWN0cHJvcHMiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2V0cyB3aGV0aGVyIGxvY2FsIHByb3BlcnRpZXMgbmVlZCB0byBiZSBxdWFsaWZpZWQgZXhwbGljaXRseSB1c2luZworIDxjb2RlPnRoaXM8L2NvZGU+IFZhbGlkIHRydWUgdmFsdWVzIGFyZSAib24iIG9yICJ0cnVlIi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0cyB3aGV0aGVyIGxvY2FsIHByb3BlcnRpZXMgbmVlZCB0byBiZSBxdWFsaWZpZWQgZXhwbGljaXRseSB1c2luZworIDxjb2RlPnRoaXM8L2NvZGU+IFZhbGlkIHRydWUgdmFsdWVzIGFyZSAib24iIG9yICJ0cnVlIi4gQW55dGhpbmcgZWxzZQorIHNldHMgdGhlIGZsYWcgdG8gZmFsc2UuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGZhbHNlLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InN0cmljdHNpZ25hbCIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtXaGV0aGVyIHRoZSBjb21waWxlciBzaG91bGQgZm9yY2UgY2F0Y2hpbmcgb2YgZXhjZXB0aW9ucyBieSBleHBsaWNpdGx5CisgbmFtZWQgdHlwZXMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFdoZXRoZXIgdGhlIGNvbXBpbGVyIHNob3VsZCBmb3JjZSBjYXRjaGluZyBvZiBleGNlcHRpb25zIGJ5IGV4cGxpY2l0bHkKKyBuYW1lZCB0eXBlcworICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InN1cHByZXNzZGVwcmVjYXRpb24iIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGVsbHMgd2hldGhlciB3ZSBzaG91bGQgZmlsdGVyIG91dCBhbnkgZGVwcmVjYXRpb24tbWVzc2FnZXMKKyBvZiB0aGUgY29tcGlsZXIgb3V0Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBUZWxscyB3aGV0aGVyIHdlIHNob3VsZCBmaWx0ZXIgb3V0IGFueSBkZXByZWNhdGlvbi1tZXNzYWdlcworIG9mIHRoZSBjb21waWxlciBvdXQuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3VwcHJlc3NleGNlcHRpb25ub3RzaWduYWxsZWQiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbV2hldGhlciB0aGUgdGFzayBzaG91bGQgc3VwcHJlc3MgdGhlICJGb29FeGNlcHRpb24gaXMgaW4gU0lHTkFMUyBsaXN0CisgYnV0IGlzIG5vdCBzaWduYWxsZWQgd2l0aGluIHRoZSBtZXRob2QiLCB3aGljaCBpcyBzb21ldGltZXMgcmF0aGVyCisgdXNlbGVzcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgV2hldGhlciB0aGUgdGFzayBzaG91bGQgc3VwcHJlc3MgdGhlICJGb29FeGNlcHRpb24gaXMgaW4gU0lHTkFMUyBsaXN0CisgYnV0IGlzIG5vdCBzaWduYWxsZWQgd2l0aGluIHRoZSBtZXRob2QiLCB3aGljaCBpcyBzb21ldGltZXMgcmF0aGVyCisgdXNlbGVzcy4gVGhlIHdhcm5pbmcgaXMgbG9nZ2VkIGFzIHZlcmJvc2UgbWVzc2FnZSwgdGhvdWdoLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InN1cHByZXNzbWV0aG9kYXJndW1lbnRub3R1c2VkIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1doZXRoZXIgdGhlIHRhc2sgc2hvdWxkIHN1cHByZXNzIHRoZSAiTWV0aG9kIGFyZ3VtZW50IGlzIG5vdCB1c2VkIiBpbgorIHN0cmljdGFyZ3MtTW9kZSwgd2hpY2ggY2FuIG5vdCBiZSBzdXBwcmVzc2VkIGJ5IHRoZSBjb21waWxlciBpdHNlbGYuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFdoZXRoZXIgdGhlIHRhc2sgc2hvdWxkIHN1cHByZXNzIHRoZSAiTWV0aG9kIGFyZ3VtZW50IGlzIG5vdCB1c2VkIiBpbgorIHN0cmljdGFyZ3MtTW9kZSwgd2hpY2ggY2FuIG5vdCBiZSBzdXBwcmVzc2VkIGJ5IHRoZSBjb21waWxlciBpdHNlbGYuCisgVGhlIHdhcm5pbmcgaXMgbG9nZ2VkIGFzIHZlcmJvc2UgbWVzc2FnZSwgdGhvdWdoLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InN1cHByZXNzcHJpdmF0ZXByb3BlcnR5bm90dXNlZCIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtXaGV0aGVyIHRoZSB0YXNrIHNob3VsZCBzdXBwcmVzcyB0aGUgIlByaXZhdGUgcHJvcGVydHkgaXMgZGVmaW5lZCBidXQKKyBub3QgdXNlZCIgaW4gc3RyaWN0YXJncy1Nb2RlLCB3aGljaCBjYW4gYmUgcXVpdGUgYW5ub3lpbmcgd2hpbGUKKyBkZXZlbG9waW5nLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBXaGV0aGVyIHRoZSB0YXNrIHNob3VsZCBzdXBwcmVzcyB0aGUgIlByaXZhdGUgcHJvcGVydHkgaXMgZGVmaW5lZCBidXQKKyBub3QgdXNlZCIgaW4gc3RyaWN0YXJncy1Nb2RlLCB3aGljaCBjYW4gYmUgcXVpdGUgYW5ub3lpbmcgd2hpbGUKKyBkZXZlbG9waW5nLiBUaGUgd2FybmluZyBpcyBsb2dnZWQgYXMgdmVyYm9zZSBtZXNzYWdlLCB0aG91Z2guCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3VwcHJlc3N2YXJpYWJsZW5vdHVzZWQiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbV2hldGhlciB0aGUgdGFzayBzaG91bGQgc3VwcHJlc3MgdGhlICJWYXJpYWJsZSBpcyBzZXQgYnV0IG5vdCB1c2VkIiBpbgorIHN0cmljdGFyZ3MtTW9kZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgV2hldGhlciB0aGUgdGFzayBzaG91bGQgc3VwcHJlc3MgdGhlICJWYXJpYWJsZSBpcyBzZXQgYnV0IG5vdCB1c2VkIiBpbgorIHN0cmljdGFyZ3MtTW9kZS4gQmUgY2FyZWZ1bCB3aXRoIHRoaXMgb25lISBUaGUgd2FybmluZyBpcyBsb2dnZWQgYXMKKyB2ZXJib3NlIG1lc3NhZ2UsIHRob3VnaC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzeW1ib2xzIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NldHMgd2hldGhlciBkZWJ1ZyBzeW1ib2xzIHNob3VsZCBiZSBnZW5lcmF0ZWQgaW50byB0aGUgY2xhc3MgZmlsZQorIFZhbGlkIHRydWUgdmFsdWVzIGFyZSAib24iIG9yICJ0cnVlIi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0cyB3aGV0aGVyIGRlYnVnIHN5bWJvbHMgc2hvdWxkIGJlIGdlbmVyYXRlZCBpbnRvIHRoZSBjbGFzcyBmaWxlCisgVmFsaWQgdHJ1ZSB2YWx1ZXMgYXJlICJvbiIgb3IgInRydWUiLiBBbnl0aGluZyBlbHNlIHNldHMgdGhlIGZsYWcgdG8KKyBmYWxzZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgZmFsc2UuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idGltZSIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBc2tzIHRoZSBOZXRSZXh4IGNvbXBpbGVyIHRvIHByaW50IGNvbXBpbGF0aW9uIHRpbWVzIHRvIHRoZSBjb25zb2xlCisgVmFsaWQgdHJ1ZSB2YWx1ZXMgYXJlICJvbiIgb3IgInRydWUiLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBBc2tzIHRoZSBOZXRSZXh4IGNvbXBpbGVyIHRvIHByaW50IGNvbXBpbGF0aW9uIHRpbWVzIHRvIHRoZSBjb25zb2xlCisgVmFsaWQgdHJ1ZSB2YWx1ZXMgYXJlICJvbiIgb3IgInRydWUiLiBBbnl0aGluZyBlbHNlIHNldHMgdGhlIGZsYWcgdG8KKyBmYWxzZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgZmFsc2UuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHJhY2UiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLk5ldFJleHhDLlRyYWNlQXR0ciIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSImcXVvdDt0cmFjZSZxdW90OywgJnF1b3Q7dHJhY2UxJnF1b3Q7LCAmcXVvdDt0cmFjZTImcXVvdDssICZxdW90O25vdHJhY2UmcXVvdDsiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW05vIGRlc2NyaXB0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1dGY4IiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RlbGxzIHRoZSBOZXRSZXh4IGNvbXBpbGVyIHRoYXQgdGhlIHNvdXJjZSBpcyBpbiBVVEY4IFZhbGlkIHRydWUgdmFsdWVzCisgYXJlICJvbiIgb3IgInRydWUiLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBUZWxscyB0aGUgTmV0UmV4eCBjb21waWxlciB0aGF0IHRoZSBzb3VyY2UgaXMgaW4gVVRGOCBWYWxpZCB0cnVlIHZhbHVlcworIGFyZSAib24iIG9yICJ0cnVlIi4gQW55dGhpbmcgZWxzZSBzZXRzIHRoZSBmbGFnIHRvIGZhbHNlLiBUaGUgZGVmYXVsdAorIHZhbHVlIGlzIGZhbHNlLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InZlcmJvc2UiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLk5ldFJleHhDLlZlcmJvc2VBdHRyIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IiZxdW90O3ZlcmJvc2UmcXVvdDssICZxdW90O3ZlcmJvc2UwJnF1b3Q7LCAmcXVvdDt2ZXJib3NlMSZxdW90OywgJnF1b3Q7dmVyYm9zZTImcXVvdDssICZxdW90O3ZlcmJvc2UzJnF1b3Q7LCAmcXVvdDt2ZXJib3NlNCZxdW90OywgJnF1b3Q7dmVyYm9zZTUmcXVvdDssICZxdW90O25vdmVyYm9zZSZxdW90OyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbV2hldGhlciBsb3RzIG9mIHdhcm5pbmdzIGFuZCBlcnJvciBtZXNzYWdlcyBzaG91bGQgYmUgZ2VuZXJhdGVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBXaGV0aGVyIGxvdHMgb2Ygd2FybmluZ3MgYW5kIGVycm9yIG1lc3NhZ2VzIHNob3VsZCBiZSBnZW5lcmF0ZWQKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgIDwvYXR0cmlidXRlcz4KKworICAgIDxlbGVtZW50cz4KKyAgICA8L2VsZW1lbnRzPgorCisgIDwvc3RydWN0dXJlPgorCis8L3Rhc2s+CisKKworPHRhc2sgbmFtZT0icDRhZGQiIGNhdGVnb3J5PSJvdGhlciIKKyAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwucGVyZm9yY2UuUDRBZGQiCisgICAgICA+CisKKyAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgc3BlY2lmaWVkIGZpbGVzIHRvIFBlcmZvcmNlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgIDxkZXNjcmlwdGlvbj4KKyAgICA8IVtDREFUQVtBZGRzIHNwZWNpZmllZCBmaWxlcyB0byBQZXJmb3JjZS4KKworIDxiPkV4YW1wbGUgVXNhZ2U6PC9iPgorIDx0YWJsZSBib3JkZXI9IjEiPgorIDx0aD5GdW5jdGlvbjwvdGg+PHRoPkNvbW1hbmQ8L3RoPgorIDx0cj48dGQ+QWRkIGZpbGVzIHVzaW5nIFA0VVNFUiwgUDRQT1JUIGFuZCBQNENMSUVOVCBzZXR0aW5ncyBzcGVjaWZpZWQ8L3RkPjx0ZD4mbHQ7UDRhZGQgPGJyPlA0dmlldz0iLy9wcm9qZWN0cy9mb28vbWFpbi9zb3VyY2UvLi4uIiA8YnI+UDRVc2VyPSJmYmxvZ2dzIiA8YnI+UDRQb3J0PSJrbTAxOjE2NjYiIDxicj5QNENsaWVudD0iZmJsb2dnc2NsaWVudCImZ3Q7PGJyPiZsdDtmaWxlc2V0IGJhc2VkaXI9ImRpciIgaW5jbHVkZXM9IioqJiM0NzsqLmphdmEiJmd0Ozxicj4mbHQ7L3A0YWRkJmd0OzwvdGQ+PC90cj4KKyA8dHI+PHRkPkFkZCBmaWxlcyB1c2luZyBQNFVTRVIsIFA0UE9SVCBhbmQgUDRDTElFTlQgc2V0dGluZ3MgZGVmaW5lZCBpbiBlbnZpcm9ubWVudDwvdGQ+PHRkPiZsdDtQNGFkZCBQNHZpZXc9Ii8vcHJvamVjdHMvZm9vL21haW4vc291cmNlLy4uLiIgLyZndDs8YnI+Jmx0O2ZpbGVzZXQgYmFzZWRpcj0iZGlyIiBpbmNsdWRlcz0iKiomIzQ3OyouamF2YSImZ3Q7PGJyPiZsdDsvcDRhZGQmZ3Q7PC90ZD48L3RyPgorIDx0cj48dGQ+U3BlY2lmeSB0aGUgbGVuZ3RoIG9mIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgdG8gcGFzcyB0byBlYWNoIGludm9jYXRpb24gb2YgcDQ8L3RkPjx0ZD4mbHQ7cDRhZGQgQ29tbWFuZGxlbmd0aD0iNDUwIiZndDs8L3RkPjwvdHI+CisgPC90YWJsZT5dXT4KKyAgPC9kZXNjcmlwdGlvbj4KKworICA8c3RydWN0dXJlPgorCisgICAgPGF0dHJpYnV0ZXM+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNoYW5nZWxpc3QiIHR5cGU9ImludCIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJpbnQiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHNwZWNpZmllZCB0aGUgb3BlbiBmaWxlcyBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZQorIHNwZWNpZmllZCBwZW5kaW5nIGNoYW5nZWxpc3QgbnVtYmVyOyBvdGhlcndpc2UgdGhlIG9wZW4gZmlsZXMgYXJlCisgYXNzb2NpYXRlZCB3aXRoIHRoZSBkZWZhdWx0IGNoYW5nZWxpc3QuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIElmIHNwZWNpZmllZCB0aGUgb3BlbiBmaWxlcyBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZQorIHNwZWNpZmllZCBwZW5kaW5nIGNoYW5nZWxpc3QgbnVtYmVyOyBvdGhlcndpc2UgdGhlIG9wZW4gZmlsZXMgYXJlCisgYXNzb2NpYXRlZCB3aXRoIHRoZSBkZWZhdWx0IGNoYW5nZWxpc3QuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xpZW50IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIHA0IGNsaWVudCBzcGVjIHRvIHVzZTsKKyBvcHRpb25hbCwgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgdXNlci5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgVGhlIHA0IGNsaWVudCBzcGVjIHRvIHVzZTsKKyBvcHRpb25hbCwgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgdXNlcgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNtZG9wdHMiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTZXQgZXh0cmEgY29tbWFuZCBvcHRpb25zOyBvbmx5IHVzZWQgb24gc29tZQorIG9mIHRoZSBQZXJmb3JjZSB0YXNrcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IGV4dHJhIGNvbW1hbmQgb3B0aW9uczsgb25seSB1c2VkIG9uIHNvbWUKKyBvZiB0aGUgUGVyZm9yY2UgdGFza3MuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29tbWFuZGxlbmd0aCIgdHlwZT0iaW50IgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImludCIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbUG9zaXRpdmUgaW50ZWdlciBzcGVjaWZ5aW5nIHRoZSBtYXhpbXVtIGxlbmd0aAorICAgb2YgdGhlIGNvbW1hbmRsaW5lIHdoZW4gY2FsbGluZyBQZXJmb3JjZSB0byBhZGQgdGhlIGZpbGVzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBwb3NpdGl2ZSBpbnRlZ2VyIHNwZWNpZnlpbmcgdGhlIG1heGltdW0gbGVuZ3RoCisgICBvZiB0aGUgY29tbWFuZGxpbmUgd2hlbiBjYWxsaW5nIFBlcmZvcmNlIHRvIGFkZCB0aGUgZmlsZXMuIAorICAgRGVmYXVsdHMgdG8gNDUwLCBoaWdoZXIgdmFsdWVzIG1lYW4gZmFzdGVyIGV4ZWN1dGlvbiwKKyAgIGJ1dCBhbHNvIHBvc3NpYmxlIGZhaWx1cmVzLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImZhaWxvbmVycm9yIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1doZXRoZXIgdG8gc3RvcCB0aGUgYnVpbGQgKHRydWUsIGRlZmF1bHQpIAorIG9yIGtlZXAgZ29pbmcgaWYgYW4gZXJyb3IgaXMgcmV0dXJuZWQgZnJvbSB0aGUgcDQgY29tbWFuZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgd2hldGhlciB0byBzdG9wIHRoZSBidWlsZCAodHJ1ZSwgZGVmYXVsdCkgCisgb3Iga2VlcCBnb2luZyBpZiBhbiBlcnJvciBpcyByZXR1cm5lZCBmcm9tIHRoZSBwNCBjb21tYW5kCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9ydCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBwNGQgc2VydmVyIGFuZCBwb3J0IHRvIGNvbm5lY3QgdG87Cisgb3B0aW9uYWwsIGRlZmF1bHQgInBlcmZvcmNlOjE2NjYiLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBUaGUgcDRkIHNlcnZlciBhbmQgcG9ydCB0byBjb25uZWN0IHRvOworIG9wdGlvbmFsLCBkZWZhdWx0ICJwZXJmb3JjZToxNjY2IgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InVzZXIiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgcDQgdXNlcm5hbWU7Cisgb3B0aW9uYWwsIGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IHVzZXIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRoZSBwNCB1c2VybmFtZTsKKyBvcHRpb25hbCwgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgdXNlcgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InZpZXciIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgY2xpZW50LCBicmFuY2ggb3IgbGFiZWwgdmlldyB0byBvcGVyYXRlIHVwb247Cisgb3B0aW9uYWwgZGVmYXVsdCAiLy8uLi4iLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBUaGUgY2xpZW50LCBicmFuY2ggb3IgbGFiZWwgdmlldyB0byBvcGVyYXRlIHVwb247Cisgb3B0aW9uYWwgZGVmYXVsdCAiLy8uLi4iCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICA8L2F0dHJpYnV0ZXM+CisKKyAgICA8ZWxlbWVudHM+CisgICAgICA8ZWxlbWVudCBuYW1lPSJmaWxlc2V0IiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0IgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlc2V0IgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRmlsZXMgdG8gYWRkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtmaWxlcyB0byBhZGRdXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgIDwvZWxlbWVudHM+CisKKyAgPC9zdHJ1Y3R1cmU+CisKKzwvdGFzaz4KKworCis8dGFzayBuYW1lPSJwNGNoYW5nZSIgY2F0ZWdvcnk9Im90aGVyIgorICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5wZXJmb3JjZS5QNENoYW5nZSIKKyAgICAgID4KKworICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbUmVxdWVzdHMgYSBuZXcgY2hhbmdlbGlzdCBmcm9tIHRoZSBQZXJmb3JjZSBzZXJ2ZXIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgPGRlc2NyaXB0aW9uPgorICAgIDwhW0NEQVRBW1JlcXVlc3RzIGEgbmV3IGNoYW5nZWxpc3QgZnJvbSB0aGUgUGVyZm9yY2Ugc2VydmVyLgorIFA0Q2hhbmdlIGNyZWF0ZXMgYSBuZXcgY2hhbmdlbGlzdCBpbiBwZXJmb3JjZS4gUDRDaGFuZ2Ugc2V0cyB0aGUgcHJvcGVydHkKKyAke3A0LmNoYW5nZX0gd2l0aCB0aGUgbmV3IGNoYW5nZWxpc3QgbnVtYmVyLiBUaGlzIHNob3VsZCB0aGVuIGJlIHBhc3NlZCBpbnRvCisgcDRlZGl0IGFuZCBwNHN1Ym1pdC5dXT4KKyAgPC9kZXNjcmlwdGlvbj4KKworICA8c3RydWN0dXJlPgorCisgICAgPGF0dHJpYnV0ZXM+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsaWVudCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBwNCBjbGllbnQgc3BlYyB0byB1c2U7Cisgb3B0aW9uYWwsIGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IHVzZXIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRoZSBwNCBjbGllbnQgc3BlYyB0byB1c2U7Cisgb3B0aW9uYWwsIGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IHVzZXIKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbWRvcHRzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2V0IGV4dHJhIGNvbW1hbmQgb3B0aW9uczsgb25seSB1c2VkIG9uIHNvbWUKKyBvZiB0aGUgUGVyZm9yY2UgdGFza3MuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCBleHRyYSBjb21tYW5kIG9wdGlvbnM7IG9ubHkgdXNlZCBvbiBzb21lCisgb2YgdGhlIFBlcmZvcmNlIHRhc2tzLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRGVzY3JpcHRpb24gZm9yIENoYW5nZUxpc3Q7b3B0aW9uYWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIERlc2NyaXB0aW9uIGZvciBDaGFuZ2VMaXN0O29wdGlvbmFsLgorIElmIG5vbmUgaXMgc3BlY2lmaWVkLCBpdCB3aWxsIGRlZmF1bHQgdG8gIkF1dG9TdWJtaXQgQnkgQW50IgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImZhaWxvbmVycm9yIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1doZXRoZXIgdG8gc3RvcCB0aGUgYnVpbGQgKHRydWUsIGRlZmF1bHQpIAorIG9yIGtlZXAgZ29pbmcgaWYgYW4gZXJyb3IgaXMgcmV0dXJuZWQgZnJvbSB0aGUgcDQgY29tbWFuZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgd2hldGhlciB0byBzdG9wIHRoZSBidWlsZCAodHJ1ZSwgZGVmYXVsdCkgCisgb3Iga2VlcCBnb2luZyBpZiBhbiBlcnJvciBpcyByZXR1cm5lZCBmcm9tIHRoZSBwNCBjb21tYW5kCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9ydCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBwNGQgc2VydmVyIGFuZCBwb3J0IHRvIGNvbm5lY3QgdG87Cisgb3B0aW9uYWwsIGRlZmF1bHQgInBlcmZvcmNlOjE2NjYiLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBUaGUgcDRkIHNlcnZlciBhbmQgcG9ydCB0byBjb25uZWN0IHRvOworIG9wdGlvbmFsLCBkZWZhdWx0ICJwZXJmb3JjZToxNjY2IgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InVzZXIiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgcDQgdXNlcm5hbWU7Cisgb3B0aW9uYWwsIGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IHVzZXIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRoZSBwNCB1c2VybmFtZTsKKyBvcHRpb25hbCwgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgdXNlcgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InZpZXciIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgY2xpZW50LCBicmFuY2ggb3IgbGFiZWwgdmlldyB0byBvcGVyYXRlIHVwb247Cisgb3B0aW9uYWwgZGVmYXVsdCAiLy8uLi4iLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBUaGUgY2xpZW50LCBicmFuY2ggb3IgbGFiZWwgdmlldyB0byBvcGVyYXRlIHVwb247Cisgb3B0aW9uYWwgZGVmYXVsdCAiLy8uLi4iCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICA8L2F0dHJpYnV0ZXM+CisKKyAgICA8ZWxlbWVudHM+CisgICAgPC9lbGVtZW50cz4KKworICA8L3N0cnVjdHVyZT4KKworPC90YXNrPgorCisKKzx0YXNrIG5hbWU9InA0Y291bnRlciIgY2F0ZWdvcnk9Im90aGVyIgorICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5wZXJmb3JjZS5QNENvdW50ZXIiCisgICAgICA+CisKKyAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW09idGFpbnMgb3Igc2V0cyB0aGUgdmFsdWUgb2YgYSBjb3VudGVyLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgIDxkZXNjcmlwdGlvbj4KKyAgICA8IVtDREFUQVtPYnRhaW5zIG9yIHNldHMgdGhlIHZhbHVlIG9mIGEgY291bnRlci4KKworIDxwPiBXaGVuIHVzZWQgaW4gaXRzIGJhc2UgZm9ybQorICh3aGVyZSBvbmx5IHRoZSBjb3VudGVyIG5hbWUgaXMgcHJvdmlkZWQpLCB0aGUgY291bnRlciB2YWx1ZSB3aWxsIGJlCisgcHJpbnRlZCB0byB0aGUgb3V0cHV0IHN0cmVhbS4gV2hlbiB0aGUgdmFsdWUgaXMgcHJvdmlkZWQsIHRoZSBjb3VudGVyCisgd2lsbCBiZSBzZXQgdG8gdGhlIHZhbHVlIHByb3ZpZGVkLiBXaGVuIGEgcHJvcGVydHkgbmFtZSBpcyBwcm92aWRlZCwKKyB0aGUgcHJvcGVydHkgd2lsbCBiZSBmaWxsZWQgd2l0aCB0aGUgdmFsdWUgb2YgdGhlIGNvdW50ZXIuIFlvdSBtYXkKKyBub3Qgc3BlY2lmeSB0byBib3RoIGdldCBhbmQgc2V0IHRoZSB2YWx1ZSBvZiB0aGUgY291bnRlciBpbiB0aGUgc2FtZQorIFRhc2suCisgPC9wPgorIDxQPgorIFRoZSB1c2VyIHBlcmZvcm1pbmcgdGhpcyB0YXNrIG11c3QgaGF2ZSBQZXJmb3JjZSAmcXVvdDtyZXZpZXcmcXVvdDsgcGVybWlzc2lvbnMKKyBhcyBkZWZpbmVkIGJ5IFBlcmZvcmNlIHByb3RlY3Rpb25zIGluIG9yZGVyIGZvciB0aGlzIHRhc2sgdG8gc3VjY2VlZC4KKzwvUD4KKworIEV4YW1wbGUgVXNhZ2U6PGJyPgorICZsdDtwNGNvdW50ZXIgbmFtZT0iJHtwNC5jb3VudGVyfSIgcHJvcGVydHk9JHtwNC5jaGFuZ2V9Ii8mZ3Q7XV0+CisgIDwvZGVzY3JpcHRpb24+CisKKyAgPHN0cnVjdHVyZT4KKworICAgIDxhdHRyaWJ1dGVzPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGllbnQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgcDQgY2xpZW50IHNwZWMgdG8gdXNlOworIG9wdGlvbmFsLCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCB1c2VyLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBUaGUgcDQgY2xpZW50IHNwZWMgdG8gdXNlOworIG9wdGlvbmFsLCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCB1c2VyCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY21kb3B0cyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NldCBleHRyYSBjb21tYW5kIG9wdGlvbnM7IG9ubHkgdXNlZCBvbiBzb21lCisgb2YgdGhlIFBlcmZvcmNlIHRhc2tzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgZXh0cmEgY29tbWFuZCBvcHRpb25zOyBvbmx5IHVzZWQgb24gc29tZQorIG9mIHRoZSBQZXJmb3JjZSB0YXNrcy4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmYWlsb25lcnJvciIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtXaGV0aGVyIHRvIHN0b3AgdGhlIGJ1aWxkICh0cnVlLCBkZWZhdWx0KSAKKyBvciBrZWVwIGdvaW5nIGlmIGFuIGVycm9yIGlzIHJldHVybmVkIGZyb20gdGhlIHA0IGNvbW1hbmQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIHdoZXRoZXIgdG8gc3RvcCB0aGUgYnVpbGQgKHRydWUsIGRlZmF1bHQpIAorIG9yIGtlZXAgZ29pbmcgaWYgYW4gZXJyb3IgaXMgcmV0dXJuZWQgZnJvbSB0aGUgcDQgY29tbWFuZAorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgbmFtZSBvZiB0aGUgY291bnRlcjsgcmVxdWlyZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBjb3VudGVyOyByZXF1aXJlZAorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InBvcnQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgcDRkIHNlcnZlciBhbmQgcG9ydCB0byBjb25uZWN0IHRvOworIG9wdGlvbmFsLCBkZWZhdWx0ICJwZXJmb3JjZToxNjY2Ii5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgVGhlIHA0ZCBzZXJ2ZXIgYW5kIHBvcnQgdG8gY29ubmVjdCB0bzsKKyBvcHRpb25hbCwgZGVmYXVsdCAicGVyZm9yY2U6MTY2NiIKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0EgcHJvcGVydHkgdG8gYmUgc2V0IHdpdGggdGhlIHZhbHVlIG9mIHRoZSBjb3VudGVyLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBBIHByb3BlcnR5IHRvIGJlIHNldCB3aXRoIHRoZSB2YWx1ZSBvZiB0aGUgY291bnRlcgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InVzZXIiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgcDQgdXNlcm5hbWU7Cisgb3B0aW9uYWwsIGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IHVzZXIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRoZSBwNCB1c2VybmFtZTsKKyBvcHRpb25hbCwgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgdXNlcgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJpbnQiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iaW50IiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgbmV3IHZhbHVlIGZvciB0aGUgY291bnRlcjsgb3B0aW9uYWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRoZSBuZXcgdmFsdWUgZm9yIHRoZSBjb3VudGVyOyBvcHRpb25hbC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2aWV3IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGNsaWVudCwgYnJhbmNoIG9yIGxhYmVsIHZpZXcgdG8gb3BlcmF0ZSB1cG9uOworIG9wdGlvbmFsIGRlZmF1bHQgIi8vLi4uIi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgVGhlIGNsaWVudCwgYnJhbmNoIG9yIGxhYmVsIHZpZXcgdG8gb3BlcmF0ZSB1cG9uOworIG9wdGlvbmFsIGRlZmF1bHQgIi8vLi4uIgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgPC9hdHRyaWJ1dGVzPgorCisgICAgPGVsZW1lbnRzPgorICAgIDwvZWxlbWVudHM+CisKKyAgPC9zdHJ1Y3R1cmU+CisKKzwvdGFzaz4KKworCis8dGFzayBuYW1lPSJwNGRlbGV0ZSIgY2F0ZWdvcnk9Im90aGVyIgorICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5wZXJmb3JjZS5QNERlbGV0ZSIKKyAgICAgID4KKworICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ2hlY2tvdXQgZmlsZXMgZm9yIGRlbGV0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgIDxkZXNjcmlwdGlvbj4KKyAgICA8IVtDREFUQVtDaGVja291dCBmaWxlcyBmb3IgZGVsZXRpb24uCisKKyBFeGFtcGxlIFVzYWdlOjxicj4KKyAmbHQ7cDRkZWxldGUgY2hhbmdlPSIke3A0LmNoYW5nZX0iIHZpZXc9Ii8vZGVwb3QvcHJvamVjdC9mb28udHh0IiAvJmd0Ozxicj4KKworIFNpbXBsZSByZS13cml0ZSBvZiBQNEVkaXQgY2hhbmdpbmcgJ2VkaXQnIHRvICdkZWxldGUnLjxicj5dXT4KKyAgPC9kZXNjcmlwdGlvbj4KKworICA8c3RydWN0dXJlPgorCisgICAgPGF0dHJpYnV0ZXM+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNoYW5nZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FuIGV4aXN0aW5nIGNoYW5nZWxpc3QgbnVtYmVyIGZvciB0aGUgZGVsZXRpb247IG9wdGlvbmFsCisgYnV0IHN0cm9uZ2x5IHJlY29tbWVuZGVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBBbiBleGlzdGluZyBjaGFuZ2VsaXN0IG51bWJlciBmb3IgdGhlIGRlbGV0aW9uOyBvcHRpb25hbAorIGJ1dCBzdHJvbmdseSByZWNvbW1lbmRlZC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGllbnQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgcDQgY2xpZW50IHNwZWMgdG8gdXNlOworIG9wdGlvbmFsLCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCB1c2VyLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBUaGUgcDQgY2xpZW50IHNwZWMgdG8gdXNlOworIG9wdGlvbmFsLCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCB1c2VyCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY21kb3B0cyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NldCBleHRyYSBjb21tYW5kIG9wdGlvbnM7IG9ubHkgdXNlZCBvbiBzb21lCisgb2YgdGhlIFBlcmZvcmNlIHRhc2tzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgZXh0cmEgY29tbWFuZCBvcHRpb25zOyBvbmx5IHVzZWQgb24gc29tZQorIG9mIHRoZSBQZXJmb3JjZSB0YXNrcy4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmYWlsb25lcnJvciIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtXaGV0aGVyIHRvIHN0b3AgdGhlIGJ1aWxkICh0cnVlLCBkZWZhdWx0KSAKKyBvciBrZWVwIGdvaW5nIGlmIGFuIGVycm9yIGlzIHJldHVybmVkIGZyb20gdGhlIHA0IGNvbW1hbmQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIHdoZXRoZXIgdG8gc3RvcCB0aGUgYnVpbGQgKHRydWUsIGRlZmF1bHQpIAorIG9yIGtlZXAgZ29pbmcgaWYgYW4gZXJyb3IgaXMgcmV0dXJuZWQgZnJvbSB0aGUgcDQgY29tbWFuZAorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InBvcnQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgcDRkIHNlcnZlciBhbmQgcG9ydCB0byBjb25uZWN0IHRvOworIG9wdGlvbmFsLCBkZWZhdWx0ICJwZXJmb3JjZToxNjY2Ii5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgVGhlIHA0ZCBzZXJ2ZXIgYW5kIHBvcnQgdG8gY29ubmVjdCB0bzsKKyBvcHRpb25hbCwgZGVmYXVsdCAicGVyZm9yY2U6MTY2NiIKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1c2VyIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIHA0IHVzZXJuYW1lOworIG9wdGlvbmFsLCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCB1c2VyLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBUaGUgcDQgdXNlcm5hbWU7Cisgb3B0aW9uYWwsIGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IHVzZXIKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2aWV3IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGNsaWVudCwgYnJhbmNoIG9yIGxhYmVsIHZpZXcgdG8gb3BlcmF0ZSB1cG9uOworIG9wdGlvbmFsIGRlZmF1bHQgIi8vLi4uIi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgVGhlIGNsaWVudCwgYnJhbmNoIG9yIGxhYmVsIHZpZXcgdG8gb3BlcmF0ZSB1cG9uOworIG9wdGlvbmFsIGRlZmF1bHQgIi8vLi4uIgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgPC9hdHRyaWJ1dGVzPgorCisgICAgPGVsZW1lbnRzPgorICAgIDwvZWxlbWVudHM+CisKKyAgPC9zdHJ1Y3R1cmU+CisKKzwvdGFzaz4KKworCis8dGFzayBuYW1lPSJwNGVkaXQiIGNhdGVnb3J5PSJvdGhlciIKKyAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwucGVyZm9yY2UuUDRFZGl0IgorICAgICAgPgorCisgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtPcGVuIGZpbGUocykgZm9yIGVkaXQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgPGRlc2NyaXB0aW9uPgorICAgIDwhW0NEQVRBW09wZW4gZmlsZShzKSBmb3IgZWRpdC4gCisgUDRDaGFuZ2Ugc2hvdWxkIGJlIHVzZWQgdG8gb2J0YWluIGEgbmV3IGNoYW5nZWxpc3QgZm9yIFA0RWRpdCBhcywKKyBhbHRob3VnaCBQNEVkaXQgY2FuIG9wZW4gZmlsZXMgdG8gdGhlIGRlZmF1bHQgY2hhbmdlLCAgCisgUDRTdWJtaXQgY2Fubm90IHlldCBzdWJtaXQgdG8gaXQuCisgRXhhbXBsZSBVc2FnZTo8YnI+CisgJmx0O3A0ZWRpdCBjaGFuZ2U9IiR7cDQuY2hhbmdlfSIgdmlldz0iLy9kZXBvdC9wcm9qZWN0L2Zvby50eHQiIC8mZ3Q7XV0+CisgIDwvZGVzY3JpcHRpb24+CisKKyAgPHN0cnVjdHVyZT4KKworICAgIDxhdHRyaWJ1dGVzPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjaGFuZ2UiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBbiBleGlzdGluZyBjaGFuZ2VsaXN0IG51bWJlciB0byBhc3NpZ24gZmlsZXMgdG87IG9wdGlvbmFsCisgYnV0IHN0cm9uZ2x5IHJlY29tbWVuZGVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBBbiBleGlzdGluZyBjaGFuZ2VsaXN0IG51bWJlciB0byBhc3NpZ24gZmlsZXMgdG87IG9wdGlvbmFsCisgYnV0IHN0cm9uZ2x5IHJlY29tbWVuZGVkLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsaWVudCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBwNCBjbGllbnQgc3BlYyB0byB1c2U7Cisgb3B0aW9uYWwsIGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IHVzZXIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRoZSBwNCBjbGllbnQgc3BlYyB0byB1c2U7Cisgb3B0aW9uYWwsIGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IHVzZXIKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbWRvcHRzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2V0IGV4dHJhIGNvbW1hbmQgb3B0aW9uczsgb25seSB1c2VkIG9uIHNvbWUKKyBvZiB0aGUgUGVyZm9yY2UgdGFza3MuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCBleHRyYSBjb21tYW5kIG9wdGlvbnM7IG9ubHkgdXNlZCBvbiBzb21lCisgb2YgdGhlIFBlcmZvcmNlIHRhc2tzLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImZhaWxvbmVycm9yIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1doZXRoZXIgdG8gc3RvcCB0aGUgYnVpbGQgKHRydWUsIGRlZmF1bHQpIAorIG9yIGtlZXAgZ29pbmcgaWYgYW4gZXJyb3IgaXMgcmV0dXJuZWQgZnJvbSB0aGUgcDQgY29tbWFuZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgd2hldGhlciB0byBzdG9wIHRoZSBidWlsZCAodHJ1ZSwgZGVmYXVsdCkgCisgb3Iga2VlcCBnb2luZyBpZiBhbiBlcnJvciBpcyByZXR1cm5lZCBmcm9tIHRoZSBwNCBjb21tYW5kCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9ydCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBwNGQgc2VydmVyIGFuZCBwb3J0IHRvIGNvbm5lY3QgdG87Cisgb3B0aW9uYWwsIGRlZmF1bHQgInBlcmZvcmNlOjE2NjYiLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBUaGUgcDRkIHNlcnZlciBhbmQgcG9ydCB0byBjb25uZWN0IHRvOworIG9wdGlvbmFsLCBkZWZhdWx0ICJwZXJmb3JjZToxNjY2IgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InVzZXIiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgcDQgdXNlcm5hbWU7Cisgb3B0aW9uYWwsIGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IHVzZXIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRoZSBwNCB1c2VybmFtZTsKKyBvcHRpb25hbCwgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgdXNlcgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InZpZXciIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgY2xpZW50LCBicmFuY2ggb3IgbGFiZWwgdmlldyB0byBvcGVyYXRlIHVwb247Cisgb3B0aW9uYWwgZGVmYXVsdCAiLy8uLi4iLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBUaGUgY2xpZW50LCBicmFuY2ggb3IgbGFiZWwgdmlldyB0byBvcGVyYXRlIHVwb247Cisgb3B0aW9uYWwgZGVmYXVsdCAiLy8uLi4iCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICA8L2F0dHJpYnV0ZXM+CisKKyAgICA8ZWxlbWVudHM+CisgICAgPC9lbGVtZW50cz4KKworICA8L3N0cnVjdHVyZT4KKworPC90YXNrPgorCisKKzx0YXNrIG5hbWU9InA0aGF2ZSIgY2F0ZWdvcnk9Im90aGVyIgorICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5wZXJmb3JjZS5QNEhhdmUiCisgICAgICA+CisKKyAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0xpc3RzIFBlcmZvcmNlIGZpbGVzIGN1cnJlbnRseSBvbiBjbGllbnQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgPGRlc2NyaXB0aW9uPgorICAgIDwhW0NEQVRBW0xpc3RzIFBlcmZvcmNlIGZpbGVzIGN1cnJlbnRseSBvbiBjbGllbnQuCisKKyBQNEhhdmUgc2ltcGx5IGR1bXBzIHRoZSBjdXJyZW50IGZpbGUgdmVyc2lvbiBpbmZvIGludG8KKyB0aGUgQW50IGxvZyAob3Igc3Rkb3V0KS5dXT4KKyAgPC9kZXNjcmlwdGlvbj4KKworICA8c3RydWN0dXJlPgorCisgICAgPGF0dHJpYnV0ZXM+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsaWVudCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBwNCBjbGllbnQgc3BlYyB0byB1c2U7Cisgb3B0aW9uYWwsIGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IHVzZXIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRoZSBwNCBjbGllbnQgc3BlYyB0byB1c2U7Cisgb3B0aW9uYWwsIGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IHVzZXIKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbWRvcHRzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2V0IGV4dHJhIGNvbW1hbmQgb3B0aW9uczsgb25seSB1c2VkIG9uIHNvbWUKKyBvZiB0aGUgUGVyZm9yY2UgdGFza3MuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCBleHRyYSBjb21tYW5kIG9wdGlvbnM7IG9ubHkgdXNlZCBvbiBzb21lCisgb2YgdGhlIFBlcmZvcmNlIHRhc2tzLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImZhaWxvbmVycm9yIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1doZXRoZXIgdG8gc3RvcCB0aGUgYnVpbGQgKHRydWUsIGRlZmF1bHQpIAorIG9yIGtlZXAgZ29pbmcgaWYgYW4gZXJyb3IgaXMgcmV0dXJuZWQgZnJvbSB0aGUgcDQgY29tbWFuZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgd2hldGhlciB0byBzdG9wIHRoZSBidWlsZCAodHJ1ZSwgZGVmYXVsdCkgCisgb3Iga2VlcCBnb2luZyBpZiBhbiBlcnJvciBpcyByZXR1cm5lZCBmcm9tIHRoZSBwNCBjb21tYW5kCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9ydCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBwNGQgc2VydmVyIGFuZCBwb3J0IHRvIGNvbm5lY3QgdG87Cisgb3B0aW9uYWwsIGRlZmF1bHQgInBlcmZvcmNlOjE2NjYiLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBUaGUgcDRkIHNlcnZlciBhbmQgcG9ydCB0byBjb25uZWN0IHRvOworIG9wdGlvbmFsLCBkZWZhdWx0ICJwZXJmb3JjZToxNjY2IgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InVzZXIiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgcDQgdXNlcm5hbWU7Cisgb3B0aW9uYWwsIGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IHVzZXIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRoZSBwNCB1c2VybmFtZTsKKyBvcHRpb25hbCwgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgdXNlcgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InZpZXciIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgY2xpZW50LCBicmFuY2ggb3IgbGFiZWwgdmlldyB0byBvcGVyYXRlIHVwb247Cisgb3B0aW9uYWwgZGVmYXVsdCAiLy8uLi4iLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBUaGUgY2xpZW50LCBicmFuY2ggb3IgbGFiZWwgdmlldyB0byBvcGVyYXRlIHVwb247Cisgb3B0aW9uYWwgZGVmYXVsdCAiLy8uLi4iCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICA8L2F0dHJpYnV0ZXM+CisKKyAgICA8ZWxlbWVudHM+CisgICAgPC9lbGVtZW50cz4KKworICA8L3N0cnVjdHVyZT4KKworPC90YXNrPgorCisKKzx0YXNrIG5hbWU9InA0bGFiZWwiIGNhdGVnb3J5PSJvdGhlciIKKyAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwucGVyZm9yY2UuUDRMYWJlbCIKKyAgICAgID4KKworICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ3JlYXRlcyBhIG5ldyBQZXJmb3JjZSBsYWJlbCBhbmQgc2V0IGNvbnRlbnRzIHRvIHJlZmxlY3QgY3VycmVudCBjbGllbnQgZmlsZSByZXZpc2lvbnMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgPGRlc2NyaXB0aW9uPgorICAgIDwhW0NEQVRBW0NyZWF0ZXMgYSBuZXcgUGVyZm9yY2UgbGFiZWwgYW5kIHNldCBjb250ZW50cyB0byByZWZsZWN0IGN1cnJlbnQKKyAgY2xpZW50IGZpbGUgcmV2aXNpb25zLgorCisgIExhYmVsIG5hbWUgZGVmYXVsdHMgdG8gQW50TGFiZWwgaWYgbm9uZSBzZXQuCisKKyBFeGFtcGxlIFVzYWdlOgorIDxwcmU+CisgICAmbHQ7UDRMYWJlbCBuYW1lPSJNeUxhYmVsLSR7VFNUQU1QfS0ke0RTVEFNUH0iIGRlc2M9IkF1dG8gQnVpbGQgTGFiZWwiIC8mZ3Q7CisgPC9wcmU+XV0+CisgIDwvZGVzY3JpcHRpb24+CisKKyAgPHN0cnVjdHVyZT4KKworICAgIDxhdHRyaWJ1dGVzPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGllbnQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgcDQgY2xpZW50IHNwZWMgdG8gdXNlOworIG9wdGlvbmFsLCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCB1c2VyLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBUaGUgcDQgY2xpZW50IHNwZWMgdG8gdXNlOworIG9wdGlvbmFsLCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCB1c2VyCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY21kb3B0cyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NldCBleHRyYSBjb21tYW5kIG9wdGlvbnM7IG9ubHkgdXNlZCBvbiBzb21lCisgb2YgdGhlIFBlcmZvcmNlIHRhc2tzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgZXh0cmEgY29tbWFuZCBvcHRpb25zOyBvbmx5IHVzZWQgb24gc29tZQorIG9mIHRoZSBQZXJmb3JjZSB0YXNrcy4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXNjIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTGFiZWwgRGVzY3JpcHRpb247IG9wdGlvbmFsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBMYWJlbCBEZXNjcmlwdGlvbjsgb3B0aW9uYWwKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmYWlsb25lcnJvciIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtXaGV0aGVyIHRvIHN0b3AgdGhlIGJ1aWxkICh0cnVlLCBkZWZhdWx0KSAKKyBvciBrZWVwIGdvaW5nIGlmIGFuIGVycm9yIGlzIHJldHVybmVkIGZyb20gdGhlIHA0IGNvbW1hbmQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIHdoZXRoZXIgdG8gc3RvcCB0aGUgYnVpbGQgKHRydWUsIGRlZmF1bHQpIAorIG9yIGtlZXAgZ29pbmcgaWYgYW4gZXJyb3IgaXMgcmV0dXJuZWQgZnJvbSB0aGUgcDQgY29tbWFuZAorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImxvY2siIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtXaGVuIHNldCB0byAibG9ja2VkIiwgUGVyZm9yY2Ugd2lsbCBsb2NrIHRoZSBsYWJlbCBvbmNlIGNyZWF0ZWQ7IG9wdGlvbmFsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICB3aGVuIHNldCB0byAibG9ja2VkIiwgUGVyZm9yY2Ugd2lsbCBsb2NrIHRoZSBsYWJlbCBvbmNlIGNyZWF0ZWQ7IG9wdGlvbmFsLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgbmFtZSBvZiB0aGUgbGFiZWw7IG9wdGlvbmFsLCBkZWZhdWx0ICJBbnRMYWJlbCIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBsYWJlbDsgb3B0aW9uYWwsIGRlZmF1bHQgIkFudExhYmVsIgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InBvcnQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgcDRkIHNlcnZlciBhbmQgcG9ydCB0byBjb25uZWN0IHRvOworIG9wdGlvbmFsLCBkZWZhdWx0ICJwZXJmb3JjZToxNjY2Ii5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgVGhlIHA0ZCBzZXJ2ZXIgYW5kIHBvcnQgdG8gY29ubmVjdCB0bzsKKyBvcHRpb25hbCwgZGVmYXVsdCAicGVyZm9yY2U6MTY2NiIKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1c2VyIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIHA0IHVzZXJuYW1lOworIG9wdGlvbmFsLCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCB1c2VyLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBUaGUgcDQgdXNlcm5hbWU7Cisgb3B0aW9uYWwsIGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IHVzZXIKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2aWV3IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGNsaWVudCwgYnJhbmNoIG9yIGxhYmVsIHZpZXcgdG8gb3BlcmF0ZSB1cG9uOworIG9wdGlvbmFsIGRlZmF1bHQgIi8vLi4uIi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgVGhlIGNsaWVudCwgYnJhbmNoIG9yIGxhYmVsIHZpZXcgdG8gb3BlcmF0ZSB1cG9uOworIG9wdGlvbmFsIGRlZmF1bHQgIi8vLi4uIgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgPC9hdHRyaWJ1dGVzPgorCisgICAgPGVsZW1lbnRzPgorICAgIDwvZWxlbWVudHM+CisKKyAgPC9zdHJ1Y3R1cmU+CisKKzwvdGFzaz4KKworCis8dGFzayBuYW1lPSJwNHJlb3BlbiIgY2F0ZWdvcnk9Im90aGVyIgorICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5wZXJmb3JjZS5QNFJlb3BlbiIKKyAgICAgID4KKworICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTm8gRGVzY3JpcHRpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgPGRlc2NyaXB0aW9uPgorICAgIDwhW0NEQVRBW11dPgorICA8L2Rlc2NyaXB0aW9uPgorCisgIDxzdHJ1Y3R1cmU+CisKKyAgICA8YXR0cmlidXRlcz4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xpZW50IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIHA0IGNsaWVudCBzcGVjIHRvIHVzZTsKKyBvcHRpb25hbCwgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgdXNlci5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgVGhlIHA0IGNsaWVudCBzcGVjIHRvIHVzZTsKKyBvcHRpb25hbCwgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgdXNlcgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNtZG9wdHMiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTZXQgZXh0cmEgY29tbWFuZCBvcHRpb25zOyBvbmx5IHVzZWQgb24gc29tZQorIG9mIHRoZSBQZXJmb3JjZSB0YXNrcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IGV4dHJhIGNvbW1hbmQgb3B0aW9uczsgb25seSB1c2VkIG9uIHNvbWUKKyBvZiB0aGUgUGVyZm9yY2UgdGFza3MuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmFpbG9uZXJyb3IiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbV2hldGhlciB0byBzdG9wIHRoZSBidWlsZCAodHJ1ZSwgZGVmYXVsdCkgCisgb3Iga2VlcCBnb2luZyBpZiBhbiBlcnJvciBpcyByZXR1cm5lZCBmcm9tIHRoZSBwNCBjb21tYW5kLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICB3aGV0aGVyIHRvIHN0b3AgdGhlIGJ1aWxkICh0cnVlLCBkZWZhdWx0KSAKKyBvciBrZWVwIGdvaW5nIGlmIGFuIGVycm9yIGlzIHJldHVybmVkIGZyb20gdGhlIHA0IGNvbW1hbmQKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb3J0IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIHA0ZCBzZXJ2ZXIgYW5kIHBvcnQgdG8gY29ubmVjdCB0bzsKKyBvcHRpb25hbCwgZGVmYXVsdCAicGVyZm9yY2U6MTY2NiIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRoZSBwNGQgc2VydmVyIGFuZCBwb3J0IHRvIGNvbm5lY3QgdG87Cisgb3B0aW9uYWwsIGRlZmF1bHQgInBlcmZvcmNlOjE2NjYiCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idG9jaGFuZ2UiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgY2hhbmdlbGlzdCB0byBtb3ZlIGZpbGVzIHRvOyByZXF1aXJlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgVGhlIGNoYW5nZWxpc3QgdG8gbW92ZSBmaWxlcyB0bzsgcmVxdWlyZWQuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idXNlciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBwNCB1c2VybmFtZTsKKyBvcHRpb25hbCwgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgdXNlci5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgVGhlIHA0IHVzZXJuYW1lOworIG9wdGlvbmFsLCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCB1c2VyCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmlldyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBjbGllbnQsIGJyYW5jaCBvciBsYWJlbCB2aWV3IHRvIG9wZXJhdGUgdXBvbjsKKyBvcHRpb25hbCBkZWZhdWx0ICIvLy4uLiIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRoZSBjbGllbnQsIGJyYW5jaCBvciBsYWJlbCB2aWV3IHRvIG9wZXJhdGUgdXBvbjsKKyBvcHRpb25hbCBkZWZhdWx0ICIvLy4uLiIKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgIDwvYXR0cmlidXRlcz4KKworICAgIDxlbGVtZW50cz4KKyAgICA8L2VsZW1lbnRzPgorCisgIDwvc3RydWN0dXJlPgorCis8L3Rhc2s+CisKKworPHRhc2sgbmFtZT0icDRyZXZlcnQiIGNhdGVnb3J5PSJvdGhlciIKKyAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwucGVyZm9yY2UuUDRSZXZlcnQiCisgICAgICA+CisKKyAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1JldmVydCBQZXJmb3JjZSBvcGVuIGZpbGVzIG9yIGZpbGVzIGluIGEgY2hhbmdlbGlzdF1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgIDxkZXNjcmlwdGlvbj4KKyAgICA8IVtDREFUQVtSZXZlcnQgUGVyZm9yY2Ugb3BlbiBmaWxlcyBvciBmaWxlcyBpbiBhIGNoYW5nZWxpc3RdXT4KKyAgPC9kZXNjcmlwdGlvbj4KKworICA8c3RydWN0dXJlPgorCisgICAgPGF0dHJpYnV0ZXM+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNoYW5nZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBjaGFuZ2VsaXN0IHRvIHJldmVydDsgb3B0aW9uYWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRoZSBjaGFuZ2VsaXN0IHRvIHJldmVydDsgb3B0aW9uYWwuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xpZW50IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIHA0IGNsaWVudCBzcGVjIHRvIHVzZTsKKyBvcHRpb25hbCwgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgdXNlci5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgVGhlIHA0IGNsaWVudCBzcGVjIHRvIHVzZTsKKyBvcHRpb25hbCwgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgdXNlcgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNtZG9wdHMiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTZXQgZXh0cmEgY29tbWFuZCBvcHRpb25zOyBvbmx5IHVzZWQgb24gc29tZQorIG9mIHRoZSBQZXJmb3JjZSB0YXNrcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IGV4dHJhIGNvbW1hbmQgb3B0aW9uczsgb25seSB1c2VkIG9uIHNvbWUKKyBvZiB0aGUgUGVyZm9yY2UgdGFza3MuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmFpbG9uZXJyb3IiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbV2hldGhlciB0byBzdG9wIHRoZSBidWlsZCAodHJ1ZSwgZGVmYXVsdCkgCisgb3Iga2VlcCBnb2luZyBpZiBhbiBlcnJvciBpcyByZXR1cm5lZCBmcm9tIHRoZSBwNCBjb21tYW5kLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICB3aGV0aGVyIHRvIHN0b3AgdGhlIGJ1aWxkICh0cnVlLCBkZWZhdWx0KSAKKyBvciBrZWVwIGdvaW5nIGlmIGFuIGVycm9yIGlzIHJldHVybmVkIGZyb20gdGhlIHA0IGNvbW1hbmQKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb3J0IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIHA0ZCBzZXJ2ZXIgYW5kIHBvcnQgdG8gY29ubmVjdCB0bzsKKyBvcHRpb25hbCwgZGVmYXVsdCAicGVyZm9yY2U6MTY2NiIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRoZSBwNGQgc2VydmVyIGFuZCBwb3J0IHRvIGNvbm5lY3QgdG87Cisgb3B0aW9uYWwsIGRlZmF1bHQgInBlcmZvcmNlOjE2NjYiCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icmV2ZXJ0b25seXVuY2hhbmdlZCIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtGbGFnIHRvIHJldmVydCBvbmx5IHVuY2hhbmdlZCBmaWxlcyAocDQgcmV2ZXJ0IC1hKTsgb3B0aW9uYWwsIGRlZmF1bHQgZmFsc2UuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIGZsYWcgdG8gcmV2ZXJ0IG9ubHkgdW5jaGFuZ2VkIGZpbGVzIChwNCByZXZlcnQgLWEpOyBvcHRpb25hbCwgZGVmYXVsdCBmYWxzZS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1c2VyIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIHA0IHVzZXJuYW1lOworIG9wdGlvbmFsLCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCB1c2VyLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBUaGUgcDQgdXNlcm5hbWU7Cisgb3B0aW9uYWwsIGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IHVzZXIKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2aWV3IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGNsaWVudCwgYnJhbmNoIG9yIGxhYmVsIHZpZXcgdG8gb3BlcmF0ZSB1cG9uOworIG9wdGlvbmFsIGRlZmF1bHQgIi8vLi4uIi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgVGhlIGNsaWVudCwgYnJhbmNoIG9yIGxhYmVsIHZpZXcgdG8gb3BlcmF0ZSB1cG9uOworIG9wdGlvbmFsIGRlZmF1bHQgIi8vLi4uIgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgPC9hdHRyaWJ1dGVzPgorCisgICAgPGVsZW1lbnRzPgorICAgIDwvZWxlbWVudHM+CisKKyAgPC9zdHJ1Y3R1cmU+CisKKzwvdGFzaz4KKworCis8dGFzayBuYW1lPSJwNHN1Ym1pdCIgY2F0ZWdvcnk9Im90aGVyIgorICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5wZXJmb3JjZS5QNFN1Ym1pdCIKKyAgICAgID4KKworICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU3VibWl0cyBhIG51bWJlcmVkIGNoYW5nZWxpc3QgdG8gUGVyZm9yY2UuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgPGRlc2NyaXB0aW9uPgorICAgIDwhW0NEQVRBW1N1Ym1pdHMgYSBudW1iZXJlZCBjaGFuZ2VsaXN0IHRvIFBlcmZvcmNlLgorCisgPEI+Tm90ZTo8L0I+IFA0U3VibWl0IGNhbm5vdCAoeWV0KSBzdWJtaXQgdGhlIGRlZmF1bHQgY2hhbmdlbGlzdC4KKyBUaGlzIHNob3VsZG4ndCBiZSBhIHByb2JsZW0gd2l0aCB0aGUgQU5UIHRhc2sgYXMgdGhlIHVzdWFsIGZsb3cgaXMKKyBQNENoYW5nZSB0byBjcmVhdGUgYSBuZXcgbnVtYmVyZWQgY2hhbmdlIGZvbGxvd2VkIGJ5IFA0RWRpdCB0aGVuIFA0U3VibWl0LgorCisgRXhhbXBsZSBVc2FnZTotPGJyPgorICZsdDtwNHN1Ym1pdCBjaGFuZ2U9IiR7cDQuY2hhbmdlfSIgLyZndDtdXT4KKyAgPC9kZXNjcmlwdGlvbj4KKworICA8c3RydWN0dXJlPgorCisgICAgPGF0dHJpYnV0ZXM+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNoYW5nZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBjaGFuZ2VsaXN0IG51bWJlciB0byBzdWJtaXQ7IHJlcXVpcmVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBUaGUgY2hhbmdlbGlzdCBudW1iZXIgdG8gc3VibWl0OyByZXF1aXJlZC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGllbnQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgcDQgY2xpZW50IHNwZWMgdG8gdXNlOworIG9wdGlvbmFsLCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCB1c2VyLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBUaGUgcDQgY2xpZW50IHNwZWMgdG8gdXNlOworIG9wdGlvbmFsLCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCB1c2VyCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY21kb3B0cyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NldCBleHRyYSBjb21tYW5kIG9wdGlvbnM7IG9ubHkgdXNlZCBvbiBzb21lCisgb2YgdGhlIFBlcmZvcmNlIHRhc2tzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgZXh0cmEgY29tbWFuZCBvcHRpb25zOyBvbmx5IHVzZWQgb24gc29tZQorIG9mIHRoZSBQZXJmb3JjZSB0YXNrcy4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmYWlsb25lcnJvciIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtXaGV0aGVyIHRvIHN0b3AgdGhlIGJ1aWxkICh0cnVlLCBkZWZhdWx0KSAKKyBvciBrZWVwIGdvaW5nIGlmIGFuIGVycm9yIGlzIHJldHVybmVkIGZyb20gdGhlIHA0IGNvbW1hbmQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIHdoZXRoZXIgdG8gc3RvcCB0aGUgYnVpbGQgKHRydWUsIGRlZmF1bHQpIAorIG9yIGtlZXAgZ29pbmcgaWYgYW4gZXJyb3IgaXMgcmV0dXJuZWQgZnJvbSB0aGUgcDQgY29tbWFuZAorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InBvcnQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgcDRkIHNlcnZlciBhbmQgcG9ydCB0byBjb25uZWN0IHRvOworIG9wdGlvbmFsLCBkZWZhdWx0ICJwZXJmb3JjZToxNjY2Ii5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgVGhlIHA0ZCBzZXJ2ZXIgYW5kIHBvcnQgdG8gY29ubmVjdCB0bzsKKyBvcHRpb25hbCwgZGVmYXVsdCAicGVyZm9yY2U6MTY2NiIKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1c2VyIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIHA0IHVzZXJuYW1lOworIG9wdGlvbmFsLCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCB1c2VyLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBUaGUgcDQgdXNlcm5hbWU7Cisgb3B0aW9uYWwsIGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IHVzZXIKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2aWV3IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGNsaWVudCwgYnJhbmNoIG9yIGxhYmVsIHZpZXcgdG8gb3BlcmF0ZSB1cG9uOworIG9wdGlvbmFsIGRlZmF1bHQgIi8vLi4uIi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgVGhlIGNsaWVudCwgYnJhbmNoIG9yIGxhYmVsIHZpZXcgdG8gb3BlcmF0ZSB1cG9uOworIG9wdGlvbmFsIGRlZmF1bHQgIi8vLi4uIgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgPC9hdHRyaWJ1dGVzPgorCisgICAgPGVsZW1lbnRzPgorICAgIDwvZWxlbWVudHM+CisKKyAgPC9zdHJ1Y3R1cmU+CisKKzwvdGFzaz4KKworCis8dGFzayBuYW1lPSJwNHN5bmMiIGNhdGVnb3J5PSJvdGhlciIKKyAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwucGVyZm9yY2UuUDRTeW5jIgorICAgICAgPgorCisgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTeW5jaHJvbml6ZSBjbGllbnQgc3BhY2UgdG8gYSBQZXJmb3JjZSBkZXBvdCB2aWV3Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgIDxkZXNjcmlwdGlvbj4KKyAgICA8IVtDREFUQVtTeW5jaHJvbml6ZSBjbGllbnQgc3BhY2UgdG8gYSBQZXJmb3JjZSBkZXBvdCB2aWV3LgorCisgIFRoZSBBUEkgYWxsb3dzIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eSBvZiB0aGUgInA0IHN5bmMiIGNvbW1hbmQKKyAoc3VjaCBhcyAicDQgc3luYyAtZiAvLy4uLiNoYXZlIiBvciBvdGhlciBleG90aWMgaW52b2NhdGlvbnMpLjwvUD4KKworIDxiPkV4YW1wbGUgVXNhZ2U6PC9iPgorIDx0YWJsZSBib3JkZXI9IjEiPgorIDx0aD5GdW5jdGlvbjwvdGg+PHRoPkNvbW1hbmQ8L3RoPgorIDx0cj48dGQ+U3luYyB0byBoZWFkIHVzaW5nIFA0VVNFUiwgUDRQT1JUIGFuZCBQNENMSUVOVCBzZXR0aW5ncyBzcGVjaWZpZWQ8L3RkPjx0ZD4mbHQ7UDRTeW5jIDxicj5QNHZpZXc9Ii8vcHJvamVjdHMvZm9vL21haW4vc291cmNlLy4uLiIgPGJyPlA0VXNlcj0iZmJsb2dncyIgPGJyPlA0UG9ydD0ia20wMToxNjY2IiA8YnI+UDRDbGllbnQ9ImZibG9nZ3NjbGllbnQiIC8mZ3Q7PC90ZD48L3RyPgorIDx0cj48dGQ+U3luYyB0byBoZWFkIHVzaW5nIFA0VVNFUiwgUDRQT1JUIGFuZCBQNENMSUVOVCBzZXR0aW5ncyBkZWZpbmVkIGluIGVudmlyb25tZW50PC90ZD48dGQ+Jmx0O1A0U3luYyBQNHZpZXc9Ii8vcHJvamVjdHMvZm9vL21haW4vc291cmNlLy4uLiIgLyZndDs8L3RkPjwvdHI+CisgPHRyPjx0ZD5Gb3JjZSBhIHJlLXN5bmMgdG8gaGVhZCwgcmVmcmVzaGluZyBhbGwgZmlsZXM8L3RkPjx0ZD4mbHQ7UDRTeW5jIGZvcmNlPSJ5ZXMiIFA0dmlldz0iLy9wcm9qZWN0cy9mb28vbWFpbi9zb3VyY2UvLi4uIiAvJmd0OzwvdGQ+PC90cj4KKyA8dHI+PHRkPlN5bmMgdG8gYSBsYWJlbDwvdGQ+PHRkPiZsdDtQNFN5bmMgbGFiZWw9Im15UGVyZm9yY2VMYWJlbCIgLyZndDs8L3RkPjwvdHI+CisgPC90YWJsZT5dXT4KKyAgPC9kZXNjcmlwdGlvbj4KKworICA8c3RydWN0dXJlPgorCisgICAgPGF0dHJpYnV0ZXM+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsaWVudCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBwNCBjbGllbnQgc3BlYyB0byB1c2U7Cisgb3B0aW9uYWwsIGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IHVzZXIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRoZSBwNCBjbGllbnQgc3BlYyB0byB1c2U7Cisgb3B0aW9uYWwsIGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IHVzZXIKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbWRvcHRzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2V0IGV4dHJhIGNvbW1hbmQgb3B0aW9uczsgb25seSB1c2VkIG9uIHNvbWUKKyBvZiB0aGUgUGVyZm9yY2UgdGFza3MuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCBleHRyYSBjb21tYW5kIG9wdGlvbnM7IG9ubHkgdXNlZCBvbiBzb21lCisgb2YgdGhlIFBlcmZvcmNlIHRhc2tzLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImZhaWxvbmVycm9yIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1doZXRoZXIgdG8gc3RvcCB0aGUgYnVpbGQgKHRydWUsIGRlZmF1bHQpIAorIG9yIGtlZXAgZ29pbmcgaWYgYW4gZXJyb3IgaXMgcmV0dXJuZWQgZnJvbSB0aGUgcDQgY29tbWFuZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgd2hldGhlciB0byBzdG9wIHRoZSBidWlsZCAodHJ1ZSwgZGVmYXVsdCkgCisgb3Iga2VlcCBnb2luZyBpZiBhbiBlcnJvciBpcyByZXR1cm5lZCBmcm9tIHRoZSBwNCBjb21tYW5kCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZm9yY2UiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtGb3JjZSBhIHJlZnJlc2ggb2YgZmlsZXMsIGlmIHRoaXMgYXR0cmlidXRlIGlzIHNldDsgZmFsc2UgYnkgZGVmYXVsdC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgZm9yY2UgYSByZWZyZXNoIG9mIGZpbGVzLCBpZiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQ7IGZhbHNlIGJ5IGRlZmF1bHQuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibGFiZWwiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtMYWJlbCB0byBzeW5jIGNsaWVudCB0bzsgb3B0aW9uYWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIExhYmVsIHRvIHN5bmMgY2xpZW50IHRvOyBvcHRpb25hbC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb3J0IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIHA0ZCBzZXJ2ZXIgYW5kIHBvcnQgdG8gY29ubmVjdCB0bzsKKyBvcHRpb25hbCwgZGVmYXVsdCAicGVyZm9yY2U6MTY2NiIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRoZSBwNGQgc2VydmVyIGFuZCBwb3J0IHRvIGNvbm5lY3QgdG87Cisgb3B0aW9uYWwsIGRlZmF1bHQgInBlcmZvcmNlOjE2NjYiCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idXNlciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBwNCB1c2VybmFtZTsKKyBvcHRpb25hbCwgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgdXNlci5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgVGhlIHA0IHVzZXJuYW1lOworIG9wdGlvbmFsLCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCB1c2VyCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmlldyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBjbGllbnQsIGJyYW5jaCBvciBsYWJlbCB2aWV3IHRvIG9wZXJhdGUgdXBvbjsKKyBvcHRpb25hbCBkZWZhdWx0ICIvLy4uLiIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRoZSBjbGllbnQsIGJyYW5jaCBvciBsYWJlbCB2aWV3IHRvIG9wZXJhdGUgdXBvbjsKKyBvcHRpb25hbCBkZWZhdWx0ICIvLy4uLiIKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgIDwvYXR0cmlidXRlcz4KKworICAgIDxlbGVtZW50cz4KKyAgICA8L2VsZW1lbnRzPgorCisgIDwvc3RydWN0dXJlPgorCis8L3Rhc2s+CisKKworPHRhc2sgbmFtZT0icGFyYWxsZWwiIGNhdGVnb3J5PSJjb250cm9sIgorICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5QYXJhbGxlbCIKKyAgICAgID4KKworICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRXhlY3V0ZXMgdGhlIGNvbnRhaW5lZCB0YXNrcyBpbiBzZXBhcmF0ZSB0aHJlYWRzLCBjb250aW51aW5nIG9uY2UgYWxsIGFyZSBjb21wbGV0ZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgPGRlc2NyaXB0aW9uPgorICAgIDwhW0NEQVRBW0V4ZWN1dGVzIHRoZSBjb250YWluZWQgdGFza3MgaW4gc2VwYXJhdGUgdGhyZWFkcywgY29udGludWluZworIG9uY2UgYWxsIGFyZSBjb21wbGV0ZWQuCisgPHA+XV0+CisgIDwvZGVzY3JpcHRpb24+CisKKyAgPHN0cnVjdHVyZT4KKworICAgIDxhdHRyaWJ1dGVzPgorICAgIDwvYXR0cmlidXRlcz4KKworICAgIDxlbGVtZW50cz4KKyAgICA8L2VsZW1lbnRzPgorCisgIDwvc3RydWN0dXJlPgorCis8L3Rhc2s+CisKKworPHRhc2sgbmFtZT0icGF0Y2giIGNhdGVnb3J5PSJ1dGlsaXR5IgorICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5QYXRjaCIKKyAgICAgID4KKworICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbUGF0Y2hlcyBhIGZpbGUgYnkgYXBwbHlpbmcgYSAnZGlmZicgZmlsZSB0byBpdDsgcmVxdWlyZXMgInBhdGNoIiB0byBiZSBvbiB0aGUgZXhlY3V0aW9uIHBhdGguXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgPGRlc2NyaXB0aW9uPgorICAgIDwhW0NEQVRBW1BhdGNoZXMgYSBmaWxlIGJ5IGFwcGx5aW5nIGEgJ2RpZmYnIGZpbGUgdG8gaXQ7IHJlcXVpcmVzICJwYXRjaCIgdG8gYmUKKyBvbiB0aGUgZXhlY3V0aW9uIHBhdGguXV0+CisgIDwvZGVzY3JpcHRpb24+CisKKyAgPHN0cnVjdHVyZT4KKworICAgIDxhdHRyaWJ1dGVzPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJiYWNrdXBzIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0ZsYWcgdG8gY3JlYXRlIGJhY2t1cHM7IG9wdGlvbmFsLCBkZWZhdWx0PWZhbHNlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBmbGFnIHRvIGNyZWF0ZSBiYWNrdXBzOyBvcHRpb25hbCwgZGVmYXVsdD1mYWxzZQorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImRpciIgdHlwZT0iamF2YS5pby5GaWxlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBkaXJlY3RvcnkgdG8gcnVuIHRoZSBwYXRjaCBjb21tYW5kIGluLCBkZWZhdWx0cyB0byB0aGUKKyBwcm9qZWN0J3MgYmFzZSBkaXJlY3RvcnkuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRoZSBkaXJlY3RvcnkgdG8gcnVuIHRoZSBwYXRjaCBjb21tYW5kIGluLCBkZWZhdWx0cyB0byB0aGUKKyBwcm9qZWN0J3MgYmFzZSBkaXJlY3RvcnkuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWdub3Jld2hpdGVzcGFjZSIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtGbGFnIHRvIGlnbm9yZSB3aGl0ZXNwYWNlIGRpZmZlcmVuY2VzOyBkZWZhdWx0PWZhbHNlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBmbGFnIHRvIGlnbm9yZSB3aGl0ZXNwYWNlIGRpZmZlcmVuY2VzOyBkZWZhdWx0PWZhbHNlCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ib3JpZ2luYWxmaWxlIiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGZpbGUgdG8gcGF0Y2g7IG9wdGlvbmFsIGlmIGl0IGNhbiBiZSBpbmZlcnJlZCBmcm9tCisgdGhlIGRpZmYgZmlsZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgVGhlIGZpbGUgdG8gcGF0Y2g7IG9wdGlvbmFsIGlmIGl0IGNhbiBiZSBpbmZlcnJlZCBmcm9tCisgdGhlIGRpZmYgZmlsZQorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InBhdGNoZmlsZSIgdHlwZT0iamF2YS5pby5GaWxlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGRpZmYgb3V0cHV0OyByZXF1aXJlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgVGhlIGZpbGUgY29udGFpbmluZyB0aGUgZGlmZiBvdXRwdXQ7IHJlcXVpcmVkLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InF1aWV0IiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1dvcmsgc2lsZW50bHkgdW5sZXNzIGFuIGVycm9yIG9jY3Vyczsgb3B0aW9uYWwsIGRlZmF1bHQ9ZmFsc2UuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFdvcmsgc2lsZW50bHkgdW5sZXNzIGFuIGVycm9yIG9jY3Vyczsgb3B0aW9uYWwsIGRlZmF1bHQ9ZmFsc2UKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJyZXZlcnNlIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0Fzc3VtZSBwYXRjaCB3YXMgY3JlYXRlZCB3aXRoIG9sZCBhbmQgbmV3IGZpbGVzIHN3YXBwZWQ7IG9wdGlvbmFsLAorIGRlZmF1bHQ9ZmFsc2UuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIEFzc3VtZSBwYXRjaCB3YXMgY3JlYXRlZCB3aXRoIG9sZCBhbmQgbmV3IGZpbGVzIHN3YXBwZWQ7IG9wdGlvbmFsLAorIGRlZmF1bHQ9ZmFsc2UKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzdHJpcCIgdHlwZT0iaW50IgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImludCIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU3RyaXAgdGhlIHNtYWxsZXN0IHByZWZpeCBjb250YWluaW5nIDxpPm51bTwvaT4gbGVhZGluZyBzbGFzaGVzCisgZnJvbSBmaWxlbmFtZXMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFN0cmlwIHRoZSBzbWFsbGVzdCBwcmVmaXggY29udGFpbmluZyA8aT5udW08L2k+IGxlYWRpbmcgc2xhc2hlcworIGZyb20gZmlsZW5hbWVzLgorCisgPHA+cGF0Y2gncyA8aT4tcDwvaT4gb3B0aW9uLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgPC9hdHRyaWJ1dGVzPgorCisgICAgPGVsZW1lbnRzPgorICAgIDwvZWxlbWVudHM+CisKKyAgPC9zdHJ1Y3R1cmU+CisKKzwvdGFzaz4KKworCis8dGFzayBuYW1lPSJwYXRoY29udmVydCIgY2F0ZWdvcnk9InV0aWxpdHkiCisgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlBhdGhDb252ZXJ0IgorICAgICAgPgorCisgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDb252ZXJ0cyBwYXRoIGFuZCBjbGFzc3BhdGggaW5mb3JtYXRpb24gdG8gYSBzcGVjaWZpYyB0YXJnZXQgT1MgZm9ybWF0Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgIDxkZXNjcmlwdGlvbj4KKyAgICA8IVtDREFUQVtDb252ZXJ0cyBwYXRoIGFuZCBjbGFzc3BhdGggaW5mb3JtYXRpb24gdG8gYSBzcGVjaWZpYyB0YXJnZXQgT1MKKyBmb3JtYXQuIFRoZSByZXN1bHRpbmcgZm9ybWF0dGVkIHBhdGggaXMgcGxhY2VkIGludG8gdGhlIHNwZWNpZmllZCBwcm9wZXJ0eS5dXT4KKyAgPC9kZXNjcmlwdGlvbj4KKworICA8c3RydWN0dXJlPgorCisgICAgPGF0dHJpYnV0ZXM+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImRpcnNlcCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0RlZmF1bHQgZGlyZWN0b3J5IHNlcGFyYXRvciBzdHJpbmc7CisgZGVmYXVsdHMgdG8gY3VycmVudCBKVk0uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCB0aGUgZGVmYXVsdCBkaXJlY3Rvcnkgc2VwYXJhdG9yIHN0cmluZzsKKyBkZWZhdWx0cyB0byBjdXJyZW50IEpWTSB7QGxpbmsgamF2YS5pby5GaWxlI3NlcGFyYXRvciBGaWxlLnNlcGFyYXRvcn0KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwYXRoc2VwIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRGVmYXVsdCBwYXRoIHNlcGFyYXRvciBzdHJpbmc7CisgZGVmYXVsdHMgdG8gY3VycmVudCBKVk0uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCB0aGUgZGVmYXVsdCBwYXRoIHNlcGFyYXRvciBzdHJpbmc7CisgZGVmYXVsdHMgdG8gY3VycmVudCBKVk0KKyB7QGxpbmsgamF2YS5pby5GaWxlI3BhdGhTZXBhcmF0b3IgRmlsZS5wYXRoU2VwYXJhdG9yfQorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InByb3BlcnR5IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIHByb3BlcnR5IGludG8gd2hpY2ggdGhlIGNvbnZlcnRlZCBwYXRoIHdpbGwgYmUgcGxhY2VkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBUaGUgcHJvcGVydHkgaW50byB3aGljaCB0aGUgY29udmVydGVkIHBhdGggd2lsbCBiZSBwbGFjZWQuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icmVmaWQiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlZmVyZW5jZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJSZWZlcmVuY2UiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgYSByZWZlcmVuY2UgdG8gYSBQYXRoLCBGaWxlU2V0LCBEaXJTZXQsIG9yIEZpbGVMaXN0IGRlZmluZWQKKyBlbHNld2hlcmUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIEFkZHMgYSByZWZlcmVuY2UgdG8gYSBQYXRoLCBGaWxlU2V0LCBEaXJTZXQsIG9yIEZpbGVMaXN0IGRlZmluZWQKKyBlbHNld2hlcmUuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic2V0b25lbXB0eSIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTZXQgc2V0b25lbXB0eQorCisgSWYgZmFsc2UsIGRvbid0IHNldCB0aGUgbmV3IHByb3BlcnR5IGlmIHRoZSByZXN1bHQgaXMgdGhlIGVtcHR5IHN0cmluZy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHNldG9uZW1wdHkKKworIElmIGZhbHNlLCBkb24ndCBzZXQgdGhlIG5ldyBwcm9wZXJ0eSBpZiB0aGUgcmVzdWx0IGlzIHRoZSBlbXB0eSBzdHJpbmcuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idGFyZ2V0b3MiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlBhdGhDb252ZXJ0LlRhcmdldE9zIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IiZxdW90O3dpbmRvd3MmcXVvdDssICZxdW90O3VuaXgmcXVvdDssICZxdW90O25ldHdhcmUmcXVvdDssICZxdW90O29zLzImcXVvdDsiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NldCB0YXJnZXRvcyB0byBhIHBsYXRmb3JtIHRvIG9uZSBvZgorICJ3aW5kb3dzIiwgInVuaXgiLCAibmV0d2FyZSIsIG9yICJvcy8yIjsgcmVxdWlyZWQgdW5sZXNzCisgdW5sZXNzIHBhdGhzZXAgYW5kL29yIGRpcnNlcCBhcmUgc3BlY2lmaWVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGFyZ2V0b3MgdG8gYSBwbGF0Zm9ybSB0byBvbmUgb2YKKyAid2luZG93cyIsICJ1bml4IiwgIm5ldHdhcmUiLCBvciAib3MvMiI7IHJlcXVpcmVkIHVubGVzcworIHVubGVzcyBwYXRoc2VwIGFuZC9vciBkaXJzZXAgYXJlIHNwZWNpZmllZC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgIDwvYXR0cmlidXRlcz4KKworICAgIDxlbGVtZW50cz4KKyAgICAgIDxlbGVtZW50IG5hbWU9Im1hcCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuUGF0aENvbnZlcnQuTWFwRW50cnkiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IiIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NyZWF0ZSBhIG5lc3RlZCBNQVAgZWxlbWVudC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbQ3JlYXRlIGEgbmVzdGVkIE1BUCBlbGVtZW50XV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICAgIDxlbGVtZW50IG5hbWU9InBhdGgiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IlBhdGgiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDcmVhdGUgYSBuZXN0ZWQgUEFUSCBlbGVtZW50Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtDcmVhdGUgYSBuZXN0ZWQgUEFUSCBlbGVtZW50XV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICA8L2VsZW1lbnRzPgorCisgIDwvc3RydWN0dXJlPgorCis8L3Rhc2s+CisKKworPHRhc2sgbmFtZT0icHJvcGVydHkiIGNhdGVnb3J5PSJvdGhlciIKKyAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuUHJvcGVydHkiCisgICAgICA+CisKKyAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NldHMgYSBwcm9wZXJ0eSBieSBuYW1lLCBvciBzZXQgb2YgcHJvcGVydGllcyAoZnJvbSBmaWxlIG9yIHJlc291cmNlKSBpbiB0aGUgcHJvamVjdC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICA8ZGVzY3JpcHRpb24+CisgICAgPCFbQ0RBVEFbU2V0cyBhIHByb3BlcnR5IGJ5IG5hbWUsIG9yIHNldCBvZiBwcm9wZXJ0aWVzIChmcm9tIGZpbGUgb3IKKyByZXNvdXJjZSkgaW4gdGhlIHByb2plY3QuICA8L3A+CisgUHJvcGVydGllcyBhcmUgaW1tdXRhYmxlOiB3aG9ldmVyIHNldHMgYSBwcm9wZXJ0eSBmaXJzdCBmcmVlemVzIGl0IGZvciB0aGUKKyByZXN0IG9mIHRoZSBidWlsZDsgdGhleSBhcmUgbW9zdCBkZWZpbmF0ZWx5IG5vdCB2YXJpYWJsZS4gCisgPHA+VGhlcmUgYXJlIGZpdmUgd2F5cyB0byBzZXQgcHJvcGVydGllczo8L3A+CisgPHVsPgorICAgPGxpPkJ5IHN1cHBseWluZyBib3RoIHRoZSA8aT5uYW1lPC9pPiBhbmQgPGk+dmFsdWU8L2k+IGF0dHJpYnV0ZS48L2xpPgorICAgPGxpPkJ5IHN1cHBseWluZyBib3RoIHRoZSA8aT5uYW1lPC9pPiBhbmQgPGk+cmVmaWQ8L2k+IGF0dHJpYnV0ZS48L2xpPgorICAgPGxpPkJ5IHNldHRpbmcgdGhlIDxpPmZpbGU8L2k+IGF0dHJpYnV0ZSB3aXRoIHRoZSBmaWxlbmFtZSBvZiB0aGUgcHJvcGVydHkKKyAgICAgZmlsZSB0byBsb2FkLiBUaGlzIHByb3BlcnR5IGZpbGUgaGFzIHRoZSBmb3JtYXQgYXMgZGVmaW5lZCBieSB0aGUgZmlsZSB1c2VkCisgICAgIGluIHRoZSBjbGFzcyBqYXZhLnV0aWwuUHJvcGVydGllcy48L2xpPgorICAgPGxpPkJ5IHNldHRpbmcgdGhlIDxpPnJlc291cmNlPC9pPiBhdHRyaWJ1dGUgd2l0aCB0aGUgcmVzb3VyY2UgbmFtZSBvZiB0aGUKKyAgICAgcHJvcGVydHkgZmlsZSB0byBsb2FkLiBUaGlzIHByb3BlcnR5IGZpbGUgaGFzIHRoZSBmb3JtYXQgYXMgZGVmaW5lZCBieSB0aGUKKyAgICAgZmlsZSB1c2VkIGluIHRoZSBjbGFzcyBqYXZhLnV0aWwuUHJvcGVydGllcy48L2xpPgorICAgPGxpPkJ5IHNldHRpbmcgdGhlIDxpPmVudmlyb25tZW50PC9pPiBhdHRyaWJ1dGUgd2l0aCBhIHByZWZpeCB0byB1c2UuCisgICAgIFByb3BlcnRpZXMgd2lsbCBiZSBkZWZpbmVkIGZvciBldmVyeSBlbnZpcm9ubWVudCB2YXJpYWJsZSBieQorICAgICBwcmVmaXhpbmcgdGhlIHN1cHBsaWVkIG5hbWUgYW5kIGEgcGVyaW9kIHRvIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZS48L2xpPgorIDwvdWw+CisgPHA+QWx0aG91Z2ggY29tYmluYXRpb25zIG9mIHRoZXNlIHdheXMgYXJlIHBvc3NpYmxlLCBvbmx5IG9uZSBzaG91bGQgYmUgdXNlZAorIGF0IGEgdGltZS4gUHJvYmxlbXMgbWlnaHQgb2NjdXIgd2l0aCB0aGUgb3JkZXIgaW4gd2hpY2ggcHJvcGVydGllcyBhcmUgc2V0LCBmb3IKKyBpbnN0YW5jZS48L3A+CisgPHA+VGhlIHZhbHVlIHBhcnQgb2YgdGhlIHByb3BlcnRpZXMgYmVpbmcgc2V0LCBtaWdodCBjb250YWluIHJlZmVyZW5jZXMgdG8gb3RoZXIKKyBwcm9wZXJ0aWVzLiBUaGVzZSByZWZlcmVuY2VzIGFyZSByZXNvbHZlZCBhdCB0aGUgdGltZSB0aGVzZSBwcm9wZXJ0aWVzIGFyZSBzZXQuCisgVGhpcyBhbHNvIGhvbGRzIGZvciBwcm9wZXJ0aWVzIGxvYWRlZCBmcm9tIGEgcHJvcGVydHkgZmlsZS48L3A+CisgUHJvcGVydGllcyBhcmUgY2FzZSBzZW5zaXRpdmUuXV0+CisgIDwvZGVzY3JpcHRpb24+CisKKyAgPHN0cnVjdHVyZT4KKworICAgIDxhdHRyaWJ1dGVzPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc3BhdGgiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUGF0aCIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGNsYXNzcGF0aCB0byB1c2Ugd2hlbiBsb29raW5nIHVwIGEgcmVzb3VyY2UuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRoZSBjbGFzc3BhdGggdG8gdXNlIHdoZW4gbG9va2luZyB1cCBhIHJlc291cmNlLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzcGF0aHJlZiIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVmZXJlbmNlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlJlZmVyZW5jZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGNsYXNzcGF0aCB0byB1c2Ugd2hlbiBsb29raW5nIHVwIGEgcmVzb3VyY2UsCisgZ2l2ZW4gYXMgcmVmZXJlbmNlIHRvIGEgJmx0O3BhdGgmZ3Q7IGRlZmluZWQgZWxzZXdoZXJlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICB0aGUgY2xhc3NwYXRoIHRvIHVzZSB3aGVuIGxvb2tpbmcgdXAgYSByZXNvdXJjZSwKKyBnaXZlbiBhcyByZWZlcmVuY2UgdG8gYSAmbHQ7cGF0aCZndDsgZGVmaW5lZCBlbHNld2hlcmUKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJlbnZpcm9ubWVudCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBwcmVmaXggdG8gdXNlIHdoZW4gcmV0cmlldmluZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIHRoZSBwcmVmaXggdG8gdXNlIHdoZW4gcmV0cmlldmluZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMuIAorIFRodXMgaWYgeW91IHNwZWNpZnkgZW52aXJvbm1lbnQ9JnF1b3Q7bXllbnYmcXVvdDsgCisgeW91IHdpbGwgYmUgYWJsZSB0byBhY2Nlc3MgT1Mtc3BlY2lmaWMgCisgZW52aXJvbm1lbnQgdmFyaWFibGVzIHZpYSBwcm9wZXJ0eSBuYW1lcyAmcXVvdDtteWVudi5QQVRIJnF1b3Q7IG9yIAorICZxdW90O215ZW52LlRFUk0mcXVvdDsuIAorIDxwPgorIE5vdGUgdGhhdCBpZiB5b3Ugc3VwcGx5IGEgcHJvcGVydHkgbmFtZSB3aXRoIGEgZmluYWwgCisgJnF1b3Q7LiZxdW90OyBpdCB3aWxsIG5vdCBiZSBkb3VibGVkLiBpZSBlbnZpcm9ubWVudD0mcXVvdDtteWVudi4mcXVvdDsgd2lsbCBzdGlsbCAKKyBhbGxvdyBhY2Nlc3Mgb2YgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRocm91Z2ggJnF1b3Q7bXllbnYuUEFUSCZxdW90OyBhbmQgCisgJnF1b3Q7bXllbnYuVEVSTSZxdW90Oy4gVGhpcyBmdW5jdGlvbmFsaXR5IGlzIGN1cnJlbnRseSBvbmx5IGltcGxlbWVudGVkIAorIG9uIHNlbGVjdCBwbGF0Zm9ybXMuIEZlZWwgZnJlZSB0byBzZW5kIHBhdGNoZXMgdG8gaW5jcmVhc2UgdGhlIG51bWJlciBvZiBwbGF0Zm9ybXMKKyB0aGlzIGZ1bmN0aW9uYWxpdHkgaXMgc3VwcG9ydGVkIG9uIDspLjxicj4KKyBOb3RlIGFsc28gdGhhdCBwcm9wZXJ0aWVzIGFyZSBjYXNlIHNlbnNpdGl2ZSwgZXZlbiBpZiB0aGUKKyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgb24geW91ciBvcGVyYXRpbmcgc3lzdGVtIGFyZSBub3QsIGUuZy4gaXQKKyB3aWxsIGJlICR7ZW52LlBhdGh9IG5vdCAke2Vudi5QQVRIfSBvbiBXaW5kb3dzIDIwMDAuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmlsZSIgdHlwZT0iamF2YS5pby5GaWxlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBmaWxlbmFtZSBvZiBhIHByb3BlcnR5IGZpbGUgdG8gbG9hZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgdGhlIGZpbGVuYW1lIG9mIGEgcHJvcGVydHkgZmlsZSB0byBsb2FkLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImxvY2F0aW9uIiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbUHJvcGVydHkgdG8gdGhlIGFic29sdXRlIGZpbGVuYW1lIG9mIHRoZQorIGdpdmVuIGZpbGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldHMgdGhlIHByb3BlcnR5IHRvIHRoZSBhYnNvbHV0ZSBmaWxlbmFtZSBvZiB0aGUKKyBnaXZlbiBmaWxlLiBJZiB0aGUgdmFsdWUgb2YgdGhpcyBhdHRyaWJ1dGUgaXMgYW4gYWJzb2x1dGUgcGF0aCwgaXQKKyBpcyBsZWZ0IHVuY2hhbmdlZCAod2l0aCAvIGFuZCBcIGNoYXJhY3RlcnMgY29udmVydGVkIHRvIHRoZQorIGN1cnJlbnQgcGxhdGZvcm1zIGNvbnZlbnRpb25zKS4gT3RoZXJ3aXNlIGl0IGlzIHRha2VuIGFzIGEgcGF0aAorIHJlbGF0aXZlIHRvIHRoZSBwcm9qZWN0J3MgYmFzZWRpciBhbmQgZXhwYW5kZWQuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW05hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHNldC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgc2V0cyB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gc2V0LgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InByZWZpeCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1ByZWZpeCB0byBhcHBseSB0byBwcm9wZXJ0aWVzIGxvYWRlZCB1c2luZyA8Y29kZT5maWxlPC9jb2RlPgorIG9yIDxjb2RlPnJlc291cmNlPC9jb2RlPi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgUHJlZml4IHRvIGFwcGx5IHRvIHByb3BlcnRpZXMgbG9hZGVkIHVzaW5nIDxjb2RlPmZpbGU8L2NvZGU+Cisgb3IgPGNvZGU+cmVzb3VyY2U8L2NvZGU+LiAKKyBBICIuIiBpcyBhcHBlbmRlZCB0byB0aGUgcHJlZml4IGlmIG5vdCBzcGVjaWZpZWQuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icmVmaWQiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlZmVyZW5jZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJSZWZlcmVuY2UiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1JlZmVyZW5jZSB0byBhbiBBbnQgZGF0YXR5cGUKKyBkZWNsYXJlZCBlbHNld2hlcmUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldHMgYSByZWZlcmVuY2UgdG8gYW4gQW50IGRhdGF0eXBlCisgZGVjbGFyZWQgZWxzZXdoZXJlLiAKKyBPbmx5IHlpZWxkcyByZWFzb25hYmxlIHJlc3VsdHMgZm9yIHJlZmVyZW5jZXMKKyBQQVRIIGxpa2Ugc3RydWN0dXJlcyBvciBwcm9wZXJ0aWVzLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InJlc291cmNlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIHJlc291cmNlIG5hbWUgb2YgYSBwcm9wZXJ0eSBmaWxlIHRvIGxvYWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIHRoZSByZXNvdXJjZSBuYW1lIG9mIGEgcHJvcGVydHkgZmlsZSB0byBsb2FkCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtWYWx1ZSBvZiB0aGUgcHJvcGVydHkuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgIDwvYXR0cmlidXRlcz4KKworICAgIDxlbGVtZW50cz4KKyAgICAgIDxlbGVtZW50IG5hbWU9ImNsYXNzcGF0aCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aCIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUGF0aCIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBjbGFzc3BhdGggdG8gdXNlIHdoZW4gbG9va2luZyB1cCBhIHJlc291cmNlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtUaGUgY2xhc3NwYXRoIHRvIHVzZSB3aGVuIGxvb2tpbmcgdXAgYSByZXNvdXJjZS5dXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgIDwvZWxlbWVudHM+CisKKyAgPC9zdHJ1Y3R1cmU+CisKKzwvdGFzaz4KKworCis8dGFzayBuYW1lPSJwcm9wZXJ0eWZpbGUiIGNhdGVnb3J5PSJvdGhlciIKKyAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuUHJvcGVydHlGaWxlIgorICAgICAgPgorCisgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtNb2RpZmllcyBzZXR0aW5ncyBpbiBhIHByb3BlcnR5IGZpbGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgPGRlc2NyaXB0aW9uPgorICAgIDwhW0NEQVRBW01vZGlmaWVzIHNldHRpbmdzIGluIGEgcHJvcGVydHkgZmlsZS4KKworIDxwPgorVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGl0cyB1c2FnZToKKyAgICA8dWw+Jmx0O3RhcmdldCBuYW1lPSJzZXRTdGF0ZSImZ3Q7PGJyPgorICAgIDx1bD4mbHQ7cHJvcGVydHk8YnI+CisgICAgICAgIDx1bD5uYW1lPSJoZWFkZXIiPGJyPgorICAgICAgICB2YWx1ZT0iIyNHZW5lcmF0ZWQgZmlsZSAtIGRvIG5vdCBtb2RpZnkhIi8mZ3Q7PGJyPgorICAgICAgJmx0O3Byb3BlcnR5ZmlsZSBmaWxlPSJhcHJvcGZpbGUucHJvcGVydGllcyIgY29tbWVudD0iJHtoZWFkZXJ9IiZndDs8YnI+CisgICAgICAgICZsdDtlbnRyeSBrZXk9InByb2R1Y3QudmVyc2lvbi5tYWpvciIgdHlwZT0iaW50IiAgdmFsdWU9IjUiLyZndDs8YnI+CisgICAgICAgICZsdDtlbnRyeSBrZXk9InByb2R1Y3QudmVyc2lvbi5taW5vciIgdHlwZT0iaW50IiAgdmFsdWU9IjAiLyZndDs8YnI+CisgICAgICAgICZsdDtlbnRyeSBrZXk9InByb2R1Y3QuYnVpbGQubWFqb3IiICAgdHlwZT0iaW50IiAgdmFsdWU9IjAiIC8mZ3Q7PGJyPgorICAgICAgICAmbHQ7ZW50cnkga2V5PSJwcm9kdWN0LmJ1aWxkLm1pbm9yIiAgIHR5cGU9ImludCIgIG9wZXJhdGlvbj0iKyIgLyZndDs8YnI+CisgICAgICAgICZsdDtlbnRyeSBrZXk9InByb2R1Y3QuYnVpbGQuZGF0ZSIgICAgdHlwZT0iZGF0ZSIgdmFsdWU9Im5vdyIgLyZndDs8YnI+CisgICAgICAgICZsdDtlbnRyeSBrZXk9ImludFNldCIgdHlwZT0iaW50IiBvcGVyYXRpb249Ij0iIHZhbHVlPSI2ODEiLyZndDs8YnI+CisgICAgICAgICZsdDtlbnRyeSBrZXk9ImludERlYyIgdHlwZT0iaW50IiBvcGVyYXRpb249Ii0iLyZndDs8YnI+CisgICAgICAgICZsdDtlbnRyeSBrZXk9IlN0cmluZ0VxdWFscyIgdHlwZT0ic3RyaW5nIiB2YWx1ZT0idGVzdFZhbHVlIi8mZ3Q7PGJyPgorICAgICAmbHQ7L3Byb3BlcnR5ZmlsZSZndDs8YnI+PC91bD4KKyAgICZsdDsvdGFyZ2V0Jmd0OzwvdWw+PHA+CisKK1RoZSAmbHQ7cHJvcGVydHlmaWxlJmd0OyB0YXNrIG11c3QgaGF2ZTo8YnI+CisgICAgPHVsPjxsaT5maWxlPC9saT48L3VsPgorT3RoZXIgcGFyYW1ldGVycyBhcmU6PGJyPgorICAgIDx1bD48bGk+Y29tbWVudCwga2V5LCBvcGVyYXRpb24sIHR5cGUgYW5kIHZhbHVlICh0aGUgZmluYWwgZm91ciBiZWluZyBlbGltaW5hdGVkIHNob3J0bHkpPC9saT48L3VsPgorCitUaGUgJmx0O2VudHJ5Jmd0OyB0YXNrIG11c3QgaGF2ZTo8YnI+CisgICAgPHVsPjxsaT5rZXk8L2xpPjwvdWw+CitPdGhlciBwYXJhbWV0ZXJzIGFyZTo8YnI+CisgICAgPHVsPjxsaT5vcGVyYXRpb248L2xpPgorICAgICAgICA8bGk+dHlwZTwvbGk+CisgICAgICAgIDxsaT52YWx1ZTwvbGk+CisgICAgICAgIDxsaT5kZWZhdWx0PC9saT4KKyAgICAgICAgPGxpPnVuaXQ8L2xpPgorICAgIDwvdWw+CisKK0lmIHR5cGUgaXMgdW5zcGVjaWZpZWQsIGl0IGRlZmF1bHRzIHRvIHN0cmluZworCitQYXJhbWV0ZXIgdmFsdWVzOjxicj4KKyAgICA8dWw+PGxpPm9wZXJhdGlvbjo8L2xpPgorICAgICAgICA8dWw+PGxpPiI9IiAoc2V0IC0tIGRlZmF1bHQpPC9saT4KKyAgICAgICAgPGxpPiItIiAoZGVjKTwvbGk+CisgICAgICAgIDxsaT4iKyIgKGluYyk8L2xpPgorCisgICAgPGxpPnR5cGU6PC9saT4KKyAgICAgICAgPHVsPjxsaT4iaW50IjwvbGk+CisgICAgICAgIDxsaT4iZGF0ZSI8L2xpPgorICAgICAgICA8bGk+InN0cmluZyI8L2xpPjwvdWw+PC91bD4KKworICAgIDxsaT52YWx1ZTo8L2xpPgorICAgICAgPHVsPjxsaT5ob2xkcyB0aGUgZGVmYXVsdCB2YWx1ZSwgaWYgdGhlIHByb3BlcnR5CisgICAgICAgICAgICAgIHdhcyBub3QgZm91bmQgaW4gcHJvcGVydHkgZmlsZTwvbGk+CisgICAgICAgICAgPGxpPiJub3ciIEluIGNhc2Ugb2YgdHlwZSAiZGF0ZSIsIHRoZQorICAgICAgICAgICAgICB2YWx1ZSAibm93IiB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSBjdXJyZW50CisgICAgICAgICAgICAgIGRhdGUvdGltZSBhbmQgdXNlZCBldmVuIGlmIGEgdmFsaWQgZGF0ZSB3YXMKKyAgICAgICAgICAgICAgZm91bmQgaW4gdGhlIHByb3BlcnR5IGZpbGUuPC9saT48L3VsPgorCitTdHJpbmcgcHJvcGVydHkgdHlwZXMgY2FuIG9ubHkgdXNlIHRoZSAiPSIgb3BlcmF0aW9uLgorSW50IHByb3BlcnR5IHR5cGVzIGNhbiBvbmx5IHVzZSB0aGUgIj0iLCAiLSIgb3IgIisiIG9wZXJhdGlvbnMuPHA+CisKK1RoZSBtZXNzYWdlIHByb3BlcnR5IGlzIHVzZWQgZm9yIHRoZSBwcm9wZXJ0eSBmaWxlIGhlYWRlciwgd2l0aCAiXFwiIGJlaW5nCithIG5ld2xpbmUgZGVsaW1pdGVyIGNoYXJhY3Rlci5dXT4KKyAgPC9kZXNjcmlwdGlvbj4KKworICA8c3RydWN0dXJlPgorCisgICAgPGF0dHJpYnV0ZXM+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNvbW1lbnQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtPcHRpb25hbCBoZWFkZXIgY29tbWVudCBmb3IgdGhlIGZpbGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIG9wdGlvbmFsIGhlYWRlciBjb21tZW50IGZvciB0aGUgZmlsZQorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImZpbGUiIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtMb2NhdGlvbiBvZiB0aGUgcHJvcGVydHkgZmlsZSB0byBiZSBlZGl0ZWQ7IHJlcXVpcmVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBMb2NhdGlvbiBvZiB0aGUgcHJvcGVydHkgZmlsZSB0byBiZSBlZGl0ZWQ7IHJlcXVpcmVkLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgPC9hdHRyaWJ1dGVzPgorCisgICAgPGVsZW1lbnRzPgorICAgICAgPGVsZW1lbnQgbmFtZT0iZW50cnkiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLlByb3BlcnR5RmlsZS5FbnRyeSIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTm8gZGVzY3JpcHRpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW11dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgPC9lbGVtZW50cz4KKworICA8L3N0cnVjdHVyZT4KKworPC90YXNrPgorCisKKzx0YXNrIG5hbWU9InB2Y3MiIGNhdGVnb3J5PSJvdGhlciIKKyAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwucHZjcy5QdmNzIgorICAgICAgPgorCisgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtFeHRyYWN0cyB0aGUgbGF0ZXN0IGVkaXRpb24gb2YgdGhlIHNvdXJjZSBjb2RlIGZyb20gYSBQVkNTIHJlcG9zaXRvcnkuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgPGRlc2NyaXB0aW9uPgorICAgIDwhW0NEQVRBW0V4dHJhY3RzIHRoZSBsYXRlc3QgZWRpdGlvbiBvZiB0aGUgc291cmNlIGNvZGUgZnJvbSBhIFBWQ1MgcmVwb3NpdG9yeS4KKyBQVkNTIGlzIGEgdmVyc2lvbiBjb250cm9sIHN5c3RlbQorIGRldmVsb3BlZCBieSA8YSBocmVmPSJodHRwOi8vd3d3Lm1lcmFudC5jb20vcHJvZHVjdHMvcHZjcyI+TWVyYW50PC9hPi4KKyA8YnI+CisgQmVmb3JlIHVzaW5nIHRoaXMgdGFnLCB0aGUgdXNlciBydW5uaW5nIGFudCBtdXN0IGhhdmUgYWNjZXNzIHRvIHRoZSBjb21tYW5kcyAKKyBvZiBQVkNTIChnZXQgYW5kIHBjbGkpIGFuZCBtdXN0IGhhdmUgYWNjZXNzIHRvIHRoZSByZXBvc2l0b3J5LiBOb3RlIHRoYXQgdGhlIHdheSB0byBzcGVjaWZ5CisgdGhlIHJlcG9zaXRvcnkgaXMgcGxhdGZvcm0gZGVwZW5kZW50IHNvIHVzZSBwcm9wZXJ0eSB0byBzcGVjaWZ5IGxvY2F0aW9uIG9mIHJlcG9zaXRvcnkuCisgPGJyPgorIFRoaXMgdmVyc2lvbiBoYXMgYmVlbiB0ZXN0ZWQgYWdhaW5zIFBWQ1MgdmVyc2lvbiA2LjUgYW5kIDYuNiB1bmRlciBXaW5kb3dzIGFuZCBTb2xhcmlzLgorCisgPGI+MTktMDQtMjAwMTwvYj4gPHA+VGhlIHRhc2sgbm93IGhhcyBhIG1vcmUgcm9idXN0CisgcGFyc2VyLiBJdCBhbGxvd3MgZm9yIHBsYXRmb3JtIGluZGVwZW5kYW50IGZpbGUgcGF0aHMKKyBhbmQgc3VwcG9ydHMgZmlsZSBuYW1lcyB3aXRoIDxpPigpPC9pPi4gVGhhbmtzIHRvIEVyaWsgSHVzYnkgZm9yCisgYnJpbmdpbmcgdGhlIGJ1ZyB0byBteSBhdHRlbnRpb24uCisKKyA8Yj4yNy0wNC0yMDAxPC9iPiA8cD5VTkMgcGF0aHMgYXJlIG5vdyBoYW5kbGVkIHByb3Blcmx5LgorIEZpeCBwcm92aWRlZCBieSBEb24gSmVmZmVyeS4gSGUgYWxzbyBhZGRlZCBhbiA8aT5VcGRhdGVPbmx5PC9pPiBmbGFnCisgdGhhdCwgd2hlbiB0cnVlLCBjb25kaXRpb25zIHRoZSBQVkNTIGdldCB1c2luZyB0aGUgLVUgb3B0aW9uIHRvIG9ubHkKKyB1cGRhdGUgdGhvc2UgZmlsZXMgdGhhdCBoYXZlIGEgbW9kaWZpY2F0aW9uIHRpbWUgKGluIFBWQ1MpIHRoYXQgaXMgbmV3ZXIKKyB0aGFuIHRoZSBleGlzdGluZyB3b3JrZmlsZS5dXT4KKyAgPC9kZXNjcmlwdGlvbj4KKworICA8c3RydWN0dXJlPgorCisgICAgPGF0dHJpYnV0ZXM+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImZpbGVuYW1lZm9ybWF0IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGZvcm1hdCBvZiB0aGUgZm9sZGVyIG5hbWVzOyBvcHRpb25hbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgVGhlIGZvcm1hdCBvZiB0aGUgZm9sZGVyIG5hbWVzOyBvcHRpb25hbC4KKyBUaGlzIG11c3QgYmUgaW4gYSBmb3JtYXQgc3VpdGFibGUgZm9yIAorIDxjb2RlPmphdmEudGV4dC5NZXNzYWdlRm9ybWF0PC9jb2RlPi4KKyAgSW5kZXggMSBvZiB0aGUgZm9ybWF0IHdpbGwgYmUgdXNlZCBhcyB0aGUgZmlsZSBuYW1lLgorICBEZWZhdWx0cyB0byA8Y29kZT57MH0tYXJjKHsxfSk8L2NvZGU+CisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZm9yY2UiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTcGVjaWZpZXMgdGhlIHZhbHVlIG9mIHRoZSBmb3JjZSBhcmd1bWVudDsgb3B0aW9uYWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNwZWNpZmllcyB0aGUgdmFsdWUgb2YgdGhlIGZvcmNlIGFyZ3VtZW50OyBvcHRpb25hbC4KKyBJZiBzZXQgdG8gPGk+eWVzPC9pPiBhbGwgZmlsZXMgdGhhdCBleGlzdHMgYW5kIGFyZSAKKyB3cml0YWJsZSBhcmUgb3ZlcndyaXR0ZW4uIERlZmF1bHQgPGk+bm88L2k+IGNhdXNlcyB0aGUgZmlsZXMgCisgdGhhdCBhcmUgd3JpdGFibGUgdG8gYmUgaWdub3JlZC4gVGhpcyBzdG9wcyB0aGUgUFZDUyBjb21tYW5kIAorIDxpPmdldDwvaT4gdG8gc3RvcCBhc2tpbmcgcXVlc3Rpb25zIQorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9Imlnbm9yZXJldHVybmNvZGUiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgc2V0IHRvIHRydWUgdGhlIHJldHVybiB2YWx1ZSBmcm9tIGV4ZWN1dGluZyB0aGUgcHZjcworIGNvbW1hbmRzIGFyZSBpZ25vcmVkOyBvcHRpb25hbCwgZGVmYXVsdCBmYWxzZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgSWYgc2V0IHRvIHRydWUgdGhlIHJldHVybiB2YWx1ZSBmcm9tIGV4ZWN1dGluZyB0aGUgcHZjcworIGNvbW1hbmRzIGFyZSBpZ25vcmVkOyBvcHRpb25hbCwgZGVmYXVsdCBmYWxzZS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsYWJlbCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW09ubHkgZmlsZXMgbWFya2VkIHdpdGggdGhpcyBsYWJlbCBhcmUgZXh0cmFjdGVkOyBvcHRpb25hbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgT25seSBmaWxlcyBtYXJrZWQgd2l0aCB0aGlzIGxhYmVsIGFyZSBleHRyYWN0ZWQ7IG9wdGlvbmFsLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImxpbmVzdGFydCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1doYXQgYSB2YWxpZCByZXR1cm4gdmFsdWUgZnJvbSBQVkNTIGxvb2tzIGxpa2UKKyAgd2hlbiBpdCBkZXNjcmliZXMgYSBmaWxlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBXaGF0IGEgdmFsaWQgcmV0dXJuIHZhbHVlIGZyb20gUFZDUyBsb29rcyBsaWtlCisgIHdoZW4gaXQgZGVzY3JpYmVzIGEgZmlsZS4gIERlZmF1bHRzIHRvIDxjb2RlPiZxdW90O1A6PC9jb2RlPi4KKyBJZiB5b3UgYXJlIG5vdCB1c2luZyBhbiBVTkMgbmFtZSBmb3IgeW91ciByZXBvc2l0b3J5IGFuZCB0aGUKKyBkcml2ZSBsZXR0ZXIgPGNvZGU+UDwvY29kZT4gaXMgaW5jb3JyZWN0IGZvciB5b3VyIHNldHVwLCB5b3UgbWF5CisgbmVlZCB0byBjaGFuZ2UgdGhpcyB2YWx1ZSwgVU5DIG5hbWVzIHdpbGwgYWx3YXlzIGJlCisgYWNjZXB0ZWQuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icHJvbW90aW9uZ3JvdXAiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIHByb21vdGlvbmdyb3VwIGFyZ3VtZW50Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIHByb21vdGlvbmdyb3VwIGFyZ3VtZW50CisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icHZjc2JpbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NwZWNpZmllcyB0aGUgbG9jYXRpb24gb2YgdGhlIFBWQ1MgYmluIGRpcmVjdG9yeTsgb3B0aW9uYWwgaWYgb24gdGhlIFBBVEguXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNwZWNpZmllcyB0aGUgbG9jYXRpb24gb2YgdGhlIFBWQ1MgYmluIGRpcmVjdG9yeTsgb3B0aW9uYWwgaWYgb24gdGhlIFBBVEguCisgT24gc29tZSBzeXN0ZW1zIHRoZSBQVkNTIGV4ZWN1dGFibGVzIDxpPnBjbGk8L2k+CisgYW5kIDxpPmdldDwvaT4gYXJlIG5vdCBmb3VuZCBpbiB0aGUgUEFUSC4gSW4gc3VjaCBjYXNlcyB0aGlzIGF0dHJpYnV0ZQorIHNob3VsZCBiZSBzZXQgdG8gdGhlIGJpbiBkaXJlY3Rvcnkgb2YgdGhlIFBWQ1MgaW5zdGFsbGF0aW9uIGNvbnRhaW5pbmcKKyB0aGUgZXhlY3V0YWJsZXMgbWVudGlvbmVkIGJlZm9yZS4gSWYgdGhpcyBhdHRyaWJ1dGUgaXNuJ3Qgc3BlY2lmaWVkIHRoZQorIHRhZyBleHBlY3RzIHRoZSBleGVjdXRhYmxlcyB0byBiZSBmb3VuZCB1c2luZyB0aGUgUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwdmNzcHJvamVjdCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBwcm9qZWN0IHdpdGhpbiB0aGUgUFZDUyByZXBvc2l0b3J5IHRvIGV4dHJhY3QgZmlsZXMgZnJvbTsKKyBvcHRpb25hbCwgZGVmYXVsdCAmcXVvdDsvJnF1b3Q7Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBUaGUgcHJvamVjdCB3aXRoaW4gdGhlIFBWQ1MgcmVwb3NpdG9yeSB0byBleHRyYWN0IGZpbGVzIGZyb207Cisgb3B0aW9uYWwsIGRlZmF1bHQgJnF1b3Q7LyZxdW90OworICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InJlcG9zaXRvcnkiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgbmV0d29yayBuYW1lIG9mIHRoZSBQVkNTIHJlcG9zaXRvcnk7IHJlcXVpcmVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBUaGUgbmV0d29yayBuYW1lIG9mIHRoZSBQVkNTIHJlcG9zaXRvcnk7IHJlcXVpcmVkLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InVwZGF0ZW9ubHkiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgc2V0IHRvIDxpPnRydWU8L2k+IGZpbGVzIGFyZSBmZXRjaGVkIG9ubHkgaWYgCisgbmV3ZXIgdGhhbiBleGlzdGluZyBsb2NhbCBmaWxlczsgb3B0aW9uYWwsIGRlZmF1bHQgZmFsc2UuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIElmIHNldCB0byA8aT50cnVlPC9pPiBmaWxlcyBhcmUgZmV0Y2hlZCBvbmx5IGlmIAorIG5ld2VyIHRoYW4gZXhpc3RpbmcgbG9jYWwgZmlsZXM7IG9wdGlvbmFsLCBkZWZhdWx0IGZhbHNlLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9IndvcmtzcGFjZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1dvcmtzcGFjZSB0byB1c2U7IG9wdGlvbmFsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBXb3Jrc3BhY2UgdG8gdXNlOyBvcHRpb25hbC4gIAorIEJ5IHNwZWNpZnlpbmcgYSB3b3Jrc3BhY2UsIHRoZSBmaWxlcyBhcmUgZXh0cmFjdGVkIHRvIHRoYXQgbG9jYXRpb24uCisgQSBQVkNTIHdvcmtzcGFjZSBpcyBhIG5hbWUgZm9yIGEgbG9jYXRpb24gb2YgdGhlIHdvcmtmaWxlcyBhbmQgCisgaXNuJ3QgYXMgc3VjaCB0aGUgbG9jYXRpb24gaXRzZWxmLiAKKyBZb3UgZGVmaW5lIHRoZSBsb2NhdGlvbiBmb3IgYSB3b3Jrc3BhY2UgdXNpbmcgdGhlIFBWQ1MgR1VJIGNsaWVudHMuCisgSWYgdGhpcyBpc24ndCBzcGVjaWZpZWQgdGhlIGRlZmF1bHQgd29ya3NwYWNlIGZvciB0aGUgY3VycmVudCB1c2VyIGlzIHVzZWQuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICA8L2F0dHJpYnV0ZXM+CisKKyAgICA8ZWxlbWVudHM+CisgICAgICA8ZWxlbWVudCBuYW1lPSJwdmNzcHJvamVjdCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwucHZjcy5QdmNzUHJvamVjdCIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU3BlY2lmeSBhIHByb2plY3Qgd2l0aGluIHRoZSBQVkNTIHJlcG9zaXRvcnkgdG8gZXh0cmFjdCBmaWxlcyBmcm9tLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtTcGVjaWZ5IGEgcHJvamVjdCB3aXRoaW4gdGhlIFBWQ1MgcmVwb3NpdG9yeSB0byBleHRyYWN0IGZpbGVzIGZyb20uXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICA8L2VsZW1lbnRzPgorCisgIDwvc3RydWN0dXJlPgorCis8L3Rhc2s+CisKKworPHRhc2sgbmFtZT0icmVjb3JkIiBjYXRlZ29yeT0idXRpbGl0eSIKKyAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuUmVjb3JkZXIiCisgICAgICA+CisKKyAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgYSBsaXN0ZW5lciB0byB0aGUgY3VycmVudCBidWlsZCBwcm9jZXNzIHRoYXQgcmVjb3JkcyB0aGUgb3V0cHV0IHRvIGEgZmlsZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICA8ZGVzY3JpcHRpb24+CisgICAgPCFbQ0RBVEFbQWRkcyBhIGxpc3RlbmVyIHRvIHRoZSBjdXJyZW50IGJ1aWxkIHByb2Nlc3MgdGhhdCByZWNvcmRzIHRoZQorIG91dHB1dCB0byBhIGZpbGUuCisgPHA+U2V2ZXJhbCByZWNvcmRlcnMgY2FuIGV4aXN0IGF0IHRoZSBzYW1lIHRpbWUuICBFYWNoIHJlY29yZGVyIGlzCisgYXNzb2NpYXRlZCB3aXRoIGEgZmlsZS4gIFRoZSBmaWxlbmFtZSBpcyB1c2VkIGFzIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yCisgdGhlIHJlY29yZGVycy4gIFRoZSBmaXJzdCBjYWxsIHRvIHRoZSByZWNvcmRlciB0YXNrIHdpdGggYW4gdW51c2VkIGZpbGVuYW1lCisgd2lsbCBjcmVhdGUgYSByZWNvcmRlciAodXNpbmcgdGhlIHBhcmFtZXRlcnMgcHJvdmlkZWQpIGFuZCBhZGQgaXQgdG8gdGhlCisgbGlzdGVuZXJzIG9mIHRoZSBidWlsZC4gIEFsbCBzdWJzZXF1ZW50IGNhbGxzIHRvIHRoZSByZWNvcmRlciB0YXNrIHVzaW5nCisgdGhpcyBmaWxlbmFtZSB3aWxsIG1vZGlmeSB0aGF0IHJlY29yZGVycyBzdGF0ZSAocmVjb3JkaW5nIG9yIG5vdCkgb3Igb3RoZXIKKyBwcm9wZXJ0aWVzIChsaWtlIGxvZ2dpbmcgbGV2ZWwpLjwvcD4KKyA8cD5Tb21lIHRlY2huaWNhbCBpc3N1ZXM6IHRoZSBmaWxlJ3MgcHJpbnQgc3RyZWFtIGlzIGZsdXNoZWQgZm9yICZxdW90O2ZpbmlzaGVkJnF1b3Q7CisgZXZlbnRzIChidWlsZEZpbmlzaGVkLCB0YXJnZXRGaW5pc2hlZCBhbmQgdGFza0ZpbmlzaGVkKSwgYW5kIGlzIGNsb3NlZCBvbgorIGEgYnVpbGRGaW5pc2hlZCBldmVudC48L3A+XV0+CisgIDwvZGVzY3JpcHRpb24+CisKKyAgPHN0cnVjdHVyZT4KKworICAgIDxhdHRyaWJ1dGVzPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJhY3Rpb24iIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlJlY29yZGVyLkFjdGlvbkNob2ljZXMiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iJnF1b3Q7c3RhcnQmcXVvdDssICZxdW90O3N0b3AmcXVvdDsiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FjdGlvbiBmb3IgdGhlIGFzc29jaWF0ZWQgcmVjb3JkZXIgZW50cnkuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldHMgdGhlIGFjdGlvbiBmb3IgdGhlIGFzc29jaWF0ZWQgcmVjb3JkZXIgZW50cnkuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYXBwZW5kIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1doZXRoZXIgb3Igbm90IHRoZSBsb2dnZXIgc2hvdWxkIGFwcGVuZCB0byBhIHByZXZpb3VzIGZpbGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFdoZXRoZXIgb3Igbm90IHRoZSBsb2dnZXIgc2hvdWxkIGFwcGVuZCB0byBhIHByZXZpb3VzIGZpbGUuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZW1hY3Ntb2RlIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW05vIGRlc2NyaXB0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsb2dsZXZlbCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuUmVjb3JkZXIuVmVyYm9zaXR5TGV2ZWxDaG9pY2VzIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IiZxdW90O2Vycm9yJnF1b3Q7LCAmcXVvdDt3YXJuJnF1b3Q7LCAmcXVvdDtpbmZvJnF1b3Q7LCAmcXVvdDt2ZXJib3NlJnF1b3Q7LCAmcXVvdDtkZWJ1ZyZxdW90OyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTGV2ZWwgdG8gd2hpY2ggdGhpcyByZWNvcmRlciBlbnRyeSBzaG91bGQgbG9nIHRvLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXRzIHRoZSBsZXZlbCB0byB3aGljaCB0aGlzIHJlY29yZGVyIGVudHJ5IHNob3VsZCBsb2cgdG8uCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW05hbWUgb2YgdGhlIGZpbGUgdG8gbG9nIHRvLCBhbmQgdGhlIG5hbWUgb2YgdGhlIHJlY29yZGVyCisgZW50cnkuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldHMgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gbG9nIHRvLCBhbmQgdGhlIG5hbWUgb2YgdGhlIHJlY29yZGVyCisgZW50cnkuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICA8L2F0dHJpYnV0ZXM+CisKKyAgICA8ZWxlbWVudHM+CisgICAgPC9lbGVtZW50cz4KKworICA8L3N0cnVjdHVyZT4KKworPC90YXNrPgorCisKKzx0YXNrIG5hbWU9InJlbmFtZSIgY2F0ZWdvcnk9Im90aGVyIgorICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5SZW5hbWUiCisgICAgICBkZXByZWNhdGVkPSJ0cnVlIgorICAgICAgPgorCisgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtSZW5hbWVzIGEgZmlsZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICA8ZGVzY3JpcHRpb24+CisgICAgPCFbQ0RBVEFbUmVuYW1lcyBhIGZpbGUuXV0+CisgIDwvZGVzY3JpcHRpb24+CisKKyAgPHN0cnVjdHVyZT4KKworICAgIDxhdHRyaWJ1dGVzPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXN0IiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTmV3IG5hbWUgb2YgdGhlIGZpbGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldHMgdGhlIG5ldyBuYW1lIG9mIHRoZSBmaWxlLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InJlcGxhY2UiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTZXRzIHdoZXRoZXIgYW4gZXhpc3RpbmcgZmlsZSBzaG91bGQgYmUgcmVwbGFjZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldHMgd2hldGhlciBhbiBleGlzdGluZyBmaWxlIHNob3VsZCBiZSByZXBsYWNlZC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzcmMiIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtGaWxlIHRvIGJlIHJlbmFtZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldHMgdGhlIGZpbGUgdG8gYmUgcmVuYW1lZC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgIDwvYXR0cmlidXRlcz4KKworICAgIDxlbGVtZW50cz4KKyAgICA8L2VsZW1lbnRzPgorCisgIDwvc3RydWN0dXJlPgorCis8L3Rhc2s+CisKKworPHRhc2sgbmFtZT0icmVuYW1lZXh0ZW5zaW9ucyIgY2F0ZWdvcnk9Im90aGVyIgorICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5SZW5hbWVFeHRlbnNpb25zIgorICAgICAgZGVwcmVjYXRlZD0idHJ1ZSIKKyAgICAgIG1hdGNoaW5nVGFzaz0idHJ1ZSI+CisKKyAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW05vIERlc2NyaXB0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgIDxkZXNjcmlwdGlvbj4KKyAgICA8IVtDREFUQVtdXT4KKyAgPC9kZXNjcmlwdGlvbj4KKworICA8c3RydWN0dXJlPgorCisgICAgPGF0dHJpYnV0ZXM+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImZyb21leHRlbnNpb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgc3RyaW5nIHRoYXQgZmlsZXMgbXVzdCBlbmQgaW4gdG8gYmUgcmVuYW1lZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgVGhlIHN0cmluZyB0aGF0IGZpbGVzIG11c3QgZW5kIGluIHRvIGJlIHJlbmFtZWQKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJyZXBsYWNlIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1N0b3JlIHJlcGxhY2UgYXR0cmlidXRlIC0gdGhpcyBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHRhcmdldCBmaWxlCisgc2hvdWxkIGJlIG92ZXJ3cml0dGVuIGlmIHByZXNlbnQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIHN0b3JlIHJlcGxhY2UgYXR0cmlidXRlIC0gdGhpcyBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHRhcmdldCBmaWxlCisgc2hvdWxkIGJlIG92ZXJ3cml0dGVuIGlmIHByZXNlbnQKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzcmNkaXIiIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTb3VyY2UgZGlyIHRvIGZpbmQgdGhlIGZpbGVzIHRvIGJlIHJlbmFtZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCB0aGUgc291cmNlIGRpciB0byBmaW5kIHRoZSBmaWxlcyB0byBiZSByZW5hbWVkLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InRvZXh0ZW5zaW9uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIHN0cmluZyB0aGF0IHJlbmFtZWQgZmlsZXMgd2lsbCBlbmQgd2l0aCBvbgorIGNvbXBsZXRpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRoZSBzdHJpbmcgdGhhdCByZW5hbWVkIGZpbGVzIHdpbGwgZW5kIHdpdGggb24KKyBjb21wbGV0aW9uCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICA8L2F0dHJpYnV0ZXM+CisKKyAgICA8ZWxlbWVudHM+CisgICAgPC9lbGVtZW50cz4KKworICA8L3N0cnVjdHVyZT4KKworPC90YXNrPgorCisKKzx0YXNrIG5hbWU9InJlcGxhY2UiIGNhdGVnb3J5PSJmaWxlc3lzdGVtIgorICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5SZXBsYWNlIgorICAgICAgbWF0Y2hpbmdUYXNrPSJ0cnVlIj4KKworICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbUmVwbGFjZXMgYWxsIG9jY3VycmVuY2VzIG9mIG9uZSBvciBtb3JlIHN0cmluZyB0b2tlbnMgd2l0aCBnaXZlbiB2YWx1ZXMgaW4gdGhlIGluZGljYXRlZCBmaWxlcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICA8ZGVzY3JpcHRpb24+CisgICAgPCFbQ0RBVEFbUmVwbGFjZXMgYWxsIG9jY3VycmVuY2VzIG9mIG9uZSBvciBtb3JlIHN0cmluZyB0b2tlbnMgd2l0aCBnaXZlbgorIHZhbHVlcyBpbiB0aGUgaW5kaWNhdGVkIGZpbGVzLiBFYWNoIHZhbHVlIGNhbiBiZSBlaXRoZXIgYSBzdHJpbmcgCisgb3IgdGhlIHZhbHVlIG9mIGEgcHJvcGVydHkgYXZhaWxhYmxlIGluIGEgZGVzaWduYXRlZCBwcm9wZXJ0eSBmaWxlLgorIElmIHlvdSB3YW50IHRvIHJlcGxhY2UgYSB0ZXh0IHRoYXQgY3Jvc3NlcyBsaW5lIGJvdW5kYXJpZXMsIHlvdQorIG11c3QgdXNlIGEgbmVzdGVkIDxjb2RlPiZsdDtyZXBsYWNldG9rZW4mZ3Q7PC9jb2RlPiBlbGVtZW50Ll1dPgorICA8L2Rlc2NyaXB0aW9uPgorCisgIDxzdHJ1Y3R1cmU+CisKKyAgICA8YXR0cmlidXRlcz4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGlyIiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGJhc2UgZGlyZWN0b3J5IHRvIHVzZSB3aGVuIHJlcGxhY2luZyBhIHRva2VuIGluIG11bHRpcGxlIGZpbGVzOworIHJlcXVpcmVkIGlmIDxjb2RlPmZpbGU8L2NvZGU+IGlzIG5vdCBkZWZpbmVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBUaGUgYmFzZSBkaXJlY3RvcnkgdG8gdXNlIHdoZW4gcmVwbGFjaW5nIGEgdG9rZW4gaW4gbXVsdGlwbGUgZmlsZXM7CisgcmVxdWlyZWQgaWYgPGNvZGU+ZmlsZTwvY29kZT4gaXMgbm90IGRlZmluZWQuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZW5jb2RpbmciIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtGaWxlIGVuY29kaW5nIHRvIHVzZSBvbiB0aGUgZmlsZXMgcmVhZCBhbmQgd3JpdHRlbiBieSB0aGUgdGFzazsKKyBvcHRpb25hbCwgZGVmYXVsdHMgdG8gZGVmYXVsdCBKVk0gZW5jb2RpbmcuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCB0aGUgZmlsZSBlbmNvZGluZyB0byB1c2Ugb24gdGhlIGZpbGVzIHJlYWQgYW5kIHdyaXR0ZW4gYnkgdGhlIHRhc2s7Cisgb3B0aW9uYWwsIGRlZmF1bHRzIHRvIGRlZmF1bHQgSlZNIGVuY29kaW5nCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmlsZSIgdHlwZT0iamF2YS5pby5GaWxlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NvdXJjZSBmaWxlOyByZXF1aXJlZCB1bmxlc3MgPGNvZGU+ZGlyPC9jb2RlPiBpcyBzZXQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCB0aGUgc291cmNlIGZpbGU7IHJlcXVpcmVkIHVubGVzcyA8Y29kZT5kaXI8L2NvZGU+IGlzIHNldC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwcm9wZXJ0eWZpbGUiIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgbmFtZSBvZiBhIHByb3BlcnR5IGZpbGUgZnJvbSB3aGljaCBwcm9wZXJ0aWVzIHNwZWNpZmllZCB1c2luZworIG5lc3RlZCA8Y29kZT4mbHQ7cmVwbGFjZWZpbHRlciZndDs8L2NvZGU+IGVsZW1lbnRzIGFyZSBkcmF3bjsKKyBSZXF1aXJlZCBvbmx5IGlmIDxpPnByb3BlcnR5PC9pPiBhdHRyaWJ1dGUgb2YKKyA8Y29kZT4mbHQ7cmVwbGFjZWZpbHRlciZndDs8L2NvZGU+IGlzIHVzZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRoZSBuYW1lIG9mIGEgcHJvcGVydHkgZmlsZSBmcm9tIHdoaWNoIHByb3BlcnRpZXMgc3BlY2lmaWVkIHVzaW5nCisgbmVzdGVkIDxjb2RlPiZsdDtyZXBsYWNlZmlsdGVyJmd0OzwvY29kZT4gZWxlbWVudHMgYXJlIGRyYXduOworIFJlcXVpcmVkIG9ubHkgaWYgPGk+cHJvcGVydHk8L2k+IGF0dHJpYnV0ZSBvZgorIDxjb2RlPiZsdDtyZXBsYWNlZmlsdGVyJmd0OzwvY29kZT4gaXMgdXNlZC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJyZXBsYWNlZmlsdGVyZmlsZSIgdHlwZT0iamF2YS5pby5GaWxlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW05hbWUgb2YgYSBwcm9wZXJ0eSBmaWxlIGNvbnRhaW5pbmcgZmlsdGVyczsgb3B0aW9uYWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldHMgdGhlIG5hbWUgb2YgYSBwcm9wZXJ0eSBmaWxlIGNvbnRhaW5pbmcgZmlsdGVyczsgb3B0aW9uYWwuCisgRWFjaCBwcm9wZXJ0eSB3aWxsIGJlIHRyZWF0ZWQgYXMgYQorIHJlcGxhY2VmaWx0ZXIgd2hlcmUgdG9rZW4gaXMgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGFuZCB2YWx1ZQorIGlzIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3VtbWFyeSIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJbmRpY2F0ZXMgd2hldGhlciBhIHN1bW1hcnkgb2YgdGhlIHJlcGxhY2Ugb3BlcmF0aW9uIHNob3VsZCBiZQorIHByb2R1Y2VkLCBkZXRhaWxpbmcgaG93IG1hbnkgdG9rZW4gb2NjdXJyZW5jZXMgYW5kIGZpbGVzIHdlcmUKKyBwcm9jZXNzZWQ7IG9wdGlvbmFsLCBkZWZhdWx0PWZhbHNlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBJbmRpY2F0ZXMgd2hldGhlciBhIHN1bW1hcnkgb2YgdGhlIHJlcGxhY2Ugb3BlcmF0aW9uIHNob3VsZCBiZQorIHByb2R1Y2VkLCBkZXRhaWxpbmcgaG93IG1hbnkgdG9rZW4gb2NjdXJyZW5jZXMgYW5kIGZpbGVzIHdlcmUKKyBwcm9jZXNzZWQ7IG9wdGlvbmFsLCBkZWZhdWx0PWZhbHNlCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idG9rZW4iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTdHJpbmcgdG9rZW4gdG8gcmVwbGFjZTsKKyByZXF1aXJlZCB1bmxlc3MgYSBuZXN0ZWQKKyA8Y29kZT5yZXBsYWNldG9rZW48L2NvZGU+IGVsZW1lbnQgb3IgdGhlIDxjb2RlPnJlcGxhY2VmaWx0ZXJmaWxlPC9jb2RlPgorIGF0dHJpYnV0ZSBpcyB1c2VkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIHN0cmluZyB0b2tlbiB0byByZXBsYWNlOworIHJlcXVpcmVkIHVubGVzcyBhIG5lc3RlZAorIDxjb2RlPnJlcGxhY2V0b2tlbjwvY29kZT4gZWxlbWVudCBvciB0aGUgPGNvZGU+cmVwbGFjZWZpbHRlcmZpbGU8L2NvZGU+CisgYXR0cmlidXRlIGlzIHVzZWQuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTdHJpbmcgdmFsdWUgdG8gdXNlIGFzIHRva2VuIHJlcGxhY2VtZW50OworIG9wdGlvbmFsLCBkZWZhdWx0IGlzIHRoZSBlbXB0eSBzdHJpbmcgIiIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCB0aGUgc3RyaW5nIHZhbHVlIHRvIHVzZSBhcyB0b2tlbiByZXBsYWNlbWVudDsKKyBvcHRpb25hbCwgZGVmYXVsdCBpcyB0aGUgZW1wdHkgc3RyaW5nICIiCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICA8L2F0dHJpYnV0ZXM+CisKKyAgICA8ZWxlbWVudHM+CisgICAgICA8ZWxlbWVudCBuYW1lPSJyZXBsYWNldG9rZW4iIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlJlcGxhY2UuTmVzdGVkU3RyaW5nIgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgdG9rZW4gdG8gZmlsdGVyIGFzIHRoZSB0ZXh0IG9mIGEgbmVzdGVkIGVsZW1lbnQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW3RoZSB0b2tlbiB0byBmaWx0ZXIgYXMgdGhlIHRleHQgb2YgYSBuZXN0ZWQgZWxlbWVudF1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgICA8ZWxlbWVudCBuYW1lPSJyZXBsYWNldmFsdWUiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlJlcGxhY2UuTmVzdGVkU3RyaW5nIgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgc3RyaW5nIHRvIHJlcGxhY2UgdGhlIHRva2VuIGFzIHRoZSB0ZXh0IG9mIGEgbmVzdGVkIGVsZW1lbnQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW3RoZSBzdHJpbmcgdG8gcmVwbGFjZSB0aGUgdG9rZW4gYXMgdGhlIHRleHQgb2YgYSBuZXN0ZWQgZWxlbWVudF1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgICA8ZWxlbWVudCBuYW1lPSJyZXBsYWNlZmlsdGVyIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5SZXBsYWNlLlJlcGxhY2VmaWx0ZXIiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IiIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZCBhIG5lc3RlZCAmbHQ7cmVwbGFjZWZpbHRlciZndDsgZWxlbWVudC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbQWRkIGEgbmVzdGVkICZsdDtyZXBsYWNlZmlsdGVyJmd0OyBlbGVtZW50Ll1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgPC9lbGVtZW50cz4KKworICA8L3N0cnVjdHVyZT4KKworPC90YXNrPgorCisKKzx0YXNrIG5hbWU9InJlcGxhY2VyZWdleHAiIGNhdGVnb3J5PSJvdGhlciIKKyAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuUmVwbGFjZVJlZ0V4cCIKKyAgICAgID4KKworICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbUGVyZm9ybXMgcmVndWxhciBleHByZXNzaW9uIHN0cmluZyByZXBsYWNlbWVudHMgaW4gYSB0ZXh0IGZpbGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgPGRlc2NyaXB0aW9uPgorICAgIDwhW0NEQVRBW1BlcmZvcm1zIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdHJpbmcgcmVwbGFjZW1lbnRzIGluIGEgdGV4dAorIGZpbGUuICBUaGUgaW5wdXQgZmlsZShzKSBtdXN0IGJlIGFibGUgdG8gYmUgcHJvcGVybHkgcHJvY2Vzc2VkIGJ5CisgYSBSZWFkZXIgaW5zdGFuY2UuICBUaGF0IGlzLCB0aGV5IG11c3QgYmUgdGV4dCBvbmx5LCBubyBiaW5hcnkuCisKKyBUaGUgc3ludGF4IG9mIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gZGVwZW5kcyBvbiB0aGUgaW1wbGVtdGF0aW9uIHRoYXQKKyB5b3UgY2hvb3NlIHRvIHVzZS4gVGhlIHN5c3RlbSBwcm9wZXJ0eSA8Y29kZT5hbnQucmVnZXhwLnJlZ2V4cGltcGw8L2NvZGU+Cisgd2lsbCBiZSB0aGUgY2xhc3NuYW1lIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiB0aGF0IHdpbGwgYmUgdXNlZCAodGhlIGRlZmF1bHQKKyBpcyA8Y29kZT5vcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLnJlZ2V4cC5KYWthcnRhT3JvUmVnZXhwPC9jb2RlPiBhbmQKKyByZXF1aXJlcyB0aGUgSmFrYXJ0YSBPcm8gUGFja2FnZSkuCisKKyA8cHJlPgorIEZvciBqZGsgICZsdDs9IDEuMywgdGhlcmUgYXJlIHR3byBhdmFpbGFibGUgaW1wbGVtZW50YXRpb25zOgorICAgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5yZWdleHAuSmFrYXJ0YU9yb1JlZ2V4cCAodGhlIGRlZmF1bHQpCisgICAgICAgIFJlcXVpcmVzICB0aGUgamFrYXJ0YS1vcm8gcGFja2FnZQorCisgICBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLnJlZ2V4cC5KYWthcnRhUmVnZXhwUmVnZXhwCisgICAgICAgIFJlcXVpcmVzIHRoZSBqYWthcnRhLXJlZ2V4cCBwYWNrYWdlCisKKyBGb3IgamRrICZndDs9IDEuNCBhbiBhZGRpdGlvbmFsIGltcGxlbWVudGF0aW9uIGlzIGF2YWlsYWJsZToKKyAgIG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwucmVnZXhwLkpkazE0UmVnZXhwUmVnZXhwCisgICAgICAgIFJlcXVpcmVzIHRoZSBqZGsgMS40IGJ1aWx0IGluIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYWNrYWdlLgorCisgVXNhZ2U6CisKKyAgIENhbGwgU3ludGF4OgorCisgICAgICZsdDtyZXBsYWNlcmVnZXhwIGZpbGU9ImZpbGUiCisgICAgICAgICAgICAgICAgICAgIG1hdGNoPSJwYXR0ZXJuIiAKKyAgICAgICAgICAgICAgICAgICAgcmVwbGFjZT0icGF0dGVybiIgCisgICAgICAgICAgICAgICAgICAgIGZsYWdzPSJvcHRpb25zIj8KKyAgICAgICAgICAgICAgICAgICAgYnlsaW5lPSJ0cnVlfGZhbHNlIj8gJmd0OworICAgICAgIHJlZ2V4cD8KKyAgICAgICBzdWJzdGl0dXRpb24/CisgICAgICAgZmlsZXNldCoKKyAgICAgJmx0Oy9yZXBsYWNlcmVnZXhwJmd0OworCisgICAgTk9URTogWW91IG11c3QgaGF2ZSBlaXRoZXIgdGhlIGZpbGUgYXR0cmlidXRlIHNwZWNpZmllZCwgb3IgYXQgbGVhc3Qgb25lIGZpbGVzZXQgc3ViZWxlbWVudAorICAgIHRvIG9wZXJhdGlvbiBvbi4gIFlvdSBtYXkgbm90IGhhdmUgdGhlIGZpbGUgYXR0cmlidXRlIHNwZWNpZmllZCBpZiB5b3UgbmVzdCBmaWxlc2V0IGVsZW1lbnRzCisgICAgaW5zaWRlIHRoaXMgdGFzay4gIEFsc28sIHlvdSBjYW5ub3Qgc3BlY2lmeSBib3RoIG1hdGNoIGFuZCBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdWJlbGVtZW50IGF0CisgICAgdGhlIHNhbWUgdGltZSwgbm9yIGNhbiB5b3Ugc3BlY2lmeSB0aGUgcmVwbGFjZSBhdHRyaWJ1dGUgYW5kIHRoZSBzdWJzdGl0dXRpb24gc3ViZWxlbWVudCBhdAorICAgIHRoZSBzYW1lIHRpbWUuCisKKyAgIEF0dHJpYnV0ZXM6CisKKyAgICAgZmlsZSAgICAtLSZndDsgQSBzaW5nbGUgZmlsZSB0byBvcGVyYXRpb24gb24gKG11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIHRoZSBmaWxlc2V0IHN1YmVsZW1lbnRzKQorICAgICBtYXRjaCAgIC0tJmd0OyBUaGUgUmVndWxhciBleHByZXNzaW9uIHRvIG1hdGNoIAorICAgICByZXBsYWNlIC0tJmd0OyBUaGUgRXhwcmVzc2lvbiByZXBsYWNlbWVudCBzdHJpbmcgCisgICAgIGZsYWdzICAgLS0mZ3Q7IFRoZSBvcHRpb25zIHRvIGdpdmUgdG8gdGhlIHJlcGxhY2VtZW50IAorICAgICAgICAgICAgICAgICBnID0gU3Vic3RpdHV0ZSBhbGwgb2NjdXJyZW5jZXMuIGRlZmF1bHQgaXMgdG8gcmVwbGFjZSBvbmx5IHRoZSBmaXJzdCBvbmUKKyAgICAgICAgICAgICAgICAgaSA9IENhc2UgaW5zZW5zaXRpdmUgbWF0Y2gKKworICAgICBieWxpbmUgIC0tJmd0OyBTaG91bGQgdGhpcyBmaWxlIGJlIHByb2Nlc3NlZCBhIHNpbmdsZSBsaW5lIGF0IGEgdGltZSAoZGVmYXVsdCBpcyBmYWxzZSkKKyAgICAgICAgICAgICAgICAgInRydWUiIGluZGljYXRlcyB0byBwZXJmb3JtIHJlcGxhY2VtZW50IG9uIGEgbGluZSBieSBsaW5lIGJhc2lzCisgICAgICAgICAgICAgICAgICJmYWxzZSIgaW5kaWNhdGVzIHRvIHBlcmZvcm0gcmVwbGFjZW1lbnQgb24gdGhlIHdob2xlIGZpbGUgYXQgb25jZS4KKworICBFeGFtcGxlOgorCisgICAgIFRoZSBmb2xsb3dpbmcgY2FsbCBjb3VsZCBiZSB1c2VkIHRvIHJlcGxhY2UgYW4gb2xkIHByb3BlcnR5IG5hbWUgaW4gYSAiLnByb3BlcnRpZXMiCisgICAgIGZpbGUgd2l0aCBhIG5ldyBuYW1lLiAgSW4gdGhlIHJlcGxhY2UgYXR0cmlidXRlLCB5b3UgY2FuIHJlZmVyIHRvIGFueSBwYXJ0IG9mIHRoZQorICAgICBtYXRjaCBleHByZXNzaW9uIGluIHBhcmVudGhlc2lzIHVzaW5nIGJhY2tzbGFzaCBmb2xsb3dlZCBieSBhIG51bWJlciBsaWtlICdcMScuCisKKyAgICAgJmx0O3JlcGxhY2VyZWdleHAgZmlsZT0idGVzdC5wcm9wZXJ0aWVzIgorICAgICAgICAgICAgICAgICAgICBtYXRjaD0iTXlQcm9wZXJ0eT0oLiopIgorICAgICAgICAgICAgICAgICAgICByZXBsYWNlPSJOZXdQcm9wZXJ0eT1cMSIKKyAgICAgICAgICAgICAgICAgICAgYnlsaW5lPSJ0cnVlIiAvJmd0OworCisgPC9wcmU+XV0+CisgIDwvZGVzY3JpcHRpb24+CisKKyAgPHN0cnVjdHVyZT4KKworICAgIDxhdHRyaWJ1dGVzPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJieWxpbmUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtQcm9jZXNzIHRoZSBmaWxlKHMpIG9uZSBsaW5lIGF0IGEgdGltZSwgZXhlY3V0aW5nIHRoZSByZXBsYWNlbWVudAorIG9uIG9uZSBsaW5lIGF0IGEgdGltZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgUHJvY2VzcyB0aGUgZmlsZShzKSBvbmUgbGluZSBhdCBhIHRpbWUsIGV4ZWN1dGluZyB0aGUgcmVwbGFjZW1lbnQKKyBvbiBvbmUgbGluZSBhdCBhIHRpbWUuICBUaGlzIGlzIHVzZWZ1bCBpZiB5b3UKKyB3YW50IHRvIG9ubHkgcmVwbGFjZSB0aGUgZmlyc3Qgb2NjdXJlbmNlIG9mIGEgcmVndWxhciBleHByZXNzaW9uIG9uCisgZWFjaCBsaW5lLCB3aGljaCBpcyBub3QgZWFzeSB0byBkbyB3aGVuIHByb2Nlc3NpbmcgdGhlIGZpbGUgYXMgYSB3aG9sZS4KKyBEZWZhdWx0cyB0byA8aT5mYWxzZTwvaT4uPC90ZD4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmaWxlIiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRmlsZSBmb3Igd2hpY2ggdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBzaG91bGQgYmUgcmVwbGFjZWQ7CisgcmVxdWlyZWQgdW5sZXNzIGEgbmVzdGVkIGZpbGVzZXQgaXMgc3VwcGxpZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIGZpbGUgZm9yIHdoaWNoIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gc2hvdWxkIGJlIHJlcGxhY2VkOworIHJlcXVpcmVkIHVubGVzcyBhIG5lc3RlZCBmaWxlc2V0IGlzIHN1cHBsaWVkLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImZsYWdzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGZsYWdzIHRvIHVzZSB3aGVuIG1hdGNoaW5nIHRoZSByZWd1bGFyIGV4cHJlc3Npb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRoZSBmbGFncyB0byB1c2Ugd2hlbiBtYXRjaGluZyB0aGUgcmVndWxhciBleHByZXNzaW9uLiAgRm9yIG1vcmUKKyBpbmZvcm1hdGlvbiwgY29uc3VsdCB0aGUgUGVybDUgc3ludGF4LgorIDx1bD4KKyAgPGxpPmcgOiBHbG9iYWwgcmVwbGFjZW1lbnQuICBSZXBsYWNlIGFsbCBvY2N1cmVuY2VzIGZvdW5kCisgIDxsaT5pIDogQ2FzZSBJbnNlbnNpdGl2ZS4gIERvIG5vdCBjb25zaWRlciBjYXNlIGluIHRoZSBtYXRjaAorICA8bGk+bSA6IE11bHRpbGluZS4gIFRyZWF0IHRoZSBzdHJpbmcgYXMgbXVsdGlwbGUgbGluZXMgb2YgaW5wdXQsIAorICAgICAgICAgdXNpbmcgIl4iIGFuZCAiJCIgYXMgdGhlIHN0YXJ0IG9yIGVuZCBvZiBhbnkgbGluZSwgcmVzcGVjdGl2ZWx5LCByYXRoZXIgdGhhbiBzdGFydCBvciBlbmQgb2Ygc3RyaW5nLgorICA8bGk+IHMgOiBTaW5nbGVsaW5lLiAgVHJlYXQgdGhlIHN0cmluZyBhcyBhIHNpbmdsZSBsaW5lIG9mIGlucHV0LCB1c2luZworICAgICAgICAiLiIgdG8gbWF0Y2ggYW55IGNoYXJhY3RlciwgaW5jbHVkaW5nIGEgbmV3bGluZSwgd2hpY2ggbm9ybWFsbHksIGl0IHdvdWxkIG5vdCBtYXRjaC4KKzwvdWw+CisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibWF0Y2giIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4gdG8gbWF0Y2ggaW4gdGhlIGZpbGUocyk7CisgcmVxdWlyZWQgaWYgbm8gbmVzdGVkICZsdDtyZWdleHAmZ3Q7IGlzIHVzZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybiB0byBtYXRjaCBpbiB0aGUgZmlsZShzKTsKKyByZXF1aXJlZCBpZiBubyBuZXN0ZWQgJmx0O3JlZ2V4cCZndDsgaXMgdXNlZAorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InJlcGxhY2UiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgc3Vic3RpdHV0aW9uIHBhdHRlcm4gdG8gcGxhY2UgaW4gdGhlIGZpbGUocykgaW4gcGxhY2UKKyBvZiB0aGUgcmVndWxhciBleHByZXNzaW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBUaGUgc3Vic3RpdHV0aW9uIHBhdHRlcm4gdG8gcGxhY2UgaW4gdGhlIGZpbGUocykgaW4gcGxhY2UKKyBvZiB0aGUgcmVndWxhciBleHByZXNzaW9uLgorIFJlcXVpcmVkIGlmIG5vIG5lc3RlZCAmbHQ7c3Vic3RpdHV0aW9uJmd0OyBpcyB1c2VkCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICA8L2F0dHJpYnV0ZXM+CisKKyAgICA8ZWxlbWVudHM+CisgICAgICA8ZWxlbWVudCBuYW1lPSJmaWxlc2V0IiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0IgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlc2V0IgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTGlzdCBmaWxlcyB0byBhcHBseSB0aGUgcmVwbGFjZW1lbnQgdG8uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW2xpc3QgZmlsZXMgdG8gYXBwbHkgdGhlIHJlcGxhY2VtZW50IHRvXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICAgIDxlbGVtZW50IG5hbWU9InJlZ2V4cCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVndWxhckV4cHJlc3Npb24iCisgICAgICAgICAgICAgICBicmllZlR5cGU9IiIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0EgcmVndWxhciBleHByZXNzaW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtBIHJlZ3VsYXIgZXhwcmVzc2lvbi4KKyBZb3UgY2FuIHVzZSB0aGlzIGVsZW1lbnQgdG8gcmVmZXIgdG8gYSBwcmV2aW91c2x5CisgZGVmaW5lZCByZWd1bGFyIGV4cHJlc3Npb24gZGF0YXR5cGUgaW5zdGFuY2VdXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgICAgPGVsZW1lbnQgbmFtZT0ic3Vic3RpdHV0aW9uIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5TdWJzdGl0dXRpb24iCisgICAgICAgICAgICAgICBicmllZlR5cGU9IiIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0Egc3Vic3RpdHV0aW9uIHBhdHRlcm4uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0Egc3Vic3RpdHV0aW9uIHBhdHRlcm4uICBZb3UgY2FuIHVzZSB0aGlzIGVsZW1lbnQgdG8gcmVmZXIgdG8gYSBwcmV2aW91c2x5CisgZGVmaW5lZCBzdWJzdGl0dXRpb24gcGF0dGVybiBkYXRhdHlwZSBpbnN0YW5jZS5dXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgIDwvZWxlbWVudHM+CisKKyAgPC9zdHJ1Y3R1cmU+CisKKzwvdGFzaz4KKworCis8dGFzayBuYW1lPSJybWljIiBjYXRlZ29yeT0iamF2YSIKKyAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuUm1pYyIKKyAgICAgIG1hdGNoaW5nVGFzaz0idHJ1ZSI+CisKKyAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1J1bnMgdGhlIHJtaWMgY29tcGlsZXIgYWdhaW5zdCBjbGFzc2VzLjwvcD4gPHA+Um1pYyBjYW4gYmUgcnVuIG9uIGEgc2luZ2xlIGNsYXNzIChhcyBzcGVjaWZpZWQgd2l0aCB0aGUgY2xhc3NuYW1lIGF0dHJpYnV0ZSkgb3IgYSBudW1iZXIgb2YgY2xhc3NlcyBhdCBvbmNlIChhbGwgY2xhc3NlcyBiZWxvdyBiYXNlIHRoYXQgYXJlIG5laXRoZXIgX1N0dWIgbm9yIF9Ta2VsIGNsYXNzZXMpLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgIDxkZXNjcmlwdGlvbj4KKyAgICA8IVtDREFUQVtSdW5zIHRoZSBybWljIGNvbXBpbGVyIGFnYWluc3QgY2xhc3Nlcy48L3A+CisgPHA+Um1pYyBjYW4gYmUgcnVuIG9uIGEgc2luZ2xlIGNsYXNzIChhcyBzcGVjaWZpZWQgd2l0aCB0aGUgY2xhc3NuYW1lCisgYXR0cmlidXRlKSBvciBhIG51bWJlciBvZiBjbGFzc2VzIGF0IG9uY2UgKGFsbCBjbGFzc2VzIGJlbG93IGJhc2UgdGhhdAorIGFyZSBuZWl0aGVyIF9TdHViIG5vciBfU2tlbCBjbGFzc2VzKS4gIElmIHlvdSB3YW50IHRvIHJtaWMgYSBzaW5nbGUKKyBjbGFzcyBhbmQgdGhpcyBjbGFzcyBpcyBhIGNsYXNzIG5lc3RlZCBpbnRvIGFub3RoZXIgY2xhc3MsIHlvdSBoYXZlIHRvCisgc3BlY2lmeSB0aGUgY2xhc3NuYW1lIGluIHRoZSBmb3JtIDxjb2RlPk91dGVyJCRJbm5lcjwvY29kZT4gaW5zdGVhZCBvZgorIDxjb2RlPk91dGVyLklubmVyPC9jb2RlPi48L3A+CisgPHA+SXQgaXMgcG9zc2libGUgdG8gcmVmaW5lIHRoZSBzZXQgb2YgZmlsZXMgdGhhdCBhcmUgYmVpbmcgcm1pY2VkLiBUaGlzIGNhbiBiZQorIGRvbmUgd2l0aCB0aGUgPGk+aW5jbHVkZXM8L2k+LCA8aT5pbmNsdWRlc2ZpbGU8L2k+LCA8aT5leGNsdWRlczwvaT4sIAorIDxpPmV4Y2x1ZGVzZmlsZTwvaT4gYW5kIDxpPmRlZmF1bHRleGNsdWRlczwvaT4KKyBhdHRyaWJ1dGVzLiBXaXRoIHRoZSA8aT5pbmNsdWRlczwvaT4gb3IgPGk+aW5jbHVkZXNmaWxlPC9pPiBhdHRyaWJ1dGUgeW91IHNwZWNpZnkgdGhlIGZpbGVzIHlvdSB3YW50IHRvCisgaGF2ZSBpbmNsdWRlZCBieSB1c2luZyBwYXR0ZXJucy4gVGhlIDxpPmV4Y2x1ZGU8L2k+IG9yIDxpPmV4Y2x1ZGVzZmlsZTwvaT4gYXR0cmlidXRlIGlzIHVzZWQgdG8gc3BlY2lmeQorIHRoZSBmaWxlcyB5b3Ugd2FudCB0byBoYXZlIGV4Y2x1ZGVkLiBUaGlzIGlzIGFsc28gZG9uZSB3aXRoIHBhdHRlcm5zLiBBbmQKKyBmaW5hbGx5IHdpdGggdGhlIDxpPmRlZmF1bHRleGNsdWRlczwvaT4gYXR0cmlidXRlLCB5b3UgY2FuIHNwZWNpZnkgd2hldGhlciB5b3UKKyB3YW50IHRvIHVzZSBkZWZhdWx0IGV4Y2x1c2lvbnMgb3Igbm90LiBTZWUgdGhlIHNlY3Rpb24gb24gCisgZGlyZWN0b3J5IGJhc2VkIHRhc2tzPC9hPiwgb24gaG93IHRoZQorIGluY2x1c2lvbi9leGNsdXNpb24gb2YgZmlsZXMgd29ya3MsIGFuZCBob3cgdG8gd3JpdGUgcGF0dGVybnMuPC9wPgorIDxwPlRoaXMgdGFzayBmb3JtcyBhbiBpbXBsaWNpdCBGaWxlU2V0IGFuZAorIHN1cHBvcnRzIGFsbCBhdHRyaWJ1dGVzIG9mIDxjb2RlPiZsdDtmaWxlc2V0Jmd0OzwvY29kZT4KKyAoPGNvZGU+ZGlyPC9jb2RlPiBiZWNvbWVzIDxjb2RlPmJhc2U8L2NvZGU+KSBhcyB3ZWxsIGFzIHRoZSBuZXN0ZWQKKyA8Y29kZT4mbHQ7aW5jbHVkZSZndDs8L2NvZGU+LCA8Y29kZT4mbHQ7ZXhjbHVkZSZndDs8L2NvZGU+IGFuZAorIDxjb2RlPiZsdDtwYXR0ZXJuc2V0Jmd0OzwvY29kZT4gZWxlbWVudHMuPC9wPgorIDxwPkl0IGlzIHBvc3NpYmxlIHRvIHVzZSBkaWZmZXJlbnQgY29tcGlsZXJzLiBUaGlzIGNhbiBiZSBzZWxlY3RlZAorIHdpdGggdGhlICZxdW90O2J1aWxkLnJtaWMmcXVvdDsgcHJvcGVydHkgb3IgdGhlIDxjb2RlPmNvbXBpbGVyPC9jb2RlPgorIGF0dHJpYnV0ZS4gPGEgbmFtZT0iY29tcGlsZXJ2YWx1ZXMiPlRoZXJlIGFyZSB0aHJlZSBjaG9pY2VzPC9hPjo8L3A+CisgPHVsPgorICAgPGxpPnN1biAodGhlIHN0YW5kYXJkIGNvbXBpbGVyIG9mIHRoZSBKREspPC9saT4KKyAgIDxsaT5rYWZmZSAodGhlIHN0YW5kYXJkIGNvbXBpbGVyIG9mIAorICAgICAgIHtAbGluayA8YSBocmVmPSJodHRwOi8vd3d3LmthZmZlLm9yZyI+S2FmZmU8L2E+fSk8L2xpPgorICAgPGxpPndlYmxvZ2ljPC9saT4KKyA8L3VsPgorIDxwPiBUaGUgPGEgaHJlZj0iaHR0cDovL2Rpb25lLnpjdS5jei9+dG9tYW40MC9taW5pUk1JLyI+bWluaVJNSTwvYT4KKyBwcm9qZWN0IGNvbnRhaW5zIGEgY29tcGlsZXIgaW1wbGVtZW50YXRpb24gZm9yIHRoaXMgdGFzayBhcyB3ZWxsLAorIHBsZWFzZSBjb25zdWx0IG1pbmlSTUkncyBkb2N1bWVudGF0aW9uIHRvIGxlYXJuIGhvdyB0byB1c2UgaXQuPC9wPl1dPgorICA8L2Rlc2NyaXB0aW9uPgorCisgIDxzdHJ1Y3R1cmU+CisKKyAgICA8YXR0cmlidXRlcz4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYmFzZSIgdHlwZT0iamF2YS5pby5GaWxlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0xvY2F0aW9uIHRvIHN0b3JlIHRoZSBjb21waWxlZCBmaWxlczsgcmVxdWlyZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldHMgdGhlIGxvY2F0aW9uIHRvIHN0b3JlIHRoZSBjb21waWxlZCBmaWxlczsgcmVxdWlyZWQKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc25hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgY2xhc3MgdG8gcnVuIDxjb2RlPnJtaWM8L2NvZGU+IGFnYWluc3Q7Cisgb3B0aW9uYWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldHMgdGhlIHRoZSBjbGFzcyB0byBydW4gPGNvZGU+cm1pYzwvY29kZT4gYWdhaW5zdDsKKyBvcHRpb25hbAorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzcGF0aCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aCIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJQYXRoIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDbGFzc3BhdGggdG8gYmUgdXNlZCBmb3IgdGhpcyBjb21waWxhdGlvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBjbGFzc3BhdGggdG8gYmUgdXNlZCBmb3IgdGhpcyBjb21waWxhdGlvbi4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc3BhdGhyZWYiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlZmVyZW5jZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJSZWZlcmVuY2UiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgdG8gdGhlIGNsYXNzcGF0aCBhIHJlZmVyZW5jZSB0byAKKyBhICZsdDtwYXRoJmd0OyBkZWZpbmVkIGVsc2V3aGVyZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgQWRkcyB0byB0aGUgY2xhc3NwYXRoIGEgcmVmZXJlbmNlIHRvIAorIGEgJmx0O3BhdGgmZ3Q7IGRlZmluZWQgZWxzZXdoZXJlLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNvbXBpbGVyIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ29tcGlsZXIgaW1wbGVtZW50YXRpb24gdG8gdXNlOyBvcHRpb25hbCwKKyBkZWZhdWx0cyB0byB0aGUgdmFsdWUgb2YgdGhlIDxjb2RlPmJ1aWxkLnJtaWM8L2NvZGU+IHByb3BlcnR5LAorIG9yIGZhaWxpbmcgdGhhdCwgZGVmYXVsdCBjb21waWxlciBmb3IgdGhlIGN1cnJlbnQgVk0uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldHMgdGhlIGNvbXBpbGVyIGltcGxlbWVudGF0aW9uIHRvIHVzZTsgb3B0aW9uYWwsCisgZGVmYXVsdHMgdG8gdGhlIHZhbHVlIG9mIHRoZSA8Y29kZT5idWlsZC5ybWljPC9jb2RlPiBwcm9wZXJ0eSwKKyBvciBmYWlsaW5nIHRoYXQsIGRlZmF1bHQgY29tcGlsZXIgZm9yIHRoZSBjdXJyZW50IFZNCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVidWciIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbR2VuZXJhdGUgZGVidWcgaW5mbyAocGFzc2VzIC1nIHRvIHJtaWMpOworIG9wdGlvbmFsLCBkZWZhdWx0cyB0byBmYWxzZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgZ2VuZXJhdGUgZGVidWcgaW5mbyAocGFzc2VzIC1nIHRvIHJtaWMpOworIG9wdGlvbmFsLCBkZWZhdWx0cyB0byBmYWxzZQorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImV4dGRpcnMiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUGF0aCIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRXh0ZW5zaW9uIGRpcmVjdG9yaWVzIHRoYXQgd2lsbCBiZSB1c2VkIGR1cmluZyB0aGUKKyBjb21waWxhdGlvbjsgb3B0aW9uYWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldHMgdGhlIGV4dGVuc2lvbiBkaXJlY3RvcmllcyB0aGF0IHdpbGwgYmUgdXNlZCBkdXJpbmcgdGhlCisgY29tcGlsYXRpb247IG9wdGlvbmFsLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImZpbHRlcmluZyIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJbmRpY2F0ZXMgd2hldGhlciB0b2tlbiBmaWx0ZXJpbmcgc2hvdWxkIHRha2UgcGxhY2U7Cisgb3B0aW9uYWwsIGRlZmF1bHQ9ZmFsc2UuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIGluZGljYXRlcyB3aGV0aGVyIHRva2VuIGZpbHRlcmluZyBzaG91bGQgdGFrZSBwbGFjZTsKKyBvcHRpb25hbCwgZGVmYXVsdD1mYWxzZQorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkbCIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJbmRpY2F0ZXMgdGhhdCBJREwgb3V0cHV0IHNob3VsZCBiZSAKKyBnZW5lcmF0ZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIEluZGljYXRlcyB0aGF0IElETCBvdXRwdXQgc2hvdWxkIGJlIAorIGdlbmVyYXRlZC4gIFRoaXMgZGVmYXVsdHMgdG8gZmFsc2UgCisgaWYgbm90IHNldC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZGxvcHRzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbUGFzcyBhZGRpdGlvbmFsIGFyZ3VtZW50cyBmb3IgaWRsIGNvbXBpbGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIHBhc3MgYWRkaXRpb25hbCBhcmd1bWVudHMgZm9yIGlkbCBjb21waWxlCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWlvcCIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJbmRpY2F0ZXMgdGhhdCBJSU9QIGNvbXBhdGlibGUgc3R1YnMgc2hvdWxkCisgYmUgZ2VuZXJhdGVkOyBvcHRpb25hbCwgZGVmYXVsdHMgdG8gZmFsc2UgCisgaWYgbm90IHNldC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgSW5kaWNhdGVzIHRoYXQgSUlPUCBjb21wYXRpYmxlIHN0dWJzIHNob3VsZAorIGJlIGdlbmVyYXRlZDsgb3B0aW9uYWwsIGRlZmF1bHRzIHRvIGZhbHNlIAorIGlmIG5vdCBzZXQuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWlvcG9wdHMiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTZXQgYWRkaXRpb25hbCBhcmd1bWVudHMgZm9yIGlpb3AuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCBhZGRpdGlvbmFsIGFyZ3VtZW50cyBmb3IgaWlvcAorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImluY2x1ZGVhbnRydW50aW1lIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NldHMgd2hldGhlciBvciBub3QgdG8gaW5jbHVkZSBhbnQncyBvd24gY2xhc3NwYXRoIGluIHRoaXMgdGFzaydzIAorIGNsYXNzcGF0aC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0cyB3aGV0aGVyIG9yIG5vdCB0byBpbmNsdWRlIGFudCdzIG93biBjbGFzc3BhdGggaW4gdGhpcyB0YXNrJ3MgCisgY2xhc3NwYXRoLgorIE9wdGlvbmFsOyBkZWZhdWx0IGlzIDxjb2RlPnRydWU8L2NvZGU+LgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImluY2x1ZGVqYXZhcnVudGltZSIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUYXNrJ3MgY2xhc3NwYXRoLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICB0YXNrJ3MgY2xhc3NwYXRoLgorIEVuYWJsZXMgb3IgZGlzYWJsZXMgaW5jbHVkaW5nIHRoZSBkZWZhdWx0IHJ1bi10aW1lCisgbGlicmFyaWVzIGZyb20gdGhlIGV4ZWN1dGluZyBWTTsgb3B0aW9uYWwsCisgZGVmYXVsdHMgdG8gZmFsc2UKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzb3VyY2ViYXNlIiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbT3B0aW9uYWwgZGlyZWN0b3J5IHRvIHNhdmUgZ2VuZXJhdGVkIHNvdXJjZSBmaWxlcyB0by5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgb3B0aW9uYWwgZGlyZWN0b3J5IHRvIHNhdmUgZ2VuZXJhdGVkIHNvdXJjZSBmaWxlcyB0by4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzdHVidmVyc2lvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NwZWNpZnkgdGhlIEpESyB2ZXJzaW9uIGZvciB0aGUgZ2VuZXJhdGVkIHN0dWIgY29kZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU3BlY2lmeSB0aGUgSkRLIHZlcnNpb24gZm9yIHRoZSBnZW5lcmF0ZWQgc3R1YiBjb2RlLgorIFNwZWNpZnkgJnF1b3Q7MS4xJnF1b3Q7IHRvIHBhc3MgdGhlICZxdW90Oy12MS4xJnF1b3Q7IG9wdGlvbiB0byBybWljLjwvdGQ+CisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmVyaWZ5IiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0ZsYWcgdG8gZW5hYmxlIHZlcmlmaWNhdGlvbiBzbyB0aGF0IHRoZSBjbGFzc2VzIAorIGZvdW5kIGJ5IHRoZSBkaXJlY3RvcnkgbWF0Y2ggYXJlCisgY2hlY2tlZCB0byBzZWUgaWYgdGhleSBpbXBsZW1lbnQgamF2YS5ybWkuUmVtb3RlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBGbGFnIHRvIGVuYWJsZSB2ZXJpZmljYXRpb24gc28gdGhhdCB0aGUgY2xhc3NlcyAKKyBmb3VuZCBieSB0aGUgZGlyZWN0b3J5IG1hdGNoIGFyZQorIGNoZWNrZWQgdG8gc2VlIGlmIHRoZXkgaW1wbGVtZW50IGphdmEucm1pLlJlbW90ZS4KKyBPcHRpb25hbDsgaGlzIGRlZmF1bHRzIHRvIGZhbHNlIGlmIG5vdCBzZXQuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICA8L2F0dHJpYnV0ZXM+CisKKyAgICA8ZWxlbWVudHM+CisgICAgICA8ZWxlbWVudCBuYW1lPSJjbGFzc3BhdGgiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IlBhdGgiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDcmVhdGVzIGEgbmVzdGVkIGNsYXNzcGF0aCBlbGVtZW50Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtDcmVhdGVzIGEgbmVzdGVkIGNsYXNzcGF0aCBlbGVtZW50Ll1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgICA8ZWxlbWVudCBuYW1lPSJjb21waWxlcmFyZyIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuUm1pYy5JbXBsZW1lbnRhdGlvblNwZWNpZmljQXJndW1lbnQiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IiIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgYW4gaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgY29tbWFuZCBsaW5lIGFyZ3VtZW50Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtBZGRzIGFuIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIGNvbW1hbmQgbGluZSBhcmd1bWVudC5dXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgICAgPGVsZW1lbnQgbmFtZT0iZXh0ZGlycyIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aCIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUGF0aCIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW01heWJlIGNyZWF0ZXMgYSBuZXN0ZWQgZXh0ZGlycyBlbGVtZW50Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtNYXliZSBjcmVhdGVzIGEgbmVzdGVkIGV4dGRpcnMgZWxlbWVudC5dXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgIDwvZWxlbWVudHM+CisKKyAgPC9zdHJ1Y3R1cmU+CisKKzwvdGFzaz4KKworCis8dGFzayBuYW1lPSJycG0iIGNhdGVnb3J5PSJvdGhlciIKKyAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuUnBtIgorICAgICAgPgorCisgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJbnZva2VzIHRoZSBycG0gdG9vbCB0byBidWlsZCBhIExpbnV4IGluc3RhbGxhdGlvbiBmaWxlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgIDxkZXNjcmlwdGlvbj4KKyAgICA8IVtDREFUQVtJbnZva2VzIHRoZSBycG0gdG9vbCB0byBidWlsZCBhIExpbnV4IGluc3RhbGxhdGlvbiBmaWxlLl1dPgorICA8L2Rlc2NyaXB0aW9uPgorCisgIDxzdHJ1Y3R1cmU+CisKKyAgICA8YXR0cmlidXRlcz4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xlYW5idWlsZGRpciIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtGbGFnIChvcHRpb25hbCwgZGVmYXVsdD1mYWxzZSkgdG8gcmVtb3ZlIAorIHRoZSBnZW5lcmF0ZWQgZmlsZXMgaW4gdGhlIEJVSUxEIGRpcmVjdG9yeS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgRmxhZyAob3B0aW9uYWwsIGRlZmF1bHQ9ZmFsc2UpIHRvIHJlbW92ZSAKKyB0aGUgZ2VuZXJhdGVkIGZpbGVzIGluIHRoZSBCVUlMRCBkaXJlY3RvcnkKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb21tYW5kIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbV2hhdCBjb21tYW5kIHRvIGlzc3VlIHRvIHRoZSBycG0gdG9vbDsgb3B0aW9uYWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFdoYXQgY29tbWFuZCB0byBpc3N1ZSB0byB0aGUgcnBtIHRvb2w7IG9wdGlvbmFsLgorIFRoZSBkZWZhdWx0IGlzICItYmIiCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZXJyb3IiIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtPcHRpb25hbCBmaWxlIHRvIHNhdmUgc3RkZXJyIHRvLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBPcHRpb25hbCBmaWxlIHRvIHNhdmUgc3RkZXJyIHRvCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ib3V0cHV0IiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbT3B0aW9uYWwgZmlsZSB0byBzYXZlIHN0ZG91dCB0by5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgT3B0aW9uYWwgZmlsZSB0byBzYXZlIHN0ZG91dCB0by4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJyZW1vdmVzb3VyY2UiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRmxhZyAob3B0aW9uYWwsIGRlZmF1bHQ9ZmFsc2UpIAorIHRvIHJlbW92ZSB0aGUgc291cmNlcyBhZnRlciB0aGUgYnVpbGQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIEZsYWcgKG9wdGlvbmFsLCBkZWZhdWx0PWZhbHNlKSAKKyB0byByZW1vdmUgdGhlIHNvdXJjZXMgYWZ0ZXIgdGhlIGJ1aWxkLgorIFNlZSB0aGUgdGhlIDx0dD4tLXJtc291cmNlPC90dD4gIG9wdGlvbiBvZiBycG1idWlsZC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJyZW1vdmVzcGVjIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0ZsYWcgKG9wdGlvbmFsLCBkZWZhdWx0PWZhbHNlKSB0byByZW1vdmUgdGhlIHNwZWMgZmlsZSBmcm9tIFNQRUNTLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBGbGFnIChvcHRpb25hbCwgZGVmYXVsdD1mYWxzZSkgdG8gcmVtb3ZlIHRoZSBzcGVjIGZpbGUgZnJvbSBTUEVDUworICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InNwZWNmaWxlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIG5hbWUgb2YgdGhlIHNwZWMgRmlsZSB0byB1c2U7IHJlcXVpcmVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgc3BlYyBGaWxlIHRvIHVzZTsgcmVxdWlyZWQuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idG9wZGlyIiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGRpcmVjdG9yeSB3aGljaCB3aWxsIGhhdmUgdGhlIGV4cGVjdGVkCisgc3ViZGlyZWN0b3JpZXMsIFNQRUNTLCBTT1VSQ0VTLCBCVUlMRCwgU1JQTVMgOyBvcHRpb25hbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgVGhlIGRpcmVjdG9yeSB3aGljaCB3aWxsIGhhdmUgdGhlIGV4cGVjdGVkCisgc3ViZGlyZWN0b3JpZXMsIFNQRUNTLCBTT1VSQ0VTLCBCVUlMRCwgU1JQTVMgOyBvcHRpb25hbC4gCisgSWYgdGhpcyBpc24ndCBzcGVjaWZpZWQsCisgdGhlIDx0dD5iYXNlRGlyPC90dD4gdmFsdWUgaXMgdXNlZAorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgPC9hdHRyaWJ1dGVzPgorCisgICAgPGVsZW1lbnRzPgorICAgIDwvZWxlbWVudHM+CisKKyAgPC9zdHJ1Y3R1cmU+CisKKzwvdGFzaz4KKworCis8dGFzayBuYW1lPSJzY3JpcHQiIGNhdGVnb3J5PSJvdGhlciIKKyAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuU2NyaXB0IgorICAgICAgPgorCisgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtFeGVjdXRlcyBhIHNjcmlwdC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICA8ZGVzY3JpcHRpb24+CisgICAgPCFbQ0RBVEFbRXhlY3V0ZXMgYSBzY3JpcHQuXV0+CisgIDwvZGVzY3JpcHRpb24+CisKKyAgPHN0cnVjdHVyZT4KKworICAgIDxhdHRyaWJ1dGVzPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsYW5ndWFnZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0RlZmluZXMgdGhlIGxhbmd1YWdlIChyZXF1aXJlZCkuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIERlZmluZXMgdGhlIGxhbmd1YWdlIChyZXF1aXJlZCkuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3JjIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTG9hZCB0aGUgc2NyaXB0IGZyb20gYW4gZXh0ZXJuYWwgZmlsZSA7IG9wdGlvbmFsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBMb2FkIHRoZSBzY3JpcHQgZnJvbSBhbiBleHRlcm5hbCBmaWxlIDsgb3B0aW9uYWwuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICA8L2F0dHJpYnV0ZXM+CisKKyAgICA8ZWxlbWVudHM+CisgICAgPC9lbGVtZW50cz4KKworICAgICAgPGJvZHkgPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgVGhlIHNjcmlwdCB0ZXh0LgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9ib2R5PgorCisgIDwvc3RydWN0dXJlPgorCis8L3Rhc2s+CisKKworPHRhc2sgbmFtZT0ic2VxdWVudGlhbCIgY2F0ZWdvcnk9ImNvbnRyb2wiCisgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlNlcXVlbnRpYWwiCisgICAgICA+CisKKyAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NlcXVlbnRpYWwgaXMgYSBjb250YWluZXIgdGFzayAtIGl0IGNhbiBjb250YWluIG90aGVyIEFudCB0YXNrcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICA8ZGVzY3JpcHRpb24+CisgICAgPCFbQ0RBVEFbU2VxdWVudGlhbCBpcyBhIGNvbnRhaW5lciB0YXNrIC0gaXQgY2FuIGNvbnRhaW4gb3RoZXIgQW50IHRhc2tzLiBUaGUgbmVzdGVkIAorIHRhc2tzIGFyZSBzaW1wbHkgZXhlY3V0ZWQgaW4gc2VxdWVuY2UuIFNlcXVlbnRpYWwncyBwcmltYXJ5IHVzZSBpcyB0byBzdXBwb3J0IAorIHRoZSBzZXF1ZW50aWFsIGV4ZWN1dGlvbiBvZiBhIHN1YnNldCBvZiB0YXNrcyB3aXRoaW4gdGhlCit7QGxpbmsgUGFyYWxsZWwgUGFyYWxsZWwgVGFza30gCisKKyA8cD4KKyBUaGUgc2VxdWVudGlhbCB0YXNrIGhhcyBubyBhdHRyaWJ1dGVzIGFuZCBkb2VzIG5vdCBzdXBwb3J0IGFueSBuZXN0ZWQgCisgZWxlbWVudHMgYXBhcnQgZnJvbSBBbnQgdGFza3MuIEFueSB2YWxpZCBBbnQgdGFzayBtYXkgYmUgZW1iZWRkZWQgd2l0aGluIHRoZSAKKyBzZXF1ZW50aWFsIHRhc2suPC9wPl1dPgorICA8L2Rlc2NyaXB0aW9uPgorCisgIDxzdHJ1Y3R1cmU+CisKKyAgICA8YXR0cmlidXRlcz4KKyAgICA8L2F0dHJpYnV0ZXM+CisKKyAgICA8ZWxlbWVudHM+CisgICAgPC9lbGVtZW50cz4KKworICA8L3N0cnVjdHVyZT4KKworPC90YXNrPgorCisKKzx0YXNrIG5hbWU9InNlcnZlcmRlcGxveSIgY2F0ZWdvcnk9Im90aGVyIgorICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qMmVlLlNlcnZlckRlcGxveSIKKyAgICAgID4KKworICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ29udHJvbHMgaG90IGRlcGxveW1lbnQgdG9vbHMgZm9yIEoyRUUgc2VydmVycy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICA8ZGVzY3JpcHRpb24+CisgICAgPCFbQ0RBVEFbQ29udHJvbHMgaG90IGRlcGxveW1lbnQgdG9vbHMgZm9yIEoyRUUgc2VydmVycy4KKworICBUaGlzIGNsYXNzIGlzIHVzZWQgYXMgYSBmcmFtZXdvcmsgZm9yIHRoZSBjcmVhdGlvbiBvZiB2ZW5kb3Igc3BlY2lmaWMKKyAgaG90IGRlcGxveW1lbnQgdG9vbHMuXV0+CisgIDwvZGVzY3JpcHRpb24+CisKKyAgPHN0cnVjdHVyZT4KKworICAgIDxhdHRyaWJ1dGVzPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJhY3Rpb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgYWN0aW9uIHRvIGJlIHBlcmZvcm1lZCwgdXN1YWxseSAiZGVwbG95IjsgcmVxdWlyZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRoZSBhY3Rpb24gdG8gYmUgcGVyZm9ybWVkLCB1c3VhbGx5ICJkZXBsb3kiOyByZXF1aXJlZC4KKyAgIFNvbWUgdG9vbHMgc3VwcG9ydCBhZGRpdGlvbmFsIGFjdGlvbnMsIHN1Y2ggYXMgImRlbGV0ZSIsICJsaXN0IiwgInVuZGVwbG95IiwgInVwZGF0ZSIuLi4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzb3VyY2UiIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgZmlsZW5hbWUgb2YgdGhlIGNvbXBvbmVudCB0byBiZSBkZXBsb3llZDsgb3B0aW9uYWwKKyAgZGVwZW5kaW5nIHVwb24gdGhlIHRvb2wgYW5kIHRoZSBhY3Rpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRoZSBmaWxlbmFtZSBvZiB0aGUgY29tcG9uZW50IHRvIGJlIGRlcGxveWVkOyBvcHRpb25hbAorICBkZXBlbmRpbmcgdXBvbiB0aGUgdG9vbCBhbmQgdGhlIGFjdGlvbi4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgIDwvYXR0cmlidXRlcz4KKworICAgIDxlbGVtZW50cz4KKyAgICAgIDxlbGVtZW50IG5hbWU9ImdlbmVyaWMiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmoyZWUuR2VuZXJpY0hvdERlcGxveW1lbnRUb29sIgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDcmVhdGVzIGEgZ2VuZXJpYyBkZXBsb3ltZW50IHRvb2wuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0NyZWF0ZXMgYSBnZW5lcmljIGRlcGxveW1lbnQgdG9vbC4KKyAgPHA+QW50IGNhbGxzIHRoaXMgbWV0aG9kIG9uIGNyZWF0aW9uIHRvIGhhbmRsZSBlbWJlZGRlZCAiZ2VuZXJpYyIgZWxlbWVudHMKKyAgaW4gdGhlIFNlcnZlckRlcGxveSB0YXNrLl1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgICA8ZWxlbWVudCBuYW1lPSJqb25hcyIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuajJlZS5Kb25hc0hvdERlcGxveW1lbnRUb29sIgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDcmVhdGVzIGEgSk9uQVMgZGVwbG95bWVudCB0b29sLCBmb3IgZGVwbG95bWVudCB0byBKT25BUyBzZXJ2ZXJzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtDcmVhdGVzIGEgSk9uQVMgZGVwbG95bWVudCB0b29sLCBmb3IgZGVwbG95bWVudCB0byBKT25BUyBzZXJ2ZXJzLgorICA8cD5BbnQgY2FsbHMgdGhpcyBtZXRob2Qgb24gY3JlYXRpb24gdG8gaGFuZGxlIGVtYmVkZGVkICJqb25hcyIgZWxlbWVudHMKKyAgaW4gdGhlIFNlcnZlckRlcGxveSB0YXNrLl1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgICA8ZWxlbWVudCBuYW1lPSJ3ZWJsb2dpYyIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuajJlZS5XZWJMb2dpY0hvdERlcGxveW1lbnRUb29sIgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDcmVhdGVzIGEgV2ViTG9naWMgZGVwbG95bWVudCB0b29sLCBmb3IgZGVwbG95bWVudCB0byBXZWJMb2dpYyBzZXJ2ZXJzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtDcmVhdGVzIGEgV2ViTG9naWMgZGVwbG95bWVudCB0b29sLCBmb3IgZGVwbG95bWVudCB0byBXZWJMb2dpYyBzZXJ2ZXJzLgorICA8cD5BbnQgY2FsbHMgdGhpcyBtZXRob2Qgb24gY3JlYXRpb24gdG8gaGFuZGxlIGVtYmVkZGVkICJ3ZWJsb2dpYyIgZWxlbWVudHMKKyAgaW4gdGhlIFNlcnZlckRlcGxveSB0YXNrLl1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgPC9lbGVtZW50cz4KKworICA8L3N0cnVjdHVyZT4KKworPC90YXNrPgorCisKKzx0YXNrIG5hbWU9InNldHByb3h5IiBjYXRlZ29yeT0ib3RoZXIiCisgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLm5ldC5TZXRQcm94eSIKKyAgICAgID4KKworICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2V0cyBKYXZhJ3Mgd2ViIHByb3h5IHByb3BlcnRpZXMsIHNvIHRoYXQgdGFza3MgYW5kIGNvZGUgcnVuIGluIHRoZSBzYW1lIEpWTSBjYW4gaGF2ZSB0aHJvdWdoLXRoZS1maXJld2FsbCBhY2Nlc3MgdG8gcmVtb3RlIHdlYiBzaXRlcywgYW5kIHJlbW90ZSBmdHAgc2l0ZXMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgPGRlc2NyaXB0aW9uPgorICAgIDwhW0NEQVRBW1NldHMgSmF2YSdzIHdlYiBwcm94eSBwcm9wZXJ0aWVzLCBzbyB0aGF0IHRhc2tzIGFuZCBjb2RlIHJ1biBpbgorIHRoZSBzYW1lIEpWTSBjYW4gaGF2ZSB0aHJvdWdoLXRoZS1maXJld2FsbCBhY2Nlc3MgdG8gcmVtb3RlIHdlYiBzaXRlcywKKyBhbmQgcmVtb3RlIGZ0cCBzaXRlcy4KKyBZb3UgY2FuIG5vbWluYXRlIGFuIGh0dHAgYW5kIGZ0cCBwcm94eSwgb3IgYSBzb2NrcyBzZXJ2ZXIsIHJlc2V0IHRoZSBzZXJ2ZXIgCisgc2V0dGluZ3MsIG9yIGRvIG5vdGhpbmcgYXQgYWxsLgorIDxwPiAKKyBFeGFtcGxlcworIDxwcmU+Jmx0O3NldHByb3h5LyZndDs8L3ByZT4KKyBkbyBub3RoaW5nCisgPHByZT4mbHQ7c2V0cHJveHkgcHJveHlob3N0PSJmaXJld2FsbCIvJmd0OzwvcHJlPgorIHNldCB0aGUgcHJveHkgdG8gZmlyZXdhbGw6ODAKKyA8cHJlPiZsdDtzZXRwcm94eSBwcm94eWhvc3Q9ImZpcmV3YWxsIiBwcm94eXBvcnQ9IjgxIi8mZ3Q7PC9wcmU+Cisgc2V0IHRoZSBwcm94eSB0byBmaXJld2FsbDo4MQorIDxwcmU+Jmx0O3NldHByb3h5IHByb3h5aG9zdD0iIi8mZ3Q7PC9wcmU+Cisgc3RvcCB1c2luZyB0aGUgaHR0cCBwcm94eTsgZG9uJ3QgY2hhbmdlIHRoZSBzb2NrcyBzZXR0aW5ncworIDxwcmU+Jmx0O3NldHByb3h5IHNvY2tzcHJveHlob3N0PSJzb2Nrc3kiLyZndDs8L3ByZT4KKyB1c2Ugc29ja3MgdmlhIHNvY2tzeToxMDgwCisgPHByZT4mbHQ7c2V0cHJveHkgc29ja3Nwcm94eWhvc3Q9IiIvJmd0OzwvcHJlPgorIHN0b3AgdXNpbmcgdGhlIHNvY2tzIHNlcnZlcl1dPgorICA8L2Rlc2NyaXB0aW9uPgorCisgIDxzdHJ1Y3R1cmU+CisKKyAgICA8YXR0cmlidXRlcz4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibm9ucHJveHlob3N0cyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0EgbGlzdCBvZiBob3N0cyB0byBieXBhc3MgdGhlIHByb3h5IG9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBBIGxpc3Qgb2YgaG9zdHMgdG8gYnlwYXNzIHRoZSBwcm94eSBvbi4gVGhlc2Ugc2hvdWxkIGJlIHNlcGFyYXRlZAorIHdpdGggdGhlIHZlcnRpY2FsIGJhciBjaGFyYWN0ZXIgJ3wnLiBPbmx5IGluIEphdmEgMS40IGRvZXMgZnRwIHVzZQorIHRoaXMgbGlzdC4KKyBlLmcuIGZvemJvdC5jb3JwLnN1bi5jb218Ki5lbmcuc3VuLmNvbQorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InByb3h5aG9zdCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBIVFRQL2Z0cCBwcm94eSBob3N0Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICB0aGUgSFRUUC9mdHAgcHJveHkgaG9zdC4gU2V0IHRoaXMgdG8gIiIgZm9yIHRoZSBodHRwIHByb3h5Cisgb3B0aW9uIHRvIGJlIGRpc2FibGVkCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icHJveHlwb3J0IiB0eXBlPSJpbnQiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iaW50IiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgSFRUUC9mdHAgcHJveHkgcG9ydCBudW1iZXI7IGRlZmF1bHQgaXMgODAuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIHRoZSBIVFRQL2Z0cCBwcm94eSBwb3J0IG51bWJlcjsgZGVmYXVsdCBpcyA4MAorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InNvY2tzcHJveHlob3N0IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIG5hbWUgb2YgYSBTb2NrcyBzZXJ2ZXIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRoZSBuYW1lIG9mIGEgU29ja3Mgc2VydmVyLiBTZXQgdG8gIiIgdG8gdHVybiBzb2NrcworIHByb3h5aW5nIG9mZi4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzb2Nrc3Byb3h5cG9ydCIgdHlwZT0iaW50IgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImludCIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbUHJveHlQb3J0IGZvciBzb2NrcyBjb25uZWN0aW9ucy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBQcm94eVBvcnQgZm9yIHNvY2tzIGNvbm5lY3Rpb25zLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAxMDgwCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICA8L2F0dHJpYnV0ZXM+CisKKyAgICA8ZWxlbWVudHM+CisgICAgPC9lbGVtZW50cz4KKworICA8L3N0cnVjdHVyZT4KKworPC90YXNrPgorCisKKzx0YXNrIG5hbWU9InNpZ25qYXIiIGNhdGVnb3J5PSJqYXZhIgorICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5TaWduSmFyIgorICAgICAgPgorCisgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTaWducyBqYXIgb3IgemlwIGZpbGVzIHdpdGggdGhlIGphdmFzaWduIGNvbW1hbmQgbGluZSB0b29sLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgIDxkZXNjcmlwdGlvbj4KKyAgICA8IVtDREFUQVtTaWducyBqYXIgb3IgemlwIGZpbGVzIHdpdGggdGhlIGphdmFzaWduIGNvbW1hbmQgbGluZSB0b29sLiBUaGUKKyB0b29sIGRldGFpbGVkIGRlcGVuZGVuY3kgY2hlY2tpbmc6IGZpbGVzIGFyZSBvbmx5IHNpZ25lZCBpZiB0aGV5CisgYXJlIG5vdCBzaWduZWQuIFRoZSA8dHQ+c2lnbmphcjwvdHQ+IGF0dHJpYnV0ZSBjYW4gcG9pbnQgdG8gdGhlIGZpbGUgdG8KKyBnZW5lcmF0ZTsgaWYgdGhpcyBmaWxlIGV4aXN0cyB0aGVuCisgaXRzIG1vZGlmaWNhdGlvbiBkYXRlIGlzIHVzZWQgYXMgYSBjdWUgYXMgdG8gd2hldGhlciB0byByZXNpZ24gYW55IEpBUiBmaWxlLgorIDxicj4gIAorIDxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gUmVxdWlyZXMgSmF2YSAxLjIgb3IgbGF0ZXIuIDwvcD5dXT4KKyAgPC9kZXNjcmlwdGlvbj4KKworICA8c3RydWN0dXJlPgorCisgICAgPGF0dHJpYnV0ZXM+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImFsaWFzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGFsaWFzIHRvIHNpZ24gdW5kZXI7IHJlcXVpcmVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICB0aGUgYWxpYXMgdG8gc2lnbiB1bmRlcjsgcmVxdWlyZWQKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpbnRlcm5hbHNmIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0ZsYWcgdG8gaW5jbHVkZSB0aGUgLlNGIGZpbGUgaW5zaWRlIHRoZSBzaWduYXR1cmU7Cisgb3B0aW9uYWw7IGRlZmF1bHQgZmFsc2UuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIEZsYWcgdG8gaW5jbHVkZSB0aGUgLlNGIGZpbGUgaW5zaWRlIHRoZSBzaWduYXR1cmU7Cisgb3B0aW9uYWw7IGRlZmF1bHQgZmFsc2UKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJqYXIiIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgamFyIGZpbGUgdG8gc2lnbjsgcmVxdWlyZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIHRoZSBqYXIgZmlsZSB0byBzaWduOyByZXF1aXJlZAorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImtleXBhc3MiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtQYXNzd29yZCBmb3IgcHJpdmF0ZSBrZXkgKGlmIGRpZmZlcmVudCk7IG9wdGlvbmFsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBwYXNzd29yZCBmb3IgcHJpdmF0ZSBrZXkgKGlmIGRpZmZlcmVudCk7IG9wdGlvbmFsCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ia2V5c3RvcmUiIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtLZXlzdG9yZSBsb2NhdGlvbjsgcmVxdWlyZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIGtleXN0b3JlIGxvY2F0aW9uOyByZXF1aXJlZAorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImxhenkiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRmxhZyB0byBjb250cm9sIHdoZXRoZXIgdGhlIHByZXNlbmNlIG9mIGEgc2lnbmF0dXJlCisgZmlsZSBtZWFucyBhIEpBUiBpcyBzaWduZWQ7Cisgb3B0aW9uYWwsIGRlZmF1bHQgZmFsc2UuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIGZsYWcgdG8gY29udHJvbCB3aGV0aGVyIHRoZSBwcmVzZW5jZSBvZiBhIHNpZ25hdHVyZQorIGZpbGUgbWVhbnMgYSBKQVIgaXMgc2lnbmVkOworIG9wdGlvbmFsLCBkZWZhdWx0IGZhbHNlCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic2VjdGlvbnNvbmx5IiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0ZsYWcgdG8gY29tcHV0ZSBoYXNoIG9mIGVudGlyZSBtYW5pZmVzdDsKKyBvcHRpb25hbCwgZGVmYXVsdCBmYWxzZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgZmxhZyB0byBjb21wdXRlIGhhc2ggb2YgZW50aXJlIG1hbmlmZXN0OworIG9wdGlvbmFsLCBkZWZhdWx0IGZhbHNlCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic2lnZmlsZSIgdHlwZT0iamF2YS5pby5GaWxlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW05hbWUgb2YgLlNGLy5EU0EgZmlsZTsgb3B0aW9uYWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIG5hbWUgb2YgLlNGLy5EU0EgZmlsZTsgb3B0aW9uYWwKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzaWduZWRqYXIiIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtOYW1lIG9mIHNpZ25lZCBKQVIgZmlsZTsgb3B0aW9uYWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIG5hbWUgb2Ygc2lnbmVkIEpBUiBmaWxlOyBvcHRpb25hbAorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InN0b3JlcGFzcyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1Bhc3N3b3JkIGZvciBrZXlzdG9yZSBpbnRlZ3JpdHk7IHJlcXVpcmVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBwYXNzd29yZCBmb3Iga2V5c3RvcmUgaW50ZWdyaXR5OyByZXF1aXJlZAorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InN0b3JldHlwZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0tleXN0b3JlIHR5cGU7IG9wdGlvbmFsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBrZXlzdG9yZSB0eXBlOyBvcHRpb25hbAorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InZlcmJvc2UiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRW5hYmxlIHZlcmJvc2Ugb3V0cHV0IHdoZW4gc2lnbmluZworIDsgb3B0aW9uYWw6IGRlZmF1bHQgZmFsc2UuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIEVuYWJsZSB2ZXJib3NlIG91dHB1dCB3aGVuIHNpZ25pbmcKKyA7IG9wdGlvbmFsOiBkZWZhdWx0IGZhbHNlCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICA8L2F0dHJpYnV0ZXM+CisKKyAgICA8ZWxlbWVudHM+CisgICAgICA8ZWxlbWVudCBuYW1lPSJmaWxlc2V0IiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0IgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlc2V0IgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBhIHNldCBvZiBmaWxlcyB0byBzaWduLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtBZGRzIGEgc2V0IG9mIGZpbGVzIHRvIHNpZ25dXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgIDwvZWxlbWVudHM+CisKKyAgPC9zdHJ1Y3R1cmU+CisKKzwvdGFzaz4KKworCis8dGFzayBuYW1lPSJzbGVlcCIgY2F0ZWdvcnk9InV0aWxpdHkiCisgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlNsZWVwIgorICAgICAgPgorCisgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTbGVlcCwgb3IgcGF1c2UsIGZvciBhIHBlcmlvZCBvZiB0aW1lLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgIDxkZXNjcmlwdGlvbj4KKyAgICA8IVtDREFUQVtTbGVlcCwgb3IgcGF1c2UsIGZvciBhIHBlcmlvZCBvZiB0aW1lLgorCisgQSB0YXNrIGZvciBzbGVlcGluZyBhIHNob3J0IHBlcmlvZCBvZiB0aW1lLCB1c2VmdWwgd2hlbiBhCisgYnVpbGQgb3IgZGVwbG95bWVudCBwcm9jZXNzIHJlcXVpcmVzIGFuIGludGVydmFsIGJldHdlZW4gdGFza3MuCis8cD4KKyBBIG5lZ2F0aXZlIHZhbHVlIGNhbiBiZSBzdXBwbGllZCB0byBhbnkgb2YgYXR0cmlidXRlcyBwcm92aWRlZCB0aGUgdG90YWwgc2xlZXAgdGltZSAKKyBpcyBwb3NpdGl2ZSwgcGVuZGluZyBmdW5kYW1lbnRhbCBjaGFuZ2VzIGluIHBoeXNpY3MgYW5kIEpWTQorIGV4ZWN1dGlvbiB0aW1zPC9wPgorIE5vdGUgdGhhdCBzbGVlcCB0aW1lcyBhcmUgYWx3YXlzIGhpbnRzIHRvIGJlIGludGVycHJlZCBieSB0aGUgT1MgaG93IGl0IGZlZWxzIAorIHNtYWxsIHRpbWVzIG1heSBlaXRoZXIgYmUgaWdub3JlZCBvciByb3VuZGVkIHVwIHRvIGEgbWluaW11bSB0aW1lc2xpY2UuIE5vdGUgCisgYWxzbyB0aGF0IHRoZSBzeXN0ZW0gY2xvY2tzIG9mdGVuIGhhdmUgYSBmYWlybHkgbG93IGdyYW51bGFyaXR5IHRvbywgd2hpY2ggY29tcGxpY2F0ZXMgCisgbWVhc3VyaW5nIGhvdyBsb25nIGEgc2xlZXAgYWN0dWFsbHkgdG9vay48L3A+XV0+CisgIDwvZGVzY3JpcHRpb24+CisKKyAgPHN0cnVjdHVyZT4KKworICAgIDxhdHRyaWJ1dGVzPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmYWlsb25lcnJvciIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtGbGFnIGNvbnRyb2xsaW5nIHdoZXRoZXIgdG8gYnJlYWsgdGhlIGJ1aWxkIG9uIGFuIGVycm9yLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBmbGFnIGNvbnRyb2xsaW5nIHdoZXRoZXIgdG8gYnJlYWsgdGhlIGJ1aWxkIG9uIGFuIGVycm9yLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImhvdXJzIiB0eXBlPSJpbnQiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iaW50IiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtIb3VycyB0byBhZGQgdG8gdGhlIHNsZWVwIHRpbWUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIGhvdXJzIHRvIGFkZCB0byB0aGUgc2xlZXAgdGltZS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJtaWxsaXNlY29uZHMiIHR5cGU9ImludCIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJpbnQiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW01pbGxpc2Vjb25kcyB0byBhZGQgdG8gdGhlIHNsZWVwIHRpbWUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIG1pbGxpc2Vjb25kcyB0byBhZGQgdG8gdGhlIHNsZWVwIHRpbWUKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJtaW51dGVzIiB0eXBlPSJpbnQiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iaW50IiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtNaW51dGVzIHRvIGFkZCB0byB0aGUgc2xlZXAgdGltZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgbWludXRlcyB0byBhZGQgdG8gdGhlIHNsZWVwIHRpbWUKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzZWNvbmRzIiB0eXBlPSJpbnQiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iaW50IiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTZWNvbmRzIHRvIGFkZCB0byB0aGUgc2xlZXAgdGltZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgc2Vjb25kcyB0byBhZGQgdG8gdGhlIHNsZWVwIHRpbWUKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgIDwvYXR0cmlidXRlcz4KKworICAgIDxlbGVtZW50cz4KKyAgICA8L2VsZW1lbnRzPgorCisgIDwvc3RydWN0dXJlPgorCis8L3Rhc2s+CisKKworPHRhc2sgbmFtZT0ic29zY2hlY2tpbiIgY2F0ZWdvcnk9Im90aGVyIgorICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5zb3MuU09TQ2hlY2tpbiIKKyAgICAgID4KKworICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ29tbWl0cyBhbmQgdW5sb2NrcyBmaWxlcyBpbiBWaXN1YWwgU291cmNlU2FmZSB2aWEgYSBTb3VyY2VPZmZTaXRlIHNlcnZlci5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICA8ZGVzY3JpcHRpb24+CisgICAgPCFbQ0RBVEFbQ29tbWl0cyBhbmQgdW5sb2NrcyBmaWxlcyBpbiBWaXN1YWwgU291cmNlU2FmZSB2aWEgYSBTb3VyY2VPZmZTaXRlIHNlcnZlci4KKworIDxwPgorIFRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgaW50ZXJwcmV0dGVkOgorIDx0YWJsZSBib3JkZXI9IjEiPgorICAgPHRyPgorICAgICA8dGg+QXR0cmlidXRlPC90aD4KKyAgICAgPHRoPlZhbHVlczwvdGg+CisgICAgIDx0aD5SZXF1aXJlZDwvdGg+CisgICA8L3RyPgorICAgPHRyPgorICAgICA8dGQ+c29zY21kZGlyPC90ZD4KKyAgICAgPHRkPkRpcmVjdG9yeSB3aGljaCBjb250YWlucyBzb3NjbWQoLmV4ZSkgPGJyPgorICAgICBzb3NjbWQoLmV4ZSkgbXVzdCBiZSBpbiB0aGUgcGF0aCBpZiB0aGlzIGlzIG5vdCBzcGVjaWZpZWQ8L3RkPgorICAgICA8dGQ+Tm88L3RkPgorICAgPC90cj4KKyAgIDx0cj4KKyAgICAgIDx0ZD52c3NzZXJ2ZXJwYXRoPC90ZD4KKyAgICAgIDx0ZD5wYXRoIHRvIHRoZSBzcmNzYWZlLmluaSAgLSBlZy4gXFxzZXJ2ZXJcdnNzXHNyY3NhZmUuaW5pPC90ZD4KKyAgICAgIDx0ZD5ZZXM8L3RkPgorICAgPC90cj4KKyAgIDx0cj4KKyAgICAgIDx0ZD5zb3NzZXJ2ZXJwYXRoPC90ZD4KKyAgICAgIDx0ZD5hZGRyZXNzIGFuZCBwb3J0IG9mIHRoZSBTT1Mgc2VydmVyICAtIGVnLiAxOTIuMTY4LjAuMTo4ODg4PC90ZD4KKyAgICAgIDx0ZD5ZZXM8L3RkPgorICAgPC90cj4KKyAgIDx0cj4KKyAgICAgIDx0ZD5wcm9qZWN0cGF0aDwvdGQ+CisgICAgICA8dGQ+U291cmNlU2FmZSBwcm9qZWN0IHBhdGggd2l0aG91dCB0aGUgIiQiPC90ZD4KKyAgICAgIDx0ZD5ZZXM8L3RkPgorICAgPC90cj4KKyAgIDx0cj4KKyAgICAgIDx0ZD5maWxlPC90ZD4KKyAgICAgIDx0ZD5GaWxlbmFtZSB0byBhY3QgdXBvbjxicj4gSWYgbm8gZmlsZSBpcyBzcGVjaWZpZWQgdGhlbiBhY3QgdXBvbiB0aGUgcHJvamVjdDwvdGQ+CisgICAgICA8dGQ+Tm88L3RkPgorICAgPC90cj4KKyAgIDx0cj4KKyAgICAgIDx0ZD51c2VybmFtZTwvdGQ+CisgICAgICA8dGQ+U291cmNlU2FmZSB1c2VybmFtZTwvdGQ+CisgICAgICA8dGQ+WWVzPC90ZD4KKyAgIDwvdHI+CisgICA8dHI+CisgICAgICA8dGQ+cGFzc3dvcmQ8L3RkPgorICAgICAgPHRkPlNvdXJjZVNhZmUgcGFzc3dvcmQ8L3RkPgorICAgICAgPHRkPk5vPC90ZD4KKyAgIDwvdHI+CisgICA8dHI+CisgICAgICA8dGQ+bG9jYWxwYXRoPC90ZD4KKyAgICAgIDx0ZD5PdmVycmlkZSB0aGUgd29ya2luZyBkaXJlY3RvcnkgYW5kIGdldCB0byB0aGUgc3BlY2lmaWVkIHBhdGg8L3RkPgorICAgICAgPHRkPk5vPC90ZD4KKyAgIDwvdHI+CisgICA8dHI+CisgICAgICA8dGQ+c29zaG9tZTwvdGQ+CisgICAgICA8dGQ+VGhlIHBhdGggdG8gdGhlIFNvdXJjZU9mZlNpdGUgaG9tZSBkaXJlY3Rvcnk8L3RkPgorICAgICAgPHRkPk5vPC90ZD4KKyAgIDwvdHI+CisgICA8dHI+CisgICAgICA8dGQ+bm9jb21wcmVzc2lvbjwvdGQ+CisgICAgICA8dGQ+dHJ1ZSBvciBmYWxzZSAtIGRpc2FibGUgY29tcHJlc3Npb248L3RkPgorICAgICAgPHRkPk5vPC90ZD4KKyAgIDwvdHI+CisgICA8dHI+CisgICAgICA8dGQ+cmVjdXJzaXZlPC90ZD4KKyAgICAgIDx0ZD50cnVlIG9yIGZhbHNlIC0gT25seSB3b3JrcyB3aXRoIHRoZSBDaGVja091dFByb2plY3QgY29tbWFuZDwvdGQ+CisgICAgICA8dGQ+Tm88L3RkPgorICAgPC90cj4KKyAgIDx0cj4KKyAgICAgIDx0ZD5ub2NhY2hlPC90ZD4KKyAgICAgIDx0ZD50cnVlIG9yIGZhbHNlIC0gT25seSBuZWVkZWQgaWYgU09TSE9NRSBpcyBzZXQgYXMgYW4gZW52aXJvbWVudCB2YXJpYWJsZTwvdGQ+CisgICAgICA8dGQ+Tm88L3RkPgorICAgPC90cj4KKyAgIDx0cj4KKyAgICAgIDx0ZD52ZXJib3NlPC90ZD4KKyAgICAgIDx0ZD50cnVlIG9yIGZhbHNlIC0gU3RhdHVzIG1lc3NhZ2VzIGFyZSBkaXNwbGF5ZWQ8L3RkPgorICAgICAgPHRkPk5vPC90ZD4KKyAgIDwvdHI+CisgICA8dGQ+Y29tbWVudDwvdGQ+CisgICAgICA8dGQ+QSBjb21tZW50IHRvIGJlIGFwcGxpZWQgdG8gYWxsIGZpbGVzIGJlaW5nIGNoZWNrZWQgaW48L3RkPgorICAgICAgPHRkPk5vPC90ZD4KKyAgIDwvdHI+CisgPC90YWJsZT5dXT4KKyAgPC9kZXNjcmlwdGlvbj4KKworICA8c3RydWN0dXJlPgorCisgICAgPGF0dHJpYnV0ZXM+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNvbW1lbnQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDb21tZW50IHRvIGFwcGx5IHRvIGFsbCBmaWxlcyBiZWluZyBsYWJlbGxlZDsKKyBvcHRpb25hbCwgb25seSB2YWxpZCBpbiBTT1NMYWJlbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBjb21tZW50IHRvIGFwcGx5IHRvIGFsbCBmaWxlcyBiZWluZyBsYWJlbGxlZDsKKyBvcHRpb25hbCwgb25seSB2YWxpZCBpbiBTT1NMYWJlbAorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImZpbGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtGaWxlbmFtZSB0byBhY3QgdXBvbjsgb3B0aW9uYWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCB0aGUgRmlsZW5hbWUgdG8gYWN0IHVwb247IG9wdGlvbmFsLgorIElmIG5vIGZpbGUgaXMgc3BlY2lmaWVkIHRoZW4gdGhlIHRhc2tzIAorIGFjdCB1cG9uIHRoZSBwcm9qZWN0CisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibGFiZWwiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtMYWJlbGVkIHZlcnNpb24gdG8gb3BlcmF0ZSBvbiBpbiBTb3VyY2VTYWZlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIGxhYmVsZWQgdmVyc2lvbiB0byBvcGVyYXRlIG9uIGluIFNvdXJjZVNhZmUKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsb2NhbHBhdGgiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUGF0aCIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbT3ZlcnJpZGUgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IGFuZCBnZXQgdG8gdGhlIHNwZWNpZmllZCBwYXRoOyBvcHRpb25hbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgT3ZlcnJpZGUgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IGFuZCBnZXQgdG8gdGhlIHNwZWNpZmllZCBwYXRoOyBvcHRpb25hbC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJub2NhY2hlIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0ZsYWcgdG8gZGlzYWJsZSB0aGUgY2FjaGUgd2hlbiBzZXQ7Cisgb3B0aW9uYWwgbmVlZGVkIGlmIFNPU0hPTUUgaXMgc2V0IGFzIGFuIGVudmlyb25tZW50IHZhcmlhYmxlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBmbGFnIHRvIGRpc2FibGUgdGhlIGNhY2hlIHdoZW4gc2V0OworIG9wdGlvbmFsIG5lZWRlZCBpZiBTT1NIT01FIGlzIHNldCBhcyBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJub2NvbXByZXNzIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0ZsYWcgdGhhdCBkaXNhYmxlcyBjb21wcmVzc2lvbiB3aGVuIHNldDsgb3B0aW9uYWwsIGRlZmF1bHQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIEZsYWcgdGhhdCBkaXNhYmxlcyBjb21wcmVzc2lvbiB3aGVuIHNldDsgb3B0aW9uYWwsIGRlZmF1bHQKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwYXNzd29yZCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NvdXJjZVNhZmUgcGFzc3dvcmQ7IG9wdGlvbmFsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIFNvdXJjZVNhZmUgcGFzc3dvcmQ7IG9wdGlvbmFsLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InByb2plY3RwYXRoIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU291cmNlU2FmZSBwcm9qZWN0IHBhdGggd2l0aG91dCB0aGUgIiQiIHByZWZpeDsgcmVxdWlyZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCB0aGUgU291cmNlU2FmZSBwcm9qZWN0IHBhdGggd2l0aG91dCB0aGUgIiQiIHByZWZpeDsgcmVxdWlyZWQKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJyZWN1cnNpdmUiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRmxhZyB0byByZWN1cnNpdmVseSBhcHBseSB0aGUgYWN0aW9uIChub3QgdmFsaWQKKyBvbiBhbGwgU09TIHRhc2tzICk7IG9wdGlvbmFsLCBkZWZhdWx0IGZhbHNlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBGbGFnIHRvIHJlY3Vyc2l2ZWx5IGFwcGx5IHRoZSBhY3Rpb24gKG5vdCB2YWxpZAorIG9uIGFsbCBTT1MgdGFza3MgKTsgb3B0aW9uYWwsIGRlZmF1bHQgZmFsc2UKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzb3NjbWQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtEaXJlY3Rvcnkgd2hlcmUgc29zY21kKC5leGUpIGlzIGxvY2F0ZWQ7Cisgb3B0aW9uYWwsIHNvc2NtZCBtdXN0IGJlIG9uIHRoZSBwYXRoIGlmIG9taXR0ZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCB0aGUgZGlyZWN0b3J5IHdoZXJlIHNvc2NtZCguZXhlKSBpcyBsb2NhdGVkOworIG9wdGlvbmFsLCBzb3NjbWQgbXVzdCBiZSBvbiB0aGUgcGF0aCBpZiBvbWl0dGVkLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InNvc2hvbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgcGF0aCB0byB0aGUgU291cmNlT2ZmU2l0ZSBob21lIGRpcmVjdG9yeS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgVGhlIHBhdGggdG8gdGhlIFNvdXJjZU9mZlNpdGUgaG9tZSBkaXJlY3RvcnkKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzb3NzZXJ2ZXJwYXRoIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcmVzcyBhbmQgcG9ydCBvZiBTb3VyY2VPZmZTaXRlIFNlcnZlciwKKyBlZy4gMTkyLjE2OC4wLjE6ODg4OCA7IHJlcXVpcmVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIGFkZHJlc3MgYW5kIHBvcnQgb2YgU291cmNlT2ZmU2l0ZSBTZXJ2ZXIsCisgZWcuIDE5Mi4xNjguMC4xOjg4ODggOyByZXF1aXJlZC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1c2VybmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NvdXJjZVNhZmUgdXNlcm5hbWU7IHJlcXVpcmVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIFNvdXJjZVNhZmUgdXNlcm5hbWU7IHJlcXVpcmVkLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InZlcmJvc2UiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRW5hYmxlIHZlcmJvc2Ugb3V0cHV0OyBvcHRpb25hbCwgZGVmYXVsdCBmYWxzZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgRW5hYmxlIHZlcmJvc2Ugb3V0cHV0OyBvcHRpb25hbCwgZGVmYXVsdCBmYWxzZQorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InZlcnNpb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBIHZlcnNpb24gbnVtYmVyIHRvIGdldCAtIAorIG9ubHkgd29ya3Mgd2l0aCB0aGUgU09TR2V0IG9uIGEgZmlsZTsgb3B0aW9uYWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCB0aGUgYSB2ZXJzaW9uIG51bWJlciB0byBnZXQgLSAKKyBvbmx5IHdvcmtzIHdpdGggdGhlIFNPU0dldCBvbiBhIGZpbGU7IG9wdGlvbmFsLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InZzc3NlcnZlcnBhdGgiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtQYXRoIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgc3MuaW5pIGZpbGU7IAorIHJlcXVpcmVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIHBhdGggdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBzcy5pbmkgZmlsZTsgCisgcmVxdWlyZWQuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICA8L2F0dHJpYnV0ZXM+CisKKyAgICA8ZWxlbWVudHM+CisgICAgPC9lbGVtZW50cz4KKworICA8L3N0cnVjdHVyZT4KKworPC90YXNrPgorCisKKzx0YXNrIG5hbWU9InNvc2NoZWNrb3V0IiBjYXRlZ29yeT0ib3RoZXIiCisgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnNvcy5TT1NDaGVja291dCIKKyAgICAgID4KKworICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbUmV0cmlldmVzIGFuZCBsb2NrcyBmaWxlcyBpbiBWaXN1YWwgU291cmNlU2FmZSB2aWEgYSBTb3VyY2VPZmZTaXRlIHNlcnZlci5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICA8ZGVzY3JpcHRpb24+CisgICAgPCFbQ0RBVEFbUmV0cmlldmVzIGFuZCBsb2NrcyBmaWxlcyBpbiBWaXN1YWwgU291cmNlU2FmZSB2aWEgYSBTb3VyY2VPZmZTaXRlIHNlcnZlci4KKworIDxwPgorIFRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgaW50ZXJwcmV0dGVkOgorIDx0YWJsZSBib3JkZXI9IjEiPgorICAgPHRyPgorICAgICA8dGg+QXR0cmlidXRlPC90aD4KKyAgICAgPHRoPlZhbHVlczwvdGg+CisgICAgIDx0aD5SZXF1aXJlZDwvdGg+CisgICA8L3RyPgorICAgPHRyPgorICAgICA8dGQ+c29zY21kZGlyPC90ZD4KKyAgICAgPHRkPkRpcmVjdG9yeSB3aGljaCBjb250YWlucyBzb3NjbWQoLmV4ZSkgPGJyPgorICAgICBzb3NjbWQoLmV4ZSkgbXVzdCBiZSBpbiB0aGUgcGF0aCBpZiB0aGlzIGlzIG5vdCBzcGVjaWZpZWQ8L3RkPgorICAgICA8dGQ+Tm88L3RkPgorICAgPC90cj4KKyAgIDx0cj4KKyAgICAgIDx0ZD52c3NzZXJ2ZXJwYXRoPC90ZD4KKyAgICAgIDx0ZD5wYXRoIHRvIHRoZSBzcmNzYWZlLmluaSAgLSBlZy4gXFxzZXJ2ZXJcdnNzXHNyY3NhZmUuaW5pPC90ZD4KKyAgICAgIDx0ZD5ZZXM8L3RkPgorICAgPC90cj4KKyAgIDx0cj4KKyAgICAgIDx0ZD5zb3NzZXJ2ZXJwYXRoPC90ZD4KKyAgICAgIDx0ZD5hZGRyZXNzIGFuZCBwb3J0IG9mIHRoZSBTT1Mgc2VydmVyICAtIGVnLiAxOTIuMTY4LjAuMTo4ODg4PC90ZD4KKyAgICAgIDx0ZD5ZZXM8L3RkPgorICAgPC90cj4KKyAgIDx0cj4KKyAgICAgIDx0ZD5wcm9qZWN0cGF0aDwvdGQ+CisgICAgICA8dGQ+U291cmNlU2FmZSBwcm9qZWN0IHBhdGggd2l0aG91dCB0aGUgIiQiPC90ZD4KKyAgICAgIDx0ZD5ZZXM8L3RkPgorICAgPC90cj4KKyAgIDx0cj4KKyAgICAgIDx0ZD5maWxlPC90ZD4KKyAgICAgIDx0ZD5GaWxlbmFtZSB0byBhY3QgdXBvbjxicj4gSWYgbm8gZmlsZSBpcyBzcGVjaWZpZWQgdGhlbiBhY3QgdXBvbiB0aGUgcHJvamVjdDwvdGQ+CisgICAgICA8dGQ+Tm88L3RkPgorICAgPC90cj4KKyAgIDx0cj4KKyAgICAgIDx0ZD51c2VybmFtZTwvdGQ+CisgICAgICA8dGQ+U291cmNlU2FmZSB1c2VybmFtZTwvdGQ+CisgICAgICA8dGQ+WWVzPC90ZD4KKyAgIDwvdHI+CisgICA8dHI+CisgICAgICA8dGQ+cGFzc3dvcmQ8L3RkPgorICAgICAgPHRkPlNvdXJjZVNhZmUgcGFzc3dvcmQ8L3RkPgorICAgICAgPHRkPk5vPC90ZD4KKyAgIDwvdHI+CisgICA8dHI+CisgICAgICA8dGQ+bG9jYWxwYXRoPC90ZD4KKyAgICAgIDx0ZD5PdmVycmlkZSB0aGUgd29ya2luZyBkaXJlY3RvcnkgYW5kIGdldCB0byB0aGUgc3BlY2lmaWVkIHBhdGg8L3RkPgorICAgICAgPHRkPk5vPC90ZD4KKyAgIDwvdHI+CisgICA8dHI+CisgICAgICA8dGQ+c29zaG9tZTwvdGQ+CisgICAgICA8dGQ+VGhlIHBhdGggdG8gdGhlIFNvdXJjZU9mZlNpdGUgaG9tZSBkaXJlY3Rvcnk8L3RkPgorICAgICAgPHRkPk5vPC90ZD4KKyAgIDwvdHI+CisgICA8dHI+CisgICAgICA8dGQ+bm9jb21wcmVzc2lvbjwvdGQ+CisgICAgICA8dGQ+dHJ1ZSBvciBmYWxzZSAtIGRpc2FibGUgY29tcHJlc3Npb248L3RkPgorICAgICAgPHRkPk5vPC90ZD4KKyAgIDwvdHI+CisgICA8dHI+CisgICAgICA8dGQ+cmVjdXJzaXZlPC90ZD4KKyAgICAgIDx0ZD50cnVlIG9yIGZhbHNlIC0gT25seSB3b3JrcyB3aXRoIHRoZSBDaGVja091dFByb2plY3QgY29tbWFuZDwvdGQ+CisgICAgICA8dGQ+Tm88L3RkPgorICAgPC90cj4KKyAgIDx0cj4KKyAgICAgIDx0ZD5ub2NhY2hlPC90ZD4KKyAgICAgIDx0ZD50cnVlIG9yIGZhbHNlIC0gT25seSBuZWVkZWQgaWYgU09TSE9NRSBpcyBzZXQgYXMgYW4gZW52aXJvbWVudCB2YXJpYWJsZTwvdGQ+CisgICAgICA8dGQ+Tm88L3RkPgorICAgPC90cj4KKyAgIDx0cj4KKyAgICAgIDx0ZD52ZXJib3NlPC90ZD4KKyAgICAgIDx0ZD50cnVlIG9yIGZhbHNlIC0gU3RhdHVzIG1lc3NhZ2VzIGFyZSBkaXNwbGF5ZWQ8L3RkPgorICAgICAgPHRkPk5vPC90ZD4KKyAgIDwvdHI+CisgPC90YWJsZT5dXT4KKyAgPC9kZXNjcmlwdGlvbj4KKworICA8c3RydWN0dXJlPgorCisgICAgPGF0dHJpYnV0ZXM+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNvbW1lbnQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDb21tZW50IHRvIGFwcGx5IHRvIGFsbCBmaWxlcyBiZWluZyBsYWJlbGxlZDsKKyBvcHRpb25hbCwgb25seSB2YWxpZCBpbiBTT1NMYWJlbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBjb21tZW50IHRvIGFwcGx5IHRvIGFsbCBmaWxlcyBiZWluZyBsYWJlbGxlZDsKKyBvcHRpb25hbCwgb25seSB2YWxpZCBpbiBTT1NMYWJlbAorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImZpbGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtGaWxlbmFtZSB0byBhY3QgdXBvbjsgb3B0aW9uYWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCB0aGUgRmlsZW5hbWUgdG8gYWN0IHVwb247IG9wdGlvbmFsLgorIElmIG5vIGZpbGUgaXMgc3BlY2lmaWVkIHRoZW4gdGhlIHRhc2tzIAorIGFjdCB1cG9uIHRoZSBwcm9qZWN0CisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibGFiZWwiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtMYWJlbGVkIHZlcnNpb24gdG8gb3BlcmF0ZSBvbiBpbiBTb3VyY2VTYWZlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIGxhYmVsZWQgdmVyc2lvbiB0byBvcGVyYXRlIG9uIGluIFNvdXJjZVNhZmUKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsb2NhbHBhdGgiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUGF0aCIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbT3ZlcnJpZGUgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IGFuZCBnZXQgdG8gdGhlIHNwZWNpZmllZCBwYXRoOyBvcHRpb25hbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgT3ZlcnJpZGUgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IGFuZCBnZXQgdG8gdGhlIHNwZWNpZmllZCBwYXRoOyBvcHRpb25hbC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJub2NhY2hlIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0ZsYWcgdG8gZGlzYWJsZSB0aGUgY2FjaGUgd2hlbiBzZXQ7Cisgb3B0aW9uYWwgbmVlZGVkIGlmIFNPU0hPTUUgaXMgc2V0IGFzIGFuIGVudmlyb25tZW50IHZhcmlhYmxlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBmbGFnIHRvIGRpc2FibGUgdGhlIGNhY2hlIHdoZW4gc2V0OworIG9wdGlvbmFsIG5lZWRlZCBpZiBTT1NIT01FIGlzIHNldCBhcyBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJub2NvbXByZXNzIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0ZsYWcgdGhhdCBkaXNhYmxlcyBjb21wcmVzc2lvbiB3aGVuIHNldDsgb3B0aW9uYWwsIGRlZmF1bHQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIEZsYWcgdGhhdCBkaXNhYmxlcyBjb21wcmVzc2lvbiB3aGVuIHNldDsgb3B0aW9uYWwsIGRlZmF1bHQKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwYXNzd29yZCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NvdXJjZVNhZmUgcGFzc3dvcmQ7IG9wdGlvbmFsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIFNvdXJjZVNhZmUgcGFzc3dvcmQ7IG9wdGlvbmFsLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InByb2plY3RwYXRoIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU291cmNlU2FmZSBwcm9qZWN0IHBhdGggd2l0aG91dCB0aGUgIiQiIHByZWZpeDsgcmVxdWlyZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCB0aGUgU291cmNlU2FmZSBwcm9qZWN0IHBhdGggd2l0aG91dCB0aGUgIiQiIHByZWZpeDsgcmVxdWlyZWQKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJyZWN1cnNpdmUiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRmxhZyB0byByZWN1cnNpdmVseSBhcHBseSB0aGUgYWN0aW9uIChub3QgdmFsaWQKKyBvbiBhbGwgU09TIHRhc2tzICk7IG9wdGlvbmFsLCBkZWZhdWx0IGZhbHNlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBGbGFnIHRvIHJlY3Vyc2l2ZWx5IGFwcGx5IHRoZSBhY3Rpb24gKG5vdCB2YWxpZAorIG9uIGFsbCBTT1MgdGFza3MgKTsgb3B0aW9uYWwsIGRlZmF1bHQgZmFsc2UKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzb3NjbWQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtEaXJlY3Rvcnkgd2hlcmUgc29zY21kKC5leGUpIGlzIGxvY2F0ZWQ7Cisgb3B0aW9uYWwsIHNvc2NtZCBtdXN0IGJlIG9uIHRoZSBwYXRoIGlmIG9taXR0ZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCB0aGUgZGlyZWN0b3J5IHdoZXJlIHNvc2NtZCguZXhlKSBpcyBsb2NhdGVkOworIG9wdGlvbmFsLCBzb3NjbWQgbXVzdCBiZSBvbiB0aGUgcGF0aCBpZiBvbWl0dGVkLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InNvc2hvbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgcGF0aCB0byB0aGUgU291cmNlT2ZmU2l0ZSBob21lIGRpcmVjdG9yeS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgVGhlIHBhdGggdG8gdGhlIFNvdXJjZU9mZlNpdGUgaG9tZSBkaXJlY3RvcnkKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzb3NzZXJ2ZXJwYXRoIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcmVzcyBhbmQgcG9ydCBvZiBTb3VyY2VPZmZTaXRlIFNlcnZlciwKKyBlZy4gMTkyLjE2OC4wLjE6ODg4OCA7IHJlcXVpcmVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIGFkZHJlc3MgYW5kIHBvcnQgb2YgU291cmNlT2ZmU2l0ZSBTZXJ2ZXIsCisgZWcuIDE5Mi4xNjguMC4xOjg4ODggOyByZXF1aXJlZC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1c2VybmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NvdXJjZVNhZmUgdXNlcm5hbWU7IHJlcXVpcmVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIFNvdXJjZVNhZmUgdXNlcm5hbWU7IHJlcXVpcmVkLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InZlcmJvc2UiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRW5hYmxlIHZlcmJvc2Ugb3V0cHV0OyBvcHRpb25hbCwgZGVmYXVsdCBmYWxzZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgRW5hYmxlIHZlcmJvc2Ugb3V0cHV0OyBvcHRpb25hbCwgZGVmYXVsdCBmYWxzZQorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InZlcnNpb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBIHZlcnNpb24gbnVtYmVyIHRvIGdldCAtIAorIG9ubHkgd29ya3Mgd2l0aCB0aGUgU09TR2V0IG9uIGEgZmlsZTsgb3B0aW9uYWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCB0aGUgYSB2ZXJzaW9uIG51bWJlciB0byBnZXQgLSAKKyBvbmx5IHdvcmtzIHdpdGggdGhlIFNPU0dldCBvbiBhIGZpbGU7IG9wdGlvbmFsLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InZzc3NlcnZlcnBhdGgiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtQYXRoIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgc3MuaW5pIGZpbGU7IAorIHJlcXVpcmVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIHBhdGggdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBzcy5pbmkgZmlsZTsgCisgcmVxdWlyZWQuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICA8L2F0dHJpYnV0ZXM+CisKKyAgICA8ZWxlbWVudHM+CisgICAgPC9lbGVtZW50cz4KKworICA8L3N0cnVjdHVyZT4KKworPC90YXNrPgorCisKKzx0YXNrIG5hbWU9InNvc2dldCIgY2F0ZWdvcnk9Im90aGVyIgorICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5zb3MuU09TR2V0IgorICAgICAgPgorCisgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtSZXRyaWV2ZXMgYSByZWFkLW9ubHkgY29weSBvZiB0aGUgc3BlY2lmaWVkIHByb2plY3Qgb3IgZmlsZSBmcm9tIFZpc3VhbCBTb3VyY2VTYWZlIHZpYSBhIFNvdXJjZU9mZlNpdGUgc2VydmVyLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgIDxkZXNjcmlwdGlvbj4KKyAgICA8IVtDREFUQVtSZXRyaWV2ZXMgYSByZWFkLW9ubHkgY29weSBvZiB0aGUgc3BlY2lmaWVkIHByb2plY3Qgb3IgZmlsZQorIGZyb20gVmlzdWFsIFNvdXJjZVNhZmUgdmlhIGEgU291cmNlT2ZmU2l0ZSBzZXJ2ZXIuCisgPHA+CisgVGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIGFyZSBpbnRlcnByZXR0ZWQ6CisgPHRhYmxlIGJvcmRlcj0iMSI+CisgICAgPHRib2R5PgorICAgICAgPHRyPgorICAgICAgICAgPHRoPkF0dHJpYnV0ZTwvdGg+CisgICAgICAgICA8dGg+VmFsdWVzPC90aD4KKyAgICAgICAgIDx0aD5SZXF1aXJlZDwvdGg+CisgICAgICAgPC90cj4KKyAgICAgICA8dHI+CisgICAgICAgICA8dGQ+c29zY21kZGlyPC90ZD4KKyAgICAgICAgIDx0ZD5EaXJlY3Rvcnkgd2hpY2ggY29udGFpbnMgc29zY21kKC5leGUpIDxicj4KKyAgICAgICAgIHNvc2NtZCguZXhlKSBtdXN0IGJlIGluIHRoZSBwYXRoIGlmIHRoaXMgaXMgbm90IHNwZWNpZmllZDwvdGQ+CisgICAgICAgICA8dGQ+Tm88L3RkPgorICAgICAgIDwvdHI+CisgICAgICAgPHRyPgorICAgICAgICAgIDx0ZD52c3NzZXJ2ZXJwYXRoPC90ZD4KKyAgICAgICAgICA8dGQ+cGF0aCB0byB0aGUgc3Jjc2FmZS5pbmkgIC0gZWcuIFxcc2VydmVyXHZzc1xzcmNzYWZlLmluaTwvdGQ+CisgICAgICAgICAgPHRkPlllczwvdGQ+CisgICAgICAgPC90cj4KKyAgICAgICA8dHI+CisgICAgICAgICAgPHRkPnNvc3NlcnZlcnBhdGg8L3RkPgorICAgICAgICAgIDx0ZD5hZGRyZXNzIGFuZCBwb3J0IG9mIHRoZSBTT1Mgc2VydmVyICAtIGVnLiAxOTIuMTY4LjAuMTo4ODg4PC90ZD4KKyAgICAgICAgICA8dGQ+WWVzPC90ZD4KKyAgICAgICA8L3RyPgorICAgICAgIDx0cj4KKyAgICAgICAgICA8dGQ+cHJvamVjdHBhdGg8L3RkPgorICAgICAgICAgIDx0ZD5Tb3VyY2VTYWZlIHByb2plY3QgcGF0aCB3aXRob3V0IHRoZSAiJCI8L3RkPgorICAgICAgICAgIDx0ZD5ZZXM8L3RkPgorICAgICAgIDwvdHI+CisgICAgICAgPHRyPgorICAgICAgICAgIDx0ZD5maWxlPC90ZD4KKyAgICAgICAgICA8dGQ+RmlsZW5hbWUgdG8gYWN0IHVwb248YnI+CisgICAgICAgICAgICAgIElmIG5vIGZpbGUgaXMgc3BlY2lmaWVkIHRoZW4gYWN0IHVwb24gdGhlIHByb2plY3Q8L3RkPgorICAgICAgICAgIDx0ZD5ObzwvdGQ+CisgICAgICAgPC90cj4KKyAgICAgICA8dHI+CisgICAgICAgICAgPHRkPnVzZXJuYW1lPC90ZD4KKyAgICAgICAgICA8dGQ+U291cmNlU2FmZSB1c2VybmFtZTwvdGQ+CisgICAgICAgICAgPHRkPlllczwvdGQ+CisgICAgICAgPC90cj4KKyAgICAgICA8dHI+CisgICAgICAgICAgPHRkPnBhc3N3b3JkPC90ZD4KKyAgICAgICAgICA8dGQ+U291cmNlU2FmZSBwYXNzd29yZDwvdGQ+CisgICAgICAgICAgPHRkPk5vPC90ZD4KKyAgICAgICA8L3RyPgorICAgICAgIDx0cj4KKyAgICAgICAgICA8dGQ+bG9jYWxwYXRoPC90ZD4KKyAgICAgICAgICA8dGQ+T3ZlcnJpZGUgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IGFuZCBnZXQgdG8gdGhlIHNwZWNpZmllZCBwYXRoPC90ZD4KKyAgICAgICAgICA8dGQ+Tm88L3RkPgorICAgICAgIDwvdHI+CisgICAgICAgPHRyPgorICAgICAgICAgIDx0ZD5zb3Nob21lPC90ZD4KKyAgICAgICAgICA8dGQ+VGhlIHBhdGggdG8gdGhlIFNvdXJjZU9mZlNpdGUgaG9tZSBkaXJlY3Rvcnk8L3RkPgorICAgICAgICAgIDx0ZD5ObzwvdGQ+CisgICAgICAgPC90cj4KKyAgICAgICA8dHI+CisgICAgICAgICAgPHRkPm5vY29tcHJlc3Npb248L3RkPgorICAgICAgICAgIDx0ZD50cnVlIG9yIGZhbHNlIC0gZGlzYWJsZSBjb21wcmVzc2lvbjwvdGQ+CisgICAgICAgICAgPHRkPk5vPC90ZD4KKyAgICAgICA8L3RyPgorICAgICAgIDx0cj4KKyAgICAgICAgICA8dGQ+cmVjdXJzaXZlPC90ZD4KKyAgICAgICAgICA8dGQ+dHJ1ZSBvciBmYWxzZSAtIE9ubHkgd29ya3Mgd2l0aCB0aGUgR2V0UHJvamVjdCBjb21tYW5kPC90ZD4KKyAgICAgICAgICA8dGQ+Tm88L3RkPgorICAgICAgIDwvdHI+CisgICAgICAgPHRyPgorICAgICAgICAgIDx0ZD52ZXJzaW9uPC90ZD4KKyAgICAgICAgICA8dGQ+YSB2ZXJzaW9uIG51bWJlciB0byBnZXQgLSBPbmx5IHdvcmtzIHdpdGggdGhlIEdldEZpbGUgY29tbWFuZDwvdGQ+CisgICAgICAgICAgPHRkPk5vPC90ZD4KKyAgICAgICA8L3RyPgorICAgICAgIDx0cj4KKyAgICAgICAgICA8dGQ+bGFiZWw8L3RkPgorICAgICAgICAgIDx0ZD5hIGxhYmVsIHZlcnNpb24gdG8gZ2V0IC0gT25seSB3b3JrcyB3aXRoIHRoZSBHZXRQcm9qZWN0IGNvbW1hbmQ8L3RkPgorICAgICAgICAgIDx0ZD5ObzwvdGQ+CisgICAgICAgPC90cj4KKyAgICAgICA8dHI+CisgICAgICAgICAgPHRkPm5vY2FjaGU8L3RkPgorICAgICAgICAgIDx0ZD50cnVlIG9yIGZhbHNlIC0gT25seSBuZWVkZWQgaWYgU09TSE9NRSBpcyBzZXQgYXMgYW4gZW52aXJvbWVudCB2YXJpYWJsZTwvdGQ+CisgICAgICAgICAgPHRkPk5vPC90ZD4KKyAgICAgICA8L3RyPgorICAgICAgIDx0cj4KKyAgICAgICAgICA8dGQ+dmVyYm9zZTwvdGQ+CisgICAgICAgICA8dGQ+dHJ1ZSBvciBmYWxzZSAtIFN0YXR1cyBtZXNzYWdlcyBhcmUgZGlzcGxheWVkPC90ZD4KKyAgICAgICAgPHRkPk5vPC90ZD4KKyAgICAgIDwvdHI+XV0+CisgIDwvZGVzY3JpcHRpb24+CisKKyAgPHN0cnVjdHVyZT4KKworICAgIDxhdHRyaWJ1dGVzPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb21tZW50IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ29tbWVudCB0byBhcHBseSB0byBhbGwgZmlsZXMgYmVpbmcgbGFiZWxsZWQ7Cisgb3B0aW9uYWwsIG9ubHkgdmFsaWQgaW4gU09TTGFiZWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCB0aGUgY29tbWVudCB0byBhcHBseSB0byBhbGwgZmlsZXMgYmVpbmcgbGFiZWxsZWQ7Cisgb3B0aW9uYWwsIG9ubHkgdmFsaWQgaW4gU09TTGFiZWwKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmaWxlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRmlsZW5hbWUgdG8gYWN0IHVwb247IG9wdGlvbmFsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIEZpbGVuYW1lIHRvIGFjdCB1cG9uOyBvcHRpb25hbC4KKyBJZiBubyBmaWxlIGlzIHNwZWNpZmllZCB0aGVuIHRoZSB0YXNrcyAKKyBhY3QgdXBvbiB0aGUgcHJvamVjdAorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImxhYmVsIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTGFiZWxlZCB2ZXJzaW9uIHRvIG9wZXJhdGUgb24gaW4gU291cmNlU2FmZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBsYWJlbGVkIHZlcnNpb24gdG8gb3BlcmF0ZSBvbiBpbiBTb3VyY2VTYWZlCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibG9jYWxwYXRoIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlBhdGgiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW092ZXJyaWRlIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBhbmQgZ2V0IHRvIHRoZSBzcGVjaWZpZWQgcGF0aDsgb3B0aW9uYWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIE92ZXJyaWRlIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBhbmQgZ2V0IHRvIHRoZSBzcGVjaWZpZWQgcGF0aDsgb3B0aW9uYWwuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibm9jYWNoZSIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtGbGFnIHRvIGRpc2FibGUgdGhlIGNhY2hlIHdoZW4gc2V0OworIG9wdGlvbmFsIG5lZWRlZCBpZiBTT1NIT01FIGlzIHNldCBhcyBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgZmxhZyB0byBkaXNhYmxlIHRoZSBjYWNoZSB3aGVuIHNldDsKKyBvcHRpb25hbCBuZWVkZWQgaWYgU09TSE9NRSBpcyBzZXQgYXMgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibm9jb21wcmVzcyIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtGbGFnIHRoYXQgZGlzYWJsZXMgY29tcHJlc3Npb24gd2hlbiBzZXQ7IG9wdGlvbmFsLCBkZWZhdWx0Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBGbGFnIHRoYXQgZGlzYWJsZXMgY29tcHJlc3Npb24gd2hlbiBzZXQ7IG9wdGlvbmFsLCBkZWZhdWx0CisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icGFzc3dvcmQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTb3VyY2VTYWZlIHBhc3N3b3JkOyBvcHRpb25hbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBTb3VyY2VTYWZlIHBhc3N3b3JkOyBvcHRpb25hbC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwcm9qZWN0cGF0aCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NvdXJjZVNhZmUgcHJvamVjdCBwYXRoIHdpdGhvdXQgdGhlICIkIiBwcmVmaXg7IHJlcXVpcmVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIFNvdXJjZVNhZmUgcHJvamVjdCBwYXRoIHdpdGhvdXQgdGhlICIkIiBwcmVmaXg7IHJlcXVpcmVkCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icmVjdXJzaXZlIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0ZsYWcgdG8gcmVjdXJzaXZlbHkgYXBwbHkgdGhlIGFjdGlvbiAobm90IHZhbGlkCisgb24gYWxsIFNPUyB0YXNrcyApOyBvcHRpb25hbCwgZGVmYXVsdCBmYWxzZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgRmxhZyB0byByZWN1cnNpdmVseSBhcHBseSB0aGUgYWN0aW9uIChub3QgdmFsaWQKKyBvbiBhbGwgU09TIHRhc2tzICk7IG9wdGlvbmFsLCBkZWZhdWx0IGZhbHNlCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic29zY21kIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRGlyZWN0b3J5IHdoZXJlIHNvc2NtZCguZXhlKSBpcyBsb2NhdGVkOworIG9wdGlvbmFsLCBzb3NjbWQgbXVzdCBiZSBvbiB0aGUgcGF0aCBpZiBvbWl0dGVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIGRpcmVjdG9yeSB3aGVyZSBzb3NjbWQoLmV4ZSkgaXMgbG9jYXRlZDsKKyBvcHRpb25hbCwgc29zY21kIG11c3QgYmUgb24gdGhlIHBhdGggaWYgb21pdHRlZC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzb3Nob21lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIHBhdGggdG8gdGhlIFNvdXJjZU9mZlNpdGUgaG9tZSBkaXJlY3RvcnkuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRoZSBwYXRoIHRvIHRoZSBTb3VyY2VPZmZTaXRlIGhvbWUgZGlyZWN0b3J5CisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic29zc2VydmVycGF0aCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHJlc3MgYW5kIHBvcnQgb2YgU291cmNlT2ZmU2l0ZSBTZXJ2ZXIsCisgZWcuIDE5Mi4xNjguMC4xOjg4ODggOyByZXF1aXJlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBhZGRyZXNzIGFuZCBwb3J0IG9mIFNvdXJjZU9mZlNpdGUgU2VydmVyLAorIGVnLiAxOTIuMTY4LjAuMTo4ODg4IDsgcmVxdWlyZWQuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idXNlcm5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTb3VyY2VTYWZlIHVzZXJuYW1lOyByZXF1aXJlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBTb3VyY2VTYWZlIHVzZXJuYW1lOyByZXF1aXJlZC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2ZXJib3NlIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0VuYWJsZSB2ZXJib3NlIG91dHB1dDsgb3B0aW9uYWwsIGRlZmF1bHQgZmFsc2UuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIEVuYWJsZSB2ZXJib3NlIG91dHB1dDsgb3B0aW9uYWwsIGRlZmF1bHQgZmFsc2UKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQSB2ZXJzaW9uIG51bWJlciB0byBnZXQgLSAKKyBvbmx5IHdvcmtzIHdpdGggdGhlIFNPU0dldCBvbiBhIGZpbGU7IG9wdGlvbmFsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIGEgdmVyc2lvbiBudW1iZXIgdG8gZ2V0IC0gCisgb25seSB3b3JrcyB3aXRoIHRoZSBTT1NHZXQgb24gYSBmaWxlOyBvcHRpb25hbC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2c3NzZXJ2ZXJwYXRoIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbUGF0aCB0byB0aGUgbG9jYXRpb24gb2YgdGhlIHNzLmluaSBmaWxlOyAKKyByZXF1aXJlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBwYXRoIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgc3MuaW5pIGZpbGU7IAorIHJlcXVpcmVkLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgPC9hdHRyaWJ1dGVzPgorCisgICAgPGVsZW1lbnRzPgorICAgIDwvZWxlbWVudHM+CisKKyAgPC9zdHJ1Y3R1cmU+CisKKzwvdGFzaz4KKworCis8dGFzayBuYW1lPSJzb3NsYWJlbCIgY2F0ZWdvcnk9Im90aGVyIgorICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5zb3MuU09TTGFiZWwiCisgICAgICA+CisKKyAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0xhYmVscyBWaXN1YWwgU291cmNlU2FmZSBmaWxlcyB2aWEgYSBTb3VyY2VPZmZTaXRlIHNlcnZlci5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICA8ZGVzY3JpcHRpb24+CisgICAgPCFbQ0RBVEFbTGFiZWxzIFZpc3VhbCBTb3VyY2VTYWZlIGZpbGVzIHZpYSBhIFNvdXJjZU9mZlNpdGUgc2VydmVyLgorIDxwPgorIFRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgaW50ZXJwcmV0ZWQ6CisgPHRhYmxlIGJvcmRlcj0iMSI+CisgICA8dHI+CisgICAgIDx0aD5BdHRyaWJ1dGU8L3RoPgorICAgICA8dGg+VmFsdWVzPC90aD4KKyAgICAgPHRoPlJlcXVpcmVkPC90aD4KKyAgIDwvdHI+CisgICA8dHI+CisgICAgIDx0ZD5zb3NjbWRkaXI8L3RkPgorICAgICA8dGQ+RGlyZWN0b3J5IHdoaWNoIGNvbnRhaW5zIHNvc2NtZCguZXhlKSA8YnI+CisgICAgIHNvc2NtZCguZXhlKSBtdXN0IGJlIGluIHRoZSBwYXRoIGlmIHRoaXMgaXMgbm90IHNwZWNpZmllZDwvdGQ+CisgICAgIDx0ZD5ObzwvdGQ+CisgICA8L3RyPgorICAgPHRyPgorICAgICAgPHRkPnZzc3NlcnZlcnBhdGg8L3RkPgorICAgICAgPHRkPnBhdGggdG8gdGhlIHNyY3NhZmUuaW5pICAtIGVnLiBcXHNlcnZlclx2c3Ncc3Jjc2FmZS5pbmk8L3RkPgorICAgICAgPHRkPlllczwvdGQ+CisgICA8L3RyPgorICAgPHRyPgorICAgICAgPHRkPnNvc3NlcnZlcnBhdGg8L3RkPgorICAgICAgPHRkPmFkZHJlc3MgYW5kIHBvcnQgb2YgdGhlIFNPUyBzZXJ2ZXIgIC0gZWcuIDE5Mi4xNjguMC4xOjg4ODg8L3RkPgorICAgICAgPHRkPlllczwvdGQ+CisgICA8L3RyPgorICAgPHRyPgorICAgICAgPHRkPnByb2plY3RwYXRoPC90ZD4KKyAgICAgIDx0ZD5Tb3VyY2VTYWZlIHByb2plY3QgcGF0aCB3aXRob3V0IHRoZSAiJCI8L3RkPgorICAgICAgPHRkPlllczwvdGQ+CisgICA8L3RyPgorICAgPHRyPgorICAgICAgPHRkPnVzZXJuYW1lPC90ZD4KKyAgICAgIDx0ZD5Tb3VyY2VTYWZlIHVzZXJuYW1lPC90ZD4KKyAgICAgIDx0ZD5ZZXM8L3RkPgorICAgPC90cj4KKyAgIDx0cj4KKyAgICAgIDx0ZD5wYXNzd29yZDwvdGQ+CisgICAgICA8dGQ+U291cmNlU2FmZSBwYXNzd29yZDwvdGQ+CisgICAgICA8dGQ+Tm88L3RkPgorICAgPC90cj4KKyAgIDx0cj4KKyAgICAgIDx0ZD5sYWJlbDwvdGQ+CisgICAgICA8dGQ+VGhlIGxhYmVsIHRvIGFwcGx5IHRvIGEgcHJvamVjdDwvdGQ+CisgICAgICA8dGQ+WWVzPC90ZD4KKyAgIDwvdHI+CisgICA8dHI+CisgICAgICA8dGQ+Y29tbWVudDwvdGQ+CisgICAgICA8dGQ+QSBjb21tZW50IHRvIGJlIGFwcGxpZWQgdG8gYWxsIGZpbGVzIGJlaW5nIGxhYmVsZWQ8L3RkPgorICAgICAgPHRkPk5vPC90ZD4KKyAgIDwvdHI+CisgICA8dHI+CisgICAgICA8dGQ+dmVyYm9zZTwvdGQ+CisgICAgICA8dGQ+dHJ1ZSBvciBmYWxzZSAtIFN0YXR1cyBtZXNzYWdlcyBhcmUgZGlzcGxheWVkPC90ZD4KKyAgICAgIDx0ZD5ObzwvdGQ+CisgICA8L3RyPgorIDwvdGFibGU+XV0+CisgIDwvZGVzY3JpcHRpb24+CisKKyAgPHN0cnVjdHVyZT4KKworICAgIDxhdHRyaWJ1dGVzPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb21tZW50IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ29tbWVudCB0byBhcHBseSB0byBhbGwgZmlsZXMgYmVpbmcgbGFiZWxsZWQ7Cisgb3B0aW9uYWwsIG9ubHkgdmFsaWQgaW4gU09TTGFiZWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCB0aGUgY29tbWVudCB0byBhcHBseSB0byBhbGwgZmlsZXMgYmVpbmcgbGFiZWxsZWQ7Cisgb3B0aW9uYWwsIG9ubHkgdmFsaWQgaW4gU09TTGFiZWwKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmaWxlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRmlsZW5hbWUgdG8gYWN0IHVwb247IG9wdGlvbmFsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIEZpbGVuYW1lIHRvIGFjdCB1cG9uOyBvcHRpb25hbC4KKyBJZiBubyBmaWxlIGlzIHNwZWNpZmllZCB0aGVuIHRoZSB0YXNrcyAKKyBhY3QgdXBvbiB0aGUgcHJvamVjdAorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImxhYmVsIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTGFiZWxlZCB2ZXJzaW9uIHRvIG9wZXJhdGUgb24gaW4gU291cmNlU2FmZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBsYWJlbGVkIHZlcnNpb24gdG8gb3BlcmF0ZSBvbiBpbiBTb3VyY2VTYWZlCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibG9jYWxwYXRoIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlBhdGgiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW092ZXJyaWRlIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBhbmQgZ2V0IHRvIHRoZSBzcGVjaWZpZWQgcGF0aDsgb3B0aW9uYWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIE92ZXJyaWRlIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBhbmQgZ2V0IHRvIHRoZSBzcGVjaWZpZWQgcGF0aDsgb3B0aW9uYWwuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibm9jYWNoZSIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtGbGFnIHRvIGRpc2FibGUgdGhlIGNhY2hlIHdoZW4gc2V0OworIG9wdGlvbmFsIG5lZWRlZCBpZiBTT1NIT01FIGlzIHNldCBhcyBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgZmxhZyB0byBkaXNhYmxlIHRoZSBjYWNoZSB3aGVuIHNldDsKKyBvcHRpb25hbCBuZWVkZWQgaWYgU09TSE9NRSBpcyBzZXQgYXMgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibm9jb21wcmVzcyIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtGbGFnIHRoYXQgZGlzYWJsZXMgY29tcHJlc3Npb24gd2hlbiBzZXQ7IG9wdGlvbmFsLCBkZWZhdWx0Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBGbGFnIHRoYXQgZGlzYWJsZXMgY29tcHJlc3Npb24gd2hlbiBzZXQ7IG9wdGlvbmFsLCBkZWZhdWx0CisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icGFzc3dvcmQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTb3VyY2VTYWZlIHBhc3N3b3JkOyBvcHRpb25hbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBTb3VyY2VTYWZlIHBhc3N3b3JkOyBvcHRpb25hbC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwcm9qZWN0cGF0aCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NvdXJjZVNhZmUgcHJvamVjdCBwYXRoIHdpdGhvdXQgdGhlICIkIiBwcmVmaXg7IHJlcXVpcmVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIFNvdXJjZVNhZmUgcHJvamVjdCBwYXRoIHdpdGhvdXQgdGhlICIkIiBwcmVmaXg7IHJlcXVpcmVkCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icmVjdXJzaXZlIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0ZsYWcgdG8gcmVjdXJzaXZlbHkgYXBwbHkgdGhlIGFjdGlvbiAobm90IHZhbGlkCisgb24gYWxsIFNPUyB0YXNrcyApOyBvcHRpb25hbCwgZGVmYXVsdCBmYWxzZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgRmxhZyB0byByZWN1cnNpdmVseSBhcHBseSB0aGUgYWN0aW9uIChub3QgdmFsaWQKKyBvbiBhbGwgU09TIHRhc2tzICk7IG9wdGlvbmFsLCBkZWZhdWx0IGZhbHNlCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic29zY21kIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRGlyZWN0b3J5IHdoZXJlIHNvc2NtZCguZXhlKSBpcyBsb2NhdGVkOworIG9wdGlvbmFsLCBzb3NjbWQgbXVzdCBiZSBvbiB0aGUgcGF0aCBpZiBvbWl0dGVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIGRpcmVjdG9yeSB3aGVyZSBzb3NjbWQoLmV4ZSkgaXMgbG9jYXRlZDsKKyBvcHRpb25hbCwgc29zY21kIG11c3QgYmUgb24gdGhlIHBhdGggaWYgb21pdHRlZC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzb3Nob21lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIHBhdGggdG8gdGhlIFNvdXJjZU9mZlNpdGUgaG9tZSBkaXJlY3RvcnkuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRoZSBwYXRoIHRvIHRoZSBTb3VyY2VPZmZTaXRlIGhvbWUgZGlyZWN0b3J5CisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic29zc2VydmVycGF0aCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHJlc3MgYW5kIHBvcnQgb2YgU291cmNlT2ZmU2l0ZSBTZXJ2ZXIsCisgZWcuIDE5Mi4xNjguMC4xOjg4ODggOyByZXF1aXJlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBhZGRyZXNzIGFuZCBwb3J0IG9mIFNvdXJjZU9mZlNpdGUgU2VydmVyLAorIGVnLiAxOTIuMTY4LjAuMTo4ODg4IDsgcmVxdWlyZWQuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idXNlcm5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTb3VyY2VTYWZlIHVzZXJuYW1lOyByZXF1aXJlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBTb3VyY2VTYWZlIHVzZXJuYW1lOyByZXF1aXJlZC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2ZXJib3NlIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0VuYWJsZSB2ZXJib3NlIG91dHB1dDsgb3B0aW9uYWwsIGRlZmF1bHQgZmFsc2UuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIEVuYWJsZSB2ZXJib3NlIG91dHB1dDsgb3B0aW9uYWwsIGRlZmF1bHQgZmFsc2UKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQSB2ZXJzaW9uIG51bWJlciB0byBnZXQgLSAKKyBvbmx5IHdvcmtzIHdpdGggdGhlIFNPU0dldCBvbiBhIGZpbGU7IG9wdGlvbmFsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIGEgdmVyc2lvbiBudW1iZXIgdG8gZ2V0IC0gCisgb25seSB3b3JrcyB3aXRoIHRoZSBTT1NHZXQgb24gYSBmaWxlOyBvcHRpb25hbC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2c3NzZXJ2ZXJwYXRoIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbUGF0aCB0byB0aGUgbG9jYXRpb24gb2YgdGhlIHNzLmluaSBmaWxlOyAKKyByZXF1aXJlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBwYXRoIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgc3MuaW5pIGZpbGU7IAorIHJlcXVpcmVkLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgPC9hdHRyaWJ1dGVzPgorCisgICAgPGVsZW1lbnRzPgorICAgIDwvZWxlbWVudHM+CisKKyAgPC9zdHJ1Y3R1cmU+CisKKzwvdGFzaz4KKworCis8dGFzayBuYW1lPSJzb3VuZCIgY2F0ZWdvcnk9Im90aGVyIgorICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5zb3VuZC5Tb3VuZFRhc2siCisgICAgICA+CisKKyAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1BsYXlzIGEgc291bmQgZmlsZSBhdCB0aGUgZW5kIG9mIHRoZSBidWlsZCwgYWNjb3JkaW5nIHRvIHdoZXRoZXIgdGhlIGJ1aWxkIGZhaWxlZCBvciBzdWNjZWVkZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgPGRlc2NyaXB0aW9uPgorICAgIDwhW0NEQVRBW1BsYXlzIGEgc291bmQgZmlsZSBhdCB0aGUgZW5kIG9mIHRoZSBidWlsZCwgYWNjb3JkaW5nIHRvIHdoZXRoZXIgdGhlIGJ1aWxkIGZhaWxlZCBvciBzdWNjZWVkZWQuCisKKyBUaGVyZSBhcmUgdGhyZWUgYXR0cmlidXRlcyB0byBiZSBzZXQ6CisKKyA8Y29kZT5zb3VyY2U8L2NvZGU+OiB0aGUgbG9jYXRpb24gb2YgdGhlIGF1ZGlvIGZpbGUgdG8gYmUgcGxheWVkCisgPGNvZGU+ZHVyYXRpb248L2NvZGU+OiBwbGF5IHRoZSBzb3VuZCBmaWxlIGNvbnRpbnVvdXNseSB1bnRpbCAiZHVyYXRpb24iIG1pbGxpc2Vjb25kcyBoYXMgZXhwaXJlZAorIDxjb2RlPmxvb3BzPC9jb2RlPjogdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgc291bmQgZmlsZSBzaG91bGQgYmUgcGxheWVkIHVudGlsIHN0b3BwZWQKKworIEkgaGF2ZSBvbmx5IHRlc3RlZCB0aGlzIHdpdGggLldBViBhbmQgLkFJRkYgc291bmQgZmlsZSBmb3JtYXRzLiBCb3RoIHNlZW0KKyB0byB3b3JrIGZpbmUuCisKKyBwbGFucyBmb3IgdGhlIGZ1dHVyZToKKyAtIHVzZSB0aGUgbWlkaSBhcGkgdG8gZGVmaW5lIHNvdW5kcyAob3IgZHJ1bSBiZWF0IGV0YykgaW4geG1sIGFuZCBoYXZlCisgICBBbnQgcGxheSB0aGVtIGJhY2tdXT4KKyAgPC9kZXNjcmlwdGlvbj4KKworICA8c3RydWN0dXJlPgorCisgICAgPGF0dHJpYnV0ZXM+CisgICAgPC9hdHRyaWJ1dGVzPgorCisgICAgPGVsZW1lbnRzPgorICAgICAgPGVsZW1lbnQgbmFtZT0iZmFpbCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuc291bmQuU291bmRUYXNrLkJ1aWxkQWxlcnQiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IiIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZCBhIHNvdW5kIHdoZW4gdGhlIGJ1aWxkIGZhaWxzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVthZGQgYSBzb3VuZCB3aGVuIHRoZSBidWlsZCBmYWlsc11dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgICA8ZWxlbWVudCBuYW1lPSJzdWNjZXNzIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5zb3VuZC5Tb3VuZFRhc2suQnVpbGRBbGVydCIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkIGEgc291bmQgd2hlbiB0aGUgYnVpbGQgc3VjY2VlZHMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW2FkZCBhIHNvdW5kIHdoZW4gdGhlIGJ1aWxkIHN1Y2NlZWRzXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICA8L2VsZW1lbnRzPgorCisgIDwvc3RydWN0dXJlPgorCis8L3Rhc2s+CisKKworPHRhc2sgbmFtZT0ic3BsYXNoIiBjYXRlZ29yeT0ib3RoZXIiCisgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnNwbGFzaC5TcGxhc2hUYXNrIgorICAgICAgPgorCisgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDcmVhdGVzIGEgc3BsYXNoIHNjcmVlbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICA8ZGVzY3JpcHRpb24+CisgICAgPCFbQ0RBVEFbQ3JlYXRlcyBhIHNwbGFzaCBzY3JlZW4uIFRoZSBzcGxhc2ggc2NyZWVuIGlzIGRpc3BsYXllZAorIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIGJ1aWxkIGFuZCBpbmNsdWRlcyBhIGhhbmR5IHByb2dyZXNzIGJhciBhcworIHdlbGwuIFVzZSBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBzb3VuZCB0YXNrIHRvIHByb3ZpZGUgaW50ZXJlc3QKKyB3aGlsc3Qgd2FpdGluZyBmb3IgeW91ciBidWlsZHMgdG8gY29tcGxldGUuLi5dXT4KKyAgPC9kZXNjcmlwdGlvbj4KKworICA8c3RydWN0dXJlPgorCisgICAgPGF0dHJpYnV0ZXM+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImltYWdldXJsIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQSBVUkwgcG9pbnRpbmcgdG8gYW4gaW1hZ2UgdG8gZGlzcGxheTsgb3B0aW9uYWwsIGRlZmF1bHQgYW50bG9nby5naWYKKyBmcm9tIHRoZSBjbGFzc3BhdGguXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIEEgVVJMIHBvaW50aW5nIHRvIGFuIGltYWdlIHRvIGRpc3BsYXk7IG9wdGlvbmFsLCBkZWZhdWx0IGFudGxvZ28uZ2lmCisgZnJvbSB0aGUgY2xhc3NwYXRoLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InBhc3N3b3JkIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbUHJveHkgcGFzc3dvcmQ7IHJlcXVpcmVkIGlmIDx0dD51c2VyPC90dD4gaXMgc2V0Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBQcm94eSBwYXNzd29yZDsgcmVxdWlyZWQgaWYgPHR0PnVzZXI8L3R0PiBpcyBzZXQuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9ydCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1Byb3h5IHBvcnQ7IG9wdGlvbmFsLCBkZWZhdWx0IDgwLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBQcm94eSBwb3J0OyBvcHRpb25hbCwgZGVmYXVsdCA4MC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwcm94eSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW05hbWUgb2YgcHJveHk7IG9wdGlvbmFsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBuYW1lIG9mIHByb3h5OyBvcHRpb25hbC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzaG93ZHVyYXRpb24iIHR5cGU9ImludCIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJpbnQiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0hvdyBsb25nIHRvIHNob3cgdGhlIHNwbGFzaCBzY3JlZW4gaW4gbWlsbGlzZWNvbmRzLAorIG9wdGlvbmFsOyBkZWZhdWx0IDUwMDAgbXMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIGhvdyBsb25nIHRvIHNob3cgdGhlIHNwbGFzaCBzY3JlZW4gaW4gbWlsbGlzZWNvbmRzLAorIG9wdGlvbmFsOyBkZWZhdWx0IDUwMDAgbXMuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idXNlciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1Byb3h5IHVzZXI7IG9wdGlvbmFsLCBkZWZhdWx0ID1ub25lLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBQcm94eSB1c2VyOyBvcHRpb25hbCwgZGVmYXVsdCA9bm9uZS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgIDwvYXR0cmlidXRlcz4KKworICAgIDxlbGVtZW50cz4KKyAgICA8L2VsZW1lbnRzPgorCisgIDwvc3RydWN0dXJlPgorCis8L3Rhc2s+CisKKworPHRhc2sgbmFtZT0ic3FsIiBjYXRlZ29yeT0iZGF0YWJhc2UiCisgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlNRTEV4ZWMiCisgICAgICA+CisKKyAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0V4ZWN1dGVzIGEgc2VyaWVzIG9mIFNRTCBzdGF0ZW1lbnRzIG9uIGEgZGF0YWJhc2UgdXNpbmcgSkRCQy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICA8ZGVzY3JpcHRpb24+CisgICAgPCFbQ0RBVEFbRXhlY3V0ZXMgYSBzZXJpZXMgb2YgU1FMIHN0YXRlbWVudHMgb24gYSBkYXRhYmFzZSB1c2luZyBKREJDLgorCisgPHA+U3RhdGVtZW50cyBjYW4KKyBlaXRoZXIgYmUgcmVhZCBpbiBmcm9tIGEgdGV4dCBmaWxlIHVzaW5nIHRoZSA8aT5zcmM8L2k+IGF0dHJpYnV0ZSBvciBmcm9tIAorIGJldHdlZW4gdGhlIGVuY2xvc2luZyBTUUwgdGFncy48L3A+CisgPHA+TXVsdGlwbGUgc3RhdGVtZW50cyBjYW4gYmUgcHJvdmlkZWQsIHNlcGFyYXRlZCBieSBzZW1pY29sb25zIChvciB0aGUgCisgZGVmaW5lZCA8aT5kZWxpbWl0ZXI8L2k+KS4gSW5kaXZpZHVhbCBsaW5lcyB3aXRoaW4gdGhlIHN0YXRlbWVudHMgY2FuIGJlIAorIGNvbW1lbnRlZCB1c2luZyBlaXRoZXIgLS0sIC8vIG9yIFJFTSBhdCB0aGUgc3RhcnQgb2YgdGhlIGxpbmUuPC9wPgorIDxwPlRoZSA8aT5hdXRvY29tbWl0PC9pPiBhdHRyaWJ1dGUgc3BlY2lmaWVzIHdoZXRoZXIgYXV0by1jb21taXQgc2hvdWxkIGJlIAorIHR1cm5lZCBvbiBvciBvZmYgd2hpbHN0IGV4ZWN1dGluZyB0aGUgc3RhdGVtZW50cy4gSWYgYXV0by1jb21taXQgaXMgdHVybmVkIAorIG9uIGVhY2ggc3RhdGVtZW50IHdpbGwgYmUgZXhlY3V0ZWQgYW5kIGNvbW1pdHRlZC4gSWYgaXQgaXMgdHVybmVkIG9mZiB0aGUgCisgc3RhdGVtZW50cyB3aWxsIGFsbCBiZSBleGVjdXRlZCBhcyBvbmUgdHJhbnNhY3Rpb24uPC9wPgorIDxwPlRoZSA8aT5vbmVycm9yPC9pPiBhdHRyaWJ1dGUgc3BlY2lmaWVzIGhvdyB0byBwcm9jZWVkIHdoZW4gYW4gZXJyb3Igb2NjdXJzIAorIGR1cmluZyB0aGUgZXhlY3V0aW9uIG9mIG9uZSBvZiB0aGUgc3RhdGVtZW50cy4gCisgVGhlIHBvc3NpYmxlIHZhbHVlcyBhcmU6IDxiPmNvbnRpbnVlPC9iPiBleGVjdXRpb24sIG9ubHkgc2hvdyB0aGUgZXJyb3I7CisgPGI+c3RvcDwvYj4gZXhlY3V0aW9uIGFuZCBjb21taXQgdHJhbnNhY3Rpb247CisgYW5kIDxiPmFib3J0PC9iPiBleGVjdXRpb24gYW5kIHRyYW5zYWN0aW9uIGFuZCBmYWlsIHRhc2suPC9wPl1dPgorICA8L2Rlc2NyaXB0aW9uPgorCisgIDxzdHJ1Y3R1cmU+CisKKyAgICA8YXR0cmlidXRlcz4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYXBwZW5kIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1doZXRoZXIgb3V0cHV0IHNob3VsZCBiZSBhcHBlbmRlZCB0byBvciBvdmVyd3JpdGUKKyBhbiBleGlzdGluZyBmaWxlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICB3aGV0aGVyIG91dHB1dCBzaG91bGQgYmUgYXBwZW5kZWQgdG8gb3Igb3ZlcndyaXRlCisgYW4gZXhpc3RpbmcgZmlsZS4gIERlZmF1bHRzIHRvIGZhbHNlLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImF1dG9jb21taXQiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQXV0byBjb21taXQgZmxhZyBmb3IgZGF0YWJhc2UgY29ubmVjdGlvbjsKKyBvcHRpb25hbCwgZGVmYXVsdCBmYWxzZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgQXV0byBjb21taXQgZmxhZyBmb3IgZGF0YWJhc2UgY29ubmVjdGlvbjsKKyBvcHRpb25hbCwgZGVmYXVsdCBmYWxzZS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjYWNoaW5nIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NhY2hpbmcgbG9hZGVycyAvIGRyaXZlci5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgQ2FjaGluZyBsb2FkZXJzIC8gZHJpdmVyLiBUaGlzIGlzIHRvIGF2b2lkCisgZ2V0dGluZyBhbiBPdXRPZk1lbW9yeUVycm9yIHdoZW4gY2FsbGluZyB0aGlzIHRhc2sKKyBtdWx0aXBsZSB0aW1lcyBpbiBhIHJvdzsgZGVmYXVsdDogdHJ1ZQorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzcGF0aCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aCIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJQYXRoIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDbGFzc3BhdGggZm9yIGxvYWRpbmcgdGhlIGRyaXZlci5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0cyB0aGUgY2xhc3NwYXRoIGZvciBsb2FkaW5nIHRoZSBkcml2ZXIuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NwYXRocmVmIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZWZlcmVuY2UiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUmVmZXJlbmNlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDbGFzc3BhdGggZm9yIGxvYWRpbmcgdGhlIGRyaXZlciAKKyB1c2luZyB0aGUgY2xhc3NwYXRoIHJlZmVyZW5jZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBjbGFzc3BhdGggZm9yIGxvYWRpbmcgdGhlIGRyaXZlciAKKyB1c2luZyB0aGUgY2xhc3NwYXRoIHJlZmVyZW5jZS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZWxpbWl0ZXIiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtEZWxpbWl0ZXIgdGhhdCBzZXBhcmF0ZXMgU1FMIHN0YXRlbWVudHM7IAorIG9wdGlvbmFsLCBkZWZhdWx0ICZxdW90OzsmcXVvdDsKKworIDxwPkZvciBleGFtcGxlLCBzZXQgdGhpcyB0byAiZ28iIGFuZCBkZWxpbWl0ZXJ0eXBlIHRvICJST1ciIGZvcgorIFN5YmFzZSBBU0Ugb3IgTVMgU1FMIFNlcnZlci48L3A+Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIGRlbGltaXRlciB0aGF0IHNlcGFyYXRlcyBTUUwgc3RhdGVtZW50czsgCisgb3B0aW9uYWwsIGRlZmF1bHQgJnF1b3Q7OyZxdW90OworCisgPHA+Rm9yIGV4YW1wbGUsIHNldCB0aGlzIHRvICJnbyIgYW5kIGRlbGltaXRlcnR5cGUgdG8gIlJPVyIgZm9yCisgU3liYXNlIEFTRSBvciBNUyBTUUwgU2VydmVyLjwvcD4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZWxpbWl0ZXJ0eXBlIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5TUUxFeGVjLkRlbGltaXRlclR5cGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iJnF1b3Q7bm9ybWFsJnF1b3Q7LCAmcXVvdDtyb3cmcXVvdDsiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0RlbGltaXRlciB0eXBlOiAibm9ybWFsIiBvciAicm93IiAoZGVmYXVsdCAibm9ybWFsIikuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCB0aGUgZGVsaW1pdGVyIHR5cGU6ICJub3JtYWwiIG9yICJyb3ciIChkZWZhdWx0ICJub3JtYWwiKS4KKworIDxwPlRoZSBkZWxpbWl0ZXIgdHlwZSB0YWtlcyB0d28gdmFsdWVzIC0gbm9ybWFsIGFuZCByb3cuIE5vcm1hbAorIG1lYW5zIHRoYXQgYW55IG9jY3VyZW5jZSBvZiB0aGUgZGVsaW1pdGVyIHRlcm1pbmF0ZSB0aGUgU1FMCisgY29tbWFuZCB3aGVyZWFzIHdpdGggcm93LCBvbmx5IGEgbGluZSBjb250YWluaW5nIGp1c3QgdGhlCisgZGVsaW1pdGVyIGlzIHJlY29nbml6ZWQgYXMgdGhlIGVuZCBvZiB0aGUgY29tbWFuZC48L3A+CisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZHJpdmVyIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ2xhc3MgbmFtZSBvZiB0aGUgSkRCQyBkcml2ZXI7IHJlcXVpcmVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBDbGFzcyBuYW1lIG9mIHRoZSBKREJDIGRyaXZlcjsgcmVxdWlyZWQuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZW5jb2RpbmciIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtGaWxlIGVuY29kaW5nIHRvIHVzZSBvbiB0aGUgU1FMIGZpbGVzIHJlYWQgaW4uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCB0aGUgZmlsZSBlbmNvZGluZyB0byB1c2Ugb24gdGhlIFNRTCBmaWxlcyByZWFkIGluCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ib25lcnJvciIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuU1FMRXhlYy5PbkVycm9yIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IiZxdW90O2NvbnRpbnVlJnF1b3Q7LCAmcXVvdDtzdG9wJnF1b3Q7LCAmcXVvdDthYm9ydCZxdW90OyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWN0aW9uIHRvIHBlcmZvcm0gd2hlbiBzdGF0ZW1lbnQgZmFpbHM6IGNvbnRpbnVlLCBzdG9wLCBvciBhYm9ydAorIG9wdGlvbmFsOyBkZWZhdWx0ICZxdW90O2Fib3J0JnF1b3Q7Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBBY3Rpb24gdG8gcGVyZm9ybSB3aGVuIHN0YXRlbWVudCBmYWlsczogY29udGludWUsIHN0b3AsIG9yIGFib3J0Cisgb3B0aW9uYWw7IGRlZmF1bHQgJnF1b3Q7YWJvcnQmcXVvdDsKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJvdXRwdXQiIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtPdXRwdXQgZmlsZTsgCisgb3B0aW9uYWwsIGRlZmF1bHRzIHRvIHRoZSBBbnQgbG9nLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIG91dHB1dCBmaWxlOyAKKyBvcHRpb25hbCwgZGVmYXVsdHMgdG8gdGhlIEFudCBsb2cuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icGFzc3dvcmQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtQYXNzd29yZDsgcmVxdWlyZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldHMgdGhlIHBhc3N3b3JkOyByZXF1aXJlZC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwcmludCIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtQcmludCByZXN1bHQgc2V0cyBmcm9tIHRoZSBzdGF0ZW1lbnRzOworIG9wdGlvbmFsLCBkZWZhdWx0IGZhbHNlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBQcmludCByZXN1bHQgc2V0cyBmcm9tIHRoZSBzdGF0ZW1lbnRzOworIG9wdGlvbmFsLCBkZWZhdWx0IGZhbHNlCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icmRibXMiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtFeGVjdXRlIHRhc2sgb25seSBpZiB0aGUgbG93ZXIgY2FzZSBwcm9kdWN0IG5hbWUgCisgb2YgdGhlIERCIG1hdGNoZXMgdGhpcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgRXhlY3V0ZSB0YXNrIG9ubHkgaWYgdGhlIGxvd2VyIGNhc2UgcHJvZHVjdCBuYW1lIAorIG9mIHRoZSBEQiBtYXRjaGVzIHRoaXMKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzaG93aGVhZGVycyIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtQcmludCBoZWFkZXJzIGZvciByZXN1bHQgc2V0cyBmcm9tIHRoZSAKKyBzdGF0ZW1lbnRzOyBvcHRpb25hbCwgZGVmYXVsdCB0cnVlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBQcmludCBoZWFkZXJzIGZvciByZXN1bHQgc2V0cyBmcm9tIHRoZSAKKyBzdGF0ZW1lbnRzOyBvcHRpb25hbCwgZGVmYXVsdCB0cnVlLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InNyYyIgdHlwZT0iamF2YS5pby5GaWxlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW05hbWUgb2YgdGhlIFNRTCBmaWxlIHRvIGJlIHJ1bi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBuYW1lIG9mIHRoZSBTUUwgZmlsZSB0byBiZSBydW4uCisgUmVxdWlyZWQgdW5sZXNzIHN0YXRlbWVudHMgYXJlIGVuY2xvc2VkIGluIHRoZSBidWlsZGZpbGUKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1cmwiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtEYXRhYmFzZSBjb25uZWN0aW9uIFVSTDsgcmVxdWlyZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldHMgdGhlIGRhdGFiYXNlIGNvbm5lY3Rpb24gVVJMOyByZXF1aXJlZC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1c2VyaWQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtVc2VyIG5hbWUgZm9yIHRoZSBjb25uZWN0aW9uOyByZXF1aXJlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSB1c2VyIG5hbWUgZm9yIHRoZSBjb25uZWN0aW9uOyByZXF1aXJlZC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVmVyc2lvbiBzdHJpbmcsIGV4ZWN1dGUgdGFzayBvbmx5IGlmIAorIHJkYm1zIHZlcnNpb24gbWF0Y2g7IG9wdGlvbmFsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXRzIHRoZSB2ZXJzaW9uIHN0cmluZywgZXhlY3V0ZSB0YXNrIG9ubHkgaWYgCisgcmRibXMgdmVyc2lvbiBtYXRjaDsgb3B0aW9uYWwuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICA8L2F0dHJpYnV0ZXM+CisKKyAgICA8ZWxlbWVudHM+CisgICAgICA8ZWxlbWVudCBuYW1lPSJmaWxlc2V0IiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0IgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlc2V0IgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBhIHNldCBvZiBmaWxlcyAobmVzdGVkIGZpbGVzZXQgYXR0cmlidXRlKS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbQWRkcyBhIHNldCBvZiBmaWxlcyAobmVzdGVkIGZpbGVzZXQgYXR0cmlidXRlKS5dXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgICAgPGVsZW1lbnQgbmFtZT0iY2xhc3NwYXRoIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoIgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJQYXRoIgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkIGEgcGF0aCB0byB0aGUgY2xhc3NwYXRoIGZvciBsb2FkaW5nIHRoZSBkcml2ZXIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0FkZCBhIHBhdGggdG8gdGhlIGNsYXNzcGF0aCBmb3IgbG9hZGluZyB0aGUgZHJpdmVyLl1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgICA8ZWxlbWVudCBuYW1lPSJ0cmFuc2FjdGlvbiIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuU1FMRXhlYy5UcmFuc2FjdGlvbiIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkIGEgU1FMIHRyYW5zYWN0aW9uIHRvIGV4ZWN1dGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0FkZCBhIFNRTCB0cmFuc2FjdGlvbiB0byBleGVjdXRlXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICA8L2VsZW1lbnRzPgorCisgICAgICA8Ym9keSA+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgYW4gaW5saW5lIFNRTCBjb21tYW5kIHRvIGV4ZWN1dGUuIAorIE5COiBQcm9wZXJ0aWVzIGFyZSBub3QgZXhwYW5kZWQgaW4gdGhpcyB0ZXh0LgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9ib2R5PgorCisgIDwvc3RydWN0dXJlPgorCis8L3Rhc2s+CisKKworPHRhc2sgbmFtZT0ic3R5bGVib29rIiBjYXRlZ29yeT0ib3RoZXIiCisgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLlN0eWxlQm9vayIKKyAgICAgID4KKworICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRXhlY3V0ZXMgdGhlIEFwYWNoZSBTdHlsZWJvb2sgZG9jdW1lbnRhdGlvbiBnZW5lcmF0b3IuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgPGRlc2NyaXB0aW9uPgorICAgIDwhW0NEQVRBW0V4ZWN1dGVzIHRoZSBBcGFjaGUgU3R5bGVib29rIGRvY3VtZW50YXRpb24gZ2VuZXJhdG9yLgorIFVubGlrZSB0aGUgY29tbWFuZGxpbmUgdmVyc2lvbiBvZiB0aGlzIHRvb2wsIGFsbCB0aHJlZSBhcmd1bWVudHMKKyBhcmUgcmVxdWlyZWQgdG8gcnVuIHN0eWxlYm9vay4KKyA8cD4KKyBCZWluZyBleHRlbmRlZCBmcm9tICZsdDtKYXZhJmd0OywgYWxsIHRoZSBwYXJlbnQncyBhdHRyaWJ1dGVzCisgYW5kIG9wdGlvbnMgYXJlIGF2YWlsYWJsZS4gRG8gbm90IHNldCBhbnkgYXBhcnQgZnJvbSB0aGUgPHR0PmNsYXNzcGF0aDwvdHQ+CisgYXMgdGhleSBhcmUgbm90IGd1YXJhbnRlZWQgdG8gYmUgdGhlcmUgaW4gZnV0dXJlLl1dPgorICA8L2Rlc2NyaXB0aW9uPgorCisgIDxzdHJ1Y3R1cmU+CisKKyAgICA8YXR0cmlidXRlcz4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYXBwZW5kIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIGFwcGVuZCBvdXRwdXQgdG8gZXhpc3RpbmcgZmlsZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgSWYgdHJ1ZSwgYXBwZW5kIG91dHB1dCB0byBleGlzdGluZyBmaWxlLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImJvb2siIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgYm9vayB4bWwgZmlsZSB0aGF0IHRoZSBkb2N1bWVudGF0aW9uIGdlbmVyYXRpb24gc3RhcnRzIGZyb207IAorIHJlcXVpcmVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBUaGUgYm9vayB4bWwgZmlsZSB0aGF0IHRoZSBkb2N1bWVudGF0aW9uIGdlbmVyYXRpb24gc3RhcnRzIGZyb207IAorIHJlcXVpcmVkLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzbmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0phdmEgY2xhc3MgdG8gZXhlY3V0ZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0cyB0aGUgSmF2YSBjbGFzcyB0byBleGVjdXRlLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzcGF0aCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aCIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJQYXRoIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDbGFzc3BhdGggdG8gYmUgdXNlZCB3aGVuIHJ1bm5pbmcgdGhlIEphdmEgY2xhc3MuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCB0aGUgY2xhc3NwYXRoIHRvIGJlIHVzZWQgd2hlbiBydW5uaW5nIHRoZSBKYXZhIGNsYXNzCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NwYXRocmVmIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZWZlcmVuY2UiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUmVmZXJlbmNlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDbGFzc3BhdGggdG8gdXNlLCBieSByZWZlcmVuY2UuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIENsYXNzcGF0aCB0byB1c2UsIGJ5IHJlZmVyZW5jZS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkaXIiIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgd29ya2luZyBkaXJlY3Rvcnkgb2YgdGhlIHByb2Nlc3MuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRoZSB3b3JraW5nIGRpcmVjdG9yeSBvZiB0aGUgcHJvY2VzcworICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImZhaWxvbmVycm9yIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIHRoZW4gZmFpbCBpZiB0aGUgY29tbWFuZCBleGl0cyB3aXRoIGEKKyByZXR1cm5jb2RlIG90aGVyIHRoYW4gMC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgSWYgdHJ1ZSwgdGhlbiBmYWlsIGlmIHRoZSBjb21tYW5kIGV4aXRzIHdpdGggYQorIHJldHVybmNvZGUgb3RoZXIgdGhhbiAwCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZm9yayIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlLCBleGVjdXRlIGluIGEgbmV3IFZNLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBJZiB0cnVlLCBleGVjdXRlIGluIGEgbmV3IFZNLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9Imp2bXZlcnNpb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtKVk0gdmVyc2lvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0cyB0aGUgSlZNIHZlcnNpb24uCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iamFyIiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGxvY2F0aW9uIG9mIHRoZSBKQVIgZmlsZSB0byBleGVjdXRlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBUaGUgbG9jYXRpb24gb2YgdGhlIEpBUiBmaWxlIHRvIGV4ZWN1dGUuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ianZtIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ29tbWFuZCB1c2VkIHRvIHN0YXJ0IHRoZSBWTSAob25seSBpZiBub3QgZm9ya2luZykuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCB0aGUgY29tbWFuZCB1c2VkIHRvIHN0YXJ0IHRoZSBWTSAob25seSBpZiBub3QgZm9ya2luZykuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ianZtYXJncyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NvbW1hbmQgbGluZSBhcmd1bWVudHMgZm9yIHRoZSBKVk0uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBmb3IgdGhlIEpWTS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsb2FkZXJjb25maWciIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBIGxvYWRlciBjb25maWd1cmF0aW9uIHRvIHNlbmQgdG8gc3R5bGVib29rOyBvcHRpb25hbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgQSBsb2FkZXIgY29uZmlndXJhdGlvbiB0byBzZW5kIHRvIHN0eWxlYm9vazsgb3B0aW9uYWwuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibWF4bWVtb3J5IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ29ycmVzcG9uZHMgdG8gLW14IG9yIC1YbXggZGVwZW5kaW5nIG9uIFZNIHZlcnNpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIENvcnJlc3BvbmRzIHRvIC1teCBvciAtWG14IGRlcGVuZGluZyBvbiBWTSB2ZXJzaW9uLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9Im5ld2Vudmlyb25tZW50IiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIHVzZSBhIGNvbXBsZXRlbHkgbmV3IGVudmlyb25tZW50Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBJZiB0cnVlLCB1c2UgYSBjb21wbGV0ZWx5IG5ldyBlbnZpcm9ubWVudC4KKworIDxwPldpbGwgYmUgaWdub3JlZCBpZiB3ZSBhcmUgbm90IGZvcmtpbmcgYSBuZXcgVk0uCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ib3V0cHV0IiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRmlsZSB0aGUgb3V0cHV0IG9mIHRoZSBwcm9jZXNzIGlzIHJlZGlyZWN0ZWQgdG8uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIEZpbGUgdGhlIG91dHB1dCBvZiB0aGUgcHJvY2VzcyBpcyByZWRpcmVjdGVkIHRvLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InNraW5kaXJlY3RvcnkiIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgdGhlIHN0eWxlYm9vayBza2luOworIHJlcXVpcmVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICB0aGUgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgdGhlIHN0eWxlYm9vayBza2luOworIHJlcXVpcmVkLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InRhcmdldGRpcmVjdG9yeSIgdHlwZT0iamF2YS5pby5GaWxlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBkZXN0aW5hdGlvbiBkaXJlY3Rvcnkgd2hlcmUgdGhlIGRvY3VtZW50YXRpb24gaXMgZ2VuZXJhdGVkOworIHJlcXVpcmVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5IHdoZXJlIHRoZSBkb2N1bWVudGF0aW9uIGlzIGdlbmVyYXRlZDsKKyByZXF1aXJlZC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0aW1lb3V0IiB0eXBlPSJqYXZhLmxhbmcuTG9uZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJsb25nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaW1lb3V0IGluIG1pbGxpc2Vjb25kcyBhZnRlciB3aGljaCB0aGUgcHJvY2VzcyB3aWxsIGJlIGtpbGxlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgVGltZW91dCBpbiBtaWxsaXNlY29uZHMgYWZ0ZXIgd2hpY2ggdGhlIHByb2Nlc3Mgd2lsbCBiZSBraWxsZWQuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICA8L2F0dHJpYnV0ZXM+CisKKyAgICA8ZWxlbWVudHM+CisgICAgICA8ZWxlbWVudCBuYW1lPSJlbnYiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkVudmlyb25tZW50LlZhcmlhYmxlIgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIGFuIGVudmlyb25tZW50IHZhcmlhYmxlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtBZGRzIGFuIGVudmlyb25tZW50IHZhcmlhYmxlLgorCisgPHA+V2lsbCBiZSBpZ25vcmVkIGlmIHdlIGFyZSBub3QgZm9ya2luZyBhIG5ldyBWTS5dXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgICAgPGVsZW1lbnQgbmFtZT0ic3lzcHJvcGVydHkiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkVudmlyb25tZW50LlZhcmlhYmxlIgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIGEgc3lzdGVtIHByb3BlcnR5Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtBZGRzIGEgc3lzdGVtIHByb3BlcnR5Ll1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgICA8ZWxlbWVudCBuYW1lPSJhcmciIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkNvbW1hbmRsaW5lLkFyZ3VtZW50IgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIGEgY29tbWFuZC1saW5lIGFyZ3VtZW50Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtBZGRzIGEgY29tbWFuZC1saW5lIGFyZ3VtZW50Ll1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgICA8ZWxlbWVudCBuYW1lPSJjbGFzc3BhdGgiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IlBhdGgiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIGEgcGF0aCB0byB0aGUgY2xhc3NwYXRoLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtBZGRzIGEgcGF0aCB0byB0aGUgY2xhc3NwYXRoLl1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgICA8ZWxlbWVudCBuYW1lPSJqdm1hcmciIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkNvbW1hbmRsaW5lLkFyZ3VtZW50IgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIGEgSlZNIGFyZ3VtZW50Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtBZGRzIGEgSlZNIGFyZ3VtZW50Ll1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgPC9lbGVtZW50cz4KKworICA8L3N0cnVjdHVyZT4KKworPC90YXNrPgorCisKKzx0YXNrIG5hbWU9InRhciIgY2F0ZWdvcnk9InBhY2thZ2luZyIKKyAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuVGFyIgorICAgICAgbWF0Y2hpbmdUYXNrPSJ0cnVlIj4KKworICA8IS0tIHRhciB0YXNrIC0tPgorPGV4dGVybmFsPgorPGRlc2NyaXB0aW9uPgorPHA+Q3JlYXRlcyBhIHRhciBhcmNoaXZlLjwvcD4KKworPHA+VGhlIDxpPmJhc2VkaXI8L2k+IGF0dHJpYnV0ZSBpcyB0aGUgcmVmZXJlbmNlIGRpcmVjdG9yeSBmcm9tIHdoZXJlIHRvIHRhci48L3A+CisKKzxwPlRoaXMgdGFzayBpcyBhIDxhIGhyZWY9Ii4uL2RpcnRhc2tzLmh0bWwjZGlyZWN0b3J5YmFzZWR0YXNrcyI+ZGlyZWN0b3J5IGJhc2VkIHRhc2s8L2E+CithbmQsIGFzIHN1Y2gsIGZvcm1zIGFuIGltcGxpY2l0IDxhIGhyZWY9Ii4uL0NvcmVUeXBlcy9maWxlc2V0Lmh0bWwiPkZpbGVzZXQ8L2E+LiBUaGlzCitkZWZpbmVzIHdoaWNoIGZpbGVzLCByZWxhdGl2ZSB0byB0aGUgPGk+YmFzZWRpcjwvaT4sIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlCithcmNoaXZlLiBUaGUgdGFyIHRhc2sgc3VwcG9ydHMgYWxsIHRoZSBhdHRyaWJ1dGVzIG9mIEZpbGVzZXQgdG8gcmVmaW5lIHRoZQorc2V0IG9mIGZpbGVzIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBpbXBsaWNpdCBmaWxlc2V0LjwvcD4KKworPHA+SW4gYWRkaXRpb24gdG8gdGhlIGltcGxpY2l0IGZpbGVzZXQsIHRoZSB0YXIgdGFzayBzdXBwb3J0cyBuZXN0ZWQgZmlsZXNldHMuIFRoZXNlCitmaWxlc2V0cyBhcmUgZXh0ZW5kZWQgdG8gYWxsb3cgY29udHJvbCBvdmVyIHRoZSBhY2Nlc3MgbW9kZSwgdXNlcm5hbWUgYW5kIGdyb3VwbmFtZQordG8gYmUgYXBwbGllZCB0byB0aGUgdGFyIGVudHJpZXMuIFRoaXMgaXMgdXNlZnVsLCBmb3IgZXhhbXBsZSwgd2hlbiBwcmVwYXJpbmcgYXJjaGl2ZXMgZm9yCitVbml4IHN5c3RlbXMgd2hlcmUgc29tZSBmaWxlcyBuZWVkIHRvIGhhdmUgZXhlY3V0ZSBwZXJtaXNzaW9uLjwvcD4KKworPHA+RWFybHkgdmVyc2lvbnMgb2YgdGFyIGRpZCBub3Qgc3VwcG9ydCBwYXRoIGxlbmd0aHMgZ3JlYXRlciB0aGFuIDEwMAorY2hhcmFjdGVycy4gTW9kZXJuIHZlcnNpb25zIG9mIHRhciBkbyBzbywgYnV0IGluIGluY29tcGF0aWJsZSB3YXlzLgorVGhlIGJlaGF2aW91ciBvZiB0aGUgdGFyIHRhc2sgd2hlbiBpdCBlbmNvdW50ZXJzIHN1Y2ggcGF0aHMgaXMKK2NvbnRyb2xsZWQgYnkgdGhlIDxpPmxvbmdmaWxlPC9pPiBhdHRyaWJ1dGUuCitJZiB0aGUgbG9uZ2ZpbGUgYXR0cmlidXRlIGlzIHNldCB0byA8Y29kZT5mYWlsPC9jb2RlPiwgYW55IGxvbmcgcGF0aHMgd2lsbAorY2F1c2UgdGhlIHRhciB0YXNrIHRvIGZhaWwuICBJZiB0aGUgbG9uZ2ZpbGUgYXR0cmlidXRlIGlzIHNldCB0bworPGNvZGU+dHJ1bmNhdGU8L2NvZGU+LCBhbnkgbG9uZyBwYXRocyB3aWxsIGJlIHRydW5jYXRlZCB0byB0aGUgMTAwIGNoYXJhY3RlcgorbWF4aW11bSBsZW5ndGggcHJpb3IgdG8gYWRkaW5nIHRvIHRoZSBhcmNoaXZlLiBJZiB0aGUgdmFsdWUgb2YgdGhlIGxvbmdmaWxlCithdHRyaWJ1dGUgaXMgc2V0IHRvIDxjb2RlPm9taXQ8L2NvZGU+IHRoZW4gZmlsZXMgY29udGFpbmluZyBsb25nIHBhdGhzIHdpbGwgYmUKK29taXR0ZWQgZnJvbSB0aGUgYXJjaGl2ZS4gIEVpdGhlciBvcHRpb24gZW5zdXJlcyB0aGF0IHRoZSBhcmNoaXZlIGNhbiBiZQordW50YXJyZWQgYnkgYW55IGNvbXBsaWFudCB2ZXJzaW9uIG9mIHRhci4gSWYgdGhlIGxvc3Mgb2YgcGF0aCBvciBmaWxlCitpbmZvcm1hdGlvbiBpcyBub3QgYWNjZXB0YWJsZSwgYW5kIGl0IHJhcmVseSBpcywgbG9uZ2ZpbGUgbWF5IGJlIHNldCB0byB0aGUKK3ZhbHVlIDxjb2RlPmdudTwvY29kZT4uIFRoZSB0YXIgdGFzayB3aWxsIHRoZW4gcHJvZHVjZSBhIEdOVSB0YXIgZmlsZSB3aGljaAorY2FuIGhhdmUgYXJiaXRyYXJ5IGxlbmd0aCBwYXRocy4gTm90ZSBob3dldmVyLCB0aGF0IHRoZSByZXN1bHRpbmcgYXJjaGl2ZSB3aWxsCitvbmx5IGJlIGFibGUgdG8gYmUgdW50YXJyZWQgd2l0aCBHTlUgdGFyLiAgVGhlIGRlZmF1bHQgZm9yIHRoZSBsb25nZmlsZQorYXR0cmlidXRlIGlzIDxjb2RlPndhcm48L2NvZGU+IHdoaWNoIGJlaGF2ZXMganVzdCBsaWtlIHRoZSBnbnUgb3B0aW9uIGV4Y2VwdAordGhhdCBpdCBwcm9kdWNlcyBhIHdhcm5pbmcgZm9yIGVhY2ggZmlsZSBwYXRoIGVuY291bnRlcmVkIHRoYXQgZG9lcyBub3QgbWF0Y2gKK3RoZSBsaW1pdC48L3A+CisKKzxwPk5vdGUgdGhhdCB0aGlzIHRhc2sgZG9lcyBub3QgcGVyZm9ybSBjb21wcmVzc2lvbi4gWW91IG1pZ2h0IHdhbnQgdG8gdXNlIHRoZQorPGEgaHJlZj0iZ3ppcC5odG1sIj5HWmlwPC9hPiB0YXNrIHRvIHByZXBhcmUgYSAudGFyLmd6IHBhY2thZ2UuPC9wPgorPC9kZXNjcmlwdGlvbj4KKworPHNlY3Rpb24gYW5jaG9yPSJleGFtcGxlcyIgbmFtZT0iRXhhbXBsZXMiPgorPHByZT4gICZsdDt0YXIgdGFyZmlsZT0mcXVvdDske2Rpc3R9L21hbnVhbC50YXImcXVvdDsgYmFzZWRpcj0mcXVvdDtodGRvY3MvbWFudWFsJnF1b3Q7LyZndDsKKyAgJmx0O2d6aXAgemlwZmlsZT0mcXVvdDske2Rpc3R9L21hbnVhbC50YXIuZ3omcXVvdDsgc3JjPSZxdW90OyR7ZGlzdH0vbWFudWFsLnRhciZxdW90Oy8mZ3Q7PC9wcmU+Cis8cD50YXJzIGFsbCBmaWxlcyBpbiB0aGUgPGNvZGU+aHRkb2NzL21hbnVhbDwvY29kZT4gZGlyZWN0b3J5IGludG8gYSBmaWxlIGNhbGxlZCA8Y29kZT5tYW51YWwudGFyPC9jb2RlPgoraW4gdGhlIDxjb2RlPiR7ZGlzdH08L2NvZGU+ICBkaXJlY3RvcnksIHRoZW4gYXBwbGllcyB0aGUgZ3ppcCB0YXNrIHRvIGNvbXByZXNzCitpdC48L3A+Cis8cHJlPiAgJmx0O3RhciBkZXN0ZmlsZT0mcXVvdDske2Rpc3R9L21hbnVhbC50YXImcXVvdDsKKyAgICAgICBiYXNlZGlyPSZxdW90O2h0ZG9jcy9tYW51YWwmcXVvdDsKKyAgICAgICBleGNsdWRlcz0mcXVvdDtteWRvY3MvKiosICoqL3RvZG8uaHRtbCZxdW90OworICAvJmd0OzwvcHJlPgorPHA+dGFycyBhbGwgZmlsZXMgaW4gdGhlIDxjb2RlPmh0ZG9jcy9tYW51YWw8L2NvZGU+IGRpcmVjdG9yeSBpbnRvIGEgZmlsZSBjYWxsZWQgPGNvZGU+bWFudWFsLnRhcjwvY29kZT4KK2luIHRoZSA8Y29kZT4ke2Rpc3R9PC9jb2RlPiBkaXJlY3RvcnkuIEZpbGVzIGluIHRoZSBkaXJlY3RvcnkgPGNvZGU+bXlkb2NzPC9jb2RlPiwKK29yIGZpbGVzIHdpdGggdGhlIG5hbWUgPGNvZGU+dG9kby5odG1sPC9jb2RlPiBhcmUgZXhjbHVkZWQuPC9wPgorCis8cHJlPgorJmx0O3RhciBkZXN0ZmlsZT0mcXVvdDske2Jhc2VkaXJ9L2RvY3MudGFyJnF1b3Q7Jmd0OworICAmbHQ7dGFyZmlsZXNldCBkaXI9JnF1b3Q7JHtkaXIuc3JjfS9kb2NzJnF1b3Q7CisgICAgICAgICAgICAgIGZ1bGxwYXRoPSZxdW90Oy91c3IvZG9jL2FudC9SRUFETUUmcXVvdDsKKyAgICAgICAgICAgICAgcHJlc2VydmVMZWFkaW5nU2xhc2hlcz0mcXVvdDt0cnVlJnF1b3Q7Jmd0OworICAgICZsdDtpbmNsdWRlIG5hbWU9JnF1b3Q7cmVhZG1lLnR4dCZxdW90Oy8mZ3Q7CisgICZsdDsvdGFyZmlsZXNldCZndDsKKyAgJmx0O3RhcmZpbGVzZXQgZGlyPSZxdW90OyR7ZGlyLnNyY30vZG9jcyZxdW90OworICAgICAgICAgICAgICBwcmVmaXg9JnF1b3Q7L3Vzci9kb2MvYW50JnF1b3Q7CisgICAgICAgICAgICAgIHByZXNlcnZlTGVhZGluZ1NsYXNoZXM9JnF1b3Q7dHJ1ZSZxdW90OyZndDsKKyAgICAmbHQ7aW5jbHVkZSBuYW1lPSZxdW90OyouaHRtbCZxdW90Oy8mZ3Q7CisgICZsdDsvdGFyZmlsZXNldCZndDsKKyZsdDsvdGFyJmd0OzwvcHJlPgorCis8cD4KKyAgV3JpdGVzIHRoZSBmaWxlIDxjb2RlPmRvY3MvcmVhZG1lLnR4dDwvY29kZT4gYXMKKyAgPGNvZGU+L3Vzci9kb2MvYW50L1JFQURNRTwvY29kZT4gaW50byB0aGUgYXJjaGl2ZS4gQWxsCisgIDxjb2RlPiouaHRtbDwvY29kZT4gZmlsZXMgaW4gdGhlIDxjb2RlPmRvY3M8L2NvZGU+IGRpcmVjdG9yeSBhcmUKKyAgcHJlZml4ZWQgYnkgPGNvZGU+L3Vzci9kb2MvYW50PC9jb2RlPiwgc28gZm9yIGV4YW1wbGUKKyAgPGNvZGU+ZG9jcy9pbmRleC5odG1sPC9jb2RlPiBpcyB3cml0dGVuIGFzCisgIDxjb2RlPi91c3IvZG9jL2FudC9pbmRleC5odG1sPC9jb2RlPiB0byB0aGUgYXJjaGl2ZS4KKzwvcD4KKworPHByZT4mbHQ7dGFyIGxvbmdmaWxlPSZxdW90O2dudSZxdW90OworICAgICBkZXN0ZmlsZT0mcXVvdDske2Rpc3QuYmFzZX0vJHtkaXN0Lm5hbWV9LXNyYy50YXImcXVvdDsgJmd0OworICAmbHQ7dGFyZmlsZXNldCBkaXI9JnF1b3Q7JHtkaXN0Lm5hbWV9Ly4uJnF1b3Q7IG1vZGU9JnF1b3Q7NzU1JnF1b3Q7IHVzZXJuYW1lPSZxdW90O2FudCZxdW90OyBncm91cD0mcXVvdDthbnQmcXVvdDsmZ3Q7CisgICAgJmx0O2luY2x1ZGUgbmFtZT0mcXVvdDske2Rpc3QubmFtZX0vYm9vdHN0cmFwLnNoJnF1b3Q7LyZndDsKKyAgICAmbHQ7aW5jbHVkZSBuYW1lPSZxdW90OyR7ZGlzdC5uYW1lfS9idWlsZC5zaCZxdW90Oy8mZ3Q7CisgICZsdDsvdGFyZmlsZXNldCZndDsKKyAgJmx0O3RhcmZpbGVzZXQgZGlyPSZxdW90OyR7ZGlzdC5uYW1lfS8uLiZxdW90OyB1c2VybmFtZT0mcXVvdDthbnQmcXVvdDsgZ3JvdXA9JnF1b3Q7YW50JnF1b3Q7Jmd0OworICAgICZsdDtpbmNsdWRlIG5hbWU9JnF1b3Q7JHtkaXN0Lm5hbWV9LyoqJnF1b3Q7LyZndDsKKyAgICAmbHQ7ZXhjbHVkZSBuYW1lPSZxdW90OyR7ZGlzdC5uYW1lfS9ib290c3RyYXAuc2gmcXVvdDsvJmd0OworICAgICZsdDtleGNsdWRlIG5hbWU9JnF1b3Q7JHtkaXN0Lm5hbWV9L2J1aWxkLnNoJnF1b3Q7LyZndDsKKyAgJmx0Oy90YXJmaWxlc2V0Jmd0OworJmx0Oy90YXImZ3Q7IDwvcHJlPgorCis8cD5UaGlzIGV4YW1wbGUgc2hvd3MgYnVpbGRpbmcgYSB0YXIgd2hpY2ggdXNlcyB0aGUgR05VIGV4dGVuc2lvbnMgZm9yIGxvbmcgcGF0aHMgYW5kCit3aGVyZSBzb21lIGZpbGVzIG5lZWQgdG8gYmUgbWFya2VkIGFzIGV4ZWN1dGFibGUgKG1vZGUgNzU1KQorYW5kIHRoZSByZXN0IGFyZSB1c2UgdGhlIGRlZmF1bHQgbW9kZSAocmVhZC13cml0ZSBieSBvd25lcikuIFRoZSBmaXJzdAorZmlsZXNldCBzZWxlY3RzIGp1c3QgdGhlIGV4ZWN1dGFibGUgZmlsZXMuIFRoZSBzZWNvbmQgZmlsZXNldCBtdXN0IGV4Y2x1ZGUKK3RoZSBleGVjdXRhYmxlIGZpbGVzIGFuZCBpbmNsdWRlIGFsbCBvdGhlcnMuIDwvcD4KKworPHA+PHN0cm9uZz5Ob3RlOiA8L3N0cm9uZz4gVGhlIHRhciB0YXNrIGRvZXMgbm90IGVuc3VyZSB0aGF0IGEgZmlsZSBpcyBvbmx5IHNlbGVjdGVkCitieSBvbmUgZmlsZXNldC4gSWYgdGhlIHNhbWUgZmlsZSBpcyBzZWxlY3RlZCBieSBtb3JlIHRoYW4gb25lIGZpbGVzZXQsIGl0IHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlCit0YXIgZmlsZSB0d2ljZSwgd2l0aCB0aGUgc2FtZSBwYXRoLjwvcD4KKworPHA+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBUaGUgcGF0dGVybnMgaW4gdGhlIGluY2x1ZGUgYW5kIGV4Y2x1ZGUKK2VsZW1lbnRzIGFyZSBjb25zaWRlcmVkIHRvIGJlIHJlbGF0aXZlIHRvIHRoZSBjb3JyZXNwb25kaW5nIGRpcgorYXR0cmlidXRlIGFzIHdpdGggYWxsIG90aGVyIGZpbGVzZXRzLiAgSW4gdGhlIGV4YW1wbGUgYWJvdmUsCis8Y29kZT4ke2Rpc3QubmFtZX08L2NvZGU+IGlzIG5vdCBhbiBhYnNvbHV0ZSBwYXRoLCBidXQgYSBzaW1wbGUgbmFtZQorb2YgYSBkaXJlY3RvcnksIHNvIDxjb2RlPiR7ZGlzdC5uYW1lfTwvY29kZT4gaXMgYSB2YWxpZCBwYXRoIHJlbGF0aXZlCit0byA8Y29kZT4ke2Rpc3QubmFtZX0vLi48L2NvZGU+LjwvcD4KKworPC9zZWN0aW9uPgorPC9leHRlcm5hbD4KKworICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ3JlYXRlcyBhIHRhciBhcmNoaXZlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgIDxkZXNjcmlwdGlvbj4KKyAgICA8IVtDREFUQVtDcmVhdGVzIGEgdGFyIGFyY2hpdmUuXV0+CisgIDwvZGVzY3JpcHRpb24+CisKKyAgPHN0cnVjdHVyZT4KKworICAgIDxhdHRyaWJ1dGVzPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJiYXNlZGlyIiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhpcyBpcyB0aGUgYmFzZSBkaXJlY3RvcnkgdG8gbG9vayBpbiBmb3IgdGhpbmdzIHRvIHRhci5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgVGhpcyBpcyB0aGUgYmFzZSBkaXJlY3RvcnkgdG8gbG9vayBpbiBmb3IgdGhpbmdzIHRvIHRhci4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb21wcmVzc2lvbiIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuVGFyLlRhckNvbXByZXNzaW9uTWV0aG9kIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IiZxdW90O25vbmUmcXVvdDssICZxdW90O2d6aXAmcXVvdDssICZxdW90O2J6aXAyJnF1b3Q7IiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTZXQgY29tcHJlc3Npb24gbWV0aG9kLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgY29tcHJlc3Npb24gbWV0aG9kLgorIEFsbG93YWJsZSB2YWx1ZXMgYXJlCisgPHVsPgorIDxsaT4gIG5vbmUgLSBubyBjb21wcmVzc2lvbgorIDxsaT4gIGd6aXAgLSBHemlwIGNvbXByZXNzaW9uCisgPGxpPiAgYnppcDIgLSBCemlwMiBjb21wcmVzc2lvbgorIDwvdWw+CisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVzdGZpbGUiIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTZXQgaXMgdGhlIG5hbWUvbG9jYXRpb24gb2Ygd2hlcmUgdG8gY3JlYXRlIHRoZSB0YXIgZmlsZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IGlzIHRoZSBuYW1lL2xvY2F0aW9uIG9mIHdoZXJlIHRvIGNyZWF0ZSB0aGUgdGFyIGZpbGUuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibG9uZ2ZpbGUiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlRhci5UYXJMb25nRmlsZU1vZGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iJnF1b3Q7d2FybiZxdW90OywgJnF1b3Q7ZmFpbCZxdW90OywgJnF1b3Q7dHJ1bmNhdGUmcXVvdDssICZxdW90O2dudSZxdW90OywgJnF1b3Q7b21pdCZxdW90OyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2V0IGhvdyB0byBoYW5kbGUgbG9uZyBmaWxlcywgdGhvc2Ugd2l0aCBhIHBhdGgmZ3Q7MTAwIGNoYXJzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgaG93IHRvIGhhbmRsZSBsb25nIGZpbGVzLCB0aG9zZSB3aXRoIGEgcGF0aCZndDsxMDAgY2hhcnMuCisgT3B0aW9uYWwsIGRlZmF1bHQ9d2Fybi4KKyA8cD4KKyBBbGxvd2FibGUgdmFsdWVzIGFyZQorIDx1bD4KKyA8bGk+ICB0cnVuY2F0ZSAtIHBhdGhzIGFyZSB0cnVuY2F0ZWQgdG8gdGhlIG1heGltdW0gbGVuZ3RoCisgPGxpPiAgZmFpbCAtIHBhdGhzIGdyZWF0ZXIgdGhhbiB0aGUgbWF4aW1pbSBjYXVzZSBhIGJ1aWxkIGV4Y2VwdGlvbgorIDxsaT4gIHdhcm4gLSBwYXRocyBncmVhdGVyIHRoYW4gdGhlIG1heGltdW0gY2F1c2UgYSB3YXJuaW5nIGFuZCBHTlUgaXMgdXNlZAorIDxsaT4gIGdudSAtIEdOVSBleHRlbnNpb25zIGFyZSB1c2VkIGZvciBhbnkgcGF0aHMgZ3JlYXRlciB0aGFuIHRoZSBtYXhpbXVtLgorIDxsaT4gIG9taXQgLSBwYXRocyBncmVhdGVyIHRoYW4gdGhlIG1heGltdW0gYXJlIG9taXR0ZWQgZnJvbSB0aGUgYXJjaGl2ZQorIDwvdWw+CisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICA8L2F0dHJpYnV0ZXM+CisKKyAgICA8ZWxlbWVudHM+CisgICAgICA8ZWxlbWVudCBuYW1lPSJ0YXJmaWxlc2V0IiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5UYXIuVGFyRmlsZVNldCIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkIGEgbmV3IGZpbGVzZXQgd2l0aCB0aGUgb3B0aW9uIHRvIHNwZWNpZnkgcGVybWlzc2lvbnMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0FkZCBhIG5ldyBmaWxlc2V0IHdpdGggdGhlIG9wdGlvbiB0byBzcGVjaWZ5IHBlcm1pc3Npb25zXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICA8L2VsZW1lbnRzPgorCisgIDwvc3RydWN0dXJlPgorCis8L3Rhc2s+CisKKworPHRhc2sgbmFtZT0idGFza2RlZiIgY2F0ZWdvcnk9ImludGVybmFsIgorICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5UYXNrZGVmIgorICAgICAgPgorCisgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIGEgdGFzayBkZWZpbml0aW9uIHRvIHRoZSBjdXJyZW50IHByb2plY3QsIHN1Y2ggdGhhdCB0aGlzIG5ldyB0YXNrIGNhbiBiZSB1c2VkIGluIHRoZSBjdXJyZW50IHByb2plY3QuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgPGRlc2NyaXB0aW9uPgorICAgIDwhW0NEQVRBW0FkZHMgYSB0YXNrIGRlZmluaXRpb24gdG8gdGhlIGN1cnJlbnQgcHJvamVjdCwgc3VjaCB0aGF0IHRoaXMgbmV3IHRhc2sgY2FuIGJlCisgdXNlZCBpbiB0aGUgY3VycmVudCBwcm9qZWN0LiBUd28gYXR0cmlidXRlcyBhcmUgbmVlZGVkLCB0aGUgbmFtZSB0aGF0IGlkZW50aWZpZXMKKyB0aGlzIHRhc2sgdW5pcXVlbHksIGFuZCB0aGUgZnVsbCBuYW1lIG9mIHRoZSBjbGFzcyAoaW5jbHVkaW5nIHRoZSBwYWNrYWdlcykgdGhhdAorIGltcGxlbWVudHMgdGhpcyB0YXNrLjwvcD4KKyA8cD5Zb3UgY2FuIGFsc28gZGVmaW5lIGEgZ3JvdXAgb2YgdGFza3MgYXQgb25jZSB1c2luZyB0aGUgZmlsZSBvcgorIHJlc291cmNlIGF0dHJpYnV0ZXMuICBUaGVzZSBhdHRyaWJ1dGVzIHBvaW50IHRvIGZpbGVzIGluIHRoZSBmb3JtYXQgb2YKKyBKYXZhIHByb3BlcnR5IGZpbGVzLiAgRWFjaCBsaW5lIGRlZmluZXMgYSBzaW5nbGUgdGFzayBpbiB0aGUKKyBmb3JtYXQ6PC9wPgorIDxwcmU+CisgdGFza25hbWU9ZnVsbHkucXVhbGlmaWVkLmphdmEuY2xhc3NuYW1lCisgPC9wcmU+XV0+CisgIDwvZGVzY3JpcHRpb24+CisKKyAgPHN0cnVjdHVyZT4KKworICAgIDxhdHRyaWJ1dGVzPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc25hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgZnVsbCBjbGFzcyBuYW1lIG9mIHRoZSBvYmplY3QgYmVpbmcgZGVmaW5lZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgdGhlIGZ1bGwgY2xhc3MgbmFtZSBvZiB0aGUgb2JqZWN0IGJlaW5nIGRlZmluZWQuCisgUmVxdWlyZWQsIHVubGVzcyBmaWxlIG9yIHJlc291cmNlIGhhdmUKKyBiZWVuIHNwZWNpZmllZC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc3BhdGgiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUGF0aCIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ2xhc3NwYXRoIHRvIGJlIHVzZWQgd2hlbiBzZWFyY2hpbmcgZm9yIGNvbXBvbmVudCBiZWluZyBkZWZpbmVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIGNsYXNzcGF0aCB0byBiZSB1c2VkIHdoZW4gc2VhcmNoaW5nIGZvciBjb21wb25lbnQgYmVpbmcgZGVmaW5lZAorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzcGF0aHJlZiIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVmZXJlbmNlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlJlZmVyZW5jZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbUmVmZXJlbmNlIHRvIGEgY2xhc3NwYXRoIHRvIHVzZSB3aGVuIGxvYWRpbmcgdGhlIGZpbGVzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICByZWZlcmVuY2UgdG8gYSBjbGFzc3BhdGggdG8gdXNlIHdoZW4gbG9hZGluZyB0aGUgZmlsZXMuCisgVG8gYWN0dWFsbHkgc2hhcmUgdGhlIHNhbWUgbG9hZGVyLCBzZXQgbG9hZGVycmVmIGFzIHdlbGwKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmaWxlIiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTmFtZSBvZiB0aGUgcHJvcGVydHkgZmlsZSAgdG8gbG9hZAorIGFudCBuYW1lL2NsYXNzbmFtZSBwYWlycyBmcm9tLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBOYW1lIG9mIHRoZSBwcm9wZXJ0eSBmaWxlICB0byBsb2FkCisgYW50IG5hbWUvY2xhc3NuYW1lIHBhaXJzIGZyb20uCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibG9hZGVycmVmIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZWZlcmVuY2UiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUmVmZXJlbmNlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtVc2UgdGhlIHJlZmVyZW5jZSB0byBsb2NhdGUgdGhlIGxvYWRlci5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgVXNlIHRoZSByZWZlcmVuY2UgdG8gbG9jYXRlIHRoZSBsb2FkZXIuIElmIHRoZSBsb2FkZXIgaXMgbm90CisgZm91bmQsIHRhc2tkZWYgd2lsbCB1c2UgdGhlIHNwZWNpZmllZCBjbGFzc3BhdGggYW5kIHJlZ2lzdGVyIGl0Cisgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCisgVGhpcyBhbGxvdyBtdWx0aXBsZSB0YXNrZGVmL3R5cGVkZWYgdG8gdXNlIHRoZSBzYW1lIGNsYXNzIGxvYWRlciwKKyBzbyB0aGV5IGNhbiBiZSB1c2VkIHRvZ2V0aGVyLiBJdCBlbGltaW5hdGUgdGhlIG5lZWQgdG8KKyBwdXQgdGhlbSBpbiB0aGUgQ0xBU1NQQVRILgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtOYW1lIG9mIHRoZSBwcm9wZXJ0eSByZXNvdXJjZSB0byBsb2FkCisgYW50IG5hbWUvY2xhc3NuYW1lIHBhaXJzIGZyb20uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIE5hbWUgb2YgdGhlIHByb3BlcnR5IHJlc291cmNlIHRvIGxvYWQKKyBhbnQgbmFtZS9jbGFzc25hbWUgcGFpcnMgZnJvbS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJyZXNvdXJjZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW05hbWUgb2YgdGhlIHByb3BlcnR5IHJlc291cmNlIHRvIGxvYWQKKyBhbnQgbmFtZS9jbGFzc25hbWUgcGFpcnMgZnJvbS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgTmFtZSBvZiB0aGUgcHJvcGVydHkgcmVzb3VyY2UgdG8gbG9hZAorIGFudCBuYW1lL2NsYXNzbmFtZSBwYWlycyBmcm9tLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgPC9hdHRyaWJ1dGVzPgorCisgICAgPGVsZW1lbnRzPgorICAgICAgPGVsZW1lbnQgbmFtZT0iY2xhc3NwYXRoIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoIgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJQYXRoIgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ3JlYXRlIHRoZSBjbGFzc3BhdGggdG8gYmUgdXNlZCB3aGVuIHNlYXJjaGluZyBmb3IgY29tcG9uZW50IGJlaW5nIGRlZmluZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0NyZWF0ZSB0aGUgY2xhc3NwYXRoIHRvIGJlIHVzZWQgd2hlbiBzZWFyY2hpbmcgZm9yIGNvbXBvbmVudCBiZWluZyBkZWZpbmVkXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICA8L2VsZW1lbnRzPgorCisgIDwvc3RydWN0dXJlPgorCis8L3Rhc2s+CisKKworPHRhc2sgbmFtZT0idGVsbmV0IiBjYXRlZ29yeT0ib3RoZXIiCisgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLm5ldC5UZWxuZXRUYXNrIgorICAgICAgPgorCisgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBdXRvbWF0ZXMgdGhlIHRlbG5ldCBwcm90b2NvbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICA8ZGVzY3JpcHRpb24+CisgICAgPCFbQ0RBVEFbQXV0b21hdGVzIHRoZSB0ZWxuZXQgcHJvdG9jb2wuXV0+CisgIDwvZGVzY3JpcHRpb24+CisKKyAgPHN0cnVjdHVyZT4KKworICAgIDxhdHRyaWJ1dGVzPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpbml0aWFsY3IiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2VuZCBhIGNhcnJpYWdlIHJldHVybiBhZnRlciBjb25uZWN0aW5nOyBvcHRpb25hbCwgZGVmYXVsdHMgdG8gZmFsc2UuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIHNlbmQgYSBjYXJyaWFnZSByZXR1cm4gYWZ0ZXIgY29ubmVjdGluZzsgb3B0aW9uYWwsIGRlZmF1bHRzIHRvIGZhbHNlLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InBhc3N3b3JkIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGxvZ2luIHBhc3N3b3JkIHRvIHVzZQorIHJlcXVpcmVkIGlmIDx0dD51c2VyaWQ8L3R0PiBpcyBzZXQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCB0aGUgdGhlIGxvZ2luIHBhc3N3b3JkIHRvIHVzZQorIHJlcXVpcmVkIGlmIDx0dD51c2VyaWQ8L3R0PiBpcyBzZXQuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9ydCIgdHlwZT0iaW50IgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImludCIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGNwIHBvcnQgdG8gY29ubmVjdCB0bzsgZGVmYXVsdCBpcyAyMy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSB0Y3AgcG9ydCB0byBjb25uZWN0IHRvOyBkZWZhdWx0IGlzIDIzLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InNlcnZlciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0hvc3RuYW1lIG9yIGFkZHJlc3Mgb2YgdGhlIHJlbW90ZSBzZXJ2ZXIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCB0aGUgaG9zdG5hbWUgb3IgYWRkcmVzcyBvZiB0aGUgcmVtb3RlIHNlcnZlci4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0aW1lb3V0IiB0eXBlPSJqYXZhLmxhbmcuSW50ZWdlciIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJpbnQiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0RlZmF1bHQgdGltZW91dCBpbiBzZWNvbmRzIHRvIHdhaXQgZm9yIGEgcmVzcG9uc2UsIAorIHplcm8gbWVhbnMgZm9yZXZlciAodGhlIGRlZmF1bHQpLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBzZXQgYSBkZWZhdWx0IHRpbWVvdXQgaW4gc2Vjb25kcyB0byB3YWl0IGZvciBhIHJlc3BvbnNlLCAKKyB6ZXJvIG1lYW5zIGZvcmV2ZXIgKHRoZSBkZWZhdWx0KQorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InVzZXJpZCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBsb2dpbiBpZCB0byB1c2Ugb24gdGhlIHNlcnZlcjsgCisgcmVxdWlyZWQgaWYgPHR0PnBhc3N3b3JkPC90dD4gaXMgc2V0Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIHRoZSBsb2dpbiBpZCB0byB1c2Ugb24gdGhlIHNlcnZlcjsgCisgcmVxdWlyZWQgaWYgPHR0PnBhc3N3b3JkPC90dD4gaXMgc2V0LgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgPC9hdHRyaWJ1dGVzPgorCisgICAgPGVsZW1lbnRzPgorICAgICAgPGVsZW1lbnQgbmFtZT0icmVhZCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwubmV0LlRlbG5ldFRhc2suVGVsbmV0U3ViVGFzayIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQSBzdHJpbmcgdG8gd2FpdCBmb3IgZnJvbSB0aGUgc2VydmVyLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtBIHN0cmluZyB0byB3YWl0IGZvciBmcm9tIHRoZSBzZXJ2ZXIuIAorICBBIHN1YlRhc2sgJmx0O3JlYWQmZ3Q7IHRhZyB3YXMgZm91bmQuICBDcmVhdGUgdGhlIG9iamVjdCwgCisgIFNhdmUgaXQgaW4gb3VyIGxpc3QsIGFuZCByZXR1cm4gaXQuXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICAgIDxlbGVtZW50IG5hbWU9IndyaXRlIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5uZXQuVGVsbmV0VGFzay5UZWxuZXRTdWJUYXNrIgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGQgdGV4dCB0byBzZW5kIHRvIHRoZSBzZXJ2ZXIKKyAgQSBzdWJUYXNrICZsdDt3cml0ZSZndDsgdGFnIHdhcyBmb3VuZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbQWRkIHRleHQgdG8gc2VuZCB0byB0aGUgc2VydmVyCisgIEEgc3ViVGFzayAmbHQ7d3JpdGUmZ3Q7IHRhZyB3YXMgZm91bmQuICBDcmVhdGUgdGhlIG9iamVjdCwgCisgIFNhdmUgaXQgaW4gb3VyIGxpc3QsIGFuZCByZXR1cm4gaXQuXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICA8L2VsZW1lbnRzPgorCisgIDwvc3RydWN0dXJlPgorCis8L3Rhc2s+CisKKworPHRhc2sgbmFtZT0idGVtcGZpbGUiIGNhdGVnb3J5PSJvdGhlciIKKyAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuVGVtcEZpbGUiCisgICAgICA+CisKKyAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoaXMgdGFzayBzZXRzIGEgcHJvcGVydHkgdG8gIHRoZSBuYW1lIG9mIGEgdGVtcG9yYXJ5IGZpbGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgPGRlc2NyaXB0aW9uPgorICAgIDwhW0NEQVRBW1RoaXMgdGFzayBzZXRzIGEgcHJvcGVydHkgdG8gIHRoZSBuYW1lIG9mIGEgdGVtcG9yYXJ5IGZpbGUuIAorICBVbmxpa2UgdGhlIEphdmExLjIgbWV0aG9kIHRvIGNyZWF0ZSBhIHRlbXBvcmFyeSBmaWxlLCB0aGlzIHRhc2sKKyAgZG9lcyB3b3JrIG9uIEphdmExLjEuIEFsc28sIGl0IGRvZXMgbm90IGFjdHVhbGx5IGNyZWF0ZSB0aGUKKyAgdGVtcG9yYXJ5IGZpbGUsIGJ1dCBpdCBkb2VzIGd1YXJhbnRlZSB0aGF0IHRoZSBmaWxlIGRpZCBub3QKKyAgZXhpc3Qgd2hlbiB0aGUgdGFzayB3YXMgZXhlY3V0ZWQuIAorIDxwPiAgCisgRXhhbXBsZXMKKyA8cHJlPiZsdDt0ZW1wZmlsZSBwcm9wZXJ0eT0idGVtcC5maWxlIiAvJmd0OzwvcHJlPgorIGNyZWF0ZSBhIHRlbXBvcmFyeSBmaWxlCisgPHByZT4mbHQ7dGVtcGZpbGUgcHJvcGVydHk9InRlbXAuZmlsZSIgc3VmZml4PSIueG1sIiAvJmd0OzwvcHJlPgorIGNyZWF0ZSBhIHRlbXBvcmFyeSBmaWxlIHdpdGggdGhlIC54bWwgc3VmZml4LgorIDxwcmU+Jmx0O3RlbXBmaWxlIHByb3BlcnR5PSJ0ZW1wLmZpbGUiIGRlc3REaXI9ImJ1aWxkIi8mZ3Q7PC9wcmU+CisgY3JlYXRlIGEgdGVtcCBmaWxlIGluIHRoZSBidWlsZCBzdWJkaXJdXT4KKyAgPC9kZXNjcmlwdGlvbj4KKworICA8c3RydWN0dXJlPgorCisgICAgPGF0dHJpYnV0ZXM+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlc3RkaXIiIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtEZXN0aW5hdGlvbiBkaXJlY3RvcnkuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIGRlc3RpbmF0aW9uIGRpcmVjdG9yeS4gSWYgbnVsbCwgCit0aGUgcGFyZW50IGRpcmVjdG9yeSBpcyB1c2VkIGluc3RlYWQKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwcmVmaXgiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtPcHRpb25hbCBwcmVmaXggc3RyaW5nLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBvcHRpb25hbCBwcmVmaXggc3RyaW5nCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icHJvcGVydHkiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgcHJvcGVydHkgeW91IHdpc2ggdG8gYXNzaWduIHRoZSB0ZW1wb3JhcnkgZmlsZSB0by5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgVGhlIHByb3BlcnR5IHlvdSB3aXNoIHRvIGFzc2lnbiB0aGUgdGVtcG9yYXJ5IGZpbGUgdG8KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzdWZmaXgiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTdWZmaXggc3RyaW5nIGZvciB0aGUgdGVtcCBmaWxlIChvcHRpb25hbCkuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFN1ZmZpeCBzdHJpbmcgZm9yIHRoZSB0ZW1wIGZpbGUgKG9wdGlvbmFsKQorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgPC9hdHRyaWJ1dGVzPgorCisgICAgPGVsZW1lbnRzPgorICAgIDwvZWxlbWVudHM+CisKKyAgPC9zdHJ1Y3R1cmU+CisKKzwvdGFzaz4KKworCis8dGFzayBuYW1lPSJ0b3VjaCIgY2F0ZWdvcnk9ImZpbGVzeXN0ZW0iCisgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlRvdWNoIgorICAgICAgPgorCisgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUb3VjaCBhIGZpbGUgYW5kL29yIGZpbGVzZXQocyk7IGNvcnJlc3BvbmRzIHRvIHRoZSBVbml4IHRvdWNoIGNvbW1hbmQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgPGRlc2NyaXB0aW9uPgorICAgIDwhW0NEQVRBW1RvdWNoIGEgZmlsZSBhbmQvb3IgZmlsZXNldChzKTsgY29ycmVzcG9uZHMgdG8gdGhlIFVuaXggdG91Y2ggY29tbWFuZC4KKworIDxwPklmIHRoZSBmaWxlIHRvIHRvdWNoIGRvZXNuJ3QgZXhpc3QsIGFuIGVtcHR5IG9uZSBpcworIGNyZWF0ZWQuIDwvcD4KKworIDxwPk5vdGU6IFNldHRpbmcgdGhlIG1vZGlmaWNhdGlvbiB0aW1lIG9mIGZpbGVzIGlzIG5vdCBzdXBwb3J0ZWQgaW4KKyBKREsgMS4xLjwvcD5dXT4KKyAgPC9kZXNjcmlwdGlvbj4KKworICA8c3RydWN0dXJlPgorCisgICAgPGF0dHJpYnV0ZXM+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImRhdGV0aW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIG5ldyBtb2RpZmljYXRpb24gdGltZSBvZiB0aGUgZmlsZQorIGluIHRoZSBmb3JtYXQgTU0vREQvWVlZWSBISDpNTSBBTSA8aT5vcjwvaT4gUE07CisgT3B0aW9uYWwsIGRlZmF1bHQ9bm93Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICB0aGUgbmV3IG1vZGlmaWNhdGlvbiB0aW1lIG9mIHRoZSBmaWxlCisgaW4gdGhlIGZvcm1hdCBNTS9ERC9ZWVlZIEhIOk1NIEFNIDxpPm9yPC9pPiBQTTsKKyBPcHRpb25hbCwgZGVmYXVsdD1ub3cKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmaWxlIiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2luZ2xlIHNvdXJjZSBmaWxlIHRvIHRvdWNoLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXRzIGEgc2luZ2xlIHNvdXJjZSBmaWxlIHRvIHRvdWNoLiAgSWYgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QKKyBhbiBlbXB0eSBmaWxlIHdpbGwgYmUgY3JlYXRlZC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJtaWxsaXMiIHR5cGU9ImxvbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0ibG9uZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIG5ldyBtb2RpZmljYXRpb24gdGltZSBvZiB0aGUgZmlsZQorIGluIG1pbGxpc2Vjb25kcyBzaW5jZSBtaWRuaWdodCBKYW4gMSAxOTcwLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICB0aGUgbmV3IG1vZGlmaWNhdGlvbiB0aW1lIG9mIHRoZSBmaWxlCisgaW4gbWlsbGlzZWNvbmRzIHNpbmNlIG1pZG5pZ2h0IEphbiAxIDE5NzAuCisgT3B0aW9uYWwsIGRlZmF1bHQ9bm93CisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICA8L2F0dHJpYnV0ZXM+CisKKyAgICA8ZWxlbWVudHM+CisgICAgICA8ZWxlbWVudCBuYW1lPSJmaWxlc2V0IiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0IgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlc2V0IgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkIGEgc2V0IG9mIGZpbGVzIHRvIHRvdWNoLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtBZGQgYSBzZXQgb2YgZmlsZXMgdG8gdG91Y2hdXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgIDwvZWxlbWVudHM+CisKKyAgPC9zdHJ1Y3R1cmU+CisKKzwvdGFzaz4KKworCis8dGFzayBuYW1lPSJ0cmFuc2xhdGUiIGNhdGVnb3J5PSJvdGhlciIKKyAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuaTE4bi5UcmFuc2xhdGUiCisgICAgICBtYXRjaGluZ1Rhc2s9InRydWUiPgorCisgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUcmFuc2xhdGVzIHRleHQgZW1iZWRkZWQgaW4gZmlsZXMgdXNpbmcgUmVzb3VyY2UgQnVuZGxlIGZpbGVzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgIDxkZXNjcmlwdGlvbj4KKyAgICA8IVtDREFUQVtUcmFuc2xhdGVzIHRleHQgZW1iZWRkZWQgaW4gZmlsZXMgdXNpbmcgUmVzb3VyY2UgQnVuZGxlIGZpbGVzLl1dPgorICA8L2Rlc2NyaXB0aW9uPgorCisgIDxzdHJ1Y3R1cmU+CisKKyAgICA8YXR0cmlidXRlcz4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYnVuZGxlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2V0cyBGYW1pbHkgbmFtZSBvZiByZXNvdXJjZSBidW5kbGU7IHJlcXVpcmVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXRzIEZhbWlseSBuYW1lIG9mIHJlc291cmNlIGJ1bmRsZTsgcmVxdWlyZWQuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYnVuZGxlY291bnRyeSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NldHMgbG9jYWxlIHNwZWNpZmljIGNvdW50cnkgb2YgcmVzb3VyY2UgYnVuZGxlOyBvcHRpb25hbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0cyBsb2NhbGUgc3BlY2lmaWMgY291bnRyeSBvZiByZXNvdXJjZSBidW5kbGU7IG9wdGlvbmFsLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImJ1bmRsZWVuY29kaW5nIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2V0cyBSZXNvdXJjZSBCdW5kbGUgZmlsZSBlbmNvZGluZyBzY2hlbWU7IG9wdGlvbmFsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXRzIFJlc291cmNlIEJ1bmRsZSBmaWxlIGVuY29kaW5nIHNjaGVtZTsgb3B0aW9uYWwuICBEZWZhdWx0cyB0byBzb3VyY2UgZmlsZQorIGVuY29kaW5nCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYnVuZGxlbGFuZ3VhZ2UiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTZXRzIGxvY2FsZSBzcGVjaWZpYyBsYW5ndWFnZSBvZiByZXNvdXJjZSBidW5kbGU7IG9wdGlvbmFsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXRzIGxvY2FsZSBzcGVjaWZpYyBsYW5ndWFnZSBvZiByZXNvdXJjZSBidW5kbGU7IG9wdGlvbmFsLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImJ1bmRsZXZhcmlhbnQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTZXRzIGxvY2FsZSBzcGVjaWZpYyB2YXJpYW50IG9mIHJlc291cmNlIGJ1bmRsZTsgb3B0aW9uYWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldHMgbG9jYWxlIHNwZWNpZmljIHZhcmlhbnQgb2YgcmVzb3VyY2UgYnVuZGxlOyBvcHRpb25hbC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXN0ZW5jb2RpbmciIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTZXRzIGRlc3RpbmF0aW9uIGZpbGUgZW5jb2Rpbmcgc2NoZW1lOyBvcHRpb25hbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0cyBkZXN0aW5hdGlvbiBmaWxlIGVuY29kaW5nIHNjaGVtZTsgb3B0aW9uYWwuICBEZWZhdWx0cyB0byBzb3VyY2UgZmlsZQorIGVuY29kaW5nCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZW5kdG9rZW4iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTZXRzIGVuZGluZyB0b2tlbiB0byBpZGVudGlmeSBrZXlzOyByZXF1aXJlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0cyBlbmRpbmcgdG9rZW4gdG8gaWRlbnRpZnkga2V5czsgcmVxdWlyZWQuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZm9yY2VvdmVyd3JpdGUiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbV2hldGhlciBvciBub3QgdG8gb3ZlcndyaXRlIGV4aXN0aW5nIGZpbGUgaXJyZXNwZWN0aXZlIG9mCisgd2hldGhlciBpdCBpcyBuZXdlciB0aGFuIHRoZSBzb3VyY2UgZmlsZSBhcyB3ZWxsIGFzIHRoZQorIHJlc291cmNlIGJ1bmRsZSBmaWxlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBXaGV0aGVyIG9yIG5vdCB0byBvdmVyd3JpdGUgZXhpc3RpbmcgZmlsZSBpcnJlc3BlY3RpdmUgb2YKKyB3aGV0aGVyIGl0IGlzIG5ld2VyIHRoYW4gdGhlIHNvdXJjZSBmaWxlIGFzIHdlbGwgYXMgdGhlCisgcmVzb3VyY2UgYnVuZGxlIGZpbGUuCisgRGVmYXVsdHMgdG8gZmFsc2UuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3JjZW5jb2RpbmciIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTZXRzIHNvdXJjZSBmaWxlIGVuY29kaW5nIHNjaGVtZTsgb3B0aW9uYWwsCisgZGVmYXVsdHMgdG8gZW5jb2Rpbmcgb2YgbG9jYWwgc3lzdGVtLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXRzIHNvdXJjZSBmaWxlIGVuY29kaW5nIHNjaGVtZTsgb3B0aW9uYWwsCisgZGVmYXVsdHMgdG8gZW5jb2Rpbmcgb2YgbG9jYWwgc3lzdGVtLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InN0YXJ0dG9rZW4iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTZXRzIHN0YXJ0aW5nIHRva2VuIHRvIGlkZW50aWZ5IGtleXM7IHJlcXVpcmVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXRzIHN0YXJ0aW5nIHRva2VuIHRvIGlkZW50aWZ5IGtleXM7IHJlcXVpcmVkLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InRvZGlyIiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2V0cyBEZXN0aW5hdGlvbiBkaXJlY3Rvcnk7IHJlcXVpcmVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXRzIERlc3RpbmF0aW9uIGRpcmVjdG9yeTsgcmVxdWlyZWQuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICA8L2F0dHJpYnV0ZXM+CisKKyAgICA8ZWxlbWVudHM+CisgICAgICA8ZWxlbWVudCBuYW1lPSJmaWxlc2V0IiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0IgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlc2V0IgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBhIHNldCBvZiBmaWxlcyB0byB0cmFuc2xhdGUgYXMgYSBuZXN0ZWQgZmlsZXNldCBlbGVtZW50Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtBZGRzIGEgc2V0IG9mIGZpbGVzIHRvIHRyYW5zbGF0ZSBhcyBhIG5lc3RlZCBmaWxlc2V0IGVsZW1lbnQuXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICA8L2VsZW1lbnRzPgorCisgIDwvc3RydWN0dXJlPgorCis8L3Rhc2s+CisKKworPHRhc2sgbmFtZT0idHN0YW1wIiBjYXRlZ29yeT0idXRpbGl0eSIKKyAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuVHN0YW1wIgorICAgICAgPgorCisgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTZXRzIHByb3BlcnRpZXMgdG8gdGhlIGN1cnJlbnQgdGltZSwgb3Igb2Zmc2V0cyBmcm9tIHRoZSBjdXJyZW50IHRpbWUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgPGRlc2NyaXB0aW9uPgorICAgIDwhW0NEQVRBW1NldHMgcHJvcGVydGllcyB0byB0aGUgY3VycmVudCB0aW1lLCBvciBvZmZzZXRzIGZyb20gdGhlIGN1cnJlbnQgdGltZS4KKyBUaGUgZGVmYXVsdCBwcm9wZXJ0aWVzIGFyZSBUU1RBTVAsIERTVEFNUCBhbmQgVE9EQVk7XV0+CisgIDwvZGVzY3JpcHRpb24+CisKKyAgPHN0cnVjdHVyZT4KKworICAgIDxhdHRyaWJ1dGVzPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwcmVmaXgiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtQcmVmaXggZm9yIHRoZSBwcm9wZXJ0aWVzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgYSBwcmVmaXggZm9yIHRoZSBwcm9wZXJ0aWVzLiBJZiB0aGUgcHJlZml4IGRvZXMgbm90IGVuZCB3aXRoIGEgIi4iCisgb25lIGlzIGF1dG9tYXRpY2FsbHkgYWRkZWQKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgIDwvYXR0cmlidXRlcz4KKworICAgIDxlbGVtZW50cz4KKyAgICAgIDxlbGVtZW50IG5hbWU9ImZvcm1hdCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuVHN0YW1wLkN1c3RvbUZvcm1hdCIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ3JlYXRlIGEgY3VzdG9tIGZvcm1hdCB3aXRoIHRoZSB0aGUgY3VycmVudCBwcmVmaXguXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW2NyZWF0ZSBhIGN1c3RvbSBmb3JtYXQgd2l0aCB0aGUgdGhlIGN1cnJlbnQgcHJlZml4Ll1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgPC9lbGVtZW50cz4KKworICA8L3N0cnVjdHVyZT4KKworPC90YXNrPgorCisKKzx0YXNrIG5hbWU9InR5cGVkZWYiIGNhdGVnb3J5PSJpbnRlcm5hbCIKKyAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuVHlwZWRlZiIKKyAgICAgID4KKworICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBhIGRhdGEgdHlwZSBkZWZpbml0aW9uIHRvIHRoZSBjdXJyZW50IHByb2plY3QuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgPGRlc2NyaXB0aW9uPgorICAgIDwhW0NEQVRBW0FkZHMgYSBkYXRhIHR5cGUgZGVmaW5pdGlvbiB0byB0aGUgY3VycmVudCBwcm9qZWN0LgorIFR3byBhdHRyaWJ1dGVzIGFyZQorIG5lZWRlZCwgdGhlIG5hbWUgdGhhdCBpZGVudGlmaWVzIHRoaXMgZGF0YSB0eXBlIHVuaXF1ZWx5LCBhbmQgdGhlIGZ1bGwKKyBuYW1lIG9mIHRoZSBjbGFzcyAoaW5jbHVkaW5nIHRoZSBwYWNrYWdlcykgdGhhdCBpbXBsZW1lbnRzIHRoaXMKKyB0eXBlLgorIDxwPllvdSBjYW4gYWxzbyBkZWZpbmUgYSBncm91cCBvZiBkYXRhIHR5cGVzIGF0IG9uY2UgdXNpbmcgdGhlIGZpbGUgb3IKKyByZXNvdXJjZSBhdHRyaWJ1dGVzLiAgVGhlc2UgYXR0cmlidXRlcyBwb2ludCB0byBmaWxlcyBpbiB0aGUgZm9ybWF0IG9mCisgSmF2YSBwcm9wZXJ0eSBmaWxlcy4gICBFYWNoIGxpbmUgZGVmaW5lcyBhIHNpbmdsZSBkYXRhIHR5cGUgaW4gdGhlCisgZm9ybWF0OjwvcD4KKyA8cHJlPgorIHR5cGVuYW1lPWZ1bGx5LnF1YWxpZmllZC5qYXZhLmNsYXNzbmFtZQorIDwvcHJlPgorIDxwPlR5cGVkZWYgc2hvdWxkIGJlIHVzZWQgdG8gYWRkIHlvdXIgb3duIHR5cGVzIHRvIHRoZSBzeXN0ZW0uIERhdGEKKyB0eXBlcyBhcmUgdGhpbmdzIGxpa2VwYXRocyBvciBmaWxlc2V0cyB0aGF0IGNhbiBiZSBkZWZpbmVkIGF0CisgdGhlIHByb2plY3QgbGV2ZWwgYW5kIHJlZmVyZW5jZWQgdmlhIHRoZWlyIElEIGF0dHJpYnV0ZS48L3A+CisgPHA+Q3VzdG9tIGRhdGEgdHlwZXMgdXN1YWxseSBuZWVkIGN1c3RvbSB0YXNrcyB0byBwdXQgdGhlbSB0byBnb29kIHVzZS48L3A+XV0+CisgIDwvZGVzY3JpcHRpb24+CisKKyAgPHN0cnVjdHVyZT4KKworICAgIDxhdHRyaWJ1dGVzPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc25hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgZnVsbCBjbGFzcyBuYW1lIG9mIHRoZSBvYmplY3QgYmVpbmcgZGVmaW5lZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgdGhlIGZ1bGwgY2xhc3MgbmFtZSBvZiB0aGUgb2JqZWN0IGJlaW5nIGRlZmluZWQuCisgUmVxdWlyZWQsIHVubGVzcyBmaWxlIG9yIHJlc291cmNlIGhhdmUKKyBiZWVuIHNwZWNpZmllZC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc3BhdGgiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUGF0aCIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ2xhc3NwYXRoIHRvIGJlIHVzZWQgd2hlbiBzZWFyY2hpbmcgZm9yIGNvbXBvbmVudCBiZWluZyBkZWZpbmVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIGNsYXNzcGF0aCB0byBiZSB1c2VkIHdoZW4gc2VhcmNoaW5nIGZvciBjb21wb25lbnQgYmVpbmcgZGVmaW5lZAorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzcGF0aHJlZiIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVmZXJlbmNlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlJlZmVyZW5jZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbUmVmZXJlbmNlIHRvIGEgY2xhc3NwYXRoIHRvIHVzZSB3aGVuIGxvYWRpbmcgdGhlIGZpbGVzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICByZWZlcmVuY2UgdG8gYSBjbGFzc3BhdGggdG8gdXNlIHdoZW4gbG9hZGluZyB0aGUgZmlsZXMuCisgVG8gYWN0dWFsbHkgc2hhcmUgdGhlIHNhbWUgbG9hZGVyLCBzZXQgbG9hZGVycmVmIGFzIHdlbGwKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmaWxlIiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTmFtZSBvZiB0aGUgcHJvcGVydHkgZmlsZSAgdG8gbG9hZAorIGFudCBuYW1lL2NsYXNzbmFtZSBwYWlycyBmcm9tLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBOYW1lIG9mIHRoZSBwcm9wZXJ0eSBmaWxlICB0byBsb2FkCisgYW50IG5hbWUvY2xhc3NuYW1lIHBhaXJzIGZyb20uCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibG9hZGVycmVmIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZWZlcmVuY2UiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUmVmZXJlbmNlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtVc2UgdGhlIHJlZmVyZW5jZSB0byBsb2NhdGUgdGhlIGxvYWRlci5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgVXNlIHRoZSByZWZlcmVuY2UgdG8gbG9jYXRlIHRoZSBsb2FkZXIuIElmIHRoZSBsb2FkZXIgaXMgbm90CisgZm91bmQsIHRhc2tkZWYgd2lsbCB1c2UgdGhlIHNwZWNpZmllZCBjbGFzc3BhdGggYW5kIHJlZ2lzdGVyIGl0Cisgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCisgVGhpcyBhbGxvdyBtdWx0aXBsZSB0YXNrZGVmL3R5cGVkZWYgdG8gdXNlIHRoZSBzYW1lIGNsYXNzIGxvYWRlciwKKyBzbyB0aGV5IGNhbiBiZSB1c2VkIHRvZ2V0aGVyLiBJdCBlbGltaW5hdGUgdGhlIG5lZWQgdG8KKyBwdXQgdGhlbSBpbiB0aGUgQ0xBU1NQQVRILgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtOYW1lIG9mIHRoZSBwcm9wZXJ0eSByZXNvdXJjZSB0byBsb2FkCisgYW50IG5hbWUvY2xhc3NuYW1lIHBhaXJzIGZyb20uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIE5hbWUgb2YgdGhlIHByb3BlcnR5IHJlc291cmNlIHRvIGxvYWQKKyBhbnQgbmFtZS9jbGFzc25hbWUgcGFpcnMgZnJvbS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJyZXNvdXJjZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW05hbWUgb2YgdGhlIHByb3BlcnR5IHJlc291cmNlIHRvIGxvYWQKKyBhbnQgbmFtZS9jbGFzc25hbWUgcGFpcnMgZnJvbS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgTmFtZSBvZiB0aGUgcHJvcGVydHkgcmVzb3VyY2UgdG8gbG9hZAorIGFudCBuYW1lL2NsYXNzbmFtZSBwYWlycyBmcm9tLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgPC9hdHRyaWJ1dGVzPgorCisgICAgPGVsZW1lbnRzPgorICAgICAgPGVsZW1lbnQgbmFtZT0iY2xhc3NwYXRoIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoIgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJQYXRoIgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ3JlYXRlIHRoZSBjbGFzc3BhdGggdG8gYmUgdXNlZCB3aGVuIHNlYXJjaGluZyBmb3IgY29tcG9uZW50IGJlaW5nIGRlZmluZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0NyZWF0ZSB0aGUgY2xhc3NwYXRoIHRvIGJlIHVzZWQgd2hlbiBzZWFyY2hpbmcgZm9yIGNvbXBvbmVudCBiZWluZyBkZWZpbmVkXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICA8L2VsZW1lbnRzPgorCisgIDwvc3RydWN0dXJlPgorCis8L3Rhc2s+CisKKworPHRhc2sgbmFtZT0idW50YXIiIGNhdGVnb3J5PSJwYWNrYWdpbmciCisgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlVudGFyIgorICAgICAgPgorCisgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtVbnRhciBhIGZpbGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgPGRlc2NyaXB0aW9uPgorICAgIDwhW0NEQVRBW1VudGFyIGEgZmlsZS4KKyA8cD5Gb3IgSkRLIDEuMSAmcXVvdDtsYXN0IG1vZGlmaWVkIHRpbWUmcXVvdDsgZmllbGQgaXMgc2V0IHRvIGN1cnJlbnQgdGltZSBpbnN0ZWFkIG9mIGJlaW5nCisgY2FycmllZCBmcm9tIHRoZSBhcmNoaXZlIGZpbGUuPC9wPgorIDxwPlBhdHRlcm5TZXRzIGFyZSB1c2VkIHRvIHNlbGVjdCBmaWxlcyB0byBleHRyYWN0CisgPEk+ZnJvbTwvST4gdGhlIGFyY2hpdmUuICBJZiBubyBwYXR0ZXJuc2V0IGlzIHVzZWQsIGFsbCBmaWxlcyBhcmUgZXh0cmFjdGVkLgorIDwvcD4KKyA8cD5GaWxlU2V0PnMgbWF5IGJlIHVzZWQgdXNlZCB0byBzZWxlY3QgYXJjaGl2ZWQgZmlsZXMKKyB0byBwZXJmb3JtIHVuYXJjaGl2YWwgdXBvbi4KKyA8L3A+CisgPHA+RmlsZSBwZXJtaXNzaW9ucyB3aWxsIG5vdCBiZSByZXN0b3JlZCBvbiBleHRyYWN0ZWQgZmlsZXMuPC9wPgorIDxwPlRoZSB1bnRhciB0YXNrIHJlY29nbml6ZXMgdGhlIGxvbmcgcGF0aG5hbWUgZW50cmllcyB1c2VkIGJ5IEdOVSB0YXIuPHA+XV0+CisgIDwvZGVzY3JpcHRpb24+CisKKyAgPHN0cnVjdHVyZT4KKworICAgIDxhdHRyaWJ1dGVzPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb21wcmVzc2lvbiIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuVW50YXIuVW50YXJDb21wcmVzc2lvbk1ldGhvZCIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSImcXVvdDtub25lJnF1b3Q7LCAmcXVvdDtnemlwJnF1b3Q7LCAmcXVvdDtiemlwMiZxdW90OyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2V0IGRlY29tcHJlc3Npb24gYWxnb3JpdGhtIHRvIHVzZTsgZGVmYXVsdD1ub25lLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgZGVjb21wcmVzc2lvbiBhbGdvcml0aG0gdG8gdXNlOyBkZWZhdWx0PW5vbmUuCisKKyBBbGxvd2FibGUgdmFsdWVzIGFyZQorIDx1bD4KKyAgIDxsaT5ub25lIC0gbm8gY29tcHJlc3Npb24KKyAgIDxsaT5nemlwIC0gR3ppcCBjb21wcmVzc2lvbgorICAgPGxpPmJ6aXAyIC0gQnppcDIgY29tcHJlc3Npb24KKyA8L3VsPgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlc3QiIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtEZXN0aW5hdGlvbiBkaXJlY3RvcnkuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5LiBGaWxlIHdpbGwgYmUgdW56aXBwZWQgaW50byB0aGUKKyBkZXN0aW5hdGlvbiBkaXJlY3RvcnkuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ib3ZlcndyaXRlIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1Nob3VsZCB3ZSBvdmVyd3JpdGUgZmlsZXMgaW4gZGVzdCwgZXZlbiBpZiB0aGV5IGFyZSBuZXdlciB0aGFuCisgdGhlIGNvcnJlc3BvbmRpbmcgZW50cmllcyBpbiB0aGUgYXJjaGl2ZT8uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNob3VsZCB3ZSBvdmVyd3JpdGUgZmlsZXMgaW4gZGVzdCwgZXZlbiBpZiB0aGV5IGFyZSBuZXdlciB0aGFuCisgdGhlIGNvcnJlc3BvbmRpbmcgZW50cmllcyBpbiB0aGUgYXJjaGl2ZT8KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzcmMiIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtQYXRoIHRvIHppcC1maWxlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIHBhdGggdG8gemlwLWZpbGUuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICA8L2F0dHJpYnV0ZXM+CisKKyAgICA8ZWxlbWVudHM+CisgICAgICA8ZWxlbWVudCBuYW1lPSJmaWxlc2V0IiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0IgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlc2V0IgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkIGEgZmlsZXNldC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbQWRkIGEgZmlsZXNldF1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgICA8ZWxlbWVudCBuYW1lPSJwYXR0ZXJuc2V0IiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXR0ZXJuU2V0IgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJQYXR0ZXJuc2V0IgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkIGEgcGF0dGVybnNldC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbQWRkIGEgcGF0dGVybnNldF1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgPC9lbGVtZW50cz4KKworICA8L3N0cnVjdHVyZT4KKworPC90YXNrPgorCisKKzx0YXNrIG5hbWU9InVuemlwIiBjYXRlZ29yeT0icGFja2FnaW5nIgorICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5FeHBhbmQiCisgICAgICA+CisKKyAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1VuemlwIGEgZmlsZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICA8ZGVzY3JpcHRpb24+CisgICAgPCFbQ0RBVEFbVW56aXAgYSBmaWxlLl1dPgorICA8L2Rlc2NyaXB0aW9uPgorCisgIDxzdHJ1Y3R1cmU+CisKKyAgICA8YXR0cmlidXRlcz4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVzdCIgdHlwZT0iamF2YS5pby5GaWxlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0Rlc3RpbmF0aW9uIGRpcmVjdG9yeS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkuIEZpbGUgd2lsbCBiZSB1bnppcHBlZCBpbnRvIHRoZQorIGRlc3RpbmF0aW9uIGRpcmVjdG9yeS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJvdmVyd3JpdGUiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2hvdWxkIHdlIG92ZXJ3cml0ZSBmaWxlcyBpbiBkZXN0LCBldmVuIGlmIHRoZXkgYXJlIG5ld2VyIHRoYW4KKyB0aGUgY29ycmVzcG9uZGluZyBlbnRyaWVzIGluIHRoZSBhcmNoaXZlPy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2hvdWxkIHdlIG92ZXJ3cml0ZSBmaWxlcyBpbiBkZXN0LCBldmVuIGlmIHRoZXkgYXJlIG5ld2VyIHRoYW4KKyB0aGUgY29ycmVzcG9uZGluZyBlbnRyaWVzIGluIHRoZSBhcmNoaXZlPworICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InNyYyIgdHlwZT0iamF2YS5pby5GaWxlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1BhdGggdG8gemlwLWZpbGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCB0aGUgcGF0aCB0byB6aXAtZmlsZS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgIDwvYXR0cmlidXRlcz4KKworICAgIDxlbGVtZW50cz4KKyAgICAgIDxlbGVtZW50IG5hbWU9ImZpbGVzZXQiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVTZXQiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGVzZXQiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGQgYSBmaWxlc2V0Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtBZGQgYSBmaWxlc2V0XV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICAgIDxlbGVtZW50IG5hbWU9InBhdHRlcm5zZXQiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdHRlcm5TZXQiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IlBhdHRlcm5zZXQiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGQgYSBwYXR0ZXJuc2V0Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtBZGQgYSBwYXR0ZXJuc2V0XV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICA8L2VsZW1lbnRzPgorCisgIDwvc3RydWN0dXJlPgorCis8L3Rhc2s+CisKKworPHRhc2sgbmFtZT0idXB0b2RhdGUiIGNhdGVnb3J5PSJjb250cm9sIgorICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5VcFRvRGF0ZSIKKyAgICAgID4KKworICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2V0cyB0aGUgZ2l2ZW4gcHJvcGVydHkgaWYgdGhlIHNwZWNpZmllZCB0YXJnZXQgaGFzIGEgdGltZXN0YW1wIGdyZWF0ZXIgdGhhbiBhbGwgb2YgdGhlIHNvdXJjZSBmaWxlcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICA8ZGVzY3JpcHRpb24+CisgICAgPCFbQ0RBVEFbU2V0cyB0aGUgZ2l2ZW4gcHJvcGVydHkgaWYgdGhlIHNwZWNpZmllZCB0YXJnZXQgaGFzIGEgdGltZXN0YW1wCisgZ3JlYXRlciB0aGFuIGFsbCBvZiB0aGUgc291cmNlIGZpbGVzLl1dPgorICA8L2Rlc2NyaXB0aW9uPgorCisgIDxzdHJ1Y3R1cmU+CisKKyAgICA8YXR0cmlidXRlcz4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icHJvcGVydHkiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgcHJvcGVydHkgdG8gc2V0IGlmIHRoZSB0YXJnZXQgZmlsZSBpcyBtb3JlIHVwLXRvLWRhdGUgdGhhbgorIChlYWNoIG9mKSB0aGUgc291cmNlIGZpbGUocykuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRoZSBwcm9wZXJ0eSB0byBzZXQgaWYgdGhlIHRhcmdldCBmaWxlIGlzIG1vcmUgdXAtdG8tZGF0ZSB0aGFuCisgKGVhY2ggb2YpIHRoZSBzb3VyY2UgZmlsZShzKS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzcmNmaWxlIiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGZpbGUgdGhhdCBtdXN0IGJlIG9sZGVyIHRoYW4gdGhlIHRhcmdldCBmaWxlCisgaWYgdGhlIHByb3BlcnR5IGlzIHRvIGJlIHNldC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgVGhlIGZpbGUgdGhhdCBtdXN0IGJlIG9sZGVyIHRoYW4gdGhlIHRhcmdldCBmaWxlCisgaWYgdGhlIHByb3BlcnR5IGlzIHRvIGJlIHNldC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXRmaWxlIiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGZpbGUgd2hpY2ggbXVzdCBiZSBtb3JlIHVwLXRvLWRhdGUgdGhhbiAoZWFjaCBvZikgdGhlIHNvdXJjZSBmaWxlKHMpCisgaWYgdGhlIHByb3BlcnR5IGlzIHRvIGJlIHNldC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgVGhlIGZpbGUgd2hpY2ggbXVzdCBiZSBtb3JlIHVwLXRvLWRhdGUgdGhhbiAoZWFjaCBvZikgdGhlIHNvdXJjZSBmaWxlKHMpCisgaWYgdGhlIHByb3BlcnR5IGlzIHRvIGJlIHNldC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSB2YWx1ZSB0byBzZXQgdGhlIG5hbWVkIHByb3BlcnR5IHRvIGlmIHRoZSB0YXJnZXQgZmlsZSBpcyBtb3JlCisgdXAtdG8tZGF0ZSB0aGFuIChlYWNoIG9mKSB0aGUgc291cmNlIGZpbGUocykuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRoZSB2YWx1ZSB0byBzZXQgdGhlIG5hbWVkIHByb3BlcnR5IHRvIGlmIHRoZSB0YXJnZXQgZmlsZSBpcyBtb3JlCisgdXAtdG8tZGF0ZSB0aGFuIChlYWNoIG9mKSB0aGUgc291cmNlIGZpbGUocykuIERlZmF1bHRzIHRvICd0cnVlJy4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgIDwvYXR0cmlidXRlcz4KKworICAgIDxlbGVtZW50cz4KKyAgICAgIDxlbGVtZW50IG5hbWU9InNyY2ZpbGVzIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0IgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlc2V0IgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTmVzdGVkICZsdDtzcmNmaWxlcyZndDsgZWxlbWVudC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbTmVzdGVkICZsdDtzcmNmaWxlcyZndDsgZWxlbWVudC5dXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgICAgPGVsZW1lbnQgbmFtZT0ibWFwcGVyIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5NYXBwZXIiCisgICAgICAgICAgICAgICBicmllZlR5cGU9Ik1hcHBlciIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0RlZmluZXMgdGhlIEZpbGVOYW1lTWFwcGVyIHRvIHVzZSAobmVzdGVkIG1hcHBlciBlbGVtZW50KS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbRGVmaW5lcyB0aGUgRmlsZU5hbWVNYXBwZXIgdG8gdXNlIChuZXN0ZWQgbWFwcGVyIGVsZW1lbnQpLl1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgPC9lbGVtZW50cz4KKworICA8L3N0cnVjdHVyZT4KKworPC90YXNrPgorCisKKzx0YXNrIG5hbWU9InZhamV4cG9ydCIgY2F0ZWdvcnk9Im90aGVyIgorICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5pZGUuVkFKRXhwb3J0IgorICAgICAgPgorCisgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtFeHBvcnQgcGFja2FnZXMgZnJvbSB0aGUgVmlzdWFsIEFnZSBmb3IgSmF2YSB3b3Jrc3BhY2UuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgPGRlc2NyaXB0aW9uPgorICAgIDwhW0NEQVRBW0V4cG9ydCBwYWNrYWdlcyBmcm9tIHRoZSBWaXN1YWwgQWdlIGZvciBKYXZhIHdvcmtzcGFjZS4KKyBUaGUgcGFja2FnZXMgYXJlIHNwZWNpZmllZCBzaW1pbGFyIHRvIGFsbCBvdGhlciBNYXRjaGluZ1Rhc2tzLgorIFNpbmNlIHRoZSBWQSBXb3Jrc3BhY2UgaXMgbm90IGZpbGUgYmFzZWQsIHRoaXMgdGFzayBpcyBzaW11bGF0aW5nCisgYSBkaXJlY3RvcnkgaGllcmFyY2h5IGZvciB0aGUgd29ya3NwYWNlOgorIFRoZSAncm9vdCcgY29udGFpbnMgYWxsIHByb2plY3QgJ2RpcidzLCBhbmQgdGhlIHByb2plY3RzIGNvbnRhaW4KKyB0aGVpciByZXNwZWN0aXZlIHBhY2thZ2UgJ2RpcidzLgorIEV4YW1wbGU6CisgPGJsb2NrcXVvdGU+CisgJmx0O3ZhamV4cG9ydCBkZXN0ZGlyPSJDOi9idWlsZGRpci9zb3VyY2UiPgorICZuYnNwOyZsdDtpbmNsdWRlIG5hbWU9Ii9NeVZBUHJvamVjdC9vcmcvZm9vL3N1YnN5c3RlbTEvKioiIC8+CisgJm5ic3A7Jmx0O2V4Y2x1ZGUgbmFtZT0iL015VkFQcm9qZWN0L29yZy9mb28vc3Vic3lzdGVtMS90ZXN0LyoqIi8+CisgJmx0Oy92YWpleHBvcnQ+CisgPC9ibG9ja3F1b3RlPgorIGV4cG9ydHMgYWxsIHBhY2thZ2VzIGluIHRoZSBwcm9qZWN0IE15VkFQcm9qZWN0IHdoaWNoIHN0YXJ0IHdpdGgKKyAnb3JnLmZvby5zdWJzeXN0ZW0xJyBleGNlcHQgb2YgdGhlc2Ugc3RhcnRpbmcgd2l0aAorICdvcmcuZm9vLnN1YnN5c3RlbTEudGVzdCcuCisKKyBUaGVyZSBhcmUgZmxhZ3MgdG8gY2hvb3NlIHdoaWNoIGl0ZW1zIHRvIGV4cG9ydDoKKyBleHBvcnRTb3VyY2VzOiAgIGV4cG9ydCBKYXZhIHNvdXJjZXMKKyBleHBvcnRSZXNvdXJjZXM6IGV4cG9ydCBwcm9qZWN0IHJlc291cmNlcworIGV4cG9ydENsYXNzZXM6ICAgZXhwb3J0IGNsYXNzIGZpbGVzCisgZXhwb3J0RGVidWdJbmZvOiBleHBvcnQgY2xhc3MgZmlsZXMgd2l0aCBkZWJ1ZyBpbmZvICh1c2Ugd2l0aCBleHBvcnRDbGFzc2VzKQorIGRlZmF1bHQgaXMgZXhwb3J0aW5nIEphdmEgZmlsZXMgYW5kIHJlc291cmNlcy5dXT4KKyAgPC9kZXNjcmlwdGlvbj4KKworICA8c3RydWN0dXJlPgorCisgICAgPGF0dHJpYnV0ZXM+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlZmF1bHRleGNsdWRlcyIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTZXRzIHdoZXRoZXIgZGVmYXVsdCBleGNsdXNpb25zIHNob3VsZCBiZSB1c2VkIG9yIG5vdDsgZGVmYXVsdCB0cnVlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXRzIHdoZXRoZXIgZGVmYXVsdCBleGNsdXNpb25zIHNob3VsZCBiZSB1c2VkIG9yIG5vdDsgZGVmYXVsdCB0cnVlLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlc3RkaXIiIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtEZXN0aW5hdGlvbiBkaXJlY3RvcnkgaW50byB3aGljaCB0aGUgc2VsZWN0ZWQKKyBpdGVtcyBzaG91bGQgYmUgZXhwb3J0ZWQ7IHJlcXVpcmVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBpbnRvIHdoaWNoIHRoZSBzZWxlY3RlZAorIGl0ZW1zIHNob3VsZCBiZSBleHBvcnRlZDsgcmVxdWlyZWQuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZXhjbHVkZXMiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTZXQgb2YgZXhjbHVkZSBwYXR0ZXJucy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0cyB0aGUgc2V0IG9mIGV4Y2x1ZGUgcGF0dGVybnMuIFBhdHRlcm5zIG1heSBiZSBzZXBhcmF0ZWQgYnkgYSBjb21tYQorIG9yIGEgc3BhY2UuIEN1cnJlbnRseSBvbmx5IHBhdHRlcm5zIGRlbm90aW5nIHBhY2thZ2VzIGFyZQorIHN1cHBvcnRlZAorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImV4cG9ydGNsYXNzZXMiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbT3B0aW9uYWwgZmxhZyB0byBleHBvcnQgdGhlIGNsYXNzIGZpbGVzOyBkZWZhdWx0IGZhbHNlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBvcHRpb25hbCBmbGFnIHRvIGV4cG9ydCB0aGUgY2xhc3MgZmlsZXM7IGRlZmF1bHQgZmFsc2UuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZXhwb3J0ZGVidWdpbmZvIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW09wdGlvbmFsIGZsYWcgdG8gZXhwb3J0IHRoZSBkZWJ1ZyBpbmZvOyBkZWZhdWx0IGZhbHNlLgorIGRlYnVnIGluZm8uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIG9wdGlvbmFsIGZsYWcgdG8gZXhwb3J0IHRoZSBkZWJ1ZyBpbmZvOyBkZWZhdWx0IGZhbHNlLgorIGRlYnVnIGluZm8KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJleHBvcnRyZXNvdXJjZXMiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbT3B0aW9uYWwgZmxhZyB0byBleHBvcnQgdGhlIHJlc291cmNlIGZpbGU7IGRlZmF1bHQgdHJ1ZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgb3B0aW9uYWwgZmxhZyB0byBleHBvcnQgdGhlIHJlc291cmNlIGZpbGU7IGRlZmF1bHQgdHJ1ZS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJleHBvcnRzb3VyY2VzIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW09wdGlvbmFsIGZsYWcgdG8gZXhwb3J0IHRoZSBKYXZhIGZpbGVzOyBkZWZhdWx0IHRydWUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIG9wdGlvbmFsIGZsYWcgdG8gZXhwb3J0IHRoZSBKYXZhIGZpbGVzOyBkZWZhdWx0IHRydWUuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaW5jbHVkZXMiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTZXQgb2YgaW5jbHVkZSBwYXR0ZXJucy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0cyB0aGUgc2V0IG9mIGluY2x1ZGUgcGF0dGVybnMuIFBhdHRlcm5zIG1heSBiZSBzZXBhcmF0ZWQgYnkgYSBjb21tYQorIG9yIGEgc3BhY2UuIEN1cnJlbnRseSBvbmx5IHBhdHRlcm5zIGRlbm90aW5nIHBhY2thZ2VzIGFyZQorIHN1cHBvcnRlZAorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9Im92ZXJ3cml0ZSIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiBPdmVyd3JpdGUgaXMgc2V0LCBmaWxlcyB3aWxsIGJlIG92ZXJ3cml0dGVuIGR1cmluZyBleHBvcnQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIGlmIE92ZXJ3cml0ZSBpcyBzZXQsIGZpbGVzIHdpbGwgYmUgb3ZlcndyaXR0ZW4gZHVyaW5nIGV4cG9ydAorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InJlbW90ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW05hbWUgYW5kIHBvcnQgb2YgYSByZW1vdGUgdG9vbCBzZXJ2ZXIsIG9wdGlvbmEuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIE5hbWUgYW5kIHBvcnQgb2YgYSByZW1vdGUgdG9vbCBzZXJ2ZXIsIG9wdGlvbmEuCisgRm9ybWF0OiAmbHQ7c2VydmVybmFtZSZndDs6Jmx0O3BvcnQgbm8mZ3Q7LgorIElmIHRoaXMgYXR0cmlidXRlIGlzIHNldCwgdGhlIHRhc2tzIHdpbGwgYmUgZXhlY3V0ZWQgb24gdGhlIHNwZWNpZmllZCB0b29sCisgc2VydmVyLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgPC9hdHRyaWJ1dGVzPgorCisgICAgPGVsZW1lbnRzPgorICAgICAgPGVsZW1lbnQgbmFtZT0iZXhjbHVkZSIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0dGVyblNldC5OYW1lRW50cnkiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IiIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZCBhIG5hbWUgZW50cnkgb24gdGhlIGV4Y2x1ZGUgbGlzdC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbYWRkIGEgbmFtZSBlbnRyeSBvbiB0aGUgZXhjbHVkZSBsaXN0XV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICAgIDxlbGVtZW50IG5hbWU9ImluY2x1ZGUiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdHRlcm5TZXQuTmFtZUVudHJ5IgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGQgYSBuYW1lIGVudHJ5IG9uIHRoZSBpbmNsdWRlIGxpc3QuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW2FkZCBhIG5hbWUgZW50cnkgb24gdGhlIGluY2x1ZGUgbGlzdF1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgPC9lbGVtZW50cz4KKworICA8L3N0cnVjdHVyZT4KKworPC90YXNrPgorCisKKzx0YXNrIG5hbWU9InZhamltcG9ydCIgY2F0ZWdvcnk9Im90aGVyIgorICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5pZGUuVkFKSW1wb3J0IgorICAgICAgPgorCisgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJbXBvcnQgc291cmNlLCBjbGFzcyBmaWxlcywgYW5kIHJlc291cmNlcyB0byB0aGUgVmlzdWFsIEFnZSBmb3IgSmF2YSB3b3Jrc3BhY2UuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgPGRlc2NyaXB0aW9uPgorICAgIDwhW0NEQVRBW0ltcG9ydCBzb3VyY2UsIGNsYXNzIGZpbGVzLCBhbmQgcmVzb3VyY2VzIHRvIHRoZSBWaXN1YWwgQWdlIGZvciBKYXZhCisgd29ya3NwYWNlLgorIDxwPgorIEV4YW1wbGU6CisgPHByZT4KKyAmbHQ7dmFqaW1wb3J0IHByb2plY3Q9Ik15VkFQcm9qZWN0IiZndDsKKyAgICZsdDtmaWxlc2V0IGRpcj0ic3JjIiZndDsKKyAgICAgJmx0O2luY2x1ZGUgbmFtZT0ib3JnL2Zvby9zdWJzeXN0ZW0xLyoqIiAvJmd0OworICAgICAmbHQ7ZXhjbHVkZSBuYW1lPSIvb3JnL2Zvby9zdWJzeXN0ZW0xL3Rlc3QvKioiIC8mZ3Q7CisgICZsdDsvZmlsZXNldCZndDsKKyAmbHQ7L3ZhamV4cG9ydCZndDsKKyA8L3ByZT4KKyBpbXBvcnQgYWxsIHNvdXJjZSBhbmQgcmVzb3VyY2UgZmlsZXMgZnJvbSB0aGUgInNyYyIgZGlyZWN0b3J5Cisgd2hpY2ggc3RhcnQgd2l0aCAnb3JnLmZvby5zdWJzeXN0ZW0xJywgZXhjZXB0IG9mIHRoZXNlIHN0YXJ0aW5nIHdpdGgKKyAnb3JnLmZvby5zdWJzeXN0ZW0xLnRlc3QnIGludG8gdGhlIHByb2plY3QgTXlWQVByb2plY3QuCisgPC9wPgorIDxwPklmIE15VkFQcm9qZWN0IGlzbid0IGxvYWRlZCBpbnRvIHRoZSBXb3Jrc3BhY2UsIGEgbmV3IGVkaXRpb24gaXMKKyBjcmVhdGVkIGluIHRoZSByZXBvc2l0b3J5IGFuZCBhdXRvbWF0aWNhbGx5IGxvYWRlZCBpbnRvIHRoZSBXb3Jrc3BhY2UuCisgVGhlcmUgaGFzIHRvIGJlIGF0IGxlYXN0IG9uZSBuZXN0ZWQgRmlsZVNldCBlbGVtZW50LgorIDwvcD4KKyA8cD5UaGVyZSBhcmUgYXR0cmlidXRlcyB0byBjaG9vc2Ugd2hpY2ggaXRlbXMgdG8gZXhwb3J0OgorIDx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgPHRyPgorICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKyAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyA8L3RyPgorIDx0cj4KKyAgIDx0ZCB2YWxpZ249InRvcCI+cHJvamVjdDwvdGQ+CisgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBuYW1lIG9mIHRoZSBQcm9qZWN0IHRvIGltcG9ydCB0bzwvdGQ+CisgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPlllczwvdGQ+CisgPC90cj4KKyA8dHI+CisgICA8dGQgdmFsaWduPSJ0b3AiPmltcG9ydFNvdXJjZXM8L3RkPgorICAgPHRkIHZhbGlnbj0idG9wIj5pbXBvcnQgSmF2YSBzb3VyY2VzLCBkZWZhdWx0cyB0byAieWVzIjwvdGQ+CisgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyA8L3RyPgorIDx0cj4KKyAgIDx0ZCB2YWxpZ249InRvcCI+aW1wb3J0UmVzb3VyY2VzPC90ZD4KKyAgIDx0ZCB2YWxpZ249InRvcCI+aW1wb3J0IHJlc291cmNlIGZpbGVzIChhbnl0aGluZyB0aGF0IGRvZXNuJ3QKKyAgICAgICAgICAgICAgICAgICAgZW5kIHdpdGggLmphdmEgb3IgLmNsYXNzKSwgZGVmYXVsdHMgdG8gInllcyI8L3RkPgorICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgPC90cj4KKyA8dHI+CisgICA8dGQgdmFsaWduPSJ0b3AiPmltcG9ydENsYXNzZXM8L3RkPgorICAgPHRkIHZhbGlnbj0idG9wIj5pbXBvcnQgY2xhc3MgZmlsZXMsIGRlZmF1bHRzIHRvICJubyI8L3RkPgorICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgPC90cj4KKyA8L3RhYmxlPl1dPgorICA8L2Rlc2NyaXB0aW9uPgorCisgIDxzdHJ1Y3R1cmU+CisKKyAgICA8YXR0cmlidXRlcz4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVmYXVsdGV4Y2x1ZGVzIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NldHMgd2hldGhlciBkZWZhdWx0IGV4Y2x1c2lvbnMgc2hvdWxkIGJlIHVzZWQgb3Igbm90Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXRzIHdoZXRoZXIgZGVmYXVsdCBleGNsdXNpb25zIHNob3VsZCBiZSB1c2VkIG9yIG5vdC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpbXBvcnRjbGFzc2VzIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0ZsYWcgdG8gaW1wb3J0IC5jbGFzcyBmaWxlczsgb3B0aW9uYWwsIGRlZmF1bHQgZmFsc2UuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIEZsYWcgdG8gaW1wb3J0IC5jbGFzcyBmaWxlczsgb3B0aW9uYWwsIGRlZmF1bHQgZmFsc2UuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaW1wb3J0cmVzb3VyY2VzIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0ltcG9ydCByZXNvdXJjZSBmaWxlcyAoYW55dGhpbmcgdGhhdCBkb2Vzbid0IGVuZCBpbgorIC5jbGFzcyBvciAuamF2YSk7IG9wdGlvbmFsLCBkZWZhdWx0IHRydWUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIEltcG9ydCByZXNvdXJjZSBmaWxlcyAoYW55dGhpbmcgdGhhdCBkb2Vzbid0IGVuZCBpbgorIC5jbGFzcyBvciAuamF2YSk7IG9wdGlvbmFsLCBkZWZhdWx0IHRydWUuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaW1wb3J0c291cmNlcyIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJbXBvcnQgLmphdmEgZmlsZXM7IG9wdGlvbmFsLCBkZWZhdWx0IHRydWUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIEltcG9ydCAuamF2YSBmaWxlczsgb3B0aW9uYWwsIGRlZmF1bHQgdHJ1ZS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwcm9qZWN0IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIFZpc3VhbEFnZSBmb3IgSmF2YSBQcm9qZWN0IG5hbWUgdG8gaW1wb3J0IGludG8uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRoZSBWaXN1YWxBZ2UgZm9yIEphdmEgUHJvamVjdCBuYW1lIHRvIGltcG9ydCBpbnRvLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InJlbW90ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW05hbWUgYW5kIHBvcnQgb2YgYSByZW1vdGUgdG9vbCBzZXJ2ZXIsIG9wdGlvbmEuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIE5hbWUgYW5kIHBvcnQgb2YgYSByZW1vdGUgdG9vbCBzZXJ2ZXIsIG9wdGlvbmEuCisgRm9ybWF0OiAmbHQ7c2VydmVybmFtZSZndDs6Jmx0O3BvcnQgbm8mZ3Q7LgorIElmIHRoaXMgYXR0cmlidXRlIGlzIHNldCwgdGhlIHRhc2tzIHdpbGwgYmUgZXhlY3V0ZWQgb24gdGhlIHNwZWNpZmllZCB0b29sCisgc2VydmVyLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgPC9hdHRyaWJ1dGVzPgorCisgICAgPGVsZW1lbnRzPgorICAgICAgPGVsZW1lbnQgbmFtZT0iZmlsZXNldCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldCIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZXNldCIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgYSBzZXQgb2YgZmlsZXMgKG5lc3RlZCBmaWxlc2V0IGF0dHJpYnV0ZSkuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0FkZHMgYSBzZXQgb2YgZmlsZXMgKG5lc3RlZCBmaWxlc2V0IGF0dHJpYnV0ZSkuXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICA8L2VsZW1lbnRzPgorCisgIDwvc3RydWN0dXJlPgorCis8L3Rhc2s+CisKKworPHRhc2sgbmFtZT0idmFqbG9hZCIgY2F0ZWdvcnk9Im90aGVyIgorICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5pZGUuVkFKTG9hZCIKKyAgICAgID4KKworICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTG9hZCBzcGVjaWZpYyBwcm9qZWN0IHZlcnNpb25zIGludG8gdGhlIFZpc3VhbCBBZ2UgZm9yIEphdmEgd29ya3NwYWNlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgIDxkZXNjcmlwdGlvbj4KKyAgICA8IVtDREFUQVtMb2FkIHNwZWNpZmljIHByb2plY3QgdmVyc2lvbnMgaW50byB0aGUgVmlzdWFsIEFnZSBmb3IgSmF2YSB3b3Jrc3BhY2UuCisgRWFjaCBwcm9qZWN0IGFuZCB2ZXJzaW9uIG5hbWUgaGFzIHRvIGJlIHNwZWNpZmllZCBjb21wbGV0ZWx5LgorIEV4YW1wbGU6ICAKKyA8YmxvY2txdW90ZT4gCisgJmx0O3ZhamxvYWQ+CisgJm5ic3A7Jmx0O3Byb2plY3QgbmFtZT0iTXlWQVByb2plY3QiIHZlcnNpb249IjIuMSIvPgorICZuYnNwOyZsdDtwcm9qZWN0IG5hbWU9IkFwYWNoZSBYZXJjZXMiIHZlcnNpb249IjEuMi4wIi8+CisgJmx0Oy92YWpsb2FkPgorIDwvYmxvY2txdW90ZT5dXT4KKyAgPC9kZXNjcmlwdGlvbj4KKworICA8c3RydWN0dXJlPgorCisgICAgPGF0dHJpYnV0ZXM+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InJlbW90ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW05hbWUgYW5kIHBvcnQgb2YgYSByZW1vdGUgdG9vbCBzZXJ2ZXIsIG9wdGlvbmEuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIE5hbWUgYW5kIHBvcnQgb2YgYSByZW1vdGUgdG9vbCBzZXJ2ZXIsIG9wdGlvbmEuCisgRm9ybWF0OiAmbHQ7c2VydmVybmFtZSZndDs6Jmx0O3BvcnQgbm8mZ3Q7LgorIElmIHRoaXMgYXR0cmlidXRlIGlzIHNldCwgdGhlIHRhc2tzIHdpbGwgYmUgZXhlY3V0ZWQgb24gdGhlIHNwZWNpZmllZCB0b29sCisgc2VydmVyLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgPC9hdHRyaWJ1dGVzPgorCisgICAgPGVsZW1lbnRzPgorICAgICAgPGVsZW1lbnQgbmFtZT0idmFqcHJvamVjdCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuaWRlLlZBSlByb2plY3REZXNjcmlwdGlvbiIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkIGEgcHJvamVjdCBkZXNjcmlwdGlvbiBlbnRyeSBvbiB0aGUgcHJvamVjdCBsaXN0Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtBZGQgYSBwcm9qZWN0IGRlc2NyaXB0aW9uIGVudHJ5IG9uIHRoZSBwcm9qZWN0IGxpc3QuXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICA8L2VsZW1lbnRzPgorCisgIDwvc3RydWN0dXJlPgorCis8L3Rhc2s+CisKKworPHRhc2sgbmFtZT0idnNzYWRkIiBjYXRlZ29yeT0ic2NtIgorICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC52c3MuTVNWU1NBREQiCisgICAgICA+CisKKyAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1BlcmZvcm1zIEFkZCBjb21tYW5kcyB0byBNaWNyb3NvZnQgVmlzdWFsIFNvdXJjZVNhZmUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgPGRlc2NyaXB0aW9uPgorICAgIDwhW0NEQVRBW1BlcmZvcm1zIEFkZCBjb21tYW5kcyB0byBNaWNyb3NvZnQgVmlzdWFsIFNvdXJjZVNhZmUuCisgQmFzZWQgb24gdGhlIFZTUyBDaGVja2luIGNvZGUgYnkgTWFydGluIFBvZXNjaGxdXT4KKyAgPC9kZXNjcmlwdGlvbj4KKworICA8c3RydWN0dXJlPgorCisgICAgPGF0dHJpYnV0ZXM+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImF1dG9yZXNwb25zZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1doYXQgdG8gcmVzcG9uZCB3aXRoIChzZXRzIHRoZSAtSSBvcHRpb24pLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBXaGF0IHRvIHJlc3BvbmQgd2l0aCAoc2V0cyB0aGUgLUkgb3B0aW9uKS4gQnkgZGVmYXVsdCwgLUktIGlzCisgdXNlZDsgdmFsdWVzIG9mIFkgb3IgTiB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoaXMuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29tbWVudCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NvbW1lbnQgdG8gYXBwbHk7IG9wdGlvbmFsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXRzIHRoZSBjb21tZW50IHRvIGFwcGx5OyBvcHRpb25hbC4KKyA8cD4KKyBJZiB0aGlzIGlzIG51bGwgb3IgZW1wdHksIGl0IHdpbGwgYmUgcmVwbGFjZWQgd2l0aCAiLSIgd2hpY2gKKyBpcyB3aGF0IFNvdXJjZVNhZmUgdXNlcyBmb3IgYW4gZW1wdHkgY29tbWVudC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsb2NhbHBhdGgiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUGF0aCIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTG9jYWwgcGF0aC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBsb2NhbCBwYXRoLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImxvZ2luIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGxvZ2luIHRvIHVzZSB3aGVuIGFjY2Vzc2luZyBWU1MsIGZvcm1hdHRlZCBhcyAidXNlcm5hbWUscGFzc3dvcmQiOworIG9wdGlvbmFsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBUaGUgbG9naW4gdG8gdXNlIHdoZW4gYWNjZXNzaW5nIFZTUywgZm9ybWF0dGVkIGFzICJ1c2VybmFtZSxwYXNzd29yZCI7Cisgb3B0aW9uYWwuCisgPHA+CisgWW91IGNhbiBvbWl0IHRoZSBwYXNzd29yZCBpZiB5b3VyIGRhdGFiYXNlIGlzIG5vdCBwYXNzd29yZCBwcm90ZWN0ZWQuCisgIGlmIHlvdSBoYXZlIGEgcGFzc3dvcmQgYW5kIG9taXQgaXQsIEFudC9WU1Mgd2lsbCBoYW5nLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InJlY3Vyc2l2ZSIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTZXQgYmVoYXZpb3VyIHJlY3Vyc2l2ZSBvciBub24tcmVjdXJzaXZlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgYmVoYXZpb3VyIHJlY3Vyc2l2ZSBvciBub24tcmVjdXJzaXZlCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic2VydmVycGF0aCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0RpcmVjdG9yeSB3aGVyZSA8Y29kZT5zcnNzYWZlLmluaTwvY29kZT4gcmVzaWRlczsgb3B0aW9uYWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCB0aGUgZGlyZWN0b3J5IHdoZXJlIDxjb2RlPnNyc3NhZmUuaW5pPC9jb2RlPiByZXNpZGVzOyBvcHRpb25hbC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzc2RpciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0RpcmVjdG9yeSB3aGVyZSA8Y29kZT5zcy5leGU8L2NvZGU+IHJlc2lkZXM7IG9wdGlvbmFsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBkaXJlY3Rvcnkgd2hlcmUgPGNvZGU+c3MuZXhlPC9jb2RlPiByZXNpZGVzOyBvcHRpb25hbC4KKyBCeSBkZWZhdWx0IHRoZSB0YXNrIGV4cGVjdHMgaXQgdG8gYmUgaW4gdGhlIFBBVEguCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idnNzcGF0aCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NvdXJjZVNhZmUgcGF0aCB3aGljaCBzcGVjaWZpZXMgdGhlIHByb2plY3QvZmlsZShzKSB5b3Ugd2lzaCB0byAKKyBwZXJmb3JtIHRoZSBhY3Rpb24gb247IHJlcXVpcmVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTb3VyY2VTYWZlIHBhdGggd2hpY2ggc3BlY2lmaWVzIHRoZSBwcm9qZWN0L2ZpbGUocykgeW91IHdpc2ggdG8gCisgcGVyZm9ybSB0aGUgYWN0aW9uIG9uOyByZXF1aXJlZC4gWW91IHNob3VsZCBub3Qgc3BlY2lmeSB0aGUgbGVhZGluZyBkb2xsYXItc2lnbiAtIAorIGl0IGlzIHByZXBlbmRlZCBieSBBbnQgYXV0b21hdGljYWxseS4KKyA8cD4KKyBBbnQgY2FuJ3QgY29wZSB3aXRoIGEgJyQnIHNpZ24gaW4gYW4gYXR0cmlidXRlIHNvIHdlIGhhdmUgdG8gYWRkIGl0IGhlcmUuCisgQWxzbyB3ZSBzdHJpcCBvZmYgYW55ICd2c3M6Ly8nIHByZWZpeCB3aGljaCBpcyBhbiBYTVMgc3BlY2lhbCBhbmQgc2hvdWxkIHByb2JhYmx5IGJlIHJlbW92ZWQhCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0id3JpdGFibGUiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTGVhdmUgYWRkZWQgZmlsZXMgd3JpdGFibGU/Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBMZWF2ZSBhZGRlZCBmaWxlcyB3cml0YWJsZT8gRGVmYXVsdDogZmFsc2UuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICA8L2F0dHJpYnV0ZXM+CisKKyAgICA8ZWxlbWVudHM+CisgICAgPC9lbGVtZW50cz4KKworICA8L3N0cnVjdHVyZT4KKworPC90YXNrPgorCisKKzx0YXNrIG5hbWU9InZzc2NoZWNraW4iIGNhdGVnb3J5PSJzY20iCisgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnZzcy5NU1ZTU0NIRUNLSU4iCisgICAgICA+CisKKyAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1BlcmZvcm1zIENoZWNrSW4gY29tbWFuZHMgdG8gTWljcm9zb2Z0IFZpc3VhbCBTb3VyY2VTYWZlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgIDxkZXNjcmlwdGlvbj4KKyAgICA8IVtDREFUQVtQZXJmb3JtcyBDaGVja0luIGNvbW1hbmRzIHRvIE1pY3Jvc29mdCBWaXN1YWwgU291cmNlU2FmZS5dXT4KKyAgPC9kZXNjcmlwdGlvbj4KKworICA8c3RydWN0dXJlPgorCisgICAgPGF0dHJpYnV0ZXM+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImF1dG9yZXNwb25zZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1doYXQgdG8gcmVzcG9uZCB3aXRoIChzZXRzIHRoZSAtSSBvcHRpb24pLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBXaGF0IHRvIHJlc3BvbmQgd2l0aCAoc2V0cyB0aGUgLUkgb3B0aW9uKS4gQnkgZGVmYXVsdCwgLUktIGlzCisgdXNlZDsgdmFsdWVzIG9mIFkgb3IgTiB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoaXMuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29tbWVudCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NvbW1lbnQgdG8gYXBwbHk7IG9wdGlvbmFsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIGNvbW1lbnQgdG8gYXBwbHk7IG9wdGlvbmFsLgorIDxwPgorIElmIHRoaXMgaXMgbnVsbCBvciBlbXB0eSwgaXQgd2lsbCBiZSByZXBsYWNlZCB3aXRoICItIiB3aGljaAorIGlzIHdoYXQgU291cmNlU2FmZSB1c2VzIGZvciBhbiBlbXB0eSBjb21tZW50LgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImxvY2FscGF0aCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aCIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJQYXRoIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtMb2NhbCBwYXRoLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIGxvY2FsIHBhdGguCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibG9naW4iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgbG9naW4gdG8gdXNlIHdoZW4gYWNjZXNzaW5nIFZTUywgZm9ybWF0dGVkIGFzICJ1c2VybmFtZSxwYXNzd29yZCI7Cisgb3B0aW9uYWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRoZSBsb2dpbiB0byB1c2Ugd2hlbiBhY2Nlc3NpbmcgVlNTLCBmb3JtYXR0ZWQgYXMgInVzZXJuYW1lLHBhc3N3b3JkIjsKKyBvcHRpb25hbC4KKyA8cD4KKyBZb3UgY2FuIG9taXQgdGhlIHBhc3N3b3JkIGlmIHlvdXIgZGF0YWJhc2UgaXMgbm90IHBhc3N3b3JkIHByb3RlY3RlZC4KKyAgaWYgeW91IGhhdmUgYSBwYXNzd29yZCBhbmQgb21pdCBpdCwgQW50L1ZTUyB3aWxsIGhhbmcuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icmVjdXJzaXZlIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0ZsYWcgdG8gdGVsbCB0aGUgdGFzayB0byByZWN1cnNlIGRvd24gdGhlIHRyZWU7Cisgb3B0aW9uYWwsIGRlZmF1bHQgZmFsc2UuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIEZsYWcgdG8gdGVsbCB0aGUgdGFzayB0byByZWN1cnNlIGRvd24gdGhlIHRyZWU7Cisgb3B0aW9uYWwsIGRlZmF1bHQgZmFsc2UuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic2VydmVycGF0aCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0RpcmVjdG9yeSB3aGVyZSA8Y29kZT5zcnNzYWZlLmluaTwvY29kZT4gcmVzaWRlczsgb3B0aW9uYWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCB0aGUgZGlyZWN0b3J5IHdoZXJlIDxjb2RlPnNyc3NhZmUuaW5pPC9jb2RlPiByZXNpZGVzOyBvcHRpb25hbC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzc2RpciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0RpcmVjdG9yeSB3aGVyZSA8Y29kZT5zcy5leGU8L2NvZGU+IHJlc2lkZXM7IG9wdGlvbmFsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBkaXJlY3Rvcnkgd2hlcmUgPGNvZGU+c3MuZXhlPC9jb2RlPiByZXNpZGVzOyBvcHRpb25hbC4KKyBCeSBkZWZhdWx0IHRoZSB0YXNrIGV4cGVjdHMgaXQgdG8gYmUgaW4gdGhlIFBBVEguCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idnNzcGF0aCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NvdXJjZVNhZmUgcGF0aCB3aGljaCBzcGVjaWZpZXMgdGhlIHByb2plY3QvZmlsZShzKSB5b3Ugd2lzaCB0byAKKyBwZXJmb3JtIHRoZSBhY3Rpb24gb247IHJlcXVpcmVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTb3VyY2VTYWZlIHBhdGggd2hpY2ggc3BlY2lmaWVzIHRoZSBwcm9qZWN0L2ZpbGUocykgeW91IHdpc2ggdG8gCisgcGVyZm9ybSB0aGUgYWN0aW9uIG9uOyByZXF1aXJlZC4gWW91IHNob3VsZCBub3Qgc3BlY2lmeSB0aGUgbGVhZGluZyBkb2xsYXItc2lnbiAtIAorIGl0IGlzIHByZXBlbmRlZCBieSBBbnQgYXV0b21hdGljYWxseS4KKyA8cD4KKyBBbnQgY2FuJ3QgY29wZSB3aXRoIGEgJyQnIHNpZ24gaW4gYW4gYXR0cmlidXRlIHNvIHdlIGhhdmUgdG8gYWRkIGl0IGhlcmUuCisgQWxzbyB3ZSBzdHJpcCBvZmYgYW55ICd2c3M6Ly8nIHByZWZpeCB3aGljaCBpcyBhbiBYTVMgc3BlY2lhbCBhbmQgc2hvdWxkIHByb2JhYmx5IGJlIHJlbW92ZWQhCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0id3JpdGFibGUiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTGVhdmUgY2hlY2tlZCBpbiBmaWxlcyB3cml0YWJsZT8uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIExlYXZlIGNoZWNrZWQgaW4gZmlsZXMgd3JpdGFibGU/IERlZmF1bHQ6IGZhbHNlLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgPC9hdHRyaWJ1dGVzPgorCisgICAgPGVsZW1lbnRzPgorICAgIDwvZWxlbWVudHM+CisKKyAgPC9zdHJ1Y3R1cmU+CisKKzwvdGFzaz4KKworCis8dGFzayBuYW1lPSJ2c3NjaGVja291dCIgY2F0ZWdvcnk9InNjbSIKKyAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwudnNzLk1TVlNTQ0hFQ0tPVVQiCisgICAgICA+CisKKyAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1BlcmZvcm1zIENoZWNrT3V0IGNvbW1hbmRzIHRvIE1pY3Jvc29mdCBWaXN1YWwgU291cmNlU2FmZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICA8ZGVzY3JpcHRpb24+CisgICAgPCFbQ0RBVEFbUGVyZm9ybXMgQ2hlY2tPdXQgY29tbWFuZHMgdG8gTWljcm9zb2Z0IFZpc3VhbCBTb3VyY2VTYWZlLgorIDxwPklmIHlvdSBzcGVjaWZ5IHR3byBvciBtb3JlIGF0dHJpYnV0ZXMgZnJvbSB2ZXJzaW9uLCBkYXRlIGFuZCAKKyBsYWJlbCBvbmx5IG9uZSB3aWxsIGJlIHVzZWQgaW4gdGhlIG9yZGVyIHZlcnNpb24sIGRhdGUsIGxhYmVsLjwvcD5dXT4KKyAgPC9kZXNjcmlwdGlvbj4KKworICA8c3RydWN0dXJlPgorCisgICAgPGF0dHJpYnV0ZXM+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImF1dG9yZXNwb25zZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1doYXQgdG8gcmVzcG9uZCB3aXRoIChzZXRzIHRoZSAtSSBvcHRpb24pLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBXaGF0IHRvIHJlc3BvbmQgd2l0aCAoc2V0cyB0aGUgLUkgb3B0aW9uKS4gQnkgZGVmYXVsdCwgLUktIGlzCisgdXNlZDsgdmFsdWVzIG9mIFkgb3IgTiB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoaXMuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGF0ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0RhdGUgdG8gZ2V0OworIG9wdGlvbmFsLCBvbmx5IG9uZSBvZiA8dHQ+dmVyc2lvbjwvdHQ+LCA8dHQ+bGFiZWw8L3R0Piwgb3IgPHR0PmRhdGU8L3R0PgorIGFsbG93ZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCB0aGUgZGF0ZSB0byBnZXQ7Cisgb3B0aW9uYWwsIG9ubHkgb25lIG9mIDx0dD52ZXJzaW9uPC90dD4sIDx0dD5sYWJlbDwvdHQ+LCBvciA8dHQ+ZGF0ZTwvdHQ+CisgYWxsb3dlZC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsYWJlbCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0xhYmVsIHRvIGdldDsKKyBvcHRpb25hbCwgb25seSBvbmUgb2YgPHR0PnZlcnNpb248L3R0PiwgPHR0PmxhYmVsPC90dD4sIG9yIDx0dD5kYXRlPC90dD4KKyBhbGxvd2VkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIGxhYmVsIHRvIGdldDsKKyBvcHRpb25hbCwgb25seSBvbmUgb2YgPHR0PnZlcnNpb248L3R0PiwgPHR0PmxhYmVsPC90dD4sIG9yIDx0dD5kYXRlPC90dD4KKyBhbGxvd2VkLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImxvY2FscGF0aCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aCIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJQYXRoIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtMb2NhbCBwYXRoLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIGxvY2FsIHBhdGguCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibG9naW4iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgbG9naW4gdG8gdXNlIHdoZW4gYWNjZXNzaW5nIFZTUywgZm9ybWF0dGVkIGFzICJ1c2VybmFtZSxwYXNzd29yZCI7Cisgb3B0aW9uYWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRoZSBsb2dpbiB0byB1c2Ugd2hlbiBhY2Nlc3NpbmcgVlNTLCBmb3JtYXR0ZWQgYXMgInVzZXJuYW1lLHBhc3N3b3JkIjsKKyBvcHRpb25hbC4KKyA8cD4KKyBZb3UgY2FuIG9taXQgdGhlIHBhc3N3b3JkIGlmIHlvdXIgZGF0YWJhc2UgaXMgbm90IHBhc3N3b3JkIHByb3RlY3RlZC4KKyAgaWYgeW91IGhhdmUgYSBwYXNzd29yZCBhbmQgb21pdCBpdCwgQW50L1ZTUyB3aWxsIGhhbmcuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icmVjdXJzaXZlIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0ZsYWcgdG8gdGVsbCB0aGUgdGFzayB0byByZWN1cnNlIGRvd24gdGhlIHRyZWU7Cisgb3B0aW9uYWwsIGRlZmF1bHQgZmFsc2UuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIEZsYWcgdG8gdGVsbCB0aGUgdGFzayB0byByZWN1cnNlIGRvd24gdGhlIHRyZWU7Cisgb3B0aW9uYWwsIGRlZmF1bHQgZmFsc2UuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic2VydmVycGF0aCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0RpcmVjdG9yeSB3aGVyZSA8Y29kZT5zcnNzYWZlLmluaTwvY29kZT4gcmVzaWRlczsgb3B0aW9uYWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCB0aGUgZGlyZWN0b3J5IHdoZXJlIDxjb2RlPnNyc3NhZmUuaW5pPC9jb2RlPiByZXNpZGVzOyBvcHRpb25hbC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzc2RpciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0RpcmVjdG9yeSB3aGVyZSA8Y29kZT5zcy5leGU8L2NvZGU+IHJlc2lkZXM7IG9wdGlvbmFsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBkaXJlY3Rvcnkgd2hlcmUgPGNvZGU+c3MuZXhlPC9jb2RlPiByZXNpZGVzOyBvcHRpb25hbC4KKyBCeSBkZWZhdWx0IHRoZSB0YXNrIGV4cGVjdHMgaXQgdG8gYmUgaW4gdGhlIFBBVEguCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1ZlcnNpb24gdG8gZ2V0OworIG9wdGlvbmFsLCBvbmx5IG9uZSBvZiA8dHQ+dmVyc2lvbjwvdHQ+LCA8dHQ+bGFiZWw8L3R0Piwgb3IgPHR0PmRhdGU8L3R0PgorIGFsbG93ZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCB0aGUgdmVyc2lvbiB0byBnZXQ7Cisgb3B0aW9uYWwsIG9ubHkgb25lIG9mIDx0dD52ZXJzaW9uPC90dD4sIDx0dD5sYWJlbDwvdHQ+LCBvciA8dHQ+ZGF0ZTwvdHQ+CisgYWxsb3dlZC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2c3NwYXRoIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU291cmNlU2FmZSBwYXRoIHdoaWNoIHNwZWNpZmllcyB0aGUgcHJvamVjdC9maWxlKHMpIHlvdSB3aXNoIHRvIAorIHBlcmZvcm0gdGhlIGFjdGlvbiBvbjsgcmVxdWlyZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNvdXJjZVNhZmUgcGF0aCB3aGljaCBzcGVjaWZpZXMgdGhlIHByb2plY3QvZmlsZShzKSB5b3Ugd2lzaCB0byAKKyBwZXJmb3JtIHRoZSBhY3Rpb24gb247IHJlcXVpcmVkLiBZb3Ugc2hvdWxkIG5vdCBzcGVjaWZ5IHRoZSBsZWFkaW5nIGRvbGxhci1zaWduIC0gCisgaXQgaXMgcHJlcGVuZGVkIGJ5IEFudCBhdXRvbWF0aWNhbGx5LgorIDxwPgorIEFudCBjYW4ndCBjb3BlIHdpdGggYSAnJCcgc2lnbiBpbiBhbiBhdHRyaWJ1dGUgc28gd2UgaGF2ZSB0byBhZGQgaXQgaGVyZS4KKyBBbHNvIHdlIHN0cmlwIG9mZiBhbnkgJ3ZzczovLycgcHJlZml4IHdoaWNoIGlzIGFuIFhNUyBzcGVjaWFsIGFuZCBzaG91bGQgcHJvYmFibHkgYmUgcmVtb3ZlZCEKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgIDwvYXR0cmlidXRlcz4KKworICAgIDxlbGVtZW50cz4KKyAgICA8L2VsZW1lbnRzPgorCisgIDwvc3RydWN0dXJlPgorCis8L3Rhc2s+CisKKworPHRhc2sgbmFtZT0idnNzY3AiIGNhdGVnb3J5PSJzY20iCisgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnZzcy5NU1ZTU0NQIgorICAgICAgPgorCisgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtQZXJmb3JtcyBDUCAoQ2hhbmdlIFByb2plY3QpIGNvbW1hbmRzIHRvIE1pY3Jvc29mdCBWaXN1YWwgU291cmNlU2FmZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICA8ZGVzY3JpcHRpb24+CisgICAgPCFbQ0RBVEFbUGVyZm9ybXMgQ1AgKENoYW5nZSBQcm9qZWN0KSBjb21tYW5kcyB0byBNaWNyb3NvZnQgVmlzdWFsIFNvdXJjZVNhZmUuCisgPHA+VGhpcyB0YXNrIGlzIHR5cGljYWxseSB1c2VkIGJlZm9yZSBhIFZzc0FkZCBpbiBvcmRlciB0byBzZXQgdGhlIHRhcmdldCBwcm9qZWN0PC9wPgorIEJhc2VkIG9uIHRoZSBWU1MgQ2hlY2tpbiBjb2RlIGJ5IE1hcnRpbiBQb2VzY2hsXV0+CisgIDwvZGVzY3JpcHRpb24+CisKKyAgPHN0cnVjdHVyZT4KKworICAgIDxhdHRyaWJ1dGVzPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJhdXRvcmVzcG9uc2UiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtXaGF0IHRvIHJlc3BvbmQgd2l0aCAoc2V0cyB0aGUgLUkgb3B0aW9uKS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgV2hhdCB0byByZXNwb25kIHdpdGggKHNldHMgdGhlIC1JIG9wdGlvbikuIEJ5IGRlZmF1bHQsIC1JLSBpcworIHVzZWQ7IHZhbHVlcyBvZiBZIG9yIE4gd2lsbCBiZSBhcHBlbmRlZCB0byB0aGlzLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImxvZ2luIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGxvZ2luIHRvIHVzZSB3aGVuIGFjY2Vzc2luZyBWU1MsIGZvcm1hdHRlZCBhcyAidXNlcm5hbWUscGFzc3dvcmQiOworIG9wdGlvbmFsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBUaGUgbG9naW4gdG8gdXNlIHdoZW4gYWNjZXNzaW5nIFZTUywgZm9ybWF0dGVkIGFzICJ1c2VybmFtZSxwYXNzd29yZCI7Cisgb3B0aW9uYWwuCisgPHA+CisgWW91IGNhbiBvbWl0IHRoZSBwYXNzd29yZCBpZiB5b3VyIGRhdGFiYXNlIGlzIG5vdCBwYXNzd29yZCBwcm90ZWN0ZWQuCisgIGlmIHlvdSBoYXZlIGEgcGFzc3dvcmQgYW5kIG9taXQgaXQsIEFudC9WU1Mgd2lsbCBoYW5nLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InNlcnZlcnBhdGgiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtEaXJlY3Rvcnkgd2hlcmUgPGNvZGU+c3Jzc2FmZS5pbmk8L2NvZGU+IHJlc2lkZXM7IG9wdGlvbmFsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIGRpcmVjdG9yeSB3aGVyZSA8Y29kZT5zcnNzYWZlLmluaTwvY29kZT4gcmVzaWRlczsgb3B0aW9uYWwuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3NkaXIiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtEaXJlY3Rvcnkgd2hlcmUgPGNvZGU+c3MuZXhlPC9jb2RlPiByZXNpZGVzOyBvcHRpb25hbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgZGlyZWN0b3J5IHdoZXJlIDxjb2RlPnNzLmV4ZTwvY29kZT4gcmVzaWRlczsgb3B0aW9uYWwuCisgQnkgZGVmYXVsdCB0aGUgdGFzayBleHBlY3RzIGl0IHRvIGJlIGluIHRoZSBQQVRILgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InZzc3BhdGgiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTb3VyY2VTYWZlIHBhdGggd2hpY2ggc3BlY2lmaWVzIHRoZSBwcm9qZWN0L2ZpbGUocykgeW91IHdpc2ggdG8gCisgcGVyZm9ybSB0aGUgYWN0aW9uIG9uOyByZXF1aXJlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU291cmNlU2FmZSBwYXRoIHdoaWNoIHNwZWNpZmllcyB0aGUgcHJvamVjdC9maWxlKHMpIHlvdSB3aXNoIHRvIAorIHBlcmZvcm0gdGhlIGFjdGlvbiBvbjsgcmVxdWlyZWQuIFlvdSBzaG91bGQgbm90IHNwZWNpZnkgdGhlIGxlYWRpbmcgZG9sbGFyLXNpZ24gLSAKKyBpdCBpcyBwcmVwZW5kZWQgYnkgQW50IGF1dG9tYXRpY2FsbHkuCisgPHA+CisgQW50IGNhbid0IGNvcGUgd2l0aCBhICckJyBzaWduIGluIGFuIGF0dHJpYnV0ZSBzbyB3ZSBoYXZlIHRvIGFkZCBpdCBoZXJlLgorIEFsc28gd2Ugc3RyaXAgb2ZmIGFueSAndnNzOi8vJyBwcmVmaXggd2hpY2ggaXMgYW4gWE1TIHNwZWNpYWwgYW5kIHNob3VsZCBwcm9iYWJseSBiZSByZW1vdmVkIQorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgPC9hdHRyaWJ1dGVzPgorCisgICAgPGVsZW1lbnRzPgorICAgIDwvZWxlbWVudHM+CisKKyAgPC9zdHJ1Y3R1cmU+CisKKzwvdGFzaz4KKworCis8dGFzayBuYW1lPSJ2c3NjcmVhdGUiIGNhdGVnb3J5PSJzY20iCisgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnZzcy5NU1ZTU0NSRUFURSIKKyAgICAgID4KKworICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ3JlYXRlcyBhIG5ldyBwcm9qZWN0IGluIE1pY3Jvc29mdCBWaXN1YWwgU291cmNlU2FmZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICA8ZGVzY3JpcHRpb24+CisgICAgPCFbQ0RBVEFbQ3JlYXRlcyBhIG5ldyBwcm9qZWN0IGluIE1pY3Jvc29mdCBWaXN1YWwgU291cmNlU2FmZS4KKyA8cD4KKyBUaGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgYXJlIGludGVycHJldGVkOgorIDx0YWJsZSBib3JkZXI9IjEiPgorICAgPHRyPgorICAgICA8dGg+QXR0cmlidXRlPC90aD4KKyAgICAgPHRoPlZhbHVlczwvdGg+CisgICAgIDx0aD5SZXF1aXJlZDwvdGg+CisgICA8L3RyPgorICAgPHRyPgorICAgICAgPHRkPmxvZ2luPC90ZD4KKyAgICAgIDx0ZD51c2VybmFtZSxwYXNzd29yZDwvdGQ+CisgICAgICA8dGQ+Tm88L3RkPgorICAgPC90cj4KKyAgIDx0cj4KKyAgICAgIDx0ZD52c3NwYXRoPC90ZD4KKyAgICAgIDx0ZD5Tb3VyY2VTYWZlIHBhdGggb2YgcHJvamVjdCB0byBiZSBjcmVhdGVkPC90ZD4KKyAgICAgIDx0ZD5ZZXM8L3RkPgorICAgPC90cj4KKyAgIDx0cj4KKyAgICAgIDx0ZD5zc2RpcjwvdGQ+CisgICAgICA8dGQ+ZGlyZWN0b3J5IHdoZXJlIDxjb2RlPnNzLmV4ZTwvY29kZT4gcmVzaWRlcy4gQnkgZGVmYXVsdCB0aGUgdGFzaworICAgICAgZXhwZWN0cyBpdCB0byBiZSBpbiB0aGUgUEFUSC48L3RkPgorICAgICAgPHRkPk5vPC90ZD4KKyAgIDwvdHI+CisgICA8dHI+CisgICAgICA8dGQ+cXVpZXQ8L3RkPgorICAgICAgPHRkPnN1cHByZXNzIG91dHB1dCAob2ZmIGJ5IGRlZmF1bHQpPC90ZD4KKyAgICAgIDx0ZD5ObzwvdGQ+CisgICA8L3RyPgorICAgPHRyPgorICAgICAgPHRkPmZhaWxPbkVycm9yPC90ZD4KKyAgICAgIDx0ZD5mYWlsIGlmIHRoZXJlIGlzIGFuIGVycm9yIGNyZWF0aW5nIHRoZSBwcm9qZWN0ICh0cnVlIGJ5IGRlZmF1bHQpPC90ZD4KKyAgICAgIDx0ZD5ObzwvdGQ+CisgICA8L3RyPiAgIAorICAgPHRyPgorICAgICAgPHRkPmF1dG9yZXNwb25zZTwvdGQ+CisgICAgICA8dGQ+V2hhdCB0byByZXNwb25kIHdpdGggKHNldHMgdGhlIC1JIG9wdGlvbikuIEJ5IGRlZmF1bHQsIC1JLSBpcworICAgICAgdXNlZDsgdmFsdWVzIG9mIFkgb3IgTiB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoaXMuPC90ZD4KKyAgICAgIDx0ZD5ObzwvdGQ+CisgICA8L3RyPgorICAgPHRyPgorICAgICAgPHRkPmNvbW1lbnQ8L3RkPgorICAgICAgPHRkPlRoZSBjb21tZW50IHRvIHVzZSBmb3IgdGhpcyBsYWJlbC4gRW1wdHkgb3IgJy0nIGZvciBubyBjb21tZW50LjwvdGQ+CisgICAgICA8dGQ+Tm88L3RkPgorICAgPC90cj4KKyA8L3RhYmxlPl1dPgorICA8L2Rlc2NyaXB0aW9uPgorCisgIDxzdHJ1Y3R1cmU+CisKKyAgICA8YXR0cmlidXRlcz4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYXV0b3Jlc3BvbnNlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbV2hhdCB0byByZXNwb25kIHdpdGggKHNldHMgdGhlIC1JIG9wdGlvbikuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFdoYXQgdG8gcmVzcG9uZCB3aXRoIChzZXRzIHRoZSAtSSBvcHRpb24pLiBCeSBkZWZhdWx0LCAtSS0gaXMKKyB1c2VkOyB2YWx1ZXMgb2YgWSBvciBOIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhpcy4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb21tZW50IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ29tbWVudCB0byBhcHBseSBpbiBTb3VyY2VTYWZlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXRzIHRoZSBjb21tZW50IHRvIGFwcGx5IGluIFNvdXJjZVNhZmUuCisgPHA+CisgSWYgdGhpcyBpcyBudWxsIG9yIGVtcHR5LCBpdCB3aWxsIGJlIHJlcGxhY2VkIHdpdGggIi0iIHdoaWNoCisgaXMgd2hhdCBTb3VyY2VTYWZlIHVzZXMgZm9yIGFuIGVtcHR5IGNvbW1lbnQuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmFpbG9uZXJyb3IiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2V0cyB3aGV0aGVyIHRhc2sgc2hvdWxkIGZhaWwgaWYgdGhlcmUgaXMgYW4gZXJyb3IgY3JlYXRpbmcgdGhlIHByb2plY3Q7Cisgb3B0aW9uYWwsIGRlZmF1bHQgdHJ1ZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0cyB3aGV0aGVyIHRhc2sgc2hvdWxkIGZhaWwgaWYgdGhlcmUgaXMgYW4gZXJyb3IgY3JlYXRpbmcgdGhlIHByb2plY3Q7Cisgb3B0aW9uYWwsIGRlZmF1bHQgdHJ1ZS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsb2dpbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBsb2dpbiB0byB1c2Ugd2hlbiBhY2Nlc3NpbmcgVlNTLCBmb3JtYXR0ZWQgYXMgInVzZXJuYW1lLHBhc3N3b3JkIjsKKyBvcHRpb25hbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgVGhlIGxvZ2luIHRvIHVzZSB3aGVuIGFjY2Vzc2luZyBWU1MsIGZvcm1hdHRlZCBhcyAidXNlcm5hbWUscGFzc3dvcmQiOworIG9wdGlvbmFsLgorIDxwPgorIFlvdSBjYW4gb21pdCB0aGUgcGFzc3dvcmQgaWYgeW91ciBkYXRhYmFzZSBpcyBub3QgcGFzc3dvcmQgcHJvdGVjdGVkLgorICBpZiB5b3UgaGF2ZSBhIHBhc3N3b3JkIGFuZCBvbWl0IGl0LCBBbnQvVlNTIHdpbGwgaGFuZy4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJxdWlldCIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTZXRzL2NsZWFycyBxdWlldCBtb2RlOyBvcHRpb25hbCwgZGVmYXVsdCBmYWxzZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0cy9jbGVhcnMgcXVpZXQgbW9kZTsgb3B0aW9uYWwsIGRlZmF1bHQgZmFsc2UuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic2VydmVycGF0aCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0RpcmVjdG9yeSB3aGVyZSA8Y29kZT5zcnNzYWZlLmluaTwvY29kZT4gcmVzaWRlczsgb3B0aW9uYWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCB0aGUgZGlyZWN0b3J5IHdoZXJlIDxjb2RlPnNyc3NhZmUuaW5pPC9jb2RlPiByZXNpZGVzOyBvcHRpb25hbC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzc2RpciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0RpcmVjdG9yeSB3aGVyZSA8Y29kZT5zcy5leGU8L2NvZGU+IHJlc2lkZXM7IG9wdGlvbmFsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBkaXJlY3Rvcnkgd2hlcmUgPGNvZGU+c3MuZXhlPC9jb2RlPiByZXNpZGVzOyBvcHRpb25hbC4KKyBCeSBkZWZhdWx0IHRoZSB0YXNrIGV4cGVjdHMgaXQgdG8gYmUgaW4gdGhlIFBBVEguCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idnNzcGF0aCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NvdXJjZVNhZmUgcGF0aCB3aGljaCBzcGVjaWZpZXMgdGhlIHByb2plY3QvZmlsZShzKSB5b3Ugd2lzaCB0byAKKyBwZXJmb3JtIHRoZSBhY3Rpb24gb247IHJlcXVpcmVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTb3VyY2VTYWZlIHBhdGggd2hpY2ggc3BlY2lmaWVzIHRoZSBwcm9qZWN0L2ZpbGUocykgeW91IHdpc2ggdG8gCisgcGVyZm9ybSB0aGUgYWN0aW9uIG9uOyByZXF1aXJlZC4gWW91IHNob3VsZCBub3Qgc3BlY2lmeSB0aGUgbGVhZGluZyBkb2xsYXItc2lnbiAtIAorIGl0IGlzIHByZXBlbmRlZCBieSBBbnQgYXV0b21hdGljYWxseS4KKyA8cD4KKyBBbnQgY2FuJ3QgY29wZSB3aXRoIGEgJyQnIHNpZ24gaW4gYW4gYXR0cmlidXRlIHNvIHdlIGhhdmUgdG8gYWRkIGl0IGhlcmUuCisgQWxzbyB3ZSBzdHJpcCBvZmYgYW55ICd2c3M6Ly8nIHByZWZpeCB3aGljaCBpcyBhbiBYTVMgc3BlY2lhbCBhbmQgc2hvdWxkIHByb2JhYmx5IGJlIHJlbW92ZWQhCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICA8L2F0dHJpYnV0ZXM+CisKKyAgICA8ZWxlbWVudHM+CisgICAgPC9lbGVtZW50cz4KKworICA8L3N0cnVjdHVyZT4KKworPC90YXNrPgorCisKKzx0YXNrIG5hbWU9InZzc2dldCIgY2F0ZWdvcnk9InNjbSIKKyAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwudnNzLk1TVlNTR0VUIgorICAgICAgPgorCisgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtQZXJmb3JtIEdldCBjb21tYW5kcyB0byBNaWNyb3NvZnQgVmlzdWFsIFNvdXJjZVNhZmUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgPGRlc2NyaXB0aW9uPgorICAgIDwhW0NEQVRBW1BlcmZvcm0gR2V0IGNvbW1hbmRzIHRvIE1pY3Jvc29mdCBWaXN1YWwgU291cmNlU2FmZS4KKyA8cD4KKyBUaGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgYXJlIGludGVycHJldGVkOgorIDx0YWJsZSBib3JkZXI9IjEiPgorICAgPHRyPgorICAgICA8dGg+QXR0cmlidXRlPC90aD4KKyAgICAgPHRoPlZhbHVlczwvdGg+CisgICAgIDx0aD5SZXF1aXJlZDwvdGg+CisgICA8L3RyPgorICAgPHRyPgorICAgICAgPHRkPmxvZ2luPC90ZD4KKyAgICAgIDx0ZD51c2VybmFtZSxwYXNzd29yZDwvdGQ+CisgICAgICA8dGQ+Tm88L3RkPgorICAgPC90cj4KKyAgIDx0cj4KKyAgICAgIDx0ZD52c3NwYXRoPC90ZD4KKyAgICAgIDx0ZD5Tb3VyY2VTYWZlIHBhdGg8L3RkPgorICAgICAgPHRkPlllczwvdGQ+CisgICA8L3RyPgorICAgPHRyPgorICAgICAgPHRkPmxvY2FscGF0aDwvdGQ+CisgICAgICA8dGQ+T3ZlcnJpZGUgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IGFuZCBnZXQgdG8gdGhlIHNwZWNpZmllZCBwYXRoPC90ZD4KKyAgICAgIDx0ZD5ObzwvdGQ+CisgICA8L3RyPgorICAgPHRyPgorICAgICAgPHRkPndyaXRhYmxlPC90ZD4KKyAgICAgIDx0ZD50cnVlIG9yIGZhbHNlPC90ZD4KKyAgICAgIDx0ZD5ObzwvdGQ+CisgICA8L3RyPgorICAgPHRyPgorICAgICAgPHRkPnJlY3Vyc2l2ZTwvdGQ+CisgICAgICA8dGQ+dHJ1ZSBvciBmYWxzZTwvdGQ+CisgICAgICA8dGQ+Tm88L3RkPgorICAgPC90cj4KKyAgIDx0cj4KKyAgICAgIDx0ZD52ZXJzaW9uPC90ZD4KKyAgICAgIDx0ZD5hIHZlcnNpb24gbnVtYmVyIHRvIGdldDwvdGQ+CisgICAgICA8dGQ+Tm88L3RkPgorICAgPC90cj4KKyAgIDx0cj4KKyAgICAgIDx0ZD5kYXRlPC90ZD4KKyAgICAgIDx0ZD5hIGRhdGUgc3RhbXAgdG8gZ2V0IGF0PC90ZD4KKyAgICAgIDx0ZD5ObzwvdGQ+CisgICA8L3RyPgorICAgPHRyPgorICAgICAgPHRkPmxhYmVsPC90ZD4KKyAgICAgIDx0ZD5hIGxhYmVsIHRvIGdldCBmb3I8L3RkPgorICAgICAgPHRkPk5vPC90ZD4KKyAgIDwvdHI+CisgICA8dHI+CisgICAgICA8dGQ+cXVpZXQ8L3RkPgorICAgICAgPHRkPnN1cHByZXNzIG91dHB1dCAob2ZmIGJ5IGRlZmF1bHQpPC90ZD4KKyAgICAgIDx0ZD5ObzwvdGQ+CisgICA8L3RyPgorICAgPHRyPgorICAgICAgPHRkPmF1dG9yZXNwb25zZTwvdGQ+CisgICAgICA8dGQ+V2hhdCB0byByZXNwb25kIHdpdGggKHNldHMgdGhlIC1JIG9wdGlvbikuIEJ5IGRlZmF1bHQsIC1JLSBpcworICAgICAgdXNlZDsgdmFsdWVzIG9mIFkgb3IgTiB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoaXMuPC90ZD4KKyAgICAgIDx0ZD5ObzwvdGQ+CisgICA8L3RyPgorIDwvdGFibGU+CisgPHA+Tm90ZSB0aGF0IG9ubHkgb25lIG9mIHZlcnNpb24sIGRhdGUgb3IgbGFiZWwgc2hvdWxkIGJlIHNwZWNpZmllZDwvcD5dXT4KKyAgPC9kZXNjcmlwdGlvbj4KKworICA8c3RydWN0dXJlPgorCisgICAgPGF0dHJpYnV0ZXM+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImF1dG9yZXNwb25zZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1doYXQgdG8gcmVzcG9uZCB3aXRoIChzZXRzIHRoZSAtSSBvcHRpb24pLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBXaGF0IHRvIHJlc3BvbmQgd2l0aCAoc2V0cyB0aGUgLUkgb3B0aW9uKS4gQnkgZGVmYXVsdCwgLUktIGlzCisgdXNlZDsgdmFsdWVzIG9mIFkgb3IgTiB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoaXMuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGF0ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0RhdGUgdG8gZ2V0OworIG9wdGlvbmFsLCBvbmx5IG9uZSBvZiA8dHQ+dmVyc2lvbjwvdHQ+LCA8dHQ+bGFiZWw8L3R0Piwgb3IgPHR0PmRhdGU8L3R0PgorIGFsbG93ZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCB0aGUgZGF0ZSB0byBnZXQ7Cisgb3B0aW9uYWwsIG9ubHkgb25lIG9mIDx0dD52ZXJzaW9uPC90dD4sIDx0dD5sYWJlbDwvdHQ+LCBvciA8dHQ+ZGF0ZTwvdHQ+CisgYWxsb3dlZC4KKyA8cD4KKyBPUklHSU5BTCBDT01NRU5UIFRIQVQgRE9FUyBOT1QgU0VFTSBBVCBBTEwgVkFMSUQ6CisgTm90ZSB3ZSBhc3N1bWUgdGhhdCBpZiB0aGUgc3VwcGxpZWQgc3RyaW5nIGhhcyB0aGUgdmFsdWUgIm51bGwiIHRoYXQgc29tZXRoaW5nCisgd2VudCB3cm9uZyBhbmQgdGhhdCB0aGUgc3RyaW5nIHZhbHVlIGdvdCBwb3B1bGF0ZWQgZnJvbSBhIG51bGwgb2JqZWN0LiBUaGlzCisgaGFwcGVucyBpZiBhIGFudCB2YXJpYWJsZSBpcyB1c2VkIGUuZy4gZGF0ZT0iJHtkYXRlfSIgd2hlbiBkYXRlCisgaGFzIG5vdCBiZWVuIGRlZmluZWQgdG8gYW50IQorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImxhYmVsIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTGFiZWwgdG8gZ2V0OworIG9wdGlvbmFsLCBvbmx5IG9uZSBvZiA8dHQ+dmVyc2lvbjwvdHQ+LCA8dHQ+bGFiZWw8L3R0Piwgb3IgPHR0PmRhdGU8L3R0PgorIGFsbG93ZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCB0aGUgbGFiZWwgdG8gZ2V0OworIG9wdGlvbmFsLCBvbmx5IG9uZSBvZiA8dHQ+dmVyc2lvbjwvdHQ+LCA8dHQ+bGFiZWw8L3R0Piwgb3IgPHR0PmRhdGU8L3R0PgorIGFsbG93ZWQuCisgPHA+CisgTm90ZSB3ZSBhc3N1bWUgdGhhdCBpZiB0aGUgc3VwcGxpZWQgc3RyaW5nIGhhcyB0aGUgdmFsdWUgIm51bGwiIHRoYXQgc29tZXRoaW5nCisgd2VudCB3cm9uZyBhbmQgdGhhdCB0aGUgc3RyaW5nIHZhbHVlIGdvdCBwb3B1bGF0ZWQgZnJvbSBhIG51bGwgb2JqZWN0LiBUaGlzCisgaGFwcGVucyBpZiBhIGFudCB2YXJpYWJsZSBpcyB1c2VkIGUuZy4gbGFiZWw9IiR7bGFiZWxfc2VydmVyfSIgd2hlbiBsYWJlbF9zZXJ2ZXIKKyBoYXMgbm90IGJlZW4gZGVmaW5lZCB0byBhbnQhCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibG9jYWxwYXRoIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlBhdGgiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW092ZXJyaWRlIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBhbmQgZ2V0IHRvIHRoZSBzcGVjaWZpZWQgcGF0aDsgb3B0aW9uYWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIE92ZXJyaWRlIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBhbmQgZ2V0IHRvIHRoZSBzcGVjaWZpZWQgcGF0aDsgb3B0aW9uYWwuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibG9naW4iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgbG9naW4gdG8gdXNlIHdoZW4gYWNjZXNzaW5nIFZTUywgZm9ybWF0dGVkIGFzICJ1c2VybmFtZSxwYXNzd29yZCI7Cisgb3B0aW9uYWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRoZSBsb2dpbiB0byB1c2Ugd2hlbiBhY2Nlc3NpbmcgVlNTLCBmb3JtYXR0ZWQgYXMgInVzZXJuYW1lLHBhc3N3b3JkIjsKKyBvcHRpb25hbC4KKyA8cD4KKyBZb3UgY2FuIG9taXQgdGhlIHBhc3N3b3JkIGlmIHlvdXIgZGF0YWJhc2UgaXMgbm90IHBhc3N3b3JkIHByb3RlY3RlZC4KKyAgaWYgeW91IGhhdmUgYSBwYXNzd29yZCBhbmQgb21pdCBpdCwgQW50L1ZTUyB3aWxsIGhhbmcuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icXVpZXQiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRmxhZyB0byBzdXBwcmVzcyBvdXRwdXQgd2hlbiB0cnVlIDsgZmFsc2UgYnkgZGVmYXVsdC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgRmxhZyB0byBzdXBwcmVzcyBvdXRwdXQgd2hlbiB0cnVlIDsgZmFsc2UgYnkgZGVmYXVsdC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJyZWN1cnNpdmUiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRmxhZyB0byB0ZWxsIHRoZSB0YXNrIHRvIHJlY3Vyc2UgZG93biB0aGUgdHJlZTsKKyBvcHRpb25hbCwgZGVmYXVsdCBmYWxzZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgRmxhZyB0byB0ZWxsIHRoZSB0YXNrIHRvIHJlY3Vyc2UgZG93biB0aGUgdHJlZTsKKyBvcHRpb25hbCwgZGVmYXVsdCBmYWxzZS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzZXJ2ZXJwYXRoIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRGlyZWN0b3J5IHdoZXJlIDxjb2RlPnNyc3NhZmUuaW5pPC9jb2RlPiByZXNpZGVzOyBvcHRpb25hbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBkaXJlY3Rvcnkgd2hlcmUgPGNvZGU+c3Jzc2FmZS5pbmk8L2NvZGU+IHJlc2lkZXM7IG9wdGlvbmFsLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InNzZGlyIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRGlyZWN0b3J5IHdoZXJlIDxjb2RlPnNzLmV4ZTwvY29kZT4gcmVzaWRlczsgb3B0aW9uYWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIGRpcmVjdG9yeSB3aGVyZSA8Y29kZT5zcy5leGU8L2NvZGU+IHJlc2lkZXM7IG9wdGlvbmFsLgorIEJ5IGRlZmF1bHQgdGhlIHRhc2sgZXhwZWN0cyBpdCB0byBiZSBpbiB0aGUgUEFUSC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVmVyc2lvbiBudW1iZXIgdG8gZ2V0OyAKKyBvcHRpb25hbCwgb25seSBvbmUgb2YgPHR0PnZlcnNpb248L3R0PiwgPHR0PmxhYmVsPC90dD4sIG9yIDx0dD5kYXRlPC90dD4KKyBhbGxvd2VkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgYSB2ZXJzaW9uIG51bWJlciB0byBnZXQ7IAorIG9wdGlvbmFsLCBvbmx5IG9uZSBvZiA8dHQ+dmVyc2lvbjwvdHQ+LCA8dHQ+bGFiZWw8L3R0Piwgb3IgPHR0PmRhdGU8L3R0PgorIGFsbG93ZWQuCisgPHA+CisgT1JJR0lOQUwgQ09NTUVOVCBUSEFUIERPRVMgTk9UIFNFRU0gQVQgQUxMIFZBTElEOgorIE5vdGUgd2UgYXNzdW1lIHRoYXQgaWYgdGhlIHN1cHBsaWVkIHN0cmluZyBoYXMgdGhlIHZhbHVlICJudWxsIiB0aGF0IHNvbWV0aGluZworIHdlbnQgd3JvbmcgYW5kIHRoYXQgdGhlIHN0cmluZyB2YWx1ZSBnb3QgcG9wdWxhdGVkIGZyb20gYSBudWxsIG9iamVjdC4gVGhpcworIGhhcHBlbnMgaWYgYSBhbnQgdmFyaWFibGUgaXMgdXNlZCBlLmcuIHZlcnNpb249IiR7dmVyX3NlcnZlcn0iIHdoZW4gdmVyX3NlcnZlcgorIGhhcyBub3QgYmVlbiBkZWZpbmVkIHRvIGFudCEKKyBOTywgaW4gdGhpcyBjYXNlIHRoZSB2ZXJzaW9uIHN0cmluZyBpcyAiJHt2ZXJfc2VydmVyfSIuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idnNzcGF0aCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NvdXJjZVNhZmUgcGF0aCB3aGljaCBzcGVjaWZpZXMgdGhlIHByb2plY3QvZmlsZShzKSB5b3Ugd2lzaCB0byAKKyBwZXJmb3JtIHRoZSBhY3Rpb24gb247IHJlcXVpcmVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTb3VyY2VTYWZlIHBhdGggd2hpY2ggc3BlY2lmaWVzIHRoZSBwcm9qZWN0L2ZpbGUocykgeW91IHdpc2ggdG8gCisgcGVyZm9ybSB0aGUgYWN0aW9uIG9uOyByZXF1aXJlZC4gWW91IHNob3VsZCBub3Qgc3BlY2lmeSB0aGUgbGVhZGluZyBkb2xsYXItc2lnbiAtIAorIGl0IGlzIHByZXBlbmRlZCBieSBBbnQgYXV0b21hdGljYWxseS4KKyA8cD4KKyBBbnQgY2FuJ3QgY29wZSB3aXRoIGEgJyQnIHNpZ24gaW4gYW4gYXR0cmlidXRlIHNvIHdlIGhhdmUgdG8gYWRkIGl0IGhlcmUuCisgQWxzbyB3ZSBzdHJpcCBvZmYgYW55ICd2c3M6Ly8nIHByZWZpeCB3aGljaCBpcyBhbiBYTVMgc3BlY2lhbCBhbmQgc2hvdWxkIHByb2JhYmx5IGJlIHJlbW92ZWQhCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0id3JpdGFibGUiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTWFrZSBmZXRjaGVkIGZpbGVzICB3cml0YWJsZTsgb3B0aW9uYWwsIGRlZmF1bHQgZmFsc2UuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIG1ha2UgZmV0Y2hlZCBmaWxlcyAgd3JpdGFibGU7IG9wdGlvbmFsLCBkZWZhdWx0IGZhbHNlLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgPC9hdHRyaWJ1dGVzPgorCisgICAgPGVsZW1lbnRzPgorICAgIDwvZWxlbWVudHM+CisKKyAgPC9zdHJ1Y3R1cmU+CisKKzwvdGFzaz4KKworCis8dGFzayBuYW1lPSJ2c3NoaXN0b3J5IiBjYXRlZ29yeT0ic2NtIgorICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC52c3MuTVNWU1NISVNUT1JZIgorICAgICAgPgorCisgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtQZXJmb3JtcyBIaXN0b3J5IGNvbW1hbmRzIHRvIE1pY3Jvc29mdCBWaXN1YWwgU291cmNlU2FmZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICA8ZGVzY3JpcHRpb24+CisgICAgPCFbQ0RBVEFbUGVyZm9ybXMgSGlzdG9yeSBjb21tYW5kcyB0byBNaWNyb3NvZnQgVmlzdWFsIFNvdXJjZVNhZmUuXV0+CisgIDwvZGVzY3JpcHRpb24+CisKKyAgPHN0cnVjdHVyZT4KKworICAgIDxhdHRyaWJ1dGVzPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkYXRlZm9ybWF0IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRm9ybWF0IG9mIGRhdGVzIGluIGZyb21EYXRlIGFuZCB0b0RhdGU7IG9wdGlvbmFsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBGb3JtYXQgb2YgZGF0ZXMgaW4gZnJvbURhdGUgYW5kIHRvRGF0ZTsgb3B0aW9uYWwuCisgVXNlZCB3aGVuIGNhbGN1bGF0aW5nIGRhdGVzIHdpdGggCisgdGhlIG51bWRheXMgYXR0cmlidXRlLiAKKyBUaGlzIHN0cmluZyB1c2VzIHRoZSBmb3JtYXR0aW5nIHJ1bGVzIG9mIFNpbXBsZURhdGVGb3JtYXQuIAorICBEZWZhdWx0cyB0byBEYXRlRm9ybWF0LlNIT1JULgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImZyb21kYXRlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU3RhcnQgRGF0ZSBmb3IgdGhlIENvbXBhcmlzb24gb2YgdHdvIHZlcnNpb25zOyBvcHRpb25hbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBTdGFydCBEYXRlIGZvciB0aGUgQ29tcGFyaXNvbiBvZiB0d28gdmVyc2lvbnM7IG9wdGlvbmFsLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImZyb21sYWJlbCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1N0YXJ0IExhYmVsOyBvcHRpb25hbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBTdGFydCBMYWJlbDsgb3B0aW9uYWwKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsb2dpbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBsb2dpbiB0byB1c2Ugd2hlbiBhY2Nlc3NpbmcgVlNTLCBmb3JtYXR0ZWQgYXMgInVzZXJuYW1lLHBhc3N3b3JkIjsKKyBvcHRpb25hbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgVGhlIGxvZ2luIHRvIHVzZSB3aGVuIGFjY2Vzc2luZyBWU1MsIGZvcm1hdHRlZCBhcyAidXNlcm5hbWUscGFzc3dvcmQiOworIG9wdGlvbmFsLgorIDxwPgorIFlvdSBjYW4gb21pdCB0aGUgcGFzc3dvcmQgaWYgeW91ciBkYXRhYmFzZSBpcyBub3QgcGFzc3dvcmQgcHJvdGVjdGVkLgorICBpZiB5b3UgaGF2ZSBhIHBhc3N3b3JkIGFuZCBvbWl0IGl0LCBBbnQvVlNTIHdpbGwgaGFuZy4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJudW1kYXlzIiB0eXBlPSJpbnQiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iaW50IiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtOdW1iZXIgb2YgZGF5cyBmb3IgY29tcGFyaXNvbjsgCisgb3B0aW9uYWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCB0aGUgbnVtYmVyIG9mIGRheXMgZm9yIGNvbXBhcmlzb247IAorIG9wdGlvbmFsLgorIDxwPgorIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDIgZGF5cy4gKG1heWJlKQorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9Im91dHB1dCIgdHlwZT0iamF2YS5pby5GaWxlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW091dHB1dCBmaWxlIG5hbWUgZm9yIHRoZSBoaXN0b3J5OyBvcHRpb25hbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBvdXRwdXQgZmlsZSBuYW1lIGZvciB0aGUgaGlzdG9yeTsgb3B0aW9uYWwuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icmVjdXJzaXZlIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0ZsYWcgdG8gdGVsbCB0aGUgdGFzayB0byByZWN1cnNlIGRvd24gdGhlIHRyZWU7Cisgb3B0aW9uYWwsIGRlZmF1bHQgZmFsc2UuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIEZsYWcgdG8gdGVsbCB0aGUgdGFzayB0byByZWN1cnNlIGRvd24gdGhlIHRyZWU7Cisgb3B0aW9uYWwsIGRlZmF1bHQgZmFsc2UuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic2VydmVycGF0aCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0RpcmVjdG9yeSB3aGVyZSA8Y29kZT5zcnNzYWZlLmluaTwvY29kZT4gcmVzaWRlczsgb3B0aW9uYWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCB0aGUgZGlyZWN0b3J5IHdoZXJlIDxjb2RlPnNyc3NhZmUuaW5pPC9jb2RlPiByZXNpZGVzOyBvcHRpb25hbC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzc2RpciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0RpcmVjdG9yeSB3aGVyZSA8Y29kZT5zcy5leGU8L2NvZGU+IHJlc2lkZXM7IG9wdGlvbmFsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBkaXJlY3Rvcnkgd2hlcmUgPGNvZGU+c3MuZXhlPC9jb2RlPiByZXNpZGVzOyBvcHRpb25hbC4KKyBCeSBkZWZhdWx0IHRoZSB0YXNrIGV4cGVjdHMgaXQgdG8gYmUgaW4gdGhlIFBBVEguCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3R5bGUiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnZzcy5NU1ZTU0hJU1RPUlkuQnJpZWZDb2RlZGlmZk5vZmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSImcXVvdDticmllZiZxdW90OywgJnF1b3Q7Y29kZWRpZmYmcXVvdDssICZxdW90O25vZmlsZSZxdW90OywgJnF1b3Q7ZGVmYXVsdCZxdW90OyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU3BlY2lmeSB0aGUgb3V0cHV0IHN0eWxlOyBvcHRpb25hbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU3BlY2lmeSB0aGUgb3V0cHV0IHN0eWxlOyBvcHRpb25hbC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0b2RhdGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtFbmQgRGF0ZSBmb3IgdGhlIENvbXBhcmlzb24gb2YgdHdvIHZlcnNpb25zOyBvcHRpb25hbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBFbmQgRGF0ZSBmb3IgdGhlIENvbXBhcmlzb24gb2YgdHdvIHZlcnNpb25zOyBvcHRpb25hbC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0b2xhYmVsIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRW5kIExhYmVsIDsgb3B0aW9uYWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCB0aGUgRW5kIExhYmVsIDsgb3B0aW9uYWwKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1c2VyIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTmFtZSB0aGUgdXNlciB3aG9zZSBjaGFuZ2VzIHdlIHdvdWxkIGxpa2UgdG8gc2VlOyBvcHRpb25hbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgTmFtZSB0aGUgdXNlciB3aG9zZSBjaGFuZ2VzIHdlIHdvdWxkIGxpa2UgdG8gc2VlOyBvcHRpb25hbAorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InZzc3BhdGgiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTb3VyY2VTYWZlIHBhdGggd2hpY2ggc3BlY2lmaWVzIHRoZSBwcm9qZWN0L2ZpbGUocykgeW91IHdpc2ggdG8gCisgcGVyZm9ybSB0aGUgYWN0aW9uIG9uOyByZXF1aXJlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU291cmNlU2FmZSBwYXRoIHdoaWNoIHNwZWNpZmllcyB0aGUgcHJvamVjdC9maWxlKHMpIHlvdSB3aXNoIHRvIAorIHBlcmZvcm0gdGhlIGFjdGlvbiBvbjsgcmVxdWlyZWQuIFlvdSBzaG91bGQgbm90IHNwZWNpZnkgdGhlIGxlYWRpbmcgZG9sbGFyLXNpZ24gLSAKKyBpdCBpcyBwcmVwZW5kZWQgYnkgQW50IGF1dG9tYXRpY2FsbHkuCisgPHA+CisgQW50IGNhbid0IGNvcGUgd2l0aCBhICckJyBzaWduIGluIGFuIGF0dHJpYnV0ZSBzbyB3ZSBoYXZlIHRvIGFkZCBpdCBoZXJlLgorIEFsc28gd2Ugc3RyaXAgb2ZmIGFueSAndnNzOi8vJyBwcmVmaXggd2hpY2ggaXMgYW4gWE1TIHNwZWNpYWwgYW5kIHNob3VsZCBwcm9iYWJseSBiZSByZW1vdmVkIQorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgPC9hdHRyaWJ1dGVzPgorCisgICAgPGVsZW1lbnRzPgorICAgIDwvZWxlbWVudHM+CisKKyAgPC9zdHJ1Y3R1cmU+CisKKzwvdGFzaz4KKworCis8dGFzayBuYW1lPSJ2c3NsYWJlbCIgY2F0ZWdvcnk9InNjbSIKKyAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwudnNzLk1TVlNTTEFCRUwiCisgICAgICA+CisKKyAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1BlcmZvcm1zIExhYmVsIGNvbW1hbmRzIHRvIE1pY3Jvc29mdCBWaXN1YWwgU291cmNlU2FmZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICA8ZGVzY3JpcHRpb24+CisgICAgPCFbQ0RBVEFbUGVyZm9ybXMgTGFiZWwgY29tbWFuZHMgdG8gTWljcm9zb2Z0IFZpc3VhbCBTb3VyY2VTYWZlLgorCisgPHA+CisgVGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIGFyZSBpbnRlcnByZXRlZDoKKyA8dGFibGUgYm9yZGVyPSIxIj4KKyAgIDx0cj4KKyAgICAgPHRoPkF0dHJpYnV0ZTwvdGg+CisgICAgIDx0aD5WYWx1ZXM8L3RoPgorICAgICA8dGg+UmVxdWlyZWQ8L3RoPgorICAgPC90cj4KKyAgIDx0cj4KKyAgICAgIDx0ZD5sb2dpbjwvdGQ+CisgICAgICA8dGQ+dXNlcm5hbWUscGFzc3dvcmQ8L3RkPgorICAgICAgPHRkPk5vPC90ZD4KKyAgIDwvdHI+CisgICA8dHI+CisgICAgICA8dGQ+dnNzcGF0aDwvdGQ+CisgICAgICA8dGQ+U291cmNlU2FmZSBwYXRoPC90ZD4KKyAgICAgIDx0ZD5ZZXM8L3RkPgorICAgPC90cj4KKyAgIDx0cj4KKyAgICAgIDx0ZD5zc2RpcjwvdGQ+CisgICAgICA8dGQ+ZGlyZWN0b3J5IHdoZXJlIDxjb2RlPnNzLmV4ZTwvY29kZT4gcmVzaWRlcy4gQnkgZGVmYXVsdCB0aGUgdGFzaworICAgICAgZXhwZWN0cyBpdCB0byBiZSBpbiB0aGUgUEFUSC48L3RkPgorICAgICAgPHRkPk5vPC90ZD4KKyAgIDwvdHI+CisgICA8dHI+CisgICAgICA8dGQ+bGFiZWw8L3RkPgorICAgICAgPHRkPkEgbGFiZWwgdG8gYXBwbHkgdG8gdGhlIGhpZXJhcmNoeTwvdGQ+CisgICAgICA8dGQ+WWVzPC90ZD4KKyAgIDwvdHI+CisgICA8dHI+CisgICAgICA8dGQ+dmVyc2lvbjwvdGQ+CisgICAgICA8dGQ+QW4gZXhpc3RpbmcgZmlsZSBvciBwcm9qZWN0IHZlcnNpb24gdG8gbGFiZWw8L3RkPgorICAgICAgPHRkPk5vPC90ZD4KKyAgIDwvdHI+CisgICA8dHI+CisgICAgICA8dGQ+YXV0b3Jlc3BvbnNlPC90ZD4KKyAgICAgIDx0ZD5XaGF0IHRvIHJlc3BvbmQgd2l0aCAoc2V0cyB0aGUgLUkgb3B0aW9uKS4gQnkgZGVmYXVsdCwgLUktIGlzCisgICAgICB1c2VkOyB2YWx1ZXMgb2YgWSBvciBOIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhpcy48L3RkPgorICAgICAgPHRkPk5vPC90ZD4KKyAgIDwvdHI+CisgICA8dHI+CisgICAgICA8dGQ+Y29tbWVudDwvdGQ+CisgICAgICA8dGQ+VGhlIGNvbW1lbnQgdG8gdXNlIGZvciB0aGlzIGxhYmVsLiBFbXB0eSBvciAnLScgZm9yIG5vIGNvbW1lbnQuPC90ZD4KKyAgICAgIDx0ZD5ObzwvdGQ+CisgICA8L3RyPgorIDwvdGFibGU+XV0+CisgIDwvZGVzY3JpcHRpb24+CisKKyAgPHN0cnVjdHVyZT4KKworICAgIDxhdHRyaWJ1dGVzPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJhdXRvcmVzcG9uc2UiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtXaGF0IHRvIHJlc3BvbmQgd2l0aCAoc2V0cyB0aGUgLUkgb3B0aW9uKS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgV2hhdCB0byByZXNwb25kIHdpdGggKHNldHMgdGhlIC1JIG9wdGlvbikuIEJ5IGRlZmF1bHQsIC1JLSBpcworIHVzZWQ7IHZhbHVlcyBvZiBZIG9yIE4gd2lsbCBiZSBhcHBlbmRlZCB0byB0aGlzLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNvbW1lbnQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgY29tbWVudCB0byB1c2UgZm9yIHRoaXMgbGFiZWw7IG9wdGlvbmFsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBUaGUgY29tbWVudCB0byB1c2UgZm9yIHRoaXMgbGFiZWw7IG9wdGlvbmFsLgorIEVtcHR5IG9yICctJyBmb3Igbm8gY29tbWVudC4KKyA8cD4KKyBJZiB0aGlzIGlzIG51bGwgb3IgZW1wdHksIGl0IHdpbGwgYmUgcmVwbGFjZWQgd2l0aCAiLSIgd2hpY2gKKyBpcyB3aGF0IFNvdXJjZVNhZmUgdXNlcyBmb3IgYW4gZW1wdHkgY29tbWVudC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsYWJlbCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0xhYmVsIHRvIGFwcGx5OyByZXF1aXJlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBsYWJlbCB0byBhcHBseTsgcmVxdWlyZWQuCisgPHA+CisgTm90ZSB3ZSBhc3N1bWUgdGhhdCBpZiB0aGUgc3VwcGxpZWQgc3RyaW5nIGhhcyB0aGUgdmFsdWUgIm51bGwiIHRoYXQgc29tZXRoaW5nCisgd2VudCB3cm9uZyBhbmQgdGhhdCB0aGUgc3RyaW5nIHZhbHVlIGdvdCBwb3B1bGF0ZWQgZnJvbSBhIG51bGwgb2JqZWN0LiBUaGlzCisgaGFwcGVucyBpZiBhIGFudCB2YXJpYWJsZSBpcyB1c2VkIGUuZy4gbGFiZWw9IiR7bGFiZWxfc2VydmVyfSIgd2hlbiBsYWJlbF9zZXJ2ZXIKKyBoYXMgbm90IGJlZW4gZGVmaW5lZCB0byBhbnQhCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibG9naW4iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgbG9naW4gdG8gdXNlIHdoZW4gYWNjZXNzaW5nIFZTUywgZm9ybWF0dGVkIGFzICJ1c2VybmFtZSxwYXNzd29yZCI7Cisgb3B0aW9uYWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRoZSBsb2dpbiB0byB1c2Ugd2hlbiBhY2Nlc3NpbmcgVlNTLCBmb3JtYXR0ZWQgYXMgInVzZXJuYW1lLHBhc3N3b3JkIjsKKyBvcHRpb25hbC4KKyA8cD4KKyBZb3UgY2FuIG9taXQgdGhlIHBhc3N3b3JkIGlmIHlvdXIgZGF0YWJhc2UgaXMgbm90IHBhc3N3b3JkIHByb3RlY3RlZC4KKyAgaWYgeW91IGhhdmUgYSBwYXNzd29yZCBhbmQgb21pdCBpdCwgQW50L1ZTUyB3aWxsIGhhbmcuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic2VydmVycGF0aCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0RpcmVjdG9yeSB3aGVyZSA8Y29kZT5zcnNzYWZlLmluaTwvY29kZT4gcmVzaWRlczsgb3B0aW9uYWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCB0aGUgZGlyZWN0b3J5IHdoZXJlIDxjb2RlPnNyc3NhZmUuaW5pPC9jb2RlPiByZXNpZGVzOyBvcHRpb25hbC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzc2RpciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0RpcmVjdG9yeSB3aGVyZSA8Y29kZT5zcy5leGU8L2NvZGU+IHJlc2lkZXM7IG9wdGlvbmFsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBkaXJlY3Rvcnkgd2hlcmUgPGNvZGU+c3MuZXhlPC9jb2RlPiByZXNpZGVzOyBvcHRpb25hbC4KKyBCeSBkZWZhdWx0IHRoZSB0YXNrIGV4cGVjdHMgaXQgdG8gYmUgaW4gdGhlIFBBVEguCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW05hbWUgYW4gZXhpc3RpbmcgZmlsZSBvciBwcm9qZWN0IHZlcnNpb24gdG8gbGFiZWw7IG9wdGlvbmFsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBOYW1lIGFuIGV4aXN0aW5nIGZpbGUgb3IgcHJvamVjdCB2ZXJzaW9uIHRvIGxhYmVsOyBvcHRpb25hbC4KKyBCeSBkZWZhdWx0IHRoZSBjdXJyZW50IHZlcnNpb24gaXMgbGFiZWxsZWQuCisgPHA+CisgTm90ZSB3ZSBhc3N1bWUgdGhhdCBpZiB0aGUgc3VwcGxpZWQgc3RyaW5nIGhhcyB0aGUgdmFsdWUgIm51bGwiIHRoYXQgc29tZXRoaW5nCisgd2VudCB3cm9uZyBhbmQgdGhhdCB0aGUgc3RyaW5nIHZhbHVlIGdvdCBwb3B1bGF0ZWQgZnJvbSBhIG51bGwgb2JqZWN0LiBUaGlzCisgaGFwcGVucyBpZiBhIGFudCB2YXJpYWJsZSBpcyB1c2VkIGUuZy4gdmVyc2lvbj0iJHt2ZXJfc2VydmVyfSIgd2hlbiB2ZXJfc2VydmVyCisgaGFzIG5vdCBiZWVuIGRlZmluZWQgdG8gYW50IQorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InZzc3BhdGgiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTb3VyY2VTYWZlIHBhdGggd2hpY2ggc3BlY2lmaWVzIHRoZSBwcm9qZWN0L2ZpbGUocykgeW91IHdpc2ggdG8gCisgcGVyZm9ybSB0aGUgYWN0aW9uIG9uOyByZXF1aXJlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU291cmNlU2FmZSBwYXRoIHdoaWNoIHNwZWNpZmllcyB0aGUgcHJvamVjdC9maWxlKHMpIHlvdSB3aXNoIHRvIAorIHBlcmZvcm0gdGhlIGFjdGlvbiBvbjsgcmVxdWlyZWQuIFlvdSBzaG91bGQgbm90IHNwZWNpZnkgdGhlIGxlYWRpbmcgZG9sbGFyLXNpZ24gLSAKKyBpdCBpcyBwcmVwZW5kZWQgYnkgQW50IGF1dG9tYXRpY2FsbHkuCisgPHA+CisgQW50IGNhbid0IGNvcGUgd2l0aCBhICckJyBzaWduIGluIGFuIGF0dHJpYnV0ZSBzbyB3ZSBoYXZlIHRvIGFkZCBpdCBoZXJlLgorIEFsc28gd2Ugc3RyaXAgb2ZmIGFueSAndnNzOi8vJyBwcmVmaXggd2hpY2ggaXMgYW4gWE1TIHNwZWNpYWwgYW5kIHNob3VsZCBwcm9iYWJseSBiZSByZW1vdmVkIQorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgPC9hdHRyaWJ1dGVzPgorCisgICAgPGVsZW1lbnRzPgorICAgIDwvZWxlbWVudHM+CisKKyAgPC9zdHJ1Y3R1cmU+CisKKzwvdGFzaz4KKworCis8dGFzayBuYW1lPSJ3YWl0Zm9yIiBjYXRlZ29yeT0iY29udHJvbCIKKyAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuV2FpdEZvciIKKyAgICAgID4KKworICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbV2FpdCBmb3IgYW4gZXh0ZXJuYWwgZXZlbnQgdG8gb2NjdXIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgPGRlc2NyaXB0aW9uPgorICAgIDwhW0NEQVRBW1dhaXQgZm9yIGFuIGV4dGVybmFsIGV2ZW50IHRvIG9jY3VyLgorCisgV2FpdCBmb3IgYW4gZXh0ZXJuYWwgcHJvY2VzcyB0byBzdGFydCBvciB0byBjb21wbGV0ZSBzb21lCisgdGFzay4gVGhpcyBpcyB1c2VmdWwgd2l0aCB0aGUgPGNvZGU+cGFyYWxsZWw8L2NvZGU+IHRhc2sgdG8KKyBzeW5jcm9uaXplIHRoZSBleGVjdXRpb24gb2YgdGVzdHMgd2l0aCBzZXJ2ZXIgc3RhcnR1cC4KKworIFRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBjYW4gYmUgc3BlY2lmaWVkIG9uIGEgd2FpdGZvciB0YXNrOgorIDx1bD4KKyA8bGk+bWF4d2FpdCAtIG1heGltdW0gbGVuZ3RoIG9mIHRpbWUgdG8gd2FpdCBiZWZvcmUgZ2l2aW5nIHVwPC9saT4KKyA8bGk+bWF4d2FpdHVuaXQgLSBUaGUgdW5pdCB0byBiZSB1c2VkIHRvIGludGVycHJldCBtYXh3YWl0IGF0dHJpYnV0ZTwvbGk+CisgPGxpPmNoZWNrZXZlcnkgLSBhbW91bnQgb2YgdGltZSB0byBzbGVlcCBiZXR3ZWVuIGVhY2ggY2hlY2s8L2xpPgorIDxsaT5jaGVja2V2ZXJ5dW5pdCAtIFRoZSB1bml0IHRvIGJlIHVzZWQgdG8gaW50ZXJwcmV0IGNoZWNrZXZlcnkgYXR0cmlidXRlPC9saT4KKyA8bGk+dGltZW91dHByb3BlcnR5IC0gbmFtZSBvZiBhIHByb3BlcnR5IHRvIHNldCBpZiBtYXh3YWl0IGhhcyBiZWVuIGV4Y2VlZGVkLjwvbGk+CisgPC91bD4KKworIFRoZSBtYXh3YWl0dW5pdCBhbmQgY2hlY2tldmVyeXVuaXQgYXJlIGFsbG93ZWQgdG8gaGF2ZSB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyBtaWxsZXNvbmQsIHNlY29uZCwgbWludXRlLCBob3VyLCBkYXkgYW5kIHdlZWsuIFRoZSBkZWZhdWx0IGlzIG1pbGxpc2Vjb25kLl1dPgorICA8L2Rlc2NyaXB0aW9uPgorCisgIDxzdHJ1Y3R1cmU+CisKKyAgICA8YXR0cmlidXRlcz4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2hlY2tldmVyeSIgdHlwZT0ibG9uZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJsb25nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaW1lIGJldHdlZW4gZWFjaCBjaGVjay5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSB0aW1lIGJldHdlZW4gZWFjaCBjaGVjaworICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNoZWNrZXZlcnl1bml0IiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5XYWl0Rm9yLlVuaXQiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iJnF1b3Q7bWlsbGlzZWNvbmQmcXVvdDssICZxdW90O3NlY29uZCZxdW90OywgJnF1b3Q7bWludXRlJnF1b3Q7LCAmcXVvdDtob3VyJnF1b3Q7LCAmcXVvdDtkYXkmcXVvdDssICZxdW90O3dlZWsmcXVvdDsiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NoZWNrIGV2ZXJ5IHRpbWUgdW5pdC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBjaGVjayBldmVyeSB0aW1lIHVuaXQKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJtYXh3YWl0IiB0eXBlPSJsb25nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImxvbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW01heGltdW0gbGVuZ3RoIG9mIHRpbWUgdG8gd2FpdC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBtYXhpbXVtIGxlbmd0aCBvZiB0aW1lIHRvIHdhaXQKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJtYXh3YWl0dW5pdCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuV2FpdEZvci5Vbml0IgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IiZxdW90O21pbGxpc2Vjb25kJnF1b3Q7LCAmcXVvdDtzZWNvbmQmcXVvdDssICZxdW90O21pbnV0ZSZxdW90OywgJnF1b3Q7aG91ciZxdW90OywgJnF1b3Q7ZGF5JnF1b3Q7LCAmcXVvdDt3ZWVrJnF1b3Q7IiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtNYXggd2FpdCB0aW1lIHVuaXQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCB0aGUgbWF4IHdhaXQgdGltZSB1bml0CisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idGltZW91dHByb3BlcnR5IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTmFtZSB0aGUgcHJvcGVydHkgdG8gc2V0IGFmdGVyIGEgdGltZW91dC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgTmFtZSB0aGUgcHJvcGVydHkgdG8gc2V0IGFmdGVyIGEgdGltZW91dC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgIDwvYXR0cmlidXRlcz4KKworICAgIDxlbGVtZW50cz4KKyAgICAgIDxlbGVtZW50IG5hbWU9ImFuZCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uLkFuZCIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkIGFuICZsdDthbmQmZ3Q7IGNvbmRpdGlvbiAiY29udGFpbmVyIi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbQWRkIGFuICZsdDthbmQmZ3Q7IGNvbmRpdGlvbiAiY29udGFpbmVyIi5dXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgICAgPGVsZW1lbnQgbmFtZT0iYXZhaWxhYmxlIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5BdmFpbGFibGUiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IiIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZCBhbiAmbHQ7YXZhaWxhYmxlJmd0OyBjb25kaXRpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0FkZCBhbiAmbHQ7YXZhaWxhYmxlJmd0OyBjb25kaXRpb24uXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICAgIDxlbGVtZW50IG5hbWU9ImNoZWNrc3VtIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5DaGVja3N1bSIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkIGFuICZsdDtjaGVja3N1bSZndDsgY29uZGl0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtBZGQgYW4gJmx0O2NoZWNrc3VtJmd0OyBjb25kaXRpb24uXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICAgIDxlbGVtZW50IG5hbWU9ImNvbnRhaW5zIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb24uQ29udGFpbnMiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IiIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZCBhICZsdDtjb250YWlucyZndDsgY29uZGl0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtBZGQgYSAmbHQ7Y29udGFpbnMmZ3Q7IGNvbmRpdGlvbi5dXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgICAgPGVsZW1lbnQgbmFtZT0iZXF1YWxzIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb24uRXF1YWxzIgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGQgYW4gJmx0O2VxdWFscyZndDsgY29uZGl0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtBZGQgYW4gJmx0O2VxdWFscyZndDsgY29uZGl0aW9uLl1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgICA8ZWxlbWVudCBuYW1lPSJmaWxlc21hdGNoIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb24uRmlsZXNNYXRjaCIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkIGEgJmx0O2ZpbGVzbWF0Y2gmZ3Q7IGNvbmRpdGlvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbQWRkIGEgJmx0O2ZpbGVzbWF0Y2gmZ3Q7IGNvbmRpdGlvbi5dXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgICAgPGVsZW1lbnQgbmFtZT0iaHR0cCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uLkh0dHAiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IiIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZCBhbiAmbHQ7aHR0cCZndDsgY29uZGl0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtBZGQgYW4gJmx0O2h0dHAmZ3Q7IGNvbmRpdGlvbi5dXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgICAgPGVsZW1lbnQgbmFtZT0iaXNmYWxzZSIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uLklzRmFsc2UiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IiIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZCBhICZsdDtpc2ZhbHNlJmd0OyBjb25kaXRpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0FkZCBhICZsdDtpc2ZhbHNlJmd0OyBjb25kaXRpb24uXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICAgIDxlbGVtZW50IG5hbWU9Imlzc2V0IiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb24uSXNTZXQiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IiIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZCBhbiAmbHQ7aXNzZXQmZ3Q7IGNvbmRpdGlvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbQWRkIGFuICZsdDtpc3NldCZndDsgY29uZGl0aW9uLl1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgICA8ZWxlbWVudCBuYW1lPSJpc3RydWUiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbi5Jc1RydWUiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IiIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZCBhICZsdDtpc3RydWUmZ3Q7IGNvbmRpdGlvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbQWRkIGEgJmx0O2lzdHJ1ZSZndDsgY29uZGl0aW9uLl1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgICA8ZWxlbWVudCBuYW1lPSJub3QiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbi5Ob3QiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IiIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZCBhbiAmbHQ7bm90Jmd0OyBjb25kaXRpb24gImNvbnRhaW5lciIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0FkZCBhbiAmbHQ7bm90Jmd0OyBjb25kaXRpb24gImNvbnRhaW5lciIuXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICAgIDxlbGVtZW50IG5hbWU9Im9yIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb24uT3IiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IiIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZCBhbiAmbHQ7b3ImZ3Q7IGNvbmRpdGlvbiAiY29udGFpbmVyIi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbQWRkIGFuICZsdDtvciZndDsgY29uZGl0aW9uICJjb250YWluZXIiLl1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgICA8ZWxlbWVudCBuYW1lPSJvcyIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uLk9zIgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGQgYW4gJmx0O29zJmd0OyBjb25kaXRpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0FkZCBhbiAmbHQ7b3MmZ3Q7IGNvbmRpdGlvbi5dXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgICAgPGVsZW1lbnQgbmFtZT0ic29ja2V0IiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb24uU29ja2V0IgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGQgYSAmbHQ7c29ja2V0Jmd0OyBjb25kaXRpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0FkZCBhICZsdDtzb2NrZXQmZ3Q7IGNvbmRpdGlvbi5dXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgICAgPGVsZW1lbnQgbmFtZT0idXB0b2RhdGUiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlVwVG9EYXRlIgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGQgYW4gJmx0O3VwdG9kYXRlJmd0OyBjb25kaXRpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0FkZCBhbiAmbHQ7dXB0b2RhdGUmZ3Q7IGNvbmRpdGlvbi5dXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgIDwvZWxlbWVudHM+CisKKyAgPC9zdHJ1Y3R1cmU+CisKKzwvdGFzaz4KKworCis8dGFzayBuYW1lPSJ3YXIiIGNhdGVnb3J5PSJwYWNrYWdpbmciCisgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLldhciIKKyAgICAgIG1hdGNoaW5nVGFzaz0idHJ1ZSI+CisKKyAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FuIGV4dGVuc2lvbiBvZiAmbHQ7amFyJmd0OyB0byBjcmVhdGUgYSBXQVIgYXJjaGl2ZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICA8ZGVzY3JpcHRpb24+CisgICAgPCFbQ0RBVEFbQW4gZXh0ZW5zaW9uIG9mICZsdDtqYXImZ3Q7IHRvIGNyZWF0ZSBhIFdBUiBhcmNoaXZlLgorIENvbnRhaW5zIHNwZWNpYWwgdHJlYXRtZW50IGZvciBmaWxlcyB0aGF0IHNob3VsZCBlbmQgdXAgaW4gdGhlCisgPGNvZGU+V0VCLUlORi9saWI8L2NvZGU+LCA8Y29kZT5XRUItSU5GL2NsYXNzZXM8L2NvZGU+IG9yCisgPGNvZGU+V0VCLUlORjwvY29kZT4gZGlyZWN0b3JpZXMgb2YgdGhlIFdlYiBBcHBsaWNhdGlvbiBBcmNoaXZlLjwvcD4KKyA8cD4oVGhlIFdhciB0YXNrIGlzIGEgc2hvcnRjdXQgZm9yIHNwZWNpZnlpbmcgdGhlIHBhcnRpY3VsYXIgbGF5b3V0IG9mIGEgV0FSIGZpbGUuIAorIFRoZSBzYW1lIHRoaW5nIGNhbiBiZSBhY2NvbXBsaXNoZWQgYnkgdXNpbmcgdGhlIDxpPnByZWZpeDwvaT4gYW5kIDxpPmZ1bGxwYXRoPC9pPgorIGF0dHJpYnV0ZXMgb2YgemlwZmlsZXNldHMgaW4gYSBaaXAgb3IgSmFyIHRhc2suKTwvcD4KKyA8cD5UaGUgZXh0ZW5kZWQgemlwZmlsZXNldCBlbGVtZW50IGZyb20gdGhlIHppcCB0YXNrICh3aXRoIGF0dHJpYnV0ZXMgPGk+cHJlZml4PC9pPiwgPGk+ZnVsbHBhdGg8L2k+LCBhbmQgPGk+c3JjPC9pPikgaXMgYXZhaWxhYmxlIGluIHRoZSBXYXIgdGFzay48L3A+XV0+CisgIDwvZGVzY3JpcHRpb24+CisKKyAgPHN0cnVjdHVyZT4KKworICAgIDxhdHRyaWJ1dGVzPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJiYXNlZGlyIiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRGlyZWN0b3J5IGZyb20gd2hpY2ggdG8gYXJjaGl2ZSBmaWxlczsgb3B0aW9uYWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIERpcmVjdG9yeSBmcm9tIHdoaWNoIHRvIGFyY2hpdmUgZmlsZXM7IG9wdGlvbmFsLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNvbXByZXNzIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1doZXRoZXIgd2Ugd2FudCB0byBjb21wcmVzcyB0aGUgZmlsZXMgb3Igb25seSBzdG9yZSB0aGVtOworIG9wdGlvbmFsLCBkZWZhdWx0PXRydWU7Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBXaGV0aGVyIHdlIHdhbnQgdG8gY29tcHJlc3MgdGhlIGZpbGVzIG9yIG9ubHkgc3RvcmUgdGhlbTsKKyBvcHRpb25hbCwgZGVmYXVsdD10cnVlOworICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlc3RmaWxlIiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGZpbGUgdG8gY3JlYXRlOyByZXF1aXJlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgVGhlIGZpbGUgdG8gY3JlYXRlOyByZXF1aXJlZC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkdXBsaWNhdGUiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlppcC5EdXBsaWNhdGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iJnF1b3Q7YWRkJnF1b3Q7LCAmcXVvdDtwcmVzZXJ2ZSZxdW90OywgJnF1b3Q7ZmFpbCZxdW90OyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2V0cyBiZWhhdmlvciBmb3Igd2hlbiBhIGR1cGxpY2F0ZSBmaWxlIGlzIGFib3V0IHRvIGJlIGFkZGVkIC0KKyBvbmUgb2YgPGNvZGU+a2VlcDwvY29kZT4sIDxjb2RlPnNraXA8L2NvZGU+IG9yIDxjb2RlPm92ZXJ3cml0ZTwvY29kZT4uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldHMgYmVoYXZpb3IgZm9yIHdoZW4gYSBkdXBsaWNhdGUgZmlsZSBpcyBhYm91dCB0byBiZSBhZGRlZCAtCisgb25lIG9mIDxjb2RlPmtlZXA8L2NvZGU+LCA8Y29kZT5za2lwPC9jb2RlPiBvciA8Y29kZT5vdmVyd3JpdGU8L2NvZGU+LgorIFBvc3NpYmxlIHZhbHVlcyBhcmU6IDxjb2RlPmtlZXA8L2NvZGU+IChrZWVwIGJvdGgKKyBvZiB0aGUgZmlsZXMpOyA8Y29kZT5za2lwPC9jb2RlPiAoa2VlcCB0aGUgZmlyc3QgdmVyc2lvbgorIG9mIHRoZSBmaWxlIGZvdW5kKTsgPGNvZGU+b3ZlcndyaXRlPC9jb2RlPiBvdmVyd3JpdGUgdGhlIGZpbGUKKyB3aXRoIHRoZSBuZXcgZmlsZQorIERlZmF1bHQgZm9yIHppcCB0YXNrcyBpcyA8Y29kZT5rZWVwPC9jb2RlPgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImVuY29kaW5nIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRW5jb2RpbmcgdG8gdXNlIGZvciBmaWxlbmFtZXMsIGRlZmF1bHRzIHRvIHRoZSBwbGF0Zm9ybSdzCisgZGVmYXVsdCBlbmNvZGluZy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgRW5jb2RpbmcgdG8gdXNlIGZvciBmaWxlbmFtZXMsIGRlZmF1bHRzIHRvIHRoZSBwbGF0Zm9ybSdzCisgZGVmYXVsdCBlbmNvZGluZy4KKworIDxwPkZvciBhIGxpc3Qgb2YgcG9zc2libGUgdmFsdWVzIHNlZSA8YQorIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvamRrLzEuMi9kb2NzL2d1aWRlL2ludGVybmF0L2VuY29kaW5nLmRvYy5odG1sIj5odHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL2pkay8xLjIvZG9jcy9ndWlkZS9pbnRlcm5hdC9lbmNvZGluZy5kb2MuaHRtbDwvYT4uPC9wPgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImZpbGVzb25seSIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlLCBlbXVsYXRlIFN1bidzIGphciB1dGlsaXR5IGJ5IG5vdCBhZGRpbmcgcGFyZW50IGRpcmVjdG9yaWVzOworIG9wdGlvbmFsLCBkZWZhdWx0cyB0byBmYWxzZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgSWYgdHJ1ZSwgZW11bGF0ZSBTdW4ncyBqYXIgdXRpbGl0eSBieSBub3QgYWRkaW5nIHBhcmVudCBkaXJlY3RvcmllczsKKyBvcHRpb25hbCwgZGVmYXVsdHMgdG8gZmFsc2UuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaW5kZXgiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2V0IHdoZXRoZXIgb3Igbm90IHRvIGNyZWF0ZSBhbiBpbmRleCBsaXN0IGZvciBjbGFzc2VzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgd2hldGhlciBvciBub3QgdG8gY3JlYXRlIGFuIGluZGV4IGxpc3QgZm9yIGNsYXNzZXMuCisgVGhpcyBtYXkgc3BlZWQgdXAgY2xhc3Nsb2FkaW5nIGluIHNvbWUgY2FzZXMuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibWFuaWZlc3QiIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgbWFuaWZlc3QgZmlsZSB0byB1c2UuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRoZSBtYW5pZmVzdCBmaWxlIHRvIHVzZS4gVGhpcyBjYW4gYmUgZWl0aGVyIHRoZSBsb2NhdGlvbiBvZiBhIG1hbmlmZXN0LAorIG9yIHRoZSBuYW1lIG9mIGEgamFyIGFkZGVkIHRocm91Z2ggYSBmaWxlc2V0LiBJZiBpdHMgdGhlIG5hbWUgb2YgYW4gYWRkZWQKKyBqYXIsIHRoZSB0YXNrIGV4cGVjdHMgdGhlIG1hbmlmZXN0IHRvIGJlIGluIHRoZSBqYXIgYXQgTUVUQS1JTkYvTUFOSUZFU1QuTUYuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idXBkYXRlIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIHVwZGF0ZXMgYW4gZXhpc3RpbmcgZmlsZSwgb3RoZXJ3aXNlIG92ZXJ3cml0ZQorIGFueSBleGlzdGluZyBvbmU7IG9wdGlvbmFsIGRlZmF1bHRzIHRvIGZhbHNlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBJZiB0cnVlLCB1cGRhdGVzIGFuIGV4aXN0aW5nIGZpbGUsIG90aGVyd2lzZSBvdmVyd3JpdGUKKyBhbnkgZXhpc3Rpbmcgb25lOyBvcHRpb25hbCBkZWZhdWx0cyB0byBmYWxzZS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ3ZWJ4bWwiIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtEZXBsb3ltZW50IGRlc2NyaXB0b3IgdG8gdXNlIChXRUItSU5GL3dlYi54bWwpOworIHJlcXVpcmVkIHVubGVzcyA8dHQ+dXBkYXRlPXRydWU8L3R0Pi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgc2V0IHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgdG8gdXNlIChXRUItSU5GL3dlYi54bWwpOworIHJlcXVpcmVkIHVubGVzcyA8dHQ+dXBkYXRlPXRydWU8L3R0PgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9IndoZW5lbXB0eSIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuWmlwLldoZW5FbXB0eSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSImcXVvdDtmYWlsJnF1b3Q7LCAmcXVvdDtza2lwJnF1b3Q7LCAmcXVvdDtjcmVhdGUmcXVvdDsiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NldHMgYmVoYXZpb3Igb2YgdGhlIHRhc2sgd2hlbiBubyBmaWxlcyBtYXRjaC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0cyBiZWhhdmlvciBvZiB0aGUgdGFzayB3aGVuIG5vIGZpbGVzIG1hdGNoLgorIFBvc3NpYmxlIHZhbHVlcyBhcmU6IDxjb2RlPmZhaWw8L2NvZGU+ICh0aHJvdyBhbiBleGNlcHRpb24KKyBhbmQgaGFsdCB0aGUgYnVpbGQpOyA8Y29kZT5za2lwPC9jb2RlPiAoZG8gbm90IGNyZWF0ZQorIGFueSBhcmNoaXZlLCBidXQgaXNzdWUgYSB3YXJuaW5nKTsgPGNvZGU+Y3JlYXRlPC9jb2RlPgorIChtYWtlIGFuIGFyY2hpdmUgd2l0aCBubyBlbnRyaWVzKS4KKyBEZWZhdWx0IGZvciB6aXAgdGFza3MgaXMgPGNvZGU+c2tpcDwvY29kZT47CisgZm9yIGphciB0YXNrcywgPGNvZGU+Y3JlYXRlPC9jb2RlPi4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgIDwvYXR0cmlidXRlcz4KKworICAgIDxlbGVtZW50cz4KKyAgICAgIDxlbGVtZW50IG5hbWU9ImNsYXNzZXMiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlppcEZpbGVTZXQiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IlppcEZpbGVzZXQiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGQgZmlsZXMgdW5kZXIgV0VCLUlORi9jbGFzc2VzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVthZGQgZmlsZXMgdW5kZXIgV0VCLUlORi9jbGFzc2VzXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICAgIDxlbGVtZW50IG5hbWU9Im1hbmlmZXN0IiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5NYW5pZmVzdCIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWxsb3dzIHRoZSBtYW5pZmVzdCBmb3IgdGhlIGFyY2hpdmUgZmlsZSB0byBiZSBwcm92aWRlZCBpbmxpbmUKKyBpbiB0aGUgYnVpbGRmaWxlIHJhdGhlciB0aGFuIGluIGFuIGV4dGVybmFsIGZpbGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0FsbG93cyB0aGUgbWFuaWZlc3QgZm9yIHRoZSBhcmNoaXZlIGZpbGUgdG8gYmUgcHJvdmlkZWQgaW5saW5lCisgaW4gdGhlIGJ1aWxkZmlsZSByYXRoZXIgdGhhbiBpbiBhbiBleHRlcm5hbCBmaWxlLl1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgICA8ZWxlbWVudCBuYW1lPSJmaWxlc2V0IiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0IgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlc2V0IgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBhIHNldCBvZiBmaWxlcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbQWRkcyBhIHNldCBvZiBmaWxlcy5dXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgICAgPGVsZW1lbnQgbmFtZT0ibGliIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5aaXBGaWxlU2V0IgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJaaXBGaWxlc2V0IgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkIGZpbGVzIHVuZGVyIFdFQi1JTkYvbGliLy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbYWRkIGZpbGVzIHVuZGVyIFdFQi1JTkYvbGliL11dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgICA8ZWxlbWVudCBuYW1lPSJtZXRhaW5mIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5aaXBGaWxlU2V0IgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJaaXBGaWxlc2V0IgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBhIHppcGZpbGVzZXQgdG8gaW5jbHVkZSBpbiB0aGUgTUVUQS1JTkYgZGlyZWN0b3J5Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtBZGRzIGEgemlwZmlsZXNldCB0byBpbmNsdWRlIGluIHRoZSBNRVRBLUlORiBkaXJlY3RvcnkuXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICAgIDxlbGVtZW50IG5hbWU9IndlYmluZiIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuWmlwRmlsZVNldCIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iWmlwRmlsZXNldCIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0ZpbGVzIHRvIGFkZCB1bmRlciBXRUItSU5GOy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbZmlsZXMgdG8gYWRkIHVuZGVyIFdFQi1JTkY7XV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICAgIDxlbGVtZW50IG5hbWU9InppcGdyb3VwZmlsZXNldCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldCIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZXNldCIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgYSBncm91cCBvZiB6aXAgZmlsZXMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0FkZHMgYSBncm91cCBvZiB6aXAgZmlsZXMuXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICAgIDxlbGVtZW50IG5hbWU9InppcGZpbGVzZXQiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlppcEZpbGVTZXQiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IlppcEZpbGVzZXQiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIGEgc2V0IG9mIGZpbGVzIHRoYXQgY2FuIGJlCisgcmVhZCBmcm9tIGFuIGFyY2hpdmUgYW5kIGJlIGdpdmVuIGEgcHJlZml4L2Z1bGxwYXRoLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtBZGRzIGEgc2V0IG9mIGZpbGVzIHRoYXQgY2FuIGJlCisgcmVhZCBmcm9tIGFuIGFyY2hpdmUgYW5kIGJlIGdpdmVuIGEgcHJlZml4L2Z1bGxwYXRoLl1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgPC9lbGVtZW50cz4KKworICA8L3N0cnVjdHVyZT4KKworPC90YXNrPgorCisKKzx0YXNrIG5hbWU9IndsanNwYyIgY2F0ZWdvcnk9Im90aGVyIgorICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qc3AuV0xKc3BjIgorICAgICAgbWF0Y2hpbmdUYXNrPSJ0cnVlIj4KKworICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbUHJlY29tcGlsZXMgSlNQJ3MgdXNpbmcgV2ViTG9naWMncyBKU1AgY29tcGlsZXIgKHdlYmxvZ2ljLmpzcGMpLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgIDxkZXNjcmlwdGlvbj4KKyAgICA8IVtDREFUQVtQcmVjb21waWxlcyBKU1AncyB1c2luZyBXZWJMb2dpYydzIEpTUCBjb21waWxlciAod2VibG9naWMuanNwYykuXV0+CisgIDwvZGVzY3JpcHRpb24+CisKKyAgPHN0cnVjdHVyZT4KKworICAgIDxhdHRyaWJ1dGVzPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc3BhdGgiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUGF0aCIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ2xhc3NwYXRoIHRvIGJlIHVzZWQgZm9yIHRoaXMgY29tcGlsYXRpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCB0aGUgY2xhc3NwYXRoIHRvIGJlIHVzZWQgZm9yIHRoaXMgY29tcGlsYXRpb24uCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVzdCIgdHlwZT0iamF2YS5pby5GaWxlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0RpcmVjdG9yeSBjb250YWluaW5nIHRoZSBzb3VyY2UganNwJ3MuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHNvdXJjZSBqc3AncworICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InBhY2thZ2UiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtQYWNrYWdlIHVuZGVyIHdoaWNoIHRoZSBjb21waWxlZCBjbGFzc2VzIGdvLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIHBhY2thZ2UgdW5kZXIgd2hpY2ggdGhlIGNvbXBpbGVkIGNsYXNzZXMgZ28KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzcmMiIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtEaXJlY3RvcnkgY29udGFpbmluZyB0aGUgc291cmNlIGpzcCdzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBzb3VyY2UganNwJ3MKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgIDwvYXR0cmlidXRlcz4KKworICAgIDxlbGVtZW50cz4KKyAgICAgIDxlbGVtZW50IG5hbWU9ImNsYXNzcGF0aCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aCIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUGF0aCIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW01heWJlIGNyZWF0ZXMgYSBuZXN0ZWQgY2xhc3NwYXRoIGVsZW1lbnQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW01heWJlIGNyZWF0ZXMgYSBuZXN0ZWQgY2xhc3NwYXRoIGVsZW1lbnQuXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICA8L2VsZW1lbnRzPgorCisgIDwvc3RydWN0dXJlPgorCis8L3Rhc2s+CisKKworPHRhc2sgbmFtZT0id2xydW4iIGNhdGVnb3J5PSJvdGhlciIKKyAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZWpiLldMUnVuIgorICAgICAgPgorCisgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTdGFydHMgYSBXZWJMb2dpYyBzZXJ2ZXIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgPGRlc2NyaXB0aW9uPgorICAgIDwhW0NEQVRBW1N0YXJ0cyBhIFdlYkxvZ2ljIHNlcnZlci4KKyBBIG51bWJlciBvZiBwYXJhbWV0ZXJzIGFyZSB1c2VkIHRvIGNvbnRyb2wgdGhlIG9wZXJhdGlvbiBvZiB0aGUgd2VibG9naWMgaW5zdGFuY2UuIE5vdGUgdGhhdCB0aGUgdGFzaywKKyBhbmQgaGVuY2UgYW50LCB3aWxsIG5vdCBjb21wbGV0ZSB1bnRpbCB0aGUgd2VibG9naWMgaW5zdGFuY2UgaXMgc3RvcHBlZC48L3A+XV0+CisgIDwvZGVzY3JpcHRpb24+CisKKyAgPHN0cnVjdHVyZT4KKworICAgIDxhdHRyaWJ1dGVzPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJhcmdzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkaXRpb25hbCBhcmd1bWVudCBzdHJpbmcgcGFzc2VkIHRvIHRoZSBXZWJsb2dpYyBpbnN0YW5jZTsKKyBvcHRpb25hbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgQWRkaXRpb25hbCBhcmd1bWVudCBzdHJpbmcgcGFzc2VkIHRvIHRoZSBXZWJsb2dpYyBpbnN0YW5jZTsKKyBvcHRpb25hbC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJiZWFob21lIiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGxvY2F0aW9uIG9mIHRoZSBCRUEgSG9tZTsgaW1wbGljaXRseQorIHNlbGVjdHMgV2VibG9naWMgNi4wOyBvcHRpb25hbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgVGhlIGxvY2F0aW9uIG9mIHRoZSBCRUEgSG9tZTsgaW1wbGljaXRseQorIHNlbGVjdHMgV2VibG9naWMgNi4wOyBvcHRpb25hbC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc3BhdGgiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUGF0aCIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGNsYXNzcGF0aCB0byBiZSB1c2VkIHdpdGggdGhlIEphdmEgVmlydHVhbCBNYWNoaW5lIHRoYXQgcnVucyB0aGUgV2VibG9naWMKKyBTZXJ2ZXI7IHJlcXVpcmVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBUaGUgY2xhc3NwYXRoIHRvIGJlIHVzZWQgd2l0aCB0aGUgSmF2YSBWaXJ0dWFsIE1hY2hpbmUgdGhhdCBydW5zIHRoZSBXZWJsb2dpYworIFNlcnZlcjsgcmVxdWlyZWQuIFByaW9yIHRvIFdlYmxvZ2ljIDYuMCwgdGhpcyBpcyB0eXBpY2FsbHkgc2V0IHRvIHRoZSBXZWJsb2dpYworIGJvb3QgY2xhc3NwYXRoLiBVbmRlciBXZWJsb2dpYyA2LjAgdGhpcyBzaG91bGQgaW5jbHVkZSBhbGwgdGhlCisgd2VibG9naWMgamFycworICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImRvbWFpbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0RvbWFpbiB0byBydW4gaW47IHJlcXVpcmVkIGZvciBXTDYuMC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBEb21haW4gdG8gcnVuIGluOyByZXF1aXJlZCBmb3IgV0w2LjAKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJob21lIiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGxvY2F0aW9uIHdoZXJlIHdlYmxvZ2ljIGxpdmVzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBUaGUgbG9jYXRpb24gd2hlcmUgd2VibG9naWMgbGl2ZXMuCisgUmVxdWlyZWQuIFRoaXMgaXMgdGhlIGFic29sdXRlIGxvY2F0aW9uLCBub3QgcmVsYXRpdmUgdG8KKyAgQkVBIGhvbWUuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ianZtYXJncyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZGl0aW9uYWwgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIHdlYmxvZ2ljIEpWTS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBhZGRpdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSB3ZWJsb2dpYyBKVk0KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIG5hbWUgb2YgdGhlIHdlYmxvZ2ljIHNlcnZlciB3aXRoaW4gdGhlIHdlYmxvZ2ljIGhvbWUgd2hpY2ggaXMgdG8gYmUgcnVuLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgd2VibG9naWMgc2VydmVyIHdpdGhpbiB0aGUgd2VibG9naWMgaG9tZSB3aGljaCBpcyB0byBiZSBydW4uCisgT3B0aW9uYSwgZGVmYXVsdHMgdG8gJnF1b3Q7bXlzZXJ2ZXImcXVvdDsKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwa3Bhc3N3b3JkIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbUHJpdmF0ZSBrZXkgcGFzc3dvcmQgc28gdGhlIHNlcnZlciBjYW4gZGVjcnlwdCB0aGUgU1NMIHByaXZhdGUga2V5IGZpbGU7Cisgb3B0aW9uYWwgYW5kIG9ubHkgYXBwbGljYWJsZSB0byBXTDYuMC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBwcml2YXRlIGtleSBwYXNzd29yZCBzbyB0aGUgc2VydmVyIGNhbiBkZWNyeXB0IHRoZSBTU0wgcHJpdmF0ZSBrZXkgZmlsZTsKKyBvcHRpb25hbCBhbmQgb25seSBhcHBsaWNhYmxlIHRvIFdMNi4wLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InBhc3N3b3JkIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTWFuYWdlbWVudCBwYXNzd29yZCBvZiB0aGUgc2VydmVyOworIG9wdGlvbmFsIGFuZCBvbmx5IGFwcGxpY2FibGUgdG8gV0w2LjAuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCB0aGUgbWFuYWdlbWVudCBwYXNzd29yZCBvZiB0aGUgc2VydmVyOworIG9wdGlvbmFsIGFuZCBvbmx5IGFwcGxpY2FibGUgdG8gV0w2LjAuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9saWN5IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIG5hbWUgb2YgdGhlIHNlY3VyaXR5IHBvbGljeSBmaWxlIHdpdGhpbiB0aGUgd2VibG9naWMgaG9tZSBkaXJlY3RvcnkgdGhhdAorIGlzIHRvIGJlIHVzZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBzZWN1cml0eSBwb2xpY3kgZmlsZSB3aXRoaW4gdGhlIHdlYmxvZ2ljIGhvbWUgZGlyZWN0b3J5IHRoYXQKKyBpcyB0byBiZSB1c2VkLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCBwb2xpY3kgZmlsZSA8Y29kZT53ZWJsb2dpYy5wb2xpY3k8L2NvZGU+CisgaXMgdXNlZC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwcm9wZXJ0aWVzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIG5hbWUgb2YgdGhlIHNlcnZlcidzIHByb3BlcnRpZXMgZmlsZSB3aXRoaW4gdGhlIHdlYmxvZ2ljIGhvbWUgZGlyZWN0b3J5CisgdXNlZCB0byBjb250cm9sIHRoZSB3ZWJsb2dpYyBpbnN0YW5jZTsKKyByZXF1aXJlZCBmb3IgV0w0LjUuMS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIHNlcnZlcidzIHByb3BlcnRpZXMgZmlsZSB3aXRoaW4gdGhlIHdlYmxvZ2ljIGhvbWUgZGlyZWN0b3J5CisgdXNlZCB0byBjb250cm9sIHRoZSB3ZWJsb2dpYyBpbnN0YW5jZTsKKyByZXF1aXJlZCBmb3IgV0w0LjUuMQorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InVzZXJuYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTWFuYWdlbWVudCB1c2VybmFtZSB0byBydW4gdGhlIHNlcnZlcjsKKyBvcHRpb25hbCBhbmQgb25seSBhcHBsaWNhYmxlIHRvIFdMNi4wLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIG1hbmFnZW1lbnQgdXNlcm5hbWUgdG8gcnVuIHRoZSBzZXJ2ZXI7Cisgb3B0aW9uYWwgYW5kIG9ubHkgYXBwbGljYWJsZSB0byBXTDYuMC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ3ZWJsb2dpY21haW5jbGFzcyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW05hbWUgb2YgdGhlIG1haW4gY2xhc3MgZm9yIHdlYmxvZ2ljOyBvcHRpb25hbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgbmFtZSBvZiB0aGUgbWFpbiBjbGFzcyBmb3Igd2VibG9naWM7IG9wdGlvbmFsLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9IndsY2xhc3NwYXRoIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlBhdGgiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1dlYmxvZ2ljIGNsYXNzcGF0aCB1c2VkIGJ5IHRoZSBXZWJsb2dpYyBTZXJ2ZXI7Cisgb3B0aW9uYWwsIGFuZCBvbmx5IGFwcGxpY2FibGUgdG8gV0w0LjUuMQorCisgVGhlIHdlYmxvZ2ljIGNsYXNzcGF0aCBpcyB1c2VkIGJ5IHdlYmxvZ2ljIHRvIHN1cHBvcnQgZHluYW1pYyBjbGFzcyBsb2FkaW5nLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIHdlYmxvZ2ljIGNsYXNzcGF0aCB1c2VkIGJ5IHRoZSBXZWJsb2dpYyBTZXJ2ZXI7Cisgb3B0aW9uYWwsIGFuZCBvbmx5IGFwcGxpY2FibGUgdG8gV0w0LjUuMQorCisgVGhlIHdlYmxvZ2ljIGNsYXNzcGF0aCBpcyB1c2VkIGJ5IHdlYmxvZ2ljIHRvIHN1cHBvcnQgZHluYW1pYyBjbGFzcyBsb2FkaW5nLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgPC9hdHRyaWJ1dGVzPgorCisgICAgPGVsZW1lbnRzPgorICAgICAgPGVsZW1lbnQgbmFtZT0iY2xhc3NwYXRoIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoIgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJQYXRoIgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkIHRoZSBjbGFzc3BhdGggZm9yIHRoZSB1c2VyIGNsYXNzZXMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0FkZCB0aGUgY2xhc3NwYXRoIGZvciB0aGUgdXNlciBjbGFzc2VzXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICAgIDxlbGVtZW50IG5hbWU9IndsY2xhc3NwYXRoIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoIgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJQYXRoIgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbR2V0IHRoZSBjbGFzc3BhdGggdG8gdGhlIHdlYmxvZ2ljIGNsYXNzcGF0aHMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0dldCB0aGUgY2xhc3NwYXRoIHRvIHRoZSB3ZWJsb2dpYyBjbGFzc3BhdGhzXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICA8L2VsZW1lbnRzPgorCisgIDwvc3RydWN0dXJlPgorCis8L3Rhc2s+CisKKworPHRhc2sgbmFtZT0id2xzdG9wIiBjYXRlZ29yeT0ib3RoZXIiCisgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmVqYi5XTFN0b3AiCisgICAgICA+CisKKyAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NodXRzIGRvd24gYSBXZWJMb2dpYyBzZXJ2ZXIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgPGRlc2NyaXB0aW9uPgorICAgIDwhW0NEQVRBW1NodXRzIGRvd24gYSBXZWJMb2dpYyBzZXJ2ZXIuCisgVG8gc2h1dCBkb3duIGFuIGluc3RhbmNlIHlvdSBtdXN0IHN1cHBseSBib3RoIGEgdXNlcm5hbWUgYW5kCisgYSBwYXNzd29yZC5dXT4KKyAgPC9kZXNjcmlwdGlvbj4KKworICA8c3RydWN0dXJlPgorCisgICAgPGF0dHJpYnV0ZXM+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImJlYWhvbWUiIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgbG9jYXRpb24gb2YgdGhlIEJFQSBIb21lOyBpbXBsaWNpdGx5Cisgc2VsZWN0cyBXZWJsb2dpYyA2LjAgc2h1dGRvd247IG9wdGlvbmFsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBUaGUgbG9jYXRpb24gb2YgdGhlIEJFQSBIb21lOyBpbXBsaWNpdGx5Cisgc2VsZWN0cyBXZWJsb2dpYyA2LjAgc2h1dGRvd247IG9wdGlvbmFsLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzcGF0aCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aCIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJQYXRoIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgY2xhc3NwYXRoIHRvIGJlIHVzZWQgd2l0aCB0aGUgSmF2YSBWaXJ0dWFsIE1hY2hpbmUgdGhhdCBydW5zIHRoZSBXZWJsb2dpYworIFNodXRkb3duIGNvbW1hbmQ7Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBUaGUgY2xhc3NwYXRoIHRvIGJlIHVzZWQgd2l0aCB0aGUgSmF2YSBWaXJ0dWFsIE1hY2hpbmUgdGhhdCBydW5zIHRoZSBXZWJsb2dpYworIFNodXRkb3duIGNvbW1hbmQ7CisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVsYXkiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtEZWxheSAoaW4gc2Vjb25kcykgYmVmb3JlIHNodXR0aW5nIGRvd24gdGhlIHNlcnZlcjsKKyBvcHRpb25hbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBkZWxheSAoaW4gc2Vjb25kcykgYmVmb3JlIHNodXR0aW5nIGRvd24gdGhlIHNlcnZlcjsKKyBvcHRpb25hbC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwYXNzd29yZCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBwYXNzd29yZCBmb3IgdGhlIGFjY291bnQgc3BlY2lmaWVkIGluIHRoZQorIHVzZXIgcGFyYW1ldGVyOyByZXF1aXJlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgVGhlIHBhc3N3b3JkIGZvciB0aGUgYWNjb3VudCBzcGVjaWZpZWQgaW4gdGhlCisgdXNlciBwYXJhbWV0ZXI7IHJlcXVpcmVkCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idXJsIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVVJMIHRvIHdoaWNoIHRoZSB3ZWJsb2dpYyBzZXJ2ZXIgaXMgbGlzdGVuaW5nCisgZm9yIFQzIGNvbm5lY3Rpb25zOyByZXF1aXJlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBVUkwgdG8gd2hpY2ggdGhlIHdlYmxvZ2ljIHNlcnZlciBpcyBsaXN0ZW5pbmcKKyBmb3IgVDMgY29ubmVjdGlvbnM7IHJlcXVpcmVkLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InVzZXIiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgdXNlcm5hbWUgb2YgdGhlIGFjY291bnQgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIHNodXRkb3duIHRoZSBzZXJ2ZXI7CisgcmVxdWlyZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRoZSB1c2VybmFtZSBvZiB0aGUgYWNjb3VudCB3aGljaCB3aWxsIGJlIHVzZWQgdG8gc2h1dGRvd24gdGhlIHNlcnZlcjsKKyByZXF1aXJlZC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgIDwvYXR0cmlidXRlcz4KKworICAgIDxlbGVtZW50cz4KKyAgICAgIDxlbGVtZW50IG5hbWU9ImNsYXNzcGF0aCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aCIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUGF0aCIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBjbGFzc3BhdGggdG8gYmUgdXNlZCB3aXRoIHRoZSBKYXZhIFZpcnR1YWwgTWFjaGluZSB0aGF0IHJ1bnMgdGhlIFdlYmxvZ2ljCisgU2h1dGRvd24gY29tbWFuZDsuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW1RoZSBjbGFzc3BhdGggdG8gYmUgdXNlZCB3aXRoIHRoZSBKYXZhIFZpcnR1YWwgTWFjaGluZSB0aGF0IHJ1bnMgdGhlIFdlYmxvZ2ljCisgU2h1dGRvd24gY29tbWFuZDtdXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgIDwvZWxlbWVudHM+CisKKyAgPC9zdHJ1Y3R1cmU+CisKKzwvdGFzaz4KKworCis8dGFzayBuYW1lPSJ3c2RsdG9kb3RuZXQiIGNhdGVnb3J5PSJkb3RuZXQiCisgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmRvdG5ldC5Xc2RsVG9Eb3RuZXQiCisgICAgICA+CisKKyAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NvbnZlcnRzIGEgV1NETCBmaWxlIG9yIFVSTCByZXNvdXJjZSBpbnRvIGEgLk5FVCBsYW5ndWFnZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICA8ZGVzY3JpcHRpb24+CisgICAgPCFbQ0RBVEFbQ29udmVydHMgYSBXU0RMIGZpbGUgb3IgVVJMIHJlc291cmNlIGludG8gYSAuTkVUIGxhbmd1YWdlLgorCisgU2VlICJDcmVhdGluZyBhbiBYTUwgV2ViIFNlcnZpY2UgUHJveHkiLCAid3NkbC5leGUiIGRvY3MgaW4KKyB0aGUgZnJhbWV3b3JrIFNESyBkb2N1bWVudGF0aW9uXV0+CisgIDwvZGVzY3JpcHRpb24+CisKKyAgPHN0cnVjdHVyZT4KKworICAgIDxhdHRyaWJ1dGVzPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXN0ZmlsZSIgdHlwZT0iamF2YS5pby5GaWxlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW05hbWUgb2YgdGhlIGZpbGUgdG8gZ2VuZXJhdGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIE5hbWUgb2YgdGhlIGZpbGUgdG8gZ2VuZXJhdGUuIFJlcXVpcmVkCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZXh0cmFvcHRpb25zIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQW55IGV4dHJhIFdTREwuRVhFIG9wdGlvbnMgd2hpY2ggYXJlbid0IGV4cGxpY2l0bHkKKyAgc3VwcG9ydGVkIGJ5IHRoZSBhbnQgd3JhcHBlciB0YXNrOyBvcHRpb25hbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgQW55IGV4dHJhIFdTREwuRVhFIG9wdGlvbnMgd2hpY2ggYXJlbid0IGV4cGxpY2l0bHkKKyAgc3VwcG9ydGVkIGJ5IHRoZSBhbnQgd3JhcHBlciB0YXNrOyBvcHRpb25hbAorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImZhaWxvbmVycm9yIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1Nob3VsZCBmYWlsdXJlIGhhbHQgdGhlIGJ1aWxkPy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2hvdWxkIGZhaWx1cmUgaGFsdCB0aGUgYnVpbGQ/IG9wdGlvbmFsLCBkZWZhdWx0PXRydWUKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsYW5ndWFnZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0xhbmd1YWdlOyBvbmUgb2YgIkNTIiwgIkpTIiwgb3IgIlZCIgorIG9wdGlvbmFsLCBkZWZhdWx0IGlzIENTIGZvciBDIyBzb3VyY2UuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIHNldCB0aGUgbGFuZ3VhZ2U7IG9uZSBvZiAiQ1MiLCAiSlMiLCBvciAiVkIiCisgb3B0aW9uYWwsIGRlZmF1bHQgaXMgQ1MgZm9yIEMjIHNvdXJjZQorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW05hbWVzcGFjZSB0byBwbGFjZSAgdGhlIHNvdXJjZSBpbi4KKyBvcHRpb25hbDsgZGVmYXVsdCAiIi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgbmFtZXNwYWNlIHRvIHBsYWNlICB0aGUgc291cmNlIGluLgorIG9wdGlvbmFsOyBkZWZhdWx0ICIiCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic2VydmVyIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0ZsYWcgdG8gZW5hYmxlIHNlcnZlciBzaWRlIGNvZGUgZ2VuZXJhdGlvbjsKKyBvcHRpb25hbCwgZGVmYXVsdD1mYWxzZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgZmxhZyB0byBlbmFibGUgc2VydmVyIHNpZGUgY29kZSBnZW5lcmF0aW9uOworIG9wdGlvbmFsLCBkZWZhdWx0PWZhbHNlCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3JjZmlsZSIgdHlwZT0iamF2YS5pby5GaWxlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBsb2NhbCBXU0RMIGZpbGUgdG8gcGFyc2U7IGVpdGhlciB1cmwgb3Igc3JjRmlsZSBpcyByZXF1aXJlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgVGhlIGxvY2FsIFdTREwgZmlsZSB0byBwYXJzZTsgZWl0aGVyIHVybCBvciBzcmNGaWxlIGlzIHJlcXVpcmVkLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InVybCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1VSTCB0byBmZXRjaC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0cyB0aGUgVVJMIHRvIGZldGNoLiBGZXRjaGluZyBpcyBieSB3c2RsLmV4ZTsgQW50IHByb3h5IHNldHRpbmdzCisgYXJlIGlnbm9yZWQ7IGVpdGhlciB1cmwgb3Igc3JjRmlsZSBpcyByZXF1aXJlZC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgIDwvYXR0cmlidXRlcz4KKworICAgIDxlbGVtZW50cz4KKyAgICA8L2VsZW1lbnRzPgorCisgIDwvc3RydWN0dXJlPgorCis8L3Rhc2s+CisKKworPHRhc2sgbmFtZT0ieG1scHJvcGVydHkiIGNhdGVnb3J5PSJ4bWwiCisgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlhtbFByb3BlcnR5IgorICAgICAgPgorCisgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtMb2FkcyBwcm9wZXJ0eSB2YWx1ZXMgZnJvbSBhIHZhbGlkIFhNTCBmaWxlLCBnZW5lcmF0aW5nIHRoZSBwcm9wZXJ0eSBuYW1lcyBmcm9tIHRoZSBmaWxlJ3MgZWxlbWVudCBhbmQgYXR0cmlidXRlIG5hbWVzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgIDxkZXNjcmlwdGlvbj4KKyAgICA8IVtDREFUQVtMb2FkcyBwcm9wZXJ0eSB2YWx1ZXMgZnJvbSBhIHZhbGlkIFhNTCBmaWxlLAorIGdlbmVyYXRpbmcgdGhlIHByb3BlcnR5IG5hbWVzIGZyb20gdGhlIGZpbGUncyBlbGVtZW50IGFuZCBhdHRyaWJ1dGUgbmFtZXMuCisKKyBFeGFtcGxlOgorIDxwcmU+CisgICAmbHQ7cm9vdC10YWcgbXlhdHRyPSJ0cnVlIiZndDsKKyAgICAgJmx0O2lubmVyLXRhZyBzb21lYXR0cj0idmFsIiZndDtUZXh0Jmx0Oy9pbm5lci10YWcmZ3Q7CisgICAgICZsdDthMiZndDsmbHQ7YTMmZ3Q7Jmx0O2E0Jmd0O2ZhbHNlJmx0Oy9hNCZndDsmbHQ7L2EzJmd0OyZsdDsvYTImZ3Q7CisgICAmbHQ7L3Jvb3QtdGFnJmd0OworPC9wcmU+CisgdGhpcyBnZW5lcmF0ZXMKKyA8cHJlPgorICByb290LXRhZyhteWF0dHIpPXRydWUKKyAgcm9vdC10YWcuaW5uZXItdGFnPVRleHQKKyAgcm9vdC10YWcuaW5uZXItdGFnKHNvbWVhdHRyKT12YWwKKyAgcm9vdC10YWcuYTIuYTMuYTQ9ZmFsc2UKKyA8L3ByZT5dXT4KKyAgPC9kZXNjcmlwdGlvbj4KKworICA8c3RydWN0dXJlPgorCisgICAgPGF0dHJpYnV0ZXM+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNvbGxhcHNlYXR0cmlidXRlcyIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtGbGFnIHRvIHRyZWF0IGF0dHJpYnV0ZXMgYXMgbmVzdGVkIGVsZW1lbnRzOworIG9wdGlvbmFsLCBkZWZhdWx0IGZhbHNlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBmbGFnIHRvIHRyZWF0IGF0dHJpYnV0ZXMgYXMgbmVzdGVkIGVsZW1lbnRzOworIG9wdGlvbmFsLCBkZWZhdWx0IGZhbHNlCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmlsZSIgdHlwZT0iamF2YS5pby5GaWxlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBYTUwgZmlsZSB0byBwYXJzZTsgcmVxdWlyZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFRoZSBYTUwgZmlsZSB0byBwYXJzZTsgcmVxdWlyZWQuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ia2VlcHJvb3QiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRmxhZyB0byBpbmNsdWRlIHRoZSB4bWwgcm9vdCB0YWcgYXMgYSAKKyBmaXJzdCB2YWx1ZSBpbiB0aGUgcHJvcGVydHkgbmFtZTsgb3B0aW9uYWwsIAorIGRlZmF1bHQgaXMgdHJ1ZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgZmxhZyB0byBpbmNsdWRlIHRoZSB4bWwgcm9vdCB0YWcgYXMgYSAKKyBmaXJzdCB2YWx1ZSBpbiB0aGUgcHJvcGVydHkgbmFtZTsgb3B0aW9uYWwsIAorIGRlZmF1bHQgaXMgdHJ1ZQorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InByZWZpeCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBwcmVmaXggdG8gcHJlcGVuZCB0byBlYWNoIHByb3BlcnR5Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICB0aGUgcHJlZml4IHRvIHByZXBlbmQgdG8gZWFjaCBwcm9wZXJ0eQorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InZhbGlkYXRlIiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0ZsYWcgdG8gdmFsaWRhdGUgdGhlIFhNTCBmaWxlOyBvcHRpb25hbCwgZGVmYXVsdCBmYWxzZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgZmxhZyB0byB2YWxpZGF0ZSB0aGUgWE1MIGZpbGU7IG9wdGlvbmFsLCBkZWZhdWx0IGZhbHNlCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICA8L2F0dHJpYnV0ZXM+CisKKyAgICA8ZWxlbWVudHM+CisgICAgPC9lbGVtZW50cz4KKworICA8L3N0cnVjdHVyZT4KKworPC90YXNrPgorCisKKzx0YXNrIG5hbWU9InhtbHZhbGlkYXRlIiBjYXRlZ29yeT0ib3RoZXIiCisgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLlhNTFZhbGlkYXRlVGFzayIKKyAgICAgID4KKworICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ2hlY2tzIFhNTCBmaWxlcyBhcmUgdmFsaWQgKG9yIG9ubHkgd2VsbCBmb3JtZWQpLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgIDxkZXNjcmlwdGlvbj4KKyAgICA8IVtDREFUQVtDaGVja3MgWE1MIGZpbGVzIGFyZSB2YWxpZCAob3Igb25seSB3ZWxsIGZvcm1lZCkuIFRoZQorIHRhc2sgdXNlcyB0aGUgU0FYMiBwYXJzZXIgaW1wbGVtZW50YXRpb24gcHJvdmlkZWQgYnkgSkFYUCBieSBkZWZhdWx0CisgKHByb2JhYmx5IHRoZSBvbmUgdGhhdCBpcyB1c2VkIGJ5IEFudCBpdHNlbGYpLCBidXQgb25lIGNhbiBzcGVjaWZ5IGFueQorIFNBWDEvMiBwYXJzZXIgaWYgbmVlZGVkXV0+CisgIDwvZGVzY3JpcHRpb24+CisKKyAgPHN0cnVjdHVyZT4KKworICAgIDxhdHRyaWJ1dGVzPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc25hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTcGVjaWZ5IHRoZSBjbGFzcyBuYW1lIG9mIHRoZSBTQVggcGFyc2VyIHRvIGJlIHVzZWQuIChvcHRpb25hbCkuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNwZWNpZnkgdGhlIGNsYXNzIG5hbWUgb2YgdGhlIFNBWCBwYXJzZXIgdG8gYmUgdXNlZC4gKG9wdGlvbmFsKQorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzcGF0aCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aCIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJQYXRoIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTcGVjaWZ5IHRoZSBjbGFzc3BhdGggdG8gYmUgc2VhcmNoZWQgdG8gbG9hZCB0aGUgcGFyc2VyIChvcHRpb25hbCkuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNwZWNpZnkgdGhlIGNsYXNzcGF0aCB0byBiZSBzZWFyY2hlZCB0byBsb2FkIHRoZSBwYXJzZXIgKG9wdGlvbmFsKQorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzcGF0aHJlZiIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVmZXJlbmNlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlJlZmVyZW5jZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbV2hlcmUgdG8gZmluZCB0aGUgcGFyc2VyIGNsYXNzOyBvcHRpb25hbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgV2hlcmUgdG8gZmluZCB0aGUgcGFyc2VyIGNsYXNzOyBvcHRpb25hbC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmYWlsb25lcnJvciIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTcGVjaWZ5IGhvdyBwYXJzZXIgZXJyb3IgYXJlIHRvIGJlIGhhbmRsZWQ7IAorIG9wdGlvbmFsLCBkZWZhdWx0PXRydWUKKyA8cD4KKyBJZiBzZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4gKGRlZmF1bHQpLCB0aHJvdyBhIGJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBwYXJzZXIgeWllbGRzIGFuIGVycm9yLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTcGVjaWZ5IGhvdyBwYXJzZXIgZXJyb3IgYXJlIHRvIGJlIGhhbmRsZWQ7IAorIG9wdGlvbmFsLCBkZWZhdWx0PXRydWUKKyA8cD4KKyBJZiBzZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4gKGRlZmF1bHQpLCB0aHJvdyBhIGJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBwYXJzZXIgeWllbGRzIGFuIGVycm9yLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImZpbGUiIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTcGVjaWZ5IHRoZSBmaWxlIHRvIGJlIGNoZWNrZWQ7IG9wdGlvbmFsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBzcGVjaWZ5IHRoZSBmaWxlIHRvIGJlIGNoZWNrZWQ7IG9wdGlvbmFsLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImxlbmllbnQiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU3BlY2lmeSB3aGV0aGVyIHRoZSBwYXJzZXIgc2hvdWxkIGJlIHZhbGlkYXRpbmcuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNwZWNpZnkgd2hldGhlciB0aGUgcGFyc2VyIHNob3VsZCBiZSB2YWxpZGF0aW5nLiBEZWZhdWx0IGlzIDxjb2RlPnRydWU8L2NvZGU+LgorIDxwPgorIElmIHNldCB0byBmYWxzZSwgdGhlIHZhbGlkYXRpb24gd2lsbCBmYWlsIG9ubHkgaWYgdGhlIHBhcnNlZCBkb2N1bWVudCBpcyBub3Qgd2VsbCBmb3JtZWQgWE1MLgorIDxwPgorIHRoaXMgb3B0aW9uIGlzIGlnbm9yZWQgaWYgdGhlIHNwZWNpZmllZCBjbGFzcyB3aXRoIHtAbGluayAjc2V0Q2xhc3NOYW1lKFN0cmluZyl9IGlzIG5vdCBhIFNBWDIKKyBYTUxSZWFkZXIuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0id2FybiIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTcGVjaWZ5IGhvdyBwYXJzZXIgZXJyb3IgYXJlIHRvIGJlIGhhbmRsZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNwZWNpZnkgaG93IHBhcnNlciBlcnJvciBhcmUgdG8gYmUgaGFuZGxlZC4KKyA8cD4KKyBJZiBzZXQgdG8gPGNvZGU+dHJ1ZTwvdHJ1ZT4gKGRlZmF1bHQpLCBsb2cgYSB3YXJuIG1lc3NhZ2UgZm9yIGVhY2ggU0FYIHdhcm4gZXZlbnQuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICA8L2F0dHJpYnV0ZXM+CisKKyAgICA8ZWxlbWVudHM+CisgICAgICA8ZWxlbWVudCBuYW1lPSJ4bWxjYXRhbG9nIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5YTUxDYXRhbG9nIgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJYTUxDYXRhbG9nIgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkIGFuIFhNTENhdGFsb2cgYXMgYSBuZXN0ZWQgZWxlbWVudDsgb3B0aW9uYWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW2FkZCBhbiBYTUxDYXRhbG9nIGFzIGEgbmVzdGVkIGVsZW1lbnQ7IG9wdGlvbmFsLl1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgICA8ZWxlbWVudCBuYW1lPSJmaWxlc2V0IiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0IgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlc2V0IgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU3BlY2lmeSBhIHNldCBvZiBmaWxlIHRvIGJlIGNoZWNrZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW3NwZWNpZnkgYSBzZXQgb2YgZmlsZSB0byBiZSBjaGVja2VkXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICAgIDxlbGVtZW50IG5hbWU9ImNsYXNzcGF0aCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aCIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUGF0aCIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW05vIGRlc2NyaXB0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtdXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgICAgPGVsZW1lbnQgbmFtZT0iZHRkIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5EVERMb2NhdGlvbiIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ3JlYXRlIGEgRFREIGxvY2F0aW9uIHJlY29yZDsgb3B0aW9uYWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0NyZWF0ZSBhIERURCBsb2NhdGlvbiByZWNvcmQ7IG9wdGlvbmFsLgorIFRoaXMgc3RvcmVzIHRoZSBsb2NhdGlvbiBvZiBhIERURC4gVGhlIERURCBpcyBpZGVudGlmaWVkCisgYnkgaXRzIHB1YmxpYyBJZC5dXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgIDwvZWxlbWVudHM+CisKKyAgPC9zdHJ1Y3R1cmU+CisKKzwvdGFzaz4KKworCis8dGFzayBuYW1lPSJ4c2x0IiBjYXRlZ29yeT0ieG1sIgorICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5YU0xUUHJvY2VzcyIKKyAgICAgIG1hdGNoaW5nVGFzaz0idHJ1ZSI+CisKKyAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1Byb2Nlc3NlcyBhIHNldCBvZiBYTUwgZG9jdW1lbnRzIHZpYSBYU0xULl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgIDxkZXNjcmlwdGlvbj4KKyAgICA8IVtDREFUQVtQcm9jZXNzZXMgYSBzZXQgb2YgWE1MIGRvY3VtZW50cyB2aWEgWFNMVC4gVGhpcyBpcworIHVzZWZ1bCBmb3IgYnVpbGRpbmcgdmlld3Mgb2YgWE1MIGJhc2VkIGRvY3VtZW50YXRpb24uXV0+CisgIDwvZGVzY3JpcHRpb24+CisKKyAgPHN0cnVjdHVyZT4KKworICAgIDxhdHRyaWJ1dGVzPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJiYXNlZGlyIiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQmFzZSBkaXJlY3Rvcnk7IAorIG9wdGlvbmFsLCBkZWZhdWx0IGlzIHRoZSBwcm9qZWN0J3MgYmFzZWRpci5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBiYXNlIGRpcmVjdG9yeTsgCisgb3B0aW9uYWwsIGRlZmF1bHQgaXMgdGhlIHByb2plY3QncyBiYXNlZGlyLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzcGF0aCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aCIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJQYXRoIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtPcHRpb25hbCBjbGFzc3BhdGggdG8gdGhlIFhTTCBwcm9jZXNzb3IuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFNldCB0aGUgb3B0aW9uYWwgY2xhc3NwYXRoIHRvIHRoZSBYU0wgcHJvY2Vzc29yCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NwYXRocmVmIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZWZlcmVuY2UiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUmVmZXJlbmNlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtSZWZlcmVuY2UgdG8gYW4gb3B0aW9uYWwgY2xhc3NwYXRoIHRvIHRoZSBYU0wgcHJvY2Vzc29yLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIHJlZmVyZW5jZSB0byBhbiBvcHRpb25hbCBjbGFzc3BhdGggdG8gdGhlIFhTTCBwcm9jZXNzb3IKKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXN0ZGlyIiB0eXBlPSJqYXZhLmlvLkZpbGUiCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRGVzdGluYXRpb24gZGlyZWN0b3J5IGludG8gd2hpY2ggdGhlIFhTTCByZXN1bHQKKyBmaWxlcyBzaG91bGQgYmUgY29waWVkIHRvOyAKKyByZXF1aXJlZCwgdW5sZXNzIDx0dD5pbjwvdHQ+IGFuZCA8dHQ+b3V0PC90dD4gYXJlCisgc3BlY2lmaWVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBpbnRvIHdoaWNoIHRoZSBYU0wgcmVzdWx0CisgZmlsZXMgc2hvdWxkIGJlIGNvcGllZCB0bzsgCisgcmVxdWlyZWQsIHVubGVzcyA8dHQ+aW48L3R0PiBhbmQgPHR0Pm91dDwvdHQ+IGFyZQorIHNwZWNpZmllZC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJleHRlbnNpb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtEZXNpcmVkIGZpbGUgZXh0ZW5zaW9uIHRvIGJlIHVzZWQgZm9yIHRoZSB0YXJnZXQ7Cisgb3B0aW9uYWwsIGRlZmF1bHQgaXMgaHRtbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHRoZSBkZXNpcmVkIGZpbGUgZXh0ZW5zaW9uIHRvIGJlIHVzZWQgZm9yIHRoZSB0YXJnZXQ7Cisgb3B0aW9uYWwsIGRlZmF1bHQgaXMgaHRtbC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmb3JjZSIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTZXQgd2hldGhlciB0byBjaGVjayBkZXBlbmRlbmNpZXMsIG9yIGFsd2F5cyBnZW5lcmF0ZTsKKyBvcHRpb25hbCwgZGVmYXVsdCBpcyBmYWxzZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0IHdoZXRoZXIgdG8gY2hlY2sgZGVwZW5kZW5jaWVzLCBvciBhbHdheXMgZ2VuZXJhdGU7Cisgb3B0aW9uYWwsIGRlZmF1bHQgaXMgZmFsc2UuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaW4iIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTcGVjaWZpZXMgYSBzaW5nbGUgWE1MIGRvY3VtZW50IHRvIGJlIHN0eWxlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgc3BlY2lmaWVzIGEgc2luZ2xlIFhNTCBkb2N1bWVudCB0byBiZSBzdHlsZWQuIFNob3VsZCBiZSB1c2VkIAorIHdpdGggdGhlIDx0dD5vdXQ8L3R0PiBhdHRyaWJ1dGU7IDsgcmVxdWlyZWQgaWYgPHR0Pm91dDwvdHQ+IGlzIHNldAorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9Im91dCIgdHlwZT0iamF2YS5pby5GaWxlIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NwZWNpZmllcyB0aGUgb3V0cHV0IG5hbWUgZm9yIHRoZSBzdHlsZWQgcmVzdWx0IGZyb20gdGhlIAorIDx0dD5pbjwvdHQ+IGF0dHJpYnV0ZTsgcmVxdWlyZWQgaWYgPHR0PmluPC90dD4gaXMgc2V0Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTcGVjaWZpZXMgdGhlIG91dHB1dCBuYW1lIGZvciB0aGUgc3R5bGVkIHJlc3VsdCBmcm9tIHRoZSAKKyA8dHQ+aW48L3R0PiBhdHRyaWJ1dGU7IHJlcXVpcmVkIGlmIDx0dD5pbjwvdHQ+IGlzIHNldAorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InByb2Nlc3NvciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW05hbWUgb2YgdGhlIFhTTCBwcm9jZXNzb3IgdG8gdXNlOyBvcHRpb25hbCwgZGVmYXVsdCB0cmF4Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBTZXQgdGhlIG5hbWUgb2YgdGhlIFhTTCBwcm9jZXNzb3IgdG8gdXNlOyBvcHRpb25hbCwgZGVmYXVsdCB0cmF4LgorIE90aGVyIHZhbHVlcyBhcmUgInhhbGFuIiBmb3IgWGFsYW4xIGFuZCAieHNscCIgZm9yIFhTTDpQLCB0aG91Z2ggdGhlCisgbGF0ZXIgaXMgc3Ryb25nbHkgZGVwcmVjYXRlZC4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzY2FuaW5jbHVkZWRkaXJlY3RvcmllcyIgdHlwZT0iYm9vbGVhbiIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtXaGV0aGVyIHRvIHN0eWxlIGFsbCBmaWxlcyBpbiB0aGUgaW5jbHVkZWQgZGlyZWN0b3JpZXMgYXMgd2VsbDsKKyBvcHRpb25hbCwgZGVmYXVsdCBpcyB0cnVlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBXaGV0aGVyIHRvIHN0eWxlIGFsbCBmaWxlcyBpbiB0aGUgaW5jbHVkZWQgZGlyZWN0b3JpZXMgYXMgd2VsbDsKKyBvcHRpb25hbCwgZGVmYXVsdCBpcyB0cnVlLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InN0eWxlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTmFtZSBvZiB0aGUgc3R5bGVzaGVldCB0byB1c2UgLSBnaXZlbiBlaXRoZXIgcmVsYXRpdmUKKyB0byB0aGUgcHJvamVjdCdzIGJhc2VkaXIgb3IgYXMgYW4gYWJzb2x1dGUgcGF0aDsgcmVxdWlyZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIE5hbWUgb2YgdGhlIHN0eWxlc2hlZXQgdG8gdXNlIC0gZ2l2ZW4gZWl0aGVyIHJlbGF0aXZlCisgdG8gdGhlIHByb2plY3QncyBiYXNlZGlyIG9yIGFzIGFuIGFic29sdXRlIHBhdGg7IHJlcXVpcmVkLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgPC9hdHRyaWJ1dGVzPgorCisgICAgPGVsZW1lbnRzPgorICAgICAgPGVsZW1lbnQgbmFtZT0ieG1sY2F0YWxvZyIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuWE1MQ2F0YWxvZyIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iWE1MQ2F0YWxvZyIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZCB0aGUgY2F0YWxvZyB0byBvdXIgaW50ZXJuYWwgY2F0YWxvZy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbQWRkIHRoZSBjYXRhbG9nIHRvIG91ciBpbnRlcm5hbCBjYXRhbG9nXV0+CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L2VsZW1lbnQ+CisKKyAgICAgIDxlbGVtZW50IG5hbWU9ImNsYXNzcGF0aCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aCIKKyAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUGF0aCIKKyAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW09wdGlvbmFsIGNsYXNzcGF0aCB0byB0aGUgWFNMIHByb2Nlc3Nvci5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbU2V0IHRoZSBvcHRpb25hbCBjbGFzc3BhdGggdG8gdGhlIFhTTCBwcm9jZXNzb3JdXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgICAgPGVsZW1lbnQgbmFtZT0ib3V0cHV0cHJvcGVydHkiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlhTTFRQcm9jZXNzLk91dHB1dFByb3BlcnR5IgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgYW4gb3V0cHV0IHByb3BlcnR5IHRvIGJlIGNvbmZpZ3VyZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0NyZWF0ZSBhbiBpbnN0YW5jZSBvZiBhbiBvdXRwdXQgcHJvcGVydHkgdG8gYmUgY29uZmlndXJlZC5dXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgICAgPGVsZW1lbnQgbmFtZT0icGFyYW0iIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlhTTFRQcm9jZXNzLlBhcmFtIgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgYW4gWFNMIHBhcmFtZXRlciBmb3IgY29uZmlndXJhdGlvbiBieSBBbnQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIDwhW0NEQVRBW0NyZWF0ZSBhbiBpbnN0YW5jZSBvZiBhbiBYU0wgcGFyYW1ldGVyIGZvciBjb25maWd1cmF0aW9uIGJ5IEFudC5dXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgIDwvZWxlbWVudHM+CisKKyAgPC9zdHJ1Y3R1cmU+CisKKzwvdGFzaz4KKworCis8dGFzayBuYW1lPSJ6aXAiIGNhdGVnb3J5PSJwYWNrYWdpbmciCisgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlppcCIKKyAgICAgIG1hdGNoaW5nVGFzaz0idHJ1ZSI+CisKKyAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NyZWF0ZSBhIFppcCBmaWxlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgIDxkZXNjcmlwdGlvbj4KKyAgICA8IVtDREFUQVtDcmVhdGUgYSBaaXAgZmlsZS5dXT4KKyAgPC9kZXNjcmlwdGlvbj4KKworICA8c3RydWN0dXJlPgorCisgICAgPGF0dHJpYnV0ZXM+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImJhc2VkaXIiIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtEaXJlY3RvcnkgZnJvbSB3aGljaCB0byBhcmNoaXZlIGZpbGVzOyBvcHRpb25hbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgRGlyZWN0b3J5IGZyb20gd2hpY2ggdG8gYXJjaGl2ZSBmaWxlczsgb3B0aW9uYWwuCisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29tcHJlc3MiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbV2hldGhlciB3ZSB3YW50IHRvIGNvbXByZXNzIHRoZSBmaWxlcyBvciBvbmx5IHN0b3JlIHRoZW07Cisgb3B0aW9uYWwsIGRlZmF1bHQ9dHJ1ZTsuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIFdoZXRoZXIgd2Ugd2FudCB0byBjb21wcmVzcyB0aGUgZmlsZXMgb3Igb25seSBzdG9yZSB0aGVtOworIG9wdGlvbmFsLCBkZWZhdWx0PXRydWU7CisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVzdGZpbGUiIHR5cGU9ImphdmEuaW8uRmlsZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgZmlsZSB0byBjcmVhdGU7IHJlcXVpcmVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBUaGUgZmlsZSB0byBjcmVhdGU7IHJlcXVpcmVkLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9ImR1cGxpY2F0ZSIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuWmlwLkR1cGxpY2F0ZSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSImcXVvdDthZGQmcXVvdDssICZxdW90O3ByZXNlcnZlJnF1b3Q7LCAmcXVvdDtmYWlsJnF1b3Q7IiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTZXRzIGJlaGF2aW9yIGZvciB3aGVuIGEgZHVwbGljYXRlIGZpbGUgaXMgYWJvdXQgdG8gYmUgYWRkZWQgLQorIG9uZSBvZiA8Y29kZT5rZWVwPC9jb2RlPiwgPGNvZGU+c2tpcDwvY29kZT4gb3IgPGNvZGU+b3ZlcndyaXRlPC9jb2RlPi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0cyBiZWhhdmlvciBmb3Igd2hlbiBhIGR1cGxpY2F0ZSBmaWxlIGlzIGFib3V0IHRvIGJlIGFkZGVkIC0KKyBvbmUgb2YgPGNvZGU+a2VlcDwvY29kZT4sIDxjb2RlPnNraXA8L2NvZGU+IG9yIDxjb2RlPm92ZXJ3cml0ZTwvY29kZT4uCisgUG9zc2libGUgdmFsdWVzIGFyZTogPGNvZGU+a2VlcDwvY29kZT4gKGtlZXAgYm90aAorIG9mIHRoZSBmaWxlcyk7IDxjb2RlPnNraXA8L2NvZGU+IChrZWVwIHRoZSBmaXJzdCB2ZXJzaW9uCisgb2YgdGhlIGZpbGUgZm91bmQpOyA8Y29kZT5vdmVyd3JpdGU8L2NvZGU+IG92ZXJ3cml0ZSB0aGUgZmlsZQorIHdpdGggdGhlIG5ldyBmaWxlCisgRGVmYXVsdCBmb3IgemlwIHRhc2tzIGlzIDxjb2RlPmtlZXA8L2NvZGU+CisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZW5jb2RpbmciIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtFbmNvZGluZyB0byB1c2UgZm9yIGZpbGVuYW1lcywgZGVmYXVsdHMgdG8gdGhlIHBsYXRmb3JtJ3MKKyBkZWZhdWx0IGVuY29kaW5nLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBFbmNvZGluZyB0byB1c2UgZm9yIGZpbGVuYW1lcywgZGVmYXVsdHMgdG8gdGhlIHBsYXRmb3JtJ3MKKyBkZWZhdWx0IGVuY29kaW5nLgorCisgPHA+Rm9yIGEgbGlzdCBvZiBwb3NzaWJsZSB2YWx1ZXMgc2VlIDxhCisgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9qZGsvMS4yL2RvY3MvZ3VpZGUvaW50ZXJuYXQvZW5jb2RpbmcuZG9jLmh0bWwiPmh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvamRrLzEuMi9kb2NzL2d1aWRlL2ludGVybmF0L2VuY29kaW5nLmRvYy5odG1sPC9hPi48L3A+CisgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+CisgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmlsZXNvbmx5IiB0eXBlPSJib29sZWFuIgorICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIGVtdWxhdGUgU3VuJ3MgamFyIHV0aWxpdHkgYnkgbm90IGFkZGluZyBwYXJlbnQgZGlyZWN0b3JpZXM7Cisgb3B0aW9uYWwsIGRlZmF1bHRzIHRvIGZhbHNlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKKyAgICAgICAgICBJZiB0cnVlLCBlbXVsYXRlIFN1bidzIGphciB1dGlsaXR5IGJ5IG5vdCBhZGRpbmcgcGFyZW50IGRpcmVjdG9yaWVzOworIG9wdGlvbmFsLCBkZWZhdWx0cyB0byBmYWxzZS4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1cGRhdGUiIHR5cGU9ImJvb2xlYW4iCisgICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgdHJ1ZSwgdXBkYXRlcyBhbiBleGlzdGluZyBmaWxlLCBvdGhlcndpc2Ugb3ZlcndyaXRlCisgYW55IGV4aXN0aW5nIG9uZTsgb3B0aW9uYWwgZGVmYXVsdHMgdG8gZmFsc2UuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KKyAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWworICAgICAgICAgIElmIHRydWUsIHVwZGF0ZXMgYW4gZXhpc3RpbmcgZmlsZSwgb3RoZXJ3aXNlIG92ZXJ3cml0ZQorIGFueSBleGlzdGluZyBvbmU7IG9wdGlvbmFsIGRlZmF1bHRzIHRvIGZhbHNlLgorICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgorICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8YXR0cmlidXRlIG5hbWU9IndoZW5lbXB0eSIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuWmlwLldoZW5FbXB0eSIKKyAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSImcXVvdDtmYWlsJnF1b3Q7LCAmcXVvdDtza2lwJnF1b3Q7LCAmcXVvdDtjcmVhdGUmcXVvdDsiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KKyAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NldHMgYmVoYXZpb3Igb2YgdGhlIHRhc2sgd2hlbiBubyBmaWxlcyBtYXRjaC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCisgICAgICAgICAgU2V0cyBiZWhhdmlvciBvZiB0aGUgdGFzayB3aGVuIG5vIGZpbGVzIG1hdGNoLgorIFBvc3NpYmxlIHZhbHVlcyBhcmU6IDxjb2RlPmZhaWw8L2NvZGU+ICh0aHJvdyBhbiBleGNlcHRpb24KKyBhbmQgaGFsdCB0aGUgYnVpbGQpOyA8Y29kZT5za2lwPC9jb2RlPiAoZG8gbm90IGNyZWF0ZQorIGFueSBhcmNoaXZlLCBidXQgaXNzdWUgYSB3YXJuaW5nKTsgPGNvZGU+Y3JlYXRlPC9jb2RlPgorIChtYWtlIGFuIGFyY2hpdmUgd2l0aCBubyBlbnRyaWVzKS4KKyBEZWZhdWx0IGZvciB6aXAgdGFza3MgaXMgPGNvZGU+c2tpcDwvY29kZT47CisgZm9yIGphciB0YXNrcywgPGNvZGU+Y3JlYXRlPC9jb2RlPi4KKyAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvYXR0cmlidXRlPgorICAgIDwvYXR0cmlidXRlcz4KKworICAgIDxlbGVtZW50cz4KKyAgICAgIDxlbGVtZW50IG5hbWU9ImZpbGVzZXQiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVTZXQiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGVzZXQiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIGEgc2V0IG9mIGZpbGVzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtBZGRzIGEgc2V0IG9mIGZpbGVzLl1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgICA8ZWxlbWVudCBuYW1lPSJ6aXBncm91cGZpbGVzZXQiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVTZXQiCisgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGVzZXQiCisgICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+CisgICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIGEgZ3JvdXAgb2YgemlwIGZpbGVzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+CisgICAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgICA8IVtDREFUQVtBZGRzIGEgZ3JvdXAgb2YgemlwIGZpbGVzLl1dPgorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9lbGVtZW50PgorCisgICAgICA8ZWxlbWVudCBuYW1lPSJ6aXBmaWxlc2V0IiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5aaXBGaWxlU2V0IgorICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJaaXBGaWxlc2V0IgorICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgorICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBhIHNldCBvZiBmaWxlcyB0aGF0IGNhbiBiZQorIHJlYWQgZnJvbSBhbiBhcmNoaXZlIGFuZCBiZSBnaXZlbiBhIHByZWZpeC9mdWxscGF0aC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgPCFbQ0RBVEFbQWRkcyBhIHNldCBvZiBmaWxlcyB0aGF0IGNhbiBiZQorIHJlYWQgZnJvbSBhbiBhcmNoaXZlIGFuZCBiZSBnaXZlbiBhIHByZWZpeC9mdWxscGF0aC5dXT4KKyAgICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgICAgIDwvZWxlbWVudD4KKworICAgIDwvZWxlbWVudHM+CisKKyAgPC9zdHJ1Y3R1cmU+CisKKzwvdGFzaz4KKzwvdGFza3M+CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3IgQ29udGVudCBBc3Npc3QgRGV2L3Rhc2tzLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvciBDb250ZW50IEFzc2lzdCBEZXYvdGFza3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyNmYwNGUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3IgQ29udGVudCBBc3Npc3QgRGV2L3Rhc2tzLnhtbApAQCAtMCwwICsxLDUxMzkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8VEFTS1M+CisJPFRBU0sgTkFNRT0iYW50Ij4KKwkJPERFU0NSSVBUSU9OPiZsdDtwJmd0O1J1bnMgQW50IG9uIGEgc3VwcGxpZWQgYnVpbGRmaWxlLiBUaGlzIGNhbiBiZSB1c2VkIHRvIGJ1aWxkIHN1YnByb2plY3RzLiZsdDsvcCZndDsKKyZsdDtwJmd0O1doZW4gdGhlICZsdDtpJmd0O2FudGZpbGUmbHQ7L2kmZ3Q7IGF0dHJpYnV0ZSBpcyBvbWl0dGVkLCB0aGUgZmlsZSAmYW1wO3F1b3Q7YnVpbGQueG1sJmFtcDtxdW90OworaW4gdGhlIHN1cHBsaWVkIGRpcmVjdG9yeSAoJmx0O2kmZ3Q7ZGlyJmx0Oy9pJmd0OyBhdHRyaWJ1dGUpIGlzIHVzZWQuJmx0Oy9wJmd0OworJmx0O3AmZ3Q7SWYgbm8gdGFyZ2V0IGF0dHJpYnV0ZSBpcyBzdXBwbGllZCwgdGhlIGRlZmF1bHQgdGFyZ2V0IG9mIHRoZSBuZXcgcHJvamVjdCBpcwordXNlZC4mbHQ7L3AmZ3Q7CismbHQ7cCZndDtCeSBkZWZhdWx0LCBhbGwgb2YgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGN1cnJlbnQgcHJvamVjdCB3aWxsIGJlCithdmFpbGFibGUgaW4gdGhlIG5ldyBwcm9qZWN0LiAgIEFsdGVybmF0aXZlbHksIHlvdSBjYW4KK3NldCB0aGUgJmx0O2kmZ3Q7aW5oZXJpdEFsbCZsdDsvaSZndDsgYXR0cmlidXRlIHRvICZsdDtjb2RlJmd0O2ZhbHNlJmx0Oy9jb2RlJmd0OyBhbmQgb25seQorJmFtcDtxdW90O3VzZXImYW1wO3F1b3Q7IHByb3BlcnRpZXMgKGkuZS4sIHRob3NlIHBhc3NlZCBvbiB0aGUgY29tbWFuZC1saW5lKQord2lsbCBiZSBwYXNzZWQgdG8gdGhlIG5ldyBwcm9qZWN0LiAgSW4gZWl0aGVyIGNhc2UsIHRoZSBzZXQgb2YKK3Byb3BlcnRpZXMgcGFzc2VkIHRvIHRoZSBuZXcgcHJvamVjdCB3aWxsIG92ZXJyaWRlIHRoZSBwcm9wZXJ0aWVzIHRoYXQgCithcmUgc2V0IGluIHRoZSBuZXcgcHJvamVjdCAoU2VlIGFsc28gdGhlICZsdDthIGhyZWY9JnF1b3Q7cHJvcGVydHkuaHRtbCZxdW90OyZndDtwcm9wZXJ0eSB0YXNrJmx0Oy9hJmd0OykuJmx0Oy9wJmd0OworJmx0O3AmZ3Q7WW91IGNhbiBhbHNvIHNldCBwcm9wZXJ0aWVzIGluIHRoZSBuZXcgcHJvamVjdCBmcm9tIHRoZSBvbGQgcHJvamVjdCBieQordXNpbmcgbmVzdGVkIHByb3BlcnR5IHRhZ3MuIFRoZXNlIHByb3BlcnRpZXMgYXJlIGFsd2F5cyBwYXNzZWQgcmVnYXJkbGVzcyBvZiB0aGUKK3NldHRpbmcgb2YgJmx0O2kmZ3Q7aW5oZXJpdEFsbCZsdDsvaSZndDsuICBUaGlzIGFsbG93cyB5b3UgdG8gcGFyYW1ldGVyaXplIHlvdXIgc3VicHJvamVjdHMuJmx0Oy9wJmd0OworJmx0O3AmZ3Q7UmVmZXJlbmNlcyB0byBkYXRhIHR5cGVzIGNhbiBhbHNvIGJlIHBhc3NlZCB0byB0aGUgbmV3IHByb2plY3QsIGJ1dAorYnkgZGVmYXVsdCB0aGV5IGFyZSBub3QuICBJZiB5b3Ugc2V0IHRoZSBpbmhlcml0cmVmcyBhdHRyaWJ1dGUgdG8KK3RydWUsIGFsbCByZWZlcmVuY2VzIHdpbGwgYmUgY29waWVkLCBidXQgdGhleSB3aWxsIG5vdCBvdmVycmlkZQorcmVmZXJlbmNlcyBkZWZpbmVkIGluIHRoZSBuZXcgcHJvamVjdC4mbHQ7L3AmZ3Q7CismbHQ7cCZndDtOZXN0ZWQgJmx0O2EgaHJlZj0mcXVvdDsjcmVmZXJlbmNlJnF1b3Q7Jmd0OyZsdDtpJmd0OyZhbXA7bHQ7cmVmZXJlbmNlJmFtcDtndDsmbHQ7L2kmZ3Q7Jmx0Oy9hJmd0OyBlbGVtZW50cworY2FuIGFsc28gYmUgdXNlZCB0byBjb3B5IHJlZmVyZW5jZXMgZnJvbSB0aGUgY2FsbGluZyBwcm9qZWN0IHRvIHRoZQorbmV3IHByb2plY3QsIG9wdGlvbmFsbHkgdW5kZXIgYSBkaWZmZXJlbnQgaWQuICBSZWZlcmVuY2VzIHRha2VuIGZyb20KK25lc3RlZCBlbGVtZW50cyB3aWxsIG92ZXJyaWRlIGV4aXN0aW5nIHJlZmVyZW5jZXMgaW4gdGhlIG5ldworcHJvamVjdC4mbHQ7L3AmZ3Q7Cis8L0RFU0NSSVBUSU9OPgorCQk8QVRUUklCVVRFIE5BTUU9ImFudGZpbGUiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+dGhlIGJ1aWxkZmlsZSB0byB1c2UuIERlZmF1bHRzIHRvJnF1b3Q7YnVpbGQueG1sJnF1b3Q7LiAgVGhpcyBmaWxlIGlzIGV4cGVjdGVkIHRvIGJlIGEgZmlsZW5hbWVyZWxhdGl2ZSB0byB0aGUgZGlyIGF0dHJpYnV0ZSBnaXZlbjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZGlyIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPnRoZSBkaXJlY3RvcnkgdG8gdXNlIGFzIGEgYmFzZWRpciBmb3IgdGhlIG5ldyBBbnQgcHJvamVjdC4gRGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgcHJvamVjdCdzIGJhc2VkaXIsIHVubGVzc2luaGVyaXRhbGwgaGFzIGJlZW4gc2V0IHRvIGZhbHNlLCBpbiB3aGljaCBjYXNlIGl0IGRvZXNuJ3RoYXZlIGEgZGVmYXVsdCB2YWx1ZS4gIFRoaXMgd2lsbCBvdmVycmlkZSB0aGUgYmFzZWRpcnNldHRpbmcgb2YgdGhlIGNhbGxlZCBwcm9qZWN0PC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJ0YXJnZXQiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+dGhlIHRhcmdldCBvZiB0aGUgbmV3IEFudCBwcm9qZWN0IHRoYXQgc2hvdWxkIGJlIGV4ZWN1dGVkLkRlZmF1bHRzIHRvIHRoZSBuZXcgcHJvamVjdCdzIGRlZmF1bHQgdGFyZ2V0PC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJvdXRwdXQiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+RmlsZW5hbWUgdG8gd3JpdGUgdGhlIGFudCBvdXRwdXQgdG8uICBUaGlzIGlzcmVsYXRpdmUgdG8gdGhlIHZhbHVlIG9mIHRoZSBkaXIgYXR0cmlidXRlIGlmIGl0IGhhcyBiZWVuIHNldCBvcnRvIHRoZSBiYXNlIGRpcmVjdG9yeSBvZiB0aGUgY3VycmVudCBwcm9qZWN0IG90aGVyd2lzZS48L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImluaGVyaXRhbGwiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+SWYgdHJ1ZSwgcGFzcyBhbGwgcHJvcGVydGllcyB0byB0aGVuZXcgQW50IHByb2plY3QuICBEZWZhdWx0cyB0byB0cnVlPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJpbmhlcml0cmVmcyIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5JZiB0cnVlLCBwYXNzIGFsbCByZWZlcmVuY2VzIHRvIHRoZW5ldyBBbnQgcHJvamVjdC4gIERlZmF1bHRzIHRvIGZhbHNlPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisJPC9UQVNLPgorCTxUQVNLIE5BTUU9ImFudGNhbGwiPgorCQk8REVTQ1JJUFRJT04+Jmx0O3AmZ3Q7Q2FsbCBhbm90aGVyIHRhcmdldCB3aXRoaW4gdGhlIHNhbWUgYnVpbGQtZmlsZSBvcHRpb25hbGx5IHNwZWNpZnlpbmcgc29tZQorcHJvcGVydGllcyAocGFyYW0ncyBpbiB0aGlzIGNvbnRleHQpJmx0Oy9wJmd0OworJmx0O3AmZ3Q7QnkgZGVmYXVsdCwgYWxsIG9mIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBjdXJyZW50IHByb2plY3Qgd2lsbCBiZQorYXZhaWxhYmxlIGluIHRoZSBuZXcgcHJvamVjdC4gICBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuCitzZXQgdGhlICZsdDtpJmd0O2luaGVyaXRBbGwmbHQ7L2kmZ3Q7IGF0dHJpYnV0ZSB0byAmbHQ7Y29kZSZndDtmYWxzZSZsdDsvY29kZSZndDsgYW5kIG9ubHkKKyZhbXA7cXVvdDt1c2VyJmFtcDtxdW90OyBwcm9wZXJ0aWVzIChpLmUuLCB0aG9zZSBwYXNzZWQgb24gdGhlIGNvbW1hbmQtbGluZSkKK3dpbGwgYmUgcGFzc2VkIHRvIHRoZSBuZXcgcHJvamVjdC4gIEluIGVpdGhlciBjYXNlLCB0aGUgc2V0IG9mCitwcm9wZXJ0aWVzIHBhc3NlZCB0byB0aGUgbmV3IHByb2plY3Qgd2lsbCBvdmVycmlkZSB0aGUgcHJvcGVydGllcyB0aGF0IAorYXJlIHNldCBpbiB0aGUgbmV3IHByb2plY3QgKFNlZSBhbHNvIHRoZSAmbHQ7YSBocmVmPSZxdW90O3Byb3BlcnR5Lmh0bWwmcXVvdDsmZ3Q7cHJvcGVydHkgdGFzayZsdDsvYSZndDspLiZsdDsvcCZndDsKKyZsdDtwJmd0O1lvdSBjYW4gYWxzbyBzZXQgcHJvcGVydGllcyBpbiB0aGUgbmV3IHByb2plY3QgZnJvbSB0aGUgb2xkIHByb2plY3QgYnkKK3VzaW5nIG5lc3RlZCBwYXJhbSB0YWdzLiBUaGVzZSBwcm9wZXJ0aWVzIGFyZSBhbHdheXMgcGFzc2VkIHJlZ2FyZGxlc3Mgb2YgdGhlCitzZXR0aW5nIG9mICZsdDtpJmd0O2luaGVyaXRBbGwmbHQ7L2kmZ3Q7LiAgVGhpcyBhbGxvd3MgeW91IHRvIHBhcmFtZXRlcml6ZSB5b3VyIHN1YnByb2plY3RzLiZsdDsvcCZndDsKKyZsdDtwJmd0O05lc3RlZCAmbHQ7YSBocmVmPSZxdW90OyNyZWZlcmVuY2UmcXVvdDsmZ3Q7Jmx0O2kmZ3Q7JmFtcDtsdDtyZWZlcmVuY2UmYW1wO2d0OyZsdDsvaSZndDsmbHQ7L2EmZ3Q7IGVsZW1lbnRzIGNhbgorYmUgdXNlZCB0byBjb3B5IHJlZmVyZW5jZXMgZnJvbSB0aGUgY2FsbGluZyBwcm9qZWN0IHRvIHRoZSBuZXcKK3Byb2plY3QsIG9wdGlvbmFsbHkgdW5kZXIgYSBkaWZmZXJlbnQgaWQuICBSZWZlcmVuY2VzIHRha2VuIGZyb20KK25lc3RlZCBlbGVtZW50cyB3aWxsIG92ZXJyaWRlIGV4aXN0aW5nIHJlZmVyZW5jZXMgaW4gdGhlIG5ldworcHJvamVjdC4mbHQ7L3AmZ3Q7CismbHQ7cCZndDsKK1doZW4gYSB0YXJnZXQgaXMgaW52b2tlZCBieSBhbnRjYWxsLCBhbGwgb2YgaXRzIGRlcGVuZGVudCB0YXJnZXRzIHdpbGwKK2Fsc28gYmUgY2FsbGVkIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhbnkgbmV3IHBhcmFtZXRlcnMuIEZvciBleGFtcGxlLiBpZgordGhlIHRhcmdldCAmYW1wO3F1b3Q7ZG9Tb21ldGhpbmdFbHNlJmFtcDtxdW90OyBkZXBlbmRlZCBvbiB0aGUgdGFyZ2V0ICZhbXA7cXVvdDtpbml0JmFtcDtxdW90OywgdGhlbiB0aGUgCismbHQ7aSZndDthbnRjYWxsJmx0Oy9pJmd0OyBvZiAmYW1wO3F1b3Q7ZG9Tb21ldGhpbmdFbHNlJmFtcDtxdW90OyB3aWxsIGNhbGwgJmFtcDtxdW90O2luaXQmYW1wO3F1b3Q7IGR1cmluZyB0aGUgY2FsbC4gCitPZiBjb3Vyc2UsIGFueSBwcm9wZXJ0aWVzIGRlZmluZWQgaW4gdGhlIGFudGNhbGwgdGFzayBvciBpbmhlcml0ZWQgZnJvbSB0aGUgY2FsbGluZyB0YXJnZXQgCit3aWxsIGJlIGZpeGVkIGFuZCBub3Qgb3ZlcnJpZGFibGUgaW4gdGhlIGluaXQgdGFzayAtb3IgaW5kZWVkIGluIHRoZSAmYW1wO3F1b3Q7ZG9Tb21ldGhpbmdFbHNlJmFtcDtxdW90OyB0YXNrLiAgCismbHQ7L3AmZ3Q7Cis8L0RFU0NSSVBUSU9OPgorCQk8QVRUUklCVVRFIE5BTUU9InRhcmdldCIgUkVRVUlSRUQ9InllcyI+CisJCQk8REVTQ1JJUFRJT04+VGhlIHRhcmdldCB0byBleGVjdXRlPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJpbmhlcml0YWxsIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPklmIHRydWUsIHBhc3MgYWxsIHByb3BlcnRpZXMgdG8gdGhlIG5ldyBBbnRwcm9qZWN0LiAgRGVmYXVsdHMgdG8gdHJ1ZS48L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImluaGVyaXRyZWZzIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPklmIHRydWUsIHBhc3MgYWxsIHJlZmVyZW5jZXMgdG8gdGhlbmV3IEFudCBwcm9qZWN0LiAgRGVmYXVsdHMgdG8gZmFsc2U8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKwk8L1RBU0s+CisJPFRBU0sgTkFNRT0iYW50c3RydWN0dXJlIj4KKwkJPERFU0NSSVBUSU9OPiZsdDtwJmd0O0dlbmVyYXRlcyBhIERURCBmb3IgQW50IGJ1aWxkZmlsZXMgd2hpY2ggY29udGFpbnMgaW5mb3JtYXRpb24KK2Fib3V0IGFsbCB0YXNrcyBjdXJyZW50bHkga25vd24gdG8gQW50LiZsdDsvcCZndDsgCismbHQ7cCZndDtOb3RlIHRoYXQgdGhlIERURCBnZW5lcmF0ZWQgYnkgdGhpcyB0YXNrIGlzIGluY29tcGxldGUsIHlvdSBjYW4KK2Fsd2F5cyBhZGQgWE1MIGVudGl0aWVzIHVzaW5nICZsdDthCitocmVmPSZxdW90O3Rhc2tkZWYuaHRtbCZxdW90OyZndDsmbHQ7Y29kZSZndDsmYW1wO2x0O3Rhc2tkZWYmYW1wO2d0OyZsdDsvY29kZSZndDsmbHQ7L2EmZ3Q7IG9yICZsdDthCitocmVmPSZxdW90O3R5cGVkZWYuaHRtbCZxdW90OyZndDsmbHQ7Y29kZSZndDsmYW1wO2x0O3R5cGVkZWYmYW1wO2d0OyZsdDsvY29kZSZndDsmbHQ7L2EmZ3Q7LiBTZWUgJmx0O2EKK2hyZWY9JnF1b3Q7aHR0cDovL3d3dy5zZHYuZnIvcGFnZXMvY2FzYS9odG1sL2FudC1kdGQuZW4uaHRtbCZxdW90OwordGFyZ2V0PSZxdW90O190b3AmcXVvdDsmZ3Q7aGVyZSZsdDsvYSZndDsgZm9yIGEgd2F5IHRvIGdldCBhcm91bmQgdGhpcyBwcm9ibGVtLiZsdDsvcCZndDsKKyZsdDtwJmd0O1RoaXMgdGFzayBkb2Vzbid0IGtub3cgYWJvdXQgcmVxdWlyZWQgYXR0cmlidXRlcywgYWxsIHdpbGwgYmUKK2xpc3RlZCBhcyAmbHQ7Y29kZSZndDsjSU1QTElFRCZsdDsvY29kZSZndDsuJmx0Oy9wJmd0OworPC9ERVNDUklQVElPTj4KKwkJPEFUVFJJQlVURSBOQU1FPSJvdXRwdXQiIFJFUVVJUkVEPSJ5ZXMiPgorCQkJPERFU0NSSVBUSU9OPmZpbGUgdG8gd3JpdGUgdGhlIERURCB0bzwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCTwvVEFTSz4KKwk8VEFTSyBOQU1FPSJhcHBseSI+CisJCTxERVNDUklQVElPTj4mbHQ7cCZndDtFeGVjdXRlcyBhIHN5c3RlbSBjb21tYW5kLiBXaGVuIHRoZSAmbHQ7aSZndDtvcyZsdDsvaSZndDsgYXR0cmlidXRlIGlzIHNwZWNpZmllZCwgdGhlbgordGhlIGNvbW1hbmQgaXMgb25seSBleGVjdXRlZCB3aGVuIEFudCBpcyBydW4gb24gb25lIG9mIHRoZSBzcGVjaWZpZWQgb3BlcmF0aW5nCitzeXN0ZW1zLiZsdDsvcCZndDsKKyZsdDtwJmd0O1RoZSBmaWxlcyBhbmQvb3IgZGlyZWN0b3JpZXMgb2YgYSBudW1iZXIgb2YgJmx0O2EKK2hyZWY9JnF1b3Q7Li4vQ29yZVR5cGVzL2ZpbGVzZXQuaHRtbCZxdW90OyZndDtGaWxlU2V0Jmx0Oy9hJmd0O3MgYXJlIHBhc3NlZCBhcyBhcmd1bWVudHMKK3RvIHRoZSBzeXN0ZW0gY29tbWFuZC4mbHQ7L3AmZ3Q7CismbHQ7cCZndDtJZiB5b3Ugc3BlY2lmeSBhIG5lc3RlZCAmbHQ7YQoraHJlZj0mcXVvdDsuLi9Db3JlVHlwZXMvbWFwcGVyLmh0bWwmcXVvdDsmZ3Q7bWFwcGVyJmx0Oy9hJmd0OyBhbmQgdGhlICZsdDtpJmd0O2Rlc3QmbHQ7L2kmZ3Q7IGF0dHJpYnV0ZSwKK3RoZSB0aW1lc3RhbXAgb2YgZWFjaCBzb3VyY2UgZmlsZSBpcyBjb21wYXJlZCB0byB0aGUgdGltZXN0YW1wIG9mIGEKK3RhcmdldCBmaWxlIHdoaWNoIGlzIGRlZmluZWQgYnkgdGhlIG5lc3RlZCBtYXBwZXIgZWxlbWVudCBhbmQgc2VhcmNoZWQKK2ZvciBpbiB0aGUgZ2l2ZW4gZGVzdC4mbHQ7L3AmZ3Q7CismbHQ7cCZndDtBdCBsZWFzdCBvbmUgZmlsZXNldCBpcyByZXF1aXJlZCwgYW5kIHlvdSBtdXN0IG5vdCBzcGVjaWZ5IG1vcmUgdGhhbgorb25lIG1hcHBlci4mbHQ7L3AmZ3Q7Cis8L0RFU0NSSVBUSU9OPgorCQk8QVRUUklCVVRFIE5BTUU9ImV4ZWN1dGFibGUiIFJFUVVJUkVEPSJ5ZXMiPgorCQkJPERFU0NSSVBUSU9OPnRoZSBjb21tYW5kIHRvIGV4ZWN1dGUgd2l0aG91dCBhbnkgY29tbWFuZCBsaW5lYXJndW1lbnRzPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJkZXN0IiBSRVFVSVJFRD0ieWVzLCBpZiB5b3Ugc3BlY2lmeSBhIG5lc3RlZCBtYXBwZXIiPgorCQkJPERFU0NSSVBUSU9OPnRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlICZsdDthcHBseSZndDsgZXhwZWN0cyB0aGUgdGFyZ2V0IGZpbGVzIHdpbGwgYmUgcGxhY2VkIGJ5IHRoZSBjb21tYW5kLCB3aGVuIGl0IGlzIGV4ZWN1dGVkLiA8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImRpciIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj50aGUgZGlyZWN0b3J5IGluIHdoaWNoIHRoZSBjb21tYW5kIHNob3VsZCBiZSBleGVjdXRlZDwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0icmVsYXRpdmUiIFJFUVVJUkVEPSJubywgZGVmYXVsdCBpcyBmYWxzZSI+CisJCQk8REVTQ1JJUFRJT04+d2hldGhlciB0aGUgZmlsZW5hbWVzIHNob3VsZCBiZSBwYXNzZWQgb24gdGhlY29tbWFuZCBsaW5lIGFzIGFic29sdXRlIG9yIHJlbGF0aXZlIHBhdGhuYW1lcyAocmVsYXRpdmUgdG8gdGhlYmFzZSBkaXJlY3Rvcnkgb2YgdGhlIGNvcnJlc3BvbmRpbmcgZmlsZXNldCBmb3Igc291cmNlIGZpbGVzIG9ydGhlIGRlc3QgYXR0cmlidXRlIGZvciB0YXJnZXQgZmlsZXMpPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJvcyIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5saXN0IG9mIE9wZXJhdGluZyBTeXN0ZW1zIG9uIHdoaWNoIHRoZSBjb21tYW5kIG1heSBiZWV4ZWN1dGVkPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJvdXRwdXQiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+dGhlIGZpbGUgdG8gd2hpY2ggdGhlIG91dHB1dCBvZiB0aGUgY29tbWFuZCBzaG91bGQgYmVyZWRpcmVjdGVkPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJvdXRwdXRwcm9wZXJ0eSIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj50aGUgbmFtZSBvZiBhIHByb3BlcnR5IGluIHdoaWNoIHRoZSBvdXRwdXQgb2YgdGhlIGNvbW1hbmQgc2hvdWxkIGJlIHN0b3JlZDwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0idGltZW91dCIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5TdG9wIHRoZSBjb21tYW5kIGlmIGl0IGRvZXNuJ3QgZmluaXNoIHdpdGhpbiB0aGVzcGVjaWZpZWQgdGltZSAoZ2l2ZW4gaW4gbWlsbGlzZWNvbmRzKTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZmFpbG9uZXJyb3IiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+U3RvcCB0aGUgYnVpbGRwcm9jZXNzIGlmIHRoZSBjb21tYW5kIGV4aXRzIHdpdGggYXJldHVybmNvZGUgb3RoZXIgdGhhbiAwPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJza2lwZW1wdHlmaWxlc2V0cyIgUkVRVUlSRUQ9Im5vLCBkZWZhdWx0IGlzIGZhbHNlIj4KKwkJCTxERVNDUklQVElPTj5Eb24ndCBydW4gdGhlIGNvbW1hbmQsIGlmIG5vIHNvdXJjZSBmaWxlcyBoYXZlYmVlbiBmb3VuZCBvciBhcmUgbmV3ZXIgdGhhbiB0aGVpciBjb3JyZXNwb25kaW5nIHRhcmdldGZpbGVzPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJwYXJhbGxlbCIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5SdW4gdGhlIGNvbW1hbmQgb25seSBvbmNlLCBhcHBlbmRpbmcgYWxsIGZpbGVzIGFzYXJndW1lbnRzLiBJZiBmYWxzZSwgY29tbWFuZCB3aWxsIGJlIGV4ZWN1dGVkIG9uY2UgZm9yIGV2ZXJ5IGZpbGUuIERlZmF1bHRzIHRvIGZhbHNlLjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0idHlwZSIgUkVRVUlSRUQ9Im5vLCBkZWZhdWx0IGlzIGZpbGUiPgorCQkJPERFU0NSSVBUSU9OPk9uZSBvZiBmaWxlLCBkaXIgb3Jib3RoLiBJZiBzZXQgdG8gZmlsZSwgb25seSB0aGUgbmFtZXMgb2YgcGxhaW5maWxlcyB3aWxsIGJlIHNlbnQgdG8gdGhlIGNvbW1hbmQuIElmIHNldCB0byBkaXIsIG9ubHl0aGUgbmFtZXMgb2YgZGlyZWN0b3JpZXMgYXJlIGNvbnNpZGVyZWQ8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9Im5ld2Vudmlyb25tZW50IiBSRVFVSVJFRD0ibm8sIGRlZmF1bHQgaXMgZmFsc2UiPgorCQkJPERFU0NSSVBUSU9OPkRvIG5vdCBwcm9wYWdhdGUgb2xkIGVudmlyb25tZW50IHdoZW4gbmV3IGVudmlyb25tZW50dmFyaWFibGVzIGFyZSBzcGVjaWZpZWQ8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9InZtbGF1bmNoZXIiIFJFUVVJUkVEPSJubywgZGVmYXVsdCBpcyB0cnVlIj4KKwkJCTxERVNDUklQVElPTj5SdW4gY29tbWFuZCB1c2luZyB0aGUgSmF2YSBWTSdzIGV4ZWN1dGlvbiBmYWNpbGl0aWVzd2hlcmUgYXZhaWxhYmxlLiBJZiBzZXQgdG8gZmFsc2UgdGhlIHVuZGVybHlpbmcgT1MncyBzaGVsbCxlaXRoZXIgZGlyZWN0bHkgb3IgdGhyb3VnaCB0aGUgYW50UnVuIHNjcmlwdHMsIHdpbGwgYmUgdXNlZC5VbmRlciBzb21lIG9wZXJhdGluZyBzeXN0ZW1zLCB0aGlzIGdpdmVzIGFjY2VzcyB0byBmYWNpbGl0aWVzbm90IG5vcm1hbGx5IGF2YWlsYWJsZSB0aHJvdWdoIHRoZSBWTSBpbmNsdWRpbmcsIHVuZGVyIFdpbmRvd3MsYmVpbmcgYWJsZSB0byBleGVjdXRlIHNjcmlwdHMsIHJhdGhlciB0aGFuIHRoZWlyIGFzc29jaWF0ZWRpbnRlcnByZXRlci4gIElmIHlvdSB3YW50IHRvIHNwZWNpZnkgdGhlIG5hbWUgb2YgdGhlZXhlY3V0YWJsZSBhcyBhIHJlbGF0aXZlIHBhdGggdG8gdGhlIGRpcmVjdG9yeSBnaXZlbiBieSB0aGVkaXIgYXR0cmlidXRlLCBpdCBtYXkgYmVjb21lIG5lY2Vzc2FyeSB0byBzZXQgdm1sYXVuY2hlciB0b2ZhbHNlIGFzIHdlbGw8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKwk8L1RBU0s+CisJPFRBU0sgTkFNRT0iYXZhaWxhYmxlIj4KKwkJPERFU0NSSVBUSU9OPiZsdDtwJmd0O1NldHMgYSBwcm9wZXJ0eSBpZiBhIHJlc291cmNlIGlzIGF2YWlsYWJsZSBhdCBydW50aW1lLiBUaGlzIHJlc291cmNlIGNhbiBiZSBhCitmaWxlLCBhIGRpcmVjdG9yeSwgYSBjbGFzcyBpbiB0aGUgY2xhc3NwYXRoLCBvciBhIEpWTSBzeXN0ZW0gcmVzb3VyY2UuJmx0Oy9wJmd0OworJmx0O3AmZ3Q7SWYgdGhlIHJlc291cmNlIGlzIHByZXNlbnQsIHRoZSBwcm9wZXJ0eSB2YWx1ZSBpcyBzZXQgdG8gdHJ1ZSBieQorZGVmYXVsdDsgb3RoZXJ3aXNlLCB0aGUgcHJvcGVydHkgaXMgbm90IHNldC4gWW91IGNhbiBzZXQgdGhlIHZhbHVlIHRvCitzb21ldGhpbmcgb3RoZXIgdGhhbiB0aGUgZGVmYXVsdCBieSBzcGVjaWZ5aW5nIHRoZSAmbHQ7Y29kZSZndDt2YWx1ZSZsdDsvY29kZSZndDsgYXR0cmlidXRlLiZsdDsvcCZndDsKKyZsdDtwJmd0O05vcm1hbGx5LCB0aGlzIHRhc2sgaXMgdXNlZCB0byBzZXQgcHJvcGVydGllcyB0aGF0IGFyZSB1c2VmdWwgdG8gYXZvaWQgdGFyZ2V0CitleGVjdXRpb24gZGVwZW5kaW5nIG9uIHN5c3RlbSBwYXJhbWV0ZXJzLiZsdDsvcCZndDsKKzwvREVTQ1JJUFRJT04+CisJCTxBVFRSSUJVVEUgTkFNRT0icHJvcGVydHkiIFJFUVVJUkVEPSJ5ZXMiPgorCQkJPERFU0NSSVBUSU9OPlRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQ8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9InZhbHVlIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPlRoZSB2YWx1ZSB0byBzZXQgdGhlIHByb3BlcnR5IHRvLiBEZWZhdWx0cyB0byAmcXVvdDt0cnVlJnF1b3Q7PC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJjbGFzc25hbWUiIFJFUVVJUkVEPSJ5ZXMiPgorCQkJPERFU0NSSVBUSU9OPlRoZSBjbGFzcyB0byBsb29rIGZvciBpbiB0aGUgY2xhc3NwYXRoPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJmaWxlIiBSRVFVSVJFRD0iIj4KKwkJCTxERVNDUklQVElPTj5UaGUgZmlsZSB0byBsb29rIGZvcjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0icmVzb3VyY2UiIFJFUVVJUkVEPSIiPgorCQkJPERFU0NSSVBUSU9OPlRoZSByZXNvdXJjZSB0byBsb29rIGZvciBpbiB0aGUgSlZNPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJjbGFzc3BhdGgiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+VGhlIGNsYXNzcGF0aCB0byB1c2Ugd2hlbiBsb29raW5nIHVwIGNsYXNzbmFtZSBvciByZXNvdXJjZTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZmlsZXBhdGgiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+VGhlIHBhdGggdG8gdXNlIHdoZW4gbG9va2luZyB1cCBmaWxlPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJjbGFzc3BhdGhyZWYiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+VGhlIGNsYXNzcGF0aCB0byB1c2UsIGdpdmVuIGFzIGEgcmVmZXJlbmNlIHRvIGEgcGF0aCBkZWZpbmVkIGVsc2V3aGVyZTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0idHlwZSIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5UaGUgdHlwZSBvZiBmaWxlIHRvIGxvb2sgZm9yLCBlaXRoZXIgYSBkaXJlY3RvcnkgKHR5cGU9JnF1b3Q7ZGlyJnF1b3Q7KSBvciBhIGZpbGUodHlwZT0mcXVvdDtmaWxlJnF1b3Q7KS4gSWYgbm90IHNldCwgdGhlIHByb3BlcnR5IHdpbGwgYmUgc2V0IGlmIHRoZSBuYW1lIHNwZWNpZmllZCBpbiB0aGUgZmlsZWF0dHJpYnV0ZSBleGlzdHMgYXMgZWl0aGVyIGEgZmlsZSBvciBhIGRpcmVjdG9yeTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iaWdub3Jlc3lzdGVtY2xhc3NlcyIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5JZ25vcmUgQW50J3MgcnVudGltZSBjbGFzc2VzLCB1c2luZyBvbmx5IHRoZSBzcGVjaWZpZWRjbGFzc3BhdGguICBPbmx5IGFmZmVjdHMgdGhlICZxdW90O2NsYXNzbmFtZSZxdW90OyBhdHRyaWJ1dGUuICBEZWZhdWx0cyB0byAmcXVvdDtmYWxzZTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCTwvVEFTSz4KKwk8VEFTSyBOQU1FPSJiYXNlbmFtZSI+CisJCTxERVNDUklQVElPTj4mbHQ7cCZndDsKK1Rhc2sgdG8gZGV0ZXJtaW5lIHRoZSBiYXNlbmFtZSBvZiBhIHNwZWNpZmllZCBmaWxlLCBvcHRpb25hbGx5IG1pbnVzIGEKK3NwZWNpZmllZCBzdWZmaXguCismbHQ7L3AmZ3Q7CismbHQ7cCZndDsKK1doZW4gdGhpcyB0YXNrIGV4ZWN1dGVzLCBpdCB3aWxsIHNldCB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IHRvIHRoZQordmFsdWUgb2YgdGhlIGxhc3QgcGF0aCBlbGVtZW50IG9mIHRoZSBzcGVjaWZpZWQgZmlsZS4gSWYgJmx0O2NvZGUmZ3Q7ZmlsZSZsdDsvY29kZSZndDsgaXMgYQorZGlyZWN0b3J5LCB0aGUgYmFzZW5hbWUgd2lsbCBiZSB0aGUgbGFzdCBkaXJlY3RvcnkgZWxlbWVudC4gSWYKKyZsdDtjb2RlJmd0O2ZpbGUmbHQ7L2NvZGUmZ3Q7IGlzIGEgZnVsbC1wYXRoLCByZWxhdGl2ZS1wYXRoLCBvciBzaW1wbGUgZmlsZW5hbWUsCit0aGUgYmFzZW5hbWUgd2lsbCBiZSB0aGUgc2ltcGxlIGZpbGUgbmFtZSwgd2l0aG91dCBhbnkgZGlyZWN0b3J5IGVsZW1lbnRzLgorJmx0Oy9wJmd0OworJmx0O3AmZ3Q7IAorPC9ERVNDUklQVElPTj4KKwkJPEFUVFJJQlVURSBOQU1FPSJmaWxlIiBSRVFVSVJFRD0ieWVzIj4KKwkJCTxERVNDUklQVElPTj5UaGUgcGF0aCB0byB0YWtlIHRoZSBiYXNlbmFtZSBvZjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0icHJvcGVydHkiIFJFUVVJUkVEPSJ5ZXMiPgorCQkJPERFU0NSSVBUSU9OPlRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQ8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9InN1ZmZpeCIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5UaGUgc3VmZml4IHRvIHJlbW92ZSBmcm9tIHRoZSByZXN1bHRpbmcgYmFzZW5hbWUoc3BlY2lmaWVkIGVpdGhlciB3aXRoIG9yIHdpdGhvdXQgdGhlICZxdW90Oy4mcXVvdDspPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisJPC9UQVNLPgorCTxUQVNLIE5BTUU9ImJ1aWxkbnVtYmVyIj4KKwkJPERFU0NSSVBUSU9OPiZsdDtwJmd0O1RoaXMgaXMgYSBiYXNpYyB0YXNrIHRoYXQgY2FuIGJlIHVzZWQgdG8gdHJhY2sgYnVpbGQgbnVtYmVycy4mbHQ7L3AmZ3Q7CismbHQ7cCZndDtJdCB3aWxsIGZpcnN0IGF0dGVtcHQgdG8gcmVhZCBhIGJ1aWxkIG51bWJlciBmcm9tIGEgZmlsZSAoYnkgZGVmYXVsdCwKKyZsdDtjb2RlJmd0O2J1aWxkLm51bWJlciZsdDsvY29kZSZndDsgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5KSwgdGhlbgorc2V0IHRoZSBwcm9wZXJ0eSAmbHQ7Y29kZSZndDtidWlsZC5udW1iZXImbHQ7L2NvZGUmZ3Q7IHRvIHRoZSB2YWx1ZSB0aGF0IHdhcyByZWFkIGluCisob3IgdG8gJmx0O2NvZGUmZ3Q7MCZsdDsvY29kZSZndDssIGlmIG5vIHN1Y2ggdmFsdWUpLiBJdCB3aWxsIHRoZW4gaW5jcmVtZW50IHRoZQorbnVtYmVyIGJ5IG9uZSBhbmQgd3JpdGUgaXQgYmFjayBvdXQgdG8gdGhlIGZpbGUuCisoU2VlIHRoZQorJmx0O2EgaHJlZj0mcXVvdDsuLi9PcHRpb25hbFRhc2tzL3Byb3BlcnR5ZmlsZS5odG1sJnF1b3Q7Jmd0O1Byb3BlcnR5RmlsZSZsdDsvYSZndDsgdGFzaworaWYgeW91IG5lZWQgZmluZXIgY29udHJvbCBvdmVyIHRoaW5ncyBzdWNoIGFzIHRoZSBwcm9wZXJ0eSBuYW1lIG9yCit0aGUgbnVtYmVyIGZvcm1hdC4pCismbHQ7L3AmZ3Q7Cis8L0RFU0NSSVBUSU9OPgorCQk8QVRUUklCVVRFIE5BTUU9ImZpbGUiIFJFUVVJUkVEPSJubzsgZGVmYXVsdHMgdG8gJnF1b3Q7YnVpbGQubnVtYmVyJnF1b3Q7Ij4KKwkJCTxERVNDUklQVElPTj5UaGUgZmlsZSB0byByZWFkIGFuZCB3cml0ZSB0aGUgYnVpbGQgbnVtYmVyIGZyb20vdG88L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKwk8L1RBU0s+CisJPFRBU0sgTkFNRT0iY2hhbmdlbG9nIj4KKwkJPERFU0NSSVBUSU9OPiZsdDtwJmd0O0dlbmVyYXRlcyBhbiBYTUwtZm9ybWF0dGVkIHJlcG9ydCBmaWxlIG9mIHRoZSBjaGFuZ2UgbG9ncyByZWNvcmRlZCBpbiBhCismbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuY3ZzaG9tZS5vcmcvJnF1b3Q7IHRhcmdldD0mcXVvdDtfdG9wJnF1b3Q7Jmd0O0NWUyZsdDsvYSZndDsgcmVwb3NpdG9yeS4gJmx0Oy9wJmd0OworPC9ERVNDUklQVElPTj4KKwkJPEFUVFJJQlVURSBOQU1FPSJkaXIiIFJFUVVJUkVEPSJubzsgZGVmYXVsdHMgdG8gJHtiYXNlZGlyfS4iPgorCQkJPERFU0NSSVBUSU9OPlRoZSBkaXJlY3RvcnkgZnJvbSB3aGljaCB0byBydW4gdGhlIENWUyBsb2djb21tYW5kPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJkZXN0ZmlsZSIgUkVRVUlSRUQ9InllcyI+CisJCQk8REVTQ1JJUFRJT04+VGhlIGZpbGUgaW4gd2hpY2ggdG8gd3JpdGUgdGhlIGNoYW5nZSBsb2cgcmVwb3J0PC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJ1c2Vyc2ZpbGUiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+UHJvcGVydHkgZmlsZSB0aGF0IGNvbnRhaW5zIG5hbWUtdmFsdWUgcGFpcnMgbWFwcGluZ3VzZXIgSURzIGFuZCBuYW1lcyB0aGF0IHNob3VsZCBiZSB1c2VkIGluIHRoZSByZXBvcnQgaW4gcGxhY2Ugb2Z0aGUgdXNlciBJRDwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZGF5c2lucGFzdCIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5TZXRzIHRoZSBudW1iZXIgb2YgZGF5cyBpbnRvIHRoZSBwYXN0IGZvciB3aGljaCB0aGVjaGFuZ2UgbG9nIGluZm9ybWF0aW9uIHNob3VsZCBiZSByZXRyaWV2ZWQ8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9InN0YXJ0IiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPlRoZSBlYXJsaWVzdCBkYXRlIGZyb20gd2hpY2ggY2hhbmdlIGxvZ3MgYXJlIHRvIGJlaW5jbHVkZWQgaW4gdGhlIHJlcG9ydDwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZW5kIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPlRoZSBsYXRlc3QgZGF0ZSB0byB3aGljaCBjaGFuZ2UgbG9ncyBhcmUgdG8gYmVpbmNsdWRlZCBpbiB0aGUgcmVwb3J0PC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisJPC9UQVNLPgorCTxUQVNLIE5BTUU9ImNoZWNrc3VtIj4KKwkJPERFU0NSSVBUSU9OPiZsdDtwJmd0OworR2VuZXJhdGVzIGNoZWNrc3VtIGZvciBmaWxlcy4gIFRoaXMgdGFzayBjYW4gYWxzbyBiZSB1c2VkIHRvCitwZXJmb3JtIGNoZWNrc3VtIHZlcmlmaWNhdGlvbnMuCismbHQ7L3AmZ3Q7Cis8L0RFU0NSSVBUSU9OPgorCQk8QVRUUklCVVRFIE5BTUU9ImZpbGUiIFJFUVVJUkVEPSJvbmUgb2YgZWl0aGVyIGZpbGUgb3IKKyAgICAgYXQgbGVhc3Qgb25lIG5lc3RlZCBmaWxlc2V0IGVsZW1lbnQuIj4KKwkJCTxERVNDUklQVElPTj5UaGUgZmlsZSB0byBnZW5lcmF0ZSBjaGVja3N1bSBmb3I8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImFsZ29yaXRobSIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5TcGVjaWZpZXMgdGhlIGFsZ29yaXRobSB0byBiZSB1c2VkIHRvY29tcHV0ZSB0aGUgY2hlY2tzdW0uIERlZmF1bHRzIHRvICZxdW90O01ENSZxdW90Oy5PdGhlciBwb3B1bGFyIGFsZ29yaXRobXMgbGlrZSAmcXVvdDtTSEEmcXVvdDsgbWF5IGJlIHVzZWRhcyB3ZWxsLjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0icHJvdmlkZXIiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+U3BlY2lmaWVzIHRoZSBwcm92aWRlciBvZiB0aGUgYWxnb3JpdGhtPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJmaWxlZXh0IiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPlRoZSBnZW5lcmF0ZWQgY2hlY2tzdW0gZmlsZSdzIG5hbWUgd2lsbCBiZSB0aGVvcmlnaW5hbCBmaWxlbmFtZSB3aXRoICZxdW90Oy4mcXVvdDsgYW5kIGZpbGVleHQgYWRkZWQgdG8gaXQuRGVmYXVsdHMgdG8gdGhlIGFsZ29yaXRobSBuYW1lIGJlaW5nIHVzZWQuPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJwcm9wZXJ0eSIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5TcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGJlIHNldHdpdGggdGhlIGdlbmVyYXRlZCBjaGVja3N1bSB2YWx1ZS4gIFRoaXMgY2Fubm90IGJlIHNwZWNpZmllZHdoZW4gZmlsZWV4dCBpcyBiZWluZyB1c2VkIG9yIHdoZW4gdGhlIG51bWJlciBvZiBmaWxlc2ZvciB3aGljaCBjaGVja3N1bXMgaXMgdG8gYmUgZ2VuZXJhdGVkIGlzIGdyZWF0ZXIgdGhhbiAxLjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZm9yY2VvdmVyd3JpdGUiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+T3ZlcndyaXRlIGV4aXN0aW5nIGZpbGVzIGV2ZW4gaWYgdGhlIGRlc3RpbmF0aW9uZmlsZXMgYXJlIG5ld2VyLiBEZWZhdWx0cyB0byAmcXVvdDtubyZxdW90OzwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0idmVyaWZ5cHJvcGVydHkiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+U3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBiZSBzZXR3aXRoICZxdW90O3RydWUmcXVvdDsgb3IgJnF1b3Q7ZmFsc2UmcXVvdDsgZGVwZW5kaW5nIHVwb24gd2hldGhlcnRoZSBnZW5lcmF0ZWQgY2hlY2tzdW0gbWF0Y2hlcyB0aGUgZXhpc3RpbmcgY2hlY2tzdW0uICBXaGVudGhpcyBpcyBzZXQsIHRoZSBnZW5lcmF0ZWQgY2hlY2tzdW0gaXMgbm90IHdyaXR0ZW4gdG8gYSBmaWxlIG9ycHJvcGVydHksIGJ1dCByYXRoZXIsIHRoZSBjb250ZW50IG9mIHRoZSBmaWxlIG9yIHByb3BlcnR5IGlzIHVzZWQgdG9jaGVjayBhZ2FpbnN0IHRoZSBnZW5lcmF0ZWQgY2hlY2tzdW0uPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJyZWFkYnVmZmVyc2l6ZSIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5UaGUgc2l6ZSBvZiB0aGUgYnVmZmVyIClpbiBieXRlcykgdG8gdXNlIHdoZW5yZWFkaW5nIGEgZmlsZS4gRGVmYXVsdHMgdG8gJnF1b3Q7ODE5MiZxdW90OyAtIHlvdSBtYXkgZ2V0IGFiZXR0ZXIgcGVyZm9ybWFuY2Ugb24gYmlnIGZpbGVzIGlmIHlvdSBpbmNyZWFzZSB0aGlzIHZhbHVlPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisJPC9UQVNLPgorCTxUQVNLIE5BTUU9ImNobW9kIj4KKwkJPERFU0NSSVBUSU9OPiZsdDtwJmd0O0NoYW5nZXMgdGhlIHBlcm1pc3Npb25zIG9mIGEgZmlsZSBvciBhbGwgZmlsZXMgaW5zaWRlIHNwZWNpZmllZCBkaXJlY3Rvcmllcy4gUmlnaHQgbm93IGl0IGhhcyBlZmZlY3Qgb25seSB1bmRlciBVbml4LgorVGhlIHBlcm1pc3Npb25zIGFyZSBhbHNvIFVOSVggc3R5bGUsIGxpa2UgdGhlIGFyZ3VtZW50IGZvciB0aGUgY2htb2QgY29tbWFuZC4mbHQ7L3AmZ3Q7CismbHQ7cCZndDtTZWUgdGhlIHNlY3Rpb24gb24gJmx0O2EgaHJlZj0mcXVvdDsuLi9kaXJ0YXNrcy5odG1sI2RpcmVjdG9yeWJhc2VkdGFza3MmcXVvdDsmZ3Q7ZGlyZWN0b3J5IGJhc2VkCit0YXNrcyZsdDsvYSZndDssIG9uIGhvdyB0aGUgaW5jbHVzaW9uL2V4Y2x1c2lvbiBvZiBmaWxlcyB3b3JrcywgYW5kIGhvdyB0bword3JpdGUgcGF0dGVybnMuJmx0Oy9wJmd0OworJmx0O3AmZ3Q7VGhpcyB0YXNrIGhvbGRzIGFuIGltcGxpY2l0ICZsdDthIGhyZWY9JnF1b3Q7Li4vQ29yZVR5cGVzL2ZpbGVzZXQuaHRtbCZxdW90OyZndDtGaWxlU2V0Jmx0Oy9hJmd0OyBhbmQKK3N1cHBvcnRzIGFsbCBvZiBGaWxlU2V0J3MgYXR0cmlidXRlcyBhbmQgbmVzdGVkIGVsZW1lbnRzCitkaXJlY3RseS4gTW9yZSBGaWxlU2V0cyBjYW4gYmUgc3BlY2lmaWVkIHVzaW5nIG5lc3RlZAorJmx0O2NvZGUmZ3Q7JmFtcDtsdDtmaWxlc2V0JmFtcDtndDsmbHQ7L2NvZGUmZ3Q7IGVsZW1lbnRzLiZsdDsvcCZndDsKKzwvREVTQ1JJUFRJT04+CisJCTxBVFRSSUJVVEUgTkFNRT0iZmlsZSIgUkVRVUlSRUQ9ImV4YWN0bHkgb25lIG9mIHRoZSB0d28gb3IgbmVzdGVkICZsdDtmaWxlc2V0Jmd0OyBlbGVtZW50cy4iPgorCQkJPERFU0NSSVBUSU9OPnRoZSBmaWxlIG9yIHNpbmdsZSBkaXJlY3Rvcnkgb2Ygd2hpY2ggdGhlIHBlcm1pc3Npb25zIG11c3QgYmUgY2hhbmdlZDwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZGlyIiBSRVFVSVJFRD0iIj4KKwkJCTxERVNDUklQVElPTj50aGUgZGlyZWN0b3J5IHdoaWNoIGhvbGRzIHRoZSBmaWxlcyB3aG9zZSBwZXJtaXNzaW9ucyBtdXN0IGJlIGNoYW5nZWQ8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9InBlcm0iIFJFUVVJUkVEPSJ5ZXMiPgorCQkJPERFU0NSSVBUSU9OPnRoZSBuZXcgcGVybWlzc2lvbnM8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImluY2x1ZGVzIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPmNvbW1hLSBvciBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucyBvZiBmaWxlcyB0aGF0IG11c3QgYmVpbmNsdWRlZDwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZXhjbHVkZXMiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+Y29tbWEtIG9yIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zIG9mIGZpbGVzIHRoYXQgbXVzdCBiZWV4Y2x1ZGVkLiBObyBmaWxlcyAoZXhjZXB0IGRlZmF1bHQgZXhjbHVkZXMpIGFyZSBleGNsdWRlZCB3aGVuIG9taXR0ZWQ8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImRlZmF1bHRleGNsdWRlcyIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5pbmRpY2F0ZXMgd2hldGhlciBkZWZhdWx0IGV4Y2x1ZGVzIHNob3VsZCBiZSB1c2VkIG9yIG5vdCgmcXVvdDt5ZXMmcXVvdDsvJnF1b3Q7bm8mcXVvdDspLiBEZWZhdWx0IGV4Y2x1ZGVzIGFyZSB1c2VkIHdoZW4gb21pdHRlZDwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0icGFyYWxsZWwiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+cHJvY2VzcyBhbGwgc3BlY2lmaWVkIGZpbGVzIHVzaW5nIGEgc2luZ2xlY2htb2QgY29tbWFuZC4gRGVmYXVsdHMgdG8gdHJ1ZTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0idHlwZSIgUkVRVUlSRUQ9Im5vLCBkZWZhdWx0IGlzIGZpbGUiPgorCQkJPERFU0NSSVBUSU9OPk9uZSBvZiBmaWxlLCBkaXIgb3Jib3RoLiBJZiBzZXQgdG8gZmlsZSwgb25seSB0aGUgcGVybWlzc2lvbnMgb2ZwbGFpbiBmaWxlcyBhcmUgZ29pbmcgdG8gYmUgY2hhbmdlZC4gSWYgc2V0IHRvIGRpciwgb25seXRoZSBkaXJlY3RvcmllcyBhcmUgY29uc2lkZXJlZDwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCTwvVEFTSz4KKwk8VEFTSyBOQU1FPSJjb25jYXQiPgorCQk8REVTQ1JJUFRJT04+Jmx0O3AmZ3Q7CitDb25jYXRlbmF0ZXMgYSBmaWxlLCBvciBhIHNlcmllcyBvZiBmaWxlcywgdG8gYSBzaW5nbGUgZmlsZSBvcgordGhlIGNvbnNvbGUuIFRoZSBkZXN0aW5hdGlvbiBmaWxlIHdpbGwgYmUgY3JlYXRlZCBpZiBpdCBkb2VzCitub3QgZXhpc3QsIHRob3VnaCB0aGUgdGhlICZsdDt2YXImZ3Q7YXBwZW5kJmx0Oy92YXImZ3Q7IGF0dHJpYnV0ZSBtYXkgYmUKK3VzZWQgdG8gYWx0ZXIgdGhpcyBiZWhhdmlvci4KKyZsdDsvcCZndDsKKyZsdDtwJmd0OworJmx0O2EgaHJlZj0mcXVvdDsuLi9Db3JlVHlwZXMvZmlsZXNldC5odG1sJnF1b3Q7Jmd0O0ZpbGVTZXQmbHQ7L2EmZ3Q7cyBhbmQvb3IgJmx0O2EKK2hyZWY9JnF1b3Q7Li4vQ29yZVR5cGVzL2ZpbGVsaXN0Lmh0bWwmcXVvdDsmZ3Q7RmlsZUxpc3QmbHQ7L2EmZ3Q7cyBhcmUgdXNlZCB0bworc2VsZWN0IHdoaWNoIGZpbGVzIGFyZSB0byBiZSBjb25jYXRlbmF0ZWQuIFRoZXJlIGlzIG5vCitzaW5ndWxhciAnZmlsZScgYXR0cmlidXRlIHRvIHNwZWNpZnkgYSBzaW5nbGUgZmlsZSB0byBjYXQgLS0gYQorZmlsZXNldCBvciBmaWxlbGlzdCBtdXN0IGFsc28gYmUgdXNlZCBpbiB0aGVzZSBjYXNlcy4KKyZsdDsvcCZndDsKKzwvREVTQ1JJUFRJT04+CisJCTxBVFRSSUJVVEUgTkFNRT0iZGVzdGZpbGUiIFJFUVVJUkVEPSJubworIAkgICI+CisJCQk8REVTQ1JJUFRJT04+VGhlIGRlc3RpbmF0aW9uIGZpbGUgZm9yIHRoZSBjb25jYXRlbmF0ZWQgc3RyZWFtLklmIG5vdCBzcGVjaWZpZWQgdGhlIGNvbnNvbGUgd2lsbCBiZSB1c2VkIGluc3RlYWQuPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJhcHBlbmQiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+U3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRoZSBmaWxlIHNwZWNpZmllZCBieSAnZGVzdGZpbGUnc2hvdWxkIGJlIG92ZXJ3cml0dGVuLiBEZWZhdWx0cyB0byAmcXVvdDtubyZxdW90Oy48L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImVuY29kaW5nIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPlNwZWNpZmllcyB0aGUgZW5jb2RpbmcgZm9yIHRoZSBpbnB1dCBmaWxlcy4gUGxlYXNlIHNlZSBodHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL2pkay8xLjIvZG9jcy9ndWlkZS9pbnRlcm5hdC9lbmNvZGluZy5kb2MuaHRtbGZvciBhIGxpc3Qgb2YgcG9zc2libGUgdmFsdWVzLiBEZWZhdWx0cyB0byB0aGUgcGxhdGZvcm0nc2RlZmF1bHQgY2hhcmFjdGVyIGVuY29kaW5nLjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCTwvVEFTSz4KKwk8VEFTSyBOQU1FPSJjb25kaXRpb24iPgorCQk8REVTQ1JJUFRJT04+Jmx0O3AmZ3Q7U2V0cyBhIHByb3BlcnR5IGlmIGEgY2VydGFpbiBjb25kaXRpb24gaG9sZHMgdHJ1ZSAtIHRoaXMgaXMgYQorZ2VuZXJhbGl6YXRpb24gb2YgJmx0O2EgaHJlZj0mcXVvdDthdmFpbGFibGUuaHRtbCZxdW90OyZndDtBdmFpbGFibGUmbHQ7L2EmZ3Q7IGFuZCAmbHQ7YQoraHJlZj0mcXVvdDt1cHRvZGF0ZS5odG1sJnF1b3Q7Jmd0O1VwdG9kYXRlJmx0Oy9hJmd0Oy4mbHQ7L3AmZ3Q7CismbHQ7cCZndDtJZiB0aGUgY29uZGl0aW9uIGhvbGRzIHRydWUsIHRoZSBwcm9wZXJ0eSB2YWx1ZSBpcyBzZXQgdG8gdHJ1ZSBieQorZGVmYXVsdDsgb3RoZXJ3aXNlLCB0aGUgcHJvcGVydHkgaXMgbm90IHNldC4gWW91IGNhbiBzZXQgdGhlIHZhbHVlIHRvCitzb21ldGhpbmcgb3RoZXIgdGhhbiB0aGUgZGVmYXVsdCBieSBzcGVjaWZ5aW5nIHRoZSAmbHQ7Y29kZSZndDt2YWx1ZSZsdDsvY29kZSZndDsKK2F0dHJpYnV0ZS4mbHQ7L3AmZ3Q7CismbHQ7cCZndDtDb25kaXRpb25zIGFyZSBzcGVjaWZpZWQgYXMgJmx0O2EgaHJlZj0mcXVvdDsjbmVzdGVkJnF1b3Q7Jmd0O25lc3RlZCBlbGVtZW50cyZsdDsvYSZndDssCit5b3UgbXVzdCBzcGVjaWZ5IGV4YWN0bHkgb25lIGNvbmRpdGlvbi4mbHQ7L3AmZ3Q7Cis8L0RFU0NSSVBUSU9OPgorCQk8QVRUUklCVVRFIE5BTUU9InByb3BlcnR5IiBSRVFVSVJFRD0ieWVzIj4KKwkJCTxERVNDUklQVElPTj5UaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gc2V0PC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJ2YWx1ZSIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5UaGUgdmFsdWUgdG8gc2V0IHRoZSBwcm9wZXJ0eSB0by4gRGVmYXVsdHMgdG8mcXVvdDt0cnVlJnF1b3Q7PC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisJPC9UQVNLPgorCTxUQVNLIE5BTUU9ImNvbmRpdGlvbnMiPgorCQk8REVTQ1JJUFRJT04+PC9ERVNDUklQVElPTj4JPC9UQVNLPgorCTxUQVNLIE5BTUU9ImNvcHkiPgorCQk8REVTQ1JJUFRJT04+Jmx0O3AmZ3Q7Q29waWVzIGEgZmlsZSBvciBGaWxlU2V0IHRvIGEgbmV3IGZpbGUgb3IgZGlyZWN0b3J5LiAgQnkgZGVmYXVsdCwgZmlsZXMgYXJlCitvbmx5IGNvcGllZCBpZiB0aGUgc291cmNlIGZpbGUgaXMgbmV3ZXIgdGhhbiB0aGUgZGVzdGluYXRpb24gZmlsZSwKK29yIHdoZW4gdGhlIGRlc3RpbmF0aW9uIGZpbGUgZG9lcyBub3QgZXhpc3QuICBIb3dldmVyLCB5b3UgY2FuIGV4cGxpY2l0bHkKK292ZXJ3cml0ZSBmaWxlcyB3aXRoIHRoZSAmbHQ7Y29kZSZndDtvdmVyd3JpdGUmbHQ7L2NvZGUmZ3Q7IGF0dHJpYnV0ZS4mbHQ7L3AmZ3Q7CismbHQ7cCZndDsmbHQ7YSBocmVmPSZxdW90Oy4uL0NvcmVUeXBlcy9maWxlc2V0Lmh0bWwmcXVvdDsmZ3Q7RmlsZVNldCZsdDsvYSZndDtzIGFyZSB1c2VkIHRvIHNlbGVjdCBhCitzZXQgb2YgZmlsZXMgdG8gY29weS4KK1RvIHVzZSBhICZsdDtjb2RlJmd0OyZhbXA7bHQ7ZmlsZXNldCZhbXA7Z3Q7Jmx0Oy9jb2RlJmd0OywgdGhlICZsdDtjb2RlJmd0O3RvZGlyJmx0Oy9jb2RlJmd0OyBhdHRyaWJ1dGUKK211c3QgYmUgc2V0LiZsdDsvcCZndDsKKzwvREVTQ1JJUFRJT04+CisJCTxBVFRSSUJVVEUgTkFNRT0iZmlsZSIgUkVRVUlSRUQ9InllcywgdW5sZXNzIGEgbmVzdGVkCisgICAgICZsdDtmaWxlc2V0Jmd0OyBlbGVtZW50IGlzIHVzZWQuIj4KKwkJCTxERVNDUklQVElPTj5UaGUgZmlsZSB0byBjb3B5PC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJwcmVzZXJ2ZWxhc3Rtb2RpZmllZCIgUkVRVUlSRUQ9Im5vOyBkZWZhdWx0cyB0byBmYWxzZS4iPgorCQkJPERFU0NSSVBUSU9OPkdpdmUgdGhlIGNvcGllZCBmaWxlcyB0aGUgc2FtZSBsYXN0IG1vZGlmaWVkdGltZSBhcyB0aGUgb3JpZ2luYWwgc291cmNlIGZpbGVzLihOb3RlOiBJZ25vcmVkIG9uIEphdmEgMS4xPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJ0b2ZpbGUiIFJFUVVJUkVEPSJ3aXRoIHRoZSBmaWxlCisgICAgICAgYXR0cmlidXRlLCBlaXRoZXIgdG9maWxlIG9yIHRvZGlyIGNhbiBiZSB1c2VkLgorICAgICAgIHdpdGggbmVzdGVkICZsdDtmaWxlc2V0Jmd0OyBlbGVtZW50cywgaWYgdGhlIHNldCBvZiBmaWxlcworICAgICAgIGlzIGdyZWF0ZXIgdGhhbiAxLCBvciBpZiBvbmx5IHRoZSBkaXIgYXR0cmlidXRlIGlzCisgICAgICAgc3BlY2lmaWVkIGluIHRoZSAmbHQ7ZmlsZXNldCZndDssIG9yIGlmIHRoZQorICAgICAgIGZpbGUgYXR0cmlidXRlIGlzIGFsc28gc3BlY2lmaWVkLCB0aGVuIG9ubHkKKyAgICAgICB0b2RpciBpcyBhbGxvd2VkLiI+CisJCQk8REVTQ1JJUFRJT04+VGhlIGZpbGUgdG8gY29weSB0bzwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0idG9kaXIiIFJFUVVJUkVEPSIiPgorCQkJPERFU0NSSVBUSU9OPlRoZSBkaXJlY3RvcnkgdG8gY29weSB0bzwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0ib3ZlcndyaXRlIiBSRVFVSVJFRD0ibm87IGRlZmF1bHRzIHRvIGZhbHNlLiI+CisJCQk8REVTQ1JJUFRJT04+T3ZlcndyaXRlIGV4aXN0aW5nIGZpbGVzIGV2ZW4gaWYgdGhlIGRlc3RpbmF0aW9uZmlsZXMgYXJlIG5ld2VyPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJmaWx0ZXJpbmciIFJFUVVJUkVEPSJubzsgZGVmYXVsdHMgdG8gZmFsc2UuIj4KKwkJCTxERVNDUklQVElPTj5JbmRpY2F0ZXMgd2hldGhlciB0b2tlbiBmaWx0ZXJpbmcgdXNpbmcgdGhlIGdsb2JhbGJ1aWxkLWZpbGUgZmlsdGVycyBzaG91bGQgdGFrZSBwbGFjZSBkdXJpbmcgdGhlIGNvcHkuTm90ZTogTmVzdGVkICZsdDtmaWx0ZXJzZXQmZ3Q7IGVsZW1lbnRzIHdpbGxhbHdheXMgYmUgdXNlZCwgZXZlbiBpZiB0aGlzIGF0dHJpYnV0ZSBpcyBub3Qgc3BlY2lmaWVkLCBvciBpdHMgdmFsdWUgaXNmYWxzZSAobm8sIG9yIG9mZik8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImZsYXR0ZW4iIFJFUVVJUkVEPSJubzsgZGVmYXVsdHMgdG8gZmFsc2UuIj4KKwkJCTxERVNDUklQVElPTj5JZ25vcmUgdGhlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgb2YgdGhlIHNvdXJjZSBmaWxlcyxhbmQgY29weSBhbGwgZmlsZXMgaW50byB0aGUgZGlyZWN0b3J5IHNwZWNpZmllZCBieSB0aGUgdG9kaXJhdHRyaWJ1dGUuICBOb3RlIHRoYXQgeW91IGNhbiBhY2hpZXZlIHRoZSBzYW1lIGVmZmVjdCBieSB1c2luZyBhZmxhdHRlbiBtYXBwZXI8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImluY2x1ZGVlbXB0eWRpcnMiIFJFUVVJUkVEPSJubzsgZGVmYXVsdHMgdG8gdHJ1ZS4iPgorCQkJPERFU0NSSVBUSU9OPkNvcHkgYW55IGVtcHR5IGRpcmVjdG9yaWVzIGluY2x1ZGVkIGluIHRoZSBGaWxlU2V0KHMpLjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZmFpbG9uZXJyb3IiIFJFUVVJUkVEPSJubzsgZGVmYXVsdHMgdG8gdHJ1ZS4iPgorCQkJPERFU0NSSVBUSU9OPkxvZyBhIHdhcm5pbmcgbWVzc2FnZSwgYnV0IGRvIG5vdCBzdG9wIHRoZSBidWlsZCx3aGVuIHRoZSBmaWxlIHRvIGNvcHkgZG9lcyBub3QgZXhpc3QuT25seSBtZWFuaW5nZnVsIHdoZW4gY29weWluZyBhIHNpbmdsZSBmaWxlLjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0idmVyYm9zZSIgUkVRVUlSRUQ9Im5vOyBkZWZhdWx0cyB0byBmYWxzZS4iPgorCQkJPERFU0NSSVBUSU9OPkxvZyB0aGUgZmlsZXMgdGhhdCBhcmUgYmVpbmcgY29waWVkPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisJPC9UQVNLPgorCTxUQVNLIE5BTUU9ImNvcHlkaXIiPgorCQk8REVTQ1JJUFRJT04+Jmx0O3AmZ3Q7Q29waWVzIGEgZGlyZWN0b3J5IHRyZWUgZnJvbSB0aGUgc291cmNlIHRvIHRoZSBkZXN0aW5hdGlvbi4mbHQ7L3AmZ3Q7CismbHQ7cCZndDtJdCBpcyBwb3NzaWJsZSB0byByZWZpbmUgdGhlIHNldCBvZiBmaWxlcyB0aGF0IGFyZSBiZWluZyBjb3BpZWQuIFRoaXMgY2FuIGJlCitkb25lIHdpdGggdGhlICZsdDtpJmd0O2luY2x1ZGVzJmx0Oy9pJmd0OywgJmx0O2kmZ3Q7aW5jbHVkZXNmaWxlJmx0Oy9pJmd0OywgJmx0O2kmZ3Q7ZXhjbHVkZXMmbHQ7L2kmZ3Q7LCAmbHQ7aSZndDtleGNsdWRlc2ZpbGUmbHQ7L2kmZ3Q7IGFuZCAmbHQ7aSZndDtkZWZhdWx0ZXhjbHVkZXMmbHQ7L2kmZ3Q7CithdHRyaWJ1dGVzLiBXaXRoIHRoZSAmbHQ7aSZndDtpbmNsdWRlcyZsdDsvaSZndDsgb3IgJmx0O2kmZ3Q7aW5jbHVkZXNmaWxlJmx0Oy9pJmd0OyBhdHRyaWJ1dGUgeW91IHNwZWNpZnkgdGhlIGZpbGVzIHlvdSB3YW50IHRvCitoYXZlIGluY2x1ZGVkIGJ5IHVzaW5nIHBhdHRlcm5zLiBUaGUgJmx0O2kmZ3Q7ZXhjbHVkZSZsdDsvaSZndDsgb3IgJmx0O2kmZ3Q7ZXhjbHVkZXNmaWxlJmx0Oy9pJmd0OyBhdHRyaWJ1dGUgaXMgdXNlZCB0byBzcGVjaWZ5Cit0aGUgZmlsZXMgeW91IHdhbnQgdG8gaGF2ZSBleGNsdWRlZC4gVGhpcyBpcyBhbHNvIGRvbmUgd2l0aCBwYXR0ZXJucy4gQW5kCitmaW5hbGx5IHdpdGggdGhlICZsdDtpJmd0O2RlZmF1bHRleGNsdWRlcyZsdDsvaSZndDsgYXR0cmlidXRlLCB5b3UgY2FuIHNwZWNpZnkgd2hldGhlciB5b3UKK3dhbnQgdG8gdXNlIGRlZmF1bHQgZXhjbHVzaW9ucyBvciBub3QuIFNlZSB0aGUgc2VjdGlvbiBvbiAmbHQ7YQoraHJlZj0mcXVvdDsuLi9kaXJ0YXNrcy5odG1sI2RpcmVjdG9yeWJhc2VkdGFza3MmcXVvdDsmZ3Q7ZGlyZWN0b3J5IGJhc2VkIHRhc2tzJmx0Oy9hJmd0Oywgb24gaG93IHRoZQoraW5jbHVzaW9uL2V4Y2x1c2lvbiBvZiBmaWxlcyB3b3JrcywgYW5kIGhvdyB0byB3cml0ZSBwYXR0ZXJucy4mbHQ7L3AmZ3Q7CismbHQ7cCZndDtUaGlzIHRhc2sgZm9ybXMgYW4gaW1wbGljaXQgJmx0O2EgaHJlZj0mcXVvdDsuLi9Db3JlVHlwZXMvZmlsZXNldC5odG1sJnF1b3Q7Jmd0O0ZpbGVTZXQmbHQ7L2EmZ3Q7IGFuZAorc3VwcG9ydHMgYWxsIGF0dHJpYnV0ZXMgb2YgJmx0O2NvZGUmZ3Q7JmFtcDtsdDtmaWxlc2V0JmFtcDtndDsmbHQ7L2NvZGUmZ3Q7CisoJmx0O2NvZGUmZ3Q7ZGlyJmx0Oy9jb2RlJmd0OyBiZWNvbWVzICZsdDtjb2RlJmd0O3NyYyZsdDsvY29kZSZndDspIGFzIHdlbGwgYXMgdGhlIG5lc3RlZAorJmx0O2NvZGUmZ3Q7JmFtcDtsdDtpbmNsdWRlJmFtcDtndDsmbHQ7L2NvZGUmZ3Q7LCAmbHQ7Y29kZSZndDsmYW1wO2x0O2V4Y2x1ZGUmYW1wO2d0OyZsdDsvY29kZSZndDsgYW5kCismbHQ7Y29kZSZndDsmYW1wO2x0O3BhdHRlcm5zZXQmYW1wO2d0OyZsdDsvY29kZSZndDsgZWxlbWVudHMuJmx0Oy9wJmd0OworPC9ERVNDUklQVElPTj4KKwkJPEFUVFJJQlVURSBOQU1FPSJzcmMiIFJFUVVJUkVEPSJ5ZXMiPgorCQkJPERFU0NSSVBUSU9OPnRoZSBkaXJlY3RvcnkgdG8gY29weTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZGVzdCIgUkVRVUlSRUQ9InllcyI+CisJCQk8REVTQ1JJUFRJT04+dGhlIGRpcmVjdG9yeSB0byBjb3B5IHRvPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJpbmNsdWRlcyIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5jb21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgb2YgZmlsZXMgdGhhdCBtdXN0IGJlaW5jbHVkZWQuIEFsbCBmaWxlcyBhcmUgaW5jbHVkZWQgd2hlbiBvbWl0dGVkPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJpbmNsdWRlc2ZpbGUiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+dGhlIG5hbWUgb2YgYSBmaWxlLiBFYWNoIGxpbmUgb2YgdGhpcyBmaWxlIGlzdGFrZW4gdG8gYmUgYW4gaW5jbHVkZSBwYXR0ZXI8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImV4Y2x1ZGVzIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPmNvbW1hLSBvciBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucyBvZiBmaWxlcyB0aGF0IG11c3QgYmVleGNsdWRlZC4gTm8gZmlsZXMgKGV4Y2VwdCBkZWZhdWx0IGV4Y2x1ZGVzKSBhcmUgZXhjbHVkZWQgd2hlbiBvbWl0dGVkPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJleGNsdWRlc2ZpbGUiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+dGhlIG5hbWUgb2YgYSBmaWxlLiBFYWNoIGxpbmUgb2YgdGhpcyBmaWxlIGlzdGFrZW4gdG8gYmUgYW4gZXhjbHVkZSBwYXR0ZXI8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImRlZmF1bHRleGNsdWRlcyIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5pbmRpY2F0ZXMgd2hldGhlciBkZWZhdWx0IGV4Y2x1ZGVzIHNob3VsZCBiZSB1c2VkIG9yIG5vdCgmcXVvdDt5ZXMmcXVvdDsvJnF1b3Q7bm8mcXVvdDspLiBEZWZhdWx0IGV4Y2x1ZGVzIGFyZSB1c2VkIHdoZW4gb21pdHRlZDwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZmlsdGVyaW5nIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPmluZGljYXRlcyB3aGV0aGVyIHRva2VuIGZpbHRlcmluZyBzaG91bGQgdGFrZSBwbGFjZSBkdXJpbmd0aGUgY29wPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJmbGF0dGVuIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPmlnbm9yZSBkaXJlY3Rvcnkgc3RydWN0dXJlIG9mIHNvdXJjZSBkaXJlY3RvcnksY29weSBhbGwgZmlsZXMgaW50byBhIHNpbmdsZSBkaXJlY3RvcnksIHNwZWNpZmllZCBieSB0aGUgZGVzdGF0dHJpYnV0ZSAoZGVmYXVsdCBpcyBmYWxzZSk8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImZvcmNlb3ZlcndyaXRlIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPm92ZXJ3cml0ZSBleGlzdGluZyBmaWxlcyBldmVuIGlmIHRoZSBkZXN0aW5hdGlvbmZpbGVzIGFyZSBuZXdlciAoZGVmYXVsdCBpcyBmYWxzZSk8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKwk8L1RBU0s+CisJPFRBU0sgTkFNRT0iY29weWZpbGUiPgorCQk8REVTQ1JJUFRJT04+Jmx0O3AmZ3Q7Q29waWVzIGEgZmlsZSBmcm9tIHRoZSBzb3VyY2UgdG8gdGhlIGRlc3RpbmF0aW9uLiBUaGUgZmlsZSBpcyBvbmx5IGNvcGllZCBpZgordGhlIHNvdXJjZSBmaWxlIGlzIG5ld2VyIHRoYW4gdGhlIGRlc3RpbmF0aW9uIGZpbGUsIG9yIHdoZW4gdGhlIGRlc3RpbmF0aW9uIGZpbGUKK2RvZXMgbm90IGV4aXN0LiZsdDsvcCZndDsKKzwvREVTQ1JJUFRJT04+CisJCTxBVFRSSUJVVEUgTkFNRT0ic3JjIiBSRVFVSVJFRD0ieWVzIj4KKwkJCTxERVNDUklQVElPTj50aGUgZmlsZW5hbWUgb2YgdGhlIGZpbGUgdG8gY29weTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZGVzdCIgUkVRVUlSRUQ9InllcyI+CisJCQk8REVTQ1JJUFRJT04+dGhlIGZpbGVuYW1lIG9mIHRoZSBmaWxlIHdoZXJlIHRvIGNvcHkgdG88L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImZpbHRlcmluZyIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5pbmRpY2F0ZXMgd2hldGhlciB0b2tlbiBmaWx0ZXJpbmcgc2hvdWxkIHRha2UgcGxhY2UgZHVyaW5ndGhlIGNvcDwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZm9yY2VvdmVyd3JpdGUiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+b3ZlcndyaXRlIGV4aXN0aW5nIGZpbGVzIGV2ZW4gaWYgdGhlIGRlc3RpbmF0aW9uZmlsZXMgYXJlIG5ld2VyIChkZWZhdWx0IGlzIGZhbHNlKTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCTwvVEFTSz4KKwk8VEFTSyBOQU1FPSJjdnMiPgorCQk8REVTQ1JJUFRJT04+Jmx0O3AmZ3Q7SGFuZGxlcyBwYWNrYWdlcy9tb2R1bGVzIHJldHJpZXZlZCBmcm9tIGEKKyZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5jdnNob21lLm9yZy8mcXVvdDsgdGFyZ2V0PSZxdW90O190b3AmcXVvdDsmZ3Q7Q1ZTJmx0Oy9hJmd0OyByZXBvc2l0b3J5LiZsdDsvcCZndDsKKyZsdDtwJmd0O1doZW4gZG9pbmcgYXV0b21hdGVkIGJ1aWxkcywgdGhlICZsdDthIGhyZWY9JnF1b3Q7Z2V0Lmh0bWwmcXVvdDsmZ3Q7Z2V0IHRhc2smbHQ7L2EmZ3Q7IHNob3VsZCBiZQorcHJlZmVycmVkIG92ZXIgdGhlICZsdDtpJmd0O2NoZWNrb3V0Jmx0Oy9pJmd0OyBjb21tYW5kLCBiZWNhdXNlIG9mIHNwZWVkLiZsdDsvcCZndDsKKzwvREVTQ1JJUFRJT04+CisJCTxBVFRSSUJVVEUgTkFNRT0iY29tbWFuZCIgUkVRVUlSRUQ9Im5vLCBkZWZhdWx0ICZxdW90O2NoZWNrb3V0JnF1b3Q7LiI+CisJCQk8REVTQ1JJUFRJT04+dGhlIENWUyBjb21tYW5kIHRvIGV4ZWN1dGU8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImNvbXByZXNzaW9uIiBSRVFVSVJFRD0ibm8uIGRlZmF1bHRzIHRvIGZhbHNlLiI+CisJCQk8REVTQ1JJUFRJT04+dHJ1ZSBvciBmYWxzZSAtIGlmIHNldHRvIHRydWUsIHRoaXMgaXMgdGhlIHNhbWUgYXMgY29tcHJlc3Npb25sZXZlbD0mcXVvdDszPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJjb21wcmVzc2lvbmxldmVsIiBSRVFVSVJFRD0ibm8uIGRlZmF1bHRzIHRvIG5vIGNvbXByZXNzaW9uLiI+CisJCQk8REVTQ1JJUFRJT04+QSBudW1iZXIgYmV0d2VlbiAxIGFuZCA5IChjb3JyZXNwb25kaW5nIHRvcG9zc2libGUgdmFsdWVzIGZvciBDVlMnIC16IyBhcmd1bWVudCkuIEFueW90aGVyIHZhbHVlIGlzIHRyZWF0ZWQgYXMgY29tcHJlc3Npb249JnF1b3Q7ZmFsc2U8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImN2c3Jvb3QiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+dGhlIENWU1JPT1QgdmFyaWFibGU8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImN2c3JzaCIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj50aGUgQ1ZTX1JTSCB2YXJpYWJsZTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZGVzdCIgUkVRVUlSRUQ9Im5vLCBkZWZhdWx0IGlzIHByb2plY3QncyBiYXNlZGlyLiI+CisJCQk8REVTQ1JJUFRJT04+dGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgY2hlY2tlZCBvdXQgZmlsZXMgc2hvdWxkIGJlIHBsYWNlZDwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0icGFja2FnZSIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj50aGUgcGFja2FnZS9tb2R1bGUgdG8gY2hlY2sgb3V0PC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJ0YWciIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+dGhlIHRhZyBvZiB0aGUgcGFja2FnZS9tb2R1bGUgdG8gY2hlY2sgb3V0PC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJkYXRlIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPlVzZSB0aGUgbW9zdCByZWNlbnQgcmV2aXNpb24gbm8gbGF0ZXIgdGhhbiB0aGUgZ2l2ZW4gZGF0PC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJxdWlldCIgUkVRVUlSRUQ9Im5vLCBkZWZhdWx0ICZxdW90O2ZhbHNlJnF1b3Q7Ij4KKwkJCTxERVNDUklQVElPTj5zdXBwcmVzcyBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJub2V4ZWMiIFJFUVVJUkVEPSJubywgZGVmYXVsdCB0byAmcXVvdDtmYWxzZSZxdW90OyI+CisJCQk8REVTQ1JJUFRJT04+cmVwb3J0IG9ubHksIGRvbid0IGNoYW5nZSBhbnkgZmlsZXM8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9Im91dHB1dCIgUkVRVUlSRUQ9Im5vLCBkZWZhdWx0IG91dHB1dCB0byBhbnQgbG9nIGFzIG1zZ19pbmZvLiI+CisJCQk8REVTQ1JJUFRJT04+dGhlIGZpbGUgdG8gZGlyZWN0IHN0YW5kYXJkIG91dHB1dCBmcm9tIHRoZSBjb21tYW5kPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJlcnJvciIgUkVRVUlSRUQ9Im5vLCBkZWZhdWx0IGVycm9yIHRvIGFudCBsb2cgYXMgbXNnX3dhcm4uIj4KKwkJCTxERVNDUklQVElPTj50aGUgZmlsZSB0byBkaXJlY3Qgc3RhbmRhcmQgZXJyb3IgZnJvbSB0aGUgY29tbWFuZDwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iYXBwZW5kIiBSRVFVSVJFRD0ibm8sIGRlZmF1bHQgdG8gJnF1b3Q7ZmFsc2UmcXVvdDsuIj4KKwkJCTxERVNDUklQVElPTj53aGV0aGVyIHRvIGFwcGVuZCBvdXRwdXQvZXJyb3Igd2hlbiByZWRpcmVjdGluZyB0byBhIGZpbGU8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9InBvcnQiIFJFUVVJUkVEPSJubywgZGVmYXVsdCBwb3J0IDI0MDEuIj4KKwkJCTxERVNDUklQVElPTj5Qb3J0IHVzZWQgYnkgQ1ZTIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIHNlcnZlcjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0icGFzc2ZpbGUiIFJFUVVJUkVEPSJubywgZGVmYXVsdCBmaWxlIH4vLmN2c3Bhc3MuIj4KKwkJCTxERVNDUklQVElPTj5QYXNzd29yZCBmaWxlIHRvIHJlYWQgcGFzc3dvcmRzIGZyb208L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImZhaWxvbmVycm9yIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPlN0b3AgdGhlIGJ1aWxkIHByb2Nlc3MgaWYgdGhlIGNvbW1hbmQgZXhpdHMgd2l0aCBhcmV0dXJuIGNvZGUgb3RoZXIgdGhhbiAwLiBEZWZhdWx0cyB0byBmYWxzPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisJPC9UQVNLPgorCTxUQVNLIE5BTUU9ImN2c3Bhc3MiPgorCQk8REVTQ1JJUFRJT04+Jmx0O3AmZ3Q7QWRkcyBlbnRyaWVzIHRvIGEgLmN2c3Bhc3MgZmlsZS4gQWRkaW5nIGVudHJpZXMgdG8gdGhpcyBmaWxlIGhhcyB0aGUgc2FtZSBhZmZlY3QgYXMgYSBjdnMgbG9naW4gY29tbWFuZC4mbHQ7L3AmZ3Q7Cis8L0RFU0NSSVBUSU9OPgorCQk8QVRUUklCVVRFIE5BTUU9ImN2c3Jvb3QiIFJFUVVJUkVEPSJ5ZXMiPgorCQkJPERFU0NSSVBUSU9OPnRoZSBDVlMgcmVwb3NpdG9yeSB0byBhZGQgYW4gZW50cnkgZm9yPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJwYXNzd29yZCIgUkVRVUlSRUQ9InllcyI+CisJCQk8REVTQ1JJUFRJT04+UGFzc3dvcmQgdG8gYmUgYWRkZWQgdG8gdGhlIHBhc3N3b3JkIGZpbGU8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9InBhc3NmaWxlIiBSRVFVSVJFRD0ibm8sIGRlZmF1bHQgaXMgfi8uY3ZzcGFzcy4iPgorCQkJPERFU0NSSVBUSU9OPlBhc3N3b3JkIGZpbGUgdG8gYWRkIHRoZSBlbnRyeSB0bzwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCTwvVEFTSz4KKwk8VEFTSyBOQU1FPSJjdnN0YWdkaWZmIj4KKwkJPERFU0NSSVBUSU9OPiZsdDtwJmd0O0dlbmVyYXRlcyBhbiBYTUwtZm9ybWF0dGVkIHJlcG9ydCBmaWxlIG9mIHRoZSBjaGFuZ2VzIGJldHdlZW4gdHdvIHRhZ3Mgb3IgZGF0ZXMgcmVjb3JkZWQgaW4gYQorJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LmN2c2hvbWUub3JnLyZxdW90OyB0YXJnZXQ9JnF1b3Q7X3RvcCZxdW90OyZndDtDVlMmbHQ7L2EmZ3Q7IHJlcG9zaXRvcnkuICZsdDsvcCZndDsKKzwvREVTQ1JJUFRJT04+CisJCTxBVFRSSUJVVEUgTkFNRT0ic3RhcnR0YWciIFJFUVVJUkVEPSJleGFjdGx5IG9uZSBvZiB0aGUgdHdvLiI+CisJCQk8REVTQ1JJUFRJT04+VGhlIGVhcmxpZXN0IHRhZyBmcm9tIHdoaWNoIGRpZmZzIGFyZSB0byBiZWluY2x1ZGVkIGluIHRoZSByZXBvcnQ8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9InN0YXJ0ZGF0ZSIgUkVRVUlSRUQ9IiI+CisJCQk8REVTQ1JJUFRJT04+VGhlIGVhcmxpZXN0IGRhdGUgZnJvbSB3aGljaCBkaWZmcyBhcmUgdG8gYmVpbmNsdWRlZCBpbiB0aGUgcmVwb3J0PC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJlbmR0YWciIFJFUVVJUkVEPSJleGFjdGx5IG9uZSBvZiB0aGUgdHdvLiI+CisJCQk8REVTQ1JJUFRJT04+VGhlIGxhdGVzdCB0YWcgZnJvbSB3aGljaCBkaWZmcyBhcmUgdG8gYmVpbmNsdWRlZCBpbiB0aGUgcmVwb3J0PC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJlbmRkYXRlIiBSRVFVSVJFRD0iIj4KKwkJCTxERVNDUklQVElPTj5UaGUgbGF0ZXN0IGRhdGUgZnJvbSB3aGljaCBkaWZmcyBhcmUgdG8gYmVpbmNsdWRlZCBpbiB0aGUgcmVwb3J0PC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJkZXN0ZmlsZSIgUkVRVUlSRUQ9InllcyI+CisJCQk8REVTQ1JJUFRJT04+VGhlIGZpbGUgaW4gd2hpY2ggdG8gd3JpdGUgdGhlIGRpZmYgcmVwb3J0PC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJyb290ZGlyIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPlJvb3QgZGlyZWN0b3J5IGZvciB0aGUgcGFja2FnZSwgaWYgZGlmZmVyZW50IGZyb20gdGhlIHBhY2thZ2UgbmFtZTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCTwvVEFTSz4KKwk8VEFTSyBOQU1FPSJkZWxldGUiPgorCQk8REVTQ1JJUFRJT04+Jmx0O3AmZ3Q7RGVsZXRlcyBhIHNpbmdsZSBmaWxlLCBhIHNwZWNpZmllZCBkaXJlY3RvcnkgYW5kIGFsbCBpdHMgZmlsZXMgYW5kCitzdWJkaXJlY3Rvcmllcywgb3IgYSBzZXQgb2YgZmlsZXMgc3BlY2lmaWVkIGJ5IG9uZSBvciBtb3JlCismbHQ7YSBocmVmPSZxdW90Oy4uL0NvcmVUeXBlcy9maWxlc2V0Lmh0bWwmcXVvdDsmZ3Q7RmlsZVNldCZsdDsvYSZndDtzLgorV2hlbiBzcGVjaWZ5aW5nIGEgc2V0IG9mIGZpbGVzLCBlbXB0eSBkaXJlY3RvcmllcyBhcmUgJmx0O2kmZ3Q7bm90Jmx0Oy9pJmd0OyByZW1vdmVkIGJ5CitkZWZhdWx0LgorVG8gcmVtb3ZlIGVtcHR5IGRpcmVjdG9yaWVzLCB1c2UgdGhlICZsdDtjb2RlJmd0O2luY2x1ZGVFbXB0eURpcnMmbHQ7L2NvZGUmZ3Q7IGF0dHJpYnV0ZS4KKyZsdDsvcCZndDsKKyZsdDtwJmd0OworSWYgeW91IHVzZSB0aGlzIHRhc2sgdG8gZGVsZXRlIHRlbXBvcmFyeSBmaWxlcyBjcmVhdGVkIGJ5IGVkaXRvcnMKK2FuZCBpdCBkb2Vzbid0IHNlZW0gdG8gd29yaywgcmVhZCB1cCBvbiB0aGUgCismbHQ7YSBocmVmPSZxdW90Oy4uL2RpcnRhc2tzLmh0bWwjZGVmYXVsdGV4Y2x1ZGVzJnF1b3Q7Jmd0O2RlZmF1bHQgZXhjbHVzaW9uIHNldCZsdDsvYSZndDsKK2luICZsdDtzdHJvbmcmZ3Q7RGlyZWN0b3J5LWJhc2VkIFRhc2tzJmx0Oy9zdHJvbmcmZ3Q7LCBhbmQgc2VlIHRoZQorJmx0O2NvZGUmZ3Q7ZGVmYXVsdGV4Y2x1ZGVzJmx0Oy9jb2RlJmd0OyBhdHRyaWJ1dGUgYmVsb3cuCis8L0RFU0NSSVBUSU9OPgorCQk8QVRUUklCVVRFIE5BTUU9ImZpbGUiIFJFUVVJUkVEPSJhdCBsZWFzdCBvbmUgb2YgdGhlIHR3bywKKyAgICAgIHVubGVzcyBhICZsdDtmaWxlc2V0Jmd0OyBpcyBzcGVjaWZpZWQuIj4KKwkJCTxERVNDUklQVElPTj5UaGUgZmlsZSB0byBkZWxldGUsIHNwZWNpZmllZCBhcyBlaXRoZXIgdGhlIHNpbXBsZWZpbGVuYW1lIChpZiB0aGUgZmlsZSBleGlzdHMgaW4gdGhlIGN1cnJlbnQgYmFzZSBkaXJlY3RvcnkpLCBhcmVsYXRpdmUtcGF0aCBmaWxlbmFtZSwgb3IgYSBmdWxsLXBhdGggZmlsZW5hbWU8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImRpciIgUkVRVUlSRUQ9IiI+CisJCQk8REVTQ1JJUFRJT04+VGhlIGRpcmVjdG9yeSB0byBkZWxldGUsIGluY2x1ZGluZyBhbGwgaXRzIGZpbGVzIGFuZHN1YmRpcmVjdG9yaWVzTm90ZTogZGlyIGlzIG5vdCB1c2VkdG8gc3BlY2lmeSBhIGRpcmVjdG9yeSBuYW1lIGZvciBmaWxlOyBmaWxlYW5kIGRpciBhcmUgaW5kZXBlbmRlbnQgb2YgZWFjaCBvdGhlcldBUk5JTkc6IERvIG5vdCBzZXQgZGlyIHRvJnF1b3Q7LiZxdW90OywgJnF1b3Q7JHtiYXNlZGlyfSZxdW90OyxvciB0aGUgZnVsbC1wYXRobmFtZSBlcXVpdmFsZW50IHVubGVzcyB5b3UgdHJ1bHkgaW50ZW5kIHRvcmVjdXJzaXZlbHkgcmVtb3ZlIHRoZSBlbnRpcmUgY29udGVudHMgb2YgdGhlIGN1cnJlbnQgYmFzZSBkaXJlY3RvcnkoYW5kIHRoZSBiYXNlIGRpcmVjdG9yeSBpdHNlbGYsIGlmIGRpZmZlcmVudCBmcm9tIHRoZSBjdXJyZW50IHdvcmtpbmdkaXJlY3RvcnkpPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJ2ZXJib3NlIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPlNob3cgdGhlIG5hbWUgb2YgZWFjaCBkZWxldGVkIGZpbGUoJnF1b3Q7dHJ1ZSZxdW90Oy8mcXVvdDtmYWxzZSZxdW90OykuRGVmYXVsdCBpcyAmcXVvdDtmYWxzZSZxdW90OyB3aGVuIG9taXR0ZWQ8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9InF1aWV0IiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPklmIHRoZSBzcGVjaWZpZWQgZmlsZSBvciBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QsZG8gbm90IGRpc3BsYXkgYSBkaWFnbm9zdGljIG1lc3NhZ2UgKHVubGVzcyBBbnRoYXMgYmVlbiBpbnZva2VkIHdpdGggdGhlICZhbXA7I3gyMDExO3ZlcmJvc2Ugb3ImYW1wOyN4MjAxMTtkZWJ1ZyBzd2l0Y2hlcykgb3IgbW9kaWZ5IHRoZSBleGl0IHN0YXR1cyB0b3JlZmxlY3QgYW4gZXJyb3IuV2hlbiBzZXQgdG8gJnF1b3Q7dHJ1ZSZxdW90OywgaWYgYSBmaWxlIG9yIGRpcmVjdG9yeSBjYW5ub3QgYmUgZGVsZXRlZCxubyBlcnJvciBpcyByZXBvcnRlZC4gVGhpcyBzZXR0aW5nIGVtdWxhdGVzIHRoZSAtZiBvcHRpb24gdG8gdGhlIFVuaXggcm0gY29tbWFuZC5EZWZhdWx0IGlzICZxdW90O2ZhbHNlJnF1b3Q7LlNldHRpbmcgdGhpcyB0byAmcXVvdDt0cnVlJnF1b3Q7IGltcGxpZXMgc2V0dGluZ2ZhaWxvbmVycm9yIHRvICZxdW90O2ZhbHNlJnF1b3Q7LjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZmFpbG9uZXJyb3IiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+Q29udHJvbHMgd2hldGhlciBhbiBlcnJvciAoc3VjaCBhcyBhIGZhaWx1cmUgdG8gZGVsZXRlIGEgZmlsZSlzdG9wcyB0aGUgYnVpbGQgb3IgaXMgbWVyZWx5IHJlcG9ydGVkIHRvIHRoZSBzY3JlZW4uT25seSByZWxldmFudCBpZiBxdWlldCBpcyAmcXVvdDtmYWxzZSZxdW90Oy5EZWZhdWx0IGlzICZxdW90O3RydWUmcXVvdDsuPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJpbmNsdWRlZW1wdHlkaXJzIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPlNldCB0byAmcXVvdDt0cnVlJnF1b3Q7IHRvIGRlbGV0ZSBlbXB0eSBkaXJlY3RvcmllcyB3aGVudXNpbmcgZmlsZXNldHMuICBEZWZhdWx0IGlzICZxdW90O2ZhbHNlJnF1b3Q7PC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJpbmNsdWRlcyIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5EZXByZWNhdGVkLiAgVXNlICZsdDtmaWxlc2V0Jmd0Oy5Db21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgb2ZmaWxlcyB0aGF0IG11c3QgYmUgZGVsZXRlZC4gQWxsIGZpbGVzIGFyZSByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5c3BlY2lmaWVkIGluIGRpci48L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImluY2x1ZGVzZmlsZSIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5EZXByZWNhdGVkLiAgVXNlICZsdDtmaWxlc2V0Jmd0Oy5UaGUgbmFtZSBvZiBhIGZpbGUuIEVhY2ggbGluZSBvZnRoaXMgZmlsZSBpcyB0YWtlbiB0byBiZSBhbiBpbmNsdWRlIHBhdHRlcjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZXhjbHVkZXMiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+RGVwcmVjYXRlZC4gIFVzZSAmbHQ7ZmlsZXNldCZndDsuQ29tbWEtIG9yIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zIG9mZmlsZXMgdGhhdCBtdXN0IGJlIGV4Y2x1ZGVkIGZyb20gdGhlIGRlbGV0aW9uIGxpc3QuQWxsIGZpbGVzIGFyZSByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IHNwZWNpZmllZCBpbiBkaXIuTm8gZmlsZXMgKGV4Y2VwdCBkZWZhdWx0IGV4Y2x1ZGVzKSBhcmUgZXhjbHVkZWQgd2hlbiBvbWl0dGVkPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJleGNsdWRlc2ZpbGUiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+RGVwcmVjYXRlZC4gIFVzZSAmbHQ7ZmlsZXNldCZndDsuVGhlIG5hbWUgb2YgYSBmaWxlLiBFYWNoIGxpbmUgb2Z0aGlzIGZpbGUgaXMgdGFrZW4gdG8gYmUgYW4gZXhjbHVkZSBwYXR0ZXI8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImRlZmF1bHRleGNsdWRlcyIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5JbmRpY2F0ZXMgd2hldGhlciBkZWZhdWx0IGV4Y2x1ZGVzc2hvdWxkIGJlIHVzZWQgb3Igbm90ICgmcXVvdDt5ZXMmcXVvdDsvJnF1b3Q7bm8mcXVvdDspLkRlZmF1bHQgZXhjbHVkZXMgYXJlIHVzZWQgd2hlbiBvbWl0dGVkPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisJPC9UQVNLPgorCTxUQVNLIE5BTUU9ImRlbHRyZWUiPgorCQk8REVTQ1JJUFRJT04+Jmx0O3AmZ3Q7RGVsZXRlcyBhIGRpcmVjdG9yeSB3aXRoIGFsbCBpdHMgZmlsZXMgYW5kIHN1YmRpcmVjdG9yaWVzLiZsdDsvcCZndDsKKzwvREVTQ1JJUFRJT04+CisJCTxBVFRSSUJVVEUgTkFNRT0iZGlyIiBSRVFVSVJFRD0ieWVzIj4KKwkJCTxERVNDUklQVElPTj50aGUgZGlyZWN0b3J5IHRvIGRlbGV0ZTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCTwvVEFTSz4KKwk8VEFTSyBOQU1FPSJkZXBlbmRzZXQiPgorCQk8REVTQ1JJUFRJT04+Jmx0O3AmZ3Q7CitUaGUgZGVwZW5kc2V0IHRhc2sgY29tcGFyZXMgYSBzZXQgb2Ygc291cmNlIGZpbGVzIHdpdGggYSBzZXQgb2YgdGFyZ2V0CitmaWxlcy4gIElmIGFueSBvZiB0aGUgc291cmNlIGZpbGVzIGlzIG1vcmUgcmVjZW50IHRoYW4gYW55IG9mCit0aGUgdGFyZ2V0IGZpbGVzLCBhbGwgb2YgdGhlIHRhcmdldCBmaWxlcyBhcmUgcmVtb3ZlZC4gIAorJmx0Oy9wJmd0OworJmx0O3AmZ3Q7CitTb3VyY2UgZmlsZXMgYW5kIHRhcmdldCBmaWxlcyBhcmUgc3BlY2lmaWVkIHZpYSBuZXN0ZWQgJmx0O2EKK2hyZWY9JnF1b3Q7Li4vQ29yZVR5cGVzL2ZpbGVzZXQuaHRtbCZxdW90OyZndDtGaWxlU2V0cyZsdDsvYSZndDsgYW5kL29yIG5lc3RlZCAmbHQ7YQoraHJlZj0mcXVvdDsuLi9Db3JlVHlwZXMvZmlsZWxpc3QuaHRtbCZxdW90OyZndDtGaWxlTGlzdHMmbHQ7L2EmZ3Q7LiAgQXJiaXRyYXJpbHkgbWFueQorc291cmNlIGFuZCB0YXJnZXQgZmlsZXNldHMvZmlsZWxpc3RzIG1heSBiZSBzcGVjaWZpZWQsIGJ1dCBhdCAKK2xlYXN0IG9uZSBmaWxlbGlzdC9maWxlc2V0IGlzIHJlcXVpcmVkIGZvciBib3RoIHNvdXJjZXMgYW5kIHRhcmdldHMuCismbHQ7L3AmZ3Q7CismbHQ7cCZndDsKK1VzZSBhIEZpbGVTZXQgd2hlbiB5b3Ugd2FudCB0byB1c2Ugd2lsZGNhcmQgaW5jbHVkZSBvciBleGNsdWRlCitwYXR0ZXJucyBhbmQgZG9uJ3QgY2FyZSBhYm91dCBtaXNzaW5nIGZpbGVzLiAgVXNlIGEgRmlsZUxpc3Qgd2hlbiB5b3UKK3dhbnQgdG8gY29uc2lkZXIgdGhlIG5vbi1leGlzdGVuY2Ugb2YgYSBmaWxlIGFzIGlmIGl0IHdlcmUgb3V0IG9mCitkYXRlLiAgSWYgdGhlcmUgYXJlIGFueSBub24tZXhpc3RpbmcgZmlsZXMgaW4gYW55IHNvdXJjZSBvciB0YXJnZXQKK0ZpbGVMaXN0LCBhbGwgdGFyZ2V0IGZpbGVzIHdpbGwgYmUgcmVtb3ZlZC4KKyZsdDsvcCZndDsKKyZsdDtwJmd0OworRGVwZW5kU2V0IGlzIHVzZWZ1bCB0byBjYXB0dXJlIGRlcGVuZGVuY2llcyB0aGF0IGFyZSBub3Qgb3IgY2Fubm90IGJlCitkZXRlcm1pbmVkIGFsZ29yaXRobWljYWxseS4gIEZvciBleGFtcGxlLCB0aGUgJmFtcDtsdDtzdHlsZSZhbXA7Z3Q7IHRhc2sgb25seQorY29tcGFyZXMgdGhlIHNvdXJjZSBYTUwgZmlsZSBhbmQgWFNMVCBzdHlsZXNoZWV0IGFnYWluc3QgdGhlIHRhcmdldAorZmlsZSB0byBkZXRlcm1pbmVkIHdoZXRoZXIgdG8gcmVzdHlsZSB0aGUgc291cmNlLiAgVXNpbmcgZGVwZW5kc2V0IHlvdQorY2FuIGV4dGVuZCB0aGlzIGRlcGVuZGVuY3kgY2hlY2tpbmcgdG8gaW5jbHVkZSBhIERURCBvciBYU0QgZmlsZSBhcword2VsbCBhcyBvdGhlciBzdHlsZXNoZWV0cyBpbXBvcnRlZCBieSB0aGUgbWFpbiBzdHlsZXNoZWV0LgorJmx0Oy9wJmd0OworPC9ERVNDUklQVElPTj4JPC9UQVNLPgorCTxUQVNLIE5BTUU9ImRpcm5hbWUiPgorCQk8REVTQ1JJUFRJT04+Jmx0O3AmZ3Q7CitUYXNrIHRvIGRldGVybWluZSB0aGUgZGlyZWN0b3J5IHBhdGggb2YgYSBzcGVjaWZpZWQgZmlsZS4KKyZsdDsvcCZndDsKKyZsdDtwJmd0OyAKK1doZW4gdGhpcyB0YXNrIGV4ZWN1dGVzLCBpdCB3aWxsIHNldCB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IHRvIHRoZQordmFsdWUgb2YgdGhlIHNwZWNpZmllZCBmaWxlIHVwIHRvLCBidXQgbm90IGluY2x1ZGluZywgdGhlIGxhc3QgcGF0aAorZWxlbWVudC4gSWYgdGhlIHNwZWNpZmllZCBmaWxlIGlzIGEgcGF0aCB0aGF0IGVuZHMgaW4gYSBmaWxlbmFtZSwKK3RoZSBmaWxlbmFtZSB3aWxsIGJlIGRyb3BwZWQuIElmIHRoZSBzcGVjaWZpZWQgZmlsZSBpcyBqdXN0IGEgZmlsZW5hbWUsCit0aGUgZGlyZWN0b3J5IHdpbGwgYmUgdGhlIGN1cnJlbnQgZGlyZWN0b3J5LgorJmx0Oy9wJmd0OworPC9ERVNDUklQVElPTj4KKwkJPEFUVFJJQlVURSBOQU1FPSJmaWxlIiBSRVFVSVJFRD0ieWVzIj4KKwkJCTxERVNDUklQVElPTj5UaGUgcGF0aCB0byB0YWtlIHRoZSBkaXJuYW1lIG9mPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJwcm9wZXJ0eSIgUkVRVUlSRUQ9InllcyI+CisJCQk8REVTQ1JJUFRJT04+VGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHNldDwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCTwvVEFTSz4KKwk8VEFTSyBOQU1FPSJlYXIiPgorCQk8REVTQ1JJUFRJT04+Jmx0O3AmZ3Q7QW4gZXh0ZW5zaW9uIG9mIHRoZSAmbHQ7YSBocmVmPSZxdW90O2phci5odG1sJnF1b3Q7Jmd0O0phciZsdDsvYSZndDsgdGFzayB3aXRoIHNwZWNpYWwKK3RyZWF0bWVudCBmb3IgZmlsZXMgdGhhdCBzaG91bGQgZW5kIHVwIGluIGFuIEVudGVycHJpc2UgQXBwbGljYXRpb24gYXJjaGl2ZS4mbHQ7L3AmZ3Q7CismbHQ7cCZndDsoVGhlIEVhciB0YXNrIGlzIGEgc2hvcnRjdXQgZm9yIHNwZWNpZnlpbmcgdGhlIHBhcnRpY3VsYXIgbGF5b3V0IG9mIGEgRUFSIGZpbGUuIAorVGhlIHNhbWUgdGhpbmcgY2FuIGJlIGFjY29tcGxpc2hlZCBieSB1c2luZyB0aGUgJmx0O2kmZ3Q7cHJlZml4Jmx0Oy9pJmd0OyBhbmQgJmx0O2kmZ3Q7ZnVsbHBhdGgmbHQ7L2kmZ3Q7CithdHRyaWJ1dGVzIG9mIHppcGZpbGVzZXRzIGluIGEgWmlwIG9yIEphciB0YXNrLikmbHQ7L3AmZ3Q7CismbHQ7cCZndDtUaGUgZXh0ZW5kZWQgemlwZmlsZXNldCBlbGVtZW50IGZyb20gdGhlIHppcCB0YXNrICh3aXRoIGF0dHJpYnV0ZXMgJmx0O2kmZ3Q7cHJlZml4Jmx0Oy9pJmd0OywgJmx0O2kmZ3Q7ZnVsbHBhdGgmbHQ7L2kmZ3Q7LCBhbmQgJmx0O2kmZ3Q7c3JjJmx0Oy9pJmd0OykgaXMgYXZhaWxhYmxlIGluIHRoZSBFYXIgdGFzay4mbHQ7L3AmZ3Q7Cis8L0RFU0NSSVBUSU9OPgorCQk8QVRUUklCVVRFIE5BTUU9ImRlc3RmaWxlIiBSRVFVSVJFRD0ieWVzIj4KKwkJCTxERVNDUklQVElPTj50aGUgRUFSIGZpbGUgdG8gY3JlYXRlPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJhcHB4bWwiIFJFUVVJUkVEPSJ5ZXMsIHVubGVzcyB1cGRhdGUgaXMgc2V0IHRvIHRydWUiPgorCQkJPERFU0NSSVBUSU9OPlRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgdG8gdXNlIChNRVRBLUlORi9hcHBsaWNhdGlvbi54bWwpPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJiYXNlZGlyIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPnRoZSBkaXJlY3RvcnkgZnJvbSB3aGljaCB0byBqYXIgdGhlIGZpbGVzPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJjb21wcmVzcyIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5Ob3Qgb25seSBzdG9yZSBkYXRhIGJ1dCBhbHNvIGNvbXByZXNzIHRoZW0sIGRlZmF1bHRzIHRvIHRydTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZW5jb2RpbmciIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+VGhlIGNoYXJhY3RlciBlbmNvZGluZyB0byB1c2UgZm9yIGZpbGVuYW1lc2luc2lkZSB0aGUgYXJjaGl2ZS4gIERlZmF1bHRzIHRvIFVURjguIEl0IGlzIG5vdHJlY29tbWVuZGVkIHRvIGNoYW5nZSB0aGlzIHZhbHVlIGFzIHRoZSBjcmVhdGVkIGFyY2hpdmUgd2lsbCBtb3N0bGlrZWx5IGJlIHVucmVhZGFibGUgZm9yIEphdmEgb3RoZXJ3aXNlPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJmaWxlc29ubHkiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+U3RvcmUgb25seSBmaWxlIGVudHJpZXMsIGRlZmF1bHRzIHRvIGZhbHM8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImluY2x1ZGVzIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPmNvbW1hLSBvciBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucyBvZiBmaWxlcyB0aGF0IG11c3QgYmVpbmNsdWRlZC4gQWxsIGZpbGVzIGFyZSBpbmNsdWRlZCB3aGVuIG9taXR0ZWQ8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImluY2x1ZGVzZmlsZSIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj50aGUgbmFtZSBvZiBhIGZpbGUuIEVhY2ggbGluZSBvZiB0aGlzIGZpbGUgaXN0YWtlbiB0byBiZSBhbiBpbmNsdWRlIHBhdHRlcjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZXhjbHVkZXMiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+Y29tbWEtIG9yIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zIG9mIGZpbGVzIHRoYXQgbXVzdCBiZWV4Y2x1ZGVkLiBObyBmaWxlcyAoZXhjZXB0IGRlZmF1bHQgZXhjbHVkZXMpIGFyZSBleGNsdWRlZCB3aGVuIG9taXR0ZWQ8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImV4Y2x1ZGVzZmlsZSIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj50aGUgbmFtZSBvZiBhIGZpbGUuIEVhY2ggbGluZSBvZiB0aGlzIGZpbGUgaXN0YWtlbiB0byBiZSBhbiBleGNsdWRlIHBhdHRlcjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZGVmYXVsdGV4Y2x1ZGVzIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPmluZGljYXRlcyB3aGV0aGVyIGRlZmF1bHQgZXhjbHVkZXMgc2hvdWxkIGJlIHVzZWQgb3Igbm90KCZxdW90O3llcyZxdW90Oy8mcXVvdDtubyZxdW90OykuIERlZmF1bHQgZXhjbHVkZXMgYXJlIHVzZWQgd2hlbiBvbWl0dGVkPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJtYW5pZmVzdCIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj50aGUgbWFuaWZlc3QgZmlsZSB0byB1c2U8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9InVwZGF0ZSIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5pbmRpY2F0ZXMgd2hldGhlciB0byB1cGRhdGUgb3Igb3ZlcndyaXRldGhlIGRlc3RpbmF0aW9uIGZpbGUgaWYgaXQgYWxyZWFkeSBleGlzdHM8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImR1cGxpY2F0ZSIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5iZWhhdmlvciB3aGVuIGEgZHVwbGljYXRlIGZpbGUgaXMgZm91bmQuICBWYWxpZCB2YWx1ZXMgYXJlICZxdW90O2FkZCZxdW90OywgJnF1b3Q7cHJlc2VydmUmcXVvdDssIGFuZCAmcXVvdDtmYWlsJnF1b3Q7LiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgJnF1b3Q7YWRkJnF1b3Q7LiA8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKwk8L1RBU0s+CisJPFRBU0sgTkFNRT0iZWNobyI+CisJCTxERVNDUklQVElPTj4mbHQ7cCZndDtFY2hvZXMgYSBtZXNzYWdlIHRvIHRoZSBjdXJyZW50IGxvZ2dlcnMgYW5kIGxpc3RlbmVycyB3aGljaAorbWVhbnMgJmx0O3R0Jmd0O1N5c3RlbS5vdXQmbHQ7L3R0Jmd0OyB1bmxlc3Mgb3ZlcnJpZGRlbi4gQSAmbHQ7dHQmZ3Q7bGV2ZWwmbHQ7L3R0Jmd0OworY2FuIGJlIHNwZWNpZmllZCwgd2hpY2ggY29udHJvbHMgYXQgd2hhdCBsb2dnaW5nIGxldmVsIHRoZSBtZXNzYWdlIGlzCitmaWx0ZXJlZCBhdC4gCismbHQ7cCZndDsgCitUaGUgdGFzayBjYW4gYWxzbyBlY2hvIHRvIGEgZmlsZSwgaW4gd2hpY2ggY2FzZSB0aGUgb3B0aW9uIHRvIGFwcGVuZCByYXRoZXIKK3RoYW4gb3ZlcndyaXRlIHRoZSBmaWxlIGlzIGF2YWlsYWJsZSwgYW5kIHRoZSAmbHQ7dHQmZ3Q7bGV2ZWwmbHQ7L3R0Jmd0OyBvcHRpb24gaXMgCitpZ25vcmVkJmx0Oy9wJmd0OworPC9ERVNDUklQVElPTj4KKwkJPEFUVFJJQlVURSBOQU1FPSJtZXNzYWdlIiBSRVFVSVJFRD0ieWVzLCB1bmxlc3MgZGF0YSBpcyBpbmNsdWRlZCBpbiBhCisgICAgICAgY2hhcmFjdGVyIHNlY3Rpb24gd2l0aGluIHRoaXMgZWxlbWVudC4iPgorCQkJPERFU0NSSVBUSU9OPnRoZSBtZXNzYWdlIHRvIGVjaG88L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImZpbGUiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+dGhlIGZpbGUgdG8gd3JpdGUgdGhlIG1lc3NhZ2UgdG88L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImFwcGVuZCIgUkVRVUlSRUQ9Im5vIC0gZGVmYXVsdCBpcyBmYWxzZS4iPgorCQkJPERFU0NSSVBUSU9OPkFwcGVuZCB0byBhbiBleGlzdGluZyBmaWxlPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJsZXZlbCIgUkVRVUlSRUQ9Im5vIC0gZGVmYXVsdCBpcyAmcXVvdDt3YXJuaW5nJnF1b3Q7LiI+CisJCQk8REVTQ1JJUFRJT04+Q29udHJvbCB0aGUgbGV2ZWwgYXQgd2hpY2ggdGhpcyBtZXNzYWdlIGlzIHJlcG9ydGVkLk9uZSBvZiAmcXVvdDtlcnJvciZxdW90OywgJnF1b3Q7d2FybmluZyZxdW90OywgJnF1b3Q7aW5mbyZxdW90OywgJnF1b3Q7dmVyYm9zZSZxdW90OywgJnF1b3Q7ZGVidWc8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKwk8L1RBU0s+CisJPFRBU0sgTkFNRT0iZXhlYyI+CisJCTxERVNDUklQVElPTj4mbHQ7cCZndDtFeGVjdXRlcyBhIHN5c3RlbSBjb21tYW5kLiBXaGVuIHRoZSAmbHQ7aSZndDtvcyZsdDsvaSZndDsgYXR0cmlidXRlIGlzIHNwZWNpZmllZCwgdGhlbgordGhlIGNvbW1hbmQgaXMgb25seSBleGVjdXRlZCB3aGVuIEFudCBpcyBydW4gb24gb25lIG9mIHRoZSBzcGVjaWZpZWQgb3BlcmF0aW5nCitzeXN0ZW1zLiZsdDsvcCZndDsKKzwvREVTQ1JJUFRJT04+CisJCTxBVFRSSUJVVEUgTkFNRT0iY29tbWFuZCIgUkVRVUlSRUQ9ImV4YWN0bHkgb25lIG9mIHRoZSB0d28uIj4KKwkJCTxERVNDUklQVElPTj50aGUgY29tbWFuZCB0byBleGVjdXRlIHdpdGggYWxsIGNvbW1hbmQgbGluZWFyZ3VtZW50cy4gZGVwcmVjYXRlZCwgdXNlIGV4ZWN1dGFibGUgYW5kIG5lc3RlZCZsdDthcmcmZ3Q7IGVsZW1lbnRzIGluc3RlYWQ8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImV4ZWN1dGFibGUiIFJFUVVJUkVEPSIiPgorCQkJPERFU0NSSVBUSU9OPnRoZSBjb21tYW5kIHRvIGV4ZWN1dGUgd2l0aG91dCBhbnkgY29tbWFuZCBsaW5lYXJndW1lbnRzPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJkaXIiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+dGhlIGRpcmVjdG9yeSBpbiB3aGljaCB0aGUgY29tbWFuZCBzaG91bGQgYmUgZXhlY3V0ZWQ8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9Im9zIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPmxpc3Qgb2YgT3BlcmF0aW5nIFN5c3RlbXMgb24gd2hpY2ggdGhlIGNvbW1hbmQgbWF5IGJlZXhlY3V0ZWQuIElmIHRoZSBjdXJyZW50IE9TJ3MgbmFtZSBpcyBjb250YWluZWQgaW4gdGhpcyBsaXN0LCB0aGUgY29tbWFuZCB3aWxsYmUgZXhlY3V0ZWQuIFRoZSBPUydzIG5hbWUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgSmF2YSBWaXJ0dWFsIG1hY2hpbmUgYW5kIGlzIHNldGluIHRoZSAmcXVvdDtvcy5uYW1lJnF1b3Q7IHN5c3RlbSBwcm9wZXJ0eTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0ib3V0cHV0IiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPnRoZSBmaWxlIHRvIHdoaWNoIHRoZSBvdXRwdXQgb2YgdGhlIGNvbW1hbmQgc2hvdWxkIGJlcmVkaXJlY3RlZDwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iYXBwZW5kIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPndoZXRoZXIgb3V0cHV0IHNob3VsZCBiZSBhcHBlbmRlZCB0byBvciBvdmVyd3JpdGVhbiBleGlzdGluZyBmaWxlLiAgRGVmYXVsdHMgdG8gZmFsc2U8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9Im91dHB1dHByb3BlcnR5IiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPnRoZSBuYW1lIG9mIGEgcHJvcGVydHkgaW4gd2hpY2ggdGhlIG91dHB1dCBvZiB0aGUgY29tbWFuZCBzaG91bGQgYmUgc3RvcmVkPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJyZXN1bHRwcm9wZXJ0eSIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj50aGUgbmFtZSBvZiBhIHByb3BlcnR5IGluIHdoaWNoIHRoZSByZXR1cm4gY29kZSBvZiB0aGUgY29tbWFuZCBzaG91bGQgYmUgc3RvcmVkLiBPbmx5IG9mIGludGVyZXN0IGlmIGZhaWxvbmVycm9yPWZhbHM8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9InRpbWVvdXQiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+U3RvcCB0aGUgY29tbWFuZCBpZiBpdCBkb2Vzbid0IGZpbmlzaCB3aXRoaW4gdGhlc3BlY2lmaWVkIHRpbWUgKGdpdmVuIGluIG1pbGxpc2Vjb25kcyk8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImZhaWxvbmVycm9yIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPlN0b3AgdGhlIGJ1aWxkcHJvY2VzcyBpZiB0aGUgY29tbWFuZCBleGl0cyB3aXRoIGFyZXR1cm5jb2RlIG90aGVyIHRoYW4gMC4gRGVmYXVsdHMgdG8gZmFsczwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZmFpbGlmZXhlY3V0aW9uZmFpbHMiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+U3RvcCB0aGUgYnVpbGQgaWYgd2UgY2FuJ3Qgc3RhcnQgdGhlIHByb2dyYW0uRGVmYXVsdHMgdG8gdHJ1ZS48L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9Im5ld2Vudmlyb25tZW50IiBSRVFVSVJFRD0ibm8sIGRlZmF1bHQgaXMgZmFsc2UiPgorCQkJPERFU0NSSVBUSU9OPkRvIG5vdCBwcm9wYWdhdGUgb2xkIGVudmlyb25tZW50IHdoZW4gbmV3IGVudmlyb25tZW50dmFyaWFibGVzIGFyZSBzcGVjaWZpZWQ8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9InZtbGF1bmNoZXIiIFJFUVVJUkVEPSJubywgZGVmYXVsdCBpcyB0cnVlIj4KKwkJCTxERVNDUklQVElPTj5SdW4gY29tbWFuZCB1c2luZyB0aGUgSmF2YSBWTSdzIGV4ZWN1dGlvbiBmYWNpbGl0aWVzd2hlcmUgYXZhaWxhYmxlLiBJZiBzZXQgdG8gZmFsc2UgdGhlIHVuZGVybHlpbmcgT1MncyBzaGVsbCxlaXRoZXIgZGlyZWN0bHkgb3IgdGhyb3VnaCB0aGUgYW50UnVuIHNjcmlwdHMsIHdpbGwgYmUgdXNlZC5VbmRlciBzb21lIG9wZXJhdGluZyBzeXN0ZW1zLCB0aGlzIGdpdmVzIGFjY2VzcyB0byBmYWNpbGl0aWVzbm90IG5vcm1hbGx5IGF2YWlsYWJsZSB0aHJvdWdoIHRoZSBWTSBpbmNsdWRpbmcsIHVuZGVyIFdpbmRvd3MsYmVpbmcgYWJsZSB0byBleGVjdXRlIHNjcmlwdHMsIHJhdGhlciB0aGFuIHRoZWlyIGFzc29jaWF0ZWRpbnRlcnByZXRlci4gIElmIHlvdSB3YW50IHRvIHNwZWNpZnkgdGhlIG5hbWUgb2YgdGhlZXhlY3V0YWJsZSBhcyBhIHJlbGF0aXZlIHBhdGggdG8gdGhlIGRpcmVjdG9yeSBnaXZlbiBieSB0aGVkaXIgYXR0cmlidXRlLCBpdCBtYXkgYmVjb21lIG5lY2Vzc2FyeSB0byBzZXQgdm1sYXVuY2hlciB0b2ZhbHNlIGFzIHdlbGw8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKwk8L1RBU0s+CisJPFRBU0sgTkFNRT0iZmFpbCI+CisJCTxERVNDUklQVElPTj4mbHQ7cCZndDtFeGl0cyB0aGUgY3VycmVudCBidWlsZCAoanVzdCB0aHJvd2luZyBhIEJ1aWxkRXhjZXB0aW9uKSwgb3B0aW9uYWxseSBwcmludGluZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLiZsdDsvcCZndDsKKyZsdDtwJmd0O1RoZSBtZXNzYWdlIG9mIHRoZSBFeGNlcHRpb24gY2FuIGJlIHNldCB2aWEgdGhlIG1lc3NhZ2UgYXR0cmlidXRlCitvciBjaGFyYWN0ZXIgZGF0YSBuZXN0ZWQgaW50byB0aGUgZWxlbWVudC4mbHQ7L3AmZ3Q7Cis8L0RFU0NSSVBUSU9OPgorCQk8QVRUUklCVVRFIE5BTUU9Im1lc3NhZ2UiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+QSBtZXNzYWdlIGdpdmluZyBmdXJ0aGVyIGluZm9ybWF0aW9uIG9uIHdoeSB0aGUgYnVpbGQgZXhpdGU8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImlmIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPk9ubHkgZmFpbCBpZiBhIHByb3BlcnR5IG9mIHRoZSBnaXZlbiBuYW1lIGV4aXN0c2luIHRoZSBjdXJyZW50IHByb2plYzwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0idW5sZXNzIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPk9ubHkgZmFpbCBpZiBhIHByb3BlcnR5IG9mIHRoZSBnaXZlbiBuYW1lIGRvZXNuJ3RleGlzdCBpbiB0aGUgY3VycmVudCBwcm9qZWM8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKwk8L1RBU0s+CisJPFRBU0sgTkFNRT0iZmlsdGVyIj4KKwkJPERFU0NSSVBUSU9OPiZsdDtwJmd0O1NldHMgYSB0b2tlbiBmaWx0ZXIgZm9yIHRoaXMgcHJvamVjdCBvciByZWFkIG11bHRpcGxlIHRva2VuIGZpbHRlciBmcm9tCithbiBpbnB1dCBmaWxlIGFuZCBzZXRzIHRoZXNlIGFzIGZpbHRlcnMuCitUb2tlbiBmaWx0ZXJzIGFyZSB1c2VkIGJ5IGFsbCB0YXNrcyB0aGF0IHBlcmZvcm0gZmlsZSBjb3B5aW5nIG9wZXJhdGlvbnMKK3Rocm91Z2ggdGhlIFByb2plY3QgY29tbW9kaXR5IG1ldGhvZHMuJmx0Oy9wJmd0OworJmx0O3AmZ3Q7Tm90ZSAxOiB0aGUgdG9rZW4gc3RyaW5nIG11c3Qgbm90IGNvbnRhaW4gdGhlIHNlcGFyYXRvcnMgY2hhcnMgKEApLiZsdDticiZndDsKK05vdGUgMjogRWl0aGVyIHRva2VuIGFuZCB2YWx1ZSBhdHRyaWJ1dGVzIG11c3QgYmUgcHJvdmlkZWQsIG9yIG9ubHkgdGhlCitmaWx0ZXJzZmlsZSBhdHRyaWJ1dGUuJmx0Oy9wJmd0OworPC9ERVNDUklQVElPTj4KKwkJPEFUVFJJQlVURSBOQU1FPSJ0b2tlbiIgUkVRVUlSRUQ9InllcyoiPgorCQkJPERFU0NSSVBUSU9OPnRoZSB0b2tlbiBzdHJpbmcgd2l0aG91dCA8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9InZhbHVlIiBSRVFVSVJFRD0ieWVzKiI+CisJCQk8REVTQ1JJUFRJT04+dGhlIHN0cmluZyB0aGF0IHNob3VsZCBiZSBwdXQgdG8gcmVwbGFjZSB0aGUgdG9rZW4gd2hlbiB0aGUgZmlsZSBpcyBjb3BpZTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZmlsdGVyc2ZpbGUiIFJFUVVJUkVEPSJ5ZXMqIj4KKwkJCTxERVNDUklQVElPTj5UaGUgZmlsZSBmcm9tIHdoaWNoIHRoZSBmaWx0ZXJzIG11c3QgYmUgcmVhZC4gVGhpcyBmaWxlIG11c3QgYmUgYSBmb3JtYXR0ZWQgYXMgYSBwcm9wZXJ0eSBmaWxlLjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCTwvVEFTSz4KKwk8VEFTSyBOQU1FPSJmaXhjcmxmIj4KKwkJPERFU0NSSVBUSU9OPiZsdDtwJmd0OworQWRqdXN0cyBhIHRleHQgZmlsZSB0byBsb2NhbCBjb252ZW50aW9ucy4KKyZsdDsvcCZndDsKKyZsdDtwJmd0OworVGhlIHNldCBvZiBmaWxlcyB0byBiZSBhZGp1c3RlZCBjYW4gYmUgcmVmaW5lZCB3aXRoIHRoZQorJmx0O2kmZ3Q7aW5jbHVkZXMmbHQ7L2kmZ3Q7LCAmbHQ7aSZndDtpbmNsdWRlc2ZpbGUmbHQ7L2kmZ3Q7LCAmbHQ7aSZndDtleGNsdWRlcyZsdDsvaSZndDssCismbHQ7aSZndDtleGNsdWRlc2ZpbGUmbHQ7L2kmZ3Q7IGFuZCAmbHQ7aSZndDtkZWZhdWx0ZXhjbHVkZXMmbHQ7L2kmZ3Q7CithdHRyaWJ1dGVzLiBQYXR0ZXJucyBwcm92aWRlZCB0aHJvdWdoIHRoZSAmbHQ7aSZndDtpbmNsdWRlcyZsdDsvaSZndDsgb3IKKyZsdDtpJmd0O2luY2x1ZGVzZmlsZSZsdDsvaSZndDsgYXR0cmlidXRlcyBzcGVjaWZ5IGZpbGVzIHRvIGJlCitpbmNsdWRlZC4gUGF0dGVybnMgcHJvdmlkZWQgdGhyb3VnaCB0aGUgJmx0O2kmZ3Q7ZXhjbHVkZSZsdDsvaSZndDsgb3IKKyZsdDtpJmd0O2V4Y2x1ZGVzZmlsZSZsdDsvaSZndDsgYXR0cmlidXRlIHNwZWNpZnkgZmlsZXMgdG8gYmUKK2V4Y2x1ZGVkLiBBZGRpdGlvbmFsbHksIGRlZmF1bHQgZXhjbHVzaW9ucyBjYW4gYmUgc3BlY2lmaWVkIHdpdGgKK3RoZSAmbHQ7aSZndDtkZWZhdWx0ZXhjbHVkZXMmbHQ7L2kmZ3Q7IGF0dHJpYnV0ZS4gU2VlIHRoZSBzZWN0aW9uIG9uICZsdDthCitocmVmPSZxdW90Oy4uL2RpcnRhc2tzLmh0bWwjZGlyZWN0b3J5YmFzZWR0YXNrcyZxdW90OyZndDtkaXJlY3RvcnkgYmFzZWQKK3Rhc2tzJmx0Oy9hJmd0OywgZm9yIGRldGFpbHMgb2YgZmlsZSBpbmNsdXNpb24vZXhjbHVzaW9uIHBhdHRlcm5zCithbmQgdGhlaXIgdXNhZ2UuCismbHQ7L3AmZ3Q7CismbHQ7cCZndDtUaGlzIHRhc2sgZm9ybXMgYW4gaW1wbGljaXQgJmx0O2EgaHJlZj0mcXVvdDsuLi9Db3JlVHlwZXMvZmlsZXNldC5odG1sJnF1b3Q7Jmd0O0ZpbGVTZXQmbHQ7L2EmZ3Q7IGFuZAorc3VwcG9ydHMgYWxsIGF0dHJpYnV0ZXMgb2YgJmx0O2NvZGUmZ3Q7JmFtcDtsdDtmaWxlc2V0JmFtcDtndDsmbHQ7L2NvZGUmZ3Q7CisoJmx0O2NvZGUmZ3Q7ZGlyJmx0Oy9jb2RlJmd0OyBiZWNvbWVzICZsdDtjb2RlJmd0O3NyY2RpciZsdDsvY29kZSZndDspIGFzIHdlbGwgYXMgdGhlIG5lc3RlZAorJmx0O2NvZGUmZ3Q7JmFtcDtsdDtpbmNsdWRlJmFtcDtndDsmbHQ7L2NvZGUmZ3Q7LCAmbHQ7Y29kZSZndDsmYW1wO2x0O2V4Y2x1ZGUmYW1wO2d0OyZsdDsvY29kZSZndDsgYW5kCismbHQ7Y29kZSZndDsmYW1wO2x0O3BhdHRlcm5zZXQmYW1wO2d0OyZsdDsvY29kZSZndDsgZWxlbWVudHMuJmx0Oy9wJmd0OworJmx0O3AmZ3Q7CitUaGUgb3V0cHV0IGZpbGUgaXMgb25seSB3cml0dGVuIGlmIGl0IGlzIGEgbmV3IGZpbGUsIG9yIGlmIGl0CitkaWZmZXJzIGZyb20gdGhlIGV4aXN0aW5nIGZpbGUuICBUaGlzIHByZXZlbnRzIHNwdXJpb3VzCityZWJ1aWxkcyBiYXNlZCBvbiB1bmNoYW5nZWQgZmlsZXMgd2hpY2ggaGF2ZSBiZWVuIHJlZ2VuZXJhdGVkCitieSB0aGlzIHRhc2suCismbHQ7L3AmZ3Q7Cis8L0RFU0NSSVBUSU9OPgorCQk8QVRUUklCVVRFIE5BTUU9InNyY2RpciIgUkVRVUlSRUQ9InllcyI+CisJCQk8REVTQ1JJUFRJT04+V2hlcmUgdG8gZmluZCB0aGUgZmlsZXMgdG8gYmUgZml4ZWQgdXA8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImRlc3RkaXIiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+V2hlcmUgdG8gcGxhY2UgdGhlIGNvcnJlY3RlZCBmaWxlcy4gIERlZmF1bHRzIHRvc3JjRGlyIChyZXBsYWNpbmcgdGhlIG9yaWdpbmFsIGZpbGU8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImluY2x1ZGVzIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPmNvbW1hLSBvciBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucyBvZiBmaWxlcyB0aGF0IG11c3QgYmVpbmNsdWRlZC4gQWxsIGZpbGVzIGFyZSBpbmNsdWRlZCB3aGVuIG9taXR0ZWQ8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImluY2x1ZGVzZmlsZSIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj50aGUgbmFtZSBvZiBhIGZpbGUuIEVhY2ggbGluZSBvZiB0aGlzIGZpbGUgaXN0YWtlbiB0byBiZSBhbiBpbmNsdWRlIHBhdHRlcjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZXhjbHVkZXMiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+Y29tbWEtIG9yIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zIG9mIGZpbGVzIHRoYXQgbXVzdCBiZWV4Y2x1ZGVkLiBObyBmaWxlcyAoZXhjZXB0IGRlZmF1bHQgZXhjbHVkZXMpIGFyZSBleGNsdWRlZCB3aGVuIG9taXR0ZWQ8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImV4Y2x1ZGVzZmlsZSIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj50aGUgbmFtZSBvZiBhIGZpbGUuIEVhY2ggbGluZSBvZiB0aGlzIGZpbGUgaXN0YWtlbiB0byBiZSBhbiBleGNsdWRlIHBhdHRlcjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZGVmYXVsdGV4Y2x1ZGVzIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPmluZGljYXRlcyB3aGV0aGVyIGRlZmF1bHQgZXhjbHVkZXMgc2hvdWxkIGJlIHVzZWQgb3Igbm90KCZxdW90O3llcyZxdW90Oy8mcXVvdDtubyZxdW90OykuIERlZmF1bHQgZXhjbHVkZXMgYXJlIHVzZWQgd2hlbiBvbWl0dGVkPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJlb2wiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+U3BlY2lmaWVzIGhvdyBlbmQtb2YtbGluZSAoRU9MKSBjaGFyYWN0ZXJzIGFyZSB0byBiZWhhbmRsZWQuICBUaGUgRU9MIGNoYXJhY3RlcnMgYXJlIENSLCBMRiBhbmQgdGhlIHBhaXIgQ1JMRi5WYWxpZCB2YWx1ZXMgZm9yIHRoaXMgcHJvcGVydHkgYXJlOmFzaXM6IGxlYXZlIEVPTCBjaGFyYWN0ZXJzIGFsb25lY3I6IGNvbnZlcnQgYWxsIEVPTHMgdG8gYSBzaW5nbGUgQ1JsZjogY29udmVydCBhbGwgRU9McyB0byBhIHNpbmdsZSBMRmNybGY6IGNvbnZlcnQgYWxsIEVPTHMgdG8gdGhlIHBhaXIgQ1JMRkRlZmF1bHQgaXMgYmFzZWQgb24gdGhlIHBsYXRmb3JtIG9uIHdoaWNoIHlvdSBhcmUgcnVubmluZ3RoaXMgdGFzay4gIEZvciBVbml4IHBsYXRmb3JtcywgdGhlIGRlZmF1bHQgaXMgJnF1b3Q7bGYmcXVvdDsuRm9yIERPUyBiYXNlZCBzeXN0ZW1zIChpbmNsdWRpbmcgV2luZG93cyksIHRoZSBkZWZhdWx0IGlzJnF1b3Q7Y3JsZiZxdW90Oy4gIEZvciBNYWMgT1MsIHRoZSBkZWZhdWx0IGlzICZxdW90O2NyJnF1b3Q7LlRoaXMgaXMgdGhlIHByZWZlcnJlZCBtZXRob2QgZm9yIHNwZWNpZnlpbmcgRU9MLiAgVGhlJnF1b3Q7Y3ImcXVvdDsgYXR0cmlidXRlIChzZWUgYmVsb3cpIGlzbm93IGRlcHJlY2F0ZWQuTi5CLjogT25lIHNwZWNpYWwgY2FzZSBpcyByZWNvZ25pemVkLiBUaGUgdGhyZWVjaGFyYWN0ZXJzIENSLUNSLUxGIGFyZSByZWdhcmRlZCBhcyBhIHNpbmdsZSBFT0wuVW5sZXNzIHRoaXMgcHJvcGVydHkgaXMgc3BlY2lmaWVkIGFzICZxdW90O2FzaXMmcXVvdDssdGhpcyBzZXF1ZW5jZSB3aWxsIGJlIGNvbnZlcnRlZCBpbnRvIHRoZSBzcGVjaWZpZWQgRU9MdHlwZS48L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImNyIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPkRlcHJlY2F0ZWQuIFNwZWNpZmllcyBob3cgQ1IgY2hhcmFjdGVycyBhcmV0byBiZSBoYW5kbGVkIGF0IGVuZC1vZi1saW5lIChFT0wpLiAgVmFsaWQgdmFsdWVzIGZvciB0aGlzcHJvcGVydHkgYXJlOmFzaXM6IGxlYXZlIEVPTCBjaGFyYWN0ZXJzIGFsb25lLmFkZDogYWRkIGEgQ1IgYmVmb3JlIGFueSBzaW5nbGUgTEYgY2hhcmFjdGVycy4gVGhlaW50ZW50IGlzIHRvIGNvbnZlcnQgYWxsIEVPTHMgdG8gdGhlIHBhaXIgQ1JMRi5yZW1vdmU6IHJlbW92ZSBhbGwgQ1JzIGZyb20gdGhlIGZpbGUuICBUaGUgaW50ZW50IGlzdG8gY29udmVydCBhbGwgRU9McyB0byBhIHNpbmdsZSBMRi5EZWZhdWx0IGlzIGJhc2VkIG9uIHRoZSBwbGF0Zm9ybSBvbiB3aGljaCB5b3UgYXJlIHJ1bm5pbmd0aGlzIHRhc2suICBGb3IgVW5peCBwbGF0Zm9ybXMsIHRoZSBkZWZhdWx0IGlzICZxdW90O3JlbW92ZSZxdW90Oy5Gb3IgRE9TIGJhc2VkIHN5c3RlbXMgKGluY2x1ZGluZyBXaW5kb3dzKSwgdGhlIGRlZmF1bHQgaXMmcXVvdDthZGQmcXVvdDsuTi5CLjogT25lIHNwZWNpYWwgY2FzZSBpcyByZWNvZ25pemVkLiBUaGUgdGhyZWVjaGFyYWN0ZXJzIENSLUNSLUxGIGFyZSByZWdhcmRlZCBhcyBhIHNpbmdsZSBFT0wuVW5sZXNzIHRoaXMgcHJvcGVydHkgaXMgc3BlY2lmaWVkIGFzICZxdW90O2FzaXMmcXVvdDssdGhpcyBzZXF1ZW5jZSB3aWxsIGJlIGNvbnZlcnRlZCBpbnRvIHRoZSBzcGVjaWZpZWQgRU9MdHlwZS48L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImphdmFmaWxlcyIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5Vc2VkIG9ubHkgaW4gYXNzb2NpYXRpb24gd2l0aCB0aGUmcXVvdDt0YWImcXVvdDsgYXR0cmlidXRlIChzZWUgYmVsb3cpLCB0aGlzYm9vbGVhbiBhdHRyaWJ1dGUgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGZpbGVzZXQgaXMgYSBzZXRvZiBqYXZhIHNvdXJjZSBmaWxlcygmcXVvdDt5ZXMmcXVvdDsvJnF1b3Q7bm8mcXVvdDspLiBEZWZhdWx0cyB0byZxdW90O25vJnF1b3Q7LiAgU2VlIG5vdGVzIGluIHNlY3Rpb24gb24gJnF1b3Q7dGFiJnF1b3Q7LjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0idGFiIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPlNwZWNpZmllcyBob3cgdGFiIGNoYXJhY3RlcnMgYXJlIHRvIGJlIGhhbmRsZWQuICBWYWxpZHZhbHVlcyBmb3IgdGhpcyBwcm9wZXJ0eSBhcmU6YWRkOiBjb252ZXJ0IHNlcXVlbmNlcyBvZiBzcGFjZXMgd2hpY2ggc3BhbiBhIHRhYiBzdG9wIHRvIHRhYnNhc2lzOiBsZWF2ZSB0YWIgYW5kIHNwYWNlIGNoYXJhY3RlcnMgYWxvbmVyZW1vdmU6IGNvbnZlcnQgdGFicyB0byBzcGFjZXNEZWZhdWx0IGZvciB0aGlzIHBhcmFtZXRlciBpcyAmcXVvdDthc2lzJnF1b3Q7Lk4uQi46IFdoZW4gdGhlIGF0dHJpYnV0ZSZxdW90O2phdmFmaWxlcyZxdW90OyAoc2VlIGFib3ZlKSBpcyZxdW90O3RydWUmcXVvdDssIGxpdGVyYWwgVEFCIGNoYXJhY3RlcnMgb2NjdXJyaW5nd2l0aGluIEphdmEgc3RyaW5nIG9yIGNoYXJhY3RlciBjb25zdGFudHMgYXJlIG5ldmVybW9kaWZpZWQuICBUaGlzIGZ1bmN0aW9uYWxpdHkgYWxzbyByZXF1aXJlcyB0aGVyZWNvZ25pdGlvbiBvZiBKYXZhLXN0eWxlIGNvbW1lbnRzLk4uQi46IFRoZXJlIGlzIGFuIGluY29tcGF0aWJpbGl0eSBiZXR3ZWVuIHRoaXNhbmQgdGhlIHByZXZpb3VzIHZlcnNpb24gaW4gdGhlIGhhbmRsaW5nIG9mIHdoaXRlc3BhY2UgYXQgdGhlIGVuZCBvZiBsaW5lcy4gIFRoaXMgdmVyc2lvbiBkb2Vzbm90IHJlbW92ZSB0cmFpbGluZyB3aGl0ZXNwYWNlIG9uIGxpbmVzLjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0idGFibGVuZ3RoIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPlRBQiBjaGFyYWN0ZXIgaW50ZXJ2YWwuIFZhbGlkIHZhbHVlcyBhcmUgYmV0d2VlbjIgYW5kIDgwIGluY2x1c2l2ZS4gIFRoZSBkZWZhdWx0IGZvciB0aGlzIHBhcmFtZXRlciBpcyA4PC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJlb2YiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+U3BlY2lmaWVzIGhvdyBET1MgZW5kIG9mIGZpbGUgKGNvbnRyb2wtWikgY2hhcmFjdGVycyBhcmV0byBiZSBoYW5kbGVkLiAgVmFsaWQgdmFsdWVzIGZvciB0aGlzIHByb3BlcnR5IGFyZTphZGQ6IGVuc3VyZSB0aGF0IHRoZXJlIGlzIGFuIEVPRiBjaGFyYWN0ZXIgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZWFzaXM6IGxlYXZlIEVPRiBjaGFyYWN0ZXJzIGFsb25lcmVtb3ZlOiByZW1vdmUgYW55IEVPRiBjaGFyYWN0ZXIgZm91bmQgYXQgdGhlIGVuZERlZmF1bHQgaXMgYmFzZWQgb24gdGhlIHBsYXRmb3JtIG9uIHdoaWNoIHlvdSBhcmUgcnVubmluZyB0aGlzIHRhc2suRm9yIFVuaXggcGxhdGZvcm1zLCB0aGUgZGVmYXVsdCBpcyByZW1vdmUuICBGb3IgRE9TIGJhc2VkIHN5c3RlbXMoaW5jbHVkaW5nIFdpbmRvd3MpLCB0aGUgZGVmYXVsdCBpcyBhc2lzLjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZW5jb2RpbmciIFJFUVVJUkVEPSJubyAtIGRlZmF1bHRzIHRvIGRlZmF1bHQganZtIGVuY29kaW5nIj4KKwkJCTxERVNDUklQVElPTj5UaGUgZW5jb2Rpbmcgb2YgdGhlIGZpbGU8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKwk8L1RBU0s+CisJPFRBU0sgTkFNRT0iZ2Vua2V5Ij4KKwkJPERFU0NSSVBUSU9OPiZsdDtwJmd0O0dlbmVyYXRlcyBhIGtleSBpbiBrZXlzdG9yZS4gVGhpcyB0YXNrIG5lZWRzIEphdmExLjIgb3IgbGF0ZXImbHQ7L3AmZ3Q7Cis8L0RFU0NSSVBUSU9OPgorCQk8QVRUUklCVVRFIE5BTUU9ImFsaWFzIiBSRVFVSVJFRD0ieWVzLiI+CisJCQk8REVTQ1JJUFRJT04+dGhlIGFsaWFzIHRvIGFkZCB1bmRlPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJzdG9yZXBhc3MiIFJFUVVJUkVEPSJ5ZXMuIj4KKwkJCTxERVNDUklQVElPTj5wYXNzd29yZCBmb3Iga2V5c3RvcmUgaW50ZWdyaXR5LiBNdXN0YmUgYXQgbGVhc3QgNiBjaGFyYWN0ZXJzIGxvbjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0ia2V5c3RvcmUiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+a2V5c3RvcmUgbG9jYXRpbzwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0ic3RvcmV0eXBlIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPmtleXN0b3JlIHR5cDwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0ia2V5cGFzcyIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5wYXNzd29yZCBmb3IgcHJpdmF0ZSBrZXkgKGlmIGRpZmZlcmVudDwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0ic2lnYWxnIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPnRoZSBhbGdvcml0aG0gdG8gdXNlIGluIHNpZ25pbjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0ia2V5YWxnIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPnRoZSBtZXRob2QgdG8gdXNlIHdoZW4gZ2VuZXJhdGluZyBuYW1lLXZhbHVlIHBhaTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0idmVyYm9zZSIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj4odHJ1ZSB8IGZhbHNlKSB2ZXJib3NlIG91dHB1dCB3aGVuIHNpZ25pbjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZG5hbWUiIFJFUVVJUkVEPSJ5ZXMgaWYgZG5hbWUgZWxlbWVudCB1bnNwZWNpZmllZCI+CisJCQk8REVTQ1JJUFRJT04+VGhlIGRpc3Rpbmd1aXNoZWQgbmFtZSBmb3IgZW50aXQ8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9InZhbGlkaXR5IiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPihpbnRlZ2VyKSBpbmRpY2F0ZXMgaG93IG1hbnkgZGF5cyBjZXJ0aWZpY2F0ZSBpcyB2YWxpPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJrZXlzaXplIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPihpbnRlZ2VyKSBpbmRpY2F0ZXMgdGhlIHNpemUgb2Yga2V5IGdlbmVyYXRlPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisJPC9UQVNLPgorCTxUQVNLIE5BTUU9ImdldCI+CisJCTxERVNDUklQVElPTj4mbHQ7cCZndDtHZXRzIGEgZmlsZSBmcm9tIGEgVVJMLiBXaGVuIHRoZSB2ZXJib3NlIG9wdGlvbiBpcyAmYW1wO3F1b3Q7b24mYW1wO3F1b3Q7LCB0aGlzIHRhc2sKK2Rpc3BsYXlzIGEgJy4nIGZvciBldmVyeSAxMDAgS2IgcmV0cmlldmVkLiBBbnkgVVJMIHNjaGVtYSBzdXBwb3J0ZWQgYnkKK3RoZSBydW50aW1lIGlzIHZhbGlkIGhlcmUsIGluY2x1ZGluZyBodHRwOiwgZnRwOiBhbmQgamFyOjsgCitodHRwczogaXMgb25seSB2YWxpZCBpZiB0aGUgYXBwcm9wcmlhdGUgc3VwcG9ydCBpcyBhZGRlZCB0byB0aGUgcHJlLTEuNCBKYXZhCitydW50aW1lcy4gCismbHQ7L3AmZ3Q7CismbHQ7cCZndDtUaGlzIHRhc2sgc2hvdWxkIGJlIHByZWZlcnJlZCBhYm92ZSB0aGUgJmx0O2EgaHJlZj0mcXVvdDtjdnMuaHRtbCZxdW90OyZndDtDVlMgdGFzayZsdDsvYSZndDsgd2hlbgorZmV0Y2hpbmcgcmVtb3RlIGNvbnRlbnQuIENWUyBpcyBzaWduaWZpY2FudGx5IHNsb3dlciB0aGFuIGxvYWRpbmcgYSBjb21wcmVzc2VkCithcmNoaXZlIGNvbXBhcmVkIHRvIGh0dHAvZnRwLiZsdDsvcCZndDsKK1RoZSAmbHQ7aSZndDt1c2V0aW1lc3RhbXAmbHQ7L2kmZ3Q7IG9wdGlvbiBlbmFibGVzIHlvdSB0byBjb250cm9sIGRvd25sb2FkcyBzbyB0aGF0IHRoZSByZW1vdGUgZmlsZSBpcworb25seSBmZXRjaGVkIGlmIG5ld2VyIHRoYW4gdGhlIGxvY2FsIGNvcHkuIElmIHRoZXJlIGlzIG5vIGxvY2FsIGNvcHksIHRoZSBkb3dubG9hZCBhbHdheXMgdGFrZXMgCitwbGFjZS4gV2hlbiBhIGZpbGUgaXMgZG93bmxvYWRlZCwgdGhlIHRpbWVzdGFtcCBvZiB0aGUgZG93bmxvYWRlZCBmaWxlIGlzIHNldCB0byB0aGUgcmVtb3RlIHRpbWVzdGFtcCwKK2lmICB0aGUgSlZNIGlzIEphdmExLjIgb3IgbGF0ZXIuIAorTkI6IFRoaXMgdGltZXN0YW1wIGZhY2lsaXR5IG9ubHkgd29ya3Mgb24gZG93bmxvYWRzIHVzaW5nIHRoZSBIVFRQIHByb3RvY29sLiAKKyZsdDtwJmd0OworQSB1c2VybmFtZSBhbmQgcGFzc3dvcmQgY2FuIGJlIHNwZWNpZmllZCwgaW4gd2hpY2ggY2FzZSBiYXNpYyAnc2xpZ2h0bHkgZW5jb2RlZAorcGxhaW4gdGV4dCcgYXV0aGVudGljYXRpb24gaXMgdXNlZC4gVGhpcyBpcyBvbmx5IGEgc2VjdXJlIGF1dGhlbnRpY2F0aW9uCittZWNoYW5pc20gb3ZlciBhbiBIVFRQUyBsaW5rLgorJmx0Oy9wJmd0OworPC9ERVNDUklQVElPTj4KKwkJPEFUVFJJQlVURSBOQU1FPSJzcmMiIFJFUVVJUkVEPSJ5ZXMiPgorCQkJPERFU0NSSVBUSU9OPnRoZSBVUkwgZnJvbSB3aGljaCB0byByZXRyaWV2ZSBhIGZpbGU8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImRlc3QiIFJFUVVJUkVEPSJ5ZXMiPgorCQkJPERFU0NSSVBUSU9OPnRoZSBmaWxlIHdoZXJlIHRvIHN0b3JlIHRoZSByZXRyaWV2ZWQgZmlsZTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0idmVyYm9zZSIgUkVRVUlSRUQ9Im5vOyBkZWZhdWx0ICZxdW90O2ZhbHNlJnF1b3Q7Ij4KKwkJCTxERVNDUklQVElPTj5zaG93IHZlcmJvc2UgcHJvZ3Jlc3MgaW5mb3JtYXRpb24gKCZxdW90O29uJnF1b3Q7LyZxdW90O29mZiZxdW90Oyk8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9Imlnbm9yZWVycm9ycyIgUkVRVUlSRUQ9Im5vOyBkZWZhdWx0ICZxdW90O2ZhbHNlJnF1b3Q7Ij4KKwkJCTxERVNDUklQVElPTj5Mb2cgZXJyb3JzIGJ1dCBkb24ndCB0cmVhdCBhcyBmYXRhbDwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0idXNldGltZXN0YW1wIiBSRVFVSVJFRD0ibm87IGRlZmF1bHQgJnF1b3Q7ZmFsc2UmcXVvdDsiPgorCQkJPERFU0NSSVBUSU9OPmNvbmRpdGlvbmFsbHkgZG93bmxvYWQgYSBmaWxlIGJhc2VkIG9uIHRoZSB0aW1lc3RhbXAgb2YgdGhlbG9jYWwgY29weS4gSFRUUCBvbmw8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9InVzZXJuYW1lIiBSRVFVSVJFRD0iaWYgcGFzc3dvcmQgaXMgc2V0Ij4KKwkJCTxERVNDUklQVElPTj51c2VybmFtZSBmb3IgJ0JBU0lDJyBodHRwIGF1dGhlbnRpY2F0aW88L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9InBhc3N3b3JkIiBSRVFVSVJFRD0iaWYgdXNlcm5hbWUgaXMgc2V0Ij4KKwkJCTxERVNDUklQVElPTj5wYXNzd29yZDogcmVxdWlyZWQ8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKwk8L1RBU0s+CisJPFRBU0sgTkFNRT0iaW5wdXQiPgorCQk8REVTQ1JJUFRJT04+Jmx0O3AmZ3Q7QWxsb3dzIHVzZXIgaW50ZXJhY3Rpb24gZHVyaW5nIHRoZSBidWlsZCBwcm9jZXNzIGJ5IHByb21wdGluZyBmb3IKK2lucHV0LiAgVG8gZG8gc28sIGl0IHVzZXMgdGhlIGNvbmZpZ3VyZWQgCismbHQ7YSBocmVmPSZxdW90Oy4uL2lucHV0aGFuZGxlci5odG1sJnF1b3Q7Jmd0O0lucHV0SGFuZGxlciZsdDsvYSZndDsuJmx0Oy9wJmd0OworJmx0O3AmZ3Q7VGhlIHByb21wdCBjYW4gYmUgc2V0IHZpYSB0aGUgbWVzc2FnZSBhdHRyaWJ1dGUgb3IgYXMgY2hhcmFjdGVyCitkYXRhIG5lc3RlZCBpbnRvIHRoZSBlbGVtZW50LiZsdDsvcCZndDsKKyZsdDtwJmd0O09wdGlub25hbGx5IGEgc2V0IG9mIHZhbGlkIGltcHV0IGFyZ3VtZW50cyBjYW4gYmUgZGVmaW5lZCB2aWEgdGhlCit2YWxpZGFyZ3MgYXR0cmlidXRlLiBJbnB1dCB0YXNrIHdpbGwgbm8gYWNjZXB0IHZhbHVlIHRoYXQgZG9uJ3QgbWF0Y2gKK29uZSBvZiB0aGUgcHJlZGVmaW5lZC4mbHQ7L3AmZ3Q7CismbHQ7cCZndDtPcHRpb25hbGx5IGEgcHJvcGVydHkgY2FuIGJlIGNyZWF0ZWQgZnJvbSB0aGUgdmFsdWUgZW50ZXJlZCBieSB0aGUKK3VzZXIuIFRoaXMgcHJvcGVydHkgY2FuIHRoZW4gYmUgdXNlZCBkdXJpbmcgdGhlIGZvbGxvd2luZyBidWlsZAorcnVuLiBJbnB1dCBiZWhhdmVzIGFjY29yZGluZyB0byAmbHQ7YSBocmVmPSZxdW90O3Byb3BlcnR5Lmh0bWwmcXVvdDsmZ3Q7cHJvcGVydHkKK3Rhc2smbHQ7L2EmZ3Q7IHdoaWNoIG1lYW5zIHRoYXQgZXhpc3RpbmcgcHJvcGVydGllcyBjYW5ub3QgYmUgb3ZlcnJpZGVuLiZsdDsvcCZndDsKKzwvREVTQ1JJUFRJT04+CisJCTxBVFRSSUJVVEUgTkFNRT0ibWVzc2FnZSIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj50aGUgTWVzc2FnZSB3aGljaCBnZXRzIGRpc3BsYXllZCB0byB0aGUgdXNlcmR1cmluZyB0aGUgYnVpbGQgcnVuPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJ2YWxpZGFyZ3MiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+Y29tbWEgc2VwYXJhdGVkIFN0cmluZyBjb250YWluaW5nIHZhbGlkIGlucHV0YXJndW1lbnRzLiBJZiBzZXQsIGlucHV0IHRhc2sgd2lsbCByZWplY3QgYW55IGlucHV0IG5vdCBkZWZpbmVkaGVyZS4gIFZhbGlkYXJncyBhcmUgY29tcGFyZWQgY2FzZSBzZW5zaXRpdmUuIElmIHlvdSB3YW50ICdhJyBhbmQnQScgdG8gYmUgYWNjZXB0ZWQgeW91IHdpbGwgbmVlZCB0byBkZWZpbmUgYm90aCBhcmd1bWVudHMgd2l0aGludmFsaWRhcmdzPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJhZGRwcm9wZXJ0eSIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj50aGUgbmFtZSBvZiBhIHByb3BlcnR5IHRvIGJlIGNyZWF0ZWQgZnJvbWlucHV0LiBCZWhhdmlvdXIgaXMgZXF1YWwgdG8gcHJvcGVydHl0YXNrIHdoaWNoIG1lYW5zIHRoYXQgZXhpc3RpbmcgcHJvcGVydGllcyBjYW5ub3QgYmVvdmVycmlkZW48L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKwk8L1RBU0s+CisJPFRBU0sgTkFNRT0iamFyIj4KKwkJPERFU0NSSVBUSU9OPiZsdDtwJmd0O0phcnMgYSBzZXQgb2YgZmlsZXMuJmx0Oy9wJmd0OworJmx0O3AmZ3Q7VGhlICZsdDtpJmd0O2Jhc2VkaXImbHQ7L2kmZ3Q7IGF0dHJpYnV0ZSBpcyB0aGUgcmVmZXJlbmNlIGRpcmVjdG9yeSBmcm9tIHdoZXJlIHRvIGphci4mbHQ7L3AmZ3Q7CismbHQ7cCZndDtOb3RlIHRoYXQgZmlsZSBwZXJtaXNzaW9ucyB3aWxsIG5vdCBiZSBzdG9yZWQgaW4gdGhlIHJlc3VsdGluZyBqYXJmaWxlLiZsdDsvcCZndDsKKyZsdDtwJmd0O0l0IGlzIHBvc3NpYmxlIHRvIHJlZmluZSB0aGUgc2V0IG9mIGZpbGVzIHRoYXQgYXJlIGJlaW5nIGphcnJlZC4gVGhpcyBjYW4gYmUKK2RvbmUgd2l0aCB0aGUgJmx0O2kmZ3Q7aW5jbHVkZXMmbHQ7L2kmZ3Q7LCAmbHQ7aSZndDtpbmNsdWRlc2ZpbGUmbHQ7L2kmZ3Q7LCAmbHQ7aSZndDtleGNsdWRlcyZsdDsvaSZndDssICZsdDtpJmd0O2V4Y2x1ZGVzZmlsZSZsdDsvaSZndDsgYW5kICZsdDtpJmd0O2RlZmF1bHRleGNsdWRlcyZsdDsvaSZndDsKK2F0dHJpYnV0ZXMuIFdpdGggdGhlICZsdDtpJmd0O2luY2x1ZGVzJmx0Oy9pJmd0OyBvciAmbHQ7aSZndDtpbmNsdWRlc2ZpbGUmbHQ7L2kmZ3Q7IGF0dHJpYnV0ZSB5b3Ugc3BlY2lmeSB0aGUgZmlsZXMgeW91IHdhbnQgdG8KK2hhdmUgaW5jbHVkZWQgYnkgdXNpbmcgcGF0dGVybnMuIFRoZSAmbHQ7aSZndDtleGNsdWRlJmx0Oy9pJmd0OyBvciAmbHQ7aSZndDtleGNsdWRlc2ZpbGUmbHQ7L2kmZ3Q7IGF0dHJpYnV0ZSBpcyB1c2VkIHRvIHNwZWNpZnkKK3RoZSBmaWxlcyB5b3Ugd2FudCB0byBoYXZlIGV4Y2x1ZGVkLiBUaGlzIGlzIGFsc28gZG9uZSB3aXRoIHBhdHRlcm5zLiBBbmQKK2ZpbmFsbHkgd2l0aCB0aGUgJmx0O2kmZ3Q7ZGVmYXVsdGV4Y2x1ZGVzJmx0Oy9pJmd0OyBhdHRyaWJ1dGUsIHlvdSBjYW4gc3BlY2lmeSB3aGV0aGVyIHlvdQord2FudCB0byB1c2UgZGVmYXVsdCBleGNsdXNpb25zIG9yIG5vdC4gU2VlIHRoZSBzZWN0aW9uIG9uICZsdDthCitocmVmPSZxdW90Oy4uL2RpcnRhc2tzLmh0bWwjZGlyZWN0b3J5YmFzZWR0YXNrcyZxdW90OyZndDtkaXJlY3RvcnkgYmFzZWQgdGFza3MmbHQ7L2EmZ3Q7LCBvbiBob3cgdGhlCitpbmNsdXNpb24vZXhjbHVzaW9uIG9mIGZpbGVzIHdvcmtzLCBhbmQgaG93IHRvIHdyaXRlIHBhdHRlcm5zLiZsdDsvcCZndDsKKyZsdDtwJmd0O1RoaXMgdGFzayBmb3JtcyBhbiBpbXBsaWNpdCAmbHQ7YSBocmVmPSZxdW90Oy4uL0NvcmVUeXBlcy9maWxlc2V0Lmh0bWwmcXVvdDsmZ3Q7RmlsZVNldCZsdDsvYSZndDsgYW5kCitzdXBwb3J0cyBhbGwgYXR0cmlidXRlcyBvZiAmbHQ7Y29kZSZndDsmYW1wO2x0O2ZpbGVzZXQmYW1wO2d0OyZsdDsvY29kZSZndDsKKygmbHQ7Y29kZSZndDtkaXImbHQ7L2NvZGUmZ3Q7IGJlY29tZXMgJmx0O2NvZGUmZ3Q7YmFzZWRpciZsdDsvY29kZSZndDspIGFzIHdlbGwgYXMgdGhlIG5lc3RlZAorJmx0O2NvZGUmZ3Q7JmFtcDtsdDtpbmNsdWRlJmFtcDtndDsmbHQ7L2NvZGUmZ3Q7LCAmbHQ7Y29kZSZndDsmYW1wO2x0O2V4Y2x1ZGUmYW1wO2d0OyZsdDsvY29kZSZndDsgYW5kCismbHQ7Y29kZSZndDsmYW1wO2x0O3BhdHRlcm5zZXQmYW1wO2d0OyZsdDsvY29kZSZndDsgZWxlbWVudHMuJmx0Oy9wJmd0OworJmx0O3AmZ3Q7WW91IGNhbiBhbHNvIHVzZSBuZXN0ZWQgZmlsZSBzZXRzIGZvciBtb3JlIGZsZXhpYmlsaXR5LCBhbmQgc3BlY2lmeQorbXVsdGlwbGUgb25lcyB0byBtZXJnZSB0b2dldGhlciBkaWZmZXJlbnQgdHJlZXMgb2YgZmlsZXMgaW50byBvbmUgSkFSLgorVGhlIGV4dGVuZGVkIGZpbGVzZXQgYW5kIGdyb3VwZmlsZXNldCBhdHRyaWJ1dGVzIGZyb20gdGhlIHppcCB0YXNrIGFyZQorYWxzbyBhdmFpbGFibGUgaW4gdGhlIGphciB0YXNrLgorU2VlIHRoZSAmbHQ7YSBocmVmPSZxdW90O3ppcC5odG1sJnF1b3Q7Jmd0O1ppcCZsdDsvYSZndDsgdGFzayBmb3IgbW9yZSBkZXRhaWxzIGFuZCBleGFtcGxlcy4mbHQ7L3AmZ3Q7CismbHQ7cCZndDtJZiB0aGUgbWFuaWZlc3QgaXMgb21pdHRlZCwgYSBzaW1wbGUgb25lIHdpbGwgYmUgc3VwcGxpZWQgYnkgQW50LiZsdDsvcCZndDsKKyZsdDtwJmd0O1RoZSAmbHQ7Y29kZSZndDt1cGRhdGUmbHQ7L2NvZGUmZ3Q7IHBhcmFtZXRlciBjb250cm9scyB3aGF0IGhhcHBlbnMgaWYgdGhlCitKQVIgZmlsZSBhbHJlYWR5IGV4aXN0cy4gV2hlbiBzZXQgdG8gJmx0O2NvZGUmZ3Q7eWVzJmx0Oy9jb2RlJmd0OywgdGhlIEpBUiBmaWxlIGlzCit1cGRhdGVkIHdpdGggdGhlIGZpbGVzIHNwZWNpZmllZC4gV2hlbiBzZXQgdG8gJmx0O2NvZGUmZ3Q7bm8mbHQ7L2NvZGUmZ3Q7ICh0aGUKK2RlZmF1bHQpIHRoZSBKQVIgZmlsZSBpcyBvdmVyd3JpdHRlbi4gQW4gZXhhbXBsZSB1c2Ugb2YgdGhpcyBpcworcHJvdmlkZWQgaW4gdGhlICZsdDthIGhyZWY9JnF1b3Q7emlwLmh0bWwmcXVvdDsmZ3Q7WmlwIHRhc2sgZG9jdW1lbnRhdGlvbiZsdDsvYSZndDsuJmx0Oy9wJmd0OworJmx0O3AmZ3Q7KFRoZSBKYXIgdGFzayBpcyBhIHNob3J0Y3V0IGZvciBzcGVjaWZ5aW5nIHRoZSBtYW5pZmVzdCBmaWxlIG9mIGEgSkFSIGZpbGUuCitUaGUgc2FtZSB0aGluZyBjYW4gYmUgYWNjb21wbGlzaGVkIGJ5IHVzaW5nIHRoZSAmbHQ7aSZndDtmdWxscGF0aCZsdDsvaSZndDsKK2F0dHJpYnV0ZSBvZiBhIHppcGZpbGVzZXQgaW4gYSBaaXAgdGFzay4gVGhlIG9uZSBkaWZmZXJlbmNlIGlzIHRoYXQgaWYgdGhlCismbHQ7aSZndDttYW5pZmVzdCZsdDsvaSZndDsgYXR0cmlidXRlIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBKYXIgdGFzayB3aWxsCitpbmNsdWRlIGFuIGVtcHR5IG9uZSBmb3IgeW91LikmbHQ7L3AmZ3Q7CismbHQ7cCZndDtNYW5pZmVzdHMgYXJlIHByb2Nlc3NlZCBieSB0aGUgSmFyIHRhc2sgYWNjb3JkaW5nIHRvIHRoZQorJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS4zL2RvY3MvZ3VpZGUvamFyL2phci5odG1sJnF1b3Q7Jmd0O0phciBmaWxlIHNwZWNpZmljYXRpb24uJmx0Oy9hJmd0OworTm90ZSBpbiBwYXJ0aWN1bGFyIHRoYXQgdGhpcyBtYXkgcmVzdWx0IGluIG1hbmlmZXN0IGxpbmVzIGdyZWF0ZXIgdGhhbiA3MiBieXRlcworYmVpbmcgd3JhcHBlZCBhbmQgY29udGludWVkIG9uIHRoZSBuZXh0IGxpbmUuCismbHQ7L3AmZ3Q7Cis8L0RFU0NSSVBUSU9OPgorCQk8QVRUUklCVVRFIE5BTUU9ImRlc3RmaWxlIiBSRVFVSVJFRD0ieWVzIj4KKwkJCTxERVNDUklQVElPTj50aGUgSkFSIGZpbGUgdG8gY3JlYXRlPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJiYXNlZGlyIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPnRoZSBkaXJlY3RvcnkgZnJvbSB3aGljaCB0byBqYXIgdGhlIGZpbGVzPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJjb21wcmVzcyIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5Ob3Qgb25seSBzdG9yZSBkYXRhIGJ1dCBhbHNvIGNvbXByZXNzIHRoZW0sIGRlZmF1bHRzIHRvIHRydTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZW5jb2RpbmciIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+VGhlIGNoYXJhY3RlciBlbmNvZGluZyB0byB1c2UgZm9yIGZpbGVuYW1lc2luc2lkZSB0aGUgYXJjaGl2ZS4gIERlZmF1bHRzIHRvIFVURjguIEl0IGlzIG5vdHJlY29tbWVuZGVkIHRvIGNoYW5nZSB0aGlzIHZhbHVlIGFzIHRoZSBjcmVhdGVkIGFyY2hpdmUgd2lsbCBtb3N0bGlrZWx5IGJlIHVucmVhZGFibGUgZm9yIEphdmEgb3RoZXJ3aXNlPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJmaWxlc29ubHkiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+U3RvcmUgb25seSBmaWxlIGVudHJpZXMsIGRlZmF1bHRzIHRvIGZhbHM8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImluY2x1ZGVzIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPmNvbW1hLSBvciBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucyBvZiBmaWxlcyB0aGF0IG11c3QgYmVpbmNsdWRlZC4gQWxsIGZpbGVzIGFyZSBpbmNsdWRlZCB3aGVuIG9taXR0ZWQ8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImluY2x1ZGVzZmlsZSIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj50aGUgbmFtZSBvZiBhIGZpbGUuIEVhY2ggbGluZSBvZiB0aGlzIGZpbGUgaXN0YWtlbiB0byBiZSBhbiBpbmNsdWRlIHBhdHRlcjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZXhjbHVkZXMiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+Y29tbWEtIG9yIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zIG9mIGZpbGVzIHRoYXQgbXVzdCBiZWV4Y2x1ZGVkLiBObyBmaWxlcyAoZXhjZXB0IGRlZmF1bHQgZXhjbHVkZXMpIGFyZSBleGNsdWRlZCB3aGVuIG9taXR0ZWQ8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImV4Y2x1ZGVzZmlsZSIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj50aGUgbmFtZSBvZiBhIGZpbGUuIEVhY2ggbGluZSBvZiB0aGlzIGZpbGUgaXN0YWtlbiB0byBiZSBhbiBleGNsdWRlIHBhdHRlcjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZGVmYXVsdGV4Y2x1ZGVzIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPmluZGljYXRlcyB3aGV0aGVyIGRlZmF1bHQgZXhjbHVkZXMgc2hvdWxkIGJlIHVzZWQgb3Igbm90KCZxdW90O3llcyZxdW90Oy8mcXVvdDtubyZxdW90OykuIERlZmF1bHQgZXhjbHVkZXMgYXJlIHVzZWQgd2hlbiBvbWl0dGVkPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJtYW5pZmVzdCIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj50aGUgbWFuaWZlc3QgZmlsZSB0byB1c2UuICBUaGlzIGNhbiBiZSBlaXRoZXIgdGhlIGxvY2F0aW9uIG9mIGEgbWFuaWZlc3QsIG9yIHRoZSBuYW1lIG9mIGEgamFyIGFkZGVkIHRocm91Z2ggYSBmaWxlc2V0LiAgSWYgaXRzIHRoZSBuYW1lIG9mIGFuIGFkZGVkIGphciwgdGhlIHRhc2sgZXhwZWN0cyB0aGUgbWFuaWZlc3QgdG8gYmUgaW4gdGhlIGphciBhdCBNRVRBLUlORi9NQU5JRkVTVC5NPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJ1cGRhdGUiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+aW5kaWNhdGVzIHdoZXRoZXIgdG8gdXBkYXRlIG9yIG92ZXJ3cml0ZXRoZSBkZXN0aW5hdGlvbiBmaWxlIGlmIGl0IGFscmVhZHkgZXhpc3RzPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJ3aGVuZW1wdHkiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+YmVoYXZpb3Igd2hlbiBubyBmaWxlcyBtYXRjaC4gIFZhbGlkIHZhbHVlcyBhcmUgJnF1b3Q7ZmFpbCZxdW90OywgJnF1b3Q7c2tpcCZxdW90OywgYW5kICZxdW90O2NyZWF0ZSZxdW90Oy4gIERlZmF1bHQgaXMgJnF1b3Q7c2tpcCZxdW90OzwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZHVwbGljYXRlIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPmJlaGF2aW9yIHdoZW4gYSBkdXBsaWNhdGUgZmlsZSBpcyBmb3VuZC4gIFZhbGlkIHZhbHVlcyBhcmUgJnF1b3Q7YWRkJnF1b3Q7LCAmcXVvdDtwcmVzZXJ2ZSZxdW90OywgYW5kICZxdW90O2ZhaWwmcXVvdDsuICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAmcXVvdDthZGQmcXVvdDsuIDwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iaW5kZXgiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+d2hldGhlciB0byBjcmVhdGUgYW4gaW5kZXggbGlzdCB0byBzcGVlZCB1cCBjbGFzc2xvYWRpbmcuICBUaGlzIGlzIGEgSkRLIDEuMysgc3BlY2lmaWMgZmVhdHVyZS4gIERlZmF1bHRzIHRvIGZhbHNlLjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCTwvVEFTSz4KKwk8VEFTSyBOQU1FPSJqYXZhIj4KKwkJPERFU0NSSVBUSU9OPiZsdDtwJmd0O0V4ZWN1dGVzIGEgSmF2YSBjbGFzcyB3aXRoaW4gdGhlIHJ1bm5pbmcgKEFudCkgVk0gb3IgZm9ya3MgYW5vdGhlciBWTSBpZgorc3BlY2lmaWVkLiZsdDsvcCZndDsKKyZsdDtwJmd0OworSWYgb2RkIHRoaW5ncyBnbyB3cm9uZyB3aGVuIHlvdSBydW4gdGhpcyB0YXNrLCBzZXQgZm9yaz0mcXVvdDt0cnVlJnF1b3Q7IHRvIHVzZSBhIG5ldworSlZNLgorPC9ERVNDUklQVElPTj4KKwkJPEFUVFJJQlVURSBOQU1FPSJjbGFzc25hbWUiIFJFUVVJUkVEPSJlaXRoZXIgamFyIG9yIGNsYXNzbmFtZSI+CisJCQk8REVTQ1JJUFRJT04+dGhlIEphdmEgY2xhc3MgdG8gZXhlY3V0ZTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iamFyIiBSRVFVSVJFRD0iZWl0aGVyIGphciBvciBjbGFzc25hbWUiPgorCQkJPERFU0NSSVBUSU9OPnRoZSBsb2NhdGlvbiBvZiB0aGUgamFyIGZpbGUgdG8gZXhlY3V0ZSAobXVzdCBoYXZlIGEgTWFpbi1DbGFzcyBlbnRyeSBpbiB0aGUgbWFuaWZlc3QpLiBGb3JrIG11c3QgYmUgc2V0IHRvIHRydWUgaWYgdGhpcyBvcHRpb24gaXMgc2VsZWN0ZWQ8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImFyZ3MiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+dGhlIGFyZ3VtZW50cyBmb3IgdGhlIGNsYXNzIHRoYXQgaXNleGVjdXRlZC4gZGVwcmVjYXRlZCwgdXNlIG5lc3RlZCAmbHQ7YXJnJmd0O2VsZW1lbnRzIGluc3RlYWQ8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImNsYXNzcGF0aCIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj50aGUgY2xhc3NwYXRoIHRvIHVzZTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iY2xhc3NwYXRocmVmIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPnRoZSBjbGFzc3BhdGggdG8gdXNlLCBnaXZlbiBhcyByZWZlcmVuY2UgdG8gYSBQQVRIIGRlZmluZWQgZWxzZXdoZXJlPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJmb3JrIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPmlmIGVuYWJsZWQgdHJpZ2dlcnMgdGhlIGNsYXNzIGV4ZWN1dGlvbiBpbiBhbm90aGVyIFZNKGRpc2FibGVkIGJ5IGRlZmF1bHQ8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9Imp2bSIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj50aGUgY29tbWFuZCB1c2VkIHRvIGludm9rZSB0aGUgSmF2YSBWaXJ0dWFsIE1hY2hpbmUsZGVmYXVsdCBpcyAnamF2YScuICBUaGUgY29tbWFuZCBpcyByZXNvbHZlZCBieSBqYXZhLmxhbmcuUnVudGltZS5leGVjKCkuSWdub3JlZCBpZiBmb3JrIGlzIGRpc2FibGVkLjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0ianZtYXJncyIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj50aGUgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGZvcmtlZCBWTSAoaWdub3JlZGlmIGZvcmsgaXMgZGlzYWJsZWQpLiBkZXByZWNhdGVkLCB1c2UgbmVzdGVkJmx0O2p2bWFyZyZndDsgZWxlbWVudHMgaW5zdGVhZDwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0ibWF4bWVtb3J5IiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPk1heCBhbW91bnQgb2YgbWVtb3J5IHRvIGFsbG9jYXRlIHRvIHRoZSBmb3JrZWQgVk0oaWdub3JlZCBpZiBmb3JrIGlzIGRpc2FibGVkPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJmYWlsb25lcnJvciIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5TdG9wIHRoZSBidWlsZHByb2Nlc3MgaWYgdGhlIGNvbW1hbmQgZXhpdHMgd2l0aCBhcmV0dXJuY29kZSBvdGhlciB0aGFuIDAuIERlZmF1bHQgaXMgJnF1b3Q7ZmFsc2U8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImRpciIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5UaGUgZGlyZWN0b3J5IHRvIGludm9rZSB0aGUgVk0gaW4uICAoaWdub3JlZCBpZmZvcmsgaXMgZGlzYWJsZWQ8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9Im91dHB1dCIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5OYW1lIG9mIGEgZmlsZSB0byB3cml0ZSB0aGUgb3V0cHV0IHRvPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJhcHBlbmQiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+d2hldGhlciBvdXRwdXQgc2hvdWxkIGJlIGFwcGVuZGVkIHRvIG9yIG92ZXJ3cml0ZWFuIGV4aXN0aW5nIGZpbGUuICBEZWZhdWx0cyB0byBmYWxzZTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0ibmV3ZW52aXJvbm1lbnQiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+RG8gbm90IHByb3BhZ2F0ZSBvbGQgZW52aXJvbm1lbnQgd2hlbiBuZXdlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIHNwZWNpZmllZC4gRGVmYXVsdCBpcyAmcXVvdDtmYWxzZSZxdW90OyhpZ25vcmVkIGlmIGZvcmsgaXMgZGlzYWJsZWQpPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJ0aW1lb3V0IiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPlN0b3AgdGhlIGNvbW1hbmQgaWYgaXQgZG9lc24ndCBmaW5pc2ggd2l0aGluIHRoZXNwZWNpZmllZCB0aW1lIChnaXZlbiBpbiBtaWxsaXNlY29uZHMpLiAgSXQgaXMgaGlnaGx5cmVjb21tZW5kZWQgdG8gdXNlIHRoaXMgZmVhdHVyZSBvbmx5IGlmIGZvcmsgaXMgZW5hYmxlZDwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCTwvVEFTSz4KKwk8VEFTSyBOQU1FPSJqYXZhYyI+CisJCTxERVNDUklQVElPTj4mbHQ7cCZndDtDb21waWxlcyBhIEphdmEgc291cmNlIHRyZWUuJmx0Oy9wJmd0OworJmx0O3AmZ3Q7VGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gZGlyZWN0b3J5IHdpbGwgYmUgcmVjdXJzaXZlbHkgc2Nhbm5lZCBmb3IgSmF2YQorc291cmNlIGZpbGVzIHRvIGNvbXBpbGUuIE9ubHkgSmF2YSBmaWxlcyB0aGF0IGhhdmUgbm8gY29ycmVzcG9uZGluZworJmx0O2NvZGUmZ3Q7LmNsYXNzJmx0Oy9jb2RlJmd0OyBmaWxlCitvciB3aGVyZSB0aGUgY2xhc3MgZmlsZSBpcyBvbGRlciB0aGFuIHRoZQorJmx0O2NvZGUmZ3Q7LmphdmEmbHQ7L2NvZGUmZ3Q7IGZpbGUgd2lsbCBiZSBjb21waWxlZC4mbHQ7L3AmZ3Q7CismbHQ7cCZndDtOb3RlOiBBbnQgdXNlcyBvbmx5IHRoZSBuYW1lcyBvZiB0aGUgc291cmNlIGFuZCBjbGFzcyBmaWxlcyB0byBmaW5kCit0aGUgY2xhc3NlcyB0aGF0IG5lZWQgYSByZWJ1aWxkLiBJdCB3aWxsIG5vdCBzY2FuIHRoZSBzb3VyY2UgYW5kIHRoZXJlZm9yZQord2lsbCBoYXZlIG5vIGtub3dsZWRnZSBhYm91dCBuZXN0ZWQgY2xhc3NlcywgY2xhc3NlcyB0aGF0IGFyZSBuYW1lZCBkaWZmZXJlbnQKK2Zyb20gdGhlIHNvdXJjZSBmaWxlLCBhbmQgc28gb24uIFNlZSB0aGUKKyZsdDthIGhyZWY9JnF1b3Q7Li4vT3B0aW9uYWxUYXNrcy9kZXBlbmQuaHRtbCZxdW90OyZndDsmbHQ7Y29kZSZndDsmYW1wO2x0O2RlcGVuZCZhbXA7Z3Q7Jmx0Oy9jb2RlJmd0OyZsdDsvYSZndDsgdGFzaworZm9yIGRlcGVuZGVuY3kgY2hlY2tpbmcgYmFzZWQgb24gb3RoZXIgdGhhbiBqdXN0CitleGlzdGVuY2UvbW9kaWZpY2F0aW9uIHRpbWVzLiZsdDsvcCZndDsKKyZsdDtwJmd0O1doZW4gdGhlIHNvdXJjZSBmaWxlcyBhcmUgcGFydCBvZiBhIHBhY2thZ2UsIHRoZSBkaXJlY3Rvcnkgc3RydWN0dXJlIG9mCit0aGUgc291cmNlIHRyZWUgc2hvdWxkIGZvbGxvdyB0aGUgcGFja2FnZQoraGllcmFyY2h5LiZsdDsvcCZndDsKKyZsdDtwJmd0O0l0IGlzIHBvc3NpYmxlIHRvIHJlZmluZSB0aGUgc2V0IG9mIGZpbGVzIHRoYXQgYXJlIGJlaW5nIGNvbXBpbGVkLgorVGhpcyBjYW4gYmUgZG9uZSB3aXRoIHRoZSAmbHQ7Y29kZSZndDtpbmNsdWRlcyZsdDsvY29kZSZndDssICZsdDtjb2RlJmd0O2luY2x1ZGVzZmlsZSZsdDsvY29kZSZndDssCismbHQ7Y29kZSZndDtleGNsdWRlcyZsdDsvY29kZSZndDssIGFuZCAmbHQ7Y29kZSZndDtleGNsdWRlc2ZpbGUmbHQ7L2NvZGUmZ3Q7CithdHRyaWJ1dGVzLiBXaXRoIHRoZSAmbHQ7Y29kZSZndDtpbmNsdWRlcyZsdDsvY29kZSZndDsgb3IKKyZsdDtjb2RlJmd0O2luY2x1ZGVzZmlsZSZsdDsvY29kZSZndDsgYXR0cmlidXRlLCB5b3Ugc3BlY2lmeSB0aGUgZmlsZXMgeW91IHdhbnQgdG8KK2hhdmUgaW5jbHVkZWQuCitUaGUgJmx0O2NvZGUmZ3Q7ZXhjbHVkZSZsdDsvY29kZSZndDsgb3IgJmx0O2NvZGUmZ3Q7ZXhjbHVkZXNmaWxlJmx0Oy9jb2RlJmd0OyBhdHRyaWJ1dGUgaXMgdXNlZAordG8gc3BlY2lmeQordGhlIGZpbGVzIHlvdSB3YW50IHRvIGhhdmUgZXhjbHVkZWQuIEluIGJvdGggY2FzZXMsIHRoZSBsaXN0IG9mIGZpbGVzIAorY2FuIGJlIHNwZWNpZmllZCBieSBlaXRoZXIgdGhlIGZpbGVuYW1lLCByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5KHMpIHNwZWNpZmllZAoraW4gdGhlICZsdDtjb2RlJmd0O3NyY2RpciZsdDsvY29kZSZndDsgYXR0cmlidXRlIG9yIG5lc3RlZCAmbHQ7Y29kZSZndDsmYW1wO2x0O3NyYyZhbXA7Z3Q7Jmx0Oy9jb2RlJmd0OworZWxlbWVudChzKSwgb3IgYnkgdXNpbmcgd2lsZGNhcmQgcGF0dGVybnMuIFNlZSB0aGUgc2VjdGlvbiBvbgorJmx0O2EgaHJlZj0mcXVvdDsuLi9kaXJ0YXNrcy5odG1sI2RpcmVjdG9yeWJhc2VkdGFza3MmcXVvdDsmZ3Q7ZGlyZWN0b3J5LWJhc2VkIHRhc2tzJmx0Oy9hJmd0OywKK2ZvciBpbmZvcm1hdGlvbiBvbiBob3cgdGhlCitpbmNsdXNpb24vZXhjbHVzaW9uIG9mIGZpbGVzIHdvcmtzLCBhbmQgaG93IHRvIHdyaXRlIHdpbGRjYXJkIHBhdHRlcm5zLiZsdDsvcCZndDsKKyZsdDtwJmd0O0l0IGlzIHBvc3NpYmxlIHRvIHVzZSBkaWZmZXJlbnQgY29tcGlsZXJzLiBUaGlzIGNhbiBiZSBzcGVjaWZpZWQgYnkKK2VpdGhlciBzZXR0aW5nIHRoZSBnbG9iYWwgJmx0O2NvZGUmZ3Q7YnVpbGQuY29tcGlsZXImbHQ7L2NvZGUmZ3Q7IHByb3BlcnR5LCB3aGljaCB3aWxsCithZmZlY3QgYWxsICZsdDtjb2RlJmd0OyZhbXA7bHQ7amF2YWMmYW1wO2d0OyZsdDsvY29kZSZndDsgdGFza3MgdGhyb3VnaG91dCB0aGUgYnVpbGQsIG9yIGJ5CitzZXR0aW5nIHRoZSAmbHQ7Y29kZSZndDtjb21waWxlciZsdDsvY29kZSZndDsgYXR0cmlidXRlLCBzcGVjaWZpYyB0byB0aGUgY3VycmVudAorJmx0O2NvZGUmZ3Q7JmFtcDtsdDtqYXZhYyZhbXA7Z3Q7Jmx0Oy9jb2RlJmd0OyB0YXNrLgorJmx0O2EgbmFtZT0mcXVvdDtjb21waWxlcnZhbHVlcyZxdW90OyZndDtWYWxpZCB2YWx1ZXMgZm9yIGVpdGhlciB0aGUKKyZsdDtjb2RlJmd0O2J1aWxkLmNvbXBpbGVyJmx0Oy9jb2RlJmd0OyBwcm9wZXJ0eSBvciB0aGUgJmx0O2NvZGUmZ3Q7Y29tcGlsZXImbHQ7L2NvZGUmZ3Q7CithdHRyaWJ1dGUgYXJlOiZsdDsvYSZndDsmbHQ7L3AmZ3Q7CismbHQ7dWwmZ3Q7CismbHQ7bGkmZ3Q7Jmx0O2NvZGUmZ3Q7Y2xhc3NpYyZsdDsvY29kZSZndDsgKHRoZSBzdGFuZGFyZCBjb21waWxlciBvZiBKREsgMS4xLzEuMikgJmFtcDtuZGFzaDsKKyZsdDtjb2RlJmd0O2phdmFjMS4xJmx0Oy9jb2RlJmd0OyBhbmQKKyZsdDtjb2RlJmd0O2phdmFjMS4yJmx0Oy9jb2RlJmd0OyBjYW4gYmUgdXNlZCBhcyBhbGlhc2VzLiZsdDsvbGkmZ3Q7CismbHQ7bGkmZ3Q7Jmx0O2NvZGUmZ3Q7bW9kZXJuJmx0Oy9jb2RlJmd0OyAodGhlIHN0YW5kYXJkIGNvbXBpbGVyIG9mIEpESyAxLjMvMS40KSAmYW1wO25kYXNoOworJmx0O2NvZGUmZ3Q7amF2YWMxLjMmbHQ7L2NvZGUmZ3Q7IGFuZAorJmx0O2NvZGUmZ3Q7amF2YWMxLjQmbHQ7L2NvZGUmZ3Q7IGNhbiBiZSB1c2VkIGFzIGFsaWFzZXMuJmx0Oy9saSZndDsKKyZsdDtsaSZndDsmbHQ7Y29kZSZndDtqaWtlcyZsdDsvY29kZSZndDsgKHRoZSAmbHQ7YQoraHJlZj0mcXVvdDtodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9qaWtlcy8mcXVvdDsgdGFyZ2V0PSZxdW90O190b3AmcXVvdDsmZ3Q7SmlrZXMmbHQ7L2EmZ3Q7Citjb21waWxlcikuJmx0Oy9saSZndDsKKyZsdDtsaSZndDsmbHQ7Y29kZSZndDtqdmMmbHQ7L2NvZGUmZ3Q7ICh0aGUgQ29tbWFuZC1MaW5lIENvbXBpbGVyIGZyb20gTWljcm9zb2Z0J3MgU0RLCitmb3IgSmF2YSAvIFZpc3VhbCBKKyspICZhbXA7bmRhc2g7ICZsdDtjb2RlJmd0O21pY3Jvc29mdCZsdDsvY29kZSZndDsgY2FuIGJlIHVzZWQKK2FzIGFuIGFsaWFzLiZsdDsvbGkmZ3Q7CismbHQ7bGkmZ3Q7Jmx0O2NvZGUmZ3Q7a2pjJmx0Oy9jb2RlJmd0OyAodGhlICZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5kbXMuYXQva29waS8mcXVvdDsgdGFyZ2V0PSZxdW90O190b3AmcXVvdDsmZ3Q7a29waSZsdDsvYSZndDsKK2NvbXBpbGVyKS4mbHQ7L2xpJmd0OworJmx0O2xpJmd0OyZsdDtjb2RlJmd0O2djaiZsdDsvY29kZSZndDsgKHRoZSBnY2ogY29tcGlsZXIgZnJvbSBnY2MpLiZsdDsvbGkmZ3Q7CismbHQ7bGkmZ3Q7Jmx0O2NvZGUmZ3Q7c2ombHQ7L2NvZGUmZ3Q7IChTeW1hbnRlYyBqYXZhIGNvbXBpbGVyKSAmYW1wO25kYXNoOworJmx0O2NvZGUmZ3Q7c3ltYW50ZWMmbHQ7L2NvZGUmZ3Q7IGNhbiBiZSB1c2VkIGFzIGFuIGFsaWFzLiZsdDsvbGkmZ3Q7CismbHQ7bGkmZ3Q7Jmx0O2NvZGUmZ3Q7ZXh0SmF2YWMmbHQ7L2NvZGUmZ3Q7IChydW4gZWl0aGVyIG1vZGVybiBvciBjbGFzc2ljIGluIGEgSlZNIG9mCitpdHMgb3duKS4mbHQ7L2xpJmd0OworJmx0Oy91bCZndDsKKyZsdDtwJmd0O1RoZSBkZWZhdWx0IGlzICZsdDtjb2RlJmd0O2phdmFjMS54Jmx0Oy9jb2RlJmd0OyB3aXRoICZsdDtjb2RlJmd0O3gmbHQ7L2NvZGUmZ3Q7IGRlcGVuZGluZworb24gdGhlIEpESyB2ZXJzaW9uIHlvdSB1c2Ugd2hpbGUgeW91IGFyZSBydW5uaW5nIEFudC4KK0lmIHlvdSB3aXNoIHRvIHVzZSBhIGRpZmZlcmVudCBjb21waWxlciBpbnRlcmZhY2UgdGhhbiB0aG9zZQorc3VwcGxpZWQsIHlvdSBjYW4gd3JpdGUgYSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIENvbXBpbGVyQWRhcHRlciBpbnRlcmZhY2UKKygmbHQ7Y29kZSZndDtwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbXBpbGVycyZsdDsvY29kZSZndDspLiBTdXBwbHkgdGhlIGZ1bGwKK2NsYXNzbmFtZSBpbiB0aGUgJmx0O2NvZGUmZ3Q7YnVpbGQuY29tcGlsZXImbHQ7L2NvZGUmZ3Q7IHByb3BlcnR5IG9yIHRoZQorJmx0O2NvZGUmZ3Q7Y29tcGlsZXImbHQ7L2NvZGUmZ3Q7IGF0dHJpYnV0ZS4KKyZsdDsvcCZndDsKKyZsdDtwJmd0O1RoZSBmb3JrIGF0dHJpYnV0ZSBvdmVycmlkZXMgdGhlICZsdDtjb2RlJmd0O2J1aWxkLmNvbXBpbGVyJmx0Oy9jb2RlJmd0OyBwcm9wZXJ0eQorb3IgJmx0O2NvZGUmZ3Q7Y29tcGlsZXImbHQ7L2NvZGUmZ3Q7IGF0dHJpYnV0ZSBzZXR0aW5nIGFuZAorZXhwZWN0cyBhIEpESzEuMSBvciBoaWdoZXIgdG8gYmUgc2V0IGluICZsdDtjb2RlJmd0O0pBVkFfSE9NRSZsdDsvY29kZSZndDsuCismbHQ7L3AmZ3Q7CismbHQ7cCZndDtZb3UgY2FuIGFsc28gdXNlIHRoZSAmbHQ7Y29kZSZndDtjb21waWxlciZsdDsvY29kZSZndDsgYXR0cmlidXRlIHRvIHRlbGwgQW50Cit3aGljaCBKREsgdmVyc2lvbiBpdCBzaGFsbCBhc3N1bWUgd2hlbiBpdCBwdXRzIHRvZ2V0aGVyIHRoZSBjb21tYW5kCitsaW5lIHN3aXRjaGVzIC0gZXZlbiBpZiB5b3Ugc2V0ICZsdDtjb2RlJmd0O2Zvcms9JmFtcDtxdW90O3RydWUmYW1wO3F1b3Q7Jmx0Oy9jb2RlJmd0Oy4KK1RoaXMgaXMgdXNlZnVsIGlmIHlvdSB3YW50IHRvIHJ1biB0aGUgY29tcGlsZXIgb2YgSkRLIDEuMSB3aGlsZSB5b3UKK2N1cnJlbnQgSkRLIGlzIDEuMisuICBJZiB5b3UgdXNlCismbHQ7Y29kZSZndDtjb21waWxlcj0mYW1wO3F1b3Q7amF2YWMxLjEmYW1wO3F1b3Q7Jmx0Oy9jb2RlJmd0OyBhbmQgKGZvciBleGFtcGxlKQorJmx0O2NvZGUmZ3Q7ZGVwZW5kPSZhbXA7cXVvdDt0cnVlJmFtcDtxdW90OyZsdDsvY29kZSZndDsgQW50IHdpbGwgdXNlIHRoZSBjb21tYW5kIGxpbmUKK3N3aXRjaCAmbHQ7Y29kZSZndDstZGVwZW5kJmx0Oy9jb2RlJmd0OyBpbnN0ZWFkIG9mICZsdDtjb2RlJmd0Oy1YZGVwZW5kJmx0Oy9jb2RlJmd0Oy4mbHQ7L3AmZ3Q7CismbHQ7cCZndDtUaGlzIHRhc2sgd2lsbCBkcm9wIGFsbCBlbnRyaWVzIHRoYXQgcG9pbnQgdG8gbm9uLWV4aXN0ZW50CitmaWxlcy9kaXJlY3RvcmllcyBmcm9tIHRoZSBjbGFzc3BhdGggaXQgcGFzc2VzIHRvIHRoZSBjb21waWxlci4mbHQ7L3AmZ3Q7CismbHQ7cCZndDsmbHQ7c3Ryb25nJmd0O1dpbmRvd3MgTm90ZTombHQ7L3N0cm9uZyZndDtXaGVuIHRoZSBtb2Rlcm4gY29tcGlsZXIgaXMgdXNlZAoraW4gdW5mb3JrZWQgbW9kZSBvbiBXaW5kb3dzLCBpdCBsb2NrcyB1cCB0aGUgZmlsZXMgcHJlc2VudCBpbiB0aGUKK2NsYXNzcGF0aCBvZiB0aGUgJmx0O2NvZGUmZ3Q7JmFtcDtsdDtqYXZhYyZhbXA7Z3Q7Jmx0Oy9jb2RlJmd0OyB0YXNrLCBhbmQgZG9lcyBub3QgcmVsZWFzZSB0aGVtLgorVGhlIHNpZGUgZWZmZWN0IG9mIHRoaXMgaXMgdGhhdCB5b3Ugd2lsbCBub3QgYmUgYWJsZSB0byBkZWxldGUgb3IgbW92ZQordGhvc2UgZmlsZXMgbGF0ZXIgb24gaW4gdGhlIGJ1aWxkLiAgVGhlIHdvcmthcm91bmQgaXMgdG8gZm9yayB3aGVuCitpbnZva2luZyB0aGUgY29tcGlsZXIuJmx0Oy9wJmd0OworPC9ERVNDUklQVElPTj4KKwkJPEFUVFJJQlVURSBOQU1FPSJzcmNkaXIiIFJFUVVJUkVEPSJ5ZXMsIHVubGVzcyBuZXN0ZWQgJmx0O3NyYyZndDsgZWxlbWVudHMgYXJlIHByZXNlbnQuIj4KKwkJCTxERVNDUklQVElPTj5Mb2NhdGlvbiBvZiB0aGUgamF2YSBmaWxlcy4gKFNlZSB0aGVub3RlIGJlbG93LjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZGVzdGRpciIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5Mb2NhdGlvbiB0byBzdG9yZSB0aGUgY2xhc3MgZmlsZXM8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImluY2x1ZGVzIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPkNvbW1hLSBvciBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBmaWxlcyAobWF5IGJlIHNwZWNpZmllZCB1c2luZ3dpbGRjYXJkIHBhdHRlcm5zKSB0aGF0IG11c3QgYmVpbmNsdWRlZDsgYWxsIC5qYXZhIGZpbGVzIGFyZSBpbmNsdWRlZCB3aGVuIG9taXR0ZWQ8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImluY2x1ZGVzZmlsZSIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5UaGUgbmFtZSBvZiBhIGZpbGUgdGhhdCBjb250YWlucyBhIGxpc3Qgb2YgZmlsZXMgdG9pbmNsdWRlIChtYXkgYmUgc3BlY2lmaWVkIHVzaW5nIHdpbGRjYXJkIHBhdHRlcm5zKTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZXhjbHVkZXMiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+Q29tbWEtIG9yIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIGZpbGVzIChtYXkgYmUgc3BlY2lmaWVkIHVzaW5nd2lsZGNhcmQgcGF0dGVybnMpIHRoYXQgbXVzdCBiZSBleGNsdWRlZDsgbm8gZmlsZXMgKGV4Y2VwdCBkZWZhdWx0ZXhjbHVkZXMpIGFyZSBleGNsdWRlZCB3aGVuIG9taXR0ZWQ8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImV4Y2x1ZGVzZmlsZSIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5UaGUgbmFtZSBvZiBhIGZpbGUgdGhhdCBjb250YWlucyBhIGxpc3Qgb2YgZmlsZXMgdG9leGNsdWRlIChtYXkgYmUgc3BlY2lmaWVkIHVzaW5nIHdpbGRjYXJkIHBhdHRlcm5zKTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iY2xhc3NwYXRoIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPlRoZSBjbGFzc3BhdGggdG8gdXNlPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJzb3VyY2VwYXRoIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPlRoZSBzb3VyY2VwYXRoIHRvIHVzZTsgZGVmYXVsdHMgdG8gdGhlIHZhbHVlIG9mIHRoZSBzcmNkaXIgYXR0cmlidXRlIChvciBuZXN0ZWQgJmx0O3NyYyZndDsgZWxlbWVudHMpLlRvIHN1cHByZXNzIHRoZSBzb3VyY2VwYXRoIHN3aXRjaCwgdXNlIHNvdXJjZXBhdGg9JnF1b3Q7JnF1b3Q7PC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJib290Y2xhc3NwYXRoIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPkxvY2F0aW9uIG9mIGJvb3RzdHJhcCBjbGFzcyBmaWxlczwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iY2xhc3NwYXRocmVmIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPlRoZSBjbGFzc3BhdGggdG8gdXNlLCBnaXZlbiBhcyBhcmVmZXJlbmNlIHRvIGEgcGF0aCBkZWZpbmVkIGVsc2V3aGVyZTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0ic291cmNlcGF0aHJlZiIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5UaGUgc291cmNlcGF0aCB0byB1c2UsIGdpdmVuIGFzIGFyZWZlcmVuY2UgdG8gYSBwYXRoIGRlZmluZWQgZWxzZXdoZXJlPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJib290Y2xhc3NwYXRocmVmIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPkxvY2F0aW9uIG9mIGJvb3RzdHJhcCBjbGFzcyBmaWxlcywgZ2l2ZW4gYXMgYXJlZmVyZW5jZSB0byBhIHBhdGggZGVmaW5lZCBlbHNld2hlcmU8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImV4dGRpcnMiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+TG9jYXRpb24gb2YgaW5zdGFsbGVkIGV4dGVuc2lvbnM8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImVuY29kaW5nIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPkVuY29kaW5nIG9mIHNvdXJjZSBmaWxlcy4gKE5vdGU6IGdjaiBkb2Vzbid0IHN1cHBvcnR0aGlzIG9wdGlvbiB5ZXQuPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJub3dhcm4iIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+SW5kaWNhdGVzIHdoZXRoZXIgdGhlIC1ub3dhcm4gc3dpdGNoc2hvdWxkIGJlIHBhc3NlZCB0byB0aGUgY29tcGlsZXI7IGRlZmF1bHRzIHRvIG9mZjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZGVidWciIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+SW5kaWNhdGVzIHdoZXRoZXIgc291cmNlIHNob3VsZCBiZSBjb21waWxlZCB3aXRoIGRlYnVnaW5mb3JtYXRpb247IGRlZmF1bHRzIHRvIG9mZjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZGVidWdsZXZlbCIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5LZXl3b3JkIGxpc3QgdG8gYmUgYXBwZW5kZWQgdG8gdGhlIC1nY29tbWFuZC1saW5lIHN3aXRjaC4gIFRoaXMgd2lsbCBiZSBpZ25vcmVkIGJ5IGFsbCBpbXBsZW1lbnRhdGlvbnMgZXhjZXB0bW9kZXJuIGFuZCBjbGFzc2ljKHZlciAmZ3Q7PSAxLjIpLkxlZ2FsIHZhbHVlcyBhcmUgbm9uZSBvciBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHRoZWZvbGxvd2luZyBrZXl3b3JkczpsaW5lcywgdmFycywgYW5kIHNvdXJjZS5JZiBkZWJ1Z2xldmVsIGlzIG5vdCBzcGVjaWZpZWQsIGJ5IGRlZmF1bHQsOm5vbmUgd2lsbCBiZWFwcGVuZGVkIHRvIC1nLiAgSWYgZGVidWcgaXMgbm90IHR1cm5lZCBvbix0aGlzIGF0dHJpYnV0ZSB3aWxsIGJlIGlnbm9yZWQuPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJvcHRpbWl6ZSIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5JbmRpY2F0ZXMgd2hldGhlciBzb3VyY2Ugc2hvdWxkIGJlIGNvbXBpbGVkIHdpdGhvcHRpbWl6YXRpb247IGRlZmF1bHRzIHRvIG9mZjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZGVwcmVjYXRpb24iIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+SW5kaWNhdGVzIHdoZXRoZXIgc291cmNlIHNob3VsZCBiZSBjb21waWxlZCB3aXRoZGVwcmVjYXRpb24gaW5mb3JtYXRpb247IGRlZmF1bHRzIHRvIG9mZjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0idGFyZ2V0IiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPkdlbmVyYXRlIGNsYXNzIGZpbGVzIGZvciBzcGVjaWZpYyBWTSB2ZXJzaW9uKGUuZy4sIDEuMSBvciAxLjIpLiBOb3RlIHRoYXQgdGhlZGVmYXVsdCB2YWx1ZSBkZXBlbmRzIG9uIHRoZSBKVk0gdGhhdCBpcyBydW5uaW5nIEFudC4gIElucGFydGljdWxhciwgaWYgeW91IHVzZSBKREsgMS40IHRoZSBnZW5lcmF0ZWQgY2xhc3NlcyB3aWxsIG5vdCBiZXVzYWJsZSBmb3IgYSAxLjEgSmF2YSBWTSB1bmxlc3MgeW91IGV4cGxpY2l0bHkgc2V0IHRoaXMgYXR0cmlidXRldG8gdGhlIHZhbHVlIDEuMSAod2hpY2ggaXMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIEpESyAxLjEgdG8xLjMpPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJ2ZXJib3NlIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPkFza3MgdGhlIGNvbXBpbGVyIGZvciB2ZXJib3NlIG91dHB1dDwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZGVwZW5kIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPkVuYWJsZXMgZGVwZW5kZW5jeS10cmFja2luZ2ZvciBjb21waWxlcnMgdGhhdCBzdXBwb3J0IHRoaXMgKGppa2VzIGFuZGNsYXNzaWMpPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJpbmNsdWRlYW50cnVudGltZSIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5XaGV0aGVyIHRvIGluY2x1ZGUgdGhlIEFudCBydW4tdGltZSBsaWJyYXJpZXMgaW4gdGhlY2xhc3NwYXRoOyBkZWZhdWx0cyB0byB5ZXM8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImluY2x1ZGVqYXZhcnVudGltZSIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5XaGV0aGVyIHRvIGluY2x1ZGUgdGhlIGRlZmF1bHQgcnVuLXRpbWVsaWJyYXJpZXMgZnJvbSB0aGUgZXhlY3V0aW5nIFZNIGluIHRoZSBjbGFzc3BhdGg7ZGVmYXVsdHMgdG8geWVzPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJmb3JrIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPldoZXRoZXIgdG8gZXhlY3V0ZSBqYXZhYyB1c2luZyB0aGVKREsgY29tcGlsZXIgZXh0ZXJuYWxseTsgZGVmYXVsdHMgdG8gbm88L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImV4ZWN1dGFibGUiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+Q29tcGxldGUgcGF0aCB0byB0aGUgamF2YWNleGVjdXRhYmxlIHRvIHVzZSBpbiBjYXNlIG9mIGZvcms9JnF1b3Q7eWVzJnF1b3Q7LkRlZmF1bHRzIHRvIHRoZSBjb21waWxlciBvZiB0aGUgSmF2YSB2ZXJzaW9uIHRoYXQgaXMgY3VycmVudGx5cnVubmluZyBBbnQuICBJZ25vcmVkIGlmIGZvcms9JnF1b3Q7bm88L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9Im1lbW9yeWluaXRpYWxzaXplIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPlRoZSBpbml0aWFsIHNpemUgb2YgdGhlIG1lbW9yeSBmb3IgdGhlIHVuZGVybHlpbmcgVk0saWYgamF2YWMgaXMgcnVuIGV4dGVybmFsbHk7IGlnbm9yZWQgb3RoZXJ3aXNlLiBEZWZhdWx0c3RvIHRoZSBzdGFuZGFyZCBWTSBtZW1vcnkgc2V0dGluZy4oRXhhbXBsZXM6IDgzODg2MDgwLCA4MTkyMGssIG9yODBtPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJtZW1vcnltYXhpbXVtc2l6ZSIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5UaGUgbWF4aW11bSBzaXplIG9mIHRoZSBtZW1vcnkgZm9yIHRoZSB1bmRlcmx5aW5nIFZNLGlmIGphdmFjIGlzIHJ1biBleHRlcm5hbGx5OyBpZ25vcmVkIG90aGVyd2lzZS4gRGVmYXVsdHN0byB0aGUgc3RhbmRhcmQgVk0gbWVtb3J5IHNldHRpbmcuKEV4YW1wbGVzOiA4Mzg4NjA4MCwgODE5MjBrLCBvcjgwbTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZmFpbG9uZXJyb3IiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+SW5kaWNhdGVzIHdoZXRoZXIgdGhlIGJ1aWxkIHdpbGwgY29udGludWUgZXZlbiBpZiB0aGVyZSBhcmUgY29tcGlsYXRpb24gZXJyb3JzOyBkZWZhdWx0cyB0byB0cnVlLjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0ic291cmNlIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPlZhbHVlIG9mIHRoZSAtc291cmNlIGNvbW1hbmQtbGluZXN3aXRjaDsgd2lsbCBiZSBpZ25vcmVkIGJ5IGFsbCBpbXBsZW1lbnRhdGlvbnMgZXhjZXB0amF2YWMxLjQgKG9yIG1vZGVybiB3aGVuIEFudCBpcyBub3RydW5uaW5nIGluIGEgMS4zIFZNKSBhbmQgamlrZXNJZiB5b3UgdXNlIHRoaXNhdHRyaWJ1dGUgdG9nZXRoZXIgd2l0aCBqaWtlcywgeW91IG11c3QgbWFrZSBzdXJldGhhdCB5b3VyIHZlcnNpb24gb2YgamlrZXMgc3VwcG9ydHMgdGhlIC1zb3VyY2Vzd2l0Y2hMZWdhbCB2YWx1ZXMgYXJlIDEuMyBhbmQgMS40JmFtcDtuZGFzaDsgYnkgZGVmYXVsdCwgbm8gLXNvdXJjZSBhcmd1bWVudCB3aWxsIGJlIHVzZWRhdCBhbGw8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImNvbXBpbGVyIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPlRoZSBjb21waWxlciBpbXBsZW1lbnRhdGlvbiB0byB1c2UuSWYgdGhpcyBhdHRyaWJ1dGUgaXMgbm90IHNldCwgdGhlIHZhbHVlIG9mIHRoZWJ1aWxkLmNvbXBpbGVyIHByb3BlcnR5LCBpZiBzZXQsIHdpbGwgYmUgdXNlZC5PdGhlcndpc2UsIHRoZSBkZWZhdWx0IGNvbXBpbGVyIGZvciB0aGUgY3VycmVudCBWTSB3aWxsIGJlIHVzZWQuKFNlZSB0aGUgYWJvdmUgbGlzdCBvZiB2YWxpZGNvbXBpbGVycy48L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9Imxpc3RmaWxlcyIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5JbmRpY2F0ZXMgd2hldGhlciB0aGUgc291cmNlIGZpbGVzIHRvIGJlIGNvbXBpbGVkIHdpbGxiZSBsaXN0ZWQ7IGRlZmF1bHRzIHRvIG5vPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisJPC9UQVNLPgorCTxUQVNLIE5BTUU9ImphdmFkb2MiPgorCQk8REVTQ1JJUFRJT04+Jmx0O3AmZ3Q7R2VuZXJhdGVzIGNvZGUgZG9jdW1lbnRhdGlvbiB1c2luZyB0aGUgamF2YWRvYyB0b29sLiZsdDsvcCZndDsKKyZsdDtwJmd0O1RoZSBzb3VyY2UgZGlyZWN0b3J5IHdpbGwgYmUgcmVjdXJzaXZlbHkgc2Nhbm5lZCBmb3IgSmF2YSBzb3VyY2UgZmlsZXMgdG8gcHJvY2VzcworYnV0IG9ubHkgdGhvc2UgbWF0Y2hpbmcgdGhlIGluY2x1c2lvbiBydWxlcywgYW5kIG5vdCBtYXRjaGluZyB0aGUgZXhjbHVzaW9ucyBydWxlcword2lsbCBiZSBwYXNzZWQgdG8gdGhlIGphdmFkb2MgdG9vbC4gVGhpcworYWxsb3dzIHdpbGRjYXJkcyB0byBiZSB1c2VkIHRvIGNob29zZSBiZXR3ZWVuIHBhY2thZ2UgbmFtZXMsIHJlZHVjaW5nIHZlcmJvc2l0eQorYW5kIG1hbmFnZW1lbnQgY29zdHMgb3ZlciB0aW1lLiBUaGlzIHRhc2ssIGhvd2V2ZXIsIGhhcyBubyBub3Rpb24gb2YKKyZhbXA7cXVvdDtjaGFuZ2VkJmFtcDtxdW90OyBmaWxlcywgdW5saWtlIHRoZSAmbHQ7YSBocmVmPSZxdW90O2phdmFjLmh0bWwmcXVvdDsmZ3Q7amF2YWMmbHQ7L2EmZ3Q7IHRhc2suIFRoaXMgbWVhbnMKK2FsbCBwYWNrYWdlcyB3aWxsIGJlIHByb2Nlc3NlZCBlYWNoIHRpbWUgdGhpcyB0YXNrIGlzIHJ1bi4gSW4gZ2VuZXJhbCwgaG93ZXZlciwKK3RoaXMgdGFzayBpcyB1c2VkIG11Y2ggbGVzcyBmcmVxdWVudGx5LiZsdDsvcCZndDsKKyZsdDtwJmd0O1RoaXMgdGFzayB3b3JrcyBzZWFtbGVzc2x5IGJldHdlZW4gZGlmZmVyZW50IGphdmFkb2MgdmVyc2lvbnMgKDEuMSwKKzEuMiBhbmQgMS40KSwgd2l0aCB0aGUgb2J2aW91cyByZXN0cmljdGlvbiB0aGF0IHRoZSAxLjIgYXR0cmlidXRlcword2lsbCBiZSBpZ25vcmVkIGlmIHJ1biBpbiBhIDEuMSBWTS4mbHQ7L3AmZ3Q7CismbHQ7cCZndDtOT1RFOiBzaW5jZSBqYXZhZG9jIGNhbGxzIFN5c3RlbS5leGl0KCksIGphdmFkb2MgY2Fubm90IGJlIHJ1biBpbnNpZGUgdGhlCitzYW1lIFZNIGFzIGFudCB3aXRob3V0IGJyZWFraW5nIGZ1bmN0aW9uYWxpdHkuIEZvciB0aGlzIHJlYXNvbiwgdGhpcyB0YXNrIAorYWx3YXlzIGZvcmtzIHRoZSBWTS4gVGhpcyBvdmVyaGVhZCBpcyBub3Qgc2lnbmlmaWNhbnQgc2luY2UgamF2YWRvYyBpcyBub3JtYWxseSBhIGhlYXZ5CithcHBsaWNhdGlvbiBhbmQgd2lsbCBiZSBjYWxsZWQgaW5mcmVxdWVudGx5LiZsdDsvcCZndDsKKyZsdDtwJmd0O05PVEU6IHRoZSBwYWNrYWdlbGlzdCBhdHRyaWJ1dGUgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZSBsaXN0IG9mIHBhY2thZ2VzIHRvIAorZG9jdW1lbnQgb3V0c2lkZSBvZiB0aGUgQW50IGZpbGUuIEl0J3MgYSBtdWNoIGJldHRlciBwcmFjdGljZSB0byBpbmNsdWRlIGV2ZXJ5dGhpbmcgCitpbnNpZGUgdGhlIGJ1aWxkLnhtbCBmaWxlLiBUaGlzIG9wdGlvbiB3YXMgYWRkZWQgaW4gb3JkZXIgdG8gbWFrZSBpdCBlYXNpZXIgdG8gCittaWdyYXRlIGZyb20gcmVndWxhciBtYWtlZmlsZXMsIHdoZXJlIHlvdSB3b3VsZCB1c2UgdGhpcyBvcHRpb24gb2YgamF2YWRvYy4gCitUaGUgcGFja2FnZXMgbGlzdGVkIGluIHBhY2thZ2VsaXN0IGFyZSBub3QgY2hlY2tlZCwgc28gdGhlIHRhc2sgcGVyZm9ybXMgZXZlbiAKK2lmIHNvbWUgcGFja2FnZXMgYXJlIG1pc3Npbmcgb3IgYnJva2VuLiBVc2UgdGhpcyBvcHRpb24gaWYgeW91IHdpc2ggdG8gY29udmVydCBmcm9tIAorYW4gZXhpc3RpbmcgbWFrZWZpbGUuIE9uY2UgdGhpbmdzIGFyZSBydW5uaW5nIHlvdSBzaG91bGQgdGhlbiBzd2l0Y2ggdG8gdGhlIHJlZ3VsYXIgCitub3RhdGlvbi4gJmx0Oy9wJmd0OworJmx0O3AmZ3Q7Jmx0O2kmZ3Q7Jmx0O2ImZ3Q7REVQUkVDQVRJT046Jmx0Oy9iJmd0OyB0aGUgamF2YWRvYzIgdGFzayBzaW1wbHkgcG9pbnRzIHRvIHRoZSBqYXZhZG9jIHRhc2sgYW5kIGl0J3MKK3RoZXJlIGZvciBiYWNrIGNvbXBhdGliaWxpdHkgcmVhc29ucy4gU2luY2UgdGhpcyB0YXNrIHdpbGwgYmUgcmVtb3ZlZCBpbiBmdXR1cmUKK3ZlcnNpb25zLCB5b3UgYXJlIHN0cm9uZ2x5IGVuY291cmFnZWQgdG8gdXNlICZsdDthIGhyZWY9JnF1b3Q7amF2YWRvYy5odG1sJnF1b3Q7Jmd0O2phdmFkb2MmbHQ7L2EmZ3Q7CitpbnN0ZWFkLiZsdDsvaSZndDsmbHQ7L3AmZ3Q7CismbHQ7cCZndDtJbiB0aGUgdGFibGUgYmVsb3csIDEuMSBtZWFucyBhdmFpbGFibGUgaWYgeW91ciBjdXJyZW50IEphdmEgVk0gaXMKK2EgMS4xIFZNLCAxLjIgZm9yIGVpdGhlciAxLjIgb3IgMS4zIGFuZCAxLjQgZm9yIGEgMS40IEphdmEgVk0uICAxLjIrCittZWFucyBhbnkgVk0gb2YgYXQgbGVhc3QgdmVyc2lvbiAxLjIuJmx0Oy9wJmd0OworPC9ERVNDUklQVElPTj4KKwkJPEFUVFJJQlVURSBOQU1FPSJzb3VyY2VwYXRoIiBSRVFVSVJFRD0iYXQgbGVhc3Qgb25lIG9mIHRoZSB0aHJlZSBvciBuZXN0ZWQKKyAgICAgJmx0O3NvdXJjZXBhdGgmZ3Q7LCAmbHQ7ZmlsZXNldCZndDsgb3IKKyAgICAgJmx0O3BhY2thZ2VzZXQmZ3Q7Ij4KKwkJCTxERVNDUklQVElPTj5TcGVjaWZ5IHdoZXJlIHRvIGZpbmQgc291cmNlIGZpbGU8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9InNvdXJjZXBhdGhyZWYiIFJFUVVJUkVEPSIiPgorCQkJPERFU0NSSVBUSU9OPlNwZWNpZnkgd2hlcmUgdG8gZmluZCBzb3VyY2UgZmlsZXMgYnkgcmVmZXJlbmNlIHRvIGEgUEFUSCBkZWZpbmVkIGVsc2V3aGVyZTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0ic291cmNlZmlsZXMiIFJFUVVJUkVEPSIiPgorCQkJPERFU0NSSVBUSU9OPkNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIHNvdXJjZSBmaWxlPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJkZXN0ZGlyIiBSRVFVSVJFRD0ieWVzLCB1bmxlc3MgYSBkb2NsZXQgaGFzIGJlZW4gc3BlY2lmaWVkLiI+CisJCQk8REVTQ1JJUFRJT04+RGVzdGluYXRpb24gZGlyZWN0b3J5IGZvciBvdXRwdXQgZmlsZTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0ibWF4bWVtb3J5IiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPk1heCBhbW91bnQgb2YgbWVtb3J5IHRvIGFsbG9jYXRlIHRvIHRoZSBqYXZhZG9jIFY8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9InBhY2thZ2VuYW1lcyIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5Db21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBwYWNrYWdlIGZpbGVzICh3aXRoIHRlcm1pbmF0aW5nd2lsZGNhcmQ8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9InBhY2thZ2VsaXN0IiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPlRoZSBuYW1lIG9mIGEgZmlsZSBjb250YWluaW5nIHRoZSBwYWNrYWdlcyB0byBwcm9jZXM8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImNsYXNzcGF0aCIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5TcGVjaWZ5IHdoZXJlIHRvIGZpbmQgdXNlciBjbGFzcyBmaWxlPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJib290Y2xhc3NwYXRoIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPk92ZXJyaWRlIGxvY2F0aW9uIG9mIGNsYXNzIGZpbGVzIGxvYWRlZCBieSB0aGUgYm9vdHN0cmFwY2xhc3MgbG9hZGU8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImNsYXNzcGF0aHJlZiIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5TcGVjaWZ5IHdoZXJlIHRvIGZpbmQgdXNlciBjbGFzcyBmaWxlcyBieSByZWZlcmVuY2UgdG8gYSBQQVRIIGRlZmluZWQgZWxzZXdoZXJlPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJib290Y2xhc3NwYXRocmVmIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPk92ZXJyaWRlIGxvY2F0aW9uIG9mIGNsYXNzIGZpbGVzIGxvYWRlZCBieSB0aGVib290c3RyYXAgY2xhc3MgbG9hZGVyIGJ5IHJlZmVyZW5jZSB0byBhUEFUSCBkZWZpbmVkIGVsc2V3aGVyZTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZXh0ZGlycyIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5PdmVycmlkZSBsb2NhdGlvbiBvZiBpbnN0YWxsZWQgZXh0ZW5zaW9uPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJvdmVydmlldyIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5SZWFkIG92ZXJ2aWV3IGRvY3VtZW50YXRpb24gZnJvbSBIVE1MIGZpbDwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iYWNjZXNzIiBSRVFVSVJFRD0ibm8gKGRlZmF1bHQgcHJvdGVjdGVkKSI+CisJCQk8REVTQ1JJUFRJT04+QWNjZXNzIG1vZGU6IG9uZSBvZiBwdWJsaWMsIHByb3RlY3RlZCxwYWNrYWdlLCBvciBwcml2YXQ8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9InB1YmxpYyIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5TaG93IG9ubHkgcHVibGljIGNsYXNzZXMgYW5kIG1lbWJlcjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0icHJvdGVjdGVkIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPlNob3cgcHJvdGVjdGVkL3B1YmxpYyBjbGFzc2VzIGFuZCBtZW1iZXJzIChkZWZhdWx0PC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJwYWNrYWdlIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPlNob3cgcGFja2FnZS9wcm90ZWN0ZWQvcHVibGljIGNsYXNzZXMgYW5kIG1lbWJlcjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0icHJpdmF0ZSIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5TaG93IGFsbCBjbGFzc2VzIGFuZCBtZW1iZXI8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9Im9sZCIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5HZW5lcmF0ZSBvdXRwdXQgdXNpbmcgSkRLIDEuMSBlbXVsYXRpbmcgZG9jbGU8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9InZlcmJvc2UiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+T3V0cHV0IG1lc3NhZ2VzIGFib3V0IHdoYXQgSmF2YWRvYyBpcyBkb2luPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJsb2NhbGUiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+TG9jYWxlIHRvIGJlIHVzZWQsIGUuZy4gZW5fVVMgb3IgZW5fVVNfV0k8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImVuY29kaW5nIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPlNvdXJjZSBmaWxlIGVuY29kaW5nIG5hbTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0idmVyc2lvbiIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5JbmNsdWRlIEB2ZXJzaW9uIHBhcmFncmFwaDwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0idXNlIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPkNyZWF0ZSBjbGFzcyBhbmQgcGFja2FnZSB1c2FnZSBwYWdlPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJhdXRob3IiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+SW5jbHVkZSBAYXV0aG9yIHBhcmFncmFwaDwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0ic3BsaXRpbmRleCIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5TcGxpdCBpbmRleCBpbnRvIG9uZSBmaWxlIHBlciBsZXR0ZTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0id2luZG93dGl0bGUiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+QnJvd3NlciB3aW5kb3cgdGl0bGUgZm9yIHRoZSBkb2N1bWVudGF0aW9uICh0ZXh0PC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJkb2N0aXRsZSIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5JbmNsdWRlIHRpdGxlIGZvciB0aGUgcGFja2FnZSBpbmRleChmaXJzdCkgcGFnZSAoaHRtbC1jb2RlPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJoZWFkZXIiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+SW5jbHVkZSBoZWFkZXIgdGV4dCBmb3IgZWFjaCBwYWdlIChodG1sLWNvZGU8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImZvb3RlciIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5JbmNsdWRlIGZvb3RlciB0ZXh0IGZvciBlYWNoIHBhZ2UgKGh0bWwtY29kZTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iYm90dG9tIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPkluY2x1ZGUgYm90dG9tIHRleHQgZm9yIGVhY2ggcGFnZSAoaHRtbC1jb2RlPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJsaW5rIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPkNyZWF0ZSBsaW5rcyB0byBqYXZhZG9jIG91dHB1dCBhdCB0aGUgZ2l2ZW4gVVI8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImxpbmtvZmZsaW5lIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPkxpbmsgdG8gZG9jcyBhdCAmbHQ7dXJsJmd0OyB1c2luZyBwYWNrYWdlIGxpc3QgYXQmbHQ7dXJsMiZndDsgLSBzZXBhcmF0ZSB0aGUgVVJMcyBieSB1c2luZyBhIHNwYWNlIGNoYXJhY3RlcjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZ3JvdXAiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+R3JvdXAgc3BlY2lmaWVkIHBhY2thZ2VzIHRvZ2V0aGVyIGluIG92ZXJ2aWV3cGFnZS4gIFRoZSBmb3JtYXQgaXMgYXMgZGVzY3JpYmVkIGJlbG93PC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJub2RlcHJlY2F0ZWQiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+RG8gbm90IGluY2x1ZGUgQGRlcHJlY2F0ZWQgaW5mb3JtYXRpbzwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0ibm9kZXByZWNhdGVkbGlzdCIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5EbyBub3QgZ2VuZXJhdGUgZGVwcmVjYXRlZCBsaXM8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9Im5vdHJlZSIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5EbyBub3QgZ2VuZXJhdGUgY2xhc3MgaGllcmFyY2g8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9Im5vaW5kZXgiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+RG8gbm90IGdlbmVyYXRlIGluZGU8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9Im5vaGVscCIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5EbyBub3QgZ2VuZXJhdGUgaGVscCBsaW48L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9Im5vbmF2YmFyIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPkRvIG5vdCBnZW5lcmF0ZSBuYXZpZ2F0aW9uIGJhPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJzZXJpYWx3YXJuIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPkdlbmVyYXRlIHdhcm5pbmcgYWJvdXQgQHNlcmlhbCB0YTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iaGVscGZpbGUiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+U3BlY2lmaWVzIHRoZSBIVE1MIGhlbHAgZmlsZSB0byB1czwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0ic3R5bGVzaGVldGZpbGUiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+U3BlY2lmaWVzIHRoZSBDU1Mgc3R5bGVzaGVldCB0byB1czwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iY2hhcnNldCIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5DaGFyc2V0IGZvciBjcm9zcy1wbGF0Zm9ybSB2aWV3aW5nIG9mIGdlbmVyYXRlZGRvY3VtZW50YXRpbzwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZG9jZW5jb2RpbmciIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+T3V0cHV0IGZpbGUgZW5jb2RpbmcgbmFtPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJkb2NsZXQiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+U3BlY2lmaWVzIHRoZSBjbGFzcyBmaWxlIHRoYXQgc3RhcnRzIHRoZSBkb2NsZXQgdXNlZCBpbiBnZW5lcmF0aW5nIHRoZSBkb2N1bWVudGF0aW9uPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJkb2NsZXRwYXRoIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPlNwZWNpZmllcyB0aGUgcGF0aCB0byB0aGUgZG9jbGV0IGNsYXNzIGZpbGUgdGhhdCBpcyBzcGVjaWZpZWQgd2l0aCB0aGUgLWRvY2xldCBvcHRpb248L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImRvY2xldHBhdGhyZWYiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+U3BlY2lmaWVzIHRoZSBwYXRoIHRvIHRoZSBkb2NsZXQgY2xhc3MgZmlsZSB0aGF0aXMgc3BlY2lmaWVkIHdpdGggdGhlIC1kb2NsZXQgb3B0aW9uIGJ5IHJlZmVyZW5jZSB0byBhIFBBVEggZGVmaW5lZCBlbHNld2hlcmU8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImFkZGl0aW9uYWxwYXJhbSIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5MZXRzIHlvdSBhZGQgYWRkaXRpb25hbCBwYXJhbWV0ZXJzIHRvIHRoZSBqYXZhZG9jY29tbWFuZCBsaW5lLiBVc2VmdWwgZm9yIGRvY2xldHMuIFBhcmFtZXRlcnMgY29udGFpbmluZ3NwYWNlcyBuZWVkIHRvIGJlIHF1b3RlZCB1c2luZyAmYW1wO3F1b3Q7PC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJmYWlsb25lcnJvciIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5TdG9wIHRoZSBidWlsZHByb2Nlc3MgaWYgdGhlIGNvbW1hbmQgZXhpdHMgd2l0aCBhcmV0dXJuY29kZSBvdGhlciB0aGFuIDA8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImV4Y2x1ZGVwYWNrYWdlbmFtZXMiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+Y29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgcGFja2FnZXMgeW91IGRvbid0IHdhbnRkb2NzIGZvcjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZGVmYXVsdGV4Y2x1ZGVzIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPmluZGljYXRlcyB3aGV0aGVyIGRlZmF1bHQgZXhjbHVkZXMgc2hvdWxkIGJlIHVzZWQoeWVzIHwgbm8pOyBkZWZhdWx0IGV4Y2x1ZGVzIGFyZSB1c2VkIHdoZW4gb21pdHRlZDwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0idXNlZXh0ZXJuYWxmaWxlIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPmluZGljYXRlcyB3aGV0aGVyIHRoZSBzb3VyY2VmaWxlIG5hbWUgc3BlY2lmaWVkaW4gc3JjZmlsZXMgb3IgYXMgbmVzdGVkIHNvdXJjZSBlbGVtZW50cyBzaG91bGQgYmUgd3JpdHRlbiB0byBhdGVtcG9yYXJ5IGZpbGUgdG8gbWFrZSB0aGUgY29tbWFuZCBsaW5lIHNob3J0ZXIuIEFsc28gYXBwbGllcyB0b3RoZSBwYWNrYWdlIG5hbWVzIHNwZWNpZmllZCB2aWEgdGhlIHBhY2thZ2VuYW1lcyBhdHRyaWJ1dGUgb3JuZXN0ZWQgcGFja2FnZSBlbGVtZW50cy4oeWVzIHwgbm8pLiBEZWZhdWx0IGlzIG5vPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJzb3VyY2UiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+TmVjZXNzYXJ5IHRvIGVuYWJsZSBqYXZhZG9jIHRvIGhhbmRsZSBhc3NlcnRpb25zcHJlc2VudCBpbiBKMlNFIHYgMS40IHNvdXJjZSBjb2RlLiBTZXQgdGhpcyB0byAmcXVvdDsxLjQmcXVvdDsgdG9kb2N1bWVudHMgY29kZSB0aGF0IGNvbXBpbGVzIHVzaW5nICZxdW90O2phdmFjIC1zb3VyY2UxLjQmcXVvdDsuICBXaWxsIGJlIGlnbm9yZWQgaWYgeW91IHVzZSBhIGN1c3RvbWRvY2xldDwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCTwvVEFTSz4KKwk8VEFTSyBOQU1FPSJsb2FkZmlsZSI+CisJCTxERVNDUklQVElPTj4mbHQ7cCZndDsKK0xvYWQgYSB0ZXh0IGZpbGUgaW50byBhIHNpbmdsZSBwcm9wZXJ0eS4gVW5sZXNzIGFuIGVuY29kaW5nIGlzIHNwZWNpZmllZCwKK3RoZSBlbmNvZGluZyBvZiB0aGUgY3VycmVudCBsb2NhbGUgaXMgdXNlZC4KKyZsdDsvcCZndDsKKzwvREVTQ1JJUFRJT04+CisJCTxBVFRSSUJVVEUgTkFNRT0ic3JjZmlsZSIgUkVRVUlSRUQ9InllcyI+CisJCQk8REVTQ1JJUFRJT04+c291cmNlIGZpbDwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0icHJvcGVydHkiIFJFUVVJUkVEPSJ5ZXMiPgorCQkJPERFU0NSSVBUSU9OPnByb3BlcnR5IHRvIHNhdmUgdDwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZW5jb2RpbmciIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+ZW5jb2RpbmcgdG8gdXNlIHdoZW4gbG9hZGluZyB0aGUgZmlsPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJmYWlsb25lcnJvciIgUkVRVUlSRUQ9Im5vLCBkZWZhdWx0ICZxdW90O3RydWUmcXVvdDsiPgorCQkJPERFU0NSSVBUSU9OPldoZXRoZXIgdG8gaGFsdCB0aGUgYnVpbGQgb24gZmFpbHVyPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisJPC9UQVNLPgorCTxUQVNLIE5BTUU9ImxvYWRwcm9wZXJ0aWVzIj4KKwkJPERFU0NSSVBUSU9OPiZsdDtwJmd0OworTG9hZCBhIGZpbGUncyBjb250ZW50cyBhcyBBbnQgcHJvcGVydGllcy4gIFRoaXMgaXMgZXF1aXZhbGVudAordG8gJmFtcDtsdDtwcm9wZXJ0eSBmaWxlPSZhbXA7cXVvdDsuLi4mYW1wO3F1b3Q7LyZhbXA7Z3Q7IGV4Y2VwdCB0aGF0IGl0CitzdXBwb3J0cyBuZXN0ZWQgJmFtcDtsdDtmaWx0ZXJjaGFpbiZhbXA7Z3Q7IGVsZW1lbnRzIGFuZCBpdCBjYW5ub3QgYmUKK3NwZWNpZmllZCBvdXRzaWRlIGEgdGFyZ2V0LgorJmx0Oy9wJmd0OworPC9ERVNDUklQVElPTj4KKwkJPEFUVFJJQlVURSBOQU1FPSJzcmNmaWxlIiBSRVFVSVJFRD0ieWVzIj4KKwkJCTxERVNDUklQVElPTj5zb3VyY2UgZmlsPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJlbmNvZGluZyIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5lbmNvZGluZyB0byB1c2Ugd2hlbiBsb2FkaW5nIHRoZSBmaWw8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKwk8L1RBU0s+CisJPFRBU0sgTkFNRT0ibWFpbCI+CisJCTxERVNDUklQVElPTj4mbHQ7cCZndDtBIHRhc2sgdG8gc2VuZCBTTVRQIGVtYWlsLiBUaGlzIHRhc2sgY2FuIHNlbmQgbWFpbCB1c2luZyBlaXRoZXIgcGxhaW4KK3RleHQsIFVVIGVuY29kaW5nLCBvciBNSU1FIGZvcm1hdCBtYWlsLCBkZXBlbmRpbmcgb24gd2hhdCBpcyBhdmFpbGFibGUuCitBdHRhY2htZW50cyBtYXkgYmUgc2VudCB1c2luZyBuZXN0ZWQKKyZsdDthIGhyZWY9JnF1b3Q7Li4vQ29yZVR5cGVzL2ZpbGVzZXQuaHRtbCZxdW90OyZndDtmaWxlc2V0Jmx0Oy9hJmd0OyBlbGVtZW50cy4mbHQ7L3AmZ3Q7CismbHQ7cCZndDsmbHQ7c3Ryb25nJmd0O05vdGU6Jmx0Oy9zdHJvbmcmZ3Q7IFRoaXMgdGFzayBtYXkgZGVwZW5kIG9uIGV4dGVybmFsIGxpYnJhcmllcwordGhhdCBhcmUgbm90IGluY2x1ZGVkCitpbiB0aGUgQW50IGRpc3RyaWJ1dGlvbi4gIFNlZSAmbHQ7YSBocmVmPSZxdW90Oy4uL2luc3RhbGwuaHRtbCNsaWJyYXJ5ZGVwZW5kZW5jaWVzJnF1b3Q7Jmd0OworTGlicmFyeSBEZXBlbmRlbmNpZXMmbHQ7L2EmZ3Q7IGZvciBtb3JlIGluZm9ybWF0aW9uLgorJmx0Oy9wJmd0OworPC9ERVNDUklQVElPTj4KKwkJPEFUVFJJQlVURSBOQU1FPSJmcm9tIiBSRVFVSVJFRD0iZWl0aGVyIGEgZnJvbSBhdHRyaWJ1dGUsIG9yIGEgJmx0O2Zyb20mZ3Q7CisgICAgIGVsZW1lbnQuIj4KKwkJCTxERVNDUklQVElPTj5FbWFpbCBhZGRyZXNzIG9mIHNlbmRlcjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0idG9saXN0IiBSRVFVSVJFRD0iYXQgbGVhc3Qgb25lIG9mIHRoZXNlLCBvciB0aGUKKyAgICAgICAgZXF1aXZhbGVudCBlbGVtZW50cy4iPgorCQkJPERFU0NSSVBUSU9OPkNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHJlY2lwaWVudHM8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImNjbGlzdCIgUkVRVUlSRUQ9IiI+CisJCQk8REVTQ1JJUFRJT04+Q29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcmVjaXBpZW50cyB0byBjYXJib24gY29wPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJiY2NsaXN0IiBSRVFVSVJFRD0iIj4KKwkJCTxERVNDUklQVElPTj5Db21tYS1zZXBhcmF0ZWQgbGlzdCBvZiByZWNpcGllbnRzIHRvIGNhcmJvbiBjb3A8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9Im1lc3NhZ2UiIFJFUVVJUkVEPSJvbmUgb2YgdGhlc2Ugb3IgYQorICAgICAmbHQ7bWVzc2FnZSZndDsgZWxlbWVudC4iPgorCQkJPERFU0NSSVBUSU9OPk1lc3NhZ2UgdG8gc2VuZCBpbiB0aGUgYm9keSBvZiB0aGUgZW1haWw8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9Im1lc3NhZ2VmaWxlIiBSRVFVSVJFRD0iIj4KKwkJCTxERVNDUklQVElPTj5GaWxlIHRvIHNlbmQgYXMgdGhlIGJvZHkgb2YgdGhlIGVtYWlsLiBQcm9wZXJ0eXZhbHVlcyBpbiB0aGUgZmlsZSB3aWxsIGJlIGV4cGFuZGVkPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJtZXNzYWdlbWltZXR5cGUiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+VGhlIGNvbnRlbnQgdHlwZSBvZiB0aGUgbWVzc2FnZS4gIFRoZSBkZWZhdWx0IGlzdGV4dC9wbGFpbjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZmlsZXMiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+RmlsZXMgdG8gc2VuZCBhcyBhdHRhY2htZW50cyB0byB0aGUgZW1haWwuICBTZXBhcmF0ZSBtdWx0aXBsZWZpbGUgbmFtZXMgdXNpbmcgYSBjb21tYS4gIFlvdSBjYW4gYWxzbyB1c2UgJmx0O2ZpbGVzZXQmZ3Q7ZWxlbWVudHMgdG8gc3BlY2lmeSBmaWxlczwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZmFpbG9uZXJyb3IiIFJFUVVJUkVEPSJuby4iPgorCQkJPERFU0NSSVBUSU9OPmZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciB0byBoYWx0IHRoZSBidWlsZCBvbmFueSBlcnJvci4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHRydWU8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImluY2x1ZGVmaWxlbmFtZXMiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+SW5jbHVkZSBmaWxlbmFtZShzKSBiZWZvcmUgZmlsZSBjb250ZW50cy5WYWxpZCBvbmx5IHdoZW4gdGhlIHBsYWluIGVuY29kaW5nIGlzIHVzZWQuICBUaGUgZGVmYXVsdHZhbHVlIGlzIGZhbHNlPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJtYWlsaG9zdCIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5Ib3N0IG5hbWUgb2YgdGhlIFNNVFAgc2VydmVyLiAgVGhlIGRlZmF1bHQgdmFsdWUgaXNsb2NhbGhvc3Q8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9Im1haWxwb3J0IiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPlRDUCBwb3J0IG9mIHRoZSBTTVRQIHNlcnZlci4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDI1PC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJlbmNvZGluZyIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5TcGVjaWZpZXMgdGhlIGVuY29kaW5nIHRvIHVzZSBmb3IgdGhlIGNvbnRlbnQgb2YgdGhlIGVtYWlsLlZhbHVlcyBhcmUgbWltZSwgdXUsIHBsYWluLCBvcmF1dG8uICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBhdXRvPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJzdWJqZWN0IiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPkVtYWlsIHN1YmplY3QgbGluZTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCTwvVEFTSz4KKwk8VEFTSyBOQU1FPSJtYW5pZmVzdCI+CisJCTxERVNDUklQVElPTj4mbHQ7cCZndDtDcmVhdGVzIGEgbWFuaWZlc3QgZmlsZS4mbHQ7L3AmZ3Q7CismbHQ7cCZndDtUaGlzIHRhc2sgY2FuIGJlIHVzZWQgdG8gd3JpdGUgYSBNYW5pZmVzdCBmaWxlLCBvcHRpb25hbGx5CityZXBsYWNpbmcgb3IgdXBkYXRpbmcgYW4gZXhpc3RpbmcgZmlsZS4mbHQ7L3AmZ3Q7CismbHQ7cCZndDtNYW5pZmVzdHMgYXJlIHByb2Nlc3NlZCBhY2NvcmRpbmcgdG8gdGhlIAorJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS4zL2RvY3MvZ3VpZGUvamFyL2phci5odG1sJnF1b3Q7Jmd0O0phcgorZmlsZSBzcGVjaWZpY2F0aW9uLiZsdDsvYSZndDsuIFNwZWNpZmljYWxseSwgYSBtYW5pZmVzdCBlbGVtZW50IGNvbnNpc3RzIG9mCithIHNldCBvZiBhdHRyaWJ1dGVzIGFuZCBzZWN0aW9ucy4gVGhlc2Ugc2VjdGlvbnMgaW4gdHVybiBtYXkgY29udGFpbgorYXR0cmlidXRlcy4gTm90ZSBpbiBwYXJ0aWN1bGFyIHRoYXQgdGhpcyBtYXkgcmVzdWx0IGluIG1hbmlmZXN0IGxpbmVzCitncmVhdGVyIHRoYW4gNzIgYnl0ZXMgYmVpbmcgd3JhcHBlZCBhbmQgY29udGludWVkIG9uIHRoZSBuZXh0CitsaW5lLiZsdDsvcCZndDsKKzwvREVTQ1JJUFRJT04+CisJCTxBVFRSSUJVVEUgTkFNRT0iZmlsZSIgUkVRVUlSRUQ9InllcyI+CisJCQk8REVTQ1JJUFRJT04+dGhlIG1hbmlmZXN0LWZpbGUgdG8gY3JlYXRlL3VwZGF0ZTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0ibW9kZSIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5PbmUgb2YgJnF1b3Q7dXBkYXRlJnF1b3Q7IG9yICZxdW90O3JlcGxhY2UmcXVvdDssIGRlZmF1bHQgaXMgJnF1b3Q7cmVwbGFjZSZxdW90OzwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCTwvVEFTSz4KKwk8VEFTSyBOQU1FPSJta2RpciI+CisJCTxERVNDUklQVElPTj4mbHQ7cCZndDtDcmVhdGVzIGEgZGlyZWN0b3J5LiBBbHNvIG5vbi1leGlzdGVudCBwYXJlbnQgZGlyZWN0b3JpZXMgYXJlIGNyZWF0ZWQsIHdoZW4KK25lY2Vzc2FyeS4mbHQ7L3AmZ3Q7Cis8L0RFU0NSSVBUSU9OPgorCQk8QVRUUklCVVRFIE5BTUU9ImRpciIgUkVRVUlSRUQ9InllcyI+CisJCQk8REVTQ1JJUFRJT04+dGhlIGRpcmVjdG9yeSB0byBjcmVhdGU8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKwk8L1RBU0s+CisJPFRBU0sgTkFNRT0ibW92ZSI+CisJCTxERVNDUklQVElPTj4mbHQ7cCZndDtNb3ZlcyBhIGZpbGUgdG8gYSBuZXcgZmlsZSBvciBkaXJlY3RvcnksIG9yIHNldHMgb2YgZmlsZXMgdG8KK2EgbmV3IGRpcmVjdG9yeS4gIEJ5IGRlZmF1bHQsIHRoZQorZGVzdGluYXRpb24gZmlsZSBpcyBvdmVyd3JpdHRlbiBpZiBpdCBhbHJlYWR5IGV4aXN0cy4gIFdoZW4gJmx0O3ZhciZndDtvdmVyd3JpdGUmbHQ7L3ZhciZndDsgaXMKK3R1cm5lZCBvZmYsIHRoZW4gZmlsZXMgYXJlIG9ubHkgbW92ZWQgaWYgdGhlIHNvdXJjZSBmaWxlIGlzIG5ld2VyIHRoYW4KK3RoZSBkZXN0aW5hdGlvbiBmaWxlLCBvciB3aGVuIHRoZSBkZXN0aW5hdGlvbiBmaWxlIGRvZXMgbm90IGV4aXN0LiZsdDsvcCZndDsKKyZsdDtwJmd0OyZsdDthIGhyZWY9JnF1b3Q7Li4vQ29yZVR5cGVzL2ZpbGVzZXQuaHRtbCZxdW90OyZndDtGaWxlU2V0Jmx0Oy9hJmd0O3MgYXJlIHVzZWQgdG8gc2VsZWN0IHNldHMgb2YgZmlsZXMKK3RvIG1vdmUgdG8gdGhlICZsdDt2YXImZ3Q7dG9kaXImbHQ7L3ZhciZndDsgZGlyZWN0b3J5LiZsdDsvcCZndDsKKzwvREVTQ1JJUFRJT04+CisJCTxBVFRSSUJVVEUgTkFNRT0iZmlsZSIgUkVRVUlSRUQ9Im9uZSBvZiBmaWxlIG9yCisgICAgICBhdCBsZWFzdCBvbmUgbmVzdGVkIGZpbGVzZXQgZWxlbWVudCI+CisJCQk8REVTQ1JJUFRJT04+dGhlIGZpbGUgdG8gbW92PC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJ0b2ZpbGUiIFJFUVVJUkVEPSJ3aXRoIHRoZSBmaWxlIGF0dHJpYnV0ZSwKKyAgICAgZWl0aGVyIHRvZmlsZSBvciB0b2RpciBjYW4gYmUgdXNlZC4gIHdpdGggbmVzdGVkIGZpbGVzZXRzLAorICAgICBpZiB0aGUgZmlsZXNldCBzaXplIGlzIGdyZWF0ZXIgdGhhbiAxIG9yIGlmIHRoZSBvbmx5IGVudHJ5IGluIHRoZSBmaWxlc2V0IGlzIGEKKyAgICAgZGlyZWN0b3J5IG9yIGlmIHRoZSBmaWxlIGF0dHJpYnV0ZSBpcyBhbHJlYWR5IHNwZWNpZmllZCwgb25seQorICAgICB0b2RpciBpcyBhbGxvd2VkIj4KKwkJCTxERVNDUklQVElPTj50aGUgZmlsZSB0byBtb3ZlIHQ8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9InRvZGlyIiBSRVFVSVJFRD0iIj4KKwkJCTxERVNDUklQVElPTj50aGUgZGlyZWN0b3J5IHRvIG1vdmUgdDwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0ib3ZlcndyaXRlIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPm92ZXJ3cml0ZSBleGlzdGluZyBmaWxlcyBldmVuIGlmIHRoZSBkZXN0aW5hdGlvbmZpbGVzIGFyZSBuZXdlciAoZGVmYXVsdCBpcyAmcXVvdDt0cnVlJnF1b3Q7PC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJmaWx0ZXJpbmciIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+aW5kaWNhdGVzIHdoZXRoZXIgdG9rZW4gZmlsdGVyaW5nIHNob3VsZCB0YWtlIHBsYWNlIGR1cmluZ3RoZSBtb3ZlLiAgU2VlIHRoZSBmaWx0ZXIgdGFzayBmb3IgYSBkZXNjcmlwdGlvbiBvZmhvdyBmaWx0ZXJzIHdvcms8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImZsYXR0ZW4iIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+aWdub3JlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgb2Ygc291cmNlIGRpcmVjdG9yeSxjb3B5IGFsbCBmaWxlcyBpbnRvIGEgc2luZ2xlIGRpcmVjdG9yeSwgc3BlY2lmaWVkIGJ5IHRoZSB0b2RpcmF0dHJpYnV0ZSAoZGVmYXVsdCBpcyAmcXVvdDtmYWxzZSZxdW90OykuTm90ZSB0aGF0IHlvdSBjYW4gYWNoaWV2ZSB0aGVzYW1lIGVmZmVjdCBieSB1c2luZyBhIGZsYXR0ZW4gbWFwcGU8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImluY2x1ZGVlbXB0eWRpcnMiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+Q29weSBlbXB0eSBkaXJlY3RvcmllcyBpbmNsdWRlZCB3aXRoIHRoZSBuZXN0ZWQgRmlsZVNldChzKS5EZWZhdWx0cyB0byAmcXVvdDt5ZXMmcXVvdDs8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKwk8L1RBU0s+CisJPFRBU0sgTkFNRT0icGFyYWxsZWwiPgorCQk8REVTQ1JJUFRJT04+Jmx0O3AmZ3Q7UGFyYWxsZWwgaXMgYSBjb250YWluZXIgdGFzayAtIGl0IGNhbiBjb250YWluIG90aGVyIEFudCB0YXNrcy4gRWFjaCBuZXN0ZWQKK3Rhc2sgd2l0aGluIHRoZSBwYXJhbGxlbCB0YXNrIHdpbGwgYmUgZXhlY3V0ZWQgaW4gaXRzIG93biB0aHJlYWQuICZsdDsvcCZndDsKKyZsdDtwJmd0O1BhcmFsbGVsIHRhc2tzIGhhdmUgYSBudW1iZXIgb2YgdXNlcyBpbiBhbiBBbnQgYnVpbGRmaWxlIGluY2x1ZGluZzombHQ7L3AmZ3Q7CismbHQ7dWwmZ3Q7CismbHQ7bGkmZ3Q7VGFraW5nIGFkdmFudGFnZSBvZiBhdmFpbGFibGUgcHJvY2Vzc2luZyByZXNvdXJjZXMgdG8gcmVkdWNlIGJ1aWxkIHRpbWUmbHQ7L2xpJmd0OworJmx0O2xpJmd0O1Rlc3Rpbmcgc2VydmVycywgd2hlcmUgdGhlIHNlcnZlciBjYW4gYmUgcnVuIGluIG9uZSB0aHJlYWQgYW5kIHRoZSB0ZXN0CitoYXJuZXNzIGlzIHJ1biBpbiBhbm90aGVyIHRocmVhZC4mbHQ7L2xpJmd0OworJmx0Oy91bCZndDsKKyZsdDtwJmd0O0NhcmUgbXVzdCBiZSB0YWtlbiB3aGVuIHVzaW5nIG11bHRpdGhyZWFkaW5nIHRvIGVuc3VyZSB0aGUgdGFza3Mgd2l0aGluIHRoZQordGhyZWFkcyBkbyBub3QgaW50ZXJhY3QuIEZvciBleGFtcGxlLCB0d28gamF2YWMgY29tcGlsZSB0YXNrcyB3aGljaCB3cml0ZSAKK2NsYXNzZXMgaW50byB0aGUgc2FtZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgbWF5IGludGVyYWN0IHdoZXJlIG9uZSB0cmllcyB0bworcmVhZCBhIGNsYXNzIGZvciBkZXBlbmRlbmN5IGluZm9ybWF0aW9uIHdoaWxlIHRoZSBvdGhlciB0YXNrIGlzIHdyaXRpbmcgdGhlIAorY2xhc3MgZmlsZS4gQmUgc3VyZSB0byBhdm9pZCB0aGVzZSB0eXBlcyBvZiBpbnRlcmFjdGlvbnMgd2l0aGluIGEgCismYW1wO2x0O3BhcmFsbGVsJmFtcDtndDsgdGFzayZsdDsvcCZndDsKKyZsdDtwJmd0O1RoZSBwYXJhbGxlbCB0YXNrIGhhcyBubyBhdHRyaWJ1dGVzIGFuZCBkb2VzIG5vdCBzdXBwb3J0IGFueSBuZXN0ZWQgCitlbGVtZW50cyBhcGFydCBmcm9tIEFudCB0YXNrcy4gQW55IHZhbGlkIEFudCB0YXNrIG1heSBiZSBlbWJlZGRlZCB3aXRoaW4gYSAKK3BhcmFsbGVsIHRhc2ssIGluY2x1ZGluZyBvdGhlciBwYXJhbGxlbCB0YXNrcy4mbHQ7L3AmZ3Q7CismbHQ7cCZndDtOb3RlIHRoYXQgd2hpbGUgdGhlIHRhc2tzIHdpdGhpbiB0aGUgcGFyYWxsZWwgdGFzayBhcmUgYmVpbmcgcnVuLCB0aGUgbWFpbiAKK3RocmVhZCB3aWxsIGJlIGJsb2NrZWQgd2FpdGluZyBmb3IgYWxsIHRoZSBjaGlsZCB0aHJlYWRzIHRvIGNvbXBsZXRlLiZsdDsvcCZndDsgIAorJmx0O3AmZ3Q7SWYgYW55IG9mIHRoZSB0YXNrcyB3aXRoaW4gdGhlICZhbXA7bHQ7cGFyYWxsZWwmYW1wO2d0OyB0YXNrIGZhaWxzLCB0aGUgcmVtYWluaW5nIAordGFza3MgaW4gb3RoZXIgdGhyZWFkcyB3aWxsIGNvbnRpbnVlIHRvIHJ1biB1bnRpbCBhbGwgdGhyZWFkcyBoYXZlIGNvbXBsZXRlZC4gCitJbiB0aGlzIHNpdHVhdGlvbiwgdGhlIHBhcmFsbGVsIHRhc2sgd2lsbCBhbHNvIGZhaWwuJmx0Oy9wJmd0OworJmx0O3AmZ3Q7VGhlIHBhcmFsbGVsIHRhc2sgbWF5IGJlIGNvbWJpbmVkIHdpdGggdGhlICZsdDthIGhyZWY9JnF1b3Q7c2VxdWVudGlhbC5odG1sJnF1b3Q7Jmd0Oworc2VxdWVudGlhbCZsdDsvYSZndDsgdGFzayB0byBkZWZpbmUgc2VxdWVuY2VzIG9mIHRhc2tzIHRvIGJlIGV4ZWN1dGVkIG9uIGVhY2ggdGhyZWFkCit3aXRoaW4gdGhlIHBhcmFsbGVsIGJsb2NrJmx0Oy9wJmd0OworJmx0O2gzJmd0O0V4YW1wbGVzJmx0Oy9oMyZndDsKKyZsdDtwcmUmZ3Q7CismYW1wO2x0O3BhcmFsbGVsJmFtcDtndDsKKyZhbXA7bHQ7d2xydW4gLi4uICZhbXA7Z3Q7CismYW1wO2x0O3NlcXVlbnRpYWwmYW1wO2d0OworJmFtcDtsdDtzbGVlcCBzZWNvbmRzPSZhbXA7cXVvdDszMCZhbXA7cXVvdDsvJmFtcDtndDsKKyZhbXA7bHQ7anVuaXQgLi4uICZhbXA7Z3Q7CismYW1wO2x0O3dsc3RvcC8mYW1wO2d0OworJmFtcDtsdDsvc2VxdWVudGlhbCZhbXA7Z3Q7CismYW1wO2x0Oy9wYXJhbGxlbCZhbXA7Z3Q7CismbHQ7L3ByZSZndDsKKyZsdDtwJmd0O1RoaXMgZXhhbXBsZSByZXByZXNlbnRzIGEgdHlwaWNhbCBwYXR0ZXJuIGZvciB0ZXN0aW5nIGEgc2VydmVyIGFwcGxpY2F0aW9uLiAKK0luIG9uZSB0aHJlYWQgdGhlIHNlcnZlciBpcyBzdGFydGVkICh0aGUgd2xydW4gdGFzaykuIFRoZSBvdGhlciB0aHJlYWQgY29uc2lzdHMgCitvZiBhIHRocmVlIHRhc2tzIHdoaWNoIGFyZSBwZXJmb3JtZWQgaW4gc2VxdWVuY2UuIFRoZSBzbGVlcCB0YXNrIGlzIHVzZWQgdG8gCitnaXZlIHRoZSBzZXJ2ZXIgdGltZSB0byBjb21lIHVwLiBBbm90aGVyIHRhc2sgd2hpY2ggaXMgY2FwYWJsZSBvZiB2YWxpZGF0aW5nIAordGhhdCB0aGUgc2VydmVyIGlzIGF2YWlsYWJsZSBjb3VsZCBiZSB1c2VkIGluIHBsYWNlIG9mIHRoZSBzbGVlcCB0YXNrLiBUaGUgCit0ZXN0IGhhcm5lc3MgaXMgdGhlbiBydW4uIE9uY2UgdGhlIHRlc3RzIGFyZSBjb21wbGV0ZSwgdGhlIHNlcnZlciBpcyBzdG9wcGVkIAorKHVzaW5nIHdsc3RvcCBpbiB0aGlzIGV4YW1wbGUpLCBhbGxvd2luZyBib3RoIHRocmVhZHMgdG8gY29tcGxldGUuIFRoZSAKK3BhcmFsbGVsIHRhc2sgd2lsbCBhbHNvIGNvbXBsZXRlIGF0IHRoaXMgdGltZSBhbmQgdGhlIGJ1aWxkIHdpbGwgdGhlbiAKK2NvbnRpbnVlLiZsdDsvcCZndDsKKyZsdDtwcmUmZ3Q7CismYW1wO2x0O3BhcmFsbGVsJmFtcDtndDsKKyZhbXA7bHQ7amF2YWMgLi4uJmFtcDtndDsgJmFtcDtsdDshLS0gY29tcGlsZXIgc2VydmxldCBjb2RlIC0tJmFtcDtndDsKKyZhbXA7bHQ7d2xqc3BjIC4uLiZhbXA7Z3Q7ICZhbXA7bHQ7IS0tIHByZWNvbXBpbGUgSlNQcyAtLSZhbXA7Z3Q7CismYW1wO2x0Oy9wYXJhbGxlbCZhbXA7Z3Q7CismbHQ7L3ByZSZndDsKKyZsdDtwJmd0O1RoaXMgZXhhbXBsZSBzaG93cyB0d28gaW5kZXBlbmRlbnQgdGFza3MgYmVpbmcgcnVuIHRvIGFjaGlldmUgYmV0dGVyIAorcmVzb3VyY2UgdXRpbGl6YXRpb24gZHVyaW5nIHRoZSBidWlsZC4gSW4gdGhpcyBpbnN0YW5jZSwgc29tZSBzZXJ2bGV0cyBhcmUgYmVpbmcKK2NvbXBpbGVkIGluIG9uZSB0aGVhZCBhbmQgYSBzZXQgb2YgSlNQcyBpcyBiZWluZyBwcmVjb21waWxlZCBpbiBhbm90aGVyLiBBcyAKK25vdGVkIGFib3ZlLCB5b3UgbmVlZCB0byBiZSBjYXJlZnVsIHRoYXQgdGhlIHR3byB0YXNrcyBhcmUgaW5kZXBlbmRlbnQsIGJvdGggaW4gCit0ZXJtcyBvZiB0aGVpciBkZXBlbmRlbmNpZXMgYW5kIGluIHRlcm1zIG9mIHRoZWlyIHBvdGVudGlhbCBpbnRlcmFjdGlvbnMgaW4KK0FudCdzIGV4dGVybmFsIGVudmlyb25tZW50LiZsdDsvcCZndDsKKyZsdDtociZndDsKKyZsdDtwIGFsaWduPSZxdW90O2NlbnRlciZxdW90OyZndDtDb3B5cmlnaHQgJmFtcDtjb3B5OyAyMDAxLTIwMDIgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uIEFsbCByaWdodHMKK1Jlc2VydmVkLiZsdDsvcCZndDsKKyZsdDsvYm9keSZndDsKKyZsdDsvaHRtbCZndDsKKzwvREVTQ1JJUFRJT04+CTwvVEFTSz4KKwk8VEFTSyBOQU1FPSJwYXRjaCI+CisJCTxERVNDUklQVElPTj4mbHQ7cCZndDtBcHBsaWVzIGEgZGlmZiBmaWxlIHRvIG9yaWdpbmFscy4gOyByZXF1aXJlcyAmcXVvdDtwYXRjaCZxdW90OyB0byBiZQorb24gdGhlIGV4ZWN1dGlvbiBwYXRoLiAgJmx0Oy9wJmd0OworPC9ERVNDUklQVElPTj4KKwkJPEFUVFJJQlVURSBOQU1FPSJwYXRjaGZpbGUiIFJFUVVJUkVEPSJ5ZXMiPgorCQkJPERFU0NSSVBUSU9OPnRoZSBmaWxlIHRoYXQgaW5jbHVkZXMgdGhlIGRpZmYgb3V0cHU8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9Im9yaWdpbmFsZmlsZSIgUkVRVUlSRUQ9Im5vLCB0cmllcyB0byBndWVzcyBpdCBmcm9tIHRoZSBkaWZmIAorICAgICAgIGZpbGUiPgorCQkJPERFU0NSSVBUSU9OPnRoZSBmaWxlIHRvIHBhdGM8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImJhY2t1cHMiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+S2VlcCBiYWNrdXBzIG9mIHRoZSB1bnBhdGNoZWQgZmlsZTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0icXVpZXQiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+V29yayBzaWxlbnRseSB1bmxlc3MgYW4gZXJyb3Igb2NjdXI8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9InJldmVyc2UiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+QXNzdW1lIHBhdGNoIHdhcyBjcmVhdGVkIHdpdGggb2xkIGFuZCBuZXcgZmlsZXMgc3dhcHBlZDwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iaWdub3Jld2hpdGVzcGFjZSIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5JZ25vcmUgd2hpdGVzcGFjZSBkaWZmZXJlbmNlczwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0ic3RyaXAiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+U3RyaXAgdGhlIHNtYWxsZXN0IHByZWZpeCBjb250YWluaW5nIG51bSBsZWFkaW5nIHNsYXNoZXMgZnJvbSBmaWxlbmFtZXM8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImRpciIgUkVRVUlSRUQ9Im5vLCBkZWZhdWx0IGlzIHRoZSBwcm9qZWN0J3MgYmFzZWRpci4iPgorCQkJPERFU0NSSVBUSU9OPlRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggdG8gcnVuIHRoZSBwYXRjaCBjb21tYW5kPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisJPC9UQVNLPgorCTxUQVNLIE5BTUU9InBhdGhjb252ZXJ0Ij4KKwkJPERFU0NSSVBUSU9OPiZsdDtwJmd0O0NvbnZlcnRzIGEgbmVzdGVkICZsdDtjb2RlJmd0OyZhbXA7bHQ7cGF0aCZhbXA7Z3Q7Jmx0Oy9jb2RlJmd0OyBvciByZWZlcmVuY2UgdG8gYSBQYXRoLAorRmlsZVNldCwgRGlyU2V0LCBvciBGaWxlTGlzdCBpbnRvIGEgcGF0aAorZm9ybSBmb3IgYSBwYXJ0aWN1bGFyIHBsYXRmb3JtLCBhbmQgc3RvcmVzIHRoZSByZXN1bHQgaW4gYSBnaXZlbiBwcm9wZXJ0eS4KK0l0IGNhbiBhbHNvIGJlIHVzZWQgd2hlbiB5b3UgbmVlZAordG8gY29udmVydCBhIFBhdGgsIEZpbGVTZXQsIG9yIERpclNldCBpbnRvIGEgbGlzdCwgc2VwYXJhdGVkIGJ5IGEgZ2l2ZW4KK2NoYXJhY3Rlciwgc3VjaCBhcyBhIGNvbW1hIG9yIHNwYWNlLCBvciwgY29udmVyc2VseSwgdG8gY29udmVydCBhIGxpc3QKK29mIGZpbGVzIGluIGEgRmlsZUxpc3QgaW50byBhIHBhdGguCismbHQ7L3AmZ3Q7CismbHQ7cCZndDtOZXN0ZWQgJmx0O2NvZGUmZ3Q7JmFtcDtsdDttYXAmYW1wO2d0OyZsdDsvY29kZSZndDsgZWxlbWVudHMgY2FuIGJlIHNwZWNpZmllZCB0byBtYXAgV2luZG93cworZHJpdmUgbGV0dGVycyB0byBVbml4IHBhdGhzLCBhbmQgdmljZS12ZXJzYS4mbHQ7L3AmZ3Q7Cis8L0RFU0NSSVBUSU9OPgorCQk8QVRUUklCVVRFIE5BTUU9InRhcmdldG9zIiBSRVFVSVJFRD0ieWVzLCB1bmxlc3MgcGF0aHNlcCBhbmQvb3IKKyAgICAgICAgZGlyc2VwIGFyZSBzcGVjaWZpZWQuCisgICAgICI+CisJCQk8REVTQ1JJUFRJT04+VGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuICBNdXN0IGJlIG9uZSBvZiAndW5peCcsICd3aW5kb3dzJywgJ25ldHdhcmUnIG9yICdvcy8yJy5UaGlzIGlzIGEgc2hvcnRoYW5kIG1lY2hhbmlzbSBmb3Igc3BlY2lmeWluZyBib3RocGF0aHNlcCBhbmQgZGlyc2VwYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgdGFyZ2V0IGFyY2hpdGVjdHVyZS48L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImRpcnNlcCIgUkVRVUlSRUQ9Im5vLCBkZWZhdWx0cyB0byBjdXJyZW50IGp2bSBmaWxlLnNlcGFyYXRvciI+CisJCQk8REVTQ1JJUFRJT04+VGhlIGNoYXJhY3RlcihzKSB0byB1c2UgYXMgdGhlIGRpcmVjdG9yeSBzZXBhcmF0b3IgaW4gdGhlZ2VuZXJhdGVkIHBhdGhzLjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0icGF0aHNlcCIgUkVRVUlSRUQ9Im5vLCBkZWZhdWx0cyB0byBjdXJyZW50IGp2bSBmaWxlLnBhdGhzZXBhcmF0b3IiPgorCQkJPERFU0NSSVBUSU9OPlRoZSBjaGFyYWN0ZXIocykgdG8gdXNlIGFzIHRoZSBwYXRoLWVsZW1lbnQgc2VwYXJhdG9yIGluIHRoZWdlbmVyYXRlZCBwYXRocy48L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9InByb3BlcnR5IiBSRVFVSVJFRD0ieWVzIj4KKwkJCTxERVNDUklQVElPTj5UaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgaW4gd2hpY2ggdG8gcGxhY2UgdGhlIGNvbnZlcnRlZCBwYXRoPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJyZWZpZCIgUkVRVUlSRUQ9Im5vOyBpZiBvbWl0dGVkLCBhIG5lc3RlZAorICAgICAgICAgJmx0O3BhdGgmZ3Q7IGVsZW1lbnQgbXVzdCBiZSBzdXBwbGllZC4iPgorCQkJPERFU0NSSVBUSU9OPldoYXQgdG8gY29udmVydCwgZ2l2ZW4gYXMgYXJlZmVyZW5jZSB0byBhJmx0O3BhdGgmZ3Q7LCAmbHQ7ZmlsZXNldCZndDssJmx0O2RpcnNldCZndDssIG9yICZsdDtmaWxlc2V0Jmd0O2RlZmluZWQgZWxzZXdoZXI8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9InNldG9uZW1wdHkiIFJFUVVJUkVEPSJubzsgZGVmYXVsdCBpcyAmcXVvdDt0cnVlJnF1b3Q7LgorICAgIj4KKwkJCTxERVNDUklQVElPTj5TaG91bGQgdGhlIHByb3BlcnR5IGJlIHNldCwgZXZlbiBpZiB0aGUgcmVzdWx0aXMgdGhlIGVtcHR5IHN0cmluZz88L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKwk8L1RBU0s+CisJPFRBU0sgTkFNRT0icHJvcGVydHkiPgorCQk8REVTQ1JJUFRJT04+Jmx0O3AmZ3Q7U2V0cyBhIHByb3BlcnR5IChieSBuYW1lIGFuZCB2YWx1ZSksIG9yIHNldCBvZiBwcm9wZXJ0aWVzIChmcm9tIGZpbGUgb3IKK3Jlc291cmNlKSBpbiB0aGUgcHJvamVjdC4gIFByb3BlcnRpZXMgYXJlIGNhc2Ugc2Vuc2l0aXZlLiZsdDsvcCZndDsKK1Byb3BlcnRpZXMgYXJlIGltbXV0YWJsZTogd2hvZXZlciBzZXRzIGEgcHJvcGVydHkgZmlyc3QgZnJlZXplcyBpdCBmb3IgdGhlCityZXN0IG9mIHRoZSBidWlsZDsgdGhleSBhcmUgbW9zdCBkZWZpbmF0ZWx5IG5vdCB2YXJpYWJsZS4gCismbHQ7cCZndDtUaGVyZSBhcmUgZml2ZSB3YXlzIHRvIHNldCBwcm9wZXJ0aWVzOiZsdDsvcCZndDsKKyZsdDt1bCZndDsKKyZsdDtsaSZndDtCeSBzdXBwbHlpbmcgYm90aCB0aGUgJmx0O2kmZ3Q7bmFtZSZsdDsvaSZndDsgYW5kICZsdDtpJmd0O3ZhbHVlJmx0Oy9pJmd0OyBhdHRyaWJ1dGUuJmx0Oy9saSZndDsKKyZsdDtsaSZndDtCeSBzdXBwbHlpbmcgYm90aCB0aGUgJmx0O2kmZ3Q7bmFtZSZsdDsvaSZndDsgYW5kICZsdDtpJmd0O3JlZmlkJmx0Oy9pJmd0OyBhdHRyaWJ1dGUuJmx0Oy9saSZndDsKKyZsdDtsaSZndDtCeSBzZXR0aW5nIHRoZSAmbHQ7aSZndDtmaWxlJmx0Oy9pJmd0OyBhdHRyaWJ1dGUgd2l0aCB0aGUgZmlsZW5hbWUgb2YgdGhlIHByb3BlcnR5CitmaWxlIHRvIGxvYWQuIFRoaXMgcHJvcGVydHkgZmlsZSBoYXMgdGhlIGZvcm1hdCBhcyBkZWZpbmVkIGJ5IHRoZSBmaWxlIHVzZWQKK2luIHRoZSBjbGFzcyBqYXZhLnV0aWwuUHJvcGVydGllcy4mbHQ7L2xpJmd0OworJmx0O2xpJmd0O0J5IHNldHRpbmcgdGhlICZsdDtpJmd0O3Jlc291cmNlJmx0Oy9pJmd0OyBhdHRyaWJ1dGUgd2l0aCB0aGUgcmVzb3VyY2UgbmFtZSBvZiB0aGUKK3Byb3BlcnR5IGZpbGUgdG8gbG9hZC4gVGhpcyBwcm9wZXJ0eSBmaWxlIGhhcyB0aGUgZm9ybWF0IGFzIGRlZmluZWQgYnkgdGhlCitmaWxlIHVzZWQgaW4gdGhlIGNsYXNzIGphdmEudXRpbC5Qcm9wZXJ0aWVzLiZsdDsvbGkmZ3Q7CismbHQ7bGkmZ3Q7Qnkgc2V0dGluZyB0aGUgJmx0O2kmZ3Q7ZW52aXJvbm1lbnQmbHQ7L2kmZ3Q7IGF0dHJpYnV0ZSB3aXRoIGEgcHJlZml4IHRvIHVzZS4KK1Byb3BlcnRpZXMgd2lsbCBiZSBkZWZpbmVkIGZvciBldmVyeSBlbnZpcm9ubWVudCB2YXJpYWJsZSBieQorcHJlZml4aW5nIHRoZSBzdXBwbGllZCBuYW1lIGFuZCBhIHBlcmlvZCB0byB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUuJmx0Oy9saSZndDsKKyZsdDsvdWwmZ3Q7CismbHQ7cCZndDtBbHRob3VnaCBjb21iaW5hdGlvbnMgb2YgdGhlc2Ugd2F5cyBhcmUgcG9zc2libGUsIG9ubHkgb25lIHNob3VsZCBiZSB1c2VkCithdCBhIHRpbWUuIFByb2JsZW1zIG1pZ2h0IG9jY3VyIHdpdGggdGhlIG9yZGVyIGluIHdoaWNoIHByb3BlcnRpZXMgYXJlIHNldCwgZm9yCitpbnN0YW5jZS4mbHQ7L3AmZ3Q7CismbHQ7cCZndDtUaGUgdmFsdWUgcGFydCBvZiB0aGUgcHJvcGVydGllcyBiZWluZyBzZXQsIG1pZ2h0IGNvbnRhaW4gcmVmZXJlbmNlcyB0byBvdGhlcgorcHJvcGVydGllcy4gVGhlc2UgcmVmZXJlbmNlcyBhcmUgcmVzb2x2ZWQgYXQgdGhlIHRpbWUgdGhlc2UgcHJvcGVydGllcyBhcmUgc2V0LgorVGhpcyBhbHNvIGhvbGRzIGZvciBwcm9wZXJ0aWVzIGxvYWRlZCBmcm9tIGEgcHJvcGVydHkgZmlsZS4mbHQ7L3AmZ3Q7CismbHQ7cCZndDtBIGxpc3Qgb2YgcHJlZGVmaW5lZCBwcm9wZXJ0aWVzIGNhbiBiZSBmb3VuZCAmbHQ7YQoraHJlZj0mcXVvdDsuLi91c2luZy5odG1sI2J1aWx0LWluLXByb3BzJnF1b3Q7Jmd0O2hlcmUmbHQ7L2EmZ3Q7LiZsdDsvcCZndDsKKzwvREVTQ1JJUFRJT04+CisJCTxBVFRSSUJVVEUgTkFNRT0ibmFtZSIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj50aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gc2V0PC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJ2YWx1ZSIgUkVRVUlSRUQ9Im9uZSBvZiB0aGVzZSwgd2hlbiB1c2luZyB0aGUKKyAgICAgICAgbmFtZSBhdHRyaWJ1dGUiPgorCQkJPERFU0NSSVBUSU9OPnRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHk8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImxvY2F0aW9uIiBSRVFVSVJFRD0iIj4KKwkJCTxERVNDUklQVElPTj5TZXRzIHRoZSBwcm9wZXJ0eSB0byB0aGUgYWJzb2x1dGUgZmlsZW5hbWUgb2YgdGhlZ2l2ZW4gZmlsZS4gSWYgdGhlIHZhbHVlIG9mIHRoaXMgYXR0cmlidXRlIGlzIGFuIGFic29sdXRlIHBhdGgsIGl0aXMgbGVmdCB1bmNoYW5nZWQgKHdpdGggLyBhbmQgXCBjaGFyYWN0ZXJzIGNvbnZlcnRlZCB0byB0aGVjdXJyZW50IHBsYXRmb3JtcyBjb252ZW50aW9ucykuIE90aGVyd2lzZSBpdCBpcyB0YWtlbiBhcyBhIHBhdGhyZWxhdGl2ZSB0byB0aGUgcHJvamVjdCdzIGJhc2VkaXIgYW5kIGV4cGFuZGVkPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJyZWZpZCIgUkVRVUlSRUQ9IiI+CisJCQk8REVTQ1JJUFRJT04+UmVmZXJlbmNlIHRvIGFuIG9iamVjdGRlZmluZWQgZWxzZXdoZXJlLiBPbmx5IHlpZWxkcyByZWFzb25hYmxlIHJlc3VsdHMgZm9yIHJlZmVyZW5jZXN0byBQQVRIIGxpa2Ugc3RydWN0dXJlcyBvciBwcm9wZXJ0aWVzPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJyZXNvdXJjZSIgUkVRVUlSRUQ9Im9uZSBvZiB0aGVzZSwgd2hlbgorICAgICAgIG5vdCB1c2luZyB0aGUgbmFtZSBhdHRyaWJ1dGUiPgorCQkJPERFU0NSSVBUSU9OPnRoZSByZXNvdXJjZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBmaWxlPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJmaWxlIiBSRVFVSVJFRD0iIj4KKwkJCTxERVNDUklQVElPTj50aGUgZmlsZW5hbWUgb2YgdGhlIHByb3BlcnR5IGZpbGUgPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJlbnZpcm9ubWVudCIgUkVRVUlSRUQ9IiI+CisJCQk8REVTQ1JJUFRJT04+dGhlIHByZWZpeCB0byB1c2Ugd2hlbiByZXRyaWV2aW5nIGVudmlyb25tZW50IHZhcmlhYmxlcy4gVGh1c2lmIHlvdSBzcGVjaWZ5IGVudmlyb25tZW50PSZxdW90O215ZW52JnF1b3Q7IHlvdSB3aWxsIGJlIGFibGUgdG8gYWNjZXNzIE9TLXNwZWNpZmljIGVudmlyb25tZW50IHZhcmlhYmxlcyB2aWEgcHJvcGVydHkgbmFtZXMgJnF1b3Q7bXllbnYuUEFUSCZxdW90OyBvciAmcXVvdDtteWVudi5URVJNJnF1b3Q7LiBOb3RlIHRoYXQgaWYgeW91IHN1cHBseSBhIHByb3BlcnR5IG5hbWUgd2l0aCBhIGZpbmFsICZxdW90Oy4mcXVvdDsgaXQgd2lsbCBub3QgYmUgZG91YmxlZC4gaWUgZW52aXJvbm1lbnQ9JnF1b3Q7bXllbnYuJnF1b3Q7IHdpbGwgc3RpbGwgYWxsb3cgYWNjZXNzIG9mIGVudmlyb25tZW50IHZhcmlhYmxlcyB0aHJvdWdoICZxdW90O215ZW52LlBBVEgmcXVvdDsgYW5kICZxdW90O215ZW52LlRFUk0mcXVvdDsuIFRoaXMgZnVuY3Rpb25hbGl0eSBpcyBjdXJyZW50bHkgb25seSBpbXBsZW1lbnRlZCBvbiBzZWxlY3QgcGxhdGZvcm1zLiBGZWVsIGZyZWUgdG8gc2VuZCBwYXRjaGVzIHRvIGluY3JlYXNlIHRoZSBudW1iZXIgb2YgcGxhdGZvcm1zdGhpcyBmdW5jdGlvbmFsaXR5IGlzIHN1cHBvcnRlZCBvbiA7KU5vdGUgYWxzbyB0aGF0IHByb3BlcnRpZXMgYXJlIGNhc2Ugc2Vuc2l0aXZlLCBldmVuIGlmIHRoZWVudmlyb25tZW50IHZhcmlhYmxlcyBvbiB5b3VyIG9wZXJhdGluZyBzeXN0ZW0gYXJlIG5vdCwgZS5nLiBpdHdpbGwgYmUgJHtlbnYuUGF0aH0gbm90ICR7ZW52LlBBVEh9IG9uIFdpbmRvd3MgMjAwMDwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iY2xhc3NwYXRoIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPnRoZSBjbGFzc3BhdGggdG8gdXNlIHdoZW4gbG9va2luZyB1cCBhIHJlc291cmNlPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJjbGFzc3BhdGhyZWYiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+dGhlIGNsYXNzcGF0aCB0byB1c2Ugd2hlbiBsb29raW5nIHVwIGEgcmVzb3VyY2UsZ2l2ZW4gYXMgcmVmZXJlbmNlIHRvIGEgJmx0O3BhdGgmZ3Q7IGRlZmluZWRlbHNld2hlcmUuPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJwcmVmaXgiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+UHJlZml4IHRvIGFwcGx5IHRvIHByb3BlcnRpZXMgbG9hZGVkIHVzaW5nIGZpbGVvciByZXNvdXJjZS4gQSAmcXVvdDsuJnF1b3Q7IGlzIGFwcGVuZGVkIHRvIHRoZSBwcmVmaXggaWYgbm90IHNwZWNpZmllZDwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCTwvVEFTSz4KKwk8VEFTSyBOQU1FPSJyZWNvcmRlciI+CisJCTxERVNDUklQVElPTj4mbHQ7cCZndDtBIHJlY29yZGVyIGlzIGEgbGlzdGVuZXIgdG8gdGhlIGN1cnJlbnQgYnVpbGQgcHJvY2VzcyB0aGF0IHJlY29yZHMgdGhlCitvdXRwdXQgdG8gYSBmaWxlLiZsdDsvcCZndDsKKyZsdDtwJmd0O1NldmVyYWwgcmVjb3JkZXJzIGNhbiBleGlzdCBhdCB0aGUgc2FtZSB0aW1lLiAgRWFjaCByZWNvcmRlciBpcworYXNzb2NpYXRlZCB3aXRoIGEgZmlsZS4gIFRoZSBmaWxlbmFtZSBpcyB1c2VkIGFzIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yCit0aGUgcmVjb3JkZXJzLiAgVGhlIGZpcnN0IGNhbGwgdG8gdGhlIHJlY29yZGVyIHRhc2sgd2l0aCBhbiB1bnVzZWQgZmlsZW5hbWUKK3dpbGwgY3JlYXRlIGEgcmVjb3JkZXIgKHVzaW5nIHRoZSBwYXJhbWV0ZXJzIHByb3ZpZGVkKSBhbmQgYWRkIGl0IHRvIHRoZQorbGlzdGVuZXJzIG9mIHRoZSBidWlsZC4gIEFsbCBzdWJzZXF1ZW50IGNhbGxzIHRvIHRoZSByZWNvcmRlciB0YXNrIHVzaW5nCit0aGlzIGZpbGVuYW1lIHdpbGwgbW9kaWZ5IHRoYXQgcmVjb3JkZXJzIHN0YXRlIChyZWNvcmRpbmcgb3Igbm90KSBvciBvdGhlcgorcHJvcGVydGllcyAobGlrZSBsb2dnaW5nIGxldmVsKS4mbHQ7L3AmZ3Q7CismbHQ7cCZndDtTb21lIHRlY2huaWNhbCBpc3N1ZXM6IHRoZSBmaWxlJ3MgcHJpbnQgc3RyZWFtIGlzIGZsdXNoZWQgZm9yICZhbXA7cXVvdDtmaW5pc2hlZCZhbXA7cXVvdDsKK2V2ZW50cyAoYnVpbGRGaW5pc2hlZCwgdGFyZ2V0RmluaXNoZWQgYW5kIHRhc2tGaW5pc2hlZCksIGFuZCBpcyBjbG9zZWQgb24KK2EgYnVpbGRGaW5pc2hlZCBldmVudC4mbHQ7L3AmZ3Q7Cis8L0RFU0NSSVBUSU9OPgorCQk8QVRUUklCVVRFIE5BTUU9Im5hbWUiIFJFUVVJUkVEPSJ5ZXMiPgorCQkJPERFU0NSSVBUSU9OPlRoZSBuYW1lIG9mIHRoZSBmaWxlIHRoaXMgbG9nZ2VyIGlzIGFzc29jaWF0ZWQgd2l0aDwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iYWN0aW9uIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPlRoaXMgdGVsbHMgdGhlIGxvZ2dlciB3aGF0IHRvIGRvOiBzaG91bGQgaXQgc3RhcnRyZWNvcmRpbmcgb3Igc3RvcD8gIFRoZSBmaXJzdCB0aW1lIHRoYXQgdGhlIHJlY29yZGVyIHRhc2sgaXMgY2FsbGVkIGZvcnRoaXMgbG9nZmlsZSwgYW5kIGlmIHRoaXMgYXR0cmlidXRlIGlzIG5vdCBwcm92aWRlZCwgdGhlbiB0aGUgZGVmYXVsdGZvciB0aGlzIGF0dHJpYnV0ZSBpcyAmcXVvdDtzdGFydCZxdW90Oy4gIElmIHRoaXMgYXR0cmlidXRlIGlzIG5vdCBwcm92aWRlZCBvbnN1YnNlcXVlbnQgY2FsbHMsIHRoZW4gdGhlIHN0YXRlIHJlbWFpbnMgYXMgcHJldmlvdXMuW1ZhbHVlcyA9IHtzdGFydHxzdG9wfSwgRGVmYXVsdCA9IG5vIHN0YXRlIGNoYW5nZTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iYXBwZW5kIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPlNob3VsZCB0aGUgcmVjb3JkZXIgYXBwZW5kIHRvIGEgZmlsZSwgb3IgY3JlYXRlIGEgbmV3b25lPyBUaGlzIGlzIG9ubHkgYXBwbGljYWJsZSB0aGUgZmlyc3QgdGltZSB0aGlzIHRhc2sgaXMgY2FsbGVkIGZvcnRoaXMgZmlsZS4gIFtWYWx1ZXMgPSB7eWVzfG5vfSwgRGVmYXVsdD15ZXM8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImVtYWNzbW9kZSIgUkVRVUlSRUQ9Im5vLCBkZWZhdWx0IGlzIGZhbHNlIj4KKwkJCTxERVNDUklQVElPTj5SZW1vdmVzIFt0YXNrXSBiYW5uZXJzIGxpa2UgQW50J3MtZW1hY3MgY29tbWFuZCBsaW5lIHN3aXRjaCBpZiBzZXQgdG90cnVlPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJsb2dsZXZlbCIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5BdCB3aGF0IGxvZ2dpbmcgbGV2ZWwgc2hvdWxkIHRoaXMgcmVjb3JkZXIgaW5zdGFuY2VyZWNvcmQgdG8/ICBUaGlzIGlzIG5vdCBhIG9uY2Ugb25seSBwYXJhbWV0ZXIgKGxpa2UgYXBwZW5kaXMpIC0tIHlvdSBjYW4gaW5jcmVhc2Ugb3IgZGVjcmVhc2UgdGhlIGxvZ2dpbmcgbGV2ZWwgYXMgdGhlIGJ1aWxkIHByb2Nlc3Njb250aW51ZXMuICBbVmFsdWVzPSB7ZXJyb3J8d2FybnxpbmZvfHZlcmJvc2V8ZGVidWd9LCBEZWZhdWx0ID0gbm8gY2hhbmdlXTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCTwvVEFTSz4KKwk8VEFTSyBOQU1FPSJyZW5hbWUiPgorCQk8REVTQ1JJUFRJT04+Jmx0O3AmZ3Q7UmVuYW1lcyBhIGdpdmVuIGZpbGUuJmx0Oy9wJmd0OworPC9ERVNDUklQVElPTj4KKwkJPEFUVFJJQlVURSBOQU1FPSJzcmMiIFJFUVVJUkVEPSJ5ZXMiPgorCQkJPERFU0NSSVBUSU9OPmZpbGUgdG8gcmVuYW1lPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJkZXN0IiBSRVFVSVJFRD0ieWVzIj4KKwkJCTxERVNDUklQVElPTj5uZXcgbmFtZSBvZiB0aGUgZmlsZTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0icmVwbGFjZSIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5FbmFibGUgcmVwbGFjaW5nIG9mIGV4aXN0aW5nIGZpbGUgKGRlZmF1bHQ6IG9uKTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCTwvVEFTSz4KKwk8VEFTSyBOQU1FPSJyZXBsYWNlIj4KKwkJPERFU0NSSVBUSU9OPiZsdDtwJmd0O1JlcGxhY2UgaXMgYSBkaXJlY3RvcnkgYmFzZWQgdGFzayBmb3IgcmVwbGFjaW5nIHRoZSBvY2N1cnJlbmNlIG9mIGEgZ2l2ZW4gc3RyaW5nIHdpdGggYW5vdGhlciBzdHJpbmcgCitpbiBzZWxlY3RlZCBmaWxlLiZsdDsvcCZndDsKKyZsdDtwJmd0O0lmIHlvdSB3YW50IHRvIHJlcGxhY2UgYSB0ZXh0IHRoYXQgY3Jvc3NlcyBsaW5lIGJvdW5kYXJpZXMsIHlvdQorbXVzdCB1c2UgYSBuZXN0ZWQgJmx0O2NvZGUmZ3Q7JmFtcDtsdDtyZXBsYWNldG9rZW4mYW1wO2d0OyZsdDsvY29kZSZndDsgZWxlbWVudC4mbHQ7L3AmZ3Q7Cis8L0RFU0NSSVBUSU9OPgorCQk8QVRUUklCVVRFIE5BTUU9ImZpbGUiIFJFUVVJUkVEPSJleGFjdGx5IG9uZSBvZiB0aGUgdHdvLiI+CisJCQk8REVTQ1JJUFRJT04+ZmlsZSBmb3Igd2hpY2ggdGhlIHRva2VuIHNob3VsZCBiZSByZXBsYWNlZDwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZGlyIiBSRVFVSVJFRD0iIj4KKwkJCTxERVNDUklQVElPTj5UaGUgYmFzZSBkaXJlY3RvcnkgdG8gdXNlIHdoZW4gcmVwbGFjaW5nIGEgdG9rZW4gaW4gbXVsdGlwbGUgZmlsZXM8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImVuY29kaW5nIiBSRVFVSVJFRD0ibm8gLSBkZWZhdWx0cyB0byBkZWZhdWx0IGp2bSBlbmNvZGluZyI+CisJCQk8REVTQ1JJUFRJT04+VGhlIGVuY29kaW5nIG9mIHRoZSBmaWxlcyB1cG9uIHdoaWNoIHJlcGxhY2Ugb3BlcmF0ZXM8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9InRva2VuIiBSRVFVSVJFRD0ieWVzLCB1bmxlc3MgYSBuZXN0ZWQKKyAgICAgcmVwbGFjZXRva2VuIGVsZW1lbnQgb3IgdGhlIHJlcGxhY2VmaWx0ZXJmaWxlCisgICAgIGF0dHJpYnV0ZSBpcyB1c2VkLiI+CisJCQk8REVTQ1JJUFRJT04+dGhlIHRva2VuIHdoaWNoIG11c3QgYmUgcmVwbGFjZWQ8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9InZhbHVlIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPnRoZSBuZXcgdmFsdWUgZm9yIHRoZSB0b2tlbi4gV2hlbiBvbWl0dGVkLCBhbiBlbXB0eSBzdHJpbmcoJnF1b3Q7JnF1b3Q7KSBpcyB1c2VkPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJzdW1tYXJ5IiBSRVFVSVJFRD0ibm8sIGJ5IGRlZmF1bHQgbm8gc3VtbWFyeSBpcyBwcm9kdWNlZCI+CisJCQk8REVTQ1JJUFRJT04+SW5kaWNhdGVzIHdoZXRoZXIgYSBzdW1tYXJ5IG9mIHRoZSByZXBsYWNlIG9wZXJhdGlvbiBzaG91bGQgYmUgcHJvZHVjZWQsIGRldGFpbGluZyBob3cgbWFueSB0b2tlbiBvY2N1cnJlbmNlcyBhbmQgZmlsZXMgd2VyZSBwcm9jZXNzZWQ8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9InByb3BlcnR5ZmlsZSIgUkVRVUlSRUQ9InllcyBvbmx5IGlmIHByb3BlcnR5IGF0dHJpYnV0ZSBvZiAmbHQ7cmVwbGFjZWZpbHRlciZndDsgaXMgdXNlZC4iPgorCQkJPERFU0NSSVBUSU9OPnZhbGlkIHByb3BlcnR5IGZpbGUgZnJvbSB3aGljaCBwcm9wZXJ0aWVzIHNwZWNpZmllZCB1c2luZyBuZXN0ZWQgJmx0O3JlcGxhY2VmaWx0ZXImZ3Q7IGVsZW1lbnRzIGFyZSBkcmF3bjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0icmVwbGFjZWZpbHRlcmZpbGUiIFJFUVVJUkVEPSJuby4iPgorCQkJPERFU0NSSVBUSU9OPnZhbGlkIHByb3BlcnR5IGZpbGUuICBFYWNoIHByb3BlcnR5IHdpbGwgYmV0cmVhdGVkIGFzIGEgcmVwbGFjZWZpbHRlciB3aGVyZSB0b2tlbiBpcyB0aGUgbmFtZSBvZnRoZSBwcm9wZXJ0eSBhbmQgdmFsdWUgaXMgdGhlIHByb3BlcnRpZXMgdmFsdWUuPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJpbmNsdWRlcyIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5jb21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgb2YgZmlsZXMgdGhhdCBtdXN0IGJlaW5jbHVkZWQuIEFsbCBmaWxlcyBhcmUgaW5jbHVkZWQgd2hlbiBvbWl0dGVkPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJpbmNsdWRlc2ZpbGUiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+dGhlIG5hbWUgb2YgYSBmaWxlLiBFYWNoIGxpbmUgb2YgdGhpcyBmaWxlIGlzdGFrZW4gdG8gYmUgYW4gaW5jbHVkZSBwYXR0ZXI8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImV4Y2x1ZGVzIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPmNvbW1hLSBvciBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucyBvZiBmaWxlcyB0aGF0IG11c3QgYmVleGNsdWRlZC4gTm8gZmlsZXMgKGV4Y2VwdCBkZWZhdWx0IGV4Y2x1ZGVzKSBhcmUgZXhjbHVkZWQgd2hlbiBvbWl0dGVkPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJleGNsdWRlc2ZpbGUiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+dGhlIG5hbWUgb2YgYSBmaWxlLiBFYWNoIGxpbmUgb2YgdGhpcyBmaWxlIGlzdGFrZW4gdG8gYmUgYW4gZXhjbHVkZSBwYXR0ZXI8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImRlZmF1bHRleGNsdWRlcyIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5pbmRpY2F0ZXMgd2hldGhlciBkZWZhdWx0IGV4Y2x1ZGVzIHNob3VsZCBiZSB1c2VkIG9yIG5vdCgmcXVvdDt5ZXMmcXVvdDsvJnF1b3Q7bm8mcXVvdDspLiBEZWZhdWx0IGV4Y2x1ZGVzIGFyZSB1c2VkIHdoZW4gb21pdHRlZDwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCTwvVEFTSz4KKwk8VEFTSyBOQU1FPSJybWljIj4KKwkJPERFU0NSSVBUSU9OPiZsdDtwJmd0O1J1bnMgdGhlIHJtaWMgY29tcGlsZXIgZm9yIGEgY2VydGFpbiBjbGFzcy4mbHQ7L3AmZ3Q7CismbHQ7cCZndDtSbWljIGNhbiBiZSBydW4gb24gYSBzaW5nbGUgY2xhc3MgKGFzIHNwZWNpZmllZCB3aXRoIHRoZSBjbGFzc25hbWUKK2F0dHJpYnV0ZSkgb3IgYSBudW1iZXIgb2YgY2xhc3NlcyBhdCBvbmNlIChhbGwgY2xhc3NlcyBiZWxvdyBiYXNlIHRoYXQKK2FyZSBuZWl0aGVyIF9TdHViIG5vciBfU2tlbCBjbGFzc2VzKS4gIElmIHlvdSB3YW50IHRvIHJtaWMgYSBzaW5nbGUKK2NsYXNzIGFuZCB0aGlzIGNsYXNzIGlzIGEgY2xhc3MgbmVzdGVkIGludG8gYW5vdGhlciBjbGFzcywgeW91IGhhdmUgdG8KK3NwZWNpZnkgdGhlIGNsYXNzbmFtZSBpbiB0aGUgZm9ybSAmbHQ7Y29kZSZndDtPdXRlciQkSW5uZXImbHQ7L2NvZGUmZ3Q7IGluc3RlYWQgb2YKKyZsdDtjb2RlJmd0O091dGVyLklubmVyJmx0Oy9jb2RlJmd0Oy4mbHQ7L3AmZ3Q7CismbHQ7cCZndDtJdCBpcyBwb3NzaWJsZSB0byByZWZpbmUgdGhlIHNldCBvZiBmaWxlcyB0aGF0IGFyZSBiZWluZyBybWljZWQuIFRoaXMgY2FuIGJlCitkb25lIHdpdGggdGhlICZsdDtpJmd0O2luY2x1ZGVzJmx0Oy9pJmd0OywgJmx0O2kmZ3Q7aW5jbHVkZXNmaWxlJmx0Oy9pJmd0OywgJmx0O2kmZ3Q7ZXhjbHVkZXMmbHQ7L2kmZ3Q7LCAmbHQ7aSZndDtleGNsdWRlc2ZpbGUmbHQ7L2kmZ3Q7IGFuZCAmbHQ7aSZndDtkZWZhdWx0ZXhjbHVkZXMmbHQ7L2kmZ3Q7CithdHRyaWJ1dGVzLiBXaXRoIHRoZSAmbHQ7aSZndDtpbmNsdWRlcyZsdDsvaSZndDsgb3IgJmx0O2kmZ3Q7aW5jbHVkZXNmaWxlJmx0Oy9pJmd0OyBhdHRyaWJ1dGUgeW91IHNwZWNpZnkgdGhlIGZpbGVzIHlvdSB3YW50IHRvCitoYXZlIGluY2x1ZGVkIGJ5IHVzaW5nIHBhdHRlcm5zLiBUaGUgJmx0O2kmZ3Q7ZXhjbHVkZSZsdDsvaSZndDsgb3IgJmx0O2kmZ3Q7ZXhjbHVkZXNmaWxlJmx0Oy9pJmd0OyBhdHRyaWJ1dGUgaXMgdXNlZCB0byBzcGVjaWZ5Cit0aGUgZmlsZXMgeW91IHdhbnQgdG8gaGF2ZSBleGNsdWRlZC4gVGhpcyBpcyBhbHNvIGRvbmUgd2l0aCBwYXR0ZXJucy4gQW5kCitmaW5hbGx5IHdpdGggdGhlICZsdDtpJmd0O2RlZmF1bHRleGNsdWRlcyZsdDsvaSZndDsgYXR0cmlidXRlLCB5b3UgY2FuIHNwZWNpZnkgd2hldGhlciB5b3UKK3dhbnQgdG8gdXNlIGRlZmF1bHQgZXhjbHVzaW9ucyBvciBub3QuIFNlZSB0aGUgc2VjdGlvbiBvbiAmbHQ7YQoraHJlZj0mcXVvdDsuLi9kaXJ0YXNrcy5odG1sI2RpcmVjdG9yeWJhc2VkdGFza3MmcXVvdDsmZ3Q7ZGlyZWN0b3J5IGJhc2VkIHRhc2tzJmx0Oy9hJmd0Oywgb24gaG93IHRoZQoraW5jbHVzaW9uL2V4Y2x1c2lvbiBvZiBmaWxlcyB3b3JrcywgYW5kIGhvdyB0byB3cml0ZSBwYXR0ZXJucy4mbHQ7L3AmZ3Q7CismbHQ7cCZndDtUaGlzIHRhc2sgZm9ybXMgYW4gaW1wbGljaXQgJmx0O2EgaHJlZj0mcXVvdDsuLi9Db3JlVHlwZXMvZmlsZXNldC5odG1sJnF1b3Q7Jmd0O0ZpbGVTZXQmbHQ7L2EmZ3Q7IGFuZAorc3VwcG9ydHMgYWxsIGF0dHJpYnV0ZXMgb2YgJmx0O2NvZGUmZ3Q7JmFtcDtsdDtmaWxlc2V0JmFtcDtndDsmbHQ7L2NvZGUmZ3Q7CisoJmx0O2NvZGUmZ3Q7ZGlyJmx0Oy9jb2RlJmd0OyBiZWNvbWVzICZsdDtjb2RlJmd0O2Jhc2UmbHQ7L2NvZGUmZ3Q7KSBhcyB3ZWxsIGFzIHRoZSBuZXN0ZWQKKyZsdDtjb2RlJmd0OyZhbXA7bHQ7aW5jbHVkZSZhbXA7Z3Q7Jmx0Oy9jb2RlJmd0OywgJmx0O2NvZGUmZ3Q7JmFtcDtsdDtleGNsdWRlJmFtcDtndDsmbHQ7L2NvZGUmZ3Q7IGFuZAorJmx0O2NvZGUmZ3Q7JmFtcDtsdDtwYXR0ZXJuc2V0JmFtcDtndDsmbHQ7L2NvZGUmZ3Q7IGVsZW1lbnRzLiZsdDsvcCZndDsKKyZsdDtwJmd0O0l0IGlzIHBvc3NpYmxlIHRvIHVzZSBkaWZmZXJlbnQgY29tcGlsZXJzLiBUaGlzIGNhbiBiZSBzZWxlY3RlZAord2l0aCB0aGUgJmFtcDtxdW90O2J1aWxkLnJtaWMmYW1wO3F1b3Q7IHByb3BlcnR5IG9yIHRoZSAmbHQ7Y29kZSZndDtjb21waWxlciZsdDsvY29kZSZndDsKK2F0dHJpYnV0ZS4gJmx0O2EgbmFtZT0mcXVvdDtjb21waWxlcnZhbHVlcyZxdW90OyZndDtUaGVyZSBhcmUgdGhyZWUgY2hvaWNlcyZsdDsvYSZndDs6Jmx0Oy9wJmd0OworJmx0O3VsJmd0OworJmx0O2xpJmd0O3N1biAodGhlIHN0YW5kYXJkIGNvbXBpbGVyIG9mIHRoZSBKREspJmx0Oy9saSZndDsKKyZsdDtsaSZndDtrYWZmZSAodGhlIHN0YW5kYXJkIGNvbXBpbGVyIG9mICZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5rYWZmZS5vcmcmcXVvdDsgdGFyZ2V0PSZxdW90O190b3AmcXVvdDsmZ3Q7S2FmZmUmbHQ7L2EmZ3Q7KSZsdDsvbGkmZ3Q7CismbHQ7bGkmZ3Q7d2VibG9naWMmbHQ7L2xpJmd0OworJmx0Oy91bCZndDsKKyZsdDtwJmd0O1RoZSAmbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly9kaW9uZS56Y3UuY3ovfnRvbWFuNDAvbWluaVJNSS8mcXVvdDsmZ3Q7bWluaVJNSSZsdDsvYSZndDsKK3Byb2plY3QgY29udGFpbnMgYSBjb21waWxlciBpbXBsZW1lbnRhdGlvbiBmb3IgdGhpcyB0YXNrIGFzIHdlbGwsCitwbGVhc2UgY29uc3VsdCBtaW5pUk1JJ3MgZG9jdW1lbnRhdGlvbiB0byBsZWFybiBob3cgdG8gdXNlIGl0LiZsdDsvcCZndDsKKzwvREVTQ1JJUFRJT04+CisJCTxBVFRSSUJVVEUgTkFNRT0iYmFzZSIgUkVRVUlSRUQ9InllcyI+CisJCQk8REVTQ1JJUFRJT04+dGhlIGxvY2F0aW9uIHRvIHN0b3JlIHRoZSBjb21waWxlZCBmaWxlczwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iY2xhc3NuYW1lIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPnRoZSBjbGFzcyBmb3Igd2hpY2ggdG8gcnVuIHJtaWM8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImZpbHRlcmluZyIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5pbmRpY2F0ZXMgd2hldGhlciB0b2tlbiBmaWx0ZXJpbmcgc2hvdWxkIHRha2UgcGxhYzwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0ic291cmNlYmFzZSIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5QYXNzIHRoZSAmcXVvdDsta2VlcGdlbmVyYXRlZCZxdW90OyBmbGFnIHRvIHJtaWMgYW5kbW92ZSB0aGUgZ2VuZXJhdGVkIHNvdXJjZSBmaWxlIHRvIHRoZSBiYXNlIGRpcmVjdG9yeTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0ic3R1YnZlcnNpb24iIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+U3BlY2lmeSB0aGUgSkRLIHZlcnNpb24gZm9yIHRoZSBnZW5lcmF0ZWQgc3R1YiBjb2RlLlNwZWNpZnkgJnF1b3Q7MS4xJnF1b3Q7IHRvIHBhc3MgdGhlICZxdW90Oy12MS4xJnF1b3Q7IG9wdGlvbiB0byBybWljPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJjbGFzc3BhdGgiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+VGhlIGNsYXNzcGF0aCB0byB1c2UgZHVyaW5nIGNvbXBpbGF0aW88L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImNsYXNzcGF0aHJlZiIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5UaGUgY2xhc3NwYXRoIHRvIHVzZSBkdXJpbmcgY29tcGlsYXRpb24sIGdpdmVuIGFzIHJlZmVyZW5jZSB0byBhIFBBVEggZGVmaW5lZCBlbHNld2hlcjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iaW5jbHVkZXMiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+Y29tbWEtIG9yIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zIG9mIGZpbGVzIHRoYXQgbXVzdCBiZWluY2x1ZGVkLiBBbGwgZmlsZXMgYXJlIGluY2x1ZGVkIHdoZW4gb21pdHRlZDwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iaW5jbHVkZXNmaWxlIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPnRoZSBuYW1lIG9mIGEgZmlsZS4gRWFjaCBsaW5lIG9mIHRoaXMgZmlsZSBpc3Rha2VuIHRvIGJlIGFuIGluY2x1ZGUgcGF0dGVyPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJleGNsdWRlcyIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5jb21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgb2YgZmlsZXMgdGhhdCBtdXN0IGJlZXhjbHVkZWQuIE5vIGZpbGVzIChleGNlcHQgZGVmYXVsdCBleGNsdWRlcykgYXJlIGV4Y2x1ZGVkIHdoZW4gb21pdHRlZDwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZXhjbHVkZXNmaWxlIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPnRoZSBuYW1lIG9mIGEgZmlsZS4gRWFjaCBsaW5lIG9mIHRoaXMgZmlsZSBpc3Rha2VuIHRvIGJlIGFuIGV4Y2x1ZGUgcGF0dGVyPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJkZWZhdWx0ZXhjbHVkZXMiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+aW5kaWNhdGVzIHdoZXRoZXIgZGVmYXVsdCBleGNsdWRlcyBzaG91bGQgYmUgdXNlZCBvciBub3QoJnF1b3Q7eWVzJnF1b3Q7LyZxdW90O25vJnF1b3Q7KS4gRGVmYXVsdCBleGNsdWRlcyBhcmUgdXNlZCB3aGVuIG9taXR0ZWQ8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9InZlcmlmeSIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5jaGVjayB0aGF0IGNsYXNzZXMgaW1wbGVtZW50IFJlbW90ZSBiZWZvcmUgaGFuZGluZyB0aGVtIHRvIHJtaWMgKGRlZmF1bHQgaXMgZmFsc2U8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9Imlpb3AiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+aW5kaWNhdGVzIHRoYXQgcG9ydGFibGUgKFJNSS9JSU9QKSBzdHVicyBzaG91bGQgYmUgZ2VuZXJhdGU8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9Imlpb3BvcHRzIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPmFkZGl0aW9uYWwgYXJndW1lbnRzIGZvciBJSU9QIGNsYXNzIGdlbmVyYXRpbzwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iaWRsIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPmluZGljYXRlcyB0aGF0IElETCBvdXRwdXQgZmlsZXMgc2hvdWxkIGJlIGdlbmVyYXRlPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJpZGxvcHRzIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPmFkZGl0aW9uYWwgYXJndW1lbnRzIGZvciBJREwgZmlsZSBnZW5lcmF0aW88L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImRlYnVnIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPmdlbmVyYXRlIGRlYnVnIGluZm8gKHBhc3NlcyAtZyB0byBybWljKS4gRGVmYXVsdHMgdG8gZmFsc2U8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImluY2x1ZGVhbnRydW50aW1lIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPndoZXRoZXIgdG8gaW5jbHVkZSB0aGUgQW50IHJ1bi10aW1lIGxpYnJhcmllcztkZWZhdWx0cyB0byB5ZXM8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImluY2x1ZGVqYXZhcnVudGltZSIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj53aGV0aGVyIHRvIGluY2x1ZGUgdGhlIGRlZmF1bHQgcnVuLXRpbWVsaWJyYXJpZXMgZnJvbSB0aGUgZXhlY3V0aW5nIFZNOyBkZWZhdWx0cyB0byBubzwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZXh0ZGlycyIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5sb2NhdGlvbiBvZiBpbnN0YWxsZWQgZXh0ZW5zaW9uczwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iY29tcGlsZXIiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+VGhlIGNvbXBpbGVyIGltcGxlbWVudGF0aW9uIHRvIHVzZS5JZiB0aGlzIGF0dHJpYnV0ZSBpcyBub3Qgc2V0LCB0aGUgdmFsdWUgb2YgdGhlYnVpbGQucm1pYyBwcm9wZXJ0eSwgaWYgc2V0LCB3aWxsIGJlIHVzZWQuT3RoZXJ3aXNlLCB0aGUgZGVmYXVsdCBjb21waWxlciBmb3IgdGhlIGN1cnJlbnQgVk0gd2lsbCBiZSB1c2VkLihTZWUgdGhlIGFib3ZlIGxpc3Qgb2YgdmFsaWRjb21waWxlcnMuPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisJPC9UQVNLPgorCTxUQVNLIE5BTUU9InNlcXVlbnRpYWwiPgorCQk8REVTQ1JJUFRJT04+Jmx0O3AmZ3Q7U2VxdWVudGlhbCBpcyBhIGNvbnRhaW5lciB0YXNrIC0gaXQgY2FuIGNvbnRhaW4gb3RoZXIgQW50IHRhc2tzLiBUaGUgbmVzdGVkIAordGFza3MgYXJlIHNpbXBseSBleGVjdXRlZCBpbiBzZXF1ZW5jZS4gU2VxdWVudGlhbCdzIHByaW1hcnkgdXNlIGlzIHRvIHN1cHBvcnQgCit0aGUgc2VxdWVudGlhbCBleGVjdXRpb24gb2YgYSBzdWJzZXQgb2YgdGFza3Mgd2l0aGluIHRoZSAKKyZsdDthIGhyZWY9JnF1b3Q7cGFyYWxsZWwuaHRtbCZxdW90OyZndDtwYXJhbGxlbCZsdDsvYSZndDsgdGFzayZsdDsvcCZndDsKKyZsdDtwJmd0O1RoZSBzZXF1ZW50aWFsIHRhc2sgaGFzIG5vIGF0dHJpYnV0ZXMgYW5kIGRvZXMgbm90IHN1cHBvcnQgYW55IG5lc3RlZCAKK2VsZW1lbnRzIGFwYXJ0IGZyb20gQW50IHRhc2tzLiBBbnkgdmFsaWQgQW50IHRhc2sgbWF5IGJlIGVtYmVkZGVkIHdpdGhpbiB0aGUgCitzZXF1ZW50aWFsIHRhc2suJmx0Oy9wJmd0OworJmx0O2gzJmd0O0V4YW1wbGUmbHQ7L2gzJmd0OworJmx0O3ByZSZndDsKKyZhbXA7bHQ7cGFyYWxsZWwmYW1wO2d0OworJmFtcDtsdDt3bHJ1biAuLi4gJmFtcDtndDsKKyZhbXA7bHQ7c2VxdWVudGlhbCZhbXA7Z3Q7CismYW1wO2x0O3NsZWVwIHNlY29uZHM9JmFtcDtxdW90OzMwJmFtcDtxdW90Oy8mYW1wO2d0OworJmFtcDtsdDtqdW5pdCAuLi4gJmFtcDtndDsKKyZhbXA7bHQ7d2xzdG9wLyZhbXA7Z3Q7CismYW1wO2x0Oy9zZXF1ZW50aWFsJmFtcDtndDsKKyZhbXA7bHQ7L3BhcmFsbGVsJmFtcDtndDsKKyZsdDsvcHJlJmd0OworJmx0O3AmZ3Q7VGhpcyBleGFtcGxlIHNob3dzIGhvdyB0aGUgc2VxdWVudGlhbCB0YXNrIGlzIHVzZWQgdG8gZXhlY3V0ZSB0aHJlZSB0YXNrcyBpbgorc2VxdWVuY2UsIHdoaWxlIGFub3RoZXIgdGFzayBpcyBiZWluZyBleGVjdXRlZCBpbiBhIHNlcGFyYXRlIHRocmVhZC4gJmx0Oy9wJmd0OworJmx0O2hyJmd0OworJmx0O3AgYWxpZ249JnF1b3Q7Y2VudGVyJnF1b3Q7Jmd0O0NvcHlyaWdodCAmYW1wO2NvcHk7IDIwMDEtMjAwMiBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gQWxsIHJpZ2h0cworUmVzZXJ2ZWQuJmx0Oy9wJmd0OworJmx0Oy9ib2R5Jmd0OworJmx0Oy9odG1sJmd0OworPC9ERVNDUklQVElPTj4JPC9UQVNLPgorCTxUQVNLIE5BTUU9InNpZ25qYXIiPgorCQk8REVTQ1JJUFRJT04+Jmx0O3AmZ3Q7U2lnbnMgamFyIG9yIHppcCBmaWxlcyB3aXRoIHRoZSBqYXZhc2lnbiBjb21tYW5kIGxpbmUgdG9vbC4gVGhlCit0b29sIGRldGFpbGVkIGRlcGVuZGVuY3kgY2hlY2tpbmc6IGZpbGVzIGFyZSBvbmx5IHNpZ25lZCBpZiB0aGV5CithcmUgbm90IHNpZ25lZC4gVGhlICZsdDt0dCZndDtzaWduamFyJmx0Oy90dCZndDsgYXR0cmlidXRlIGNhbiBwb2ludCB0byB0aGUgZmlsZSB0bworZ2VuZXJhdGU7IGlmIHRoaXMgZmlsZSBleGlzdHMgdGhlbgoraXRzIG1vZGlmaWNhdGlvbiBkYXRlIGlzIHVzZWQgYXMgYSBjdWUgYXMgdG8gd2hldGhlciB0byByZXNpZ24gYW55IEpBUiBmaWxlLgorJmx0O2JyJmd0OyAgCismbHQ7c3Ryb25nJmd0O05vdGU6Jmx0Oy9zdHJvbmcmZ3Q7IFJlcXVpcmVzIEphdmEgMS4yIG9yIGxhdGVyLiAmbHQ7L3AmZ3Q7Cis8L0RFU0NSSVBUSU9OPgorCQk8QVRUUklCVVRFIE5BTUU9ImphciIgUkVRVUlSRUQ9Inllcy4iPgorCQkJPERFU0NSSVBUSU9OPnRoZSBqYXIgZmlsZSB0byBzaWc8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImFsaWFzIiBSRVFVSVJFRD0ieWVzLiI+CisJCQk8REVTQ1JJUFRJT04+dGhlIGFsaWFzIHRvIHNpZ24gdW5kZTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0ic3RvcmVwYXNzIiBSRVFVSVJFRD0ieWVzLiI+CisJCQk8REVTQ1JJUFRJT04+cGFzc3dvcmQgZm9yIGtleXN0b3JlIGludGVncml0eTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0ia2V5c3RvcmUiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+a2V5c3RvcmUgbG9jYXRpbzwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0ic3RvcmV0eXBlIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPmtleXN0b3JlIHR5cDwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0ia2V5cGFzcyIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5wYXNzd29yZCBmb3IgcHJpdmF0ZSBrZXkgKGlmIGRpZmZlcmVudDwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0ic2lnZmlsZSIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5uYW1lIG9mIC5TRi8uRFNBIGZpbDwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0ic2lnbmVkamFyIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPm5hbWUgb2Ygc2lnbmVkIEpBUiBmaWw8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9InZlcmJvc2UiIFJFUVVJUkVEPSJubzsgZGVmYXVsdCBmYWxzZSI+CisJCQk8REVTQ1JJUFRJT04+KHRydWUgfCBmYWxzZSkgdmVyYm9zZSBvdXRwdXQgd2hlbiBzaWduaW48L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImludGVybmFsc2YiIFJFUVVJUkVEPSJubzsgZGVmYXVsdCBmYWxzZSI+CisJCQk8REVTQ1JJUFRJT04+KHRydWUgfCBmYWxzZSkgaW5jbHVkZSB0aGUgLlNGIGZpbGUgaW5zaWRlIHRoZSBzaWduYXR1cmVibG9jPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJzZWN0aW9uc29ubHkiIFJFUVVJUkVEPSJubzsgZGVmYXVsdCBmYWxzZSI+CisJCQk8REVTQ1JJUFRJT04+KHRydWUgfCBmYWxzZSkgZG9uJ3QgY29tcHV0ZSBoYXNoIG9mIGVudGlyZSBtYW5pZmVzPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJsYXp5IiBSRVFVSVJFRD0ibm87IGRlZmF1bHQgZmFsc2UiPgorCQkJPERFU0NSSVBUSU9OPmZsYWcgdG8gY29udHJvbCB3aGV0aGVyIHRoZSBwcmVzZW5jZSBvZiBhIHNpZ25hdHVyZWZpbGUgbWVhbnMgYSBKQVIgaXMgc2lnbmU8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKwk8L1RBU0s+CisJPFRBU0sgTkFNRT0ic2xlZXAiPgorCQk8REVTQ1JJUFRJT04+Jmx0O3AmZ3Q7IEEgdGFzayBmb3Igc2xlZXBpbmcgYSBzaG9ydCBwZXJpb2Qgb2YgdGltZSwgdXNlZnVsIHdoZW4gYSBidWlsZCBvciBkZXBsb3ltZW50IAorcHJvY2VzcyByZXF1aXJlcyBhbiBpbnRlcnZhbCBiZXR3ZWVuIHRhc2tzLiZsdDsvcCZndDsKKzwvREVTQ1JJUFRJT04+CisJCTxBVFRSSUJVVEUgTkFNRT0iaG91cnMiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+aG91cnMgdG8gdG8gYWRkIHRvIHRoZSBzbGVlcCB0aW08L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9Im1pbnV0ZXMiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+bWludXRlcyB0byBhZGQgdG8gdGhlIHNsZWVwIHRpbTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0ic2Vjb25kcyIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5zZWNvbmRzIHRvIGFkZCB0byB0aGUgc2xlZXAgdGltPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJtaWxsaXNlY29uZHMiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+bWlsbGlzZWNvbmRzIHRvIGFkZCB0byB0aGUgc2xlZXAgdGltPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJmYWlsb25lcnJvciIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5mbGFnIGNvbnRyb2xsaW5nIHdoZXRoZXIgdG8gYnJlYWsgdGhlIGJ1aWxkIG9uIGFuIGVycm9yLiA8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKwk8L1RBU0s+CisJPFRBU0sgTkFNRT0ic3FsIj4KKwkJPERFU0NSSVBUSU9OPiZsdDtwJmd0O0V4ZWN1dGVzIGEgc2VyaWVzIG9mIFNRTCBzdGF0ZW1lbnRzIHZpYSBKREJDIHRvIGEgZGF0YWJhc2UuIFN0YXRlbWVudHMgY2FuIAorZWl0aGVyIGJlIHJlYWQgaW4gZnJvbSBhIHRleHQgZmlsZSB1c2luZyB0aGUgJmx0O2kmZ3Q7c3JjJmx0Oy9pJmd0OyBhdHRyaWJ1dGUgb3IgZnJvbSAKK2JldHdlZW4gdGhlIGVuY2xvc2luZyBTUUwgdGFncy4mbHQ7L3AmZ3Q7CismbHQ7cCZndDtNdWx0aXBsZSBzdGF0ZW1lbnRzIGNhbiBiZSBwcm92aWRlZCwgc2VwYXJhdGVkIGJ5IHNlbWljb2xvbnMgKG9yIHRoZSAKK2RlZmluZWQgJmx0O2kmZ3Q7ZGVsaW1pdGVyJmx0Oy9pJmd0OykuIEluZGl2aWR1YWwgbGluZXMgd2l0aGluIHRoZSBzdGF0ZW1lbnRzIGNhbiBiZSAKK2NvbW1lbnRlZCB1c2luZyBlaXRoZXIgLS0sIC8vIG9yIFJFTSBhdCB0aGUgc3RhcnQgb2YgdGhlIGxpbmUuJmx0Oy9wJmd0OworJmx0O3AmZ3Q7VGhlICZsdDtpJmd0O2F1dG9jb21taXQmbHQ7L2kmZ3Q7IGF0dHJpYnV0ZSBzcGVjaWZpZXMgd2hldGhlciBhdXRvLWNvbW1pdCBzaG91bGQgYmUgCit0dXJuZWQgb24gb3Igb2ZmIHdoaWxzdCBleGVjdXRpbmcgdGhlIHN0YXRlbWVudHMuIElmIGF1dG8tY29tbWl0IGlzIHR1cm5lZCAKK29uIGVhY2ggc3RhdGVtZW50IHdpbGwgYmUgZXhlY3V0ZWQgYW5kIGNvbW1pdHRlZC4gSWYgaXQgaXMgdHVybmVkIG9mZiB0aGUgCitzdGF0ZW1lbnRzIHdpbGwgYWxsIGJlIGV4ZWN1dGVkIGFzIG9uZSB0cmFuc2FjdGlvbi4mbHQ7L3AmZ3Q7CismbHQ7cCZndDtUaGUgJmx0O2kmZ3Q7b25lcnJvciZsdDsvaSZndDsgYXR0cmlidXRlIHNwZWNpZmllcyBob3cgdG8gcHJvY2VlZCB3aGVuIGFuIGVycm9yIG9jY3VycyAKK2R1cmluZyB0aGUgZXhlY3V0aW9uIG9mIG9uZSBvZiB0aGUgc3RhdGVtZW50cy4gCitUaGUgcG9zc2libGUgdmFsdWVzIGFyZTogJmx0O2ImZ3Q7Y29udGludWUmbHQ7L2ImZ3Q7IGV4ZWN1dGlvbiwgb25seSBzaG93IHRoZSBlcnJvcjsKKyZsdDtiJmd0O3N0b3AmbHQ7L2ImZ3Q7IGV4ZWN1dGlvbiBhbmQgY29tbWl0IHRyYW5zYWN0aW9uOworYW5kICZsdDtiJmd0O2Fib3J0Jmx0Oy9iJmd0OyBleGVjdXRpb24gYW5kIHRyYW5zYWN0aW9uIGFuZCBmYWlsIHRhc2suJmx0Oy9wJmd0OworPC9ERVNDUklQVElPTj4KKwkJPEFUVFJJQlVURSBOQU1FPSJkcml2ZXIiIFJFUVVJUkVEPSJ5ZXMiPgorCQkJPERFU0NSSVBUSU9OPkNsYXNzIG5hbWUgb2YgdGhlIGpkYmMgZHJpdmU8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9InVybCIgUkVRVUlSRUQ9InllcyI+CisJCQk8REVTQ1JJUFRJT04+RGF0YWJhc2UgY29ubmVjdGlvbiB1cjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0idXNlcmlkIiBSRVFVSVJFRD0ieWVzIj4KKwkJCTxERVNDUklQVElPTj5EYXRhYmFzZSB1c2VyIG5hbTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0icGFzc3dvcmQiIFJFUVVJUkVEPSJ5ZXMiPgorCQkJPERFU0NSSVBUSU9OPkRhdGFiYXNlIHBhc3N3b3I8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9InNyYyIgUkVRVUlSRUQ9InllcywgdW5sZXNzIHN0YXRlbWVudHMgZW5jbG9zZWQgd2l0aGluIHRhZ3MiPgorCQkJPERFU0NSSVBUSU9OPkZpbGUgY29udGFpbmluZyBTUUwgc3RhdGVtZW50PC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJlbmNvZGluZyIgUkVRVUlSRUQ9Im5vIC0gZGVmYXVsdHMgdG8gZGVmYXVsdCBqdm0gZW5jb2RpbmciPgorCQkJPERFU0NSSVBUSU9OPlRoZSBlbmNvZGluZyBvZiB0aGUgZmlsZXMgY29udGFpbmluZyBTUUwgc3RhdGVtZW50PC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJkZWxpbWl0ZXIiIFJFUVVJUkVEPSJubywgZGVmYXVsdCAmcXVvdDs7JnF1b3Q7Ij4KKwkJCTxERVNDUklQVElPTj5TdHJpbmcgdGhhdCBzZXBhcmF0ZXMgU1FMIHN0YXRlbWVudDwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iYXV0b2NvbW1pdCIgUkVRVUlSRUQ9Im5vLCBkZWZhdWx0ICZxdW90O2ZhbHNlJnF1b3Q7Ij4KKwkJCTxERVNDUklQVElPTj5BdXRvIGNvbW1pdCBmbGFnIGZvciBkYXRhYmFzZSBjb25uZWN0aW9uIChkZWZhdWx0IGZhbHNlPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJwcmludCIgUkVRVUlSRUQ9Im5vLCBkZWZhdWx0ICZxdW90O2ZhbHNlJnF1b3Q7Ij4KKwkJCTxERVNDUklQVElPTj5QcmludCByZXN1bHQgc2V0cyBmcm9tIHRoZSBzdGF0ZW1lbnRzIChkZWZhdWx0IGZhbHNlPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJzaG93aGVhZGVycyIgUkVRVUlSRUQ9Im5vLCBkZWZhdWx0ICZxdW90O3RydWUmcXVvdDsiPgorCQkJPERFU0NSSVBUSU9OPlByaW50IGhlYWRlcnMgZm9yIHJlc3VsdCBzZXRzIGZyb20gdGhlIHN0YXRlbWVudHMgKGRlZmF1bHQgdHJ1ZTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0ib3V0cHV0IiBSRVFVSVJFRD0ibm8gKHByaW50IHRvIHN5c3RlbS5vdXQgYnkgZGVmYXVsdCkiPgorCQkJPERFU0NSSVBUSU9OPk91dHB1dCBmaWxlIGZvciByZXN1bHQgc2V0cyAoZGVmYXVsdHMgdG8gU3lzdGVtLm91dDwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iYXBwZW5kIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPndoZXRoZXIgb3V0cHV0IHNob3VsZCBiZSBhcHBlbmRlZCB0byBvciBvdmVyd3JpdGVhbiBleGlzdGluZyBmaWxlLiAgRGVmYXVsdHMgdG8gZmFsc2U8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImNsYXNzcGF0aCIgUkVRVUlSRUQ9Im5vICh1c2Ugc3lzdGVtIGNsYXNzcGF0aCkiPgorCQkJPERFU0NSSVBUSU9OPkNsYXNzcGF0aCB1c2VkIHRvIGxvYWQgZHJpdmU8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImNsYXNzcGF0aHJlZiIgUkVRVUlSRUQ9Im5vICh1c2Ugc3lzdGVtIGNsYXNzcGF0aCkiPgorCQkJPERFU0NSSVBUSU9OPlRoZSBjbGFzc3BhdGggdG8gdXNlLCBnaXZlbiBhcyBhIHJlZmVyZW5jZSB0byBhIHBhdGggZGVmaW5lZCBlbHNld2hlcmU8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9Im9uZXJyb3IiIFJFUVVJUkVEPSJubywgZGVmYXVsdCAmcXVvdDthYm9ydCZxdW90OyI+CisJCQk8REVTQ1JJUFRJT04+QWN0aW9uIHRvIHBlcmZvcm0gd2hlbiBzdGF0ZW1lbnQgZmFpbHM6IGNvbnRpbnVlLCBzdG9wLCBhYm9yPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJyZGJtcyIgUkVRVUlSRUQ9Im5vIChubyByZXN0cmljdGlvbikiPgorCQkJPERFU0NSSVBUSU9OPkV4ZWN1dGUgdGFzayBvbmx5IGlmIHRoaXMgcmRibTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0idmVyc2lvbiIgUkVRVUlSRUQ9Im5vIChubyByZXN0cmljdGlvbikiPgorCQkJPERFU0NSSVBUSU9OPkV4ZWN1dGUgdGFzayBvbmx5IGlmIHJkYm1zIHZlcnNpb24gbWF0YzwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iY2FjaGluZyIgUkVRVUlSRUQ9Im5vIChkZWZhdWx0PXRydWUpIj4KKwkJCTxERVNDUklQVElPTj5TaG91bGQgdGhlIHRhc2sgY2FjaGUgbG9hZGVycyBhbmQgdGhlIGRyaXZlcjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCTwvVEFTSz4KKwk8VEFTSyBOQU1FPSJ0YXIiPgorCQk8REVTQ1JJUFRJT04+Jmx0O3AmZ3Q7Q3JlYXRlcyBhIHRhciBhcmNoaXZlLiZsdDsvcCZndDsKKyZsdDtwJmd0O1RoZSAmbHQ7aSZndDtiYXNlZGlyJmx0Oy9pJmd0OyBhdHRyaWJ1dGUgaXMgdGhlIHJlZmVyZW5jZSBkaXJlY3RvcnkgZnJvbSB3aGVyZSB0byB0YXIuJmx0Oy9wJmd0OworJmx0O3AmZ3Q7VGhpcyB0YXNrIGlzIGEgJmx0O2EgaHJlZj0mcXVvdDsuLi9kaXJ0YXNrcy5odG1sI2RpcmVjdG9yeWJhc2VkdGFza3MmcXVvdDsmZ3Q7ZGlyZWN0b3J5IGJhc2VkIHRhc2smbHQ7L2EmZ3Q7CithbmQsIGFzIHN1Y2gsIGZvcm1zIGFuIGltcGxpY2l0ICZsdDthIGhyZWY9JnF1b3Q7Li4vQ29yZVR5cGVzL2ZpbGVzZXQuaHRtbCZxdW90OyZndDtGaWxlc2V0Jmx0Oy9hJmd0Oy4gVGhpcworZGVmaW5lcyB3aGljaCBmaWxlcywgcmVsYXRpdmUgdG8gdGhlICZsdDtpJmd0O2Jhc2VkaXImbHQ7L2kmZ3Q7LCB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZQorYXJjaGl2ZS4gVGhlIHRhciB0YXNrIHN1cHBvcnRzIGFsbCB0aGUgYXR0cmlidXRlcyBvZiBGaWxlc2V0IHRvIHJlZmluZSB0aGUKK3NldCBvZiBmaWxlcyB0byBiZSBpbmNsdWRlZCBpbiB0aGUgaW1wbGljaXQgZmlsZXNldC4mbHQ7L3AmZ3Q7CismbHQ7cCZndDtJbiBhZGRpdGlvbiB0byB0aGUgaW1wbGljaXQgZmlsZXNldCwgdGhlIHRhciB0YXNrIHN1cHBvcnRzIG5lc3RlZCBmaWxlc2V0cy4gVGhlc2UKK2ZpbGVzZXRzIGFyZSBleHRlbmRlZCB0byBhbGxvdyBjb250cm9sIG92ZXIgdGhlIGFjY2VzcyBtb2RlLCB1c2VybmFtZSBhbmQgZ3JvdXBuYW1lCit0byBiZSBhcHBsaWVkIHRvIHRoZSB0YXIgZW50cmllcy4gVGhpcyBpcyB1c2VmdWwsIGZvciBleGFtcGxlLCB3aGVuIHByZXBhcmluZyBhcmNoaXZlcyBmb3IKK1VuaXggc3lzdGVtcyB3aGVyZSBzb21lIGZpbGVzIG5lZWQgdG8gaGF2ZSBleGVjdXRlIHBlcm1pc3Npb24uJmx0Oy9wJmd0OworJmx0O3AmZ3Q7RWFybHkgdmVyc2lvbnMgb2YgdGFyIGRpZCBub3Qgc3VwcG9ydCBwYXRoIGxlbmd0aHMgZ3JlYXRlciB0aGFuIDEwMAorY2hhcmFjdGVycy4gTW9kZXJuIHZlcnNpb25zIG9mIHRhciBkbyBzbywgYnV0IGluIGluY29tcGF0aWJsZSB3YXlzLgorVGhlIGJlaGF2aW91ciBvZiB0aGUgdGFyIHRhc2sgd2hlbiBpdCBlbmNvdW50ZXJzIHN1Y2ggcGF0aHMgaXMKK2NvbnRyb2xsZWQgYnkgdGhlICZsdDtpJmd0O2xvbmdmaWxlJmx0Oy9pJmd0OyBhdHRyaWJ1dGUuCitJZiB0aGUgbG9uZ2ZpbGUgYXR0cmlidXRlIGlzIHNldCB0byAmbHQ7Y29kZSZndDtmYWlsJmx0Oy9jb2RlJmd0OywgYW55IGxvbmcgcGF0aHMgd2lsbAorY2F1c2UgdGhlIHRhciB0YXNrIHRvIGZhaWwuICBJZiB0aGUgbG9uZ2ZpbGUgYXR0cmlidXRlIGlzIHNldCB0bworJmx0O2NvZGUmZ3Q7dHJ1bmNhdGUmbHQ7L2NvZGUmZ3Q7LCBhbnkgbG9uZyBwYXRocyB3aWxsIGJlIHRydW5jYXRlZCB0byB0aGUgMTAwIGNoYXJhY3RlcgorbWF4aW11bSBsZW5ndGggcHJpb3IgdG8gYWRkaW5nIHRvIHRoZSBhcmNoaXZlLiBJZiB0aGUgdmFsdWUgb2YgdGhlIGxvbmdmaWxlCithdHRyaWJ1dGUgaXMgc2V0IHRvICZsdDtjb2RlJmd0O29taXQmbHQ7L2NvZGUmZ3Q7IHRoZW4gZmlsZXMgY29udGFpbmluZyBsb25nIHBhdGhzIHdpbGwgYmUKK29taXR0ZWQgZnJvbSB0aGUgYXJjaGl2ZS4gIEVpdGhlciBvcHRpb24gZW5zdXJlcyB0aGF0IHRoZSBhcmNoaXZlIGNhbiBiZQordW50YXJyZWQgYnkgYW55IGNvbXBsaWFudCB2ZXJzaW9uIG9mIHRhci4gSWYgdGhlIGxvc3Mgb2YgcGF0aCBvciBmaWxlCitpbmZvcm1hdGlvbiBpcyBub3QgYWNjZXB0YWJsZSwgYW5kIGl0IHJhcmVseSBpcywgbG9uZ2ZpbGUgbWF5IGJlIHNldCB0byB0aGUKK3ZhbHVlICZsdDtjb2RlJmd0O2dudSZsdDsvY29kZSZndDsuIFRoZSB0YXIgdGFzayB3aWxsIHRoZW4gcHJvZHVjZSBhIEdOVSB0YXIgZmlsZSB3aGljaAorY2FuIGhhdmUgYXJiaXRyYXJ5IGxlbmd0aCBwYXRocy4gTm90ZSBob3dldmVyLCB0aGF0IHRoZSByZXN1bHRpbmcgYXJjaGl2ZSB3aWxsCitvbmx5IGJlIGFibGUgdG8gYmUgdW50YXJyZWQgd2l0aCBHTlUgdGFyLiAgVGhlIGRlZmF1bHQgZm9yIHRoZSBsb25nZmlsZQorYXR0cmlidXRlIGlzICZsdDtjb2RlJmd0O3dhcm4mbHQ7L2NvZGUmZ3Q7IHdoaWNoIGJlaGF2ZXMganVzdCBsaWtlIHRoZSBnbnUgb3B0aW9uIGV4Y2VwdAordGhhdCBpdCBwcm9kdWNlcyBhIHdhcm5pbmcgZm9yIGVhY2ggZmlsZSBwYXRoIGVuY291bnRlcmVkIHRoYXQgZG9lcyBub3QgbWF0Y2gKK3RoZSBsaW1pdC4mbHQ7L3AmZ3Q7CismbHQ7cCZndDtUaGlzIHRhc2sgY2FuIHBlcmZvcm0gY29tcHJlc3Npb24gYnkgc2V0dGluZyB0aGUgY29tcHJlc3Npb24gYXR0cmlidXRlIHRvICZxdW90O2d6aXAmcXVvdDsKK29yICZxdW90O2J6aXAyJnF1b3Q7LiZsdDsvcCZndDsKKzwvREVTQ1JJUFRJT04+CisJCTxBVFRSSUJVVEUgTkFNRT0iZGVzdGZpbGUiIFJFUVVJUkVEPSJ5ZXMiPgorCQkJPERFU0NSSVBUSU9OPnRoZSB0YXItZmlsZSB0byBjcmVhdGU8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImJhc2VkaXIiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+dGhlIGRpcmVjdG9yeSBmcm9tIHdoaWNoIHRvIHRhciB0aGUgZmlsZXM8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImxvbmdmaWxlIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPkRldGVybWluZXMgaG93IGxvbmcgZmlsZXMgKCZndDsxMDAgY2hhcnMpIGFyZSB0byBiZWhhbmRsZWQuICBBbGxvd2FibGUgdmFsdWVzIGFyZSAmcXVvdDt0cnVuY2F0ZSZxdW90OywgJnF1b3Q7ZmFpbCZxdW90OywmcXVvdDt3YXJuJnF1b3Q7LCAmcXVvdDtvbWl0JnF1b3Q7IGFuZCAmcXVvdDtnbnUmcXVvdDsuICBEZWZhdWx0IGlzJnF1b3Q7d2FybiZxdW90OzwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iaW5jbHVkZXMiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+Y29tbWEtIG9yIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zIG9mIGZpbGVzIHRoYXQgbXVzdCBiZWluY2x1ZGVkLiBBbGwgZmlsZXMgYXJlIGluY2x1ZGVkIHdoZW4gb21pdHRlZDwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iaW5jbHVkZXNmaWxlIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPnRoZSBuYW1lIG9mIGEgZmlsZS4gRWFjaCBsaW5lIG9mIHRoaXMgZmlsZSBpc3Rha2VuIHRvIGJlIGFuIGluY2x1ZGUgcGF0dGVyPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJleGNsdWRlcyIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5jb21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgb2YgZmlsZXMgdGhhdCBtdXN0IGJlZXhjbHVkZWQuIE5vIGZpbGVzIChleGNlcHQgZGVmYXVsdCBleGNsdWRlcykgYXJlIGV4Y2x1ZGVkIHdoZW4gb21pdHRlZDwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZXhjbHVkZXNmaWxlIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPnRoZSBuYW1lIG9mIGEgZmlsZS4gRWFjaCBsaW5lIG9mIHRoaXMgZmlsZSBpc3Rha2VuIHRvIGJlIGFuIGV4Y2x1ZGUgcGF0dGVyPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJkZWZhdWx0ZXhjbHVkZXMiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+aW5kaWNhdGVzIHdoZXRoZXIgZGVmYXVsdCBleGNsdWRlcyBzaG91bGQgYmUgdXNlZCBvciBub3QoJnF1b3Q7eWVzJnF1b3Q7LyZxdW90O25vJnF1b3Q7KS4gRGVmYXVsdCBleGNsdWRlcyBhcmUgdXNlZCB3aGVuIG9taXR0ZWQ8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImNvbXByZXNzaW9uIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPmNvbXByZXNzaW9uIG1ldGhvZC4gIEFsbG93YWJsZSB2YWx1ZXMgYXJlICZxdW90O25vbmUmcXVvdDssICZxdW90O2d6aXAmcXVvdDsgYW5kICZxdW90O2J6aXAyJnF1b3Q7LiAgRGVmYXVsdCBpcyZxdW90O25vbmUmcXVvdDs8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKwk8L1RBU0s+CisJPFRBU0sgTkFNRT0idGFza2RlZiI+CisJCTxERVNDUklQVElPTj4mbHQ7cCZndDtBZGRzIGEgdGFzayBkZWZpbml0aW9uIHRvIHRoZSBjdXJyZW50IHByb2plY3QsIHN1Y2ggdGhhdCB0aGlzIG5ldyB0YXNrIGNhbiBiZQordXNlZCBpbiB0aGUgY3VycmVudCBwcm9qZWN0LiBUd28gYXR0cmlidXRlcyBhcmUgbmVlZGVkLCB0aGUgbmFtZSB0aGF0IGlkZW50aWZpZXMKK3RoaXMgdGFzayB1bmlxdWVseSwgYW5kIHRoZSBmdWxsIG5hbWUgb2YgdGhlIGNsYXNzIChpbmNsdWRpbmcgdGhlIHBhY2thZ2VzKSB0aGF0CitpbXBsZW1lbnRzIHRoaXMgdGFzay4mbHQ7L3AmZ3Q7CismbHQ7cCZndDtZb3UgY2FuIGFsc28gZGVmaW5lIGEgZ3JvdXAgb2YgdGFza3MgYXQgb25jZSB1c2luZyB0aGUgZmlsZSBvcgorcmVzb3VyY2UgYXR0cmlidXRlcy4gIFRoZXNlIGF0dHJpYnV0ZXMgcG9pbnQgdG8gZmlsZXMgaW4gdGhlIGZvcm1hdCBvZgorSmF2YSBwcm9wZXJ0eSBmaWxlcy4gIEVhY2ggbGluZSBkZWZpbmVzIGEgc2luZ2xlIHRhc2sgaW4gdGhlCitmb3JtYXQ6Jmx0Oy9wJmd0OworJmx0O3ByZSZndDsKK3Rhc2tuYW1lPWZ1bGx5LnF1YWxpZmllZC5qYXZhLmNsYXNzbmFtZQorJmx0Oy9wcmUmZ3Q7CismbHQ7cCZndDtUYXNrZGVmIHNob3VsZCBiZSB1c2VkIHRvIGFkZCB5b3VyIG93biB0YXNrcyB0byB0aGUgc3lzdGVtLiBTZWUgYWxzbyAmYW1wO3F1b3Q7Jmx0O2EKK2hyZWY9JnF1b3Q7Li4vZGV2ZWxvcC5odG1sI3dyaXRpbmdvd250YXNrJnF1b3Q7Jmd0O1dyaXRpbmcgeW91ciBvd24gdGFzayZsdDsvYSZndDsmYW1wO3F1b3Q7LiZsdDsvcCZndDsKKzwvREVTQ1JJUFRJT04+CisJCTxBVFRSSUJVVEUgTkFNRT0ibmFtZSIgUkVRVUlSRUQ9InllcywgdW5sZXNzIGZpbGUgb3IgcmVzb3VyY2UgaGF2ZQorICAgICBiZWVuIHNwZWNpZmllZC4iPgorCQkJPERFU0NSSVBUSU9OPnRoZSBuYW1lIG9mIHRoZSB0YXM8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImNsYXNzbmFtZSIgUkVRVUlSRUQ9InllcywgdW5sZXNzIGZpbGUgb3IgcmVzb3VyY2UgaGF2ZQorICAgICBiZWVuIHNwZWNpZmllZC4iPgorCQkJPERFU0NSSVBUSU9OPnRoZSBmdWxsIGNsYXNzIG5hbWUgaW1wbGVtZW50aW5nIHRoZSB0YXM8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImZpbGUiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+TmFtZSBvZiB0aGUgcHJvcGVydHkgZmlsZSB0byBsb2FkdGFza25hbWUvY2xhc3NuYW1lIHBhaXJzIGZyb208L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9InJlc291cmNlIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPk5hbWUgb2YgdGhlIHByb3BlcnR5IHJlc291cmNlIHRvIGxvYWR0YXNrbmFtZS9jbGFzc25hbWUgcGFpcnMgZnJvbTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iY2xhc3NwYXRoIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPnRoZSBjbGFzc3BhdGggdG91c2Ugd2hlbiBsb29raW5nIHVwIGNsYXNzbmFtZSBvcnJlc291cmNlPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJjbGFzc3BhdGhyZWYiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+UmVmZXJlbmNlIHRvIGEgY2xhc3NwYXRoIHRvdXNlIHdoZW4gbG9va2luZyB1cCBjbGFzc25hbWUgb3JyZXNvdXJjZTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0ibG9hZGVycmVmIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPnRoZSBuYW1lIG9mIHRoZSBsb2FkZXIgdGhhdCBpc3VzZWQgdG8gbG9hZCB0aGUgY2xhc3MsIGNvbnN0cnVjdGVkIGZyb20gdGhlIHNwZWNpZmllZCBjbGFzc3BhdGguIFVzZSB0aGlzIHRvYWxsb3cgbXVsdGlwbGUgdGFza3MvdHlwZXMgdG8gYmUgbG9hZGVkIHdpdGggdGhlIHNhbWUgbG9hZGVyLCBzbyB0aGV5IGNhbiBjYWxsZWFjaCBvdGhlci4gKCBpbnRyb2R1Y2VkIGluIGFudDEuNSA8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKwk8L1RBU0s+CisJPFRBU0sgTkFNRT0idG91Y2giPgorCQk8REVTQ1JJUFRJT04+Jmx0O3AmZ3Q7Q2hhbmdlcyB0aGUgbW9kaWZpY2F0aW9uIHRpbWUgb2YgYSBmaWxlIGFuZCBwb3NzaWJseSBjcmVhdGVzIGl0IGF0Cit0aGUgc2FtZSB0aW1lLiBJbiBhZGRpdGlvbiB0byB3b3JraW5nIHdpdGggYSBzaW5nbGUgZmlsZSwgdGhpcyBUYXNrCitjYW4gYWxzbyB3b3JrIGEgJmx0O2EgaHJlZj0mcXVvdDsuLi9Db3JlVHlwZXMvZmlsZXNldC5odG1sJnF1b3Q7Jmd0O0ZpbGVzZXQmbHQ7L2EmZ3Q7ICh3aGljaAorYWxzbyBpbmNsdWRlcyBkaXJlY3RvcmllcykuJmx0Oy9wJmd0OworJmx0O3AmZ3Q7Rm9yIEpESyAxLjEgb25seSB0aGUgY3JlYXRpb24gb2YgbmV3IGZpbGVzIHdpdGggYSBtb2RpZmljYXRpb24gdGltZQorb2Ygbm93IHdvcmtzLCBhbGwgb3RoZXIgY2FzZXMgd2lsbCBlbWl0IGEgd2FybmluZy4mbHQ7L3AmZ3Q7Cis8L0RFU0NSSVBUSU9OPgorCQk8QVRUUklCVVRFIE5BTUU9ImZpbGUiIFJFUVVJUkVEPSJ1bmxlc3MgYSBuZXN0ZWQgZmlsZXNldCBlbGVtZW50CisgICAgICAgIGhhcyBiZWVuIHNwZWNpZmllZC4iPgorCQkJPERFU0NSSVBUSU9OPnRoZSBuYW1lIG9mIHRoZSBmaWw8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9Im1pbGxpcyIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5zcGVjaWZpZXMgdGhlIG5ldyBtb2RpZmljYXRpb24gdGltZSBvZiB0aGUgZmlsZWluIG1pbGxpc2Vjb25kcyBzaW5jZSBtaWRuaWdodCBKYW4gMSAxOTc8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImRhdGV0aW1lIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPnNwZWNpZmllcyB0aGUgbmV3IG1vZGlmaWNhdGlvbiB0aW1lIG9mIHRoZSBmaWxlaW4gdGhlIGZvcm1hdCBNTS9ERC9ZWVlZIEhIOk1NIEFNX29yX1BNPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisJPC9UQVNLPgorCTxUQVNLIE5BTUU9InRzdGFtcCI+CisJCTxERVNDUklQVElPTj4mbHQ7cCZndDtTZXRzIHRoZSAmbHQ7Y29kZSZndDtEU1RBTVAmbHQ7L2NvZGUmZ3Q7LCAmbHQ7Y29kZSZndDtUU1RBTVAmbHQ7L2NvZGUmZ3Q7LCBhbmQgJmx0O2NvZGUmZ3Q7VE9EQVkmbHQ7L2NvZGUmZ3Q7Citwcm9wZXJ0aWVzIGluIHRoZSBjdXJyZW50IHByb2plY3QuIEJ5IGRlZmF1bHQsCit0aGUgJmx0O2NvZGUmZ3Q7RFNUQU1QJmx0Oy9jb2RlJmd0OyBwcm9wZXJ0eSBpcyBpbiB0aGUKK2Zvcm1hdCAmYW1wO3F1b3Q7eXl5eU1NZGQmYW1wO3F1b3Q7LCAmbHQ7Y29kZSZndDtUU1RBTVAmbHQ7L2NvZGUmZ3Q7IGlzIGluIHRoZQorZm9ybWF0ICZhbXA7cXVvdDtoaG1tJmFtcDtxdW90OywgYW5kICZsdDtjb2RlJmd0O1RPREFZJmx0Oy9jb2RlJmd0OyBpcyBpbiB0aGUKK2Zvcm1hdCAmYW1wO3F1b3Q7TU1NTSBkZCB5eXl5JmFtcDtxdW90Oy4gVXNlIHRoZSBuZXN0ZWQgJmFtcDtsdDtmb3JtYXQmYW1wO2d0OyBlbGVtZW50Cit0byBzcGVjaWZ5IGEgZGlmZmVyZW50IGZvcm1hdC4mbHQ7L3AmZ3Q7CismbHQ7cCZndDtUaGVzZSBwcm9wZXJ0aWVzIGNhbiBiZSB1c2VkIGluIHRoZSBidWlsZC1maWxlLCBmb3IgaW5zdGFuY2UsIHRvIGNyZWF0ZQordGltZS1zdGFtcGVkIGZpbGVuYW1lcywgb3IgdXNlZCB0byByZXBsYWNlIHBsYWNlaG9sZGVyIHRhZ3MgaW5zaWRlIGRvY3VtZW50cwordG8gaW5kaWNhdGUsIGZvciBleGFtcGxlLCB0aGUgcmVsZWFzZSBkYXRlLiBUaGUgYmVzdCBwbGFjZSBmb3IgdGhpcyB0YXNrIGlzCitwcm9iYWJseSBpbiBhbiBpbml0aWFsaXphdGlvbiB0YXJnZXQuJmx0Oy9wJmd0OworPC9ERVNDUklQVElPTj4KKwkJPEFUVFJJQlVURSBOQU1FPSJwcmVmaXgiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+UHJlZml4IHVzZWQgZm9yIGFsbCBwcm9wZXJ0aWVzIHNldC4gVGhlIGRlZmF1bHQgaXMgbm8gcHJlZml4PC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisJPC9UQVNLPgorCTxUQVNLIE5BTUU9InR5cGVkZWYiPgorCQk8REVTQ1JJUFRJT04+Jmx0O3AmZ3Q7QWRkcyBhIGRhdGEgdHlwZSBkZWZpbml0aW9uIHRvIHRoZSBjdXJyZW50IHByb2plY3QsIHN1Y2ggdGhhdCB0aGlzCituZXcgdHlwZSBjYW4gYmUgdXNlZCBpbiB0aGUgY3VycmVudCBwcm9qZWN0LiBUd28gYXR0cmlidXRlcyBhcmUKK25lZWRlZCwgdGhlIG5hbWUgdGhhdCBpZGVudGlmaWVzIHRoaXMgZGF0YSB0eXBlIHVuaXF1ZWx5LCBhbmQgdGhlIGZ1bGwKK25hbWUgb2YgdGhlIGNsYXNzIChpbmNsdWRpbmcgdGhlIHBhY2thZ2VzKSB0aGF0IGltcGxlbWVudHMgdGhpcwordHlwZS4mbHQ7L3AmZ3Q7CismbHQ7cCZndDtZb3UgY2FuIGFsc28gZGVmaW5lIGEgZ3JvdXAgb2YgZGF0YSB0eXBlcyBhdCBvbmNlIHVzaW5nIHRoZSBmaWxlIG9yCityZXNvdXJjZSBhdHRyaWJ1dGVzLiAgVGhlc2UgYXR0cmlidXRlcyBwb2ludCB0byBmaWxlcyBpbiB0aGUgZm9ybWF0IG9mCitKYXZhIHByb3BlcnR5IGZpbGVzLiAgRWFjaCBsaW5lIGRlZmluZXMgYSBzaW5nbGUgZGF0YSB0eXBlIGluIHRoZQorZm9ybWF0OiZsdDsvcCZndDsKKyZsdDtwcmUmZ3Q7Cit0eXBlbmFtZT1mdWxseS5xdWFsaWZpZWQuamF2YS5jbGFzc25hbWUKKyZsdDsvcHJlJmd0OworJmx0O3AmZ3Q7VHlwZWRlZiBzaG91bGQgYmUgdXNlZCB0byBhZGQgeW91ciBvd24gdHlwZXMgdG8gdGhlIHN5c3RlbS4gRGF0YQordHlwZXMgYXJlIHRoaW5ncyBsaWtlICZsdDthIGhyZWY9JnF1b3Q7Li4vdXNpbmcuaHRtbCNwYXRoJnF1b3Q7Jmd0O3BhdGhzJmx0Oy9hJmd0OyBvciAmbHQ7YQoraHJlZj0mcXVvdDsuLi9Db3JlVHlwZXMvZmlsZXNldC5odG1sJnF1b3Q7Jmd0O2ZpbGVzZXRzJmx0Oy9hJmd0OyB0aGF0IGNhbiBiZSBkZWZpbmVkIGF0Cit0aGUgcHJvamVjdCBsZXZlbCBhbmQgcmVmZXJlbmNlZCB2aWEgdGhlaXIgSUQgYXR0cmlidXRlLiZsdDsvcCZndDsKKyZsdDtwJmd0O0N1c3RvbSBkYXRhIHR5cGVzIHVzdWFsbHkgbmVlZCBjdXN0b20gdGFza3MgdG8gcHV0IHRoZW0gdG8gZ29vZCB1c2UuJmx0Oy9wJmd0OworPC9ERVNDUklQVElPTj4KKwkJPEFUVFJJQlVURSBOQU1FPSJuYW1lIiBSRVFVSVJFRD0ieWVzLCB1bmxlc3MgZmlsZSBvciByZXNvdXJjZSBoYXZlCisgICAgIGJlZW4gc3BlY2lmaWVkLiI+CisJCQk8REVTQ1JJUFRJT04+dGhlIG5hbWUgb2YgdGhlIGRhdGEgdHlwPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJjbGFzc25hbWUiIFJFUVVJUkVEPSJ5ZXMsIHVubGVzcyBmaWxlIG9yIHJlc291cmNlIGhhdmUKKyAgICAgYmVlbiBzcGVjaWZpZWQuIj4KKwkJCTxERVNDUklQVElPTj50aGUgZnVsbCBjbGFzcyBuYW1lIGltcGxlbWVudGluZyB0aGUgZGF0YSB0eXA8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImZpbGUiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+TmFtZSBvZiB0aGUgcHJvcGVydHkgZmlsZSB0byBsb2FkdHlwZW5hbWUvY2xhc3NuYW1lIHBhaXJzIGZyb208L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9InJlc291cmNlIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPk5hbWUgb2YgdGhlIHByb3BlcnR5IHJlc291cmNlIHRvIGxvYWR0eXBlbmFtZS9jbGFzc25hbWUgcGFpcnMgZnJvbTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iY2xhc3NwYXRoIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPnRoZSBjbGFzc3BhdGggdG91c2Ugd2hlbiBsb29raW5nIHVwIGNsYXNzbmFtZTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0ibG9hZGVycmVmIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPnRoZSBuYW1lIG9mIHRoZSBsb2FkZXIgdGhhdCBpc3VzZWQgdG8gbG9hZCB0aGUgY2xhc3MsIGNvbnN0cnVjdGVkIGZyb20gdGhlIHNwZWNpZmllZCBjbGFzc3BhdGguIFVzZSB0aGlzIHRvYWxsb3cgbXVsdGlwbGUgdGFza3MvdHlwZXMgdG8gYmUgbG9hZGVkIHdpdGggdGhlIHNhbWUgbG9hZGVyLCBzbyB0aGV5IGNhbiBjYWxsZWFjaCBvdGhlci4gKCBpbnRyb2R1Y2VkIGluIGFudDEuNSA8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKwk8L1RBU0s+CisJPFRBU0sgTkFNRT0idW56aXAiPgorCQk8REVTQ1JJUFRJT04+Jmx0O3AmZ3Q7VW56aXBzIGEgemlwLSwgd2FyLSwgdGFyLSBvciBqYXJmaWxlLiZsdDsvcCZndDsKKyZsdDtwJmd0O0ZvciBKREsgMS4xICZhbXA7cXVvdDtsYXN0IG1vZGlmaWVkIHRpbWUmYW1wO3F1b3Q7IGZpZWxkIGlzIHNldCB0byBjdXJyZW50IHRpbWUgaW5zdGVhZCBvZiBiZWluZworY2FycmllZCBmcm9tIHRoZSBhcmNoaXZlIGZpbGUuJmx0Oy9wJmd0OworJmx0O3AmZ3Q7Jmx0O2EgaHJlZj0mcXVvdDsuLi9Db3JlVHlwZXMvcGF0dGVybnNldC5odG1sJnF1b3Q7Jmd0O1BhdHRlcm5TZXQmbHQ7L2EmZ3Q7cyBhcmUgdXNlZCB0byBzZWxlY3QgZmlsZXMgdG8gZXh0cmFjdAorJmx0O0kmZ3Q7ZnJvbSZsdDsvSSZndDsgdGhlIGFyY2hpdmUuICBJZiBubyBwYXR0ZXJuc2V0IGlzIHVzZWQsIGFsbCBmaWxlcyBhcmUgZXh0cmFjdGVkLgorJmx0Oy9wJmd0OworJmx0O3AmZ3Q7Jmx0O2EgaHJlZj0mcXVvdDsuLi9Db3JlVHlwZXMvZmlsZXNldC5odG1sJnF1b3Q7Jmd0O0ZpbGVTZXQmbHQ7L2EmZ3Q7cyBtYXkgYmUgdXNlZCB1c2VkIHRvIHNlbGVjdCBhcmNoaXZlZCBmaWxlcwordG8gcGVyZm9ybSB1bmFyY2hpdmFsIHVwb24uCismbHQ7L3AmZ3Q7CismbHQ7cCZndDtGaWxlIHBlcm1pc3Npb25zIHdpbGwgbm90IGJlIHJlc3RvcmVkIG9uIGV4dHJhY3RlZCBmaWxlcy4mbHQ7L3AmZ3Q7CismbHQ7cCZndDtUaGUgdW50YXIgdGFzayByZWNvZ25pemVzIHRoZSBsb25nIHBhdGhuYW1lIGVudHJpZXMgdXNlZCBieSBHTlUgdGFyLiZsdDtwJmd0OworPC9ERVNDUklQVElPTj4KKwkJPEFUVFJJQlVURSBOQU1FPSJzcmMiIFJFUVVJUkVEPSJ5ZXMsIGlmIGZpbGVzZXRzIGFyZSBub3QgdXNlZC4iPgorCQkJPERFU0NSSVBUSU9OPmFyY2hpdmUgZmlsZSB0byBleHBhbmQ8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImRlc3QiIFJFUVVJUkVEPSJ5ZXMiPgorCQkJPERFU0NSSVBUSU9OPmRpcmVjdG9yeSB3aGVyZSB0byBzdG9yZSB0aGUgZXhwYW5kZWQgZmlsZXM8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9Im92ZXJ3cml0ZSIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5PdmVyd3JpdGUgZmlsZXMsIGV2ZW4gaWYgdGhleSBhcmUgbmV3ZXIgdGhhbiB0aGVjb3JyZXNwb25kaW5nIGVudHJpZXMgaW4gdGhlIGFyY2hpdmUgKHRydWUgb3IgZmFsc2UsIGRlZmF1bHQgaXN0cnVlKTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iY29tcHJlc3Npb24iIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+Y29tcHJlc3Npb24gbWV0aG9kIGZvciB1bnRhci4gIEFsbG93YWJsZSB2YWx1ZXMgYXJlJnF1b3Q7bm9uZSZxdW90OywgJnF1b3Q7Z3ppcCZxdW90OyBhbmQgJnF1b3Q7YnppcDImcXVvdDsuICBEZWZhdWx0IGlzJnF1b3Q7bm9uZSZxdW90OzwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCTwvVEFTSz4KKwk8VEFTSyBOQU1FPSJ1cHRvZGF0ZSI+CisJCTxERVNDUklQVElPTj4mbHQ7cCZndDtTZXRzIGEgcHJvcGVydHkgaWYgYSB0YXJnZXQgZmlsZSBvciBzZXQgb2YgdGFyZ2V0IGZpbGVzIGlzIG1vcmUgdXAtdG8tZGF0ZQordGhhbiBhIHNvdXJjZSBmaWxlIG9yIHNldCBvZiBzb3VyY2UgZmlsZXMuIEEgc2luZ2xlIHNvdXJjZSBmaWxlIGlzIHNwZWNpZmllZAordXNpbmcgdGhlICZsdDtjb2RlJmd0O3NyY2ZpbGUmbHQ7L2NvZGUmZ3Q7IGF0dHJpYnV0ZS4gQSBzZXQgb2Ygc291cmNlIGZpbGVzIGlzIHNwZWNpZmllZAordXNpbmcgdGhlIG5lc3RlZCAmbHQ7Y29kZSZndDsmYW1wO2x0O3NyY2ZpbGVzJmFtcDtndDsmbHQ7L2NvZGUmZ3Q7CitlbGVtZW50cy4gVGhlc2UgYXJlICZsdDthIGhyZWY9JnF1b3Q7Li4vQ29yZVR5cGVzL2ZpbGVzZXQuaHRtbCZxdW90OyZndDtGaWxlU2V0Jmx0Oy9hJmd0O3MsCit3aGVyZWFzIG11bHRpcGxlIHRhcmdldCBmaWxlcyBhcmUgc3BlY2lmaWVkIHVzaW5nIGEgbmVzdGVkCismbHQ7YSBocmVmPSZxdW90Oy4uL0NvcmVUeXBlcy9tYXBwZXIuaHRtbCZxdW90OyZndDsmbHQ7Y29kZSZndDsmYW1wO2x0O21hcHBlciZhbXA7Z3Q7Jmx0Oy9jb2RlJmd0OyZsdDsvYSZndDsgZWxlbWVudC4mbHQ7L3AmZ3Q7CismbHQ7cCZndDtCeSBkZWZhdWx0LCB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IGlzIHNldCB0byAmbHQ7Y29kZSZndDt0cnVlJmx0Oy9jb2RlJmd0OyBpZgordGhlIHRpbWVzdGFtcCBvZiB0aGUgdGFyZ2V0IGZpbGUocykgaXMgbW9yZSByZWNlbnQgdGhhbiB0aGUgdGltZXN0YW1wIG9mCit0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UgZmlsZShzKS4gWW91IGNhbiBzZXQgdGhlIHZhbHVlIHRvIHNvbWV0aGluZyBvdGhlcgordGhhbiB0aGUgZGVmYXVsdCBieSBzcGVjaWZ5aW5nIHRoZSAmbHQ7Y29kZSZndDt2YWx1ZSZsdDsvY29kZSZndDsgYXR0cmlidXRlLiZsdDsvcCZndDsKKyZsdDtwJmd0O0lmIGEgJmx0O2NvZGUmZ3Q7JmFtcDtsdDtzcmNmaWxlcyZhbXA7Z3Q7Jmx0Oy9jb2RlJmd0OyBlbGVtZW50IGlzIHVzZWQsIHdpdGhvdXQgYWxzbyBzcGVjaWZ5aW5nCithICZsdDtjb2RlJmd0OyZhbXA7bHQ7bWFwcGVyJmFtcDtndDsmbHQ7L2NvZGUmZ3Q7IGVsZW1lbnQsIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIHVzZSBhCismbHQ7YSBocmVmPSZxdW90Oy4uL0NvcmVUeXBlcy9tYXBwZXIuaHRtbCNtZXJnZS1tYXBwZXImcXVvdDsmZ3Q7bWVyZ2UgbWFwcGVyJmx0Oy9hJmd0Oywgd2l0aCB0aGUKKyZsdDtjb2RlJmd0O3RvJmx0Oy9jb2RlJmd0OyBhdHRyaWJ1dGUgc2V0IHRvIHRoZSB2YWx1ZSBvZiB0aGUKKyZsdDtjb2RlJmd0O3RhcmdldGZpbGUmbHQ7L2NvZGUmZ3Q7IGF0dHJpYnV0ZS4mbHQ7L3AmZ3Q7CismbHQ7cCZndDtOb3JtYWxseSwgdGhpcyB0YXNrIGlzIHVzZWQgdG8gc2V0IHByb3BlcnRpZXMgdGhhdCBhcmUgdXNlZnVsIHRvIGF2b2lkCit0YXJnZXQgZXhlY3V0aW9uIGRlcGVuZGluZyBvbiB0aGUgcmVsYXRpdmUgYWdlIG9mIHRoZSBzcGVjaWZpZWQgZmlsZXMuJmx0Oy9wJmd0OworPC9ERVNDUklQVElPTj4KKwkJPEFUVFJJQlVURSBOQU1FPSJwcm9wZXJ0eSIgUkVRVUlSRUQ9InllcyI+CisJCQk8REVTQ1JJUFRJT04+VGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHNldDwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0idmFsdWUiIFJFUVVJUkVEPSJubzsgZGVmYXVsdHMgdG8gdHJ1ZS4iPgorCQkJPERFU0NSSVBUSU9OPlRoZSB2YWx1ZSB0byBzZXQgdGhlIHByb3BlcnR5IHRvPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJzcmNmaWxlIiBSRVFVSVJFRD0ieWVzLCB1bmxlc3MgYSBuZXN0ZWQKKyAgICAgICAmbHQ7c3JjZmlsZXMmZ3Q7IGVsZW1lbnQgaXMgcHJlc2VudC4iPgorCQkJPERFU0NSSVBUSU9OPlRoZSBmaWxlIHRvIGNoZWNrIGFnYWluc3QgdGhlIHRhcmdldCBmaWxlKHMpPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJ0YXJnZXRmaWxlIiBSRVFVSVJFRD0ieWVzLCB1bmxlc3MgYSBuZXN0ZWQKKyAgICAgICAmbHQ7bWFwcGVyJmd0OyBlbGVtZW50IGlzIHByZXNlbnQuIj4KKwkJCTxERVNDUklQVElPTj5UaGUgZmlsZSBmb3Igd2hpY2ggd2Ugd2FudCB0byBkZXRlcm1pbmUgdGhlIHN0YXR1czwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCTwvVEFTSz4KKwk8VEFTSyBOQU1FPSJ3YWl0Zm9yIj4KKwkJPERFU0NSSVBUSU9OPiZsdDtwJmd0O0Jsb2NrcyBleGVjdXRpb24gdW50aWwgYSBzZXQgb2Ygc3BlY2lmaWVkIGNvbmRpdGlvbnMgYmVjb21lIHRydWUuIFRoaXMgaXMgaW50ZW5kZWQKK3RvIGJlIHVzZWQgd2l0aCB0aGUgJmx0O2EgaHJlZj0mcXVvdDtwYXJhbGxlbC5odG1sJnF1b3Q7Jmd0O3BhcmFsbGVsJmx0Oy9hJmd0OyB0YXNrIHRvCitzeW5jaHJvbml6ZSBhIHNldCBvZiBwcm9jZXNzZXMuJmx0Oy9wJmd0OworJmx0O3AmZ3Q7VGhlIGNvbmRpdGlvbnMgdG8gd2FpdCBmb3IgYXJlIGRlZmluZWQgaW4gJmx0O2EgaHJlZj0mcXVvdDt3YWl0Zm9yLmh0bWwjbmVzdGVkJnF1b3Q7Jmd0O25lc3RlZCBlbGVtZW50cyZsdDsvYSZndDssCitpZiBtdWx0aXBsZSBjb25kaXRpb25zIGFyZSBzcGVjaWZpZWQsIHRoZW4gdGhlIHRhc2sgd2lsbCB3YWl0IHVudGlsIGFsbCBjb25kaXRpb25zIGFyZSB0cnVlLi4mbHQ7L3AmZ3Q7CismbHQ7cCZndDsmbHQ7L3AmZ3Q7CismbHQ7cCZndDtJZiBib3RoIG1heHdhaXQgYW5kIG1heHdhaXR1bml0IGFyZSBub3Qgc3BlY2lmaWVkLCB0aGUgbWF4d2FpdCBpcyAzIG1pbnV0ZXMgKDE4MDAwMCBtaWxsaXNlY29uZHMpLiZsdDsvcCZndDsKKyZsdDtwJmd0O0lmIHRoZSAmbHQ7Y29kZSZndDt0aW1lb3V0cHJvcGVydHkmbHQ7L2NvZGUmZ3Q7IGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQsIGEKK3Byb3BlcnR5IG9mIHRoYXQgbmFtZSB3aWxsIGJlIGNyZWF0ZWQgaWYgdGhlIGNvbmRpdGlvbiBkaWRuJ3QgY29tZQordHJ1ZSB3aXRoaW4gdGhlIHNwZWNpZmllZCB0aW1lLiZsdDsvcCZndDsKKzwvREVTQ1JJUFRJT04+CisJCTxBVFRSSUJVVEUgTkFNRT0ibWF4d2FpdCIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5UaGUgbWF4aW11bSBhbW91bnQgb2YgdGltZSB0byB3YWl0IGZvciBhbGwgdGhlIHJlcXVpcmVkIGNvbmRpdGlvbnN0byBiZWNvbWUgdHJ1ZSBiZWZvcmUgZmFpbGluZyB0aGUgdGFzay4gRGVmYXVsdHMgdG8gMTgwMDAwIG1heHdhaXR1bml0czwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0ibWF4d2FpdHVuaXQiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+VGhlIHVuaXQgb2YgdGltZSB0aGF0IG11c3QgYmUgdXNlZCB0byBpbnRlcnByZXQgdGhlIHZhbHVlIG9mIHRoZW1heHdhaXQgYXR0cmlidXRlLiAgRGVmYXVsdHMgdG8gbWlsbGlzZWNvbmQuVmFsaWQgVmFsdWVzIGFyZW1pbGxpc2Vjb25kc2Vjb25kbWludXRlaG91cmRheXdlZWs8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImNoZWNrZXZlcnkiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+VGhlIGFtb3VudCBvZiB0aW1lIHRvIHdhaXQgYmV0d2VlbiBlYWNoIHRlc3Qgb2YgdGhlIGNvbmRpdGlvbnMuRGVmYXVsdHMgdG8gNTAwIGNoZWNrZXZlcnl1bml0czwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iY2hlY2tldmVyeXVuaXQiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+VGhlIHVuaXQgb2YgdGltZSB0aGF0IG11c3QgYmUgdXNlZCB0byBpbnRlcnByZXQgdGhlIHZhbHVlIG9mIHRoZWNoZWNrZXZlcnkgYXR0cmlidXRlLiAgRGVmYXVsdHMgdG8gbWlsbGlzZWNvbmQuVmFsaWQgVmFsdWVzIGFyZW1pbGxpc2Vjb25kc2Vjb25kbWludXRlaG91cmRheXdlZWs8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9InRpbWVvdXRwcm9wZXJ0eSIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj50aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gc2V0IGlmIG1heHdhaXQgaGFzYmVlbiBleGNlZWRlZDwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCTwvVEFTSz4KKwk8VEFTSyBOQU1FPSJ3YXIiPgorCQk8REVTQ1JJUFRJT04+Jmx0O3AmZ3Q7QW4gZXh0ZW5zaW9uIG9mIHRoZSAmbHQ7YSBocmVmPSZxdW90O2phci5odG1sJnF1b3Q7Jmd0O0phciZsdDsvYSZndDsgdGFzayB3aXRoIHNwZWNpYWwKK3RyZWF0bWVudCBmb3IgZmlsZXMgdGhhdCBzaG91bGQgZW5kIHVwIGluIHRoZQorJmx0O2NvZGUmZ3Q7V0VCLUlORi9saWImbHQ7L2NvZGUmZ3Q7LCAmbHQ7Y29kZSZndDtXRUItSU5GL2NsYXNzZXMmbHQ7L2NvZGUmZ3Q7IG9yCismbHQ7Y29kZSZndDtXRUItSU5GJmx0Oy9jb2RlJmd0OyBkaXJlY3RvcmllcyBvZiB0aGUgV2ViIEFwcGxpY2F0aW9uIEFyY2hpdmUuJmx0Oy9wJmd0OworJmx0O3AmZ3Q7KFRoZSBXYXIgdGFzayBpcyBhIHNob3J0Y3V0IGZvciBzcGVjaWZ5aW5nIHRoZSBwYXJ0aWN1bGFyIGxheW91dCBvZiBhIFdBUiBmaWxlLiAKK1RoZSBzYW1lIHRoaW5nIGNhbiBiZSBhY2NvbXBsaXNoZWQgYnkgdXNpbmcgdGhlICZsdDtpJmd0O3ByZWZpeCZsdDsvaSZndDsgYW5kICZsdDtpJmd0O2Z1bGxwYXRoJmx0Oy9pJmd0OworYXR0cmlidXRlcyBvZiB6aXBmaWxlc2V0cyBpbiBhIFppcCBvciBKYXIgdGFzay4pJmx0Oy9wJmd0OworJmx0O3AmZ3Q7VGhlIGV4dGVuZGVkIHppcGZpbGVzZXQgZWxlbWVudCBmcm9tIHRoZSB6aXAgdGFzayAod2l0aCBhdHRyaWJ1dGVzICZsdDtpJmd0O3ByZWZpeCZsdDsvaSZndDssICZsdDtpJmd0O2Z1bGxwYXRoJmx0Oy9pJmd0OywgYW5kICZsdDtpJmd0O3NyYyZsdDsvaSZndDspIGlzIGF2YWlsYWJsZSBpbiB0aGUgV2FyIHRhc2suJmx0Oy9wJmd0OworPC9ERVNDUklQVElPTj4KKwkJPEFUVFJJQlVURSBOQU1FPSJkZXN0ZmlsZSIgUkVRVUlSRUQ9InllcyI+CisJCQk8REVTQ1JJUFRJT04+dGhlIFdBUiBmaWxlIHRvIGNyZWF0ZTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0id2FyZmlsZSIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5EZXByZWNhdGVkIG5hbWUgb2YgdGhlIGZpbGUgdG8gY3JlYXRlLXVzZSBkZXN0ZmlsZSBpbnN0ZWFkPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJ3ZWJ4bWwiIFJFUVVJUkVEPSJ5ZXMsIHVubGVzcyB1cGRhdGUgaXMgc2V0IHRvIHRydWUiPgorCQkJPERFU0NSSVBUSU9OPlRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgdG8gdXNlIChXRUItSU5GL3dlYi54bWwpPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJiYXNlZGlyIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPnRoZSBkaXJlY3RvcnkgZnJvbSB3aGljaCB0byBqYXIgdGhlIGZpbGVzPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJjb21wcmVzcyIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5Ob3Qgb25seSBzdG9yZSBkYXRhIGJ1dCBhbHNvIGNvbXByZXNzIHRoZW0sIGRlZmF1bHRzIHRvIHRydTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZW5jb2RpbmciIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+VGhlIGNoYXJhY3RlciBlbmNvZGluZyB0byB1c2UgZm9yIGZpbGVuYW1lc2luc2lkZSB0aGUgYXJjaGl2ZS4gIERlZmF1bHRzIHRvIFVURjguIEl0IGlzIG5vdHJlY29tbWVuZGVkIHRvIGNoYW5nZSB0aGlzIHZhbHVlIGFzIHRoZSBjcmVhdGVkIGFyY2hpdmUgd2lsbCBtb3N0bGlrZWx5IGJlIHVucmVhZGFibGUgZm9yIEphdmEgb3RoZXJ3aXNlPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJmaWxlc29ubHkiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+U3RvcmUgb25seSBmaWxlIGVudHJpZXMsIGRlZmF1bHRzIHRvIGZhbHM8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImluY2x1ZGVzIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPmNvbW1hLSBvciBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucyBvZiBmaWxlcyB0aGF0IG11c3QgYmVpbmNsdWRlZC4gQWxsIGZpbGVzIGFyZSBpbmNsdWRlZCB3aGVuIG9taXR0ZWQ8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImluY2x1ZGVzZmlsZSIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj50aGUgbmFtZSBvZiBhIGZpbGUuIEVhY2ggbGluZSBvZiB0aGlzIGZpbGUgaXN0YWtlbiB0byBiZSBhbiBpbmNsdWRlIHBhdHRlcjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZXhjbHVkZXMiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+Y29tbWEtIG9yIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zIG9mIGZpbGVzIHRoYXQgbXVzdCBiZWV4Y2x1ZGVkLiBObyBmaWxlcyAoZXhjZXB0IGRlZmF1bHQgZXhjbHVkZXMpIGFyZSBleGNsdWRlZCB3aGVuIG9taXR0ZWQ8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImV4Y2x1ZGVzZmlsZSIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj50aGUgbmFtZSBvZiBhIGZpbGUuIEVhY2ggbGluZSBvZiB0aGlzIGZpbGUgaXN0YWtlbiB0byBiZSBhbiBleGNsdWRlIHBhdHRlcjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZGVmYXVsdGV4Y2x1ZGVzIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPmluZGljYXRlcyB3aGV0aGVyIGRlZmF1bHQgZXhjbHVkZXMgc2hvdWxkIGJlIHVzZWQgb3Igbm90KCZxdW90O3llcyZxdW90Oy8mcXVvdDtubyZxdW90OykuIERlZmF1bHQgZXhjbHVkZXMgYXJlIHVzZWQgd2hlbiBvbWl0dGVkPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJtYW5pZmVzdCIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj50aGUgbWFuaWZlc3QgZmlsZSB0byB1c2U8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9InVwZGF0ZSIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5pbmRpY2F0ZXMgd2hldGhlciB0byB1cGRhdGUgb3Igb3ZlcndyaXRldGhlIGRlc3RpbmF0aW9uIGZpbGUgaWYgaXQgYWxyZWFkeSBleGlzdHM8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImR1cGxpY2F0ZSIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5iZWhhdmlvciB3aGVuIGEgZHVwbGljYXRlIGZpbGUgaXMgZm91bmQuICBWYWxpZCB2YWx1ZXMgYXJlICZxdW90O2FkZCZxdW90OywgJnF1b3Q7cHJlc2VydmUmcXVvdDssIGFuZCAmcXVvdDtmYWlsJnF1b3Q7LiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgJnF1b3Q7YWRkJnF1b3Q7LiA8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKwk8L1RBU0s+CisJPFRBU0sgTkFNRT0ieG1scHJvcGVydHkiPgorCQk8REVTQ1JJUFRJT04+Jmx0O3AmZ3Q7CitMb2FkcyBwcm9wZXJ0eSB2YWx1ZXMgZnJvbSBhIHZhbGlkIHhtbCBmaWxlLgorJmx0Oy9wJmd0OworPC9ERVNDUklQVElPTj4KKwkJPEFUVFJJQlVURSBOQU1FPSJmaWxlIiBSRVFVSVJFRD0ieWVzIj4KKwkJCTxERVNDUklQVElPTj5UaGUgWE1MIGZpbGUgdG8gcGFyc2U8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9InByZWZpeCIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5UaGUgcHJlZml4IHRvIHByZXBlbmQgdG8gZWFjaCBwcm9wZXJ0PC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJrZWVwcm9vdCIgUkVRVUlSRUQ9Im5vLCBkZWZhdWx0IGlzIHRydWUuIj4KKwkJCTxERVNDUklQVElPTj5JZiBmYWxzZSwgaXQgZG9lc24ndCBpbmNsdWRlIHRoZSB4bWwgcm9vdCB0YWcgYXMgYSBmaXJzdHZhbHVlIGluIHRoZSBwcm9wZXJ0eSBuYW1lPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJ2YWxpZGF0ZSIgUkVRVUlSRUQ9Im5vLCBkZWZhdWx0IGlzIGZhbHNlLiI+CisJCQk8REVTQ1JJUFRJT04+SWYgdHJ1ZSwgaXQgZW5hYmxlcyB2YWxpZGF0aW9uPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJjb2xsYXBzZWF0dHJpYnV0ZXMiIFJFUVVJUkVEPSJubywgZGVmYXVsdCBpcyBmYWxzZS4iPgorCQkJPERFU0NSSVBUSU9OPklmIHRydWUsIGl0IHRyZWF0cyBhdHRyaWJ1dGVzIGFzIG5lc3RlZCBlbGVtZW50czwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCTwvVEFTSz4KKwk8VEFTSyBOQU1FPSJ4c2x0Ij4KKwkJPERFU0NSSVBUSU9OPiZsdDtwJmd0O1Byb2Nlc3MgYSBzZXQgb2YgZG9jdW1lbnRzIHZpYSBYU0xULiZsdDsvcCZndDsKKyZsdDtwJmd0O1RoaXMgaXMgdXNlZnVsIGZvciBidWlsZGluZyB2aWV3cyBvZiBYTUwgYmFzZWQgZG9jdW1lbnRhdGlvbiwKK29yIGZvciBnZW5lcmF0aW5nIGNvZGUuJmx0Oy9wJmd0OworJmx0O3AmZ3Q7Jmx0O2ImZ3Q7Tm90ZTombHQ7L2ImZ3Q7IFRoaXMgdGFzayBkZXBlbmRzIG9uIGV4dGVybmFsIGxpYnJhcmllcyBub3QgaW5jbHVkZWQgaW4gdGhlIEFudCBkaXN0cmlidXRpb24uCitTZWUgJmx0O2EgaHJlZj0mcXVvdDsuLi9pbnN0YWxsLmh0bWwjbGlicmFyeWRlcGVuZGVuY2llcyZxdW90OyZndDtMaWJyYXJ5IERlcGVuZGVuY2llcyZsdDsvYSZndDsgZm9yIG1vcmUgaW5mb3JtYXRpb24uJmx0Oy9wJmd0OworJmx0O3AmZ3Q7SXQgaXMgcG9zc2libGUgdG8gcmVmaW5lIHRoZSBzZXQgb2YgZmlsZXMgdGhhdCBhcmUgYmVpbmcgcHJvY2Vzc2VkLiBUaGlzIGNhbiBiZQorZG9uZSB3aXRoIHRoZSAmbHQ7aSZndDtpbmNsdWRlcyZsdDsvaSZndDssICZsdDtpJmd0O2luY2x1ZGVzZmlsZSZsdDsvaSZndDssICZsdDtpJmd0O2V4Y2x1ZGVzJmx0Oy9pJmd0OywgJmx0O2kmZ3Q7ZXhjbHVkZXNmaWxlJmx0Oy9pJmd0OyBhbmQgJmx0O2kmZ3Q7ZGVmYXVsdGV4Y2x1ZGVzJmx0Oy9pJmd0OworYXR0cmlidXRlcy4gV2l0aCB0aGUgJmx0O2kmZ3Q7aW5jbHVkZXMmbHQ7L2kmZ3Q7IG9yICZsdDtpJmd0O2luY2x1ZGVzZmlsZSZsdDsvaSZndDsgYXR0cmlidXRlIHlvdSBzcGVjaWZ5IHRoZSBmaWxlcyB5b3Ugd2FudCB0bworaGF2ZSBpbmNsdWRlZCBieSB1c2luZyBwYXR0ZXJucy4gVGhlICZsdDtpJmd0O2V4Y2x1ZGUmbHQ7L2kmZ3Q7IG9yICZsdDtpJmd0O2V4Y2x1ZGVzZmlsZSZsdDsvaSZndDsgYXR0cmlidXRlIGlzIHVzZWQgdG8gc3BlY2lmeQordGhlIGZpbGVzIHlvdSB3YW50IHRvIGhhdmUgZXhjbHVkZWQuIFRoaXMgaXMgYWxzbyBkb25lIHdpdGggcGF0dGVybnMuIEFuZAorZmluYWxseSB3aXRoIHRoZSAmbHQ7aSZndDtkZWZhdWx0ZXhjbHVkZXMmbHQ7L2kmZ3Q7IGF0dHJpYnV0ZSwgeW91IGNhbiBzcGVjaWZ5IHdoZXRoZXIgeW91Cit3YW50IHRvIHVzZSBkZWZhdWx0IGV4Y2x1c2lvbnMgb3Igbm90LiBTZWUgdGhlIHNlY3Rpb24gb24gJmx0O2EKK2hyZWY9JnF1b3Q7Li4vZGlydGFza3MuaHRtbCNkaXJlY3RvcnliYXNlZHRhc2tzJnF1b3Q7Jmd0O2RpcmVjdG9yeSBiYXNlZCB0YXNrcyZsdDsvYSZndDssIG9uIGhvdyB0aGUKK2luY2x1c2lvbi9leGNsdXNpb24gb2YgZmlsZXMgd29ya3MsIGFuZCBob3cgdG8gd3JpdGUgcGF0dGVybnMuJmx0Oy9wJmd0OworJmx0O3AmZ3Q7VGhpcyB0YXNrIGZvcm1zIGFuIGltcGxpY2l0ICZsdDthIGhyZWY9JnF1b3Q7Li4vQ29yZVR5cGVzL2ZpbGVzZXQuaHRtbCZxdW90OyZndDtGaWxlU2V0Jmx0Oy9hJmd0OyBhbmQgc3VwcG9ydHMgYWxsCithdHRyaWJ1dGVzIG9mICZsdDtjb2RlJmd0OyZhbXA7bHQ7ZmlsZXNldCZhbXA7Z3Q7Jmx0Oy9jb2RlJmd0OyAoJmx0O2NvZGUmZ3Q7ZGlyJmx0Oy9jb2RlJmd0OyBiZWNvbWVzICZsdDtjb2RlJmd0O2Jhc2VkaXImbHQ7L2NvZGUmZ3Q7KQorYXMgd2VsbCBhcyB0aGUgbmVzdGVkICZsdDtjb2RlJmd0OyZhbXA7bHQ7aW5jbHVkZSZhbXA7Z3Q7Jmx0Oy9jb2RlJmd0OywgJmx0O2NvZGUmZ3Q7JmFtcDtsdDtleGNsdWRlJmFtcDtndDsmbHQ7L2NvZGUmZ3Q7CithbmQgJmx0O2NvZGUmZ3Q7JmFtcDtsdDtwYXR0ZXJuc2V0JmFtcDtndDsmbHQ7L2NvZGUmZ3Q7IGVsZW1lbnRzLiZsdDsvcCZndDsKKyZsdDtwJmd0O1RoaXMgdGFzayBzdXBwb3J0cyB0aGUgdXNlIG9mIGEgbmVzdGVkICZhbXA7bHQ7cGFyYW0mYW1wO2d0OyBlbGVtZW50IHdoaWNoIGlzIHVzZWQgdG8gcGFzcyB2YWx1ZXMKK3RvIGFuICZhbXA7bHQ7eHNsOnBhcmFtJmFtcDtndDsgZGVjbGFyYXRpb24uJmx0Oy9wJmd0OworJmx0O3AmZ3Q7VGhpcyB0YXNrIHN1cHBvcnRzIHRoZSB1c2Ugb2YgYSBuZXN0ZWQgJmx0O2EgaHJlZj0mcXVvdDsuLi9Db3JlVHlwZXMveG1sY2F0YWxvZy5odG1sJnF1b3Q7Jmd0O3htbGNhdGFsb2cmbHQ7L2EmZ3Q7CitlbGVtZW50IHdoaWNoIGlzIHVzZWQgdG8gcGVyZm9ybSBFbnRpdHkgYW5kIFVSSSByZXNvbHV0aW9uJmx0Oy9wJmd0OworJmx0O3AmZ3Q7Jmx0O2kmZ3Q7JmFtcDtsdDtzdHlsZSZhbXA7Z3Q7IGFuZCAmYW1wO2x0O3hzbHQmYW1wO2d0OyByZWZlciB0byB0aGUgc2FtZSBBbnQgdGFzayBhbmQgY2FuIGJlIHVzZWQgaW50ZXJjaGFuZ2VhYmx5LiZsdDsvaSZndDsmbHQ7L3AmZ3Q7CismbHQ7cCZndDtJZiB5b3Ugd2FudCB0byB1c2UgWGFsYW4tSiAxIG9yIFhTTDpQLCB5b3UgYWxzbyBuZWVkIEFudCdzIG9wdGlvbmFsLmphciZsdDsvcCZndDsKKzwvREVTQ1JJUFRJT04+CisJCTxBVFRSSUJVVEUgTkFNRT0iYmFzZWRpciIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj53aGVyZSB0byBmaW5kIHRoZSBzb3VyY2UgWE1MIGZpbGUsIGRlZmF1bHQgaXMgdGhlcHJvamVjdCdzIGJhc2VkaXI8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImRlc3RkaXIiIFJFUVVJUkVEPSJ5ZXMsIHVubGVzcyBpbiBhbmQgb3V0IGhhdmUgYmVlbgorICAgICAgIHNwZWNpZmllZC4iPgorCQkJPERFU0NSSVBUSU9OPmRpcmVjdG9yeSBpbiB3aGljaCB0byBzdG9yZSB0aGUgcmVzdWx0czwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZXh0ZW5zaW9uIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPmRlc2lyZWQgZmlsZSBleHRlbnNpb24gdG8gYmUgdXNlZCBmb3IgdGhlIHRhcmdldHMuIElmIG5vdHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgaXMgJnF1b3Q7Lmh0bWwmcXVvdDs8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9InN0eWxlIiBSRVFVSVJFRD0ieWVzIj4KKwkJCTxERVNDUklQVElPTj5uYW1lIG9mIHRoZSBzdHlsZXNoZWV0IHRvIHVzZSAtIGdpdmVuIGVpdGhlciByZWxhdGl2ZXRvIHRoZSBwcm9qZWN0J3MgYmFzZWRpciBvciBhcyBhbiBhYnNvbHV0ZSBwYXRoREVQUkVDQVRFRCAtIGNhbiBiZSBzcGVjaWZpZWQgYXMgYSBwYXRoIHJlbGF0aXZldG8gdGhlIGJhc2VkaXIgYXR0cmlidXRlIG9mIHRoaXMgdGFzayBhcyB3ZWxsLjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iY2xhc3NwYXRoIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPnRoZSBjbGFzc3BhdGggdG8gdXNlIHdoZW4gbG9va2luZyB1cCB0aGUgWFNMVHByb2Nlc3NvcjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iY2xhc3NwYXRocmVmIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPnRoZSBjbGFzc3BhdGggdG8gdXNlLCBnaXZlbiBhcyByZWZlcmVuY2UgdG8gYSBwYXRoIGRlZmluZWQgZWxzZXdoZXJlPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJmb3JjZSIgUkVRVUlSRUQ9Im5vOyBkZWZhdWx0IGlzIGZhbHNlIj4KKwkJCTxERVNDUklQVElPTj5SZWNyZWF0ZSB0YXJnZXQgZmlsZXMsIGV2ZW4gaWYgdGhleSBhcmUgbmV3ZXJ0aGFuIHRoZWlyIGNvcnJlc3BvbmRpbmcgc291cmNlIGZpbGVzIG9yIHRoZSBzdHlsZXNoZWV0PC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJwcm9jZXNzb3IiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+bmFtZSBvZiB0aGUgWFNMVCBwcm9jZXNzb3IgdG8gdXNlLiAgUGVybWlzc2libGUgdmFsdWVzIGFyZSZxdW90O3RyYXgmcXVvdDsgZm9yIGEgVHJhWCBjb21wbGlhbnQgcHJvY2Vzc29yIChpZSBKQVhQIGludGVyZmFjZWltcGxlbWVudGF0aW9uIHN1Y2ggYXMgWGFsYW4gMiBvciBTYXhvbiksJnF1b3Q7eHNscCZxdW90OyBmb3IgdGhlIFhTTDpQIHByb2Nlc3NvciwgJnF1b3Q7eGFsYW4mcXVvdDsgZm9ydGhlIEFwYWNoZSBYTUwgWGFsYW4gKHZlcnNpb24gMSkgcHJvY2Vzc29yIHRoZSBuYW1lIG9mIGFuYXJiaXRyYXJ5IFhTTFRMaWFpc29uIGNsYXNzLiBEZWZhdWx0cyB0byB0cmF4LCBmb2xsb3dlZCBieSB4YWxhbmFuZCB0aGVuIHhzbHAgKGluIHRoYXQgb3JkZXIpLiBUaGUgZmlyc3Qgb25lIGZvdW5kIGluIHlvdXIgY2xhc3NwYXRoIGlzIHRoZSBvbmUgdGhhdCBpcyB1c2VkLkRFUFJFQ0FURUQgLSBYU0w6UCBhbmQgeGFsYW4gYXJlIGRlcHJlY2F0ZWQgYW5kIG5vbW9yZSBzdXBwb3J0ZWQuLjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iaW5jbHVkZXMiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+Y29tbWEtIG9yIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zIG9mIGZpbGVzIHRoYXQgbXVzdCBiZSBpbmNsdWRlZC5BbGwgZmlsZXMgYXJlIGluY2x1ZGVkIHdoZW4gb21pdHRlZDwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iaW5jbHVkZXNmaWxlIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPnRoZSBuYW1lIG9mIGEgZmlsZS4gRWFjaCBsaW5lIG9mIHRoaXMgZmlsZSBpcyB0YWtlbiB0byBiZWFuIGluY2x1ZGUgcGF0dGVyPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJleGNsdWRlcyIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5jb21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgb2YgZmlsZXMgdGhhdCBtdXN0IGJlIGV4Y2x1ZGVkLk5vIGZpbGVzIChleGNlcHQgZGVmYXVsdCBleGNsdWRlcykgYXJlIGV4Y2x1ZGVkIHdoZW4gb21pdHRlZDwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZXhjbHVkZXNmaWxlIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPnRoZSBuYW1lIG9mIGEgZmlsZS4gRWFjaCBsaW5lIG9mIHRoaXMgZmlsZSBpcyB0YWtlbiB0byBiZWFuIGV4Y2x1ZGUgcGF0dGVyPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJkZWZhdWx0ZXhjbHVkZXMiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+aW5kaWNhdGVzIHdoZXRoZXIgZGVmYXVsdCBleGNsdWRlcyBzaG91bGQgYmUgdXNlZCBvciBub3QoJnF1b3Q7eWVzJnF1b3Q7LyZxdW90O25vJnF1b3Q7KS4gRGVmYXVsdCBleGNsdWRlcyBhcmUgdXNlZCB3aGVuIG9taXR0ZWQ8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImluIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPnNwZWNpZmllcyBhIHNpbmdsZSBYTUwgZG9jdW1lbnQgdG8gYmUgc3R5bGVkLiBTaG91bGQgYmUgdXNlZHdpdGggdGhlIG91dCBhdHRyaWJ1dGU8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9Im91dCIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5zcGVjaWZpZXMgdGhlIG91dHB1dCBuYW1lIGZvciB0aGUgc3R5bGVkIHJlc3VsdCBmcm9tIHRoZWluIGF0dHJpYnV0ZTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0ic2NhbmluY2x1ZGVkZGlyZWN0b3JpZXMiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+SWYgYW55IGRpcmVjdG9yaWVzIGFyZSBtYXRjaGVkIGJ5IHRoZWluY2x1ZGVzL2V4Y2x1ZGVzIHBhdHRlcm5zLCB0cnkgdG8gdHJhbnNmb3JtIGFsbCBmaWxlcyBpbiB0aGVzZWRpcmVjdG9yaWVzLiAgRGVmYXVsdCBpcyB0cnU8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKwk8L1RBU0s+CisJPFRBU0sgTkFNRT0iemlwIj4KKwkJPERFU0NSSVBUSU9OPiZsdDtwJmd0O0NyZWF0ZXMgYSB6aXBmaWxlLiZsdDsvcCZndDsKKyZsdDtwJmd0O1RoZSAmbHQ7aSZndDtiYXNlZGlyJmx0Oy9pJmd0OyBhdHRyaWJ1dGUgaXMgdGhlIHJlZmVyZW5jZSBkaXJlY3RvcnkgZnJvbSB3aGVyZSB0byB6aXAuJmx0Oy9wJmd0OworJmx0O3AmZ3Q7Tm90ZSB0aGF0IGZpbGUgcGVybWlzc2lvbnMgd2lsbCBub3QgYmUgc3RvcmVkIGluIHRoZSByZXN1bHRpbmcgemlwZmlsZS4mbHQ7L3AmZ3Q7CismbHQ7cCZndDtJdCBpcyBwb3NzaWJsZSB0byByZWZpbmUgdGhlIHNldCBvZiBmaWxlcyB0aGF0IGFyZSBiZWluZyB6aXBwZWQuIFRoaXMgY2FuIGJlCitkb25lIHdpdGggdGhlICZsdDtpJmd0O2luY2x1ZGVzJmx0Oy9pJmd0OywgJmx0O2kmZ3Q7aW5jbHVkZXNmaWxlJmx0Oy9pJmd0OywgJmx0O2kmZ3Q7ZXhjbHVkZXMmbHQ7L2kmZ3Q7LCAmbHQ7aSZndDtleGNsdWRlc2ZpbGUmbHQ7L2kmZ3Q7IGFuZCAmbHQ7aSZndDtkZWZhdWx0ZXhjbHVkZXMmbHQ7L2kmZ3Q7CithdHRyaWJ1dGVzLiBXaXRoIHRoZSAmbHQ7aSZndDtpbmNsdWRlcyZsdDsvaSZndDsgb3IgJmx0O2kmZ3Q7aW5jbHVkZXNmaWxlJmx0Oy9pJmd0OyBhdHRyaWJ1dGUgeW91IHNwZWNpZnkgdGhlIGZpbGVzIHlvdSB3YW50IHRvCitoYXZlIGluY2x1ZGVkIGJ5IHVzaW5nIHBhdHRlcm5zLiBUaGUgJmx0O2kmZ3Q7ZXhjbHVkZSZsdDsvaSZndDsgb3IgJmx0O2kmZ3Q7ZXhjbHVkZXNmaWxlJmx0Oy9pJmd0OyBhdHRyaWJ1dGUgaXMgdXNlZCB0byBzcGVjaWZ5Cit0aGUgZmlsZXMgeW91IHdhbnQgdG8gaGF2ZSBleGNsdWRlZC4gVGhpcyBpcyBhbHNvIGRvbmUgd2l0aCBwYXR0ZXJucy4gQW5kCitmaW5hbGx5IHdpdGggdGhlICZsdDtpJmd0O2RlZmF1bHRleGNsdWRlcyZsdDsvaSZndDsgYXR0cmlidXRlLCB5b3UgY2FuIHNwZWNpZnkgd2hldGhlciB5b3UKK3dhbnQgdG8gdXNlIGRlZmF1bHQgZXhjbHVzaW9ucyBvciBub3QuIFNlZSB0aGUgc2VjdGlvbiBvbiAmbHQ7YQoraHJlZj0mcXVvdDsuLi9kaXJ0YXNrcy5odG1sI2RpcmVjdG9yeWJhc2VkdGFza3MmcXVvdDsmZ3Q7ZGlyZWN0b3J5IGJhc2VkIHRhc2tzJmx0Oy9hJmd0Oywgb24gaG93IHRoZQoraW5jbHVzaW9uL2V4Y2x1c2lvbiBvZiBmaWxlcyB3b3JrcywgYW5kIGhvdyB0byB3cml0ZSBwYXR0ZXJucy4gJmx0Oy9wJmd0OworJmx0O3AmZ3Q7VGhpcyB0YXNrIGZvcm1zIGFuIGltcGxpY2l0ICZsdDthIGhyZWY9JnF1b3Q7Li4vQ29yZVR5cGVzL2ZpbGVzZXQuaHRtbCZxdW90OyZndDtGaWxlU2V0Jmx0Oy9hJmd0OyBhbmQKK3N1cHBvcnRzIGFsbCBhdHRyaWJ1dGVzIG9mICZsdDtjb2RlJmd0OyZhbXA7bHQ7ZmlsZXNldCZhbXA7Z3Q7Jmx0Oy9jb2RlJmd0OworKCZsdDtjb2RlJmd0O2RpciZsdDsvY29kZSZndDsgYmVjb21lcyAmbHQ7Y29kZSZndDtiYXNlZGlyJmx0Oy9jb2RlJmd0OykgYXMgd2VsbCBhcyB0aGUgbmVzdGVkCismbHQ7Y29kZSZndDsmYW1wO2x0O2luY2x1ZGUmYW1wO2d0OyZsdDsvY29kZSZndDssICZsdDtjb2RlJmd0OyZhbXA7bHQ7ZXhjbHVkZSZhbXA7Z3Q7Jmx0Oy9jb2RlJmd0OyBhbmQKKyZsdDtjb2RlJmd0OyZhbXA7bHQ7cGF0dGVybnNldCZhbXA7Z3Q7Jmx0Oy9jb2RlJmd0OyBlbGVtZW50cy4mbHQ7L3AmZ3Q7CismbHQ7cCZndDtPciwgeW91IG1heSBwbGFjZSB3aXRoaW4gaXQgbmVzdGVkIGZpbGUgc2V0cywgb3IgcmVmZXJlbmNlcyB0byBmaWxlIHNldHMuCitJbiB0aGlzIGNhc2UgJmx0O2NvZGUmZ3Q7YmFzZWRpciZsdDsvY29kZSZndDsgaXMgb3B0aW9uYWw7IHRoZSBpbXBsaWNpdCBmaWxlIHNldCBpcyAmbHQ7aSZndDtvbmx5IHVzZWQmbHQ7L2kmZ3Q7CitpZiAmbHQ7Y29kZSZndDtiYXNlZGlyJmx0Oy9jb2RlJmd0OyBpcyBzZXQuIFlvdSBtYXkgdXNlIGFueSBtaXh0dXJlIG9mIHRoZSBpbXBsaWNpdCBmaWxlIHNldAorKHdpdGggJmx0O2NvZGUmZ3Q7YmFzZWRpciZsdDsvY29kZSZndDsgc2V0LCBhbmQgb3B0aW9uYWwgYXR0cmlidXRlcyBsaWtlICZsdDtjb2RlJmd0O2luY2x1ZGVzJmx0Oy9jb2RlJmd0OworYW5kIG9wdGlvbmFsIHN1YmVsZW1lbnRzIGxpa2UgJmx0O2NvZGUmZ3Q7JmFtcDtsdDtpbmNsdWRlJmFtcDtndDsmbHQ7L2NvZGUmZ3Q7KTsgZXhwbGljaXQgbmVzdGVkCismbHQ7Y29kZSZndDsmYW1wO2x0O2ZpbGVzZXQmYW1wO2d0OyZsdDsvY29kZSZndDsgZWxlbWVudHMgc28gbG9uZyBhcyBhdCBsZWFzdCBvbmUgZmlsZXNldCB0b3RhbCBpcyBzcGVjaWZpZWQuIFRoZSBaSVAgZmlsZSB3aWxsCitvbmx5IHJlZmxlY3QgdGhlIHJlbGF0aXZlIHBhdGhzIG9mIGZpbGVzICZsdDtpJmd0O3dpdGhpbiZsdDsvaSZndDsgZWFjaCBmaWxlc2V0LiBUaGUgWmlwIHRhc2sgYW5kIGl0cyBkZXJpdmF0aXZlcyBrbm93IGEgc3BlY2lhbCBmb3JtIG9mIGEgZmlsZXNldCBuYW1lZCB6aXBmaWxlc2V0IHRoYXQgaGFzIGFkZGl0aW9uYWwgYXR0cmlidXRlcyAoZGVzY3JpYmVkIGJlbG93KS4gJmx0Oy9wJmd0OworJmx0O3AmZ3Q7VGhlIFppcCB0YXNrIGFsc28gc3VwcG9ydHMgdGhlIG1lcmdpbmcgb2YgbXVsdGlwbGUgemlwIGZpbGVzIGludG8gdGhlIHppcCBmaWxlLiAKK1RoaXMgaXMgcG9zc2libGUgdGhyb3VnaCBlaXRoZXIgdGhlICZsdDtpJmd0O3NyYyZsdDsvaSZndDsgYXR0cmlidXRlIG9mIGFueSBuZXN0ZWQgZmlsZXNldHMgCitvciBieSB1c2luZyB0aGUgc3BlY2lhbCBuZXN0ZWQgZmlsZXNldCAmbHQ7aSZndDt6aXBncm91cGZpbGVzZXQmbHQ7L2kmZ3Q7LiZsdDsvcCZndDsKKyZsdDtwJmd0O1RoZSAmbHQ7Y29kZSZndDt1cGRhdGUmbHQ7L2NvZGUmZ3Q7IHBhcmFtZXRlciBjb250cm9scyB3aGF0IGhhcHBlbnMgaWYgdGhlCitaSVAgZmlsZSBhbHJlYWR5IGV4aXN0cy4gV2hlbiBzZXQgdG8gJmx0O2NvZGUmZ3Q7eWVzJmx0Oy9jb2RlJmd0OywgdGhlIFpJUCBmaWxlIGlzCit1cGRhdGVkIHdpdGggdGhlIGZpbGVzIHNwZWNpZmllZC4gKE5ldyBmaWxlcyBhcmUgYWRkZWQ7IG9sZCBmaWxlcyBhcmUKK3JlcGxhY2VkIHdpdGggdGhlIG5ldyB2ZXJzaW9ucy4pIFdoZW4gc2V0IHRvICZsdDtjb2RlJmd0O25vJmx0Oy9jb2RlJmd0OyAodGhlCitkZWZhdWx0KSB0aGUgWklQIGZpbGUgaXMgb3ZlcndyaXR0ZW4uJmx0Oy9wJmd0OworJmx0O3AmZ3Q7VGhlICZsdDtjb2RlJmd0O3doZW5lbXB0eSZsdDsvY29kZSZndDsgcGFyYW1ldGVyIGNvbnRyb2xzIHdoYXQgaGFwcGVucyB3aGVuIG5vIGZpbGVzIG1hdGNoLgorSWYgJmx0O2NvZGUmZ3Q7c2tpcCZsdDsvY29kZSZndDsgKHRoZSBkZWZhdWx0KSwgdGhlIFpJUCBpcyBub3QgY3JlYXRlZCBhbmQgYSB3YXJuaW5nIGlzIGlzc3VlZC4KK0lmICZsdDtjb2RlJmd0O2ZhaWwmbHQ7L2NvZGUmZ3Q7LCB0aGUgWklQIGlzIG5vdCBjcmVhdGVkIGFuZCB0aGUgYnVpbGQgaXMgaGFsdGVkIHdpdGggYW4gZXJyb3IuCitJZiAmbHQ7Y29kZSZndDtjcmVhdGUmbHQ7L2NvZGUmZ3Q7LCBhbiBlbXB0eSBaSVAgZmlsZSAoZXhwbGljaXRseSB6ZXJvIGVudHJpZXMpIGlzIGNyZWF0ZWQsCit3aGljaCBzaG91bGQgYmUgcmVjb2duaXplZCBhcyBzdWNoIGJ5IGNvbXBsaWFudCBaSVAgbWFuaXB1bGF0aW9uIHRvb2xzLiZsdDsvcCZndDsKKyZsdDtwJmd0O1RoaXMgdGFzayB3aWxsIG5vdyB1c2UgdGhlIHBsYXRmb3JtJ3MgZGVmYXVsdCBjaGFyYWN0ZXIgZW5jb2RpbmcKK2ZvciBmaWxlbmFtZXMgLSB0aGlzIGlzIGNvbnNpc3RlbnQgd2l0aCB0aGUgY29tbWFuZCBsaW5lIFpJUCB0b29scywKK2J1dCBjYXVzZXMgcHJvYmxlbXMgaWYgeW91IHRyeSB0byBvcGVuIHRoZW0gZnJvbSB3aXRoaW4gSmF2YSBhbmQgeW91cgorZmlsZW5hbWVzIGNvbnRhaW4gbm9uIFVTLUFTQ0lJIGNoYXJhY3RlcnMuIFVzZSB0aGUgZW5jb2RpbmcgYXR0cmlidXRlCithbmQgc2V0IGl0IHRvIFVURjggdG8gY3JlYXRlIHppcCBmaWxlcyB0aGF0IGNhbiBzYWZlbHkgYmUgcmVhZCBieQorSmF2YS4mbHQ7L3AmZ3Q7Cis8L0RFU0NSSVBUSU9OPgorCQk8QVRUUklCVVRFIE5BTUU9ImRlc3RmaWxlIiBSRVFVSVJFRD0ieWVzIj4KKwkJCTxERVNDUklQVElPTj50aGUgemlwLWZpbGUgdG8gY3JlYXRlPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJ6aXBmaWxlIiBSRVFVSVJFRD0ieWVzIj4KKwkJCTxERVNDUklQVElPTj50aGUgZGVwcmVjYXRlZCBvbGQgbmFtZSBvZiBkZXN0ZmlsZTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iYmFzZWRpciIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj50aGUgZGlyZWN0b3J5IGZyb20gd2hpY2ggdG8gemlwIHRoZSBmaWxlczwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iY29tcHJlc3MiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+Tm90IG9ubHkgc3RvcmUgZGF0YSBidXQgYWxzbyBjb21wcmVzcyB0aGVtLCBkZWZhdWx0cyB0byB0cnU8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImVuY29kaW5nIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPlRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcgdG8gdXNlIGZvciBmaWxlbmFtZXNpbnNpZGUgdGhlIHppcCBmaWxlLiAgRm9yIGEgbGlzdCBvZiBwb3NzaWJsZSB2YWx1ZXMgc2VlIGh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvamRrLzEuMi9kb2NzL2d1aWRlL2ludGVybmF0L2VuY29kaW5nLmRvYy5odG1sLkRlZmF1bHRzIHRvIHRoZSBwbGF0Zm9ybSdzIGRlZmF1bHQgY2hhcmFjdGVyIGVuY29kaW5nPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJmaWxlc29ubHkiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+U3RvcmUgb25seSBmaWxlIGVudHJpZXMsIGRlZmF1bHRzIHRvIGZhbHM8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImluY2x1ZGVzIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPmNvbW1hLSBvciBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucyBvZiBmaWxlcyB0aGF0IG11c3QgYmVpbmNsdWRlZC4gQWxsIGZpbGVzIGFyZSBpbmNsdWRlZCB3aGVuIG9taXR0ZWQ8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImluY2x1ZGVzZmlsZSIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj50aGUgbmFtZSBvZiBhIGZpbGUuIEVhY2ggbGluZSBvZiB0aGlzIGZpbGUgaXN0YWtlbiB0byBiZSBhbiBpbmNsdWRlIHBhdHRlcjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZXhjbHVkZXMiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+Y29tbWEtIG9yIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zIG9mIGZpbGVzIHRoYXQgbXVzdCBiZWV4Y2x1ZGVkLiBObyBmaWxlcyAoZXhjZXB0IGRlZmF1bHQgZXhjbHVkZXMpIGFyZSBleGNsdWRlZCB3aGVuIG9taXR0ZWQ8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImV4Y2x1ZGVzZmlsZSIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj50aGUgbmFtZSBvZiBhIGZpbGUuIEVhY2ggbGluZSBvZiB0aGlzIGZpbGUgaXN0YWtlbiB0byBiZSBhbiBleGNsdWRlIHBhdHRlcjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZGVmYXVsdGV4Y2x1ZGVzIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPmluZGljYXRlcyB3aGV0aGVyIGRlZmF1bHQgZXhjbHVkZXMgc2hvdWxkIGJlIHVzZWQgb3Igbm90KCZxdW90O3llcyZxdW90Oy8mcXVvdDtubyZxdW90OykuIERlZmF1bHQgZXhjbHVkZXMgYXJlIHVzZWQgd2hlbiBvbWl0dGVkPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJ1cGRhdGUiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+aW5kaWNhdGVzIHdoZXRoZXIgdG8gdXBkYXRlIG9yIG92ZXJ3cml0ZXRoZSBkZXN0aW5hdGlvbiBmaWxlIGlmIGl0IGFscmVhZHkgZXhpc3RzPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJ3aGVuZW1wdHkiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+YmVoYXZpb3Igd2hlbiBubyBmaWxlcyBtYXRjaC4gIFZhbGlkIHZhbHVlcyBhcmUgJnF1b3Q7ZmFpbCZxdW90OywgJnF1b3Q7c2tpcCZxdW90OywgYW5kICZxdW90O2NyZWF0ZSZxdW90Oy4gIERlZmF1bHQgaXMgJnF1b3Q7c2tpcCZxdW90OzwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZHVwbGljYXRlIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPmJlaGF2aW9yIHdoZW4gYSBkdXBsaWNhdGUgZmlsZSBpcyBmb3VuZC4gIFZhbGlkIHZhbHVlcyBhcmUgJnF1b3Q7YWRkJnF1b3Q7LCAmcXVvdDtwcmVzZXJ2ZSZxdW90OywgYW5kICZxdW90O2ZhaWwmcXVvdDsuIFRoZSBkZWZhdWx0IHZhbHVlIGlzICZxdW90O2FkZCZxdW90Oy4gPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisJPC9UQVNLPgorCTxUQVNLIE5BTUU9ImFudGxyIj4KKwkJPERFU0NSSVBUSU9OPiZsdDtwJmd0OworSW52b2tlcyB0aGUgJmx0O2EgSFJFRj0mcXVvdDtodHRwOi8vd3d3LmFudGxyLm9yZy8mcXVvdDsgdGFyZ2V0PSZxdW90O190b3AmcXVvdDsmZ3Q7QU5UTFImbHQ7L2EmZ3Q7IFRyYW5zbGF0b3IgZ2VuZXJhdG9yCitvbiBhIGdyYW1tYXIgZmlsZS4KKyZsdDsvcCZndDsKKyZsdDtwJmd0OworVG8gdXNlIHRoZSBBTlRMUiB0YXNrLCBzZXQgdGhlICZsdDtpJmd0O3RhcmdldCZsdDsvaSZndDsgYXR0cmlidXRlIHRvIHRoZSBuYW1lIG9mIHRoZQorZ3JhbW1hciBmaWxlIHRvIHByb2Nlc3MuICBPcHRpb25hbGx5LCB5b3UgY2FuIGFsc28gc2V0IHRoZQorJmx0O2kmZ3Q7b3V0cHV0ZGlyZWN0b3J5Jmx0Oy9pJmd0OyB0byB3cml0ZSB0aGUgZ2VuZXJhdGVkIGZpbGUgdG8gYSBzcGVjaWZpYyBkaXJlY3RvcnkuCitPdGhlcndpc2UgQU5UTFIgd3JpdGVzIHRoZSBnZW5lcmF0ZWQgZmlsZXMgdG8gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nCit0aGUgZ3JhbW1hciBmaWxlLgorJmx0Oy9wJmd0OworJmx0O3AmZ3Q7CitUaGlzIHRhc2sgb25seSBpbnZva2VzIEFOVExSIGlmIHRoZSBncmFtbWFyIGZpbGUgaXMgbmV3ZXIgdGhhbiB0aGUgZ2VuZXJhdGVkCitmaWxlcy4KKyZsdDsvcCZndDsKKyZsdDtwJmd0OworJmx0O2kmZ3Q7CitUbyBzdWNjZXNzZnVsbHkgcnVuIEFOVExSLCB5b3VyIGJlc3Qgb3B0aW9uIGlzIHByb2JhYmx5IHRvIGJ1aWxkIHRoZSB3aG9sZQoramFyIHdpdGggdGhlIHByb3ZpZGVkIHNjcmlwdCAmbHQ7YiZndDtta2FsbGphciZsdDsvYiZndDsgYW5kIGRyb3AgdGhlIHJlc3VsdGluZyBqYXIgKGFib3V0IDMwMEtCKQoraW50byAke2FudC5ob21lfS9saWIuIERyb3BwaW5nIHRoZSBkZWZhdWx0IGphciAoNzBLQikgaXMgcHJvYmFibHkgbm90IGVub3VnaAorZm9yIG1vc3QgbmVlZHMgYW5kIHlvdXIgb25seSBvcHRpb24gd2lsbCBiZSB0byBhZGQgQU5UTFIgaG9tZSBkaXJlY3RvcnkKK3RvIHlvdXIgY2xhc3NwYXRoIGFzIGRlc2NyaWJlZCBpbiBBTlRMUiAmbHQ7dHQmZ3Q7aW5zdGFsbC5odG1sJmx0Oy90dCZndDsgZG9jdW1lbnQuCismbHQ7L2kmZ3Q7CismbHQ7L3AmZ3Q7Cis8L0RFU0NSSVBUSU9OPgorCQk8QVRUUklCVVRFIE5BTUU9InRhcmdldCIgUkVRVUlSRUQ9InllcyI+CisJCQk8REVTQ1JJUFRJT04+VGhlIGdyYW1tYXIgZmlsZSB0byBwcm9jZXNzPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJvdXRwdXRkaXJlY3RvcnkiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+VGhlIGRpcmVjdG9yeSB0byB3cml0ZSB0aGUgZ2VuZXJhdGVkIGZpbGVzIHRvLiAgSWYgbm90IHNldCwgdGhlIGZpbGVzYXJlIHdyaXR0ZW4gdG8gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBncmFtbWFyIGZpbGUuPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJnbGliIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPkFuIG9wdGlvbmFsIHN1cGVyIGdyYW1tYXIgZmlsZSB0aGF0IHRoZSB0YXJnZXQgZ3JhbW1hciBvdmVycmlkZXMuICBUaGlzZmVhdHVyZSBpcyBvbmx5IG5lZWRlZCBmb3IgYWR2YW5jZWQgdm9jYWJ1bGFyaWVzLjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZGVidWciIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+V2hlbiBzZXQgdG8gJnF1b3Q7eWVzJnF1b3Q7LCB0aGlzIGZsYWcgYWRkcyBjb2RlIHRvIHRoZSBnZW5lcmF0ZWQgcGFyc2VyIHRoYXQgd2lsbGxhdW5jaCB0aGUgUGFyc2VWaWV3IGRlYnVnZ2VyIHVwb24gaW52b2NhdGlvbi4gIFRoZSBkZWZhdWx0IGlzICZxdW90O25vJnF1b3Q7Lk5vdGU6IFBhcnNlVmlldyBpcyBhIHNlcGFyYXRlIGNvbXBvbmVudCB0aGF0IG5lZWRzIHRvIGJlIGluc3RhbGxlZCBvciB5b3VyZ3JhbW1hciB3aWxsIGhhdmUgY29tcGlsYXRpb24gZXJyb3JzLjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iaHRtbCIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5FbWl0IGFuIGh0bWwgdmVyc2lvbiBvZiB0aGUgZ3JhbW1hciB3aXRoIGh5cGVybGlua2VkIGFjdGlvbnMuPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJkaWFnbm9zdGljIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPkdlbmVyYXRlcyBhIHRleHQgZmlsZSB3aXRoIGRlYnVnZ2luZyBpbmZvbWF0aW9uIGJhc2VkIG9uIHRoZSB0YXJnZXQgZ3JhbW1hci48L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9InRyYWNlIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPkZvcmNlcyBhbGwgcnVsZXMgdG8gY2FsbCB0cmFjZUluL3RyYWNlT3V0IGlmIHNldCB0byAmcXVvdDt5ZXMmcXVvdDsuVGhlIGRlZmF1bHQgaXMgJnF1b3Q7bm8mcXVvdDsuPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJ0cmFjZXBhcnNlciIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5Pbmx5IGZvcmNlcyBwYXJzZXIgcnVsZXMgdG8gY2FsbCB0cmFjZUluL3RyYWNlT3V0IGlmIHNldCB0byAmcXVvdDt5ZXMmcXVvdDsuVGhlIGRlZmF1bHQgaXMgJnF1b3Q7bm8mcXVvdDsuPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJ0cmFjZWxleGVyIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPk9ubHkgZm9yY2VzIGxleGVyIHJ1bGVzIHRvIGNhbGwgdHJhY2VJbi90cmFjZU91dCBpZiBzZXQgdG8gJnF1b3Q7eWVzJnF1b3Q7LlRoZSBkZWZhdWx0IGlzICZxdW90O25vJnF1b3Q7LjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0idHJhY2V0cmVld2Fsa2VyIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPk9ubHkgZm9yY2VzIHRyZWUgd2Fsa2VyIHJ1bGVzIHRvIGNhbGwgdHJhY2VJbi90cmFjZU91dCBpZiBzZXQgdG8mcXVvdDt5ZXMmcXVvdDsuICBUaGUgZGVmYXVsdCBpcyAmcXVvdDtubyZxdW90Oy48L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImRpciIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5UaGUgZGlyZWN0b3J5IHRvIGludm9rZSB0aGUgVk0gaW4uPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisJPC9UQVNLPgorCTxUQVNLIE5BTUU9ImJvcmxhbmRnZW5lcmF0ZWNsaWVudCI+CisJCTxERVNDUklQVElPTj4mbHQ7cCZndDtUaGUgQm9ybGFuZEdlbmVyYXRlQ2xpZW50IGlzIGEgdGFzayBkZWRpY2F0ZWQgdG8gQm9ybGFuZCBBcHBsaWNhdGlvbiBTZXJ2ZXIKK3YgNC41LiBJdCBvZmZlcnMgdG8gZ2VuZXJhdGUgdGhlIGNsaWVudCBqYXIgZmlsZSBjb3JyZXNwb25kaW5nIHRvIGFuIGVqYiBqYXIKK2ZpbGUuJmx0Oy9wJmd0OworPC9ERVNDUklQVElPTj4KKwkJPEFUVFJJQlVURSBOQU1FPSJlamJqYXIiIFJFUVVJUkVEPSJ5ZXMiPgorCQkJPERFU0NSSVBUSU9OPmVqYiBqYXIgZmlsPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJkZWJ1ZyIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5JZiB0cnVlLCB0dXJuIG9uIHRoZSBkZWJ1ZyBtb2RlIGZvciBlYWNoIGJvcmxhbmR0b29scyAoamF2YTJpaW9wLCBpYXN0b29sIC4uLikgZGVmYXVsdCA9IGZhbHM8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImNsaWVudGphciIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5jbGllbnQgamFyIGZpbGUgbmFtZS4gSWYgbWlzc2luZyB0aGUgY2xpZW50IGphcmZpbGUgbmFtZSBpcyBidWlsZCB1c2luZyB0aGUgZWpiamFyIGZpbGUgbmFtZTogZWpiamFyID0gaGVsbG9iZWFuLWVqYi5qYXI9Jmd0OyBoZWxsb2JlYW4tZWpiY2xpZW50LmphPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJtb2RlIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPmNob29zZSB0aGUgY29tbWFuZCBsYXVuY2hpbmcgbW9kZS4gVHdvIHZhbHVlczpqYXZhIG9yIGZvcmsuIGRlZmF1bHQgPSBmb3JrLiBqYXZhIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHZlcnNpb249NS5Qb3NzaWJpbGl0eSB0byBzcGVjaWZ5IGEgY2xhc3NwYXRoPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJ2ZXJzaW9uIiBSRVFVSVJFRD0ibm8sIGRlZmF1bHRzIHRvIDQiPgorCQkJPERFU0NSSVBUSU9OPnNldCB0aGUgQm9ybGFuZCBBcHBsaWNhdGlvbiBWZXJzaW9uLjQgbWVhbnMgQi5BLlMgKEJvcmxhbmQgQXBwbGljYXRpb24gU2VydmVyIDQueCk1IG1lYW5zIEIuRS5TIChCb3JsYW5kIEFwcGxpY2F0aW9uIFNlcnZlciA1LngpPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisJPC9UQVNLPgorCTxUQVNLIE5BTUU9ImNhYiI+CisJCTxERVNDUklQVElPTj4mbHQ7cCZndDtUaGUgY2FiIHRhc2sgY3JlYXRlcyBNaWNyb3NvZnQgY2FiIGFyY2hpdmUgZmlsZXMuICBJdCBpcyBpbnZva2VkCitzaW1pbGFyIHRvIHRoZSAmbHQ7YSBocmVmPSZxdW90Oy4uL0NvcmVUYXNrcy9qYXIuaHRtbCZxdW90OyZndDtqYXImbHQ7L2EmZ3Q7IG9yICZsdDthIGhyZWY9JnF1b3Q7Li4vQ29yZVRhc2tzL3ppcC5odG1sJnF1b3Q7Jmd0O3ppcCZsdDsvYSZndDsgdGFza3MuCitUaGlzIHRhc2sgd2lsbCB3b3JrIG9uIFdpbmRvd3MgdXNpbmcgdGhlIGV4dGVybmFsIGNhYmFyYyB0b29sIChwcm92aWRlZCBieSBNaWNyb3NvZnQpCit3aGljaCBtdXN0IGJlIGxvY2F0ZWQgaW4geW91ciBleGVjdXRhYmxlIHBhdGguJmx0Oy9wJmd0OworJmx0O3AmZ3Q7VG8gdXNlIHRoaXMgdGFzayBvbiBvdGhlciBwbGF0Zm9ybXMgeW91IG5lZWQgdG8gZG93bmxvYWQgYW5kIGNvbXBpbGUgbGliY2FiaW5ldCBmcm9tCismbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly90cmlsbC5jaXMuZm9yZGhhbS5lZHUvfmJhcmJhY2hhL2NhYmluZXRfbGlicmFyeS8mcXVvdDsmZ3Q7CitodHRwOi8vdHJpbGwuY2lzLmZvcmRoYW0uZWR1L35iYXJiYWNoYS9jYWJpbmV0X2xpYnJhcnkvJmx0Oy9hJmd0Oy4mbHQ7L3AmZ3Q7CismbHQ7cCZndDtTZWUgdGhlIHNlY3Rpb24gb24gJmx0O2EgaHJlZj0mcXVvdDsuLi9kaXJ0YXNrcy5odG1sI2RpcmVjdG9yeWJhc2VkdGFza3MmcXVvdDsmZ3Q7ZGlyZWN0b3J5IGJhc2VkCit0YXNrcyZsdDsvYSZndDssIG9uIGhvdyB0aGUgaW5jbHVzaW9uL2V4Y2x1c2lvbiBvZiBmaWxlcyB3b3JrcywgYW5kIGhvdyB0bword3JpdGUgcGF0dGVybnMuJmx0Oy9wJmd0OworJmx0O3AmZ3Q7VGhpcyB0YXNrIGZvcm1zIGFuIGltcGxpY2l0ICZsdDthIGhyZWY9JnF1b3Q7Li4vQ29yZVR5cGVzL2ZpbGVzZXQuaHRtbCZxdW90OyZndDtGaWxlU2V0Jmx0Oy9hJmd0OyBhbmQKK3N1cHBvcnRzIGFsbCBhdHRyaWJ1dGVzIG9mICZsdDtjb2RlJmd0OyZhbXA7bHQ7ZmlsZXNldCZhbXA7Z3Q7Jmx0Oy9jb2RlJmd0OworKCZsdDtjb2RlJmd0O2RpciZsdDsvY29kZSZndDsgYmVjb21lcyAmbHQ7Y29kZSZndDtiYXNlZGlyJmx0Oy9jb2RlJmd0OykgYXMgd2VsbCBhcyB0aGUgbmVzdGVkCismbHQ7Y29kZSZndDsmYW1wO2x0O2luY2x1ZGUmYW1wO2d0OyZsdDsvY29kZSZndDssICZsdDtjb2RlJmd0OyZhbXA7bHQ7ZXhjbHVkZSZhbXA7Z3Q7Jmx0Oy9jb2RlJmd0OyBhbmQKKyZsdDtjb2RlJmd0OyZhbXA7bHQ7cGF0dGVybnNldCZhbXA7Z3Q7Jmx0Oy9jb2RlJmd0OyBlbGVtZW50cy4mbHQ7L3AmZ3Q7Cis8L0RFU0NSSVBUSU9OPgorCQk8QVRUUklCVVRFIE5BTUU9ImNhYmZpbGUiIFJFUVVJUkVEPSJ5ZXMiPgorCQkJPERFU0NSSVBUSU9OPnRoZSBuYW1lIG9mIHRoZSBjYWIgZmlsZSB0byBjcmVhdGU8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImJhc2VkaXIiIFJFUVVJUkVEPSJ5ZXMiPgorCQkJPERFU0NSSVBUSU9OPnRoZSBkaXJlY3RvcnkgdG8gc3RhcnQgYXJjaGl2aW5nIGZpbGVzIGZyb208L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9InZlcmJvc2UiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+c2V0IHRvICZxdW90O3llcyZxdW90OyBpZiB5b3Ugd2FudCB0byBzZWUgdGhlIG91dHB1dCBmcm9tdGhlIGNhYmFyYyB0b29sLiAgZGVmYXVsdHMgdG8gJnF1b3Q7bm8mcXVvdDs8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImNvbXByZXNzIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPnNldCB0byAmcXVvdDtubyZxdW90OyB0byBzdG9yZSBmaWxlcyB3aXRob3V0IGNvbXByZXNzaW5nLmRlZmF1bHRzIHRvICZxdW90O3llcyZxdW90OzwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0ib3B0aW9ucyIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj51c2UgdG8gc2V0IGFkZGl0aW9uYWwgY29tbWFuZC1saW5lIG9wdGlvbnMgZm9ydGhlIGNhYmFyYyB0b29sLiAgc2hvdWxkIG5vdCBub3JtYWxseSBiZSBuZWNlc3Nhcnk8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImluY2x1ZGVzIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPmNvbW1hLSBvciBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucyBvZiBmaWxlcyB0aGF0bXVzdCBiZSBpbmNsdWRlZC4gQWxsIGZpbGVzIGFyZSBpbmNsdWRlZCB3aGVuIG9taXR0ZWQ8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImluY2x1ZGVzZmlsZSIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj50aGUgbmFtZSBvZiBhIGZpbGUuIEVhY2ggbGluZSBvZiB0aGlzIGZpbGUgaXN0YWtlbiB0byBiZSBhbiBpbmNsdWRlIHBhdHRlcjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZXhjbHVkZXMiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+Y29tbWEtIG9yIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zIG9mIGZpbGVzIHRoYXRtdXN0IGJlIGV4Y2x1ZGVkLiBObyBmaWxlcyAoZXhjZXB0IGRlZmF1bHQgZXhjbHVkZXMpIGFyZSBleGNsdWRlZHdoZW4gb21pdHRlZDwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZXhjbHVkZXNmaWxlIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPnRoZSBuYW1lIG9mIGEgZmlsZS4gRWFjaCBsaW5lIG9mIHRoaXMgZmlsZSBpc3Rha2VuIHRvIGJlIGFuIGV4Y2x1ZGUgcGF0dGVyPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJkZWZhdWx0ZXhjbHVkZXMiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+aW5kaWNhdGVzIHdoZXRoZXIgZGVmYXVsdCBleGNsdWRlcyBzaG91bGQgYmUgdXNlZG9yIG5vdCAoJnF1b3Q7eWVzJnF1b3Q7LyZxdW90O25vJnF1b3Q7KS4gRGVmYXVsdCBleGNsdWRlcyBhcmUgdXNlZCB3aGVuIG9taXR0ZWQ8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKwk8L1RBU0s+CisJPFRBU0sgTkFNRT0iZGVwZW5kIj4KKwkJPERFU0NSSVBUSU9OPiZsdDtwJmd0OworVGhlIGRlcGVuZCB0YXNrIHdvcmtzIGJ5IGRldGVybWluaW5nIHdoaWNoIGNsYXNzZXMgYXJlIG91dCBvZiBkYXRlIHdpdGgKK3Jlc3BlY3QgdG8gdGhlaXIgc291cmNlIGFuZCB0aGVuIHJlbW92aW5nIHRoZSBjbGFzcyBmaWxlcyBvZiBhbnkgb3RoZXIKK2NsYXNzZXMgd2hpY2ggZGVwZW5kIG9uIHRoZSBvdXQtb2YtZGF0ZSBjbGFzc2VzLgorJmx0Oy9wJmd0OworJmx0O3AmZ3Q7IFRvIGRldGVybWluZSB0aGUgY2xhc3MgZGVwZW5kZW5jaWVzLCB0aGUgZGVwZW5kIHRhc2sgYW5hbHlzZXMgdGhlIGNsYXNzIAorZmlsZXMgb2YgYWxsIGNsYXNzIGZpbGVzIHBhc3NlZCB0byBpdC4gRGVwZW5kIGRvZXMgbm90IHBhcnNlIHlvdXIgc291cmNlIGNvZGUgaW4gCithbnkgd2F5IGJ1dCByZWxpZXMgdXBvbiB0aGUgY2xhc3MgcmVmZXJlbmNlcyBlbmNvZGVkIGludG8gdGhlIGNsYXNzIGZpbGVzIGJ5IHRoZSAKK2NvbXBpbGVyLiBUaGlzIGlzIGdlbmVyYWxseSBmYXN0ZXIgdGhhbiBwYXJzaW5nIHRoZSBKYXZhIHNvdXJjZS4mbHQ7L3AmZ3Q7CismbHQ7cCZndDsKK1RvIGxlYXJuIG1vcmUgYWJvdXQgaG93IHRoaXMgaW5mb3JtYXRpb24gaXMgb2J0YWluZWQgZnJvbSB0aGUgY2xhc3MgZmlsZXMsIAorcGxlYXNlIHJlZmVyIHRvICZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL3Ztc3BlYy8mcXVvdDsmZ3Q7dGhlIEphdmEgCitWaXJ0dWFsIE1hY2hpbmUgU3BlY2lmaWNhdGlvbiZsdDsvYSZndDsKKyZsdDsvcCZndDsKKyZsdDtwJmd0OyBTaW5jZSBhIGNsYXNzJyBkZXBlbmRlbmNpZXMgb25seSBjaGFuZ2Ugd2hlbiB0aGUgY2xhc3MgaXRzZWxmIGNoYW5nZXMsIHRoZSAKK2RlcGVuZCB0YXNrIGlzIGFibGUgdG8gY2FjaGUgZGVwZW5kZW5jeSBpbmZvcm1hdGlvbi4gT25seSB0aG9zZSBjbGFzcyBmaWxlcyAKK3doaWNoIGhhdmUgY2hhbmdlZCB3aWxsIGhhdmUgdGhlaXIgZGVwZW5kZW5jeSBpbmZvcm1hdGlvbiByZS1hbmFseXNlZC4gTm90ZSB0aGF0IAoraWYgeW91IGNoYW5nZSBhIGNsYXNzJyBkZXBlbmRlbmNpZXMgYnkgY2hhbmdpbmcgdGhlIHNvdXJjZSwgaXQgd2lsbCBiZSAKK3JlY29tcGlsZWQgYW55d2F5LiBZb3UgY2FuIGV4YW1pbmUgdGhlIGRlcGVuZGVuY3kgZmlsZXMgY3JlYXRlZCB0byB1bmRlcnN0YW5kIAordGhlICBkZXBlbmRlbmNpZXMgb2YgeW91ciBjbGFzc2VzLiBQbGVhc2UgZG8gbm90IHJlbHksIGhvd2V2ZXIsIG9uIHRoZSBmb3JtYXQgb2YgCit0aGUgaW5mb3JtYXRpb24sIGFzIGl0IG1heSBjaGFuZ2UgaW4gYSBsYXRlciByZWxlYXNlLiAmbHQ7L3AmZ3Q7CismbHQ7cCZndDsgT25jZSBkZXBlbmQgZGlzY292ZXJzIGFsbCBvZiB0aGUgY2xhc3MgZGVwZW5kZW5jaWVzLCBpdCAmYW1wO3F1b3Q7aW52ZXJ0cyZhbXA7cXVvdDsgCit0aGlzIHJlbGF0aW9uIHRvIGRldGVybWluZSwgZm9yIGVhY2ggY2xhc3MsIHdoaWNoIG90aGVyIGNsYXNzZXMgYXJlIGRlcGVuZGVudCAKK3Vwb24gaXQuIFRoaXMgJmFtcDtxdW90O2FmZmVjdHMmYW1wO3F1b3Q7IGxpc3QgaXMgdXNlZCB0byBkaXNjb3ZlciB3aGljaCBjbGFzc2VzIGFyZSAKK2ludmFsaWRhdGVkIGJ5IHRoZSBvdXQgb2YgZGF0ZSBjbGFzcy4gVGhlIGNsYXNzIGZpbGVzIG9mIHRoZSBpbnZhbGlkYXRlZCAKK2NsYXNzZXMgYXJlIHJlbW92ZWQsIHRyaWdnZXJpbmcgdGhlIGNvbXBpbGF0aW9uIG9mIHRoZSBhZmZlY3RlZCBjbGFzc2VzLiAmbHQ7L3AmZ3Q7CismbHQ7cCZndDsgVGhlIGRlcGVuZCB0YXNrIHN1cHBvcnRzIGFuIGF0dHJpYnV0ZSwgJmFtcDtxdW90O2Nsb3N1cmUmYW1wO3F1b3Q7IHdoaWNoIGNvbnRyb2xzIAord2hldGhlciBkZXBlbmQgd2lsbCBvbmx5IGNvbnNpZGVyIGRpcmVjdCBjbGFzcy1jbGFzcyByZWxhdGlvbnNoaXBzIG9yIHdoZXRoZXIgaXQgCit3aWxsIGFsc28gY29uc2lkZXIgdHJhbnNpdGl2ZSwgaW5kaXJlY3QgcmVsYXRpb25zaGlwcy4gRm9yIGV4YW1wbGUsIHNheSB0aGVyZSAKK2FyZSB0aHJlZSBjbGFzc2VzLCBBLCB3aGljaCBkZXBlbmRzIG9uIEIsIHdoaWNoIGluLXR1cm4gZGVwZW5kIG9uIEMuIE5vdyBzYXkgCit0aGF0IGNsYXNzIEMgaXMgb3V0IG9mIGRhdGUuIFdpdGhvdXQgY2xvc3VyZSwgb25seSBjbGFzcyBCIHdvdWxkIGJlIHJlbW92ZWQgYnkgCitkZXBlbmQuIFdpdGggY2xvc3VyZSBzZXQsIGNsYXNzIEEgd291bGQgYWxzbyBiZSByZW1vdmVkLiBOb3JtYWxseSBkaXJlY3QgCityZWxhdGlvbnNoaXBzIGFyZSBzdWZmaWNpZW50IC0gaXQgaXMgdW51c3VhbCBmb3IgYSBjbGFzcyB0byBkZXBlbmQgb24gYW5vdGhlciAKK3dpdGhvdXQgaGF2aW5nIGEgZGlyZWN0IHJlbGF0aW9uc2hpcC4gV2l0aCBjbG9zdXJlIHNldCwgeW91IHdpbGwgbm90aWNlIHRoYXQgCitkZXBlbmQgdHlwaWNhbGx5IHJlbW92ZXMgZmFyIG1vcmUgY2xhc3MgZmlsZXMuICZsdDsvcCZndDsKKyZsdDtwJmd0O1RoZSBjbGFzc3BhdGggYXR0cmlidXRlIGZvciAmbHQ7Y29kZSZndDsmYW1wO2x0O2RlcGVuZCZhbXA7Z3Q7Jmx0Oy9jb2RlJmd0OyBpcyBvcHRpb25hbC4gSWYgaXQgaXMgcHJlc2VudCwgCitkZXBlbmQgd2lsbCBjaGVjayBjbGFzcyBkZXBlbmRlbmNpZXMgYWdhaW5zdCBjbGFzc2VzIGFuZCBqYXJzIG9uIHRoaXMgY2xhc3NwYXRoLgorQW55IGNsYXNzZXMgd2hpY2ggZGVwZW5kIG9uIGFuIGVsZW1lbnQgZnJvbSB0aGlzIGNsYXNzcGF0aCBhbmQgd2hpY2ggYXJlIG9sZGVyIAordGhhbiB0aGF0IGVsZW1lbnQgd2lsbCBiZSBkZWxldGVkLiBBIHR5cGljYWwgZXhhbXBsZSB3aGVyZSB5b3Ugd291bGQgdXNlIHRoaXMgCitmYWNpbGl0eSB3b3VsZCBiZSB3aGVyZSB5b3UgYXJlIGJ1aWxkaW5nIGEgdXRpbGl0eSBqYXIgYW5kIHdhbnQgdG8gbWFrZSBzdXJlIAorY2xhc3NlcyB3aGljaCBhcmUgb3V0IG9mIGRhdGUgd2l0aCByZXNwZWN0IHRvIHRoaXMgamFyIGFyZSByZWJ1aWx0LiBZb3Ugc2hvdWxkCismbHQ7YiZndDtub3QmbHQ7L2ImZ3Q7IGluY2x1ZGUgamFycyBpbiB0aGlzIGNsYXNzcGF0aCB3aGljaCB5b3UgZG8gbm90IGV4cGVjdCB0byBjaGFuZ2UsIAorc3VjaCBhcyB0aGUgSkRLIHJ1bnRpbWUgamFyIG9yIHRoaXJkIHBhcnR5IGphcnMsIHNpbmNlIGRvaW5nIHNvIHdpbGwganVzdCBzbG93IAorZG93biB0aGUgZGVwZW5kZW5jeSBjaGVjay4gVGhpcyBtZWFucyB0aGF0IGlmIHlvdSBkbyB1c2UgYSBjbGFzc3BhdGggZm9yIHRoZSAKK2RlcGVuZCB0YXNrIGl0IG1heSBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgY2xhc3NwYXRoIG5lY2Vzc2FyeSB0byBhY3R1YWxseSAKK2NvbXBpbGUgeW91ciBjb2RlLiZsdDsvcCZndDsKKyZsdDtoMyZndDtQZXJmb3JtYW5jZSZsdDsvaDMmZ3Q7IAorJmx0O3AmZ3Q7IFRoZSBwZXJmb3JtYW5jZSBvZiB0aGUgZGVwZW5kIHRhc2sgaXMgZGVwZW5kZW50IG9uIGEgCitudW1iZXIgb2YgZmFjdG9ycyBzdWNoIGFzIGNsYXNzIHJlbGF0aW9uc2hpcCBjb21wbGV4aXR5IGFuZCBob3cgbWFueSBjbGFzcyBmaWxlcyAKK2FyZSBvdXQgb2YgZGF0ZS4gVGhlIGRlY2lzaW9uIGFib3V0IHdoZXRoZXIgaXQgaXMgY2hlYXBlciB0byBqdXN0IHJlY29tcGlsZSBhbGwgCitjbGFzc2VzIG9yIHRvIHVzZSB0aGUgZGVwZW5kIHRhc2sgd2lsbCBkZXBlbmQgb24gdGhlIHNpemUgb2YgeW91ciBwcm9qZWN0IGFuZCAKK2hvdyBpbnRlcnJlbGF0ZWQgeW91ciBjbGFzc2VzIGFyZS4gJmx0Oy9wJmd0OworJmx0O2gzJmd0O0xpbWl0YXRpb25zJmx0Oy9oMyZndDsKKyZsdDtwJmd0OyBUaGVyZSBhcmUgc29tZSBzb3VyY2UgZGVwZW5kZW5jaWVzIHdoaWNoIGRlcGVuZCB3aWxsIG5vdCBkZXRlY3QuICZsdDsvcCZndDsKKyZsdDt1bCZndDsKKyZsdDtsaSZndDtJZiB0aGUgSmF2YSBjb21waWxlciBvcHRpbWl6ZXMgYXdheSBhIGNsYXNzIHJlbGF0aW9uc2hpcCwgCit0aGVyZSBjYW4gYmUgYSBzb3VyY2UgZGVwZW5kZW5jeSB3aXRob3V0IGEgY2xhc3MgZGVwZW5kZW5jeS4gJmx0Oy9saSZndDsKKyZsdDtsaSZndDtOb24gcHVibGljIGNsYXNzZXMgY2F1c2UgdHdvIHByb2JsZW1zLiBGaXJzdGx5IGRlcGVuZCBjYW5ub3QgcmVsYXRlCit0aGUgY2xhc3MgZmlsZSB0byBhIHNvdXJjZSBmaWxlLiBJbiB0aGUgZnV0dXJlIHRoaXMgbWF5IGJlIGFkZHJlc3NlZAordXNpbmcgdGhlIHNvdXJjZSBmaWxlIGF0dHJpYnV0ZSBpbiB0aGUgY2xhc3NmaWxlLiBTZWNvbmRseSwgbmVpdGhlciAKK2RlcGVuZCBub3IgdGhlIGNvbXBpbGVyIHRhc2tzIGNhbiBkZXRlY3Qgd2hlbiBhIG5vbiBwdWJsaWMgY2xhc3MgaXMKK21pc3NpbmcuIElubmVyIGNsYXNzZXMgYXJlIGhhbmRsZWQgYnkgdGhlIGRlcGVuZCB0YXNrLiZsdDsvbGkmZ3Q7CismbHQ7L3VsJmd0OworVGhlIG1vc3Qgb2J2aW91cyBleGFtcGxlIG9mIHRoZXNlIGxpbWl0YXRpb25zIGlzIHRoYXQgdGhlIHRhc2sgY2FuJ3QgdGVsbAord2hpY2ggY2xhc3NlcyB0byByZWNvbXBpbGUgd2hlbiBhIGNvbnN0YW50IHByaW1pdGl2ZSBkYXRhIHR5cGUgZXhwb3J0ZWQgCitieSBvdGhlciBjbGFzc2VzIGlzIGNoYW5nZWQuIEZvciBleGFtcGxlLCBhIGNoYW5nZSBpbiB0aGUgZGVmaW5pdGlvbiBvZgorc29tZXRoaW5nIGxpa2UKKyZsdDtwcmUmZ3Q7CitwdWJsaWMgZmluYWwgY2xhc3MgQ29uc3RhbnRzIHsKK3B1YmxpYyBmaW5hbCBzdGF0aWMgYm9vbGVhbiBERUJVRz1mYWxzZTsKK30KKyZsdDsvcHJlJmd0OyB3aWxsIG5vdCBiZSBwaWNrZWQgdXAgYnkgb3RoZXIgY2xhc3Nlcy4KKzwvREVTQ1JJUFRJT04+CisJCTxBVFRSSUJVVEUgTkFNRT0ic3JjZGlyIiBSRVFVSVJFRD0ieWVzIj4KKwkJCTxERVNDUklQVElPTj5UaGlzIGlzIHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIHNvdXJjZSBleGlzdHMuIGRlcGVuZHdpbGwgZXhhbWluZSB0aGlzIHRvIGRldGVybWluZSB3aGljaCBjbGFzc2VzIGFyZSBvdXQgb2YgZGF0ZS4gSWYgeW91IHVzZSBtdWx0aXBsZXNvdXJjZSBkaXJlY3RvcmllcyB5b3UgY2FuIHBhc3MgdGhpcyBhdHRyaWJ1dGUgYSBwYXRoIG9mIHNvdXJjZSBkaXJlY3RvcmllczwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZGVzdGRpciIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5UaGlzIGlzIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGUgY2xhc3MgZmlsZXMgd2hpY2h3aWxsIGJlIGFuYWx5c2VkLiBJZiB0aGlzIGlzIG5vdCBwcmVzZW50LCB0aGUgc3JjZGlyIGlzIHVzZWQ8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImNhY2hlIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPlRoaXMgaXMgYSBkaXJlY3RvcnkgaW4gd2hpY2ggZGVwZW5kIGNhbiBzdG9yZSBhbmRyZXRyaWV2ZSBkZXBlbmRlbmN5IGluZm9ybWF0aW9uLiBJZiB0aGlzIGlzIG5vdCBwcmVzZW50LCBkZXBlbmQgd2lsbCBub3R1c2UgYSBjYWNoZTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iY2xvc3VyZSIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5UaGlzIGF0dHJpYnV0ZSBjb250cm9scyB3aGV0aGVyIGRlcGVuZCBvbmx5IHJlbW92ZXNjbGFzc2VzIHdoaWNoIGRpcmVjdGx5IGRlcGVuZCBvbiBvdXQgb2YgZGF0ZSBjbGFzc2VzLiBJZiB0aGlzIGlzIHNldCB0byB0cnVlLGRlcGVuZCB3aWxsIHRyYXZlcnNlIHRoZSBjbGFzcyBkZXBlbmRlbmN5IGdyYXBoIGRlbGV0aW5nIGFsbCBhZmZlY3RlZGNsYXNzZXMuIERlZmF1bHRzIHRvIGZhbHM8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImR1bXAiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+SWYgdHJ1ZSB0aGUgZGVwZW5kZW5jeSBpbmZvcm1hdGlvbiB3aWxsIGJlIHdyaXR0ZW4gdG8gdGhlIGRlYnVnIGxldmVsIGxvZzwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iY2xhc3NwYXRoIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPlRoZSBjbGFzc3BhdGggY29udGFpbmcgamFycyBhbmQgY2xhc3NlcyBmb3Igd2hpY2ggJmx0O2RlcGVuZCZndDsgc2hvdWxkIGFsc29jaGVjayBkZXBlbmRlbmNpZTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCTwvVEFTSz4KKwk8VEFTSyBOQU1FPSJlY2hvcHJvcGVydGllcyI+CisJCTxERVNDUklQVElPTj4mbHQ7cCZndDtEaXNwbGF5cyBhbGwgdGhlIGN1cnJlbnQgcHJvcGVydGllcyBpbiB0aGUgcHJvamVjdC4gIFRoZSBvdXRwdXQgY2FuIGJlCitzZW50IHRvIGEgZmlsZSBpZiBkZXNpcmVkLiBZb3UgY2FuIGFsc28gc3BlY2lmeSBhIHN1YnNldCBvZiBwcm9wZXJ0aWVzCit0byBzYXZlIGJ5IG5hbWluZyBhIHByZWZpeDogb25seSBwcm9wZXJ0aWVzIHN0YXJ0aW5nIHdpdGggdGhpcworcHJlZml4IHdpbGwgYmUgc2F2ZWQuIFRoaXMgdGFzayBjYW4gYmUgdXNlZCBhcyBhIHNvbWV3aGF0IGNvbnRyaXZlZAorbWVhbnMgb2YgcmV0dXJuaW5nIGRhdGEgZnJvbSBhbiAmbHQ7dHQmZ3Q7JmFtcDtsdDthbnQmYW1wO2d0OyZsdDsvdHQmZ3Q7IGludm9jYXRpb24sCitidXQgaXMgcmVhbGx5IGZvciBkZWJ1Z2dpbmcgYnVpbGRmaWxlcy4mbHQ7L3AmZ3Q7Cis8L0RFU0NSSVBUSU9OPgorCQk8QVRUUklCVVRFIE5BTUU9ImRlc3RmaWxlIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPklmIHNwZWNpZmllZCwgdGhlIHZhbHVlIGluZGljYXRlcyB0aGUgbmFtZSBvZiB0aGVmaWxlIHRvIHNlbmQgdGhlIG91dHB1dCBvZiB0aGUgc3RhdGVtZW50IHRvLiAgVGhlIGdlbmVyYXRlZCBvdXRwdXQgZmlsZWlzIGNvbXBhdGlibGUgZm9yIGxvYWRpbmcgYnkgYW55IEphdmEgYXBwbGljYXRpb24gYXMgYSBwcm9wZXJ0eSBmaWxlLklmIG5vdCBzcGVjaWZpZWQsIHRoZW4gdGhlIG91dHB1dCB3aWxsIGdvIHRvIHRoZSBBbnQgbG9nPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJwcmVmaXgiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+YSBwcmVmaXggd2hpY2ggaXMgdXNlZCB0byBmaWx0ZXIgdGhlIHByb3BlcnRpZXNvbmx5IHRob3NlIHByb3BlcnRpZXMgc3RhcnRpbmcgd2l0aCB0aGlzIHByZWZpeCB3aWxsIGJlIGVjaG9lZC48L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImZhaWxvbmVycm9yIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPkJ5IGRlZmF1bHQsIHRoZSAmcXVvdDtmYWlsb25lcnJvciZxdW90OyBhdHRyaWJ1dGUgaXMgZW5hYmxlZC5JZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgd3JpdGluZyB0aGUgcHJvcGVydGllcyB0byBhIGZpbGUsIGFuZCB0aGlzYXR0cmlidXRlIGlzIGVuYWJsZWQsIHRoZW4gYSBCdWlsZEV4Y2VwdGlvbiB3aWxsIGJlIHRocm93biwgY2F1c2luZyB0aGVidWlsZCB0byBmYWlsLiAgSWYgZGlzYWJsZWQsIHRoZW4gSU8gZXJyb3JzIHdpbGwgYmUgcmVwb3J0ZWQgYXMgYSBsb2dzdGF0ZW1lbnQsIGFuZCB0aGUgYnVpbGQgd2lsbCBjb250aW51ZSB3aXRob3V0IGZhaWx1cmUgZnJvbSB0aGlzIHRhc2s8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKwk8L1RBU0s+CisJPFRBU0sgTkFNRT0iZnRwIj4KKwkJPERFU0NSSVBUSU9OPiZsdDtwJmd0O1RoZSBmdHAgdGFzayBpbXBsZW1lbnRzIGEgYmFzaWMgRlRQIGNsaWVudCB0aGF0IGNhbiBzZW5kLCByZWNlaXZlLAorbGlzdCwgZGVsZXRlIGZpbGVzLCBhbmQgY3JlYXRlIGRpcmVjdG9yaWVzLiAgU2VlIGJlbG93IGZvciBkZXNjcmlwdGlvbnMgYW5kIGV4YW1wbGVzIG9mIGhvdwordG8gcGVyZm9ybSBlYWNoIHRhc2suJmx0Oy9wJmd0OworJmx0O3AmZ3Q7Jmx0O2ImZ3Q7Tm90ZTombHQ7L2ImZ3Q7IFRoaXMgdGFzayBkZXBlbmRzIG9uIGV4dGVybmFsIGxpYnJhcmllcyBub3QgaW5jbHVkZWQgaW4gdGhlIEFudCBkaXN0cmlidXRpb24uCitTZWUgJmx0O2EgaHJlZj0mcXVvdDsuLi9pbnN0YWxsLmh0bWwjbGlicmFyeWRlcGVuZGVuY2llcyZxdW90OyZndDtMaWJyYXJ5IERlcGVuZGVuY2llcyZsdDsvYSZndDsgZm9yIG1vcmUgaW5mb3JtYXRpb24uJmx0Oy9wJmd0OworJmx0O3AmZ3Q7VGhlIGZ0cCB0YXNrIG1ha2VzIG5vIGF0dGVtcHQgdG8gZGV0ZXJtaW5lIHdoYXQgZmlsZSBzeXN0ZW0gc3ludGF4IGlzCityZXF1aXJlZCBieSB0aGUgcmVtb3RlIHNlcnZlciwgYW5kIGRlZmF1bHRzIHRvIFVuaXggc3RhbmRhcmRzLgorJmx0O2kmZ3Q7cmVtb3RlZGlyJmx0Oy9pJmd0OyBtdXN0IGJlIHNwZWNpZmllZCBpbiB0aGUgZXhhY3Qgc3ludGF4IHJlcXVpcmVkIGJ5IHRoZSBmdHAKK3NlcnZlci4gSWYgdGhlIHVzdWFsIFVuaXggY29udmVudGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHNlcnZlciwKKyZsdDtpJmd0O3NlcGFyYXRvciZsdDsvaSZndDsgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBmaWxlIHNlcGFyYXRvciB0aGF0IHNob3VsZCBiZSB1c2VkCitpbnN0ZWFkLiZsdDsvcCZndDsKKyZsdDtwJmd0O1NlZSB0aGUgc2VjdGlvbiBvbiAmbHQ7YSBocmVmPSZxdW90Oy4uL2RpcnRhc2tzLmh0bWwjZGlyZWN0b3J5YmFzZWR0YXNrcyZxdW90OyZndDtkaXJlY3RvcnkgYmFzZWQKK3Rhc2tzJmx0Oy9hJmd0Oywgb24gaG93IHRoZSBpbmNsdXNpb24vZXhjbHVzaW9uIG9mIGZpbGVzIHdvcmtzLCBhbmQgaG93IHRvCit3cml0ZSBwYXR0ZXJucy4mbHQ7L3AmZ3Q7CismbHQ7cCZndDsKKyZsdDtiJmd0O1dhcm5pbmc6ICZsdDsvYiZndDsgZm9yIHRoZSBnZXQgYW5kIGRlbGV0ZSBhY3Rpb25zIHRvIHdvcmsgcHJvcGVybHkgCit3aXRoIGEgV2luZG93cyAyMDAwIGZ0cCBzZXJ2ZXIsIGl0IG5lZWRzIHRvIGJlIGNvbmZpZ3VyZWQgdG8gZ2VuZXJhdGUKK1VuaXggc3R5bGUgbGlzdGluZ3MsIGFuZCBub3QgdGhlIGRlZmF1bHQgTVMtRE9TIGxpc3RpbmcuIE9yIHNvbWVvbmUgbmVlZHMgdG8gd3JpdGUKK3RoZSBjb2RlIHRvIHBhcnNlIE1TLURPUyBsaXN0aW5ncyAtYW55IHRha2Vycz8KKzwvREVTQ1JJUFRJT04+CisJCTxBVFRSSUJVVEUgTkFNRT0ic2VydmVyIiBSRVFVSVJFRD0ieWVzIj4KKwkJCTxERVNDUklQVElPTj50aGUgYWRkcmVzcyBvZiB0aGUgcmVtb3RlIGZ0cCBzZXJ2ZXI8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9InBvcnQiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+dGhlIHBvcnQgbnVtYmVyIG9mIHRoZSByZW1vdGUgZnRwIHNlcnZlci5EZWZhdWx0cyB0byBwb3J0IDIxPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJ1c2VyaWQiIFJFUVVJUkVEPSJ5ZXMiPgorCQkJPERFU0NSSVBUSU9OPnRoZSBsb2dpbiBpZCB0byB1c2Ugb24gdGhlIGZ0cCBzZXJ2ZXI8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9InBhc3N3b3JkIiBSRVFVSVJFRD0ieWVzIj4KKwkJCTxERVNDUklQVElPTj50aGUgbG9naW4gcGFzc3dvcmQgdG8gdXNlIG9uIHRoZSBmdHAgc2VydmVyPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJyZW1vdGVkaXIiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+dGhlIGRpcmVjdG9yeSB0byB3aGljaCB0byB1cGxvYWQgZmlsZXMgb24gdGhlIGZ0cCBzZXJ2ZXI8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImFjdGlvbiIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj50aGUgZnRwIGFjdGlvbiB0byBwZXJmb3JtLCBkZWZhdWx0aW5nIHRvICZxdW90O3NlbmQmcXVvdDsuICBDdXJyZW50bHkgc3VwcG9ydHMgJnF1b3Q7cHV0JnF1b3Q7LCAmcXVvdDtnZXQmcXVvdDssJnF1b3Q7ZGVsJnF1b3Q7LCAmcXVvdDtsaXN0JnF1b3Q7LCAmcXVvdDtjaG1vZCZxdW90OyBhbmQgJnF1b3Q7bWtkaXImcXVvdDs8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImJpbmFyeSIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5zZWxlY3RzIGJpbmFyeS1tb2RlICgmcXVvdDt5ZXMmcXVvdDspIG9yIHRleHQtbW9kZSAoJnF1b3Q7bm8mcXVvdDspIHRyYW5zZmVycy4gIERlZmF1bHRzIHRvICZxdW90O3llczwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0icGFzc2l2ZSIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5zZWxlY3RzIHBhc3NpdmUtbW9kZSAoJnF1b3Q7eWVzJnF1b3Q7KSB0cmFuc2ZlcnMuICBEZWZhdWx0cyB0byAmcXVvdDtubzwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0idmVyYm9zZSIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5kaXNwbGF5cyBpbmZvcm1hdGlvbiBvbiBlYWNoIGZpbGUgdHJhbnNmZXJyZWQgaWYgc2V0IHRvICZxdW90O3llcyZxdW90Oy4gRGVmYXVsdHMgdG8gJnF1b3Q7bm8mcXVvdDs8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImRlcGVuZHMiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+dHJhbnNmZXJzIG9ubHkgbmV3IG9yIGNoYW5nZWQgZmlsZXMgaWYgc2V0IHRvICZxdW90O3llcyZxdW90Oy4gRGVmYXVsdHMgdG8gJnF1b3Q7bm8mcXVvdDs8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9Im5ld2VyIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPmEgc3lub255bSBmb3IgZGVwZW5kczwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0ic2VwYXJhdG9yIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPnNldHMgdGhlIGZpbGUgc2VwYXJhdG9yIHVzZWQgb24gdGhlIGZ0cCBzZXJ2ZXIuRGVmYXVsdHMgdG8gJnF1b3Q7LyZxdW90OzwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0idW1hc2siIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+c2V0cyB0aGUgZGVmYXVsdCBmaWxlIHBlcm1pc3Npb25zIGZvciBuZXcgZmlsZXMsdW5peCBvbmx5PC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJjaG1vZCIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5zZXRzIG9yIGNoYW5nZXMgZmlsZSBwZXJtaXNzaW9ucyBmb3IgbmV3IG9yIGV4aXN0aW5nIGZpbGVzLHVuaXggb25seS4gSWYgdXNlZCB3aXRoIGEgcHV0IGFjdGlvbiwgY2htb2Qgd2lsbCBiZSBpc3N1ZWQgZm9yIGVhY2ggZmlsZTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0ibGlzdGluZyIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj50aGUgZmlsZSB0byB3cml0ZSByZXN1bHRzIG9mIHRoZSAmcXVvdDtsaXN0JnF1b3Q7IGFjdGlvbi5SZXF1aXJlZCBmb3IgdGhlICZxdW90O2xpc3QmcXVvdDsgYWN0aW9uLCBpZ25vcmVkIG90aGVyd2lzZTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iaWdub3Jlbm9uY3JpdGljYWxlcnJvcnMiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+ZmxhZyB3aGljaCBwZXJtaXRzIHRoZSB0YXNrIHRvIGlnbm9yZSBzb21lIG5vbi1mYXRhbCBlcnJvcmNvZGVzIHNlbnQgYnkgc29tZSBzZXJ2ZXJzIGR1cmluZyBkaXJlY3RvcnkgY3JlYXRpb246IHd1LWZ0cCBpbiBwYXJ0aWN1bGFyLkRlZmF1bHQ6IGZhbHM8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9InNraXBmYWlsZWR0cmFuc2ZlcnMiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+ZmxhZyB3aGljaCBlbmFibGVzIHVuc3VjY2Vzc2Z1bCBmaWxlIHB1dCwgZGVsZXRlYW5kIGdldCBvcGVyYXRpb25zIHRvIGJlIHNraXBwZWQgd2l0aCBhIHdhcm5pbmcgYW5kIHRoZXJlbWFpbmRlciBvZiB0aGUgZmlsZXMgc3RpbGwgdHJhbnNmZXJyZWQuIERlZmF1bHQ6IGZhbHM8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKwk8L1RBU0s+CisJPFRBU0sgTkFNRT0iaWNvbnRyYWN0Ij4KKwkJPERFU0NSSVBUSU9OPiZsdDtQJmd0OworSW5zdHJ1bWVudHMgSmF2YSBjbGFzc2VzIHdpdGggJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LnJlbGlhYmxlLXN5c3RlbXMuY29tL3Rvb2xzLyZxdW90OyZndDtpQ29udHJhY3QmbHQ7L2EmZ3Q7CitEQkMgcHJlcHJvY2Vzc29yLiZsdDticiZndDsKK1RoZSB0YXNrIGNhbiBnZW5lcmF0ZSBhIHByb3BlcnRpZXMgZmlsZSBmb3IgJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vaG9tZS5zb2wubm8vfmhlbGxlc295L2ljcGx1cy5odG1sJnF1b3Q7Jmd0O2lDb250cm9sJmx0Oy9hJmd0OywKK2EgZ3JhcGhpY2FsIHVzZXIgaW50ZXJmYWNlIHRoYXQgbGV0cyB5b3UgdHVybiBvbi9vZmYgYXNzZXJ0aW9ucy4gaUNvbnRyb2wgZ2VuZXJhdGVzIGEgY29udHJvbCBmaWxlIHRoYXQgeW91IGNhbiByZWZlciB0bworZnJvbSB0aGlzIHRhc2sgdXNpbmcgdGhlIGNvbnRyb2xmaWxlIGF0dHJpYnV0ZS4KKyZsdDsvcCZndDsKKzwvREVTQ1JJUFRJT04+CisJCTxBVFRSSUJVVEUgTkFNRT0ic3JjZGlyIiBSRVFVSVJFRD0ieWVzIj4KKwkJCTxERVNDUklQVElPTj5Mb2NhdGlvbiBvZiB0aGUgamF2YSBmaWxlczwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iaW5zdHJ1bWVudGRpciIgUkVRVUlSRUQ9InllcyI+CisJCQk8REVTQ1JJUFRJT04+SW5kaWNhdGVzIHdoZXJlIHRoZSBpbnN0cnVtZW50ZWQgc291cmNlIGZpbGVzIHNob3VsZCBnbzwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0icmVwb3NpdG9yeWRpciIgUkVRVUlSRUQ9InllcyI+CisJCQk8REVTQ1JJUFRJT04+SW5kaWNhdGVzIHdoZXJlIHRoZSByZXBvc2l0b3J5IHNvdXJjZSBmaWxlcyBzaG91bGQgZ288L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImJ1aWxkZGlyIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPkluZGljYXRlcyB3aGVyZSB0aGUgY29tcGlsZWQgaW5zdHJ1bWVudGVkIGNsYXNzZXMgc2hvdWxkIGdvLkRlZmF1bHRzIHRvIHRoZSB2YWx1ZSBvZiBpbnN0cnVtZW50ZGlyLk5PVEU6IERvbid0IHVzZSB0aGUgc2FtZSBkaXJlY3RvcnkgZm9yIGNvbXBpbGVkIGluc3RydW1lbnRlZCBjbGFzc2VzYW5kIHVuaW5zdHJ1bWVudGVkIGNsYXNzZXMuIEl0IHdpbGwgYnJlYWsgdGhlIGRlcGVuZGVuY3kgY2hlY2tpbmcuIChDbGFzc2VzIHdpbGxub3QgYmUgcmVpbnN0cnVtZW50ZWQgaWYgeW91IGNoYW5nZSB0aGVtKTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0icmVwb3NpdG9yeWJ1aWxkZGlyIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPkluZGljYXRlcyB3aGVyZSB0aGUgY29tcGlsZWQgcmVwb3NpdG9yeSBjbGFzc2VzIHNob3VsZCBnby5EZWZhdWx0cyB0byB0aGUgdmFsdWUgb2YgcmVwb3NpdG9yeWRpcjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0icHJlIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPkluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0byBpbnN0cnVtZW50IGZvciBwcmVjb25kaXRpb25zLkRlZmF1bHRzIHRvIHRydWUgdW5sZXNzIGNvbnRyb2xmaWxlIGlzIHNwZWNpZmllZCwgaW4gd2hpY2ggY2FzZSBpdGRlZmF1bHRzIHRvIGZhbHNlPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJwb3N0IiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPkluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0byBpbnN0cnVtZW50IGZvciBwb3N0Y29uZGl0aW9ucy5EZWZhdWx0cyB0byB0cnVlIHVubGVzcyBjb250cm9sZmlsZSBpcyBzcGVjaWZpZWQsIGluIHdoaWNoIGNhc2UgaXRkZWZhdWx0cyB0byBmYWxzZTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iaW52YXJpYW50IiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPkluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0byBpbnN0cnVtZW50IGZvciBpbnZhcmlhbnRzLkRlZmF1bHRzIHRvIHRydWUgdW5sZXNzIGNvbnRyb2xmaWxlIGlzIHNwZWNpZmllZCwgaW4gd2hpY2ggY2FzZSBpdGRlZmF1bHRzIHRvIGZhbHNlPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJmYWlsdGhyb3dhYmxlIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPlRoZSBmdWxsIG5hbWUgb2YgdGhlIFRocm93YWJsZSAoRXhjZXB0aW9uKSB0aGF0IHNob3VsZCBiZXRocm93biB3aGVuIGFuIGFzc2VydGlvbiBpcyB2aW9sYXRlZC4gRGVmYXVsdHMgdG8gamF2YS5sYW5nLkVycm88L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9InZlcmJvc2l0eSIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5JbmRpY2F0ZXMgdGhlIHZlcmJvc2l0eSBsZXZlbCBvZiBpQ29udHJhY3QuIEFueSBjb21iaW5hdGlvbm9mIGVycm9yKix3YXJuaW5nKixub3RlKixpbmZvKixwcm9ncmVzcyosZGVidWcqIChjb21tYSBzZXBhcmF0ZWQpIGNhbiBiZXVzZWQuIERlZmF1bHRzIHRvIGVycm9yPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJxdWlldCIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5JbmRpY2F0ZXMgaWYgaUNvbnRyYWN0IHNob3VsZCBiZSBxdWlldC4gVHVybiBpdCBvZmYgaWYgbWFueSB5b3VyIGNsYXNzZXMgZXh0ZW5kIHVuaW5zdHJ1bWVudGVkIGNsYXNzZXNhbmQgeW91IGRvbid0IHdhbnQgd2FybmluZ3MgYWJvdXQgdGhpcy4gRGVmYXVsdHMgdG8gZmFsczwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0idXBkYXRlaWNvbnRyb2wiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+SWYgc2V0IHRvIHRydWUsIGl0IGluZGljYXRlcyB0aGF0IHRoZSBwcm9wZXJ0aWVzIGZpbGUgZm9yaUNvbnRyb2wgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHNob3VsZCBiZSB1cGRhdGVkIChvciBjcmVhdGVkIGlmIGl0IGRvZXNuJ3QgZXhpc3QpLkRlZmF1bHRzIHRvIGZhbHNlPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJjb250cm9sZmlsZSIgUkVRVUlSRUQ9Im9ubHkgaWYgdXBkYXRlaWNvbnRyb2w9dHJ1ZSI+CisJCQk8REVTQ1JJUFRJT04+VGhlIG5hbWUgb2YgdGhlIGNvbnRyb2wgZmlsZSB0byBwYXNzIHRvIGlDb250cmFjdC4gQ29uc2lkZXIgdXNpbmcgaUNvbnRyb2wgdG8gZ2VuZXJhdGUgdGhlIGZpbGUuRGVmYXVsdCBpcyBub3QgdG8gcGFzcyBhIGZpbGUuPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJjbGFzc2RpciIgUkVRVUlSRUQ9Im9ubHkgaWYgdXBkYXRlaWNvbnRyb2w9dHJ1ZSI+CisJCQk8REVTQ1JJUFRJT04+SW5kaWNhdGVzIHdoZXJlIGNvbXBpbGVkICh1bmlzdHJ1bWVudGVkKSBjbGFzc2VzIGFyZSBsb2NhdGVkLlRoaXMgaXMgcmVxdWlyZWQgaW4gb3JkZXIgdG8gcHJvcGVybHkgdXBkYXRlIHRoZSBpY29udHJvbC5wcm9wZXJ0aWVzIGZpbGUsIG5vdGZvciBpbnN0cnVtZW50YXRpb248L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9InRhcmdldHMiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+TmFtZSBvZiB0aGUgZmlsZSB0aGF0IHdpbGwgYmUgZ2VuZXJhdGVkIGJ5IHRoaXMgdGFzaywgd2hpY2ggbGlzdHMgYWxsIHRoZWNsYXNzZXMgdGhhdCBpQ29udHJhY3Qgd2lsbCBpbnN0cnVtZW50LiBJZiBzcGVjaWZpZWQsIHRoZSBmaWxlIHdpbGwgbm90IGJlIGRlbGV0ZWQgYWZ0ZXIgZXhlY3V0aW9uLklmIG5vdCBzcGVjaWZpZWQsIGEgZmlsZSB3aWxsIHN0aWxsIGJlIGNyZWF0ZWQsIGJ1dCBpdCB3aWxsIGJlIGRlbGV0ZWQgYWZ0ZXIgZXhlY3V0aW9uPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisJPC9UQVNLPgorCTxUQVNLIE5BTUU9ImphcmxpYi1hdmFpbGFibGUiPgorCQk8REVTQ1JJUFRJT04+Jmx0O3AmZ3Q7Q2hlY2sgd2hldGhlciBhbiBleHRlbnNpb24gaXMgcHJlc2VudCBpbiBhIGZpbGVzZXQgb3IgYW4gZXh0ZW5zaW9uU2V0LgorSWYgdGhlIGV4dGVuc2lvbiBpcyBwcmVzZW50IHRoZW4gYSBwcm9wZXJ0eSBpcyBzZXQuJmx0Oy9wJmd0OworJmx0O3AmZ3Q7Tm90ZSB0aGF0IHRoaXMgdGFzaword29ya3Mgd2l0aCBleHRlbnNpb25zIGFzIGRlZmluZWQgYnkgdGhlICZxdW90O09wdGlvbmFsIFBhY2thZ2UmcXVvdDsgc3BlY2lmaWNhdGlvbi4KK0ZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IG9wdGlvbmFsIHBhY2thZ2VzLCBzZWUgdGhlIGRvY3VtZW50CismbHQ7ZW0mZ3Q7T3B0aW9uYWwgUGFja2FnZSBWZXJzaW9uaW5nJmx0Oy9lbSZndDsgaW4gdGhlIGRvY3VtZW50YXRpb24gYnVuZGxlIGZvciB5b3VyCitKYXZhMiBTdGFuZGFyZCBFZGl0aW9uIHBhY2thZ2UsIGluIGZpbGUKKyZsdDtjb2RlJmd0O2d1aWRlL2V4dGVuc2lvbnMvdmVyc2lvbmluZy5odG1sJmx0Oy9jb2RlJmd0OyBvciBvbmxpbmUgYXQKKyZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuMy9kb2NzL2d1aWRlL2V4dGVuc2lvbnMvdmVyc2lvbmluZy5odG1sJnF1b3Q7Jmd0OworaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuMy9kb2NzL2d1aWRlL2V4dGVuc2lvbnMvdmVyc2lvbmluZy5odG1sJmx0Oy9hJmd0Oy4mbHQ7L3AmZ3Q7CismbHQ7cCZndDtTZWUgdGhlIEV4dGVuc2lvbiBhbmQgRXh0ZW5zaW9uU2V0IGRvY3VtZW50YXRpb24gZm9yIGZ1cnRoZXIgZGV0YWlscyZsdDsvcCZndDsKKzwvREVTQ1JJUFRJT04+CisJCTxBVFRSSUJVVEUgTkFNRT0icHJvcGVydHkiIFJFUVVJUkVEPSJ5ZXMiPgorCQkJPERFU0NSSVBUSU9OPlRoZSBuYW1lIG9mIHByb3BlcnR5IHRvIHNldCBpZiBleHRlbnNpb25zIGlzIGF2YWlsYWJsZTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZmlsZSIgUkVRVUlSRUQ9Im5vLCBvbmUgb2YgZmlsZSwgbmVzdGVkCisgICAgIGV4dGVuc2lvbnNldCBvciBuZXN0ZWQgZmlsZXNldCBtdXN0IGJlIHByZXNlbnQuIj4KKwkJCTxERVNDUklQVElPTj5UaGUgZmlsZSB0byBjaGVjayBmb3IgZXh0ZW5zaW88L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKwk8L1RBU0s+CisJPFRBU0sgTkFNRT0iamFybGliLWRpc3BsYXkiPgorCQk8REVTQ1JJUFRJT04+Jmx0O3AmZ3Q7RGlzcGxheSB0aGUgJnF1b3Q7T3B0aW9uYWwgUGFja2FnZSZxdW90OyBhbmQgJnF1b3Q7UGFja2FnZSBTcGVjaWZpY2F0aW9uJnF1b3Q7IGluZm9ybWF0aW9uCitjb250YWluZWQgd2l0aGluIHRoZSBzcGVjaWZpZWQgamFycy4mbHQ7L3AmZ3Q7CismbHQ7cCZndDtOb3RlIHRoYXQgdGhpcyB0YXNrCit3b3JrcyB3aXRoIGV4dGVuc2lvbnMgYXMgZGVmaW5lZCBieSB0aGUgJnF1b3Q7T3B0aW9uYWwgUGFja2FnZSZxdW90OyBzcGVjaWZpY2F0aW9uLgorRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgb3B0aW9uYWwgcGFja2FnZXMsIHNlZSB0aGUgZG9jdW1lbnQKKyZsdDtlbSZndDtPcHRpb25hbCBQYWNrYWdlIFZlcnNpb25pbmcmbHQ7L2VtJmd0OyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBidW5kbGUgZm9yIHlvdXIKK0phdmEyIFN0YW5kYXJkIEVkaXRpb24gcGFja2FnZSwgaW4gZmlsZQorJmx0O2NvZGUmZ3Q7Z3VpZGUvZXh0ZW5zaW9ucy92ZXJzaW9uaW5nLmh0bWwmbHQ7L2NvZGUmZ3Q7IG9yIG9ubGluZSBhdAorJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS4zL2RvY3MvZ3VpZGUvZXh0ZW5zaW9ucy92ZXJzaW9uaW5nLmh0bWwmcXVvdDsmZ3Q7CitodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS4zL2RvY3MvZ3VpZGUvZXh0ZW5zaW9ucy92ZXJzaW9uaW5nLmh0bWwmbHQ7L2EmZ3Q7LiZsdDsvcCZndDsKKyZsdDtwJmd0O1NlZSB0aGUgRXh0ZW5zaW9uIGFuZCBFeHRlbnNpb25TZXQgZG9jdW1lbnRhdGlvbiBmb3IgZnVydGhlciBkZXRhaWxzJmx0Oy9wJmd0OworPC9ERVNDUklQVElPTj4KKwkJPEFUVFJJQlVURSBOQU1FPSJmaWxlIiBSRVFVSVJFRD0ibm8sIGJ1dCBvbmUgb2YgZmlsZSBvciBmaWxlc2V0IG11c3QgYmUKKyAgICAgcHJlc2VudC4iPgorCQkJPERFU0NSSVBUSU9OPlRoZSBmaWxlIHRvIGRpc3BsYXkgZXh0ZW5zaW9uIGluZm9ybWF0aW9uIGFib3V0PC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisJPC9UQVNLPgorCTxUQVNLIE5BTUU9ImphcmxpYi1tYW5pZmVzdCI+CisJCTxERVNDUklQVElPTj4mbHQ7cCZndDtUYXNrIHRvIGdlbmVyYXRlIGEgbWFuaWZlc3QgdGhhdCBkZWNsYXJlcyBhbGwgdGhlIGRlcGVuZGVuY2llcworaW4gbWFuaWZlc3QuIFRoZSBkZXBlbmRlbmNpZXMgYXJlIGRldGVybWluZWQgYnkgbG9va2luZyBpbiB0aGUKK3NwZWNpZmllZCBwYXRoIGFuZCBzZWFyY2hpbmcgZm9yIEV4dGVuc2lvbiAvICZxdW90O09wdGlvbmFsIFBhY2thZ2UmcXVvdDsKK3NwZWNpZmljYXRpb25zIGluIHRoZSBtYW5pZmVzdHMgb2YgdGhlIGphcnMuJmx0Oy9wJmd0OworJmx0O3AmZ3Q7Tm90ZSB0aGF0IHRoaXMgdGFzaword29ya3Mgd2l0aCBleHRlbnNpb25zIGFzIGRlZmluZWQgYnkgdGhlICZxdW90O09wdGlvbmFsIFBhY2thZ2UmcXVvdDsgc3BlY2lmaWNhdGlvbi4KK0ZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IG9wdGlvbmFsIHBhY2thZ2VzLCBzZWUgdGhlIGRvY3VtZW50CismbHQ7ZW0mZ3Q7T3B0aW9uYWwgUGFja2FnZSBWZXJzaW9uaW5nJmx0Oy9lbSZndDsgaW4gdGhlIGRvY3VtZW50YXRpb24gYnVuZGxlIGZvciB5b3VyCitKYXZhMiBTdGFuZGFyZCBFZGl0aW9uIHBhY2thZ2UsIGluIGZpbGUKKyZsdDtjb2RlJmd0O2d1aWRlL2V4dGVuc2lvbnMvdmVyc2lvbmluZy5odG1sJmx0Oy9jb2RlJmd0OyBvciBvbmxpbmUgYXQKKyZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuMy9kb2NzL2d1aWRlL2V4dGVuc2lvbnMvdmVyc2lvbmluZy5odG1sJnF1b3Q7Jmd0OworaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuMy9kb2NzL2d1aWRlL2V4dGVuc2lvbnMvdmVyc2lvbmluZy5odG1sJmx0Oy9hJmd0Oy4mbHQ7L3AmZ3Q7CismbHQ7cCZndDtTZWUgdGhlIEV4dGVuc2lvbiBhbmQgRXh0ZW5zaW9uU2V0IGRvY3VtZW50YXRpb24gZm9yIGZ1cnRoZXIgZGV0YWlscyZsdDsvcCZndDsKKzwvREVTQ1JJUFRJT04+CisJCTxBVFRSSUJVVEUgTkFNRT0iZGVzdGZpbGUiIFJFUVVJUkVEPSJ5ZXMuIj4KKwkJCTxERVNDUklQVElPTj5UaGUgZmlsZSB0byBnZW5lcmF0ZSBNYW5pZmVzdCBpbnQ8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKwk8L1RBU0s+CisJPFRBU0sgTkFNRT0iamFybGliLXJlc29sdmUiPgorCQk8REVTQ1JJUFRJT04+Jmx0O3AmZ3Q7VHJ5IHRvIGxvY2F0ZSBhIGphciB0byBzYXRpc2Z5IGFuIGV4dGVuc2lvbiBhbmQgcGxhY2UKK2xvY2F0aW9uIG9mIGphciBpbnRvIHByb3BlcnR5LiBUaGUgdGFzayBhbGxvd3MgeW91IHRvCithZGQgYSBudW1iZXIgb2YgcmVzb2x2ZXJzIHRoYXQgYXJlIGNhcGFibGUgb2YgbG9jYXRpbmcgYQorbGlicmFyeSBmb3IgYSBzcGVjaWZjIGV4dGVuc2lvbi4gRWFjaCByZXNvbHZlciB3aWxsIGJlIGF0dGVtcHRlZAoraW4gc3BlY2lmaWVkIG9yZGVyIHVudGlsIGxpYnJhcnkgaXMgZm91bmQgb3Igbm8gcmVzb2x2ZXJzIGFyZSBsZWZ0LgorSWYgbm8gcmVzb2x2ZXJzIGFyZSBsZWZ0IGFuZCBmYWlsT25FcnJvciBpcyB0cnVlIHRoZW4gYSBCdWlsZEV4Y2VwdGlvbgord2lsbCBiZSB0aHJvd24uJmx0Oy9wJmd0OworJmx0O3AmZ3Q7Tm90ZSB0aGF0IHRoaXMgdGFzaword29ya3Mgd2l0aCBleHRlbnNpb25zIGFzIGRlZmluZWQgYnkgdGhlICZxdW90O09wdGlvbmFsIFBhY2thZ2UmcXVvdDsgc3BlY2lmaWNhdGlvbi4KK0ZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IG9wdGlvbmFsIHBhY2thZ2VzLCBzZWUgdGhlIGRvY3VtZW50CismbHQ7ZW0mZ3Q7T3B0aW9uYWwgUGFja2FnZSBWZXJzaW9uaW5nJmx0Oy9lbSZndDsgaW4gdGhlIGRvY3VtZW50YXRpb24gYnVuZGxlIGZvciB5b3VyCitKYXZhMiBTdGFuZGFyZCBFZGl0aW9uIHBhY2thZ2UsIGluIGZpbGUKKyZsdDtjb2RlJmd0O2d1aWRlL2V4dGVuc2lvbnMvdmVyc2lvbmluZy5odG1sJmx0Oy9jb2RlJmd0OyBvciBvbmxpbmUgYXQKKyZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuMy9kb2NzL2d1aWRlL2V4dGVuc2lvbnMvdmVyc2lvbmluZy5odG1sJnF1b3Q7Jmd0OworaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuMy9kb2NzL2d1aWRlL2V4dGVuc2lvbnMvdmVyc2lvbmluZy5odG1sJmx0Oy9hJmd0Oy4mbHQ7L3AmZ3Q7CismbHQ7cCZndDtTZWUgdGhlIEV4dGVuc2lvbiBhbmQgRXh0ZW5zaW9uU2V0IGRvY3VtZW50YXRpb24gZm9yIGZ1cnRoZXIgZGV0YWlscyZsdDsvcCZndDsKKzwvREVTQ1JJUFRJT04+CisJCTxBVFRSSUJVVEUgTkFNRT0icHJvcGVydHkiIFJFUVVJUkVEPSJ5ZXMiPgorCQkJPERFU0NSSVBUSU9OPlRoZSBuYW1lIG9mIHByb3BlcnR5IHRvIHNldCB0byBsaWJyYXJ5IGxvY2F0aW9uPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJmYWlsb25lcnJvciIgUkVRVUlSRUQ9Im5vLCBkZWZhdWx0cyB0byB0cnVlLiI+CisJCQk8REVTQ1JJUFRJT04+VHJ1ZSBpZiBmYWlsdXJlIHRvIGxvY2F0ZSBsaWJyYXJ5IHNob3VsZCByZXN1bHQgaW4gYnVpbGQgZXhjZXB0aW9uPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJjaGVja2V4dGVuc2lvbiIgUkVRVUlSRUQ9Im5vLCBkZWZhdWx0cyB0byB0cnVlLiI+CisJCQk8REVTQ1JJUFRJT04+VHJ1ZSBpZiBsaWJyYXJ5cyByZXR1cm5lZCBieSBuZXN0ZWQgcmVzb2x2ZXJzIHNob3VsZCBiZSBjaGVja2VkIHRvIHNlZSBpZnRoZXkgc3VwcGx5IGV4dGVuc2lvbjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCTwvVEFTSz4KKwk8VEFTSyBOQU1FPSJqYXZhY2MiPgorCQk8REVTQ1JJUFRJT04+Jmx0O3AmZ3Q7CitJbnZva2VzIHRoZSAmbHQ7YSBIUkVGPSZxdW90O2h0dHA6Ly93d3cud2ViZ2Fpbi5jb20vcHJvZHVjdHMvamF2YV9jYy8mcXVvdDsgdGFyZ2V0PSZxdW90O190b3AmcXVvdDsmZ3Q7SmF2YUNDJmx0Oy9hJmd0OyBjb21waWxlciAKK2NvbXBpbGVyIG9uIGEgZ3JhbW1hciBmaWxlLgorJmx0Oy9wJmd0OworJmx0O3AmZ3Q7CitUbyB1c2UgdGhlIGphdmFjYyB0YXNrLCBzZXQgdGhlICZsdDtpJmd0O3RhcmdldCZsdDsvaSZndDsgYXR0cmlidXRlIHRvIHRoZSBuYW1lIG9mIHRoZSAKK2dyYW1tYXIgZmlsZSB0byBwcm9jZXNzLiAgWW91IGFsc28gbmVlZCB0byBzcGVjaWZ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyAKK3RoZSBKYXZhQ0MgaW5zdGFsbGF0aW9uIHVzaW5nIHRoZSAmbHQ7aSZndDtqYXZhY2Nob21lJmx0Oy9pJmd0OyBhdHRyaWJ1dGUsIHNvIHRoYXQgYW50IAorY2FuIGZpbmQgdGhlIEphdmFDQyBjbGFzc2VzLiAgT3B0aW9uYWxseSwgeW91IGNhbiBhbHNvIHNldCB0aGUgCismbHQ7aSZndDtvdXRwdXRkaXJlY3RvcnkmbHQ7L2kmZ3Q7IHRvIHdyaXRlIHRoZSBnZW5lcmF0ZWQgZmlsZSB0byBhIHNwZWNpZmljIGRpcmVjdG9yeS4KK090aGVyd2lzZSBqYXZhY2Mgd3JpdGVzIHRoZSBnZW5lcmF0ZWQgZmlsZXMgdG8gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nCit0aGUgZ3JhbW1hciBmaWxlLgorJmx0Oy9wJmd0OworJmx0O3AmZ3Q7CitUaGlzIHRhc2sgb25seSBpbnZva2VzIEphdmFDQyBpZiB0aGUgZ3JhbW1hciBmaWxlIGlzIG5ld2VyIHRoYW4gdGhlIGdlbmVyYXRlZCAKK0phdmEgZmlsZXMuICBqYXZhY2MgYXNzdW1lcyB0aGF0IHRoZSBKYXZhIGNsYXNzIG5hbWUgb2YgdGhlIGdlbmVyYXRlZCBwYXJzZXIKK2lzIHRoZSBzYW1lIGFzIHRoZSBuYW1lIG9mIHRoZSBncmFtbWFyIGZpbGUsIGlnbm9yaW5nIHRoZSAuamouCitJZiB0aGlzIGlzIG5vdCB0aGUgY2FzZSwgdGhlIGphdmFjYyB0YXNrIHdpbGwgc3RpbGwgd29yaywgYnV0IGl0IHdpbGwgYWx3YXlzIAorZ2VuZXJhdGUgdGhlIG91dHB1dCBmaWxlcy4KKyZsdDsvcCZndDsKKzwvREVTQ1JJUFRJT04+CisJCTxBVFRSSUJVVEUgTkFNRT0idGFyZ2V0IiBSRVFVSVJFRD0ieWVzIj4KKwkJCTxERVNDUklQVElPTj5UaGUgZ3JhbW1hciBmaWxlIHRvIHByb2Nlc3M8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImphdmFjY2hvbWUiIFJFUVVJUkVEPSJ5ZXMiPgorCQkJPERFU0NSSVBUSU9OPlRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgSmF2YUNDIGRpc3RyaWJ1dGlvbjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0ib3V0cHV0ZGlyZWN0b3J5IiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPlRoZSBkaXJlY3RvcnkgdG8gd3JpdGUgdGhlIGdlbmVyYXRlZCBmaWxlcyB0by4gIElmIG5vdCBzZXQsIHRoZSBmaWxlc2FyZSB3cml0dGVuIHRvIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgZ3JhbW1hciBmaWxlLjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iYnVpbGRwYXJzZXIiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+U2V0cyB0aGUgQlVJTERfUEFSU0VSIGdyYW1tYXIgb3B0aW9uLiAgVGhpcyBpcyBhIGJvb2xlYW4gb3B0aW9uPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJidWlsZHRva2VubWFuYWdlciIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5TZXRzIHRoZSBCVUlMRF9UT0tFTl9NQU5BR0VSIGdyYW1tYXIgb3B0aW9uLiAgVGhpcyBpcyBhIGJvb2xlYW4gb3B0aW9uPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJjYWNoZXRva2VucyIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5TZXRzIHRoZSBDQUNIRV9UT0tFTlMgZ3JhbW1hciBvcHRpb24uICBUaGlzIGlzIGEgYm9vbGVhbiBvcHRpb248L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImNob2ljZWFtYmlndWl0eWNoZWNrIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPlNldHMgdGhlIENIT0lDRV9BTUJJR1VJVFlfQ0hFQ0sgZ3JhbW1hciBvcHRpb24uICBUaGlzIGlzIGFuIGludGVnZXIgb3B0aW9uPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJjb21tb250b2tlbmFjdGlvbiIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5TZXRzIHRoZSBDT01NT05fVE9LRU5fQUNUSU9OIGdyYW1tYXIgb3B0aW9uLiAgVGhpcyBpcyBhIGJvb2xlYW4gb3B0aW9uPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJkZWJ1Z2xvb2thaGVhZCIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5TZXRzIHRoZSBERUJVR19MT09LQUhFQUQgZ3JhbW1hciBvcHRpb24uICBUaGlzIGlzIGEgYm9vbGVhbiBvcHRpb248L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImRlYnVncGFyc2VyIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPlNldHMgdGhlIERFQlVHX1BBUlNFUiBncmFtbWFyIG9wdGlvbi4gIFRoaXMgaXMgYSBib29sZWFuIG9wdGlvbjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZGVidWd0b2tlbm1hbmFnZXIiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+U2V0cyB0aGUgREVCVUdfVE9LRU5fTUFOQUdFUiBncmFtbWFyIG9wdGlvbi4gIFRoaXMgaXMgYSBib29sZWFuIG9wdGlvbjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZXJyb3JyZXBvcnRpbmciIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+U2V0cyB0aGUgRVJST1JfUkVQT1JUSU5HIGdyYW1tYXIgb3B0aW9uLiAgVGhpcyBpcyBhIGJvb2xlYW4gb3B0aW9uPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJmb3JjZWxhY2hlY2siIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+U2V0cyB0aGUgRk9SQ0VfTEFfQ0hFQ0sgZ3JhbW1hciBvcHRpb24uICBUaGlzIGlzIGEgYm9vbGVhbiBvcHRpb248L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9Imlnbm9yZWNhc2UiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+U2V0cyB0aGUgSUdOT1JFX0NBU0UgZ3JhbW1hciBvcHRpb24uICBUaGlzIGlzIGEgYm9vbGVhbiBvcHRpb248L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImphdmF1bmljb2RlZXNjYXBlIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPlNldHMgdGhlIEpBVkFfVU5JQ09ERV9FU0NBUEUgZ3JhbW1hciBvcHRpb24uICBUaGlzIGlzIGEgYm9vbGVhbiBvcHRpb248L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9Imxvb2thaGVhZCIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5TZXRzIHRoZSBMT09LQUhFQUQgZ3JhbW1hciBvcHRpb24uICBUaGlzIGlzIGFuIGludGVnZXIgb3B0aW9uPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJvcHRpbWl6ZXRva2VubWFuYWdlciIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5TZXRzIHRoZSBPUFRJTUlaRV9UT0tFTl9NQU5BR0VSIGdyYW1tYXIgb3B0aW9uLiAgVGhpcyBpcyBhIGJvb2xlYW4gb3B0aW9uPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJvdGhlcmFtYmlndWl0eWNoZWNrIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPlNldHMgdGhlIE9USEVSX0FNQklHVUlUWV9DSEVDSyBncmFtbWFyIG9wdGlvbi4gIFRoaXMgaXMgYW4gaW50ZWdlciBvcHRpb248L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9InNhbml0eWNoZWNrIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPlNldHMgdGhlIFNBTklUWV9DSEVDSyBncmFtbWFyIG9wdGlvbi4gIFRoaXMgaXMgYSBib29sZWFuIG9wdGlvbjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0ic3RhdGljIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPlNldHMgdGhlIFNUQVRJQyBncmFtbWFyIG9wdGlvbi4gIFRoaXMgaXMgYSBib29sZWFuIG9wdGlvbjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0idW5pY29kZWlucHV0IiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPlNldHMgdGhlIFVOSUNPREVfSU5QVVQgZ3JhbW1hciBvcHRpb24uICBUaGlzIGlzIGEgYm9vbGVhbiBvcHRpb248L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9InVzZXJjaGFyc3RyZWFtIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPlNldHMgdGhlIFVTRVJfQ0hBUl9TVFJFQU0gZ3JhbW1hciBvcHRpb24uICBUaGlzIGlzIGEgYm9vbGVhbiBvcHRpb248L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9InVzZXJ0b2tlbm1hbmFnZXIiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+U2V0cyB0aGUgVVNFUl9UT0tFTl9NQU5BR0VSIGdyYW1tYXIgb3B0aW9uLiAgVGhpcyBpcyBhIGJvb2xlYW4gb3B0aW9uPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisJPC9UQVNLPgorCTxUQVNLIE5BTUU9ImphdmFoIj4KKwkJPERFU0NSSVBUSU9OPiZsdDtwJmd0O0dlbmVyYXRlcyBKTkkgaGVhZGVycyBmcm9tIGEgSmF2YSBjbGFzcy4mbHQ7L3AmZ3Q7CismbHQ7cCZndDsgV2hlbiB0aGlzIHRhc2sgZXhlY3V0ZXMsIGl0IHdpbGwgZ2VuZXJhdGUgdGhlIEMgaGVhZGVyIGFuZCBzb3VyY2UgZmlsZXMgdGhhdAorYXJlIG5lZWRlZCB0byBpbXBsZW1lbnQgbmF0aXZlIG1ldGhvZHMuIEpOSSBvcGVyYXRlcyBkaWZmZXJlbnRseSBkZXBlbmRpbmcgb24KK3doZXRoZXIgJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS4zL2RvY3MvdG9vbGRvY3Mvd2luMzIvamF2YWguaHRtbCZxdW90OyZndDtKREsxLjImbHQ7L2EmZ3Q7Cisob3IgbGF0ZXIpIG9yICZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9qZGsvMS4xL2RvY3MvdG9vbGRvY3Mvd2luMzIvamF2YWguaHRtbCZxdW90OyZndDtwcmUtSkRLMS4yJmx0Oy9hJmd0Oworc3lzdGVtcyBhcmUgdXNlZC4mbHQ7L3AmZ3Q7Cis8L0RFU0NSSVBUSU9OPgorCQk8QVRUUklCVVRFIE5BTUU9ImNsYXNzIiBSRVFVSVJFRD0ieWVzIj4KKwkJCTxERVNDUklQVElPTj50aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGNsYXNzIChvciBjbGFzc2VzLHNlcGFyYXRlZCBieSBjb21tYXM8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9Im91dHB1dGZpbGUiIFJFUVVJUkVEPSJ5ZXMiPgorCQkJPERFU0NSSVBUSU9OPmNvbmNhdGVuYXRlcyB0aGUgcmVzdWx0aW5nIGhlYWRlciBvciBzb3VyY2UgZmlsZXMgZm9yIGFsbCB0aGUgY2xhc3NlcyBsaXN0ZWQgaW50byB0aGlzIGZpbDwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZGVzdGRpciIgUkVRVUlSRUQ9IiI+CisJCQk8REVTQ1JJUFRJT04+c2V0cyB0aGUgZGlyZWN0b3J5IHdoZXJlIGphdmFoIHNhdmVzIHRoZSBoZWFkZXIgZmlsZXMgb3IgdGhlc3R1YiBmaWxlczwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZm9yY2UiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+c3BlY2lmaWVzIHRoYXQgb3V0cHV0IGZpbGVzIHNob3VsZCBhbHdheXMgYmUgd3JpdHRlbiAoSkRLMS4yIG9ubHk8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9Im9sZCIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5zcGVjaWZpZXMgdGhhdCBvbGQgSkRLMS4wLXN0eWxlIGhlYWRlciBmaWxlcyBzaG91bGQgYmUgZ2VuZXJhdGVkKG90aGVyd2lzZSBvdXRwdXQgZmlsZSBjb250YWluIEpOSS1zdHlsZSBuYXRpdmUgbWV0aG9kICAgICAgZnVuY3Rpb24gcHJvdG90eXBlcykgKEpESzEuMiBvbmx5PC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJzdHVicyIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5nZW5lcmF0ZSBDIGRlY2xhcmF0aW9ucyBmcm9tIHRoZSBKYXZhIG9iamVjdCBmaWxlICh1c2VkIHdpdGggb2xkPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJ2ZXJib3NlIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPmNhdXNlcyBKYXZhaCB0byBwcmludCBhIG1lc3NhZ2UgY29uY2VybmluZyB0aGUgc3RhdHVzICAgICBvZiB0aGUgZ2VuZXJhdGVkIGZpbGU8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImNsYXNzcGF0aCIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj50aGUgY2xhc3NwYXRoIHRvIHVzZTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iYm9vdGNsYXNzcGF0aCIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5sb2NhdGlvbiBvZiBib290c3RyYXAgY2xhc3MgZmlsZXM8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImV4dGRpcnMiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+bG9jYXRpb24gb2YgaW5zdGFsbGVkIGV4dGVuc2lvbnM8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKwk8L1RBU0s+CisJPFRBU0sgTkFNRT0iamRlcGVuZCI+CisJCTxERVNDUklQVElPTj4mbHQ7UCZndDtJbnZva2VzIHRoZSAmbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuY2xhcmt3YXJlLmNvbS9zb2Z0d2FyZS9KRGVwZW5kLmh0bWwmcXVvdDsmZ3Q7SkRlcGVuZCZsdDsvYSZndDsgcGFyc2VyLiZsdDsvUCZndDsKKyZsdDtQJmd0O1RoaXMgcGFyc2VyICZhbXA7cXVvdDt0cmF2ZXJzZXMgYSBzZXQgb2YgSmF2YSBzb3VyY2UgZmlsZSBkaXJlY3RvcmllcyBhbmQgZ2VuZXJhdGVzIGRlc2lnbiBxdWFsaXR5IG1ldHJpY3MgZm9yIGVhY2ggSmF2YSBwYWNrYWdlJmFtcDtxdW90Oy4KK0l0IGFsbG93cyB0byAmYW1wO3F1b3Q7YXV0b21hdGljYWxseSBtZWFzdXJlIHRoZSBxdWFsaXR5IG9mIGEgZGVzaWduIGluIHRlcm1zIG9mIGl0cyBleHRlbnNpYmlsaXR5LCByZXVzYWJpbGl0eSwgYW5kIG1haW50YWluYWJpbGl0eSB0bworZWZmZWN0aXZlbHkgbWFuYWdlIGFuZCBjb250cm9sIHBhY2thZ2UgZGVwZW5kZW5jaWVzLiZhbXA7cXVvdDsmbHQ7L1AmZ3Q7CismbHQ7cCZndDtTb3VyY2UgZmlsZSBkaXJlY3RvcmllcyBhcmUgZGVmaW5lZCBieSBuZXN0ZWQgJmx0O2NvZGUmZ3Q7JmFtcDtsdDtzb3VyY2VzcGF0aCZhbXA7Z3Q7Jmx0Oy9jb2RlJmd0Oywgc2VlICZsdDthIGhyZWY9JnF1b3Q7I25lc3RlZCZxdW90OyZndDtuZXN0ZWQgZWxlbWVudHMmbHQ7L2EmZ3Q7LiZsdDsvcCZndDsKKyZsdDtwJmd0O09wdGlvbmFsbHksIHlvdSBjYW4gYWxzbyBzZXQgdGhlICZsdDtjb2RlJmd0O291dHB1dGZpbGUmbHQ7L2NvZGUmZ3Q7IG5hbWUgd2hlcmUgdGhlIG91dHB1dCBpcyBzdG9yZWQuIEJ5IGRlZmF1bHQgdGhlIHRhc2sgd3JpdGVzIGl0cyByZXBvcnQgdG8gdGhlIHN0YW5kYXJkIG91dHB1dC4mbHQ7L1AmZ3Q7CismbHQ7cCZndDsgVGhlIHRhc2sgcmVxdWlyZXMgYXQgbGVhc3QgdGhlIEpEZXBlbmQgMS4yIHZlcnNpb24uICZsdDsvcCZndDsKKyZsdDtQJmd0O05vdGU6IHdoZXJlYXMgdGhlIEpEZXBlbmQgdG9vbCBjYW4gYmUgY3VzdG9taXplZCB0byBleGNsdWRlIHNvbWUgcGFja2FnZXMsIHRoZSBjdXJyZW50IGpkZXBlbmQgQW5kIFRhc2sgZG9lcyBub3QgaGF2ZSBwYXJhbWV0ZXJzIHRvIGFsbG93IHRoZXNlIGV4Y2x1c2lvbnMuIFJlYWQgSkRlcGVuZCBzcGVjaWZpYyBkb2N1bWVudGF0aW9uIGZvciB0aGF0IHB1cnBvc2UuJmx0Oy9QJmd0OworPC9ERVNDUklQVElPTj4KKwkJPEFUVFJJQlVURSBOQU1FPSJvdXRwdXRmaWxlIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPlRoZSBvdXRwdXQgZmlsZSBuYW1lLiBJZiBub3Qgc2V0LCB0aGUgb3V0cHV0IGlzIHByaW50ZWQgb24gdGhlIHN0YW5kYXJkIG91dHB1dDwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZm9ybWF0IiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPlRoZSBmb3JtYXQgdG8gd3JpdGUgdGhlIG91dHB1dCBpbi4gVGhlIGRlZmF1bHQgaXMgJnF1b3Q7dGV4dCZxdW90OywgdGhlIGFsdGVybmF0aXZlIGlzICZxdW90O3htbDwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZm9yayIgUkVRVUlSRUQ9Im5vLCBkZWZhdWx0IGlzICZxdW90O29mZiZxdW90OyI+CisJCQk8REVTQ1JJUFRJT04+UnVuIHRoZSB0ZXN0cyBpbiBhIHNlcGFyYXRlIFZNPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJoYWx0b25lcnJvciIgUkVRVUlSRUQ9Im5vLCBkZWZhdWx0IGlzICZxdW90O29mZiZxdW90OyI+CisJCQk8REVTQ1JJUFRJT04+U3RvcCB0aGUgYnVpbGQgcHJvY2VzcyBpZiBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIHRoZSBqZGVwZW5kIGFuYWx5c2lzPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJ0aW1lb3V0IiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPkNhbmNlbCB0aGUgb3BlcmF0aW9uIGlmIGl0IGRvZXNuJ3QgZmluaXNoIGluIHRoZSBnaXZlbiB0aW1lIChtZWFzdXJlZCBpbiBtaWxsaXNlY29uZHMpLiAoSWdub3JlZCBpZiBmb3JrIGlzIGRpc2FibGVkLjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0ianZtIiBSRVFVSVJFRD0ibm8sIGRlZmF1bHQgJnF1b3Q7amF2YSZxdW90OyI+CisJCQk8REVTQ1JJUFRJT04+VGhlIGNvbW1hbmQgdXNlZCB0byBpbnZva2UgdGhlIEphdmEgVmlydHVhbCBNYWNoaW5lLCBkZWZhdWx0IGlzICdqYXZhJy4gVGhlIGNvbW1hbmQgaXMgcmVzb2x2ZWQgYnkgamF2YS5sYW5nLlJ1bnRpbWUuZXhlYygpLiAoSWdub3JlZCBpZiBmb3JrIGlzIGRpc2FibGVkLjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZGlyIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPlRoZSBkaXJlY3RvcnkgdG8gaW52b2tlIHRoZSBWTSBpbi4gKElnbm9yZWQgaWYgZm9yayBpcyBkaXNhYmxlZDwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iY2xhc3NwYXRocmVmIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPnRoZSBjbGFzc3BhdGggdG8gdXNlLCBnaXZlbiBhcyByZWZlcmVuY2UgdG8gYSBQQVRIIGRlZmluZWQgZWxzZXdoZXJlPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisJPC9UQVNLPgorCTxUQVNLIE5BTUU9ImpqdHJlZSI+CisJCTxERVNDUklQVElPTj5JbnZva2VzIHRoZSAmbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cud2ViZ2Fpbi5jb20vcHJvZHVjdHMvamF2YV9jYy8mcXVvdDsmZ3Q7SkpUcmVlJmx0Oy9hJmd0OyBwcmVwcm9jZXNzb3IKK2ZvciB0aGUgSmF2YUNDIGNvbXBpbGVyIGNvbXBpbGVyLiBJdCBpbnNlcnRzIHBhcnNlIHRyZWUgYnVpbGRpbmcgYWN0aW9ucworYXQgdmFyaW91cyBwbGFjZXMgaW4gdGhlIEphdmFDQyBzb3VyY2UgdGhhdCBpdCBnZW5lcmF0ZXMuIFRoZSBvdXRwdXQgb2YKK0pKVHJlZSBpcyBydW4gdGhyb3VnaCBKYXZhQ0MgdG8gY3JlYXRlIHRoZSBwYXJzZXIuCismbHQ7cCZndDtUbyB1c2UgdGhlIGpqdHJlZSB0YXNrLCBzZXQgdGhlICZsdDtpJmd0O3RhcmdldCZsdDsvaSZndDsgYXR0cmlidXRlIHRvIHRoZSBuYW1lCitvZiB0aGUgamp0cmVlIGdyYW1tYXIgZmlsZSB0byBwcm9jZXNzLiBZb3UgYWxzbyBuZWVkIHRvIHNwZWNpZnkgdGhlIGRpcmVjdG9yeQorY29udGFpbmluZyB0aGUgSmF2YUNDIGluc3RhbGxhdGlvbiB1c2luZyB0aGUgJmx0O2kmZ3Q7amF2YWNjaG9tZSZsdDsvaSZndDsgYXR0cmlidXRlLAorc28gdGhhdCBhbnQgY2FuIGZpbmQgdGhlIEphdmFDQyBjbGFzc2VzLiBPcHRpb25hbGx5LCB5b3UgY2FuIGFsc28gc2V0IHRoZQorJmx0O2kmZ3Q7b3V0cHV0ZGlyZWN0b3J5Jmx0Oy9pJmd0OwordG8gd3JpdGUgdGhlIGdlbmVyYXRlZCBmaWxlIHRvIGEgc3BlY2lmaWMgZGlyZWN0b3J5LiBPdGhlcndpc2Ugamp0cmVlIHdyaXRlcwordGhlIGdlbmVyYXRlZCBKYXZhQ0MgZ3JhbW1hciBmaWxlIHRvIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgSkpUcmVlCitncmFtbWFyIGZpbGUuJmx0Oy9wJmd0OworJmx0O3AmZ3Q7VGhpcyB0YXNrIG9ubHkgaW52b2tlcyBKSlRyZWUgaWYgdGhlIGdyYW1tYXIgZmlsZSBpcyBuZXdlciB0aGFuIHRoZQorZ2VuZXJhdGVkIEphdmFDQyBmaWxlLiZsdDsvcCZndDsKKzwvREVTQ1JJUFRJT04+CisJCTxBVFRSSUJVVEUgTkFNRT0idGFyZ2V0IiBSRVFVSVJFRD0ieWVzIj4KKwkJCTxERVNDUklQVElPTj5UaGUgamp0cmVlIGdyYW1tYXIgZmlsZSB0byBwcm9jZXNzPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJqYXZhY2Nob21lIiBSRVFVSVJFRD0ieWVzIj4KKwkJCTxERVNDUklQVElPTj5UaGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIEphdmFDQyBkaXN0cmlidXRpb248L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9Im91dHB1dGRpcmVjdG9yeSIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5UaGUgZGlyZWN0b3J5IHRvIHdyaXRlIHRoZSBnZW5lcmF0ZWQgZmlsZSB0by4gSWYgbm90IHNldCx0aGUgZmlsZXMgYXJlIHdyaXR0ZW4gdG8gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBncmFtbWFyIGZpbGUuPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJidWlsZG5vZGVmaWxlcyIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5TZXRzIHRoZSBCVUlMRF9OT0RFX0ZJTEVTIGdyYW1tYXIgb3B0aW9uLiBUaGlzIGlzIGEgYm9vbGVhbm9wdGlvbjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0ibXVsdGkiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+U2V0cyB0aGUgTVVMVEkgZ3JhbW1hciBvcHRpb24uIFRoaXMgaXMgYSBib29sZWFuIG9wdGlvbjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0ibm9kZWRlZmF1bHR2b2lkIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPlNldHMgdGhlIE5PREVfREVGQVVMVF9WT0lEIGdyYW1tYXIgb3B0aW9uLiBUaGlzIGlzIGEgYm9vbGVhbm9wdGlvbjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0ibm9kZWZhY3RvcnkiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+U2V0cyB0aGUgTk9ERV9GQUNUT1JZIGdyYW1tYXIgb3B0aW9uLiBUaGlzIGlzIGJvb2xlYW4gb3B0aW9uPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJub2Rlc2NvcGVob29rIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPlNldHMgdGhlIE5PREVfU0NPUEVfSE9PSyBncmFtbWFyIG9wdGlvbi4gVGhpcyBpcyBhIGJvb2xlYW5vcHRpb248L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9Im5vZGV1c2VzcGFyc2VyIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPlNldHMgdGhlIE5PREVfVVNFU19QQVJTRVIgZ3JhbW1hciBvcHRpb24uIFRoaXMgaXMgYSBib29sZWFub3B0aW9uPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJzdGF0aWMiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+U2V0cyB0aGUgU1RBVElDIGdyYW1tYXIgb3B0aW9uLiBUaGlzIGlzIGEgYm9vbGVhbiBvcHRpb248L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9InZpc2l0b3IiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+U2V0cyB0aGUgVklTSVRPUiBncmFtbWFyIG9wdGlvbi4gVGhpcyBpcyBhIGJvb2xlYW4gb3B0aW9uPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJub2RlcGFja2FnZSIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5TZXRzIHRoZSBOT0RFX1BBQ0tBR0UgZ3JhbW1hciBvcHRpb24uIFRoaXMgaXMgYSBzdHJpbmcgb3B0aW9uPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJ2aXNpdG9yZXhjZXB0aW9uIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPlNldHMgdGhlIFZJU0lUT1JfRVhDRVBUSU9OIGdyYW1tYXIgb3B0aW9uLiBUaGlzIGlzIGEgc3RyaW5nb3B0aW9uPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJub2RlcHJlZml4IiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPlNldHMgdGhlIE5PREVfUFJFRklYIGdyYW1tYXIgb3B0aW9uLiBUaGlzIGlzIGEgc3RyaW5nIG9wdGlvbjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCTwvVEFTSz4KKwk8VEFTSyBOQU1FPSJqbGluayI+CisJCTxERVNDUklQVElPTj4mbHQ7cCZndDtMaW5rcyBlbnRyaWVzIGZyb20gc3ViLWJ1aWxkcyBhbmQgbGlicmFyaWVzLiZsdDsvcCZndDsKKyZsdDtwJmd0O1RoZSBqbGluayB0YXNrIGNhbiBiZSB1c2VkIHRvIGJ1aWxkIGphciBhbmQgemlwIGZpbGVzLCBzaW1pbGFyIHRvIAordGhlICZsdDtpJmd0O2phciZsdDsvaSZndDsgdGFzay4KK0hvd2V2ZXIsIGpsaW5rIHByb3ZpZGVzIG9wdGlvbnMgZm9yIGNvbnRyb2xsaW5nIHRoZSB3YXkgZW50cmllcyBmcm9tIAoraW5wdXQgZmlsZXMKK2FyZSBhZGRlZCB0byB0aGUgb3V0cHV0IGZpbGUuIFNwZWNpZmljYWxseSwgY2FwYWJpbGl0aWVzIGZvciBtZXJnaW5nIAorZW50cmllcyBmcm9tCittdWx0aXBsZSB6aXAgb3IgamFyIGZpbGVzIGlzIGF2YWlsYWJsZS4mbHQ7L3AmZ3Q7CismbHQ7cCZndDtJZiBhIG1lcmdlZmlsZSBpcyBzcGVjaWZpZWQgZGlyZWN0bHkgKGVnLiBhdCB0aGUgdG9wIGxldmVsIG9mIGEgCismbHQ7aSZndDttZXJnZWZpbGVzJmx0Oy9pJmd0OworcGF0aGVsZW1lbnQpICZsdDtpJmd0O2FuZCZsdDsvaSZndDsgdGhlIG1lcmdlZmlsZSBlbmRzIGluICZhbXA7cXVvdDsuemlwJmFtcDtxdW90OyBvciAKKyZhbXA7cXVvdDsuamFyJmFtcDtxdW90OywKK2VudHJpZXMgaW4gdGhlIG1lcmdlZmlsZSB3aWxsIGJlIG1lcmdlZCBpbnRvIHRoZSBvdXRmaWxlLiBBIGZpbGUgd2l0aCAKK2FueSBvdGhlciBleHRlbnNpb24KK3dpbGwgYmUgYWRkZWQgdG8gdGhlIG91dHB1dCBmaWxlLCBldmVuIGlmIGl0IGlzIHNwZWNpZmllZCBpbiB0aGUgCittZXJnZWZpbGVzIGVsZW1lbnQuCitEaXJlY3RvcmllcyBzcGVjaWZpZWQgaW4gZWl0aGVyIHRoZSBtZXJnZWZpbGVzIG9yIGFkZGZpbGVzIGVsZW1lbnQgCithcmUgYWRkZWQgdG8gdGhlCitvdXRwdXQgZmlsZSBhcyB5b3Ugd291bGQgZXhwZWN0OiBhbGwgZmlsZXMgaW4gc3ViZGlyZWN0b3JpZXMgYXJlIAorcmVjdXJzaXZlbHkgYWRkZWQgdG8KK3RoZSBvdXRwdXQgZmlsZSB3aXRoIGFwcHJvcHJpYXRlIHByZWZpeGVzIGluIHRoZSBvdXRwdXQgZmlsZSAKKyh3aXRob3V0IG1lcmdpbmcpLgorJmx0Oy9wJmd0OworJmx0O3AmZ3Q7CitJbiB0aGUgY2FzZSB3aGVyZSBkdXBsaWNhdGUgZW50cmllcyBhbmQvb3IgZmlsZXMgYXJlIGZvdW5kIGFtb25nIHRoZSAKK2ZpbGVzIHRvIGJlIG1lcmdlZCBvcgorYWRkZWQsIGpsaW5rIG1lcmdlcyBvciBhZGRzIHRoZSBmaXJzdCBlbnRyeSBhbmQgaWdub3JlcyBhbGwgc3Vic2VxdWVudCBlbnRyaWVzLgorJmx0Oy9wJmd0OworJmx0O3AmZ3Q7CitqbGluayBpZ25vcmVzIE1FVEEtSU5GIGRpcmVjdG9yaWVzIGluIG1lcmdlZmlsZXMuIFVzZXJzIHNob3VsZCBzdXBwbHkgdGhlaXIKK293biBtYW5pZmVzdCBpbmZvcm1hdGlvbiBmb3IgdGhlIG91dHB1dCBmaWxlLgorJmx0Oy9wJmd0OworJmx0O3AmZ3Q7SXQgaXMgcG9zc2libGUgdG8gcmVmaW5lIHRoZSBzZXQgb2YgZmlsZXMgdGhhdCBhcmUgYmVpbmcgamxpbmtlZC4gCitUaGlzIGNhbiBiZQorZG9uZSB3aXRoIHRoZSAmbHQ7aSZndDtpbmNsdWRlcyZsdDsvaSZndDssICZsdDtpJmd0O2luY2x1ZGVzZmlsZSZsdDsvaSZndDssICZsdDtpJmd0O2V4Y2x1ZGVzJmx0Oy9pJmd0OywgCismbHQ7aSZndDtleGNsdWRlc2ZpbGUmbHQ7L2kmZ3Q7LAorYW5kICZsdDtpJmd0O2RlZmF1bHRleGNsdWRlcyZsdDsvaSZndDsgYXR0cmlidXRlcyBvbiB0aGUgJmx0O2kmZ3Q7YWRkZmlsZXMmbHQ7L2kmZ3Q7IGFuZCAKKyZsdDtpJmd0O21lcmdlZmlsZXMmbHQ7L2kmZ3Q7CituZXN0ZWQgZWxlbWVudHMuIFdpdGggdGhlICZsdDtpJmd0O2luY2x1ZGVzJmx0Oy9pJmd0OyBvciAmbHQ7aSZndDtpbmNsdWRlc2ZpbGUmbHQ7L2kmZ3Q7CithdHRyaWJ1dGUgeW91IHNwZWNpZnkgdGhlIGZpbGVzIHlvdSB3YW50IHRvIGhhdmUgaW5jbHVkZWQgYnkgdXNpbmcgcGF0dGVybnMuCitUaGUgJmx0O2kmZ3Q7ZXhjbHVkZSZsdDsvaSZndDsgb3IgJmx0O2kmZ3Q7ZXhjbHVkZXNmaWxlJmx0Oy9pJmd0OyBhdHRyaWJ1dGUgaXMgdXNlZCB0byBzcGVjaWZ5Cit0aGUgZmlsZXMgeW91IHdhbnQgdG8gaGF2ZSBleGNsdWRlZC4gVGhpcyBpcyBhbHNvIGRvbmUgd2l0aCBwYXR0ZXJucy4gQW5kCitmaW5hbGx5IHdpdGggdGhlICZsdDtpJmd0O2RlZmF1bHRleGNsdWRlcyZsdDsvaSZndDsgYXR0cmlidXRlLCB5b3UgY2FuIHNwZWNpZnkgd2hldGhlciB5b3UKK3dhbnQgdG8gdXNlIGRlZmF1bHQgZXhjbHVzaW9ucyBvciBub3QuIFNlZSB0aGUgc2VjdGlvbiBvbiAmbHQ7YQoraHJlZj0mcXVvdDsuLi9kaXJ0YXNrcy5odG1sI2RpcmVjdG9yeWJhc2VkdGFza3MmcXVvdDsmZ3Q7ZGlyZWN0b3J5IGJhc2VkIHRhc2tzJmx0Oy9hJmd0Oywgb24gaG93IHRoZQoraW5jbHVzaW9uL2V4Y2x1c2lvbiBvZiBmaWxlcyB3b3JrcywgYW5kIGhvdyB0byB3cml0ZSBwYXR0ZXJucy4gVGhlIHBhdHRlcm5zIGFyZQorcmVsYXRpdmUgdG8gdGhlICZsdDtpJmd0O2Jhc2UmbHQ7L2kmZ3Q7IGRpcmVjdG9yeS4mbHQ7L3AmZ3Q7Cis8L0RFU0NSSVBUSU9OPgorCQk8QVRUUklCVVRFIE5BTUU9Im91dGZpbGUiIFJFUVVJUkVEPSJ5ZXMiPgorCQkJPERFU0NSSVBUSU9OPnRoZSBwYXRoIG9mIHRoZSBvdXRwdXQgZmlsZTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iY29tcHJlc3MiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+d2hldGhlciBvciBub3QgdGhlIG91dHB1dCBzaG91bGQgYmUgY29tcHJlc3NlZC4gdHJ1ZSx5ZXMsIG9yIG9uIHJlc3VsdCBpbiBjb21wcmVzc2VkIG91dHB1dC5JZiBvbWl0dGVkLCBvdXRwdXQgd2lsbCBiZSB1bmNvbXByZXNzZWQgKGluZmxhdGVkKTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0ibWVyZ2VmaWxlcyIgUkVRVUlSRUQ9ImF0IGxlYXN0IG9uZSBvZiAKKyBtZXJnZWZpbGVzIG9yIGFkZGZpbGVzIj4KKwkJCTxERVNDUklQVElPTj5maWxlcyB0byBiZSBtZXJnZWQgaW50byB0aGUgb3V0cHV0LCBpZiBwb3NzaWJsZTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iYWRkZmlsZXMiIFJFUVVJUkVEPSIiPgorCQkJPERFU0NSSVBUSU9OPmZpbGVzIHRvIGJlIGFkZGVkIHRvIHRoZSBvdXRwdXQ8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKwk8L1RBU0s+CisJPFRBU0sgTkFNRT0ianNwYyI+CisJCTxERVNDUklQVElPTj4mbHQ7cCZndDsgQW50IHRhc2sgdG8gcnVuIHRoZSBKU1AgY29tcGlsZXIgYW5kIHR1cm4gSlNQIHBhZ2VzIGludG8gSmF2YSBzb3VyY2UuCismbHQ7cCZndDsKK0l0IGNhbiBiZSB1c2VkIHRvIHByZWNvbXBpbGUgSlNQIHBhZ2VzIGZvciBmYXN0IGluaXRpYWwgaW52b2NhdGlvbgorb2YgSlNQIHBhZ2VzLCBkZXBsb3ltZW50IG9uIGEgc2VydmVyIHdpdGhvdXQgdGhlIGZ1bGwgSkRLIGluc3RhbGxlZCwKK29yIHNpbXBseSB0byBzeW50YXggY2hlY2sgdGhlIHBhZ2VzIHdpdGhvdXQgZGVwbG95aW5nIHRoZW0uCitJbiBtb3N0IGNhc2VzLCBhIGphdmFjIHRhc2sgaXMgdXN1YWxseSB0aGUgbmV4dCBzdGFnZSBpbiB0aGUgYnVpbGQgcHJvY2Vzcy4KK1RoZSB0YXNrIGRvZXMgYmFzaWMgZGVwZW5kZW5jeSBjaGVja2luZyB0byBwcmV2ZW50IHVubmVjZXNzYXJ5IHJlY29tcGlsYXRpb24gLXRoaXMKK2NoZWNraW5nIGNvbXBhcmVzIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gdGltZXN0YW1wcywgYW5kIGRvZXMgbm90IGZhY3RvcgoraW4gY2xhc3Mgb3IgdGFnbGliIGRlcGVuZGVuY2llcywgb3IgJmFtcDtsdDtqc3A6aW5jbHVkZSZhbXA7Z3Q7IHJlZmVyZW5jZXMuCismbHQ7cCZndDsKK0J5IGRlZmF1bHQgdGhlIHRhc2sgdXNlcyB0aGUgSmFzcGVyIEpTUCBjb21waWxlci4gVGhpcworbWVhbnMgdGhlIHRhc2sgbmVlZHMgamFzcGVyLmphciBhbmQgamFzcGVyLXJ1bnRpbWUuamFyLCB3aGljaCBjb21lIHdpdGgKK2J1aWxkcyBvZiBUb21jYXQgNC9DYXRhbGluYSBmcm9tIHRoZQorJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3RvbWNhdC8mcXVvdDsmZ3Q7SmFrYXJ0YSBUb21jYXQgcHJvamVjdCZsdDsvYSZndDsKKzwvREVTQ1JJUFRJT04+CisJCTxBVFRSSUJVVEUgTkFNRT0iZGVzdGRpciIgUkVRVUlSRUQ9InllcyI+CisJCQk8REVTQ1JJUFRJT04+V2hlcmUgdG8gcGxhY2UgdGhlIGdlbmVyYXRlZCBmaWxlcy4gVGhleSBhcmUgbG9jYXRlZHVuZGVyIGhlcmUgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBwYWNrYWdlIG5hbWU8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9InNyY2RpciIgUkVRVUlSRUQ9InllcyI+CisJCQk8REVTQ1JJUFRJT04+V2hlcmUgdG8gbG9vayBmb3Igc291cmNlIGpzcCBmaWxlczwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0idmVyYm9zZSIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5UaGUgdmVyYm9zaXR5IGludGVnZXIgdG8gcGFzcyB0byB0aGUgY29tcGlsZXIuIERlZmF1bHQ9JnF1b3Q7MDwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0icGFja2FnZSIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5OYW1lIG9mIHRoZSBkZXN0aW5hdGlvbiBwYWNrYWdlIGZvciBnZW5lcmF0ZWQgamF2YWNsYXNzZXM8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImNvbXBpbGVyIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPmNsYXNzIG5hbWUgb2YgYSBKU1AgY29tcGlsZXIgYWRhcHRlPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJpZXBsdWdpbiIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5KYXZhIFBsdWdpbiBjbGFzc2lkIGZvciBJbnRlcm5ldCBFeHBsb3JlcjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0ibWFwcGVkIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPihib29sZWFuKSBHZW5lcmF0ZSBzZXBhcmF0ZSB3cml0ZSgpIGNhbGxzIGZvciBlYWNoIEhUTUxsaW5lIGluIHRoZSBKU1A8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImNsYXNzcGF0aCIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5UaGUgY2xhc3NwYXRoIHRvIHVzZSB0byBydW4gdGhlIGpzcCBjb21waWxlci5UaGlzIGNhbiBhbHNvIGJlIHNwZWNpZmllZGJ5IHRoZSBuZXN0ZWQgZWxlbWVudCBjbGFzc3BhdGhQYXRoKTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iY2xhc3NwYXRocmVmIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPkEgUmVmZXJlbmNlLiBBc3BlciBjbGFzc3BhdDwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZmFpbG9uZXJyb3IiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+ZmxhZyB0byBjb250cm9sIGFjdGlvbiBvbiBjb21waWxlIGZhaWx1cmVzOiBkZWZhdWx0PXllPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJ1cmliYXNlIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPlRoZSB1cmkgY29udGV4dCBvZiByZWxhdGl2ZSBVUklyZWZlcmVuY2VzIGluIHRoZSBKU1AgcGFnZXMuIElmIGl0IGRvZXMgbm90ZXhpc3QgdGhlbiBpdCBpcyBkZXJpdmVkIGZyb20gdGhlIGxvY2F0aW9uIG9mIHRoZSBmaWxlcmVsYXRpdmUgdG8gdGhlIGRlY2xhcmVkIG9yIGRlcml2ZWQgdmFsdWUgb2YgdXJpcm9vdC48L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9InVyaXJvb3QiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+VGhlIHJvb3QgZGlyZWN0b3J5IHRoYXQgdXJpIGZpbGVzIHNob3VsZCBiZSByZXNvbHZlZGFnYWluc3QuPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJjb21waWxlciIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5DbGFzcyBuYW1lIG9mIGpzcCBjb21waWxlciBhZGFwdGVyIHRvIHVzZS4gIERlZmF1bHRzIHRvdGhlIHN0YW5kYXJkIGFkYXB0ZXIgZm9yIEphc3Blci48L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImNvbXBpbGVyY2xhc3NwYXRoIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPlRoZSBjbGFzc3BhdGggdXNlZCB0byBmaW5kIHRoZSBjb21waWxlciBhZGFwdGVyIHNwZWNpZmllZGJ5IHRoZSBjb21waWxlciBhdHRyaWJ1dGU8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKwk8L1RBU0s+CisJPFRBU0sgTkFNRT0ianVuaXQiPgorCQk8REVTQ1JJUFRJT04+Jmx0O3AmZ3Q7VGhpcyB0YXNrIHJ1bnMgdGVzdHMgZnJvbSB0aGUgSlVuaXQgdGVzdGluZyBmcmFtZXdvcmsuIFRoZSBsYXRlc3QKK3ZlcnNpb24gb2YgdGhlIGZyYW1ld29yayBjYW4gYmUgZm91bmQgYXQKKyZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5qdW5pdC5vcmcmcXVvdDsmZ3Q7aHR0cDovL3d3dy5qdW5pdC5vcmcmbHQ7L2EmZ3Q7LgorVGhpcyB0YXNrIGhhcyBiZWVuIHRlc3RlZCB3aXRoIEpVbml0IDMuMCB1cCB0byBKVW5pdCAzLjguMTsgaXQgd29uJ3QKK3dvcmsgd2l0aCB2ZXJzaW9ucyBwcmlvciB0byBKVW5pdCAzLjAuJmx0Oy9wJmd0OworJmx0O3AmZ3Q7Jmx0O3N0cm9uZyZndDtOb3RlOiZsdDsvc3Ryb25nJmd0OyBUaGlzIHRhc2sgZGVwZW5kcyBvbiBleHRlcm5hbCBsaWJyYXJpZXMgbm90IGluY2x1ZGVkCitpbiB0aGUgQW50IGRpc3RyaWJ1dGlvbi4gIFNlZSAmbHQ7YSBocmVmPSZxdW90Oy4uL2luc3RhbGwuaHRtbCNsaWJyYXJ5ZGVwZW5kZW5jaWVzJnF1b3Q7Jmd0OworTGlicmFyeSBEZXBlbmRlbmNpZXMmbHQ7L2EmZ3Q7IGZvciBtb3JlIGluZm9ybWF0aW9uLgorJmx0Oy9wJmd0OworJmx0O3AmZ3Q7CismbHQ7c3Ryb25nJmd0O05vdGUmbHQ7L3N0cm9uZyZndDs6CitZb3UgbXVzdCBoYXZlICZsdDtjb2RlJmd0O2p1bml0LmphciZsdDsvY29kZSZndDsgYW5kIHRoZSBjbGFzcyBmaWxlcyBmb3IgdGhlCismbHQ7Y29kZSZndDsmYW1wO2x0O2p1bml0JmFtcDtndDsmbHQ7L2NvZGUmZ3Q7IHRhc2sgaW4gdGhlIHNhbWUgY2xhc3NwYXRoLgorWW91IGNhbiBkbyBvbmUgb2Y6CismbHQ7b2wmZ3Q7CismbHQ7bGkmZ3Q7CitQdXQgYm90aCAmbHQ7Y29kZSZndDtqdW5pdC5qYXImbHQ7L2NvZGUmZ3Q7IGFuZCB0aGUgb3B0aW9uYWwgdGFza3MgamFyIGZpbGUgaW4KKyZsdDtjb2RlJmd0O0FOVF9IT01FL2xpYiZsdDsvY29kZSZndDsuCismbHQ7L2xpJmd0OworJmx0O2xpJmd0OworRG8gbm90IHB1dCBlaXRoZXIgaW4gJmx0O2NvZGUmZ3Q7QU5UX0hPTUUvbGliJmx0Oy9jb2RlJmd0OywgYW5kIGluc3RlYWQKK2luY2x1ZGUgdGhlaXIgbG9jYXRpb25zIGluIHlvdXIgJmx0O2NvZGUmZ3Q7Q0xBU1NQQVRIJmx0Oy9jb2RlJmd0OyBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKyZsdDsvbGkmZ3Q7CismbHQ7bGkmZ3Q7CitEbyBuZWl0aGVyIG9mIHRoZSBhYm92ZSwgYW5kIGluc3RlYWQsIHNwZWNpZnkgdGhlaXIgbG9jYXRpb25zIHVzaW5nCithICZsdDtjb2RlJmd0OyZhbXA7bHQ7Y2xhc3NwYXRoJmFtcDtndDsmbHQ7L2NvZGUmZ3Q7IGVsZW1lbnQgaW4gdGhlIGJ1aWxkZmlsZS4KK1NlZSAmbHQ7YSBocmVmPSZxdW90Oy4uLy4uL2ZhcS5odG1sI2RlbGVnYXRpbmctY2xhc3Nsb2FkZXImcXVvdDsgdGFyZ2V0PSZxdW90O190b3AmcXVvdDsmZ3Q7dGhlCitGQVEmbHQ7L2EmZ3Q7IGZvciBkZXRhaWxzLgorJmx0Oy9vbCZndDsKKyZsdDsvcCZndDsKKyZsdDtwJmd0O1Rlc3RzIGFyZSBkZWZpbmVkIGJ5IG5lc3RlZCAmbHQ7Y29kZSZndDt0ZXN0Jmx0Oy9jb2RlJmd0OyBvcgorJmx0O2NvZGUmZ3Q7YmF0Y2h0ZXN0Jmx0Oy9jb2RlJmd0OyB0YWdzIChzZWUgJmx0O2EgaHJlZj0mcXVvdDsjbmVzdGVkJnF1b3Q7Jmd0O25lc3RlZAorZWxlbWVudHMmbHQ7L2EmZ3Q7KS4mbHQ7L3AmZ3Q7Cis8L0RFU0NSSVBUSU9OPgorCQk8QVRUUklCVVRFIE5BTUU9InByaW50c3VtbWFyeSIgUkVRVUlSRUQ9Im5vOyBkZWZhdWx0IGlzIG9mZi4iPgorCQkJPERFU0NSSVBUSU9OPlByaW50IG9uZS1saW5lIHN0YXRpc3RpY3MgZm9yIGVhY2ggdGVzdGNhc2UuIENhbnRha2UgdGhlIHZhbHVlcyBvbixvZmYsIGFuZHdpdGhPdXRBbmRFcnIud2l0aE91dEFuZEVyciBpcyB0aGUgc2FtZWFzIG9uIGJ1dCBhbHNvIGluY2x1ZGVzIHRoZSBvdXRwdXQgb2YgdGhlIHRlc3RhcyB3cml0dGVuIHRvIFN5c3RlbS5vdXQgYW5kIFN5c3RlbS5lcnI8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImZvcmsiIFJFUVVJUkVEPSJubzsgZGVmYXVsdCBpcyBvZmYuIj4KKwkJCTxERVNDUklQVElPTj5SdW4gdGhlIHRlc3RzIGluIGEgc2VwYXJhdGUgVk08L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImhhbHRvbmVycm9yIiBSRVFVSVJFRD0ibm87IGRlZmF1bHQgaXMgb2ZmLiI+CisJCQk8REVTQ1JJUFRJT04+U3RvcCB0aGUgYnVpbGQgcHJvY2VzcyBpZiBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIHRoZSB0ZXN0cnVuPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJlcnJvcnByb3BlcnR5IiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPlRoZSBuYW1lIG9mIGEgcHJvcGVydHkgdG8gc2V0IGluIHRoZSBldmVudCBvZiBhbiBlcnJvcjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iaGFsdG9uZmFpbHVyZSIgUkVRVUlSRUQ9Im5vOyBkZWZhdWx0IGlzIG9mZi4iPgorCQkJPERFU0NSSVBUSU9OPlN0b3AgdGhlIGJ1aWxkIHByb2Nlc3MgaWYgYSB0ZXN0IGZhaWxzIChlcnJvcnMgYXJlY29uc2lkZXJlZCBmYWlsdXJlcyBhcyB3ZWxsKTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZmFpbHVyZXByb3BlcnR5IiBSRVFVSVJFRD0ibm8uIj4KKwkJCTxERVNDUklQVElPTj5UaGUgbmFtZSBvZiBhIHByb3BlcnR5IHRvIHNldCBpbiB0aGUgZXZlbnQgb2YgYSBmYWlsdXJlKGVycm9ycyBhcmUgY29uc2lkZXJlZCBmYWlsdXJlcyBhcyB3ZWxsKTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZmlsdGVydHJhY2UiIFJFUVVJUkVEPSJubzsgZGVmYXVsdCBpcyBvbi4iPgorCQkJPERFU0NSSVBUSU9OPkZpbHRlciBvdXQgSnVuaXQgYW5kIEFudCBzdGFjayBmcmFtZXMgZnJvbSBlcnJvciBhbmQgZmFpbHVyZSBzdGFjayB0cmFjZXM8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9InRpbWVvdXQiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+Q2FuY2VsIHRoZSBpbmRpdmlkdWFsIHRlc3RzIGlmIHRoZXkgZG9uJ3QgZmluaXNoaW4gdGhlIGdpdmVuIHRpbWUgKG1lYXN1cmVkIGluIG1pbGxpc2Vjb25kcykuICBJZ25vcmVkIGlmZm9yayBpcyBkaXNhYmxlZDwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0ibWF4bWVtb3J5IiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPk1heGltdW0gYW1vdW50IG9mIG1lbW9yeSB0byBhbGxvY2F0ZSB0byB0aGUgZm9ya2VkIFZNLklnbm9yZWQgaWYgZm9yayBpcyBkaXNhYmxlZDwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0ianZtIiBSRVFVSVJFRD0ibm87IGRlZmF1bHQgaXMgamF2YS4iPgorCQkJPERFU0NSSVBUSU9OPlRoZSBjb21tYW5kIHVzZWQgdG8gaW52b2tlIHRoZSBKYXZhIFZpcnR1YWwgTWFjaGluZSxkZWZhdWx0IGlzICdqYXZhJy4gIFRoZSBjb21tYW5kIGlzIHJlc29sdmVkIGJ5amF2YS5sYW5nLlJ1bnRpbWUuZXhlYygpLklnbm9yZWQgaWYgZm9yayBpcyBkaXNhYmxlZDwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZGlyIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPlRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggdG8gaW52b2tlIHRoZSBWTS4gSWdub3JlZCBpZmZvcmsgaXMgZGlzYWJsZWQ8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9Im5ld2Vudmlyb25tZW50IiBSRVFVSVJFRD0ibm87IGRlZmF1bHQgaXMgZmFsc2UuIj4KKwkJCTxERVNDUklQVElPTj5EbyBub3QgcHJvcGFnYXRlIHRoZSBvbGQgZW52aXJvbm1lbnQgd2hlbiBuZXdlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIHNwZWNpZmllZC4gSWdub3JlZCBpZiBmb3JrIGlzZGlzYWJsZWQ8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImluY2x1ZGVhbnRydW50aW1lIiBSRVFVSVJFRD0ibm87IGRlZmF1bHQgaXMgdHJ1ZS4iPgorCQkJPERFU0NSSVBUSU9OPkltcGxpY2l0bHkgYWRkIHRoZSBBbnQgY2xhc3NlcyByZXF1aXJlZCB0byBydW50aGUgdGVzdHMgYW5kIEpVbml0IHRvIHRoZSBjbGFzc3BhdGggaW4gZm9ya2VkIG1vZGU8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9InNob3dvdXRwdXQiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+U2VuZCBhbnkgb3V0cHV0IGdlbmVyYXRlZCBieSB0ZXN0cyB0byBBbnQnc2xvZ2dpbmcgc3lzdGVtIGFzIHdlbGwgYXMgdG8gdGhlIGZvcm1hdHRlcnMuICBCeSBkZWZhdWx0IG9ubHkgdGhlZm9ybWF0dGVycyByZWNlaXZlIHRoZSBvdXRwdXQ8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKwk8L1RBU0s+CisJPFRBU0sgTkFNRT0ibWF1ZGl0Ij4KKwkJPERFU0NSSVBUSU9OPiZsdDtwJmd0OworSW52b2tlcyB0aGUgTWV0YW1hdGEgQXVkaXQvIFdlYmdhaW4gUXVhbGl0eSBBbmFseXplciBvbiBhIHNldCBvZiBKYXZhIGZpbGVzLgorJmx0Oy9wJmd0OworJmx0O3AmZ3Q7CismbHQ7aSZndDttYXVkaXQmbHQ7L2kmZ3Q7IHBlcmZvcm1zIHN0YXRpYyBhbmFseXNpcyBvZiB0aGUgSmF2YSBzb3VyY2UgY29kZSBhbmQgYnl0ZSBjb2RlIGZpbGVzIHRvIGZpbmQgYW5kIHJlcG9ydAorZXJyb3JzIG9mIHN0eWxlIGFuZCBwb3RlbnRpYWwgcHJvYmxlbXMgcmVsYXRlZCB0byBwZXJmb3JtYW5jZSwgbWFpbnRlbmFuY2UgYW5kIHJvYnVzdG5lc3MuCisuICBBcyBhIGNvbnZlbmllbmNlLCBhIHN0eWxlc2hlZXQgaXMgZ2l2ZW4gaW4gJmx0O3R0Jmd0O2V0YyZsdDsvdHQmZ3Q7IGRpcmVjdG9yeSwgc28gdGhhdCBhbiBIVE1MIHJlcG9ydCBjYW4gYmUgZ2VuZXJhdGVkIGZyb20gdGhlIFhNTCBmaWxlLgorJmx0Oy9wJmd0OworPC9ERVNDUklQVElPTj4KKwkJPEFUVFJJQlVURSBOQU1FPSJ0b2ZpbGUiIFJFUVVJUkVEPSJ5ZXMiPgorCQkJPERFU0NSSVBUSU9OPlRoZSBYTUwgZmlsZSB0byB3aGljaCB0aGUgQXVkaXQgcmVzdWx0IHNob3VsZCBiZSB3cml0dGVuIHRvPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJtZXRhbWF0YWhvbWUiIFJFUVVJUkVEPSJ5ZXMiPgorCQkJPERFU0NSSVBUSU9OPlRoZSBob21lIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBNZXRhbWF0YSBkaXN0cmlidXRpb248L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImZpeCIgUkVRVUlSRUQ9Im5vLmRlZmF1bHQgdG8gZmFsc2UuIj4KKwkJCTxERVNDUklQVElPTj5BdXRvbWF0aWNhbGx5IGZpeCBjZXJ0YWluIGVycm9ycyAodGhvc2UgbWFya2VkIGFzIGZpeGFibGUgaW4gdGhlIG1hbnVhbCkuPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJsaXN0IiBSRVFVSVJFRD0ibm8uIGRlZmF1bHQgdG8gZmFsc2UuIj4KKwkJCTxERVNDUklQVElPTj5DcmVhdGVzIGxpc3RpbmcgZmlsZSBmb3IgZWFjaCBhdWRpdGVkIGZpbGUuIEEgLm1hdWRpdCBmaWxlIHdpbGwgYmUgZ2VuZXJhdGVkIGluIHRoZXNhbWUgbG9jYXRpb24gYXMgdGhlIHNvdXJjZSBmaWxlLjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0idW51c2VkIiBSRVFVSVJFRD0ibm8uIGRlZmF1bHQgdG8gZmFsc2UuIj4KKwkJCTxERVNDUklQVElPTj5GaW5kcyBkZWNsYXJhdGlvbnMgdW51c2VkIGluIHNlYXJjaCBwYXRocy4gSXQgd2lsbCBsb29rIGZvciB1bnVzZWQgZ2xvYmFsIGRlY2xhcmF0aW9uc2luIHRoZSBzb3VyY2UgY29kZSB3aXRoaW4gYSB1c2UgZG9tYWluIHNwZWNpZmllZCBieSB0aGUgc2VhcmNocGF0aCBlbGVtZW50LjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0ibWF4bWVtb3J5IiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPlNldCB0aGUgbWF4aW11bSBtZW1vcnkgZm9yIHRoZSBKVk0uIHRoaXMgaXMgYSBjb252ZW5pZW50d2F5IHRvIHNldCB0aGUgLW14IG9yIC1YbXggYXJndW1lbnQ8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKwk8L1RBU0s+CisJPFRBU0sgTkFNRT0ibWltZW1haWwiPgorCQk8REVTQ1JJUFRJT04+Jmx0O3AmZ3Q7U2VuZHMgU01UUCBtYWlsIHdpdGggTUlNRSBhdHRhY2htZW50cy4KKyZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9qYXZhbWFpbC9pbmRleC5odG1sJnF1b3Q7Jmd0O0phdmFNYWlsJmx0Oy9hJmd0OworYW5kICZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9qYXZhYmVhbnMvZ2xhc2dvdy9qYWYuaHRtbCZxdW90OyZndDtKYXZhCitBY3RpdmF0aW9uIEZyYW1ld29yayZsdDsvYSZndDsgYXJlIHJlcXVpcmVkIGZvciB0aGlzIHRhc2suJmx0Oy9wJmd0OworJmx0O3AmZ3Q7TXVsdGlwbGUgZmlsZXMgY2FuIGJlIGF0dGFjaGVkIHVzaW5nICZsdDthIGhyZWY9JnF1b3Q7Li4vQ29yZVR5cGVzL2ZpbGVzZXQuaHRtbCZxdW90OyZndDtGaWxlU2V0cy4mbHQ7L2EmZ3Q7Jmx0Oy9wJmd0OworPC9ERVNDUklQVElPTj4KKwkJPEFUVFJJQlVURSBOQU1FPSJtZXNzYWdlIiBSRVFVSVJFRD0ibm8sIGJ1dCBvbmx5IG9uZSBvZiBvZiAnbWVzc2FnZScgb3IKKyAgICAgICAnbWVzc2FnZWZpbGUnIG1heSBiZSBzcGVjaWZpZWQuIGlmIG5vdCBzcGVjaWZpZWQsIGEgZmlsZXNldCBtdXN0IGJlCisgICAgICAgcHJvdmlkZWQuIj4KKwkJCTxERVNDUklQVElPTj5UaGUgbWVzc2FnZSBib2Q8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9Im1lc3NhZ2VmaWxlIiBSRVFVSVJFRD0iIj4KKwkJCTxERVNDUklQVElPTj5BIGZpbGVuYW1lIHRvIHJlYWQgYW5kIHVzZWQgYXMgdGhlIG1lc3NhZ2UgYm9kPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJtZXNzYWdlbWltZXR5cGUiIFJFUVVJUkVEPSJubywgZGVmYXVsdHMgdG8gJnF1b3Q7dGV4dC9wbGFpbiZxdW90OyI+CisJCQk8REVTQ1JJUFRJT04+TUlNRSB0eXBlIHRvIHVzZSBmb3IgJ21lc3NhZ2UnIG9yICdtZXNzYWdlRmlsZScgd2hlbmF0dGFjaGVkPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJ0b2xpc3QiIFJFUVVJUkVEPSJ5ZXMsIGF0IGxlYXN0IG9uZSBvZiAndG9saXN0JywgJ2NjbGlzdCcsCisgICAgICAgb3IgJ2JjY2xpc3QnIG11c3QgYmUgc3BlY2lmaWVkLiI+CisJCQk8REVTQ1JJUFRJT04+Q29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgVG86IHJlY2lwaWVudDwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iY2NsaXN0IiBSRVFVSVJFRD0iIj4KKwkJCTxERVNDUklQVElPTj5Db21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBDQzogcmVjaXBpZW50PC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJiY2NsaXN0IiBSRVFVSVJFRD0iIj4KKwkJCTxERVNDUklQVElPTj5Db21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBCQ0M6IHJlY2lwaWVudDwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0ibWFpbGhvc3QiIFJFUVVJUkVEPSJubywgZGVmYXVsdCB0byAmcXVvdDtsb2NhbGhvc3QmcXVvdDsiPgorCQkJPERFU0NSSVBUSU9OPkhvc3QgbmFtZSBvZiB0aGUgbWFpbCBzZXJ2ZXI8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9InN1YmplY3QiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+RW1haWwgc3ViamVjdCBsaW5lPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJmcm9tIiBSRVFVSVJFRD0ieWVzIj4KKwkJCTxERVNDUklQVElPTj5FbWFpbCBhZGRyZXNzIG9mIHNlbmRlcjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZmFpbG9uZXJyb3IiIFJFUVVJUkVEPSJubywgZGVmYXVsdCB0byAmcXVvdDt0cnVlJnF1b3Q7Ij4KKwkJCTxERVNDUklQVElPTj5TdG9wIHRoZSBidWlsZCBwcm9jZXNzIGlmIGFuIGVycm9yIG9jY3VycyBzZW5kaW5nIHRoZWUtbWFpbDwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCTwvVEFTSz4KKwk8VEFTSyBOQU1FPSJtbWV0cmljcyI+CisJCTxERVNDUklQVElPTj4mbHQ7cCZndDsKK0ludm9rZXMgdGhlIE1ldGFtYXRhIE1ldHJpY3MgLyBXZWJHYWluIFF1YWxpdHkgQW5hbHl6ZXIgc291cmNlIGNvZGUgCithbmFseXplciBvbiBhIHNldCBvZiBKYXZhIGZpbGVzLgorJmx0Oy9wJmd0OworJmx0O3AmZ3Q7CismbHQ7aSZndDttbWV0cmljcyZsdDsvaSZndDsgd2lsbCBjb21wdXRlIHRoZSBtZXRyaWNzIG9mIGEgc2V0IG9mIEphdmEgZmlsZXMgYW5kIHdyaXRlIHRoZSByZXN1bHRzIHRvIGFuIFhNTAorZmlsZS4gQXMgYSBjb252ZW5pZW5jZSwgYSBzdHlsZXNoZWV0IGlzIGdpdmVuIGluICZsdDt0dCZndDtldGMmbHQ7L3R0Jmd0OyBkaXJlY3RvcnksIHNvIHRoYXQgYW4gSFRNTCByZXBvcnQgY2FuIGJlIGdlbmVyYXRlZCBmcm9tIHRoZSBYTUwgZmlsZS4KKyZsdDsvcCZndDsKKzwvREVTQ1JJUFRJT04+CisJCTxBVFRSSUJVVEUgTkFNRT0ibWV0YW1hdGFob21lIiBSRVFVSVJFRD0ieWVzIj4KKwkJCTxERVNDUklQVElPTj5UaGUgaG9tZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgTWV0YW1hdGEgZGlzdHJpYnV0aW9uPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJ0b2ZpbGUiIFJFUVVJUkVEPSJ5ZXMiPgorCQkJPERFU0NSSVBUSU9OPlRoZSBYTUwgd2VyZSB0aGUgcmVzdWx0aW5nIG1ldHJpY3Mgd2lsbCBiZSB3cml0dGVuIHRvPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJncmFudWxhcml0eSIgUkVRVUlSRUQ9InllcyI+CisJCQk8REVTQ1JJUFRJT04+TWV0cmljcyBncmFudWxhcml0eSBvZiB0aGUgc291cmNlIGZpbGVzLiBNdXN0IGJlIGVpdGhlcmZpbGVzIChjb21waWxhdGlvbi11bml0cyksIHR5cGVzICh0eXBlcyBhbmQgY29tcGlsYXRpb24tdW5pdHMpIG9yIG1ldGhvZHMobWV0aG9kcywgdHlwZXMgYW5kIGNvbXBpbGF0aW9uLXVuaXRzKS48L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9Im1heG1lbW9yeSIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5TZXQgdGhlIG1heGltdW0gbWVtb3J5IGZvciB0aGUgSlZNLiB0aGlzIGlzIGEgY29udmVuaWVudHdheSB0byBzZXQgdGhlIC1teCBvciAtWG14IGFyZ3VtZW50PC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisJPC9UQVNLPgorCTxUQVNLIE5BTUU9Im1wYXJzZSI+CisJCTxERVNDUklQVElPTj4mbHQ7cCZndDsKK0ludm9rZXMgdGhlIE1ldGFtYXRhICZsdDthIEhSRUY9JnF1b3Q7aHR0cDovL3d3dy5tZXRhbWF0YS5jb20vcGFyc2UuaHRtbCZxdW90OyZndDtNUGFyc2UmbHQ7L2EmZ3Q7IGNvbXBpbGVyIAorY29tcGlsZXIgb24gYSBncmFtbWFyIGZpbGUuCismbHQ7L3AmZ3Q7CismbHQ7cCZndDsKK1RvIHVzZSB0aGUgJmx0O2kmZ3Q7bXBhcnNlJmx0Oy9pJmd0OyB0YXNrLCBzZXQgdGhlICZsdDtpJmd0O3RhcmdldCZsdDsvaSZndDsgYXR0cmlidXRlIHRvIHRoZSBuYW1lIG9mIHRoZSAKK2dyYW1tYXIgZmlsZSB0byBwcm9jZXNzLiAgWW91IGFsc28gbmVlZCB0byBzcGVjaWZ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyAKK3RoZSBNZXRhbWF0YSBpbnN0YWxsYXRpb24gdXNpbmcgdGhlICZsdDtpJmd0O21ldGFtYXRhaG9tZSZsdDsvaSZndDsgYXR0cmlidXRlLCBzbyB0aGF0IEFudCAKK2NhbiBmaW5kIHRoZSBNUGFyc2UgY2xhc3Nlcy4KKyZsdDsvcCZndDsKKyZsdDtwJmd0OworVGhpcyB0YXNrIG9ubHkgaW52b2tlcyBNUGFyc2UgaWYgdGhlIGdyYW1tYXIgZmlsZSBpcyBuZXdlciB0aGFuIHRoZSBnZW5lcmF0ZWQgCitKYXZhIGZpbGVzLiBNUGFyc2UgYXNzdW1lcyB0aGF0IHRoZSBKYXZhIGNsYXNzIG5hbWUgb2YgdGhlIGdlbmVyYXRlZCBwYXJzZXIKK2lzIHRoZSBzYW1lIGFzIHRoZSBuYW1lIG9mIHRoZSBncmFtbWFyIGZpbGUsIGxlc3MgdGhlIC5qaiBleHRlbnNpb24uCismbHQ7L3AmZ3Q7CismbHQ7cCZndDtGb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBNUGFyc2UsIHBsZWFzZSBjb25zdWx0IHRoZSBvbmxpbmUgbWFudWFsIGF2YWlsYWJsZSAmbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly9kb3dubG9hZC5tZXRhbWF0YS5jb20vcGFyc2UucGRmJnF1b3Q7Jmd0O2hlcmUmbHQ7L2EmZ3Q7CisoUERGKQorJmx0Oy9wJmd0OworPC9ERVNDUklQVElPTj4KKwkJPEFUVFJJQlVURSBOQU1FPSJ0YXJnZXQiIFJFUVVJUkVEPSJ5ZXMiPgorCQkJPERFU0NSSVBUSU9OPlRoZSAuamogZ3JhbW1hciBmaWxlIHRvIHByb2Nlc3MuIEl0IHdpbGwgb25seSBiZSBwcm9jZXNzZWRpZiB0aGUgZ3JhbW1hciBpcyBuZXdlciB0aGFuIHRoZSBjb3JyZXNwb25kaW5nIC5qYXZhIGZpbGU8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9Im1ldGFtYXRhaG9tZSIgUkVRVUlSRUQ9InllcyI+CisJCQk8REVTQ1JJUFRJT04+VGhlIGhvbWUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIE1ldGFtYXRhIGRpc3RyaWJ1dGlvbjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0idmVyYm9zZSIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5FbmFibGUgYWxsIG1lc3NhZ2VzPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJkZWJ1Z3BhcnNlciIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5FbmFibGVzIHBhcnNlciBkZWJ1Z2dpbmc8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImRlYnVnc2Nhbm5lciIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5FbmFibGVzIHNjYW5uZXIgZGVidWdnaW5nPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJjbGVhbnVwIiBSRVFVSVJFRD0ibm8uIGRlZmF1bHQgdG8gZmFsc2UiPgorCQkJPERFU0NSSVBUSU9OPlJlbW92ZSB0aGUgaW50ZXJtZWRpYXRlIFN1bkphdmFDQyBmaWxlIGNyZWF0ZWQgZHVyaW5nIHRoZSB0cmFuc2Zvcm1hdGlvbiBvZiB0aGUgZ3JhbW1hciBmaWxlPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJtYXhtZW1vcnkiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+U2V0IHRoZSBtYXhpbXVtIG1lbW9yeSBmb3IgdGhlIEpWTS4gdGhpcyBpcyBhIGNvbnZlbmllbnR3YXkgdG8gc2V0IHRoZSAtbXggb3IgLVhteCBhcmd1bWVudDwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCTwvVEFTSz4KKwk8VEFTSyBOQU1FPSJuYXRpdmUyYXNjaWkiPgorCQk8REVTQ1JJUFRJT04+Jmx0O3AmZ3Q7CitDb252ZXJ0cyBmaWxlcyBmcm9tIG5hdGl2ZSBlbmNvZGluZ3MgdG8gQVNDSUkgd2l0aCBlc2NhcGVkIFVuaWNvZGUuCitBIGNvbW1vbiB1c2FnZSBpcyB0byBjb252ZXJ0IHNvdXJjZSBmaWxlcyBtYWludGFpbmVkIGluIGEgbmF0aXZlCitvcGVyYXRpbmcgc3lzdGVtIGVuY29kaW5nLCB0byBBU0NJSSBwcmlvciB0byBjb21waWxhdGlvbi4KKyZsdDsvcCZndDsKKyZsdDtwJmd0OworRmlsZXMgaW4gdGhlIGRpcmVjdG9yeSAmbHQ7ZW0mZ3Q7c3JjJmx0Oy9lbSZndDsKK2FyZSBjb252ZXJ0ZWQgZnJvbSBhIG5hdGl2ZSBlbmNvZGluZyB0byBBU0NJSS4KK0J5IGRlZmF1bHQsIGFsbCBmaWxlcyBpbiB0aGUgZGlyZWN0b3J5IGFyZSBjb252ZXJ0ZWQuCitIb3dldmVyLCBjb252ZXJzaW9uIG1heSBiZSBsaW1pdGVkIHRvIHNlbGVjdGVkIGZpbGVzIHVzaW5nCismbHQ7ZW0mZ3Q7aW5jbHVkZXMmbHQ7L2VtJmd0OyBhbmQgJmx0O2VtJmd0O2V4Y2x1ZGVzJmx0Oy9lbSZndDsgYXR0cmlidXRlcy4KK0ZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGZpbGUgbWF0Y2hpbmcgcGF0dGVybnMsCitzZWUgdGhlIHNlY3Rpb24gb24KKyZsdDthIGhyZWY9JnF1b3Q7Li4vZGlydGFza3MuaHRtbCNkaXJlY3RvcnliYXNlZHRhc2tzJnF1b3Q7Jmd0O2RpcmVjdG9yeSBiYXNlZCB0YXNrcyZsdDsvYSZndDsuCitJZiBubyAmbHQ7ZW0mZ3Q7ZW5jb2RpbmcmbHQ7L2VtJmd0OyBpcyBzcGVjaWZpZWQsCit0aGUgZGVmYXVsdCBlbmNvZGluZyBmb3IgdGhlIEpWTSBpcyB1c2VkLgorSWYgJmx0O2VtJmd0O2V4dCZsdDsvZW0mZ3Q7IGlzIHNwZWNpZmllZCwgdGhlbiBvdXRwdXQgZmlsZXMgYXJlIHJlbmFtZWQKK3RvIHVzZSBpdCBhcyBhIG5ldyBleHRlbnNpb24uCitNb3JlIHNvcGhpc3RpY2F0ZWQgZmlsZSBuYW1lIHRyYW5zbGF0aW9ucyBjYW4gYmUgYWNoaWV2ZWQgdXNpbmcgYSBuZXN0ZWQKKyZsdDtlbSZndDsmYW1wO2x0O21hcHBlciZhbXA7Z3Q7Jmx0Oy9lbSZndDsgZWxlbWVudC4gQnkgZGVmYXVsdCBhbgorJmx0O2EgaHJlZj0mcXVvdDsuLi9Db3JlVHlwZXMvbWFwcGVyLmh0bWwjaWRlbnRpdHktbWFwcGVyJnF1b3Q7Jmd0O2lkZW50aXR5IG1hcHBlciZsdDsvYSZndDsgd2lsbCBiZSB1c2VkLgorSWYgJmx0O2VtJmd0O2Rlc3QmbHQ7L2VtJmd0OyBhbmQgJmx0O2VtJmd0O3NyYyZsdDsvZW0mZ3Q7IHBvaW50IHRvIHRoZSBzYW1lIGRpcmVjdG9yeSwKK3RoZSAmbHQ7ZW0mZ3Q7ZXh0Jmx0Oy9lbSZndDsgYXR0cmlidXRlIG9yIGEgbmVzdGVkICZsdDtlbSZndDsmYW1wO2x0O21hcHBlciZhbXA7Z3Q7Jmx0Oy9lbSZndDsKK2lzIHJlcXVpcmVkLgorJmx0Oy9wJmd0OworJmx0O3AmZ3Q7CitUaGlzIHRhc2sgZm9ybXMgYW4gaW1wbGljaXQgJmx0O2EgaHJlZj0mcXVvdDsuLi9Db3JlVHlwZXMvZmlsZXNldC5odG1sJnF1b3Q7Jmd0O0ZpbGUgU2V0Jmx0Oy9hJmd0OywKK2FuZCBzdXBwb3J0cyBhbGwgYXR0cmlidXRlcyBvZiAmbHQ7Y29kZSZndDsmYW1wO2x0O2ZpbGVzZXQmYW1wO2d0OyZsdDsvY29kZSZndDsKKygmbHQ7Y29kZSZndDtkaXImbHQ7L2NvZGUmZ3Q7IGJlY29tZXMgJmx0O2NvZGUmZ3Q7c3JjJmx0Oy9jb2RlJmd0OykgYXMgd2VsbCBhcworbmVzdGVkICZsdDtjb2RlJmd0OyZhbXA7bHQ7aW5jbHVkZSZhbXA7Z3Q7Jmx0Oy9jb2RlJmd0OywgJmx0O2NvZGUmZ3Q7JmFtcDtsdDtleGNsdWRlJmFtcDtndDsmbHQ7L2NvZGUmZ3Q7LAorYW5kICZsdDtjb2RlJmd0OyZhbXA7bHQ7cGF0dGVybnNldCZhbXA7Z3Q7Jmx0Oy9jb2RlJmd0OyBlbGVtZW50cy4KKyZsdDsvcCZndDsKKzwvREVTQ1JJUFRJT04+CisJCTxBVFRSSUJVVEUgTkFNRT0icmV2ZXJzZSIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5SZXZlcnNlIHRoZSBzZW5zZSBvZiB0aGUgY29udmVyc2lvbixpLmUuIGNvbnZlcnQgZnJvbSBBU0NJSSB0byBuYXRpdjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZW5jb2RpbmciIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+VGhlIG5hdGl2ZSBlbmNvZGluZyB0aGUgZmlsZXMgYXJlIGluKGRlZmF1bHQgaXMgdGhlIGRlZmF1bHQgZW5jb2RpbmcgZm9yIHRoZSBKVk08L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9InNyYyIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5UaGUgZGlyZWN0b3J5IHRvIGZpbmQgZmlsZXMgaW4gKGRlZmF1bHQgaXMgYmFzZWRpcjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZGVzdCIgUkVRVUlSRUQ9InllcyI+CisJCQk8REVTQ1JJUFRJT04+VGhlIGRpcmVjdG9yeSB0byBvdXRwdXQgZmlsZSB0PC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJleHQiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+RmlsZSBleHRlbnNpb24gdG8gdXNlIGluIHJlbmFtaW5nIG91dHB1dCBmaWxlPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJkZWZhdWx0ZXhjbHVkZXMiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+aW5kaWNhdGVzIHdoZXRoZXIgZGVmYXVsdCBleGNsdWRlcyBzaG91bGQgYmUgdXNlZCBvciBub3QoJnF1b3Q7eWVzJnF1b3Q7LyZxdW90O25vJnF1b3Q7KS5EZWZhdWx0IGV4Y2x1ZGVzIGFyZSB1c2VkIHdoZW4gb21pdHRlZC48L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImluY2x1ZGVzIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPmNvbW1hLSBvciBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucyBvZiBmaWxlcyB0aGF0IG11c3QgYmVpbmNsdWRlZC4gQWxsIGZpbGVzIGFyZSBpbmNsdWRlZCB3aGVuIG9taXR0ZWQ8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImluY2x1ZGVzZmlsZSIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj50aGUgbmFtZSBvZiBhIGZpbGUuIEVhY2ggbGluZSBvZiB0aGlzIGZpbGUgaXN0YWtlbiB0byBiZSBhbiBpbmNsdWRlIHBhdHRlcjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZXhjbHVkZXMiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+Y29tbWEtIG9yIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zIG9mIGZpbGVzIHRoYXQgbXVzdCBiZSBleGNsdWRlZC5ObyBmaWxlcyAoZXhjZXB0IGRlZmF1bHQgZXhjbHVkZXMpIGFyZSBleGNsdWRlZCB3aGVuIG9taXR0ZWQ8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImV4Y2x1ZGVzZmlsZSIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj50aGUgbmFtZSBvZiBhIGZpbGUuIEVhY2ggbGluZSBvZiB0aGlzIGZpbGUgaXN0YWtlbiB0byBiZSBhbiBleGNsdWRlIHBhdHRlcjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCTwvVEFTSz4KKwk8VEFTSyBOQU1FPSJuZXRyZXh4YyI+CisJCTxERVNDUklQVElPTj4mbHQ7cCZndDtDb21waWxlcyBhICZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL25ldHJleHgmcXVvdDsgdGFyZ2V0PSZxdW90O190b3AmcXVvdDsmZ3Q7TmV0UmV4eCZsdDsvYSZndDsKK3NvdXJjZSB0cmVlIHdpdGhpbiB0aGUgcnVubmluZyAoQW50KSBWTS4mbHQ7L3AmZ3Q7CismbHQ7cCZndDtUaGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBkaXJlY3Rvcnkgd2lsbCBiZSByZWN1cnNpdmVseSBzY2FubmVkIGZvcgorTmV0UmV4eCBzb3VyY2UgZmlsZXMgdG8gY29tcGlsZS4gIE9ubHkgTmV0UmV4eCBmaWxlcyB0aGF0IGhhdmUgbm8gY29ycmVzcG9uZGluZworY2xhc3MgZmlsZSBvciB3aGVyZSB0aGUgY2xhc3MgZmlsZSBpcyBvbGRlciB0aGFuIHRoZSBqYXZhIGZpbGUgd2lsbCBiZSBjb21waWxlZC4mbHQ7L3AmZ3Q7CismbHQ7cCZndDtGaWxlcyBpbiB0aGUgc291cmNlIHRyZWUgYXJlIGNvcGllZCB0byB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5LAorYWxsb3dpbmcgc3VwcG9ydCBmaWxlcyB0byBiZSBsb2NhdGVkIHByb3Blcmx5IGluIHRoZSBjbGFzc3BhdGguIFRoZSBzb3VyY2UKK2ZpbGVzIGFyZSBjb3BpZWQgYmVjYXVzZSB0aGUgTmV0UmV4eCBjb21waWxlciBjYW5ub3QgcHJvZHVjZSBjbGFzcyBmaWxlcyBpbiBhCitzcGVjaWZpYyBkaXJlY3RvcnkgdmlhIHBhcmFtZXRlcnMmbHQ7L3AmZ3Q7CismbHQ7cCZndDtUaGUgZGlyZWN0b3J5IHN0cnVjdHVyZSBvZiB0aGUgc291cmNlIHRyZWUgc2hvdWxkIGZvbGxvdyB0aGUgcGFja2FnZQoraGllcmFyY2h5LiZsdDsvcCZndDsKKyZsdDtwJmd0O0l0IGlzIHBvc3NpYmxlIHRvIHJlZmluZSB0aGUgc2V0IG9mIGZpbGVzIHRoYXQgYXJlIGJlaW5nIGNvbXBpbGVkL2NvcGllZC4KK1RoaXMgY2FuIGJlIGRvbmUgd2l0aCB0aGUgJmx0O2kmZ3Q7aW5jbHVkZXMmbHQ7L2kmZ3Q7LCAmbHQ7aSZndDtpbmNsdWRlc2ZpbGUmbHQ7L2kmZ3Q7LCAmbHQ7aSZndDtleGNsdWRlcyZsdDsvaSZndDssICZsdDtpJmd0O2V4Y2x1ZGVzZmlsZSZsdDsvaSZndDsgYW5kCismbHQ7aSZndDtkZWZhdWx0ZXhjbHVkZXMmbHQ7L2kmZ3Q7IGF0dHJpYnV0ZXMuIFdpdGggdGhlICZsdDtpJmd0O2luY2x1ZGVzJmx0Oy9pJmd0OyBvciAmbHQ7aSZndDtpbmNsdWRlc2ZpbGUmbHQ7L2kmZ3Q7IGF0dHJpYnV0ZSB5b3UKK3NwZWNpZnkgdGhlIGZpbGVzIHlvdSB3YW50IHRvIGhhdmUgaW5jbHVkZWQgYnkgdXNpbmcgcGF0dGVybnMuIFRoZQorJmx0O2kmZ3Q7ZXhjbHVkZSZsdDsvaSZndDsgb3IgJmx0O2kmZ3Q7ZXhjbHVkZXNmaWxlJmx0Oy9pJmd0OyBhdHRyaWJ1dGUgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBmaWxlcyB5b3Ugd2FudCB0byBoYXZlCitleGNsdWRlZC4gIFRoaXMgaXMgYWxzbyBkb25lIHdpdGggcGF0dGVybnMuICBBbmQgZmluYWxseSB3aXRoIHRoZQorJmx0O2kmZ3Q7ZGVmYXVsdGV4Y2x1ZGVzJmx0Oy9pJmd0OyBhdHRyaWJ1dGUsIHlvdSBjYW4gc3BlY2lmeSB3aGV0aGVyIHlvdQord2FudCB0byB1c2UgZGVmYXVsdCBleGNsdXNpb25zIG9yIG5vdC4gU2VlIHRoZSBzZWN0aW9uIG9uICZsdDthCitocmVmPSZxdW90Oy4uL2RpcnRhc2tzLmh0bWwjZGlyZWN0b3J5YmFzZWR0YXNrcyZxdW90OyZndDtkaXJlY3RvcnkgYmFzZWQgdGFza3MmbHQ7L2EmZ3Q7LCBvbiBob3cgdGhlCitpbmNsdXNpb24vZXhjbHVzaW9uIG9mIGZpbGVzIHdvcmtzLCBhbmQgaG93IHRvIHdyaXRlIHBhdHRlcm5zLiZsdDsvcCZndDsKKyZsdDtwJmd0O1RoaXMgdGFzayBmb3JtcyBhbiBpbXBsaWNpdCAmbHQ7YSBocmVmPSZxdW90Oy4uL0NvcmVUeXBlcy9maWxlc2V0Lmh0bWwmcXVvdDsmZ3Q7RmlsZVNldCZsdDsvYSZndDsgYW5kCitzdXBwb3J0cyBhbGwgYXR0cmlidXRlcyBvZiAmbHQ7Y29kZSZndDsmYW1wO2x0O2ZpbGVzZXQmYW1wO2d0OyZsdDsvY29kZSZndDsKKygmbHQ7Y29kZSZndDtkaXImbHQ7L2NvZGUmZ3Q7IGJlY29tZXMgJmx0O2NvZGUmZ3Q7c3JjZGlyJmx0Oy9jb2RlJmd0OykgYXMgd2VsbCBhcyB0aGUgbmVzdGVkCismbHQ7Y29kZSZndDsmYW1wO2x0O2luY2x1ZGUmYW1wO2d0OyZsdDsvY29kZSZndDssICZsdDtjb2RlJmd0OyZhbXA7bHQ7ZXhjbHVkZSZhbXA7Z3Q7Jmx0Oy9jb2RlJmd0OyBhbmQKKyZsdDtjb2RlJmd0OyZhbXA7bHQ7cGF0dGVybnNldCZhbXA7Z3Q7Jmx0Oy9jb2RlJmd0OyBlbGVtZW50cy4mbHQ7L3AmZ3Q7CismbHQ7cCZndDtBbGwgcHJvcGVydGllcyBleGNlcHQgY2xhc3NwYXRoLCBzcmNkaXIgYW5kIGRlc3REaXIgYXJlIGFsc28gYXZhaWxhYmxlIGFzIHByb3BlcnRpZXMgaW4gdGhlIGZvcm0KKyZsdDtjb2RlJmd0O2FudC5uZXRyZXh4Yy4mbHQ7aSZndDthdHRyaWJ1dGVuYW1lJmx0Oy9pJmd0OyZsdDsvY29kZSZndDssIGVnLiZsdDticiZndDsKKyZsdDtjb2RlJmd0OyZhbXA7bHQ7cHJvcGVydHkgbmFtZT0mcXVvdDthbnQubmV0cmV4eGMudmVyYm9zZSZxdW90OyB2YWx1ZT0mcXVvdDtub3ZlcmJvc2UmcXVvdDsvJmFtcDtndDsmbHQ7L2NvZGUmZ3Q7Jmx0O2JyJmd0Oworb3IgZnJvbSB0aGUgY29tbWFuZCBsaW5lIGFzJmx0O2JyJmd0OworJmx0O2NvZGUmZ3Q7YW50IC1EYW50Lm5ldHJleHhjLnZlcmJvc2U9bm92ZXJib3NlIC4uLiZsdDsvY29kZSZndDsKKyZsdDsvcCZndDsKKzwvREVTQ1JJUFRJT04+CisJCTxBVFRSSUJVVEUgTkFNRT0iYmluYXJ5IiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPldoZXRoZXIgbGl0ZXJhbHMgYXJlIHRyZWF0ZWQgYXMgdGhlIGphdmEgYmluYXJ5dHlwZSByYXRoZXIgdGhhbiB0aGUgTmV0UmV4eCB0eXBlPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJjbGFzc3BhdGgiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+VGhlIGNsYXNzcGF0aCB0byB1c2UgZHVyaW5nIGNvbXBpbGF0aW88L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImNvbW1lbnRzIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPldoZXRoZXIgY29tbWVudHMgYXJlIHBhc3NlZCB0aHJvdWdoIHRvIHRoZWdlbmVyYXRlZCBqYXZhIHNvdXJjPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJjb21wYWN0IiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPldoZXRoZXIgZXJyb3IgbWVzc2FnZXMgY29tZSBvdXQgaW4gY29tcGFjdCBvcnZlcmJvc2UgZm9ybWF0LiBEZWZhdWx0IGlzIHRoZSBjb21wYWN0IGZvcm1hdDwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iY29tcGlsZSIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5XaGV0aGVyIHRoZSBOZXRSZXh4IGNvbXBpbGVyIHNob3VsZCBjb21waWxlIHRoZWdlbmVyYXRlZCBqYXZhIGNvZDwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iY29uc29sZSIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5XaGV0aGVyIG9yIG5vdCBtZXNzYWdlcyBzaG91bGQgYmUgZGlzcGxheWVkIG9uIHRoZSdjb25zb2xlPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJjcm9zc3JlZiIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5XaGV0aGVyIHZhcmlhYmxlIGNyb3NzIHJlZmVyZW5jZXMgYXJlIGdlbmVyYXRlPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJkZWNpbWFsIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPldoZXRoZXIgZGVjaW1hbCBhcml0aG1ldGljIHNob3VsZCBiZSB1c2VkIGZvciB0aGVOZXRSZXh4IGNvZDwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZGVmYXVsdGV4Y2x1ZGVzIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPmluZGljYXRlcyB3aGV0aGVyIGRlZmF1bHQgZXhjbHVkZXMgc2hvdWxkIGJlIHVzZWQgb3Igbm90KCZxdW90O3llcyZxdW90Oy8mcXVvdDtubyZxdW90OykuIERlZmF1bHQgZXhjbHVkZXMgYXJlIHVzZWQgd2hlbm9taXR0ZWQ8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImRlc3RkaXIiIFJFUVVJUkVEPSJ5ZXMiPgorCQkJPERFU0NSSVBUSU9OPnRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgaW50byB3aGljaCB0aGUgTmV0UmV4eHNvdXJjZSBmaWxlcyBzaG91bGQgYmUgY29waWVkIGFuZCB0aGVuIGNvbXBpbGU8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImRpYWciIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+V2hldGhlciBkaWFnbm9zdGljIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb21waWxlIGlzZ2VuZXJhdGU8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImV4Y2x1ZGVzIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPmNvbW1hLSBvciBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucyBvZiBmaWxlcyB0aGF0IG11c3QgYmVleGNsdWRlZC4gTm8gZmlsZXMgKGV4Y2VwdCBkZWZhdWx0IGV4Y2x1ZGVzKSBhcmUgZXhjbHVkZWQgd2hlbm9taXR0ZWQ8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImV4Y2x1ZGVzZmlsZSIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj50aGUgbmFtZSBvZiBhIGZpbGUuIEVhY2ggbGluZSBvZiB0aGlzIGZpbGUgaXN0YWtlbiB0byBiZSBhbiBleGNsdWRlIHBhdHRlcjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZXhwbGljaXQiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+V2hldGhlciB2YXJpYWJsZXMgbXVzdCBiZSBkZWNsYXJlZCBleHBsaWNpdGx5YmVmb3JlIHVzPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJmb3JtYXQiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+V2hldGhlciB0aGUgZ2VuZXJhdGVkIGphdmEgY29kZSBpcyBmb3JtYXR0ZWQgbmljZWx5b3IgbGVmdCB0byBtYXRjaCBOZXRSZXh4IGxpbmUgbnVtYmVycyBmb3IgY2FsbCBzdGFjayBkZWJ1Z2dpbjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iaW5jbHVkZXMiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+Y29tbWEtIG9yIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zIG9mIGZpbGVzIHRoYXQgbXVzdCBiZWluY2x1ZGVkLiBBbGwgZmlsZXMgYXJlIGluY2x1ZGVkIHdoZW4gb21pdHRlZDwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iaW5jbHVkZXNmaWxlIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPnRoZSBuYW1lIG9mIGEgZmlsZS4gRWFjaCBsaW5lIG9mIHRoaXMgZmlsZSBpc3Rha2VuIHRvIGJlIGFuIGluY2x1ZGUgcGF0dGVyPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJqYXZhIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPldoZXRoZXIgdGhlIGdlbmVyYXRlZCBqYXZhIGNvZGUgaXMgcHJvZHVjZTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0ia2VlcCIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5TZXRzIHdoZXRoZXIgdGhlIGdlbmVyYXRlZCBqYXZhIHNvdXJjZSBmaWxlIHNob3VsZCBiZSBrZXB0YWZ0ZXIgY29tcGlsYXRpb24uIFRoZSBnZW5lcmF0ZWQgZmlsZXMgd2lsbCBoYXZlIGFuIGV4dGVuc2lvbiBvZi5qYXZhLmtlZXAsIG5vdCAuamF2PC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJsb2dvIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPldoZXRoZXIgdGhlIGNvbXBpbGVyIHRleHQgbG9nbyBpcyBkaXNwbGF5ZWQgd2hlbmNvbXBpbGluPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJyZXBsYWNlIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPldoZXRoZXIgdGhlIGdlbmVyYXRlZCAuamF2YSBmaWxlIHNob3VsZCBiZSByZXBsYWNlZHdoZW4gY29tcGlsaW48L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9InNhdmVsb2ciIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+V2hldGhlciB0aGUgY29tcGlsZXIgbWVzc2FnZXMgd2lsbCBiZSB3cml0dGVuIHRvTmV0UmV4eEMubG9nIGFzIHdlbGwgYXMgdG8gdGhlIGNvbnNvbDwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0ic291cmNlZGlyIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPlRlbGxzIHRoZSBOZXRSZXh4IGNvbXBpbGVyIHRvIHN0b3JlIHRoZSBjbGFzcyBmaWxlcyBpbiB0aGVzYW1lIGRpcmVjdG9yeSBhcyB0aGUgc291cmNlIGZpbGVzLiBUaGUgYWx0ZXJuYXRpdmUgaXMgdGhlIHdvcmtpbmdkaXJlY3RvcjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0ic3JjZGlyIiBSRVFVSVJFRD0ieWVzIj4KKwkJCTxERVNDUklQVElPTj5TZXQgdGhlIHNvdXJjZSBkaXIgdG8gZmluZCB0aGUgc291cmNlIE5ldFJleHhmaWxlPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJzdHJpY3RhcmdzIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPlRlbGxzIHRoZSBOZXRSZXh4IGNvbXBpbGVyIHRoYXQgbWV0aG9kIGNhbGxzIGFsd2F5c25lZWQgcGFyZW50aGVzZXMsIGV2ZW4gaWYgbm8gYXJndW1lbnRzIGFyZSBuZWVkZWQsIGUuZy5hU3RyaW5nVmFyLmdldEJ5dGVzIHZzLmFTdHJpbmdWYXIuZ2V0Qnl0ZXMoPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJzdHJpY3Rhc3NpZ24iIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+VGVsbHMgdGhlIE5ldFJleHggY29tcGlsZSB0aGF0IGFzc2lnbm1lbnRzIG11c3RtYXRjaCBleGFjdGx5IG9uIHR5cDwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0ic3RyaWN0Y2FzZSIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5TcGVjaWZpZXMgd2hldGhlciB0aGUgTmV0UmV4eCBjb21waWxlciBzaG91bGQgYmVjYXNlIHNlbnNpdGl2ZSBvciBubzwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0ic3RyaWN0aW1wb3J0IiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPldoZXRoZXIgY2xhc3NlcyBuZWVkIHRvIGJlIGltcG9ydGVkIGV4cGxpY2l0bHkgdXNpbmcgYW5pbXBvcnQgc3RhdGVtZW50LiAgQnkgZGVmYXVsdCB0aGUgTmV0UmV4eCBjb21waWxlciB3aWxsaW1wb3J0IGNlcnRhaW4gcGFja2FnZXMgYXV0b21hdGljYWxsPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJzdHJpY3Rwcm9wcyIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5XaGV0aGVyIGxvY2FsIHByb3BlcnRpZXMgbmVlZCB0byBiZSBxdWFsaWZpZWRleHBsaWNpdGx5IHVzaW5nIHRoaTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0ic3RyaWN0c2lnbmFsIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPldoZXRoZXIgdGhlIGNvbXBpbGVyIHNob3VsZCBmb3JjZSBjYXRjaGluZyBvZmV4Y2VwdGlvbnMgYnkgZXhwbGljaXRseSBuYW1lZCB0eXBlPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJzeW1ib2xzIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPldoZXRoZXIgZGVidWcgc3ltYm9scyBzaG91bGQgYmUgZ2VuZXJhdGVkIGludG8gdGhlY2xhc3MgZmlsPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJ0aW1lIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPkFza3MgdGhlIE5ldFJleHggY29tcGlsZXIgdG8gcHJpbnQgY29tcGlsYXRpb250aW1lcyB0byB0aGUgY29uc29sPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJ0cmFjZSIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5UdXJucyBvbiBvciBvZmYgdHJhY2luZyBhbmQgZGlyZWN0cyB0aGUgcmVzdWx0YW50dHJhY2Ugb3V0cHU8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9InV0ZjgiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+VGVsbHMgdGhlIE5ldFJleHggY29tcGlsZXIgdGhhdCB0aGUgc291cmNlIGlzIGluIFVURjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0idmVyYm9zZSIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5XaGV0aGVyIGxvdHMgb2Ygd2FybmluZ3MgYW5kIGVycm9yIG1lc3NhZ2VzIHNob3VsZGJlIGdlbmVyYXRlPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJzdXBwcmVzc21ldGhvZGFyZ3VtZW50bm90dXNlZCIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5UZWxscyB3aGV0aGVyIHdlIHNob3VsZCBmaWx0ZXIgb3V0IHRoZSZhbXA7TWV0aG9kIGFyZ3VtZW50IG5vdCB1c2VkJmFtcDsgbWVzc2FnZXMgaW4gc3RyaWN0YXJncyBtb2RlPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJzdXBwcmVzc3ByaXZhdGVwcm9wZXJ0eW5vdHVzZWQiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+VGVsbHMgd2hldGhlciB3ZSBzaG91bGQgZmlsdGVyIG91dCB0aGUmYW1wO1ByaXZhdGUgUHJvcGVydHkgZGVmaW5lZCwgYnV0IG5vdCB1c2VkJmFtcDsgbWVzc2FnZXMgaW4gc3RyaWN0YXJncyBtb2RlPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJzdXBwcmVzc3ZhcmlhYmxlbm90dXNlZCIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5UZWxscyB3aGV0aGVyIHdlIHNob3VsZCBmaWx0ZXIgb3V0IHRoZSZhbXA7VmFyaWFibGUgc2V0IGJ1dCBub3QgdXNlZCZhbXA7IG1lc3NhZ2VzIGluIHN0cmljdGFyZ3MgbW9kZS5QbGVhc2UgYmUgY2FyZWZ1bCB3aXRoIHRoaXMgb25lLCBhcyB5b3UgY2FuIGhpZGUgZXJyb3JzIGJlaGluZCBpdDwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0ic3VwcHJlc3NleGNlcHRpb25ub3RzaWduYWxsZWQiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+VGVsbHMgd2hldGhlciB3ZSBzaG91bGQgZmlsdGVyIG91dCB0aGUmYW1wO0V4Y2VwdGlvbiBpcyBkZWNsYXJlZCwgYnV0IG5vdCBzaWduYWxsZWQgd2l0aGluIHRoZSBtZXRob2QmYW1wO21lc3NhZ2VzIGluIHN0cmljdHNpZ25hbCBtb2RlPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJzdXBwcmVzc2RlcHJlY2F0aW9uIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPlRlbGxzIHdldGhlciB3ZSBzaG91bGQgZmlsdGVyIG91dCBhbnkgZGVwcmVjYXRpb24tbWVzc2FnZXNvZiB0aGUgY29tcGlsZXIgb3V0PC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisJPC9UQVNLPgorCTxUQVNLIE5BTUU9InB2Y3MiPgorCQk8REVTQ1JJUFRJT04+VGhlIHB2Y3MgdGFzayBpcyBzZXQgdG8gcG9pbnQgYXQgYSBQVkNTIHJlcG9zaXRvcnkgYW5kIG9wdGlvbmFsbHkgYSBwcm9qZWN0Cit3aXRoaW4gdGhhdCByZXBvc2l0b3J5LCBhbmQgY2FuIGZyb20gdGhhdCBzcGVjaWZpY2F0aW9uIGdldCB0aGUgbGF0ZXN0Cit2ZXJzaW9uIG9mIHRoZSBmaWxlcyBjb250YWluZWQgYnkgdGhlIHJlcG9zaXRvcnkuCis8L0RFU0NSSVBUSU9OPgorCQk8QVRUUklCVVRFIE5BTUU9InJlcG9zaXRvcnkiIFJFUVVJUkVEPSJ5ZXMiPgorCQkJPERFU0NSSVBUSU9OPlRoZSBsb2NhdGlvbiBvZiB0aGUgcmVwb3NpdG9yeSAoc2VlIHlvdXIgUFZDU21hbnVhbHM8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9InB2Y3Nwcm9qZWN0IiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPlRoZSBwcm9qZWN0IHdpdGhpbiB0aGUgUFZDUyByZXBvc2l0b3J5IHRvIGV4dHJhY3RmaWxlcyBmcm9tICgmcXVvdDsvJnF1b3Q7IGlzIHJvb3QgcHJvamVjdCBhbmQgdGhhdCBpcyBkZWZhdWx0IGlmIHRoaXMgYXR0cmlidXRlIGlzbid0c3BlY2lmaWVkPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJsYWJlbCIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5Pbmx5IGZpbGVzIG1hcmtlZCB3aXRoIHRoaXMgbGFiZWwgYXJlIGV4dHJhY3RlZDwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0icHJvbW90aW9uZ3JvdXAiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+T25seSBmaWxlcyB3aXRoaW4gdGhpcyBwcm9tb3Rpb24gZ3JvdXAgYXJlIGV4dHJhY3RlZC4gVXNpbmdib3RoIHRoZSBsYWJlbCBhbmQgdGhlIHByb21vdGlvbmdyb3VwIHRhZyB3aWxsIGNhdXNlIHRoZSBmaWxlcyBpbiB0aGVwcm9tb3Rpb24gZ3JvdXAgYW5kIHdpdGggdGhhdCBsYWJlbCB0byBiZSBleHRyYWN0ZWQuPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJmb3JjZSIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5JZiBzZXQgdG8geWVzIGFsbCBmaWxlcyB0aGF0IGV4aXN0cyBhbmQgYXJlIHdyaXRhYmxlIGFyZSBvdmVyd3JpdHRlbi4gRGVmYXVsdCBubyBjYXVzZXMgdGhlIGZpbGVzIHRoYXQgYXJlIHdyaXRhYmxlIHRvIGJlIGlnbm9yZWQuIFRoaXMgc3RvcHMgdGhlIFBWQ1MgY29tbWFuZCBnZXQgdG8gc3RvcCBhc2tpbmcgcXVlc3Rpb25zPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJ3b3Jrc3BhY2UiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+Qnkgc3BlY2lmeWluZyBhIHdvcmtzcGFjZSwgdGhlIGZpbGVzIGFyZSBleHRyYWN0ZWQgdG8gdGhhdCBsb2NhdGlvbi4gQSBQVkNTIHdvcmtzcGFjZSBpcyBhbmFtZSBmb3IgYSBsb2NhdGlvbiBvZiB0aGUgd29ya2ZpbGVzIGFuZCBpc24ndCBhcyBzdWNoIHRoZSBsb2NhdGlvbiBpdHNlbGYuIFlvdSBkZWZpbmUgdGhlIGxvY2F0aW9uIGZvciBhIHdvcmtzcGFjZXVzaW5nIHRoZSBQVkNTIEdVSSBjbGllbnRzLiBJZiB0aGlzIGlzbid0IHNwZWNpZmllZCB0aGUgZGVmYXVsdCB3b3Jrc3BhY2UgZm9yIHRoZSBjdXJyZW50IHVzZXIgaXMgdXNlZDwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0icHZjc2JpbiIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5PbiBzb21lIHN5c3RlbXMgdGhlIFBWQ1MgZXhlY3V0YWJsZXMgcGNsaWFuZCBnZXQgYXJlIG5vdCBmb3VuZCBpbiB0aGUgUEFUSC4gSW4gc3VjaCBjYXNlcyB0aGlzIGF0dHJpYnV0ZXNob3VsZCBiZSBzZXQgdG8gdGhlIGJpbiBkaXJlY3Rvcnkgb2YgdGhlIFBWQ1MgaW5zdGFsbGF0aW9uIGNvbnRhaW5pbmd0aGUgZXhlY3V0YWJsZXMgbWVudGlvbmVkIGJlZm9yZS4gSWYgdGhpcyBhdHRyaWJ1dGUgaXNuJ3Qgc3BlY2lmaWVkIHRoZXRhZyBleHBlY3RzIHRoZSBleGVjdXRhYmxlcyB0byBiZSBmb3VuZCB1c2luZyB0aGUgUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iaWdub3JlcmV0dXJuY29kZSIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5JZiBzZXQgdG8gdHJ1ZSB0aGUgcmV0dXJuIHZhbHVlIGZyb20gZXhlY3V0aW5ndGhlIHB2Y3MgY29tbWFuZHMgYXJlIGlnbm9yZWQ8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9InVwZGF0ZW9ubHkiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+SWYgc2V0IHRvIHRydWUgZmlsZXMgYXJlIGdvdHRlbiBvbmx5IGlmbmV3ZXIgdGhhbiBleGlzdGluZyBsb2NhbCBmaWxlczwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZmlsZW5hbWVmb3JtYXQiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+VGhlIGZvcm1hdCBvZiB5b3VyIGZvbGRlciBuYW1lcyBpbiBhZm9ybWF0IHN1aXRhYmxlIGZvciBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdC5EZWZhdWx0cyB0byB7MH0tYXJjKHsxfSkuICBSZXBvc2l0b3JpZXMgd2hlcmV0aGUgYXJjaGl2ZSBleHRlbnNpb24gaXMgbm90ICAtYXJjIHNob3VsZCBzZXR0aGlzPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJsaW5lc3RhcnQiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+VXNlZCB0byBwYXJzZSB0aGUgb3V0cHV0IG9mIHRoZSBwY2xpY29tbWFuZC4gSXQgZGVmYXVsdHMgdG8gJnF1b3Q7UDouICBUaGUgcGFyc2VyIGFscmVhZHlrbm93cyBhYm91dCAvIGFuZCBcXCwgdGhpcyBwcm9wZXJ0eSBpcyB1c2VmdWwgaW4gY2FzZXMgd2hlcmUgdGhlcmVwb3NpdG9yeSBpcyBhY2Nlc3NlZCBvbiBhIFdpbmRvd3MgcGxhdGZvcm0gdmlhIGEgZHJpdmUgbGV0dGVybWFwcGluZzwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCTwvVEFTSz4KKwk8VEFTSyBOQU1FPSJyZW5hbWVleHRlbnNpb25zIj4KKwkJPERFU0NSSVBUSU9OPiZsdDtwJmd0O1JlbmFtZXMgZmlsZXMgaW4gdGhlICZsdDtjb2RlJmd0O3NyY0RpciZsdDsvY29kZSZndDsgZGlyZWN0b3J5IGVuZGluZyB3aXRoIHRoZQorJmx0O2NvZGUmZ3Q7ZnJvbUV4dGVuc2lvbiZsdDsvY29kZSZndDsgc3RyaW5nIHNvIHRoYXQgdGhleSBlbmQgd2l0aCB0aGUKKyZsdDtjb2RlJmd0O3RvRXh0ZW5zaW9uJmx0Oy9jb2RlJmd0OyBzdHJpbmcuIEZpbGVzIGFyZSBvbmx5IHJlcGxhY2VkIGlmCismbHQ7Y29kZSZndDtyZXBsYWNlJmx0Oy9jb2RlJmd0OyBpcyB0cnVlCismbHQ7L3AmZ3Q7CismbHQ7cCZndDtTZWUgdGhlIHNlY3Rpb24gb24KKyZsdDthIGhyZWY9JnF1b3Q7Li4vZGlydGFza3MuaHRtbCNkaXJlY3RvcnliYXNlZHRhc2tzJnF1b3Q7Jmd0O2RpcmVjdG9yeSBiYXNlZCB0YXNrcyZsdDsvYSZndDssIG9uIGhvdyB0aGUKK2luY2x1c2lvbi9leGNsdXNpb24gb2YgZmlsZXMgd29ya3MsIGFuZCBob3cgdG8gd3JpdGUgcGF0dGVybnMuCitUaGlzIHRhc2sgZm9ybXMgYW4gaW1wbGljaXQgJmx0O2EgaHJlZj0mcXVvdDsuLi9Db3JlVHlwZXMvZmlsZXNldC5odG1sJnF1b3Q7Jmd0O0ZpbGVTZXQmbHQ7L2EmZ3Q7IGFuZAorc3VwcG9ydHMgYWxsIGF0dHJpYnV0ZXMgb2YgJmx0O2NvZGUmZ3Q7JmFtcDtsdDtmaWxlc2V0JmFtcDtndDsmbHQ7L2NvZGUmZ3Q7CisoJmx0O2NvZGUmZ3Q7ZGlyJmx0Oy9jb2RlJmd0OyBiZWNvbWVzICZsdDtjb2RlJmd0O3NyY0RpciZsdDsvY29kZSZndDspIGFzIHdlbGwgYXMgdGhlIG5lc3RlZAorJmx0O2NvZGUmZ3Q7JmFtcDtsdDtpbmNsdWRlJmFtcDtndDsmbHQ7L2NvZGUmZ3Q7LCAmbHQ7Y29kZSZndDsmYW1wO2x0O2V4Y2x1ZGUmYW1wO2d0OyZsdDsvY29kZSZndDsgYW5kCismbHQ7Y29kZSZndDsmYW1wO2x0O3BhdHRlcm5zZXQmYW1wO2d0OyZsdDsvY29kZSZndDsgZWxlbWVudHMuJmx0Oy9wJmd0OworPC9ERVNDUklQVElPTj4KKwkJPEFUVFJJQlVURSBOQU1FPSJkZWZhdWx0ZXhjbHVkZXMiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+aW5kaWNhdGVzIHdoZXRoZXIgZGVmYXVsdCBleGNsdWRlcyBzaG91bGQgYmUgdXNlZCBvciBub3QoJnF1b3Q7eWVzJnF1b3Q7LyZxdW90O25vJnF1b3Q7KS4gRGVmYXVsdCBleGNsdWRlcyBhcmUgdXNlZCB3aGVub21pdHRlZDwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZXhjbHVkZXMiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+Y29tbWEtIG9yIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zIG9mIGZpbGVzIHRoYXQgbXVzdCBiZWV4Y2x1ZGVkLiBObyBmaWxlcyAoZXhjZXB0IGRlZmF1bHQgZXhjbHVkZXMpIGFyZSBleGNsdWRlZCB3aGVub21pdHRlZDwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZXhjbHVkZXNmaWxlIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPnRoZSBuYW1lIG9mIGEgZmlsZS4gRWFjaCBsaW5lIG9mIHRoaXMgZmlsZSBpc3Rha2VuIHRvIGJlIGFuIGV4Y2x1ZGUgcGF0dGVyPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJmcm9tZXh0ZW50aW9uIiBSRVFVSVJFRD0ieWVzIj4KKwkJCTxERVNDUklQVElPTj5UaGUgc3RyaW5nIHRoYXQgZmlsZXMgbXVzdCBlbmQgaW4gdG8gYmUgcmVuYW1lPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJpbmNsdWRlcyIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5jb21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgb2YgZmlsZXMgdGhhdCBtdXN0IGJlaW5jbHVkZWQuIEFsbCBmaWxlcyBhcmUgaW5jbHVkZWQgd2hlbiBvbWl0dGVkPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJpbmNsdWRlc2ZpbGUiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+dGhlIG5hbWUgb2YgYSBmaWxlLiBFYWNoIGxpbmUgb2YgdGhpcyBmaWxlIGlzdGFrZW4gdG8gYmUgYW4gaW5jbHVkZSBwYXR0ZXI8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9InJlcGxhY2UiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+V2hldGhlciB0aGUgZmlsZSBiZWluZyByZW5hbWVkIHRvIHNob3VsZCBiZXJlcGxhY2VkIGlmIGl0IGFscmVhZHkgZXhpc3Q8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9InNyY2RpciIgUkVRVUlSRUQ9InllcyI+CisJCQk8REVTQ1JJUFRJT04+VGhlIHN0YXJ0aW5nIGRpcmVjdG9yeSBmb3IgZmlsZXMgdG8gc2VhcmNoIGk8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9InRvZXh0ZW5zaW9uIiBSRVFVSVJFRD0ieWVzIj4KKwkJCTxERVNDUklQVElPTj5UaGUgc3RyaW5nIHRoYXQgcmVuYW1lZCBmaWxlcyB3aWxsIGVuZCB3aXRoIG9uY29tcGxldGlvPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisJPC9UQVNLPgorCTxUQVNLIE5BTUU9InJlcGxhY2VyZWdlZXhwIj4KKwkJPERFU0NSSVBUSU9OPiZsdDtwJmd0O1JlcGxhY2VSZWdFeHAgaXMgYSBkaXJlY3RvcnkgYmFzZWQgdGFzayBmb3IgcmVwbGFjaW5nIHRoZQorb2NjdXJyZW5jZSBvZiBhIGdpdmVuIHJlZ3VsYXIgZXhwcmVzc2lvbiB3aXRoIGEgc3Vic3RpdHV0aW9uIHBhdHRlcm4KK2luIGEgc2VsZWN0ZWQgZmlsZSBvciBzZXQgb2YgZmlsZXMuJmx0Oy9wJmd0OworJmx0O3AmZ3Q7U2ltaWxhciB0byAmbHQ7YSBocmVmPSZxdW90Oy4uL0NvcmVUeXBlcy9tYXBwZXIuaHRtbCNyZWdleHAtbWFwcGVyJnF1b3Q7Jmd0O3JlZ2V4cAordHlwZSBtYXBwZXJzJmx0Oy9hJmd0OyB0aGlzIHRhc2sgbmVlZHMgYSBzdXBwb3J0aW5nIHJlZ3VsYXIgZXhwcmVzc2lvbgorbGlicmFyeSBhbmQgYW4gaW1wbGVtZW50YXRpb24gb2YKKyZsdDtjb2RlJmd0O29yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwucmVnZXhwLlJlZ2V4cCZsdDsvY29kZSZndDsuICBBbnQgY29tZXMgd2l0aAoraW1wbGVtZW50YXRpb25zIGZvcgorJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS40L2RvY3MvYXBpL2phdmEvdXRpbC9yZWdleC9wYWNrYWdlLXN1bW1hcnkuaHRtbCZxdW90OyB0YXJnZXQ9JnF1b3Q7X3RvcCZxdW90OyZndDt0aGUgamF2YS51dGlsLnJlZ2V4IHBhY2thZ2Ugb2YgSkRLIDEuNCZsdDsvYSZndDssCismbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvcmVnZXhwLyZxdW90OyB0YXJnZXQ9JnF1b3Q7X3RvcCZxdW90OyZndDtqYWthcnRhLXJlZ2V4cCZsdDsvYSZndDsKK2FuZCAmbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvb3JvLyZxdW90OyB0YXJnZXQ9JnF1b3Q7X3RvcCZxdW90OyZndDtqYWthcnRhLU9STyZsdDsvYSZndDssCitidXQgeW91IHdpbGwgc3RpbGwgbmVlZCB0aGUgbGlicmFyeSBpdHNlbGYuJmx0Oy9wJmd0OworJmx0O3AmZ3Q7CismbHQ7aSZndDsKK1RoZXJlIGFyZSBjcm9zcy1wbGF0Zm9ybSBpc3N1ZXMgZm9yIG1hdGNoZXMgcmVsYXRlZCB0byBsaW5lIHRlcm1pbmF0b3IuCitGb3IgZXhhbXBsZSBpZiB5b3UgdXNlICQgdG8gYW5jaG9yIHlvdXIgcmVndWxhciBleHByZXNzaW9uIG9uIHRoZSBlbmQgb2YgYSBsaW5lCit0aGUgcmVzdWx0cyBtaWdodCBiZSB2ZXJ5IGRpZmZlcmVudCBkZXBlbmRpbmcgb24gYm90aCB5b3VyIHBsYXRmb3JtIGFuZCB0aGUgcmVndWxhcgorZXhwcmVzc2lvbiBsaWJyYXJ5IHlvdSB1c2UuIEl0IGlzICdoaWdobHkgcmVjb21tZW5kZWQnIHRoYXQgeW91IHRlc3QgeW91ciBwYXR0ZXJuIG9uCitib3RoIFVuaXggYW5kIFdpbmRvd3MgcGxhdGZvcm1zIGJlZm9yZSB5b3UgcmVseSBvbiBpdC4KKyZsdDt1bCZndDsKKyZsdDtsaSZndDtKYWthcnRhIE9ybyBkZWZpbmVzIGEgbGluZSB0ZXJtaW5hdG9yIGFzICdcbicgYW5kIGlzIGNvbnNpc3RlbnQgd2l0aCBQZXJsLiZsdDsvbGkmZ3Q7CismbHQ7bGkmZ3Q7SmFrYXJ0YSBSZWdFeHAgdXNlcyBhIHN5c3RlbS1kZXBlbmRhbnQgbGluZSB0ZXJtaW5hdG9yLiZsdDsvbGkmZ3Q7CismbHQ7bGkmZ3Q7SkRLIDEuNCB1c2VzICdcbicsICdcclxuJywgJ1x1MDA4NScsICdcdTIwMjgnLCAnXHUyMDI5JyBhcyBhIGRlZmF1bHQKK2J1dCBpcyBjb25maWd1cmVkIGluIHRoZSB3cmFwcGVyIHRvIHVzZSBvbmx5ICdcbicgKFVOSVhfTElORSkmbHQ7L2xpJmd0OworJmx0Oy91bCZndDsKK1dlICZsdDtiJmd0O3N0cm9uZ2x5Jmx0Oy9iJmd0OyByZWNvbW1lbmQgdGhhdCB5b3UgdXNlIEpha2FydGEgT3JvLgorJmx0Oy9pJmd0OworJmx0Oy9wJmd0OworPC9ERVNDUklQVElPTj4KKwkJPEFUVFJJQlVURSBOQU1FPSJmaWxlIiBSRVFVSVJFRD0ieWVzIGlmIG5vIG5lc3RlZCAmbHQ7ZmlsZXNldCZndDsgaXMgdXNlZCI+CisJCQk8REVTQ1JJUFRJT04+ZmlsZSBmb3Igd2hpY2ggdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBzaG91bGQgYmUgcmVwbGFjZWQ8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9Im1hdGNoIiBSRVFVSVJFRD0ieWVzLCBpZiBubyBuZXN0ZWQgJmx0O3JlZ2V4cCZndDsgaXMgdXNlZCI+CisJCQk8REVTQ1JJUFRJT04+VGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuIHRvIG1hdGNoIGluIHRoZSBmaWxlKHM8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9InJlcGxhY2UiIFJFUVVJUkVEPSJ5ZXMsIGlmIG5vIG5lc3RlZCAmbHQ7c3Vic3RpdHV0aW9uJmd0OyBpcyB1c2VkIj4KKwkJCTxERVNDUklQVElPTj5UaGUgc3Vic3RpdHV0aW9uIHBhdHRlcm4gdG8gcGxhY2UgaW4gdGhlIGZpbGUocykgaW4gcGxhY2VvZiB0aGUgcmVndWxhciBleHByZXNzaW9uPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJmbGFncyIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5UaGUgZmxhZ3MgdG8gdXNlIHdoZW4gbWF0Y2hpbmcgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbi4gIEZvciBtb3JlaW5mb3JtYXRpb24sIGNvbnN1bHQgdGhlIFBlcmw1IHN5bnRhZyA6IEdsb2JhbCByZXBsYWNlbWVudC4gIFJlcGxhY2UgYWxsIG9jY3VyZW5jZXMgZm91bmkgOiBDYXNlIEluc2Vuc2l0aXZlLiAgRG8gbm90IGNvbnNpZGVyIGNhc2UgaW4gdGhlIG1hdGNtIDogTXVsdGlsaW5lLiAgVHJlYXQgdGhlIHN0cmluZyBhcyBtdWx0aXBsZSBsaW5lcyBvZiBpbnB1dCwgdXNpbmcgJnF1b3Q7XiZxdW90OyBhbmQgJnF1b3Q7JCZxdW90OyBhcyB0aGUgc3RhcnQgb3IgZW5kIG9mIGFueSBsaW5lLCByZXNwZWN0aXZlbHksIHJhdGhlciB0aGFuIHN0YXJ0IG9yIGVuZCBvZiBzdHJpbmdzIDogU2luZ2xlbGluZS4gIFRyZWF0IHRoZSBzdHJpbmcgYXMgYSBzaW5nbGUgbGluZSBvZiBpbnB1dCwgdXNpbmcgJnF1b3Q7LiZxdW90OyB0byBtYXRjaCBhbnkgY2hhcmFjdGVyLCBpbmNsdWRpbmcgYSBuZXdsaW5lLCB3aGljaCBub3JtYWxseSwgaXQgd291bGQgbm90IG1hdGNoPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJieWxpbmUiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+UHJvY2VzcyB0aGUgZmlsZShzKSBvbmUgbGluZSBhdCBhIHRpbWUsIGV4ZWN1dGluZyB0aGUgcmVwbGFjZW1lbnRvbiBvbmUgbGluZSBhdCBhIHRpbWUgKHRydWUvZmFsc2UpLiAgVGhpcyBpcyB1c2VmdWwgaWYgeW91d2FudCB0byBvbmx5IHJlcGxhY2UgdGhlIGZpcnN0IG9jY3VyZW5jZSBvZiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBvbmVhY2ggbGluZSwgd2hpY2ggaXMgbm90IGVhc3kgdG8gZG8gd2hlbiBwcm9jZXNzaW5nIHRoZSBmaWxlIGFzIGEgd2hvbGUuRGVmYXVsdHMgdG8gZmFsc2U8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKwk8L1RBU0s+CisJPFRBU0sgTkFNRT0icnBtIj4KKwkJPERFU0NSSVBUSU9OPiZsdDtwJmd0OworQSBiYXNpYyB0YXNrIGZvciBpbnZva2luZyB0aGUgcnBtIGV4ZWN1dGFibGUgdG8gYnVpbGQgYSBMaW51eCBpbnN0YWxsYXRpb24KK2ZpbGUuIFRoZSB0YXNrIGN1cnJlbnRseSBvbmx5IHdvcmtzIG9uIExpbnV4IG9yIG90aGVyIFVuaXggcGxhdGZvcm1zCit3aXRoIHJwbSBzdXBwb3J0LgorJmx0Oy9wJmd0OworPC9ERVNDUklQVElPTj4KKwkJPEFUVFJJQlVURSBOQU1FPSJzcGVjZmlsZSIgUkVRVUlSRUQ9InllcyI+CisJCQk8REVTQ1JJUFRJT04+VGhlIG5hbWUgb2YgdGhlIHNwZWMgRmlsZSB0byBiZSB1c2VkPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJ0b3BkaXIiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+dGhpcyBpcyB0aGUgZGlyZWN0b3J5IHdoaWNoIHdpbGwgaGF2ZSB0aGUgZXhwZWN0ZWRzdWJkaXJlY3RvcmllcywgU1BFQ1MsIFNPVVJDRVMsIEJVSUxELCBTUlBNUy4gIElmIHRoaXMgaXNuJ3Qgc3BlY2lmaWVkLHRoZSBiYXNlRGlyIHZhbHVlIGlzIHVzZWQ8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImNsZWFuYnVpbGRkaXIiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+VGhpcyB3aWxsIHJlbW92ZSB0aGUgZ2VuZXJhdGVkIGZpbGVzIGluIHRoZSBCVUlMRGRpcmVjdG9yeTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0icmVtb3Zlc3BlYyIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj50aGlzIHdpbGwgcmVtb3ZlIHRoZSBzcGVjIGZpbGUgZnJvbSBTUEVDPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJyZW1vdmVzb3VyY2UiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+RmxhZyAob3B0aW9uYWwsIGRlZmF1bHQ9ZmFsc2UpIHRvIHJlbW92ZSB0aGUgc291cmNlcyBhZnRlciB0aGUgYnVpbGQuU2VlIHRoZSB0aGUgLS1ybXNvdXJjZSAgb3B0aW9uIG9mIHJwbWJ1aWxkPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJjb21tYW5kIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPnZlcnkgc2ltaWxhciBpZGVhIHRvIHRoZSBjdnMgdGFzay4gIHRoZSBkZWZhdWx0IGlzICZxdW90Oy1iYjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0ib3V0cHV0L2Vycm9yIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPndoZXJlIHN0YW5kYXJkIG91dHB1dCBhbmQgZXJyb3IgZzwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCTwvVEFTSz4KKwk8VEFTSyBOQU1FPSJzY3JpcHQiPgorCQk8REVTQ1JJUFRJT04+Jmx0O3AmZ3Q7RXhlY3V0ZSBhIHNjcmlwdCBpbiBhIAorJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LTEyNC5pYm0uY29tL2RldmVsb3BlcndvcmtzL3Byb2plY3RzL2JzZiZxdW90OyB0YXJnZXQ9JnF1b3Q7X3RvcCZxdW90OyZndDtCU0YmbHQ7L2EmZ3Q7IHN1cHBvcnRlZCBsYW5ndWFnZS4mbHQ7L3AmZ3Q7CismbHQ7cCZndDsmbHQ7YiZndDtOb3RlOiZsdDsvYiZndDsgVGhpcyB0YXNrIGRlcGVuZHMgb24gZXh0ZXJuYWwgbGlicmFyaWVzIG5vdCBpbmNsdWRlZCBpbiB0aGUgQW50IGRpc3RyaWJ1dGlvbi4KK1NlZSAmbHQ7YSBocmVmPSZxdW90Oy4uL2luc3RhbGwuaHRtbCNsaWJyYXJ5ZGVwZW5kZW5jaWVzJnF1b3Q7Jmd0O0xpYnJhcnkgRGVwZW5kZW5jaWVzJmx0Oy9hJmd0OyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4mbHQ7L3AmZ3Q7CismbHQ7cCZndDtBbGwgaXRlbXMgKHRhc2tzLCB0YXJnZXRzLCBldGMpIG9mIHRoZSBydW5uaW5nIHByb2plY3QgYXJlCithY2Nlc3NpYmxlIGZyb20gdGhlIHNjcmlwdCwgdXNpbmcgZWl0aGVyIHRoZWlyICZsdDtjb2RlJmd0O25hbWUmbHQ7L2NvZGUmZ3Q7IG9yCismbHQ7Y29kZSZndDtpZCZsdDsvY29kZSZndDsgYXR0cmlidXRlcyAoYXMgbG9uZyBhcyB0aGVpciBuYW1lcyBhcmUgY29uc2lkZXJlZAordmFsaWQgSmF2YSBpZGVudGlmaWVycywgdGhhdCBpcykuIAorVGhlIG5hbWUgJnF1b3Q7cHJvamVjdCZxdW90OyBpcyBhIHByZS1kZWZpbmVkIHJlZmVyZW5jZSB0byB0aGUgUHJvamVjdCwgd2hpY2ggY2FuIGJlCit1c2VkIGluc3RlYWQgb2YgdGhlIHByb2plY3QgbmFtZS4mbHQ7L3AmZ3Q7CismbHQ7cCZndDsmbHQ7YiZndDtCZWFuU2hlbGwgdXNlcnM6Jmx0Oy9iJmd0OyBUaGlzIHRhc2sgbm93IG5hdGl2ZWx5IHN1cHBvcnRzIHRoZSBCZWFuU2hlbGwKK3NjcmlwdGluZyBsYW5ndWFnZSwgdXNpbmcgbGFuZ3VhZ2U9JnF1b3Q7YmVhbnNoZWxsJnF1b3Q7LiBUaGUgQmVhblNoZWxsIGVuZ2luZSBpcworc3RpbGwgcmVxdWlyZWQuCismbHQ7L3AmZ3Q7CismbHQ7cCZndDtTY3JpcHRzIGNhbiBkbyBhbG1vc3QgYW55dGhpbmcgYSB0YXNrIHdyaXR0ZW4gaW4gSmF2YSBjb3VsZCBkby4mbHQ7L3AmZ3Q7Cis8L0RFU0NSSVBUSU9OPgorCQk8QVRUUklCVVRFIE5BTUU9Imxhbmd1YWdlIiBSRVFVSVJFRD0ieWVzIj4KKwkJCTxERVNDUklQVElPTj5UaGUgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgdGhlIHNjcmlwdCBpcyB3cml0dGVuIGluLk11c3QgYmUgYSBzdXBwb3J0ZWQgQlNGIGxhbmd1YWc8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9InNyYyIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5UaGUgbG9jYXRpb24gb2YgdGhlIHNjcmlwdCBhcyBhIGZpbGUsIGlmIG5vdCBpbmxpbjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCTwvVEFTSz4KKwk8VEFTSyBOQU1FPSJzZXJ2ZXJkZXBsb3kiPgorCQk8REVTQ1JJUFRJT04+Jmx0O3AmZ3Q7VGhlICZsdDtjb2RlJmd0O3NlcnZlcmRlcGxveSZsdDsvY29kZSZndDsgdGFzayBpcyB1c2VkIHRvIHJ1biBhICZxdW90O2hvdCZxdW90OyBkZXBsb3ltZW50IHRvb2wgZm9yCit2ZW5kb3Itc3BlY2lmaWMgSjJFRSBzZXJ2ZXIuIFRoZSB0YXNrIHJlcXVpcmVzIG5lc3RlZCBlbGVtZW50cyB3aGljaCBkZWZpbmUKK3RoZSBhdHRyaWJ1dGVzIG9mIHRoZSB2ZW5kb3Itc3BlY2lmaWMgZGVwbG95bWVudCB0b29sIGJlaW5nIGV4ZWN1dGVkLgorVmVuZG9yLXNwZWNpZmljIGRlcGxveW1lbnQgdG9vbHMgZWxlbWVudHMgbWF5IGVuZm9yY2UgcnVsZXMgZm9yIHdoaWNoCithdHRyaWJ1dGVzIGFyZSByZXF1aXJlZCwgZGVwZW5kaW5nIG9uIHRoZSB0b29sLgorJmx0Oy9wJmd0OworPC9ERVNDUklQVElPTj4KKwkJPEFUVFJJQlVURSBOQU1FPSJhY3Rpb24iIFJFUVVJUkVEPSJ5ZXMiPgorCQkJPERFU0NSSVBUSU9OPlRoaXMgaXMgdGhlIGFjdGlvbiB0byBiZSBwZXJmb3JtZWQuICBGb3IgbW9zdCBjYXNlcyB0aGlzd2lsbCBiZSAmcXVvdDtkZXBsb3kmcXVvdDsuICBTb21lIHRvb2xzIHN1cHBvcnQgYWRkaXRpb25hbCBhY3Rpb25zLCBzdWNoIGFzICZxdW90O2RlbGV0ZSZxdW90OywgJnF1b3Q7bGlzdCZxdW90OywmcXVvdDt1bmRlcGxveSZxdW90OywgJnF1b3Q7dXBkYXRlJnF1b3Q7Li48L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9InNvdXJjZSIgUkVRVUlSRUQ9InRvb2wgZGVwZW5kYW50Ij4KKwkJCTxERVNDUklQVElPTj5BIGZ1bGx5IHF1YWxpZmllZCBwYXRoL2ZpbGVuYW1lIG9mIHRoZSBjb21wb25lbnQgdG8gYmUgZGVwbG95ZWQuVGhpcyBtYXkgYmUgYW4gLmVhciwgLmphciwgLndhciwgb3IgYW55IG90aGVyIHR5cGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhlIHNlcnZlci48L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKwk8L1RBU0s+CisJPFRBU0sgTkFNRT0ic3BsYXNoIj4KKwkJPERFU0NSSVBUSU9OPiZsdDtwJmd0O1RoaXMgdGFzayBjcmVhdGVzIGEgc3BsYXNoIHNjcmVlbi4gVGhlIHNwbGFzaCBzY3JlZW4gaXMgZGlzcGxheWVkCitmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBidWlsZCBhbmQgaW5jbHVkZXMgYSBoYW5keSBwcm9ncmVzcyBiYXIgYXMKK3dlbGwuIFVzZSBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBzb3VuZCB0YXNrIHRvIHByb3ZpZGUgaW50ZXJlc3QKK3doaWxzdCB3YWl0aW5nIGZvciB5b3VyIGJ1aWxkcyB0byBjb21wbGV0ZS4uLiZsdDsvcCZndDsKKzwvREVTQ1JJUFRJT04+CisJCTxBVFRSSUJVVEUgTkFNRT0iaW1hZ2V1cmwiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+QSBVUkwgcG9pbnRpbmcgdG8gYW4gaW1hZ2UgdG8gZGlzcGxheTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0ic2hvd2R1cmF0aW9uIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPkluaXRpYWwgcGVyaW9kIHRvIHBhdXNlIHRoZSBidWlsZCB0byBzaG93IHRoZXNwbGFzaCBpbiBtaWxsaXNlY29uZHM8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKwk8L1RBU0s+CisJPFRBU0sgTkFNRT0ic3R5bGVib29rIj4KKwkJPERFU0NSSVBUSU9OPiZsdDtwJmd0O1RoaXMgZXhlY3V0ZXMgdGhlIGFwYWNoZSBTdHlsZWJvb2sgZG9jdW1lbnRhdGlvbiBnZW5lcmF0b3IuIAorVW5saWtlIHRoZSBjb21tYW5kbGluZSB2ZXJzaW9uIG9mIHRoaXMgdG9vbCwgYWxsIHRocmVlIGFyZ3VtZW50cworYXJlIHJlcXVpcmVkIHRvIHJ1biBzdHlsZWJvb2suJmx0Oy9wJmd0OworJmx0O3AmZ3Q7Jmx0O2ImZ3Q7Tm90ZTombHQ7L2ImZ3Q7IFRoaXMgdGFzayBkZXBlbmRzIG9uIGV4dGVybmFsIGxpYnJhcmllcyBub3QgaW5jbHVkZWQgaW4gdGhlIEFudCBkaXN0cmlidXRpb24uCitTZWUgJmx0O2EgaHJlZj0mcXVvdDsuLi9pbnN0YWxsLmh0bWwjbGlicmFyeWRlcGVuZGVuY2llcyZxdW90OyZndDtMaWJyYXJ5IERlcGVuZGVuY2llcyZsdDsvYSZndDsgZm9yIG1vcmUgaW5mb3JtYXRpb24uJmx0Oy9wJmd0OworJmx0O3AmZ3Q7CitCZWluZyBleHRlbmRlZCBmcm9tICZhbXA7bHQ7SmF2YSZhbXA7Z3Q7LCBhbGwgdGhlIHBhcmVudCdzIGF0dHJpYnV0ZXMKK2FuZCBvcHRpb25zIGFyZSBhdmFpbGFibGUuIERvIG5vdCBzZXQgYW55IGFwYXJ0IGZyb20gdGhlICZsdDt0dCZndDtjbGFzc3BhdGgmbHQ7L3R0Jmd0OworYXMgdGhleSBhcmUgbm90IGd1YXJhbnRlZWQgdG8gYmUgdGhlcmUgaW4gZnV0dXJlLgorJmx0Oy9wJmd0OworPC9ERVNDUklQVElPTj4KKwkJPEFUVFJJQlVURSBOQU1FPSJib29rIiBSRVFVSVJFRD0ieWVzIj4KKwkJCTxERVNDUklQVElPTj50aGUgYm9vayB4bWwgZmlsZSB0aGF0IHRoZSBkb2N1bWVudGF0aW9uIGdlbmVyYXRpb24gc3RhcnRzIGZyb208L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9InNraW5kaXJlY3RvcnkiIFJFUVVJUkVEPSJ5ZXMiPgorCQkJPERFU0NSSVBUSU9OPnRoZSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyB0aGUgc3R5bGVib29rIHNraW48L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9InRhcmdldGRpcmVjdG9yeSIgUkVRVUlSRUQ9InllcyI+CisJCQk8REVTQ1JJUFRJT04+dGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSB3aGVyZSB0aGUgZG9jdW1lbnRhdGlvbiBpcyBnZW5lcmF0ZWQgPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisJPC9UQVNLPgorCTxUQVNLIE5BTUU9InRlbG5ldCI+CisJCTxERVNDUklQVElPTj5UYXNrIHRvIGF1dG9tYXRlIGEgcmVtb3RlIHRlbG5ldCBzZXNzaW9uLiBUaGUgdGFzayB1c2VzIAorbmVzdGVkICZsdDt0dCZndDsmYW1wO2x0O3JlYWQmYW1wO2d0OyZsdDsvdHQmZ3Q7IHRvIGluZGljYXRlIHN0cmluZ3MgdG8gd2FpdCBmb3IsIGFuZAorJmx0O3R0Jmd0OyZhbXA7bHQ7d3JpdGUmYW1wO2d0OyZsdDsvdHQmZ3Q7IHRhZ3MgdG8gc3BlY2lmeSB0ZXh0IHRvIHNlbmQuICAKKyZsdDtwJmd0O0lmIHlvdSBkbyBzcGVjaWZ5IGEgdXNlcmlkIGFuZCBwYXNzd29yZCwgdGhlIHN5c3RlbSB3aWxsIAorYXNzdW1lIGEgY29tbW9uIHVuaXggcHJvbXB0IHRvIHdhaXQgb24uIFRoaXMgYmVoYXZpb3IgY2FuIGJlIGVhc2lseSBvdmVyLXJpZGRlbi4mbHQ7L3AmZ3Q7CismbHQ7cCZndDsmbHQ7YiZndDtOb3RlOiZsdDsvYiZndDsgVGhpcyB0YXNrIGRlcGVuZHMgb24gZXh0ZXJuYWwgbGlicmFyaWVzIG5vdCBpbmNsdWRlZCBpbiB0aGUgQW50IGRpc3RyaWJ1dGlvbi4KK1NlZSAmbHQ7YSBocmVmPSZxdW90Oy4uL2luc3RhbGwuaHRtbCNsaWJyYXJ5ZGVwZW5kZW5jaWVzJnF1b3Q7Jmd0O0xpYnJhcnkgRGVwZW5kZW5jaWVzJmx0Oy9hJmd0OyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4mbHQ7L3AmZ3Q7Cis8L0RFU0NSSVBUSU9OPgorCQk8QVRUUklCVVRFIE5BTUU9InVzZXJpZCIgUkVRVUlSRUQ9Im9ubHkgaWYgcGFzc3dvcmQgaXMgc3BlY2lmaWVkIj4KKwkJCTxERVNDUklQVElPTj50aGUgbG9naW4gaWQgdG8gdXNlIG9uIHRoZSB0ZWxuZXQgc2VydmVyPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJwYXNzd29yZCIgUkVRVUlSRUQ9Im9ubHkgaWYgdXNlcmlkIGlzIHNwZWNpZmllZCI+CisJCQk8REVTQ1JJUFRJT04+dGhlIGxvZ2luIHBhc3N3b3JkIHRvIHVzZSBvbiB0aGUgdGVsbmV0IHNlcnZlcjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0ic2VydmVyIiBSRVFVSVJFRD0ieWVzIj4KKwkJCTxERVNDUklQVElPTj50aGUgYWRkcmVzcyBvZiB0aGUgcmVtb3RlIHRlbG5ldCBzZXJ2ZXI8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9InBvcnQiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+dGhlIHBvcnQgbnVtYmVyIG9mIHRoZSByZW1vdGUgdGVsbmV0IHNlcnZlci4gRGVmYXVsdHMgdG8gcG9ydCAyMzwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iaW5pdGlhbGNyIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPnNlbmQgYSBjciBhZnRlciBjb25uZWN0aW5nICgmcXVvdDt5ZXMmcXVvdDspLiBEZWZhdWx0cyB0byAmcXVvdDtubyZxdW90OzwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0idGltZW91dCIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5zZXQgYSBkZWZhdWx0IHRpbWVvdXQgdG8gd2FpdCBmb3IgYSByZXNwb25zZS4gU3BlY2lmaWVkIGluIHNlY29uZHMuIERlZmF1bHQgaXMgbm8gdGltZW91dDwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCTwvVEFTSz4KKwk8VEFTSyBOQU1FPSJ0ZXN0Ij4KKwkJPERFU0NSSVBUSU9OPiZsdDtwJmd0O1RoaXMgaXMgYSBwcmltaXRpdmUgdGFzayB0byBleGVjdXRlIGEgdW5pdCB0ZXN0IGluIHRoZSBvcmcuYXBhY2hlLnRlc3RsZXQgZnJhbWV3b3JrLiZsdDsvcCZndDsKKyZsdDtwJmd0OyZsdDtzdHJvbmcmZ3Q7Tm90ZTombHQ7L3N0cm9uZyZndDsgVGhpcyB0YXNrIGRlcGVuZHMgb24gZXh0ZXJuYWwgbGlicmFyaWVzIG5vdCBpbmNsdWRlZAoraW4gdGhlIEFudCBkaXN0cmlidXRpb24uICBTZWUgJmx0O2EgaHJlZj0mcXVvdDsuLi9pbnN0YWxsLmh0bWwjbGlicmFyeWRlcGVuZGVuY2llcyZxdW90OyZndDsKK0xpYnJhcnkgRGVwZW5kZW5jaWVzJmx0Oy9hJmd0OyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyZsdDsvcCZndDsKKzwvREVTQ1JJUFRJT04+CisJCTxBVFRSSUJVVEUgTkFNRT0ic2hvd3N1Y2Nlc3MiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+YSBib29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0ZXN0cyBzaG91bGQgZGlzcGxheSBhIG1lc3NhZ2Ugb24gc3VjY2VzczwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0ic2hvd2Jhbm5lciIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5hIGJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIGEgYmFubmVyIHNob3VsZCBiZSBkaXNwbGF5ZWQgd2hlbiBzdGFydGluZyB0ZXN0bGV0IGVuZ2luZTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZm9yY2VzaG93dHJhY2UiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+YSBib29sZWFuIGluZGljYXRpbmcgdGhhdCBhIHN0YWNrIHRyYWNlIGlzIGRpc3BsYXllZCBvbiBhbnkgZmFpbHVyZTwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0ic2hvd3RyYWNlIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPmEgYm9vbGVhbiBpbmRpY2F0aW5nIHRoYXQgYSBzdGFjayB0cmFjZSBpcyBkaXNwbGF5ZWQgb24gZXJyb3IgKGJ1dCBub3Qgbm9ybWFsIGZhaWx1cmUpPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisJPC9UQVNLPgorCTxUQVNLIE5BTUU9InRyYW5zbGF0ZSI+CisJCTxERVNDUklQVElPTj4mbHQ7cCZndDtJZGVudGlmaWVzIGtleXMgaW4gZmlsZXMgZGVsaW1pdGVkIGJ5IHNwZWNpYWwgdG9rZW5zCithbmQgdHJhbnNsYXRlcyB0aGVtIHdpdGggdmFsdWVzIHJlYWQgZnJvbSByZXNvdXJjZSBidW5kbGVzLgorJmx0Oy9wJmd0OworJmx0O3AmZ3Q7CitBIHJlc291cmNlIGJ1bmRsZSBjb250YWlucyBsb2NhbGUtc3BlY2lmaWMga2V5LXZhbHVlIHBhaXJzLgorQSByZXNvdXJjZSBidW5kbGUgaXMgYSBoaWVyYXJjaGljYWwgc2V0IG9mIHByb3BlcnR5IGZpbGVzLgorQSBidW5kbGUgbmFtZSBtYWtlcyB1cCBpdHMgYmFzZSBmYW1pbHkgbmFtZS4gIEVhY2ggZmlsZSB0aGF0CittYWtlcyB1cCB0aGlzIGJ1bmRsZSBoYXMgdGhpcyBuYW1lIHBsdXMgaXRzIGxvY2FsZS4gIEZvciBleGFtcGxlLAoraWYgdGhlIHJlc291cmNlIGJ1bmRsZSBuYW1lIGlzIE15UmVzb3VyY2VzLCB0aGUgZmlsZSB0aGF0IGNvbnRhaW5zCitHZXJtYW4gdGV4dCB3aWxsIHRha2UgdGhlIG5hbWUgTXlSZXNvdXJjZXNfZGUuICBJbiBhZGRpdGlvbiB0bworbGFuZ3VhZ2UsIGNvdW50cnkgYW5kIHZhcmlhbnQgYXJlIGFsc28gdXNlZCB0byBmb3JtIHRoZSBmaWxlcyBpbgordGhlIGJ1bmRsZS4KKyZsdDsvcCZndDsKKyZsdDtwJmd0OworVGhlIHJlc291cmNlIGJ1bmRsZSBsb29rdXAgc2VhcmNoZXMgZm9yIHJlc291cmNlIGZpbGVzIHdpdGggdmFyaW91cworc3VmZml4ZXMgb24gdGhlIGJhc2lzIG9mICgxKSB0aGUgZGVzaXJlZCBsb2NhbGUgYW5kICgyKSB0aGUgZGVmYXVsdAorbG9jYWxlIChiYXNlYnVuZGxlbmFtZSksIGluIHRoZSBmb2xsb3dpbmcgb3JkZXIgZnJvbSBsb3dlci1sZXZlbAorKG1vcmUgc3BlY2lmaWMpIHRvIHBhcmVudC1sZXZlbCAobGVzcyBzcGVjaWZpYyk6CismbHQ7L3AmZ3Q7CismbHQ7cHJlJmd0OworYmFzZWJ1bmRsZW5hbWUgKyAmYW1wO3F1b3Q7XyZhbXA7cXVvdDsgKyBsYW5ndWFnZTEgKyAmYW1wO3F1b3Q7XyZhbXA7cXVvdDsgKyBjb3VudHJ5MSArICZhbXA7cXVvdDtfJmFtcDtxdW90OyArIHZhcmlhbnQxCitiYXNlYnVuZGxlbmFtZSArICZhbXA7cXVvdDtfJmFtcDtxdW90OyArIGxhbmd1YWdlMSArICZhbXA7cXVvdDtfJmFtcDtxdW90OyArIGNvdW50cnkxCitiYXNlYnVuZGxlbmFtZSArICZhbXA7cXVvdDtfJmFtcDtxdW90OyArIGxhbmd1YWdlMQorYmFzZWJ1bmRsZW5hbWUKK2Jhc2VidW5kbGVuYW1lICsgJmFtcDtxdW90O18mYW1wO3F1b3Q7ICsgbGFuZ3VhZ2UyICsgJmFtcDtxdW90O18mYW1wO3F1b3Q7ICsgY291bnRyeTIgKyAmYW1wO3F1b3Q7XyZhbXA7cXVvdDsgKyB2YXJpYW50MgorYmFzZWJ1bmRsZW5hbWUgKyAmYW1wO3F1b3Q7XyZhbXA7cXVvdDsgKyBsYW5ndWFnZTIgKyAmYW1wO3F1b3Q7XyZhbXA7cXVvdDsgKyBjb3VudHJ5MgorYmFzZWJ1bmRsZW5hbWUgKyAmYW1wO3F1b3Q7XyZhbXA7cXVvdDsgKyBsYW5ndWFnZTIKKyZsdDsvcHJlJmd0OworJmx0O3AmZ3Q7CitUaGUgZmlsZSBuYW1lcyBnZW5lcmF0ZWQgdGh1cyBhcmUgYXBwZW5kZWQgd2l0aCB0aGUgc3RyaW5nICZhbXA7cXVvdDsucHJvcGVydGllcyZhbXA7cXVvdDsKK3RvIG1ha2UgdXAgdGhlIGZpbGUgbmFtZXMgdGhhdCBhcmUgdG8gYmUgdXNlZC4KKyZsdDsvcCZndDsKKyZsdDtwJmd0OworRmlsZSBlbmNvZGluZyBpcyBzdXBwb3J0ZWQuICBUaGUgZW5jb2Rpbmcgc2NoZW1lIG9mIHRoZSBzb3VyY2UgZmlsZXMsCitkZXN0aW5hdGlvbiBmaWxlcyBhbmQgdGhlIGJ1bmRsZSBmaWxlcyBjYW4gYmUgc3BlY2lmaWVkLgorRGVzdGluYXRpb24gZmlsZXMgY2FuIGJlIGV4bGljaXRseSBvdmVyd3JpdHRlbiB1c2luZyB0aGUKKyZsdDt2YXImZ3Q7Zm9yY2VvdmVyd3JpdGUmbHQ7L3ZhciZndDsgYXR0cmlidXRlLiAgSWYgJmx0O3ZhciZndDtmb3JjZW92ZXJ3cml0ZSZsdDsvdmFyJmd0OworaXMgZmFsc2UsIHRoZSBkZXN0aW5hdGlvbiBmaWxlIGlzIG92ZXJ3cml0dGVuIG9ubHkgaWYgZWl0aGVyIHRoZQorc291cmNlIGZpbGUgb3IgYW55IG9mIHRoZSBmaWxlcyB0aGF0IG1ha2UgdXAgdGhlIGJ1bmRsZSBoYXZlIGJlZW4KK21vZGlmaWVkIGFmdGVyIHRoZSBkZXN0aW5hdGlvbiBmaWxlIHdhcyBsYXN0IG1vZGlmaWVkLgorJmx0Oy9wJmd0OworJmx0O3AmZ3Q7Jmx0O2EgaHJlZj0mcXVvdDsuLi9Db3JlVHlwZXMvZmlsZXNldC5odG1sJnF1b3Q7Jmd0O0ZpbGVTZXQmbHQ7L2EmZ3Q7cyBhcmUgdXNlZCB0byBzZWxlY3QgZmlsZXMgdG8KK3RyYW5zbGF0ZS4KKyZsdDsvcCZndDsKKzwvREVTQ1JJUFRJT04+CisJCTxBVFRSSUJVVEUgTkFNRT0idG9kaXIiIFJFUVVJUkVEPSJ5ZXMiPgorCQkJPERFU0NSSVBUSU9OPkRlc3RpbmF0aW9uIGRpcmVjdG9yeSB3aGVyZSBkZXN0aW5hdGlvbiBmaWxlcyBhcmV0byBiZSBjcmVhdGVkPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJzdGFydHRva2VuIiBSRVFVSVJFRD0ieWVzIj4KKwkJCTxERVNDUklQVElPTj5UaGUgc3RhcnRpbmcgdG9rZW4gdG8gaWRlbnRpZnkga2V5czwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZW5kdG9rZW4iIFJFUVVJUkVEPSJ5ZXMiPgorCQkJPERFU0NSSVBUSU9OPlRoZSBlbmRpbmcgdG9rZW4gdG8gaWRlbnRpZnkga2V5czwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iYnVuZGxlIiBSRVFVSVJFRD0ieWVzIj4KKwkJCTxERVNDUklQVElPTj5GYW1pbHkgbmFtZSBvZiByZXNvdXJjZSBidW5kbGU8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImJ1bmRsZWxhbmd1YWdlIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPkxvY2FsZSBzcGVjaWZpYyBsYW5ndWFnZSBvZiByZXNvdXJjZSBidW5kbGUuICBEZWZhdWx0cyB0b2RlZmF1bHQgbG9jYWxlJ3MgbGFuZ3VhZ2UuPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJidW5kbGVjb3VudHJ5IiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPkxvY2FsZSBzcGVjaWZpYyBjb3VudHJ5IG9mIHJlc291cmNlIGJ1bmRsZS4gIERlZmF1bHRzIHRvZGVmYXVsdCBsb2NhbGUncyBjb3VudHJ5LjwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iYnVuZGxldmFyaWFudCIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5Mb2NhbGUgc3BlY2lmaWMgdmFyaWFudCBvZiByZXNvdXJjZSBidW5kbGUuICBEZWZhdWx0cyB0b3RoZSBkZWZhdWx0IHZhcmlhbnQgb2YgdGhlIGNvdW50cnkgYW5kIGxhbmd1YWdlIGJlaW5nIHVzZWQuPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJzcmNlbmNvZGluZyIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5Tb3VyY2UgZmlsZSBlbmNvZGluZyBzY2hlbWUuICBEZWZhdWx0cyB0b3N5c3RlbSBkZWZhdWx0IGZpbGUgZW5jb2Rpbmc8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImRlc3RlbmNvZGluZyIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj5EZXN0aW5hdGlvbiBmaWxlIGVuY29kaW5nIHNjaGVtZS4gIERlZmF1bHRzIHRvc291cmNlIGZpbGUgZW5jb2Rpbmc8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImJ1bmRsZWVuY29kaW5nIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPlJlc291cmNlIEJ1bmRsZSBmaWxlIGVuY29kaW5nIHNjaGVtZS4gIERlZmF1bHRzIHRvc291cmNlIGZpbGUgZW5jb2Rpbmc8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImZvcmNlb3ZlcndyaXRlIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPk92ZXJ3cml0ZSBleGlzdGluZyBmaWxlcyBldmVuIGlmIHRoZSBkZXN0aW5hdGlvbmZpbGVzIGFyZSBuZXdlci4gRGVmYXVsdHMgdG8gJnF1b3Q7bm8mcXVvdDs8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKwk8L1RBU0s+CisJPFRBU0sgTkFNRT0id2xqc3BjIj4KKwkJPERFU0NSSVBUSU9OPiZsdDtwJmd0O0NsYXNzIHRvIHByZWNvbXBpbGUgSlNQJ3MgdXNpbmcgd2VibG9naWMncyBqc3AgY29tcGlsZXIgKHdlYmxvZ2ljLmpzcGMpJmx0Oy9wJmd0OworVGVzdGVkIG9ubHkgb24gV2VibG9naWMgNC41LjEgLSBOVDQuMCBhbmQgU29sYXJpcyA1LjcsNS44Jmx0O2JyJmd0OworPC9ERVNDUklQVElPTj4KKwkJPEFUVFJJQlVURSBOQU1FPSJzcmMiIFJFUVVJUkVEPSJ5ZXMiPgorCQkJPERFU0NSSVBUSU9OPm9vdCBvZiBzb3VyY2UgdHJlZSBmb3IgSlNQLCBpZSwgdGhlIGRvY3VtZW50IHJvb3QgZm9yIHlvdXIgd2VibG9naWMgc2VydmU8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImRlc3QiIFJFUVVJUkVEPSJ5ZXMiPgorCQkJPERFU0NSSVBUSU9OPnJvb3Qgb2YgZGVzdGluYXRpb24gZGlyZWN0b3J5LCB3aGF0IHlvdSBoYXZlIHNldCBhcyBXb3JraW5nRGlyIGluIHRoZSB3ZWJsb2dpYyBwcm9wZXJ0aWU8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9InBhY2thZ2UiIFJFUVVJUkVEPSJ5ZXMiPgorCQkJPERFU0NSSVBUSU9OPnN0YXJ0IHBhY2thZ2UgbmFtZSB1bmRlciB3aGljaCB5b3VyIEpTUCdzIHdvdWxkIGJlIGNvbXBpbGU8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImNsYXNzcGF0aCIgUkVRVUlSRUQ9InllcyI+CisJCQk8REVTQ1JJUFRJT04+Q2xhc3MgcGF0aCB0byB1c2Ugd2hlbiBjb21waWxpbmcganNwJzwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCTwvVEFTSz4KKwk8VEFTSyBOQU1FPSJ4bWx2YWxpZGF0ZSI+CisJCTxERVNDUklQVElPTj4mbHQ7cCZndDtUaGlzIHRhc2sgY2hlY2tzIHhtbCBmaWxlcyBhcmUgdmFsaWQgKG9yIG9ubHkgd2VsbCBmb3JtZWQpLiBUaGUKK3Rhc2sgdXNlcyB0aGUgU0FYMiBwYXJzZXIgaW1wbGVtZW50YXRpb24gcHJvdmlkZWQgYnkgSkFYUCBieSBkZWZhdWx0CisocHJvYmFibHkgdGhlIG9uZSB0aGF0IGlzIHVzZWQgYnkgQW50IGl0c2VsZiksIGJ1dCBvbmUgY2FuIHNwZWNpZnkgYW55CitTQVgxLzIgcGFyc2VyIGlmIG5lZWRlZC4mbHQ7L3AmZ3Q7CismbHQ7cCZndDtUaGlzIHRhc2sgc3VwcG9ydHMgdGhlIHVzZSBvZiBuZXN0ZWQgJmx0O2EKK2hyZWY9JnF1b3Q7Li4vQ29yZVR5cGVzL3htbGNhdGFsb2cuaHRtbCZxdW90OyZndDt4bWxjYXRhbG9nJmx0Oy9hJmd0OyBlbGVtZW50cyBhbmQvb3IgbmVzdGVkCismbHQ7dHQmZ3Q7JmFtcDtsdDtkdGQmYW1wO2d0OyZsdDsvdHQmZ3Q7IGVsZW1lbnRzIHdoaWNoIGFyZSB1c2VkIHRvIHJlc29sdmUgRFREcyBhbmQgZW50aXRpZXMuJmx0Oy9wJmd0OworPC9ERVNDUklQVElPTj4KKwkJPEFUVFJJQlVURSBOQU1FPSJmaWxlIiBSRVFVSVJFRD0ibm8iPgorCQkJPERFU0NSSVBUSU9OPnRoZSBmaWxlKHMpIHlvdSB3YW50IHRvIGNoZWNrLiAob3B0aW9uYWxseSBjYW4gdXNlIGFuIGVtYmVkZGVkIGZpbGVzZXQ8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImxlbmllbnQiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+aWYgdHJ1ZSwgb25seSBjaGVjayB0aGUgeG1sIGRvY3VtZW50IGlzIHdlbGwgZm9ybWVkKGlnbm9yZWQgaWYgdGhlIHNwZWNpZmllZCBwYXJzZXIgaXMgYXMgU0FYMSBwYXJzZXIpPC9ERVNDUklQVElPTj4KKwkJPC9BVFRSSUJVVEU+CisKKwkJPEFUVFJJQlVURSBOQU1FPSJjbGFzc25hbWUiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+dGhlIHBhcnNlciB0byB1c2U8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9ImNsYXNzcGF0aHJlZiIgUkVRVUlSRUQ9Im5vIj4KKwkJCTxERVNDUklQVElPTj53aGVyZSB0byBmaW5kIHRoZSBwYXJzZXIgY2xhc3MuIE9wdGlvbmFsbHkgY2FuIHVzZSBhbiBlbWJlZGRlZCBjbGFzc3BhdGggZWxlbWVudDwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCisJCTxBVFRSSUJVVEUgTkFNRT0iZmFpbG9uZXJyb3IiIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+ZmFpbHMgb24gYSBlcnJvciBpZiBzZXQgdG8gdHJ1ZSAoZGVmYXVsdHMgdG8gdHJ1ZSk8L0RFU0NSSVBUSU9OPgorCQk8L0FUVFJJQlVURT4KKworCQk8QVRUUklCVVRFIE5BTUU9Indhcm4iIFJFUVVJUkVEPSJubyI+CisJCQk8REVTQ1JJUFRJT04+bG9nIHBhcnNlciB3YXJuIGV2ZW50czwvREVTQ1JJUFRJT04+CisJCTwvQVRUUklCVVRFPgorCTwvVEFTSz4KKzwvVEFTS1M+CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2R0ZC9BbnREVERNZXNzYWdlcy5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9kdGQvQW50RFRETWVzc2FnZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODY2OTc1Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9kdGQvQW50RFRETWVzc2FnZXMuamF2YQpAQCAtMCwwICsxLDI0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCisgKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKKyAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6IAorICogSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmR0ZDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CisKK3B1YmxpYyBjbGFzcyBBbnREVERNZXNzYWdlcyBleHRlbmRzIE5MUyB7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5kdGQuQW50RFRETWVzc2FnZXMiOy8vJE5PTi1OTFMtMSQKKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBhcnNlcl9YTUxfcGFyc2VyX2RvZXNfbm90X3N1cHBvcnRfRGVjbEhhbmRsZXJfMTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBQYXJzZXJfRXJyb3JfcGFyc2luZ19YTUxfZG9jdW1lbnRfb3JfRFREXzI7CisKKwlzdGF0aWMgeworCQkvLyBsb2FkIG1lc3NhZ2UgdmFsdWVzIGZyb20gYnVuZGxlIGZpbGUKKwkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgQW50RFRETWVzc2FnZXMuY2xhc3MpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2R0ZC9BbnREVERNZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9kdGQvQW50RFRETWVzc2FnZXMucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWE5YzM1Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9kdGQvQW50RFRETWVzc2FnZXMucHJvcGVydGllcwpAQCAtMCwwICsxLDEzIEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyMKKyMgQ29udHJpYnV0b3JzOgorIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK1BhcnNlcl9YTUxfcGFyc2VyX2RvZXNfbm90X3N1cHBvcnRfRGVjbEhhbmRsZXJfMT1YTUwgcGFyc2VyIGRvZXMgbm90IHN1cHBvcnQgRGVjbEhhbmRsZXIKK1BhcnNlcl9FcnJvcl9wYXJzaW5nX1hNTF9kb2N1bWVudF9vcl9EVERfMj1FcnJvciBwYXJzaW5nIFhNTCBkb2N1bWVudCBvciBEVEQKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZHRkL0lBdG9tLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2R0ZC9JQXRvbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMzYzMGEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2R0ZC9JQXRvbS5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDUgT2JqZWN0IEZhY3RvcnkgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqCQlPYmplY3QgRmFjdG9yeSBJbmMuIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5kdGQ7CisKKy8qKgorICogU2NoZW1hIGF0b20gaW50ZXJmYWNlLgorICogQGF1dGhvciBCb2IgRm9zdGVyCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSUF0b20geworCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRUxFTUVOVCA9IDA7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVRUUklCVVRFID0gMTsKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIGF0b20gbmFtZS4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIGF0b20gbmFtZS4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCk7Cit9CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2R0ZC9JQXR0cmlidXRlLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2R0ZC9JQXR0cmlidXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZmNzk0MwotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZHRkL0lBdHRyaWJ1dGUuamF2YQpAQCAtMCwwICsxLDY0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA1IE9iamVjdCBGYWN0b3J5IEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKgkJT2JqZWN0IEZhY3RvcnkgSW5jLiAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZHRkOworCisvKioKKyAqIFNjaGVtYSBhdHRyaWJ1dGUgaW50ZXJmYWNlLgorICogQGF1dGhvciBCb2IgRm9zdGVyCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSUF0dHJpYnV0ZSBleHRlbmRzIElBdG9tIHsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENEQVRBID0gIkNEQVRBIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIklEIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEUkVGID0gIklEUkVGIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEUkVGUyA9ICJJRFJFRlMiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk1UT0tFTiA9ICJOTVRPS0VOIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5NVE9LRU5TID0gIk5NVE9LRU5TIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWSA9ICJFTlRJVFkiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRJRVMgPSAiRU5USVRJRVMiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9UQVRJT04gPSAiTk9UQVRJT04iOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5VTUVSQVRJT04gPSAiZW51bWVyYXRpb24iOyAvLyROT04tTkxTLTEkCisJCisJLyoqCisJICogQHJldHVybiB0aGUgYXR0cmlidXRlIHR5cGUuIFRoaXMgd2lsbCBiZSBvbmUgb2YgIkNEQVRBIiwgIklEIiwgIklEUkVGIiwKKwkgKiAiSURSRUZTIiwgIk5NVE9LRU4iLCAiTk1UT0tFTlMiLCAiRU5USVRZIiwgIkVOVElUSUVTIiwgIk5PVEFUSU9OIiBvcgorCSAqICJlbnVtZXJhdGlvbiIuIFRoZSB0eXBlIGlzIGludGVybmVkIGFuZCBtYXkgYmUgY29tcGFyZWQgdG8gYSBjb25zdGFudAorCSAqIHdpdGggPT0uIEZvciAiTk9UQVRJT04iIG9yICJlbnVtZXJhdGlvbiIsIDxjb2RlPmdldEVudW0oKTwvY29kZT4gd2lsbAorCSAqIHJldHVybiBhIGxpc3Qgb2YgdmFsdWVzLgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpOworCQorCS8qKgorCSAqIAorCSAqIEByZXR1cm4gU3RyaW5nW10gb3IgbnVsbCBpZiB0eXBlIGlzIG5vdCAiTk9UQVRJT04iIG9yICJFTlVNRVJBVElPTiIuCisJICovCisJcHVibGljIFN0cmluZ1tdIGdldEVudW0oKTsKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIGVsZW1lbnQgdGhlIGF0dHJpYnV0ZSBpcyBkZWZpbmVkIGluLgorCSAqLworCXB1YmxpYyBJRWxlbWVudCBnZXRFbGVtZW50KCk7CisJCisJLyoqCisJICogUmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlIG9yIG51bGwgaWYgbm9uZS4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHQoKTsKKwkKKwkvKioKKwkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZGVmYXVsdCB2YWx1ZSBpcyBmaXhlZC4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0ZpeGVkKCk7CisJCisJLyoqCisJICogUmV0dXJuIHRydWUgaWYgYXR0cmlidXRlIGlzIHJlcXVpcmVkLCBmYWxzZSBpZiBpdCBpcyBvcHRpb25hbC4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1JlcXVpcmVkKCk7Cit9CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2R0ZC9JRGZtLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2R0ZC9JRGZtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk5MjNkZgotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZHRkL0lEZm0uamF2YQpAQCAtMCwwICsxLDg2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA1IE9iamVjdCBGYWN0b3J5IEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKgkJT2JqZWN0IEZhY3RvcnkgSW5jLiAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZHRkOworCisvKioKKyAqIEEgRGZtIGlzIGFuIElNb2RlbCBjb252ZXJ0ZWQgdG8gYSBmb3JtIG1vcmUgYXBwcm9wcmlhdGUgZm9yCisgKiB2YWxpZGF0aW9uLiBUaGUgd2hvbGUgcG9pbnQgb2YgYSBEZm0gaXMgdG8gcnVuIGZhc3QuCisgKiBAYXV0aG9yIEJvYiBGb3N0ZXIKKyAqLworcHVibGljIGludGVyZmFjZSBJRGZtIHsKKworCS8qKgorCSAqIFJldHVybiB0cnVlIGlmIG5vIGZ1cnRoZXIgc3ltYm9scyBhcmUgcmVxdWlyZWQuCisJICovCisJYm9vbGVhbiBpc0FjY2VwdGluZygpOworCQorCS8qKgorCSAqIElmIHRoZSBzeW1ib2wgcmVwcmVzZW50ZWQgYnkgbmFtZSBpcyBhY2NlcHRhYmxlLAorCSAqIHJldHVybiB0aGUgZGZtIHRvIGFwcGx5IHRvIHRoZSBuZXh0IChjaGlsZCkgc3ltYm9sLgorCSAqIE90aGVyd2lzZSwgcmV0dXJuIG51bGwuCisJICovCisJSURmbSBhZHZhbmNlKFN0cmluZyBuYW1lKTsKKwkKKwkvKioKKwkgKiBJZiB0aGUgc3ltYm9sIHJlcHJlc2VudGVkIGJ5IHRoZSBuYW1lc3BhY2UsbmFtZSBwYWlyIGlzIGFjY2VwdGFibGUsCisJICogcmV0dXJuIHRoZSBkZm0gdG8gYXBwbHkgdG8gdGhlIG5leHQgKGNoaWxkKSBzeW1ib2wuIE90aGVyd2lzZSwgcmV0dXJuCisJICogbnVsbC4KKwkgKi8KKwlJRGZtIGFkdmFuY2UoU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGxvY2FsbmFtZSk7CisJCisJLyoqCisJICogSWYgdGhlIHN5bWJvbCByZXByZXNlbnRlZCBieSBuYW1lIGlzIGFjY2VwdGFibGUKKwkgKiB0byA8Y29kZT5hZHZhbmNlKCk8L2NvZGU+CisJICogcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIGF0b20uCisJICogT3RoZXJ3aXNlLCByZXR1cm4gbnVsbC4KKwkgKi8KKwlJQXRvbSBnZXRBdG9tKFN0cmluZyBuYW1lKTsKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIHN5bWJvbHMgZm9yIHdoaWNoIDxjb2RlPmFkdmFuY2UoKTwvY29kZT4KKwkgKiB3aWxsIHJldHVybiBhIG5leHQgZGZtLiBJZiBubyBzeW1ib2xzIHdpbGwKKwkgKiBhZHZhbmNlIHRoaXMgZGZtIG9yIGlmIGFueSBzeW1ib2wgd2lsbCwgcmV0dXJucworCSAqIGFuIGVtcHR5IGFycmF5LiBVc2UgPGNvZGU+aXNBbnkoKTwvY29kZT4gYW5kCisJICogPGNvZGU+aXNFbXB0eSgpPC9jb2RlPiB0byBkaXNhbWJpZ3VhdGUgdGhlCisJICogY2FzZXMuCisJICovCisJU3RyaW5nW10gZ2V0QWNjZXB0cygpOworCQorCS8qKgorCSAqIFJldHVybiB0aGUgc3ltYm9scyBmb3Igd2hpY2ggPGNvZGU+YWR2YW5jZSgpPC9jb2RlPgorCSAqIHdpbGwgcmV0dXJuIGEgbmV4dCBkZm0uIElmIG5vIHN5bWJvbHMgd2lsbAorCSAqIGFkdmFuY2UgdGhpcyBkZm0gb3IgaWYgYW55IHN5bWJvbCB3aWxsLCByZXR1cm5zCisJICogbnVsbC4gVXNlIDxjb2RlPmlzQW55KCk8L2NvZGU+IGFuZAorCSAqIDxjb2RlPmlzRW1wdHkoKTwvY29kZT4gdG8gZGlzYW1iaWd1YXRlIHRoZQorCSAqIGNhc2VzLgorCSAqLworCU9iamVjdFtdIGdldEtleXMoKTsKKwkKKwkvKioKKwkgKiBSZXR1cm4gdHJ1ZSBpZiBkZm0gd2lsbCBhY2NlcHQgYW55IHN5bWJvbAorCSAqIGFuZCByZXR1cm4gaXRzZWxmOyBmYWxzZSBvdGhlcndpc2UuCisJICogVGhpcyBpbnRlcmZhY2Uga2VlcHMgdGhlIGRmbSBmcm9tIG5lZWRpbmcKKwkgKiBzY2hlbWEga25vd2xlZGdlLCBidXQgYSBiZXR0ZXIgd2F5IHRvCisJICogcHJvY2VzcyBhbiBBTlkgZGZtIGZvciBlbGVtZW50cyBpcyB1c2UgdGhlIAorCSAqIHNjaGVtYSB0byBsb29rIHVwIHRoZSBlbGVtZW50IGFuZCB1c2UgaXRzIAorCSAqIGRmbSBpbnN0ZWFkIG9mIHRoaXMgb25lLgorCSAqLworCWJvb2xlYW4gaXNBbnkoKTsKKwkKKwkvKioKKwkgKiBSZXR1cm4gdHJ1ZSBpZiBkZm0gd2lsbCByZWplY3QgZXZlcnkgc3ltYm9sCisJICogKDxjb2RlPmFkdmFuY2UoKTwvY29kZT4gcmV0dXJucyBudWxsKTsKKwkgKiBmYWxzZSBvdGhlcndpc2UuIEluY2x1ZGVkIGZvciBjb21wbGV0ZW5lc3MsCisJICogc28gZXZlcnkgZWxlbWVudCBjYW4gaGF2ZSBhIGRmbSwgcmVnYXJkbGVzcworCSAqIG9mIGl0cyB0eXBlLgorCSAqLworCWJvb2xlYW4gaXNFbXB0eSgpOworfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9kdGQvSUVsZW1lbnQuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZHRkL0lFbGVtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGIzMDM5ZgotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZHRkL0lFbGVtZW50LmphdmEKQEAgLTAsMCArMSw2NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNSBPYmplY3QgRmFjdG9yeSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICoJCU9iamVjdCBGYWN0b3J5IEluYy4gLSBJbml0aWFsIGltcGxlbWVudGF0aW9uCisgKgkJSUJNIENvcnBvcmF0aW9uIC0gZml4IGZvciBCdWcgNDA5NTEKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZHRkOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworLyoqCisgKiBJRWxlbWVudCBpbnRlcmZhY2UuCisgKiBAYXV0aG9yIEJvYiBGb3N0ZXIKKyAqLworcHVibGljIGludGVyZmFjZSBJRWxlbWVudCBleHRlbmRzIElBdG9tIHsKKworCS8qKgorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZWxlbWVudCBoYXMgYmVlbiByZWZlcmVuY2VkIGluIGEgc2NoZW1hIGJ1dCBpcyBub3QKKwkgKiB5ZXQgZGVmaW5lZC4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1VuZGVmaW5lZCgpOworCQorCS8qKgorCSAqIEByZXR1cm4gdHJ1ZSBpZiBlbGVtZW50IG1vZGVsIGlzIDxjb2RlPiIoI1BDREFUQSkiPC9jb2RlPi4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1RleHQoKTsKKwkKKwkvKioKKwkgKiBAcmV0dXJuIHRydWUgaWYgZWxlbWVudCBtb2RlbCBpcyBFTVBUWS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCk7CisJCisJLyoqCisJICogQHJldHVybiB0cnVlIGlmIGVsZW1lbnQgbW9kZWwgaXMgQU5ZLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzQW55KCk7CisJCisJLyoqCisJICogQHJldHVybiB0aGUgZWxlbWVudCdzIGNvbnRlbnQgbW9kZWwuIFRoZSBjb250ZW50IG1vZGVsIHdpbGwgYmUgZW1wdHkKKwkgKiBpZiA8Y29kZT5pc1RleHQoKTwvY29kZT4sIDxjb2RlPmlzQW55KCk8L2NvZGU+IG9yIDxjb2RlPmlzRW1wdHkoKTwvY29kZT4uCisJICogTm90ZSB0aGF0IHRoZSBjb250ZW50IG1vZGVsIGRlYWxzIHdpdGggY2hpbGQgZWxlbWVudHMgb25seTsgdXNlCisJICogPGNvZGU+aXNNaXhlZCgpPC9jb2RlPiB0byBzZWUgaWYgdGV4dCBpcyBhbHNvIGFsbG93ZWQuCisJICovCisJcHVibGljIElNb2RlbCBnZXRDb250ZW50TW9kZWwoKTsKKwkKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBERk0gY29ycmVzcG9uZGluZyB0byB0aGUgY29udGVudCBtb2RlbC4gRXZlcnkgZWxlbWVudAorCSAqIGhhcyBhIERGTS4KKwkgKi8KKwlwdWJsaWMgSURmbSBnZXREZm0oKTsKKwkKKwkvKioKKwkgKiBAcmV0dXJuIE1hcCB3aXRoIGF0dHJpYnV0ZSBxbmFtZSBrZXlzIGFuZCBJQXR0ciB2YWx1ZXMuCisJICogSWYgZWxlbWVudCBoYXMgbm8gYXR0cmlidXRlcywgdGhlIG1hcCBpcyBlbXB0eS4KKwkgKiBNYXAgbXVzdCBub3QgYmUgbW9kaWZpZWQgYnkgY2FsbGVyOyBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucywKKwkgKiBpdCBpcyBub3QgYSBjb3B5LgorCSAqLworCXB1YmxpYyBNYXAgZ2V0QXR0cmlidXRlcygpOworfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9kdGQvSU1vZGVsLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2R0ZC9JTW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWU1YTVjCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9kdGQvSU1vZGVsLmphdmEKQEAgLTAsMCArMSw3OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNSBPYmplY3QgRmFjdG9yeSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICoJCU9iamVjdCBGYWN0b3J5IEluYy4gLSBJbml0aWFsIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmR0ZDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5kdGQuc2NoZW1hLk5mbTsKKworCisvKioKKyAqIENvbnRlbnQgbW9kZWwuCisgKiBUaGlzIGlzIHRoZSBwcmludGFibGUgdmVyc2lvbiBvZiB0aGUgbW9kZWwuCisgKiBUaGUgd2Fsa2FibGUgdmVyc2lvbiBpcyB0aGUgSURmbS4KKyAqIEBhdXRob3IgQm9iIEZvc3RlcgorICovCitwdWJsaWMgaW50ZXJmYWNlIElNb2RlbCB7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTktOT1dOID0gMDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVFVRU5DRSA9IDE7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0hPSUNFID0gMjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMRUFGID0gNDsKKwkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTkJPVU5ERUQgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKKwkKKwkvKioKKwkgKiBAcmV0dXJuIG9uZSBvZiBTRVFVRU5DRSwgQ0hPSUNFLCBMRUFGCisJICovCisJcHVibGljIGludCBnZXRLaW5kKCk7CisJCisJLyoqCisJICogQHJldHVybiBvbmUgb2YgMCBvciAxLgorCSAqLworCXB1YmxpYyBpbnQgZ2V0TWluT2NjdXJzKCk7CisJCisJLyoqCisJICogQHJldHVybiBvbmUgb2YgMSBvciBVTkJPVU5ERUQuCisJICovCisJcHVibGljIGludCBnZXRNYXhPY2N1cnMoKTsKKwkKKwkvKioKKwkgKiBAcmV0dXJuIGlmIFNFUVVFTkNFIG9yIENIT0lDRSByZXR1cm4gYXJyYXkgb2Ygc3ViLW1vZGVsczsgb3RoZXJ3aXNlCisJICogdW5kZWZpbmVkLgorCSAqLworCXB1YmxpYyBJTW9kZWxbXSBnZXRDb250ZW50cygpOworCQorCS8qKgorCSAqIEByZXR1cm4gaWYgTEVBRiByZXR1cm4gYXRvbTsgb3RoZXJ3aXNlIHVuZGVmaW5lZC4KKwkgKi8KKwlwdWJsaWMgSUF0b20gZ2V0TGVhZigpOworCQorCS8qKgorCSAqIEByZXR1cm4gaWYgU0VRVUVOQ0Ugb3IgQ0hPSUNFIHJldHVybiAiLCIgYW5kICJ8IiwgcmVzcGVjdGl2ZWx5OyBvdGhlcndpc2UKKwkgKiB1bmRlZmluZWQuIFVzZWZ1bCB3aGVuIHByaW50aW5nIG1vZGVsLgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0T3BlcmF0b3IoKTsKKwkKKwkvKioKKwkgKiBAcmV0dXJuIG9uZSBvZiAiIiwgIj8iLCAiKiIgb3IgIisiLiBVc2VmdWwgd2hlbiBwcmludGluZyBtb2RlbC4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFF1YWxpZmllcigpOworCQorCS8qKgorCSAqIENvbnZlcnQgY29udGVudCBtb2RlbCB0byBzdHJpbmcgcmVwcmVzZW50YXRpb24uCisJICovCisJcHVibGljIFN0cmluZyBzdHJpbmdSZXAoKTsKKwkKKwkvKioKKwkgKiBDb252ZXJ0IHRoZSBtb2RlbCB0byBhbiBOZm0gb24gZGVtYW5kLgorCSAqIEByZXR1cm4gTmZtCisJICovCisJcHVibGljIE5mbSB0b05mbSgpOworfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9kdGQvSVNjaGVtYS5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9kdGQvSVNjaGVtYS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZWQzNGQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2R0ZC9JU2NoZW1hLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNSBPYmplY3QgRmFjdG9yeSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICoJCU9iamVjdCBGYWN0b3J5IEluYy4gLSBJbml0aWFsIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmR0ZDsKKworcHVibGljIGludGVyZmFjZSBJU2NoZW1hIHsKKworCS8qKgorCSAqIEZpbmQgZWxlbWVudCBieSBuYW1lLgorCSAqIEBwYXJhbSBxbmFtZSBFbGVtZW50IG5hbWUuCisJICogQHJldHVybiBlbGVtZW50IG9yIG51bGwgaWYgbm8gc3VjaCBlbGVtZW50LgorCSAqLworCUlFbGVtZW50IGdldEVsZW1lbnQoU3RyaW5nIHFuYW1lKTsKKwkKKwkvKioKKwkgKiBAcmV0dXJuIElFbGVtZW50W10gb2YgYWxsIHZpc2libGUgZWxlbWVudHMuCisJICovCisJSUVsZW1lbnRbXSBnZXRFbGVtZW50cygpOworCQorCS8qKgorCSAqIEByZXR1cm4gRXhjZXB0aW9uIHRocm93biBieSBwYXJzZXIgd2hlbiBzY2hlbWEgd2FzIGJ1aWx0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCisJICogTm90ZSB0aGF0IHRoZSBleGNlcHRpb24gZG9lcyBub3QgbmVjZXNzYXJpbHkgbWVhbiB0aGUgc2NoZW1hIGlzCisJICogaW5jb21wbGV0ZS4KKwkgKi8KKwlFeGNlcHRpb24gZ2V0RXJyb3JFeGNlcHRpb24oKTsKK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZHRkL1BhcnNlRXJyb3IuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZHRkL1BhcnNlRXJyb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTU3NTllCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9kdGQvUGFyc2VFcnJvci5qYXZhCkBAIC0wLDAgKzEsMjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDUgT2JqZWN0IEZhY3RvcnkgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqCQlPYmplY3QgRmFjdG9yeSBJbmMuIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICoJCUlCTSBDb3Jwb3JhdGlvbiAtIHNlcmlhbCB2ZXJzaW9uIGlkCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmR0ZDsKKworLyoqCisgKiBAYXV0aG9yIEJvYiBGb3N0ZXIKKyAqLworcHVibGljIGNsYXNzIFBhcnNlRXJyb3IgZXh0ZW5kcyBFeGNlcHRpb24geworCQorCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisJLyoqCisJICogQ29uc3RydWN0b3IgZm9yIFBhcnNlRXJyb3IuCisJICogQHBhcmFtIG1zZyBNZXNzYWdlCisJICovCisJcHVibGljIFBhcnNlRXJyb3IoU3RyaW5nIG1zZykgeworCQlzdXBlcihtc2cpOworCX0KK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZHRkL1BhcnNlci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9kdGQvUGFyc2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg3NGZlNgotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZHRkL1BhcnNlci5qYXZhCkBAIC0wLDAgKzEsMjAwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA1IE9iamVjdCBGYWN0b3J5IEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKgkJT2JqZWN0IEZhY3RvcnkgSW5jLiAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZHRkOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKKworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZHRkLnNjaGVtYS5TY2hlbWFGYWN0b3J5OworaW1wb3J0IG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyOworaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWE5vdFN1cHBvcnRlZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcueG1sLnNheC5YTUxSZWFkZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguZXh0LkRlY2xIYW5kbGVyOworCisKKy8qKgorICogU2ltcGxlIHBhcnNlciBmb3IgRFREcy4gUmV0dXJucyBJU2NoZW1hIHJlcHJlc2VudGluZyB0aGUgRFRELgorICogCisgKiBUbyBwYXJzZSBhIERURCwgeW91IG11c3QgcGFyc2UgYW4gWE1MIGRvY3VtZW50LiBUaGUgPGNvZGU+cGFyc2VEVEQoKTwvY29kZT4KKyAqIG1ldGhvZCBidWlsZHMgYSB0ZW1wb3JhcnkgWE1MIGRvY3VtZW50IGluIG1lbW9yeSB0aGF0IHJlZmVycyB0byBvciBpbmNsdWRlcworICogdGhlIERURC4KKyAqIAorICogVGhlcmUgaXMgbm8gZGVwZW5kZW5jeSBpbiB0aGlzIHBhY2thZ2Ugb24gYW55IGNvZGUgb3V0c2lkZSB0aGUgcGFja2FnZSBleGNlcHQKKyAqIFhNTFJlYWRlci4KKyAqIAorICogVG8gaGlkZSB0aGUgdW5kZXJseWluZyBwYXJzZXIsIFhNTCBwYXJzZXIgZXhjZXB0aW9ucyBhcmUgd3JhcHBlZCBieSBhCisgKiBQYXJzZUVycm9yLiBVbmxlc3MgZGVidWdnaW5nLCB0aGUgdHdvIHN0cmluZyBjb25zdGFudHMgYXJlIHN1ZmZpY2llbnQgdG8KKyAqIGRldGVybWluZSB0aGUgY2F1c2Ugb2YgdGhlIGVycm9yLgorICogQGF1dGhvciBCb2IgRm9zdGVyCisgKi8KK3B1YmxpYyBjbGFzcyBQYXJzZXIgeworCQorCS8qKiBQYXJzZUVycm9yIG1lc3NhZ2Ugd2hlbiBzeXN0ZW0gcGFyc2VyIGRvZXNuJ3QgZG8gdGhlIGpvYiAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVF9TVVBQT1JURUQgPSBBbnREVERNZXNzYWdlcy5QYXJzZXJfWE1MX3BhcnNlcl9kb2VzX25vdF9zdXBwb3J0X0RlY2xIYW5kbGVyXzE7CisJLyoqIFBhcnNlRXJyb3IgbWVzc2FnZSBmb3IgYSB3ZWxsLWZvcm1lZCBvciB2YWxpZGF0aW9uIGVycm9yIGluIFhNTCBvciBEVEQuCisJICogIEN1cnJlbnRseSBub3QgcmV0dXJuZWQuICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSU0VfRVJST1IgPSBBbnREVERNZXNzYWdlcy5QYXJzZXJfRXJyb3JfcGFyc2luZ19YTUxfZG9jdW1lbnRfb3JfRFREXzI7CisJCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOVEVSTkFMID0gImludGVybmFsOi8vdXNlcmVhZGVyLm9iamZhYy5jb20iOyAvLyROT04tTkxTLTEkCisJCisJLyoqCisJICogUGFyc2UgdGhlIFhNTCBkb2N1bWVudCBhdCB0aGUgaW5wdXQgc291cmNlIGFuZCByZXR1cm4gYSBkb2N1bWVudCB3YWxrZXIKKwkgKiB0aGF0IGNhbiBiZSB1c2VkIHRvIHZhbGlkYXRlIGFueSBkb2N1bWVudCB3aXRoIHRoZSBzYW1lIERURCAoaW50ZXJuYWwgYW5kCisJICogZXh0ZXJuYWwpIG9yIHByb3ZpZGUgdXNlciBhc3Npc3RhbmNlIGZvciB0aGlzIGRvY3VtZW50LgorCSAqIEBwYXJhbSBpbnB1dFNvdXJjZSBTb3VyY2UgZm9yIFhNTCBkb2N1bWVudCB0byBzdGFydCBEVEQgcGFyc2UuIE11c3QKKwkgKiBjb250YWluIGEgRE9DVFlQRSBkZWNsYXJhdGlvbiB3aXRoIGludGVybmFsIG9yIGV4dGVybmFsIHN1YnNldCwgb3IgYm90aC4KKwkgKiBAcGFyYW0gZW50aXR5UmVzb2x2ZXIgRW50aXR5UmVzb2x2ZXIgb3IgbnVsbC4KKwkgKiBAcmV0dXJuIHNjaGVtYSBmb3IgZG9jdW1lbnQuCisJICogQHRocm93cyBQYXJzZUVycm9yIGZvciBOT1RfU1VQUE9SVEVEIG9yIFBBUlNFX0VSUk9SLgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgSVNjaGVtYSBwYXJzZShJbnB1dFNvdXJjZSBpbnB1dFNvdXJjZSwgRW50aXR5UmVzb2x2ZXIgZW50aXR5UmVzb2x2ZXIpIHRocm93cyBQYXJzZUVycm9yLCBJT0V4Y2VwdGlvbiB7CisJCVhNTFJlYWRlciBwYXJzZXIgPSBudWxsOworCQlTY2hlbWFGYWN0b3J5IGZhY3RvcnkgPSBuZXcgU2NoZW1hRmFjdG9yeSgpOworCQl0cnkgeworCQkJcGFyc2VyID0gZ2V0WE1MUmVhZGVyKCk7CisJCQlEZWNsSGFuZGxlciBoYW5kbGVyID0gZmFjdG9yeTsKKwkJCXBhcnNlci5zZXRQcm9wZXJ0eSgiaHR0cDovL3htbC5vcmcvc2F4L3Byb3BlcnRpZXMvZGVjbGFyYXRpb24taGFuZGxlciIsIGhhbmRsZXIpOyAvLyROT04tTkxTLTEkCisJCQlpZiAoZW50aXR5UmVzb2x2ZXIgIT0gbnVsbCkgeworCQkJCXBhcnNlci5zZXRFbnRpdHlSZXNvbHZlcihlbnRpdHlSZXNvbHZlcik7CisJCQl9CisJCQlwYXJzZXIucGFyc2UoaW5wdXRTb3VyY2UpOworCQl9IGNhdGNoIChTQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBQYXJzZUVycm9yKE5PVF9TVVBQT1JURUQpOworCQl9IGNhdGNoIChTQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IFBhcnNlRXJyb3IoTk9UX1NVUFBPUlRFRCk7CisJCX0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7CisJCQkvLyBEb24ndCBjYXJlIGFib3V0IGVycm9ycyBpbiBYTUwsIHNvIGp1c3QgZmFsbCB0aHJ1LgorCQkJLy8gSWYgcGFyc2UgZmFpbGVkIGluIERURCwgbWF5IGhhdmUgaW5jb21wbGV0ZSBzY2hlbWEsCisJCQkvLyBidXQgdGhpcyBpcyBiZXR0ZXIgdGhhbiBubyBzY2hlbWEuCisJCQlmYWN0b3J5LnNldEVycm9yRXhjZXB0aW9uKGUpOworCQl9CisKKwkJcmV0dXJuIGZhY3RvcnkuZ2V0U2NoZW1hKCk7CisJfQorCQorCXByaXZhdGUgWE1MUmVhZGVyIGdldFhNTFJlYWRlcigpIHRocm93cyBQYXJzZUVycm9yIHsKKwkJU0FYUGFyc2VyIHBhcnNlciA9IG51bGw7CisJCXRyeSB7CisJCQlwYXJzZXIgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3U0FYUGFyc2VyKCk7CisJCQlyZXR1cm4gcGFyc2VyLmdldFhNTFJlYWRlcigpOworCQl9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBQYXJzZUVycm9yKGUuZ2V0TWVzc2FnZSgpKTsKKwkJfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBQYXJzZUVycm9yKGUuZ2V0TWVzc2FnZSgpKTsKKwkJfQorCX0KKwkKKwkvKioKKwkgKiBQYXJzZSB0aGUgWE1MIGRvY3VtZW50IGF0IHRoZSBhcmd1bWVudCBVUkwgYW5kIHJldHVybiBhIGRvY3VtZW50IHdhbGtlcgorCSAqIHRoYXQgY2FuIGJlIHVzZWQgdG8gdmFsaWRhdGUgYW55IGRvY3VtZW50IHdpdGggdGhlIHNhbWUgRFREIChpbnRlcm5hbAorCSAqIGFuZCBleHRlcm5hbCkgb3IgcHJvdmlkZSB1c2VyIGFzc2lzdGFuY2UgZm9yIHRoaXMgZG9jdW1lbnQuCisJICogQHBhcmFtIHVybCBPZiBYTUwgZG9jdW1lbnQgdG8gc3RhcnQgRFREIHBhcnNlLiBNdXN0IGNvbnRhaW4gYSBET0NUWVBFCisJICogZGVjbGFyYXRpb24gd2l0aCBpbnRlcm5hbCBvciBleHRlcm5hbCBzdWJzZXQsIG9yIGJvdGguCisJICogQHJldHVybiBJV2Fsa2VyIHRoYXQgY2FuIGJlIHVzZWQgdG8gdHJhdmVyc2UgZG9jdW1lbnQuCisJICogQHRocm93cyBQYXJzZUVycm9yIGZvciBOT1RfU1VQUE9SVEVEIG9yIFBBUlNFX0VSUk9SLgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgSVNjaGVtYSBwYXJzZShTdHJpbmcgdXJsKSB0aHJvd3MgUGFyc2VFcnJvciwgSU9FeGNlcHRpb24geworCQlyZXR1cm4gcGFyc2UobmV3IElucHV0U291cmNlKHVybCksIG51bGwpOworCX0KKwkKKwkvKioKKwkgKiBQYXJzZSB0aGUgWE1MIGRvY3VtZW50IHVzaW5nIHRoZSBhcmd1bWVudCByZWFkZXIgYW5kIHJldHVybiBhIGRvY3VtZW50CisJICogd2Fsa2VyIHRoYXQgY2FuIGJlIHVzZWQgdG8gdmFsaWRhdGUgYW55IGRvY3VtZW50IHdpdGggdGhlIHNhbWUgRFRECisJICogKGludGVybmFsIGFuZCBleHRlcm5hbCkgb3IgcHJvdmlkZSB1c2VyIGFzc2lzdGFuY2UgZm9yIHRoaXMgZG9jdW1lbnQuCisJICogQHBhcmFtIHJlYWRlciBSZWFkZXIgZm9yIFhNTCBkb2N1bWVudCB0byBzdGFydCBEVEQgcGFyc2UuIE11c3QgY29udGFpbiBhCisJICogRE9DVFlQRSBkZWNsYXJhdGlvbiB3aXRoIGludGVybmFsIG9yIGV4dGVybmFsIHN1YnNldCwgb3IgYm90aC4KKwkgKiBAcmV0dXJuIElXYWxrZXIgdGhhdCBjYW4gYmUgdXNlZCB0byB0cmF2ZXJzZSBkb2N1bWVudC4KKwkgKiBAdGhyb3dzIFBhcnNlRXJyb3IgZm9yIE5PVF9TVVBQT1JURUQgb3IgUEFSU0VfRVJST1IuCisJICogQHRocm93cyBJT0V4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBJU2NoZW1hIHBhcnNlKFJlYWRlciByZWFkZXIpIHRocm93cyBQYXJzZUVycm9yLCBJT0V4Y2VwdGlvbiB7CisJCXJldHVybiBwYXJzZShuZXcgSW5wdXRTb3VyY2UocmVhZGVyKSwgbnVsbCk7CisJfQorCQorCS8qKgorCSAqIFBhcnNlIHRoZSBEVEQgd2l0aCB0aGUgZ2l2ZW4gcHVibGljIGFuZCBzeXN0ZW0gaWRzIGFuZCByZXR1cm4gYSBkb2N1bWVudAorCSAqIHdhbGtlciB0aGF0IGNhbiBiZSB1c2VkIHRvIHZhbGlkYXRlIG9yIHByb3ZpZGUgdXNlciBhc3Npc3RhbmNlIGZvciBhbnkKKwkgKiBkb2N1bWVudCB3aXRoIHRoZSBzYW1lIGV4dGVybmFsIERURCBhbmQgbm8gaW50ZXJuYWwgc3Vic2V0LgorCSAqIEBwYXJhbSBwdWIgUFVCTElDIGlkIG9mIERURC4KKwkgKiBAcGFyYW0gc3lzIFNZU1RFTSBpZCBvZiBEVEQuCisJICogQHBhcmFtIHJvb3QgUGxhdXNpYmxlIHJvb3QgZWxlbWVudCBxbmFtZS4gQW55IG5hbWUgd2lsbCBkbyBidXQgYQorCSAqIG5hbWUgdGhhdCB3aWxsIG5vdCBjYXVzZSBhIHZhbGlkYXRpb24gZXJyb3IgaXMgcHJlZmVycmVkLgorCSAqIEByZXR1cm4gSVdhbGtlciB0aGF0IGNhbiBiZSB1c2VkIHRvIHRyYXZlcnNlIGRvY3VtZW50LgorCSAqIEB0aHJvd3MgUGFyc2VFcnJvciBmb3IgTk9UX1NVUFBPUlRFRCBvciBQQVJTRV9FUlJPUi4KKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisJICovCisJcHVibGljIElTY2hlbWEgcGFyc2VEVEQoU3RyaW5nIHB1YiwgU3RyaW5nIHN5cywgU3RyaW5nIHJvb3QpIHRocm93cyBQYXJzZUVycm9yLCBJT0V4Y2VwdGlvbiB7CisJCXJldHVybiBwYXJzZShuZXcgSW5wdXRTb3VyY2UobmV3IERURFJlYWRlcihwdWIsIHN5cywgcm9vdCkpLCBudWxsKTsKKwl9CisJCisJLyoqCisJICogUGFyc2UgdGhlIERURCBmcm9tIHRoZSByZWFkZXIgYW5kIHJldHVybiBhIGRvY3VtZW50IHdhbGtlciB0aGF0IGNhbiBiZQorCSAqIHVzZWQgdG8gdmFsaWRhdGUgb3IgcHJvdmlkZSB1c2VyIGFzc2lzdGFuY2UgZm9yIGFueSBkb2N1bWVudCB3aXRoIHRoZQorCSAqIHNhbWUgZXh0ZXJuYWwgRFREIGFuZCBubyBpbnRlcm5hbCBzdWJzZXQuCisJICogQHBhcmFtIHJlYWRlciBSZWFkZXIgZm9yIGV4dGVybmFsIHN1YnNldCBEVEQKKwkgKiBAcGFyYW0gcm9vdCBQbGF1c2libGUgcm9vdCBlbGVtZW50IHFuYW1lLiBBbnkgbmFtZSB3aWxsIGRvIGJ1dCBhCisJICogbmFtZSB0aGF0IHdpbGwgbm90IGNhdXNlIGEgdmFsaWRhdGlvbiBlcnJvciBpcyBwcmVmZXJyZWQuCisJICogQHJldHVybiBJU2NoZW1hIHRoYXQgY2FuIGJlIHVzZWQgdG8gdHJhdmVyc2UgZG9jdW1lbnQuCisJICogQHRocm93cyBQYXJzZUVycm9yIGZvciBOT1RfU1VQUE9SVEVEIG9yIFBBUlNFX0VSUk9SLgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgSVNjaGVtYSBwYXJzZURURChSZWFkZXIgcmVhZGVyLCBTdHJpbmcgcm9vdCkgdGhyb3dzIFBhcnNlRXJyb3IsIElPRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHBhcnNlKG5ldyBJbnB1dFNvdXJjZShuZXcgRFREUmVhZGVyKElOVEVSTkFMLCBJTlRFUk5BTCwgcm9vdCkpLCBuZXcgRFRERW50aXR5UmVzb2x2ZXIocmVhZGVyKSk7CisJfQorCQorCXByaXZhdGUgc3RhdGljIGNsYXNzIERURFJlYWRlciBleHRlbmRzIFJlYWRlciB7CisJCXByaXZhdGUgUmVhZGVyIGZEZWxlZ2F0ZTsKKwkJCisJCXB1YmxpYyBEVERSZWFkZXIoU3RyaW5nIHB1YiwgU3RyaW5nIHN5cywgU3RyaW5nIHJvb3QpIHsKKwkJCVN0cmluZyBkb2N1bWVudCA9ICI8IURPQ1RZUEUgIityb290KyIgUFVCTElDICciK3B1YisiJyAnIitzeXMrIic+PCIrcm9vdCsiLz4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQKKwkJCWZEZWxlZ2F0ZSA9IG5ldyBTdHJpbmdSZWFkZXIoZG9jdW1lbnQpOworCQl9CisJCQorCQkvKioKKwkJICogQHNlZSBqYXZhLmlvLlJlYWRlciNjbG9zZSgpCisJCSAqLworCQlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCQlmRGVsZWdhdGUuY2xvc2UoKTsKKwkJfQorCisJCS8qIChub24tSmF2YWRvYykKKwkJICogQHNlZSBqYXZhLmlvLlJlYWRlciNyZWFkKGNoYXJbXSwgaW50LCBpbnQpCisJCSAqLworCQlwdWJsaWMgaW50IHJlYWQoY2hhcltdIGNidWYsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCQlyZXR1cm4gZkRlbGVnYXRlLnJlYWQoY2J1Ziwgb2ZmLCBsZW4pOworCQl9CisJfQorCQorCXByaXZhdGUgc3RhdGljIGNsYXNzIERUREVudGl0eVJlc29sdmVyIGltcGxlbWVudHMgRW50aXR5UmVzb2x2ZXIgeworCQlwcml2YXRlIFJlYWRlciByZWFkZXI7CisJCXB1YmxpYyBEVERFbnRpdHlSZXNvbHZlcihSZWFkZXIgcmVhZGVyKSB7CisJCQl0aGlzLnJlYWRlciA9IHJlYWRlcjsKKwkJfQorCQkvKioKKwkJICogQHNlZSBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlciNyZXNvbHZlRW50aXR5KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCisJCSAqLworCQlwdWJsaWMgSW5wdXRTb3VyY2UgcmVzb2x2ZUVudGl0eShTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgeworCQkJaWYgKHB1YmxpY0lkLmVxdWFscyhJTlRFUk5BTCkgJiYgc3lzdGVtSWQuZXF1YWxzKElOVEVSTkFMKSkKKwkJCQlyZXR1cm4gbmV3IElucHV0U291cmNlKHJlYWRlcik7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCX0JCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9kdGQvc2NoZW1hL0FudERURFNjaGVtYU1lc3NhZ2VzLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2R0ZC9zY2hlbWEvQW50RFREU2NoZW1hTWVzc2FnZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWI4N2Y3Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9kdGQvc2NoZW1hL0FudERURFNjaGVtYU1lc3NhZ2VzLmphdmEKQEAgLTAsMCArMSwyOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzCisgKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKKyAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6IAorICogSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmR0ZC5zY2hlbWE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworCitwdWJsaWMgY2xhc3MgQW50RFREU2NoZW1hTWVzc2FnZXMgZXh0ZW5kcyBOTFMgeworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZHRkLnNjaGVtYS5BbnREVERTY2hlbWFNZXNzYWdlcyI7Ly8kTk9OLU5MUy0xJAorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgTW9kZWxfbW9kZWxfbWF5X25vdF9iZV9jaGFuZ2VkOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1vZGVsX19fX1VOS05PV05fX19fMjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBOZm1QYXJzZXJfQW1iaWd1b3VzOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNjaGVtYUZhY3RvcnlfRG91Ymx5X2RlZmluZWQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2NoZW1hRmFjdG9yeV9TdGFydF93aXRoX2xlZnRfcGFyZW50aGVzaXM7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2NoZW1hRmFjdG9yeV9FeHBlY3Rpbmdfb3BlcmF0b3Jfb3JfcmlnaHRfcGFyZW50aGVzaXM7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2NoZW1hRmFjdG9yeV9VbmV4cGVjdGVkX2VuZDsKKworCXN0YXRpYyB7CisJCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQorCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBBbnREVERTY2hlbWFNZXNzYWdlcy5jbGFzcyk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZHRkL3NjaGVtYS9BbnREVERTY2hlbWFNZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9kdGQvc2NoZW1hL0FudERURFNjaGVtYU1lc3NhZ2VzLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFmMGQ5YwotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZHRkL3NjaGVtYS9BbnREVERTY2hlbWFNZXNzYWdlcy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTggQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisjIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorIworIyBDb250cmlidXRvcnM6CisjICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworTW9kZWxfbW9kZWxfbWF5X25vdF9iZV9jaGFuZ2VkPW1vZGVsIG1heSBub3QgYmUgY2hhbmdlZCBvbmNlIGl0cyBjb250ZW50cyBoYXZlIGJlZW4gcmVxdWVzdGVkCitNb2RlbF9fX19VTktOT1dOX19fXzI9PFVOS05PV04+CitOZm1QYXJzZXJfQW1iaWd1b3VzPUFtYmlndW91cyBjb250ZW50IG1vZGVsIHN0YXJ0aW5nIHdpdGggezB9CitTY2hlbWFGYWN0b3J5X0RvdWJseV9kZWZpbmVkPUVsZW1lbnQgezB9IGlzIGRvdWJseSBkZWZpbmVkCitTY2hlbWFGYWN0b3J5X1N0YXJ0X3dpdGhfbGVmdF9wYXJlbnRoZXNpcz1FbGVtZW50IHswfSBtb2RlbCBkb2VzIG5vdCBzdGFydCB3aXRoIGxlZnQgcGFyZW50aGVzaXMKK1NjaGVtYUZhY3RvcnlfRXhwZWN0aW5nX29wZXJhdG9yX29yX3JpZ2h0X3BhcmVudGhlc2lzPUV4cGVjdGluZyBvcGVyYXRvciBvciByaWdodCBwYXJlbnRoZXNpcyBpbiBlbGVtZW50IHswfSBtb2RlbCB7MX0KK1NjaGVtYUZhY3RvcnlfVW5leHBlY3RlZF9lbmQ9VW5leHBlY3RlZCBlbmQgb2YgY29udGVudCBtb2RlbCBmb3IgZWxlbWVudCB7MH06IHsxfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9kdGQvc2NoZW1hL0F0dHJpYnV0ZS5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9kdGQvc2NoZW1hL0F0dHJpYnV0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljOWMwMjkKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2R0ZC9zY2hlbWEvQXR0cmlidXRlLmphdmEKQEAgLTAsMCArMSwxMTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDUgT2JqZWN0IEZhY3RvcnkgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqCQlPYmplY3QgRmFjdG9yeSBJbmMuIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5kdGQuc2NoZW1hOworCitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmR0ZC4qOworCisvKioKKyAqIEF0dHIgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBzaW5nbGUgYXR0cmlidXRlLgorICogQGF1dGhvciBCb2IgRm9zdGVyCisgKi8KK3B1YmxpYyBjbGFzcyBBdHRyaWJ1dGUgZXh0ZW5kcyBBdG9tIGltcGxlbWVudHMgSUF0dHJpYnV0ZSB7CisJcHJpdmF0ZSBTdHJpbmcgZlR5cGU7CisJcHJpdmF0ZSBTdHJpbmdbXSBmRW51bTsKKwlwcml2YXRlIElFbGVtZW50IGZFbGVtZW50OworCXByaXZhdGUgU3RyaW5nIGZEZWZhdWx0OworCXByaXZhdGUgYm9vbGVhbiBmRml4ZWQ7CisJcHJpdmF0ZSBib29sZWFuIGZSZXF1aXJlZDsKKwkKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKiBAcGFyYW0gbmFtZSBBdHRyaWJ1dGUgcW5hbWUuCisJICogQHBhcmFtIGVsZW1lbnQgUGFyZW50IGVsZW1lbnQuCisJICovCisJcHVibGljIEF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgSUVsZW1lbnQgZWxlbWVudCkgeworCQlzdXBlcihBVFRSSUJVVEUsIG5hbWUpOworCQlmRWxlbWVudCA9IGVsZW1lbnQ7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmR0ZC5JQXR0cmlidXRlI2dldFR5cGUoKQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKKwkJcmV0dXJuIGZUeXBlOworCX0KKwkKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZHRkLklBdHRyaWJ1dGUjZ2V0RW51bSgpCisJICovCisJcHVibGljIFN0cmluZ1tdIGdldEVudW0oKSB7CisJCXJldHVybiBmRW51bTsKKwl9CisJCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmR0ZC5JQXR0cmlidXRlI2dldEVsZW1lbnQoKQorCSAqLworCXB1YmxpYyBJRWxlbWVudCBnZXRFbGVtZW50KCkgeworCQlyZXR1cm4gZkVsZW1lbnQ7CisJfQorCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5kdGQuSUF0dHJpYnV0ZSNnZXREZWZhdWx0KCkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHQoKSB7CisJCXJldHVybiBmRGVmYXVsdDsKKwl9CisJCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmR0ZC5JQXR0cmlidXRlI2lzRml4ZWQoKQorCSAqLworCXB1YmxpYyBib29sZWFuIGlzRml4ZWQoKSB7CisJCXJldHVybiBmRml4ZWQ7CisJfQorCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5kdGQuSUF0dHJpYnV0ZSNpc1JlcXVpcmVkKCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1JlcXVpcmVkKCkgeworCQlyZXR1cm4gZlJlcXVpcmVkOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKSB7CisJCWZUeXBlID0gdHlwZTsKKwl9CisJCisJLyoqCisJICogU2V0cyB0aGUgZGVmYXVsdCB2YWx1ZS4KKwkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFZhbHVlCisJICovCisJcHVibGljIHZvaWQgc2V0RGVmYXVsdChTdHJpbmcgZGVmYXVsdFZhbHVlKSB7CisJCWZEZWZhdWx0ID0gZGVmYXVsdFZhbHVlOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIGVudW1lcmF0aW9uLgorCSAqIEBwYXJhbSBlbnVtZXJhdGlvbiBUaGUgZW51bWVyYXRpb24gdG8gc2V0CisJICovCisJcHVibGljIHZvaWQgc2V0RW51bShTdHJpbmdbXSBlbnVtZXJhdGlvbikgeworCQlmRW51bSA9IGVudW1lcmF0aW9uOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIGZpeGVkLgorCSAqIEBwYXJhbSBmaXhlZCBUaGUgZml4ZWQgdG8gc2V0CisJICovCisJcHVibGljIHZvaWQgc2V0Rml4ZWQoYm9vbGVhbiBmaXhlZCkgeworCQlmRml4ZWQgPSBmaXhlZDsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSByZXF1aXJlZC4KKwkgKiBAcGFyYW0gcmVxdWlyZWQgVGhlIHJlcXVpcmVkIHRvIHNldAorCSAqLworCXB1YmxpYyB2b2lkIHNldFJlcXVpcmVkKGJvb2xlYW4gcmVxdWlyZWQpIHsKKwkJZlJlcXVpcmVkID0gcmVxdWlyZWQ7CisJfQorfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9kdGQvc2NoZW1hL0RmbS5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9kdGQvc2NoZW1hL0RmbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlZWEwZmYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2R0ZC9zY2hlbWEvRGZtLmphdmEKQEAgLTAsMCArMSwxNzAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDUgT2JqZWN0IEZhY3RvcnkgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqCQlPYmplY3QgRmFjdG9yeSBJbmMuIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5kdGQuc2NoZW1hOworCitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmR0ZC5JQXRvbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZHRkLklEZm07CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmR0ZC51dGlsLkZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmR0ZC51dGlsLkZhY3RvcnlPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmR0ZC51dGlsLk1hcEhvbGRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZHRkLnV0aWwuU29ydGVkTWFwOworCisKKy8qKgorICogRGV0ZXJtaW5pc3RpYyBmaW5pdGUgc3RhdGUgbWFjaGluZS4KKyAqIE9uY2UgY29uc3RydWN0ZWQgREZNIGlzIGltbXV0YWJsZSBhbmQgY2FuIGJlIHVzZWQgYnkgbXVsdGlwbGUgdGhyZWFkcy4KKyAqIEEgRGZtIG5vZGUgaXMgZXNzZW50aWFsbHkgYW4gYWNjZXB0aW5nIGZsYWcgYW5kIGEgaGFzaHRhYmxlIG1hcHBpbmcgYXRvbXMgdG8KKyAqIERmbSBub2Rlcy4gKEFsbW9zdCBvZiBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZHRkLnV0aWwgaXMgYWltZWQgYXQgcmVkdWNpbmcgdGhlIHN0b3JhZ2UKKyAqIG92ZXJoZWFkIG9mIGh1bmRyZWRzIG9mIGxpdHRsZSBoYXNodGFibGVzLikKKyAqIEBhdXRob3IgQm9iIEZvc3RlcgorICovCitwdWJsaWMgY2xhc3MgRGZtIGV4dGVuZHMgTWFwSG9sZGVyIGltcGxlbWVudHMgSURmbSwgRmFjdG9yeU9iamVjdCB7CisKKwlwdWJsaWMgYm9vbGVhbiBhY2NlcHRpbmc7CisJcHVibGljIGJvb2xlYW4gZW1wdHksIGFueTsKKwlwdWJsaWMgaW50IGlkOworCXByaXZhdGUgc3RhdGljIGludCB1bmlxdWUgPSAwOworCXByaXZhdGUgc3RhdGljIEZhY3RvcnkgZmFjdG9yeSA9IG5ldyBGYWN0b3J5KCk7CisJcHJpdmF0ZSBEZm0gZk5leHQ7CisJCisJcHVibGljIHN0YXRpYyBEZm0gZGZtKGJvb2xlYW4gYWNjZXB0aW5nKSB7CisJCURmbSBkZm0gPSBmcmVlKCk7CisJCWRmbS5hY2NlcHRpbmcgPSBhY2NlcHRpbmc7CisJCXJldHVybiBkZm07CisJfQorCisJcHJvdGVjdGVkIERmbSgpIHsKKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgRGZtIGZyZWUoKSB7CisJCURmbSBkZm0gPSAoRGZtKSBmYWN0b3J5LmdldEZyZWUoKTsKKwkJaWYgKGRmbSA9PSBudWxsKQorCQkJZGZtID0gbmV3IERmbSgpOworCQlkZm0uYWNjZXB0aW5nID0gZGZtLmVtcHR5ID0gZGZtLmFueSA9IGZhbHNlOworCQlkZm0uaWQgPSB1bmlxdWUrKzsKKwkJcmV0dXJuIGRmbTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIERmbSBkZm0oSUF0b20gYWNjZXB0LCBEZm0gZm9sbG93KSB7CisJCURmbSBkZm0gPSBmcmVlKCk7CisJCWRmbS5rZXlzID0gbmV3IE9iamVjdFsxXTsKKwkJZGZtLmtleXNbMF0gPSBhY2NlcHQ7CisJCWRmbS52YWx1ZXMgPSBuZXcgT2JqZWN0WzFdOworCQlkZm0udmFsdWVzWzBdID0gZm9sbG93OworCQlyZXR1cm4gZGZtOworCX0KKwkKKwlwdWJsaWMgc3RhdGljIHZvaWQgZnJlZShEZm0gZGZtKSB7CisJCWRmbS5zZXRLZXlzKG51bGwpOworCQlkZm0uc2V0VmFsdWVzKG51bGwpOworCQlmYWN0b3J5LnNldEZyZWUoZGZtKTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gaXNBY2NlcHRpbmcoKSB7CisJCXJldHVybiBhY2NlcHRpbmc7CisJfQorCQorCXB1YmxpYyBJRGZtIGFkdmFuY2UoU3RyaW5nIG5hbWUpIHsKKwkJaWYgKGFueSkKKwkJCXJldHVybiB0aGlzOworCQlpZiAoZW1wdHkpCisJCQlyZXR1cm4gbnVsbDsKKwkJaWYgKGtleXMgPT0gbnVsbCkKKwkJCXJldHVybiBudWxsOworCQlTb3J0ZWRNYXAgbWFwID0gZ2V0SW5kaXJlY3RTdHJpbmdNYXAodGhpcyk7CisJCURmbSBkZm0gPSAoRGZtKSBtYXAuZ2V0KG5hbWUpOworCQlmcmVlTWFwKG1hcCk7CisJCXJldHVybiBkZm07CisJfQorCQorCXB1YmxpYyBTdHJpbmdbXSBnZXRBY2NlcHRzKCkgeworCQlpZiAoa2V5cyA9PSBudWxsKQorCQkJcmV0dXJuIG5ldyBTdHJpbmdbMF07CisJCVN0cmluZ1tdIHMgPSBuZXcgU3RyaW5nW2tleXMubGVuZ3RoXTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBzLmxlbmd0aDsgaSsrKSB7CisJCQlzW2ldID0ga2V5c1tpXS50b1N0cmluZygpOworCQl9CisJCXJldHVybiBzOworCX0KKworCXB1YmxpYyBEZm1bXSBnZXRGb2xsb3dzKCkgeworCQlpZiAodmFsdWVzID09IG51bGwpCisJCQlyZXR1cm4gbmV3IERmbVswXTsKKwkJRGZtW10gcyA9IG5ldyBEZm1bdmFsdWVzLmxlbmd0aF07CisJCVN5c3RlbS5hcnJheWNvcHkodmFsdWVzLDAscywwLHZhbHVlcy5sZW5ndGgpOworCQlyZXR1cm4gczsKKwl9CisKKwlwdWJsaWMgdm9pZCBtZXJnZShEZm0gb3RoZXIpIHsKKwkJYWNjZXB0aW5nIHw9IG90aGVyLmFjY2VwdGluZzsKKwkJU29ydGVkTWFwIG1hcCA9IGdldEluZGlyZWN0U3RyaW5nTWFwKHRoaXMpOworCQlTb3J0ZWRNYXAgb3RoZXJtYXAgPSBnZXRJbmRpcmVjdFN0cmluZ01hcChvdGhlcik7CisJCW1hcC5tZXJnZShvdGhlcm1hcCk7CisJCWZyZWVNYXAobWFwKTsKKwkJZnJlZU1hcChvdGhlcm1hcCk7CisJfQorCQorCXB1YmxpYyBTb3J0ZWRNYXAgZ2V0TWFwKCkgeworCQlyZXR1cm4gZ2V0SW5kaXJlY3RTdHJpbmdNYXAodGhpcyk7CisJfQorCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5kdGQudXRpbC5GYWN0b3J5T2JqZWN0I25leHQoKQorCSAqLworCXB1YmxpYyBGYWN0b3J5T2JqZWN0IG5leHQoKSB7CisJCXJldHVybiBmTmV4dDsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZHRkLnV0aWwuRmFjdG9yeU9iamVjdCNuZXh0KG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5kdGQudXRpbC5GYWN0b3J5T2JqZWN0KQorCSAqLworCXB1YmxpYyB2b2lkIG5leHQoRmFjdG9yeU9iamVjdCBvYmopIHsKKwkJZk5leHQgPSAoRGZtKSBvYmo7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmR0ZC5JRGZtI2lzQW55KCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0FueSgpIHsKKwkJcmV0dXJuIGFueTsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZHRkLklEZm0jaXNFbXB0eSgpCisJICovCisJcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKKwkJcmV0dXJuIGVtcHR5OworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5kdGQuSURmbSNnZXRBdG9tKGphdmEubGFuZy5TdHJpbmcpCisJICovCisJcHVibGljIElBdG9tIGdldEF0b20oU3RyaW5nIG5hbWUpIHsKKwkJT2JqZWN0W10gYWxsS2V5cyA9IGdldEtleXMoKTsKKwkJaWYgKGVtcHR5IHx8IGFsbEtleXMgPT0gbnVsbCl7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlTb3J0ZWRNYXAgbWFwID0gZ2V0SW5kaXJlY3RTdHJpbmdNYXAodGhpcyk7CisJCWludCBpbmRleCA9IG1hcC5rZXlJbmRleChuYW1lKTsKKwkJaWYgKGluZGV4IDwgMCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJcmV0dXJuIChJQXRvbSkgYWxsS2V5c1tpbmRleF07CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmR0ZC5JRGZtI2FkdmFuY2UoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKKwkgKi8KKwlwdWJsaWMgSURmbSBhZHZhbmNlKFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBsb2NhbG5hbWUpIHsKKwkJLy8gbm8gbmFtZXNwYWNlIHN1cHBvcnQgaGVyZQorCQlyZXR1cm4gYWR2YW5jZShsb2NhbG5hbWUpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2R0ZC9zY2hlbWEvRWxlbWVudC5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9kdGQvc2NoZW1hL0VsZW1lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODViYmMwCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9kdGQvc2NoZW1hL0VsZW1lbnQuamF2YQpAQCAtMCwwICsxLDE3OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNSBPYmplY3QgRmFjdG9yeSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICoJCU9iamVjdCBGYWN0b3J5IEluYy4gLSBJbml0aWFsIGltcGxlbWVudGF0aW9uCisgKgkJSUJNIENvcnBvcmF0aW9uIC0gZml4IGZvciBCdWcgNDA5NTEKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZHRkLnNjaGVtYTsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZHRkLklBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmR0ZC5JRGZtOworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5kdGQuSUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmR0ZC5JTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmR0ZC5QYXJzZUVycm9yOworCitwdWJsaWMgY2xhc3MgRWxlbWVudCBleHRlbmRzIEF0b20gaW1wbGVtZW50cyBJRWxlbWVudCB7CisJcHJpdmF0ZSBib29sZWFuIGZVbmRlZmluZWQgPSB0cnVlOworCXByaXZhdGUgYm9vbGVhbiBmVGV4dDsKKwlwcml2YXRlIElNb2RlbCBmTW9kZWw7CisJcHJpdmF0ZSBNYXAgZk1hcCA9IG5ldyBIYXNoTWFwKDQpOyAKKwlwcml2YXRlIERmbSBmRWxlbWVudERmbTsKKworCS8qKgorCSAqIENvbnN0cnVjdG9yCisJICogQHBhcmFtIG5hbWUgUU5hbWUgb2YgZWxlbWVudC4KKwkgKi8KKwlwdWJsaWMgRWxlbWVudChTdHJpbmcgbmFtZSkgeworCQlzdXBlcihFTEVNRU5ULCBuYW1lKTsKKwl9CisKKwkvKioKKwkgKiBTZXQgdW5kZWZpbmVkIHByb3BlcnR5LgorCSAqIEBwYXJhbSB1bmRlZmluZWQgRmFsc2UgaWYgZGVmaW5lZDsgb3RoZXJ3aXNlIHRydWUgKGRlZmF1bHQpLgorCSAqLworCXB1YmxpYyB2b2lkIHNldFVuZGVmaW5lZChib29sZWFuIHVuZGVmaW5lZCkgeworCQlmVW5kZWZpbmVkID0gdW5kZWZpbmVkOworCX0KKwkKKwkvKioKKwkgKiBTZXQgdGV4dCBwcm9wZXJ0eS4KKwkgKiBAcGFyYW0gdGV4dCBUcnVlIGlmIHRleHQgb25seTsgb3RoZXJ3aXNlIGZhbHNlIChkZWZhdWx0KS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRUZXh0KGJvb2xlYW4gdGV4dCkgeworCQlmVGV4dCA9IHRleHQ7CisJfQorCQorCS8qKgorCSAqIFNldCBtb2RlbCBwcm9wZXJ0eS4KKwkgKiBAcGFyYW0gbW9kZWwgRGZtIGRlc2NyaWJpbmcgY29udGVudCBtb2RlbC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRDb250ZW50TW9kZWwoSU1vZGVsIG1vZGVsKSB7CisJCWZNb2RlbCA9IG1vZGVsOworCX0KKwkKKwkvKioKKwkgKiBBZGQgYW4gYXR0cmlidXRlIHRvIHRoZSBhdHRyaWJ1dGUgbWFwLgorCSAqIEBwYXJhbSBhdHRyaWJ1dGUgQXR0cmlidXRlIHRvIGFkZC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRBdHRyaWJ1dGUoSUF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKKwkJZk1hcC5wdXQoYXR0cmlidXRlLmdldE5hbWUoKSwgYXR0cmlidXRlKTsKKwl9CisJCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZHRkLklFbGVtZW50I2dldEF0dHJpYnV0ZXMoKQorCSAqLworCXB1YmxpYyBNYXAgZ2V0QXR0cmlidXRlcygpIHsKKwkJcmV0dXJuIGZNYXA7CisJfQorCisJCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmR0ZC5JRWxlbWVudCNpc01peGVkKCkKKwkgKi8KKwlwdWJsaWMgSU1vZGVsIGdldENvbnRlbnRNb2RlbCgpIHsKKwkJcmV0dXJuIGZNb2RlbDsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5kdGQuSUVsZW1lbnQjaXNUZXh0KCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1RleHQoKSB7CisJCXJldHVybiBmVGV4dDsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5kdGQuSUVsZW1lbnQjaXNVbmRlZmluZWQoKQorCSAqLworCXB1YmxpYyBib29sZWFuIGlzVW5kZWZpbmVkKCkgeworCQlyZXR1cm4gZlVuZGVmaW5lZDsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5kdGQuSUVsZW1lbnQjZ2V0RGZtKCkKKwkgKi8KKwlwdWJsaWMgSURmbSBnZXREZm0oKSB7CisJCURmbSBkZm0gPSBmRWxlbWVudERmbTsKKwkJaWYgKGRmbSA9PSBudWxsKSB7CisJCQlkZm0gPSBwYXJzZUVsZW1lbnREZm0oKTsKKwkJCWZFbGVtZW50RGZtID0gZGZtOworCQl9CisJCXJldHVybiBkZm07CisJfQorCQorCXByaXZhdGUgRGZtIHBhcnNlRWxlbWVudERmbSgpIHsKKwkJRGZtIGRmbTsKKwkJaWYgKGZBbnkpIHsKKwkJCWRmbSA9IERmbS5kZm0odHJ1ZSk7CisJCQlkZm0uYW55ID0gdHJ1ZTsKKwkJfQorCQllbHNlIGlmIChmRW1wdHkgfHwgZlRleHQpIHsKKwkJCWRmbSA9IERmbS5kZm0odHJ1ZSk7CisJCQlkZm0uZW1wdHkgPSB0cnVlOworCQl9CisJCWVsc2UgeworCQkJZGZtID0gcGFyc2VNb2RlbChmTW9kZWwpOworCQl9CisJCXJldHVybiBkZm07CisJfQorCQorCXByaXZhdGUgRGZtIHBhcnNlTW9kZWwoSU1vZGVsIG1vZGVsKSB7CisJCURmbSBkZm07CisJCU5mbSBuZm0gPSBtb2RlbC50b05mbSgpOworCQlpZiAobmZtICE9IG51bGwpIHsKKwkJCXRyeSB7CisJCQkJZGZtID0gZk5mbVBhcnNlci5wYXJzZShuZm0pOworCQkJfSBjYXRjaCAoUGFyc2VFcnJvciBlKSB7CisJCQkJLy8/Pz8gdGhpcyB3b3VsZCBiZSB0aGUgcGxhY2UgdG8gbG9nIHRoZSBlcnJvcgorCQkJCWRmbSA9IERmbS5kZm0oZmFsc2UpOworCQkJfQorCQl9CisJCWVsc2UgeworCQkJZGZtID0gRGZtLmRmbShmYWxzZSk7CisJCX0KKwkJcmV0dXJuIGRmbTsKKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTmZtUGFyc2VyIGZOZm1QYXJzZXIgPSBuZXcgTmZtUGFyc2VyKCk7CisJcHJpdmF0ZSBib29sZWFuIGZBbnk7CisJcHJpdmF0ZSBib29sZWFuIGZFbXB0eTsKKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmR0ZC5JRWxlbWVudCNpc0FueSgpCisJICovCisJcHVibGljIGJvb2xlYW4gaXNBbnkoKSB7CisJCXJldHVybiBmQW55OworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmR0ZC5JRWxlbWVudCNpc0VtcHR5KCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgeworCQlyZXR1cm4gZkVtcHR5OworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIGFueS4KKwkgKiBAcGFyYW0gYW55IFRoZSBhbnkgdG8gc2V0CisJICovCisJcHVibGljIHZvaWQgc2V0QW55KGJvb2xlYW4gYW55KSB7CisJCWZBbnkgPSBhbnk7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgZW1wdHkuCisJICogQHBhcmFtIGVtcHR5IFRoZSBlbXB0eSB0byBzZXQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRFbXB0eShib29sZWFuIGVtcHR5KSB7CisJCWZFbXB0eSA9IGVtcHR5OworCX0KKworfQorCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2R0ZC9zY2hlbWEvTmZtLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2R0ZC9zY2hlbWEvTmZtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M5NTk5YwotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZHRkL3NjaGVtYS9OZm0uamF2YQpAQCAtMCwwICsxLDI4OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNSBPYmplY3QgRmFjdG9yeSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICoJCU9iamVjdCBGYWN0b3J5IEluYy4gLSBJbml0aWFsIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmR0ZC5zY2hlbWE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZHRkLklBdG9tOworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5kdGQudXRpbC5GYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5kdGQudXRpbC5GYWN0b3J5T2JqZWN0OworCisKKy8qKgorICogTm9uLWRldGVybWluaXN0aWMgZmluaXRlIHN0YXRlIG1hY2hpbmUuCisgKiBAYXV0aG9yIEJvYiBGb3N0ZXIKKyAqLworcHVibGljIGNsYXNzIE5mbSBpbXBsZW1lbnRzIEZhY3RvcnlPYmplY3QgeworCXByaXZhdGUgTmZtTm9kZSBzdGFydDsKKwlwcml2YXRlIE5mbU5vZGUgc3RvcDsKKwkKKwlwdWJsaWMgTmZtTm9kZSBnZXRTdGFydCgpIHsKKwkJcmV0dXJuIHN0YXJ0OworCX0KKwkKKwlwdWJsaWMgTmZtTm9kZSBnZXRTdG9wKCkgeworCQlyZXR1cm4gc3RvcDsKKwl9CisJCisJLyoqCisJICogQ29uc3RydWN0IGFuIG5mbSBzdWNoIHRoYXQ6CisJICogPHByZT4KKwkgKiBzdGFydCAgc3RvcAorCSAqICAgfCAgICAgIHwKKwkgKiArLS0tKyAgKy0tLSsKKwkgKiB8IHMgfC0+fCAgIHwKKwkgKiArLS0tKyAgKy0tLSsKKwkgKiA8L3ByZT4KKwkgKiBJbiBhbGwgcGljdHVyZXMsIGJveGVzIGFyZSBOZm1Ob2Rlcy4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBOZm0gbmZtKElBdG9tIHMpIHsKKwkJTmZtIG5mbSA9IGZyZWUoKTsKKwkJbmZtLnN0b3AgPSBOZm1Ob2RlLm5mbU5vZGUoKTsKKwkJbmZtLnN0YXJ0ID0gTmZtTm9kZS5uZm1Ob2RlKHMsIG5mbS5zdG9wKTsKKwkJcmV0dXJuIG5mbTsKKwl9CisJCisJLyoqCisJICogQ29uc3RydWN0IGFuIG5mbSB0aGF0ICJ3cmFwcyIgYW4gZXhpc3RpbmcgbmZtIHggc3VjaCB0aGF0OgorCSAqIDxwcmU+CisJICogc3RhcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcAorCSAqICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorCSAqICstLS0rICArLS0tLS0tLS0tKyAgKy0tLS0tLS0tLSsgICstLS0rCisJICogfCAgIHwtPnwgeCBzdGFydCB8ICB8IHggc3RvcCAgfC0+fCAgIHwKKwkgKiArLS0tKyAgKy0tLS0tLS0tLSsgICstLS0tLS0tLS0rICArLS0tKworCSAqIDwvcHJlPgorCSAqLworCXByaXZhdGUgc3RhdGljIE5mbSBuZm0oTmZtIHgpIHsKKwkJTmZtIG5mbSA9IGZyZWUoKTsKKwkJbmZtLnN0YXJ0ID0gTmZtTm9kZS5uZm1Ob2RlKHguc3RhcnQpOworCQluZm0uc3RvcCA9IE5mbU5vZGUubmZtTm9kZSgpOworCQl4LnN0b3AubmV4dDEgPSBuZm0uc3RvcDsKKwkJcmV0dXJuIG5mbTsKKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgTmZtIG5mbSgpIHsKKwkJTmZtIG5mbSA9IGZyZWUoKTsKKwkJbmZtLnN0YXJ0ID0gTmZtTm9kZS5uZm1Ob2RlKCk7CisJCW5mbS5zdG9wID0gTmZtTm9kZS5uZm1Ob2RlKCk7CisJCXJldHVybiBuZm07CisJfQorCisJcHVibGljIHN0YXRpYyBOZm0gZ2V0TmZtKElBdG9tIHMpIHsKKwkJcmV0dXJuIG5mbShzKTsKKwl9CisJCisJLyoqCisJICogIlN0YXIiIGFuIGV4aXN0aW5nIG5mbSB4LgorCSAqIDxwcmU+CisJICogc3RhcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcAorCSAqICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorCSAqICstLS0rICArLS0tLS0tLS0tKyAgKy0tLS0tLS0tLSsgICstLS0rCisJICogfCAgIHwtPnwgeCBzdGFydCB8ICB8IHggc3RvcCAgfC0+fCAgIHwKKwkgKiArLS0tKyAgKy0tLS0tLS0tLSsgICstLS0tLS0tLS0rICArLS0tKworCSAqICAgfCAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgfAorCSAqICAgfCAgICAgICAgICstLS0tLTwtLS0tLS0rICAgICAgICAgfAorCSAqICAgKy0tLS0tLT4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCSAqIDwvcHJlPgorCSAqIEZyZWVzIHguCisJICovCisJcHVibGljIHN0YXRpYyBOZm0gZ2V0U3RhcihOZm0geCkgeworCQkvLyBNYWtlIHRoZSBiYWNrIGxpbmsKKwkJeC5zdG9wLm5leHQyID0geC5zdGFydDsKKwkJTmZtIHRtcCA9IG5mbSh4KTsKKwkJLy8gTWFrZSB0aGUgZm9yd2FyZCBsaW5rCisJCXRtcC5zdGFydC5uZXh0MiA9IHRtcC5zdG9wOworCQlmcmVlKHgpOworCQlyZXR1cm4gdG1wOworCX0KKwkKKwkvKioKKwkgKiAiUXVlc3Rpb24iIGFuIGV4aXN0aW5nIG5mbSB4OiB4ID0+IHg/CisJICogPHByZT4KKwkgKiBzdGFydCAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9wCisJICogICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisJICogKy0tLSsgICstLS0tLS0tLS0rICArLS0tLS0tLS0tKyAgKy0tLSsKKwkgKiB8ICAgfC0+fCB4IHN0YXJ0IHwgIHwgeCBzdG9wICB8LT58ICAgfAorCSAqICstLS0rICArLS0tLS0tLS0tKyAgKy0tLS0tLS0tLSsgICstLS0rCisJICogICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisJICogICArLS0tLS0tLS0tLS0tLS0tLT4tLS0tLS0tLS0tLS0tLS0rCisJICogPC9wcmU+CisJICogRnJlZXMgeC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIE5mbSBnZXRRdWVzdGlvbihOZm0geCkgeworCQlOZm0gdG1wID0gbmZtKHgpOworCQkvLyBNYWtlIHRoZSBmb3J3YXJkIGxpbmsKKwkJdG1wLnN0YXJ0Lm5leHQyID0gdG1wLnN0b3A7CisJCWZyZWUoeCk7CisJCXJldHVybiB0bXA7CisJfQorCisJLyoqCisJICogIlBsdXMiIGFuIGV4aXN0aW5nIG5mbSB4IC0+IHgrCisJICogPHByZT4KKwkgKiBzdGFydCAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9wCisJICogICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisJICogKy0tLSsgICstLS0tLS0tLS0rICArLS0tLS0tLS0tKyAgKy0tLSsKKwkgKiB8ICAgfC0+fCB4IHN0YXJ0IHwgIHwgeCBzdG9wICB8LT58ICAgfAorCSAqICstLS0rICArLS0tLS0tLS0tKyAgKy0tLS0tLS0tLSsgICstLS0rCisJICogICAgICAgICAgICAgfCAgICAgICAgICAgIHwKKwkgKiAgICAgICAgICAgICArLS0tLS08LS0tLS0tKworCSAqIDwvcHJlPgorCSAqIEZyZWVzIHguCisJICovCisJcHVibGljIHN0YXRpYyBOZm0gZ2V0UGx1cyhOZm0geCkgeworCQkvLyBNYWtlIHRoZSBiYWNrIGxpbmsKKwkJeC5zdG9wLm5leHQyID0geC5zdGFydDsKKwkJTmZtIHRtcCA9IG5mbSh4KTsKKwkJZnJlZSh4KTsKKwkJcmV0dXJuIHRtcDsKKwl9CisJCisJLyoqCisJICogIk9yIiB0d28gZXhpc3RpbmcgbmZtcyB4LHkgLT4geHx5CisJICogPHByZT4KKwkgKiBzdGFydCAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9wCisJICogICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisJICogKy0tLSsgICstLS0tLS0tLS0rICArLS0tLS0tLS0tKyAgKy0tLSsKKwkgKiB8ICAgfC0+fCB4IHN0YXJ0IHwgIHwgeCBzdG9wICB8LT58ICAgfAorCSAqICstLS0rICArLS0tLS0tLS0tKyAgKy0tLS0tLS0tLSsgICstLS0rCisJICogICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisJICogICB8ICAgICstLS0tLS0tLS0rICArLS0tLS0tLS0tKyAgICB8CisJICogICArLS0tPnwgeSBzdGFydCB8ICB8IHkgc3RvcCAgfC0tPi0rCisJICogICAgICAgICstLS0tLS0tLS0rICArLS0tLS0tLS0tKworCSAqIDwvcHJlPgorCSAqIEZyZWVzIHggYW5kIHkuCisJICovCisJcHVibGljIHN0YXRpYyBOZm0gZ2V0T3IoTmZtIHgsIE5mbSB5KSB7CisJCU5mbSB0bXAgPSBuZm0oKTsKKwkJdG1wLnN0YXJ0Lm5leHQxID0geC5zdGFydDsKKwkJdG1wLnN0YXJ0Lm5leHQyID0geS5zdGFydDsKKwkJeC5zdG9wLm5leHQxID0gdG1wLnN0b3A7CisJCXkuc3RvcC5uZXh0MSA9IHRtcC5zdG9wOworCQlmcmVlKHgpOworCQlmcmVlKHkpOworCQlyZXR1cm4gdG1wOworCX0KKwkKKwkvKioKKwkgKiAiQ29tbWEiIHR3byBleGlzdGluZyBuZm1zIHgseSAtPiB4LHkKKwkgKiAKKwkgKiA8cD5SZS11c2VzIHggc28gdGhhdCB4LnN0b3AgaXMgZmlyc3QKKwkgKiB0cmFuc2Zvcm1lZCB0byB5LnN0YXJ0IGFuZCB0aGVuCisJICogeC5zdG9wIGlzIHJlc2V0IHRvIHkuc3RvcC4KKwkgKiBUaGlzIGlzIGFzIGVmZmljaWVudCBhcyBwb3NzaWJsZS4KKwkgKiA8cHJlPgorCSAqIHggc3RhcnQgICAgICBmb3JtZXIgeCBzdG9wICAgeCBzdG9wCisJICogICAgIHwgICAgICAgICAgICAgICB8ICAgICAgICAgICB8CisJICogKy0tLS0tLS0tLSsgICstLS0tLS0tLS0tKyAgKy0tLS0tLS0tKworCSAqIHwgeCBzdGFydCB8ICB8IHkgc3RhcnQgIHwtPnwgeSBzdG9wIHwKKwkgKiArLS0tLS0tLS0tKyAgKy0tLS0tLS0tLS0rICArLS0tLS0tLS0rCisJICogPC9wcmU+CisJICogRnJlZXMgeSwgcmV0dXJucyB4IG1vZGlmaWVkLgorCSAqLworCXB1YmxpYyBzdGF0aWMgTmZtIGdldENvbW1hKE5mbSB4LCBOZm0geSkgeworCQl4LnN0b3AubmV4dDEgPSB5LnN0YXJ0Lm5leHQxOworCQl4LnN0b3AubmV4dDIgPSB5LnN0YXJ0Lm5leHQyOworCQl4LnN0b3Auc3ltYm9sID0geS5zdGFydC5zeW1ib2w7CisJCXguc3RvcCA9IHkuc3RvcDsKKwkJZnJlZSh5KTsKKwkJcmV0dXJuIHg7CisJfQorCQorCS8qKgorCSAqICJ7bWluLCp9IiBhbiBleGlzdGluZyBuZm0geCAtPiB4WzBdLHhbMV0sLi4uLHhbbWluLTFdLHhbbWluXSoKKwkgKiBGcmVlcyB4LgorCSAqLworCXB1YmxpYyBzdGF0aWMgTmZtIGdldFVuYm91bmRlZChOZm0geCwgaW50IG1pbikgeworCQlpZiAobWluID09IDApCisJCQlyZXR1cm4gZ2V0U3Rhcih4KTsKKwkJaWYgKG1pbiA9PSAxKQorCQkJcmV0dXJuIGdldFBsdXMoeCk7CisJCU5mbSBsYXN0MSA9IG5mbSh4KSwgbGFzdDIgPSBuZm0oeCk7CisJCWZvciAoaW50IGkgPSAyOyBpIDwgbWluOyBpKyspIHsKKwkJCWxhc3QxID0gZ2V0Q29tbWEobGFzdDEsIGxhc3QyKTsKKwkJCWZyZWUobGFzdDIpOworCQkJbGFzdDIgPSBuZm0oeCk7CisJCX0KKwkJZnJlZSh4KTsKKwkJcmV0dXJuIGdldENvbW1hKGxhc3QxLCBnZXRTdGFyKGxhc3QyKSk7CisJfQorCQorCS8qKgorCSAqICJ7bWluLG1heH0iIGFuIGV4aXN0aW5nIG5mbSB4IC0+IHhbMF0seFsxXSwuLi4seFttaW4tMV0seFttaW5dPywuLi4seFttYXgtMV0/CisJICogRnJlZXMgb3IgcmV0dXJucyB4LgorCSAqLworCXB1YmxpYyBzdGF0aWMgTmZtIGdldE1pbk1heChOZm0geCwgaW50IG1pbiwgaW50IG1heCkgeworCQlpZiAobWF4ID09IEludGVnZXIuTUFYX1ZBTFVFKQorCQkJcmV0dXJuIGdldFVuYm91bmRlZCh4LCBtaW4pOworCQlpZiAobWF4ID09IDApIHsKKwkJCWZyZWUoeCk7CisJCQlyZXR1cm4gbmZtKChJQXRvbSludWxsKTsKKwkJfQorCQlpZiAobWF4ID09IDEpIHsKKwkJCWlmIChtaW4gPT0gMCkKKwkJCQlyZXR1cm4gZ2V0UXVlc3Rpb24oeCk7CisJCQlyZXR1cm4geDsKKwkJfQorCQlOZm0gbGFzdCA9IG51bGw7CisJCWludCBpID0gMDsKKwkJZm9yICg7IGkgPCBtaW47IGkrKykgeworCQkJaWYgKGxhc3QgPT0gbnVsbCkKKwkJCQlsYXN0ID0gbmZtKHgpOworCQkJZWxzZSB7CisJCQkJTmZtIHRtcCA9IG5mbSh4KTsKKwkJCQlsYXN0ID0gZ2V0Q29tbWEobGFzdCwgdG1wKTsKKwkJCQlmcmVlKHRtcCk7CisJCQl9CisJCX0KKwkJZm9yICg7IGkgPCBtYXg7IGkrKykgeworCQkJaWYgKGxhc3QgPT0gbnVsbCkKKwkJCQlsYXN0ID0gZ2V0UXVlc3Rpb24oeCk7CisJCQllbHNlIHsKKwkJCQlOZm0gdG1wID0gZ2V0UXVlc3Rpb24oeCk7CisJCQkJbGFzdCA9IGdldENvbW1hKGxhc3QsIHRtcCk7CisJCQkJZnJlZSh0bXApOworCQkJCS8vPz8/IHRoaXMgaXMgaW5lZmZpY2llbnQgc2luY2UgdGhlIGZpcnN0IGZhaWx1cmUKKwkJCQkvLyAgICBpbiBhIHNlcXVlbmNlIG9mIHg/LHg/LC4uLix4PyBjYW4gc2tpcCB0bworCQkJCS8vICAgIHRoZSBlbmQgcmF0aGVyIHRoYW4ga2VlcCB0cnlpbmcgdG8gbWF0Y2ggeAorCQkJfQorCQl9CisJCWZyZWUoeCk7CisJCXJldHVybiBsYXN0OworCX0KKwkKKwkvLyBCZWxvdyBoZXJlIGlzIGZhY3Rvcnkgc3R1ZmYKKwkKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZHRkLnV0aWwuRmFjdG9yeU9iamVjdCNuZXh0KCkKKwkgKi8KKwlwdWJsaWMgRmFjdG9yeU9iamVjdCBuZXh0KCkgeworCQlyZXR1cm4gZk5leHQ7CisJfQorCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5kdGQudXRpbC5GYWN0b3J5T2JqZWN0I25leHQob3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmR0ZC51dGlsLkZhY3RvcnlPYmplY3QpCisJICovCisJcHVibGljIHZvaWQgbmV4dChGYWN0b3J5T2JqZWN0IG9iaikgeworCQlmTmV4dCA9IChOZm0pIG9iajsKKwl9CisJcHJpdmF0ZSBOZm0gZk5leHQ7CisJcHJpdmF0ZSBzdGF0aWMgRmFjdG9yeSBmRmFjdG9yeSA9IG5ldyBGYWN0b3J5KCk7CisJcHJpdmF0ZSBzdGF0aWMgTmZtIGZyZWUoKSB7CisJCU5mbSBuZm0gPSAoTmZtKSBmRmFjdG9yeS5nZXRGcmVlKCk7CisJCWlmIChuZm0gPT0gbnVsbCkKKwkJCXJldHVybiBuZXcgTmZtKCk7CisJCXJldHVybiBuZm07CisJfQorCXB1YmxpYyBzdGF0aWMgdm9pZCBmcmVlKE5mbSBuZm0pIHsKKwkJbmZtLnN0YXJ0ID0gbmZtLnN0b3AgPSBudWxsOworCQlmRmFjdG9yeS5zZXRGcmVlKG5mbSk7CisJfQorCXByaXZhdGUgTmZtKCkgeworCX0KK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZHRkL3NjaGVtYS9OZm1Ob2RlLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2R0ZC9zY2hlbWEvTmZtTm9kZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5ZDAxODkKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2R0ZC9zY2hlbWEvTmZtTm9kZS5qYXZhCkBAIC0wLDAgKzEsMTEzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA1IE9iamVjdCBGYWN0b3J5IEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKgkJT2JqZWN0IEZhY3RvcnkgSW5jLiAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZHRkLnNjaGVtYTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5kdGQuSUF0b207CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmR0ZC51dGlsLkZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmR0ZC51dGlsLkZhY3RvcnlPYmplY3Q7CisKKy8qKgorICogTm9uLWRldGVybWluaXN0aWMgZmluaXRlIHN0YXRlIG1hY2hpbmUgbm9kZS48cD4KKyAqIAorICogRm9sbG93aW5nIEFobyAmIFVsbG1hbiwgbmZtIG5vZGVzIGNvbnRhaW4gdHdvCisgKiB0cmFuc2l0aW9uIGxpbmtzLiBUaGUgZ3JhcGggaXMgY29uc3RydWN0ZWQgc28KKyAqIHRoYXQgbm8gbm9kZSByZXF1aXJlcyBtb3JlIHRoYW4gdHdvIGxpbmtzLgorICogVGhlcmUgYXJlIGV4YWN0bHkgdGhlc2Uga2luZHMgb2Ygbm9kZXM6CisgKiA8cHJlPgorICoJCVN5bWJvbAlOZXh0MQlOZXh0MglNZWFuaW5nCisgKgkJICAiYSIJIGZ3ZAkgbnVsbAlSZWdleHAgImEiCisgKgkJICBudWxsCSBudWxsCSBudWxsCUFjY2VwdGluZyBub2RlCisgKgkJICBudWxsCSBmd2QxCSBmd2QyCVN0YXJ0IG5vZGUgb2YgPyBhbmQgKiByZWdleHAKKyAqCQkJCQkJCQlmd2QyIHBvaW50cyB0byBzdG9wIG5vZGUKKyAqCQkgIG51bGwJIGZ3ZAkgYmt3CUludGVybmFsIG5vZGUgb2YgKyBhbmQgKiByZWdleHAKKyAqCQkJCQkJCQlmd2QgcG9pbnRzIHRvIHN0b3Agbm9kZQorICoJCQkJCQkJCWJrdyBwb2ludHMsIGUuZy4sIGluICJhKiIgdG8gc3RhcnQgbm9kZSBvZiAiYSIKKyAqCQkgIG51bGwJIGZ3ZDEJIGZ3ZDIJU3RhcnQgbm9kZSBvZiB8IHJlZ2V4cCwgZS5nLiwgImF8YiIsCisgKgkJCQkJCQkJZndkIG5vZGVzIHBvaW50IHRvIHN0YXJ0IG5vZGVzIG9mICJhIiBhbmQgImIiLgorICoJCSAgbnVsbAkgZndkCSBudWxsCUludGVybmFsIG5vZGUgb2YgfC4KKyAqCQkJCQkJCQlmd2QgcG9pbnRzIHRvIHN0b3Agbm9kZS4KKyAqIDwvcHJlPgorICogU2VlIE5mbSBmb3IgcGljdHVyZXMgb2YgaG93IG5vZGVzIGFyZSB1c2VkLgorICogQGF1dGhvciBCb2IgRm9zdGVyCisgKi8KK3B1YmxpYyBjbGFzcyBOZm1Ob2RlIGltcGxlbWVudHMgRmFjdG9yeU9iamVjdCB7CisKKwlwdWJsaWMgSUF0b20gc3ltYm9sOworCXB1YmxpYyBOZm1Ob2RlIG5leHQxOworCXB1YmxpYyBOZm1Ob2RlIG5leHQyOworCXB1YmxpYyBEZm0gZGZtOworCXB1YmxpYyBpbnQgbWFyazsKKwkKKwlwcml2YXRlIE5mbU5vZGUoKSB7CisJfQorCQorCXB1YmxpYyBzdGF0aWMgTmZtTm9kZSBuZm1Ob2RlKElBdG9tIHN5bWJvbCwgTmZtTm9kZSBuZXh0KSB7CisJCU5mbU5vZGUgbmZtID0gZ2V0RnJlZSgpOworCQluZm0uc3ltYm9sID0gc3ltYm9sOworCQluZm0ubmV4dDEgPSBuZXh0OworCQlyZXR1cm4gbmZtOworCX0KKwkKKwlwdWJsaWMgc3RhdGljIE5mbU5vZGUgbmZtTm9kZShOZm1Ob2RlIG5leHQpIHsKKwkJTmZtTm9kZSBuZm0gPSBnZXRGcmVlKCk7CisJCW5mbS5uZXh0MSA9IG5leHQ7CisJCXJldHVybiBuZm07CisJfQorCQorCXB1YmxpYyBzdGF0aWMgTmZtTm9kZSBuZm1Ob2RlKCkgeworCQlyZXR1cm4gZ2V0RnJlZSgpOworCX0KKwkKKwkvKioKKwkgKiBGcmVlIGFsbCBOZm1Ob2RlcyBpbiB1c2UuCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIGZyZWVBbGwoKSB7CisJCXdoaWxlIChmVXNlZCAhPSBudWxsKSB7CisJCQlGYWN0b3J5T2JqZWN0IG5mbSA9IGZVc2VkOworCQkJZlVzZWQgPSBuZm0ubmV4dCgpOworCQkJc2V0RnJlZSgoTmZtTm9kZSluZm0pOworCQl9CisJfQorCQorCS8vIEJlbG93IGhlcmUgaXMgZmFjdG9yeSBzdHVmZgorCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5kdGQudXRpbC5GYWN0b3J5T2JqZWN0I25leHQoKQorCSAqLworCXB1YmxpYyBGYWN0b3J5T2JqZWN0IG5leHQoKSB7CisJCXJldHVybiBuZXh0OworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5kdGQudXRpbC5GYWN0b3J5T2JqZWN0I25leHQob3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmR0ZC51dGlsLkZhY3RvcnlPYmplY3QpCisJICovCisJcHVibGljIHZvaWQgbmV4dChGYWN0b3J5T2JqZWN0IG9iaikgeworCQluZXh0ID0gKE5mbU5vZGUpIG9iajsKKwl9CisJcHJpdmF0ZSBOZm1Ob2RlIG5leHQ7CisJcHJpdmF0ZSBzdGF0aWMgRmFjdG9yeSBmRmFjdG9yeSA9IG5ldyBGYWN0b3J5KCk7CisJcHJpdmF0ZSBzdGF0aWMgRmFjdG9yeU9iamVjdCBmVXNlZCA9IG51bGw7CisJcHJpdmF0ZSBzdGF0aWMgTmZtTm9kZSBnZXRGcmVlKCkgeworCQlOZm1Ob2RlIG5mbSA9IChOZm1Ob2RlKSBmRmFjdG9yeS5nZXRGcmVlKCk7CisJCWlmIChuZm0gPT0gbnVsbCkKKwkJCW5mbSA9IG5ldyBOZm1Ob2RlKCk7CisJCW5mbS5uZXh0KGZVc2VkKTsKKwkJZlVzZWQgPSBuZm07CisJCXJldHVybiBuZm07CisJfQorCXByaXZhdGUgc3RhdGljIHZvaWQgc2V0RnJlZShOZm1Ob2RlIG5mbSkgeworCQluZm0uc3ltYm9sID0gbnVsbDsKKwkJbmZtLm5leHQxID0gbmZtLm5leHQyID0gbnVsbDsKKwkJbmZtLmRmbSA9IG51bGw7CisJCW5mbS5tYXJrID0gMDsKKwkJZkZhY3Rvcnkuc2V0RnJlZShuZm0pOworCX0KK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZHRkL3NjaGVtYS9TY2hlbWEuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZHRkL3NjaGVtYS9TY2hlbWEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjMwMjk2Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9kdGQvc2NoZW1hL1NjaGVtYS5qYXZhCkBAIC0wLDAgKzEsNjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDUgT2JqZWN0IEZhY3RvcnkgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqCQlPYmplY3QgRmFjdG9yeSBJbmMuIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5kdGQuc2NoZW1hOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZHRkLklFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5kdGQuSVNjaGVtYTsKKworLyoqCisgKiBUaGlzIGlzIGEgdmVyeSBzaW1wbGUgc2NoZW1hIHN1aXRhYmxlIGZvciBEVERzLgorICogT25jZSBjb25zdHJ1Y3RlZCwgYSBzY2hlbWEgaXMgaW1tdXRhYmxlIGFuZCBjb3VsZCBiZQorICogdXNlZCBieSBtdWx0aXBsZSB0aHJlYWRzLiBIb3dldmVyLCBzaW5jZSBpbiBnZW5lcmFsCisgKiB0aGUgc2NoZW1hIHdpbGwgcmVmbGVjdCB0aGUgaW50ZXJuYWwgRFREIHN1YnNldCwKKyAqIHJlLXVzZSBmb3IgbXVsdGlwbGUgZG9jdW1lbnRzIGlzIHByb2JsZW1hdGljLgorICogQGF1dGhvciBCb2IgRm9zdGVyCisgKi8KK3B1YmxpYyBjbGFzcyBTY2hlbWEgaW1wbGVtZW50cyBJU2NoZW1hIHsKKwlwcml2YXRlIEhhc2hNYXAgZkVsZW1lbnRNYXAgPSBuZXcgSGFzaE1hcCgpOworCXByaXZhdGUgRXhjZXB0aW9uIGZFcnJvckV4Y2VwdGlvbjsKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5kdGQuSVNjaGVtYSNnZXRFbGVtZW50KGphdmEubGFuZy5TdHJpbmcpCisJICovCisJcHVibGljIElFbGVtZW50IGdldEVsZW1lbnQoU3RyaW5nIHFuYW1lKSB7CisJCXJldHVybiAoSUVsZW1lbnQpIGZFbGVtZW50TWFwLmdldChxbmFtZSk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZHRkLklTY2hlbWEjZ2V0RWxlbWVudHMoKQorCSAqLworCXB1YmxpYyBJRWxlbWVudFtdIGdldEVsZW1lbnRzKCkgeworCQlyZXR1cm4gKElFbGVtZW50W10pIGZFbGVtZW50TWFwLmVudHJ5U2V0KCkudG9BcnJheShuZXcgSUVsZW1lbnRbZkVsZW1lbnRNYXAuZW50cnlTZXQoKS5zaXplKCldKTsKKwl9CisJCisJLyoqCisJICogQWRkIGEgdmlzaWJsZSBlbGVtZW50IHRvIHRoZSBzY2hlbWEuCisJICogQHBhcmFtIGVsZW1lbnQgRWxlbWVudCB0byBhZGQuCisJICovCisJcHVibGljIHZvaWQgYWRkRWxlbWVudChJRWxlbWVudCBlbGVtZW50KSB7CisJCWZFbGVtZW50TWFwLnB1dChlbGVtZW50LmdldE5hbWUoKSwgZWxlbWVudCk7CisJfQorCQorCS8qKgorCSAqIFNldHMgdGhlIGV4Y2VwdGlvbiB0aHJvd24gYnkgdGhlbiBwYXJzZXIgd2hlbiB0aGUgc2NoZW1hIHdhcyBidWlsdC4KKwkgKiBOb3RlIHRoYXQgdGhlIGV4Y2VwdGlvbiBkb2VzIG5vdCBuZWNlc3NhcmlseSBtZWFuIHRoZSBzY2hlbWEgaXMgaW5jb21wbGV0ZS4KKwkgKiAKKwkgKiBAcGFyYW0gZSB0aGUgRXhjZXB0aW9uCisJICovCisJcHVibGljIHZvaWQgc2V0RXJyb3JFeGNlcHRpb24oRXhjZXB0aW9uIGUpIHsKKwkJZkVycm9yRXhjZXB0aW9uID0gZTsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZHRkLklTY2hlbWEjZ2V0RXJyb3JFeGNlcHRpb24oKQorCSAqLworCXB1YmxpYyBFeGNlcHRpb24gZ2V0RXJyb3JFeGNlcHRpb24oKSB7CisJCXJldHVybiBmRXJyb3JFeGNlcHRpb247CisJfQorfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9kdGQvdXRpbC9BbnREVERVdGlsTWVzc2FnZXMuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZHRkL3V0aWwvQW50RFREVXRpbE1lc3NhZ2VzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JlOTcxOQotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZHRkL3V0aWwvQW50RFREVXRpbE1lc3NhZ2VzLmphdmEKQEAgLTAsMCArMSwyNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcworICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCisgKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOiAKKyAqIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5kdGQudXRpbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CisKK3B1YmxpYyBjbGFzcyBBbnREVERVdGlsTWVzc2FnZXMgZXh0ZW5kcyBOTFMgeworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZHRkLnV0aWwuQW50RFREVXRpbE1lc3NhZ2VzIjsvLyROT04tTkxTLTEkCisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTb3J0ZWRNYXBfbmV4dF9fX2NhbGxlZF9mb3JfZW1wdHlfYXJyYXlfMTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTb3J0ZWRNYXBfcmVtb3ZlX18wX19faW5fZW1wdHlfbWFwXzI7CisKKwlzdGF0aWMgeworCQkvLyBsb2FkIG1lc3NhZ2UgdmFsdWVzIGZyb20gYnVuZGxlIGZpbGUKKwkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgQW50RFREVXRpbE1lc3NhZ2VzLmNsYXNzKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9kdGQvdXRpbC9BbnREVERVdGlsTWVzc2FnZXMucHJvcGVydGllcyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZHRkL3V0aWwvQW50RFREVXRpbE1lc3NhZ2VzLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM2NTFjZgotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZHRkL3V0aWwvQW50RFREVXRpbE1lc3NhZ2VzLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxMyBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisjIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjCisjIENvbnRyaWJ1dG9yczoKKyMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitTb3J0ZWRNYXBfbmV4dF9fX2NhbGxlZF9mb3JfZW1wdHlfYXJyYXlfMT1uZXh0KCkgY2FsbGVkIGZvciBlbXB0eSBhcnJheQorU29ydGVkTWFwX3JlbW92ZV9fMF9fX2luX2VtcHR5X21hcF8yPXJlbW92ZSh7MH0pIGluIGVtcHR5IG1hcApkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9kdGQvdXRpbC9GYWN0b3J5LmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2R0ZC91dGlsL0ZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjExM2E2Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9kdGQvdXRpbC9GYWN0b3J5LmphdmEKQEAgLTAsMCArMSw2OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNSBPYmplY3QgRmFjdG9yeSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICoJCU9iamVjdCBGYWN0b3J5IEluYy4gLSBJbml0aWFsIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmR0ZC51dGlsOworCitpbXBvcnQgamF2YS5sYW5nLnJlZi5Tb2Z0UmVmZXJlbmNlOworCisvKioKKyAqIEZhY3RvcnkgbWFpbnRhaW5zIGEgZnJlZSBsaXN0IGFuZCwgd2l0aCBGYWN0b3J5T2JqZWN0LAorICogc2VydmVzIGFzIGEgYmFzaXMgZm9yIGZhY3RvcmllcyBvZiBhbGwgdHlwZXMuCisgKiBGYWN0b3J5IHNob3VsZCBvbmx5IGJlIHN1YmNsYXNzZWQgaW4gc2luZ2xldG9uIGNsYXNzZXM7CisgKiBmb3Igc3RhdGljIGZhY3RvcmllcywgaXQgbWF5IGJlIGluc3RhbnRpYXRlZCBhcworICogYSBzdGF0aWMgb2JqZWN0LgorICogQGF1dGhvciBCb2IgRm9zdGVyCisgKi8KK3B1YmxpYyBjbGFzcyBGYWN0b3J5IHsKKwkKKwkvKioKKwkgKiBSZXR1cm4gdGhlIGZpcnN0IG9iamVjdCBvbiB0aGUgZnJlZSBsaXN0CisJICogb3IgbnVsbCBpZiBub25lLgorCSAqLworCXB1YmxpYyBGYWN0b3J5T2JqZWN0IGdldEZyZWUoKSB7CisJCUhlYWQgaGVhZCA9IGdldEhlYWQoKTsKKwkJRmFjdG9yeU9iamVjdCBvYmogPSBoZWFkLm5leHQ7CisJCWlmIChvYmogIT0gbnVsbCkgeworCQkJaGVhZC5uZXh0ID0gb2JqLm5leHQoKTsKKwkJCW9iai5uZXh0KG51bGwpOworCQl9CisJCXJldHVybiBvYmo7CisJfQorCQorCS8qKgorCSAqIEFkZCBhbiBvYmplY3QgdG8gdGhlIGZyZWUgbGlzdC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRGcmVlKEZhY3RvcnlPYmplY3Qgb2JqKSB7CisJCUhlYWQgaGVhZCA9IGdldEhlYWQoKTsKKwkJb2JqLm5leHQoaGVhZC5uZXh0KTsKKwkJaGVhZC5uZXh0ID0gb2JqOworCX0KKwkKKwlwcml2YXRlIEhlYWQgZ2V0SGVhZCgpIHsKKwkJSGVhZCBoZWFkID0gKEhlYWQpIGZyZWUuZ2V0KCk7CisJCWlmIChoZWFkID09IG51bGwpIHsKKwkJCS8vIGhlYWQgaXMgbmVlZGVkIGJlY2F1c2UgeW91IGNhbid0IGNoYW5nZQorCQkJLy8gdGhlIHJlZmVyZW50IG9mIGEgU29mdFJlZmVyZW5jZS4KKwkJCS8vIFdpdGhvdXQgaGVhZCwgd2Ugd291bGQgbmVlZCB0byBjcmVhdGUKKwkJCS8vIGEgbmV3IFNvZnRSZWZlcmVuY2UgZWFjaCB0aW1lIHdlIHJlbW92ZQorCQkJLy8gYSBtYXAgZnJvbSB0aGUgbGlzdC4gV2l0aCBoZWFkLCBnZXR0aW5nCisJCQkvLyBhIGZyZWUgb2JqZWN0IG9ubHkgY2F1c2VzIG1lbW9yeSBhbGxvY2F0aW9uCisJCQkvLyB3aGVuIHRoZSBsaXN0IGhhcyBiZWVuIHByZXZpb3VzbHkgY29sbGVjdGVkLgorCQkJaGVhZCA9IG5ldyBIZWFkKCk7CisJCQlmcmVlID0gbmV3IFNvZnRSZWZlcmVuY2UoaGVhZCk7CisJCX0KKwkJcmV0dXJuIGhlYWQ7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSGVhZCB7CisJCXB1YmxpYyBGYWN0b3J5T2JqZWN0IG5leHQ7CisJfQorCXByaXZhdGUgU29mdFJlZmVyZW5jZSBmcmVlID0gbmV3IFNvZnRSZWZlcmVuY2UobmV3IEhlYWQoKSk7Cit9CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2R0ZC91dGlsL0ZhY3RvcnlPYmplY3QuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZHRkL3V0aWwvRmFjdG9yeU9iamVjdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3OTk0MjYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2R0ZC91dGlsL0ZhY3RvcnlPYmplY3QuamF2YQpAQCAtMCwwICsxLDIyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA1IE9iamVjdCBGYWN0b3J5IEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKgkJT2JqZWN0IEZhY3RvcnkgSW5jLiAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZHRkLnV0aWw7CisKKy8qKgorICogQSBGYWN0b3J5T2JqZWN0IG11c3QgaW1wbGVtZW50IGEgc2ltcGxlIGxpbmtlZCBsaXN0LgorICogQGF1dGhvciBCb2IgRm9zdGVyCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRmFjdG9yeU9iamVjdCB7CisKKwlGYWN0b3J5T2JqZWN0IG5leHQoKTsKKwkKKwl2b2lkIG5leHQoRmFjdG9yeU9iamVjdCBvYmopOworfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9kdGQvdXRpbC9JS2V5SG9sZGVyLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2R0ZC91dGlsL0lLZXlIb2xkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjE0ZTg5Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9kdGQvdXRpbC9JS2V5SG9sZGVyLmphdmEKQEAgLTAsMCArMSwyMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNSBPYmplY3QgRmFjdG9yeSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICoJCU9iamVjdCBGYWN0b3J5IEluYy4gLSBJbml0aWFsIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmR0ZC51dGlsOworCisvKioKKyAqIEBhdXRob3IgQm9iIEZvc3RlcgorICovCitwdWJsaWMgaW50ZXJmYWNlIElLZXlIb2xkZXIgeworCisJT2JqZWN0W10gZ2V0S2V5cygpOworCQorCXZvaWQgc2V0S2V5cyhPYmplY3RbXSBrZXlzKTsKK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZHRkL3V0aWwvSU1hcEhvbGRlci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9kdGQvdXRpbC9JTWFwSG9sZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZhYjA5NAotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZHRkL3V0aWwvSU1hcEhvbGRlci5qYXZhCkBAIC0wLDAgKzEsMTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDUgT2JqZWN0IEZhY3RvcnkgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqCQlPYmplY3QgRmFjdG9yeSBJbmMuIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5kdGQudXRpbDsKKworLyoqCisgKiBAYXV0aG9yIEJvYiBGb3N0ZXIKKyAqLworcHVibGljIGludGVyZmFjZSBJTWFwSG9sZGVyIGV4dGVuZHMgSUtleUhvbGRlciwgSVZhbHVlSG9sZGVyIHsKKworfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9kdGQvdXRpbC9JVmFsdWVIb2xkZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZHRkL3V0aWwvSVZhbHVlSG9sZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVmMGIyNgotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZHRkL3V0aWwvSVZhbHVlSG9sZGVyLmphdmEKQEAgLTAsMCArMSwyMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNSBPYmplY3QgRmFjdG9yeSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICoJCU9iamVjdCBGYWN0b3J5IEluYy4gLSBJbml0aWFsIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmR0ZC51dGlsOworCisvKioKKyAqIEBhdXRob3IgQm9iIEZvc3RlcgorICovCitwdWJsaWMgaW50ZXJmYWNlIElWYWx1ZUhvbGRlciB7CisKKwlPYmplY3RbXSBnZXRWYWx1ZXMoKTsKKwkKKwl2b2lkIHNldFZhbHVlcyhPYmplY3RbXSB2YWx1ZXMpOworfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9kdGQvdXRpbC9NYXBIb2xkZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZHRkL3V0aWwvTWFwSG9sZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y4NjIyMwotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZHRkL3V0aWwvTWFwSG9sZGVyLmphdmEKQEAgLTAsMCArMSw0OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNSBPYmplY3QgRmFjdG9yeSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICoJCU9iamVjdCBGYWN0b3J5IEluYy4gLSBJbml0aWFsIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmR0ZC51dGlsOworCisvKioKKyAqIEBhdXRob3IgQm9iIEZvc3RlcgorICovCitwdWJsaWMgY2xhc3MgTWFwSG9sZGVyIGV4dGVuZHMgU29ydGVkTWFwRmFjdG9yeSBpbXBsZW1lbnRzIElNYXBIb2xkZXIgeworCisJcHVibGljIE9iamVjdFtdIGtleXM7CisJcHVibGljIE9iamVjdFtdIHZhbHVlczsKKwkKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZHRkLnV0aWwuSUtleUhvbGRlciNnZXRLZXlzKCkKKwkgKi8KKwlwdWJsaWMgT2JqZWN0W10gZ2V0S2V5cygpIHsKKwkJcmV0dXJuIGtleXM7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmR0ZC51dGlsLklLZXlIb2xkZXIjc2V0S2V5cyhqYXZhLmxhbmcuT2JqZWN0W10pCisJICovCisJcHVibGljIHZvaWQgc2V0S2V5cyhPYmplY3RbXSBrZXlzKSB7CisJCXRoaXMua2V5cyA9IGtleXM7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmR0ZC51dGlsLklWYWx1ZUhvbGRlciNnZXRWYWx1ZXMoKQorCSAqLworCXB1YmxpYyBPYmplY3RbXSBnZXRWYWx1ZXMoKSB7CisJCXJldHVybiB2YWx1ZXM7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmR0ZC51dGlsLklWYWx1ZUhvbGRlciNzZXRWYWx1ZXMoamF2YS5sYW5nLk9iamVjdFtdKQorCSAqLworCXB1YmxpYyB2b2lkIHNldFZhbHVlcyhPYmplY3RbXSB2YWx1ZXMpIHsKKwkJdGhpcy52YWx1ZXMgPSB2YWx1ZXM7CisJfQorfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9kdGQvdXRpbC9Tb3J0ZWRNYXBGYWN0b3J5LmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2R0ZC91dGlsL1NvcnRlZE1hcEZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzcyZTk3Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9kdGQvdXRpbC9Tb3J0ZWRNYXBGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBPYmplY3QgRmFjdG9yeSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICoJCU9iamVjdCBGYWN0b3J5IEluYy4gLSBJbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGZpeCBmb3IgQnVnIDExMDYzNgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5kdGQudXRpbDsKKworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworCisvKioKKyAqIENhbiBiZSBpbmhlcml0ZWQgb3IgdXNlZCBzdGF0aWNhbGx5LgorICogQGF1dGhvciBCb2IgRm9zdGVyCisgKi8KK3B1YmxpYyBjbGFzcyBTb3J0ZWRNYXBGYWN0b3J5IHsKKworCXByaXZhdGUgc3RhdGljIGNsYXNzIEluZGlyZWN0U3RyaW5nQ29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3IgeworCQkvKioKKwkJICogQHNlZSBqYXZhLnV0aWwuQ29tcGFyYXRvciNjb21wYXJlKE9iamVjdCwgT2JqZWN0KQorCQkgKi8KKwkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7CisJCQlyZXR1cm4gbzEudG9TdHJpbmcoKS5jb21wYXJlVG8obzIudG9TdHJpbmcoKSk7CisJCX0KKwl9CisgICAgCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW5kaXJlY3RTdHJpbmdDb21wYXJhdG9yIGZJbmRpcmVjdFN0cmluZ0NvbXAgPSBuZXcgSW5kaXJlY3RTdHJpbmdDb21wYXJhdG9yKCk7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmFjdG9yeSBmRmFjdG9yeSA9IG5ldyBGYWN0b3J5KCk7CisKKwlwdWJsaWMgc3RhdGljIFNvcnRlZE1hcCBnZXRNYXAoSU1hcEhvbGRlciBob2xkZXIsIENvbXBhcmF0b3IgY29tcCkgeworCQlTb3J0ZWRNYXAgbWFwID0gKFNvcnRlZE1hcCkgZkZhY3RvcnkuZ2V0RnJlZSgpOworCQlpZiAobWFwID09IG51bGwpCisJCQltYXAgPSBuZXcgU29ydGVkTWFwKCk7CisJCW1hcC5zZXRNYXBIb2xkZXIoaG9sZGVyKTsKKwkJbWFwLnNldENvbXBhcmF0b3IoY29tcCk7CisJCXJldHVybiBtYXA7CisJfQorCQorCXB1YmxpYyBzdGF0aWMgU29ydGVkTWFwIGdldEluZGlyZWN0U3RyaW5nTWFwKElNYXBIb2xkZXIgaG9sZGVyKSB7CisJCXJldHVybiBnZXRNYXAoaG9sZGVyLCBmSW5kaXJlY3RTdHJpbmdDb21wKTsKKwl9CisJCisJcHVibGljIHN0YXRpYyB2b2lkIGZyZWVNYXAoU29ydGVkTWFwIG1hcCkgeworCQltYXAuc2V0Q29tcGFyYXRvcihudWxsKTsKKwkJbWFwLnNldE1hcEhvbGRlcihudWxsKTsKKwkJZkZhY3Rvcnkuc2V0RnJlZShtYXApOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2R0ZC91dGlsL1NvcnRlZFNldC5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9kdGQvdXRpbC9Tb3J0ZWRTZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDA3ZmRjCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9kdGQvdXRpbC9Tb3J0ZWRTZXQuamF2YQpAQCAtMCwwICsxLDI2MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNSBPYmplY3QgRmFjdG9yeSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICoJCU9iamVjdCBGYWN0b3J5IEluYy4gLSBJbml0aWFsIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmR0ZC51dGlsOworCitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CisKKy8qKgorICogU29ydGVkU2V0IGlzIGEgZmx5d2VpZ2h0IHNldCBpbXBsZW1lbnRhdGlvbiB0aGF0IHVzZXMKKyAqIGFuIGV4dGVybmFsIGFycmF5IHByb3ZpZGVkIGJ5IGEgS2V5SG9sZGVyLgorICogU29ydGVkU2V0IHByb3ZpZGVzIGJvdGggZXF1YWxpdHkvY29tcGFyaXNvbiBvcGVyYXRpb25zCisgKiBhbmQgaWRlbnRpdHkgb3BlcmF0aW9ucy4KKyAqIEBhdXRob3IgQm9iIEZvc3RlcgorICovCitwdWJsaWMgY2xhc3MgU29ydGVkU2V0IHsKKwlwcm90ZWN0ZWQgQ29tcGFyYXRvciBmQ29tcDsKKwlwcm90ZWN0ZWQgSUtleUhvbGRlciBmS2V5SG9sZGVyOworCXByb3RlY3RlZCBTb3J0ZWRTZXQgZk5leHQ7CisJCisJcHVibGljIFNvcnRlZFNldChJS2V5SG9sZGVyIGhvbGRlciwgQ29tcGFyYXRvciBjb21wKSB7CisJCWZDb21wID0gY29tcDsKKwkJZktleUhvbGRlciA9IGhvbGRlcjsKKwl9CisJLyoqCisJICogQ29uc3RydWN0b3IuIEEga2V5aG9sZGVyIG11c3QgYmUKKwkgKiBzdXBwbGllZCBieSA8Y29kZT5zZXRLZXlIb2xkZXIoKTwvY29kZT4gcHJpb3Igb3QKKwkgKiA8aT5hbnk8L2k+IG9wZXJhdGlvbnMuCisJICovCisJcHVibGljIFNvcnRlZFNldChDb21wYXJhdG9yIGNvbXApIHsKKwkJZkNvbXAgPSBjb21wOworCX0KKwkvKioKKwkgKiBDb25zdHJ1Y3Rvciwgbm8gY29tcGFyYXRvci4gT25seSBpZGVudGl0eSBvcGVyYXRpb25zCisJICogbWF5IGJlIHBlcmZvcm1lZCBpbiB0aGlzIHNldC4KKwkgKi8KKwlwdWJsaWMgU29ydGVkU2V0KElLZXlIb2xkZXIgaG9sZGVyKSB7CisJCWZLZXlIb2xkZXIgPSBob2xkZXI7CisJfQorCS8qKgorCSAqIENvbnN0cnVjdG9yLCBubyBjb21wYXJhdG9yLiBPbmx5IGlkZW50aXR5IG9wZXJhdGlvbnMKKwkgKiBtYXkgYmUgcGVyZm9ybWVkIGluIHRoaXMgc2V0LiBBIGtleWhvbGRlciBtdXN0IGJlCisJICogc3VwcGxpZWQgYnkgPGNvZGU+c2V0S2V5SG9sZGVyKCk8L2NvZGU+IHByaW9yIG90CisJICogPGk+YW55PC9pPiBvcGVyYXRpb25zLgorCSAqLworCXB1YmxpYyBTb3J0ZWRTZXQoKSB7CisJfQorCXB1YmxpYyB2b2lkIHNldEtleUhvbGRlcihJS2V5SG9sZGVyIGhvbGRlcikgeworCQlmS2V5SG9sZGVyID0gaG9sZGVyOworCX0KKwlwdWJsaWMgdm9pZCBzZXRDb21wYXJhdG9yKENvbXBhcmF0b3IgY29tcCkgeworCQlmQ29tcCA9IGNvbXA7CisJfQorCS8qKgorCSAqIEFkZCB0byBzZXQgKG5vIGR1cGxpY2F0ZXMgYWxsb3dlZCkuCisJICogQHBhcmFtIG9iaiBPYmplY3QgdG8gYWRkCisJICogQHJldHVybiB0cnVlIGlmIG9iamVjdCB3YXMgYWRkZWQ7IGZhbHNlCisJICogaWYgb2JqZWN0IHdhcyBhbHJlYWR5IGluIHRoZSBzZXQuCisJICovCisJcHVibGljIGJvb2xlYW4gYWRkKE9iamVjdCBvYmopIHsKKwkJcmV0dXJuIGludGVybmFsQWRkKG9iaiwgZmFsc2UpID49IDA7CisJfQorCXByb3RlY3RlZCBpbnQgaW50ZXJuYWxBZGQoT2JqZWN0IG9iaiwgYm9vbGVhbiBhbHdheXMpIHsKKwkJT2JqZWN0W10gYXJyYXkgPSBmS2V5SG9sZGVyLmdldEtleXMoKTsKKwkJaWYgKGFycmF5ID09IG51bGwpIHsKKwkJCWFycmF5ID0gbmV3IE9iamVjdFsxXTsKKwkJCWZLZXlIb2xkZXIuc2V0S2V5cyhhcnJheSk7CisJCQlhcnJheVswXSA9IG9iajsKKwkJCXJldHVybiAwOworCQl9CisJCWludCBpID0gMDsKKwkJaW50IGNvbXAgPSAtMTsKKwkJCisJCWZvciAoOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHsKKwkJCWlmICgoY29tcCA9IGZDb21wLmNvbXBhcmUob2JqLCBhcnJheVtpXSkpIDw9IDApIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoY29tcCA9PSAwICYmICFhbHdheXMpCisJCQlyZXR1cm4gLTE7CisJCWludGVybmFsQWRkKGksIG9iaik7CisJCXJldHVybiBpOworCX0KKwlwcm90ZWN0ZWQgdm9pZCBpbnRlcm5hbEFkZChpbnQgaSwgT2JqZWN0IG9iaikgeworCQlPYmplY3RbXSBhcnJheSA9IGZLZXlIb2xkZXIuZ2V0S2V5cygpOworCQlpZiAoYXJyYXkgPT0gbnVsbCkgeworCQkJYXJyYXkgPSBuZXcgT2JqZWN0WzFdOworCQkJYXJyYXlbMF0gPSBvYmo7CisJCQlmS2V5SG9sZGVyLnNldEtleXMoYXJyYXkpOworCQl9CisJCWVsc2UgeworCQkJT2JqZWN0W10gdG1wID0gbmV3IE9iamVjdFthcnJheS5sZW5ndGgrMV07CisJCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LDAsdG1wLDAsaSk7CisJCQl0bXBbaV0gPSBvYmo7CisJCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LGksdG1wLGkrMSxhcnJheS5sZW5ndGgtaSk7CisJCQlmS2V5SG9sZGVyLnNldEtleXModG1wKTsKKwkJfQorCX0KKwkvKioKKwkgKiBBZGQgYWxsb3dpbmcgZHVwbGljYXRlcy4KKwkgKiBAcGFyYW0gb2JqIE9iamVjdCB0byBhZGQKKwkgKiBAcmV0dXJuIGluZGV4IHdoZXJlIG9iamVjdCB3YXMgYWRkZWQgaW4gc29ydGVkIG9yZGVyLgorCSAqLworCXB1YmxpYyBpbnQgYWRkQWx3YXlzKE9iamVjdCBvYmopIHsKKwkJcmV0dXJuIGludGVybmFsQWRkKG9iaiwgdHJ1ZSk7CisJfQorCS8qKgorCSAqIEFwcGVuZCwgYSB2YXJpYW50IG9mIGFkZCBhbGxvd2luZyBkdXBsaWNhdGVzIHRoYXQKKwkgKiBhbHdheXMgcHV0cyB0aGUgbmV3IG1lbWJlciBhdCB0aGUgZW5kIG9mIHRoZSBzZXQuCisJICogU2V0IGNhbiBiZSB1c2VkIHdpdGggaWRlbnRpdHkgb3BlcmF0aW9ucyBvbmx5LgorCSAqLworCXB1YmxpYyB2b2lkIGFwcGVuZChPYmplY3Qgb2JqKSB7CisJCU9iamVjdFtdIGFycmF5ID0gZktleUhvbGRlci5nZXRLZXlzKCk7CisJCWludCBsZW4gPSBhcnJheSAhPSBudWxsID8gYXJyYXkubGVuZ3RoIDogMDsKKwkJaW50ZXJuYWxBZGQobGVuLCBvYmopOworCX0KKwlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3Qgb2JqKSB7CisJCXJldHVybiBpbmRleE9mKG9iaikgPj0gMDsKKwl9CisJcHVibGljIGludCBpbmRleE9mKE9iamVjdCBvYmopIHsKKwkJT2JqZWN0W10gYXJyYXkgPSBmS2V5SG9sZGVyLmdldEtleXMoKTsKKwkJaWYgKGFycmF5ID09IG51bGwpCisJCQlyZXR1cm4gLTE7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHsKKwkJCWludCBjb21wID0gZkNvbXAuY29tcGFyZShvYmosIGFycmF5W2ldKTsKKwkJCWlmIChjb21wID09IDApCisJCQkJcmV0dXJuIGk7CisJCQlpZiAoY29tcCA8IDApCisJCQkJcmV0dXJuIC0xOworCQl9CisJCXJldHVybiAtMTsKKwl9CisJcHVibGljIGJvb2xlYW4gY29udGFpbnNJZGVudGl0eShPYmplY3Qgb2JqKSB7CisJCXJldHVybiBpbmRleE9mKG9iaikgPj0gMDsKKwl9CisJcHVibGljIGludCBpbmRleE9mSWRlbnRpdHkoT2JqZWN0IG9iaikgeworCQlPYmplY3RbXSBhcnJheSA9IGZLZXlIb2xkZXIuZ2V0S2V5cygpOworCQlpZiAoYXJyYXkgPT0gbnVsbCkKKwkJCXJldHVybiAtMTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykgeworCQkJaWYgKG9iaiA9PSBhcnJheVtpXSkKKwkJCQlyZXR1cm4gaTsKKwkJfQorCQlyZXR1cm4gLTE7CisJfQorCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworCQlpZiAodGhpcyA9PSBvKQorCQkJcmV0dXJuIHRydWU7CisJCWlmICghKG8gaW5zdGFuY2VvZiBTb3J0ZWRTZXQpKQorCQkJcmV0dXJuIGZhbHNlOworCQlTb3J0ZWRTZXQgb3RoZXIgPSAoU29ydGVkU2V0KSBvOworCQlPYmplY3RbXSBhcnJheSA9IGZLZXlIb2xkZXIuZ2V0S2V5cygpOworCQlPYmplY3RbXSBvdGhlcmFycmF5ID0gb3RoZXIuZktleUhvbGRlci5nZXRLZXlzKCk7CisJCWlmICgoYXJyYXkgPT0gbnVsbCkgIT0gKG90aGVyYXJyYXkgPT0gbnVsbCkpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmIChhcnJheSA9PSBudWxsKQorCQkJcmV0dXJuIHRydWU7CisJCWlmIChhcnJheS5sZW5ndGggIT0gb3RoZXJhcnJheS5sZW5ndGgpCisJCQlyZXR1cm4gZmFsc2U7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHsKKwkJCWlmIChhcnJheVtpXSAhPSBvdGhlcmFycmF5W2ldKQorCQkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcHVibGljIGJvb2xlYW4gZXF1YWxzSWRlbnRpZnkoT2JqZWN0IG8pIHsKKwkJaWYgKHRoaXMgPT0gbykKKwkJCXJldHVybiB0cnVlOworCQlpZiAoIShvIGluc3RhbmNlb2YgU29ydGVkU2V0KSkKKwkJCXJldHVybiBmYWxzZTsKKwkJU29ydGVkU2V0IG90aGVyID0gKFNvcnRlZFNldCkgbzsKKwkJT2JqZWN0W10gYXJyYXkgPSBmS2V5SG9sZGVyLmdldEtleXMoKTsKKwkJT2JqZWN0W10gb3RoZXJhcnJheSA9IG90aGVyLmZLZXlIb2xkZXIuZ2V0S2V5cygpOworCQlpZiAoKGFycmF5ID09IG51bGwpICE9IChvdGhlcmFycmF5ID09IG51bGwpKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAoYXJyYXkgPT0gbnVsbCkKKwkJCXJldHVybiB0cnVlOworCQlpZiAoYXJyYXkubGVuZ3RoICE9IG90aGVyYXJyYXkubGVuZ3RoKQorCQkJcmV0dXJuIGZhbHNlOworCQlmb3IgKGludCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7CisJCQlpZiAoZkNvbXAuY29tcGFyZShhcnJheVtpXSwgb3RoZXJhcnJheVtpXSkgIT0gMCkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCXB1YmxpYyB2b2lkIG1lcmdlKFNvcnRlZFNldCBvdGhlcikgeworCQlPYmplY3RbXSBhcnJheSA9IGZLZXlIb2xkZXIuZ2V0S2V5cygpOworCQlPYmplY3RbXSBvdGhlcmFycmF5ID0gb3RoZXIuZktleUhvbGRlci5nZXRLZXlzKCk7CisJCWlmIChvdGhlcmFycmF5ID09IG51bGwpCisJCQlyZXR1cm47CisJCWlmIChhcnJheSA9PSBudWxsKSB7CisJCQlhcnJheSA9IG90aGVyYXJyYXk7CisJCQlyZXR1cm47CisJCX0KKwkJaW50IGl0aGlzID0gMCwgaW90aGVyID0gMCwgaSA9IDA7CisJCWludCBtdGhpcyA9IGFycmF5Lmxlbmd0aCwgbW90aGVyID0gb3RoZXJhcnJheS5sZW5ndGg7CisJCU9iamVjdFtdIHRtcCA9IG5ldyBPYmplY3RbbXRoaXMrbW90aGVyXTsKKwkJd2hpbGUgKGl0aGlzIDwgbXRoaXMgJiYgaW90aGVyIDwgbW90aGVyKSB7CisJCQlpbnQgY29tcCA9IGZDb21wLmNvbXBhcmUoYXJyYXlbaXRoaXNdLCBvdGhlcmFycmF5W2lvdGhlcl0pOworCQkJaWYgKGNvbXAgPD0gMCkgeworCQkJCXRtcFtpKytdID0gYXJyYXlbaXRoaXMrK107CisJCQl9CisJCQllbHNlIHsKKwkJCQl0bXBbaSsrXSA9IG90aGVyYXJyYXlbaW90aGVyKytdOworCQkJfQorCQl9CisJCXdoaWxlIChpdGhpcyA8IG10aGlzKSB7CisJCQl0bXBbaSsrXSA9IGFycmF5W2l0aGlzKytdOworCQl9CisJCXdoaWxlIChpb3RoZXIgPCBtb3RoZXIpIHsKKwkJCXRtcFtpKytdID0gb3RoZXJhcnJheVtpb3RoZXIrK107CisJCX0KKwl9CisJcHVibGljIE9iamVjdFtdIG1lbWJlcnMoKSB7CisJCU9iamVjdFtdIGFycmF5ID0gZktleUhvbGRlci5nZXRLZXlzKCk7CisJCWlmIChhcnJheSA9PSBudWxsKQorCQkJcmV0dXJuIG5ldyBPYmplY3RbMF07CisJCXJldHVybiBhcnJheTsKKwl9CisJcHVibGljIGludCBzaXplKCkgeworCQlPYmplY3RbXSBhcnJheSA9IGZLZXlIb2xkZXIuZ2V0S2V5cygpOworCQlyZXR1cm4gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7CisJfQorCXB1YmxpYyB2b2lkIHJlbW92ZShpbnQgaSkgeworCQlPYmplY3RbXSBhcnJheSA9IGZLZXlIb2xkZXIuZ2V0S2V5cygpOworCQlPYmplY3RbXSB0bXAgPSBuZXcgT2JqZWN0W2FycmF5Lmxlbmd0aC0xXTsKKwkJU3lzdGVtLmFycmF5Y29weShhcnJheSwwLHRtcCwwLGkpOworCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LGkrMSx0bXAsaSxhcnJheS5sZW5ndGgtaS0xKTsKKwkJZktleUhvbGRlci5zZXRLZXlzKHRtcCk7CisJfQorCXB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3Qgb2JqKSB7CisJCWludCBpID0gaW5kZXhPZihvYmopOworCQlpZiAoaSA+PSAwKSB7CisJCQlyZW1vdmUoaSk7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCXB1YmxpYyBib29sZWFuIHJlbW92ZUlkZW50aXR5KE9iamVjdCBvYmopIHsKKwkJaW50IGkgPSBpbmRleE9mSWRlbnRpdHkob2JqKTsKKwkJaWYgKGkgPj0gMCkgeworCQkJcmVtb3ZlKGkpOworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKwlwdWJsaWMgU29ydGVkU2V0IGdldE5leHRTZXQoKSB7CisJCXJldHVybiBmTmV4dDsKKwl9CisJcHVibGljIHZvaWQgc2V0TmV4dFNldChTb3J0ZWRTZXQgbmV4dCkgeworCQlmTmV4dCA9IG5leHQ7CisJfQorCit9CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci9BbnRBdXRvRWRpdFN0cmF0ZWd5LmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci9BbnRBdXRvRWRpdFN0cmF0ZWd5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M5OTdlNAotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL0FudEF1dG9FZGl0U3RyYXRlZ3kuamF2YQpAQCAtMCwwICsxLDMxNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAorcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5BbnRVSVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLmZvcm1hdHRlci5YbWxEb2N1bWVudEZvcm1hdHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkubW9kZWwuQW50RWxlbWVudE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLm1vZGVsLkFudE1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5EZWZhdWx0SW5kZW50TGluZUF1dG9FZGl0U3RyYXRlZ3k7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50Q29tbWFuZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0VXRpbGl0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQWJzdHJhY3REZWNvcmF0ZWRUZXh0RWRpdG9yUHJlZmVyZW5jZUNvbnN0YW50czsKKworLyoqCisgKiBBdXRvIGVkaXQgc3RyYXRlZ3kgZm9yIEFudCBidWlsZCBmaWxlcworICogQ3VycmVudCBkb2VzIHNwZWNpYWwgaW5kZW50aW5nLgorICovCitwdWJsaWMgY2xhc3MgQW50QXV0b0VkaXRTdHJhdGVneSBleHRlbmRzIERlZmF1bHRJbmRlbnRMaW5lQXV0b0VkaXRTdHJhdGVneSB7CisJCisJcHJpdmF0ZSBBbnRNb2RlbCBmTW9kZWw7CisJcHJpdmF0ZSBpbnQgZkFjY3VtdWxhdGVkQ2hhbmdlPSAwOworCQorCXB1YmxpYyBBbnRBdXRvRWRpdFN0cmF0ZWd5KEFudE1vZGVsIG1vZGVsKSB7CisJCWZNb2RlbD0gbW9kZWw7CisJfQorCQorCS8qKgorCSAqIFNldHMgdGhlIGluZGVudGF0aW9uIGJhc2VkIG9uIHRoZSBBbnQgZWxlbWVudCBub2RlIHRoYXQgY29udGFpbnMgdGhlIG9mZnNldAorCSAqIG9mIHRoZSBkb2N1bWVudCBjb21tYW5kLgorCSAqCisJICogQHBhcmFtIGQgdGhlIGRvY3VtZW50IHRvIHdvcmsgb24KKwkgKiBAcGFyYW0gYyB0aGUgY29tbWFuZCB0byBkZWFsIHdpdGgKKwkgKi8KKwlwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGF1dG9JbmRlbnRBZnRlck5ld0xpbmUoSURvY3VtZW50IGQsIERvY3VtZW50Q29tbWFuZCBjKSB7CisJCQorCQlpZiAoYy5vZmZzZXQgPT0gLTEgfHwgZC5nZXRMZW5ndGgoKSA9PSAwIHx8IGZNb2RlbC5nZXRQcm9qZWN0Tm9kZShmYWxzZSkgPT0gbnVsbCkgeworCQkJcmV0dXJuOworCQl9CisJCQorCQlpbnQgcG9zaXRpb249IChjLm9mZnNldCA9PSBkLmdldExlbmd0aCgpID8gYy5vZmZzZXQgIC0gMSA6IGMub2Zmc2V0KTsKKwkJQW50RWxlbWVudE5vZGUgbm9kZT0gZk1vZGVsLmdldFByb2plY3ROb2RlKGZhbHNlKS5nZXROb2RlKHBvc2l0aW9uIC0gZkFjY3VtdWxhdGVkQ2hhbmdlKTsKKwkJaWYgKG5vZGUgPT0gbnVsbCkgeworCQkJcmV0dXJuOworCQl9CisJCQorCQl0cnkgeworCQkJU3RyaW5nQnVmZmVyIGNvcnJlY3Q9IFhtbERvY3VtZW50Rm9ybWF0dGVyLmdldExlYWRpbmdXaGl0ZXNwYWNlKG5vZGUuZ2V0T2Zmc2V0KCksIGQpOworCQkJaWYgKCFuZXh0Tm9kZUlzRW5kVGFnKGMub2Zmc2V0LCBkKSkgeworCQkJCWNvcnJlY3QuYXBwZW5kKFhtbERvY3VtZW50Rm9ybWF0dGVyLmNyZWF0ZUluZGVudCgpKTsKKwkJCX0KKwkJCVN0cmluZ0J1ZmZlciBidWY9IG5ldyBTdHJpbmdCdWZmZXIoYy50ZXh0KTsKKwkJCWJ1Zi5hcHBlbmQoY29ycmVjdCk7CisJCQlmQWNjdW11bGF0ZWRDaGFuZ2UrPSBidWYubGVuZ3RoKCk7CisJCQkKKwkJCWludCBsaW5lPSBkLmdldExpbmVPZk9mZnNldChwb3NpdGlvbik7CisJCQlJUmVnaW9uIHJlZz0gZC5nZXRMaW5lSW5mb3JtYXRpb24obGluZSk7CisJCQlpbnQgbGluZUVuZD0gcmVnLmdldE9mZnNldCgpICsgcmVnLmdldExlbmd0aCgpOworCQkJaW50IGNvbnRlbnRTdGFydD0gZmluZEVuZE9mV2hpdGVTcGFjZShkLCBjLm9mZnNldCwgbGluZUVuZCk7CisJCQkKKwkJCWMubGVuZ3RoPSAgTWF0aC5tYXgoY29udGVudFN0YXJ0IC0gYy5vZmZzZXQsIDApOworCQkJYy5jYXJldE9mZnNldD0gYy5vZmZzZXQgKyBidWYubGVuZ3RoKCk7CisJCQljLnNoaWZ0c0NhcmV0PSBmYWxzZTsKKwkJCWMudGV4dD0gYnVmLnRvU3RyaW5nKCk7CisJCisJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKKwkJCUFudFVJUGx1Z2luLmxvZyhlKTsKKwkJfQorCX0KKwkKKwlwcml2YXRlIGJvb2xlYW4gbmV4dE5vZGVJc0VuZFRhZyhpbnQgb2Zmc2V0LCBJRG9jdW1lbnQgZG9jdW1lbnQpIHsKKwkJaWYgKG9mZnNldCArIDEgPiBkb2N1bWVudC5nZXRMZW5ndGgoKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCXRyeSB7CisJCQlJUmVnaW9uIGxpbmVSZWdpb249IGRvY3VtZW50LmdldExpbmVJbmZvcm1hdGlvbk9mT2Zmc2V0KG9mZnNldCk7CisJCQlvZmZzZXQ9IGZpbmRFbmRPZldoaXRlU3BhY2UoZG9jdW1lbnQsIG9mZnNldCwgbGluZVJlZ2lvbi5nZXRPZmZzZXQoKSArIGxpbmVSZWdpb24uZ2V0TGVuZ3RoKCkpOworCQkJU3RyaW5nIG5leHRDaGFycz0gZG9jdW1lbnQuZ2V0KG9mZnNldCwgMikudHJpbSgpOworCQkJaWYgKCI8LyIuZXF1YWxzKG5leHRDaGFycykgfHwgIi8+Ii5lcXVhbHMobmV4dENoYXJzKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgeworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklBdXRvRWRpdFN0cmF0ZWd5I2N1c3RvbWl6ZURvY3VtZW50Q29tbWFuZChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCwgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudENvbW1hbmQpCisJICovCisJcHVibGljIHZvaWQgY3VzdG9taXplRG9jdW1lbnRDb21tYW5kKElEb2N1bWVudCBkLCBEb2N1bWVudENvbW1hbmQgYykgeworCQkKKwkJaWYgKGMubGVuZ3RoID09IDAgJiYgYy50ZXh0ICE9IG51bGwgJiYgaXNMaW5lRGVsaW1pdGVyKGQsIGMudGV4dCkpIHsKKwkJCWF1dG9JbmRlbnRBZnRlck5ld0xpbmUoZCwgYyk7CisJCX0gZWxzZSBpZiAoYy50ZXh0Lmxlbmd0aCgpID4gMSkgeworCQkJc21hcnRQYXN0ZShkLCBjKTsKKwkJfQorCX0KKwkKKwkgcHJpdmF0ZSBib29sZWFuIGlzTGluZURlbGltaXRlcihJRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyB0ZXh0KSB7CisJCVN0cmluZ1tdIGRlbGltaXRlcnM9IGRvY3VtZW50LmdldExlZ2FsTGluZURlbGltaXRlcnMoKTsKKwkJaWYgKGRlbGltaXRlcnMgIT0gbnVsbCkKKwkJCXJldHVybiBUZXh0VXRpbGl0aWVzLmVxdWFscyhkZWxpbWl0ZXJzLCB0ZXh0KSA+IC0xOworCQlyZXR1cm4gZmFsc2U7CisJfQorCQorCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZWNvbmNpbGVkKCkgeworCQlmQWNjdW11bGF0ZWRDaGFuZ2U9IDA7CisJfQorCQorCXByaXZhdGUgdm9pZCBzbWFydFBhc3RlKElEb2N1bWVudCBkb2N1bWVudCwgRG9jdW1lbnRDb21tYW5kIGNvbW1hbmQpIHsKKwkJdHJ5IHsKKwkJCWlmIChjb21tYW5kLm9mZnNldCA9PSAtMSB8fCBkb2N1bWVudC5nZXRMZW5ndGgoKSA9PSAwIHx8IGZNb2RlbC5nZXRQcm9qZWN0Tm9kZShmYWxzZSkgPT0gbnVsbCkgeworCQkJCXJldHVybjsKKwkJCX0KKwkJCVN0cmluZyBvcmlnQ2hhbmdlPSBjb21tYW5kLnRleHQ7CisJCQlpbnQgcG9zaXRpb249IChjb21tYW5kLm9mZnNldCA9PSBkb2N1bWVudC5nZXRMZW5ndGgoKSA/IGNvbW1hbmQub2Zmc2V0ICAtIDEgOiBjb21tYW5kLm9mZnNldCk7CisJCQlBbnRFbGVtZW50Tm9kZSBub2RlPSBmTW9kZWwuZ2V0UHJvamVjdE5vZGUoZmFsc2UpLmdldE5vZGUocG9zaXRpb24gLSBmQWNjdW11bGF0ZWRDaGFuZ2UpOworCQkJaWYgKG5vZGUgPT0gbnVsbCkgeworCQkJCXJldHVybjsKKwkJCX0KKwkJCQorCQkJLy8gZWF0IGFueSBXUyBiZWZvcmUgdGhlIGluc2VydGlvbiB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lCisJCQlpbnQgZmlyc3RMaW5lPSAxOyAvLyBkb24ndCBmb3JtYXQgdGhlIGZpcnN0IGxpbmUgaWYgaXQgaGFzIG90aGVyIGNvbnRlbnQgYmVmb3JlIGl0CisJCQlJUmVnaW9uIGxpbmU9IGRvY3VtZW50LmdldExpbmVJbmZvcm1hdGlvbk9mT2Zmc2V0KGNvbW1hbmQub2Zmc2V0KTsKKwkJCVN0cmluZyBub3RTZWxlY3RlZD0gZG9jdW1lbnQuZ2V0KGxpbmUuZ2V0T2Zmc2V0KCksIGNvbW1hbmQub2Zmc2V0IC0gbGluZS5nZXRPZmZzZXQoKSk7CisJCQlpZiAobm90U2VsZWN0ZWQudHJpbSgpLmxlbmd0aCgpID09IDApIHsKKwkJCQljb21tYW5kLmxlbmd0aCArPSBub3RTZWxlY3RlZC5sZW5ndGgoKTsKKwkJCQljb21tYW5kLm9mZnNldD0gbGluZS5nZXRPZmZzZXQoKTsKKwkJCQlmaXJzdExpbmU9IDA7CisJCQl9CisJCQkKKwkJCS8vIGhhbmRsZSB0aGUgaW5kZW50YXRpb24gY29tcHV0YXRpb24gaW5zaWRlIGEgdGVtcG9yYXJ5IGRvY3VtZW50CisJCQlEb2N1bWVudCB0ZW1wPSBuZXcgRG9jdW1lbnQoY29tbWFuZC50ZXh0KTsKKwkJCQorCQkJLy8gaW5kZW50IHRoZSBmaXJzdCBhbmQgc2Vjb25kIGxpbmUKKwkJCS8vIGNvbXB1dGUgdGhlIHJlbGF0aXZlIGluZGVudGF0aW9uIGRpZmZlcmVuY2UgZnJvbSB0aGUgc2Vjb25kIGxpbmUKKwkJCS8vIChhcyB0aGUgZmlyc3QgbWlnaHQgYmUgcGFydGlhbGx5IHNlbGVjdGVkKSBhbmQgdXNlIHRoZSB2YWx1ZSB0bworCQkJLy8gaW5kZW50IGFsbCBvdGhlciBsaW5lcy4KKwkJCWJvb2xlYW4gaXNJbmRlbnREZXRlY3RlZD0gZmFsc2U7CisJCQlTdHJpbmdCdWZmZXIgYWRkaXRpb249IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJCWludCBpbnNlcnRMZW5ndGg9IDA7CisJCQlpbnQgbGluZXM9IHRlbXAuZ2V0TnVtYmVyT2ZMaW5lcygpOworCQkJZm9yIChpbnQgbD0gZmlyc3RMaW5lOyBsIDwgbGluZXM7IGwrKykgeyAvLyB3ZSBkb24ndCBjaGFuZ2UgdGhlIG51bWJlciBvZiBsaW5lcyB3aGlsZSBhZGRpbmcgaW5kZW50cworCQkJCQorCQkJCUlSZWdpb24gcj0gdGVtcC5nZXRMaW5lSW5mb3JtYXRpb24obCk7CisJCQkJaW50IGxpbmVPZmZzZXQ9IHIuZ2V0T2Zmc2V0KCk7CisJCQkJaW50IGxpbmVMZW5ndGg9IHIuZ2V0TGVuZ3RoKCk7CisJCQkJCisJCQkJaWYgKGxpbmVMZW5ndGggPT0gMCkgeyAvLyBkb24ndCBtb2RpZnkgZW1wdHkgbGluZXMKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCQorCQkJCWlmICghaXNJbmRlbnREZXRlY3RlZCl7CisJCQkJCQorCQkJCQkvLyBpbmRlbnQgdGhlIGZpcnN0IHBhc3RlZCBsaW5lCisJCQkJCVN0cmluZ0J1ZmZlciBjdXJyZW50PSBYbWxEb2N1bWVudEZvcm1hdHRlci5nZXRMZWFkaW5nV2hpdGVzcGFjZShsaW5lT2Zmc2V0LCB0ZW1wKTsKKwkJCQkJU3RyaW5nQnVmZmVyIGNvcnJlY3Q9IFhtbERvY3VtZW50Rm9ybWF0dGVyLmdldExlYWRpbmdXaGl0ZXNwYWNlKG5vZGUuZ2V0T2Zmc2V0KCksIGRvY3VtZW50KTsKKwkJCQkJY29ycmVjdC5hcHBlbmQoWG1sRG9jdW1lbnRGb3JtYXR0ZXIuY3JlYXRlSW5kZW50KCkpOworCQkJCQkKKwkJCQkJaW5zZXJ0TGVuZ3RoPSBzdWJ0cmFjdEluZGVudChjb3JyZWN0LCBjdXJyZW50LCBhZGRpdGlvbik7CisJCQkJCWlzSW5kZW50RGV0ZWN0ZWQ9IHRydWU7CisJCQkJfQorCQkJCQorCQkJCS8vIHJlbGF0aXZlbHkgaW5kZW50IGFsbCBwYXN0ZWQgbGluZXMgCisJCQkJaWYgKGluc2VydExlbmd0aCA+IDApIHsKKwkJCQkJYWRkSW5kZW50KHRlbXAsIGwsIGFkZGl0aW9uKTsKKwkJCQl9IGVsc2UgaWYgKGluc2VydExlbmd0aCA8IDApIHsKKwkJCQkJY3V0SW5kZW50KHRlbXAsIGwsIC1pbnNlcnRMZW5ndGgpOworCQkJCX0JCisJCQl9CisJCQkKKwkJCS8vIG1vZGlmeSB0aGUgY29tbWFuZAorCQkJaWYgKCFvcmlnQ2hhbmdlLmVxdWFscyh0ZW1wLmdldCgpKSkgeworCQkJCWZBY2N1bXVsYXRlZENoYW5nZSs9ICB0ZW1wLmdldExlbmd0aCgpOworCQkJCWNvbW1hbmQudGV4dD0gdGVtcC5nZXQoKTsKKwkJCX0KKwkJCQorCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7CisJCQlBbnRVSVBsdWdpbi5sb2coZSk7CisJCX0KKwl9CisJCisJLyoqCisJICogSW5kZW50cyBsaW5lIDxjb2RlPmxpbmU8L2NvZGU+IGluIDxjb2RlPmRvY3VtZW50PC9jb2RlPiB3aXRoIDxjb2RlPmluZGVudDwvY29kZT4uCisJICogTGVhdmVzIGxlYWRpbmcgY29tbWVudCBzaWducyBhbG9uZS4KKwkgKiAKKwkgKiBAcGFyYW0gZG9jdW1lbnQgdGhlIGRvY3VtZW50CisJICogQHBhcmFtIGxpbmUgdGhlIGxpbmUKKwkgKiBAcGFyYW0gaW5kZW50IHRoZSBpbmRlbnRhdGlvbiB0byBpbnNlcnQKKwkgKiBAdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIG9uIGNvbmN1cnJlbnQgZG9jdW1lbnQgbW9kaWZpY2F0aW9uCisJICovCisJcHJpdmF0ZSB2b2lkIGFkZEluZGVudChEb2N1bWVudCBkb2N1bWVudCwgaW50IGxpbmUsIENoYXJTZXF1ZW5jZSBpbmRlbnQpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7CisJCUlSZWdpb24gcmVnaW9uPSBkb2N1bWVudC5nZXRMaW5lSW5mb3JtYXRpb24obGluZSk7CisJCWludCBpbnNlcnQ9IHJlZ2lvbi5nZXRPZmZzZXQoKTsKKwkJCisJCS8vIGluc2VydCBpbmRlbnQKKwkJZG9jdW1lbnQucmVwbGFjZShpbnNlcnQsIDAsIGluZGVudC50b1N0cmluZygpKTsKKwl9CisJCisJLyoqCisJICogQ3V0cyB0aGUgdmlzdWFsIGVxdWl2YWxlbnQgb2YgPGNvZGU+dG9EZWxldGU8L2NvZGU+IGNoYXJhY3RlcnMgb3V0IG9mIHRoZQorCSAqIGluZGVudGF0aW9uIG9mIGxpbmUgPGNvZGU+bGluZTwvY29kZT4gaW4gPGNvZGU+ZG9jdW1lbnQ8L2NvZGU+LgorCSAqIAorCSAqIEBwYXJhbSBkb2N1bWVudCB0aGUgZG9jdW1lbnQKKwkgKiBAcGFyYW0gbGluZSB0aGUgbGluZQorCSAqIEBwYXJhbSB0b0RlbGV0ZSB0aGUgbnVtYmVyIG9mIHNwYWNlIGVxdWl2YWxlbnRzIHRvIGRlbGV0ZS4KKwkgKiBAdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIG9uIGNvbmN1cnJlbnQgZG9jdW1lbnQgbW9kaWZpY2F0aW9uCisJICovCisJcHJpdmF0ZSB2b2lkIGN1dEluZGVudChEb2N1bWVudCBkb2N1bWVudCwgaW50IGxpbmUsIGludCB0b0RlbGV0ZSkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKKwkJSVJlZ2lvbiByZWdpb249IGRvY3VtZW50LmdldExpbmVJbmZvcm1hdGlvbihsaW5lKTsKKwkJaW50IGZyb209IHJlZ2lvbi5nZXRPZmZzZXQoKTsKKwkJaW50IGVuZE9mZnNldD0gcmVnaW9uLmdldE9mZnNldCgpICsgcmVnaW9uLmdldExlbmd0aCgpOworCQkKKwkJaW50IHRvPSBmcm9tOworCQl3aGlsZSAodG9EZWxldGUgPiAwICYmIHRvIDwgZW5kT2Zmc2V0KSB7CisJCQljaGFyIGNoPSBkb2N1bWVudC5nZXRDaGFyKHRvKTsKKwkJCWlmICghQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjaCkpCisJCQkJYnJlYWs7CisJCQl0b0RlbGV0ZSAtPSBjb21wdXRlVmlzdWFsTGVuZ3RoKGNoKTsKKwkJCWlmICh0b0RlbGV0ZSA+PSAwKSB7CisJCQkJdG8rKzsKKwkJCX0gZWxzZSB7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJCisJCWRvY3VtZW50LnJlcGxhY2UoZnJvbSwgdG8gLSBmcm9tLCBudWxsKTsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgdmlzdWFsIGxlbmd0aCBvZiBhIGdpdmVuIGNoYXJhY3RlciB0YWtpbmcgaW50bworCSAqIGFjY291bnQgdGhlIHZpc3VhbCB0YWJ1bGF0b3IgbGVuZ3RoLgorCSAqIAorCSAqIEBwYXJhbSBjaCB0aGUgY2hhcmFjdGVyIHRvIG1lYXN1cmUKKwkgKiBAcmV0dXJuIHRoZSB2aXN1YWwgbGVuZ3RoIG9mIDxjb2RlPmNoPC9jb2RlPgorCSAqLworCXByaXZhdGUgaW50IGNvbXB1dGVWaXN1YWxMZW5ndGgoY2hhciBjaCkgeworCQlpZiAoY2ggPT0gJ1x0JykgeworCQkJcmV0dXJuIGdldFZpc3VhbFRhYkxlbmd0aFByZWZlcmVuY2UoKTsKKwkJfSAKKwkJCQorCQlyZXR1cm4gMTsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgdmlzdWFsIGxlbmd0aCBvZiBhIGdpdmVuIDxjb2RlPkNoYXJTZXF1ZW5jZTwvY29kZT4gdGFraW5nIGludG8KKwkgKiBhY2NvdW50IHRoZSB2aXN1YWwgdGFidWxhdG9yIGxlbmd0aC4KKwkgKiAKKwkgKiBAcGFyYW0gc2VxIHRoZSBzdHJpbmcgdG8gbWVhc3VyZQorCSAqIEByZXR1cm4gdGhlIHZpc3VhbCBsZW5ndGggb2YgPGNvZGU+c2VxPC9jb2RlPgorCSAqLworCXByaXZhdGUgaW50IGNvbXB1dGVWaXN1YWxMZW5ndGgoQ2hhclNlcXVlbmNlIHNlcSkgeworCQlpbnQgc2l6ZT0gMDsKKwkJaW50IHRhYmxlbj0gZ2V0VmlzdWFsVGFiTGVuZ3RoUHJlZmVyZW5jZSgpOworCQkKKwkJZm9yIChpbnQgaT0gMDsgaSA8IHNlcS5sZW5ndGgoKTsgaSsrKSB7CisJCQljaGFyIGNoPSBzZXEuY2hhckF0KGkpOworCQkJaWYgKGNoID09ICdcdCcpIHsKKwkJCQlzaXplICs9IHRhYmxlbiAtIHNpemUgJSB0YWJsZW47CisJCQl9IGVsc2UgeworCQkJCXNpemUrKzsKKwkJCX0KKwkJfQorCQlyZXR1cm4gc2l6ZTsKKwl9CisJCisJLyoqCisJICogQ29tcHV0ZXMgdGhlIGRpZmZlcmVuY2Ugb2YgdHdvIGluZGVudGF0aW9ucyBhbmQgcmV0dXJucyB0aGUgZGlmZmVyZW5jZSBpbgorCSAqIGxlbmd0aCBvZiBjdXJyZW50IGFuZCBjb3JyZWN0LiBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIHBvc2l0aXZlLCA8Y29kZT5hZGRpdGlvbjwvY29kZT4KKwkgKiBpcyBpbml0aWFsaXplZCB3aXRoIGEgc3Vic3RyaW5nIG9mIHRoYXQgbGVuZ3RoIG9mIDxjb2RlPmNvcnJlY3Q8L2NvZGU+LgorCSAqIAorCSAqIEBwYXJhbSBjb3JyZWN0IHRoZSBjb3JyZWN0IGluZGVudGF0aW9uCisJICogQHBhcmFtIGN1cnJlbnQgdGhlIGN1cnJlbnQgaW5kZW50YXRpb24gKG1pZ2h0IGNvbnRhaW4gbm9uLXdoaXRlc3BhY2UpCisJICogQHBhcmFtIGRpZmZlcmVuY2UgYSBzdHJpbmcgYnVmZmVyIC0gaWYgdGhlIHJldHVybiB2YWx1ZSBpcyBwb3NpdGl2ZSwgaXQgd2lsbCBiZSBjbGVhcmVkIGFuZCBzZXQgdG8gdGhlIHN1YnN0cmluZyBvZiA8Y29kZT5jdXJyZW50PC9jb2RlPiBvZiB0aGF0IGxlbmd0aAorCSAqIEByZXR1cm4gdGhlIGRpZmZlcmVuY2UgaW4gbGVuZ3RoIG9mIDxjb2RlPmNvcnJlY3Q8L2NvZGU+IGFuZCA8Y29kZT5jdXJyZW50PC9jb2RlPiAKKwkgKi8KKwlwcml2YXRlIGludCBzdWJ0cmFjdEluZGVudChDaGFyU2VxdWVuY2UgY29ycmVjdCwgQ2hhclNlcXVlbmNlIGN1cnJlbnQsIFN0cmluZ0J1ZmZlciBkaWZmZXJlbmNlKSB7CisJCWludCBjMT0gY29tcHV0ZVZpc3VhbExlbmd0aChjb3JyZWN0KTsKKwkJaW50IGMyPSBjb21wdXRlVmlzdWFsTGVuZ3RoKGN1cnJlbnQpOworCQlpbnQgZGlmZj0gYzEgLSBjMjsKKwkJaWYgKGRpZmYgPD0gMCkgeworCQkJcmV0dXJuIGRpZmY7CisJCX0KKwkJCisJCWRpZmZlcmVuY2Uuc2V0TGVuZ3RoKDApOworCQlpbnQgbGVuPSAwLCBpPSAwOworCQl3aGlsZSAobGVuIDwgZGlmZikgeworCQkJY2hhciBjPSBjb3JyZWN0LmNoYXJBdChpKyspOworCQkJZGlmZmVyZW5jZS5hcHBlbmQoYyk7CisJCQlsZW4gKz0gY29tcHV0ZVZpc3VhbExlbmd0aChjKTsKKwkJfQorCQkKKwkJcmV0dXJuIGRpZmY7CisJfQorCQorCS8qKgorCSAqIFRoZSBwcmVmZXJlbmNlIHNldHRpbmcgZm9yIHRoZSB2aXN1YWwgdGFidWxhdG9yIGRpc3BsYXkuCisJICogIAorCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBzcGFjZXMgZGlzcGxheWVkIGZvciBhIHRhYnVsYXRvciBpbiB0aGUgZWRpdG9yCisJICovCisJcHJpdmF0ZSBpbnQgZ2V0VmlzdWFsVGFiTGVuZ3RoUHJlZmVyZW5jZSgpIHsKKwkJcmV0dXJuIEFudFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRDb21iaW5lZFByZWZlcmVuY2VTdG9yZSgpLmdldEludChBYnN0cmFjdERlY29yYXRlZFRleHRFZGl0b3JQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9UQUJfV0lEVEgpOworCX0KK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL0FudEVkaXRvckFjdGlvbkNvbnRyaWJ1dG9yLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci9BbnRFZGl0b3JBY3Rpb25Db250cmlidXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczMWFkODgKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci9BbnRFZGl0b3JBY3Rpb25Db250cmlidXRvci5qYXZhCkBAIC0wLDAgKzEsMTc0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA4IEdFQklUIEdlc2VsbHNjaGFmdCBmdWVyIEVEVi1CZXJhdHVuZworICogdW5kIEluZm9ybWF0aWstVGVjaG5vbG9naWVuIG1iSCwKKyAqIEJlcmxpbiwgRHVlc3NlbGRvcmYsIEZyYW5rZnVydCAoR2VybWFueSkgYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBHRUJJVCBHZXNlbGxzY2hhZnQgZnVlciBFRFYtQmVyYXR1bmcgdW5kIEluZm9ybWF0aWstVGVjaG5vbG9naWVuIG1iSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogCSAgIElCTSBDb3Jwb3JhdGlvbiAtIGJ1ZyBmaXhlcworICogICAgIEpvaG4tTWFzb24gUC4gU2hhY2tlbGZvcmQgLSBidWcgNDAyNTUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3I7CisKK2ltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLmFjdGlvbnMuRm9sZGluZ0FjdGlvbkdyb3VwOworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IuYWN0aW9ucy5PcGVuRGVjbGFyYXRpb25BY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5hY3Rpb25zLk9wZW5FeHRlcm5hbERvY0FjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLmFjdGlvbnMuVG9nZ2xlQXV0b1JlY29uY2lsZUFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLmFjdGlvbnMuVG9nZ2xlTWFya09jY3VycmVuY2VzQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IuYWN0aW9ucy5Ub2dnbGVQcmVzZW50YXRpb25BY3Rpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOworCitpbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3JBY3Rpb25EZWZpbml0aW9uSWRzOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LlRleHRFZGl0b3JBY3Rpb25Db250cmlidXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5hY3Rpb25zLklKYXZhRWRpdG9yQWN0aW9uRGVmaW5pdGlvbklkczsKKworLyoqCisgKiBDb250cmlidXRlcyBpbnRlcmVzdGluZyBBbnQgRWRpdG9yIGFjdGlvbnMgdG8gdGhlIGRlc2t0b3AncyBFZGl0IG1lbnUgYW5kIHRoZSB0b29sYmFyLgorICogCisgKi8KK3B1YmxpYyBjbGFzcyBBbnRFZGl0b3JBY3Rpb25Db250cmlidXRvciBleHRlbmRzIFRleHRFZGl0b3JBY3Rpb25Db250cmlidXRvciB7CisKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVE9HR0xFX01BUktfT0NDVVJSRU5DRVNfSUQ9ICJvcmcuZWNsaXBzZS5hbnQudWkudG9nZ2xlTWFya09jY3VycmVuY2VzIjsgLy8kTk9OLU5MUy0xJAorCXByb3RlY3RlZCBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24gZkNvbnRlbnRBc3Npc3RQcm9wb3NhbDsKKwlwcm90ZWN0ZWQgUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uIGZDb250ZW50Rm9ybWF0OworCXByaXZhdGUgT3BlbkRlY2xhcmF0aW9uQWN0aW9uIGZPcGVuRGVjbGFyYXRpb25BY3Rpb247CisJcHJpdmF0ZSBUb2dnbGVQcmVzZW50YXRpb25BY3Rpb24gZlRvZ2dsZVByZXNlbnRhdGlvbjsKKwlwcml2YXRlIE9wZW5FeHRlcm5hbERvY0FjdGlvbiBmT3BlbkV4dGVybmFsRG9jQWN0aW9uOworCXByaXZhdGUgVG9nZ2xlTWFya09jY3VycmVuY2VzQWN0aW9uIGZUb2dnbGVNYXJrT2NjdXJyZW5jZXNBY3Rpb247CisgICAgcHJpdmF0ZSBUb2dnbGVBdXRvUmVjb25jaWxlQWN0aW9uIGZUb2dnbGVBdXRvUmVjb25jaWxlQWN0aW9uOworCisJcHVibGljIEFudEVkaXRvckFjdGlvbkNvbnRyaWJ1dG9yKCkgeworCQlzdXBlcigpOworCQlSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBBbnRFZGl0b3JNZXNzYWdlcy5nZXRSZXNvdXJjZUJ1bmRsZSgpOworCQlmQ29udGVudEFzc2lzdFByb3Bvc2FsID0gbmV3IFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbihidW5kbGUsICJDb250ZW50QXNzaXN0UHJvcG9zYWwuIik7IC8vJE5PTi1OTFMtMSQKKwkJZkNvbnRlbnRBc3Npc3RQcm9wb3NhbC5zZXRBY3Rpb25EZWZpbml0aW9uSWQoSVRleHRFZGl0b3JBY3Rpb25EZWZpbml0aW9uSWRzLkNPTlRFTlRfQVNTSVNUX1BST1BPU0FMUyk7CisJCWZDb250ZW50Rm9ybWF0ID0gbmV3IFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbihidW5kbGUsICJDb250ZW50Rm9ybWF0LiIpOyAvLyROT04tTkxTLTEkCisJCWZDb250ZW50Rm9ybWF0LnNldEFjdGlvbkRlZmluaXRpb25JZChJSmF2YUVkaXRvckFjdGlvbkRlZmluaXRpb25JZHMuRk9STUFUKTsKKwkJZlRvZ2dsZVByZXNlbnRhdGlvbj0gbmV3IFRvZ2dsZVByZXNlbnRhdGlvbkFjdGlvbigpOworCQlmVG9nZ2xlTWFya09jY3VycmVuY2VzQWN0aW9uPSBuZXcgVG9nZ2xlTWFya09jY3VycmVuY2VzQWN0aW9uKCk7CisgICAgICAgIGZUb2dnbGVBdXRvUmVjb25jaWxlQWN0aW9uPSBuZXcgVG9nZ2xlQXV0b1JlY29uY2lsZUFjdGlvbigpOworCQkKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUFjdGlvbnMoQW50RWRpdG9yIGVkaXRvcikgeworCQlmT3BlbkRlY2xhcmF0aW9uQWN0aW9uPSBuZXcgT3BlbkRlY2xhcmF0aW9uQWN0aW9uKGVkaXRvcik7CisJCWZPcGVuRXh0ZXJuYWxEb2NBY3Rpb249IG5ldyBPcGVuRXh0ZXJuYWxEb2NBY3Rpb24oZWRpdG9yKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIGRvU2V0QWN0aXZlRWRpdG9yKElFZGl0b3JQYXJ0IHBhcnQpIHsKKwkJc3VwZXIuc2V0QWN0aXZlRWRpdG9yKHBhcnQpOworCisJCUlUZXh0RWRpdG9yIGVkaXRvcj0gbnVsbDsKKwkJaWYgKHBhcnQgaW5zdGFuY2VvZiBJVGV4dEVkaXRvcikgeworCQkJZWRpdG9yPSAoSVRleHRFZGl0b3IpIHBhcnQ7CisJCX0KKworCQlmQ29udGVudEFzc2lzdFByb3Bvc2FsLnNldEFjdGlvbihnZXRBY3Rpb24oZWRpdG9yLCBJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5DT05URU5UX0FTU0lTVCkpOworCQlmQ29udGVudEZvcm1hdC5zZXRBY3Rpb24oZ2V0QWN0aW9uKGVkaXRvciwgIkNvbnRlbnRGb3JtYXQiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCisJCWlmIChlZGl0b3IgaW5zdGFuY2VvZiBBbnRFZGl0b3IpIHsKKwkJICAgIEFudEVkaXRvciBhbnRFZGl0b3I9IChBbnRFZGl0b3IpIHBhcnQ7CisJCQlpZiAoZk9wZW5EZWNsYXJhdGlvbkFjdGlvbiA9PSBudWxsKSB7CisJCQkJaW5pdGlhbGl6ZUFjdGlvbnMoYW50RWRpdG9yKTsKKwkJCQljb250cmlidXRlVG9NZW51KGdldEFjdGlvbkJhcnMoKS5nZXRNZW51TWFuYWdlcigpKTsKKwkJCX0KKwkJCQorCQkJRm9sZGluZ0FjdGlvbkdyb3VwIGZvbGRpbmdBY3Rpb25zPSBhbnRFZGl0b3IuZ2V0Rm9sZGluZ0FjdGlvbkdyb3VwKCk7CisJCQlpZiAoZm9sZGluZ0FjdGlvbnMgIT0gbnVsbCkgeworCQkJCWZvbGRpbmdBY3Rpb25zLnVwZGF0ZUFjdGlvbkJhcnMoKTsKKwkJCX0KKwkJCWlmIChmT3BlbkRlY2xhcmF0aW9uQWN0aW9uICE9IG51bGwpIHsKKwkJCQlmT3BlbkRlY2xhcmF0aW9uQWN0aW9uLnNldEVkaXRvcihhbnRFZGl0b3IpOworCQkJfQorCQkJaWYgKGZPcGVuRXh0ZXJuYWxEb2NBY3Rpb24gIT0gbnVsbCkgeworCQkJCWZPcGVuRXh0ZXJuYWxEb2NBY3Rpb24uc2V0QWN0aXZlRWRpdG9yKG51bGwsIGFudEVkaXRvcik7CisJCQl9CisJCX0KKwkJCisJCWlmIChmVG9nZ2xlUHJlc2VudGF0aW9uICE9IG51bGwpIHsKKwkJICAgIGZUb2dnbGVQcmVzZW50YXRpb24uc2V0RWRpdG9yKGVkaXRvcik7CisJCX0KKwkJaWYgKGZUb2dnbGVNYXJrT2NjdXJyZW5jZXNBY3Rpb24gIT0gbnVsbCkgeworCQkJZlRvZ2dsZU1hcmtPY2N1cnJlbmNlc0FjdGlvbi5zZXRFZGl0b3IoZWRpdG9yKTsKKwkJfQorICAgICAgICBpZiAoZlRvZ2dsZUF1dG9SZWNvbmNpbGVBY3Rpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgZlRvZ2dsZUF1dG9SZWNvbmNpbGVBY3Rpb24uc2V0RWRpdG9yKGVkaXRvcik7CisgICAgICAgIH0KKwl9CisJCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciNjb250cmlidXRlVG9NZW51KG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXIpCisJICovCisJcHVibGljIHZvaWQgY29udHJpYnV0ZVRvTWVudShJTWVudU1hbmFnZXIgbWVudSkgeworCQlpZiAoZk9wZW5EZWNsYXJhdGlvbkFjdGlvbiA9PSBudWxsKSB7CisJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuY29udHJpYnV0ZVRvTWVudShtZW51KTsKKwkJCisJCUlNZW51TWFuYWdlciBuYXZpZ2F0ZU1lbnU9IG1lbnUuZmluZE1lbnVVc2luZ1BhdGgoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NX05BVklHQVRFKTsKKwkJaWYgKG5hdmlnYXRlTWVudSAhPSBudWxsKSB7CisJCQluYXZpZ2F0ZU1lbnUuYXBwZW5kVG9Hcm91cChJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk9QRU5fRVhULCBmT3BlbkRlY2xhcmF0aW9uQWN0aW9uKTsKKwkJCW5hdmlnYXRlTWVudS5hcHBlbmRUb0dyb3VwKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuT1BFTl9FWFQsIGZPcGVuRXh0ZXJuYWxEb2NBY3Rpb24pOworCQkJbmF2aWdhdGVNZW51LnNldFZpc2libGUodHJ1ZSk7CisJCX0KKwl9CisKKyAgICAvKiAobm9uLUphdmFkb2MpCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yI2luaXQob3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnMpCisgICAgICovCisgICAgcHVibGljIHZvaWQgaW5pdChJQWN0aW9uQmFycyBiYXJzKSB7CisgICAgICAgIHN1cGVyLmluaXQoYmFycyk7CisgICAgICAgIAorICAgICAgICBJTWVudU1hbmFnZXIgbWVudU1hbmFnZXI9IGJhcnMuZ2V0TWVudU1hbmFnZXIoKTsKKyAgICAgICAgSU1lbnVNYW5hZ2VyIGVkaXRNZW51PSBtZW51TWFuYWdlci5maW5kTWVudVVzaW5nUGF0aChJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1fRURJVCk7CisgICAgICAgIGlmIChlZGl0TWVudSAhPSBudWxsKSB7CisgICAgICAgICAgICBlZGl0TWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKKyAgICAgICAgICAgIGVkaXRNZW51LmFkZChmQ29udGVudEFzc2lzdFByb3Bvc2FsKTsKKyAgICAgICAgICAgIGVkaXRNZW51LmFkZChmQ29udGVudEZvcm1hdCk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yI3NldEFjdGl2ZUVkaXRvcihvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRBY3RpdmVFZGl0b3IoSUVkaXRvclBhcnQgcGFydCkgeworCQlkb1NldEFjdGl2ZUVkaXRvcihwYXJ0KTsKKwl9CisJCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yI2Rpc3Bvc2UoKQorCSAqLworCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCWRvU2V0QWN0aXZlRWRpdG9yKG51bGwpOworCQlzdXBlci5kaXNwb3NlKCk7CisJfQorCQorICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciNpbml0KG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzLCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZSkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbml0KElBY3Rpb25CYXJzIGJhcnMsIElXb3JrYmVuY2hQYWdlIHBhZ2UpIHsKKyAgICAgICAgc3VwZXIuaW5pdChiYXJzLCBwYWdlKTsKKyAgICAgICAgYmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKElUZXh0RWRpdG9yQWN0aW9uRGVmaW5pdGlvbklkcy5UT0dHTEVfU0hPV19TRUxFQ1RFRF9FTEVNRU5UX09OTFksIGZUb2dnbGVQcmVzZW50YXRpb24pOworCQliYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoVE9HR0xFX01BUktfT0NDVVJSRU5DRVNfSUQsIGZUb2dnbGVNYXJrT2NjdXJyZW5jZXNBY3Rpb24pOworICAgICAgICBiYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoIm9yZy5lY2xpcHNlLmFudC51aS50b2dnbGVBdXRvUmVjb25jaWxlIiwgZlRvZ2dsZUF1dG9SZWNvbmNpbGVBY3Rpb24pOyAvLyROT04tTkxTLTEkCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvQW50RWRpdG9yTWVzc2FnZXMuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL0FudEVkaXRvck1lc3NhZ2VzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2UzYWNmZgotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL0FudEVkaXRvck1lc3NhZ2VzLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yOworCisKK2ltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKKworcHVibGljIGNsYXNzIEFudEVkaXRvck1lc3NhZ2VzIHsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLkFudEVkaXRvck1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAorCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzb3VyY2VCdW5kbGUgZmdSZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShCVU5ETEVfTkFNRSk7CisKKwlwcml2YXRlIEFudEVkaXRvck1lc3NhZ2VzKCkgeworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7CisJCXRyeSB7CisJCQlyZXR1cm4gZmdSZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsKKwkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiAnIScgKyBrZXkgKyAnISc7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgc3RhdGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgeworCQlyZXR1cm4gZmdSZXNvdXJjZUJ1bmRsZTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci9BbnRFZGl0b3JNZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvQW50RWRpdG9yTWVzc2FnZXMucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjFjZDE3Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvQW50RWRpdG9yTWVzc2FnZXMucHJvcGVydGllcwpAQCAtMCwwICsxLDQzIEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyMgCisjIENvbnRyaWJ1dG9yczoKKyMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyAgICAgSm9obi1NYXNvbiBQLiBTaGFja2VsZm9yZCAtIGJ1ZyA0MDI1NQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitDb250ZW50QXNzaXN0UHJvcG9zYWwubGFiZWw9Q29udGVudCAmQXNzaXN0QEN0cmwrU3BhY2UKK0NvbnRlbnRBc3Npc3RQcm9wb3NhbC50b29sdGlwPUNvbnRlbnQgQXNzaXN0CitDb250ZW50QXNzaXN0UHJvcG9zYWwuaW1hZ2U9CitDb250ZW50QXNzaXN0UHJvcG9zYWwuZGVzY3JpcHRpb249Q29udGVudCBBc3Npc3QKKworQ29udGVudEZvcm1hdC5sYWJlbD0mRm9ybWF0CitDb250ZW50Rm9ybWF0LnRvb2x0aXA9Rm9ybWF0IGJ1aWxkIGZpbGUgc291cmNlCitDb250ZW50Rm9ybWF0LmltYWdlPQorQ29udGVudEZvcm1hdC5kZXNjcmlwdGlvbj1Gb3JtYXQgYnVpbGQgZmlsZSBzb3VyY2UKKworQW50RWRpdG9yQ29tcGxldGlvblByb2Nlc3Nvci5SZXF1aXJlZF9fXzQ9UmVxdWlyZWQ6CitBbnRFZGl0b3JDb21wbGV0aW9uUHJvY2Vzc29yLjI4PU5vIGF0dHJpYnV0ZSBjb21wbGV0aW9ucyBhdmFpbGFibGUKK0FudEVkaXRvckNvbXBsZXRpb25Qcm9jZXNzb3IuMjk9Tm8gdGFzayBjb21wbGV0aW9ucyBhdmFpbGFibGUKK0FudEVkaXRvckNvbXBsZXRpb25Qcm9jZXNzb3IuMzA9Tm8gdGFzayBjbG9zaW5nIGNvbXBsZXRpb25zIGF2YWlsYWJsZQorQW50RWRpdG9yQ29tcGxldGlvblByb2Nlc3Nvci4zMT1ObyBhdHRyaWJ1dGUgdmFsdWUgY29tcGxldGlvbnMgYXZhaWxhYmxlCitBbnRFZGl0b3JDb21wbGV0aW9uUHJvY2Vzc29yLjMyPU5vIHByb3BlcnR5IGNvbXBsZXRpb25zIGF2YWlsYWJsZQorQW50RWRpdG9yQ29tcGxldGlvblByb2Nlc3Nvci4zMz1ObyBjb21wbGV0aW9ucyBhdmFpbGFibGUKK0FudEVkaXRvckNvbXBsZXRpb25Qcm9jZXNzb3IuMzk9Q2xvc2luZyB0YWcKK0FudEVkaXRvckNvbXBsZXRpb25Qcm9jZXNzb3IuNTk9RGVmYXVsdDogezB9CitBbnRFZGl0b3JDb21wbGV0aW9uUHJvY2Vzc29yLjYwPU5vIFRlbXBsYXRlIFByb3Bvc2FscworQW50RWRpdG9yQ29tcGxldGlvblByb2Nlc3Nvci42MT1UZW1wbGF0ZSBQcm9wb3NhbHMKK0FudEVkaXRvckNvbXBsZXRpb25Qcm9jZXNzb3IuNjI9Tm8gRGVmYXVsdCBQcm9wb3NhbHMKK0FudEVkaXRvckNvbXBsZXRpb25Qcm9jZXNzb3IuNjM9UHJlc3MgJyd7MH0nJyB0byBzaG93IHsxfQorQW50RWRpdG9yQ29tcGxldGlvblByb2Nlc3Nvci42ND1DbGljayB0byBzaG93IHswfQorQW50RWRpdG9yQ29tcGxldGlvblByb2Nlc3Nvci4xPU5vdCByZXF1aXJlZAorQW50RWRpdG9yQ29tcGxldGlvblByb2Nlc3Nvci4yPVJlcXVpcmVkCitBbnRFZGl0b3JDb21wbGV0aW9uUHJvY2Vzc29yLjA9RGVmYXVsdCBQcm9wb3NhbHMKKworQW50QW5ub3RhdGlvbkhvdmVyLm11bHRpcGxlTWFya2Vyc0F0VGhpc0xpbmU9TXVsdGlwbGUgbWFya2VycyBhdCB0aGlzIGxpbmUKKworQW50RWRpdG9yLjM9Q3VycmVudCB0ZXh0IHNlbGVjdGlvbiBkb2VzIG5vdCByZXNvbHZlIHRvIGFuIEFudCByZWZlcmVuY2UKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL0FudEVsZW1lbnRIeXBlcmxpbmsuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL0FudEVsZW1lbnRIeXBlcmxpbmsuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTUxODhkCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvQW50RWxlbWVudEh5cGVybGluay5qYXZhCkBAIC0wLDAgKzEsNTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rOworCitwdWJsaWMgY2xhc3MgQW50RWxlbWVudEh5cGVybGluayBpbXBsZW1lbnRzIElIeXBlcmxpbmsgeworCisgICAgcHJpdmF0ZSBJUmVnaW9uIGZSZWdpb249IG51bGw7CisgICAgcHJpdmF0ZSBPYmplY3QgZkxpbmtUYXJnZXQ9IG51bGw7CisgICAgcHJpdmF0ZSBBbnRFZGl0b3IgZkVkaXRvcj0gbnVsbDsKKyAgICAKKyAgICBwdWJsaWMgQW50RWxlbWVudEh5cGVybGluayhBbnRFZGl0b3IgZWRpdG9yLCBJUmVnaW9uIHJlZ2lvbiwgT2JqZWN0IGxpbmtUYXJnZXQpIHsKKyAgICAgICAgCisgICAgICAgZlJlZ2lvbj0gcmVnaW9uOworICAgICAgIGZMaW5rVGFyZ2V0PSBsaW5rVGFyZ2V0OworICAgICAgIGZFZGl0b3I9IGVkaXRvcjsKKyAgICB9CisKKyAgICAvKiAobm9uLUphdmFkb2MpCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rI2dldEh5cGVybGlua1JlZ2lvbigpCisgICAgICovCisgICAgcHVibGljIElSZWdpb24gZ2V0SHlwZXJsaW5rUmVnaW9uKCkgeworICAgICAgICByZXR1cm4gZlJlZ2lvbjsKKyAgICB9CisKKyAgICAvKiAobm9uLUphdmFkb2MpCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rI2dldFR5cGVMYWJlbCgpCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRUeXBlTGFiZWwoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmsjZ2V0SHlwZXJsaW5rVGV4dCgpCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRIeXBlcmxpbmtUZXh0KCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKiAobm9uLUphdmFkb2MpCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rI29wZW4oKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9wZW4oKSB7CisgICAgICAgIGZFZGl0b3Iub3BlblRhcmdldChmTGlua1RhcmdldCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvQW50RWxlbWVudEh5cGVybGlua0RldGVjdG9yLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci9BbnRFbGVtZW50SHlwZXJsaW5rRGV0ZWN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzZjMWE2Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvQW50RWxlbWVudEh5cGVybGlua0RldGVjdG9yLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci50ZXh0LlhNTFRleHRIb3ZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5BYnN0cmFjdEh5cGVybGlua0RldGVjdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbms7CisKK3B1YmxpYyBjbGFzcyBBbnRFbGVtZW50SHlwZXJsaW5rRGV0ZWN0b3IgZXh0ZW5kcyBBYnN0cmFjdEh5cGVybGlua0RldGVjdG9yIHsKKworICAgIHByaXZhdGUgQW50RWRpdG9yIGZFZGl0b3I7CisgICAgCisgICAgcHVibGljIEFudEVsZW1lbnRIeXBlcmxpbmtEZXRlY3RvcigpIHsgICAgCisgICAgfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGlua0RldGVjdG9yI2RldGVjdEh5cGVybGlua3Mob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlciwgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uLCBib29sZWFuKQorCSAqLworCXB1YmxpYyBJSHlwZXJsaW5rW10gZGV0ZWN0SHlwZXJsaW5rcyhJVGV4dFZpZXdlciB0ZXh0Vmlld2VyLCBJUmVnaW9uIHJlZ2lvbiwgYm9vbGVhbiBjYW5TaG93TXVsdGlwbGVIeXBlcmxpbmtzKSB7CisJCSBpZiAocmVnaW9uID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworICAgICAgICB9CisJCWZFZGl0b3IgPSAoQW50RWRpdG9yKSBnZXRBZGFwdGVyKEFudEVkaXRvci5jbGFzcyk7CisgICAgICAgIHJlZ2lvbj0gWE1MVGV4dEhvdmVyLmdldFJlZ2lvbih0ZXh0Vmlld2VyLCByZWdpb24uZ2V0T2Zmc2V0KCkpOworICAgICAgICBPYmplY3QgbGlua1RhcmdldD0gZkVkaXRvci5maW5kVGFyZ2V0KHJlZ2lvbik7CisJCWlmIChsaW5rVGFyZ2V0ID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisgICAgICAgIHJldHVybiBuZXcgSUh5cGVybGlua1tdIHtuZXcgQW50RWxlbWVudEh5cGVybGluayhmRWRpdG9yLCByZWdpb24sIGxpbmtUYXJnZXQpfTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci9BbnRTb3VyY2VWaWV3ZXJJbmZvcm1hdGlvbkNvbnRyb2wuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL0FudFNvdXJjZVZpZXdlckluZm9ybWF0aW9uQ29udHJvbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzNmMwMmQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci9BbnRTb3VyY2VWaWV3ZXJJbmZvcm1hdGlvbkNvbnRyb2wuamF2YQpAQCAtMCwwICsxLDIzNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVkVGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5BbnRTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IudGV4dC5BbnREb2N1bWVudFNldHVwUGFydGljaXBhbnQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JSW5mb3JtYXRpb25Db250cm9sOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUluZm9ybWF0aW9uQ29udHJvbEV4dGVuc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Tb3VyY2VWaWV3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuU291cmNlVmlld2VyQ29uZmlndXJhdGlvbjsKKworcHVibGljIGNsYXNzIEFudFNvdXJjZVZpZXdlckluZm9ybWF0aW9uQ29udHJvbCBpbXBsZW1lbnRzIElJbmZvcm1hdGlvbkNvbnRyb2wsIElJbmZvcm1hdGlvbkNvbnRyb2xFeHRlbnNpb24sIERpc3Bvc2VMaXN0ZW5lciB7CisJLyoqIFRoZSBjb250cm9sJ3Mgc2hlbGwgKi8KKwlwcml2YXRlIFNoZWxsIGZTaGVsbDsKKwkKKwkvKiogVGhlIGNvbnRyb2wncyBzb3VyY2Ugdmlld2VyICovCisJcHJpdmF0ZSBTb3VyY2VWaWV3ZXIgZlZpZXdlcjsKKwkKKwkvKiogVGhlIGNvbnRyb2wncyB0ZXh0IHdpZGdldCAqLworCXByaXZhdGUgU3R5bGVkVGV4dCBmVGV4dDsKKwkKKwlwdWJsaWMgQW50U291cmNlVmlld2VySW5mb3JtYXRpb25Db250cm9sKFNoZWxsIHBhcmVudCkgeworCQlHcmlkTGF5b3V0IGxheW91dDsKKwkJR3JpZERhdGEgZ2Q7CisKKwkJZlNoZWxsPSBuZXcgU2hlbGwocGFyZW50LCBTV1QuT05fVE9QIHwgU1dULlRPT0wpOworCQlEaXNwbGF5IGRpc3BsYXk9IGZTaGVsbC5nZXREaXNwbGF5KCk7CisJCWZTaGVsbC5zZXRCYWNrZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMQUNLKSk7CisKKwkJQ29tcG9zaXRlIGNvbXBvc2l0ZT0gZlNoZWxsOworCQlsYXlvdXQ9IG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKTsKKwkJbGF5b3V0Lm1hcmdpbkhlaWdodD0gMDsKKwkJbGF5b3V0Lm1hcmdpbldpZHRoPSAwOworCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7CisJCWdkPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKKwkJY29tcG9zaXRlLnNldExheW91dERhdGEoZ2QpOworCQlmVmlld2VyPSBjcmVhdGVWaWV3ZXIoY29tcG9zaXRlKTsKKwkJCisJCWZUZXh0PSBmVmlld2VyLmdldFRleHRXaWRnZXQoKTsKKwkJZ2Q9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcgfCBHcmlkRGF0YS5GSUxMX0JPVEgpOworCQlmVGV4dC5zZXRMYXlvdXREYXRhKGdkKTsKKwkJZlRleHQuc2V0Rm9yZWdyb3VuZChwYXJlbnQuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9JTkZPX0ZPUkVHUk9VTkQpKTsKKwkJZlRleHQuc2V0QmFja2dyb3VuZChwYXJlbnQuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9JTkZPX0JBQ0tHUk9VTkQpKTsKKwkJCQorCQlmVGV4dC5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5TGlzdGVuZXIoKSB7CisJCQkJCisJCQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpICB7CisJCQkJaWYgKGUuY2hhcmFjdGVyID09IDB4MUIpIC8vIEVTQworCQkJCQlmU2hlbGwuZGlzcG9zZSgpOworCQkJfQorCQkJCQorCQkJcHVibGljIHZvaWQga2V5UmVsZWFzZWQoS2V5RXZlbnQgZSkge30KKwkJfSk7CisJfQorCQorCQorICAgIHByaXZhdGUgU291cmNlVmlld2VyIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7CisgICAgCVNvdXJjZVZpZXdlciB2aWV3ZXIgPSBuZXcgU291cmNlVmlld2VyKHBhcmVudCwgbnVsbCwgU1dULk5PTkUpOworICAgICAgICAgIAorCQlTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBuZXcgQW50U291cmNlVmlld2VyQ29uZmlndXJhdGlvbigpOworCQl2aWV3ZXIuY29uZmlndXJlKGNvbmZpZ3VyYXRpb24pOworCQl2aWV3ZXIuc2V0RWRpdGFibGUoZmFsc2UpOworCQlGb250IGZvbnQ9IEpGYWNlUmVzb3VyY2VzLmdldEZvbnQoSkZhY2VSZXNvdXJjZXMuVEVYVF9GT05UKTsKKwkJdmlld2VyLmdldFRleHRXaWRnZXQoKS5zZXRGb250KGZvbnQpOworCQkgICAgICAgIAorCQlyZXR1cm4gdmlld2VyOworICAgIH0KKwkKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklJbmZvcm1hdGlvbkNvbnRyb2wjc2V0SW5mb3JtYXRpb24oamF2YS5sYW5nLlN0cmluZykKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRJbmZvcm1hdGlvbihTdHJpbmcgY29udGVudCkgeworCQlpZiAoY29udGVudCA9PSBudWxsKSB7CisJCQlmVmlld2VyLnNldElucHV0KG51bGwpOworCQkJcmV0dXJuOworCQl9CisJCUlEb2N1bWVudCBkb2N1bWVudCA9IG5ldyBEb2N1bWVudChjb250ZW50KTsKKwkJbmV3IEFudERvY3VtZW50U2V0dXBQYXJ0aWNpcGFudCgpLnNldHVwKGRvY3VtZW50KTsKKwkJZlZpZXdlci5zZXREb2N1bWVudChkb2N1bWVudCk7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JSW5mb3JtYXRpb25Db250cm9sI3NldFNpemVDb25zdHJhaW50cyhpbnQsIGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTaXplQ29uc3RyYWludHMoaW50IG1heFdpZHRoLCBpbnQgbWF4SGVpZ2h0KSB7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JSW5mb3JtYXRpb25Db250cm9sI2NvbXB1dGVTaXplSGludCgpCisJICovCisJcHVibGljIFBvaW50IGNvbXB1dGVTaXplSGludCgpIHsKKwkJcmV0dXJuIGZTaGVsbC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUluZm9ybWF0aW9uQ29udHJvbCNzZXRWaXNpYmxlKGJvb2xlYW4pCisJICovCisJcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKKwkJZlNoZWxsLnNldFZpc2libGUodmlzaWJsZSk7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JSW5mb3JtYXRpb25Db250cm9sI3NldFNpemUoaW50LCBpbnQpCisJICovCisJcHVibGljIHZvaWQgc2V0U2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKwkJZlNoZWxsLnNldFNpemUod2lkdGgsIGhlaWdodCk7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JSW5mb3JtYXRpb25Db250cm9sI3NldExvY2F0aW9uKG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbihQb2ludCBsb2NhdGlvbikgeworCQlSZWN0YW5nbGUgdHJpbT0gZlNoZWxsLmNvbXB1dGVUcmltKDAsIDAsIDAsIDApOworCQlQb2ludCB0ZXh0TG9jYXRpb249IGZUZXh0LmdldExvY2F0aW9uKCk7CisJCWxvY2F0aW9uLnggKz0gdHJpbS54IC0gdGV4dExvY2F0aW9uLng7CisJCWxvY2F0aW9uLnkgKz0gdHJpbS55IC0gdGV4dExvY2F0aW9uLnk7CisJCWZTaGVsbC5zZXRMb2NhdGlvbihsb2NhdGlvbik7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JSW5mb3JtYXRpb25Db250cm9sI2Rpc3Bvc2UoKQorCSAqLworCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCWlmIChmU2hlbGwgIT0gbnVsbCAmJiAhZlNoZWxsLmlzRGlzcG9zZWQoKSkgeworCQkJZlNoZWxsLmRpc3Bvc2UoKTsKKwkJfSBlbHNlIHsKKwkJCXdpZGdldERpc3Bvc2VkKG51bGwpOworCQl9CisJCQorCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUluZm9ybWF0aW9uQ29udHJvbCNhZGREaXNwb3NlTGlzdGVuZXIob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXIpCisJICovCisJcHVibGljIHZvaWQgYWRkRGlzcG9zZUxpc3RlbmVyKERpc3Bvc2VMaXN0ZW5lciBsaXN0ZW5lcikgeworCQlmU2hlbGwuYWRkRGlzcG9zZUxpc3RlbmVyKGxpc3RlbmVyKTsKKwkJCisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JSW5mb3JtYXRpb25Db250cm9sI3JlbW92ZURpc3Bvc2VMaXN0ZW5lcihvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcikKKwkgKi8KKwlwdWJsaWMgdm9pZCByZW1vdmVEaXNwb3NlTGlzdGVuZXIoRGlzcG9zZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisJCWZTaGVsbC5yZW1vdmVEaXNwb3NlTGlzdGVuZXIobGlzdGVuZXIpOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUluZm9ybWF0aW9uQ29udHJvbCNzZXRGb3JlZ3JvdW5kQ29sb3Iob3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yKQorCSAqLworCXB1YmxpYyB2b2lkIHNldEZvcmVncm91bmRDb2xvcihDb2xvciBmb3JlZ3JvdW5kKSB7CisJCWZUZXh0LnNldEZvcmVncm91bmQoZm9yZWdyb3VuZCk7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JSW5mb3JtYXRpb25Db250cm9sI3NldEJhY2tncm91bmRDb2xvcihvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IpCisJICovCisJcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZENvbG9yKENvbG9yIGJhY2tncm91bmQpIHsKKwkJZlRleHQuc2V0QmFja2dyb3VuZChiYWNrZ3JvdW5kKTsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklJbmZvcm1hdGlvbkNvbnRyb2wjaXNGb2N1c0NvbnRyb2woKQorCSAqLworCXB1YmxpYyBib29sZWFuIGlzRm9jdXNDb250cm9sKCkgeworCQlyZXR1cm4gZlRleHQuaXNGb2N1c0NvbnRyb2woKTsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklJbmZvcm1hdGlvbkNvbnRyb2wjc2V0Rm9jdXMoKQorCSAqLworCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgeworCQlmU2hlbGwuZm9yY2VGb2N1cygpOworCQlmVGV4dC5zZXRGb2N1cygpOworCQkKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklJbmZvcm1hdGlvbkNvbnRyb2wjYWRkRm9jdXNMaXN0ZW5lcihvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzTGlzdGVuZXIpCisJICovCisJcHVibGljIHZvaWQgYWRkRm9jdXNMaXN0ZW5lcihGb2N1c0xpc3RlbmVyIGxpc3RlbmVyKSB7CisJCWZUZXh0LmFkZEZvY3VzTGlzdGVuZXIobGlzdGVuZXIpOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUluZm9ybWF0aW9uQ29udHJvbCNyZW1vdmVGb2N1c0xpc3RlbmVyKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNMaXN0ZW5lcikKKwkgKi8KKwlwdWJsaWMgdm9pZCByZW1vdmVGb2N1c0xpc3RlbmVyKEZvY3VzTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJZlRleHQucmVtb3ZlRm9jdXNMaXN0ZW5lcihsaXN0ZW5lcik7CisJCQorCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUluZm9ybWF0aW9uQ29udHJvbEV4dGVuc2lvbiNoYXNDb250ZW50cygpCisJICovCisJcHVibGljIGJvb2xlYW4gaGFzQ29udGVudHMoKSB7CisJCXJldHVybiBmVGV4dC5nZXRDaGFyQ291bnQoKSA+IDA7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXIjd2lkZ2V0RGlzcG9zZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQpCisJICovCisJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGUpIHsKKwkJZlNoZWxsPSBudWxsOworCQlmVGV4dD0gbnVsbDsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvRGVjYXlDb2RlQ29tcGxldGlvbkRhdGFTdHJ1Y3R1cmVzVGhyZWFkLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci9EZWNheUNvZGVDb21wbGV0aW9uRGF0YVN0cnVjdHVyZXNUaHJlYWQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWE3ZGM4Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvRGVjYXlDb2RlQ29tcGxldGlvbkRhdGFTdHJ1Y3R1cmVzVGhyZWFkLmphdmEKQEAgLTAsMCArMSw3MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLnV0aWxzLlByb2plY3RIZWxwZXI7CisKKworcHVibGljIGNsYXNzIERlY2F5Q29kZUNvbXBsZXRpb25EYXRhU3RydWN0dXJlc1RocmVhZCBleHRlbmRzIFRocmVhZCB7CisJCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGZnRGVsYXk9IDYwMDAgKiA1OyAvLzUgbWludXRlcyAKKwkKKwlwcml2YXRlIHN0YXRpYyBEZWNheUNvZGVDb21wbGV0aW9uRGF0YVN0cnVjdHVyZXNUaHJlYWQgZmdJbnN0YW5jZTsKKwkKKwlwdWJsaWMgc3RhdGljIERlY2F5Q29kZUNvbXBsZXRpb25EYXRhU3RydWN0dXJlc1RocmVhZCBnZXREZWZhdWx0KCkgeworCQlpZiAoZmdJbnN0YW5jZSA9PSBudWxsKSB7CisJCQlmZ0luc3RhbmNlPSBuZXcgRGVjYXlDb2RlQ29tcGxldGlvbkRhdGFTdHJ1Y3R1cmVzVGhyZWFkKCk7CisJCX0KKwkJcmV0dXJuIGZnSW5zdGFuY2U7CisJfQorCQorCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYmFja2dyb3VuZCB0aHJlYWQuIFRoZSB0aHJlYWQgCisJICogcnVucyB3aXRoIG1pbmltYWwgcHJpb3JpdHkuCisJICovCisJcHJpdmF0ZSBEZWNheUNvZGVDb21wbGV0aW9uRGF0YVN0cnVjdHVyZXNUaHJlYWQoKSB7CisJCXN1cGVyKCJEZWNheSBBbnQgRGF0YSBTdHJ1Y3R1cmVzIik7IC8vJE5PTi1OTFMtMSQKKwkJc2V0UHJpb3JpdHkoVGhyZWFkLk1JTl9QUklPUklUWSk7CisJCXNldERhZW1vbih0cnVlKTsKKwkJZmdJbnN0YW5jZT0gdGhpczsKKyAgICAgICAgc2V0Q29udGV4dENsYXNzTG9hZGVyKG51bGwpOyAvL2Rvbid0IGhvbGQgb24gdG8gYW55IGNsYXNzIGxvYWRlcnMKKwl9CisJCisJLyoqCisJICogVGhlIGJhY2tncm91bmQgYWN0aXZpdHkgdGhhdCBpcyB0cmlnZ2VyZWQgd2hlbiB0aGUgbGFzdCA8Y29kZT5BbnRNb2RlbDwvY29kZT4gaXMgZGlzcG9zZWQuCisJICogV2FpdHMgZm9yIHRoZSByZXF1aXJlZCBkZWxheSBhbmQgdGhlbiBudWxscyBvdXQgdGhlIG1lbW9yeSBleHBlbnNpdmUgQW50IGNvZGUKKwkgKiBjb21wbGV0aW9uIGRhdGEgc3RydWN0dXJlcyBhbmQgcmVzZXQgdGhlIFByb2plY3RIZWxwZXIuCisJICogSWYgYW4gPGNvZGU+QW50TW9kZWw8L2NvZGU+IGlzIGNyZWF0ZWQgZHVyaW5nIHRoZSB3YWl0LCB0aGUgdGhyZWFkIGlzCisJICogaW50ZXJydXB0ZWQgYW5kIG5vIG51bGxpbmcgb3V0IG9jY3Vycy4KKwkgKi8KKwlwdWJsaWMgdm9pZCBydW4oKSB7CisJCXN5bmNocm9uaXplZCAodGhpcykgeworCQkJdHJ5IHsKKwkJCQl3YWl0KGZnRGVsYXkpOworCQkJCUFudEVkaXRvckNvbXBsZXRpb25Qcm9jZXNzb3IucmVzZXRDb2RlQ29tcGxldGlvbkRhdGFTdHJ1Y3R1cmVzKCk7CisgICAgICAgICAgICAgICAgUHJvamVjdEhlbHBlci5yZXNldCgpOworCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24geCkgeworCQkJfQorCQl9CisJfQorCQorCS8qKgorCSAqIENhbmNlbHMgdGhlIGJhY2tncm91bmQgdGhyZWFkLgorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBjYW5jZWwoKSB7CisJCWlmIChmZ0luc3RhbmNlICE9IG51bGwpIHsKKwkJCXN5bmNocm9uaXplZCAoZmdJbnN0YW5jZSkgeworCQkJCWZnSW5zdGFuY2UuaW50ZXJydXB0KCk7CisJCQkJZmdJbnN0YW5jZT0gbnVsbDsKKwkJCX0KKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL0VkaXRvclN5bmNocm9uaXplci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvRWRpdG9yU3luY2hyb25pemVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBiYWY5ZAotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL0VkaXRvclN5bmNocm9uaXplci5qYXZhCkBAIC0wLDAgKzEsNTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmxpbmsuSUxpbmtlZE1vZGVMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmxpbmsuTGlua2VkTW9kZU1vZGVsOworCisvKioKKyAqIFN5bmNocm9uaXplcyB0aGUgQW50IGVkaXRvciB3aXRoIHRoZSBzdGF0ZSBvZiBpdHMgbGlua2VkIG1vZGUKKyAqIAorICogQHNpbmNlIDMuMQorICovCitwdWJsaWMgY2xhc3MgRWRpdG9yU3luY2hyb25pemVyIGltcGxlbWVudHMgSUxpbmtlZE1vZGVMaXN0ZW5lciB7CisgICAgCisgICAgcHJpdmF0ZSBmaW5hbCBBbnRFZGl0b3IgZkVkaXRvcjsKKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gZldhc09jY3VycmVuY2VzT247CisgICAgCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBzeW5jaHJvbml6ZXIuCisgICAgICogCisgICAgICogQHBhcmFtIGVkaXRvciB0aGUgQW50IGVkaXRvciB0aGF0IHdpbGwgYmUgCisgICAgICogICAgICAgIHN5bmNob25pemVkIHdpdGggdGhlIGxpbmtlZCBtb2RlCisgICAgICovCisgICAgcHVibGljIEVkaXRvclN5bmNocm9uaXplcihBbnRFZGl0b3IgZWRpdG9yKSB7CisgICAgICAgIEFzc2VydC5pc0xlZ2FsKGVkaXRvciAhPSBudWxsKTsKKyAgICAgICAgZkVkaXRvcj0gZWRpdG9yOworICAgICAgICBmV2FzT2NjdXJyZW5jZXNPbj0gZkVkaXRvci5pc01hcmtpbmdPY2N1cnJlbmNlcygpOworICAgICAgICBmRWRpdG9yLnNldEluTGlua2VkTW9kZSh0cnVlLCBmV2FzT2NjdXJyZW5jZXNPbik7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQubGluay5JTGlua2VkTW9kZUxpc3RlbmVyI2xlZnQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5saW5rLkxpbmtlZE1vZGVNb2RlbCwgaW50KQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGxlZnQoTGlua2VkTW9kZU1vZGVsIGVudmlyb25tZW50LCBpbnQgZmxhZ3MpIHsKKyAgICAJZkVkaXRvci5zZXRJbkxpbmtlZE1vZGUoZmFsc2UsIGZXYXNPY2N1cnJlbmNlc09uKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5saW5rLklMaW5rZWRNb2RlTGlzdGVuZXIjc3VzcGVuZChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmxpbmsuTGlua2VkTW9kZU1vZGVsKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN1c3BlbmQoTGlua2VkTW9kZU1vZGVsIGVudmlyb25tZW50KSB7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQubGluay5JTGlua2VkTW9kZUxpc3RlbmVyI3Jlc3VtZShvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmxpbmsuTGlua2VkTW9kZU1vZGVsLCBpbnQpCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVzdW1lKExpbmtlZE1vZGVNb2RlbCBlbnZpcm9ubWVudCwgaW50IGZsYWdzKSB7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL09jY3VycmVuY2VzRmluZGVyLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci9PY2N1cnJlbmNlc0ZpbmRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5OTAyNmMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci9PY2N1cnJlbmNlc0ZpbmRlci5qYXZhCkBAIC0wLDAgKzEsMTA5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvcjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci50ZXh0LlhNTFRleHRIb3ZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkubW9kZWwuQW50RWxlbWVudE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLm1vZGVsLkFudE1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247CisKK3B1YmxpYyBjbGFzcyBPY2N1cnJlbmNlc0ZpbmRlciB7CisgICAgCisJcHJpdmF0ZSBBbnRNb2RlbCBmQW50TW9kZWw7CisJcHJpdmF0ZSBBbnRFZGl0b3IgZkVkaXRvcjsKKwlwcml2YXRlIGludCBmT2Zmc2V0OworCXByaXZhdGUgSURvY3VtZW50IGZEb2N1bWVudDsKKwkKKwlwdWJsaWMgT2NjdXJyZW5jZXNGaW5kZXIoQW50RWRpdG9yIGVkaXRvciwgQW50TW9kZWwgbW9kZWwsIElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCkgeworCQlmQW50TW9kZWw9IG1vZGVsOworCQlmRWRpdG9yPSBlZGl0b3I7CisJCWZEb2N1bWVudD0gZG9jdW1lbnQ7CisJCWZPZmZzZXQ9IG9mZnNldDsKKwl9CisJCisJcHVibGljIExpc3QgcGVyZm9ybSgpIHsKKwkJaWYgKGZPZmZzZXQgPT0gMCB8fCBmQW50TW9kZWwgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJCisJCUFudEVsZW1lbnROb2RlIGNvbnRhaW5lcj0gZkFudE1vZGVsLmdldE5vZGUoZk9mZnNldCwgZmFsc2UpOworCQlpZiAoY29udGFpbmVyID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCUlSZWdpb24gcmVnaW9uPSBYTUxUZXh0SG92ZXIuZ2V0UmVnaW9uKGZFZGl0b3IuZ2V0Vmlld2VyKCksIGZPZmZzZXQpOworCQlpZiAocmVnaW9uICE9IG51bGwpIHsKKwkJCWlmICghY29udGFpbmVyLmlzUmVnaW9uUG90ZW50aWFsUmVmZXJlbmNlKHJlZ2lvbikpIHsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJfQorCQlBbnRFbGVtZW50Tm9kZSBub2RlOworCQlpZiAoY29udGFpbmVyLmlzRnJvbURlY2xhcmF0aW9uKHJlZ2lvbikpIHsKKwkJCW5vZGU9IGNvbnRhaW5lcjsKKwkJfSBlbHNlIHsKKwkJCU9iamVjdCBwb3RlbnRpYWxOb2RlPSBmRWRpdG9yLmZpbmRUYXJnZXQocmVnaW9uKTsKKwkJCWlmICghKHBvdGVudGlhbE5vZGUgaW5zdGFuY2VvZiBBbnRFbGVtZW50Tm9kZSkpIHsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0gCisJCQlub2RlPSAoQW50RWxlbWVudE5vZGUpIHBvdGVudGlhbE5vZGU7CisJCX0KKwkJU3RyaW5nIG9jY3VycmVuY2VzSWRlbnRpZmllcj0gbm9kZS5nZXRPY2N1cnJlbmNlc0lkZW50aWZpZXIoKTsKKwkJaWYgKG9jY3VycmVuY2VzSWRlbnRpZmllciA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlMaXN0IG5vZGVzPSBuZXcgQXJyYXlMaXN0KDEpOworCQlub2Rlcy5hZGQoZkFudE1vZGVsLmdldFByb2plY3ROb2RlKCkpOworICAgICAgICBMaXN0IHVzYWdlcz0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICB1c2FnZXMuYWRkKG5vZGUpOworCQlzY2FuTm9kZXNGb3JPY2N1cnJlbmNlcyhub2RlcywgdXNhZ2VzLCBvY2N1cnJlbmNlc0lkZW50aWZpZXIpOworCQlTdHJpbmcgaWRlbnRpZmllcjsKKwkJdHJ5IHsKKwkJCWlkZW50aWZpZXI9IGZEb2N1bWVudC5nZXQocmVnaW9uLmdldE9mZnNldCgpLCByZWdpb24uZ2V0TGVuZ3RoKCkpOworCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorICAgICAgICBpbnQgbGVuZ3RoPSBpZGVudGlmaWVyLmxlbmd0aCgpOworICAgICAgICBpZiAobGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisJCUxpc3QgcG9zaXRpb25zPSBuZXcgQXJyYXlMaXN0KHVzYWdlcy5zaXplKCkpOworCQlmb3IgKEl0ZXJhdG9yIGVhY2g9IHVzYWdlcy5pdGVyYXRvcigpOyBlYWNoLmhhc05leHQoKTspIHsKKwkJCUFudEVsZW1lbnROb2RlIGN1cnJlbnROb2RlPSAoQW50RWxlbWVudE5vZGUpZWFjaC5uZXh0KCk7CisJCQlMaXN0IG9mZnNldHM9IGN1cnJlbnROb2RlLmNvbXB1dGVJZGVudGlmaWVyT2Zmc2V0cyhpZGVudGlmaWVyKTsKKwkJCWlmIChvZmZzZXRzICE9IG51bGwpIHsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IG9mZnNldHMuc2l6ZSgpOyBpKyspIHsKKwkJCQkJcG9zaXRpb25zLmFkZChuZXcgUG9zaXRpb24oKChJbnRlZ2VyKW9mZnNldHMuZ2V0KGkpKS5pbnRWYWx1ZSgpLCBsZW5ndGgpKTsKKwkJCQl9CisJCQl9CisJCX0KKwkKKwkJcmV0dXJuIHBvc2l0aW9uczsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIHNjYW5Ob2Rlc0Zvck9jY3VycmVuY2VzKExpc3Qgbm9kZXMsIExpc3QgdXNhZ2VzLCBTdHJpbmcgaWRlbnRpZmllcikgeworCQlJdGVyYXRvciBpdGVyPSBub2Rlcy5pdGVyYXRvcigpOworCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKwkJCUFudEVsZW1lbnROb2RlIG5vZGUgPSAoQW50RWxlbWVudE5vZGUpIGl0ZXIubmV4dCgpOworCQkJaWYgKCF1c2FnZXMuY29udGFpbnMobm9kZSkgJiYgbm9kZS5jb250YWluc09jY3VycmVuY2UoaWRlbnRpZmllcikpIHsKKwkJCQl1c2FnZXMuYWRkKG5vZGUpOwkKKwkJCX0KKwkJCWlmIChub2RlLmhhc0NoaWxkcmVuKCkpIHsKKwkJCQlzY2FuTm9kZXNGb3JPY2N1cnJlbmNlcyhub2RlLmdldENoaWxkTm9kZXMoKSwgdXNhZ2VzLCBpZGVudGlmaWVyKTsKKwkJCX0KKwkJfQorCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci9hY3Rpb25zL0FudEVkaXRvckFjdGlvbk1lc3NhZ2VzLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci9hY3Rpb25zL0FudEVkaXRvckFjdGlvbk1lc3NhZ2VzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJhNzlmMAotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL2FjdGlvbnMvQW50RWRpdG9yQWN0aW9uTWVzc2FnZXMuamF2YQpAQCAtMCwwICsxLDM2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IuYWN0aW9uczsKKworCitpbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7CisKK3B1YmxpYyBjbGFzcyBBbnRFZGl0b3JBY3Rpb25NZXNzYWdlcyB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5hY3Rpb25zLkFudEVkaXRvckFjdGlvbk1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAorCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzb3VyY2VCdW5kbGUgZmdSZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShCVU5ETEVfTkFNRSk7CisKKwlwcml2YXRlIEFudEVkaXRvckFjdGlvbk1lc3NhZ2VzKCkgeworCX0KKworCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7CisJCXJldHVybiBmZ1Jlc291cmNlQnVuZGxlOworCX0KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgeworCQl0cnkgeworCQkJcmV0dXJuIGZnUmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7CisJCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm4gJyEnICsga2V5ICsgJyEnOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvYWN0aW9ucy9BbnRFZGl0b3JBY3Rpb25NZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvYWN0aW9ucy9BbnRFZGl0b3JBY3Rpb25NZXNzYWdlcy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxNTAxZTUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci9hY3Rpb25zL0FudEVkaXRvckFjdGlvbk1lc3NhZ2VzLnByb3BlcnRpZXMKQEAgLTAsMCArMSw0MiBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisjIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjCisjIENvbnRyaWJ1dG9yczoKKyMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyAgICAgSm9obi1NYXNvbiBQLiBTaGFja2VsZm9yZCAtIGJ1ZyA0MDI1NQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitPcGVuRGVjbGFyYXRpb25BY3Rpb24uMD0mT3BlbiBEZWNsYXJhdGlvbgorT3BlbkRlY2xhcmF0aW9uQWN0aW9uLjE9T3BlbiBhbiBlZGl0b3Igb24gdGhlIHJlZmVyZW5jZWQgZWxlbWVudAorT3BlbkV4dGVybmFsRG9jQWN0aW9uLjA9T3BlbiBFeHRlcm5hbCBBbnQgRG9jdW1lbnRhdGlvbgorT3BlbkV4dGVybmFsRG9jQWN0aW9uLjE9T3BlbiBFJnh0ZXJuYWwgRG9jdW1lbnRhdGlvbgorT3BlbkV4dGVybmFsRG9jQWN0aW9uLjI9T3BlbnMgYW4gZXh0ZXJuYWwgYnJvd3NlciBvbiB0aGUgcmVmZXJlbmNlZCBBbnQgZWxlbWVudAorCitUb2dnbGVQcmVzZW50YXRpb24ubGFiZWw9U2hvdyBTb3VyY2Ugb2YgU2VsZWN0ZWQgRWxlbWVudCBPbmx5CitUb2dnbGVQcmVzZW50YXRpb24udG9vbHRpcD1TaG93IFNvdXJjZSBvZiBTZWxlY3RlZCBFbGVtZW50IE9ubHkKKworVG9nZ2xlTWFya09jY3VycmVuY2VzQWN0aW9uLmxhYmVsPSBUb2dnbGUgQW50IE1hcmsgT2NjdXJyZW5jZXMKK1RvZ2dsZU1hcmtPY2N1cnJlbmNlc0FjdGlvbi50b29sdGlwPSBUb2dnbGUgQW50IE1hcmsgT2NjdXJyZW5jZXMKKworVG9nZ2xlQXV0b1JlY29uY2lsZUFjdGlvbi5sYWJlbD0gVG9nZ2xlIEF1dG8gUmVjb25jaWxlCitUb2dnbGVBdXRvUmVjb25jaWxlQWN0aW9uLnRvb2x0aXA9IFRvZ2dsZSBBdXRvIHJlY29uY2lsZQorCitQcm9qZWN0aW9uLlRvZ2dsZS5sYWJlbD0gJkVuYWJsZSBGb2xkaW5nCitQcm9qZWN0aW9uLlRvZ2dsZS50b29sdGlwPSBUb2dnbGVzIEZvbGRpbmcKK1Byb2plY3Rpb24uVG9nZ2xlLmRlc2NyaXB0aW9uPSBUb2dnbGVzIGZvbGRpbmcgZm9yIHRoZSBjdXJyZW50IGVkaXRvcgorCitQcm9qZWN0aW9uLkV4cGFuZEFsbC5sYWJlbD0gRXhwYW5kICZBbGwKK1Byb2plY3Rpb24uRXhwYW5kQWxsLnRvb2x0aXA9IEV4cGFuZHMgQWxsIEZvbGRlZCBSZWdpb25zCitQcm9qZWN0aW9uLkV4cGFuZEFsbC5kZXNjcmlwdGlvbj0gRXhwYW5kcyBhbnkgZm9sZGVkIHJlZ2lvbnMgaW4gdGhlIGN1cnJlbnQgZWRpdG9yCisKK1J1blRvTGluZUFkYXB0ZXIuMD1FbXB0eSBlZGl0b3IKK1J1blRvTGluZUFkYXB0ZXIuMT1NaXNzaW5nIGRvY3VtZW50CitSdW5Ub0xpbmVBZGFwdGVyLjI9Tm8gZmlsZSBjb3VsZCBiZSBmb3VuZAorUnVuVG9MaW5lQWRhcHRlci4zPVVuYWJsZSB0byBsb2NhdGUgZGVidWcgdGFyZ2V0CitSZW5hbWVJbkZpbGVBY3Rpb24uMD1SZSZuYW1lIEluIEZpbGUKK1JlbmFtZUluRmlsZUFjdGlvbi4xPVJlbmFtZXMgYWxsIHJlZmVyZW5jZXMgd2l0aGluIHRoZSBzYW1lIGJ1aWxkZmlsZQorUmVuYW1lSW5GaWxlQWN0aW9uLjI9UmVuYW1lcyBhbGwgcmVmZXJlbmNlcwpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvYWN0aW9ucy9Gb2xkaW5nQWN0aW9uR3JvdXAuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL2FjdGlvbnMvRm9sZGluZ0FjdGlvbkdyb3VwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE3MDdkOQotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL2FjdGlvbnMvRm9sZGluZ0FjdGlvbkdyb3VwLmphdmEKQEAgLTAsMCArMSwxMjMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5hY3Rpb25zOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5wcm9qZWN0aW9uLklQcm9qZWN0aW9uTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UucHJvamVjdGlvbi5Qcm9qZWN0aW9uVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uR3JvdXA7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LklGb2xkaW5nQ29tbWFuZElkczsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuVGV4dE9wZXJhdGlvbkFjdGlvbjsKKworCisvKioKKyAqIEdyb3VwcyB0aGUgQW50IGZvbGRpbmcgYWN0aW9ucy4KKyAqICAKKyAqIEBzaW5jZSAzLjEKKyAqLworcHVibGljIGNsYXNzIEZvbGRpbmdBY3Rpb25Hcm91cCBleHRlbmRzIEFjdGlvbkdyb3VwIHsKKwlwcml2YXRlIFByb2plY3Rpb25WaWV3ZXIgZlZpZXdlcjsKKwkKKwlwcml2YXRlIFRleHRPcGVyYXRpb25BY3Rpb24gZlRvZ2dsZTsKKwlwcml2YXRlIFRleHRPcGVyYXRpb25BY3Rpb24gZkV4cGFuZDsKKwlwcml2YXRlIFRleHRPcGVyYXRpb25BY3Rpb24gZkNvbGxhcHNlOworCXByaXZhdGUgVGV4dE9wZXJhdGlvbkFjdGlvbiBmRXhwYW5kQWxsOworCisJcHJpdmF0ZSBJUHJvamVjdGlvbkxpc3RlbmVyIGZQcm9qZWN0aW9uTGlzdGVuZXI7CisJCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBwcm9qZWN0aW9uIGFjdGlvbiBncm91cCBmb3IgPGNvZGU+ZWRpdG9yPC9jb2RlPi4gSWYgdGhlCisJICogc3VwcGxpZWQgdmlld2VyIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiA8Y29kZT5Qcm9qZWN0aW9uVmlld2VyPC9jb2RlPiwgdGhlCisJICogYWN0aW9uIGdyb3VwIGlzIGRpc2FibGVkLgorCSAqIAorCSAqIEBwYXJhbSBlZGl0b3IgdGhlIHRleHQgZWRpdG9yIHRvIG9wZXJhdGUgb24KKwkgKiBAcGFyYW0gdmlld2VyIHRoZSB2aWV3ZXIgb2YgdGhlIGVkaXRvcgorCSAqLworCXB1YmxpYyBGb2xkaW5nQWN0aW9uR3JvdXAoSVRleHRFZGl0b3IgZWRpdG9yLCBJVGV4dFZpZXdlciB2aWV3ZXIpIHsKKwkJaWYgKHZpZXdlciBpbnN0YW5jZW9mIFByb2plY3Rpb25WaWV3ZXIpIHsKKwkJCWZWaWV3ZXI9IChQcm9qZWN0aW9uVmlld2VyKSB2aWV3ZXI7CisJCQkKKwkJCWZQcm9qZWN0aW9uTGlzdGVuZXI9IG5ldyBJUHJvamVjdGlvbkxpc3RlbmVyKCkgeworCisJCQkJcHVibGljIHZvaWQgcHJvamVjdGlvbkVuYWJsZWQoKSB7CisJCQkJCXVwZGF0ZSgpOworCQkJCX0KKworCQkJCXB1YmxpYyB2b2lkIHByb2plY3Rpb25EaXNhYmxlZCgpIHsKKwkJCQkJdXBkYXRlKCk7CisJCQkJfQorCQkJfTsKKwkJCQorCQkJZlZpZXdlci5hZGRQcm9qZWN0aW9uTGlzdGVuZXIoZlByb2plY3Rpb25MaXN0ZW5lcik7CisJCQkKKwkJCWZUb2dnbGU9IG5ldyBUZXh0T3BlcmF0aW9uQWN0aW9uKEFudEVkaXRvckFjdGlvbk1lc3NhZ2VzLmdldFJlc291cmNlQnVuZGxlKCksICJQcm9qZWN0aW9uLlRvZ2dsZS4iLCBlZGl0b3IsIFByb2plY3Rpb25WaWV3ZXIuVE9HR0xFLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAorCQkJZlRvZ2dsZS5zZXRDaGVja2VkKHRydWUpOworCQkJZlRvZ2dsZS5zZXRBY3Rpb25EZWZpbml0aW9uSWQoSUZvbGRpbmdDb21tYW5kSWRzLkZPTERJTkdfVE9HR0xFKTsKKwkJCWVkaXRvci5zZXRBY3Rpb24oIkZvbGRpbmdUb2dnbGUiLCBmVG9nZ2xlKTsgLy8kTk9OLU5MUy0xJAorCQkJCisJCQlmRXhwYW5kQWxsPSBuZXcgVGV4dE9wZXJhdGlvbkFjdGlvbihBbnRFZGl0b3JBY3Rpb25NZXNzYWdlcy5nZXRSZXNvdXJjZUJ1bmRsZSgpLCAiUHJvamVjdGlvbi5FeHBhbmRBbGwuIiwgZWRpdG9yLCBQcm9qZWN0aW9uVmlld2VyLkVYUEFORF9BTEwsIHRydWUpOyAvLyROT04tTkxTLTEkCisJCQlmRXhwYW5kQWxsLnNldEFjdGlvbkRlZmluaXRpb25JZChJRm9sZGluZ0NvbW1hbmRJZHMuRk9MRElOR19FWFBBTkRfQUxMKTsKKwkJCWVkaXRvci5zZXRBY3Rpb24oIkZvbGRpbmdFeHBhbmRBbGwiLCBmRXhwYW5kQWxsKTsgLy8kTk9OLU5MUy0xJAorCQkJCisJCQlmRXhwYW5kPSBuZXcgVGV4dE9wZXJhdGlvbkFjdGlvbihBbnRFZGl0b3JBY3Rpb25NZXNzYWdlcy5nZXRSZXNvdXJjZUJ1bmRsZSgpLCAiUHJvamVjdGlvbi5FeHBhbmQuIiwgZWRpdG9yLCBQcm9qZWN0aW9uVmlld2VyLkVYUEFORCwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKKwkJCWZFeHBhbmQuc2V0QWN0aW9uRGVmaW5pdGlvbklkKElGb2xkaW5nQ29tbWFuZElkcy5GT0xESU5HX0VYUEFORCk7CisJCQllZGl0b3Iuc2V0QWN0aW9uKCJGb2xkaW5nRXhwYW5kIiwgZkV4cGFuZCk7IC8vJE5PTi1OTFMtMSQKKwkJCQorCQkJZkNvbGxhcHNlPSBuZXcgVGV4dE9wZXJhdGlvbkFjdGlvbihBbnRFZGl0b3JBY3Rpb25NZXNzYWdlcy5nZXRSZXNvdXJjZUJ1bmRsZSgpLCAiUHJvamVjdGlvbi5Db2xsYXBzZS4iLCBlZGl0b3IsIFByb2plY3Rpb25WaWV3ZXIuQ09MTEFQU0UsIHRydWUpOyAvLyROT04tTkxTLTEkCisJCQlmQ29sbGFwc2Uuc2V0QWN0aW9uRGVmaW5pdGlvbklkKElGb2xkaW5nQ29tbWFuZElkcy5GT0xESU5HX0NPTExBUFNFKTsKKwkJCWVkaXRvci5zZXRBY3Rpb24oIkZvbGRpbmdDb2xsYXBzZSIsIGZDb2xsYXBzZSk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBncm91cCBpcyBlbmFibGVkLiAKKwkgKiA8cHJlPgorCSAqIEludmFyaWFudDogaXNFbmFibGVkKCkgPD0+IGZWaWV3ZXIgYW5kIGFsbCBhY3Rpb25zIGFyZSAhPSBudWxsLgorCSAqIDwvcHJlPgorCSAqIAorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdyb3VwIGlzIGVuYWJsZWQKKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gaXNFbmFibGVkKCkgeworCQlyZXR1cm4gZlZpZXdlciAhPSBudWxsOworCX0KKwkKKwkvKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25Hcm91cCNkaXNwb3NlKCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQlpZiAoaXNFbmFibGVkKCkpIHsKKwkJCWZWaWV3ZXIucmVtb3ZlUHJvamVjdGlvbkxpc3RlbmVyKGZQcm9qZWN0aW9uTGlzdGVuZXIpOworCQkJZlZpZXdlcj0gbnVsbDsKKwkJfQorCQlzdXBlci5kaXNwb3NlKCk7CisJfQorCQorCS8qKgorCSAqIFVwZGF0ZXMgdGhlIGFjdGlvbnMuCisJICovCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlKCkgeworCQlpZiAoaXNFbmFibGVkKCkpIHsKKwkJCWZUb2dnbGUudXBkYXRlKCk7CisJCQlmVG9nZ2xlLnNldENoZWNrZWQoZlZpZXdlci5nZXRQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsKCkgIT0gbnVsbCk7CisJCQlmRXhwYW5kLnVwZGF0ZSgpOworCQkJZkV4cGFuZEFsbC51cGRhdGUoKTsKKwkJCWZDb2xsYXBzZS51cGRhdGUoKTsKKwkJfQorCX0KKwkKKwkvKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25Hcm91cCN1cGRhdGVBY3Rpb25CYXJzKCkKKwkgKi8KKwlwdWJsaWMgdm9pZCB1cGRhdGVBY3Rpb25CYXJzKCkgeworCQl1cGRhdGUoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci9hY3Rpb25zL0ZvbGRpbmdFeHBhbmRBbGxSdWxlckFjdGlvbi5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvYWN0aW9ucy9Gb2xkaW5nRXhwYW5kQWxsUnVsZXJBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWYzMGNmCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvYWN0aW9ucy9Gb2xkaW5nRXhwYW5kQWxsUnVsZXJBY3Rpb24uamF2YQpAQCAtMCwwICsxLDMxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IuYWN0aW9uczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklWZXJ0aWNhbFJ1bGVySW5mbzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5wcm9qZWN0aW9uLlByb2plY3Rpb25WaWV3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LklGb2xkaW5nQ29tbWFuZElkczsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkFic3RyYWN0UnVsZXJBY3Rpb25EZWxlZ2F0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuVGV4dE9wZXJhdGlvbkFjdGlvbjsKKworcHVibGljIGNsYXNzIEZvbGRpbmdFeHBhbmRBbGxSdWxlckFjdGlvbiBleHRlbmRzIEFic3RyYWN0UnVsZXJBY3Rpb25EZWxlZ2F0ZSB7CisKKwkvKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5BYnN0cmFjdFJ1bGVyQWN0aW9uRGVsZWdhdGUjY3JlYXRlQWN0aW9uKG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3IsIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklWZXJ0aWNhbFJ1bGVySW5mbykKKwkgKi8KKwlwcm90ZWN0ZWQgSUFjdGlvbiBjcmVhdGVBY3Rpb24oSVRleHRFZGl0b3IgZWRpdG9yLCBJVmVydGljYWxSdWxlckluZm8gcnVsZXJJbmZvKSB7CisJCVRleHRPcGVyYXRpb25BY3Rpb24gYWN0aW9uPSBuZXcgVGV4dE9wZXJhdGlvbkFjdGlvbihBbnRFZGl0b3JBY3Rpb25NZXNzYWdlcy5nZXRSZXNvdXJjZUJ1bmRsZSgpLCAiUHJvamVjdGlvbi5FeHBhbmRBbGwuIiwgZWRpdG9yLCBQcm9qZWN0aW9uVmlld2VyLkVYUEFORF9BTEwsIHRydWUpOyAvLyROT04tTkxTLTEkCisJCWFjdGlvbi5zZXRBY3Rpb25EZWZpbml0aW9uSWQoSUZvbGRpbmdDb21tYW5kSWRzLkZPTERJTkdfRVhQQU5EX0FMTCk7CisJCXJldHVybiBhY3Rpb247CisJfQorfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvYWN0aW9ucy9Gb2xkaW5nVG9nZ2xlUnVsZXJBY3Rpb24uamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL2FjdGlvbnMvRm9sZGluZ1RvZ2dsZVJ1bGVyQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQzODY3MQotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL2FjdGlvbnMvRm9sZGluZ1RvZ2dsZVJ1bGVyQWN0aW9uLmphdmEKQEAgLTAsMCArMSw2NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLmFjdGlvbnM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLkFudEVkaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVZlcnRpY2FsUnVsZXJJbmZvOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLnByb2plY3Rpb24uUHJvamVjdGlvblZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQuSUZvbGRpbmdDb21tYW5kSWRzOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQWJzdHJhY3RSdWxlckFjdGlvbkRlbGVnYXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5UZXh0T3BlcmF0aW9uQWN0aW9uOworCitwdWJsaWMgY2xhc3MgRm9sZGluZ1RvZ2dsZVJ1bGVyQWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RSdWxlckFjdGlvbkRlbGVnYXRlIHsKKworCXByaXZhdGUgSUFjdGlvbiBmVUlBY3Rpb247CisJcHJpdmF0ZSBUZXh0T3BlcmF0aW9uQWN0aW9uIGZBY3Rpb247CisJcHJpdmF0ZSBJVGV4dEVkaXRvciBmVGV4dEVkaXRvcjsKKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQWJzdHJhY3RSdWxlckFjdGlvbkRlbGVnYXRlI2NyZWF0ZUFjdGlvbihvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yLCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JVmVydGljYWxSdWxlckluZm8pCisJICovCisJcHJvdGVjdGVkIElBY3Rpb24gY3JlYXRlQWN0aW9uKElUZXh0RWRpdG9yIGVkaXRvciwgSVZlcnRpY2FsUnVsZXJJbmZvIHJ1bGVySW5mbykgeworCQlmVGV4dEVkaXRvcj0gZWRpdG9yOworCQlmQWN0aW9uPSBuZXcgVGV4dE9wZXJhdGlvbkFjdGlvbihBbnRFZGl0b3JBY3Rpb25NZXNzYWdlcy5nZXRSZXNvdXJjZUJ1bmRsZSgpLCAiUHJvamVjdGlvbi5Ub2dnbGUuIiwgZWRpdG9yLCBQcm9qZWN0aW9uVmlld2VyLlRPR0dMRSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKKwkJZkFjdGlvbi5zZXRBY3Rpb25EZWZpbml0aW9uSWQoSUZvbGRpbmdDb21tYW5kSWRzLkZPTERJTkdfVE9HR0xFKTsKKwkJcmV0dXJuIGZBY3Rpb247CisJfQorCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JBY3Rpb25EZWxlZ2F0ZSNzZXRBY3RpdmVFZGl0b3Iob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0KQorCSAqLworCXB1YmxpYyB2b2lkIHNldEFjdGl2ZUVkaXRvcihJQWN0aW9uIGNhbGxlckFjdGlvbiwgSUVkaXRvclBhcnQgdGFyZ2V0RWRpdG9yKSB7CisJCWZVSUFjdGlvbj0gY2FsbGVyQWN0aW9uOworCQlzdXBlci5zZXRBY3RpdmVFZGl0b3IoY2FsbGVyQWN0aW9uLCB0YXJnZXRFZGl0b3IpOworCX0KKwkKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lciNtZW51QWJvdXRUb1Nob3cob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcikKKwkgKi8KKwlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1hbmFnZXIpIHsKKwkJdXBkYXRlKCk7CisJCXN1cGVyLm1lbnVBYm91dFRvU2hvdyhtYW5hZ2VyKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIHVwZGF0ZSgpIHsKKwkJaWYgKGZUZXh0RWRpdG9yIGluc3RhbmNlb2YgQW50RWRpdG9yKSB7CisJCQlJU291cmNlVmlld2VyIHZpZXdlcj0gKChBbnRFZGl0b3IpIGZUZXh0RWRpdG9yKS5nZXRWaWV3ZXIoKTsKKwkJCWlmICh2aWV3ZXIgaW5zdGFuY2VvZiBQcm9qZWN0aW9uVmlld2VyKSB7CisJCQkJYm9vbGVhbiBlbmFibGVkPSAoKFByb2plY3Rpb25WaWV3ZXIpIHZpZXdlcikuZ2V0UHJvamVjdGlvbkFubm90YXRpb25Nb2RlbCgpICE9IG51bGw7CisJCQkJZlVJQWN0aW9uLnNldENoZWNrZWQoZW5hYmxlZCk7CisJCQl9CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci9hY3Rpb25zL09wZW5EZWNsYXJhdGlvbkFjdGlvbi5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvYWN0aW9ucy9PcGVuRGVjbGFyYXRpb25BY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTIyYmJlCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvYWN0aW9ucy9PcGVuRGVjbGFyYXRpb25BY3Rpb24uamF2YQpAQCAtMCwwICsxLDU4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLmFjdGlvbnM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLkFudEVkaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuYWN0aW9ucy5JSmF2YUVkaXRvckFjdGlvbkRlZmluaXRpb25JZHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLmFjdGlvbnMuT3BlbkFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5jb21tYW5kcy5BY3Rpb25IYW5kbGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuaGFuZGxlcnMuSUhhbmRsZXJTZXJ2aWNlOworCitwdWJsaWMgY2xhc3MgT3BlbkRlY2xhcmF0aW9uQWN0aW9uIGV4dGVuZHMgT3BlbkFjdGlvbiB7CisJCisJcHJpdmF0ZSBBbnRFZGl0b3IgZkVkaXRvcjsKKwkKKwlwdWJsaWMgT3BlbkRlY2xhcmF0aW9uQWN0aW9uKEFudEVkaXRvciBhbnRFZGl0b3IpIHsKKwkJc3VwZXIoYW50RWRpdG9yLmdldFNpdGUoKSk7CisJCWZFZGl0b3I9IGFudEVkaXRvcjsKKwkJc2V0QWN0aW9uRGVmaW5pdGlvbklkKElKYXZhRWRpdG9yQWN0aW9uRGVmaW5pdGlvbklkcy5PUEVOX0VESVRPUik7CisJCUlIYW5kbGVyU2VydmljZSBoYW5kbGVyU2VydmVyPSAoSUhhbmRsZXJTZXJ2aWNlKSBhbnRFZGl0b3IuZ2V0U2l0ZSgpLmdldFNlcnZpY2UoSUhhbmRsZXJTZXJ2aWNlLmNsYXNzKTsKKyAgICAgICAgaGFuZGxlclNlcnZlci5hY3RpdmF0ZUhhbmRsZXIoSUphdmFFZGl0b3JBY3Rpb25EZWZpbml0aW9uSWRzLk9QRU5fRURJVE9SLCBuZXcgQWN0aW9uSGFuZGxlcih0aGlzKSk7CisKKwkJc2V0VGV4dChBbnRFZGl0b3JBY3Rpb25NZXNzYWdlcy5nZXRTdHJpbmcoIk9wZW5EZWNsYXJhdGlvbkFjdGlvbi4wIikpOyAgLy8kTk9OLU5MUy0xJAorCQlzZXREZXNjcmlwdGlvbihBbnRFZGl0b3JBY3Rpb25NZXNzYWdlcy5nZXRTdHJpbmcoIk9wZW5EZWNsYXJhdGlvbkFjdGlvbi4xIikpOyAvLyROT04tTkxTLTEkCisJCXNldFRvb2xUaXBUZXh0KEFudEVkaXRvckFjdGlvbk1lc3NhZ2VzLmdldFN0cmluZygiT3BlbkRlY2xhcmF0aW9uQWN0aW9uLjEiKSk7IC8vJE5PTi1OTFMtMSQKKwl9CisJCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jcnVuKCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBydW4oKSB7CisJCWlmIChmRWRpdG9yID09IG51bGwpIHsKKwkJCXJldHVybjsKKwkJfQorCQkKKwkJZkVkaXRvci5vcGVuUmVmZXJlbmNlRWxlbWVudCgpOwkJCisJfQorCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC51aS5hY3Rpb25zLlNlbGVjdGlvbkRpc3BhdGNoQWN0aW9uI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbikKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElUZXh0U2VsZWN0aW9uIHNlbGVjdGlvbikgeworCQlzZXRFbmFibGVkKGZFZGl0b3IgIT0gbnVsbCk7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldEVkaXRvcihBbnRFZGl0b3IgZWRpdG9yKSB7CisJCWZFZGl0b3I9IGVkaXRvcjsKKwl9Cit9CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci9hY3Rpb25zL1JlbmFtZUluRmlsZUFjdGlvbi5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvYWN0aW9ucy9SZW5hbWVJbkZpbGVBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTk5YzU2Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvYWN0aW9ucy9SZW5hbWVJbkZpbGVBY3Rpb24uamF2YQpAQCAtMCwwICsxLDEyMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IuYWN0aW9uczsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5BbnRVSVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLkFudEVkaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLkVkaXRvclN5bmNocm9uaXplcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLk9jY3VycmVuY2VzRmluZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5hY3Rpb25zLlNlbGVjdGlvbkRpc3BhdGNoQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQubGluay5MaW5rZWRNb2RlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5saW5rLkxpbmtlZE1vZGVVSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmxpbmsuTGlua2VkUG9zaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5saW5rLkxpbmtlZFBvc2l0aW9uR3JvdXA7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLmxpbmsuRWRpdG9yTGlua2VkTW9kZVVJOworCitwdWJsaWMgY2xhc3MgUmVuYW1lSW5GaWxlQWN0aW9uIGV4dGVuZHMgU2VsZWN0aW9uRGlzcGF0Y2hBY3Rpb24geworCQorCXByaXZhdGUgQW50RWRpdG9yIGZFZGl0b3I7CisJCisJcHVibGljIFJlbmFtZUluRmlsZUFjdGlvbihBbnRFZGl0b3IgYW50RWRpdG9yKSB7CisJCXN1cGVyKGFudEVkaXRvci5nZXRTaXRlKCkpOworCQlmRWRpdG9yPSBhbnRFZGl0b3I7CisJCXNldFRleHQoQW50RWRpdG9yQWN0aW9uTWVzc2FnZXMuZ2V0U3RyaW5nKCJSZW5hbWVJbkZpbGVBY3Rpb24uMCIpKTsgLy8kTk9OLU5MUy0xJAorCQlzZXREZXNjcmlwdGlvbihBbnRFZGl0b3JBY3Rpb25NZXNzYWdlcy5nZXRTdHJpbmcoIlJlbmFtZUluRmlsZUFjdGlvbi4xIikpOyAvLyROT04tTkxTLTEkCisJCXNldFRvb2xUaXBUZXh0KEFudEVkaXRvckFjdGlvbk1lc3NhZ2VzLmdldFN0cmluZygiUmVuYW1lSW5GaWxlQWN0aW9uLjIiKSk7IC8vJE5PTi1OTFMtMSQKKwl9CisJCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jcnVuKCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBydW4oKSB7CisJCWlmIChmRWRpdG9yID09IG51bGwpIHsKKwkJCXJldHVybjsKKwkJfQorCQkKKwkJSVNvdXJjZVZpZXdlciB2aWV3ZXI9IGZFZGl0b3IuZ2V0Vmlld2VyKCk7CisJCUlEb2N1bWVudCBkb2N1bWVudD0gdmlld2VyLmdldERvY3VtZW50KCk7CisJCWludCBvZmZzZXQ9ICgoSVRleHRTZWxlY3Rpb24pZ2V0U2VsZWN0aW9uKCkpLmdldE9mZnNldCgpOworCQlMaW5rZWRQb3NpdGlvbkdyb3VwIGdyb3VwPSBuZXcgTGlua2VkUG9zaXRpb25Hcm91cCgpOworCQlPY2N1cnJlbmNlc0ZpbmRlciBmaW5kZXI9IG5ldyBPY2N1cnJlbmNlc0ZpbmRlcihmRWRpdG9yLCBmRWRpdG9yLmdldEFudE1vZGVsKCksIGRvY3VtZW50LCBvZmZzZXQpOworCQlMaXN0IHBvc2l0aW9ucz0gZmluZGVyLnBlcmZvcm0oKTsKKwkJaWYgKHBvc2l0aW9ucyA9PSBudWxsKSB7CisJCQlyZXR1cm47CisJCX0KKwkKKwkJYWRkUG9zaXRpb25zVG9Hcm91cChvZmZzZXQsIHBvc2l0aW9ucywgZG9jdW1lbnQsIGdyb3VwKTsKKwkJaWYgKGdyb3VwLmlzRW1wdHkoKSkgeworCQkgICAgcmV0dXJuOyAgICAgICAgIAorICAgICAgICB9CisJCXRyeSB7CisJCQlMaW5rZWRNb2RlTW9kZWwgbW9kZWw9IG5ldyBMaW5rZWRNb2RlTW9kZWwoKTsKKwkJCW1vZGVsLmFkZEdyb3VwKGdyb3VwKTsKKwkJCW1vZGVsLmZvcmNlSW5zdGFsbCgpOworICAgICAgICAgICAgbW9kZWwuYWRkTGlua2luZ0xpc3RlbmVyKG5ldyBFZGl0b3JTeW5jaHJvbml6ZXIoZkVkaXRvcikpOworCQkJTGlua2VkTW9kZVVJIHVpPSBuZXcgRWRpdG9yTGlua2VkTW9kZVVJKG1vZGVsLCB2aWV3ZXIpOworCQkJdWkuc2V0RXhpdFBvc2l0aW9uKHZpZXdlciwgb2Zmc2V0LCAwLCBJbnRlZ2VyLk1BWF9WQUxVRSk7CisJCQl1aS5lbnRlcigpOworCQkJdmlld2VyLnNldFNlbGVjdGVkUmFuZ2Uob2Zmc2V0LCAwKTsKKwkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgeworCQkJQW50VUlQbHVnaW4ubG9nKGUpOworCQl9CisJfQorCQorICAgIAorICAgIHByaXZhdGUgdm9pZCBhZGRQb3NpdGlvbnNUb0dyb3VwKGludCBvZmZzZXQsIExpc3QgcG9zaXRpb25zLCBJRG9jdW1lbnQgZG9jdW1lbnQsIExpbmtlZFBvc2l0aW9uR3JvdXAgZ3JvdXApIHsKKyAgICAgICAgSXRlcmF0b3IgaXRlcj0gcG9zaXRpb25zLml0ZXJhdG9yKCk7CisgICAgICAgIGludCBpPSAwOworICAgICAgICBpbnQgaj0gMDsKKyAgICAgICAgaW50IGZpcnN0UG9zaXRpb249IC0xOworICAgICAgICB0cnkgeworICAgICAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgUG9zaXRpb24gcG9zaXRpb24gPSAoUG9zaXRpb24pIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgIGlmIChmaXJzdFBvc2l0aW9uID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbi5vdmVybGFwc1dpdGgob2Zmc2V0LCAwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RQb3NpdGlvbj0gaTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwLmFkZFBvc2l0aW9uKG5ldyBMaW5rZWRQb3NpdGlvbihkb2N1bWVudCwgcG9zaXRpb24uZ2V0T2Zmc2V0KCksIHBvc2l0aW9uLmdldExlbmd0aCgpLCBqKyspKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGdyb3VwLmFkZFBvc2l0aW9uKG5ldyBMaW5rZWRQb3NpdGlvbihkb2N1bWVudCwgcG9zaXRpb24uZ2V0T2Zmc2V0KCksIHBvc2l0aW9uLmdldExlbmd0aCgpLCBqKyspKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZmlyc3RQb3NpdGlvbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgUG9zaXRpb24gcG9zaXRpb249IChQb3NpdGlvbikgcG9zaXRpb25zLmdldChpKTsKKyAgICAgICAgICAgICAgICBncm91cC5hZGRQb3NpdGlvbihuZXcgTGlua2VkUG9zaXRpb24oZG9jdW1lbnQsIHBvc2l0aW9uLmdldE9mZnNldCgpLCBwb3NpdGlvbi5nZXRMZW5ndGgoKSwgaisrKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGJlKSB7CisgICAgICAgICAgICBBbnRVSVBsdWdpbi5sb2coYmUpOworICAgICAgICB9CisgICAgfQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC51aS5hY3Rpb25zLlNlbGVjdGlvbkRpc3BhdGNoQWN0aW9uI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbikKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElUZXh0U2VsZWN0aW9uIHNlbGVjdGlvbikgeworCQlzZXRFbmFibGVkKGZFZGl0b3IgIT0gbnVsbCk7CisJfQorCisJLyoqCisJICogU2V0IHRoZSBBbnQgZWRpdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWN0aW9uCisJICogQHBhcmFtIGVkaXRvciB0aGUgYW50IGVkaXRvciB0byBkbyB0aGUgcmVuYW1lcworCSAqLworCXB1YmxpYyB2b2lkIHNldEVkaXRvcihBbnRFZGl0b3IgZWRpdG9yKSB7CisJCWZFZGl0b3I9IGVkaXRvcjsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvYWN0aW9ucy9SdW5Ub0xpbmVBZGFwdGVyLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci9hY3Rpb25zL1J1blRvTGluZUFkYXB0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDkwNjEwCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvYWN0aW9ucy9SdW5Ub0xpbmVBZGFwdGVyLmphdmEKQEAgLTAsMCArMSwxMDQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5hY3Rpb25zOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5sYXVuY2hpbmcuZGVidWcuSUFudERlYnVnQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5sYXVuY2hpbmcuZGVidWcubW9kZWwuQW50RGVidWdFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5sYXVuY2hpbmcuZGVidWcubW9kZWwuQW50TGluZUJyZWFrcG9pbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLkFudFVJUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklCcmVha3BvaW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSURlYnVnVGFyZ2V0OworaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVN1c3BlbmRSZXN1bWU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuYWN0aW9ucy5JUnVuVG9MaW5lVGFyZ2V0OworaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuUnVuVG9MaW5lSGFuZGxlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JRG9jdW1lbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOworCisvKioKKyAqIFJ1biB0byBsaW5lIHRhcmdldCBmb3IgdGhlIEFudCBkZWJ1Z2dlcgorICovCitwdWJsaWMgY2xhc3MgUnVuVG9MaW5lQWRhcHRlciBpbXBsZW1lbnRzIElSdW5Ub0xpbmVUYXJnZXQgeworCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuSVJ1blRvTGluZVRhcmdldCNydW5Ub0xpbmUob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQsIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbiwgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JU3VzcGVuZFJlc3VtZSkKKwkgKi8KKwlwdWJsaWMgdm9pZCBydW5Ub0xpbmUoSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24sIElTdXNwZW5kUmVzdW1lIHRhcmdldCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gKElFZGl0b3JQYXJ0KXBhcnQ7CisJCUlFZGl0b3JJbnB1dCBpbnB1dCA9IGVkaXRvclBhcnQuZ2V0RWRpdG9ySW5wdXQoKTsKKwkJU3RyaW5nIGVycm9yTWVzc2FnZSA9IG51bGw7CisJCWlmIChpbnB1dCA9PSBudWxsKSB7CisJCQllcnJvck1lc3NhZ2UgPSBBbnRFZGl0b3JBY3Rpb25NZXNzYWdlcy5nZXRTdHJpbmcoIlJ1blRvTGluZUFkYXB0ZXIuMCIpOyAvLyROT04tTkxTLTEkCisJCX0gZWxzZSB7CisJCQlJVGV4dEVkaXRvciB0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKWVkaXRvclBhcnQ7CisJCQlJRG9jdW1lbnRQcm92aWRlciBwcm92aWRlcj0gdGV4dEVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCk7CisJCQlJRG9jdW1lbnQgZG9jdW1lbnQ9IHByb3ZpZGVyLmdldERvY3VtZW50KGlucHV0KTsKKwkJCQorCQkJaWYgKGRvY3VtZW50ID09IG51bGwpIHsKKwkJCQllcnJvck1lc3NhZ2UgPSBBbnRFZGl0b3JBY3Rpb25NZXNzYWdlcy5nZXRTdHJpbmcoIlJ1blRvTGluZUFkYXB0ZXIuMSIpOyAvLyROT04tTkxTLTEkCisJCQl9IGVsc2UgeworCQkJCQorCQkJCUlUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24gPSAoSVRleHRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKKwkJCQlpbnQgbGluZU51bWJlciA9IHRleHRTZWxlY3Rpb24uZ2V0U3RhcnRMaW5lKCkgKyAxOworCQkJCQorCQkJCUlCcmVha3BvaW50IGJyZWFrcG9pbnQ9IG51bGw7CisJCQkJTWFwIGF0dHJpYnV0ZXMgPSBnZXRSdW5Ub0xpbmVBdHRyaWJ1dGVzKCk7CisJCQkJSUZpbGUgZmlsZSA9IChJRmlsZSlpbnB1dC5nZXRBZGFwdGVyKElGaWxlLmNsYXNzKTsKKwkJCQlpZiAoZmlsZSA9PSBudWxsKSB7CisJCQkJICAgIGVycm9yTWVzc2FnZT0gQW50RWRpdG9yQWN0aW9uTWVzc2FnZXMuZ2V0U3RyaW5nKCJSdW5Ub0xpbmVBZGFwdGVyLjIiKTsgLy8kTk9OLU5MUy0xJAorCQkJCX0gZWxzZSB7CisJCQkJICAgIGJyZWFrcG9pbnQ9IG5ldyBBbnRMaW5lQnJlYWtwb2ludChmaWxlLCBsaW5lTnVtYmVyLCBhdHRyaWJ1dGVzLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrcG9pbnQuc2V0UGVyc2lzdGVkKGZhbHNlKTsKKwkJCQkgICAgZXJyb3JNZXNzYWdlID0gQW50RWRpdG9yQWN0aW9uTWVzc2FnZXMuZ2V0U3RyaW5nKCJSdW5Ub0xpbmVBZGFwdGVyLjMiKTsgLy8kTk9OLU5MUy0xJAorCQkJCSAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgSUFkYXB0YWJsZSkgeworCQkJCSAgICAgICAgSURlYnVnVGFyZ2V0IGRlYnVnVGFyZ2V0ID0gKElEZWJ1Z1RhcmdldCkgKChJQWRhcHRhYmxlKXRhcmdldCkuZ2V0QWRhcHRlcihJRGVidWdUYXJnZXQuY2xhc3MpOworCQkJCSAgICAgICAgaWYgKGRlYnVnVGFyZ2V0ICE9IG51bGwpIHsKKwkJCQkgICAgICAgICAgICBSdW5Ub0xpbmVIYW5kbGVyIGhhbmRsZXIgPSBuZXcgUnVuVG9MaW5lSGFuZGxlcihkZWJ1Z1RhcmdldCwgdGFyZ2V0LCBicmVha3BvaW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLnJ1bihuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKKwkJCQkgICAgICAgICAgICByZXR1cm47CisJCQkJICAgICAgICB9CisJCQkJICAgIH0KKwkJCQl9CisJCQl9CisJCX0KKwkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBbnRVSVBsdWdpbi5nZXRVbmlxdWVJZGVudGlmaWVyKCksIEFudFVJUGx1Z2luLklOVEVSTkFMX0VSUk9SLAorCQkJCWVycm9yTWVzc2FnZSwgbnVsbCkpOworCX0KKworICAgIHByaXZhdGUgTWFwIGdldFJ1blRvTGluZUF0dHJpYnV0ZXMoKSB7CisgICAgICAgIE1hcCBhdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgYXR0cmlidXRlcy5wdXQoSU1hcmtlci5UUkFOU0lFTlQsIEJvb2xlYW4uVFJVRSk7CisgICAgICAgIGF0dHJpYnV0ZXMucHV0KElBbnREZWJ1Z0NvbnN0YW50cy5BTlRfUlVOX1RPX0xJTkUsIEJvb2xlYW4uVFJVRSk7CisgICAgICAgIHJldHVybiBhdHRyaWJ1dGVzOworICAgIH0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuSVJ1blRvTGluZVRhcmdldCNjYW5SdW5Ub0xpbmUob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQsIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbiwgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JU3VzcGVuZFJlc3VtZSkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBjYW5SdW5Ub0xpbmUoSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24sIElTdXNwZW5kUmVzdW1lIHRhcmdldCkgeworCSAgICByZXR1cm4gdGFyZ2V0IGluc3RhbmNlb2YgQW50RGVidWdFbGVtZW50OworCX0KK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL2FjdGlvbnMvVG9nZ2xlQXV0b1JlY29uY2lsZUFjdGlvbi5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvYWN0aW9ucy9Ub2dnbGVBdXRvUmVjb25jaWxlQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk5YWExNQotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL2FjdGlvbnMvVG9nZ2xlQXV0b1JlY29uY2lsZUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTA2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5hY3Rpb25zOworCitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLkFudFVJSW1hZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5BbnRVSVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuSUFudFVJQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IuQW50RWRpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5tb2RlbC5BbnRNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkucHJlZmVyZW5jZXMuQW50RWRpdG9yUHJlZmVyZW5jZUNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlRleHRFZGl0b3JBY3Rpb247CisKKy8qKgorICogQSB0b29sYmFyIGFjdGlvbiB3aGljaCB0b2dnbGVzIHRoZSB7QGxpbmtwbGFpbiBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkucHJlZmVyZW5jZXMjRURJVE9SX1JFQ09OQ0lMRSBwcmVmZXJlbmNlfS4KKyAqIAorICogQHNpbmNlIDMuMQorICovCitwdWJsaWMgY2xhc3MgVG9nZ2xlQXV0b1JlY29uY2lsZUFjdGlvbiBleHRlbmRzIFRleHRFZGl0b3JBY3Rpb24gaW1wbGVtZW50cyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB7CisJCQorCXByaXZhdGUgSVByZWZlcmVuY2VTdG9yZSBmU3RvcmU7CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGFuZCB1cGRhdGVzIHRoZSBhY3Rpb24uCisJICovCisJcHVibGljIFRvZ2dsZUF1dG9SZWNvbmNpbGVBY3Rpb24oKSB7CisJCXN1cGVyKEFudEVkaXRvckFjdGlvbk1lc3NhZ2VzLmdldFJlc291cmNlQnVuZGxlKCksICJUb2dnbGVBdXRvUmVjb25jaWxlQWN0aW9uLiIsIG51bGwsIElBY3Rpb24uQVNfQ0hFQ0tfQk9YKTsgLy8kTk9OLU5MUy0xJAorCQlzZXRJbWFnZURlc2NyaXB0b3IoQW50VUlJbWFnZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKElBbnRVSUNvbnN0YW50cy5JTUdfUkVGUkVTSCkpOworCQlzZXRUb29sVGlwVGV4dChBbnRFZGl0b3JBY3Rpb25NZXNzYWdlcy5nZXRTdHJpbmcoIlRvZ2dsZUF1dG9SZWNvbmNpbGVBY3Rpb24udG9vbHRpcCIpKTsJCSAvLyROT04tTkxTLTEkCisJCXVwZGF0ZSgpOworCX0KKwkKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNydW4oKQorCSAqLworCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJSVRleHRFZGl0b3IgZWRpdG9yPSBnZXRUZXh0RWRpdG9yKCk7CisgICAgICAgIGlmIChlZGl0b3IgaW5zdGFuY2VvZiBBbnRFZGl0b3IpIHsKKyAgICAgICAgICAgIEFudE1vZGVsIG1vZGVsPSAoKEFudEVkaXRvcikgZWRpdG9yKS5nZXRBbnRNb2RlbCgpOworICAgICAgICAgICAgbW9kZWwuc2V0U2hvdWxkUmVjb25jaWxlKGlzQ2hlY2tlZCgpKTsKKyAgICAgICAgICAgIGZTdG9yZS5zZXRWYWx1ZShBbnRFZGl0b3JQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9SRUNPTkNJTEUsIGlzQ2hlY2tlZCgpKTsKKyAgICAgICAgfQorCX0KKwkKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklVcGRhdGUjdXBkYXRlKCkKKwkgKi8KKwlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7CisJCUlUZXh0RWRpdG9yIGVkaXRvcj0gZ2V0VGV4dEVkaXRvcigpOworCQkKKwkJYm9vbGVhbiBjaGVja2VkPSBmYWxzZTsKKwkJYm9vbGVhbiBlbmFibGVkPSBmYWxzZTsKKwkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIEFudEVkaXRvcikgeworICAgICAgICAgICAgQW50TW9kZWwgbW9kZWw9ICgoQW50RWRpdG9yKWVkaXRvcikuZ2V0QW50TW9kZWwoKTsKKyAgICAgICAgICAgIGVuYWJsZWQ9ICBtb2RlbCAhPSBudWxsOworCQkJY2hlY2tlZD0gZW5hYmxlZCAmJiBmU3RvcmUuZ2V0Qm9vbGVhbihBbnRFZGl0b3JQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9SRUNPTkNJTEUpOworICAgICAgICAgICAgaWYgKG1vZGVsICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtb2RlbC5zZXRTaG91bGRSZWNvbmNpbGUoY2hlY2tlZCk7CisgICAgICAgICAgICB9CisJCX0KKwkJCQorCQlzZXRDaGVja2VkKGNoZWNrZWQpOworCQlzZXRFbmFibGVkKGVuYWJsZWQpOworCX0KKwkKKwkvKgorCSAqIEBzZWUgVGV4dEVkaXRvckFjdGlvbiNzZXRFZGl0b3IoSVRleHRFZGl0b3IpCisJICovCisJcHVibGljIHZvaWQgc2V0RWRpdG9yKElUZXh0RWRpdG9yIGVkaXRvcikgeworCQkKKwkJc3VwZXIuc2V0RWRpdG9yKGVkaXRvcik7CisJCQorCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKKwkJCWlmIChmU3RvcmUgPT0gbnVsbCkgeworCQkJCWZTdG9yZT0gQW50VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOworCQkJCWZTdG9yZS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRoaXMpOworCQkJfQorCQl9IGVsc2UgaWYgKGZTdG9yZSAhPSBudWxsKSB7CisJCQlmU3RvcmUucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKKwkJCWZTdG9yZT0gbnVsbDsKKwkJfQorCQkKKwkJdXBkYXRlKCk7CisJfQorCQorCS8qCisJICogQHNlZSBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciNwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50KQorCSAqLworCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKKwkJaWYgKGV2ZW50LmdldFByb3BlcnR5KCkuZXF1YWxzKEFudEVkaXRvclByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX1JFQ09OQ0lMRSkpIHsKKwkJCXNldENoZWNrZWQoQm9vbGVhbi52YWx1ZU9mKGV2ZW50LmdldE5ld1ZhbHVlKCkudG9TdHJpbmcoKSkuYm9vbGVhblZhbHVlKCkpOworICAgICAgICB9CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL2FjdGlvbnMvVG9nZ2xlTWFya09jY3VycmVuY2VzQWN0aW9uLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci9hY3Rpb25zL1RvZ2dsZU1hcmtPY2N1cnJlbmNlc0FjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1NzlmMGQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci9hY3Rpb25zL1RvZ2dsZU1hcmtPY2N1cnJlbmNlc0FjdGlvbi5qYXZhCkBAIC0wLDAgKzEsOTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLmFjdGlvbnM7CisKKworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5BbnRVSUltYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuQW50VUlQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLklBbnRVSUNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLkFudEVkaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkucHJlZmVyZW5jZXMuQW50RWRpdG9yUHJlZmVyZW5jZUNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlRleHRFZGl0b3JBY3Rpb247CisKKworLyoqCisgKiBBIHRvb2xiYXIgYWN0aW9uIHdoaWNoIHRvZ2dsZXMgdGhlIHtAbGlua3BsYWluIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcyNFRElUT1JfTUFSS19PQ0NVUlJFTkNFUyBtYXJrIG9jY3VycmVuY2VzIHByZWZlcmVuY2V9LgorICogCisgKiBAc2luY2UgMy4xCisgKi8KK3B1YmxpYyBjbGFzcyBUb2dnbGVNYXJrT2NjdXJyZW5jZXNBY3Rpb24gZXh0ZW5kcyBUZXh0RWRpdG9yQWN0aW9uIGltcGxlbWVudHMgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgeworCQkKKwlwcml2YXRlIElQcmVmZXJlbmNlU3RvcmUgZlN0b3JlOworCisJLyoqCisJICogQ29uc3RydWN0cyBhbmQgdXBkYXRlcyB0aGUgYWN0aW9uLgorCSAqLworCXB1YmxpYyBUb2dnbGVNYXJrT2NjdXJyZW5jZXNBY3Rpb24oKSB7CisJCXN1cGVyKEFudEVkaXRvckFjdGlvbk1lc3NhZ2VzLmdldFJlc291cmNlQnVuZGxlKCksICJUb2dnbGVNYXJrT2NjdXJyZW5jZXNBY3Rpb24uIiwgbnVsbCwgSUFjdGlvbi5BU19DSEVDS19CT1gpOyAvLyROT04tTkxTLTEkCisJCXNldEltYWdlRGVzY3JpcHRvcihBbnRVSUltYWdlcy5nZXRJbWFnZURlc2NyaXB0b3IoSUFudFVJQ29uc3RhbnRzLklNR19NQVJLX09DQ1VSUkVOQ0VTKSk7CisJCXNldFRvb2xUaXBUZXh0KEFudEVkaXRvckFjdGlvbk1lc3NhZ2VzLmdldFN0cmluZygiVG9nZ2xlTWFya09jY3VycmVuY2VzQWN0aW9uLnRvb2x0aXAiKSk7CQkgLy8kTk9OLU5MUy0xJAorCQl1cGRhdGUoKTsKKwl9CisJCisJLyoKKwkgKiBAc2VlIElBY3Rpb24jYWN0aW9uUGVyZm9ybWVkCisJICovCisJcHVibGljIHZvaWQgcnVuKCkgeworCQlmU3RvcmUuc2V0VmFsdWUoQW50RWRpdG9yUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfTUFSS19PQ0NVUlJFTkNFUywgaXNDaGVja2VkKCkpOworCX0KKwkKKwkvKgorCSAqIEBzZWUgVGV4dEVkaXRvckFjdGlvbiN1cGRhdGUKKwkgKi8KKwlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7CisJCUlUZXh0RWRpdG9yIGVkaXRvcj0gZ2V0VGV4dEVkaXRvcigpOworCQkKKwkJYm9vbGVhbiBjaGVja2VkPSBmYWxzZTsKKwkJYm9vbGVhbiBlbmFibGVkPSBmYWxzZTsKKwkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIEFudEVkaXRvcikgeworCQkJY2hlY2tlZD0gKChBbnRFZGl0b3IpZWRpdG9yKS5pc01hcmtpbmdPY2N1cnJlbmNlcygpOworCQkJZW5hYmxlZD0gKChBbnRFZGl0b3IpZWRpdG9yKS5nZXRBbnRNb2RlbCgpICE9IG51bGw7CisJCX0KKwkJCQorCQlzZXRDaGVja2VkKGNoZWNrZWQpOworCQlzZXRFbmFibGVkKGVuYWJsZWQpOworCX0KKwkKKwkvKgorCSAqIEBzZWUgVGV4dEVkaXRvckFjdGlvbiNzZXRFZGl0b3IoSVRleHRFZGl0b3IpCisJICovCisJcHVibGljIHZvaWQgc2V0RWRpdG9yKElUZXh0RWRpdG9yIGVkaXRvcikgeworCQkKKwkJc3VwZXIuc2V0RWRpdG9yKGVkaXRvcik7CisJCQorCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKKwkJCQorCQkJaWYgKGZTdG9yZSA9PSBudWxsKSB7CisJCQkJZlN0b3JlPSBBbnRVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7CisJCQkJZlN0b3JlLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7CisJCQl9CisJCQkKKwkJfSBlbHNlIGlmIChmU3RvcmUgIT0gbnVsbCkgeworCQkJZlN0b3JlLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7CisJCQlmU3RvcmU9IG51bGw7CisJCX0KKwkJCisJCXVwZGF0ZSgpOworCX0KKwkKKwkvKgorCSAqIEBzZWUgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIjcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7CisJCWlmIChldmVudC5nZXRQcm9wZXJ0eSgpLmVxdWFscyhBbnRFZGl0b3JQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9NQVJLX09DQ1VSUkVOQ0VTKSkKKwkJCXNldENoZWNrZWQoQm9vbGVhbi52YWx1ZU9mKGV2ZW50LmdldE5ld1ZhbHVlKCkudG9TdHJpbmcoKSkuYm9vbGVhblZhbHVlKCkpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci9hY3Rpb25zL1RvZ2dsZVByZXNlbnRhdGlvbkFjdGlvbi5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvYWN0aW9ucy9Ub2dnbGVQcmVzZW50YXRpb25BY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDY2NmVlCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvYWN0aW9ucy9Ub2dnbGVQcmVzZW50YXRpb25BY3Rpb24uamF2YQpAQCAtMCwwICsxLDEzMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLmFjdGlvbnM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuQW50VUlJbWFnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLkFudFVJUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5JQW50VUlDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLnByZWZlcmVuY2VzLkFudEVkaXRvclByZWZlcmVuY2VDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuVGV4dEVkaXRvckFjdGlvbjsKKworLyoqCisgKiBBIHRvb2wgYmFyIGFjdGlvbiB3aGljaCB0b2dnbGVzIHRoZSBwcmVzZW50YXRpb24gbW9kZWwgb2YgdGhlCisgKiBjb25uZWN0ZWQgdGV4dCBlZGl0b3IuIFRoZSBlZGl0b3Igc2hvd3MgZWl0aGVyIHRoZSBoaWdobGlnaHQgcmFuZ2UKKyAqIG9ubHkgb3IgYWx3YXlzIHRoZSB3aG9sZSBkb2N1bWVudC4KKyAqLworcHVibGljIGNsYXNzIFRvZ2dsZVByZXNlbnRhdGlvbkFjdGlvbiBleHRlbmRzIFRleHRFZGl0b3JBY3Rpb24gaW1wbGVtZW50cyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB7CisJCQorCXByaXZhdGUgSVByZWZlcmVuY2VTdG9yZSBmU3RvcmU7CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGFuZCB1cGRhdGVzIHRoZSBhY3Rpb24uCisJICovCisJcHVibGljIFRvZ2dsZVByZXNlbnRhdGlvbkFjdGlvbigpIHsKKwkJc3VwZXIoQW50RWRpdG9yQWN0aW9uTWVzc2FnZXMuZ2V0UmVzb3VyY2VCdW5kbGUoKSwgIlRvZ2dsZVByZXNlbnRhdGlvbi4iLCBudWxsLCBJQWN0aW9uLkFTX0NIRUNLX0JPWCk7IC8vJE5PTi1OTFMtMSQKKwkJc2V0SW1hZ2VEZXNjcmlwdG9yKEFudFVJSW1hZ2VzLmdldEltYWdlRGVzY3JpcHRvcihJQW50VUlDb25zdGFudHMuSU1HX1NFR01FTlRfRURJVCkpOworCX0KKwkKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNydW4oKQorCSAqLworCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCisJCUlUZXh0RWRpdG9yIGVkaXRvcj0gZ2V0VGV4dEVkaXRvcigpOworCQlpZiAoZWRpdG9yID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCQkKKwkJSVJlZ2lvbiByZW1lbWJlcmVkPSBlZGl0b3IuZ2V0SGlnaGxpZ2h0UmFuZ2UoKTsKKwkJZWRpdG9yLnJlc2V0SGlnaGxpZ2h0UmFuZ2UoKTsKKwkJCisJCWJvb2xlYW4gc2hvd0FsbD0gIWVkaXRvci5zaG93c0hpZ2hsaWdodFJhbmdlT25seSgpOworCQlzZXRDaGVja2VkKHNob3dBbGwpOworCQkKKwkJZWRpdG9yLnNob3dIaWdobGlnaHRSYW5nZU9ubHkoc2hvd0FsbCk7CisJCWlmIChyZW1lbWJlcmVkICE9IG51bGwpIHsKKyAgICAgICAgICAgIGVkaXRvci5zZXRIaWdobGlnaHRSYW5nZShyZW1lbWJlcmVkLmdldE9mZnNldCgpLCByZW1lbWJlcmVkLmdldExlbmd0aCgpLCB0cnVlKTsKKyAgICAgICAgfQorCQkKKwkJZlN0b3JlLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7CisJCWZTdG9yZS5zZXRWYWx1ZShBbnRFZGl0b3JQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9TSE9XX1NFR01FTlRTLCBzaG93QWxsKTsKKwkJZlN0b3JlLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7CisJfQorCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVVwZGF0ZSN1cGRhdGUoKQorCSAqLworCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKKwkJSVRleHRFZGl0b3IgZWRpdG9yPSBnZXRUZXh0RWRpdG9yKCk7CisJCWJvb2xlYW4gY2hlY2tlZD0gKGVkaXRvciAhPSBudWxsICYmIGVkaXRvci5zaG93c0hpZ2hsaWdodFJhbmdlT25seSgpKTsKKwkJc2V0Q2hlY2tlZChjaGVja2VkKTsKKwkJc2V0RW5hYmxlZChlZGl0b3IgIT0gbnVsbCk7CisJfQorCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuVGV4dEVkaXRvckFjdGlvbiNzZXRFZGl0b3Iob3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcikKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRFZGl0b3IoSVRleHRFZGl0b3IgZWRpdG9yKSB7CisJCQorCQlzdXBlci5zZXRFZGl0b3IoZWRpdG9yKTsKKwkJCisJCWlmIChlZGl0b3IgIT0gbnVsbCkgeworCQkJCisJCQlpZiAoZlN0b3JlID09IG51bGwpIHsKKwkJCQlmU3RvcmU9IEFudFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKKwkJCQlmU3RvcmUuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKKwkJCX0KKwkJCXN5bmNocm9uaXplV2l0aFByZWZlcmVuY2UoZWRpdG9yKTsKKwkJCQorCQl9IGVsc2UgaWYgKGZTdG9yZSAhPSBudWxsKSB7CisJCQlmU3RvcmUucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKKwkJCWZTdG9yZT0gbnVsbDsKKwkJfQorCQkKKwkJdXBkYXRlKCk7CisJfQorCQorCS8qKgorCSAqIFN5bmNocm9uaXplcyB0aGUgYXBwZWFyYW5jZSBvZiB0aGUgZWRpdG9yIHdpdGggd2hhdCB0aGUgcHJlZmVyZW5jZSBzdG9yZSBpbmRpY2F0ZXMKKwkgKiAKKwkgKiBAcGFyYW0gZWRpdG9yIHRoZSB0ZXh0IGVkaXRvcgorCSAqLworCXByaXZhdGUgdm9pZCBzeW5jaHJvbml6ZVdpdGhQcmVmZXJlbmNlKElUZXh0RWRpdG9yIGVkaXRvcikgeworCQkKKwkJaWYgKGVkaXRvciA9PSBudWxsKSB7CisJCQlyZXR1cm47CisJCX0KKwkJCisJCWJvb2xlYW4gc2hvd1NlZ21lbnRzPSBmU3RvcmUuZ2V0Qm9vbGVhbihBbnRFZGl0b3JQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9TSE9XX1NFR01FTlRTKTsJCQkKKwkJc2V0Q2hlY2tlZChzaG93U2VnbWVudHMpOworCQkKKwkJaWYgKGVkaXRvci5zaG93c0hpZ2hsaWdodFJhbmdlT25seSgpICE9IHNob3dTZWdtZW50cykgeworCQkJSVJlZ2lvbiByZW1lbWJlcmVkPSBlZGl0b3IuZ2V0SGlnaGxpZ2h0UmFuZ2UoKTsKKwkJCWVkaXRvci5yZXNldEhpZ2hsaWdodFJhbmdlKCk7CisJCQllZGl0b3Iuc2hvd0hpZ2hsaWdodFJhbmdlT25seShzaG93U2VnbWVudHMpOworCQkJaWYgKHJlbWVtYmVyZWQgIT0gbnVsbCkgeworCQkJCWVkaXRvci5zZXRIaWdobGlnaHRSYW5nZShyZW1lbWJlcmVkLmdldE9mZnNldCgpLCByZW1lbWJlcmVkLmdldExlbmd0aCgpLCB0cnVlKTsKKwkJCX0KKwkJfQorCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIjcHJvcGVydHlDaGFuZ2Uob3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50KQorCSAqLworCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKKwkJaWYgKGV2ZW50LmdldFByb3BlcnR5KCkuZXF1YWxzKEFudEVkaXRvclByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX1NIT1dfU0VHTUVOVFMpKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZVdpdGhQcmVmZXJlbmNlKGdldFRleHRFZGl0b3IoKSk7CisgICAgICAgIH0KKwl9Cit9CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci9mb3JtYXR0ZXIvWG1sRG9jdW1lbnRGb3JtYXR0aW5nU3RyYXRlZ3kuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL2Zvcm1hdHRlci9YbWxEb2N1bWVudEZvcm1hdHRpbmdTdHJhdGVneS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0Y2RkNjkKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci9mb3JtYXR0ZXIvWG1sRG9jdW1lbnRGb3JtYXR0aW5nU3RyYXRlZ3kuamF2YQpAQCAtMCwwICsxLDgzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IEpvaG4tTWFzb24gUC4gU2hhY2tlbGZvcmQgYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSm9obi1NYXNvbiBQLiBTaGFja2VsZm9yZCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogCSAgIElCTSBDb3Jwb3JhdGlvbiAtIGJ1ZyA1MjA3NgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5mb3JtYXR0ZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0VXRpbGl0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLkNvbnRleHRCYXNlZEZvcm1hdHRpbmdTdHJhdGVneTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmZvcm1hdHRlci5Gb3JtYXR0aW5nQ29udGV4dFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5mb3JtYXR0ZXIuSUZvcm1hdHRpbmdDb250ZXh0OworCitwdWJsaWMgY2xhc3MgWG1sRG9jdW1lbnRGb3JtYXR0aW5nU3RyYXRlZ3kgZXh0ZW5kcyBDb250ZXh0QmFzZWRGb3JtYXR0aW5nU3RyYXRlZ3kgeworIAorCS8qKiBEb2N1bWVudHMgdG8gYmUgZm9ybWF0dGVkIGJ5IHRoaXMgc3RyYXRlZ3kgKi8KKwlwcml2YXRlIGZpbmFsIExpbmtlZExpc3QgZkRvY3VtZW50cz0gbmV3IExpbmtlZExpc3QoKTsKKyAgICAKKwkvKiogYWNjZXNzIHRvIHRoZSBwcmVmZXJlbmNlcyBzdG9yZSAqICovCisJcHJpdmF0ZSBGb3JtYXR0aW5nUHJlZmVyZW5jZXMgcHJlZnM7IAorCQorCXByaXZhdGUgaW50IGluZGVudD0gLTE7CisJCisJcHVibGljIFhtbERvY3VtZW50Rm9ybWF0dGluZ1N0cmF0ZWd5KCkgeworCSAgICB0aGlzLnByZWZzID0gbmV3IEZvcm1hdHRpbmdQcmVmZXJlbmNlcygpOworICAgIH0KKyAKKwlwdWJsaWMgWG1sRG9jdW1lbnRGb3JtYXR0aW5nU3RyYXRlZ3koRm9ybWF0dGluZ1ByZWZlcmVuY2VzIHByZWZzLCBpbnQgaW5kZW50KSB7CisJICAgIEFzc2VydC5pc05vdE51bGwocHJlZnMpOworCSAgICB0aGlzLnByZWZzID0gcHJlZnM7CisJICAgIHRoaXMuaW5kZW50PSBpbmRlbnQ7CisJfQorCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLklGb3JtYXR0aW5nU3RyYXRlZ3lFeHRlbnNpb24jZm9ybWF0KCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBmb3JtYXQoKSB7CisgCisgICAgICAgIHN1cGVyLmZvcm1hdCgpOworICAgICAJZmluYWwgSURvY3VtZW50IGRvY3VtZW50PSAoSURvY3VtZW50KWZEb2N1bWVudHMucmVtb3ZlRmlyc3QoKTsKKwkJaWYgKGRvY3VtZW50ICE9IG51bGwpIHsKKwkgICAgICAgIC8vIFRPRE8gYWxsb3cgZm9ybWF0dGluZyBvZiByZWdpb25zLCBub3QganVzdCB0aGUgZW50aXJlIGRvY3VtZW50OyBidWcgNzU2MTEKKwkgICAgICAgIFN0cmluZyBkb2N1bWVudFRleHQgPSBkb2N1bWVudC5nZXQoKTsKKwkgICAgICAgIFhtbERvY3VtZW50Rm9ybWF0dGVyIGZvcm1hdHRlciA9IG5ldyBYbWxEb2N1bWVudEZvcm1hdHRlcigpOworCSAgICAgICAgaWYgKGluZGVudCAhPSAtMSkgeworCSAgICAgICAgCWZvcm1hdHRlci5zZXRJbml0aWFsSW5kZW50KGluZGVudCk7CisJICAgICAgICB9CisgICAgICAgICAgICBmb3JtYXR0ZXIuc2V0RGVmYXVsdExpbmVEZWxpbWl0ZXIoVGV4dFV0aWxpdGllcy5nZXREZWZhdWx0TGluZURlbGltaXRlcihkb2N1bWVudCkpOworCSAgICAgICAgU3RyaW5nIGZvcm1hdHRlZFRleHQgPSBmb3JtYXR0ZXIuZm9ybWF0KGRvY3VtZW50VGV4dCwgdGhpcy5wcmVmcyk7CisJICAgICAgICBpZiAoZm9ybWF0dGVkVGV4dCAhPSBudWxsICYmICFmb3JtYXR0ZWRUZXh0LmVxdWFscyhkb2N1bWVudFRleHQpKSB7CisJICAgICAgICAJZG9jdW1lbnQuc2V0KGZvcm1hdHRlZFRleHQpOworCSAgICAgICAgfQorCQl9CisgICAgIH0KKyAgICAgCisgICAgIC8qCisgCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5mb3JtYXR0ZXIuQ29udGV4dEJhc2VkRm9ybWF0dGluZ1N0cmF0ZWd5I2Zvcm1hdHRlclN0YXJ0cyhvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmZvcm1hdHRlci5JRm9ybWF0dGluZ0NvbnRleHQpCisgCSAqLworIAlwdWJsaWMgdm9pZCBmb3JtYXR0ZXJTdGFydHMoZmluYWwgSUZvcm1hdHRpbmdDb250ZXh0IGNvbnRleHQpIHsKKyAJCXN1cGVyLmZvcm1hdHRlclN0YXJ0cyhjb250ZXh0KTsKKyAJCQorIAkJZkRvY3VtZW50cy5hZGRMYXN0KGNvbnRleHQuZ2V0UHJvcGVydHkoRm9ybWF0dGluZ0NvbnRleHRQcm9wZXJ0aWVzLkNPTlRFWFRfTUVESVVNKSk7CisgCX0KKworIAkvKgorIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLkNvbnRleHRCYXNlZEZvcm1hdHRpbmdTdHJhdGVneSNmb3JtYXR0ZXJTdG9wcygpCisgCSAqLworIAlwdWJsaWMgdm9pZCBmb3JtYXR0ZXJTdG9wcygpIHsKKyAJCXN1cGVyLmZvcm1hdHRlclN0b3BzKCk7CisKKyAJCWZEb2N1bWVudHMuY2xlYXIoKTsKKyAJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL2Zvcm1hdHRlci9YbWxFbGVtZW50Rm9ybWF0dGluZ1N0cmF0ZWd5LmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci9mb3JtYXR0ZXIvWG1sRWxlbWVudEZvcm1hdHRpbmdTdHJhdGVneS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwYzUzNDEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci9mb3JtYXR0ZXIvWG1sRWxlbWVudEZvcm1hdHRpbmdTdHJhdGVneS5qYXZhCkBAIC0wLDAgKzEsMTExIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IEpvaG4tTWFzb24gUC4gU2hhY2tlbGZvcmQgYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSm9obi1NYXNvbiBQLiBTaGFja2VsZm9yZCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogCSAgIElCTSBDb3Jwb3JhdGlvbiAtIGJ1ZyA1MjA3NiwgYnVnIDg0MzQyCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLmZvcm1hdHRlcjsKKworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRVdGlsaXRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UeXBlZFBvc2l0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLkNvbnRleHRCYXNlZEZvcm1hdHRpbmdTdHJhdGVneTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmZvcm1hdHRlci5Gb3JtYXR0aW5nQ29udGV4dFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5mb3JtYXR0ZXIuSUZvcm1hdHRpbmdDb250ZXh0OworCitwdWJsaWMgY2xhc3MgWG1sRWxlbWVudEZvcm1hdHRpbmdTdHJhdGVneSBleHRlbmRzIENvbnRleHRCYXNlZEZvcm1hdHRpbmdTdHJhdGVneSB7CisKKyAgICAvKiogYWNjZXNzIHRvIHRoZSBwcmVmZXJlbmNlcyBzdG9yZSAqICovCisgICAgcHJpdmF0ZSBmaW5hbCBGb3JtYXR0aW5nUHJlZmVyZW5jZXMgcHJlZnM7CisgICAgCisgICAgLyoqIERvY3VtZW50cyB0byBiZSBmb3JtYXR0ZWQgYnkgdGhpcyBzdHJhdGVneSAqLworCXByaXZhdGUgZmluYWwgTGlua2VkTGlzdCBmRG9jdW1lbnRzPSBuZXcgTGlua2VkTGlzdCgpOworCS8qKiBQYXJ0aXRpb25zIHRvIGJlIGZvcm1hdHRlZCBieSB0aGlzIHN0cmF0ZWd5ICovCisJcHJpdmF0ZSBmaW5hbCBMaW5rZWRMaXN0IGZQYXJ0aXRpb25zPSBuZXcgTGlua2VkTGlzdCgpOworCisgICAgcHVibGljIFhtbEVsZW1lbnRGb3JtYXR0aW5nU3RyYXRlZ3koKSB7CisgICAgICAgIHRoaXMucHJlZnMgPSBuZXcgRm9ybWF0dGluZ1ByZWZlcmVuY2VzKCk7CisgICAgfQorCisgICAgcHVibGljIFhtbEVsZW1lbnRGb3JtYXR0aW5nU3RyYXRlZ3koRm9ybWF0dGluZ1ByZWZlcmVuY2VzIHByZWZzKSB7CisgICAgICAgIEFzc2VydC5pc05vdE51bGwocHJlZnMpOworICAgICAgICB0aGlzLnByZWZzPXByZWZzOworICAgIH0KKyAgICAKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLklGb3JtYXR0aW5nU3RyYXRlZ3lFeHRlbnNpb24jZm9ybWF0KCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBmb3JtYXQoKSB7CisKKyAgICAgICAgc3VwZXIuZm9ybWF0KCk7CisgICAgICAgICAgICAgICAgCisgICAgCWZpbmFsIElEb2N1bWVudCBkb2N1bWVudD0gKElEb2N1bWVudClmRG9jdW1lbnRzLnJlbW92ZUZpcnN0KCk7CisJCWZpbmFsIFR5cGVkUG9zaXRpb24gcGFydGl0aW9uPSAoVHlwZWRQb3NpdGlvbilmUGFydGl0aW9ucy5yZW1vdmVGaXJzdCgpOworCQkKKwkJaWYgKGRvY3VtZW50ID09IG51bGwgfHwgcGFydGl0aW9uID09IG51bGwpIHsKKwkJCXJldHVybjsKKwkJfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTdHJpbmcgZm9ybWF0dGVkID0gZm9ybWF0RWxlbWVudChkb2N1bWVudCwgcGFydGl0aW9uKTsKKyAgICAgICAgICAgIFN0cmluZyBwYXJ0aXRpb25UZXh0ID0gZG9jdW1lbnQuZ2V0KHBhcnRpdGlvbi5nZXRPZmZzZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgcGFydGl0aW9uLmdldExlbmd0aCgpKTsKKworICAgICAgICAgICAgaWYgKGZvcm1hdHRlZCAhPSBudWxsICYmICFmb3JtYXR0ZWQuZXF1YWxzKHBhcnRpdGlvblRleHQpKSB7CisgICAgICAgICAgICAgICAgZG9jdW1lbnQucmVwbGFjZShwYXJ0aXRpb24uZ2V0T2Zmc2V0KCksIHBhcnRpdGlvbi5nZXRMZW5ndGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlZCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZm9ybWF0RWxlbWVudChJRG9jdW1lbnQgZG9jdW1lbnQsIFR5cGVkUG9zaXRpb24gcGFydGl0aW9uKQorICAgICAgICAgICAgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICBTdHJpbmcgcGFydGl0aW9uVGV4dCA9IGRvY3VtZW50LmdldChwYXJ0aXRpb24uZ2V0T2Zmc2V0KCksIHBhcnRpdGlvbi5nZXRMZW5ndGgoKSk7CisKKyAgICAgICAgSVJlZ2lvbiBsaW5lID0gZG9jdW1lbnQuZ2V0TGluZUluZm9ybWF0aW9uT2ZPZmZzZXQocGFydGl0aW9uLmdldE9mZnNldCgpKTsKKworICAgICAgICBpbnQgaW5kZW50TGVuZ3RoID0gcGFydGl0aW9uLmdldE9mZnNldCgpIC0gbGluZS5nZXRPZmZzZXQoKTsKKyAgICAgICAgU3RyaW5nIGxpbmVEZWxpbWl0ZXI9IGRvY3VtZW50LmdldExpbmVEZWxpbWl0ZXIoZG9jdW1lbnQuZ2V0TGluZU9mT2Zmc2V0KGxpbmUuZ2V0T2Zmc2V0KCkpKTsKKyAgICAgICAgaWYgKGxpbmVEZWxpbWl0ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgbGluZURlbGltaXRlcj0gVGV4dFV0aWxpdGllcy5nZXREZWZhdWx0TGluZURlbGltaXRlcihkb2N1bWVudCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFhtbFRhZ0Zvcm1hdHRlci5mb3JtYXQocGFydGl0aW9uVGV4dCwgcHJlZnMsIGRvY3VtZW50LmdldChsaW5lLmdldE9mZnNldCgpLCBpbmRlbnRMZW5ndGgpLCBsaW5lRGVsaW1pdGVyKTsKKworICAgIH0KKworICAgIC8qCisgCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5mb3JtYXR0ZXIuQ29udGV4dEJhc2VkRm9ybWF0dGluZ1N0cmF0ZWd5I2Zvcm1hdHRlclN0YXJ0cyhvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmZvcm1hdHRlci5JRm9ybWF0dGluZ0NvbnRleHQpCisgCSAqLworIAlwdWJsaWMgdm9pZCBmb3JtYXR0ZXJTdGFydHMoZmluYWwgSUZvcm1hdHRpbmdDb250ZXh0IGNvbnRleHQpIHsKKyAJCXN1cGVyLmZvcm1hdHRlclN0YXJ0cyhjb250ZXh0KTsKKyAJCQorIAkJZlBhcnRpdGlvbnMuYWRkTGFzdChjb250ZXh0LmdldFByb3BlcnR5KEZvcm1hdHRpbmdDb250ZXh0UHJvcGVydGllcy5DT05URVhUX1BBUlRJVElPTikpOworIAkJZkRvY3VtZW50cy5hZGRMYXN0KGNvbnRleHQuZ2V0UHJvcGVydHkoRm9ybWF0dGluZ0NvbnRleHRQcm9wZXJ0aWVzLkNPTlRFWFRfTUVESVVNKSk7CisgCX0KKworIAkvKgorIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLkNvbnRleHRCYXNlZEZvcm1hdHRpbmdTdHJhdGVneSNmb3JtYXR0ZXJTdG9wcygpCisgCSAqLworIAlwdWJsaWMgdm9pZCBmb3JtYXR0ZXJTdG9wcygpIHsKKyAJCXN1cGVyLmZvcm1hdHRlclN0b3BzKCk7CisKKyAJCWZQYXJ0aXRpb25zLmNsZWFyKCk7CisgCQlmRG9jdW1lbnRzLmNsZWFyKCk7CisgCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci9mb3JtYXR0ZXIvWG1sVGFnRm9ybWF0dGVyLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci9mb3JtYXR0ZXIvWG1sVGFnRm9ybWF0dGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVmNGE2OQotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL2Zvcm1hdHRlci9YbWxUYWdGb3JtYXR0ZXIuamF2YQpAQCAtMCwwICsxLDQyOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBKb2huLU1hc29uIFAuIFNoYWNrZWxmb3JkIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIEpvaG4tTWFzb24gUC4gU2hhY2tlbGZvcmQgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBCdWcgNzM0MTEsIDg0MzQyCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5mb3JtYXR0ZXI7CisKK2ltcG9ydCBqYXZhLnRleHQuQ2hhcmFjdGVySXRlcmF0b3I7CitpbXBvcnQgamF2YS50ZXh0LlN0cmluZ0NoYXJhY3Rlckl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworcHVibGljIGNsYXNzIFhtbFRhZ0Zvcm1hdHRlciB7CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIEF0dHJpYnV0ZVBhaXIgeworCisgICAgICAgIHByaXZhdGUgU3RyaW5nIGZBdHRyaWJ1dGU7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIGZWYWx1ZTsKKyAgICAgICAgcHJpdmF0ZSBjaGFyIGZRdW90ZTsKKworICAgICAgICBwdWJsaWMgQXR0cmlidXRlUGFpcihTdHJpbmcgYXR0cmlidXRlLCBTdHJpbmcgdmFsdWUsIGNoYXIgYXR0cmlidXRlUXVvdGUpIHsKKyAgICAgICAgICAgIGZBdHRyaWJ1dGUgPSBhdHRyaWJ1dGU7CisgICAgICAgICAgICBmVmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgICAgIGZRdW90ZT0gYXR0cmlidXRlUXVvdGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBmQXR0cmlidXRlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBmVmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBjaGFyIGdldFF1b3RlKCkgeworICAgICAgICAgICAgcmV0dXJuIGZRdW90ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgUGFyc2VFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24geworICAgIAkKKwkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKwkJcHVibGljIFBhcnNlRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgICAgICBzdXBlcihtZXNzYWdlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgVGFnIHsKKworICAgICAgICBwcml2YXRlIExpc3QgZkF0dHJpYnV0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGZDbG9zZWQ7CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZkVsZW1lbnROYW1lOworCisgICAgICAgIHB1YmxpYyB2b2lkIGFkZEF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlLCBTdHJpbmcgdmFsdWUsIGNoYXIgcXVvdGUpIHsKKyAgICAgICAgICAgIGZBdHRyaWJ1dGVzLmFkZChuZXcgQXR0cmlidXRlUGFpcihhdHRyaWJ1dGUsIHZhbHVlLCBxdW90ZSkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBhdHRyaWJ1dGVDb3VudCgpIHsKKyAgICAgICAgICAgIHJldHVybiBmQXR0cmlidXRlcy5zaXplKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQXR0cmlidXRlUGFpciBnZXRBdHRyaWJ1dGVQYWlyKGludCBpKSB7CisgICAgICAgICAgICByZXR1cm4gKEF0dHJpYnV0ZVBhaXIpIGZBdHRyaWJ1dGVzLmdldChpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5mRWxlbWVudE5hbWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0Nsb3NlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBmQ2xvc2VkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBtaW5pbXVtTGVuZ3RoKCkgeworICAgICAgICAgICAgaW50IGxlbmd0aCA9IDI7IC8vIGZvciB0aGUgPCA+CisgICAgICAgICAgICBpZiAodGhpcy5pc0Nsb3NlZCgpKSBsZW5ndGgrKzsgLy8gaWYgd2UgbmVlZCB0byBhZGQgYW4gLz4KKyAgICAgICAgICAgIGxlbmd0aCArPSB0aGlzLmdldEVsZW1lbnROYW1lKCkubGVuZ3RoKCk7CisgICAgICAgICAgICBpZiAodGhpcy5hdHRyaWJ1dGVDb3VudCgpID4gMCB8fCB0aGlzLmlzQ2xvc2VkKCkpIGxlbmd0aCsrOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmF0dHJpYnV0ZUNvdW50KCk7IGkrKykgeworICAgICAgICAgICAgICAgIEF0dHJpYnV0ZVBhaXIgYXR0cmlidXRlUGFpciA9IHRoaXMuZ2V0QXR0cmlidXRlUGFpcihpKTsKKyAgICAgICAgICAgICAgICBsZW5ndGggKz0gYXR0cmlidXRlUGFpci5nZXRBdHRyaWJ1dGUoKS5sZW5ndGgoKTsKKyAgICAgICAgICAgICAgICBsZW5ndGggKz0gYXR0cmlidXRlUGFpci5nZXRWYWx1ZSgpLmxlbmd0aCgpOworICAgICAgICAgICAgICAgIGxlbmd0aCArPSA0OyAvLyBlcXVhbHMgc2lnbiwgcXVvdGUgY2hhcmFjdGVycyAmIHRyYWlsaW5nIHNwYWNlCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodGhpcy5hdHRyaWJ1dGVDb3VudCgpID4gMCAmJiAhdGhpcy5pc0Nsb3NlZCgpKSBsZW5ndGgtLTsKKyAgICAgICAgICAgIHJldHVybiBsZW5ndGg7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGVzKExpc3QgYXR0cmlidXRlUGFpcikgeworICAgICAgICAgICAgZkF0dHJpYnV0ZXMuY2xlYXIoKTsKKyAgICAgICAgICAgIGZBdHRyaWJ1dGVzLmFkZEFsbChhdHRyaWJ1dGVQYWlyKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldENsb3NlZChib29sZWFuIGNsb3NlZCkgeworICAgICAgICAgICAgZkNsb3NlZCA9IGNsb3NlZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEVsZW1lbnROYW1lKFN0cmluZyBlbGVtZW50TmFtZSkgeworICAgICAgICAgICAgZkVsZW1lbnROYW1lID0gZWxlbWVudE5hbWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcig1MDApOworICAgICAgICAgICAgc2IuYXBwZW5kKCc8Jyk7CisgICAgICAgICAgICBzYi5hcHBlbmQodGhpcy5nZXRFbGVtZW50TmFtZSgpKTsKKyAgICAgICAgICAgIGlmICh0aGlzLmF0dHJpYnV0ZUNvdW50KCkgPiAwIHx8IHRoaXMuaXNDbG9zZWQoKSkgc2IuYXBwZW5kKCcgJyk7CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5hdHRyaWJ1dGVDb3VudCgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBBdHRyaWJ1dGVQYWlyIGF0dHJpYnV0ZVBhaXIgPSB0aGlzLmdldEF0dHJpYnV0ZVBhaXIoaSk7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGF0dHJpYnV0ZVBhaXIuZ2V0QXR0cmlidXRlKCkpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnPScpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChhdHRyaWJ1dGVQYWlyLmdldFF1b3RlKCkpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChhdHRyaWJ1dGVQYWlyLmdldFZhbHVlKCkpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChhdHRyaWJ1dGVQYWlyLmdldFF1b3RlKCkpOworICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzQ2xvc2VkKCkgfHwgaSAhPSB0aGlzLmF0dHJpYnV0ZUNvdW50KCkgLSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCcgJyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodGhpcy5pc0Nsb3NlZCgpKSBzYi5hcHBlbmQoJy8nKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgnPicpOworICAgICAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIFRhZ0Zvcm1hdHRlciB7CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgY291bnRDaGFyKGNoYXIgc2VhcmNoQ2hhciwgU3RyaW5nIGluVGFyZ2V0U3RyaW5nKSB7CisgICAgICAgICAgICBTdHJpbmdDaGFyYWN0ZXJJdGVyYXRvciBpdGVyID0gbmV3IFN0cmluZ0NoYXJhY3Rlckl0ZXJhdG9yKAorICAgICAgICAgICAgICAgICAgICBpblRhcmdldFN0cmluZyk7CisgICAgICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgICAgICBpZiAoaXRlci5maXJzdCgpID09IHNlYXJjaENoYXIpIGkrKzsKKyAgICAgICAgICAgIHdoaWxlIChpdGVyLmdldEluZGV4KCkgPCBpdGVyLmdldEVuZEluZGV4KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoaXRlci5uZXh0KCkgPT0gc2VhcmNoQ2hhcikgeworICAgICAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGZvcm1hdChUYWcgdGFnLCBGb3JtYXR0aW5nUHJlZmVyZW5jZXMgcHJlZnMsIFN0cmluZyBpbmRlbnQsIFN0cmluZyBsaW5lRGVsaW1pdGVyKSB7CisgICAgICAgICAgICBpZiAocHJlZnMud3JhcExvbmdUYWdzKCkKKyAgICAgICAgICAgICAgICAgICAgJiYgbGluZVJlcXVpcmVzV3JhcChpbmRlbnQgKyB0YWcudG9TdHJpbmcoKSwgcHJlZnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TWF4aW11bUxpbmVXaWR0aCgpLCBwcmVmcy5nZXRUYWJXaWR0aCgpKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB3cmFwVGFnKHRhZywgcHJlZnMsIGluZGVudCwgbGluZURlbGltaXRlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdGFnLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBsaW5lUmVxdWlyZXNXcmFwKFN0cmluZyBsaW5lLCBpbnQgbGluZVdpZHRoLCBpbnQgdGFiV2lkdGgpIHsKKyAgICAgICAgICAgIHJldHVybiB0YWJFeHBhbmRlZExpbmVXaWR0aChsaW5lLCB0YWJXaWR0aCkgPiBsaW5lV2lkdGg7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQHBhcmFtIGxpbmUKKyAgICAgICAgICogICAgICAgICAgICB0aGUgbGluZSBpbiB3aGljaCBzcGFjZXMgYXJlIHRvIGJlIGV4cGFuZGVkCisgICAgICAgICAqIEBwYXJhbSB0YWJXaWR0aAorICAgICAgICAgKiAgICAgICAgICAgIG51bWJlciBvZiBzcGFjZXMgdG8gc3Vic3RpdHV0ZSBmb3IgYSB0YWIKKyAgICAgICAgICogQHJldHVybiBsZW5ndGggb2YgdGhlIGxpbmUgd2l0aCB0YWJzIGV4cGFuZGVkIHRvIHNwYWNlcworICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIGludCB0YWJFeHBhbmRlZExpbmVXaWR0aChTdHJpbmcgbGluZSwgaW50IHRhYldpZHRoKSB7CisgICAgICAgICAgICBpbnQgdGFiQ291bnQgPSBjb3VudENoYXIoJ1x0JywgbGluZSk7CisgICAgICAgICAgICByZXR1cm4gKGxpbmUubGVuZ3RoKCkgLSB0YWJDb3VudCkgKyAodGFiQ291bnQgKiB0YWJXaWR0aCk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nIHdyYXBUYWcoVGFnIHRhZywgRm9ybWF0dGluZ1ByZWZlcmVuY2VzIHByZWZzLCBTdHJpbmcgaW5kZW50LCBTdHJpbmcgbGluZURlbGltaXRlcikgeworICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigxMDI0KTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgnPCcpOworICAgICAgICAgICAgc2IuYXBwZW5kKHRhZy5nZXRFbGVtZW50TmFtZSgpKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgnICcpOworCisgICAgICAgICAgICBpZiAodGFnLmF0dHJpYnV0ZUNvdW50KCkgPiAwKSB7CisgICAgICAgICAgICAgICAgQXR0cmlidXRlUGFpciBwYWlyPSB0YWcuZ2V0QXR0cmlidXRlUGFpcigwKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQocGFpci5nZXRBdHRyaWJ1dGUoKSk7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCc9Jyk7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHBhaXIuZ2V0UXVvdGUoKSk7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHRhZy5nZXRBdHRyaWJ1dGVQYWlyKDApLmdldFZhbHVlKCkpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChwYWlyLmdldFF1b3RlKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodGFnLmF0dHJpYnV0ZUNvdW50KCkgPiAxKSB7CisgICAgICAgICAgICAgICAgY2hhcltdIGV4dHJhSW5kZW50ID0gbmV3IGNoYXJbdGFnLmdldEVsZW1lbnROYW1lKCkubGVuZ3RoKCkgKyAyXTsKKyAgICAgICAgICAgICAgICBBcnJheXMuZmlsbChleHRyYUluZGVudCwgJyAnKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IHRhZy5hdHRyaWJ1dGVDb3VudCgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlUGFpciBwYWlyPSB0YWcuZ2V0QXR0cmlidXRlUGFpcihpKTsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGxpbmVEZWxpbWl0ZXIpOworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoaW5kZW50KTsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGV4dHJhSW5kZW50KTsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHBhaXIuZ2V0QXR0cmlidXRlKCkpOworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJz0nKTsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHBhaXIuZ2V0UXVvdGUoKSk7CisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChwYWlyLmdldFZhbHVlKCkpOworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQocGFpci5nZXRRdW90ZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwcmVmcy5hbGlnbkVsZW1lbnRDbG9zZUNoYXIoKSkgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChsaW5lRGVsaW1pdGVyKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoaW5kZW50KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodGFnLmlzQ2xvc2VkKCkpIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJyAnKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHRhZy5pc0Nsb3NlZCgpKSBzYi5hcHBlbmQoJy8nKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgnPicpOworICAgICAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBpZiBvYmplY3QgY3JlYXRpb24gaXMgYW4gaXNzdWUsIHVzZSBzdGF0aWMgbWV0aG9kcyBvciBhIGZseXdlaWdodAorICAgIC8vIHBhdHRlcm4KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIFRhZ1BhcnNlciB7CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZkVsZW1lbnROYW1lOworCisgICAgICAgIHByaXZhdGUgU3RyaW5nIGZQYXJzZVRleHQ7CisKKyAgICAgICAgcHJvdGVjdGVkIExpc3QgZ2V0QXR0aWJ1dGVzKFN0cmluZyBlbGVtZW50VGV4dCkKKyAgICAgICAgICAgICAgICB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworCisgICAgICAgICAgICBjbGFzcyBNb2RlIHsKKyAgICAgICAgICAgICAgICBwcml2YXRlIGludCBtb2RlOworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZU5hbWVTZWFyY2hpbmcoKSB7bW9kZSA9IDA7fQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZU5hbWVGb3VuZCgpIHttb2RlID0gMTt9CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlVmFsdWVTZWFyY2hpbmcoKSB7bW9kZSA9IDI7fQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZVZhbHVlRm91bmQoKSB7bW9kZSA9IDM7fQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldEZpbmlzaGVkKCkge21vZGUgPSA0O30KKyAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0F0dHJpYnV0ZU5hbWVTZWFyY2hpbmcoKSB7cmV0dXJuIG1vZGUgPT0gMDt9CisgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNBdHRyaWJ1dGVOYW1lRm91bmQoKSB7cmV0dXJuIG1vZGUgPT0gMTt9CisgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNBdHRyaWJ1dGVWYWx1ZVNlYXJjaGluZygpIHtyZXR1cm4gbW9kZSA9PSAyO30KKyAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0F0dHJpYnV0ZVZhbHVlRm91bmQoKSB7cmV0dXJuIG1vZGUgPT0gMzt9CisgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNGaW5pc2hlZCgpIHtyZXR1cm4gbW9kZSA9PSA0O30KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTGlzdCBhdHRyaWJ1dGVQYWlycyA9IG5ldyBBcnJheUxpc3QoKTsKKworICAgICAgICAgICAgQ2hhcmFjdGVySXRlcmF0b3IgaXRlciA9IG5ldyBTdHJpbmdDaGFyYWN0ZXJJdGVyYXRvcihlbGVtZW50VGV4dAorICAgICAgICAgICAgICAgICAgICAuc3Vic3RyaW5nKGdldEVsZW1lbnROYW1lKGVsZW1lbnRUZXh0KS5sZW5ndGgoKSArIDIpKTsKKworICAgICAgICAgICAgLy8gc3RhdGUgZm9yIGZpbmRpbmcgYXR0cmlidXRlcworICAgICAgICAgICAgTW9kZSBtb2RlID0gbmV3IE1vZGUoKTsKKyAgICAgICAgICAgIG1vZGUuc2V0QXR0cmlidXRlTmFtZVNlYXJjaGluZygpOworICAgICAgICAgICAgY2hhciBhdHRyaWJ1dGVRdW90ZSA9ICciJzsKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBjdXJyZW50QXR0cmlidXRlTmFtZSA9IG51bGw7CisgICAgICAgICAgICBTdHJpbmdCdWZmZXIgY3VycmVudEF0dHJpYnV0ZVZhbHVlID0gbnVsbDsKKworICAgICAgICAgICAgY2hhciBjID0gaXRlci5maXJzdCgpOworICAgICAgICAgICAgd2hpbGUgKGl0ZXIuZ2V0SW5kZXgoKSA8IGl0ZXIuZ2V0RW5kSW5kZXgoKSkgeworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHN3aXRjaCAoYykgeyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBjYXNlICciJzoKKyAgICAgICAgICAgICAgICBjYXNlICdcJyc6CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGUuaXNBdHRyaWJ1dGVWYWx1ZVNlYXJjaGluZygpKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YXJ0IG9mIGFuIGF0dHJpYnV0ZSB2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlUXVvdGUgPSBjOworICAgICAgICAgICAgICAgICAgICAgICAgbW9kZS5zZXRBdHRyaWJ1dGVWYWx1ZUZvdW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QXR0cmlidXRlVmFsdWUgPSBuZXcgU3RyaW5nQnVmZmVyKDEwMjQpOworCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobW9kZS5pc0F0dHJpYnV0ZVZhbHVlRm91bmQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGF0dHJpYnV0ZVF1b3RlID09IGMpIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UndmUgY29tcGxldGVkIGEgcGFpciEKKyAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZVBhaXIgcGFpciA9IG5ldyBBdHRyaWJ1dGVQYWlyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QXR0cmlidXRlTmFtZS50b1N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QXR0cmlidXRlVmFsdWUudG9TdHJpbmcoKSwgYXR0cmlidXRlUXVvdGUpOworCisgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVQYWlycy5hZGQocGFpcik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YXJ0IGxvb2tpbmcgZm9yIGFub3RoZXIgYXR0cmlidXRlCisgICAgICAgICAgICAgICAgICAgICAgICBtb2RlLnNldEF0dHJpYnV0ZU5hbWVTZWFyY2hpbmcoKTsKKworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1vZGUuaXNBdHRyaWJ1dGVWYWx1ZUZvdW5kKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBhdHRyaWJ1dGVRdW90ZSAhPSBjKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgcXVvdGUgY2hhcmFjdGVyIGlzIHBhcnQgb2YgdGhlIGF0dHJpYnV0ZSB2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEF0dHJpYnV0ZVZhbHVlLmFwcGVuZChjKTsKKworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBubyBwbGFjZSBmb3IgYSBxdW90ZSEKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigiVW5leHBlY3RlZCAnIiArIGMgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICInIHdoZW4gcGFyc2luZzpcblx0IiArIGVsZW1lbnRUZXh0KTsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAnPSc6CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBpZiAobW9kZS5pc0F0dHJpYnV0ZVZhbHVlRm91bmQoKSkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGNoYXJhY3RlciBpcyBwYXJ0IG9mIHRoZSBhdHRyaWJ1dGUgdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRBdHRyaWJ1dGVWYWx1ZS5hcHBlbmQoYyk7CisKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtb2RlLmlzQXR0cmlidXRlTmFtZUZvdW5kKCkpIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW5kIG9mIHRoZSBuYW1lLCBub3cgc3RhcnQgbG9va2luZyBmb3IgdGhlIHZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICBtb2RlLnNldEF0dHJpYnV0ZVZhbHVlU2VhcmNoaW5nKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgbm8gcGxhY2UgZm9yIGFuIGVxdWFscyBzaWduIQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCJVbmV4cGVjdGVkICciICsgYyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIicgd2hlbiBwYXJzaW5nOlxuXHQiICsgZWxlbWVudFRleHQpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlICcvJzoKKyAgICAgICAgICAgICAgICBjYXNlICc+JzoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGUuaXNBdHRyaWJ1dGVWYWx1ZUZvdW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF0dHJpYnV0ZSB2YWx1ZXMgYXJlIENEQVRBLCBhZGQgaXQgYWxsCisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QXR0cmlidXRlVmFsdWUuYXBwZW5kKGMpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1vZGUuaXNBdHRyaWJ1dGVOYW1lU2VhcmNoaW5nKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUuc2V0RmluaXNoZWQoKTsKKwkJCQkJfSBlbHNlIGlmIChtb2RlLmlzRmluaXNoZWQoKSl7CisJCQkJCQkvLyBjb25zdW1lIHRoZSByZW1haW5pbmcgY2hhcmFjdGVycworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgYXJlbid0IHJlYWR5IHRvIGJlIGRvbmUhCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oIlVuZXhwZWN0ZWQgJyIgKyBjIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiJyB3aGVuIHBhcnNpbmc6XG5cdCIgKyBlbGVtZW50VGV4dCk7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGUuaXNBdHRyaWJ1dGVWYWx1ZUZvdW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF0dHJpYnV0ZSB2YWx1ZXMgYXJlIENEQVRBLCBhZGQgaXQgYWxsCisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QXR0cmlidXRlVmFsdWUuYXBwZW5kKGMpOworCisJCQkJCX0gZWxzZSBpZiAobW9kZS5pc0ZpbmlzaGVkKCkpIHsKKwkJCQkJCWlmICghQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjKSkgeworCQkJCQkJCQl0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oIlVuZXhwZWN0ZWQgJyIgKyBjIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCQkrICInIHdoZW4gcGFyc2luZzpcblx0IiArIGVsZW1lbnRUZXh0KTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGUuaXNBdHRyaWJ1dGVOYW1lU2VhcmNoaW5nKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgZm91bmQgdGhlIHN0YXJ0IG9mIGFuIGF0dHJpYnV0ZSBuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUuc2V0QXR0cmlidXRlTmFtZUZvdW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRBdHRyaWJ1dGVOYW1lID0gbmV3IFN0cmluZ0J1ZmZlcigyNTUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QXR0cmlidXRlTmFtZS5hcHBlbmQoYyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtb2RlLmlzQXR0cmlidXRlTmFtZUZvdW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEF0dHJpYnV0ZU5hbWUuYXBwZW5kKGMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGMgPSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIH0KKwkJCWlmICghbW9kZS5pc0ZpbmlzaGVkKCkpIHsKKwkJCQl0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oIkVsZW1lbnQgZGlkIG5vdCBjb21wbGV0ZSBub3JtYWxseS4iKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorICAgICAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZVBhaXJzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBwYXJhbSB0YWdUZXh0CisgICAgICAgICAqICAgICAgICAgICAgdGV4dCBvZiBhbiBYTUwgdGFnCisgICAgICAgICAqIEByZXR1cm4gZXh0cmFjdGVkIFhNTCBlbGVtZW50IG5hbWUKKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoU3RyaW5nIHRhZ1RleHQpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAoIXRhZ1RleHQuZXF1YWxzKHRoaXMuZlBhcnNlVGV4dCkgfHwgdGhpcy5mRWxlbWVudE5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGludCBlbmRPZlRhZyA9IHRhZ0VuZCh0YWdUZXh0KTsKKyAgICAgICAgICAgICAgICBpZiAoKHRhZ1RleHQubGVuZ3RoKCkgPiAyKSAmJiAoZW5kT2ZUYWcgPiAxKSkgeworICAgICAgICAgICAgICAgICAgICB0aGlzLmZQYXJzZVRleHQgPSB0YWdUZXh0OworICAgICAgICAgICAgICAgICAgICB0aGlzLmZFbGVtZW50TmFtZSA9IHRhZ1RleHQuc3Vic3RyaW5nKDEsIGVuZE9mVGFnKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oIk5vIGVsZW1lbnQgbmFtZSBmb3IgdGhlIHRhZzpcblx0IiAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0YWdUZXh0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZkVsZW1lbnROYW1lOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNDbG9zZWQoU3RyaW5nIHRhZ1RleHQpIHsKKyAgICAgICAgICAgIHJldHVybiB0YWdUZXh0LmNoYXJBdCh0YWdUZXh0Lmxhc3RJbmRleE9mKCc+JykgLSAxKSA9PSAnLyc7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQHBhcmFtIHRhZ1RleHQKKyAgICAgICAgICogQHJldHVybiBhIGZ1bGx5IHBvcHVsYXRlZCB0YWcKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBUYWcgcGFyc2UoU3RyaW5nIHRhZ1RleHQpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICBUYWcgdGFnID0gbmV3IFRhZygpOworICAgICAgICAgICAgdGFnLnNldEVsZW1lbnROYW1lKGdldEVsZW1lbnROYW1lKHRhZ1RleHQpKTsKKyAgICAgICAgICAgIHRhZy5zZXRBdHRyaWJ1dGVzKGdldEF0dGlidXRlcyh0YWdUZXh0KSk7CisgICAgICAgICAgICB0YWcuc2V0Q2xvc2VkKGlzQ2xvc2VkKHRhZ1RleHQpKTsKKyAgICAgICAgICAgIHJldHVybiB0YWc7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGludCB0YWdFbmQoU3RyaW5nIHRleHQpIHsKKyAgICAgICAgICAgIC8vIFRoaXMgaXMgYWRtaXR0ZWRseSBhIGxpdHRsZSBsb29zZSwgYnV0IHdlIGRvbid0IHdhbnQgdGhlCisgICAgICAgICAgICAvLyBmb3JtYXR0ZXIgdG8gYmUgdG9vIHN0cmljdC4uLgorICAgICAgICAgICAgLy8gaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMC9SRUMteG1sLTIwMDAxMDA2I05ULU5hbWUKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgdGV4dC5sZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgY2hhciBjID0gdGV4dC5jaGFyQXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKCFDaGFyYWN0ZXIuaXNMZXR0ZXJPckRpZ2l0KGMpICYmIGMgIT0gJzonICYmIGMgIT0gJy4nCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBjICE9ICctJyAmJiBjICE9ICdfJykgeyByZXR1cm4gaTsgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZm9ybWF0KFN0cmluZyB0YWdUZXh0LCBGb3JtYXR0aW5nUHJlZmVyZW5jZXMgcHJlZnMsIFN0cmluZyBpbmRlbnQsIFN0cmluZyBsaW5lRGVsaW1pdGVyKSB7CisKKyAgICAgICAgVGFnIHRhZzsKKyAgICAgICAgaWYgKHRhZ1RleHQuc3RhcnRzV2l0aCgiPC8iKSB8fCB0YWdUZXh0LnN0YXJ0c1dpdGgoIjwlIikgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisgICAgICAgICAgICAgICAgfHwgdGFnVGV4dC5zdGFydHNXaXRoKCI8PyIpIHx8IHRhZ1RleHQuc3RhcnRzV2l0aCgiPFsiKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKyAgICAgICAgICAgIHJldHVybiB0YWdUZXh0OworICAgICAgICB9IAorICAgIAl0cnkgeworICAgICAgICAgICAgdGFnID0gbmV3IFRhZ1BhcnNlcigpLnBhcnNlKHRhZ1RleHQpOworICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBpZiB3ZSBjYW4ndCBwYXJzZSB0aGUgdGFnLCBnaXZlIHVwIGFuZCBsZWF2ZSB0aGUgdGV4dCBhcyBpcy4KKyAgICAgICAgICAgIHJldHVybiB0YWdUZXh0OworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgVGFnRm9ybWF0dGVyKCkuZm9ybWF0KHRhZywgcHJlZnMsIGluZGVudCwgbGluZURlbGltaXRlcik7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL291dGxpbmUvQW50T3V0bGluZU1lc3NhZ2VzLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci9vdXRsaW5lL0FudE91dGxpbmVNZXNzYWdlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5YjU5NjgKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci9vdXRsaW5lL0FudE91dGxpbmVNZXNzYWdlcy5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKKyAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKKyAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcworICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczogCisgKiBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqIEpvaG4tTWFzb24gUC4gU2hhY2tlbGZvcmQgKGpvaG4tbWFzb24uc2hhY2tlbGZvcmRAcGVhcnNvbi5jb20pIC0gYnVnIDUzNTQ3CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5vdXRsaW5lOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKKworcHVibGljIGNsYXNzIEFudE91dGxpbmVNZXNzYWdlcyBleHRlbmRzIE5MUyB7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3Iub3V0bGluZS5BbnRPdXRsaW5lTWVzc2FnZXMiOy8vJE5PTi1OTFMtMSQKKwkKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRFZGl0b3JDb250ZW50T3V0bGluZVBhZ2VfT3Blbl9XaXRoXzE7CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJJbnRlcm5hbFRhcmdldHNBY3Rpb25fMDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJJbXBvcnRlZEVsZW1lbnRzQWN0aW9uXzA7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyUHJvcGVydGllc0FjdGlvbl8wOworCisJcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyVG9wTGV2ZWxBY3Rpb25fMDsKKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRvZ2dsZVNvcnRBbnRPdXRsaW5lQWN0aW9uXzA7CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBUb2dnbGVMaW5rV2l0aEVkaXRvckFjdGlvbl8wOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRvZ2dsZUxpbmtXaXRoRWRpdG9yQWN0aW9uXzE7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgVG9nZ2xlTGlua1dpdGhFZGl0b3JBY3Rpb25fMjsKKworCXN0YXRpYyB7CisJCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQorCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBBbnRPdXRsaW5lTWVzc2FnZXMuY2xhc3MpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci9vdXRsaW5lL0FudE91dGxpbmVNZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3Ivb3V0bGluZS9BbnRPdXRsaW5lTWVzc2FnZXMucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDNiMWNkCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3Ivb3V0bGluZS9BbnRPdXRsaW5lTWVzc2FnZXMucHJvcGVydGllcwpAQCAtMCwwICsxLDI1IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyMKKyMgQ29udHJpYnV0b3JzOgorIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjICAgICBKb2huLU1hc29uIFAuIFNoYWNrZWxmb3JkIChqb2huLW1hc29uLnNoYWNrZWxmb3JkQHBlYXJzb24uY29tKSAtIGJ1ZyA1MzU0NworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitBbnRFZGl0b3JDb250ZW50T3V0bGluZVBhZ2VfT3Blbl9XaXRoXzE9T3BlbiBXaXRoCisKK0ZpbHRlckludGVybmFsVGFyZ2V0c0FjdGlvbl8wPUhpZGUgSW50ZXJuYWwgVGFyZ2V0cworRmlsdGVySW1wb3J0ZWRFbGVtZW50c0FjdGlvbl8wPUhpZGUgSW1wb3J0ZWQgRWxlbWVudHMKK0ZpbHRlclByb3BlcnRpZXNBY3Rpb25fMD1IaWRlIFByb3BlcnRpZXMKKworRmlsdGVyVG9wTGV2ZWxBY3Rpb25fMD1IaWRlIFRvcCBMZXZlbCBFbGVtZW50cworCitUb2dnbGVTb3J0QW50T3V0bGluZUFjdGlvbl8wPVNvcnQKKworVG9nZ2xlTGlua1dpdGhFZGl0b3JBY3Rpb25fMD1MaW4mayB3aXRoIEVkaXRvcgorVG9nZ2xlTGlua1dpdGhFZGl0b3JBY3Rpb25fMT1MaW5rIHdpdGggRWRpdG9yCitUb2dnbGVMaW5rV2l0aEVkaXRvckFjdGlvbl8yPUxpbmsgd2l0aCBhY3RpdmUgZWRpdG9yCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci9vdXRsaW5lL0ZpbHRlckltcG9ydGVkRWxlbWVudHNBY3Rpb24uamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL291dGxpbmUvRmlsdGVySW1wb3J0ZWRFbGVtZW50c0FjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkMzdiYjkKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci9vdXRsaW5lL0ZpbHRlckltcG9ydGVkRWxlbWVudHNBY3Rpb24uamF2YQpAQCAtMCwwICsxLDQ0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IEpvaG4tTWFzb24gUC4gU2hhY2tlbGZvcmQgYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSm9obi1NYXNvbiBQLiBTaGFja2VsZm9yZCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3Iub3V0bGluZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5BbnRVSUltYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuSUFudFVJQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOworCisvKiogCisgKiBBbiBhY3Rpb24gd2hpY2ggdG9nZ2xlcyBmaWx0ZXJpbmcgb2YgaW1wb3J0ZWQgZWxlbWVudHMgZnJvbSB0aGUgQW50IG91dGxpbmUuCisgKi8KK3B1YmxpYyBjbGFzcyBGaWx0ZXJJbXBvcnRlZEVsZW1lbnRzQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKKyAgICAKKwlwcml2YXRlIEFudEVkaXRvckNvbnRlbnRPdXRsaW5lUGFnZSBmUGFnZTsKKwkKKwlwdWJsaWMgRmlsdGVySW1wb3J0ZWRFbGVtZW50c0FjdGlvbihBbnRFZGl0b3JDb250ZW50T3V0bGluZVBhZ2UgcGFnZSkgeworCQlzdXBlcihBbnRPdXRsaW5lTWVzc2FnZXMuRmlsdGVySW1wb3J0ZWRFbGVtZW50c0FjdGlvbl8wKTsKKwkJZlBhZ2UgPSBwYWdlOworCQlzZXRJbWFnZURlc2NyaXB0b3IoQW50VUlJbWFnZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKElBbnRVSUNvbnN0YW50cy5JTUdfRklMVEVSX0lNUE9SVEVEX0VMRU1FTlRTKSk7CisJCXNldFRvb2xUaXBUZXh0KEFudE91dGxpbmVNZXNzYWdlcy5GaWx0ZXJJbXBvcnRlZEVsZW1lbnRzQWN0aW9uXzApOworCQlzZXRDaGVja2VkKGZQYWdlLmZpbHRlckltcG9ydGVkRWxlbWVudHMoKSk7CisJfQorCisgICAgLyoqCisJICogVG9nZ2xlcyB0aGUgZmlsdGVyaW5nIG9mIGltcG9ydGVkIGVsZW1lbnRzIGZyb20gdGhlIEFudCBvdXRsaW5lCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNydW4oKQorCSAqLworCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZlBhZ2UuZ2V0Q29udHJvbCgpLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgeworCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCWZQYWdlLnNldEZpbHRlckltcG9ydGVkRWxlbWVudHMoaXNDaGVja2VkKCkpOworCQkJfQorCQl9KTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3Ivb3V0bGluZS9GaWx0ZXJJbnRlcm5hbFRhcmdldHNBY3Rpb24uamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL291dGxpbmUvRmlsdGVySW50ZXJuYWxUYXJnZXRzQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRiOGMzZAotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL291dGxpbmUvRmlsdGVySW50ZXJuYWxUYXJnZXRzQWN0aW9uLmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLm91dGxpbmU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuQW50VUlJbWFnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLklBbnRVSUNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKKworLyoqIAorICogQW4gYWN0aW9uIHdoaWNoIHRvZ2dsZXMgZmlsdGVyaW5nIG9mIGludGVybmFsIHRhcmdldHMgZnJvbSB0aGUgQW50IG91dGxpbmUuCisgKi8KK3B1YmxpYyBjbGFzcyBGaWx0ZXJJbnRlcm5hbFRhcmdldHNBY3Rpb24gZXh0ZW5kcyBBY3Rpb24geworCQorCXByaXZhdGUgQW50RWRpdG9yQ29udGVudE91dGxpbmVQYWdlIGZQYWdlOworCQorCXB1YmxpYyBGaWx0ZXJJbnRlcm5hbFRhcmdldHNBY3Rpb24oQW50RWRpdG9yQ29udGVudE91dGxpbmVQYWdlIHBhZ2UpIHsKKwkJc3VwZXIoQW50T3V0bGluZU1lc3NhZ2VzLkZpbHRlckludGVybmFsVGFyZ2V0c0FjdGlvbl8wKTsKKwkJZlBhZ2UgPSBwYWdlOworCQlzZXRJbWFnZURlc2NyaXB0b3IoQW50VUlJbWFnZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKElBbnRVSUNvbnN0YW50cy5JTUdfRklMVEVSX0lOVEVSTkFMX1RBUkdFVFMpKTsKKwkJc2V0VG9vbFRpcFRleHQoQW50T3V0bGluZU1lc3NhZ2VzLkZpbHRlckludGVybmFsVGFyZ2V0c0FjdGlvbl8wKTsKKwkJc2V0Q2hlY2tlZChmUGFnZS5maWx0ZXJJbnRlcm5hbFRhcmdldHMoKSk7CisJfQorCQorCS8qKgorCSAqIFRvZ2dsZXMgdGhlIGZpbHRlcmluZyBvZiBpbnRlcm5hbCB0YXJnZXRzIGZyb20gdGhlIEFudCBvdXRsaW5lCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNydW4oKQorCSAqLworCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZlBhZ2UuZ2V0Q29udHJvbCgpLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgeworCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCWZQYWdlLnNldEZpbHRlckludGVybmFsVGFyZ2V0cyhpc0NoZWNrZWQoKSk7CisJCQl9CisJCX0pOworCX0KK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL291dGxpbmUvRmlsdGVyUHJvcGVydGllc0FjdGlvbi5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3Ivb3V0bGluZS9GaWx0ZXJQcm9wZXJ0aWVzQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM2YWVmMgotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL291dGxpbmUvRmlsdGVyUHJvcGVydGllc0FjdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5vdXRsaW5lOworCitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLkFudFVJSW1hZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5JQW50VUlDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7CisKKy8qKiAKKyAqIEFuIGFjdGlvbiB3aGljaCB0b2dnbGVzIGZpbHRlcmluZyBvZiBwcm9wZXJ0aWVzIGZyb20gdGhlIEFudCBvdXRsaW5lLgorICovCitwdWJsaWMgY2xhc3MgRmlsdGVyUHJvcGVydGllc0FjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisJCisJcHJpdmF0ZSBBbnRFZGl0b3JDb250ZW50T3V0bGluZVBhZ2UgZlBhZ2U7CisJCisJcHVibGljIEZpbHRlclByb3BlcnRpZXNBY3Rpb24oQW50RWRpdG9yQ29udGVudE91dGxpbmVQYWdlIHBhZ2UpIHsKKwkJc3VwZXIoQW50T3V0bGluZU1lc3NhZ2VzLkZpbHRlclByb3BlcnRpZXNBY3Rpb25fMCk7CisJCWZQYWdlID0gcGFnZTsKKwkJc2V0SW1hZ2VEZXNjcmlwdG9yKEFudFVJSW1hZ2VzLmdldEltYWdlRGVzY3JpcHRvcihJQW50VUlDb25zdGFudHMuSU1HX0ZJTFRFUl9QUk9QRVJUSUVTKSk7CisJCXNldFRvb2xUaXBUZXh0KEFudE91dGxpbmVNZXNzYWdlcy5GaWx0ZXJQcm9wZXJ0aWVzQWN0aW9uXzApOworCQlzZXRDaGVja2VkKGZQYWdlLmZpbHRlclByb3BlcnRpZXMoKSk7CisJfQorCQorCS8qKgorCSAqIFRvZ2dsZXMgdGhlIGZpbHRlcmluZyBvZiBwcm9wZXJ0aWVzIGZyb20gdGhlIEFudCBvdXRsaW5lCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNydW4oKQorCSAqLworCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZlBhZ2UuZ2V0Q29udHJvbCgpLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgeworCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCWZQYWdlLnNldEZpbHRlclByb3BlcnRpZXMoaXNDaGVja2VkKCkpOworCQkJfQorCQl9KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci9vdXRsaW5lL0ZpbHRlclRvcExldmVsQWN0aW9uLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci9vdXRsaW5lL0ZpbHRlclRvcExldmVsQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk4ZWE4OQotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL291dGxpbmUvRmlsdGVyVG9wTGV2ZWxBY3Rpb24uamF2YQpAQCAtMCwwICsxLDQ0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3Iub3V0bGluZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5BbnRVSUltYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuSUFudFVJQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOworCisvKiogCisgKiBBbiBhY3Rpb24gd2hpY2ggdG9nZ2xlcyBmaWx0ZXJpbmcgb2YgcHJvcGVydGllcyBmcm9tIHRoZSBBbnQgb3V0bGluZS4KKyAqLworcHVibGljIGNsYXNzIEZpbHRlclRvcExldmVsQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKKwkKKwlwcml2YXRlIEFudEVkaXRvckNvbnRlbnRPdXRsaW5lUGFnZSBmUGFnZTsKKwkKKwlwdWJsaWMgRmlsdGVyVG9wTGV2ZWxBY3Rpb24oQW50RWRpdG9yQ29udGVudE91dGxpbmVQYWdlIHBhZ2UpIHsKKwkJc3VwZXIoQW50T3V0bGluZU1lc3NhZ2VzLkZpbHRlclRvcExldmVsQWN0aW9uXzApOworCQlmUGFnZSA9IHBhZ2U7CisJCXNldEltYWdlRGVzY3JpcHRvcihBbnRVSUltYWdlcy5nZXRJbWFnZURlc2NyaXB0b3IoSUFudFVJQ29uc3RhbnRzLklNR19GSUxURVJfVE9QX0xFVkVMKSk7CisJCXNldFRvb2xUaXBUZXh0KEFudE91dGxpbmVNZXNzYWdlcy5GaWx0ZXJUb3BMZXZlbEFjdGlvbl8wKTsKKwkJc2V0Q2hlY2tlZChmUGFnZS5maWx0ZXJUb3BMZXZlbCgpKTsKKwl9CisJCisJLyoqCisJICogVG9nZ2xlcyB0aGUgZmlsdGVyaW5nIG9mIHRvcCBsZXZlbCB0YXNrcyBhbmQgdHlwZXMgZnJvbSB0aGUgQW50IG91dGxpbmUKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI3J1bigpCisJICovCisJcHVibGljIHZvaWQgcnVuKCkgeworCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShmUGFnZS5nZXRDb250cm9sKCkuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7CisJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJZlBhZ2Uuc2V0RmlsdGVyVG9wTGV2ZWwoaXNDaGVja2VkKCkpOworCQkJfQorCQl9KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci9vdXRsaW5lL1RvZ2dsZUxpbmtXaXRoRWRpdG9yQWN0aW9uLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci9vdXRsaW5lL1RvZ2dsZUxpbmtXaXRoRWRpdG9yQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA4Y2U2NAotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL291dGxpbmUvVG9nZ2xlTGlua1dpdGhFZGl0b3JBY3Rpb24uamF2YQpAQCAtMCwwICsxLDQ2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5vdXRsaW5lOworCitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLkFudFVJSW1hZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5BbnRVSVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuSUFudFVJQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5JQW50VUlQcmVmZXJlbmNlQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IuQW50RWRpdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247CisKKy8qKgorICogVGhpcyBhY3Rpb24gdG9nZ2xlcyB3aGV0aGVyIHRoZSBBbnQgT3V0bGluZSBwYWdlIGxpbmtzIGl0cyBzZWxlY3Rpb24gdG8gdGhlCisgKiBhY3RpdmUgZWRpdG9yLgorICogCisgKiBAc2luY2UgMy4wCisgKi8KK3B1YmxpYyBjbGFzcyBUb2dnbGVMaW5rV2l0aEVkaXRvckFjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisJCisJQW50RWRpdG9yIGZFZGl0b3I7CisJCisJcHVibGljIFRvZ2dsZUxpbmtXaXRoRWRpdG9yQWN0aW9uKEFudEVkaXRvciBlZGl0b3IpIHsKKwkJc3VwZXIoQW50T3V0bGluZU1lc3NhZ2VzLlRvZ2dsZUxpbmtXaXRoRWRpdG9yQWN0aW9uXzApOworCQlib29sZWFuIGlzTGlua2luZ0VuYWJsZWQgPSBBbnRVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0Qm9vbGVhbihJQW50VUlQcmVmZXJlbmNlQ29uc3RhbnRzLk9VVExJTkVfTElOS19XSVRIX0VESVRPUik7CisJCXNldENoZWNrZWQoaXNMaW5raW5nRW5hYmxlZCk7CisJCWZFZGl0b3IgPSBlZGl0b3I7CisJCXNldFRvb2xUaXBUZXh0KEFudE91dGxpbmVNZXNzYWdlcy5Ub2dnbGVMaW5rV2l0aEVkaXRvckFjdGlvbl8xKTsKKwkJc2V0RGVzY3JpcHRpb24oQW50T3V0bGluZU1lc3NhZ2VzLlRvZ2dsZUxpbmtXaXRoRWRpdG9yQWN0aW9uXzIpOworCQlzZXRJbWFnZURlc2NyaXB0b3IoQW50VUlJbWFnZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKElBbnRVSUNvbnN0YW50cy5JTUdfTElOS19XSVRIX0VESVRPUikpOworCX0KKwkKKwlwdWJsaWMgdm9pZCBydW4oKSB7CisJCUFudFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZShJQW50VUlQcmVmZXJlbmNlQ29uc3RhbnRzLk9VVExJTkVfTElOS19XSVRIX0VESVRPUiwgaXNDaGVja2VkKCkpOworCQlpZiAoaXNDaGVja2VkKCkpCisJCQlmRWRpdG9yLnN5bmNocm9uaXplT3V0bGluZVBhZ2UoZmFsc2UpOworCX0KK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL291dGxpbmUvVG9nZ2xlU29ydEFudE91dGxpbmVBY3Rpb24uamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL291dGxpbmUvVG9nZ2xlU29ydEFudE91dGxpbmVBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzNiMzBiCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3Ivb3V0bGluZS9Ub2dnbGVTb3J0QW50T3V0bGluZUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5vdXRsaW5lOworCitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLkFudFVJSW1hZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5JQW50VUlDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKKworLyoqCisgKiBBbiBhY3Rpb24gd2hpY2ggdG9nZ2xlcyBzb3J0aW5nIGluIHRoZSBBbnQgb3V0bGluZSBwYWdlLgorICovCitwdWJsaWMgY2xhc3MgVG9nZ2xlU29ydEFudE91dGxpbmVBY3Rpb24gZXh0ZW5kcyBBY3Rpb24geworCisJcHJpdmF0ZSBBbnRFZGl0b3JDb250ZW50T3V0bGluZVBhZ2UgZlBhZ2U7CisJCisJcHVibGljIFRvZ2dsZVNvcnRBbnRPdXRsaW5lQWN0aW9uKEFudEVkaXRvckNvbnRlbnRPdXRsaW5lUGFnZSBwYWdlKSB7CisJCXN1cGVyKEFudE91dGxpbmVNZXNzYWdlcy5Ub2dnbGVTb3J0QW50T3V0bGluZUFjdGlvbl8wKTsKKwkJZlBhZ2UgPSBwYWdlOworCQlzZXRJbWFnZURlc2NyaXB0b3IoQW50VUlJbWFnZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKElBbnRVSUNvbnN0YW50cy5JTUdfU09SVF9PVVRMSU5FKSk7CisJCXNldFRvb2xUaXBUZXh0KEFudE91dGxpbmVNZXNzYWdlcy5Ub2dnbGVTb3J0QW50T3V0bGluZUFjdGlvbl8wKTsKKwkJc2V0Q2hlY2tlZChmUGFnZS5pc1NvcnQoKSk7CisJfQorCQorCS8qKgorCSAqIFRvZ2dsZXMgdGhlIHNvcnRpbmcgb2YgdGFyZ2V0cyBpbiB0aGUgQW50IG91dGxpbmUKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI3J1bigpCisJICovCisJcHVibGljIHZvaWQgcnVuKCkgeworCQlmUGFnZS5zZXRTb3J0KGlzQ2hlY2tlZCgpKTsKKwl9CisJCit9CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci90ZW1wbGF0ZXMvQW50VGVtcGxhdGVBY2Nlc3MuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL3RlbXBsYXRlcy9BbnRUZW1wbGF0ZUFjY2Vzcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiOTdlNzAKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci90ZW1wbGF0ZXMvQW50VGVtcGxhdGVBY2Nlc3MuamF2YQpAQCAtMCwwICsxLDgyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci50ZW1wbGF0ZXM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLkFudFVJUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLkNvbnRleHRUeXBlUmVnaXN0cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMucGVyc2lzdGVuY2UuVGVtcGxhdGVTdG9yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQudGVtcGxhdGVzLkNvbnRyaWJ1dGlvbkNvbnRleHRUeXBlUmVnaXN0cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LnRlbXBsYXRlcy5Db250cmlidXRpb25UZW1wbGF0ZVN0b3JlOworCisKK3B1YmxpYyBjbGFzcyBBbnRUZW1wbGF0ZUFjY2VzcyB7CisJLyoqIEtleSB0byBzdG9yZSBjdXN0b20gdGVtcGxhdGVzLiAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fVEVNUExBVEVTX0tFWT0gIm9yZy5lY2xpcHNlLmFudC51aS5jdXN0b210ZW1wbGF0ZXMiOyAvLyROT04tTkxTLTEkCisJCisJLyoqIFRoZSBzaGFyZWQgaW5zdGFuY2UuICovCisJcHJpdmF0ZSBzdGF0aWMgQW50VGVtcGxhdGVBY2Nlc3MgZmdJbnN0YW5jZTsKKwkKKwkvKiogVGhlIHRlbXBsYXRlIHN0b3JlLiAqLworCXByaXZhdGUgVGVtcGxhdGVTdG9yZSBmU3RvcmU7CisJCisJLyoqIFRoZSBjb250ZXh0IHR5cGUgcmVnaXN0cnkuICovCisJcHJpdmF0ZSBDb250cmlidXRpb25Db250ZXh0VHlwZVJlZ2lzdHJ5IGZSZWdpc3RyeTsKKwkKKwlwcml2YXRlIEFudFRlbXBsYXRlQWNjZXNzKCkgeworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UKKwkgKi8KKwlwdWJsaWMgc3RhdGljIEFudFRlbXBsYXRlQWNjZXNzIGdldERlZmF1bHQoKSB7CisJCWlmIChmZ0luc3RhbmNlID09IG51bGwpIHsKKwkJCWZnSW5zdGFuY2U9IG5ldyBBbnRUZW1wbGF0ZUFjY2VzcygpOworCQl9CisJCXJldHVybiBmZ0luc3RhbmNlOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhpcyBwbHVnLWluJ3MgdGVtcGxhdGUgc3RvcmUuCisJICogCisJICogQHJldHVybiB0aGUgdGVtcGxhdGUgc3RvcmUgb2YgdGhpcyBwbHVnLWluIGluc3RhbmNlCisJICovCisJcHVibGljIFRlbXBsYXRlU3RvcmUgZ2V0VGVtcGxhdGVTdG9yZSgpIHsKKwkJaWYgKGZTdG9yZSA9PSBudWxsKSB7CisJCQlmU3RvcmU9IG5ldyBDb250cmlidXRpb25UZW1wbGF0ZVN0b3JlKGdldENvbnRleHRUeXBlUmVnaXN0cnkoKSxBbnRVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCksIENVU1RPTV9URU1QTEFURVNfS0VZKTsKKwkJCXRyeSB7CisJCQkJZlN0b3JlLmxvYWQoKTsKKwkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQlBbnRVSVBsdWdpbi5sb2coZSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGZTdG9yZTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoaXMgcGx1Zy1pbidzIGNvbnRleHQgdHlwZSByZWdpc3RyeS4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBjb250ZXh0IHR5cGUgcmVnaXN0cnkgZm9yIHRoaXMgcGx1Zy1pbiBpbnN0YW5jZQorCSAqLworCXB1YmxpYyBDb250ZXh0VHlwZVJlZ2lzdHJ5IGdldENvbnRleHRUeXBlUmVnaXN0cnkoKSB7CisJCWlmIChmUmVnaXN0cnkgPT0gbnVsbCkgeworCQkJLy8gY3JlYXRlIGFuZCBjb25maWd1cmUgdGhlIGNvbnRleHRzIGF2YWlsYWJsZSBpbiB0aGUgdGVtcGxhdGUgZWRpdG9yCisJCQlmUmVnaXN0cnk9IG5ldyBDb250cmlidXRpb25Db250ZXh0VHlwZVJlZ2lzdHJ5KCk7CisJCQlmUmVnaXN0cnkuYWRkQ29udGV4dFR5cGUoQnVpbGRGaWxlQ29udGV4dFR5cGUuQlVJTERGSUxFX0NPTlRFWFRfVFlQRSk7CisJCQlmUmVnaXN0cnkuYWRkQ29udGV4dFR5cGUoVGFyZ2V0Q29udGV4dFR5cGUuVEFSR0VUX0NPTlRFWFRfVFlQRSk7CisJCQlmUmVnaXN0cnkuYWRkQ29udGV4dFR5cGUoVGFza0NvbnRleHRUeXBlLlRBU0tfQ09OVEVYVF9UWVBFKTsKKwkJfQorCQlyZXR1cm4gZlJlZ2lzdHJ5OworCX0KK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL3RlbXBsYXRlcy9BbnRUZW1wbGF0ZUluZm9ybWF0aW9uQ29udHJvbENyZWF0b3IuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL3RlbXBsYXRlcy9BbnRUZW1wbGF0ZUluZm9ybWF0aW9uQ29udHJvbENyZWF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTA2MWM5Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvdGVtcGxhdGVzL0FudFRlbXBsYXRlSW5mb3JtYXRpb25Db250cm9sQ3JlYXRvci5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IudGVtcGxhdGVzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5BbnRTb3VyY2VWaWV3ZXJJbmZvcm1hdGlvbkNvbnRyb2w7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JSW5mb3JtYXRpb25Db250cm9sOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUluZm9ybWF0aW9uQ29udHJvbENyZWF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JSW5mb3JtYXRpb25Db250cm9sQ3JlYXRvckV4dGVuc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKKworCitwdWJsaWMgY2xhc3MgQW50VGVtcGxhdGVJbmZvcm1hdGlvbkNvbnRyb2xDcmVhdG9yIGltcGxlbWVudHMgSUluZm9ybWF0aW9uQ29udHJvbENyZWF0b3IsIElJbmZvcm1hdGlvbkNvbnRyb2xDcmVhdG9yRXh0ZW5zaW9uIHsKKwkKKwlwcml2YXRlIEFudFNvdXJjZVZpZXdlckluZm9ybWF0aW9uQ29udHJvbCBmQ29udHJvbDsKKwkKKwlwdWJsaWMgQW50VGVtcGxhdGVJbmZvcm1hdGlvbkNvbnRyb2xDcmVhdG9yKCkgIHsKKwl9CisJCisJLyoKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUluZm9ybWF0aW9uQ29udHJvbENyZWF0b3IjY3JlYXRlSW5mb3JtYXRpb25Db250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsKQorCSAqLworCXB1YmxpYyBJSW5mb3JtYXRpb25Db250cm9sIGNyZWF0ZUluZm9ybWF0aW9uQ29udHJvbChTaGVsbCBwYXJlbnQpIHsKKwkJZkNvbnRyb2w9IG5ldyBBbnRTb3VyY2VWaWV3ZXJJbmZvcm1hdGlvbkNvbnRyb2wocGFyZW50KTsKKwkJZkNvbnRyb2wuYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZSkgeworCQkJCWZDb250cm9sPSBudWxsOworCQkJfQorCQl9KTsKKwkJcmV0dXJuIGZDb250cm9sOworCX0KKworCS8qCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklJbmZvcm1hdGlvbkNvbnRyb2xDcmVhdG9yRXh0ZW5zaW9uI2NhblJldXNlKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUluZm9ybWF0aW9uQ29udHJvbCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBjYW5SZXVzZShJSW5mb3JtYXRpb25Db250cm9sIGNvbnRyb2wpIHsKKwkJcmV0dXJuIGZDb250cm9sID09IGNvbnRyb2wgJiYgZkNvbnRyb2wgIT0gbnVsbDsKKwl9CisKKwkvKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JSW5mb3JtYXRpb25Db250cm9sQ3JlYXRvckV4dGVuc2lvbiNjYW5SZXBsYWNlKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUluZm9ybWF0aW9uQ29udHJvbENyZWF0b3IpCisJICovCisJcHVibGljIGJvb2xlYW4gY2FuUmVwbGFjZShJSW5mb3JtYXRpb25Db250cm9sQ3JlYXRvciBjcmVhdG9yKSB7CisJCXJldHVybiAoY3JlYXRvciAhPSBudWxsICYmIGdldENsYXNzKCkgPT0gY3JlYXRvci5nZXRDbGFzcygpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci90ZW1wbGF0ZXMvQW50VGVtcGxhdGVQcm9wb3NhbC5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvdGVtcGxhdGVzL0FudFRlbXBsYXRlUHJvcG9zYWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjg5NGIzCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvdGVtcGxhdGVzL0FudFRlbXBsYXRlUHJvcG9zYWwuamF2YQpAQCAtMCwwICsxLDUwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci50ZW1wbGF0ZXM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlUHJvcG9zYWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOworCitwdWJsaWMgY2xhc3MgQW50VGVtcGxhdGVQcm9wb3NhbCBleHRlbmRzIFRlbXBsYXRlUHJvcG9zYWwgeworCQorCXB1YmxpYyBBbnRUZW1wbGF0ZVByb3Bvc2FsKFRlbXBsYXRlIHRlbXBsYXRlLCBUZW1wbGF0ZUNvbnRleHQgY29udGV4dCwgSVJlZ2lvbiByZWdpb24sIEltYWdlIGltYWdlLCBpbnQgcmVsZXZhbmNlKSB7CisJCXN1cGVyKHRlbXBsYXRlLCBjb250ZXh0LCByZWdpb24sIGltYWdlLCByZWxldmFuY2UpOworCX0KKwkKKyAgICAvKiAobm9uLUphdmFkb2MpCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbEV4dGVuc2lvbjIjdmFsaWRhdGUob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQsIGludCwgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50KQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHZhbGlkYXRlKElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCwgRG9jdW1lbnRFdmVudCBldmVudCkgeworICAgICAgICB0cnkgeworCQkJaW50IHJlcGxhY2VPZmZzZXQ9IGdldFJlcGxhY2VPZmZzZXQoKTsKKwkJCWlmIChvZmZzZXQgPj0gcmVwbGFjZU9mZnNldCkgeworCQkJCVN0cmluZyBjb250ZW50PSBkb2N1bWVudC5nZXQocmVwbGFjZU9mZnNldCwgb2Zmc2V0IC0gcmVwbGFjZU9mZnNldCk7CisgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisJCQkJaWYgKGNvbnRlbnQuY2hhckF0KDApID09ICc8JykgeworCQkJCSAgICBjb250ZW50PSBjb250ZW50LnN1YnN0cmluZygxKTsKKwkJCQl9CisJCQkJcmV0dXJuIGdldFRlbXBsYXRlKCkuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChjb250ZW50LnRvTG93ZXJDYXNlKCkpOworCQkJfQorCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7CisJCQkvLyBjb25jdXJyZW50IG1vZGlmaWNhdGlvbiAtIGlnbm9yZQorCQl9CisJCXJldHVybiBmYWxzZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci90ZW1wbGF0ZXMvQW50VGVtcGxhdGVWYXJpYWJsZVRleHRIb3Zlci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvdGVtcGxhdGVzL0FudFRlbXBsYXRlVmFyaWFibGVUZXh0SG92ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDQ0YzZhCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvdGVtcGxhdGVzL0FudFRlbXBsYXRlVmFyaWFibGVUZXh0SG92ZXIuamF2YQpAQCAtMCwwICsxLDYzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IudGVtcGxhdGVzOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IudGV4dC5YTUxUZXh0SG92ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dEhvdmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZVZhcmlhYmxlUmVzb2x2ZXI7CisKK3B1YmxpYyBjbGFzcyBBbnRUZW1wbGF0ZVZhcmlhYmxlVGV4dEhvdmVyIGltcGxlbWVudHMgSVRleHRIb3ZlciB7CisKKwlwdWJsaWMgQW50VGVtcGxhdGVWYXJpYWJsZVRleHRIb3ZlcigpIHsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0SG92ZXIjZ2V0SG92ZXJJbmZvKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIsIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbikKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldEhvdmVySW5mbyhJVGV4dFZpZXdlciB0ZXh0Vmlld2VyLCBJUmVnaW9uIHN1YmplY3QpIHsKKwkJdHJ5IHsKKwkJCUlEb2N1bWVudCBkb2M9IHRleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKTsKKwkJCWludCBvZmZzZXQ9IHN1YmplY3QuZ2V0T2Zmc2V0KCk7CisJCQlpZiAob2Zmc2V0ID49IDIgJiYgIiR7Ii5lcXVhbHMoZG9jLmdldChvZmZzZXQtMiwgMikpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlTdHJpbmcgdmFyTmFtZT0gZG9jLmdldChvZmZzZXQsIHN1YmplY3QuZ2V0TGVuZ3RoKCkpOworCQkJCVRlbXBsYXRlQ29udGV4dFR5cGUgY29udGV4dFR5cGU9IEFudFRlbXBsYXRlQWNjZXNzLmdldERlZmF1bHQoKS5nZXRDb250ZXh0VHlwZVJlZ2lzdHJ5KCkuZ2V0Q29udGV4dFR5cGUoVGFza0NvbnRleHRUeXBlLlRBU0tfQ09OVEVYVF9UWVBFKTsKKwkJCQlpZiAoY29udGV4dFR5cGUgIT0gbnVsbCkgeworCQkJCQlJdGVyYXRvciBpdGVyPSBjb250ZXh0VHlwZS5yZXNvbHZlcnMoKTsKKwkJCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisJCQkJCQlUZW1wbGF0ZVZhcmlhYmxlUmVzb2x2ZXIgdmFyPSAoVGVtcGxhdGVWYXJpYWJsZVJlc29sdmVyKSBpdGVyLm5leHQoKTsKKwkJCQkJCWlmICh2YXJOYW1lLmVxdWFscyh2YXIuZ2V0VHlwZSgpKSkgeworCQkJCQkJCXJldHVybiB2YXIuZ2V0RGVzY3JpcHRpb24oKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0JCQkJCisJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0SG92ZXIjZ2V0SG92ZXJSZWdpb24ob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlciwgaW50KQorCSAqLworCXB1YmxpYyBJUmVnaW9uIGdldEhvdmVyUmVnaW9uKElUZXh0Vmlld2VyIHRleHRWaWV3ZXIsIGludCBvZmZzZXQpIHsKKwkJaWYgKHRleHRWaWV3ZXIgIT0gbnVsbCkgeworCQkJcmV0dXJuIFhNTFRleHRIb3Zlci5nZXRSZWdpb24odGV4dFZpZXdlciwgb2Zmc2V0KTsKKwkJfQorCQlyZXR1cm4gbnVsbDsJCisJfQorfSAKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL3RlbXBsYXRlcy9BbnRUZW1wbGF0ZVZpZXdlckNvbmZpZ3VyYXRpb24uamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL3RlbXBsYXRlcy9BbnRUZW1wbGF0ZVZpZXdlckNvbmZpZ3VyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2U0YjU5Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvdGVtcGxhdGVzL0FudFRlbXBsYXRlVmlld2VyQ29uZmlndXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLnRlbXBsYXRlczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5BbnRTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRIb3ZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JU291cmNlVmlld2VyOworCitwdWJsaWMgY2xhc3MgQW50VGVtcGxhdGVWaWV3ZXJDb25maWd1cmF0aW9uIGV4dGVuZHMgQW50U291cmNlVmlld2VyQ29uZmlndXJhdGlvbiB7CisJCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiNnZXRUZXh0SG92ZXIob3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlciwgamF2YS5sYW5nLlN0cmluZykKKwkgKi8KKwlwdWJsaWMgSVRleHRIb3ZlciBnZXRUZXh0SG92ZXIoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBjb250ZW50VHlwZSkgeworCQlyZXR1cm4gbmV3IEFudFRlbXBsYXRlVmFyaWFibGVUZXh0SG92ZXIoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci90ZW1wbGF0ZXMvQW50VmFyaWFibGVSZXNvbHZlci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvdGVtcGxhdGVzL0FudFZhcmlhYmxlUmVzb2x2ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWUwNjdiCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvdGVtcGxhdGVzL0FudFZhcmlhYmxlUmVzb2x2ZXIuamF2YQpAQCAtMCwwICsxLDUwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IudGVtcGxhdGVzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZVZhcmlhYmxlUmVzb2x2ZXI7CisKKy8qKgorICogTG9va3MgdXAgZXhpc3RpbmcgYW50IHZhcmlhYmxlcyBhbmQgcHJvcG9zZXMgdGhlbS4gVGhlIHByb3Bvc2FscyBhcmUgc29ydGVkIGJ5IAorICogdGhlaXIgcHJlZml4LWxpa2VuZXNzIHdpdGggdGhlIHZhcmlhYmxlIHR5cGUuCisgKi8KK3B1YmxpYyBjbGFzcyBBbnRWYXJpYWJsZVJlc29sdmVyIGV4dGVuZHMgVGVtcGxhdGVWYXJpYWJsZVJlc29sdmVyIHsKKwkvKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVWYXJpYWJsZVJlc29sdmVyI3Jlc29sdmVBbGwob3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0KQorCSAqLworCXByb3RlY3RlZCBTdHJpbmdbXSByZXNvbHZlQWxsKFRlbXBsYXRlQ29udGV4dCBjb250ZXh0KSB7CisJCVN0cmluZ1tdIHByb3Bvc2Fscz0gbmV3IFN0cmluZ1tdIHsgIiR7c3JjRGlyfSIsICIke2RzdERpcn0iIH07IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkKKwkJQXJyYXlzLnNvcnQocHJvcG9zYWxzLCBuZXcgQ29tcGFyYXRvcigpIHsKKworCQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7CisJCQkJcmV0dXJuIGdldENvbW1vblByZWZpeExlbmd0aChnZXRUeXBlKCksIChTdHJpbmcpIG8yKSAtIGdldENvbW1vblByZWZpeExlbmd0aChnZXRUeXBlKCksIChTdHJpbmcpIG8xKTsKKwkJCX0KKworCQkJcHJpdmF0ZSBpbnQgZ2V0Q29tbW9uUHJlZml4TGVuZ3RoKFN0cmluZyB0eXBlLCBTdHJpbmcgdmFyKSB7CisJCQkJaW50IGk9IDA7CisJCQkJQ2hhclNlcXVlbmNlIHZTZXE9IHZhci5zdWJTZXF1ZW5jZSgyLCB2YXIubGVuZ3RoKCkgLSAxKTsgLy8gc3RyaXAgYXdheSAke30KKwkJCQl3aGlsZSAoaSA8IHR5cGUubGVuZ3RoKCkgJiYgaSA8IHZTZXEubGVuZ3RoKCkpCisJCQkJCWlmIChDaGFyYWN0ZXIudG9Mb3dlckNhc2UodHlwZS5jaGFyQXQoaSkpID09IENoYXJhY3Rlci50b0xvd2VyQ2FzZSh2U2VxLmNoYXJBdChpKSkpCisJCQkJCQlpKys7CisJCQkJCWVsc2UKKwkJCQkJCWJyZWFrOworCQkJCXJldHVybiBpOworCQkJfQorCQl9KTsKKwkJCisJCXJldHVybiBwcm9wb3NhbHM7CisJfQorfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvdGVtcGxhdGVzL0J1aWxkRmlsZUNvbnRleHRUeXBlLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci90ZW1wbGF0ZXMvQnVpbGRGaWxlQ29udGV4dFR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmJkZGY3Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvdGVtcGxhdGVzL0J1aWxkRmlsZUNvbnRleHRUeXBlLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLnRlbXBsYXRlczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXM7CisKKworLyoqCisgKiBBIHZlcnkgc2ltcGxlIGNvbnRleHQgdHlwZS4KKyAqLworcHVibGljIGNsYXNzIEJ1aWxkRmlsZUNvbnRleHRUeXBlIGV4dGVuZHMgVGVtcGxhdGVDb250ZXh0VHlwZSB7CisKKwkvKiogVGhpcyBjb250ZXh0J3MgaWQgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCVUlMREZJTEVfQ09OVEVYVF9UWVBFPSAib3JnLmVjbGlwc2UuYW50LnVpLnRlbXBsYXRlQ29udGV4dFR5cGUuYnVpbGRGaWxlIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBYTUwgY29udGV4dCB0eXBlLiAKKwkgKi8KKwlwdWJsaWMgQnVpbGRGaWxlQ29udGV4dFR5cGUoKSB7CisJCWFkZEdsb2JhbFJlc29sdmVycygpOworCX0KKworCXByaXZhdGUgdm9pZCBhZGRHbG9iYWxSZXNvbHZlcnMoKSB7CisJCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5DdXJzb3IoKSk7CisJCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5Xb3JkU2VsZWN0aW9uKCkpOworCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuTGluZVNlbGVjdGlvbigpKTsKKwkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLkRvbGxhcigpKTsKKwkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLkRhdGUoKSk7CisJCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5ZZWFyKCkpOworCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuVGltZSgpKTsKKwkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLlVzZXIoKSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvdGVtcGxhdGVzL1RhcmdldENvbnRleHRUeXBlLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci90ZW1wbGF0ZXMvVGFyZ2V0Q29udGV4dFR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGZhMmIwCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvdGVtcGxhdGVzL1RhcmdldENvbnRleHRUeXBlLmphdmEKQEAgLTAsMCArMSwxNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IudGVtcGxhdGVzOworCitwdWJsaWMgY2xhc3MgVGFyZ2V0Q29udGV4dFR5cGUgZXh0ZW5kcyBCdWlsZEZpbGVDb250ZXh0VHlwZSB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFSR0VUX0NPTlRFWFRfVFlQRT0gIm9yZy5lY2xpcHNlLmFudC51aS50ZW1wbGF0ZUNvbnRleHRUeXBlLnRhcmdldCI7IC8vJE5PTi1OTFMtMSQKK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL3RlbXBsYXRlcy9UYXNrQ29udGV4dFR5cGUuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL3RlbXBsYXRlcy9UYXNrQ29udGV4dFR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmQ4ZjlhCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvdGVtcGxhdGVzL1Rhc2tDb250ZXh0VHlwZS5qYXZhCkBAIC0wLDAgKzEsMTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLnRlbXBsYXRlczsKKworcHVibGljIGNsYXNzIFRhc2tDb250ZXh0VHlwZSBleHRlbmRzIEJ1aWxkRmlsZUNvbnRleHRUeXBlIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLX0NPTlRFWFRfVFlQRT0gIm9yZy5lY2xpcHNlLmFudC51aS50ZW1wbGF0ZUNvbnRleHRUeXBlLnRhc2siOyAvLyROT04tTkxTLTEkCit9CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci90ZXh0L0Fic3RyYWN0QW50RWRpdG9yU2Nhbm5lci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvdGV4dC9BYnN0cmFjdEFudEVkaXRvclNjYW5uZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2U1YjAyCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvdGV4dC9BYnN0cmFjdEFudEVkaXRvclNjYW5uZXIuamF2YQpAQCAtMCwwICsxLDc2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IudGV4dDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5BbnRVSVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuQ29sb3JNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5TdHJpbmdDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuUnVsZUJhc2VkU2Nhbm5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLlRva2VuOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RBbnRFZGl0b3JTY2FubmVyIGV4dGVuZHMgUnVsZUJhc2VkU2Nhbm5lciB7CisKKwlwcm90ZWN0ZWQgdm9pZCBhZGFwdFRvQ29sb3JDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCwgVG9rZW4gdG9rZW4pIHsKKwkJUkdCIHJnYj0gbnVsbDsKKwkJCisJCU9iamVjdCB2YWx1ZT0gZXZlbnQuZ2V0TmV3VmFsdWUoKTsKKwkJaWYgKHZhbHVlIGluc3RhbmNlb2YgUkdCKSB7CisJCQlyZ2I9IChSR0IpIHZhbHVlOworCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7CisJCQlyZ2I9IFN0cmluZ0NvbnZlcnRlci5hc1JHQigoU3RyaW5nKSB2YWx1ZSk7CisJCX0KKwkJCQorCQlpZiAocmdiICE9IG51bGwpIHsKKwkJCVRleHRBdHRyaWJ1dGUgYXR0cj0gKFRleHRBdHRyaWJ1dGUpIHRva2VuLmdldERhdGEoKTsKKwkJCXRva2VuLnNldERhdGEobmV3IFRleHRBdHRyaWJ1dGUoQ29sb3JNYW5hZ2VyLmdldERlZmF1bHQoKS5nZXRDb2xvcihyZ2IpLCBhdHRyLmdldEJhY2tncm91bmQoKSwgYXR0ci5nZXRTdHlsZSgpKSk7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBhZGFwdFRvU3R5bGVDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCwgVG9rZW4gdG9rZW4sIGludCBzdHlsZUF0dHJpYnV0ZSkgeworCSAJaWYgKHRva2VuID09IG51bGwpIHsKKwkJCXJldHVybjsKKwkJfQorCQlib29sZWFuIGV2ZW50VmFsdWU9IGZhbHNlOworCQlPYmplY3QgdmFsdWU9IGV2ZW50LmdldE5ld1ZhbHVlKCk7CisJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEJvb2xlYW4pIHsKKwkJCWV2ZW50VmFsdWU9ICgoQm9vbGVhbikgdmFsdWUpLmJvb2xlYW5WYWx1ZSgpOworCQl9IGVsc2UgaWYgKElQcmVmZXJlbmNlU3RvcmUuVFJVRS5lcXVhbHModmFsdWUpKSB7CisJCQlldmVudFZhbHVlPSB0cnVlOworCQl9CisJCQorCQlUZXh0QXR0cmlidXRlIGF0dHI9IChUZXh0QXR0cmlidXRlKSB0b2tlbi5nZXREYXRhKCk7CisJCWJvb2xlYW4gYWN0aXZlVmFsdWU9IChhdHRyLmdldFN0eWxlKCkgJiBzdHlsZUF0dHJpYnV0ZSkgPT0gc3R5bGVBdHRyaWJ1dGU7CisJCWlmIChhY3RpdmVWYWx1ZSAhPSBldmVudFZhbHVlKSB7IAorCQkJdG9rZW4uc2V0RGF0YShuZXcgVGV4dEF0dHJpYnV0ZShhdHRyLmdldEZvcmVncm91bmQoKSwgYXR0ci5nZXRCYWNrZ3JvdW5kKCksIGV2ZW50VmFsdWUgPyBhdHRyLmdldFN0eWxlKCkgfCBzdHlsZUF0dHJpYnV0ZSA6IGF0dHIuZ2V0U3R5bGUoKSAmIH5zdHlsZUF0dHJpYnV0ZSkpOworCQl9CisJfQorCisJcHJvdGVjdGVkIFRleHRBdHRyaWJ1dGUgY3JlYXRlVGV4dEF0dHJpYnV0ZShTdHJpbmcgY29sb3JJRCwgU3RyaW5nIGJvbGRLZXksIFN0cmluZyBpdGFsaWNLZXkpIHsKKwkJQ29sb3IgY29sb3I9IG51bGw7CisJCWlmIChjb2xvcklEICE9IG51bGwpIHsKKwkJCWNvbG9yPSBBbnRVSVBsdWdpbi5nZXRQcmVmZXJlbmNlQ29sb3IoY29sb3JJRCk7CisJCX0KKwkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZT0gQW50VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOworCQlpbnQgc3R5bGU9IHN0b3JlLmdldEJvb2xlYW4oYm9sZEtleSkgPyBTV1QuQk9MRCA6IFNXVC5OT1JNQUw7CisJCWlmIChzdG9yZS5nZXRCb29sZWFuKGl0YWxpY0tleSkpIHsKKwkJCXN0eWxlIHw9IFNXVC5JVEFMSUM7CisJCX0KKwkJCisJCXJldHVybiBuZXcgVGV4dEF0dHJpYnV0ZShjb2xvciwgbnVsbCwgc3R5bGUpOworCX0KK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL3RleHQvQW5ub3RhdGlvbk1vZGVsRmFjdG9yeS5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvdGV4dC9Bbm5vdGF0aW9uTW9kZWxGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNiYjI1ZgotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL3RleHQvQW5ub3RhdGlvbk1vZGVsRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci50ZXh0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5GaWxlQnVmZmVyczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklBbm5vdGF0aW9uTW9kZWxGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQW5ub3RhdGlvbk1vZGVsOworCitwdWJsaWMgY2xhc3MgQW5ub3RhdGlvbk1vZGVsRmFjdG9yeSBpbXBsZW1lbnRzIElBbm5vdGF0aW9uTW9kZWxGYWN0b3J5IHsKKworICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSUFubm90YXRpb25Nb2RlbEZhY3RvcnkjY3JlYXRlQW5ub3RhdGlvbk1vZGVsKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aCkKKyAgICAgKi8KKyAgICBwdWJsaWMgSUFubm90YXRpb25Nb2RlbCBjcmVhdGVBbm5vdGF0aW9uTW9kZWwoSVBhdGggbG9jYXRpb24pIHsKKyAgICAgICAgSUZpbGUgZmlsZSA9IEZpbGVCdWZmZXJzLmdldFdvcmtzcGFjZUZpbGVBdExvY2F0aW9uKGxvY2F0aW9uKTsKKyAgICAgICAgaWYgKGZpbGUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBBbnRFeHRlcm5hbEFubm90YXRpb25Nb2RlbCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgQW50QW5ub3RhdGlvbk1vZGVsKGZpbGUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL3RleHQvQW50QW5ub3RhdGlvbk1vZGVsLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci90ZXh0L0FudEFubm90YXRpb25Nb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwNTVhNTAKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci90ZXh0L0FudEFubm90YXRpb25Nb2RlbC5qYXZhCkBAIC0wLDAgKzEsMTMyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IudGV4dDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmxhdW5jaGluZy5kZWJ1Zy5JQW50RGVidWdDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLkFudFVJUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3Iub3V0bGluZS5BbnRFZGl0b3JNYXJrZXJVcGRhdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5tb2RlbC5JUHJvYmxlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkubW9kZWwuSVByb2JsZW1SZXF1ZXN0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuQW5ub3RhdGlvbk1vZGVsRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LkVkaXRvcnNVSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLk1hcmtlckFubm90YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5NYXJrZXJVdGlsaXRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5SZXNvdXJjZU1hcmtlckFubm90YXRpb25Nb2RlbDsKKworcHVibGljIGNsYXNzIEFudEFubm90YXRpb25Nb2RlbCBleHRlbmRzIFJlc291cmNlTWFya2VyQW5ub3RhdGlvbk1vZGVsIGltcGxlbWVudHMgSVByb2JsZW1SZXF1ZXN0b3IgeworCQorCXByaXZhdGUgTGlzdCBmR2VuZXJhdGVkQW5ub3RhdGlvbnM9IG5ldyBBcnJheUxpc3QoKTsKKwlwcml2YXRlIExpc3QgZkNvbGxlY3RlZFByb2JsZW1zPSBuZXcgQXJyYXlMaXN0KCk7CisJCisJcHVibGljIEFudEFubm90YXRpb25Nb2RlbChJRmlsZSBmaWxlKSB7CisJCXN1cGVyKGZpbGUpOworCX0KKworCS8qCisJICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkFic3RyYWN0TWFya2VyQW5ub3RhdGlvbk1vZGVsI2NyZWF0ZU1hcmtlckFubm90YXRpb24ob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcikKKwkgKi8KKwlwcm90ZWN0ZWQgTWFya2VyQW5ub3RhdGlvbiBjcmVhdGVNYXJrZXJBbm5vdGF0aW9uKElNYXJrZXIgbWFya2VyKSB7CisJCVN0cmluZyBtYXJrZXJUeXBlPSBNYXJrZXJVdGlsaXRpZXMuZ2V0TWFya2VyVHlwZShtYXJrZXIpOworCQlpZiAoQW50RWRpdG9yTWFya2VyVXBkYXRlci5CVUlMREZJTEVfUFJPQkxFTV9NQVJLRVIuZXF1YWxzKG1hcmtlclR5cGUpKSB7CisJCSAgICAvL3dlIGN1cnJlbnRseSBkbyBub3Qgc2hvdyBBbnQgYnVpbGRmaWxlIHByb2JsZW0gbWFya2VycyBpbiB0aGUgQW50IGVkaXRvciBhcyB3ZSBoYXZlIG5vIG5vdGlvbiBvZiAKKwkJICAgIC8vYW5ub3RhdGlvbiBvdmVybGF5cworCQkgICAgLy9idWcgCisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlyZXR1cm4gbmV3IE1hcmtlckFubm90YXRpb24oRWRpdG9yc1VJLmdldEFubm90YXRpb25UeXBlTG9va3VwKCkuZ2V0QW5ub3RhdGlvblR5cGUobWFya2VyKSwgbWFya2VyKTsKKwl9CisKKwlwcm90ZWN0ZWQgUG9zaXRpb24gY3JlYXRlUG9zaXRpb25Gcm9tUHJvYmxlbShJUHJvYmxlbSBwcm9ibGVtKSB7CisJCWludCBzdGFydD0gcHJvYmxlbS5nZXRPZmZzZXQoKTsKKwkJaWYgKHN0YXJ0ID49IDApIHsKKwkJCWludCBsZW5ndGg9IHByb2JsZW0uZ2V0TGVuZ3RoKCk7CisJCQkJCisJCQlpZiAobGVuZ3RoID49IDApCisJCQkJcmV0dXJuIG5ldyBQb3NpdGlvbihzdGFydCwgbGVuZ3RoKTsKKwkJfQorCisJCXJldHVybiBudWxsOworCX0KKwkKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLm91dGxpbmUuSVByb2JsZW1SZXF1ZXN0b3IjYWNjZXB0UHJvYmxlbShvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLm91dGxpbmUuSVByb2JsZW0pCisJICovCisJcHVibGljIHZvaWQgYWNjZXB0UHJvYmxlbShJUHJvYmxlbSBwcm9ibGVtKSB7CisJCWZDb2xsZWN0ZWRQcm9ibGVtcy5hZGQocHJvYmxlbSk7CisJfQorCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3Iub3V0bGluZS5JUHJvYmxlbVJlcXVlc3RvciNhY2NlcHRQcm9ibGVtKG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3Iub3V0bGluZS5JUHJvYmxlbSkKKwkgKi8KKwlwdWJsaWMgdm9pZCBiZWdpblJlcG9ydGluZygpIHsKKwl9CisJCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5vdXRsaW5lLklQcm9ibGVtUmVxdWVzdG9yI2FjY2VwdFByb2JsZW0ob3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5vdXRsaW5lLklQcm9ibGVtKQorCSAqLworCXB1YmxpYyB2b2lkIGVuZFJlcG9ydGluZygpIHsKKwkJYm9vbGVhbiB0ZW1wb3JhcnlQcm9ibGVtc0NoYW5nZWQ9IGZhbHNlOworCQkJCisJCXN5bmNocm9uaXplZCAoZ2V0QW5ub3RhdGlvbk1hcCgpKSB7CisJCQkJCisJCQlpZiAoZkdlbmVyYXRlZEFubm90YXRpb25zLnNpemUoKSA+IDApIHsKKwkJCQl0ZW1wb3JhcnlQcm9ibGVtc0NoYW5nZWQ9IHRydWU7CQorCQkJCXJlbW92ZUFubm90YXRpb25zKGZHZW5lcmF0ZWRBbm5vdGF0aW9ucywgZmFsc2UsIHRydWUpOworCQkJCWZHZW5lcmF0ZWRBbm5vdGF0aW9ucy5jbGVhcigpOworCQkJfQorCQkJCQorCQkJaWYgKGZDb2xsZWN0ZWRQcm9ibGVtcyAhPSBudWxsICYmIGZDb2xsZWN0ZWRQcm9ibGVtcy5zaXplKCkgPiAwKSB7CisJCQkJSXRlcmF0b3IgZT0gZkNvbGxlY3RlZFByb2JsZW1zLml0ZXJhdG9yKCk7CisJCQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7CisJCQkJCQkKKwkJCQkJSVByb2JsZW0gcHJvYmxlbT0gKElQcm9ibGVtKSBlLm5leHQoKTsKKwkJCQkJCQorCQkJCQlQb3NpdGlvbiBwb3NpdGlvbj0gY3JlYXRlUG9zaXRpb25Gcm9tUHJvYmxlbShwcm9ibGVtKTsKKwkJCQkJaWYgKHBvc2l0aW9uICE9IG51bGwpIHsKKwkJCQkJCQkKKwkJCQkJCVhNTFByb2JsZW1Bbm5vdGF0aW9uIGFubm90YXRpb249IG5ldyBYTUxQcm9ibGVtQW5ub3RhdGlvbihwcm9ibGVtKTsKKwkJCQkJCWZHZW5lcmF0ZWRBbm5vdGF0aW9ucy5hZGQoYW5ub3RhdGlvbik7CisJCQkJCQl0cnkgeworCQkJCQkJCWFkZEFubm90YXRpb24oYW5ub3RhdGlvbiwgcG9zaXRpb24sIGZhbHNlKTsKKwkJCQkJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGV4KSB7CisJCQkJCQkJQW50VUlQbHVnaW4ubG9nKGV4KTsKKwkJCQkJCX0KKwkJCQkJCQkKKwkJCQkJCXRlbXBvcmFyeVByb2JsZW1zQ2hhbmdlZD0gdHJ1ZTsKKwkJCQkJfQorCQkJCX0KKwkJCQkJCisJCQkJZkNvbGxlY3RlZFByb2JsZW1zLmNsZWFyKCk7CisJCQl9CisJCX0KKwkJCQkKKwkJaWYgKHRlbXBvcmFyeVByb2JsZW1zQ2hhbmdlZCkKKwkJCWZpcmVNb2RlbENoYW5nZWQobmV3IEFubm90YXRpb25Nb2RlbEV2ZW50KHRoaXMpKTsKKwl9CisgICAgCisgICAgLyogKG5vbi1KYXZhZG9jKQorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5BYnN0cmFjdE1hcmtlckFubm90YXRpb25Nb2RlbCNpc0FjY2VwdGFibGUob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcikKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0FjY2VwdGFibGUoSU1hcmtlciBtYXJrZXIpIHsKKyAgICAgICAgaWYgKHN1cGVyLmlzQWNjZXB0YWJsZShtYXJrZXIpKSB7CisgICAgICAgICAgcmV0dXJuICFtYXJrZXIuZ2V0QXR0cmlidXRlKElBbnREZWJ1Z0NvbnN0YW50cy5BTlRfUlVOX1RPX0xJTkUsIGZhbHNlKTsgIAorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci90ZXh0L0FudERvY3VtZW50U2V0dXBQYXJ0aWNpcGFudC5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvdGV4dC9BbnREb2N1bWVudFNldHVwUGFydGljaXBhbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjRiZjk0Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvdGV4dC9BbnREb2N1bWVudFNldHVwUGFydGljaXBhbnQuamF2YQpAQCAtMCwwICsxLDUzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLnRleHQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklEb2N1bWVudFNldHVwUGFydGljaXBhbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb24zOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5GYXN0UGFydGl0aW9uZXI7CisKKy8qKgorICogVGhlIGRvY3VtZW50IHNldHVwIHBhcnRpY2lwYW50IGZvciBBbnQuCisgKi8KK3B1YmxpYyBjbGFzcyBBbnREb2N1bWVudFNldHVwUGFydGljaXBhbnQgIGltcGxlbWVudHMgSURvY3VtZW50U2V0dXBQYXJ0aWNpcGFudCB7CisKKwkvKioKKwkgKiBUaGUgbmFtZSBvZiB0aGUgQW50IHBhcnRpdGlvbmluZy4KKwkgKiBAc2luY2UgMy4wCisJICovCisJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQU5UX1BBUlRJVElPTklORz0gIm9yZy5lY2xpcHNlLmFudC51aS5hbnRQYXJ0aXRpb25pbmciOyAgLy8kTk9OLU5MUy0xJAorCQorCXB1YmxpYyBBbnREb2N1bWVudFNldHVwUGFydGljaXBhbnQoKSB7CisJfQorCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSURvY3VtZW50U2V0dXBQYXJ0aWNpcGFudCNzZXR1cChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXR1cChJRG9jdW1lbnQgZG9jdW1lbnQpIHsKKwkJaWYgKGRvY3VtZW50IGluc3RhbmNlb2YgSURvY3VtZW50RXh0ZW5zaW9uMykgeworCQkJSURvY3VtZW50RXh0ZW5zaW9uMyBleHRlbnNpb24zPSAoSURvY3VtZW50RXh0ZW5zaW9uMykgZG9jdW1lbnQ7CisJCQlJRG9jdW1lbnRQYXJ0aXRpb25lciBwYXJ0aXRpb25lciA9IGNyZWF0ZURvY3VtZW50UGFydGl0aW9uZXIoKTsKKwkJCWV4dGVuc2lvbjMuc2V0RG9jdW1lbnRQYXJ0aXRpb25lcihBTlRfUEFSVElUSU9OSU5HLCBwYXJ0aXRpb25lcik7CisJCQlwYXJ0aXRpb25lci5jb25uZWN0KGRvY3VtZW50KTsKKwkJfSAKKwl9CisJCisJcHJpdmF0ZSBJRG9jdW1lbnRQYXJ0aXRpb25lciBjcmVhdGVEb2N1bWVudFBhcnRpdGlvbmVyKCkgeworCQlyZXR1cm4gbmV3IEZhc3RQYXJ0aXRpb25lcigKKwkJCQluZXcgQW50RWRpdG9yUGFydGl0aW9uU2Nhbm5lcigpLCBuZXcgU3RyaW5nW117CisJCQkJCQlBbnRFZGl0b3JQYXJ0aXRpb25TY2FubmVyLlhNTF9UQUcsCisJCQkJCQlBbnRFZGl0b3JQYXJ0aXRpb25TY2FubmVyLlhNTF9DT01NRU5ULCAKKwkJCQkJCUFudEVkaXRvclBhcnRpdGlvblNjYW5uZXIuWE1MX0NEQVRBLAorCQkJCQkJQW50RWRpdG9yUGFydGl0aW9uU2Nhbm5lci5YTUxfRFREfSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvdGV4dC9BbnRFZGl0b3JQYXJ0aXRpb25TY2FubmVyLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci90ZXh0L0FudEVkaXRvclBhcnRpdGlvblNjYW5uZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWJjZGNiCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvdGV4dC9BbnRFZGl0b3JQYXJ0aXRpb25TY2FubmVyLmphdmEKQEAgLTAsMCArMSw2OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBHRUJJVCBHZXNlbGxzY2hhZnQgZnVlciBFRFYtQmVyYXR1bmcKKyAqIHVuZCBJbmZvcm1hdGlrLVRlY2hub2xvZ2llbiBtYkgsIAorICogQmVybGluLCBEdWVzc2VsZG9yZiwgRnJhbmtmdXJ0IChHZXJtYW55KSBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBHRUJJVCBHZXNlbGxzY2hhZnQgZnVlciBFRFYtQmVyYXR1bmcgdW5kIEluZm9ybWF0aWstVGVjaG5vbG9naWVuIG1iSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogCSAgIElCTSBDb3Jwb3JhdGlvbiAtIGJ1ZyAzMjg5MCwgYnVnIDI0MTA4LCBidWcgMTExNzQwCisgKiAgICAgSm9obi1NYXNvbiBQLiBTaGFja2VsZm9yZCAtIGJ1ZyA1NzM3OQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci50ZXh0OworCisvKgorICogVGhpcyBmaWxlIG9yaWdpbmF0ZXMgZnJvbSBhbiBpbnRlcm5hbCBwYWNrYWdlIG9mIEVjbGlwc2UncyAKKyAqIE1hbmlmZXN0IEVkaXRvci4gSXQgaGFzIGJlZW4gY29waWVkIGJ5IEdFQklUIHRvIGhlcmUgaW4gb3JkZXIgdG8KKyAqIHBlcm1hbmVudGx5IHVzZSB0aG9zZSBmZWF0dXJlcy4gSXQgaGFzIGJlZW4gcmVuYW1lZCBhbmQgZWRpdGVkIGJ5IEdFQklUIAorICogYWZ0ZXIgY29weWluZy4KKyAqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5JUHJlZGljYXRlUnVsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLklUb2tlbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLk11bHRpTGluZVJ1bGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5SdWxlQmFzZWRQYXJ0aXRpb25TY2FubmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuVG9rZW47CisKKy8qKgorICogU2Nhbm5lciB0aGF0IHNjYW5zIHRoZSBkb2N1bWVudCBhbmQgcGFydGl0aW9ucyB0aGUgZG9jdW1lbnQgaW50byB0aGUgZm91ciAKKyAqIHN1cHBvcnRlZCBjb250ZW50IHR5cGVzOgorICogPHVsPgorICogPGxpPlhNTF9DT01NRU5UPC9saT4KKyAqIDxsaT5YTUxfVEFHPC9saT4KKyAqIDxsaT5YTUxfQ0RBVEE8L2xpPgorICogPGxpPlhNTF9EVEQ8L2xpPgorICogPC91bD4KKyAqLworcHVibGljIGNsYXNzIEFudEVkaXRvclBhcnRpdGlvblNjYW5uZXIgZXh0ZW5kcyBSdWxlQmFzZWRQYXJ0aXRpb25TY2FubmVyIHsKKworCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFhNTF9DT01NRU5UID0gIl9feG1sX2NvbW1lbnQiOyAvLyROT04tTkxTLTEkCisJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgWE1MX1RBRyA9ICJfX3htbF90YWciOyAvLyROT04tTkxTLTEkCisJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgWE1MX0NEQVRBID0gIl9feG1sX2NkYXRhIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFhNTF9EVEQgPSAiX194bWxfZHRkIjsgLy8kTk9OLU5MUy0xJAorCQorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2UuCisgICAgICovCisJcHVibGljIEFudEVkaXRvclBhcnRpdGlvblNjYW5uZXIoKSB7CisKKwkJSVByZWRpY2F0ZVJ1bGVbXSBydWxlcyA9bmV3IElQcmVkaWNhdGVSdWxlWzRdOworCisgICAgICAgIElUb2tlbiB4bWxDREFUQSA9IG5ldyBUb2tlbihYTUxfQ0RBVEEpOworCQlydWxlc1swXT0gbmV3IE11bHRpTGluZVJ1bGUoIjwhW0NEQVRBWyIsICJdXT4iLCB4bWxDREFUQSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkKKyAgICAgICAgSVRva2VuIHhtbENvbW1lbnQgPSBuZXcgVG9rZW4oWE1MX0NPTU1FTlQpOworCQlydWxlc1sxXT0gbmV3IE11bHRpTGluZVJ1bGUoIjwhLS0iLCAiLS0+IiwgeG1sQ29tbWVudCwgJ1xcJywgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCisgICAgICAgIElUb2tlbiB0YWcgPSBuZXcgVG9rZW4oWE1MX1RBRyk7CisJCXJ1bGVzWzJdPSBuZXcgVGFnUnVsZSh0YWcpOworCQorCQlJVG9rZW4geG1sRFREID0gbmV3IFRva2VuKFhNTF9EVEQpOworCQlydWxlc1szXT0gbmV3IERvY1R5cGVSdWxlKHhtbERURCk7CisJCQorCQlzZXRQcmVkaWNhdGVSdWxlcyhydWxlcyk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL3RleHQvQW50RWRpdG9yUHJvY0luc3RyU2Nhbm5lci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvdGV4dC9BbnRFZGl0b3JQcm9jSW5zdHJTY2FubmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU1Y2NkZgotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL3RleHQvQW50RWRpdG9yUHJvY0luc3RyU2Nhbm5lci5qYXZhCkBAIC0wLDAgKzEsNzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDUgR0VCSVQgR2VzZWxsc2NoYWZ0IGZ1ZXIgRURWLUJlcmF0dW5nCisgKiB1bmQgSW5mb3JtYXRpay1UZWNobm9sb2dpZW4gbWJILCAKKyAqIEJlcmxpbiwgRHVlc3NlbGRvcmYsIEZyYW5rZnVydCAoR2VybWFueSkgYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgR0VCSVQgR2VzZWxsc2NoYWZ0IGZ1ZXIgRURWLUJlcmF0dW5nIHVuZCBJbmZvcm1hdGlrLVRlY2hub2xvZ2llbiBtYkggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqIAkgICBJQk0gQ29ycG9yYXRpb24gLSBidWcgZml4ZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IudGV4dDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5BbnRFZGl0b3JQcmVmZXJlbmNlQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuSVJ1bGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5NdWx0aUxpbmVSdWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuVG9rZW47CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5XaGl0ZXNwYWNlUnVsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKKworLyoqCisgKiBUaGUgc2Nhbm5lciB0byB0b2tlbml6ZSBmb3IgWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zIGFuZCB0ZXh0CisgKi8KK3B1YmxpYyBjbGFzcyBBbnRFZGl0b3JQcm9jSW5zdHJTY2FubmVyIGV4dGVuZHMgQWJzdHJhY3RBbnRFZGl0b3JTY2FubmVyIHsKKworCVRva2VuIGZQcm9jSW5zdHJ1Y3Rpb25Ub2tlbj0gbnVsbDsKKwkKKyAgICBwdWJsaWMgQW50RWRpdG9yUHJvY0luc3RyU2Nhbm5lcigpIHsKKwkJSVJ1bGVbXSBydWxlcyA9bmV3IElSdWxlWzJdOworICAgICAgICBmUHJvY0luc3RydWN0aW9uVG9rZW4gPQorICAgICAgICAgICAgbmV3IFRva2VuKGNyZWF0ZVRleHRBdHRyaWJ1dGUoSUFudEVkaXRvckNvbG9yQ29uc3RhbnRzLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05TX0NPTE9SLCAKKwkJCQkJSUFudEVkaXRvckNvbG9yQ29uc3RhbnRzLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05TX0NPTE9SICsgQW50RWRpdG9yUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfQk9MRF9TVUZGSVgsCisJCQkJCUlBbnRFZGl0b3JDb2xvckNvbnN0YW50cy5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OU19DT0xPUiArIEFudEVkaXRvclByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0lUQUxJQ19TVUZGSVgpKTsKKworICAgICAgICAvL0FkZCBydWxlIGZvciBwcm9jZXNzaW5nIGluc3RydWN0aW9ucworICAgICAgICBydWxlc1swXT0gbmV3IE11bHRpTGluZVJ1bGUoIjw/IiwgIj8+IiwgZlByb2NJbnN0cnVjdGlvblRva2VuKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisKKyAgICAgICAgLy8gQWRkIGdlbmVyaWMgd2hpdGVzcGFjZSBydWxlLgorICAgICAgICBydWxlc1sxXT0gbmV3IFdoaXRlc3BhY2VSdWxlKG5ldyBBbnRFZGl0b3JXaGl0ZXNwYWNlRGV0ZWN0b3IoKSk7CisKKyAgICAgICAgc2V0UnVsZXMocnVsZXMpOworICAgICAgICAKKyAgICAgICAgc2V0RGVmYXVsdFJldHVyblRva2VuKG5ldyBUb2tlbihjcmVhdGVUZXh0QXR0cmlidXRlKElBbnRFZGl0b3JDb2xvckNvbnN0YW50cy5URVhUX0NPTE9SLCAKKyAgICAJCQkJCQkJSUFudEVkaXRvckNvbG9yQ29uc3RhbnRzLlRFWFRfQ09MT1IgKyBBbnRFZGl0b3JQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9CT0xEX1NVRkZJWCwKKwkJCQkJCQkJSUFudEVkaXRvckNvbG9yQ29uc3RhbnRzLlRFWFRfQ09MT1IgKyBBbnRFZGl0b3JQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9JVEFMSUNfU1VGRklYKSkpOworICAgIH0KKworCXByaXZhdGUgVG9rZW4gZ2V0VG9rZW5BZmZlY3RlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7CisgICAgCWlmIChldmVudC5nZXRQcm9wZXJ0eSgpLnN0YXJ0c1dpdGgoSUFudEVkaXRvckNvbG9yQ29uc3RhbnRzLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05TX0NPTE9SKSkgeworICAgIAkJcmV0dXJuIGZQcm9jSW5zdHJ1Y3Rpb25Ub2tlbjsKKyAgICAJfQorICAgIAlyZXR1cm4gKFRva2VuKWZEZWZhdWx0UmV0dXJuVG9rZW47CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIGFkYXB0VG9QcmVmZXJlbmNlQ2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKKyAgICAJU3RyaW5nIHByb3BlcnR5PSBldmVudC5nZXRQcm9wZXJ0eSgpOworICAgIAlpZiAocHJvcGVydHkuc3RhcnRzV2l0aChJQW50RWRpdG9yQ29sb3JDb25zdGFudHMuVEVYVF9DT0xPUikgfHwgcHJvcGVydHkuc3RhcnRzV2l0aChJQW50RWRpdG9yQ29sb3JDb25zdGFudHMuUFJPQ0VTU0lOR19JTlNUUlVDVElPTlNfQ09MT1IpKSB7ICAgIAkJCisgICAgCQlpZiAocHJvcGVydHkuZW5kc1dpdGgoQW50RWRpdG9yUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfQk9MRF9TVUZGSVgpKSB7CisJICAgIAkJYWRhcHRUb1N0eWxlQ2hhbmdlKGV2ZW50LCBnZXRUb2tlbkFmZmVjdGVkKGV2ZW50KSwgU1dULkJPTEQpOworCSAgICAJfSBlbHNlIGlmIChwcm9wZXJ0eS5lbmRzV2l0aChBbnRFZGl0b3JQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9JVEFMSUNfU1VGRklYKSkgeworCSAgICAJCWFkYXB0VG9TdHlsZUNoYW5nZShldmVudCwgZ2V0VG9rZW5BZmZlY3RlZChldmVudCksIFNXVC5JVEFMSUMpOworCSAgICAJfSBlbHNlIHsKKwkgICAgCQlhZGFwdFRvQ29sb3JDaGFuZ2UoZXZlbnQsIGdldFRva2VuQWZmZWN0ZWQoZXZlbnQpKTsKKwkgICAgCX0KKyAgICAJfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci90ZXh0L0FudEVkaXRvclRhZ1NjYW5uZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL3RleHQvQW50RWRpdG9yVGFnU2Nhbm5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3YjUwYjIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci90ZXh0L0FudEVkaXRvclRhZ1NjYW5uZXIuamF2YQpAQCAtMCwwICsxLDc3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA1IEdFQklUIEdlc2VsbHNjaGFmdCBmdWVyIEVEVi1CZXJhdHVuZworICogdW5kIEluZm9ybWF0aWstVGVjaG5vbG9naWVuIG1iSCwgCisgKiBCZXJsaW4sIER1ZXNzZWxkb3JmLCBGcmFua2Z1cnQgKEdlcm1hbnkpIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIEdFQklUIEdlc2VsbHNjaGFmdCBmdWVyIEVEVi1CZXJhdHVuZyB1bmQgSW5mb3JtYXRpay1UZWNobm9sb2dpZW4gbWJIIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAJICAgSUJNIENvcnBvcmF0aW9uIC0gYnVnIDMxNzk2LCBidWcgMjQxMDgsIGJ1ZyA0NzEzOQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci50ZXh0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLnByZWZlcmVuY2VzLkFudEVkaXRvclByZWZlcmVuY2VDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5JUnVsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLk11bHRpTGluZVJ1bGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5TaW5nbGVMaW5lUnVsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLlRva2VuOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuV2hpdGVzcGFjZVJ1bGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CisKKy8qKgorICogVGhlIHNjYW5uZXIgdG8gdG9rZW5pemUgZm9yIHN0cmluZ3MgYW5kIHRhZ3MKKyAqLworcHVibGljIGNsYXNzIEFudEVkaXRvclRhZ1NjYW5uZXIgZXh0ZW5kcyBBYnN0cmFjdEFudEVkaXRvclNjYW5uZXIgeworCisJcHJpdmF0ZSBUb2tlbiBmU3RyaW5nVG9rZW47CisJCisgICAgcHVibGljIEFudEVkaXRvclRhZ1NjYW5uZXIoKSB7CisgICAgCWZTdHJpbmdUb2tlbj0gbmV3IFRva2VuKAorICAgIAkJCWNyZWF0ZVRleHRBdHRyaWJ1dGUoSUFudEVkaXRvckNvbG9yQ29uc3RhbnRzLlNUUklOR19DT0xPUiwgCisgICAgCQkJCQlJQW50RWRpdG9yQ29sb3JDb25zdGFudHMuU1RSSU5HX0NPTE9SICsgQW50RWRpdG9yUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfQk9MRF9TVUZGSVgsCisJCQkJCQlJQW50RWRpdG9yQ29sb3JDb25zdGFudHMuU1RSSU5HX0NPTE9SICsgQW50RWRpdG9yUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSVRBTElDX1NVRkZJWCkpOworICAgICAgICAgICAgICAgICAgICAKKwkJSVJ1bGVbXSBydWxlcz0gbmV3IElSdWxlWzNdOworCisgICAgICAgIC8vIEFkZCBydWxlIGZvciBzaW5nbGUgYW5kIGRvdWJsZSBxdW90ZXMKKyAgICAgICAgcnVsZXNbMF09IG5ldyBNdWx0aUxpbmVSdWxlKCJcIiIsICJcIiIsIGZTdHJpbmdUb2tlbiwgJ1xcJyk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorICAgICAgICBydWxlc1sxXT0gbmV3IFNpbmdsZUxpbmVSdWxlKCInIiwgIiciLCBmU3RyaW5nVG9rZW4sICdcXCcpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKworICAgICAgICAvLyBBZGQgZ2VuZXJpYyB3aGl0ZXNwYWNlIHJ1bGUuCisgICAgICAgIHJ1bGVzWzJdPSBuZXcgV2hpdGVzcGFjZVJ1bGUobmV3IEFudEVkaXRvcldoaXRlc3BhY2VEZXRlY3RvcigpKTsKKworICAgICAgICBzZXRSdWxlcyhydWxlcyk7CisgICAgICAgIAorICAgICAgICBzZXREZWZhdWx0UmV0dXJuVG9rZW4oCisgICAgICAgIAkJbmV3IFRva2VuKGNyZWF0ZVRleHRBdHRyaWJ1dGUoSUFudEVkaXRvckNvbG9yQ29uc3RhbnRzLlRBR19DT0xPUiwgCisgICAgCQkJCQlJQW50RWRpdG9yQ29sb3JDb25zdGFudHMuVEFHX0NPTE9SICsgQW50RWRpdG9yUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfQk9MRF9TVUZGSVgsCisJCQkJCQlJQW50RWRpdG9yQ29sb3JDb25zdGFudHMuVEFHX0NPTE9SICsgQW50RWRpdG9yUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSVRBTElDX1NVRkZJWCkpKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgYWRhcHRUb1ByZWZlcmVuY2VDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgeworICAgIAlTdHJpbmcgcHJvcGVydHk9IGV2ZW50LmdldFByb3BlcnR5KCk7CisgICAgCWlmIChwcm9wZXJ0eS5zdGFydHNXaXRoKElBbnRFZGl0b3JDb2xvckNvbnN0YW50cy5UQUdfQ09MT1IpIHx8IHByb3BlcnR5LnN0YXJ0c1dpdGgoSUFudEVkaXRvckNvbG9yQ29uc3RhbnRzLlNUUklOR19DT0xPUikpIHsKKyAgICAJCWlmIChwcm9wZXJ0eS5lbmRzV2l0aChBbnRFZGl0b3JQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9CT0xEX1NVRkZJWCkpIHsKKyAgICAJCQlhZGFwdFRvU3R5bGVDaGFuZ2UoZXZlbnQsIGdldFRva2VuQWZmZWN0ZWQoZXZlbnQpLCBTV1QuQk9MRCk7CisgICAgCQl9IGVsc2UgaWYgKHByb3BlcnR5LmVuZHNXaXRoKEFudEVkaXRvclByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0lUQUxJQ19TVUZGSVgpKSB7CisgICAgCQkJYWRhcHRUb1N0eWxlQ2hhbmdlKGV2ZW50LCBnZXRUb2tlbkFmZmVjdGVkKGV2ZW50KSwgU1dULklUQUxJQyk7CisgICAgCQl9IGVsc2UgeworICAgIAkJCWFkYXB0VG9Db2xvckNoYW5nZShldmVudCwgZ2V0VG9rZW5BZmZlY3RlZChldmVudCkpOworICAgIAkJfQorICAgIAl9CisgICAgfQorICAgIAorICAgIHByaXZhdGUgVG9rZW4gZ2V0VG9rZW5BZmZlY3RlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7CisgICAgCVN0cmluZyBwcm9wZXJ0eT0gZXZlbnQuZ2V0UHJvcGVydHkoKTsKKyAgICAJaWYgKHByb3BlcnR5LnN0YXJ0c1dpdGgoSUFudEVkaXRvckNvbG9yQ29uc3RhbnRzLlNUUklOR19DT0xPUikpIHsKKyAgICAJCXJldHVybiBmU3RyaW5nVG9rZW47CisgICAgCX0vLyBlbHNlIGlmIChwcm9wZXJ0eS5zdGFydHNXaXRoKElBbnRFZGl0b3JDb2xvckNvbnN0YW50cy5UQUdfQ09MT1IpKSB7CisgICAgCQlyZXR1cm4gKFRva2VuKWZEZWZhdWx0UmV0dXJuVG9rZW47CisgICAgCS8vfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL3RleHQvQW50RWRpdG9yVGV4dE1lc3NhZ2VzLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci90ZXh0L0FudEVkaXRvclRleHRNZXNzYWdlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3MmE1NTgKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci90ZXh0L0FudEVkaXRvclRleHRNZXNzYWdlcy5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcworICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCisgKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOiAKKyAqIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IudGV4dDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CisKK3B1YmxpYyBjbGFzcyBBbnRFZGl0b3JUZXh0TWVzc2FnZXMgZXh0ZW5kcyBOTFMgeworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLnRleHQuQW50RWRpdG9yVGV4dE1lc3NhZ2VzIjsvLyROT04tTkxTLTEkCisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxUZXh0SG92ZXJfNDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxUZXh0SG92ZXJfNTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxUZXh0SG92ZXJfNjsKKworCXN0YXRpYyB7CisJCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQorCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBBbnRFZGl0b3JUZXh0TWVzc2FnZXMuY2xhc3MpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci90ZXh0L0FudEVkaXRvclRleHRNZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvdGV4dC9BbnRFZGl0b3JUZXh0TWVzc2FnZXMucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTdmNzJiCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvdGV4dC9BbnRFZGl0b3JUZXh0TWVzc2FnZXMucHJvcGVydGllcwpAQCAtMCwwICsxLDE0IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyMKKyMgQ29udHJpYnV0b3JzOgorIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK1hNTFRleHRIb3Zlcl80PVBhdGggRWxlbWVudHM6CitYTUxUZXh0SG92ZXJfNT1JbmNsdWRlczoKK1hNTFRleHRIb3Zlcl82PUV4Y2x1ZGVzOgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvdGV4dC9BbnRFZGl0b3JXaGl0ZXNwYWNlRGV0ZWN0b3IuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL3RleHQvQW50RWRpdG9yV2hpdGVzcGFjZURldGVjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY1ZmY1OAotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL3RleHQvQW50RWRpdG9yV2hpdGVzcGFjZURldGVjdG9yLmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNSBHRUJJVCBHZXNlbGxzY2hhZnQgZnVlciBFRFYtQmVyYXR1bmcKKyAqIHVuZCBJbmZvcm1hdGlrLVRlY2hub2xvZ2llbiBtYkgsIAorICogQmVybGluLCBEdWVzc2VsZG9yZiwgRnJhbmtmdXJ0IChHZXJtYW55KSBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBHRUJJVCBHZXNlbGxzY2hhZnQgZnVlciBFRFYtQmVyYXR1bmcgdW5kIEluZm9ybWF0aWstVGVjaG5vbG9naWVuIG1iSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogCSAgIElCTSBDb3Jwb3JhdGlvbiAtIGJ1ZyAyOTE0OAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci50ZXh0OworCisvKgorICogVGhpcyBmaWxlIG9yaWdpbmF0ZXMgZnJvbSBhbiBpbnRlcm5hbCBwYWNrYWdlIG9mIEVjbGlwc2UncyAKKyAqIE1hbmlmZXN0IEVkaXRvci4gSXQgaGFzIGJlZW4gY29waWVkIGJ5IEdFQklUIHRvIGhlcmUgaW4gb3JkZXIgdG8KKyAqIHBlcm1hbmVudGx5IHVzZSB0aG9zZSBmZWF0dXJlcy4gSXQgaGFzIGJlZW4gcmVuYW1lZCBieSBHRUJJVCAKKyAqIGFmdGVyIGNvcHlpbmcuCisgKi8KKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuSVdoaXRlc3BhY2VEZXRlY3RvcjsKKworcHVibGljIGNsYXNzIEFudEVkaXRvcldoaXRlc3BhY2VEZXRlY3RvciBpbXBsZW1lbnRzIElXaGl0ZXNwYWNlRGV0ZWN0b3IgeworCisJcHVibGljIGJvb2xlYW4gaXNXaGl0ZXNwYWNlKGNoYXIgYykgeworCQlyZXR1cm4gKGMgPT0gJyAnIHx8IGMgPT0gJ1x0JyB8fCBjID09ICdcbicgfHwgYyA9PSAnXHInKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci90ZXh0L0FudEV4dGVybmFsQW5ub3RhdGlvbk1vZGVsLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci90ZXh0L0FudEV4dGVybmFsQW5ub3RhdGlvbk1vZGVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjkxNzRmOQotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL3RleHQvQW50RXh0ZXJuYWxBbm5vdGF0aW9uTW9kZWwuamF2YQpAQCAtMCwwICsxLDk3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IudGV4dDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLkFudFVJUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5tb2RlbC5JUHJvYmxlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkubW9kZWwuSVByb2JsZW1SZXF1ZXN0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLkFubm90YXRpb25Nb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Bbm5vdGF0aW9uTW9kZWxFdmVudDsKKworcHVibGljIGNsYXNzIEFudEV4dGVybmFsQW5ub3RhdGlvbk1vZGVsIGV4dGVuZHMgQW5ub3RhdGlvbk1vZGVsIGltcGxlbWVudHMgSVByb2JsZW1SZXF1ZXN0b3IgeworCisgICAgcHJpdmF0ZSBMaXN0IGZHZW5lcmF0ZWRBbm5vdGF0aW9ucz0gbmV3IEFycmF5TGlzdCgpOworCXByaXZhdGUgTGlzdCBmQ29sbGVjdGVkUHJvYmxlbXM9IG5ldyBBcnJheUxpc3QoKTsKKworICAgIC8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3Iub3V0bGluZS5JUHJvYmxlbVJlcXVlc3RvciNhY2NlcHRQcm9ibGVtKG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3Iub3V0bGluZS5JUHJvYmxlbSkKKwkgKi8KKwlwdWJsaWMgdm9pZCBhY2NlcHRQcm9ibGVtKElQcm9ibGVtIHByb2JsZW0pIHsKKwkJZkNvbGxlY3RlZFByb2JsZW1zLmFkZChwcm9ibGVtKTsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLm91dGxpbmUuSVByb2JsZW1SZXF1ZXN0b3IjYWNjZXB0UHJvYmxlbShvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLm91dGxpbmUuSVByb2JsZW0pCisJICovCisJcHVibGljIHZvaWQgZW5kUmVwb3J0aW5nKCkgeworCQlib29sZWFuIHRlbXBvcmFyeVByb2JsZW1zQ2hhbmdlZD0gZmFsc2U7CisJCQkKKwkJc3luY2hyb25pemVkIChnZXRBbm5vdGF0aW9uTWFwKCkpIHsKKwkJCQkKKwkJCWlmIChmR2VuZXJhdGVkQW5ub3RhdGlvbnMuc2l6ZSgpID4gMCkgeworCQkJCXRlbXBvcmFyeVByb2JsZW1zQ2hhbmdlZD0gdHJ1ZTsJCisJCQkJcmVtb3ZlQW5ub3RhdGlvbnMoZkdlbmVyYXRlZEFubm90YXRpb25zLCBmYWxzZSwgdHJ1ZSk7CisJCQkJZkdlbmVyYXRlZEFubm90YXRpb25zLmNsZWFyKCk7CisJCQl9CisJCQkJCisJCQlpZiAoZkNvbGxlY3RlZFByb2JsZW1zICE9IG51bGwgJiYgZkNvbGxlY3RlZFByb2JsZW1zLnNpemUoKSA+IDApIHsKKwkJCQlJdGVyYXRvciBlPSBmQ29sbGVjdGVkUHJvYmxlbXMuaXRlcmF0b3IoKTsKKwkJCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKKwkJCQkJCQorCQkJCQlJUHJvYmxlbSBwcm9ibGVtPSAoSVByb2JsZW0pIGUubmV4dCgpOworCQkJCQkJCisJCQkJCVBvc2l0aW9uIHBvc2l0aW9uPSBjcmVhdGVQb3NpdGlvbkZyb21Qcm9ibGVtKHByb2JsZW0pOworCQkJCQlpZiAocG9zaXRpb24gIT0gbnVsbCkgeworCQkJCQkJCQorCQkJCQkJWE1MUHJvYmxlbUFubm90YXRpb24gYW5ub3RhdGlvbj0gbmV3IFhNTFByb2JsZW1Bbm5vdGF0aW9uKHByb2JsZW0pOworCQkJCQkJZkdlbmVyYXRlZEFubm90YXRpb25zLmFkZChhbm5vdGF0aW9uKTsKKwkJCQkJCXRyeSB7CisJCQkJCQkJYWRkQW5ub3RhdGlvbihhbm5vdGF0aW9uLCBwb3NpdGlvbiwgZmFsc2UpOworCQkJCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZXgpIHsKKwkJCQkJCQlBbnRVSVBsdWdpbi5sb2coZXgpOworCQkJCQkJfQorCQkJCQkJCQorCQkJCQkJdGVtcG9yYXJ5UHJvYmxlbXNDaGFuZ2VkPSB0cnVlOworCQkJCQl9CisJCQkJfQorCQkJCQkKKwkJCQlmQ29sbGVjdGVkUHJvYmxlbXMuY2xlYXIoKTsKKwkJCX0KKwkJfQorCQkJCQorCQlpZiAodGVtcG9yYXJ5UHJvYmxlbXNDaGFuZ2VkKQorCQkJZmlyZU1vZGVsQ2hhbmdlZChuZXcgQW5ub3RhdGlvbk1vZGVsRXZlbnQodGhpcykpOworCX0KKwkJCQkJCisJcHJvdGVjdGVkIFBvc2l0aW9uIGNyZWF0ZVBvc2l0aW9uRnJvbVByb2JsZW0oSVByb2JsZW0gcHJvYmxlbSkgeworCQlpbnQgc3RhcnQ9IHByb2JsZW0uZ2V0T2Zmc2V0KCk7CisJCWlmIChzdGFydCA+PSAwKSB7CisJCQlpbnQgbGVuZ3RoPSBwcm9ibGVtLmdldExlbmd0aCgpOworCQkJCQorCQkJaWYgKGxlbmd0aCA+PSAwKQorCQkJCXJldHVybiBuZXcgUG9zaXRpb24oc3RhcnQsIGxlbmd0aCk7CisJCX0KKworCQlyZXR1cm4gbnVsbDsKKwl9CisKKyAgICAvKiAobm9uLUphdmFkb2MpCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkubW9kZWwuSVByb2JsZW1SZXF1ZXN0b3IjYmVnaW5SZXBvcnRpbmcoKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGJlZ2luUmVwb3J0aW5nKCkgeworICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL3RleHQvQW50SW5mb3JtYXRpb25Qcm92aWRlci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvdGV4dC9BbnRJbmZvcm1hdGlvblByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU1N2I5NQotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL3RleHQvQW50SW5mb3JtYXRpb25Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci50ZXh0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5pbmZvcm1hdGlvbi5JSW5mb3JtYXRpb25Qcm92aWRlcjsKKworcHVibGljIGNsYXNzIEFudEluZm9ybWF0aW9uUHJvdmlkZXIgaW1wbGVtZW50cyBJSW5mb3JtYXRpb25Qcm92aWRlciB7CisKKwlYTUxUZXh0SG92ZXIgZlRleHRIb3ZlcjsKKwkKKwlwdWJsaWMgQW50SW5mb3JtYXRpb25Qcm92aWRlcihYTUxUZXh0SG92ZXIgaG92ZXIpIHsKKwkJZlRleHRIb3Zlcj0gaG92ZXI7CisJfQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaW5mb3JtYXRpb24uSUluZm9ybWF0aW9uUHJvdmlkZXIjZ2V0U3ViamVjdChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyLCBpbnQpCisJICovCisJcHVibGljIElSZWdpb24gZ2V0U3ViamVjdChJVGV4dFZpZXdlciB0ZXh0Vmlld2VyLCBpbnQgb2Zmc2V0KSB7CisJCXJldHVybiBmVGV4dEhvdmVyLmdldEhvdmVyUmVnaW9uKHRleHRWaWV3ZXIsIG9mZnNldCk7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5pbmZvcm1hdGlvbi5JSW5mb3JtYXRpb25Qcm92aWRlciNnZXRJbmZvcm1hdGlvbihvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyLCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb24pCisJICovCisJcHVibGljIFN0cmluZyBnZXRJbmZvcm1hdGlvbihJVGV4dFZpZXdlciB0ZXh0Vmlld2VyLCBJUmVnaW9uIHN1YmplY3QpIHsKKwkJcmV0dXJuIGZUZXh0SG92ZXIuZ2V0SG92ZXJJbmZvKHRleHRWaWV3ZXIsIHN1YmplY3QpOworCX0KK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL3RleHQvQW50U3RvcmFnZURvY3VtZW50UHJvdmlkZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL3RleHQvQW50U3RvcmFnZURvY3VtZW50UHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2I5Mjg2Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvdGV4dC9BbnRTdG9yYWdlRG9jdW1lbnRQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IudGV4dDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uMzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuRmFzdFBhcnRpdGlvbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC5TdG9yYWdlRG9jdW1lbnRQcm92aWRlcjsKKworLyoqCisgKiBAc2luY2UgMy4wCisgKi8KK3B1YmxpYyBjbGFzcyBBbnRTdG9yYWdlRG9jdW1lbnRQcm92aWRlciBleHRlbmRzIFN0b3JhZ2VEb2N1bWVudFByb3ZpZGVyIHsKKwkKKwkvKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LlN0b3JhZ2VEb2N1bWVudFByb3ZpZGVyI3NldHVwRG9jdW1lbnQoamF2YS5sYW5nLk9iamVjdCwKKwkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50KQorCSAqLworCXByb3RlY3RlZCB2b2lkIHNldHVwRG9jdW1lbnQoT2JqZWN0IGVsZW1lbnQsIElEb2N1bWVudCBkb2N1bWVudCkgeworCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCkgeworCQkJSURvY3VtZW50UGFydGl0aW9uZXIgcGFydGl0aW9uZXI9IGNyZWF0ZURvY3VtZW50UGFydGl0aW9uZXIoKTsKKwkJCWlmIChkb2N1bWVudCBpbnN0YW5jZW9mIElEb2N1bWVudEV4dGVuc2lvbjMpIHsKKwkJCQlJRG9jdW1lbnRFeHRlbnNpb24zIGV4dGVuc2lvbjM9IChJRG9jdW1lbnRFeHRlbnNpb24zKSBkb2N1bWVudDsKKwkJCQlleHRlbnNpb24zLnNldERvY3VtZW50UGFydGl0aW9uZXIoQW50RG9jdW1lbnRTZXR1cFBhcnRpY2lwYW50LkFOVF9QQVJUSVRJT05JTkcsIHBhcnRpdGlvbmVyKTsKKwkJCX0gZWxzZSB7CisJCQkJZG9jdW1lbnQuc2V0RG9jdW1lbnRQYXJ0aXRpb25lcihwYXJ0aXRpb25lcik7CisJCQl9CisJCQlwYXJ0aXRpb25lci5jb25uZWN0KGRvY3VtZW50KTsKKwkJfQorCX0KKwkKKwlwcml2YXRlIElEb2N1bWVudFBhcnRpdGlvbmVyIGNyZWF0ZURvY3VtZW50UGFydGl0aW9uZXIoKSB7CisJCXJldHVybiBuZXcgRmFzdFBhcnRpdGlvbmVyKAorCQkJCW5ldyBBbnRFZGl0b3JQYXJ0aXRpb25TY2FubmVyKCksIG5ldyBTdHJpbmdbXXsKKwkJCQkJCUFudEVkaXRvclBhcnRpdGlvblNjYW5uZXIuWE1MX1RBRywKKwkJCQkJCUFudEVkaXRvclBhcnRpdGlvblNjYW5uZXIuWE1MX0NPTU1FTlQsCisJCQkJCQlBbnRFZGl0b3JQYXJ0aXRpb25TY2FubmVyLlhNTF9DREFUQSwKKwkJCQkJCUFudEVkaXRvclBhcnRpdGlvblNjYW5uZXIuWE1MX0RURH0pOworCX0KK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL3RleHQvRG9jVHlwZVJ1bGUuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL3RleHQvRG9jVHlwZVJ1bGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmE5ZTgwCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvdGV4dC9Eb2NUeXBlUnVsZS5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IudGV4dDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuSUNoYXJhY3RlclNjYW5uZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5JVG9rZW47CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5NdWx0aUxpbmVSdWxlOworCitwdWJsaWMgY2xhc3MgRG9jVHlwZVJ1bGUgZXh0ZW5kcyBNdWx0aUxpbmVSdWxlIHsKKworICAgIHByaXZhdGUgaW50IGZFbWJlZGRlZFN0YXJ0PSAwOworCisJcHVibGljIERvY1R5cGVSdWxlKElUb2tlbiB0b2tlbikgeworICAgICAgICBzdXBlcigiPCFET0NUWVBFIiwgIj4iLCB0b2tlbik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorICAgIH0KKworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqIAorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5QYXR0ZXJuUnVsZSNlbmRTZXF1ZW5jZURldGVjdGVkKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuSUNoYXJhY3RlclNjYW5uZXIpCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gZW5kU2VxdWVuY2VEZXRlY3RlZChJQ2hhcmFjdGVyU2Nhbm5lciBzY2FubmVyKSB7CisgICAgICAgIGludCBjOworICAgICAgICB3aGlsZSAoKGMgPSBzY2FubmVyLnJlYWQoKSkgIT0gSUNoYXJhY3RlclNjYW5uZXIuRU9GKSB7CisgICAgICAgICAgICBpZiAoYyA9PSBmRXNjYXBlQ2hhcmFjdGVyKSB7CisgICAgICAgICAgICAgICAgLy8gU2tpcCB0aGUgZXNjYXBlZCBjaGFyYWN0ZXIuCisgICAgICAgICAgICAgICAgc2Nhbm5lci5yZWFkKCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJzwnKSB7CisgICAgICAgICAgICAJZkVtYmVkZGVkU3RhcnQrKzsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAnPicpIHsKKyAgICAgICAgICAgIAlpZiAoZkVtYmVkZGVkU3RhcnQgPT0gMCkgeworICAgICAgICAgICAgCQlyZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAJZkVtYmVkZGVkU3RhcnQtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgc2Nhbm5lci51bnJlYWQoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0gICAgCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvdGV4dC9GaWxlU2Nhbm5lci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvdGV4dC9GaWxlU2Nhbm5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkODE3YTUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci90ZXh0L0ZpbGVTY2FubmVyLmphdmEKQEAgLTAsMCArMSwyNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIAorcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLnRleHQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5EaXJlY3RvcnlTY2FubmVyOworCisKK3B1YmxpYyBjbGFzcyBGaWxlU2Nhbm5lciBleHRlbmRzIERpcmVjdG9yeVNjYW5uZXIgeworCQorCXB1YmxpYyBTdHJpbmdbXSBnZXRFeGNsdWRlc1BhdHRlcm5zKCkgeworCQlyZXR1cm4gZXhjbHVkZXM7CisJfQorCQorCXB1YmxpYyBTdHJpbmdbXSBnZXRJbmNsdWRlUGF0dGVybnMoKSB7CisJCXJldHVybiBpbmNsdWRlczsKKwl9Cit9CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci90ZXh0L0lBbnRFZGl0b3JDb2xvckNvbnN0YW50cy5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvdGV4dC9JQW50RWRpdG9yQ29sb3JDb25zdGFudHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Zjg3MzIwCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvdGV4dC9JQW50RWRpdG9yQ29sb3JDb25zdGFudHMuamF2YQpAQCAtMCwwICsxLDM5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA1IEdFQklUIEdlc2VsbHNjaGFmdCBmdWVyIEVEVi1CZXJhdHVuZworICogdW5kIEluZm9ybWF0aWstVGVjaG5vbG9naWVuIG1iSCwgCisgKiBCZXJsaW4sIER1ZXNzZWxkb3JmLCBGcmFua2Z1cnQgKEdlcm1hbnkpIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIEdFQklUIEdlc2VsbHNjaGFmdCBmdWVyIEVEVi1CZXJhdHVuZyB1bmQgSW5mb3JtYXRpay1UZWNobm9sb2dpZW4gbWJIIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAJICAgSUJNIENvcnBvcmF0aW9uIC0gYnVnIGZpeGVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLnRleHQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOworCisvKioKKyAqIFRoZSBjb2xvciBjb25zdGFudHMgdXNlZCBieSB0aGUgQW50IEVkaXRvci4KKyAqLworcHVibGljIGludGVyZmFjZSBJQW50RWRpdG9yQ29sb3JDb25zdGFudHMgeworCVJHQiBYTUxfQ09NTUVOVCA9ICAgICAgIG5ldyBSR0IoMTI4LCAgIDAsICAgMCk7CisJUkdCIFBST0NfSU5TVFIgPSAgICAgICAgbmV3IFJHQigxMjgsIDEyOCwgMTI4KTsKKwlSR0IgU1RSSU5HPSAgICAgICAgICAgICBuZXcgUkdCKCAgMCwgMTI4LCAgIDApOworCVJHQiBERUZBVUxUPSAgICAgICAgICAgIG5ldyBSR0IoICAwLCAgIDAsICAgMCk7CisJUkdCIFRBRz0gICAgICAgICAgICAgICAgbmV3IFJHQiggIDAsICAgMCwgMTI4KTsKKwlSR0IgWE1MX0RURCA9ICAgICAgIAluZXcgUkdCKDEyOCwgICAwLCAgIDApOworCQorCS8qKgorCSAqIFRoZSBzeW1ib2xpYyBuYW1lcyBmb3IgY29sb3JzIHVzZWQgZm9yIHRoZSB2YXJpb3VzIHRleHQgdG9rZW5zIGluIHRoZSBBbnQgZWRpdG9yCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0NPTU1FTlRfQ09MT1IgPSAib3JnLmVjbGlwc2UuYW50LnVpLmNvbW1lbnRzQ29sb3IiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPQ0VTU0lOR19JTlNUUlVDVElPTlNfQ09MT1IgPSAib3JnLmVjbGlwc2UuYW50LnVpLnByb2Nlc3NpbmdJbnN0cnVjdGlvbnNDb2xvciI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJJTkdfQ09MT1IgPSAib3JnLmVjbGlwc2UuYW50LnVpLmNvbnN0YW50U3RyaW5nc0NvbG9yIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfQ09MT1IgPSAib3JnLmVjbGlwc2UuYW50LnVpLnRleHRDb2xvciI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQ09MT1IgPSAib3JnLmVjbGlwc2UuYW50LnVpLnRhZ3NDb2xvciI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRFREX0NPTE9SID0gIm9yZy5lY2xpcHNlLmFudC51aS5kdGRDb2xvciI7IC8vJE5PTi1OTFMtMSQKK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL3RleHQvSVJlY29uY2lsaW5nUGFydGljaXBhbnQuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL3RleHQvSVJlY29uY2lsaW5nUGFydGljaXBhbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzBjOTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvdGV4dC9JUmVjb25jaWxpbmdQYXJ0aWNpcGFudC5qYXZhCkBAIC0wLDAgKzEsMjQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci50ZXh0OworCisKKworLyoqCisgKiBJbnRlcmZhY2Ugb2YgYW4gb2JqZWN0IHBhcnRpY2lwYXRpbmcgaW4gcmVjb25jaWxpbmcuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSVJlY29uY2lsaW5nUGFydGljaXBhbnQgeworCQorCS8qKgorCSAqIENhbGxlZCBhZnRlciByZWNvbmNpbGluZyBoYXMgYmVlbiBmaW5pc2hlZC4KKwkgKi8KKwl2b2lkIHJlY29uY2lsZWQoKTsKK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL3RleHQvTXVsdGlsaW5lRGFtYWdlclJlcGFpcmVyLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci90ZXh0L011bHRpbGluZURhbWFnZXJSZXBhaXJlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxYzM0MjcKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci90ZXh0L011bHRpbGluZURhbWFnZXJSZXBhaXJlci5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci50ZXh0OworCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50RXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVR5cGVkUmVnaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLkRlZmF1bHREYW1hZ2VyUmVwYWlyZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5JVG9rZW5TY2FubmVyOworCisvKioKKyAqIENvbnNpZGVycyBtdWx0aWxpbmVzIGFzIGRhbWFnZSByZWdpb25zIGV2ZW4gaWYgdGhlIGRvY3VtZW50IHBhcnRpdGlvbmluZyBoYXMgbm90IGNoYW5nZWQuCisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLkRlZmF1bHREYW1hZ2VyUmVwYWlyZXIKKyAqLworcHVibGljIGNsYXNzIE11bHRpbGluZURhbWFnZXJSZXBhaXJlciBleHRlbmRzIERlZmF1bHREYW1hZ2VyUmVwYWlyZXIgeworCisJcHVibGljIE11bHRpbGluZURhbWFnZXJSZXBhaXJlcihJVG9rZW5TY2FubmVyIHNjYW5uZXIsIFRleHRBdHRyaWJ1dGUgZGVmYXVsdFRleHRBdHRyaWJ1dGUpIHsKKwkJc3VwZXIoc2Nhbm5lciwgZGVmYXVsdFRleHRBdHRyaWJ1dGUpOworCX0KKwkKKwlwdWJsaWMgTXVsdGlsaW5lRGFtYWdlclJlcGFpcmVyKElUb2tlblNjYW5uZXIgc2Nhbm5lcikgeworCQlzdXBlcihzY2FubmVyKTsKKwl9CisJCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5wcmVzZW50YXRpb24uSVByZXNlbnRhdGlvbkRhbWFnZXIjZ2V0RGFtYWdlUmVnaW9uKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVR5cGVkUmVnaW9uLCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50RXZlbnQsIGJvb2xlYW4pCisJICovCisJcHVibGljIElSZWdpb24gZ2V0RGFtYWdlUmVnaW9uKElUeXBlZFJlZ2lvbiBwYXJ0aXRpb24sIERvY3VtZW50RXZlbnQgZSwgYm9vbGVhbiBkb2N1bWVudFBhcnRpdGlvbmluZ0NoYW5nZWQpIHsKKwkJcmV0dXJuIHBhcnRpdGlvbjsKKwl9CisKKwkvKioKKwkgKiBDb25maWd1cmVzIHRoZSBzY2FubmVyJ3MgZGVmYXVsdCByZXR1cm4gdG9rZW4uIFRoaXMgaXMgdGhlIHRleHQgYXR0cmlidXRlCisJICogd2hpY2ggaXMgcmV0dXJuZWQgd2hlbiBub25lIGlzIHJldHVybmVkIGJ5IHRoZSBjdXJyZW50IHRva2VuLgorCSAqLworCXB1YmxpYyB2b2lkIHNldERlZmF1bHRUZXh0QXR0cmlidXRlKFRleHRBdHRyaWJ1dGUgZGVmYXVsdFRleHRBdHRyaWJ1dGUpIHsKKwkJZkRlZmF1bHRUZXh0QXR0cmlidXRlPSBkZWZhdWx0VGV4dEF0dHJpYnV0ZTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci90ZXh0L05vdGlmeWluZ1JlY29uY2lsZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL3RleHQvTm90aWZ5aW5nUmVjb25jaWxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjY2I4NDAKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci90ZXh0L05vdGlmeWluZ1JlY29uY2lsZXIuamF2YQpAQCAtMCwwICsxLDY0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci50ZXh0OworCisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5EaXJ0eVJlZ2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuSVJlY29uY2lsaW5nU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLk1vbm9SZWNvbmNpbGVyOworCisKK3B1YmxpYyBjbGFzcyBOb3RpZnlpbmdSZWNvbmNpbGVyIGV4dGVuZHMgTW9ub1JlY29uY2lsZXIgeworCisJcHJpdmF0ZSBBcnJheUxpc3QgZlJlY29uY2lsaW5nUGFydGljaXBhbnRzPSBuZXcgQXJyYXlMaXN0KCk7CisJCisJLyoqCisJICogQ29uc3RydWN0b3IgZm9yIE5vdGlmeWluZ1JlY29uY2lsZXIuCisJICogQHBhcmFtIHN0cmF0ZWd5CisJICovCisJcHVibGljIE5vdGlmeWluZ1JlY29uY2lsZXIoSVJlY29uY2lsaW5nU3RyYXRlZ3kgc3RyYXRlZ3kpIHsKKwkJc3VwZXIoc3RyYXRlZ3ksIGZhbHNlKTsKKwl9CisKKwkvKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLkFic3RyYWN0UmVjb25jaWxlciNwcm9jZXNzKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5EaXJ0eVJlZ2lvbikKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzKERpcnR5UmVnaW9uIGRpcnR5UmVnaW9uKSB7CisJCXN1cGVyLnByb2Nlc3MoZGlydHlSZWdpb24pOworCQlub3RpZnlSZWNvbmNpbGluZ1BhcnRpY2lwYW50cygpOworCX0KKworCXB1YmxpYyB2b2lkIGFkZFJlY29uY2lsaW5nUGFydGljaXBhbnQoSVJlY29uY2lsaW5nUGFydGljaXBhbnQgcGFydGljaXBhbnQpIHsKKwkJZlJlY29uY2lsaW5nUGFydGljaXBhbnRzLmFkZChwYXJ0aWNpcGFudCk7CisJfQorCisJcHVibGljIHZvaWQgcmVtb3ZlUmVjb25jaWxpbmdQYXJ0aWNpcGFudChJUmVjb25jaWxpbmdQYXJ0aWNpcGFudCBwYXJ0aWNpcGFudCkgeworCQlmUmVjb25jaWxpbmdQYXJ0aWNpcGFudHMucmVtb3ZlKHBhcnRpY2lwYW50KTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBub3RpZnlSZWNvbmNpbGluZ1BhcnRpY2lwYW50cygpIHsKKwkJSXRlcmF0b3IgaT0gbmV3IEFycmF5TGlzdChmUmVjb25jaWxpbmdQYXJ0aWNpcGFudHMpLml0ZXJhdG9yKCk7CisJCXdoaWxlIChpLmhhc05leHQoKSkgeworCQkJKChJUmVjb25jaWxpbmdQYXJ0aWNpcGFudCkgaS5uZXh0KCkpLnJlY29uY2lsZWQoKTsKKwkJfQorCX0KKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuQWJzdHJhY3RSZWNvbmNpbGVyI2luaXRpYWxQcm9jZXNzKCkKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsUHJvY2VzcygpIHsKKwkJc3VwZXIuaW5pdGlhbFByb2Nlc3MoKTsKKwkJbm90aWZ5UmVjb25jaWxpbmdQYXJ0aWNpcGFudHMoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci90ZXh0L1RhZ1J1bGUuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL3RleHQvVGFnUnVsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2N2U5OWQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci90ZXh0L1RhZ1J1bGUuamF2YQpAQCAtMCwwICsxLDk0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IEdFQklUIEdlc2VsbHNjaGFmdCBmdWVyIEVEVi1CZXJhdHVuZworICogdW5kIEluZm9ybWF0aWstVGVjaG5vbG9naWVuIG1iSCwgCisgKiBCZXJsaW4sIER1ZXNzZWxkb3JmLCBGcmFua2Z1cnQgKEdlcm1hbnkpIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIEdFQklUIEdlc2VsbHNjaGFmdCBmdWVyIEVEVi1CZXJhdHVuZyB1bmQgSW5mb3JtYXRpay1UZWNobm9sb2dpZW4gbWJIIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAJICAgSUJNIENvcnBvcmF0aW9uIC0gYnVnIDI0MTA4LCBidWcgMTExNzQwCisgKiAgICAgSm9obi1NYXNvbiBQLiBTaGFja2VsZm9yZCAtIGJ1ZyA1MTIxNQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci50ZXh0OworCisvKgorICogVGhpcyBmaWxlIG9yaWdpbmF0ZXMgZnJvbSBhbiBpbnRlcm5hbCBwYWNrYWdlIG9mIEVjbGlwc2UncyAKKyAqIE1hbmlmZXN0IEVkaXRvci4gSXQgaGFzIGJlZW4gY29waWVkIGJ5IEdFQklUIHRvIGhlcmUgaW4gb3JkZXIgdG8KKyAqIHBlcm1hbmVudGx5IHVzZSB0aG9zZSBmZWF0dXJlcy4gSXQgaGFzIGJlZW4gcmVuYW1lZCBhbmQgZWRpdGVkIGJ5IEdFQklUIAorICogYWZ0ZXIgY29weWluZy4KKyAqLworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5JQ2hhcmFjdGVyU2Nhbm5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLklUb2tlbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLk11bHRpTGluZVJ1bGU7CisKK3B1YmxpYyBjbGFzcyBUYWdSdWxlIGV4dGVuZHMgTXVsdGlMaW5lUnVsZSB7CisKKyAgICBwdWJsaWMgVGFnUnVsZShJVG9rZW4gdG9rZW4pIHsKKyAgICAgICAgc3VwZXIoIjwiLCAiPiIsIHRva2VuKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisgICAgfQorCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gc2VxdWVuY2VEZXRlY3RlZChJQ2hhcmFjdGVyU2Nhbm5lciBzY2FubmVyLCBjaGFyW10gc2VxdWVuY2UsIGJvb2xlYW4gZW9mQWxsb3dlZCkgeworICAgICAgICBpbnQgYyA9IHNjYW5uZXIucmVhZCgpOworICAgICAgICBpZiAoc2VxdWVuY2VbMF0gPT0gJzwnKSB7CisgICAgICAgICAgICBpZiAoYyA9PSAnPycpIHsKKyAgICAgICAgICAgICAgICAvLyBwcm9jZXNzaW5nIGluc3RydWN0aW9uIC0gYWJvcnQKKyAgICAgICAgICAgICAgICBzY2FubmVyLnVucmVhZCgpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjID09ICchJykgeworICAgICAgICAgICAgICAgIHNjYW5uZXIudW5yZWFkKCk7CisgICAgICAgICAgICAgICAgLy8gY29tbWVudCAtIGFib3J0CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHNlcXVlbmNlWzBdID09ICc+JykgeworICAgICAgICAgICAgc2Nhbm5lci51bnJlYWQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzdXBlci5zZXF1ZW5jZURldGVjdGVkKHNjYW5uZXIsIHNlcXVlbmNlLCBlb2ZBbGxvd2VkKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuUGF0dGVyblJ1bGUjZW5kU2VxdWVuY2VEZXRlY3RlZChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLklDaGFyYWN0ZXJTY2FubmVyKQorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGVuZFNlcXVlbmNlRGV0ZWN0ZWQoSUNoYXJhY3RlclNjYW5uZXIgc2Nhbm5lcikgeworICAgICAgICBpbnQgYzsKKyAgICAgICAgd2hpbGUgKChjID0gc2Nhbm5lci5yZWFkKCkpICE9IElDaGFyYWN0ZXJTY2FubmVyLkVPRikgeworICAgICAgICAgICAgaWYgKGMgPT0gZkVzY2FwZUNoYXJhY3RlcikgeworICAgICAgICAgICAgICAgIC8vIFNraXAgdGhlIGVzY2FwZWQgY2hhcmFjdGVyLgorICAgICAgICAgICAgICAgIHNjYW5uZXIucmVhZCgpOworICAgICAgICAgICAgfSBlbHNlIGlmIChjID09ICc+JykgeworICAgICAgICAgICAgICAgIGVuZE9mVGFnRGV0ZWN0ZWQoc2Nhbm5lcik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9IAorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBzY2FubmVyLnVucmVhZCgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGVuZE9mVGFnRGV0ZWN0ZWQoSUNoYXJhY3RlclNjYW5uZXIgc2Nhbm5lcikgeworICAgICAgICBpbnQgYzsKKyAgICAgICAgaW50IHNjYW5BaGVhZCA9IDA7CisgICAgICAgIGludCBlbmRPZlRhZ09mZnNldCA9IDA7CisgICAgICAgIHdoaWxlICgoYyA9IHNjYW5uZXIucmVhZCgpKSAhPSBJQ2hhcmFjdGVyU2Nhbm5lci5FT0YgJiYgYyAhPSAnPCcpIHsKKyAgICAgICAgICAgIHNjYW5BaGVhZCsrOworICAgICAgICAgICAgaWYgKGMgPT0gJz4nKSB7CisgICAgICAgICAgICAJZW5kT2ZUYWdPZmZzZXQgPSBzY2FuQWhlYWQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoYyA9PSAnPCcpIHsKKyAgICAgICAgICAgIGludCByZXdpbmQgPSAoc2NhbkFoZWFkIC0gZW5kT2ZUYWdPZmZzZXQpICsgMTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmV3aW5kOyBpKyspIHsKKyAgICAgICAgICAgICAgICBzY2FubmVyLnVucmVhZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSAgICAKK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL3RleHQvWE1MQW5ub3RhdGlvbkhvdmVyLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci90ZXh0L1hNTEFubm90YXRpb25Ib3Zlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzZWQ0NDUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci90ZXh0L1hNTEFubm90YXRpb25Ib3Zlci5qYXZhCkBAIC0wLDAgKzEsMTg0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IudGV4dDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLkFudEVkaXRvck1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmludGVybmFsLnRleHQuaHRtbC5IVE1MUHJpbnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQW5ub3RhdGlvbkhvdmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklBbm5vdGF0aW9uTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlcjsKKworCisvKioKKyAqIERldGVybWluZXMgYWxsIG1hcmtlcnMgZm9yIHRoZSBnaXZlbiBsaW5lIGFuZCBjb2xsZWN0cywgY29uY2F0ZW5hdGVzLCBhbmQgZm9ybXVsYXRlcworICogdGhlaXIgbWVzc2FnZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBYTUxBbm5vdGF0aW9uSG92ZXIgaW1wbGVtZW50cyBJQW5ub3RhdGlvbkhvdmVyIHsKKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBkaXN0YW5jZSB0byB0aGUgcnVsZXIgbGluZS4gCisJICovCisJcHJpdmF0ZSBpbnQgY29tcGFyZVJ1bGVyTGluZShQb3NpdGlvbiBwb3NpdGlvbiwgSURvY3VtZW50IGRvY3VtZW50LCBpbnQgbGluZSkgeworCQkKKwkJaWYgKHBvc2l0aW9uLmdldE9mZnNldCgpID4gLTEgJiYgcG9zaXRpb24uZ2V0TGVuZ3RoKCkgPiAtMSkgeworCQkJdHJ5IHsKKwkJCQlpbnQgeG1sQW5ub3RhdGlvbkxpbmU9IGRvY3VtZW50LmdldExpbmVPZk9mZnNldChwb3NpdGlvbi5nZXRPZmZzZXQoKSk7CisJCQkJaWYgKGxpbmUgPT0geG1sQW5ub3RhdGlvbkxpbmUpCisJCQkJCXJldHVybiAxOworCQkJCWlmICh4bWxBbm5vdGF0aW9uTGluZSA8PSBsaW5lICYmIGxpbmUgPD0gZG9jdW1lbnQuZ2V0TGluZU9mT2Zmc2V0KHBvc2l0aW9uLmdldE9mZnNldCgpICsgcG9zaXRpb24uZ2V0TGVuZ3RoKCkpKQorCQkJCQlyZXR1cm4gMjsKKwkJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIHgpIHsKKwkJCX0KKwkJfQorCQkKKwkJcmV0dXJuIDA7CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgb25lIG1hcmtlciB3aGljaCBpbmNsdWRlcyB0aGUgcnVsZXIncyBsaW5lIG9mIGFjdGl2aXR5LgorCSAqLworCXByaXZhdGUgTGlzdCBnZXRYTUxBbm5vdGF0aW9uc0ZvckxpbmUoSVNvdXJjZVZpZXdlciB2aWV3ZXIsIGludCBsaW5lKSB7CisJCQorCQlJRG9jdW1lbnQgZG9jdW1lbnQ9IHZpZXdlci5nZXREb2N1bWVudCgpOworCQlJQW5ub3RhdGlvbk1vZGVsIG1vZGVsPSB2aWV3ZXIuZ2V0QW5ub3RhdGlvbk1vZGVsKCk7CisJCQorCQlpZiAobW9kZWwgPT0gbnVsbCkKKwkJCXJldHVybiBudWxsOworCQkJCisJCUxpc3QgZXhhY3Q9IG5ldyBBcnJheUxpc3QoKTsKKwkJCisJCUl0ZXJhdG9yIGU9IG1vZGVsLmdldEFubm90YXRpb25JdGVyYXRvcigpOworCQlNYXAgbWVzc2FnZXNBdFBvc2l0aW9uPSBuZXcgSGFzaE1hcCgpOworCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKKwkJCU9iamVjdCBvPSBlLm5leHQoKTsKKwkJCWlmIChvIGluc3RhbmNlb2YgQW5ub3RhdGlvbikgeworCQkJCUFubm90YXRpb24gYT0gKEFubm90YXRpb24pbzsKKwkJCQlQb3NpdGlvbiBwb3NpdGlvbj0gbW9kZWwuZ2V0UG9zaXRpb24oYSk7CisJCQkJaWYgKHBvc2l0aW9uID09IG51bGwpCisJCQkJCWNvbnRpbnVlOworCisJCQkJaWYgKGlzRHVwbGljYXRlWE1MQW5ub3RhdGlvbihtZXNzYWdlc0F0UG9zaXRpb24sIHBvc2l0aW9uLCBhLmdldFRleHQoKSkpCisJCQkJCWNvbnRpbnVlOworCisJCQkJc3dpdGNoIChjb21wYXJlUnVsZXJMaW5lKHBvc2l0aW9uLCBkb2N1bWVudCwgbGluZSkpIHsKKwkJCQkJY2FzZSAxOgorCQkJCQkJZXhhY3QuYWRkKGEpOworCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJCQorCQlyZXR1cm4gZXhhY3Q7CisJfQorCisJcHJpdmF0ZSBib29sZWFuIGlzRHVwbGljYXRlWE1MQW5ub3RhdGlvbihNYXAgbWVzc2FnZXNBdFBvc2l0aW9uLCBQb3NpdGlvbiBwb3NpdGlvbiwgU3RyaW5nIG1lc3NhZ2UpIHsKKwkJaWYgKG1lc3NhZ2VzQXRQb3NpdGlvbi5jb250YWluc0tleShwb3NpdGlvbikpIHsKKwkJCU9iamVjdCB2YWx1ZT0gbWVzc2FnZXNBdFBvc2l0aW9uLmdldChwb3NpdGlvbik7CisJCQlpZiAobWVzc2FnZS5lcXVhbHModmFsdWUpKQorCQkJCXJldHVybiB0cnVlOworCisJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBMaXN0KSB7CisJCQkJTGlzdCBtZXNzYWdlcz0gKExpc3QpdmFsdWU7CisJCQkJaWYgIChtZXNzYWdlcy5jb250YWlucyhtZXNzYWdlKSkgeworCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQl9CisJCQkJbWVzc2FnZXMuYWRkKG1lc3NhZ2UpOworCQkJfSBlbHNlIHsKKwkJCQlBcnJheUxpc3QgbWVzc2FnZXM9IG5ldyBBcnJheUxpc3QoKTsKKwkJCQltZXNzYWdlcy5hZGQodmFsdWUpOworCQkJCW1lc3NhZ2VzLmFkZChtZXNzYWdlKTsKKwkJCQltZXNzYWdlc0F0UG9zaXRpb24ucHV0KHBvc2l0aW9uLCBtZXNzYWdlcyk7CisJCQl9CisJCX0gZWxzZQorCQkJbWVzc2FnZXNBdFBvc2l0aW9uLnB1dChwb3NpdGlvbiwgbWVzc2FnZSk7CisJCXJldHVybiBmYWxzZTsKKwl9CisJCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklBbm5vdGF0aW9uSG92ZXIjZ2V0SG92ZXJJbmZvKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXIsIGludCkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldEhvdmVySW5mbyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgaW50IGxpbmVOdW1iZXIpIHsKKwkJTGlzdCB4bWxBbm5vdGF0aW9ucz0gZ2V0WE1MQW5ub3RhdGlvbnNGb3JMaW5lKHNvdXJjZVZpZXdlciwgbGluZU51bWJlcik7CisJCWlmICh4bWxBbm5vdGF0aW9ucyAhPSBudWxsKSB7CisJCQkKKwkJCWlmICh4bWxBbm5vdGF0aW9ucy5zaXplKCkgPT0gMSkgeworCQkJCQorCQkJCS8vIG9wdGltaXphdGlvbgorCQkJCUFubm90YXRpb24geG1sQW5ub3RhdGlvbj0gKEFubm90YXRpb24peG1sQW5ub3RhdGlvbnMuZ2V0KDApOworCQkJCVN0cmluZyBtZXNzYWdlPSB4bWxBbm5vdGF0aW9uLmdldFRleHQoKTsKKwkJCQlpZiAobWVzc2FnZSAhPSBudWxsICYmIG1lc3NhZ2UudHJpbSgpLmxlbmd0aCgpID4gMCkgeworCQkJCQlyZXR1cm4gZm9ybWF0U2luZ2xlTWVzc2FnZShtZXNzYWdlKTsKKwkJCQl9CisJCQkJCQorCQkJfSBlbHNlIHsKKwkJCQkJCisJCQkJTGlzdCBtZXNzYWdlcz0gbmV3IEFycmF5TGlzdCh4bWxBbm5vdGF0aW9ucy5zaXplKCkpOworCQkJCUl0ZXJhdG9yIGU9IHhtbEFubm90YXRpb25zLml0ZXJhdG9yKCk7CisJCQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7CisJCQkJCUFubm90YXRpb24geG1sQW5ub3RhdGlvbj0gKEFubm90YXRpb24pZS5uZXh0KCk7CisJCQkJCVN0cmluZyBtZXNzYWdlPSB4bWxBbm5vdGF0aW9uLmdldFRleHQoKTsKKwkJCQkJaWYgKG1lc3NhZ2UgIT0gbnVsbCAmJiBtZXNzYWdlLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKKwkJCQkJCW1lc3NhZ2VzLmFkZChtZXNzYWdlLnRyaW0oKSk7CisJCQkJCX0KKwkJCQl9CisJCQkJCisJCQkJaWYgKG1lc3NhZ2VzLnNpemUoKSA9PSAxKSB7CisJCQkJCXJldHVybiBmb3JtYXRTaW5nbGVNZXNzYWdlKChTdHJpbmcpIG1lc3NhZ2VzLmdldCgwKSk7CisJCQkJfQorCQkJCQkKKwkJCQlpZiAobWVzc2FnZXMuc2l6ZSgpID4gMSkgeworCQkJCQlyZXR1cm4gZm9ybWF0TXVsdGlwbGVNZXNzYWdlcyhtZXNzYWdlcyk7CisJCQkJfQorCQkJfQorCQl9CisJCQorCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJLyoKKwkgKiBGb3JtYXRzIGEgbWVzc2FnZSBhcyBIVE1MIHRleHQuCisJICovCisJcHJpdmF0ZSBTdHJpbmcgZm9ybWF0U2luZ2xlTWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgeworCQlTdHJpbmdCdWZmZXIgYnVmZmVyPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJCUhUTUxQcmludGVyLmFkZFBhZ2VQcm9sb2coYnVmZmVyKTsKKwkJSFRNTFByaW50ZXIuYWRkUGFyYWdyYXBoKGJ1ZmZlciwgSFRNTFByaW50ZXIuY29udmVydFRvSFRNTENvbnRlbnQobWVzc2FnZSkpOworCQlIVE1MUHJpbnRlci5hZGRQYWdlRXBpbG9nKGJ1ZmZlcik7CisJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKKwl9CisJCisJLyoKKwkgKiBGb3JtYXRzIHNldmVyYWwgbWVzc2FnZSBhcyBIVE1MIHRleHQuCisJICovCisJcHJpdmF0ZSBTdHJpbmcgZm9ybWF0TXVsdGlwbGVNZXNzYWdlcyhMaXN0IG1lc3NhZ2VzKSB7CisJCVN0cmluZ0J1ZmZlciBidWZmZXI9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJSFRNTFByaW50ZXIuYWRkUGFnZVByb2xvZyhidWZmZXIpOworCQlIVE1MUHJpbnRlci5hZGRQYXJhZ3JhcGgoYnVmZmVyLCBIVE1MUHJpbnRlci5jb252ZXJ0VG9IVE1MQ29udGVudChBbnRFZGl0b3JNZXNzYWdlcy5nZXRTdHJpbmcoIkFudEFubm90YXRpb25Ib3Zlci5tdWx0aXBsZU1hcmtlcnNBdFRoaXNMaW5lIikpKTsgLy8kTk9OLU5MUy0xJAorCQkKKwkJSFRNTFByaW50ZXIuc3RhcnRCdWxsZXRMaXN0KGJ1ZmZlcik7CisJCUl0ZXJhdG9yIGU9IG1lc3NhZ2VzLml0ZXJhdG9yKCk7CisJCXdoaWxlIChlLmhhc05leHQoKSkKKwkJCUhUTUxQcmludGVyLmFkZEJ1bGxldChidWZmZXIsIEhUTUxQcmludGVyLmNvbnZlcnRUb0hUTUxDb250ZW50KChTdHJpbmcpIGUubmV4dCgpKSk7CisJCUhUTUxQcmludGVyLmVuZEJ1bGxldExpc3QoYnVmZmVyKTsJCisJCQorCQlIVE1MUHJpbnRlci5hZGRQYWdlRXBpbG9nKGJ1ZmZlcik7CisJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci90ZXh0L1hNTFByb2JsZW1Bbm5vdGF0aW9uLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci90ZXh0L1hNTFByb2JsZW1Bbm5vdGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAwMTIzYwotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL3RleHQvWE1MUHJvYmxlbUFubm90YXRpb24uamF2YQpAQCAtMCwwICsxLDQxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci50ZXh0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLm1vZGVsLklQcm9ibGVtOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLkFubm90YXRpb247CisKKy8qKgorICogQW5ub3RhdGlvbiByZXByZXNlbnRpbmcgYW4gPGNvZGU+SVByb2JsZW08L2NvZGU+LgorICovCitwdWJsaWMgY2xhc3MgWE1MUHJvYmxlbUFubm90YXRpb24gZXh0ZW5kcyBBbm5vdGF0aW9uIHsKKwkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9BTk5PVEFUSU9OX1RZUEU9ICJvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvci5lcnJvciI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXQVJOSU5HX0FOTk9UQVRJT05fVFlQRT0gIm9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yLndhcm5pbmciOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5GT19BTk5PVEFUSU9OX1RZUEU9ICJvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvci5pbmZvIjsgLy8kTk9OLU5MUy0xJAorCQorCXByaXZhdGUgSVByb2JsZW0gZlByb2JsZW07CisJCisJcHVibGljIFhNTFByb2JsZW1Bbm5vdGF0aW9uKElQcm9ibGVtIHByb2JsZW0pIHsKKwkJCisJCWZQcm9ibGVtPSBwcm9ibGVtOworCQkKKwkJaWYgKGZQcm9ibGVtLmlzRXJyb3IoKSkgeworCQkJc2V0VHlwZShFUlJPUl9BTk5PVEFUSU9OX1RZUEUpOworCQl9IGVsc2UgaWYgKGZQcm9ibGVtLmlzV2FybmluZygpKSB7CisJCQlzZXRUeXBlKFdBUk5JTkdfQU5OT1RBVElPTl9UWVBFKTsKKwkJfSBlbHNlIHsKKwkJCXNldFR5cGUoSU5GT19BTk5PVEFUSU9OX1RZUEUpOworCQl9CQorCQkKKwkJc2V0VGV4dChmUHJvYmxlbS5nZXRNZXNzYWdlKCkpOworCX0KK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL3RleHQvWE1MUmVjb25jaWxpbmdTdHJhdGVneS5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvdGV4dC9YTUxSZWNvbmNpbGluZ1N0cmF0ZWd5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBjMGY1MQotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL3RleHQvWE1MUmVjb25jaWxpbmdTdHJhdGVneS5qYXZhCkBAIC0wLDAgKzEsOTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLnRleHQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuQW50VUlQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5BbnRFZGl0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLm1vZGVsLkFudE1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5tb2RlbC5JQW50TW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5EaXJ0eVJlZ2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuSVJlY29uY2lsaW5nU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLklSZWNvbmNpbGluZ1N0cmF0ZWd5RXh0ZW5zaW9uOworCitwdWJsaWMgY2xhc3MgWE1MUmVjb25jaWxpbmdTdHJhdGVneSBpbXBsZW1lbnRzIElSZWNvbmNpbGluZ1N0cmF0ZWd5LCBJUmVjb25jaWxpbmdTdHJhdGVneUV4dGVuc2lvbiB7CisKKwkvKioKKwkgKiBIb3cgbG9uZyB0aGUgcmVjb25jaWxlciB3aWxsIHdhaXQgZm9yIGZ1cnRoZXIgdGV4dCBjaGFuZ2VzIGJlZm9yZQorCSAqIHJlY29uY2lsaW5nCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVMQVk9IDUwMDsKKworCXByaXZhdGUgQW50RWRpdG9yIGZFZGl0b3I7CisKKwlwdWJsaWMgWE1MUmVjb25jaWxpbmdTdHJhdGVneShBbnRFZGl0b3IgZWRpdG9yKSB7CisJCWZFZGl0b3I9IGVkaXRvcjsKKwl9CisKKwlwcml2YXRlIHZvaWQgaW50ZXJuYWxSZWNvbmNpbGUoKSB7CisJCXRyeSB7CisgICAgICAgICAgICBJQW50TW9kZWwgbW9kZWw9IGZFZGl0b3IuZ2V0QW50TW9kZWwoKTsKKwkJCWlmIChtb2RlbCBpbnN0YW5jZW9mIEFudE1vZGVsKSB7CisJCQkJKChBbnRNb2RlbCltb2RlbCkucmVjb25jaWxlKCk7CisJCQl9CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlBbnRVSVBsdWdpbi5sb2coZSk7CisJCX0KKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5JUmVjb25jaWxpbmdTdHJhdGVneSNyZWNvbmNpbGUob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uKQorCSAqLworCXB1YmxpYyB2b2lkIHJlY29uY2lsZShJUmVnaW9uIHBhcnRpdGlvbikgeworCQlpbnRlcm5hbFJlY29uY2lsZSgpOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLklSZWNvbmNpbGluZ1N0cmF0ZWd5I3JlY29uY2lsZShvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuRGlydHlSZWdpb24sCisJICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb24pCisJICovCisJcHVibGljIHZvaWQgcmVjb25jaWxlKERpcnR5UmVnaW9uIGRpcnR5UmVnaW9uLCBJUmVnaW9uIHN1YlJlZ2lvbikgeworCQlpbnRlcm5hbFJlY29uY2lsZSgpOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLklSZWNvbmNpbGluZ1N0cmF0ZWd5I3NldERvY3VtZW50KG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50KQorCSAqLworCXB1YmxpYyB2b2lkIHNldERvY3VtZW50KElEb2N1bWVudCBkb2N1bWVudCkgeworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLklSZWNvbmNpbGluZ1N0cmF0ZWd5RXh0ZW5zaW9uI3NldFByb2dyZXNzTW9uaXRvcihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRQcm9ncmVzc01vbml0b3IoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuSVJlY29uY2lsaW5nU3RyYXRlZ3lFeHRlbnNpb24jaW5pdGlhbFJlY29uY2lsZSgpCisJICovCisJcHVibGljIHZvaWQgaW5pdGlhbFJlY29uY2lsZSgpIHsKKwkJaW50ZXJuYWxSZWNvbmNpbGUoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci91dGlscy9Qcm9qZWN0SGVscGVyTWVzc2FnZXMuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL3V0aWxzL1Byb2plY3RIZWxwZXJNZXNzYWdlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzNzcxYzcKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci91dGlscy9Qcm9qZWN0SGVscGVyTWVzc2FnZXMuamF2YQpAQCAtMCwwICsxLDIzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCisgKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKKyAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6IAorICogSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci51dGlsczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CisKK3B1YmxpYyBjbGFzcyBQcm9qZWN0SGVscGVyTWVzc2FnZXMgZXh0ZW5kcyBOTFMgeworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLnV0aWxzLlByb2plY3RIZWxwZXJNZXNzYWdlcyI7Ly8kTk9OLU5MUy0xJAorCQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2plY3RIZWxwZXJfMDsKKworCXN0YXRpYyB7CisJCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQorCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBQcm9qZWN0SGVscGVyTWVzc2FnZXMuY2xhc3MpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci91dGlscy9Qcm9qZWN0SGVscGVyTWVzc2FnZXMucHJvcGVydGllcyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL3V0aWxzL1Byb2plY3RIZWxwZXJNZXNzYWdlcy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzNTRkY2MKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci91dGlscy9Qcm9qZWN0SGVscGVyTWVzc2FnZXMucHJvcGVydGllcwpAQCAtMCwwICsxLDExIEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyMKKyMgQ29udHJpYnV0b3JzOgorIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitQcm9qZWN0SGVscGVyXzA9WE1MIFBhcnNlciBjb3VsZCBub3QgYmUgY3JlYXRlZApkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgUnVubmVyIFN1cHBvcnQvTUVUQS1JTkYvZWNsaXBzZS5pbmYgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBSdW5uZXIgU3VwcG9ydC9NRVRBLUlORi9lY2xpcHNlLmluZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGRmM2FiCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgUnVubmVyIFN1cHBvcnQvTUVUQS1JTkYvZWNsaXBzZS5pbmYKQEAgLTAsMCArMSBAQAoramFycHJvY2Vzc29yLmV4Y2x1ZGUuc2lnbj10cnVlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgUnVubmVyIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2FudHN1cHBvcnQvQW50U3VwcG9ydE1lc3NhZ2VzLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBSdW5uZXIgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvYW50c3VwcG9ydC9BbnRTdXBwb3J0TWVzc2FnZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Njc5NDMwCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgUnVubmVyIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2FudHN1cHBvcnQvQW50U3VwcG9ydE1lc3NhZ2VzLmphdmEKQEAgLTAsMCArMSwyNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcworICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCisgKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOiAKKyAqIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5hbnRzdXBwb3J0OworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKKworcHVibGljIGNsYXNzIEFudFN1cHBvcnRNZXNzYWdlcyBleHRlbmRzIE5MUyB7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5hbnRzdXBwb3J0LkFudFN1cHBvcnRNZXNzYWdlcyI7Ly8kTk9OLU5MUy0xJAorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgQW50SW5wdXRIYW5kbGVyX0FudF9JbnB1dF9SZXF1ZXN0XzE7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQW50SW5wdXRIYW5kbGVyX0ludmFsaWRfaW5wdXRfMjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRJbnB1dEhhbmRsZXJfVW5hYmxlX3RvX3Jlc3BvbmRfdG9fX2lucHV0X19yZXF1ZXN0XzQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQW50SW5wdXRIYW5kbGVyXzU7CisKKwlzdGF0aWMgeworCQkvLyBsb2FkIG1lc3NhZ2UgdmFsdWVzIGZyb20gYnVuZGxlIGZpbGUKKwkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgQW50U3VwcG9ydE1lc3NhZ2VzLmNsYXNzKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgUnVubmVyIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2FudHN1cHBvcnQvQW50U3VwcG9ydE1lc3NhZ2VzLnByb3BlcnRpZXMgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBSdW5uZXIgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvYW50c3VwcG9ydC9BbnRTdXBwb3J0TWVzc2FnZXMucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTNiZmYwCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgUnVubmVyIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2FudHN1cHBvcnQvQW50U3VwcG9ydE1lc3NhZ2VzLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxNSBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisjIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjCisjIENvbnRyaWJ1dG9yczoKKyMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitBbnRJbnB1dEhhbmRsZXJfQW50X0lucHV0X1JlcXVlc3RfMT1BbnQgSW5wdXQgUmVxdWVzdAorQW50SW5wdXRIYW5kbGVyX0ludmFsaWRfaW5wdXRfMj1JbnB1dCBkb2VzIG5vdCBtYXRjaCB2YWxpZGFyZ3MgYXR0cmlidXRlCitBbnRJbnB1dEhhbmRsZXJfVW5hYmxlX3RvX3Jlc3BvbmRfdG9fX2lucHV0X19yZXF1ZXN0XzQ9VW5hYmxlIHRvIHJlc3BvbmQgdG8gPGlucHV0PiByZXF1ZXN0CitBbnRJbnB1dEhhbmRsZXJfNT1VbmFibGUgdG8gcmVzcG9uZCB0byBpbnB1dCByZXF1ZXN0IGFzIGEgcmVzdWx0IG9mIHRoZSB1c2VyIHNwZWNpZmllZCAtbm9pbnB1dCBjb21tYW5kCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9BbnREb3VibGVDbGlja1N0cmF0ZWd5LmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9BbnREb3VibGVDbGlja1N0cmF0ZWd5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ1NTRjZgotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL0FudERvdWJsZUNsaWNrU3RyYXRlZ3kuamF2YQpAQCAtMCwwICsxLDM1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpOworCitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci50ZXh0LlhNTFRleHRIb3ZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dERvdWJsZUNsaWNrU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKKworcHVibGljIGNsYXNzIEFudERvdWJsZUNsaWNrU3RyYXRlZ3kgaW1wbGVtZW50cyBJVGV4dERvdWJsZUNsaWNrU3RyYXRlZ3kgeworCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dERvdWJsZUNsaWNrU3RyYXRlZ3kjZG91YmxlQ2xpY2tlZChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyKQorCSAqLworCXB1YmxpYyB2b2lkIGRvdWJsZUNsaWNrZWQoSVRleHRWaWV3ZXIgdGV4dFZpZXdlcikgeworCQlpbnQgb2Zmc2V0PSB0ZXh0Vmlld2VyLmdldFNlbGVjdGVkUmFuZ2UoKS54OworCisJCWlmIChvZmZzZXQgPCAwKSB7CisJCQlyZXR1cm47CisJCX0KKwkJSVJlZ2lvbiByZWdpb249IFhNTFRleHRIb3Zlci5nZXRSZWdpb24odGV4dFZpZXdlciwgb2Zmc2V0KTsKKwkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7CisJCQl0ZXh0Vmlld2VyLnNldFNlbGVjdGVkUmFuZ2UocmVnaW9uLmdldE9mZnNldCgpLCByZWdpb24uZ2V0TGVuZ3RoKCkpOworCQl9CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL0FudEltYWdlRGVzY3JpcHRvci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvQW50SW1hZ2VEZXNjcmlwdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFhMmQ5MgotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL0FudEltYWdlRGVzY3JpcHRvci5qYXZhCkBAIC0wLDAgKzEsMTM1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogICAgIEpvaG4tTWFzb24gUC4gU2hhY2tlbGZvcmQgKGpvaG4tbWFzb24uc2hhY2tlbGZvcmRAcGVhcnNvbi5jb20pIC0gYnVnIDQ5NDQ1CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuQ29tcG9zaXRlSW1hZ2VEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2VEYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKKworLyoqCisgKiBBIGltYWdlIGRlc2NyaXB0b3IgY29uc2lzdGluZyBvZiBhIG1haW4gaWNvbiBhbmQgc2V2ZXJhbCBhZG9ybm1lbnRzLiBUaGUgYWRvcm5tZW50cworICogYXJlIGNvbXB1dGVkIGFjY29yZGluZyB0byBmbGFncyBzZXQgb24gY3JlYXRpb24gb2YgdGhlIGRlc2NyaXB0b3IuCisgKi8KK3B1YmxpYyBjbGFzcyBBbnRJbWFnZURlc2NyaXB0b3IgZXh0ZW5kcyBDb21wb3NpdGVJbWFnZURlc2NyaXB0b3IgeworCQorCS8qKiBGbGFnIHRvIHJlbmRlciBhbiBlcnJvciBhZG9ybm1lbnQgKi8KKwlwdWJsaWMgZmluYWwgc3RhdGljIGludCBIQVNfRVJST1JTPSAweDAwMDE7CisKKwkvKiogRmxhZyB0byByZW5kZXIgYW4gaW1wb3J0ZWQgYWRvcm5tZW50ICovCisJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgSU1QT1JURUQ9IDB4MDAwMjsKKwkKKwkvKiogRmxhZyB0byByZW5kZXIgYW4gd2FybmluZyBhZG9ybm1lbnQgKi8KKwlwdWJsaWMgZmluYWwgc3RhdGljIGludCBIQVNfV0FSTklOR1M9IDB4MDAwNDsKKwkKKwlwcml2YXRlIEltYWdlRGVzY3JpcHRvciBmQmFzZUltYWdlOworCXByaXZhdGUgaW50IGZGbGFnczsKKwlwcml2YXRlIFBvaW50IGZTaXplOworCisJLyoqCisJICogQ3JlYXRlIGEgbmV3IEFudEltYWdlRGVzY3JpcHRvci4KKwkgKiAKKwkgKiBAcGFyYW0gYmFzZUltYWdlIGFuIGltYWdlIGRlc2NyaXB0b3IgdXNlZCBhcyB0aGUgYmFzZSBpbWFnZQorCSAqIEBwYXJhbSBmbGFncyBmbGFncyBpbmRpY2F0aW5nIHdoaWNoIGFkb3JubWVudHMgYXJlIHRvIGJlIHJlbmRlcmVkCisJICogCisJICovCisJcHVibGljIEFudEltYWdlRGVzY3JpcHRvcihJbWFnZURlc2NyaXB0b3IgYmFzZUltYWdlLCBpbnQgZmxhZ3MpIHsKKwkJc2V0QmFzZUltYWdlKGJhc2VJbWFnZSk7CisJCXNldEZsYWdzKGZsYWdzKTsKKwl9CisJCisJLyoqCisJICogQHNlZSBDb21wb3NpdGVJbWFnZURlc2NyaXB0b3IjZ2V0U2l6ZSgpCisJICovCisJcHJvdGVjdGVkIFBvaW50IGdldFNpemUoKSB7CisJCWlmIChmU2l6ZSA9PSBudWxsKSB7CisJCQlJbWFnZURhdGEgZGF0YT0gZ2V0QmFzZUltYWdlKCkuZ2V0SW1hZ2VEYXRhKCk7CisJCQlzZXRTaXplKG5ldyBQb2ludChkYXRhLndpZHRoLCBkYXRhLmhlaWdodCkpOworCQl9CisJCXJldHVybiBmU2l6ZTsKKwl9CisJCisJLyoqCisJICogQHNlZSBPYmplY3QjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisJICovCisJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgQW50SW1hZ2VEZXNjcmlwdG9yKSl7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJCQorCQlBbnRJbWFnZURlc2NyaXB0b3Igb3RoZXI9IChBbnRJbWFnZURlc2NyaXB0b3Ipb2JqZWN0OworCQlyZXR1cm4gKGdldEJhc2VJbWFnZSgpLmVxdWFscyhvdGhlci5nZXRCYXNlSW1hZ2UoKSkgJiYgZ2V0RmxhZ3MoKSA9PSBvdGhlci5nZXRGbGFncygpKTsKKwl9CisJCisJLyoqCisJICogQHNlZSBPYmplY3QjaGFzaENvZGUoKQorCSAqLworCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisJCXJldHVybiBnZXRCYXNlSW1hZ2UoKS5oYXNoQ29kZSgpIHwgZ2V0RmxhZ3MoKTsKKwl9CisJCisJLyoqCisJICogQHNlZSBDb21wb3NpdGVJbWFnZURlc2NyaXB0b3IjZHJhd0NvbXBvc2l0ZUltYWdlKGludCwgaW50KQorCSAqLworCXByb3RlY3RlZCB2b2lkIGRyYXdDb21wb3NpdGVJbWFnZShpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKwkJSW1hZ2VEYXRhIGJnPSBnZXRCYXNlSW1hZ2UoKS5nZXRJbWFnZURhdGEoKTsKKwkJaWYgKGJnID09IG51bGwpIHsKKwkJCWJnPSBERUZBVUxUX0lNQUdFX0RBVEE7CisJCX0KKwkJZHJhd0ltYWdlKGJnLCAwLCAwKTsKKwkJZHJhd092ZXJsYXlzKCk7CisJfQorCisJLyoqCisJICogQWRkIGFueSBvdmVybGF5cyB0byB0aGUgaW1hZ2UgYXMgc3BlY2lmaWVkIGluIHRoZSBmbGFncy4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBkcmF3T3ZlcmxheXMoKSB7CisJCWludCBmbGFncz0gZ2V0RmxhZ3MoKTsKKwkJaW50IHk9IDA7CisJCUltYWdlRGF0YSBkYXRhPSBudWxsOworCQlpZiAoKGZsYWdzICYgSU1QT1JURUQpICE9IDApIHsKKwkJCWRhdGE9IEFudFVJSW1hZ2VzLmdldEltYWdlRGVzY3JpcHRvcihJQW50VUlDb25zdGFudHMuSU1HX09WUl9JTVBPUlQpLmdldEltYWdlRGF0YSgpOworCQkJZHJhd0ltYWdlKGRhdGEsIDAsIDApOworCQl9CisJCWlmICgoZmxhZ3MgJiBIQVNfRVJST1JTKSAhPSAwKSB7CisJCQl5PSBnZXRTaXplKCkueTsKKwkJCWRhdGE9IEFudFVJSW1hZ2VzLmdldEltYWdlRGVzY3JpcHRvcihJQW50VUlDb25zdGFudHMuSU1HX09WUl9FUlJPUikuZ2V0SW1hZ2VEYXRhKCk7CisJCQl5IC09IGRhdGEuaGVpZ2h0OworCQkJZHJhd0ltYWdlKGRhdGEsIDAsIHkpOworCQl9IGVsc2UgaWYgKChmbGFncyAmIEhBU19XQVJOSU5HUykgIT0gMCkgeworCQkJeT0gZ2V0U2l6ZSgpLnk7CisJCQlkYXRhPSBBbnRVSUltYWdlcy5nZXRJbWFnZURlc2NyaXB0b3IoSUFudFVJQ29uc3RhbnRzLklNR19PVlJfV0FSTklORykuZ2V0SW1hZ2VEYXRhKCk7CisJCQl5IC09IGRhdGEuaGVpZ2h0OworCQkJZHJhd0ltYWdlKGRhdGEsIDAsIHkpOworCQl9CisJfQorCQorCXByb3RlY3RlZCBJbWFnZURlc2NyaXB0b3IgZ2V0QmFzZUltYWdlKCkgeworCQlyZXR1cm4gZkJhc2VJbWFnZTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBzZXRCYXNlSW1hZ2UoSW1hZ2VEZXNjcmlwdG9yIGJhc2VJbWFnZSkgeworCQlmQmFzZUltYWdlID0gYmFzZUltYWdlOworCX0KKworCXByb3RlY3RlZCBpbnQgZ2V0RmxhZ3MoKSB7CisJCXJldHVybiBmRmxhZ3M7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgc2V0RmxhZ3MoaW50IGZsYWdzKSB7CisJCWZGbGFncyA9IGZsYWdzOworCX0KKworCXByb3RlY3RlZCB2b2lkIHNldFNpemUoUG9pbnQgc2l6ZSkgeworCQlmU2l6ZSA9IHNpemU7CisJfQorfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvQW50UHJvcGVydHlWYWx1ZVByb3ZpZGVyLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9BbnRQcm9wZXJ0eVZhbHVlUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzI1YmNjCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvQW50UHJvcGVydHlWYWx1ZVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw1NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5jb3JlLklBbnRQcm9wZXJ0eVZhbHVlUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOworCisvKioKKyAqIER5bmFtaWMgcHJvdmlkZXIgZm9yIEFudCBwcm9wZXJ0aWVzLgorICogCisgKiBQcm92aWRlcyB0aGUgZHluYW1pYyB2YWx1ZXMgZm9yIHRoZSBmb2xsb3dpbmcgQW50IHByb3BlcnRpZXM6CisgKiAKKyAqIDx1bD4KKyAqIDxsaT48Y29kZT5lY2xpcHNlLnRhcmdldDwvY29kZT4gLSBzZXQgdG8gdGhlIEVjbGlwc2UgdGFyZ2V0IHBsYXRmb3JtIGxvY2F0aW9uPC9saT4KKyAqIDwvdWw+CisgKiAKKyAqIEBzaW5jZSAzLjEKKyAqLworcHVibGljIGNsYXNzIEFudFByb3BlcnR5VmFsdWVQcm92aWRlciBpbXBsZW1lbnRzIElBbnRQcm9wZXJ0eVZhbHVlUHJvdmlkZXIgeworCS8qKgorCSAqIFJldHVybnMgdGhlIGR5bmFtaWMgcHJvcGVydHkgdmFsdWVzIGZvciBBbnQgcHJvcGVydGllcy4KKwkgKiAKKwkgKiBAcGFyYW0gcHJvcGVydHlOYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byByZXNvbHZlIHRoZSB2YWx1ZSBmb3IKKwkgKiBAcmV0dXJuIFRoZSByZXNvbHZlZCB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5CisJICogQHNlZSBvcmcuZWNsaXBzZS5hbnQuY29yZS5JQW50UHJvcGVydHlWYWx1ZVByb3ZpZGVyI2dldEFudFByb3BlcnR5VmFsdWUoU3RyaW5nKQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0QW50UHJvcGVydHlWYWx1ZShTdHJpbmcgcHJvcGVydHlOYW1lKSB7CisJCVN0cmluZyB2YWx1ZSA9IG51bGw7CisJCWlmICgiZWNsaXBzZS50YXJnZXQiLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCXRyeSB7CisJCQkgICAgSVBhdGggaG9tZT0gSmF2YUNvcmUuZ2V0Q2xhc3NwYXRoVmFyaWFibGUoIkVDTElQU0VfSE9NRSIpOyAvLyROT04tTkxTLTEkCisJCQkgICAgaWYgKGhvbWUgIT0gbnVsbCkgeworCQkJICAgIAl2YWx1ZSA9IGhvbWUudG9GaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCk7CisJCQkgICAgCWlmICh2YWx1ZS5lbmRzV2l0aCgiLyIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCSAgICAJCXZhbHVlID0gdmFsdWUuc3Vic3RyaW5nKDAsIHZhbHVlLmxlbmd0aCgpIC0gMSk7CisJCQkgICAgCX0KKwkJCSAgICB9CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCUFudFVJUGx1Z2luLmxvZyhlKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gdmFsdWU7CisJfQorfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvQW50UnVubmVyV29ya2JlbmNoQWR2aXNvci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvQW50UnVubmVyV29ya2JlbmNoQWR2aXNvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiNmZjNTUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9BbnRSdW5uZXJXb3JrYmVuY2hBZHZpc29yLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5jb3JlLkFudFJ1bm5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uV29ya2JlbmNoQWR2aXNvcjsKKworLyoqCisgKiBXb3JrYmVuY2ggYWR2aXNvciB0byBydW4gYW4gYW50IHNjcmlwdCBhZnRlciBzdGFydGluZyB0aGUgd29ya2JlbmNoIGFuZAorICogdGhlbiBleGl0IHRoZSB3b3JrYmVuY2guIFVzZWQgd2l0aCB7QGxpbmsgV29ya2JlbmNoQW50UnVubmVyfS4KKyAqIAorICogQHNpbmNlIDMuNAorICovCitwdWJsaWMgY2xhc3MgQW50UnVubmVyV29ya2JlbmNoQWR2aXNvciBleHRlbmRzIFdvcmtiZW5jaEFkdmlzb3IgeworCQorCXByaXZhdGUgT2JqZWN0IGZDb250ZXh0OworCisJcHJvdGVjdGVkIEFudFJ1bm5lcldvcmtiZW5jaEFkdmlzb3IoT2JqZWN0IGNvbnRleHQpIHsKKwkJZkNvbnRleHQgPSBjb250ZXh0OworCX0KKwkKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5Xb3JrYmVuY2hBZHZpc29yI2dldEluaXRpYWxXaW5kb3dQZXJzcGVjdGl2ZUlkKCkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldEluaXRpYWxXaW5kb3dQZXJzcGVjdGl2ZUlkKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5Xb3JrYmVuY2hBZHZpc29yI3ByZVN0YXJ0dXAoKQorCSAqLworCXB1YmxpYyB2b2lkIHByZVN0YXJ0dXAoKSB7CisJCXRyeSB7CisJCQluZXcgQW50UnVubmVyKCkucnVuKGZDb250ZXh0KTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCUFudFVJUGx1Z2luLmxvZyhlKTsKKwkJfQorCQl0cnkgeworCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnNhdmUodHJ1ZSwgbnVsbCk7CisJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJQW50VUlQbHVnaW4ubG9nKGUuZ2V0U3RhdHVzKCkpOworCQl9CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uV29ya2JlbmNoQWR2aXNvciNvcGVuV2luZG93cygpCisJICovCisJcHVibGljIGJvb2xlYW4gb3BlbldpbmRvd3MoKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CQorCit9CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9BbnRTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9BbnRTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzczOTFhMwotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL0FudFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24uamF2YQpAQCAtMCwwICsxLDIxMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IudGV4dC5BbnREb2N1bWVudFNldHVwUGFydGljaXBhbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci50ZXh0LkFudEVkaXRvclBhcnRpdGlvblNjYW5uZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci50ZXh0LkFudEVkaXRvclByb2NJbnN0clNjYW5uZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci50ZXh0LkFudEVkaXRvclRhZ1NjYW5uZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci50ZXh0LklBbnRFZGl0b3JDb2xvckNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLnRleHQuTXVsdGlsaW5lRGFtYWdlclJlcGFpcmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5BbnRFZGl0b3JQcmVmZXJlbmNlQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5TdHJpbmdDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dERvdWJsZUNsaWNrU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucHJlc2VudGF0aW9uLklQcmVzZW50YXRpb25SZWNvbmNpbGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucHJlc2VudGF0aW9uLlByZXNlbnRhdGlvblJlY29uY2lsZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC5UZXh0U291cmNlVmlld2VyQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkFic3RyYWN0RGVjb3JhdGVkVGV4dEVkaXRvclByZWZlcmVuY2VDb25zdGFudHM7CisKK3B1YmxpYyBjbGFzcyBBbnRTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIGV4dGVuZHMgVGV4dFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24geworCisJcHJpdmF0ZSBBbnRFZGl0b3JUYWdTY2FubmVyIHRhZ1NjYW5uZXI7CisgICAgcHJpdmF0ZSBBbnRFZGl0b3JQcm9jSW5zdHJTY2FubmVyIGluc3RydWN0aW9uU2Nhbm5lcjsKKwlwcml2YXRlIE11bHRpbGluZURhbWFnZXJSZXBhaXJlciBkYW1hZ2VSZXBhaXJlcjsKKwlwcml2YXRlIE11bHRpbGluZURhbWFnZXJSZXBhaXJlciBkdGREYW1hZ2VSZXBhaXJlcjsKKwlwcml2YXRlIFRleHRBdHRyaWJ1dGUgeG1sQ29tbWVudEF0dHJpYnV0ZTsKKwlwcml2YXRlIFRleHRBdHRyaWJ1dGUgeG1sRHRkQXR0cmlidXRlOworCQorICAgIHB1YmxpYyBBbnRTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKCkgeworICAgICAgICBzdXBlcihBbnRVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0Q29tYmluZWRQcmVmZXJlbmNlU3RvcmUoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBBbnRFZGl0b3JQcm9jSW5zdHJTY2FubmVyIGdldERlZmF1bHRTY2FubmVyKCkgeworCSAgICBpZiAoaW5zdHJ1Y3Rpb25TY2FubmVyID09IG51bGwpIHsKKwkgICAgICAgIGluc3RydWN0aW9uU2Nhbm5lciA9IG5ldyBBbnRFZGl0b3JQcm9jSW5zdHJTY2FubmVyKCk7CisJICAgIH0KKwkgICAgcmV0dXJuIGluc3RydWN0aW9uU2Nhbm5lcjsKKwl9CisKKwlwcml2YXRlIEFudEVkaXRvclRhZ1NjYW5uZXIgZ2V0VGFnU2Nhbm5lcigpIHsKKwkgICAgaWYgKHRhZ1NjYW5uZXIgPT0gbnVsbCkgeworCSAgICAgICAgdGFnU2Nhbm5lciA9IG5ldyBBbnRFZGl0b3JUYWdTY2FubmVyKCk7CisJICAgIH0KKwkgICAgcmV0dXJuIHRhZ1NjYW5uZXI7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiNnZXRQcmVzZW50YXRpb25SZWNvbmNpbGVyKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXIpCisJICovCisJcHVibGljIElQcmVzZW50YXRpb25SZWNvbmNpbGVyIGdldFByZXNlbnRhdGlvblJlY29uY2lsZXIoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKKwkgICAgUHJlc2VudGF0aW9uUmVjb25jaWxlciByZWNvbmNpbGVyID0gbmV3IFByZXNlbnRhdGlvblJlY29uY2lsZXIoKTsKKwkgICAgcmVjb25jaWxlci5zZXREb2N1bWVudFBhcnRpdGlvbmluZyhnZXRDb25maWd1cmVkRG9jdW1lbnRQYXJ0aXRpb25pbmcoc291cmNlVmlld2VyKSk7CisJICAgIAorCQlNdWx0aWxpbmVEYW1hZ2VyUmVwYWlyZXIgZHIgPSBuZXcgTXVsdGlsaW5lRGFtYWdlclJlcGFpcmVyKGdldERlZmF1bHRTY2FubmVyKCkpOworCSAgICByZWNvbmNpbGVyLnNldERhbWFnZXIoZHIsIElEb2N1bWVudC5ERUZBVUxUX0NPTlRFTlRfVFlQRSk7CisJICAgIHJlY29uY2lsZXIuc2V0UmVwYWlyZXIoZHIsIElEb2N1bWVudC5ERUZBVUxUX0NPTlRFTlRfVFlQRSk7CisJCisJICAgIGRyID0gbmV3IE11bHRpbGluZURhbWFnZXJSZXBhaXJlcihnZXRUYWdTY2FubmVyKCkpOworCSAgICByZWNvbmNpbGVyLnNldERhbWFnZXIoZHIsIEFudEVkaXRvclBhcnRpdGlvblNjYW5uZXIuWE1MX1RBRyk7CisJICAgIHJlY29uY2lsZXIuc2V0UmVwYWlyZXIoZHIsIEFudEVkaXRvclBhcnRpdGlvblNjYW5uZXIuWE1MX1RBRyk7CisJCisJICAgIGludCBzdHlsZT0gZ2V0U3R5bGUoSUFudEVkaXRvckNvbG9yQ29uc3RhbnRzLlhNTF9DT01NRU5UX0NPTE9SKTsKKwkgICAgeG1sQ29tbWVudEF0dHJpYnV0ZT0gIG5ldyBUZXh0QXR0cmlidXRlKEFudFVJUGx1Z2luLmdldFByZWZlcmVuY2VDb2xvcihJQW50RWRpdG9yQ29sb3JDb25zdGFudHMuWE1MX0NPTU1FTlRfQ09MT1IpLCBudWxsLCBzdHlsZSk7CisJCWRhbWFnZVJlcGFpcmVyPSBuZXcgTXVsdGlsaW5lRGFtYWdlclJlcGFpcmVyKG51bGwsIHhtbENvbW1lbnRBdHRyaWJ1dGUpOworCSAgICByZWNvbmNpbGVyLnNldERhbWFnZXIoZGFtYWdlUmVwYWlyZXIsIEFudEVkaXRvclBhcnRpdGlvblNjYW5uZXIuWE1MX0NPTU1FTlQpOworCSAgICByZWNvbmNpbGVyLnNldFJlcGFpcmVyKGRhbWFnZVJlcGFpcmVyLCBBbnRFZGl0b3JQYXJ0aXRpb25TY2FubmVyLlhNTF9DT01NRU5UKTsKKwkgICAgCisJICAgIHN0eWxlPSBnZXRTdHlsZShJQW50RWRpdG9yQ29sb3JDb25zdGFudHMuWE1MX0RURF9DT0xPUik7CisJICAgIHhtbER0ZEF0dHJpYnV0ZT0gIG5ldyBUZXh0QXR0cmlidXRlKEFudFVJUGx1Z2luLmdldFByZWZlcmVuY2VDb2xvcihJQW50RWRpdG9yQ29sb3JDb25zdGFudHMuWE1MX0RURF9DT0xPUiksIG51bGwsIHN0eWxlKTsKKwkJZHRkRGFtYWdlUmVwYWlyZXI9IG5ldyBNdWx0aWxpbmVEYW1hZ2VyUmVwYWlyZXIobnVsbCwgeG1sRHRkQXR0cmlidXRlKTsKKwkgICAgcmVjb25jaWxlci5zZXREYW1hZ2VyKGR0ZERhbWFnZVJlcGFpcmVyLCBBbnRFZGl0b3JQYXJ0aXRpb25TY2FubmVyLlhNTF9EVEQpOworCSAgICByZWNvbmNpbGVyLnNldFJlcGFpcmVyKGR0ZERhbWFnZVJlcGFpcmVyLCBBbnRFZGl0b3JQYXJ0aXRpb25TY2FubmVyLlhNTF9EVEQpOworCQorCSAgICByZXR1cm4gcmVjb25jaWxlcjsKKwl9CisKKwlwcml2YXRlIGludCBnZXRTdHlsZShTdHJpbmcgcHJlZikgeworCQlpbnQgc3R5bGU9IFNXVC5OT1JNQUw7CisJICAgIGlmIChmUHJlZmVyZW5jZVN0b3JlLmdldEJvb2xlYW4ocHJlZiArIEFudEVkaXRvclByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0JPTERfU1VGRklYKSkgeworCSAgICAJc3R5bGUgfD0gU1dULkJPTEQ7CisJICAgIH0KKwkgICAgaWYgKGZQcmVmZXJlbmNlU3RvcmUuZ2V0Qm9vbGVhbihwcmVmICsgQW50RWRpdG9yUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSVRBTElDX1NVRkZJWCkpIHsKKwkgICAgCXN0eWxlIHw9IFNXVC5JVEFMSUM7CisJICAgIH0KKwkJcmV0dXJuIHN0eWxlOworCX0KKworCS8qKgorCSAqIFByZWZlcmVuY2UgY29sb3JzIGhhdmUgY2hhbmdlZC4gIAorCSAqIFVwZGF0ZSB0aGUgZGVmYXVsdCB0b2tlbnMgb2YgdGhlIHNjYW5uZXJzLgorCSAqLworCXB1YmxpYyB2b2lkIGFkYXB0VG9QcmVmZXJlbmNlQ2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKKwkJaWYgKHRhZ1NjYW5uZXIgPT0gbnVsbCkgeworCQkJcmV0dXJuOyAvL3Byb3BlcnR5IGNoYW5nZSBiZWZvcmUgdGhlIGVkaXRvciBpcyBmdWxseSBjcmVhdGVkCisJCX0KKwkJdGFnU2Nhbm5lci5hZGFwdFRvUHJlZmVyZW5jZUNoYW5nZShldmVudCk7CisJCWluc3RydWN0aW9uU2Nhbm5lci5hZGFwdFRvUHJlZmVyZW5jZUNoYW5nZShldmVudCk7CisJCVN0cmluZyBwcm9wZXJ0eT0gZXZlbnQuZ2V0UHJvcGVydHkoKTsKKwkJaWYgKHByb3BlcnR5LnN0YXJ0c1dpdGgoSUFudEVkaXRvckNvbG9yQ29uc3RhbnRzLlhNTF9DT01NRU5UX0NPTE9SKSkgeworCQkJeG1sQ29tbWVudEF0dHJpYnV0ZT0gYWRhcHRUZXh0QXR0cmlidXRlKGV2ZW50LCBwcm9wZXJ0eSwgeG1sQ29tbWVudEF0dHJpYnV0ZSwgZGFtYWdlUmVwYWlyZXIpOworCQl9IGVsc2UgaWYgKHByb3BlcnR5LnN0YXJ0c1dpdGgoSUFudEVkaXRvckNvbG9yQ29uc3RhbnRzLlhNTF9EVERfQ09MT1IpKSB7CisJCQl4bWxEdGRBdHRyaWJ1dGU9IGFkYXB0VGV4dEF0dHJpYnV0ZShldmVudCwgcHJvcGVydHksIHhtbER0ZEF0dHJpYnV0ZSwgZHRkRGFtYWdlUmVwYWlyZXIpOworCQl9IAorCX0KKwkKKwlwcml2YXRlIFRleHRBdHRyaWJ1dGUgYWRhcHRUZXh0QXR0cmlidXRlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQsIFN0cmluZyBwcm9wZXJ0eSwgVGV4dEF0dHJpYnV0ZSB0ZXh0QXR0cmlidXRlLCBNdWx0aWxpbmVEYW1hZ2VyUmVwYWlyZXIgcmVwYWlyZXIpIHsKKwkJaWYgKHByb3BlcnR5LmVuZHNXaXRoKEFudEVkaXRvclByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0JPTERfU1VGRklYKSkgeworCQkJdGV4dEF0dHJpYnV0ZT0gYWRhcHRUb1N0eWxlQ2hhbmdlKGV2ZW50LCBTV1QuQk9MRCwgdGV4dEF0dHJpYnV0ZSk7CisJCX0gZWxzZSBpZiAocHJvcGVydHkuZW5kc1dpdGgoQW50RWRpdG9yUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSVRBTElDX1NVRkZJWCkpIHsKKwkJCXRleHRBdHRyaWJ1dGU9IGFkYXB0VG9TdHlsZUNoYW5nZShldmVudCwgU1dULklUQUxJQywgdGV4dEF0dHJpYnV0ZSk7CisJCX0gZWxzZSB7CisJCQl0ZXh0QXR0cmlidXRlPSBhZGFwdFRvQ29sb3JDaGFuZ2UoZXZlbnQsIHRleHRBdHRyaWJ1dGUpOworCQl9CisJCXJlcGFpcmVyLnNldERlZmF1bHRUZXh0QXR0cmlidXRlKHRleHRBdHRyaWJ1dGUpOworCQlyZXR1cm4gdGV4dEF0dHJpYnV0ZTsKKwl9CisKKwlwcml2YXRlIFRleHRBdHRyaWJ1dGUgYWRhcHRUb1N0eWxlQ2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQsIGludCBzdHlsZUF0dHJpYnV0ZSwgVGV4dEF0dHJpYnV0ZSB0ZXh0QXR0cmlidXRlKSB7CisJCWJvb2xlYW4gZXZlbnRWYWx1ZT0gZmFsc2U7CisJCU9iamVjdCB2YWx1ZT0gZXZlbnQuZ2V0TmV3VmFsdWUoKTsKKwkJaWYgKHZhbHVlIGluc3RhbmNlb2YgQm9vbGVhbikgeworCQkJZXZlbnRWYWx1ZT0gKChCb29sZWFuKSB2YWx1ZSkuYm9vbGVhblZhbHVlKCk7CisJCX0gZWxzZSBpZiAoSVByZWZlcmVuY2VTdG9yZS5UUlVFLmVxdWFscyh2YWx1ZSkpIHsKKwkJCWV2ZW50VmFsdWU9IHRydWU7CisJCX0KKwkJCisJCWJvb2xlYW4gYWN0aXZlVmFsdWU9ICh0ZXh0QXR0cmlidXRlLmdldFN0eWxlKCkgJiBzdHlsZUF0dHJpYnV0ZSkgPT0gc3R5bGVBdHRyaWJ1dGU7CisJCWlmIChhY3RpdmVWYWx1ZSAhPSBldmVudFZhbHVlKSB7IAorCQkJdGV4dEF0dHJpYnV0ZT0gbmV3IFRleHRBdHRyaWJ1dGUodGV4dEF0dHJpYnV0ZS5nZXRGb3JlZ3JvdW5kKCksIHRleHRBdHRyaWJ1dGUuZ2V0QmFja2dyb3VuZCgpLCBldmVudFZhbHVlID8gdGV4dEF0dHJpYnV0ZS5nZXRTdHlsZSgpIHwgc3R5bGVBdHRyaWJ1dGUgOiB0ZXh0QXR0cmlidXRlLmdldFN0eWxlKCkgJiB+c3R5bGVBdHRyaWJ1dGUpOworCQl9CQorCQlyZXR1cm4gdGV4dEF0dHJpYnV0ZTsKKwl9CisJCisJIC8qKgorICAgICAqIFVwZGF0ZSB0aGUgdGV4dCBhdHRyaWJ1dGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgdG9rZW5zIG9mIHRoaXMgc2Nhbm5lciBhcyBhIGNvbG9yIHByZWZlcmVuY2UgaGFzIGJlZW4gY2hhbmdlZC4gCisgICAgICovCisgICAgcHJpdmF0ZSBUZXh0QXR0cmlidXRlIGFkYXB0VG9Db2xvckNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50LCBUZXh0QXR0cmlidXRlIHRleHRBdHRyaWJ1dGUpIHsKKyAgICAJUkdCIHJnYj0gbnVsbDsKKwkJCisJCU9iamVjdCB2YWx1ZT0gZXZlbnQuZ2V0TmV3VmFsdWUoKTsKKwkJaWYgKHZhbHVlIGluc3RhbmNlb2YgUkdCKSB7CisJCQlyZ2I9IChSR0IpIHZhbHVlOworCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7CisJCQlyZ2I9IFN0cmluZ0NvbnZlcnRlci5hc1JHQigoU3RyaW5nKSB2YWx1ZSk7CisJCX0KKwkJCQorCQlpZiAocmdiICE9IG51bGwpIHsKKwkJCXRleHRBdHRyaWJ1dGU9IG5ldyBUZXh0QXR0cmlidXRlKENvbG9yTWFuYWdlci5nZXREZWZhdWx0KCkuZ2V0Q29sb3IocmdiKSwgdGV4dEF0dHJpYnV0ZS5nZXRCYWNrZ3JvdW5kKCksIHRleHRBdHRyaWJ1dGUuZ2V0U3R5bGUoKSk7CisJCX0KKwkJcmV0dXJuIHRleHRBdHRyaWJ1dGU7CisgICAgfQorCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLlNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24jZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcyhvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JU291cmNlVmlld2VyKQorCSAqLworCXB1YmxpYyBTdHJpbmdbXSBnZXRDb25maWd1cmVkQ29udGVudFR5cGVzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7CisJICAgIHJldHVybiBuZXcgU3RyaW5nW10geworCSAgICAgICAgSURvY3VtZW50LkRFRkFVTFRfQ09OVEVOVF9UWVBFLAorCSAgICAgICAgQW50RWRpdG9yUGFydGl0aW9uU2Nhbm5lci5YTUxfQ09NTUVOVCwKKwkgICAgICAgIEFudEVkaXRvclBhcnRpdGlvblNjYW5uZXIuWE1MX1RBRywKKwkJCUFudEVkaXRvclBhcnRpdGlvblNjYW5uZXIuWE1MX0NEQVRBLAorCQkJQW50RWRpdG9yUGFydGl0aW9uU2Nhbm5lci5YTUxfRFREfTsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Tb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uI2dldFRhYldpZHRoKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXIpCisJICovCisJcHVibGljIGludCBnZXRUYWJXaWR0aChJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgeworCQlyZXR1cm4gZlByZWZlcmVuY2VTdG9yZS5nZXRJbnQoQWJzdHJhY3REZWNvcmF0ZWRUZXh0RWRpdG9yUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfVEFCX1dJRFRIKTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gYWZmZWN0c1RleHRQcmVzZW50YXRpb24oUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgeworCQlTdHJpbmcgcHJvcGVydHk9IGV2ZW50LmdldFByb3BlcnR5KCk7CisJCXJldHVybiBwcm9wZXJ0eS5zdGFydHNXaXRoKElBbnRFZGl0b3JDb2xvckNvbnN0YW50cy5URVhUX0NPTE9SKSB8fAorCQkJcHJvcGVydHkuc3RhcnRzV2l0aChJQW50RWRpdG9yQ29sb3JDb25zdGFudHMuUFJPQ0VTU0lOR19JTlNUUlVDVElPTlNfQ09MT1IpIHx8CisJCQlwcm9wZXJ0eS5zdGFydHNXaXRoKElBbnRFZGl0b3JDb2xvckNvbnN0YW50cy5TVFJJTkdfQ09MT1IpIHx8CisJCQlwcm9wZXJ0eS5zdGFydHNXaXRoKElBbnRFZGl0b3JDb2xvckNvbnN0YW50cy5UQUdfQ09MT1IpIHx8CisJCQlwcm9wZXJ0eS5zdGFydHNXaXRoKElBbnRFZGl0b3JDb2xvckNvbnN0YW50cy5YTUxfQ09NTUVOVF9DT0xPUikgfHwgCisJCQlwcm9wZXJ0eS5zdGFydHNXaXRoKElBbnRFZGl0b3JDb2xvckNvbnN0YW50cy5YTUxfRFREX0NPTE9SKTsKKwl9CisJCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiNnZXRDb25maWd1cmVkRG9jdW1lbnRQYXJ0aXRpb25pbmcob3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlcikKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldENvbmZpZ3VyZWREb2N1bWVudFBhcnRpdGlvbmluZyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgeworCQlyZXR1cm4gQW50RG9jdW1lbnRTZXR1cFBhcnRpY2lwYW50LkFOVF9QQVJUSVRJT05JTkc7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiNnZXREb3VibGVDbGlja1N0cmF0ZWd5KG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXIsIGphdmEubGFuZy5TdHJpbmcpCisJICovCisJcHVibGljIElUZXh0RG91YmxlQ2xpY2tTdHJhdGVneSBnZXREb3VibGVDbGlja1N0cmF0ZWd5KElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgY29udGVudFR5cGUpIHsKKwkJaWYgKEFudEVkaXRvclBhcnRpdGlvblNjYW5uZXIuWE1MX1RBRy5lcXVhbHMoY29udGVudFR5cGUpKSB7CisJCQlyZXR1cm4gbmV3IEFudERvdWJsZUNsaWNrU3RyYXRlZ3koKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZ2V0RG91YmxlQ2xpY2tTdHJhdGVneShzb3VyY2VWaWV3ZXIsIGNvbnRlbnRUeXBlKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9BbnRVSUltYWdlcy5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvQW50VUlJbWFnZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWYyOTViCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvQW50VUlJbWFnZXMuamF2YQpAQCAtMCwwICsxLDIwNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqICAgICBKb2huLU1hc29uIFAuIFNoYWNrZWxmb3JkIChqb2huLW1hc29uLnNoYWNrZWxmb3JkQHBlYXJzb24uY29tKSAtIGJ1ZyA0OTM4MCwgNDk0NDUsIDUzNTQ3CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpOworCisKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkNvbXBvc2l0ZUltYWdlRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VSZWdpc3RyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7CitpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKKworLyoqCisgKiBUaGUgaW1hZ2VzIHByb3ZpZGVkIGJ5IHRoZSBleHRlcm5hbCB0b29scyBwbHVnaW4uCisgKi8KK3B1YmxpYyBjbGFzcyBBbnRVSUltYWdlcyB7CisKKwkvKiogCisJICogVGhlIGltYWdlIHJlZ2lzdHJ5IGNvbnRhaW5pbmcgPGNvZGU+SW1hZ2U8L2NvZGU+cy4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBJbWFnZVJlZ2lzdHJ5IGltYWdlUmVnaXN0cnk7CisJCisJLyoqCisJICogVGhlIHJlZ2lzdHJ5IGZvciBjb21wb3NpdGUgaW1hZ2VzCisJICovCisJcHJpdmF0ZSBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkgaW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgSUNPTlNfUEFUSCA9ICIkbmwkL2ljb25zL2Z1bGwvIjsgLy8kTk9OLU5MUy0xJAorCisJLy8gVXNlIElQYXRoIGFuZCB0b09TU3RyaW5nIHRvIGJ1aWxkIHRoZSBuYW1lcyB0byBlbnN1cmUgdGhleSBoYXZlIHRoZSBzbGFzaGVzIGNvcnJlY3QKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgTE9DQUxUT09MPSBJQ09OU19QQVRIICsgImVsY2wxNi8iOyAvL2Jhc2ljIGNvbG9ycyAtIHNpemUgMTZ4MTYgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBPQkpFQ1Q9IElDT05TX1BBVEggKyAib2JqMTYvIjsgLy9iYXNpYyBjb2xvcnMgLSBzaXplIDE2eDE2IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgT1ZSPSBJQ09OU19QQVRIICsgIm92cjE2LyI7IC8vYmFzaWMgY29sb3JzIC0gc2l6ZSA3eDggLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBXSVo9IElDT05TX1BBVEggKyAid2l6YmFuLyI7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVF9FVE9PTD0gSUNPTlNfUEFUSCArICJldG9vbDE2IjsgCS8vJE5PTi1OTFMtMSQKKwkKKwkvKioKKwkgKiBEZWNsYXJlIGFsbCBpbWFnZXMKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyB2b2lkIGRlY2xhcmVJbWFnZXMoKSB7CisJCS8vIEFudCBFZGl0b3IgaW1hZ2VzCisJCWRlY2xhcmVSZWdpc3RyeUltYWdlKElBbnRVSUNvbnN0YW50cy5JTUdfUFJPUEVSVFksIE9CSkVDVCArICJwcm9wZXJ0eV9vYmouZ2lmIik7IC8vJE5PTi1OTFMtMSQKKwkJZGVjbGFyZVJlZ2lzdHJ5SW1hZ2UoSUFudFVJQ29uc3RhbnRzLklNR19UQVNLX1BST1BPU0FMLCBPQkpFQ1QgKyAidGFza19vYmouZ2lmIik7IC8vJE5PTi1OTFMtMSQKKwkJZGVjbGFyZVJlZ2lzdHJ5SW1hZ2UoSUFudFVJQ29uc3RhbnRzLklNR19URU1QTEFURV9QUk9QT1NBTCwgT0JKRUNUICsgInRlbXBsYXRlX29iai5naWYiKTsgLy8kTk9OLU5MUy0xJAorCQkKKwkJZGVjbGFyZVJlZ2lzdHJ5SW1hZ2UoSUFudFVJQ29uc3RhbnRzLklNR19TRUdNRU5UX0VESVQsIFRfRVRPT0wgKyAic2VnbWVudF9lZGl0LmdpZiIpOyAvLyROT04tTkxTLTEkCisJCWRlY2xhcmVSZWdpc3RyeUltYWdlKElBbnRVSUNvbnN0YW50cy5JTUdfTUFSS19PQ0NVUlJFTkNFUywgVF9FVE9PTCArICJtYXJrX29jY3VycmVuY2VzLmdpZiIpOyAvLyROT04tTkxTLTEkCisJCQorCQkvLyBBbnQgVmlldyBBY3Rpb25zCisJCWRlY2xhcmVSZWdpc3RyeUltYWdlKElBbnRVSUNvbnN0YW50cy5JTUdfQU5ULCBPQkpFQ1QgKyAiYW50LmdpZiIpOyAvLyROT04tTkxTLTEkCisJCWRlY2xhcmVSZWdpc3RyeUltYWdlKElBbnRVSUNvbnN0YW50cy5JTUdfUkVNT1ZFLCBMT0NBTFRPT0wgKyAicmVtb3ZlX2NvLmdpZiIpOyAvLyROT04tTkxTLTEkCisJCWRlY2xhcmVSZWdpc3RyeUltYWdlKElBbnRVSUNvbnN0YW50cy5JTUdfUkVNT1ZFX0FMTCwgTE9DQUxUT09MICsgInJlbW92ZWFsbF9jby5naWYiKTsgLy8kTk9OLU5MUy0xJAorCQlkZWNsYXJlUmVnaXN0cnlJbWFnZShJQW50VUlDb25zdGFudHMuSU1HX0FERCwgTE9DQUxUT09MICsgImFkZF9jby5naWYiKTsgLy8kTk9OLU5MUy0xJAorCQlkZWNsYXJlUmVnaXN0cnlJbWFnZShJQW50VUlDb25zdGFudHMuSU1HX1JVTiwgTE9DQUxUT09MICsgInJ1bl90b29sLmdpZiIpOyAvLyROT04tTkxTLTEkCisJCWRlY2xhcmVSZWdpc3RyeUltYWdlKElBbnRVSUNvbnN0YW50cy5JTUdfU0VBUkNILCBMT0NBTFRPT0wgKyAic2VhcmNoLmdpZiIpOyAvLyROT04tTkxTLTEkCisJCQorCQlkZWNsYXJlUmVnaXN0cnlJbWFnZShJQW50VUlDb25zdGFudHMuSU1HX0ZJTFRFUl9JTlRFUk5BTF9UQVJHRVRTLCBMT0NBTFRPT0wgKyAiZmlsdGVyX2ludGVybmFsX3RhcmdldHMuZ2lmIik7IC8vJE5PTi1OTFMtMSQKKwkJZGVjbGFyZVJlZ2lzdHJ5SW1hZ2UoSUFudFVJQ29uc3RhbnRzLklNR19GSUxURVJfSU1QT1JURURfRUxFTUVOVFMsIExPQ0FMVE9PTCArICJmaWx0ZXJfaW1wb3J0ZWRfZWxlbWVudHMuZ2lmIik7IC8vJE5PTi1OTFMtMSQKKwkJZGVjbGFyZVJlZ2lzdHJ5SW1hZ2UoSUFudFVJQ29uc3RhbnRzLklNR19GSUxURVJfUFJPUEVSVElFUywgTE9DQUxUT09MICsgImZpbHRlcl9wcm9wZXJ0aWVzLmdpZiIpOyAvLyROT04tTkxTLTEkCisJCWRlY2xhcmVSZWdpc3RyeUltYWdlKElBbnRVSUNvbnN0YW50cy5JTUdfRklMVEVSX1RPUF9MRVZFTCwgTE9DQUxUT09MICsgImZpbHRlcl90b3BfbGV2ZWwuZ2lmIik7IC8vJE5PTi1OTFMtMSQKKwkJZGVjbGFyZVJlZ2lzdHJ5SW1hZ2UoSUFudFVJQ29uc3RhbnRzLklNR19MSU5LX1dJVEhfRURJVE9SLCBMT0NBTFRPT0wgKyAic3luY2VkLmdpZiIpOyAvLyROT04tTkxTLTEkCisJCWRlY2xhcmVSZWdpc3RyeUltYWdlKElBbnRVSUNvbnN0YW50cy5JTUdfU09SVF9PVVRMSU5FLCBMT0NBTFRPT0wgKyAiYWxwaGFfbW9kZS5naWYiKTsgLy8kTk9OLU5MUy0xJAorCQlkZWNsYXJlUmVnaXN0cnlJbWFnZShJQW50VUlDb25zdGFudHMuSU1HX1JFRlJFU0gsIExPQ0FMVE9PTCArICJyZWZyZXNoLmdpZiIpOyAvLyROT04tTkxTLTEkCisJCQorCQkvLyBBbnQgVmlldyBMYWJlbHMKKwkJZGVjbGFyZVJlZ2lzdHJ5SW1hZ2UoSUFudFVJQ29uc3RhbnRzLklNR19BTlRfUFJPSkVDVCwgT0JKRUNUICsgImFudF9idWlsZGZpbGUuZ2lmIik7IC8vJE5PTi1OTFMtMSQKKwkJZGVjbGFyZVJlZ2lzdHJ5SW1hZ2UoSUFudFVJQ29uc3RhbnRzLklNR19BTlRfVEFSR0VULCBPQkpFQ1QgKyAidGFyZ2V0cHVibGljX29iai5naWYiKTsgLy8kTk9OLU5MUy0xJAorCQlkZWNsYXJlUmVnaXN0cnlJbWFnZShJQW50VUlDb25zdGFudHMuSU1HX0FOVF9UQVJHRVRfSU5URVJOQUwsIE9CSkVDVCArICJ0YXJnZXRpbnRlcm5hbF9vYmouZ2lmIik7IC8vJE5PTi1OTFMtMSQKKwkJZGVjbGFyZVJlZ2lzdHJ5SW1hZ2UoSUFudFVJQ29uc3RhbnRzLklNR19BTlRfREVGQVVMVF9UQVJHRVQsIE9CSkVDVCArICJkZWZhdWx0dGFyZ2V0X29iai5naWYiKTsgLy8kTk9OLU5MUy0xJAorCQlkZWNsYXJlUmVnaXN0cnlJbWFnZShJQW50VUlDb25zdGFudHMuSU1HX0FOVF9UQVJHRVRfRVJST1IsIE9CSkVDVCArICJhbnRfdGFyZ2V0X2Vyci5naWYiKTsgLy8kTk9OLU5MUy0xJAorCisJCS8vQU5UIG9iamVjdHMKKwkJZGVjbGFyZVJlZ2lzdHJ5SW1hZ2UoSUFudFVJQ29uc3RhbnRzLklNR19UQUJfQ0xBU1NQQVRILCBPQkpFQ1QgKyAiY2xhc3NwYXRoLmdpZiIpOyAvLyROT04tTkxTLTEkCisJCWRlY2xhcmVSZWdpc3RyeUltYWdlKElBbnRVSUNvbnN0YW50cy5JTUdfQU5UX1RZUEUsIE9CSkVDVCArICJ0eXBlLmdpZiIpOyAvLyROT04tTkxTLTEkCisJCWRlY2xhcmVSZWdpc3RyeUltYWdlKElBbnRVSUNvbnN0YW50cy5JTUdfQU5UX1RBU0tERUYsIE9CSkVDVCArICJ0YXNrZGVmX29iai5naWYiKTsgLy8kTk9OLU5MUy0xJAorCQlkZWNsYXJlUmVnaXN0cnlJbWFnZShJQW50VUlDb25zdGFudHMuSU1HX0FOVF9NQUNST0RFRiwgT0JKRUNUICsgIm1hY3JvZGVmX29iai5naWYiKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICBkZWNsYXJlUmVnaXN0cnlJbWFnZShJQW50VUlDb25zdGFudHMuSU1HX0FOVF9JTVBPUlQsIE9CSkVDVCArICJpbXBvcnRfb2JqLmdpZiIpOyAvLyROT04tTkxTLTEkCisgICAgICAgIGRlY2xhcmVSZWdpc3RyeUltYWdlKElBbnRVSUNvbnN0YW50cy5JTUdfQU5UX0VDTElQU0VfUlVOVElNRV9PQkpFQ1QsIE9CSkVDVCArICJlY2xpcHNlX29iai5naWYiKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICAKKwkJZGVjbGFyZVJlZ2lzdHJ5SW1hZ2UoSUFudFVJQ29uc3RhbnRzLklNR19XSVpBUkRfQkFOTkVSLCBXSVogKyAiYW50X3dpei5wbmciKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICBkZWNsYXJlUmVnaXN0cnlJbWFnZShJQW50VUlDb25zdGFudHMuSU1HX0VYUE9SVF9XSVpBUkRfQkFOTkVSLCBXSVogKyAiZXhwb3J0X2FudF93aXoucG5nIik7IC8vJE5PTi1OTFMtMSQKKwkJZGVjbGFyZVJlZ2lzdHJ5SW1hZ2UoSUFudFVJQ29uc3RhbnRzLklNR19UQUJfQU5UX1RBUkdFVFMsIExPQ0FMVE9PTCArICJhbnRfdGFyZ2V0cy5naWYiKTsgLy8kTk9OLU5MUy0xJAorCQkKKwkJLy8gT3ZlcmxheXMKKwkJZGVjbGFyZVJlZ2lzdHJ5SW1hZ2UoSUFudFVJQ29uc3RhbnRzLklNR19PVlJfRVJST1IsIE9WUiArICJlcnJvcl9jby5naWYiKTsgLy8kTk9OLU5MUy0xJAorCQlkZWNsYXJlUmVnaXN0cnlJbWFnZShJQW50VUlDb25zdGFudHMuSU1HX09WUl9XQVJOSU5HLCBPVlIgKyAid2FybmluZ19jby5naWYiKTsgLy8kTk9OLU5MUy0xJAorCQlkZWNsYXJlUmVnaXN0cnlJbWFnZShJQW50VUlDb25zdGFudHMuSU1HX09WUl9JTVBPUlQsIE9WUiArICJpbXBvcnRfY28uZ2lmIik7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwkvKioKKwkgKiBEZWNsYXJlIGFuIEltYWdlIGluIHRoZSByZWdpc3RyeSB0YWJsZS4KKwkgKiBAcGFyYW0ga2V5IAlUaGUga2V5IHRvIHVzZSB3aGVuIHJlZ2lzdGVyaW5nIHRoZSBpbWFnZQorCSAqIEBwYXJhbSBwYXRoCVRoZSBwYXRoIHdoZXJlIHRoZSBpbWFnZSBjYW4gYmUgZm91bmQuIFRoaXMgcGF0aCBpcyByZWxhdGl2ZSB0byB3aGVyZQorCSAqCQkJCXRoaXMgcGx1Z2luIGNsYXNzIGlzIGZvdW5kIChpLmUuIHR5cGljYWxseSB0aGUgcGFja2FnZXMgZGlyZWN0b3J5KQorCSAqLworCXByaXZhdGUgZmluYWwgc3RhdGljIHZvaWQgZGVjbGFyZVJlZ2lzdHJ5SW1hZ2UoU3RyaW5nIGtleSwgU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgSW1hZ2VEZXNjcmlwdG9yIGRlc2MgPSBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpOworICAgICAgICBCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKEFudFVJUGx1Z2luLmdldFVuaXF1ZUlkZW50aWZpZXIoKSk7CisgICAgICAgIFVSTCB1cmwgPSBudWxsOworICAgICAgICBpZiAoYnVuZGxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHVybCA9IEZpbGVMb2NhdG9yLmZpbmQoYnVuZGxlLCBuZXcgUGF0aChwYXRoKSwgbnVsbCk7CisgICAgICAgICAgICBkZXNjID0gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwodXJsKTsKKyAgICAgICAgfQorICAgICAgICBpbWFnZVJlZ2lzdHJ5LnB1dChrZXksIGRlc2MpOworICAgIH0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBJbWFnZVJlZ2lzdHJ5LgorCSAqLworCXB1YmxpYyBzdGF0aWMgSW1hZ2VSZWdpc3RyeSBnZXRJbWFnZVJlZ2lzdHJ5KCkgeworCQlpZiAoaW1hZ2VSZWdpc3RyeSA9PSBudWxsKSB7CisJCQlpbml0aWFsaXplSW1hZ2VSZWdpc3RyeSgpOworCQl9CisJCXJldHVybiBpbWFnZVJlZ2lzdHJ5OworCX0KKworCS8qKgorCSAqCUluaXRpYWxpemUgdGhlIGltYWdlIHJlZ2lzdHJ5IGJ5IGRlY2xhcmluZyBhbGwgb2YgdGhlIHJlcXVpcmVkCisJICoJZ3JhcGhpY3MuIFRoaXMgaW52b2x2ZXMgY3JlYXRpbmcgSkZhY2UgaW1hZ2UgZGVzY3JpcHRvcnMgZGVzY3JpYmluZworCSAqCWhvdyB0byBjcmVhdGUvZmluZCB0aGUgaW1hZ2Ugc2hvdWxkIGl0IGJlIG5lZWRlZC4KKwkgKglUaGUgaW1hZ2UgaXMgbm90IGFjdHVhbGx5IGFsbG9jYXRlZCB1bnRpbCByZXF1ZXN0ZWQuCisJICoKKwkgKiAJUHJlZml4IGNvbnZlbnRpb25zCisJICoJCVdpemFyZCBCYW5uZXJzCQkJV0laQkFOXworCSAqCQlQcmVmZXJlbmNlIEJhbm5lcnMJCVBSRUZfQkFOXworCSAqCQlQcm9wZXJ0eSBQYWdlIEJhbm5lcnMJUFJPUEJBTl8KKwkgKgkJQ29sb3IgdG9vbGJhcgkJCUNUT09MXworCSAqCQlFbmFibGUgdG9vbGJhcgkJCUVUT09MXworCSAqCQlEaXNhYmxlIHRvb2xiYXIJCQlEVE9PTF8KKwkgKgkJTG9jYWwgZW5hYmxlZCB0b29sYmFyCUVMQ0xfCisJICoJCUxvY2FsIERpc2FibGUgdG9vbGJhcglETENMXworCSAqCQlPYmplY3QgbGFyZ2UJCQlPQkpMXworCSAqCQlPYmplY3Qgc21hbGwJCQlPQkpTXworCSAqCQlWaWV3IAkJCQkJVklFV18KKwkgKgkJUHJvZHVjdCBpbWFnZXMJCQlQUk9EXworCSAqCQlNaXNjIGltYWdlcwkJCQlNSVNDXworCSAqCisJICoJV2hlcmUgYXJlIHRoZSBpbWFnZXM/CisJICoJCVRoZSBpbWFnZXMgKHR5cGljYWxseSBnaWZzKSBhcmUgZm91bmQgaW4gdGhlIHNhbWUgbG9jYXRpb24gYXMgdGhpcyBwbHVnaW4gY2xhc3MuCisJICoJCVRoaXMgbWF5IG1lYW4gdGhlIHNhbWUgcGFja2FnZSBkaXJlY3RvcnkgYXMgdGhlIHBhY2thZ2UgaG9sZGluZyB0aGlzIGNsYXNzLgorCSAqCQlUaGUgaW1hZ2VzIGFyZSBkZWNsYXJlZCB1c2luZyB0aGlzLmdldENsYXNzKCkgdG8gZW5zdXJlIHRoZXkgYXJlIGxvb2tlZCB1cCB2aWEKKwkgKgkJdGhpcyBwbHVnaW4gY2xhc3MuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZVJlZ2lzdHJ5CisJICovCisJcHVibGljIHN0YXRpYyBJbWFnZVJlZ2lzdHJ5IGluaXRpYWxpemVJbWFnZVJlZ2lzdHJ5KCkgeworCQlpbWFnZVJlZ2lzdHJ5PSBuZXcgSW1hZ2VSZWdpc3RyeShBbnRVSVBsdWdpbi5nZXRTdGFuZGFyZERpc3BsYXkoKSk7CisJCWRlY2xhcmVJbWFnZXMoKTsKKwkJcmV0dXJuIGltYWdlUmVnaXN0cnk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgPGNvZGU+SW1hZ2U8Y29kZT4gaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4ga2V5LAorCSAqIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGl0IGRvZXMgbm90IGV4aXN0LgorCSAqLworCXB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0SW1hZ2UoU3RyaW5nIGtleSkgeworCQlyZXR1cm4gZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldChrZXkpOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSA8Y29kZT5JbWFnZURlc2NyaXB0b3I8Y29kZT4gaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4ga2V5LAorCSAqIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGl0IGRvZXMgbm90IGV4aXN0LgorCSAqLworCXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcga2V5KSB7CisJCXJldHVybiBnZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0RGVzY3JpcHRvcihrZXkpOworCX0KKwkKKwkvKiogCisJICogUmV0dXJucyB0aGUgaW1hZ2UgZm9yIHRoZSBnaXZlbiBjb21wb3NpdGUgZGVzY3JpcHRvci4gCisJICovCisJcHVibGljIHN0YXRpYyBJbWFnZSBnZXRJbWFnZShDb21wb3NpdGVJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yKSB7CisJCWlmIChpbWFnZURlc2NyaXB0b3JSZWdpc3RyeSA9PSBudWxsKSB7CisJCQlpbWFnZURlc2NyaXB0b3JSZWdpc3RyeSA9IG5ldyBJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSgpOwkKKwkJfQorCQlyZXR1cm4gaW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkuZ2V0KGltYWdlRGVzY3JpcHRvcik7CisJfQorCQorCXB1YmxpYyBzdGF0aWMgdm9pZCBkaXNwb3NlSW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkoKSB7CisJCWlmIChpbWFnZURlc2NyaXB0b3JSZWdpc3RyeSAhPSBudWxsKSB7CisJCQlpbWFnZURlc2NyaXB0b3JSZWdpc3RyeS5kaXNwb3NlKCk7IAorCQl9CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGUgaW1hZ2VzIGhhdmUgYmVlbiBpbml0aWFsaXplZC4KKwkgKiAKKwkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGltYWdlcyBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQKKwkgKi8KKwlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBib29sZWFuIGlzSW5pdGlhbGl6ZWQoKSB7CisJCXJldHVybiBpbWFnZURlc2NyaXB0b3JSZWdpc3RyeSAhPSBudWxsOworCX0KK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL0FudFVJTW9kZWxNZXNzYWdlcy5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvQW50VUlNb2RlbE1lc3NhZ2VzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM3ZDU5NgotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL0FudFVJTW9kZWxNZXNzYWdlcy5qYXZhCkBAIC0wLDAgKzEsMjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKKyAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKKyAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcworICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczogCisgKiBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworCitwdWJsaWMgY2xhc3MgQW50VUlNb2RlbE1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLkFudFVJTW9kZWxNZXNzYWdlcyI7Ly8kTk9OLU5MUy0xJAorCQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5X0FsbG9jYXRpbmdfaW1hZ2VfZm9yX3dyb25nX2Rpc3BsYXlfMTsKKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudFV0aWxfNjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRVdGlsXzc7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQW50VXRpbF8wOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudFV0aWxfMTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRVdGlsXzI7CisKKwlzdGF0aWMgeworCQkvLyBsb2FkIG1lc3NhZ2UgdmFsdWVzIGZyb20gYnVuZGxlIGZpbGUKKwkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgQW50VUlNb2RlbE1lc3NhZ2VzLmNsYXNzKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvQW50VUlNb2RlbE1lc3NhZ2VzLnByb3BlcnRpZXMgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9BbnRVSU1vZGVsTWVzc2FnZXMucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmFmZDM4Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvQW50VUlNb2RlbE1lc3NhZ2VzLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxOCBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisjIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjCisjIENvbnRyaWJ1dG9yczoKKyMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitJbWFnZURlc2NyaXB0b3JSZWdpc3RyeV9BbGxvY2F0aW5nX2ltYWdlX2Zvcl93cm9uZ19kaXNwbGF5XzE9QWxsb2NhdGluZyBpbWFnZSBmb3Igd3JvbmcgZGlzcGxheQorCitBbnRVdGlsXzY9SW52YWxpZCBwcm9wZXJ0eSBmaWxlIGVudHJ5OiB7MH0KK0FudFV0aWxfNz1VbmFibGUgdG8gZ2VuZXJhdGUgQW50IGNsYXNzcGF0aAorQW50VXRpbF8wPUVkaXRvciBmYWlsZWQgdG8gb3BlbiBmb3IgezB9CitBbnRVdGlsXzE9QnJvd3NlciBjb3VsZCBub3QgYmUgb3BlbmVkCitBbnRVdGlsXzI9RXJyb3IgcmVhZGluZyBsYXVuY2ggY29uZmlndXJhdGlvbgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvQ29sb3JNYW5hZ2VyLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9Db2xvck1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2FiZTY3Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvQ29sb3JNYW5hZ2VyLmphdmEKQEAgLTAsMCArMSw1OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWk7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTaGFyZWRUZXh0Q29sb3JzOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7CisKKy8qKgorICogR2VuZXJpYyBjb2xvciBtYW5hZ2VyLgorICovCitwdWJsaWMgY2xhc3MgQ29sb3JNYW5hZ2VyIGltcGxlbWVudHMgSVNoYXJlZFRleHRDb2xvcnMgewkKKwkKKwlwcml2YXRlIHN0YXRpYyBDb2xvck1hbmFnZXIgZmdDb2xvck1hbmFnZXI7CisJCisJcHJpdmF0ZSBDb2xvck1hbmFnZXIoKSB7CisJfQorCQorCXB1YmxpYyBzdGF0aWMgQ29sb3JNYW5hZ2VyIGdldERlZmF1bHQoKSB7CisJCWlmIChmZ0NvbG9yTWFuYWdlciA9PSBudWxsKSB7CisJCQlmZ0NvbG9yTWFuYWdlcj0gbmV3IENvbG9yTWFuYWdlcigpOworCQl9CisJCXJldHVybiBmZ0NvbG9yTWFuYWdlcjsKKwl9CisJCisJcHJvdGVjdGVkIE1hcCBmQ29sb3JUYWJsZT0gbmV3IEhhc2hNYXAoMTApOworCQorCXB1YmxpYyBDb2xvciBnZXRDb2xvcihSR0IgcmdiKSB7CisJCUNvbG9yIGNvbG9yPSAoQ29sb3IpIGZDb2xvclRhYmxlLmdldChyZ2IpOworCQlpZiAoY29sb3IgPT0gbnVsbCkgeworCQkJY29sb3I9IG5ldyBDb2xvcihEaXNwbGF5LmdldEN1cnJlbnQoKSwgcmdiKTsKKwkJCWZDb2xvclRhYmxlLnB1dChyZ2IsIGNvbG9yKTsKKwkJfQorCQlyZXR1cm4gY29sb3I7CisJfQorCQorCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCUl0ZXJhdG9yIGU9IGZDb2xvclRhYmxlLnZhbHVlcygpLml0ZXJhdG9yKCk7CisJCXdoaWxlIChlLmhhc05leHQoKSkgeworCQkJKChDb2xvcikgZS5uZXh0KCkpLmRpc3Bvc2UoKTsKKwkJfQorCX0KK30KKworCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9FeHRlcm5hbEh5cGVybGluay5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvRXh0ZXJuYWxIeXBlcmxpbmsuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTE5NzZlCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvRXh0ZXJuYWxIeXBlcmxpbmsuamF2YQpAQCAtMCwwICsxLDg3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbS5FRlM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtLklGaWxlU3RvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNvbnNvbGUuSUh5cGVybGluazsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuRmlsZVN0b3JlRWRpdG9ySW5wdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JRG9jdW1lbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOworCitwdWJsaWMgY2xhc3MgRXh0ZXJuYWxIeXBlcmxpbmsgaW1wbGVtZW50cyBJSHlwZXJsaW5rIHsKKworICAgIHByaXZhdGUgRmlsZSBmRmlsZTsKKyAgICBwcml2YXRlIGludCBmTGluZU51bWJlcjsKKworICAgIHB1YmxpYyBFeHRlcm5hbEh5cGVybGluayhGaWxlIGZpbGUsIGludCBsaW5lTnVtYmVyKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIGZGaWxlID0gZmlsZTsKKyAgICAgICAgZkxpbmVOdW1iZXI9IGxpbmVOdW1iZXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbGlua0VudGVyZWQoKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbGlua0V4aXRlZCgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBsaW5rQWN0aXZhdGVkKCkgeworICAgIAlJRWRpdG9ySW5wdXQgaW5wdXQ7CisgICAgCUlGaWxlU3RvcmUgZmlsZVN0b3JlOworCQl0cnkgeworCQkJZmlsZVN0b3JlPSBFRlMuZ2V0U3RvcmUoZkZpbGUudG9VUkkoKSk7CisJCQlpbnB1dCA9IG5ldyBGaWxlU3RvcmVFZGl0b3JJbnB1dChmaWxlU3RvcmUpOworCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCS8vIHVuYWJsZSB0byBsaW5rCisJCQlBbnRVSVBsdWdpbi5sb2coZSk7CisJCQlyZXR1cm47CisJCX0KKyAgICAJCisgICAgICAgIElXb3JrYmVuY2hQYWdlIGFjdGl2ZVBhZ2UgPSBBbnRVSVBsdWdpbi5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0PSBhY3RpdmVQYWdlLm9wZW5FZGl0b3IoaW5wdXQsICJvcmcuZWNsaXBzZS5hbnQudWkuaW50ZXJuYWwuZWRpdG9yLkFudEVkaXRvciIsIHRydWUpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICBpZiAoZkxpbmVOdW1iZXIgPiAwICYmIGVkaXRvclBhcnQgaW5zdGFuY2VvZiBJVGV4dEVkaXRvcikgeworICAgICAgICAgICAgICAgIElUZXh0RWRpdG9yIHRleHRFZGl0b3IgPSAoSVRleHRFZGl0b3IpZWRpdG9yUGFydDsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgSURvY3VtZW50UHJvdmlkZXIgcHJvdmlkZXIgPSB0ZXh0RWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyLmNvbm5lY3QoaW5wdXQpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVuYWJsZSB0byBsaW5rCisgICAgICAgICAgICAgICAgICAgICAgICBBbnRVSVBsdWdpbi5sb2coZSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgSURvY3VtZW50IGRvY3VtZW50ID0gcHJvdmlkZXIuZ2V0RG9jdW1lbnQoaW5wdXQpOworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgSVJlZ2lvbiBsaW5lUmVnaW9uPSBkb2N1bWVudC5nZXRMaW5lSW5mb3JtYXRpb24oZkxpbmVOdW1iZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEVkaXRvci5zZWxlY3RBbmRSZXZlYWwobGluZVJlZ2lvbi5nZXRPZmZzZXQoKSwgbGluZVJlZ2lvbi5nZXRMZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVuYWJsZSB0byBsaW5rCisgICAgICAgICAgICAgICAgICAgICAgICBBbnRVSVBsdWdpbi5sb2coZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXIuZGlzY29ubmVjdChpbnB1dCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgIH0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9JQW50VUlDb25zdGFudHMuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL0lBbnRVSUNvbnN0YW50cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjMTY2YjIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9JQW50VUlDb25zdGFudHMuamF2YQpAQCAtMCwwICsxLDEyMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogICAgIEpvaG4tTWFzb24gUC4gU2hhY2tlbGZvcmQgKGpvaG4tbWFzb24uc2hhY2tlbGZvcmRAcGVhcnNvbi5jb20pIC0gYnVnIDQ5MzgwLCA0OTQ0NSwgYnVnIDUzNTQ3CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpOworCisKKy8qKgorICogRGVmaW5lcyB0aGUgY29uc3RhbnRzIGF2YWlsYWJsZSBmb3IgY2xpZW50IHVzZS4KKyAqIDxwPgorICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGV4dGVuZGVkIG9yIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCisgKiA8L3A+CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSUFudFVJQ29uc3RhbnRzIHsKKwkvKioKKwkgKiBQbHVnaW4gaWRlbnRpZmllciBmb3IgQW50IHVpKHZhbHVlIDxjb2RlPm9yZy5lY2xpcHNlLmFudC51aTwvY29kZT4pLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5hbnQudWkiOyAvLyROT04tTkxTLTEkOworCQorCisJLy8gLS0tLS0tLSBWaWV3cyAtLS0tLS0tCisKKwkvKioKKwkgKiBBbnQgVmlldyBpZGVudGlmaWVyICh2YWx1ZSA8Y29kZT5vcmcuZWNsaXBzZS5hbnQudWkuQW50VmlldzwvY29kZT4pLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFOVF9WSUVXX0lEID0gUExVR0lOX0lEICsgIi5BbnRWaWV3IjsgLy8kTk9OLU5MUy0xJAorCisJLy8gLS0tLS0tLSBJbWFnZXMgLS0tLS0tLQorCS8qKgorCSAqIE1haW4gdGFiIGltYWdlLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19UQUJfTUFJTiA9IFBMVUdJTl9JRCArICIuSU1HX1RBQl9NQUlOIjsgLy8kTk9OLU5MUy0xJAorCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1BST1BFUlRZID0gUExVR0lOX0lEICsgIi5JTUdfUFJPUEVSVFkiOyAvLyROT04tTkxTLTEkCisJCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1RBQl9BTlRfVEFSR0VUUyA9IFBMVUdJTl9JRCArICIuSU1HX1RBQl9BTlRfVEFSR0VUUyI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfVEFCX0NMQVNTUEFUSCA9IFBMVUdJTl9JRCArICIuSU1HX1RBQl9DTEFTU1BBVEgiOyAvLyROT04tTkxTLTEkOworCQorCS8vCUxhYmVsIGltYWdlcworCSBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfQU5UPSBQTFVHSU5fSUQgKyAiLmFudCI7IC8vJE5PTi1OTFMtMSQKKwkgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0FOVF9QUk9KRUNUPSBQTFVHSU5fSUQgKyAiLmFudFByb2plY3QiOyAvLyROT04tTkxTLTEkCisJIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19BTlRfVEFSR0VUPSBQTFVHSU5fSUQgKyAiLmFudFRhcmdldCI7IC8vJE5PTi1OTFMtMSQKKwkgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0FOVF9UQVJHRVRfSU5URVJOQUwgPSBQTFVHSU5fSUQgKyAiLmFudFByaXZhdGVUYXJnZXQiOyAvLyROT04tTkxTLTEkCisJIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19BTlRfREVGQVVMVF9UQVJHRVQ9IFBMVUdJTl9JRCArICIuYW50RGVmYXVsdFRhcmdldCI7IC8vJE5PTi1OTFMtMSQKKwkgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0FOVF9UQVJHRVRfRVJST1IgPSBQTFVHSU5fSUQgKyAiLmFudFRhcmdldEVycm9yIjsgLy8kTk9OLU5MUy0xJAorCSBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfQU5UX01BQ1JPREVGID0gUExVR0lOX0lEICsgIi5hbnRNYWNyb2RlZiI7IC8vJE5PTi1OTFMtMSQKKyAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0FOVF9JTVBPUlQgPSBQTFVHSU5fSUQgKyAiLmFudEltcG9ydCI7IC8vJE5PTi1OTFMtMSQKKyAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0FOVF9UQVNLREVGID0gUExVR0lOX0lEICsgIi5hbnRUYXNrZGVmIjsgLy8kTk9OLU5MUy0xJAorICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfQU5UX0VDTElQU0VfUlVOVElNRV9PQkpFQ1QgPSBQTFVHSU5fSUQgKyAiLmFudEVjbGlwc2UiOyAvLyROT04tTkxTLTEkCisgICAgIAorICAgICAvL2VkaXRvciB0b29sYmFyCisgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19TRUdNRU5UX0VESVQgPSBQTFVHSU5fSUQgKyAiLnNlZ21lbnRFZGl0IjsgLy8kTk9OLU5MUy0xJAorCSBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfTUFSS19PQ0NVUlJFTkNFUyA9IFBMVUdJTl9JRCArICIubWFya09jY3VycmVuY2VzIjsgLy8kTk9OLU5MUy0xJAorICAgICAKKwkvKioKKwkgKiBJY29uIGZvciB0YXNrIHByb3Bvc2FsLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19UQVNLX1BST1BPU0FMID0gUExVR0lOX0lEICsgIi5odG1sX3RhYl9vYmoiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1RFTVBMQVRFX1BST1BPU0FMPSBQTFVHSU5fSUQgKyAiLnRlbXBsYXRlX29iaiI7IC8vJE5PTi1OTFMtMSQKKwkKKwkvLyBBY3Rpb24gaW1hZ2VzCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1JFTU9WRT0gUExVR0lOX0lEICsgIi5yZW1vdmUiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1JFTU9WRV9BTEw9IFBMVUdJTl9JRCArICIucmVtb3ZlQWxsIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19BREQ9IFBMVUdJTl9JRCArICIuYWRkIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19SVU49IFBMVUdJTl9JRCArICIucnVuIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19TRUFSQ0g9IFBMVUdJTl9JRCArICIuc2VhcmNoIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19GSUxURVJfSU5URVJOQUxfVEFSR0VUUz0gUExVR0lOX0lEICsgIi5maWx0ZXJJbnRlcm5hbFRhcmdldHMiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0ZJTFRFUl9JTVBPUlRFRF9FTEVNRU5UUz0gUExVR0lOX0lEICsgIi5maWx0ZXJJbXBvcnRlZEVsZW1lbnRzIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19GSUxURVJfUFJPUEVSVElFUz0gUExVR0lOX0lEICsgIi5maWx0ZXJQcm9wZXJ0aWVzIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19GSUxURVJfVE9QX0xFVkVMPSBQTFVHSU5fSUQgKyAiLmZpbHRlclRvcExldmVsIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19TT1JUX09VVExJTkU9IFBMVUdJTl9JRCArICIuc29ydE91dGxpbmUiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0xJTktfV0lUSF9FRElUT1I9IFBMVUdJTl9JRCArICIubGlua1dpdGhFZGl0b3IiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1JFRlJFU0ggPSBQTFVHSU5fSUQgKyAiLklNR19SRUZSRVNIIjsgLy8kTk9OLU5MUy0xJAorCQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19XSVpBUkRfQkFOTkVSID0gUExVR0lOX0lEICsgIi5JTUdfV0laQVJEX0JBTk5FUiI7IC8vJE5PTi1OTFMtMSQKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRVhQT1JUX1dJWkFSRF9CQU5ORVIgPSBQTFVHSU5fSUQgKyAiLklNR19FWFBPUlRfV0laQVJEX0JBTk5FUiI7IC8vJE5PTi1OTFMtMSQKKwkgCisJLy8JT3ZlcmxheXMKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT1ZSX0VSUk9SID0gUExVR0lOX0lEICsgIi5vdnJFcnJvciI7ICAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09WUl9XQVJOSU5HID0gUExVR0lOX0lEICsgIi5vdnJXYXJuaW5nIjsgIC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT1ZSX0lNUE9SVCA9IFBMVUdJTl9JRCArICIub3ZySW1wb3J0IjsgLy8kTk9OLU5MUy0xJAorCQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19BTlRfVFlQRT0gUExVR0lOX0lEICsgIi50eXBlIjsgLy8kTk9OLU5MUy0xJAorCisJLy8gLS0tLS0tLS0gU3RhdHVzIENvZGVzIC0tLS0tLS0tLS0tLS0KKwkKKwkvKioKKwkgKiBTdGF0dXMgY29kZSB1c2VkIGJ5IHRoZSAnUnVuIEFudCcgc3RhdHVzIGhhbmRsZXIgd2hpY2ggaXMgaW52b2tlZCB3aGVuCisJICogdGhlIGxhdW5jaCBkaWFsb2cgaXMgb3BlbmVkIGJ5IHRoZSAnUnVuIEFudCcgYWN0aW9uLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19JTklUX1JVTl9BTlQgPSAxMDAwOworCQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJQUxPR1NUT1JFX0xBU1RFWFRKQVI9IFBMVUdJTl9JRCArICIubGFzdGV4dGphciI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESUFMT0dTVE9SRV9MQVNURVhURklMRT0gUExVR0lOX0lEICsgIi5sYXN0ZXh0ZmlsZSI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESUFMT0dTVE9SRV9MQVNURk9MREVSPSBQTFVHSU5fSUQgKyAiLmxhc3Rmb2xkZXIiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElBTE9HU1RPUkVfTEFTVEFOVEhPTUU9IFBMVUdJTl9JRCArICIubGFzdGFudGhvbWUiOyAvLyROT04tTkxTLTEkCisJCisJLyoqCisJICogU2l6ZSBvZiBsZWZ0LWhhbmQgY29sdW1uIGZvciByaWdodC1qdXN0aWZpZWQgdGFzayBuYW1lLgorCSAqIFVzZWQgZm9yIEFudCBCdWlsZCBsb2dnaW5nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmxhdW5jaGluZy5ydW50aW1lLmxvZ2dlci5BbnRQcm9jZXNzQnVpbGRMb2dnZXIKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5sYXVuY2hpbmcubGF1bmNoQ29uZmlndXJhdGlvbnMuUmVtb3RlQW50QnVpbGRMaXN0ZW5lcgorCSAgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMRUZUX0NPTFVNTl9TSVpFID0gMTU7CisJCisJLyoqCisJICogSWQgb2YgdGhlIElQcm9jZXNzRmFjdG9yeSB0byB1c2Ugd2hlbiBjcmVhdGluZyBwcm9jZXNzZXMgZm9yIHJlbW90ZSBBbnQgYnVpbGRzLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTU9URV9BTlRfUFJPQ0VTU19GQUNUT1JZX0lEPSAib3JnLmVjbGlwc2UuYW50LnVpLnJlbW90ZUFudFByb2Nlc3NGYWN0b3J5IjsgLy8kTk9OLU5MUy0xJAorCQorCS8qKgorCSAqIEJvb2xlYW4gYXR0cmlidXRlIGluZGljYXRpbmcgaWYgYW4gaW5wdXQgaGFuZGxlciBzaG91bGQgYmUgc3VwcGxpZWQgZm9yIHRoZSBidWlsZAorCSAqIERlZmF1bHQgdmFsdWUgaXMgPGNvZGU+dHJ1ZTwvY29kZT4uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VUX0lOUFVUSEFORExFUj0gUExVR0lOX0lEICsgIlNFVF9JTlBVVEhBTkRMRVIiOyAvLyROT04tTkxTLTEkCQorfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvSW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL0ltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ1MzAzMgotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL0ltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5LmphdmEKQEAgLTAsMCArMSw5MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWk7CisKKyAKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKKworLyoqCisgKiBBIHJlZ2lzdHJ5IHRoYXQgbWFwcyA8Y29kZT5JbWFnZURlc2NyaXB0b3JzPC9jb2RlPiB0byA8Y29kZT5JbWFnZTwvY29kZT4uCisgKi8KK3B1YmxpYyBjbGFzcyBJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSB7CisKKwlwcml2YXRlIEhhc2hNYXAgZlJlZ2lzdHJ5PSBuZXcgSGFzaE1hcCgxMCk7CisJcHJpdmF0ZSBEaXNwbGF5IGZEaXNwbGF5OworCQorCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgaW1hZ2UgZGVzY3JpcHRvciByZWdpc3RyeSBmb3IgdGhlIGN1cnJlbnQgb3IgZGVmYXVsdCBkaXNwbGF5LAorCSAqIHJlc3BlY3RpdmVseS4KKwkgKi8KKwlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkoKSB7CisJCXRoaXMoQW50VUlQbHVnaW4uZ2V0U3RhbmRhcmREaXNwbGF5KCkpOworCX0KKwkKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGltYWdlIGRlc2NyaXB0b3IgcmVnaXN0cnkgZm9yIHRoZSBnaXZlbiBkaXNwbGF5LiBBbGwgaW1hZ2VzCisJICogbWFuYWdlZCBieSB0aGlzIHJlZ2lzdHJ5IHdpbGwgYmUgZGlzcG9zZWQgd2hlbiB0aGUgZGlzcGxheSBnZXRzIGRpc3Bvc2VkLgorCSAqIAorCSAqIEBwYXJhbSBkaXNwbGF5IHRoZSBkaXNwbGF5IHRoZSBpbWFnZXMgbWFuYWdlZCBieSB0aGlzIHJlZ2lzdHJ5IGFyZSBhbGxvY2F0ZWQgZm9yIAorCSAqLworCXB1YmxpYyBJbWFnZURlc2NyaXB0b3JSZWdpc3RyeShEaXNwbGF5IGRpc3BsYXkpIHsKKwkJZkRpc3BsYXk9IGRpc3BsYXk7CisJCUFzc2VydC5pc05vdE51bGwoZkRpc3BsYXkpOworCQlob29rRGlzcGxheSgpOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBpbWFnZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGltYWdlIGRlc2NyaXB0b3IuCisJICogCisJICogQHBhcmFtIGRlc2NyaXB0b3IgdGhlIGltYWdlIGRlc2NyaXB0b3IgZm9yIHdoaWNoIHRoZSByZWdpc3RyeSBtYW5hZ2VzIGFuIGltYWdlCisJICogQHJldHVybiB0aGUgaW1hZ2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbWFnZSBkZXNjcmlwdG9yIG9yIDxjb2RlPm51bGw8L2NvZGU+CisJICogIGlmIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGNhbid0IGNyZWF0ZSB0aGUgcmVxdWVzdGVkIGltYWdlLgorCSAqLworCXB1YmxpYyBJbWFnZSBnZXQoSW1hZ2VEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKKwkJaWYgKGRlc2NyaXB0b3IgPT0gbnVsbCkKKwkJCWRlc2NyaXB0b3I9IEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7CisJCQkKKwkJSW1hZ2UgcmVzdWx0PSAoSW1hZ2UpZlJlZ2lzdHJ5LmdldChkZXNjcmlwdG9yKTsKKwkJaWYgKHJlc3VsdCAhPSBudWxsKQorCQkJcmV0dXJuIHJlc3VsdDsKKwkKKwkJQXNzZXJ0LmlzVHJ1ZShmRGlzcGxheSA9PSBBbnRVSVBsdWdpbi5nZXRTdGFuZGFyZERpc3BsYXkoKSwgQW50VUlNb2RlbE1lc3NhZ2VzLkltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5X0FsbG9jYXRpbmdfaW1hZ2VfZm9yX3dyb25nX2Rpc3BsYXlfMSk7CisJCXJlc3VsdD0gZGVzY3JpcHRvci5jcmVhdGVJbWFnZSgpOworCQlpZiAocmVzdWx0ICE9IG51bGwpCisJCQlmUmVnaXN0cnkucHV0KGRlc2NyaXB0b3IsIHJlc3VsdCk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoqCisJICogRGlzcG9zZXMgYWxsIGltYWdlcyBtYW5hZ2VkIGJ5IHRoaXMgcmVnaXN0cnkuCisJICovCQorCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCWZvciAoSXRlcmF0b3IgaXRlcj0gZlJlZ2lzdHJ5LnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyApIHsKKwkJCUltYWdlIGltYWdlPSAoSW1hZ2UpaXRlci5uZXh0KCk7CisJCQlpbWFnZS5kaXNwb3NlKCk7CisJCX0KKwkJZlJlZ2lzdHJ5LmNsZWFyKCk7CisJfQorCQorCXByaXZhdGUgdm9pZCBob29rRGlzcGxheSgpIHsKKwkJZkRpc3BsYXkuZGlzcG9zZUV4ZWMobmV3IFJ1bm5hYmxlKCkgeworCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCWRpc3Bvc2UoKTsKKwkJCX0JCisJCX0pOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvV29ya2JlbmNoQW50UnVubmVyLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9Xb3JrYmVuY2hBbnRSdW5uZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDU3ZGEzCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvV29ya2JlbmNoQW50UnVubmVyLmphdmEKQEAgLTAsMCArMSw1NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guYXBwLklBcHBsaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmFwcC5JQXBwbGljYXRpb25Db250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOworCisvKioKKyAqIEFwcGxpY2F0aW9uIHRvIHJ1biBhbiBBbnQgc2NyaXB0IGFmdGVyIHN0YXJ0aW5nIHRoZSB3b3JrYmVuY2guIFNodXRzIGRvd24gdGhlCisgKiB3b3JrYmVuY2ggYWZ0ZXIgdGhlIHNjcmlwdCBydW5zLgorICogCisgKiBAc2luY2UgMy40CisgKi8KK3B1YmxpYyBjbGFzcyBXb3JrYmVuY2hBbnRSdW5uZXIgaW1wbGVtZW50cyBJQXBwbGljYXRpb24geworCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXF1aW5veC5hcHAuSUFwcGxpY2F0aW9uI3N0YXJ0KG9yZy5lY2xpcHNlLmVxdWlub3guYXBwLklBcHBsaWNhdGlvbkNvbnRleHQpCisJICovCisJcHVibGljIE9iamVjdCBzdGFydChJQXBwbGljYXRpb25Db250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24geworCQlEaXNwbGF5IGRpc3BsYXkgPSBQbGF0Zm9ybVVJLmNyZWF0ZURpc3BsYXkoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXksIFNXVC5PTl9UT1ApOworCQkJc2hlbGwuZGlzcG9zZSgpOworICAgICAgICAgICAgLy8gY3JlYXRlIHRoZSB3b3JrYmVuY2ggd2l0aCB0aGlzIGFkdmlzb3IgYW5kIHJ1biBpdCB1bnRpbCBpdCBleGl0cworICAgICAgICAgICAgLy8gTi5CLiBjcmVhdGVXb3JrYmVuY2ggcmVtZW1iZXJzIHRoZSBhZHZpc29yLCBhbmQgYWxzbyByZWdpc3RlcnMKKyAgICAgICAgICAgIC8vIHRoZSB3b3JrYmVuY2ggZ2xvYmFsbHkgc28gdGhhdCBhbGwgVUkgcGx1Zy1pbnMgY2FuIGZpbmQgaXQgdXNpbmcKKyAgICAgICAgICAgIC8vIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkgb3IgQWJzdHJhY3RVSVBsdWdpbi5nZXRXb3JrYmVuY2goKQorICAgICAgICAgICAgUGxhdGZvcm1VSS5jcmVhdGVBbmRSdW5Xb3JrYmVuY2goZGlzcGxheSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IEFudFJ1bm5lcldvcmtiZW5jaEFkdmlzb3IoCisgICAgICAgICAgICAgICAgICAgIAkJY29udGV4dC5nZXRBcmd1bWVudHMoKS5nZXQoSUFwcGxpY2F0aW9uQ29udGV4dC5BUFBMSUNBVElPTl9BUkdTKSkpOworICAgICAgICAgICAgcmV0dXJuIEVYSVRfT0s7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoZGlzcGxheSAhPSBudWxsKSB7CisJCQkJZGlzcGxheS5kaXNwb3NlKCk7CisJCQl9CisgICAgICAgIH0KKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5lcXVpbm94LmFwcC5JQXBwbGljYXRpb24jc3RvcCgpCisJICovCisJcHVibGljIHZvaWQgc3RvcCgpIHsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2NvbnNvbGUvQWJzdHJhY3RKYXZhY1BhdHRlcm5NYXRjaGVyLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9jb25zb2xlL0Fic3RyYWN0SmF2YWNQYXR0ZXJuTWF0Y2hlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMDRhZWMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9jb25zb2xlL0Fic3RyYWN0SmF2YWNQYXR0ZXJuTWF0Y2hlci5qYXZhCkBAIC0wLDAgKzEsMTYzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmNvbnNvbGU7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworCitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLkFudFVJUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5JQW50VUlQcmVmZXJlbmNlQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVByb2Nlc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuY29uc29sZS5GaWxlTGluazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuY29uc29sZS5JUGF0dGVybk1hdGNoTGlzdGVuZXJEZWxlZ2F0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5jb25zb2xlLlBhdHRlcm5NYXRjaEV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNvbnNvbGUuVGV4dENvbnNvbGU7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEphdmFjUGF0dGVybk1hdGNoZXIgaW1wbGVtZW50cyBJUGF0dGVybk1hdGNoTGlzdGVuZXJEZWxlZ2F0ZSB7CisKKyAgICBwcm90ZWN0ZWQgVGV4dENvbnNvbGUgZkNvbnNvbGU7CisgICAgcHJpdmF0ZSBzdGF0aWMgUGF0dGVybiBmZ0xpbmVOdW1iZXJQYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKCJcXGQrIik7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIHN0YXRpYyBMaXN0IGZnUGF0dGVybk1hdGNoZXJzPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgcHJpdmF0ZSBNYXAgZkZpbGVOYW1lVG9JRmlsZT0gbmV3IEhhc2hNYXAoKTsKKyAgICAKKwlwcml2YXRlIEphdmFjTWFya2VyQ3JlYXRvciBmTWFya2VyQ3JlYXRvcjsKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEludGVnZXIgZmdXYXJuaW5nVHlwZT0gbmV3IEludGVnZXIoSU1hcmtlci5TRVZFUklUWV9XQVJOSU5HKTsKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEludGVnZXIgZmdFcnJvclR5cGU9IG5ldyBJbnRlZ2VyKElNYXJrZXIuU0VWRVJJVFlfRVJST1IpOworCisgICAgLyogKG5vbi1KYXZhZG9jKQorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuY29uc29sZS5JUGF0dGVybk1hdGNoTGlzdGVuZXJEZWxlZ2F0ZSNjb25uZWN0KG9yZy5lY2xpcHNlLnVpLmNvbnNvbGUuVGV4dENvbnNvbGUpCisgICAgICovCisgICAgcHVibGljIHZvaWQgY29ubmVjdChUZXh0Q29uc29sZSBjb25zb2xlKSB7CisgICAgICAgIGZDb25zb2xlPSBjb25zb2xlOworICAgICAgICBJUHJlZmVyZW5jZVN0b3JlIHN0b3JlPSBBbnRVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7CisJCWlmIChzdG9yZS5nZXRCb29sZWFuKElBbnRVSVByZWZlcmVuY2VDb25zdGFudHMuQU5UX0NSRUFURV9NQVJLRVJTKSkgeworICAgICAgICAJZk1hcmtlckNyZWF0b3I9IG5ldyBKYXZhY01hcmtlckNyZWF0b3IoZkNvbnNvbGUsIHRoaXMgaW5zdGFuY2VvZiBFY2xpcHNlSmF2YWNQYXR0ZXJuTWF0Y2hlcik7CisgICAgICAgIAlmZ1BhdHRlcm5NYXRjaGVycy5hZGQodGhpcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiAobm9uLUphdmFkb2MpCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5jb25zb2xlLklQYXR0ZXJuTWF0Y2hMaXN0ZW5lckRlbGVnYXRlI2Rpc2Nvbm5lY3QoKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRpc2Nvbm5lY3QoKSB7CisgICAgICAgIGZDb25zb2xlID0gbnVsbDsKKyAgICAgICAgZkZpbGVOYW1lVG9JRmlsZS5jbGVhcigpOworICAgIH0KKyAgICAKKyAgICBwcm90ZWN0ZWQgSUZpbGUgZ2V0SUZpbGUoU3RyaW5nIGZpbGVQYXRoKSB7CisgICAgICAgIGlmIChmaWxlUGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsgCisgICAgICAgIH0KKyAgICAgICAgSUZpbGUgZmlsZT0gKElGaWxlKSBmRmlsZU5hbWVUb0lGaWxlLmdldChmaWxlUGF0aCk7CisgICAgICAgIGlmIChmaWxlID09IG51bGwpIHsKKyAgICAgICAgICAgIElGaWxlW10gZmlsZXMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRGaWxlc0ZvckxvY2F0aW9uKG5ldyBQYXRoKGZpbGVQYXRoKSk7CisgICAgICAgICAgICBpZiAoZmlsZXMubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgIGZpbGUgPSBmaWxlc1swXTsKKyAgICAgICAgICAgICAgICBmRmlsZU5hbWVUb0lGaWxlLnB1dChmaWxlUGF0aCwgZmlsZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZpbGU7CisgICAgfQorICAgIAorICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0TWF0Y2hlZFRleHQoUGF0dGVybk1hdGNoRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgaW50IGV2ZW50T2Zmc2V0PSBldmVudC5nZXRPZmZzZXQoKTsKKyAgICAgICAgaW50IGV2ZW50TGVuZ3RoPSBldmVudC5nZXRMZW5ndGgoKTsKKyAgICAgICAgSURvY3VtZW50IGRvY3VtZW50PSBmQ29uc29sZS5nZXREb2N1bWVudCgpOworICAgICAgICBTdHJpbmcgbWF0Y2hlZFRleHQ9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtYXRjaGVkVGV4dD0gZG9jdW1lbnQuZ2V0KGV2ZW50T2Zmc2V0LCBldmVudExlbmd0aCk7CisgICAgICAgIH0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIEFudFVJUGx1Z2luLmxvZyhlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbWF0Y2hlZFRleHQ7CisgICAgfQorICAgIAorICAgIHByb3RlY3RlZCBpbnQgZ2V0TGluZU51bWJlcihpbnQgZXZlbnRPZmZzZXQsIGJvb2xlYW4gc2FtZUxpbmUpIHsKKyAgICAgICAgSURvY3VtZW50IGRvY3VtZW50PSBmQ29uc29sZS5nZXREb2N1bWVudCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IGZpbGVMaW5lID0gZG9jdW1lbnQuZ2V0TGluZU9mT2Zmc2V0KGV2ZW50T2Zmc2V0KTsKKyAgICAgICAgICAgIGlmICghc2FtZUxpbmUpIHsKKyAgICAgICAgICAgIAlmaWxlTGluZSArPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgSVJlZ2lvbiByZWdpb24gPSBkb2N1bWVudC5nZXRMaW5lSW5mb3JtYXRpb24oZmlsZUxpbmUpOworICAgICAgICAgICAgaW50IHJlZ2lvbkxlbmd0aCA9IHJlZ2lvbi5nZXRMZW5ndGgoKTsKKyAgICAgICAgICAgIGlmIChyZWdpb24uZ2V0T2Zmc2V0KCkgIT0gZXZlbnRPZmZzZXQpIHsKKyAgICAgICAgICAgIAkgcmVnaW9uTGVuZ3RoID0gcmVnaW9uTGVuZ3RoIC0gKGV2ZW50T2Zmc2V0IC0gcmVnaW9uLmdldE9mZnNldCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorCQkJU3RyaW5nIGxpbmVMaW5lID0gZG9jdW1lbnQuZ2V0KGV2ZW50T2Zmc2V0LCByZWdpb25MZW5ndGgpOworICAgICAgICAgICAgTWF0Y2hlciBtYXRjaGVyID0gbnVsbDsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAoZmdMaW5lTnVtYmVyUGF0dGVybikgeworICAgICAgICAgICAgICAgIG1hdGNoZXIgPSBmZ0xpbmVOdW1iZXJQYXR0ZXJuLm1hdGNoZXIobGluZUxpbmUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1hdGNoZXIuZmluZCgpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGxpbmVTdHJpbmcgPSBtYXRjaGVyLmdyb3VwKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEludGVnZXIucGFyc2VJbnQobGluZVN0cmluZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgQW50VUlQbHVnaW4ubG9nKGUpOworICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgQW50VUlQbHVnaW4ubG9nKGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgCisgICAgcHJvdGVjdGVkIHZvaWQgYWRkTGluayhTdHJpbmcgZmlsZVBhdGgsIGludCBsaW5lTnVtYmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBJbnRlZ2VyIHR5cGUpIHsKKyAgICAgICAgSUZpbGUgZmlsZT0gZ2V0SUZpbGUoZmlsZVBhdGgpOworICAgICAgICBpZiAoZmlsZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChmTWFya2VyQ3JlYXRvciAhPSBudWxsKSB7CisgICAgICAgIAlpZiAodHlwZSA9PSBudWxsKSB7IC8vbWF0Y2ggZm9yIGxpc3RmaWxlcworICAgICAgICAJCWZNYXJrZXJDcmVhdG9yLmFkZEZpbGVUb0JlQ2xlYW5lZChmaWxlKTsKKyAgICAgICAgCX0gZWxzZSB7IC8vbWF0Y2ggZm9yIGVycm9yIG9yIHdhcm5pbmcKKyAgICAgICAgCQlmTWFya2VyQ3JlYXRvci5hZGRNYXJrZXIoZmlsZSwgbGluZU51bWJlciwgb2Zmc2V0LCB0eXBlKTsKKyAgICAgICAgCX0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgRmlsZUxpbmsgbGluayA9IG5ldyBGaWxlTGluayhmaWxlLCBudWxsLCAtMSwgLTEsIGxpbmVOdW1iZXIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZkNvbnNvbGUuYWRkSHlwZXJsaW5rKGxpbmssIG9mZnNldCwgbGVuZ3RoKTsKKyAgICAgICAgfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgQW50VUlQbHVnaW4ubG9nKGUpOworICAgICAgICB9CisgICAgfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGNvbnNvbGVDbG9zZWQoSVByb2Nlc3MgcHJvY2VzcykgeworCQlJdGVyYXRvciBpdGVyPSBuZXcgQXJyYXlMaXN0KGZnUGF0dGVybk1hdGNoZXJzKS5pdGVyYXRvcigpOworCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKwkJCUFic3RyYWN0SmF2YWNQYXR0ZXJuTWF0Y2hlciBtYXRjaGVyID0gKEFic3RyYWN0SmF2YWNQYXR0ZXJuTWF0Y2hlcikgaXRlci5uZXh0KCk7CisJCQltYXRjaGVyLmZpbmlzaGVkKHByb2Nlc3MpOworCQl9CisJfQorCisJcHJvdGVjdGVkIHZvaWQgZmluaXNoZWQoSVByb2Nlc3MgcHJvY2VzcykgeworCQlpZiAoZk1hcmtlckNyZWF0b3IgIT0gbnVsbCkgeworCQkJZk1hcmtlckNyZWF0b3IuZmluaXNoZWQocHJvY2Vzcyk7CisJCQlmZ1BhdHRlcm5NYXRjaGVycy5yZW1vdmUodGhpcyk7CisJCX0KKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvY29uc29sZS9BbnRDb25zb2xlQ29sb3JQcm92aWRlci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvY29uc29sZS9BbnRDb25zb2xlQ29sb3JQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1NzZiZDQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9jb25zb2xlL0FudENvbnNvbGVDb2xvclByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxMTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmNvbnNvbGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwubGF1bmNoaW5nLmxhdW5jaENvbmZpZ3VyYXRpb25zLkFudFN0cmVhbXNQcm94eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuQW50VUlQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLklBbnRVSVByZWZlcmVuY2VDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JUHJvY2VzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JRGVidWdVSUNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5jb25zb2xlLkNvbnNvbGVDb2xvclByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLmNvbnNvbGUuSUNvbnNvbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNvbnNvbGUuSU9Db25zb2xlT3V0cHV0U3RyZWFtOworCisKK3B1YmxpYyBjbGFzcyBBbnRDb25zb2xlQ29sb3JQcm92aWRlciBleHRlbmRzIENvbnNvbGVDb2xvclByb3ZpZGVyIGltcGxlbWVudHMgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgeworCisgICAgCisJCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuY29uc29sZS5JQ29uc29sZUNvbG9yUHJvdmlkZXIjZ2V0Q29sb3IoamF2YS5sYW5nLlN0cmluZykKKwkgKi8KKwlwdWJsaWMgQ29sb3IgZ2V0Q29sb3IoU3RyaW5nIHN0cmVhbUlkZW50aWZlcikgeworCQlpZiAoc3RyZWFtSWRlbnRpZmVyLmVxdWFscyhJRGVidWdVSUNvbnN0YW50cy5JRF9TVEFOREFSRF9PVVRQVVRfU1RSRUFNKSkgeworCQkJcmV0dXJuIEFudFVJUGx1Z2luLmdldFByZWZlcmVuY2VDb2xvcihJQW50VUlQcmVmZXJlbmNlQ29uc3RhbnRzLkNPTlNPTEVfSU5GT19DT0xPUik7CisJCX0KKwkJaWYgKHN0cmVhbUlkZW50aWZlci5lcXVhbHMoSURlYnVnVUlDb25zdGFudHMuSURfU1RBTkRBUkRfRVJST1JfU1RSRUFNKSkgeworCQkJcmV0dXJuIEFudFVJUGx1Z2luLmdldFByZWZlcmVuY2VDb2xvcihJQW50VUlQcmVmZXJlbmNlQ29uc3RhbnRzLkNPTlNPTEVfRVJST1JfQ09MT1IpOworCQl9CQkJCQorCQlpZiAoc3RyZWFtSWRlbnRpZmVyLmVxdWFscyhBbnRTdHJlYW1zUHJveHkuQU5UX0RFQlVHX1NUUkVBTSkpIHsKKwkJCXJldHVybiBBbnRVSVBsdWdpbi5nZXRQcmVmZXJlbmNlQ29sb3IoSUFudFVJUHJlZmVyZW5jZUNvbnN0YW50cy5DT05TT0xFX0RFQlVHX0NPTE9SKTsKKwkJfQorCQlpZiAoc3RyZWFtSWRlbnRpZmVyLmVxdWFscyhBbnRTdHJlYW1zUHJveHkuQU5UX1ZFUkJPU0VfU1RSRUFNKSkgeworCQkJcmV0dXJuIEFudFVJUGx1Z2luLmdldFByZWZlcmVuY2VDb2xvcihJQW50VUlQcmVmZXJlbmNlQ29uc3RhbnRzLkNPTlNPTEVfVkVSQk9TRV9DT0xPUik7CisJCX0KKwkJaWYgKHN0cmVhbUlkZW50aWZlci5lcXVhbHMoQW50U3RyZWFtc1Byb3h5LkFOVF9XQVJOSU5HX1NUUkVBTSkpIHsKKwkJCXJldHVybiBBbnRVSVBsdWdpbi5nZXRQcmVmZXJlbmNlQ29sb3IoSUFudFVJUHJlZmVyZW5jZUNvbnN0YW50cy5DT05TT0xFX1dBUk5JTkdfQ09MT1IpOworCQl9CisJCXJldHVybiBzdXBlci5nZXRDb2xvcihzdHJlYW1JZGVudGlmZXIpOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLmNvbnNvbGUuSUNvbnNvbGVDb2xvclByb3ZpZGVyI2Nvbm5lY3Qob3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JUHJvY2Vzcywgb3JnLmVjbGlwc2UuZGVidWcudWkuY29uc29sZS5JQ29uc29sZSkKKwkgKi8KKwlwdWJsaWMgdm9pZCBjb25uZWN0KElQcm9jZXNzIHByb2Nlc3MsIElDb25zb2xlIGNvbnNvbGUpIHsKKwkJLy9Cb3RoIHJlbW90ZSBhbmQgbG9jYWwgQW50IGJ1aWxkcyBhcmUgZ3VhcmFudGVlZCB0byBoYXZlCisJCS8vYW4gQW50U3RyZWFtc1Byb3h5LiBUaGUgcmVtb3RlIEFudCBidWlsZHMgbWFrZSB1c2Ugb2YgdGhlCisJCS8vIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUucHJvY2Vzc0ZhY3RvcmllcyBleHRlbnNpb24gcG9pbnQKKwkJQW50U3RyZWFtc1Byb3h5IHByb3h5ID0gKEFudFN0cmVhbXNQcm94eSlwcm9jZXNzLmdldFN0cmVhbXNQcm94eSgpOworCQlpZiAocHJveHkgIT0gbnVsbCkgeworCQkJY29uc29sZS5jb25uZWN0KHByb3h5LmdldERlYnVnU3RyZWFtTW9uaXRvcigpLCBBbnRTdHJlYW1zUHJveHkuQU5UX0RFQlVHX1NUUkVBTSk7CisJCQljb25zb2xlLmNvbm5lY3QocHJveHkuZ2V0V2FybmluZ1N0cmVhbU1vbml0b3IoKSwgQW50U3RyZWFtc1Byb3h5LkFOVF9XQVJOSU5HX1NUUkVBTSk7CisJCQljb25zb2xlLmNvbm5lY3QocHJveHkuZ2V0VmVyYm9zZVN0cmVhbU1vbml0b3IoKSwgQW50U3RyZWFtc1Byb3h5LkFOVF9WRVJCT1NFX1NUUkVBTSk7CisJCX0KKwkJCisJCUFudFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRoaXMpOworCQlzdXBlci5jb25uZWN0KHByb2Nlc3MsIGNvbnNvbGUpOworCX0KKwkKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5jb25zb2xlLklDb25zb2xlQ29sb3JQcm92aWRlciNpc1JlYWRPbmx5KCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciNwcm9wZXJ0eUNoYW5nZShvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQpCisJICovCisJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgeworCSAgICBmaW5hbCBTdHJpbmcgc3RyZWFtSWQgPSBnZXRTdHJlYW1JZChldmVudC5nZXRQcm9wZXJ0eSgpKTsKKwkJaWYgKHN0cmVhbUlkICE9IG51bGwpIHsKKwkJCUFudFVJUGx1Z2luLmdldFN0YW5kYXJkRGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7CisJCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCSAgICBJT0NvbnNvbGVPdXRwdXRTdHJlYW0gc3RyZWFtID0gZ2V0Q29uc29sZSgpLmdldFN0cmVhbShzdHJlYW1JZCk7CisJCQkJICAgIGlmIChzdHJlYW0gIT0gbnVsbCkgeworCQkJCSAgICAgICAgc3RyZWFtLnNldENvbG9yKGdldENvbG9yKHN0cmVhbUlkKSk7CisJCQkJICAgIH0KKwkJCQl9CisJCQl9KTsKKwkJfQorCX0KKworCXByaXZhdGUgU3RyaW5nIGdldFN0cmVhbUlkKFN0cmluZyBjb2xvcklkKSB7CisJCWlmIChJQW50VUlQcmVmZXJlbmNlQ29uc3RhbnRzLkNPTlNPTEVfREVCVUdfQ09MT1IuZXF1YWxzKGNvbG9ySWQpKSB7CisJCQlyZXR1cm4gQW50U3RyZWFtc1Byb3h5LkFOVF9ERUJVR19TVFJFQU07CisJCX0gZWxzZSBpZiAoSUFudFVJUHJlZmVyZW5jZUNvbnN0YW50cy5DT05TT0xFX0VSUk9SX0NPTE9SLmVxdWFscyhjb2xvcklkKSkgeworCQkJcmV0dXJuIElEZWJ1Z1VJQ29uc3RhbnRzLklEX1NUQU5EQVJEX0VSUk9SX1NUUkVBTTsKKwkJfSBlbHNlIGlmIChJQW50VUlQcmVmZXJlbmNlQ29uc3RhbnRzLkNPTlNPTEVfSU5GT19DT0xPUi5lcXVhbHMoY29sb3JJZCkpIHsKKwkJCXJldHVybiBJRGVidWdVSUNvbnN0YW50cy5JRF9TVEFOREFSRF9PVVRQVVRfU1RSRUFNOworCQl9IGVsc2UgaWYgKElBbnRVSVByZWZlcmVuY2VDb25zdGFudHMuQ09OU09MRV9WRVJCT1NFX0NPTE9SLmVxdWFscyhjb2xvcklkKSkgeworCQkJcmV0dXJuIEFudFN0cmVhbXNQcm94eS5BTlRfVkVSQk9TRV9TVFJFQU07CisJCX0gZWxzZSBpZiAoSUFudFVJUHJlZmVyZW5jZUNvbnN0YW50cy5DT05TT0xFX1dBUk5JTkdfQ09MT1IuZXF1YWxzKGNvbG9ySWQpKSB7CisJCQlyZXR1cm4gQW50U3RyZWFtc1Byb3h5LkFOVF9XQVJOSU5HX1NUUkVBTTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuY29uc29sZS5JQ29uc29sZUNvbG9yUHJvdmlkZXIjZGlzY29ubmVjdCgpCisJICovCisJcHVibGljIHZvaWQgZGlzY29ubmVjdCgpIHsKKwkJQW50VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7CisJCXN1cGVyLmRpc2Nvbm5lY3QoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9jb25zb2xlL0NvbnNvbGVNZXNzYWdlcy5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvY29uc29sZS9Db25zb2xlTWVzc2FnZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDlkYTNkCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvY29uc29sZS9Db25zb2xlTWVzc2FnZXMuamF2YQpAQCAtMCwwICsxLDI0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuY29uc29sZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CisKK3B1YmxpYyBjbGFzcyBDb25zb2xlTWVzc2FnZXMgZXh0ZW5kcyBOTFMgeworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuY29uc29sZS5Db25zb2xlTWVzc2FnZXMiOy8vJE5PTi1OTFMtMSQKKwkKKwlzdGF0aWMgeworCQkvLyBsb2FkIG1lc3NhZ2UgdmFsdWVzIGZyb20gYnVuZGxlIGZpbGUKKwkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgQ29uc29sZU1lc3NhZ2VzLmNsYXNzKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBKYXZhY01hcmtlckNyZWF0b3JfMDsKK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2NvbnNvbGUvRWNsaXBzZUphdmFjUGF0dGVybk1hdGNoZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2NvbnNvbGUvRWNsaXBzZUphdmFjUGF0dGVybk1hdGNoZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2NhN2U0Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvY29uc29sZS9FY2xpcHNlSmF2YWNQYXR0ZXJuTWF0Y2hlci5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuY29uc29sZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNvbnNvbGUuUGF0dGVybk1hdGNoRXZlbnQ7CisKK3B1YmxpYyBjbGFzcyBFY2xpcHNlSmF2YWNQYXR0ZXJuTWF0Y2hlciBleHRlbmRzIEFic3RyYWN0SmF2YWNQYXR0ZXJuTWF0Y2hlciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZmdFcnJvcj0gIkVSUk9SIGluIjsgLy8kTk9OLU5MUy0xJAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBmZ1dhcm5pbmc9ICJXQVJOSU5HIGluIjsgLy8kTk9OLU5MUy0xJAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBmZ1N0YXJ0T2ZMaW5lTnVtYmVyPSAiICgiOyAvLyROT04tTkxTLTEkCisgICAgCisgICAgLyogW2phdmFjXSAxLiBFUlJPUiBpbiAvVXNlcnMva2V2aW5iYXJuZXMvRWNsaXBzZS9ydW50aW1lLXdvcmtzcGFjZS9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmNfYW50L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9jb3JlL2FudC9JbnRlcm5hbEFudFJ1bm5lci5qYXZhIChhdCBsaW5lIDY2KQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG1hdGNoRm91bmQoUGF0dGVybk1hdGNoRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgU3RyaW5nIG1hdGNoZWRUZXh0PSBnZXRNYXRjaGVkVGV4dChldmVudCk7CisgICAgICAgIGlmIChtYXRjaGVkVGV4dCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaW50IGluZGV4ID0gbWF0Y2hlZFRleHQuaW5kZXhPZihmZ0Vycm9yKTsKKyAgICAgICAgU3RyaW5nIGZpbGVQYXRoOworICAgICAgICBJbnRlZ2VyIHR5cGU9IGZnRXJyb3JUeXBlOworICAgICAgICBpZiAoaW5kZXggPT0gLTEpIHsKKyAgICAgICAgICAgIGluZGV4ID0gbWF0Y2hlZFRleHQuaW5kZXhPZihmZ1dhcm5pbmcpOworICAgICAgICAgICAgZmlsZVBhdGg9IG1hdGNoZWRUZXh0LnN1YnN0cmluZyhpbmRleCArIDEwKS50cmltKCk7CisgICAgICAgICAgICB0eXBlPSBmZ1dhcm5pbmdUeXBlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmlsZVBhdGg9IG1hdGNoZWRUZXh0LnN1YnN0cmluZyhpbmRleCArIDgpLnRyaW0oKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBsaW5lTnVtYmVyU3RhcnQgPSBmaWxlUGF0aC5sYXN0SW5kZXhPZihmZ1N0YXJ0T2ZMaW5lTnVtYmVyKTsKKyAgICAgICAgaWYgKGxpbmVOdW1iZXJTdGFydCAhPSAtMSkgeworICAgICAgICAJZmlsZVBhdGggPSBmaWxlUGF0aC5zdWJzdHJpbmcoMCwgbGluZU51bWJlclN0YXJ0KTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaW50IGZpbGVTdGFydCA9IG1hdGNoZWRUZXh0LmluZGV4T2YoZmlsZVBhdGgpOworICAgICAgICBpbnQgZXZlbnRPZmZzZXQ9IGV2ZW50LmdldE9mZnNldCgpICsgZmlsZVN0YXJ0OworICAgICAgICBpbnQgZXZlbnRMZW5ndGggPSBmaWxlUGF0aC5sZW5ndGgoKTsKKyAgICAgICAgCisgICAgICAgIGludCBsaW5lTnVtYmVyID0gZ2V0TGluZU51bWJlcihsaW5lTnVtYmVyU3RhcnQgKyBldmVudE9mZnNldCwgdHJ1ZSk7CisgICAgICAgIGFkZExpbmsoZmlsZVBhdGgsIGxpbmVOdW1iZXIsIGV2ZW50T2Zmc2V0LCBldmVudExlbmd0aCwgdHlwZSk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2NvbnNvbGUvSmF2YWNNYXJrZXJDcmVhdG9yLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9jb25zb2xlL0phdmFjTWFya2VyQ3JlYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3NzZhNWQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9jb25zb2xlL0phdmFjTWFya2VyQ3JlYXRvci5qYXZhCkBAIC0wLDAgKzEsMTc4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5jb25zb2xlOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5BbnRVSVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VSdWxlRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklTY2hlZHVsaW5nUnVsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklQcm9jZXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmludGVybmFsLnVpLnZpZXdzLmNvbnNvbGUuUHJvY2Vzc0NvbnNvbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbE1hcmtlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRmluZFJlcGxhY2VEb2N1bWVudEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNvbnNvbGUuVGV4dENvbnNvbGU7CisKK3B1YmxpYyBjbGFzcyBKYXZhY01hcmtlckNyZWF0b3IgeworCisJcHJpdmF0ZSBmaW5hbCBUZXh0Q29uc29sZSBmQ29uc29sZTsKKwlwcml2YXRlIElQcm9jZXNzIGZQcm9jZXNzOworCXByaXZhdGUgc3RhdGljIExpc3QgZmdGaWxlc1RvQmVDbGVhbmVkPSBuZXcgQXJyYXlMaXN0KCk7CisJcHJpdmF0ZSBNYXAgZkZpbGVUb01hcmtlckluZm89IG5ldyBIYXNoTWFwKCk7CisJcHJpdmF0ZSBmaW5hbCBib29sZWFuIGZVc2VDdXN0b21NZXNzYWdlOworCisJcHJpdmF0ZSBjbGFzcyBNYXJrZXJJbmZvIHsKKwkJCisJCXB1YmxpYyBpbnQgZkxpbmVOdW1iZXI7CisJCXB1YmxpYyBpbnQgZk9mZnNldDsKKwkJcHVibGljIEludGVnZXIgZlR5cGU7CisKKwkJcHVibGljIHZvaWQgc2V0TGluZU51bWJlcihpbnQgbGluZU51bWJlcikgeworCQkJZkxpbmVOdW1iZXI9IGxpbmVOdW1iZXI7CisJCX0KKwkJcHVibGljIHZvaWQgc2V0T2Zmc2V0KGludCBvZmZzZXQpIHsKKwkJCWZPZmZzZXQgPSBvZmZzZXQ7CisJCX0KKwkJcHVibGljIHZvaWQgc2V0VHlwZShJbnRlZ2VyIHR5cGUpIHsKKwkJCWZUeXBlPSB0eXBlOworCQkJCisJCX0KKwl9CisJcHVibGljIEphdmFjTWFya2VyQ3JlYXRvcihUZXh0Q29uc29sZSBjb25zb2xlLCBib29sZWFuIHVzZUN1c3RvbU1lc3NhZ2UpIHsKKwkJZkNvbnNvbGUgPSBjb25zb2xlOworCQlmVXNlQ3VzdG9tTWVzc2FnZSA9IHVzZUN1c3RvbU1lc3NhZ2U7CisJCWlmIChmQ29uc29sZSBpbnN0YW5jZW9mIFByb2Nlc3NDb25zb2xlKSB7CisJCQlmUHJvY2Vzcz0gKChQcm9jZXNzQ29uc29sZSkgZkNvbnNvbGUpLmdldFByb2Nlc3MoKTsKKwkJfQorCX0KKworCXByb3RlY3RlZCBJU2NoZWR1bGluZ1J1bGUgZ2V0TWFya2VyUnVsZShJUmVzb3VyY2UgcmVzb3VyY2UpIHsKKwkgICAgSVNjaGVkdWxpbmdSdWxlIHJ1bGUgPSBudWxsOworCSAgICBpZiAocmVzb3VyY2UgIT0gbnVsbCkgeworCSAgICAgICAgSVJlc291cmNlUnVsZUZhY3RvcnkgcnVsZUZhY3RvcnkgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0UnVsZUZhY3RvcnkoKTsKKwkgICAgICAgIHJ1bGUgPSBydWxlRmFjdG9yeS5tYXJrZXJSdWxlKHJlc291cmNlKTsKKwkgICAgfQorCSAgICByZXR1cm4gcnVsZTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBydW4oSVNjaGVkdWxpbmdSdWxlIHJ1bGUsIElXb3Jrc3BhY2VSdW5uYWJsZSB3cikgeworCQl0cnkgeworCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bih3ciwgcnVsZSwgMCwgbnVsbCk7CisJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJQW50VUlQbHVnaW4ubG9nKGUuZ2V0U3RhdHVzKCkpOworCQl9CQkJCisJfQorCisJcHJvdGVjdGVkIHZvaWQgYWRkRmlsZVRvQmVDbGVhbmVkKElGaWxlIGZpbGUpIHsKKwkJZmdGaWxlc1RvQmVDbGVhbmVkLmFkZChmaWxlKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgYWRkTWFya2VyKElGaWxlIGZpbGUsIGludCBsaW5lTnVtYmVyLCBpbnQgb2Zmc2V0LCBJbnRlZ2VyIHR5cGUpIHsKKwkJTWFya2VySW5mbyBpbmZvPSBuZXcgTWFya2VySW5mbygpOworCQlpbmZvLnNldExpbmVOdW1iZXIobGluZU51bWJlcik7CisJCWluZm8uc2V0T2Zmc2V0KG9mZnNldCk7CisJCWluZm8uc2V0VHlwZSh0eXBlKTsKKwkJTGlzdCBpbmZvcz0gKExpc3QpIGZGaWxlVG9NYXJrZXJJbmZvLmdldChmaWxlKTsKKwkJaWYgKGluZm9zID09IG51bGwpIHsKKwkJCWluZm9zPSBuZXcgQXJyYXlMaXN0KCk7CisJCQlmRmlsZVRvTWFya2VySW5mby5wdXQoZmlsZSwgaW5mb3MpOworCQl9CisJCWluZm9zLmFkZChpbmZvKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZU1hcmtlcnMoZmluYWwgSUZpbGUgZmlsZSwgZmluYWwgTGlzdCBpbmZvcykgeworCQlJV29ya3NwYWNlUnVubmFibGUgd3I9IG5ldyBJV29ya3NwYWNlUnVubmFibGUoKSB7CisJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCQkJCisJCQkJdHJ5IHsKKwkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gaW5mb3MuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisJCQkJCQlNYXJrZXJJbmZvIGluZm8gPSAoTWFya2VySW5mbykgaXRlci5uZXh0KCk7CisJCQkJCQlJTWFya2VyIG1hcmtlcj0gZmlsZS5jcmVhdGVNYXJrZXIoSUphdmFNb2RlbE1hcmtlci5KQVZBX01PREVMX1BST0JMRU1fTUFSS0VSKTsKKwkJCQkJCU1hcCBhdHRyaWJ1dGVzPSBuZXcgSGFzaE1hcCgzKTsKKwkJCQkJCWF0dHJpYnV0ZXMucHV0KElNYXJrZXIuTElORV9OVU1CRVIsIG5ldyBJbnRlZ2VyKGluZm8uZkxpbmVOdW1iZXIpKTsKKwkJCQkJCVN0cmluZyBtZXNzYWdlPSBnZXRNZXNzYWdlKGluZm8pOworCQkJCQkJYXR0cmlidXRlcy5wdXQoSU1hcmtlci5NRVNTQUdFLCBtZXNzYWdlKTsKKwkJCQkJCWF0dHJpYnV0ZXMucHV0KElNYXJrZXIuU0VWRVJJVFksIGluZm8uZlR5cGUpOworCQkJCQkJbWFya2VyLnNldEF0dHJpYnV0ZXMoYXR0cmlidXRlcyk7CisJCQkJCX0KKwkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCQkJQW50VUlQbHVnaW4ubG9nKGUuZ2V0U3RhdHVzKCkpOworCQkJCX0JCisJCQl9CisJCX07CisJCXJ1bihnZXRNYXJrZXJSdWxlKGZpbGUpLCB3cik7CisJfQorCisJcHJvdGVjdGVkIFN0cmluZyBnZXRNZXNzYWdlKE1hcmtlckluZm8gaW5mbykgeworCQlJRG9jdW1lbnQgZG9jPSBmQ29uc29sZS5nZXREb2N1bWVudCgpOworCQlTdHJpbmcgbWVzc2FnZT0gQ29uc29sZU1lc3NhZ2VzLkphdmFjTWFya2VyQ3JlYXRvcl8wOworCQlpZiAoZlVzZUN1c3RvbU1lc3NhZ2UpIHsKKwkJCUZpbmRSZXBsYWNlRG9jdW1lbnRBZGFwdGVyIGFkYXB0ZXI9IG5ldyBGaW5kUmVwbGFjZURvY3VtZW50QWRhcHRlcihkb2MpOworCQkJdHJ5IHsKKwkJCQlJUmVnaW9uIG1hdGNoPWFkYXB0ZXIuZmluZChpbmZvLmZPZmZzZXQsICJbamF2YWNdIC0tLS0tLS0tLS0iLCB0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAorCQkJCWlmIChtYXRjaCAhPSBudWxsKSB7CisJCQkJCW1hdGNoPSBhZGFwdGVyLmZpbmQobWF0Y2guZ2V0T2Zmc2V0KCksICJbamF2YWNdIiwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOyAvLyROT04tTkxTLTEkCisJCQkJCWlmIChtYXRjaCAhPSBudWxsKSB7CisJCQkJCQlpbnQgc3RhcnQ9IG1hdGNoLmdldE9mZnNldCgpICsgbWF0Y2guZ2V0TGVuZ3RoKCkgKyAxOworCQkJCQkJSVJlZ2lvbiBsaW5lSW5mbz0gZG9jLmdldExpbmVJbmZvcm1hdGlvbk9mT2Zmc2V0KHN0YXJ0KTsKKwkJCQkJCW1lc3NhZ2U9IGRvYy5nZXQoc3RhcnQsIGxpbmVJbmZvLmdldE9mZnNldCgpIC0gc3RhcnQgKyBsaW5lSW5mby5nZXRMZW5ndGgoKSk7CisJCQkJCX0KKwkJCQl9CisJCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7CisJCQkJQW50VUlQbHVnaW4ubG9nKGUpOworCQkJfQorCQl9CisJCQorCQlyZXR1cm4gbWVzc2FnZTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBmaW5pc2hlZChJUHJvY2VzcyBwcm9jZXNzKSB7CisJCWlmIChwcm9jZXNzLmVxdWFscyhmUHJvY2VzcykpIHsKKwkJCWlmICghZmdGaWxlc1RvQmVDbGVhbmVkLmlzRW1wdHkoKSkgeworCQkJCUl0ZXJhdG9yIGl0cj0gZmdGaWxlc1RvQmVDbGVhbmVkLml0ZXJhdG9yKCk7CisJCQkJd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKKwkJCQkJSUZpbGUgZmlsZSA9IChJRmlsZSkgaXRyLm5leHQoKTsKKwkJCQkJdHJ5IHsKKwkJCQkJCWZpbGUuZGVsZXRlTWFya2VycyhJSmF2YU1vZGVsTWFya2VyLkpBVkFfTU9ERUxfUFJPQkxFTV9NQVJLRVIsIHRydWUsIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7CisJCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJCQkJQW50VUlQbHVnaW4ubG9nKGUuZ2V0U3RhdHVzKCkpOworCQkJCQl9CQkJCQkKKwkJCQl9CisJCQl9CisJCQlpZiAoIWZGaWxlVG9NYXJrZXJJbmZvLmlzRW1wdHkoKSkgeworCQkJCS8vZ2VuZXJhdGUgbWFya2VycyBmb3IgYWxsIHRoZSB3YXJuaW5ncyBhbmQgZXJyb3JzCisJCQkJSXRlcmF0b3IgZmlsZXM9IGZGaWxlVG9NYXJrZXJJbmZvLmtleVNldCgpLml0ZXJhdG9yKCk7CisJCQkJd2hpbGUgKGZpbGVzLmhhc05leHQoKSkgeworCQkJCQlJRmlsZSBmaWxlID0gKElGaWxlKSBmaWxlcy5uZXh0KCk7CisJCQkJCUxpc3QgaW5mb3M9IChMaXN0KSBmRmlsZVRvTWFya2VySW5mby5nZXQoZmlsZSk7CisJCQkJCWNyZWF0ZU1hcmtlcnMoZmlsZSwgaW5mb3MpOwkKKwkJCQl9CQorCQkJfQorCQkJCisJCQlmRmlsZVRvTWFya2VySW5mby5jbGVhcigpOworCQkJZmdGaWxlc1RvQmVDbGVhbmVkLmNsZWFyKCk7CisJCX0KKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvY29uc29sZS9KYXZhY1BhdHRlcm5NYXRjaGVyLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9jb25zb2xlL0phdmFjUGF0dGVybk1hdGNoZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTRlYTEwCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvY29uc29sZS9KYXZhY1BhdHRlcm5NYXRjaGVyLmphdmEKQEAgLTAsMCArMSw2NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5jb25zb2xlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLkFudFVJUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNvbnNvbGUuUGF0dGVybk1hdGNoRXZlbnQ7CisKK3B1YmxpYyBjbGFzcyBKYXZhY1BhdHRlcm5NYXRjaGVyIGV4dGVuZHMgQWJzdHJhY3RKYXZhY1BhdHRlcm5NYXRjaGVyIHsKKworICAgIC8qCisgICAgICogICAgIFtqYXZhY10gL1VzZXJzL2tldmluYmFybmVzL0VjbGlwc2UvcnVudGltZS13b3Jrc3BhY2UvRm9vL3NyYy9DYXJyaWFnZVJldHVybi5qYXZhOjQ6ICc7JyBleHBlY3RlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG1hdGNoRm91bmQoUGF0dGVybk1hdGNoRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgU3RyaW5nIG1hdGNoZWRUZXh0PSBnZXRNYXRjaGVkVGV4dChldmVudCk7CisgICAgICAgIGlmIChtYXRjaGVkVGV4dCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpbnQgbnVtRW5kPSBtYXRjaGVkVGV4dC5sYXN0SW5kZXhPZignOicpOworICAgICAgICB3aGlsZSAobnVtRW5kID4gMSAmJiAhQ2hhcmFjdGVyLmlzRGlnaXQobWF0Y2hlZFRleHQuY2hhckF0KG51bUVuZCAtIDEpKSkgeworICAgICAgICAgICAgbnVtRW5kPSBtYXRjaGVkVGV4dC5sYXN0SW5kZXhPZignOicsIG51bUVuZCAtIDEpOworICAgICAgICB9CisgICAgICAgIGludCBudW1TdGFydD0gbWF0Y2hlZFRleHQubGFzdEluZGV4T2YoJzonLCBudW1FbmQgLSAxKTsKKyAgICAgICAgCisgICAgICAgIGludCBpbmRleCA9IG1hdGNoZWRUZXh0LmluZGV4T2YoIl0iKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICAKKyAgICAgICAgU3RyaW5nIGZpbGVQYXRoOworICAgICAgICBpZiAobnVtU3RhcnQgPT0gLTEpIHsKKyAgICAgICAgCS8vZmlsZSBwYXRoIGZyb20gbGlzdGZpbGVzCisgICAgICAgIAlmaWxlUGF0aD0gbWF0Y2hlZFRleHQuc3Vic3RyaW5nKGluZGV4ICsgMSk7CisgICAgICAgIAlmaWxlUGF0aCA9IGZpbGVQYXRoLnRyaW0oKTsKKyAgICAgICAgCWludCBmaWxlU3RhcnQgPSBtYXRjaGVkVGV4dC5pbmRleE9mKGZpbGVQYXRoKTsKKyAgICAgICAgCWludCBldmVudE9mZnNldD0gZXZlbnQuZ2V0T2Zmc2V0KCkgKyBmaWxlU3RhcnQ7CisgICAgICAgICAgICBpbnQgZXZlbnRMZW5ndGggPSBmaWxlUGF0aC5sZW5ndGgoKTsKKyAgICAgICAgCWFkZExpbmsoZmlsZVBhdGgsIC0xLCBldmVudE9mZnNldCwgZXZlbnRMZW5ndGgsIG51bGwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAJZmlsZVBhdGg9IG1hdGNoZWRUZXh0LnN1YnN0cmluZyhpbmRleCArIDEsIG51bVN0YXJ0KTsKKyAgICAgICAgCWZpbGVQYXRoID0gZmlsZVBhdGgudHJpbSgpOworCisgICAgICAgIAlpbnQgZmlsZVN0YXJ0ID0gbWF0Y2hlZFRleHQuaW5kZXhPZihmaWxlUGF0aCk7CisgICAgICAgIAlpbnQgZXZlbnRPZmZzZXQ9IGV2ZW50LmdldE9mZnNldCgpICsgZmlsZVN0YXJ0OworICAgICAgICAJaW50IGV2ZW50TGVuZ3RoID0gZmlsZVBhdGgubGVuZ3RoKCk7CisKKyAgICAgICAgCVN0cmluZyBsaW5lTnVtYmVyU3RyaW5nID0gbWF0Y2hlZFRleHQuc3Vic3RyaW5nKG51bVN0YXJ0ICsgMSwgbnVtRW5kKTsKKyAgICAgICAgCWludCBsaW5lTnVtYmVyPSAtMTsgCisgICAgICAgIAl0cnkgeworICAgICAgICAJCWxpbmVOdW1iZXI9IEludGVnZXIucGFyc2VJbnQobGluZU51bWJlclN0cmluZyk7CisgICAgICAgIAl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICAJCUFudFVJUGx1Z2luLmxvZyhlKTsKKyAgICAgICAgCX0KKworICAgICAgICAJSW50ZWdlciB0eXBlPSBmZ0Vycm9yVHlwZTsKKyAgICAgICAgCWlmICgtMSAhPSBtYXRjaGVkVGV4dC5pbmRleE9mKCJ3YXJuaW5nIiwgbnVtRW5kKSkgeyAvLyROT04tTkxTLTEkCisgICAgICAgIAkJdHlwZT0gZmdXYXJuaW5nVHlwZTsKKyAgICAgICAgCX0KKyAgICAgICAgCWFkZExpbmsoZmlsZVBhdGgsIGxpbmVOdW1iZXIsIGV2ZW50T2Zmc2V0LCBldmVudExlbmd0aCwgdHlwZSk7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvY29uc29sZS9KaWtlc0phdmFjUGF0dGVybk1hdGNoZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2NvbnNvbGUvSmlrZXNKYXZhY1BhdHRlcm5NYXRjaGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI5ZmJkYwotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2NvbnNvbGUvSmlrZXNKYXZhY1BhdHRlcm5NYXRjaGVyLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5jb25zb2xlOworCitpbXBvcnQgb3JnLmVjbGlwc2UudWkuY29uc29sZS5QYXR0ZXJuTWF0Y2hFdmVudDsKKworcHVibGljIGNsYXNzIEppa2VzSmF2YWNQYXR0ZXJuTWF0Y2hlciBleHRlbmRzIEFic3RyYWN0SmF2YWNQYXR0ZXJuTWF0Y2hlciB7CisKKyAgICAvKgorICAgICAqICAgICBbamF2YWNdIEZvdW5kIDEgc2VtYW50aWMgZXJyb3IgY29tcGlsaW5nICIvVXNlcnMva2V2aW5iYXJuZXMvRWNsaXBzZS9ydW50aW1lLXdvcmtzcGFjZS9Gb28vc3JjL0NhcnJpYWdlUmV0dXJuLmphdmEiOgorICAgICAqICAgICBbamF2YWNdIDMuICAgICAgICAgU3lzdGVtLm91dC5wcmludGVyKCJcciIpOworICAgICAqLworICAgIHB1YmxpYyB2b2lkIG1hdGNoRm91bmQoUGF0dGVybk1hdGNoRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgU3RyaW5nIG1hdGNoZWRUZXh0PSBnZXRNYXRjaGVkVGV4dChldmVudCk7CisgICAgICAgIGlmIChtYXRjaGVkVGV4dCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaW50IHN0YXJ0ID0gbWF0Y2hlZFRleHQuaW5kZXhPZignXCInKSsxOworICAgICAgICBpbnQgZW5kID0gbWF0Y2hlZFRleHQuaW5kZXhPZignXCInLCBzdGFydCk7ICAgICAgICAKKyAgICAgICAgU3RyaW5nIGZpbGVQYXRoID0gbWF0Y2hlZFRleHQuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpOworICAgICAgICBpbnQgZXZlbnRPZmZzZXQ9IGV2ZW50LmdldE9mZnNldCgpOworICAgICAgICBpbnQgZmlsZVN0YXJ0ID0gbWF0Y2hlZFRleHQuaW5kZXhPZihmaWxlUGF0aCkgKyBldmVudE9mZnNldDsKKyAgICAgICAgaW50IGZpbGVMZW5ndGggPSBmaWxlUGF0aC5sZW5ndGgoKTsKKyAgICAgICAgCisgICAgICAgIGludCBsaW5lTnVtYmVyID0gZ2V0TGluZU51bWJlcihldmVudE9mZnNldCwgZmFsc2UpOworICAgICAgICAvL1RPRE8gZGV0ZXJtaW5lIGlmIGVycm9yIG9yIHdhcm5pbmcKKyAgICAgICAgYWRkTGluayhmaWxlUGF0aCwgbGluZU51bWJlciwgZmlsZVN0YXJ0LCBmaWxlTGVuZ3RoLCBmZ0Vycm9yVHlwZSk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2NvbnNvbGUvVGFza0xpbmVUcmFja2VyLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9jb25zb2xlL1Rhc2tMaW5lVHJhY2tlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmYzU5NjQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9jb25zb2xlL1Rhc2tMaW5lVHJhY2tlci5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuY29uc29sZTsKKyAKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkubGF1bmNoQ29uZmlndXJhdGlvbnMuVGFza0xpbmtNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLmNvbnNvbGUuSUNvbnNvbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuY29uc29sZS5JQ29uc29sZUxpbmVUcmFja2VyRXh0ZW5zaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKKworLyoqCisgKiBQcm9jZXNzZXMgdGFzayBoeXBlcmxpbmtzIGFzIGxpbmVzIGFyZSBhcHBlbmRlZCB0byB0aGUgY29uc29sZQorICovCitwdWJsaWMgY2xhc3MgVGFza0xpbmVUcmFja2VyIGltcGxlbWVudHMgSUNvbnNvbGVMaW5lVHJhY2tlckV4dGVuc2lvbiB7CisJCisJcHJpdmF0ZSBJQ29uc29sZSBmQ29uc29sZTsKKworCS8qKgorCSAqIENvbnN0cnVjdG9yIGZvciBUYXNrTGluZVRyYWNrZXIuCisJICovCisJcHVibGljIFRhc2tMaW5lVHJhY2tlcigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLmNvbnNvbGUuSUNvbnNvbGVMaW5lVHJhY2tlciNpbml0KG9yZy5lY2xpcHNlLmRlYnVnLnVpLmNvbnNvbGUuSUNvbnNvbGUpCisJICovCisJcHVibGljIHZvaWQgaW5pdChJQ29uc29sZSBjb25zb2xlKSB7CisJCWZDb25zb2xlID0gY29uc29sZTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLmNvbnNvbGUuSUNvbnNvbGVMaW5lVHJhY2tlciNsaW5lQXBwZW5kZWQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uKQorCSAqLworCXB1YmxpYyB2b2lkIGxpbmVBcHBlbmRlZChJUmVnaW9uIGxpbmUpIHsKKwkJVGFza0xpbmtNYW5hZ2VyLnByb2Nlc3NOZXdMaW5lKGZDb25zb2xlLCBsaW5lKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLmNvbnNvbGUuSUNvbnNvbGVMaW5lVHJhY2tlciNkaXNwb3NlKCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQlmQ29uc29sZSA9IG51bGw7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuY29uc29sZS5JQ29uc29sZUxpbmVUcmFja2VyRXh0ZW5zaW9uI2NvbnNvbGVDbG9zZWQoKQorCSAqLworCXB1YmxpYyB2b2lkIGNvbnNvbGVDbG9zZWQoKSB7CisJCVRhc2tMaW5rTWFuYWdlci5kaXNwb3NlKGZDb25zb2xlLmdldFByb2Nlc3MoKSk7CisJCUFic3RyYWN0SmF2YWNQYXR0ZXJuTWF0Y2hlci5jb25zb2xlQ2xvc2VkKGZDb25zb2xlLmdldFByb2Nlc3MoKSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZGF0YXRyYW5zZmVyL0FudEJ1aWxkZmlsZUV4cG9ydFdpemFyZC5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZGF0YXRyYW5zZmVyL0FudEJ1aWxkZmlsZUV4cG9ydFdpemFyZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwNzlhOWUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9kYXRhdHJhbnNmZXIvQW50QnVpbGRmaWxlRXhwb3J0V2l6YXJkLmphdmEKQEAgLTAsMCArMSw1NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5kYXRhdHJhbnNmZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5BbnRVSUltYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuSUFudFVJQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JRXhwb3J0V2l6YXJkOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7CisKKy8qKgorICogRXhwb3J0cyBjdXJyZW50bHkgc2VsZWN0ZWQgRWNsaXBzZSBKYXZhIHByb2plY3QgYXMgYW4gQW50IGJ1aWxkZmlsZS4KKyAqLworcHVibGljIGNsYXNzIEFudEJ1aWxkZmlsZUV4cG9ydFdpemFyZCBleHRlbmRzIFdpemFyZCBpbXBsZW1lbnRzIElFeHBvcnRXaXphcmQKK3sKKyAgICBwcml2YXRlIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGZTZWxlY3Rpb247CisgICAgcHJpdmF0ZSBBbnRCdWlsZGZpbGVFeHBvcnRQYWdlIGZNYWluUGFnZTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGJ1aWxkZmlsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkKKyAgICB7CisgICAgICAgIHJldHVybiBmTWFpblBhZ2UuZ2VuZXJhdGVCdWlsZGZpbGVzKCk7CisgICAgfQorIAorICAgIHB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkKKyAgICB7CisgICAgICAgIGZNYWluUGFnZSA9IG5ldyBBbnRCdWlsZGZpbGVFeHBvcnRQYWdlKCk7CisgICAgICAgIExpc3QgcHJvamVjdHMgPSBmU2VsZWN0aW9uLnRvTGlzdCgpOworICAgICAgICBmTWFpblBhZ2Uuc2V0U2VsZWN0ZWRQcm9qZWN0cyhwcm9qZWN0cyk7CisgICAgICAgIGFkZFBhZ2UoZk1haW5QYWdlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pCisgICAgeworICAgICAgICBzZXRXaW5kb3dUaXRsZShEYXRhVHJhbnNmZXJNZXNzYWdlcy5BbnRCdWlsZGZpbGVFeHBvcnRXaXphcmRfMCk7CisgICAgCXNldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKEFudFVJSW1hZ2VzLmdldEltYWdlRGVzY3JpcHRvcihJQW50VUlDb25zdGFudHMuSU1HX0VYUE9SVF9XSVpBUkRfQkFOTkVSKSk7CisgICAgCXNldE5lZWRzUHJvZ3Jlc3NNb25pdG9yKHRydWUpOworICAgICAgICBmU2VsZWN0aW9uPSBzZWxlY3Rpb247CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZGF0YXRyYW5zZmVyL0FudE5ld0phdmFQcm9qZWN0V2l6YXJkLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9kYXRhdHJhbnNmZXIvQW50TmV3SmF2YVByb2plY3RXaXphcmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjE0YWU1Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZGF0YXRyYW5zZmVyL0FudE5ld0phdmFQcm9qZWN0V2l6YXJkLmphdmEKQEAgLTAsMCArMSw1OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZGF0YXRyYW5zZmVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLkFudFVJSW1hZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5JQW50VUlDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKKworcHVibGljIGNsYXNzIEFudE5ld0phdmFQcm9qZWN0V2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSU5ld1dpemFyZCB7CisKKwlwcml2YXRlIEFudE5ld0phdmFQcm9qZWN0UGFnZSBmTWFpblBhZ2U7CisKKwlwdWJsaWMgQW50TmV3SmF2YVByb2plY3RXaXphcmQoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjYWRkUGFnZXMoKQorCSAqLworCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgeworCQlzdXBlci5hZGRQYWdlcygpOworCQlmTWFpblBhZ2UgPSBuZXcgQW50TmV3SmF2YVByb2plY3RQYWdlKCk7CisJCWFkZFBhZ2UoZk1haW5QYWdlKTsKKwl9CisJCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpemFyZCNpbml0KG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2gsIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb24pCisJICovCisJcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gY3VycmVudFNlbGVjdGlvbikgeworCQlzZXRXaW5kb3dUaXRsZShEYXRhVHJhbnNmZXJNZXNzYWdlcy5BbnROZXdKYXZhUHJvamVjdFdpemFyZF8wKTsKKwkJc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoQW50VUlJbWFnZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKElBbnRVSUNvbnN0YW50cy5JTUdfV0laQVJEX0JBTk5FUikpOworCQkKKwl9CisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjcGVyZm9ybUNhbmNlbCgpCisJICovCisJcHVibGljIGJvb2xlYW4gcGVyZm9ybUNhbmNlbCgpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI3BlcmZvcm1GaW5pc2goKQorCSAqLworCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7CisJCXJldHVybiAoZk1haW5QYWdlLmNyZWF0ZVByb2plY3QoKSAhPSBudWxsKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9kYXRhdHJhbnNmZXIvRGF0YVRyYW5zZmVyTWVzc2FnZXMuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2RhdGF0cmFuc2Zlci9EYXRhVHJhbnNmZXJNZXNzYWdlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0ZmQ3YjMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9kYXRhdHJhbnNmZXIvRGF0YVRyYW5zZmVyTWVzc2FnZXMuamF2YQpAQCAtMCwwICsxLDc1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCisgKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKKyAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6IAorICogSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmRhdGF0cmFuc2ZlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CisKK3B1YmxpYyBjbGFzcyBEYXRhVHJhbnNmZXJNZXNzYWdlcyBleHRlbmRzIE5MUyB7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5kYXRhdHJhbnNmZXIuRGF0YVRyYW5zZmVyTWVzc2FnZXMiOy8vJE5PTi1OTFMtMSQKKyAgICAKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnROZXdKYXZhUHJvamVjdFBhZ2VfMjM7CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnROZXdKYXZhUHJvamVjdFBhZ2VfMjQ7CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnROZXdKYXZhUHJvamVjdFdpemFyZF8wOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudEJ1aWxkZmlsZUV4cG9ydFdpemFyZF8wOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudEJ1aWxkZmlsZUV4cG9ydFBhZ2VfMDsKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRCdWlsZGZpbGVFeHBvcnRQYWdlXzEwOworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudEJ1aWxkZmlsZUV4cG9ydFBhZ2VfMTE7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQW50QnVpbGRmaWxlRXhwb3J0UGFnZV8xMjsKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRCdWlsZGZpbGVFeHBvcnRQYWdlXzEzOworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudEJ1aWxkZmlsZUV4cG9ydFBhZ2VfMTQ7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQW50QnVpbGRmaWxlRXhwb3J0UGFnZV8xNTsKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRCdWlsZGZpbGVFeHBvcnRQYWdlXzE2OworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudEJ1aWxkZmlsZUV4cG9ydFBhZ2VfMTc7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQW50QnVpbGRmaWxlRXhwb3J0UGFnZV8xOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudEJ1aWxkZmlsZUV4cG9ydFBhZ2VfMjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRCdWlsZGZpbGVFeHBvcnRQYWdlXzM7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQW50QnVpbGRmaWxlRXhwb3J0UGFnZV80OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudEJ1aWxkZmlsZUV4cG9ydFBhZ2VfNjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnROZXdKYXZhUHJvamVjdFBhZ2VfOTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnROZXdKYXZhUHJvamVjdFBhZ2VfMDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnROZXdKYXZhUHJvamVjdFBhZ2VfMTA7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQW50TmV3SmF2YVByb2plY3RQYWdlXzExOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudE5ld0phdmFQcm9qZWN0UGFnZV8xMjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnROZXdKYXZhUHJvamVjdFBhZ2VfMTM7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQW50TmV3SmF2YVByb2plY3RQYWdlXzE0OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudE5ld0phdmFQcm9qZWN0UGFnZV8xNTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnROZXdKYXZhUHJvamVjdFBhZ2VfMTY7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQW50TmV3SmF2YVByb2plY3RQYWdlXzE3OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudE5ld0phdmFQcm9qZWN0UGFnZV8xODsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnROZXdKYXZhUHJvamVjdFBhZ2VfMTk7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQW50TmV3SmF2YVByb2plY3RQYWdlXzE7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQW50TmV3SmF2YVByb2plY3RQYWdlXzIxOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudE5ld0phdmFQcm9qZWN0UGFnZV8yMjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnROZXdKYXZhUHJvamVjdFBhZ2VfMjsKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBBbnROZXdKYXZhUHJvamVjdFBhZ2VfMzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9qZWN0Q3JlYXRvcl8wOworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEphdmFjVGFibGVMYWJlbFByb3ZpZGVyXzA7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgU291cmNlQW5hbHl6ZXJfMDsKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBTb3VyY2VBbmFseXplcl8xOworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFNvdXJjZUFuYWx5emVyXzI7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgU291cmNlQW5hbHl6ZXJfMzsKKworCXN0YXRpYyB7CisJCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQorCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBEYXRhVHJhbnNmZXJNZXNzYWdlcy5jbGFzcyk7CisJfQorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgQW50QnVpbGRmaWxlRXhwb3J0UGFnZV8xODsKKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudEJ1aWxkZmlsZUV4cG9ydFBhZ2VfMTk7CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRCdWlsZGZpbGVFeHBvcnRQYWdlXzIwOworCisJcHVibGljIHN0YXRpYyBTdHJpbmcgQW50QnVpbGRmaWxlRXhwb3J0UGFnZV9jcmVhdGluZ19idWlsZF9maWxlczsKKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJ1aWxkRmlsZUNyZWF0b3JfZ2VuZXJhdGluZ19idWlsZGZpbGVfZm9yOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2RhdGF0cmFuc2Zlci9Qcm9qZWN0Q3JlYXRvci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZGF0YXRyYW5zZmVyL1Byb2plY3RDcmVhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThjOTRjZgotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2RhdGF0cmFuc2Zlci9Qcm9qZWN0Q3JlYXRvci5qYXZhCkBAIC0wLDAgKzEsMjA2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmRhdGF0cmFuc2ZlcjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBjb20uaWJtLmljdS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5KYXZhYzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuQW50VUlQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0RGVzY3JpcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkphdmFSdW50aW1lOworCitwdWJsaWMgY2xhc3MgUHJvamVjdENyZWF0b3IgeworCQkKKwlwdWJsaWMgSUphdmFQcm9qZWN0IGNyZWF0ZUphdmFQcm9qZWN0RnJvbUphdmFjTm9kZShTdHJpbmcgcHJvamVjdE5hbWUsIEphdmFjIGphdmFjVGFzaywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCXRyeSB7CisJCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBjcmVhdGVKYXZhUHJvamVjdChwcm9qZWN0TmFtZSwgbW9uaXRvcik7CisJCQkKKwkJCUZpbGUgZGVzdERpcj0gamF2YWNUYXNrLmdldERlc3RkaXIoKTsKKwkJCVN0cmluZyBkZXN0RGlyTmFtZT0gZGVzdERpciA9PSBudWxsID8gbnVsbCA6IGRlc3REaXIuZ2V0TmFtZSgpOworCQkJb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aCBzb3VyY2VEaXJzPSBqYXZhY1Rhc2suZ2V0U3JjZGlyKCk7CisJCQljcmVhdGVTb3VyY2VEaXJlY3RvcmllcyhkZXN0RGlyLCBkZXN0RGlyTmFtZSwgc291cmNlRGlycywgamF2YVByb2plY3QsIG1vbml0b3IpOworCQkJCisJCQkvLyBhZGQgcnQuamFyCisJCQlhZGRWYXJpYWJsZUVudHJ5KGphdmFQcm9qZWN0LCBuZXcgUGF0aChKYXZhUnVudGltZS5KUkVMSUJfVkFSSUFCTEUpLCBuZXcgUGF0aChKYXZhUnVudGltZS5KUkVTUkNfVkFSSUFCTEUpLCBuZXcgUGF0aChKYXZhUnVudGltZS5KUkVTUkNST09UX1ZBUklBQkxFKSwgbW9uaXRvcik7CisJCQkKKwkJCXNldENsYXNzcGF0aChqYXZhY1Rhc2ssIGphdmFQcm9qZWN0LCBtb25pdG9yKTsKKwkJCQorCQkJamF2YVByb2plY3QuZ2V0UHJvamVjdCgpLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUsIG1vbml0b3IpOworCQkJcmV0dXJuIGphdmFQcm9qZWN0OworCQl9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgeworCQkJSVN0YXR1cyBzdGF0dXM9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQW50VUlQbHVnaW4uUElfQU5UVUksIElTdGF0dXMuT0ssIGJlLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgYmUpOworCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc3RhdHVzKTsKKwkJfQorCX0KKwkKKwlwcml2YXRlIHZvaWQgc2V0Q2xhc3NwYXRoKEphdmFjIGphdmFjVGFzaywgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCW9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGggY2xhc3NwYXRoPSBqYXZhY1Rhc2suZ2V0Q2xhc3NwYXRoKCk7CisJCQlpZiAoY2xhc3NwYXRoID09IG51bGwpIHsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlTdHJpbmdbXSBjbGFzc3BhdGhzPSBjbGFzc3BhdGgubGlzdCgpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc3BhdGhzLmxlbmd0aDsgaSsrKSB7CisJCQkJU3RyaW5nIGNwID0gY2xhc3NwYXRoc1tpXTsKKwkJCQlGaWxlIGNsYXNzcGF0aEVudHJ5PSBuZXcgRmlsZShjcCk7CisJCQkJaWYgKGNsYXNzcGF0aEVudHJ5LmlzRmlsZSgpKSB7CisJCQkJCWFkZExpYnJhcnkoamF2YVByb2plY3QsIG5ldyBQYXRoKGNsYXNzcGF0aEVudHJ5LmdldEFic29sdXRlUGF0aCgpKSwgbW9uaXRvcik7CisJCQkJfSBlbHNlIHsKKwkJCQkJYWRkQ29udGFpbmVyKGphdmFQcm9qZWN0LCBuZXcgUGF0aChjbGFzc3BhdGhFbnRyeS5nZXRBYnNvbHV0ZVBhdGgoKSksIG1vbml0b3IpOworCQkJCX0KKwkJCX0KKwkJfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKKwkJCUlTdGF0dXMgc3RhdHVzPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFudFVJUGx1Z2luLlBJX0FOVFVJLCBJU3RhdHVzLk9LLCBNZXNzYWdlRm9ybWF0LmZvcm1hdChEYXRhVHJhbnNmZXJNZXNzYWdlcy5Qcm9qZWN0Q3JlYXRvcl8wLCBuZXcgU3RyaW5nW117YmUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpfSksIG51bGwpOworCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc3RhdHVzKTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBjcmVhdGVTb3VyY2VEaXJlY3RvcmllcyhGaWxlIGRlc3REaXIsIFN0cmluZyBkZXN0RGlyTmFtZSwgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aCBzb3VyY2VEaXJzLCBJSmF2YVByb2plY3QgamF2YVByb2plY3QsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlTdHJpbmdbXSBzb3VyY2VEaXJlY3Rvcmllcz0gc291cmNlRGlycy5saXN0KCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgc291cmNlRGlyZWN0b3JpZXMubGVuZ3RoOyBpKyspIHsKKwkJCVN0cmluZyBzcmNEaXIgPSBzb3VyY2VEaXJlY3Rvcmllc1tpXTsKKwkJCUZpbGUgc3JjRGlyZWN0b3J5PSBuZXcgRmlsZShzcmNEaXIpOworCQkJU3RyaW5nIHNyY0RpcmVjdG9yeU5hbWU9IHNyY0RpcmVjdG9yeS5nZXROYW1lKCk7CisJCQlTdHJpbmcgZGVzdERpclBhdGg9IGRlc3REaXIgPT0gbnVsbCA/IHNyY0RpciA6IGRlc3REaXIuZ2V0QWJzb2x1dGVQYXRoKCk7CisJCQlpZiAoZGVzdERpck5hbWUgPT0gbnVsbCkgeworCQkJICAgIGRlc3REaXJOYW1lPSBzcmNEaXJlY3RvcnlOYW1lOworCQkJfQorCQkJYWRkU291cmNlQ29udGFpbmVyKGphdmFQcm9qZWN0LCBzcmNEaXJlY3RvcnlOYW1lLCBzcmNEaXIsIGRlc3REaXJOYW1lLCBkZXN0RGlyUGF0aCwgbW9uaXRvcik7CisJCX0KKwl9CisKKwlwcml2YXRlIElKYXZhUHJvamVjdCBjcmVhdGVKYXZhUHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlJV29ya3NwYWNlUm9vdCByb290PSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOworCQlJUHJvamVjdCBwcm9qZWN0PSByb290LmdldFByb2plY3QocHJvamVjdE5hbWUpOworCQlpZiAoIXByb2plY3QuZXhpc3RzKCkpIHsKKwkJCXByb2plY3QuY3JlYXRlKG1vbml0b3IpOworCQl9IGVsc2UgeworCQkJcHJvamVjdC5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCBtb25pdG9yKTsKKwkJfQorCQkKKwkJaWYgKCFwcm9qZWN0LmlzT3BlbigpKSB7CisJCQlwcm9qZWN0Lm9wZW4obW9uaXRvcik7CisJCX0KKwkJCisJCWlmICghcHJvamVjdC5oYXNOYXR1cmUoSmF2YUNvcmUuTkFUVVJFX0lEKSkgeworCQkJYWRkTmF0dXJlVG9Qcm9qZWN0KHByb2plY3QsIEphdmFDb3JlLk5BVFVSRV9JRCwgbW9uaXRvcik7CisJCX0KKwkJCisJCUlKYXZhUHJvamVjdCBqcHJvamVjdD0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOworCQkKKwkJanByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKG5ldyBJQ2xhc3NwYXRoRW50cnlbMF0sIG1vbml0b3IpOworCQkKKwkJcmV0dXJuIGpwcm9qZWN0OwkKKwl9CisJCisJcHJpdmF0ZSB2b2lkIGFkZE5hdHVyZVRvUHJvamVjdChJUHJvamVjdCBwcm9qLCBTdHJpbmcgbmF0dXJlSWQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gcHJvai5nZXREZXNjcmlwdGlvbigpOworCQlTdHJpbmdbXSBwcmV2TmF0dXJlcz0gZGVzY3JpcHRpb24uZ2V0TmF0dXJlSWRzKCk7CisJCVN0cmluZ1tdIG5ld05hdHVyZXM9IG5ldyBTdHJpbmdbcHJldk5hdHVyZXMubGVuZ3RoICsgMV07CisJCVN5c3RlbS5hcnJheWNvcHkocHJldk5hdHVyZXMsIDAsIG5ld05hdHVyZXMsIDAsIHByZXZOYXR1cmVzLmxlbmd0aCk7CisJCW5ld05hdHVyZXNbcHJldk5hdHVyZXMubGVuZ3RoXT0gbmF0dXJlSWQ7CisJCWRlc2NyaXB0aW9uLnNldE5hdHVyZUlkcyhuZXdOYXR1cmVzKTsKKwkJcHJvai5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbiwgbW9uaXRvcik7CisJfQorCQorCS8qKgorCSAqIEFkZHMgYSBzb3VyY2UgY29udGFpbmVyIHRvIGEgSUphdmFQcm9qZWN0LgorCSAqLwkJCisJcHJpdmF0ZSB2b2lkIGFkZFNvdXJjZUNvbnRhaW5lcihJSmF2YVByb2plY3QganByb2plY3QsIFN0cmluZyBzcmNOYW1lLCBTdHJpbmcgc3JjUGF0aCwgU3RyaW5nIG91dHB1dE5hbWUsIFN0cmluZyBvdXRwdXRQYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJSVByb2plY3QgcHJvamVjdD0ganByb2plY3QuZ2V0UHJvamVjdCgpOworCQlJQ29udGFpbmVyIGNvbnRhaW5lcj0gbnVsbDsKKwkJaWYgKHNyY05hbWUgPT0gbnVsbCB8fCBzcmNOYW1lLmxlbmd0aCgpID09IDApIHsKKwkJCWNvbnRhaW5lcj0gcHJvamVjdDsKKwkJfSBlbHNlIHsKKwkJCUlGb2xkZXIgZm9sZGVyPSBwcm9qZWN0LmdldEZvbGRlcihzcmNOYW1lKTsKKwkJCWlmICghZm9sZGVyLmV4aXN0cygpKSB7CisJCQkJZm9sZGVyLmNyZWF0ZUxpbmsobmV3IFBhdGgoc3JjUGF0aCksIElSZXNvdXJjZS5BTExPV19NSVNTSU5HX0xPQ0FMLCBtb25pdG9yKTsKKwkJCX0KKwkJCWNvbnRhaW5lcj0gZm9sZGVyOworCQl9CisJCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3Q9IGpwcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3QoY29udGFpbmVyKTsKKworCQlJUGF0aCBvdXRwdXQ9IG51bGw7CisJCWlmIChvdXRwdXROYW1lIT0gbnVsbCkgeworCQkJSUZvbGRlciBvdXRwdXRGb2xkZXIgPSBwcm9qZWN0LmdldEZvbGRlcihvdXRwdXROYW1lKTsKKwkJCWlmICghb3V0cHV0Rm9sZGVyLmV4aXN0cygpKSB7CisJCQkgICAgb3V0cHV0Rm9sZGVyLmNyZWF0ZUxpbmsobmV3IFBhdGgob3V0cHV0UGF0aCksIElSZXNvdXJjZS5BTExPV19NSVNTSU5HX0xPQ0FMLCBtb25pdG9yKTsKKwkJCX0KKwkJCW91dHB1dD0gb3V0cHV0Rm9sZGVyLmdldEZ1bGxQYXRoKCk7CisJCX0KKwkJCQkKKwkJSUNsYXNzcGF0aEVudHJ5IGNwZT0gSmF2YUNvcmUubmV3U291cmNlRW50cnkocm9vdC5nZXRQYXRoKCksIG5ldyBJUGF0aFswXSwgb3V0cHV0KTsKKwkJCisJCWFkZFRvQ2xhc3NwYXRoKGpwcm9qZWN0LCBjcGUsIG1vbml0b3IpOwkJCisJfQkKKwkKKwlwcml2YXRlIHZvaWQgYWRkVG9DbGFzc3BhdGgoSUphdmFQcm9qZWN0IGpwcm9qZWN0LCBJQ2xhc3NwYXRoRW50cnkgY3BlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24geworCQlJQ2xhc3NwYXRoRW50cnlbXSBvbGRFbnRyaWVzPSBqcHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsKKwkJZm9yIChpbnQgaT0gMDsgaSA8IG9sZEVudHJpZXMubGVuZ3RoOyBpKyspIHsKKwkJCWlmIChvbGRFbnRyaWVzW2ldLmVxdWFscyhjcGUpKSB7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisJCWludCBuRW50cmllcz0gb2xkRW50cmllcy5sZW5ndGg7CisJCUlDbGFzc3BhdGhFbnRyeVtdIG5ld0VudHJpZXM9IG5ldyBJQ2xhc3NwYXRoRW50cnlbbkVudHJpZXMgKyAxXTsKKwkJU3lzdGVtLmFycmF5Y29weShvbGRFbnRyaWVzLCAwLCBuZXdFbnRyaWVzLCAwLCBuRW50cmllcyk7CisJCW5ld0VudHJpZXNbbkVudHJpZXNdPSBjcGU7CisJCWpwcm9qZWN0LnNldFJhd0NsYXNzcGF0aChuZXdFbnRyaWVzLCBtb25pdG9yKTsKKwl9CisJCisJLyoqCisJICogQWRkcyBhIHZhcmlhYmxlIGVudHJ5IHdpdGggc291cmNlIGF0dGFjaG1lbnQgdG8gYSBJSmF2YVByb2plY3QgaWYgdGhlIHBhdGggY2FuIGJlIHJlc29sdmVkLgorCSAqLwkJCQorCXByaXZhdGUgdm9pZCBhZGRWYXJpYWJsZUVudHJ5KElKYXZhUHJvamVjdCBqcHJvamVjdCwgSVBhdGggcGF0aCwgSVBhdGggc291cmNlQXR0YWNoUGF0aCwgSVBhdGggc291cmNlQXR0YWNoUm9vdCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKwkJSUNsYXNzcGF0aEVudHJ5IGNwZT0gSmF2YUNvcmUubmV3VmFyaWFibGVFbnRyeShwYXRoLCBzb3VyY2VBdHRhY2hQYXRoLCBzb3VyY2VBdHRhY2hSb290KTsKKwkJYWRkVG9DbGFzc3BhdGgoanByb2plY3QsIGNwZSwgbW9uaXRvcik7CisJfQorCQorCS8qKgorCSAqIEFkZHMgYSBsaWJyYXJ5IGVudHJ5IHRvIGFuIElKYXZhUHJvamVjdC4KKwkgKi8JCQkKKwlwcml2YXRlIHZvaWQgYWRkTGlicmFyeShJSmF2YVByb2plY3QganByb2plY3QsIElQYXRoIHBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7CisJCUlDbGFzc3BhdGhFbnRyeSBjcGU9IEphdmFDb3JlLm5ld0xpYnJhcnlFbnRyeShwYXRoLCBudWxsLCBudWxsKTsKKwkJYWRkVG9DbGFzc3BhdGgoanByb2plY3QsIGNwZSwgbW9uaXRvcik7CisJfQorCQorCS8qKgorCSAqIEFkZHMgYSBjb250YWluZXIgZW50cnkgdG8gYW4gSUphdmFQcm9qZWN0LgorCSAqLwkJCQorCXByaXZhdGUgdm9pZCBhZGRDb250YWluZXIoSUphdmFQcm9qZWN0IGpwcm9qZWN0LCBJUGF0aCBwYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJSUNsYXNzcGF0aEVudHJ5IGNwZT0gSmF2YUNvcmUubmV3Q29udGFpbmVyRW50cnkocGF0aCk7CisJCWFkZFRvQ2xhc3NwYXRoKGpwcm9qZWN0LCBjcGUsIG1vbml0b3IpOworCQlJUHJvamVjdCBwcm9qZWN0PSBqcHJvamVjdC5nZXRQcm9qZWN0KCk7CisJCUlGb2xkZXIgZm9sZGVyPSBwcm9qZWN0LmdldEZvbGRlcihwYXRoLmxhc3RTZWdtZW50KCkpOworCQlpZiAoIWZvbGRlci5leGlzdHMoKSkgeworCQkJZm9sZGVyLmNyZWF0ZUxpbmsocGF0aCwgSVJlc291cmNlLkFMTE9XX01JU1NJTkdfTE9DQUwsIG1vbml0b3IpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZGVidWcvbW9kZWwvRGVidWdNb2RlbE1lc3NhZ2VzLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9kZWJ1Zy9tb2RlbC9EZWJ1Z01vZGVsTWVzc2FnZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDUyYTFkCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZGVidWcvbW9kZWwvRGVidWdNb2RlbE1lc3NhZ2VzLmphdmEKQEAgLTAsMCArMSwzMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmRlYnVnLm1vZGVsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKKworcHVibGljIGNsYXNzIERlYnVnTW9kZWxNZXNzYWdlcyBleHRlbmRzIE5MUyB7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5kZWJ1Zy5tb2RlbC5EZWJ1Z01vZGVsTWVzc2FnZXMiOy8vJE5PTi1OTFMtMSQKKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudERlYnVnTW9kZWxQcmVzZW50YXRpb25fMDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnREZWJ1Z01vZGVsUHJlc2VudGF0aW9uXzE7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQW50RGVidWdNb2RlbFByZXNlbnRhdGlvbl8yOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudERlYnVnTW9kZWxQcmVzZW50YXRpb25fMzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnREZWJ1Z01vZGVsUHJlc2VudGF0aW9uXzQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQW50RGVidWdNb2RlbFByZXNlbnRhdGlvbl81OworCisgICAgCisJc3RhdGljIHsKKwkJLy8gbG9hZCBtZXNzYWdlIHZhbHVlcyBmcm9tIGJ1bmRsZSBmaWxlCisJCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIERlYnVnTW9kZWxNZXNzYWdlcy5jbGFzcyk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2RlYnVnL21vZGVsL0RlYnVnTW9kZWxNZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZGVidWcvbW9kZWwvRGVidWdNb2RlbE1lc3NhZ2VzLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzczZmJjMQotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2RlYnVnL21vZGVsL0RlYnVnTW9kZWxNZXNzYWdlcy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTcgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisjIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorIworIyBDb250cmlidXRvcnM6CisjICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworQW50RGVidWdNb2RlbFByZXNlbnRhdGlvbl8wPTxub3QgYXZhaWxhYmxlPgorQW50RGVidWdNb2RlbFByZXNlbnRhdGlvbl8xPVwgbGluZTogezB9CitBbnREZWJ1Z01vZGVsUHJlc2VudGF0aW9uXzI9KGJyZWFrcG9pbnQgYXQgbGluZSB7MH0gaW4gezF9KQorQW50RGVidWdNb2RlbFByZXNlbnRhdGlvbl8zPVwgKFN1c3BlbmRlZCB7MH0pCitBbnREZWJ1Z01vZGVsUHJlc2VudGF0aW9uXzQ9XCAoU3VzcGVuZGVkKQorQW50RGVidWdNb2RlbFByZXNlbnRhdGlvbl81PShydW4gdG8gbGluZSB7MH0gaW4gezF9KQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvbGF1bmNoQ29uZmlndXJhdGlvbnMvQWRkVmFyaWFibGVTdHJpbmdBY3Rpb24uamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2xhdW5jaENvbmZpZ3VyYXRpb25zL0FkZFZhcmlhYmxlU3RyaW5nQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ3NDM5ZQotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2xhdW5jaENvbmZpZ3VyYXRpb25zL0FkZFZhcmlhYmxlU3RyaW5nQWN0aW9uLmphdmEKQEAgLTAsMCArMSw0MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkubGF1bmNoQ29uZmlndXJhdGlvbnM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkuYWN0aW9ucy5SdW50aW1lQ2xhc3NwYXRoQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5JQ2xhc3NwYXRoVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkphdmFSdW50aW1lOworCitwdWJsaWMgY2xhc3MgQWRkVmFyaWFibGVTdHJpbmdBY3Rpb24gZXh0ZW5kcyBSdW50aW1lQ2xhc3NwYXRoQWN0aW9uIHsKKwkKKwlwdWJsaWMgQWRkVmFyaWFibGVTdHJpbmdBY3Rpb24oSUNsYXNzcGF0aFZpZXdlciB2aWV3ZXIpIHsKKwkJc3VwZXIoQW50TGF1bmNoQ29uZmlndXJhdGlvbk1lc3NhZ2VzLkFkZFZhcmlhYmxlU3RyaW5nQWN0aW9uXzEsIHZpZXdlcik7CisJfQorCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5hY3Rpb25zLlJ1bnRpbWVDbGFzc3BhdGhBY3Rpb24jZ2V0QWN0aW9uVHlwZSgpCisJICovCisJcHJvdGVjdGVkIGludCBnZXRBY3Rpb25UeXBlKCkgeworCQlyZXR1cm4gQUREOworCX0KKwkKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNydW4oKQorCSAqLworCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJVmFyaWFibGVJbnB1dERpYWxvZyBpbnB1dERpYWxvZyA9IG5ldyBWYXJpYWJsZUlucHV0RGlhbG9nKGdldFNoZWxsKCkpOworCQlpbnB1dERpYWxvZy5vcGVuKCk7CisJCVN0cmluZyB2YXJpYWJsZVN0cmluZz0gaW5wdXREaWFsb2cuZ2V0VmFyaWFibGVTdHJpbmcoKTsKKwkJaWYgKHZhcmlhYmxlU3RyaW5nICE9IG51bGwgJiYgdmFyaWFibGVTdHJpbmcudHJpbSgpLmxlbmd0aCgpID4gMCkgeworCQkJSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeSBuZXdFbnRyeSA9IEphdmFSdW50aW1lLm5ld1N0cmluZ1ZhcmlhYmxlQ2xhc3NwYXRoRW50cnkodmFyaWFibGVTdHJpbmcpOworCQkJZ2V0Vmlld2VyKCkuYWRkRW50cmllcyhuZXcgSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeVtdIHtuZXdFbnRyeX0pOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvbGF1bmNoQ29uZmlndXJhdGlvbnMvQW50Q2xhc3NwYXRoVGFiLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9sYXVuY2hDb25maWd1cmF0aW9ucy9BbnRDbGFzc3BhdGhUYWIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjQ4ZTY1Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvbGF1bmNoQ29uZmlndXJhdGlvbnMvQW50Q2xhc3NwYXRoVGFiLmphdmEKQEAgLTAsMCArMSwxMzYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmxhdW5jaENvbmZpZ3VyYXRpb25zOworCitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLkFudFV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmxhdW5jaGluZy5sYXVuY2hDb25maWd1cmF0aW9ucy5BbnRIb21lQ2xhc3NwYXRoRW50cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JTGF1bmNoQ29uZmlndXJhdGlvblRhYjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuZGVidWcudWkubGF1bmNoQ29uZmlndXJhdGlvbnMuSmF2YUNsYXNzcGF0aFRhYjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkuYWN0aW9ucy5BZGRFeHRlcm5hbEphckFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkuYWN0aW9ucy5BZGRGb2xkZXJBY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmFjdGlvbnMuQWRkSmFyQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5hY3Rpb25zLk1vdmVEb3duQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5hY3Rpb25zLk1vdmVVcEFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkuYWN0aW9ucy5SZW1vdmVBY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmFjdGlvbnMuUmVzdG9yZURlZmF1bHRFbnRyaWVzQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5hY3Rpb25zLlJ1bnRpbWVDbGFzc3BhdGhBY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmNsYXNzcGF0aC5DbGFzc3BhdGhFbnRyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkuY2xhc3NwYXRoLkNsYXNzcGF0aE1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5jbGFzc3BhdGguSUNsYXNzcGF0aEVudHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5JQ2xhc3NwYXRoVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworCisvKioKKyAqIFRoZSBBbnQgY2xhc3NwYXRoIHRhYgorICovCitwdWJsaWMgY2xhc3MgQW50Q2xhc3NwYXRoVGFiIGV4dGVuZHMgSmF2YUNsYXNzcGF0aFRhYiB7CisJCisJCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmRlYnVnLnVpLmxhdW5jaENvbmZpZ3VyYXRpb25zLkphdmFDbGFzc3BhdGhUYWIjaXNTaG93Qm9vdHBhdGgoKQorCSAqLworCXB1YmxpYyBib29sZWFuIGlzU2hvd0Jvb3RwYXRoKCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCQorCS8qKgorCSAqIENyZWF0ZXMgYWN0aW9ucyB0byBtYW5pcHVsYXRlIHRoZSBjbGFzc3BhdGguCisJICogCisJICogQHBhcmFtIHBhdGhCdXR0b25Db21wIGNvbXBvc2l0ZSBidXR0b25zIGFyZSBjb250YWluZWQgaW4KKwkgKiBAc2luY2UgMy4wCisJICovCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlUGF0aEJ1dHRvbnMoQ29tcG9zaXRlIHBhdGhCdXR0b25Db21wKSB7CQkKKwkJY3JlYXRlQnV0dG9uKHBhdGhCdXR0b25Db21wLCBuZXcgTW92ZVVwQWN0aW9uKGZDbGFzc3BhdGhWaWV3ZXIpKTsKKwkJY3JlYXRlQnV0dG9uKHBhdGhCdXR0b25Db21wLCBuZXcgTW92ZURvd25BY3Rpb24oZkNsYXNzcGF0aFZpZXdlcikpOworCQljcmVhdGVCdXR0b24ocGF0aEJ1dHRvbkNvbXAsIG5ldyBSZW1vdmVBY3Rpb24oZkNsYXNzcGF0aFZpZXdlcikpOworCQljcmVhdGVCdXR0b24ocGF0aEJ1dHRvbkNvbXAsIG5ldyBBZGRKYXJBY3Rpb24oZkNsYXNzcGF0aFZpZXdlcikpOworCQljcmVhdGVCdXR0b24ocGF0aEJ1dHRvbkNvbXAsIG5ldyBBZGRFeHRlcm5hbEphckFjdGlvbihmQ2xhc3NwYXRoVmlld2VyLCBESUFMT0dfU0VUVElOR1NfUFJFRklYKSk7CisJCUJ1dHRvbiBidXR0b24gPSBjcmVhdGVCdXR0b24ocGF0aEJ1dHRvbkNvbXAsIG5ldyBBZGRGb2xkZXJBY3Rpb24oZkNsYXNzcGF0aFZpZXdlcikpOworCQlidXR0b24uc2V0VGV4dChBbnRMYXVuY2hDb25maWd1cmF0aW9uTWVzc2FnZXMuQW50Q2xhc3NwYXRoVGFiXzApOworCQljcmVhdGVCdXR0b24ocGF0aEJ1dHRvbkNvbXAsIG5ldyBBZGRWYXJpYWJsZVN0cmluZ0FjdGlvbihmQ2xhc3NwYXRoVmlld2VyKSk7CisJCVJ1bnRpbWVDbGFzc3BhdGhBY3Rpb24gYWN0aW9uPSBuZXcgUmVzdG9yZURlZmF1bHRFbnRyaWVzQWN0aW9uKGZDbGFzc3BhdGhWaWV3ZXIsIHRoaXMpOworCQljcmVhdGVCdXR0b24ocGF0aEJ1dHRvbkNvbXAsIGFjdGlvbik7CisJCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOworCQkKKwkJYWN0aW9uPSBuZXcgRWRpdEFudEhvbWVFbnRyeUFjdGlvbihmQ2xhc3NwYXRoVmlld2VyLCB0aGlzKTsKKwkJY3JlYXRlQnV0dG9uKHBhdGhCdXR0b25Db21wLCBhY3Rpb24pOworCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKKwl9CisJCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuQWJzdHJhY3RMYXVuY2hDb25maWd1cmF0aW9uVGFiI3NldERpcnR5KGJvb2xlYW4pCisJICovCisJcHVibGljIHZvaWQgc2V0RGlydHkoYm9vbGVhbiBkaXJ0eSkgeworCQlzdXBlci5zZXREaXJ0eShkaXJ0eSk7CisJfQorCQorCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLklMYXVuY2hDb25maWd1cmF0aW9uVGFiI2luaXRpYWxpemVGcm9tKG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb24pCisJICovCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb20oSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgeworCQl0cnkgeworCQkJQW50VXRpbC5taWdyYXRlVG9OZXdDbGFzc3BhdGhGb3JtYXQoY29uZmlndXJhdGlvbik7CisJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQl9CisJCXN1cGVyLmluaXRpYWxpemVGcm9tKGNvbmZpZ3VyYXRpb24pOworCX0KKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuSUVudHJpZXNDaGFuZ2VkTGlzdGVuZXIjZW50cmllc0NoYW5nZWQob3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLklDbGFzc3BhdGhWaWV3ZXIpCisJICovCisJcHVibGljIHZvaWQgZW50cmllc0NoYW5nZWQoSUNsYXNzcGF0aFZpZXdlciB2aWV3ZXIpIHsKKwkJc3VwZXIuZW50cmllc0NoYW5nZWQodmlld2VyKTsKKwkJSUxhdW5jaENvbmZpZ3VyYXRpb25UYWJbXSB0YWJzID0gZ2V0TGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZygpLmdldFRhYnMoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCB0YWJzLmxlbmd0aDsgaSsrKSB7CisJCQlJTGF1bmNoQ29uZmlndXJhdGlvblRhYiB0YWIgPSB0YWJzW2ldOworCQkJaWYgKHRhYiBpbnN0YW5jZW9mIEFudFRhcmdldHNUYWIpIHsKKwkJCQkoKEFudFRhcmdldHNUYWIpdGFiKS5zZXREaXJ0eSh0cnVlKTsKKwkJCX0KKwkJfQorCX0KKwkKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JTGF1bmNoQ29uZmlndXJhdGlvblRhYiNpc1ZhbGlkKG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb24pCisJICovCisJcHVibGljIGJvb2xlYW4gaXNWYWxpZChJTGF1bmNoQ29uZmlndXJhdGlvbiBsYXVuY2hDb25maWcpIHsKKwkJCisJCWJvb2xlYW4gdmFsaWQ9IHN1cGVyLmlzVmFsaWQobGF1bmNoQ29uZmlnKTsKKwkJaWYgKCF2YWxpZCkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCQorCQlyZXR1cm4gdmFsaWRhdGVBbnRIb21lKCk7CisJfQorCQorCXByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZUFudEhvbWUoKSB7CisJCUNsYXNzcGF0aE1vZGVsIG1vZGVsPSBnZXRNb2RlbCgpOworCQlJQ2xhc3NwYXRoRW50cnkgdXNlckVudHJ5PSBtb2RlbC5nZXRVc2VyRW50cnkoKTsKKwkJSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcz0gdXNlckVudHJ5LmdldEVudHJpZXMoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7CisJCQlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IChDbGFzc3BhdGhFbnRyeSkgZW50cmllc1tpXTsKKwkJCUlSdW50aW1lQ2xhc3NwYXRoRW50cnkgcnVudGltZUVudHJ5PSBlbnRyeS5nZXREZWxlZ2F0ZSgpOworCQkJaWYgKHJ1bnRpbWVFbnRyeSBpbnN0YW5jZW9mIEFudEhvbWVDbGFzc3BhdGhFbnRyeSkgeworCQkJCXRyeSB7CisJCQkJCSgoQW50SG9tZUNsYXNzcGF0aEVudHJ5KXJ1bnRpbWVFbnRyeSkucmVzb2x2ZUFudEhvbWUoKTsKKwkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7CisJCQkJCXNldEVycm9yTWVzc2FnZShjZS5nZXRTdGF0dXMoKS5nZXRNZXNzYWdlKCkpOworCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXJldHVybiB0cnVlOworCX0KK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2xhdW5jaENvbmZpZ3VyYXRpb25zL0FudEVudmlyb25tZW50VGFiLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9sYXVuY2hDb25maWd1cmF0aW9ucy9BbnRFbnZpcm9ubWVudFRhYi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzOGI2ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9sYXVuY2hDb25maWd1cmF0aW9ucy9BbnRFbnZpcm9ubWVudFRhYi5qYXZhCkBAIC0wLDAgKzEsNzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5sYXVuY2hDb25maWd1cmF0aW9uczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5BbnRVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5FbnZpcm9ubWVudFRhYjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKKworLyoqCisgKiBBbiBlbnZpcm9ubWVudCB0YWIgZm9yIEFudCBsYXVuY2ggY29uZmlndXJhdGlvbnMuCisgKiBFbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIG9ubHkgc3VwcG9ydGVkIHdoZW4gQW50IGlzCisgKiBydW4gaW4gYSBzZXBhcmF0ZSBWTSwgc28gdGhpcyB0YWIgYWRkcyBhIHdhcm5pbmcgbWVzc2FnZQorICogYXQgdGhlIHRvcCBhbmQgZGlzYWJsZXMgdGhlIHdpZGdldHMgaWYgdGhlIGNvbmZpZyBpc24ndAorICogc2V0IHRvIHJ1biBpbiBhIHNlcGFyYXRlIFZNLgorICovCitwdWJsaWMgY2xhc3MgQW50RW52aXJvbm1lbnRUYWIgZXh0ZW5kcyBFbnZpcm9ubWVudFRhYiB7CisJCisJcHJvdGVjdGVkIENvbXBvc2l0ZSB3cmFwcGluZ0NvbXBvc2l0ZTsKKwlwcm90ZWN0ZWQgTGFiZWwgd2FybmluZ0xhYmVsOworCQorCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgeworCQl3cmFwcGluZ0NvbXBvc2l0ZT0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKKwkJd3JhcHBpbmdDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOworCQl3cmFwcGluZ0NvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKKwkJd3JhcHBpbmdDb21wb3NpdGUuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKKwkJCisJCXdhcm5pbmdMYWJlbD0gbmV3IExhYmVsKHdyYXBwaW5nQ29tcG9zaXRlLCBTV1QuTk9ORSk7CisJCXdhcm5pbmdMYWJlbC5zZXRUZXh0KEFudExhdW5jaENvbmZpZ3VyYXRpb25NZXNzYWdlcy5BbnRFbnZpcm9ubWVudFRhYl8wKTsKKwkJCisJCXN1cGVyLmNyZWF0ZUNvbnRyb2wod3JhcHBpbmdDb21wb3NpdGUpOworCQlzZXRDb250cm9sKHdyYXBwaW5nQ29tcG9zaXRlKTsgLy8gT3ZlcndyaXRlIHNldHRpbmcgaW4gc3VwZXIgbWV0aG9kCisJCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKKwl9CisJCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuSUxhdW5jaENvbmZpZ3VyYXRpb25UYWIjYWN0aXZhdGVkKG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSkKKwkgKi8KKwlwdWJsaWMgdm9pZCBhY3RpdmF0ZWQoSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSB3b3JraW5nQ29weSkgeworCQl1cGRhdGVXaWRnZXRzRW5hYmxlZCh3b3JraW5nQ29weSk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVdpZGdldHNFbmFibGVkKElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgd29ya2luZ0NvcHkpIHsKKwkJaWYgKHdyYXBwaW5nQ29tcG9zaXRlID09IG51bGwpIHsKKwkJCXJldHVybjsKKwkJfQorCQlib29sZWFuIGlzU2VwYXJhdGVKUkVCdWlsZD0gQW50VXRpbC5pc1NlcGFyYXRlSlJFQW50QnVpbGQod29ya2luZ0NvcHkpOworCQkKKwkJQ29sb3IgdGFibGVDb2xvcj0gaXNTZXBhcmF0ZUpSRUJ1aWxkID8gbnVsbCA6IERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSURHRVRfQkFDS0dST1VORCk7CisJCUNvbG9yIGxhYmVsQ29sb3I9IGlzU2VwYXJhdGVKUkVCdWlsZCA/IG51bGwgOiBEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKTsKKwkJVGFibGUgdGFibGUgPSBlbnZpcm9ubWVudFRhYmxlLmdldFRhYmxlKCk7CisJCXRhYmxlLnNldEVuYWJsZWQoaXNTZXBhcmF0ZUpSRUJ1aWxkKTsKKwkJdGFibGUuc2V0QmFja2dyb3VuZCh0YWJsZUNvbG9yKTsKKwkJd2FybmluZ0xhYmVsLnNldEZvcmVncm91bmQobGFiZWxDb2xvcik7CisJCWVudkFkZEJ1dHRvbi5zZXRFbmFibGVkKGlzU2VwYXJhdGVKUkVCdWlsZCk7CisJCWVudlNlbGVjdEJ1dHRvbi5zZXRFbmFibGVkKGlzU2VwYXJhdGVKUkVCdWlsZCk7CisJCXVwZGF0ZUFwcGVuZFJlcGxhY2UoKTsKKwkJLy91cGRhdGUgdGhlIGVuYWJsZWQgc3RhdGUgb2YgdGhlIGVkaXQgYW5kIHJlbW92ZSBidXR0b25zCisJCWVudmlyb25tZW50VGFibGUuc2V0U2VsZWN0aW9uKGVudmlyb25tZW50VGFibGUuZ2V0U2VsZWN0aW9uKCkpOworCX0KK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2xhdW5jaENvbmZpZ3VyYXRpb25zL0FudExhdW5jaENvbmZpZ3VyYXRpb25NZXNzYWdlcy5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvbGF1bmNoQ29uZmlndXJhdGlvbnMvQW50TGF1bmNoQ29uZmlndXJhdGlvbk1lc3NhZ2VzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU0NjgzNwotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2xhdW5jaENvbmZpZ3VyYXRpb25zL0FudExhdW5jaENvbmZpZ3VyYXRpb25NZXNzYWdlcy5qYXZhCkBAIC0wLDAgKzEsOTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKKyAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKKyAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcworICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczogCisgKiBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqIGRha3NoaW5hbXVydGh5LmthcnJhQGdtYWlsLmNvbSAtIGJ1ZyAxNjUzNzEKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkubGF1bmNoQ29uZmlndXJhdGlvbnM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworCitwdWJsaWMgY2xhc3MgQW50TGF1bmNoQ29uZmlndXJhdGlvbk1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmxhdW5jaENvbmZpZ3VyYXRpb25zLkFudExhdW5jaENvbmZpZ3VyYXRpb25NZXNzYWdlcyI7Ly8kTk9OLU5MUy0xJAorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkVmFyaWFibGVTdHJpbmdBY3Rpb25fMTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRWYXJpYWJsZVN0cmluZ0FjdGlvbl8yOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFZhcmlhYmxlU3RyaW5nQWN0aW9uXzM7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkVmFyaWFibGVTdHJpbmdBY3Rpb25fNDsKKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudExhdW5jaFNob3J0Y3V0X1VuYWJsZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRMYXVuY2hTaG9ydGN1dF8yOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudExhdW5jaFNob3J0Y3V0XzM7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQW50TGF1bmNoU2hvcnRjdXRfNDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRMYXVuY2hTaG9ydGN1dF81OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudExhdW5jaFNob3J0Y3V0X0Vycm9yXzc7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQW50TGF1bmNoU2hvcnRjdXRfQnVpbGRfRmFpbGVkXzI7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQW50TGF1bmNoU2hvcnRjdXRfRXhjZXB0aW9uX2xhdW5jaGluZzsKKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudFByb3BlcnRpZXNUYWJfX1Byb3BlcnRpZXNfXzY7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQW50UHJvcGVydGllc1RhYl9Qcm9wZXJ0eV9mX2lsZXNfXzc7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQW50UHJvcGVydGllc1RhYl9QX3JvcGVydGllc184OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudFByb3BlcnRpZXNUYWJfRXJyb3JfcmVhZGluZ19jb25maWd1cmF0aW9uXzk7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQW50UHJvcGVydGllc1RhYl82OworCisJcHVibGljIHN0YXRpYyBTdHJpbmcgQW50SlJFVGFiXzI7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQW50SlJFVGFiXzM7CisJCisJcHVibGljIHN0YXRpYyBTdHJpbmcgQW50QnVpbGRlclRhcmdldHNUYWJfMDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRCdWlsZGVyVGFyZ2V0c1RhYl8xOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudEJ1aWxkZXJUYXJnZXRzVGFiXzI7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQW50QnVpbGRlclRhcmdldHNUYWJfMzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRCdWlsZGVyVGFyZ2V0c1RhYl80OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudEJ1aWxkZXJUYXJnZXRzVGFiXzU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQW50QnVpbGRlclRhcmdldHNUYWJfNjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRCdWlsZGVyVGFyZ2V0c1RhYl83OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudEJ1aWxkZXJUYXJnZXRzVGFiXzg7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQW50QnVpbGRlclRhcmdldHNUYWJfMTA7CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRNYWluVGFiX19TZWxlY3RfYV9idWlsZF9maWxlX18xOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudE1haW5UYWJfMzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRNYWluVGFiXzY7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQW50TWFpblRhYl8wOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudE1haW5UYWJfMTsKKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudFRhcmdldHNUYWJfQ2hlY2tfdGFyZ2V0c190b19lX3hlY3V0ZV9fMTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRUYXJnZXRzVGFiXzBfb3V0X29mXzBfc2VsZWN0ZWRfMjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRUYXJnZXRzVGFiX1RhcmdldF9leGVjdXRpb25fb3JkZXJfXzM7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQW50VGFyZ2V0c1RhYl9fT3JkZXJfX19fNDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRUYXJnZXRzVGFiX05hbWVfNTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRUYXJnZXRzVGFiX0Rlc2NyaXB0aW9uXzY7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQW50VGFyZ2V0c1RhYl9fMF9fb3V0X29mX18xX19zZWxlY3RlZF83OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudFRhcmdldHNUYWJfVGFyX2dldHNfMTQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQW50VGFyZ2V0c1RhYl9FcnJvcl9yZWFkaW5nX2NvbmZpZ3VyYXRpb25fMTI7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQW50VGFyZ2V0c1RhYl8xMjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRUYXJnZXRzVGFiXzEzOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudFRhcmdldHNUYWJfMTQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQW50VGFyZ2V0c1RhYl8xNTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRUYXJnZXRzVGFiXzE2OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudFRhcmdldHNUYWJfMTc7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQW50VGFyZ2V0c1RhYl8wOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudFRhcmdldHNUYWJfMTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRDbGFzc3BhdGhUYWJfMDsKKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRBbnRIb21lRW50cnlBY3Rpb25fMTsKKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhcmdldE9yZGVyRGlhbG9nX09yZGVyX1RhcmdldHNfMTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXRPcmRlckRpYWxvZ19fU3BlY2lmeV90YXJnZXRfZXhlY3V0aW9uX29yZGVyX18yOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhcmdldE9yZGVyRGlhbG9nX19VcF8zOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhcmdldE9yZGVyRGlhbG9nX19Eb3duXzQ7CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRFbnZpcm9ubWVudFRhYl8wOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNldFRhcmdldHNEaWFsb2dfMDsKKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRXb3JraW5nRGlyZWN0b3J5QmxvY2tfMDsKKworCXN0YXRpYyB7CisJCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQorCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBBbnRMYXVuY2hDb25maWd1cmF0aW9uTWVzc2FnZXMuY2xhc3MpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9sYXVuY2hDb25maWd1cmF0aW9ucy9BbnRMYXVuY2hDb25maWd1cmF0aW9uTWVzc2FnZXMucHJvcGVydGllcyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2xhdW5jaENvbmZpZ3VyYXRpb25zL0FudExhdW5jaENvbmZpZ3VyYXRpb25NZXNzYWdlcy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhNjI2ODEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9sYXVuY2hDb25maWd1cmF0aW9ucy9BbnRMYXVuY2hDb25maWd1cmF0aW9uTWVzc2FnZXMucHJvcGVydGllcwpAQCAtMCwwICsxLDgyIEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyMKKyMgQ29udHJpYnV0b3JzOgorIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjICAgICBkYWtzaGluYW11cnRoeS5rYXJyYUBnbWFpbC5jb20gLSBidWcgMTY1MzcxCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK0FkZFZhcmlhYmxlU3RyaW5nQWN0aW9uXzE9QWRkIFZhcmlhJmJsZS4uLgorQWRkVmFyaWFibGVTdHJpbmdBY3Rpb25fMj0mQ2xhc3NwYXRoIEVudHJ5IFZhbHVlOgorQWRkVmFyaWFibGVTdHJpbmdBY3Rpb25fMz0mVmFyaWFibGVzLi4uCitBZGRWYXJpYWJsZVN0cmluZ0FjdGlvbl80PUFkZCBWYXJpYWJsZSBDbGFzc3BhdGggRW50cnkKKworQW50TGF1bmNoU2hvcnRjdXRfVW5hYmxlPVVuYWJsZSB0byBmaW5kIGFuIEFudCBmaWxlIHRvIHJ1bi4KK0FudExhdW5jaFNob3J0Y3V0XzI9QW4gZXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIGNyZWF0aW5nIGEgZGVmYXVsdCBBbnQgbGF1bmNoIGNvbmZpZ3VyYXRpb24gZm9yIHswfQorQW50TGF1bmNoU2hvcnRjdXRfMz1BbiBleGNlcHRpb24gb2NjdXJyZWQgd2hpbGUgcmV0cmlldmluZyBBbnQgbGF1bmNoIGNvbmZpZ3VyYXRpb25zLgorQW50TGF1bmNoU2hvcnRjdXRfND1BbnQgQ29uZmlndXJhdGlvbiBTZWxlY3Rpb24KK0FudExhdW5jaFNob3J0Y3V0XzU9JkNob29zZSBhbiBBbnQgY29uZmlndXJhdGlvbiB0byBydW46CitBbnRMYXVuY2hTaG9ydGN1dF9FcnJvcl83PUVycm9yCitBbnRMYXVuY2hTaG9ydGN1dF9CdWlsZF9GYWlsZWRfMj1CdWlsZCBGYWlsZWQKK0FudExhdW5jaFNob3J0Y3V0X0V4Y2VwdGlvbl9sYXVuY2hpbmc9QW4gZXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIGxhdW5jaGluZyB7MH0KKworQW50UHJvcGVydGllc1RhYl9fUHJvcGVydGllc19fNj0mUHJvcGVydGllczoKK0FudFByb3BlcnRpZXNUYWJfUHJvcGVydHlfZl9pbGVzX183PVAmcm9wZXJ0eSBmaWxlczoKK0FudFByb3BlcnRpZXNUYWJfUF9yb3BlcnRpZXNfOD1Qcm9wZXJ0aWVzCitBbnRQcm9wZXJ0aWVzVGFiX0Vycm9yX3JlYWRpbmdfY29uZmlndXJhdGlvbl85PUVycm9yIHJlYWRpbmcgY29uZmlndXJhdGlvbgorQW50UHJvcGVydGllc1RhYl82PVVzZSAmZ2xvYmFsIHByb3BlcnRpZXMgYXMgc3BlY2lmaWVkIGluIHRoZSBBbnQgcnVudGltZSBwcmVmZXJlbmNlcworCitBbnRKUkVUYWJfMj1SdW4gaW4gdGhlIHNhbWUgJkpSRSBhcyB0aGUgd29ya3NwYWNlCitBbnRKUkVUYWJfMz1TZSZwYXJhdGUgSlJFOgorCitBbnRCdWlsZGVyVGFyZ2V0c1RhYl8wPTxCdWlsZGVyIGlzIG5vdCBzZXQgdG8gcnVuIGZvciB0aGlzIGJ1aWxkIGtpbmQ+CitBbnRCdWlsZGVyVGFyZ2V0c1RhYl8xPUFmdGVyIGEgIkNsZWFuIjoKK0FudEJ1aWxkZXJUYXJnZXRzVGFiXzI9JlNldCBUYXJnZXRzLi4uCitBbnRCdWlsZGVyVGFyZ2V0c1RhYl8zPU1hbnVhbCBCdWlsZDoKK0FudEJ1aWxkZXJUYXJnZXRzVGFiXzQ9U2V0ICZUYXJnZXRzLi4uCitBbnRCdWlsZGVyVGFyZ2V0c1RhYl81PUF1dG8gQnVpbGQ6CitBbnRCdWlsZGVyVGFyZ2V0c1RhYl82PVNldCBUJmFyZ2V0cy4uLgorQW50QnVpbGRlclRhcmdldHNUYWJfNz1EdXJpbmcgYSAiQ2xlYW4iOgorQW50QnVpbGRlclRhcmdldHNUYWJfOD1TZXQgVGFyJmdldHMuLi4KK0FudEJ1aWxkZXJUYXJnZXRzVGFiXzEwPTxkZWZhdWx0IHRhcmdldCBzZWxlY3RlZD4KKworQW50TWFpblRhYl9fU2VsZWN0X2FfYnVpbGRfZmlsZV9fMT0mU2VsZWN0IGEgYnVpbGRmaWxlOgorQW50TWFpblRhYl8zPUJhc2UgRGlyZWN0Jm9yeToKK0FudE1haW5UYWJfNj1CdWlsZGZpJmxlOgorQW50TWFpblRhYl8wPVNldCBhbiBJbnB1dCAmaGFuZGxlcgorQW50TWFpblRhYl8xPUVycm9yIHJlYWRpbmcgY29uZmlndXJhdGlvbgorCitBbnRUYXJnZXRzVGFiX0NoZWNrX3RhcmdldHNfdG9fZV94ZWN1dGVfXzE9Q2hlY2sgdGFyZ2V0cyB0byBlJnhlY3V0ZToKK0FudFRhcmdldHNUYWJfMF9vdXRfb2ZfMF9zZWxlY3RlZF8yPTAgb3V0IG9mIDAgc2VsZWN0ZWQKK0FudFRhcmdldHNUYWJfVGFyZ2V0X2V4ZWN1dGlvbl9vcmRlcl9fMz1UYXJnZXQgZXhlY3V0aW9uIG9yZGVyOgorQW50VGFyZ2V0c1RhYl9fT3JkZXJfX19fND0mT3JkZXIuLi4KK0FudFRhcmdldHNUYWJfTmFtZV81PU5hbWUKK0FudFRhcmdldHNUYWJfRGVzY3JpcHRpb25fNj1EZXNjcmlwdGlvbgorQW50VGFyZ2V0c1RhYl9fMF9fb3V0X29mX18xX19zZWxlY3RlZF83PXswfSBvdXQgb2YgezF9IHNlbGVjdGVkCitBbnRUYXJnZXRzVGFiX1Rhcl9nZXRzXzE0PVRhcmdldHMKK0FudFRhcmdldHNUYWJfRXJyb3JfcmVhZGluZ19jb25maWd1cmF0aW9uXzEyPUVycm9yIHJlYWRpbmcgY29uZmlndXJhdGlvbgorQW50VGFyZ2V0c1RhYl8xMj0mSGlkZSBpbnRlcm5hbCB0YXJnZXRzIG5vdCBzZWxlY3RlZCBmb3IgZXhlY3V0aW9uCitBbnRUYXJnZXRzVGFiXzEzPXswfSBvdXQgb2YgezF9IHNlbGVjdGVkICh7Mn0gaW50ZXJuYWwgdGFyZ2V0KHMpIGhpZGRlbikKK0FudFRhcmdldHNUYWJfMTQ9JlNvcnQgdGFyZ2V0cworQW50VGFyZ2V0c1RhYl8xNT1CdWlsZGZpbGUgZG9lcyBub3QgZXhpc3QKK0FudFRhcmdldHNUYWJfMTY9QnVpbGRmaWxlIHNwZWNpZmllZCBpcyBub3QgYSBmaWxlCitBbnRUYXJnZXRzVGFiXzE3PVRhcmdldCBzZWxlY3Rpb24gaXMgbm90IHBvc3NpYmxlIGFzIGJ1aWxkZmlsZSBsb2NhdGlvbiBjb250YWlucyB2YXJpYWJsZShzKSB0aGF0IGNhbm5vdCBiZSByZXNvbHZlZCB1bnRpbCBydW50aW1lLgorQW50VGFyZ2V0c1RhYl8wPUJ1aWxkZmlsZSBjb250YWlucyBlcnJvcnMvcHJvYmxlbXMuIENoZWNrIHN5bnRheCBhbmQgY2xhc3NwYXRoCitBbnRUYXJnZXRzVGFiXzE9Tm8gdGFyZ2V0cyBjb3VsZCBiZSBkZXRlcm1pbmVkIGZvciB0aGUgYnVpbGRmaWxlCitBbnRDbGFzc3BhdGhUYWJfMD1BZGQgRiZvbGRlcnMuLi4KKworRWRpdEFudEhvbWVFbnRyeUFjdGlvbl8xPUFudCAmSG9tZS4uLgorCitUYXJnZXRPcmRlckRpYWxvZ19PcmRlcl9UYXJnZXRzXzE9T3JkZXIgVGFyZ2V0cworVGFyZ2V0T3JkZXJEaWFsb2dfX1NwZWNpZnlfdGFyZ2V0X2V4ZWN1dGlvbl9vcmRlcl9fMj0mU3BlY2lmeSB0YXJnZXQgZXhlY3V0aW9uIG9yZGVyOgorVGFyZ2V0T3JkZXJEaWFsb2dfX1VwXzM9JlVwCitUYXJnZXRPcmRlckRpYWxvZ19fRG93bl80PSZEb3duCisKK0FudEVudmlyb25tZW50VGFiXzA9QW4gZW52aXJvbm1lbnQgY2FuIG9ubHkgYmUgdXNlZCB3aGVuIHJ1bm5pbmcgaW4gYSBzZXBhcmF0ZSBKUkUuXG5UaGlzIHNldHRpbmcgY2FuIGJlIGNvbmZpZ3VyZWQgb24gdGhlIEpSRSB0YWIuCitTZXRUYXJnZXRzRGlhbG9nXzA9U2V0IFRhcmdldHMKKworQW50V29ya2luZ0RpcmVjdG9yeUJsb2NrXzA9RXhjZXB0aW9uIG9jY3VycmVkIHJlYWRpbmcgY29uZmlndXJhdGlvbjogezB9CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9sYXVuY2hDb25maWd1cmF0aW9ucy9BbnRMYXVuY2hEZWxlZ2F0ZS5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvbGF1bmNoQ29uZmlndXJhdGlvbnMvQW50TGF1bmNoRGVsZWdhdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTk1MjEzCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvbGF1bmNoQ29uZmlndXJhdGlvbnMvQW50TGF1bmNoRGVsZWdhdGUuamF2YQpAQCAtMCwwICsxLDI2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogICAgIEp1YW4gQS4gSGVybmFuZGV6IC0gYnVnIDg5OTI2CisgKiAgICAgZGFrc2hpbmFtdXJ0aHkua2FycmFAZ21haWwuY29tIC0gYnVnIDE2NTM3MQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5sYXVuY2hDb25maWd1cmF0aW9uczsKKworCisvKioKKyAqIDxiPlRoaXMgY2xhc3Mgc2hvdWxkIG5vIGxvbmdlciBiZSB1c2VkLjwvYj4KKyAqIDxwPgorICogT2xkIGxhdW5jaCBkZWxlZ2F0ZSBmb3IgQW50IGJ1aWxkcworICogPC9wPgorICogQGRlcHJlY2F0ZWQgdGhpcyBjbGFzcyBoYXMgYmVlbiByZXBsYWNlZCB3aXRoIHtAbGluayBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwubGF1bmNoaW5nLmxhdW5jaENvbmZpZ3VyYXRpb25zLkFudExhdW5jaERlbGVnYXRlfQorICogIGFuZCBpcyBvbmx5IHByZXNlbnQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CisgKi8KK3B1YmxpYyBjbGFzcyBBbnRMYXVuY2hEZWxlZ2F0ZSBleHRlbmRzIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5sYXVuY2hpbmcubGF1bmNoQ29uZmlndXJhdGlvbnMuQW50TGF1bmNoRGVsZWdhdGUgIHsKKwkKK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2xhdW5jaENvbmZpZ3VyYXRpb25zL0FudExhdW5jaFNob3J0Y3V0V2l0aERpYWxvZy5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvbGF1bmNoQ29uZmlndXJhdGlvbnMvQW50TGF1bmNoU2hvcnRjdXRXaXRoRGlhbG9nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYxZGYzMQotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2xhdW5jaENvbmZpZ3VyYXRpb25zL0FudExhdW5jaFNob3J0Y3V0V2l0aERpYWxvZy5qYXZhCkBAIC0wLDAgKzEsMjMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmxhdW5jaENvbmZpZ3VyYXRpb25zOworCitwdWJsaWMgY2xhc3MgQW50TGF1bmNoU2hvcnRjdXRXaXRoRGlhbG9nIGV4dGVuZHMgQW50TGF1bmNoU2hvcnRjdXQgeworCQorCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgQW50IGxhdW5jaCBzaG9ydGN1dCB0aGF0IHdpbGwgb3BlbiB0aGUKKwkgKiBsYXVuY2ggY29uZmlndXJhdGlvbiBkaWFsb2cuCisJICovCisJcHVibGljIEFudExhdW5jaFNob3J0Y3V0V2l0aERpYWxvZygpIHsKKwkJc3VwZXIoKTsKKwkJc2V0U2hvd0RpYWxvZyh0cnVlKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9sYXVuY2hDb25maWd1cmF0aW9ucy9BbnRQcm9wZXJ0aWVzVGFiLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9sYXVuY2hDb25maWd1cmF0aW9ucy9BbnRQcm9wZXJ0aWVzVGFiLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU1MGZiZQotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2xhdW5jaENvbmZpZ3VyYXRpb25zL0FudFByb3BlcnRpZXNUYWIuamF2YQpAQCAtMCwwICsxLDI2MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkubGF1bmNoQ29uZmlndXJhdGlvbnM7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmNvcmUuQW50Q29yZVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuY29yZS5BbnRDb3JlUHJlZmVyZW5jZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmNvcmUuUHJvcGVydHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLkFudFVJSW1hZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5BbnRVSVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuQW50VXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuSUFudFVJQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5JQW50VUlIZWxwQ29udGV4dElkczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkucHJlZmVyZW5jZXMuQW50UHJvcGVydGllc0Jsb2NrOworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5JQW50QmxvY2tDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy5JQW50TGF1bmNoQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5OworaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLkFic3RyYWN0TGF1bmNoQ29uZmlndXJhdGlvblRhYjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JTGF1bmNoQ29uZmlndXJhdGlvblRhYjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7CisKKy8qKgorICogVGFiIGZvciBzZXR0aW5nIEFudCB1c2VyIHByb3BlcnRpZXMgcGVyIGxhdW5jaCBjb25maWd1cmF0aW9uLiBBbGwgcHJvcGVydGllcworICogc3BlY2lmaWVkIGhlcmUgd2lsbCBiZSBzZXQgYXMgdXNlciBwcm9wZXJ0aWVzIG9uIHRoZSBwcm9qZWN0IGZvciB0aGUKKyAqIHNwZWNpZmllZCBBbnQgYnVpbGQKKyAqLworcHVibGljIGNsYXNzIEFudFByb3BlcnRpZXNUYWIgZXh0ZW5kcyBBYnN0cmFjdExhdW5jaENvbmZpZ3VyYXRpb25UYWIgaW1wbGVtZW50cyBJQW50QmxvY2tDb250YWluZXIgeworCQorCXByaXZhdGUgQnV0dG9uIGZVc2VEZWZhdWx0QnV0dG9uOworCXByaXZhdGUgQW50UHJvcGVydGllc0Jsb2NrIGZBbnRQcm9wZXJ0aWVzQmxvY2s9IG5ldyBBbnRQcm9wZXJ0aWVzQmxvY2sodGhpcyk7CisgICAgcHJpdmF0ZSBib29sZWFuIGZTZXBhcmF0ZUpSRT0gdHJ1ZTsKKwkKKwlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJQ29tcG9zaXRlIHRvcCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7CisJCXRvcC5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOworCQlzZXRDb250cm9sKHRvcCk7CisJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZ2V0Q29udHJvbCgpLCBJQW50VUlIZWxwQ29udGV4dElkcy5BTlRfUFJPUEVSVElFU19UQUIpOworCisJCXRvcC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7CisJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7CisJCXRvcC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKKwkJCisJCWNyZWF0ZUNoYW5nZVByb3BlcnRpZXModG9wKTsKKwkJCisJCUNvbXBvc2l0ZSBwcm9wZXJ0aWVzQmxvY2tDb21wb3NpdGU9IG5ldyBDb21wb3NpdGUodG9wLCBTV1QuTk9ORSk7CisJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKKwkJbGF5b3V0Lm51bUNvbHVtbnM9IDI7CisJCXByb3BlcnRpZXNCbG9ja0NvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKKwkJcHJvcGVydGllc0Jsb2NrQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOworCQkKKwkJZkFudFByb3BlcnRpZXNCbG9jay5jcmVhdGVDb250cm9sKHByb3BlcnRpZXNCbG9ja0NvbXBvc2l0ZSwgQW50TGF1bmNoQ29uZmlndXJhdGlvbk1lc3NhZ2VzLkFudFByb3BlcnRpZXNUYWJfX1Byb3BlcnRpZXNfXzYsIEFudExhdW5jaENvbmZpZ3VyYXRpb25NZXNzYWdlcy5BbnRQcm9wZXJ0aWVzVGFiX1Byb3BlcnR5X2ZfaWxlc19fNyk7CisJCQorCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KHRvcCk7CisJfQorCQorCXByaXZhdGUgdm9pZCBjcmVhdGVDaGFuZ2VQcm9wZXJ0aWVzKENvbXBvc2l0ZSB0b3ApIHsKKwkJZlVzZURlZmF1bHRCdXR0b249IGNyZWF0ZUNoZWNrQnV0dG9uKHRvcCwgQW50TGF1bmNoQ29uZmlndXJhdGlvbk1lc3NhZ2VzLkFudFByb3BlcnRpZXNUYWJfNik7CisJCWZVc2VEZWZhdWx0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCXRvZ2dsZVVzZURlZmF1bHRQcm9wZXJ0aWVzKCk7CisJCQkJdXBkYXRlTGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZygpOworCQkJfQorCQl9KTsKKwl9CQkKKwkJCisJcHJpdmF0ZSB2b2lkIHRvZ2dsZVVzZURlZmF1bHRQcm9wZXJ0aWVzKCkgeworCQlib29sZWFuIGVuYWJsZT0gIWZVc2VEZWZhdWx0QnV0dG9uLmdldFNlbGVjdGlvbigpOworCQlmQW50UHJvcGVydGllc0Jsb2NrLnNldEVuYWJsZWQoZW5hYmxlKTsKKyAgICAgICAgaWYgKCFlbmFibGUpIHsKKyAgICAgICAgICAgIGluaXRpYWxpemVBc0dsb2JhbChmU2VwYXJhdGVKUkUpOworICAgICAgICB9CisJfQorCQorCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuSUxhdW5jaENvbmZpZ3VyYXRpb25UYWIjZ2V0SW1hZ2UoKQorCSAqLworCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKKwkJcmV0dXJuIEFudFVJSW1hZ2VzLmdldEltYWdlKElBbnRVSUNvbnN0YW50cy5JTUdfUFJPUEVSVFkpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuSUxhdW5jaENvbmZpZ3VyYXRpb25UYWIjZ2V0TmFtZSgpCisJICovCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gQW50TGF1bmNoQ29uZmlndXJhdGlvbk1lc3NhZ2VzLkFudFByb3BlcnRpZXNUYWJfUF9yb3BlcnRpZXNfODsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLklMYXVuY2hDb25maWd1cmF0aW9uVGFiI2luaXRpYWxpemVGcm9tKG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb24pCisJICovCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb20oSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgeworICAgICAgICBmU2VwYXJhdGVKUkU9IEFudFV0aWwuaXNTZXBhcmF0ZUpSRUFudEJ1aWxkKGNvbmZpZ3VyYXRpb24pOworCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7CisJCXNldE1lc3NhZ2UobnVsbCk7CisJCU1hcCBwcm9wZXJ0aWVzPSBudWxsOworCQl0cnkgeworCQkJcHJvcGVydGllcz0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoSUFudExhdW5jaENvbnN0YW50cy5BVFRSX0FOVF9QUk9QRVJUSUVTLCAoTWFwKW51bGwpOworCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7CisJCQlBbnRVSVBsdWdpbi5sb2coQW50TGF1bmNoQ29uZmlndXJhdGlvbk1lc3NhZ2VzLkFudFByb3BlcnRpZXNUYWJfRXJyb3JfcmVhZGluZ19jb25maWd1cmF0aW9uXzksIGNlKTsKKwkJfQorCQkKKwkJU3RyaW5nIHByb3BlcnR5RmlsZXM9IG51bGw7CisJCXRyeSB7CisJCQlwcm9wZXJ0eUZpbGVzPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShJQW50TGF1bmNoQ29uc3RhbnRzLkFUVFJfQU5UX1BST1BFUlRZX0ZJTEVTLCAoU3RyaW5nKW51bGwpOworCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7CisJCQlBbnRVSVBsdWdpbi5sb2coQW50TGF1bmNoQ29uZmlndXJhdGlvbk1lc3NhZ2VzLkFudFByb3BlcnRpZXNUYWJfRXJyb3JfcmVhZGluZ19jb25maWd1cmF0aW9uXzksIGNlKTsKKwkJfQorCQkKKwkJaWYgKHByb3BlcnRpZXMgPT0gbnVsbCAmJiBwcm9wZXJ0eUZpbGVzID09IG51bGwpIHsKKwkJICAgIGluaXRpYWxpemVBc0dsb2JhbChmU2VwYXJhdGVKUkUpOworCQl9IGVsc2UgeworCQkJZlVzZURlZmF1bHRCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKKwkJCWZBbnRQcm9wZXJ0aWVzQmxvY2sucG9wdWxhdGVQcm9wZXJ0eVZpZXdlcihwcm9wZXJ0aWVzKTsKKwkJCisJCQlTdHJpbmdbXSBmaWxlcz0gQW50VXRpbC5wYXJzZVN0cmluZyhwcm9wZXJ0eUZpbGVzLCAiLCIpOyAvLyROT04tTkxTLTEkCisJCQlmQW50UHJvcGVydGllc0Jsb2NrLnNldFByb3BlcnR5RmlsZXNJbnB1dChmaWxlcyk7CisJCX0KKwkJCisJCXRvZ2dsZVVzZURlZmF1bHRQcm9wZXJ0aWVzKCk7CisJfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVBc0dsb2JhbChib29sZWFuIHNlcGFyYXRlVk0pIHsKKyAgICAgICAgQW50Q29yZVByZWZlcmVuY2VzIHByZWZzID0gQW50Q29yZVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRQcmVmZXJlbmNlcygpOworICAgICAgICBMaXN0IHByZWZQcm9wZXJ0aWVzOworICAgICAgICBpZiAoc2VwYXJhdGVWTSkgeworICAgICAgICAgICAgcHJlZlByb3BlcnRpZXM9IHByZWZzLmdldFJlbW90ZUFudFByb3BlcnRpZXMoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByZWZQcm9wZXJ0aWVzPSBwcmVmcy5nZXRQcm9wZXJ0aWVzKCk7CisgICAgICAgIH0KKyAgICAgICAgZkFudFByb3BlcnRpZXNCbG9jay5zZXRQcm9wZXJ0aWVzSW5wdXQoKFByb3BlcnR5W10pIHByZWZQcm9wZXJ0aWVzLnRvQXJyYXkobmV3IFByb3BlcnR5W3ByZWZQcm9wZXJ0aWVzLnNpemUoKV0pKTsKKyAgICAgICAgZkFudFByb3BlcnRpZXNCbG9jay5zZXRQcm9wZXJ0eUZpbGVzSW5wdXQoQW50Q29yZVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRQcmVmZXJlbmNlcygpLmdldEN1c3RvbVByb3BlcnR5RmlsZXMoZmFsc2UpKTsKKyAgICAgICAgZkFudFByb3BlcnRpZXNCbG9jay5zZXRUYWJsZXNFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgZlVzZURlZmF1bHRCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOworICAgIH0KKwkKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLklMYXVuY2hDb25maWd1cmF0aW9uVGFiI3BlcmZvcm1BcHBseShvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkpCisJICovCisJcHVibGljIHZvaWQgcGVyZm9ybUFwcGx5KElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlndXJhdGlvbikgeworCQlpZiAoZlVzZURlZmF1bHRCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKKwkJCWNvbmZpZ3VyYXRpb24uc2V0QXR0cmlidXRlKElBbnRMYXVuY2hDb25zdGFudHMuQVRUUl9BTlRfUFJPUEVSVElFUywgKE1hcCludWxsKTsKKwkJCWNvbmZpZ3VyYXRpb24uc2V0QXR0cmlidXRlKElBbnRMYXVuY2hDb25zdGFudHMuQVRUUl9BTlRfUFJPUEVSVFlfRklMRVMsIChTdHJpbmcpbnVsbCk7CisJCQlyZXR1cm47CisJCX0KKwkJCQkKKwkJT2JqZWN0W10gaXRlbXM9IGZBbnRQcm9wZXJ0aWVzQmxvY2suZ2V0UHJvcGVydGllcygpOworCQlNYXAgcHJvcGVydGllcz0gbnVsbDsKKwkJaWYgKGl0ZW1zLmxlbmd0aCA+IDApIHsKKwkJCXByb3BlcnRpZXM9IG5ldyBIYXNoTWFwKGl0ZW1zLmxlbmd0aCk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7CisJCQkJUHJvcGVydHkgcHJvcGVydHkgPSAoUHJvcGVydHkpaXRlbXNbaV07CisJCQkJcHJvcGVydGllcy5wdXQocHJvcGVydHkuZ2V0TmFtZSgpLCBwcm9wZXJ0eS5nZXRWYWx1ZShmYWxzZSkpOworCQkJfQorCQl9CisJCQorCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShJQW50TGF1bmNoQ29uc3RhbnRzLkFUVFJfQU5UX1BST1BFUlRJRVMsIHByb3BlcnRpZXMpOworCQkKKwkJaXRlbXM9IGZBbnRQcm9wZXJ0aWVzQmxvY2suZ2V0UHJvcGVydHlGaWxlcygpOworCQlTdHJpbmcgZmlsZXM9IG51bGw7CisJCWlmIChpdGVtcy5sZW5ndGggPiAwKSB7CisJCQlTdHJpbmdCdWZmZXIgYnVmZj0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgeworCQkJCVN0cmluZyBwYXRoID0gKFN0cmluZylpdGVtc1tpXTsKKwkJCQlidWZmLmFwcGVuZChwYXRoKTsKKwkJCQlidWZmLmFwcGVuZCgnLCcpOworCQkJfQorCQkJZmlsZXM9IGJ1ZmYudG9TdHJpbmcoKTsKKwkJfQorCQkKKwkJY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoSUFudExhdW5jaENvbnN0YW50cy5BVFRSX0FOVF9QUk9QRVJUWV9GSUxFUywgZmlsZXMpOworCQkKKwkJZkFudFByb3BlcnRpZXNCbG9jay5zYXZlU2V0dGluZ3MoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLklMYXVuY2hDb25maWd1cmF0aW9uVGFiI3NldERlZmF1bHRzKG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSkKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXREZWZhdWx0cyhJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZ3VyYXRpb24pIHsKKwl9CisJCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLnByZWZlcmVuY2VzLklBbnRCbG9ja0NvbnRhaW5lciNjcmVhdGVQdXNoQnV0dG9uKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgamF2YS5sYW5nLlN0cmluZykKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSB7CisJCXN1cGVyLnNldE1lc3NhZ2UobWVzc2FnZSk7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLnByZWZlcmVuY2VzLklBbnRCbG9ja0NvbnRhaW5lciNjcmVhdGVQdXNoQnV0dG9uKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgamF2YS5sYW5nLlN0cmluZykKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRFcnJvck1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKKwkJc3VwZXIuc2V0RXJyb3JNZXNzYWdlKG1lc3NhZ2UpOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5JQW50QmxvY2tDb250YWluZXIjY3JlYXRlUHVzaEJ1dHRvbihvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIGphdmEubGFuZy5TdHJpbmcpCisJICovCisJcHVibGljIEJ1dHRvbiBjcmVhdGVQdXNoQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBidXR0b25UZXh0KSB7CisJCXJldHVybiBzdXBlci5jcmVhdGVQdXNoQnV0dG9uKHBhcmVudCwgYnV0dG9uVGV4dCwgbnVsbCk7CisJfQorCQorCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLnByZWZlcmVuY2VzLklBbnRCbG9ja0NvbnRhaW5lciN1cGRhdGUoKQorCSAqLworCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKKwkJdXBkYXRlVGFyZ2V0c1RhYigpOworCQl1cGRhdGVMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKCk7CisJfQorCQorCXByaXZhdGUgdm9pZCB1cGRhdGVUYXJnZXRzVGFiKCkgeworCQkvL3RoZSBwcm9wZXJ0aWVzIGhhdmUgY2hhbmdlZC4uLnNldCB0aGUgdGFyZ2V0cyB0YWIgdG8gCisJCS8vbmVlZCB0byBiZSByZWNvbXB1dGVkCisJCUlMYXVuY2hDb25maWd1cmF0aW9uVGFiW10gdGFicz0gIGdldExhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2coKS5nZXRUYWJzKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgdGFicy5sZW5ndGg7IGkrKykgeworCQkJSUxhdW5jaENvbmZpZ3VyYXRpb25UYWIgdGFiID0gdGFic1tpXTsKKwkJCWlmICh0YWIgaW5zdGFuY2VvZiBBbnRUYXJnZXRzVGFiKSB7CisJCQkJKChBbnRUYXJnZXRzVGFiKXRhYikuc2V0RGlydHkodHJ1ZSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JTGF1bmNoQ29uZmlndXJhdGlvblRhYiNhY3RpdmF0ZWQob3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5KQorCSAqLworCXB1YmxpYyB2b2lkIGFjdGl2YXRlZChJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IHdvcmtpbmdDb3B5KSB7CisgICAgICAgIGlmIChmU2VwYXJhdGVKUkUgIT0gQW50VXRpbC5pc1NlcGFyYXRlSlJFQW50QnVpbGQod29ya2luZ0NvcHkpKSB7CisgICAgICAgICAgICAvL3VwZGF0ZSB0aGUgcHJvcGVydGllcyBpZiBjaGFuZ2VkIHdoZXRoZXIgYnVpbGQgaXMgaW4gc2VwYXJhdGUgSlJFCisgICAgICAgICAgICBpbml0aWFsaXplRnJvbSh3b3JraW5nQ29weSk7CisgICAgICAgIH0KKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JTGF1bmNoQ29uZmlndXJhdGlvblRhYiNkZWFjdGl2YXRlZChvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkpCisJICovCisJcHVibGljIHZvaWQgZGVhY3RpdmF0ZWQoSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSB3b3JraW5nQ29weSkgeworCX0KK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2xhdW5jaENvbmZpZ3VyYXRpb25zL0FudFRhcmdldHNUYWIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2xhdW5jaENvbmZpZ3VyYXRpb25zL0FudFRhcmdldHNUYWIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGQ4YmE1Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvbGF1bmNoQ29uZmlndXJhdGlvbnMvQW50VGFyZ2V0c1RhYi5qYXZhCkBAIC0wLDAgKzEsODQ1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAgICAgTWFydGluIEthcnBpc2VrIChtYXJ0aW4ua2FycGlzZWtAZ21haWwuY29tKSAtIGJ1ZyAyMjk0NzQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkubGF1bmNoQ29uZmlndXJhdGlvbnM7CisKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLkFudFVJSW1hZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5BbnRVSVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuQW50VXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuSUFudFVJQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5JQW50VUlIZWxwQ29udGV4dElkczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkubW9kZWwuQW50RWxlbWVudE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLm1vZGVsLkFudE1vZGVsQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5tb2RlbC5BbnRQcm9qZWN0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkubW9kZWwuQW50VGFyZ2V0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkubW9kZWwuSW50ZXJuYWxUYXJnZXRGaWx0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy5JQW50TGF1bmNoQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXh0ZXJuYWx0b29scy5pbnRlcm5hbC5JRXh0ZXJuYWxUb29sQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS52YXJpYWJsZXMuSVN0cmluZ1ZhcmlhYmxlTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnZhcmlhYmxlcy5WYXJpYWJsZXNQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuQWJzdHJhY3RMYXVuY2hDb25maWd1cmF0aW9uVGFiOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlQ29udGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VGFibGVWaWV3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5XZWlnaHREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRG91YmxlQ2xpY2tFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDaGVja1N0YXRlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JRG91YmxlQ2xpY2tMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyQ29tcGFyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TaGVsbEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TaGVsbEV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKKworaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuTWVzc2FnZUZvcm1hdDsKKworLyoqCisgKiBMYXVuY2ggY29uZmlndXJhdGlvbiB0YWIgd2hpY2ggYWxsb3dzIHRoZSB1c2VyIHRvIGNob29zZSB0aGUgdGFyZ2V0cworICogZnJvbSBhbiBBbnQgYnVpbGRmaWxlIHRoYXQgd2lsbCBiZSBleGVjdXRlZCB3aGVuIHRoZSBjb25maWd1cmF0aW9uIGlzCisgKiBsYXVuY2hlZC4KKyAqLworcHVibGljIGNsYXNzIEFudFRhcmdldHNUYWIgZXh0ZW5kcyBBYnN0cmFjdExhdW5jaENvbmZpZ3VyYXRpb25UYWIgeworCQorCXByaXZhdGUgQW50VGFyZ2V0Tm9kZSBmRGVmYXVsdFRhcmdldCA9IG51bGw7CisJcHJpdmF0ZSBBbnRUYXJnZXROb2RlW10gZkFsbFRhcmdldHM9IG51bGw7CisJcHJpdmF0ZSBMaXN0IGZPcmRlcmVkVGFyZ2V0cyA9IG51bGw7CisJCisJcHJpdmF0ZSBDaGVja2JveFRhYmxlVmlld2VyIGZUYWJsZVZpZXdlciA9IG51bGw7CisJcHJpdmF0ZSBMYWJlbCBmU2VsZWN0aW9uQ291bnRMYWJlbCA9IG51bGw7CisJcHJpdmF0ZSBUZXh0IGZUYXJnZXRPcmRlclRleHQgPSBudWxsOworCXByaXZhdGUgQnV0dG9uIGZPcmRlckJ1dHRvbiA9IG51bGw7CisJcHJpdmF0ZSBCdXR0b24gZkZpbHRlckludGVybmFsVGFyZ2V0czsKKwlwcml2YXRlIEludGVybmFsVGFyZ2V0RmlsdGVyIGZJbnRlcm5hbFRhcmdldEZpbHRlcj0gbnVsbDsKKwlwcml2YXRlIEJ1dHRvbiBmU29ydEJ1dHRvbjsKKwkKKwlwcml2YXRlIElMYXVuY2hDb25maWd1cmF0aW9uIGZMYXVuY2hDb25maWd1cmF0aW9uOworCXByaXZhdGUgaW50IGZTb3J0RGlyZWN0aW9uPSAwOworCXByaXZhdGUgYm9vbGVhbiBmSW5pdGlhbGl6aW5nPSBmYWxzZTsKKwkKKwkvKioKKwkgKiBTb3J0IGRpcmVjdGlvbiBjb25zdGFudHMuCisJICovCisJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgU09SVF9OT05FPSAwOworCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFNPUlRfTkFNRT0gMTsKKwlwdWJsaWMgZmluYWwgc3RhdGljIGludCBTT1JUX05BTUVfUkVWRVJTRT0gLTE7CisJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgU09SVF9ERVNDUklQVElPTj0gMjsKKwlwdWJsaWMgZmluYWwgc3RhdGljIGludCBTT1JUX0RFU0NSSVBUSU9OX1JFVkVSU0U9IC0yOworCQorCS8qKgorCSAqIEEgY29tcGFyYXRvciB3aGljaCBjYW4gc29ydCB0YXJnZXRzIGJ5IG5hbWUgb3IgZGVzY3JpcHRpb24sIGluCisJICogZm9yd2FyZCBvciByZXZlcnNlIG9yZGVyLgorCSAqLworCXByaXZhdGUgY2xhc3MgQW50VGFyZ2V0c0NvbXBhcmF0b3IgZXh0ZW5kcyBWaWV3ZXJDb21wYXJhdG9yIHsKKwkJLyogKG5vbi1KYXZhZG9jKQorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyQ29tcGFyYXRvciNjb21wYXJlKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyLCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQorCQkgKi8KKwkJcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBlMSwgT2JqZWN0IGUyKSB7CisJCQlpZiAoIShlMSBpbnN0YW5jZW9mIEFudFRhcmdldE5vZGUgJiYgZTIgaW5zdGFuY2VvZiBBbnRUYXJnZXROb2RlKSkgeworCQkJCXJldHVybiBzdXBlci5jb21wYXJlKHZpZXdlciwgZTEsIGUyKTsKKwkJCX0KKwkJCWlmIChmU29ydERpcmVjdGlvbiA9PSBTT1JUX05PTkUpIHsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCVN0cmluZyBzdHJpbmcxLCBzdHJpbmcyOworCQkJaW50IHJlc3VsdD0gMDsKKwkJCWlmIChmU29ydERpcmVjdGlvbiA9PSBTT1JUX05BTUUgfHwgZlNvcnREaXJlY3Rpb24gPT0gU09SVF9OQU1FX1JFVkVSU0UpIHsKKwkJCQlzdHJpbmcxPSAoKEFudFRhcmdldE5vZGUpIGUxKS5nZXRMYWJlbCgpOworCQkJCXN0cmluZzI9ICgoQW50VGFyZ2V0Tm9kZSkgZTIpLmdldExhYmVsKCk7CisJCQl9IGVsc2UgeworCQkJCXN0cmluZzE9ICgoQW50VGFyZ2V0Tm9kZSkgZTEpLmdldFRhcmdldCgpLmdldERlc2NyaXB0aW9uKCk7CisJCQkJc3RyaW5nMj0gKChBbnRUYXJnZXROb2RlKSBlMikuZ2V0VGFyZ2V0KCkuZ2V0RGVzY3JpcHRpb24oKTsKKwkJCX0KKwkJCWlmIChzdHJpbmcxICE9IG51bGwgJiYgc3RyaW5nMiAhPSBudWxsKSB7CisJCQkJcmVzdWx0PSBnZXRDb21wYXJhdG9yKCkuY29tcGFyZShzdHJpbmcxLCBzdHJpbmcyKTsKKwkJCX0gZWxzZSBpZiAoc3RyaW5nMSA9PSBudWxsKSB7CisJCQkJcmVzdWx0PSAxOworCQkJfSBlbHNlIGlmIChzdHJpbmcyID09IG51bGwpIHsKKwkJCQlyZXN1bHQ9IC0xOworCQkJfQorCQkJaWYgKGZTb3J0RGlyZWN0aW9uIDwgMCkgeyAvLyByZXZlcnNlIHNvcnQKKwkJCQlpZiAocmVzdWx0ID09IDApIHsKKwkJCQkJcmVzdWx0PSAtMTsKKwkJCQl9IGVsc2UgeworCQkJCQlyZXN1bHQ9IC1yZXN1bHQ7CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCX0KKwkKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JTGF1bmNoQ29uZmlndXJhdGlvblRhYiNjcmVhdGVDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKKwkgKi8KKwlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJRm9udCBmb250ID0gcGFyZW50LmdldEZvbnQoKTsKKwkJCisJCUNvbXBvc2l0ZSBjb21wID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKKwkJc2V0Q29udHJvbChjb21wKTsKKwkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChnZXRDb250cm9sKCksIElBbnRVSUhlbHBDb250ZXh0SWRzLkFOVF9UQVJHRVRTX1RBQik7CisJCUdyaWRMYXlvdXQgdG9wTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKKwkJY29tcC5zZXRMYXlvdXQodG9wTGF5b3V0KTsJCQorCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOworCQljb21wLnNldExheW91dERhdGEoZ2QpOworCQljb21wLnNldEZvbnQoZm9udCk7CisJCQorCQljcmVhdGVUYXJnZXRzVGFibGUoY29tcCk7CisJCWNyZWF0ZVNlbGVjdGlvbkNvdW50KGNvbXApOworCQkKKwkJQ29tcG9zaXRlIGJ1dHRvbkNvbXBvc2l0ZT0gbmV3IENvbXBvc2l0ZShjb21wLCBTV1QuTk9ORSk7CisJCUdyaWRMYXlvdXQgbGF5b3V0PSBuZXcgR3JpZExheW91dCgpOworCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMDsKKwkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7CisJCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7CisJCWJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKKwkJYnV0dG9uQ29tcG9zaXRlLnNldEZvbnQoZm9udCk7CisJCQorCQljcmVhdGVTb3J0VGFyZ2V0cyhidXR0b25Db21wb3NpdGUpOworCQljcmVhdGVGaWx0ZXJJbnRlcm5hbFRhcmdldHMoYnV0dG9uQ29tcG9zaXRlKTsKKwkJCisJCWNyZWF0ZVZlcnRpY2FsU3BhY2VyKGNvbXAsIDEpOworCQljcmVhdGVUYXJnZXRPcmRlcihjb21wKTsKKwkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOworCX0KKwkKKwkvKioKKwkgKiBDcmVhdGVzIHRoZSBzZWxlY3Rpb24gY291bnQgd2lkZ2V0CisJICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbXBvc2l0ZQorCSAqLworCXByaXZhdGUgdm9pZCBjcmVhdGVTZWxlY3Rpb25Db3VudChDb21wb3NpdGUgcGFyZW50KSB7CisJCWZTZWxlY3Rpb25Db3VudExhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOworCQlmU2VsZWN0aW9uQ291bnRMYWJlbC5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOworCQlmU2VsZWN0aW9uQ291bnRMYWJlbC5zZXRUZXh0KEFudExhdW5jaENvbmZpZ3VyYXRpb25NZXNzYWdlcy5BbnRUYXJnZXRzVGFiXzBfb3V0X29mXzBfc2VsZWN0ZWRfMik7CisJCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7CisJCWZTZWxlY3Rpb25Db3VudExhYmVsLnNldExheW91dERhdGEoZ2QpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgdGhlIHdpZGdldHMgdGhhdCBkaXNwbGF5IHRoZSB0YXJnZXQgb3JkZXIKKwkgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgY29tcG9zaXRlCisJICovCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZVRhcmdldE9yZGVyKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJRm9udCBmb250PSBwYXJlbnQuZ2V0Rm9udCgpOworCQkKKwkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7CisJCWxhYmVsLnNldFRleHQoQW50TGF1bmNoQ29uZmlndXJhdGlvbk1lc3NhZ2VzLkFudFRhcmdldHNUYWJfVGFyZ2V0X2V4ZWN1dGlvbl9vcmRlcl9fMyk7CisJCWxhYmVsLnNldEZvbnQoZm9udCk7CisJCQorCQlDb21wb3NpdGUgb3JkZXJDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOworCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOworCQlvcmRlckNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdkKTsKKwkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7CisJCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOworCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOworCQlvcmRlckNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKKwkJb3JkZXJDb21wb3NpdGUuc2V0Rm9udChmb250KTsKKwkJCQkKKwkJZlRhcmdldE9yZGVyVGV4dCA9IG5ldyBUZXh0KG9yZGVyQ29tcG9zaXRlLCBTV1QuTVVMVEkgfCBTV1QuV1JBUCB8IFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuUkVBRF9PTkxZKTsKKwkJZlRhcmdldE9yZGVyVGV4dC5zZXRGb250KGZvbnQpOworCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOworCQlnZC5oZWlnaHRIaW50ID0gNDA7CisJCWdkLndpZHRoSGludCA9IElEaWFsb2dDb25zdGFudHMuRU5UUllfRklFTERfV0lEVEg7CisJCWZUYXJnZXRPcmRlclRleHQuc2V0TGF5b3V0RGF0YShnZCk7CisKKwkJZk9yZGVyQnV0dG9uID0gY3JlYXRlUHVzaEJ1dHRvbihvcmRlckNvbXBvc2l0ZSwgQW50TGF1bmNoQ29uZmlndXJhdGlvbk1lc3NhZ2VzLkFudFRhcmdldHNUYWJfX09yZGVyX19fXzQsIG51bGwpOworCQlnZCA9IChHcmlkRGF0YSlmT3JkZXJCdXR0b24uZ2V0TGF5b3V0RGF0YSgpOworCQlnZC52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkJFR0lOTklORzsKKwkJZk9yZGVyQnV0dG9uLnNldEZvbnQoZm9udCk7CisJCWZPcmRlckJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQloYW5kbGVPcmRlclByZXNzZWQoKTsKKwkJCX0KKwkJfSk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyB0aGUgdG9nZ2xlIHRvIGZpbHRlciBpbnRlcm5hbCB0YXJnZXRzIGZyb20gdGhlIHRhYmxlCisJICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbXBvc2l0ZQorCSAqLworCXByaXZhdGUgdm9pZCBjcmVhdGVGaWx0ZXJJbnRlcm5hbFRhcmdldHMoQ29tcG9zaXRlIHBhcmVudCkgeworCQlmRmlsdGVySW50ZXJuYWxUYXJnZXRzPSBjcmVhdGVDaGVja0J1dHRvbihwYXJlbnQsIEFudExhdW5jaENvbmZpZ3VyYXRpb25NZXNzYWdlcy5BbnRUYXJnZXRzVGFiXzEyKTsKKwkJZkZpbHRlckludGVybmFsVGFyZ2V0cy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQloYW5kbGVGaWx0ZXJUYXJnZXRzU2VsZWN0ZWQoKTsKKwkJCX0KKwkJfSk7CisJfQorCQorCS8qKgorCSAqIENyZWF0ZXMgdGhlIHRvZ2dsZSB0byBzb3J0IHRhcmdldHMgaW4gdGhlIHRhYmxlCisJICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbXBvc2l0ZQorCSAqLworCXByaXZhdGUgdm9pZCBjcmVhdGVTb3J0VGFyZ2V0cyhDb21wb3NpdGUgcGFyZW50KSB7CisJCWZTb3J0QnV0dG9uPSBjcmVhdGVDaGVja0J1dHRvbihwYXJlbnQsIEFudExhdW5jaENvbmZpZ3VyYXRpb25NZXNzYWdlcy5BbnRUYXJnZXRzVGFiXzE0KTsKKwkJZlNvcnRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CisJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJaGFuZGxlU29ydFRhcmdldHNTZWxlY3RlZCgpOworCQkJfQorCQl9KTsKKwl9CisJCisJLyoqCisJICogVGhlIGZpbHRlciB0YXJnZXRzIGJ1dHRvbiBoYXMgYmVlbiB0b2dnbGVkLiBJZiBpdCdzIGJlZW4KKwkgKiB0dXJuZWQgb24sIGZpbHRlciBvdXQgaW50ZXJuYWwgdGFyZ2V0cy4gRWxzZSwgcmVzdG9yZSBpbnRlcm5hbAorCSAqIHRhcmdldHMgdG8gdGhlIHRhYmxlLgorCSAqLworCXByaXZhdGUgdm9pZCBoYW5kbGVGaWx0ZXJUYXJnZXRzU2VsZWN0ZWQoKSB7CisJCWJvb2xlYW4gZmlsdGVyPSBmRmlsdGVySW50ZXJuYWxUYXJnZXRzLmdldFNlbGVjdGlvbigpOworCQlpZiAoZmlsdGVyKSB7CisJCQlmVGFibGVWaWV3ZXIuYWRkRmlsdGVyKGdldEludGVybmFsVGFyZ2V0c0ZpbHRlcigpKTsKKwkJfSBlbHNlIHsKKwkJCWZUYWJsZVZpZXdlci5yZW1vdmVGaWx0ZXIoZ2V0SW50ZXJuYWxUYXJnZXRzRmlsdGVyKCkpOworCQl9CisJCQorCQkvLyBNdXN0IHJlZnJlc2ggYmVmb3JlIHVwZGF0aW5nIHNlbGVjdGlvbiBjb3VudCBiZWNhdXNlIHRoZSBzZWxlY3Rpb24KKwkJLy8gY291bnQncyAiaGlkZGVuIiByZXBvcnRpbmcgbmVlZHMgdGhlIGNvbnRlbnQgcHJvdmlkZXIgdG8gYmUgcXVlcmllZAorCQkvLyBmaXJzdCB0byBjb3VudCBob3cgbWFueSB0YXJnZXRzIGFyZSBoaWRkZW4uCisJCXVwZGF0ZVNlbGVjdGlvbkNvdW50KCk7CisJCWlmICghZkluaXRpYWxpemluZykgeworCQkgICAgdXBkYXRlTGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZygpOworCQl9CisJfQorCQorCXByaXZhdGUgVmlld2VyRmlsdGVyIGdldEludGVybmFsVGFyZ2V0c0ZpbHRlcigpIHsKKwkJaWYgKGZJbnRlcm5hbFRhcmdldEZpbHRlciA9PSBudWxsKSB7CisJCQlmSW50ZXJuYWxUYXJnZXRGaWx0ZXI9IG5ldyBJbnRlcm5hbFRhcmdldEZpbHRlcigpOworCQl9CisJCXJldHVybiBmSW50ZXJuYWxUYXJnZXRGaWx0ZXI7CisJfQorCQorCS8qKgorCSAqIFRoZSBidXR0b24gdG8gc29ydCB0YXJnZXRzIGhhcyBiZWVuIHRvZ2dsZWQuCisJICogU2V0IHRoZSB0YWIncyBzb3J0aW5nIGFzIGFwcHJvcHJpYXRlLgorCSAqLworCXByaXZhdGUgdm9pZCBoYW5kbGVTb3J0VGFyZ2V0c1NlbGVjdGVkKCkgeworCQlzZXRTb3J0KGZTb3J0QnV0dG9uLmdldFNlbGVjdGlvbigpID8gU09SVF9OQU1FIDogU09SVF9OT05FKTsKKwl9CisJCisJLyoqCisJICogU2V0cyB0aGUgc29ydGluZyBvZiB0YXJnZXRzIGluIHRoaXMgdGFiLiBTZWUgdGhlIHNvcnQgY29uc3RhbnRzIGRlZmluZWQKKwkgKiBhYm92ZS4KKwkgKiAKKwkgKiBAcGFyYW0gY29sdW1uIHRoZSBjb2x1bW4gd2hpY2ggc2hvdWxkIGJlIHNvcnRlZCBvbgorCSAqLworCXByaXZhdGUgdm9pZCBzZXRTb3J0KGludCBjb2x1bW4pIHsKKwkJZlNvcnREaXJlY3Rpb249IGNvbHVtbjsKKwkJZlRhYmxlVmlld2VyLnJlZnJlc2goKTsKKwkJaWYgKCFmSW5pdGlhbGl6aW5nKSB7CisJCQl1cGRhdGVMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGUgdGFyZ2V0IG9yZGVyIGJ1dHRvbiBoYXMgYmVlbiBwcmVzc2VkLiBQcm9tcHQgdGhlCisJICogdXNlciB0byByZW9yZGVyIHRoZSBzZWxlY3RlZCB0YXJnZXRzLiAKKwkgKi8KKwlwcml2YXRlIHZvaWQgaGFuZGxlT3JkZXJQcmVzc2VkKCkgeworCQlUYXJnZXRPcmRlckRpYWxvZyBkaWFsb2cgPSBuZXcgVGFyZ2V0T3JkZXJEaWFsb2coZ2V0U2hlbGwoKSwgZk9yZGVyZWRUYXJnZXRzLnRvQXJyYXkoKSk7CisJCWludCBvayA9IGRpYWxvZy5vcGVuKCk7CisJCWlmIChvayA9PSBXaW5kb3cuT0spIHsKKwkJCWZPcmRlcmVkVGFyZ2V0cy5jbGVhcigpOworCQkJT2JqZWN0W10gdGFyZ2V0cyA9IGRpYWxvZy5nZXRUYXJnZXRzKCk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHRhcmdldHMubGVuZ3RoOyBpKyspIHsKKwkJCQlmT3JkZXJlZFRhcmdldHMuYWRkKHRhcmdldHNbaV0pOworCQkJCXVwZGF0ZVNlbGVjdGlvbkNvdW50KCk7CisJCQkJdXBkYXRlTGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZygpOworCQkJfQorCQl9CisJfQorCQorCS8qKgorCSAqIENyZWF0ZXMgdGhlIHRhYmxlIHdoaWNoIGRpc3BsYXlzIHRoZSBhdmFpbGFibGUgdGFyZ2V0cworCSAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb21wb3NpdGUKKwkgKi8KKwlwcml2YXRlIHZvaWQgY3JlYXRlVGFyZ2V0c1RhYmxlKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJRm9udCBmb250PSBwYXJlbnQuZ2V0Rm9udCgpOworCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKKwkJbGFiZWwuc2V0Rm9udChmb250KTsKKwkJbGFiZWwuc2V0VGV4dChBbnRMYXVuY2hDb25maWd1cmF0aW9uTWVzc2FnZXMuQW50VGFyZ2V0c1RhYl9DaGVja190YXJnZXRzX3RvX2VfeGVjdXRlX18xKTsKKwkJCQkKKwkJZmluYWwgVGFibGUgdGFibGU9IG5ldyBUYWJsZShwYXJlbnQsIFNXVC5DSEVDSyB8IFNXVC5CT1JERVIgfCBTV1QuRlVMTF9TRUxFQ1RJT04gKTsKKwkJCisJCUdyaWREYXRhIGRhdGE9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOworCQlpbnQgYXZhaWxhYmxlUm93cz0gYXZhaWxhYmxlUm93cyhwYXJlbnQpOworCQlkYXRhLmhlaWdodEhpbnQgPSB0YWJsZS5nZXRJdGVtSGVpZ2h0KCkgKiAoYXZhaWxhYmxlUm93cyAvIDIwKTsKKwkJZGF0YS53aWR0aEhpbnQ9IDI1MDsKKwkJdGFibGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKKwkJdGFibGUuc2V0Rm9udChmb250KTsKKwkJCQkKKwkJdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKKwkJdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwkJCisKKwkJVGFibGVMYXlvdXQgdGFibGVMYXlvdXQ9IG5ldyBUYWJsZUxheW91dCgpOworCQlDb2x1bW5XZWlnaHREYXRhIHdlaWdodERhdGEgPSBuZXcgQ29sdW1uV2VpZ2h0RGF0YSgzMCwgdHJ1ZSk7CisJCXRhYmxlTGF5b3V0LmFkZENvbHVtbkRhdGEod2VpZ2h0RGF0YSk7CisJCXdlaWdodERhdGEgPSBuZXcgQ29sdW1uV2VpZ2h0RGF0YSg3MCwgdHJ1ZSk7CisJCXRhYmxlTGF5b3V0LmFkZENvbHVtbkRhdGEod2VpZ2h0RGF0YSk7CQkKKwkJdGFibGUuc2V0TGF5b3V0KHRhYmxlTGF5b3V0KTsKKworCQlmaW5hbCBUYWJsZUNvbHVtbiBjb2x1bW4xPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OVUxMKTsKKwkJY29sdW1uMS5zZXRUZXh0KEFudExhdW5jaENvbmZpZ3VyYXRpb25NZXNzYWdlcy5BbnRUYXJnZXRzVGFiX05hbWVfNSk7CisJCQkKKwkJZmluYWwgVGFibGVDb2x1bW4gY29sdW1uMj0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTlVMTCk7CisJCWNvbHVtbjIuc2V0VGV4dChBbnRMYXVuY2hDb25maWd1cmF0aW9uTWVzc2FnZXMuQW50VGFyZ2V0c1RhYl9EZXNjcmlwdGlvbl82KTsKKwkJCisKKwkJLy9UYWJsZUxheW91dCBvbmx5IHNpemVzIGNvbHVtbnMgb25jZS4gSWYgc2hvd2luZyB0aGUgdGFyZ2V0cworCQkvL3RhYiBhcyB0aGUgaW5pdGlhbCB0YWIsIHRoZSBkaWFsb2cgaXNuJ3Qgb3BlbiB3aGVuIHRoZSBsYXlvdXQKKwkJLy9vY2N1cnMgYW5kIHRoZSBjb2x1bW4gc2l6ZSBpc24ndCBjb21wdXRlZCBjb3JyZWN0bHkuIE5lZWQgdG8KKwkJLy9yZWNvbXB1dGUgdGhlIHNpemUgb2YgdGhlIGNvbHVtbnMgb25jZSBhbGwgdGhlIHBhcmVudCBjb250cm9scyAKKwkJLy9oYXZlIGJlZW4gY3JlYXRlZC9zaXplZC4KKwkJLy9IQUNLIEJ1ZyAxMzkxOTAgCisJCWdldFNoZWxsKCkuYWRkU2hlbGxMaXN0ZW5lcihuZXcgU2hlbGxBZGFwdGVyKCkgeworCQkJcHVibGljIHZvaWQgc2hlbGxBY3RpdmF0ZWQoU2hlbGxFdmVudCBlKSB7CisJCQkJaWYoIXRhYmxlLmlzRGlzcG9zZWQoKSkgeworCQkJCQlpbnQgdGFibGVXaWR0aCA9IHRhYmxlLmdldFNpemUoKS54OworCQkJCQlpZiAodGFibGVXaWR0aCA+IDApIHsKKwkJCQkJCWludCBjMSA9IHRhYmxlV2lkdGggLyAzOworCQkJCQkJY29sdW1uMS5zZXRXaWR0aChjMSk7CisJCQkJCQljb2x1bW4yLnNldFdpZHRoKHRhYmxlV2lkdGggLSBjMSk7CisJCQkJCX0KKwkJCQkJZ2V0U2hlbGwoKS5yZW1vdmVTaGVsbExpc3RlbmVyKHRoaXMpOworCQkJCX0KKwkJCX0KKwkJfSk7CisJCQorCQlmVGFibGVWaWV3ZXIgPSBuZXcgQ2hlY2tib3hUYWJsZVZpZXdlcih0YWJsZSk7CisJCWZUYWJsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBUYXJnZXRUYWJsZUxhYmVsUHJvdmlkZXIoKSk7CisJCWZUYWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFudE1vZGVsQ29udGVudFByb3ZpZGVyKCkpOworCQlmVGFibGVWaWV3ZXIuc2V0Q29tcGFyYXRvcihuZXcgQW50VGFyZ2V0c0NvbXBhcmF0b3IoKSk7CisJCQorCQlmVGFibGVWaWV3ZXIuYWRkRG91YmxlQ2xpY2tMaXN0ZW5lcihuZXcgSURvdWJsZUNsaWNrTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBkb3VibGVDbGljayhEb3VibGVDbGlja0V2ZW50IGV2ZW50KSB7CisJCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb249IGV2ZW50LmdldFNlbGVjdGlvbigpOworCQkJCWlmICghc2VsZWN0aW9uLmlzRW1wdHkoKSAmJiBzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgeworCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzcz0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbjsKKwkJCQkJT2JqZWN0IGVsZW1lbnQ9IHNzLmdldEZpcnN0RWxlbWVudCgpOworCQkJCQlib29sZWFuIGNoZWNrZWQ9ICFmVGFibGVWaWV3ZXIuZ2V0Q2hlY2tlZChlbGVtZW50KTsKKwkJCQkJZlRhYmxlVmlld2VyLnNldENoZWNrZWQoZWxlbWVudCwgY2hlY2tlZCk7CisJCQkJCXVwZGF0ZU9yZGVyZWRUYXJnZXRzKGVsZW1lbnQsIGNoZWNrZWQpOworCQkJCX0KKwkJCX0KKwkJfSk7CisJCQorCQlmVGFibGVWaWV3ZXIuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKG5ldyBJQ2hlY2tTdGF0ZUxpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgeworCQkJCXVwZGF0ZU9yZGVyZWRUYXJnZXRzKGV2ZW50LmdldEVsZW1lbnQoKSwgZXZlbnQuZ2V0Q2hlY2tlZCgpKTsKKwkJCX0KKwkJfSk7CisJCQorCQlUYWJsZUNvbHVtbltdIGNvbHVtbnM9IGZUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldENvbHVtbnMoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5zLmxlbmd0aDsgaSsrKSB7CisJCQlmaW5hbCBpbnQgaW5kZXg9IGk7CisJCQljb2x1bW5zW2luZGV4XS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJCWlmIChmU29ydEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgeworCQkJCQkJLy8gaW5kZXggMCA9PiBzb3J0X25hbWUgKDEpCisJCQkJCQkvLyBpbmRleCAxID0+IHNvcnRfZGVzY3JpcHRpb24gKDIpCisJCQkJCQlpbnQgY29sdW1uPSBpbmRleCArIDE7CisJCQkJCQlpZiAoY29sdW1uID09IGZTb3J0RGlyZWN0aW9uKSB7CisJCQkJCQkJY29sdW1uPSAtY29sdW1uOyAvLyBpbnZlcnQgdGhlIHNvcnQgd2hlbiB0aGUgc2FtZSBjb2x1bW4gaXMgc2VsZWN0ZWQgdHdpY2UgaW4gYSByb3cKKwkJCQkJCX0KKwkJCQkJCXNldFNvcnQoY29sdW1uKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0pOworCQl9CisJfQorCQorCS8qKgorCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHJvd3MgYXZhaWxhYmxlIGluIHRoZSBjdXJyZW50IGRpc3BsYXkgdXNpbmcgdGhlCisJICogY3VycmVudCBmb250LgorCSAqIEBwYXJhbSBwYXJlbnQgVGhlIENvbXBvc2l0ZSB3aG9zZSBGb250IHdpbGwgYmUgcXVlcmllZC4KKwkgKiBAcmV0dXJuIGludCBUaGUgcmVzdWx0IG9mIHRoZSBkaXNwbGF5IHNpemUgZGl2aWRlZCBieSB0aGUgZm9udCBzaXplLgorCSAqLworCXByaXZhdGUgaW50IGF2YWlsYWJsZVJvd3MoQ29tcG9zaXRlIHBhcmVudCkgeworCisJCWludCBmb250SGVpZ2h0ID0gKHBhcmVudC5nZXRGb250KCkuZ2V0Rm9udERhdGEoKSlbMF0uZ2V0SGVpZ2h0KCk7CisJCWludCBkaXNwbGF5SGVpZ2h0ID0gcGFyZW50LmdldERpc3BsYXkoKS5nZXRDbGllbnRBcmVhKCkuaGVpZ2h0OworCisJCXJldHVybiBkaXNwbGF5SGVpZ2h0IC8gZm9udEhlaWdodDsKKwl9CisJCisJLyoqCisJICogVXBkYXRlcyB0aGUgb3JkZXJlZCB0YXJnZXRzIGxpc3QgaW4gcmVzcG9uc2UgdG8gYW4gZWxlbWVudCBiZWluZyBjaGVja2VkCisJICogb3IgdW5jaGVja2VkLiBXaGVuIHRoZSBlbGVtZW50IGlzIGNoZWNrZWQsIGl0J3MgYWRkZWQgdG8gdGhlIGxpc3QuIFdoZW4KKwkgKiB1bmNoZWNrZWQsIGl0J3MgcmVtb3ZlZC4KKwkgKiAKKwkgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudCBpbiBxdWVzdGlvbgorCSAqIEBwYXJhbSBjaGVja2VkIHdoZXRoZXIgdGhlIGVsZW1lbnQgaGFzIGJlZW4gY2hlY2tlZCBvciB1bmNoZWNrZWQKKwkgKi8KKwlwcml2YXRlIHZvaWQgdXBkYXRlT3JkZXJlZFRhcmdldHMoT2JqZWN0IGVsZW1lbnQgLCBib29sZWFuIGNoZWNrZWQpIHsKKwkJaWYgKGNoZWNrZWQpIHsKKwkJCSBmT3JkZXJlZFRhcmdldHMuYWRkKGVsZW1lbnQpOworCQl9IGVsc2UgeworCQkJZk9yZGVyZWRUYXJnZXRzLnJlbW92ZShlbGVtZW50KTsKKwkJfQkgCisJCXVwZGF0ZVNlbGVjdGlvbkNvdW50KCk7CisJCXVwZGF0ZUxhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2coKTsJCisJfQorCQorCS8qKgorCSAqIFVwZGF0ZXMgdGhlIHNlbGVjdGlvbiBjb3VudCB3aWRnZXQgdG8gZGlzcGxheSBob3cgbWFueSB0YXJnZXRzIGFyZQorCSAqIHNlbGVjdGVkIChleGFtcGxlLCAiMSBvdXQgb2YgNiBzZWxlY3RlZCIpIGFuZCBmaWx0ZXJlZC4KKwkgKi8KKwlwcml2YXRlIHZvaWQgdXBkYXRlU2VsZWN0aW9uQ291bnQoKSB7CisJCU9iamVjdFtdIGNoZWNrZWQgPSBmVGFibGVWaWV3ZXIuZ2V0Q2hlY2tlZEVsZW1lbnRzKCk7CisJCVN0cmluZyBudW1TZWxlY3RlZCA9IEludGVnZXIudG9TdHJpbmcoY2hlY2tlZC5sZW5ndGgpOworCQorCQlpbnQgYWxsPSBmQWxsVGFyZ2V0cyA9PSBudWxsID8gMCA6IGZBbGxUYXJnZXRzLmxlbmd0aDsKKwkJaW50IHZpc2libGU9IGZUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldEl0ZW1Db3VudCgpOworCQlTdHJpbmcgdG90YWwgPSBJbnRlZ2VyLnRvU3RyaW5nKHZpc2libGUpOworCQlpbnQgbnVtSGlkZGVuPSBhbGwgLSB2aXNpYmxlOworCQlpZiAobnVtSGlkZGVuID4gMCkgeworCQkJZlNlbGVjdGlvbkNvdW50TGFiZWwuc2V0VGV4dChNZXNzYWdlRm9ybWF0LmZvcm1hdChBbnRMYXVuY2hDb25maWd1cmF0aW9uTWVzc2FnZXMuQW50VGFyZ2V0c1RhYl8xMywgbmV3IFN0cmluZ1tde251bVNlbGVjdGVkLCBTdHJpbmcudmFsdWVPZihhbGwpLCBTdHJpbmcudmFsdWVPZihudW1IaWRkZW4pfSkpOworCQl9IGVsc2UgeworCQkJZlNlbGVjdGlvbkNvdW50TGFiZWwuc2V0VGV4dChNZXNzYWdlRm9ybWF0LmZvcm1hdChBbnRMYXVuY2hDb25maWd1cmF0aW9uTWVzc2FnZXMuQW50VGFyZ2V0c1RhYl9fMF9fb3V0X29mX18xX19zZWxlY3RlZF83LCBuZXcgU3RyaW5nW117bnVtU2VsZWN0ZWQsIHRvdGFsfSkpOworCQl9CisJCQorCQlmT3JkZXJCdXR0b24uc2V0RW5hYmxlZChjaGVja2VkLmxlbmd0aCA+IDEpOworCQkKKwkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJSXRlcmF0b3IgaXRlciA9IGZPcmRlcmVkVGFyZ2V0cy5pdGVyYXRvcigpOworCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKwkJCWJ1ZmZlci5hcHBlbmQoKChBbnRUYXJnZXROb2RlKWl0ZXIubmV4dCgpKS5nZXRUYXJnZXROYW1lKCkpOworCQkJYnVmZmVyLmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCWlmIChidWZmZXIubGVuZ3RoKCkgPiAyKSB7CisJCQkvLyByZW1vdmUgdHJhaWxpbmcgY29tbWEKKwkJCWJ1ZmZlci5zZXRMZW5ndGgoYnVmZmVyLmxlbmd0aCgpIC0gMik7CisJCX0KKwkJZlRhcmdldE9yZGVyVGV4dC5zZXRUZXh0KGJ1ZmZlci50b1N0cmluZygpKTsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyBhbGwgdGFyZ2V0cyBpbiB0aGUgYnVpbGRmaWxlLgorCSAqIEByZXR1cm4gYWxsIHRhcmdldHMgaW4gdGhlIGJ1aWxkZmlsZQorCSAqLworCXByaXZhdGUgQW50VGFyZ2V0Tm9kZVtdIGdldFRhcmdldHMoKSB7CisJCWlmIChmQWxsVGFyZ2V0cyA9PSBudWxsIHx8IGlzRGlydHkoKSkgeworCQkJZkFsbFRhcmdldHM9IG51bGw7CisJCQlmRGVmYXVsdFRhcmdldD0gbnVsbDsKKwkJCXNldERpcnR5KGZhbHNlKTsKKwkJCXNldEVycm9yTWVzc2FnZShudWxsKTsKKwkJCXNldE1lc3NhZ2UobnVsbCk7CisJCQkKKwkJCWZpbmFsIFN0cmluZyBleHBhbmRlZExvY2F0aW9uPSB2YWxpZGF0ZUxvY2F0aW9uKCk7CisJCQlpZiAoZXhwYW5kZWRMb2NhdGlvbiA9PSBudWxsKSB7CisJCQkJcmV0dXJuIGZBbGxUYXJnZXRzOworCQkJfQorCQkJZmluYWwgQ29yZUV4Y2VwdGlvbltdIGV4Y2VwdGlvbnM9IG5ldyBDb3JlRXhjZXB0aW9uWzFdOworCQkJdHJ5IHsKKwkJCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3Mgb3BlcmF0aW9uPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgeworCQkJCQkvKiAobm9uLUphdmFkb2MpCisJCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzcyNydW4ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCisJCQkJCSAqLworCQkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJCQkJCQl0cnkgeworCQkJCQkJCWZBbGxUYXJnZXRzID0gQW50VXRpbC5nZXRUYXJnZXRzKGV4cGFuZGVkTG9jYXRpb24sIGZMYXVuY2hDb25maWd1cmF0aW9uKTsKKwkJCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKKwkJCQkJCQlleGNlcHRpb25zWzBdPSBjZTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX07CisJCQkJCisJCQkJSVJ1bm5hYmxlQ29udGV4dCBjb250ZXh0PSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOworCQkJCWlmIChjb250ZXh0ID09IG51bGwpIHsKKwkJCQkgICAgY29udGV4dD0gZ2V0TGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZygpOworCQkJCX0KKworCQkJCUlTY2hlZHVsaW5nUnVsZSBydWxlPSBudWxsOworCQkJCWlmICghUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmlzVHJlZUxvY2tlZCgpKSB7CisJCQkJCS8vb25seSBzZXQgYSBzY2hlZHVsaW5nIHJ1bGUgaWYgbm90IGluIGEgcmVzb3VyY2UgY2hhbmdlIGNhbGxiYWNrCisJCQkJCXJ1bGU9IEFudFV0aWwuZ2V0RmlsZUZvckxvY2F0aW9uKGV4cGFuZGVkTG9jYXRpb24sIG51bGwpOworCQkJCX0KKwkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFByb2dyZXNzU2VydmljZSgpLnJ1bkluVUkoY29udGV4dCwgb3BlcmF0aW9uLCBydWxlKTsKKwkJCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgeworCQkJICAgIEFudFVJUGx1Z2luLmxvZygiSW50ZXJuYWwgZXJyb3Igb2NjdXJyZWQgcmV0cmlldmluZyB0YXJnZXRzIiwgZS5nZXRUYXJnZXRFeGNlcHRpb24oKSk7IC8vJE5PTi1OTFMtMSQKKwkJCSAgICBzZXRFcnJvck1lc3NhZ2UoQW50TGF1bmNoQ29uZmlndXJhdGlvbk1lc3NhZ2VzLkFudFRhcmdldHNUYWJfMSk7CisJCQkgICAgZkFsbFRhcmdldHM9IG51bGw7CisJCQkgICAgcmV0dXJuIG51bGw7CisJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisJCQkgICAgQW50VUlQbHVnaW4ubG9nKCJJbnRlcm5hbCBlcnJvciBvY2N1cnJlZCByZXRyaWV2aW5nIHRhcmdldHMiLCBlKTsgLy8kTk9OLU5MUy0xJAorCQkJICAgIHNldEVycm9yTWVzc2FnZShBbnRMYXVuY2hDb25maWd1cmF0aW9uTWVzc2FnZXMuQW50VGFyZ2V0c1RhYl8xKTsKKwkJCSAgICBmQWxsVGFyZ2V0cz0gbnVsbDsKKwkJCSAgICByZXR1cm4gbnVsbDsKKwkJCX0KKwkJCQorCQkJaWYgKGV4Y2VwdGlvbnNbMF0gIT0gbnVsbCkgeworCQkJCUlTdGF0dXMgZXhjZXB0aW9uU3RhdHVzPSBleGNlcHRpb25zWzBdLmdldFN0YXR1cygpOworCQkJCUlTdGF0dXNbXSBjaGlsZHJlbj0gZXhjZXB0aW9uU3RhdHVzLmdldENoaWxkcmVuKCk7CisJCQkJU3RyaW5nQnVmZmVyIG1lc3NhZ2U9IG5ldyBTdHJpbmdCdWZmZXIoZXhjZXB0aW9uc1swXS5nZXRNZXNzYWdlKCkpOworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKKwkJCQkJbWVzc2FnZS5hcHBlbmQoJyAnKTsKKwkJCQkJSVN0YXR1cyBjaGlsZFN0YXR1cyA9IGNoaWxkcmVuW2ldOworCQkJCQltZXNzYWdlLmFwcGVuZChjaGlsZFN0YXR1cy5nZXRNZXNzYWdlKCkpOworCQkJCX0KKwkJCQlzZXRFcnJvck1lc3NhZ2UobWVzc2FnZS50b1N0cmluZygpKTsKKwkJCQlmQWxsVGFyZ2V0cz0gbnVsbDsKKwkJCQlyZXR1cm4gZkFsbFRhcmdldHM7CisJCQl9CisJCQkKKwkJCWlmIChmQWxsVGFyZ2V0cyA9PSBudWxsKSB7CisJCQkgICAgLy9pZiBhbiBlcnJvciB3YXMgbm90IHRocm93biBkdXJpbmcgcGFyc2luZyB0aGVuIGhhdmluZyBubyB0YXJnZXRzIGlzIHZhbGlkIChBbnQgMS42LiopCisJCQkgICAgcmV0dXJuIGZBbGxUYXJnZXRzOworCQkJfQorCQkJCisJCQlBbnRUYXJnZXROb2RlIHRhcmdldD0gZkFsbFRhcmdldHNbMF07CisJCQlBbnRQcm9qZWN0Tm9kZSBwcm9qZWN0Tm9kZT0gdGFyZ2V0LmdldFByb2plY3ROb2RlKCk7CisJCQlzZXRFcnJvck1lc3NhZ2VGcm9tTm9kZShwcm9qZWN0Tm9kZSk7CisJCQlmb3IgKGludCBpPTA7IGkgPCBmQWxsVGFyZ2V0cy5sZW5ndGg7IGkrKykgeworCQkJICAgIHRhcmdldD0gZkFsbFRhcmdldHNbaV07CisJCQkJaWYgKHRhcmdldC5pc0RlZmF1bHRUYXJnZXQoKSkgeworCQkJCQlmRGVmYXVsdFRhcmdldD0gdGFyZ2V0OworCQkJCX0KKwkJCQlzZXRFcnJvck1lc3NhZ2VGcm9tTm9kZSh0YXJnZXQpOworCQkJfQorCQl9CisJCQorCQlyZXR1cm4gZkFsbFRhcmdldHM7CisJfQorCQorCXByaXZhdGUgdm9pZCBzZXRFcnJvck1lc3NhZ2VGcm9tTm9kZShBbnRFbGVtZW50Tm9kZSBub2RlKSB7CisJCWlmIChnZXRFcnJvck1lc3NhZ2UoKSAhPSBudWxsKSB7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKG5vZGUuaXNFcnJvck5vZGUoKSB8fCBub2RlLmlzV2FybmluZ05vZGUoKSkgeworCQkJU3RyaW5nIG1lc3NhZ2U9IG5vZGUuZ2V0UHJvYmxlbU1lc3NhZ2UoKTsKKwkJICAgIGlmIChtZXNzYWdlICE9IG51bGwpIHsKKwkJICAgICAgICBzZXRFcnJvck1lc3NhZ2UobWVzc2FnZSk7CisJCSAgICB9IGVsc2UgeworCQkgICAgICAgIHNldEVycm9yTWVzc2FnZShBbnRMYXVuY2hDb25maWd1cmF0aW9uTWVzc2FnZXMuQW50VGFyZ2V0c1RhYl8wKTsKKwkJICAgIH0KKwkJfQorCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLklMYXVuY2hDb25maWd1cmF0aW9uVGFiI3NldERlZmF1bHRzKG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSkKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXREZWZhdWx0cyhJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZ3VyYXRpb24pIHsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JTGF1bmNoQ29uZmlndXJhdGlvblRhYiNpbml0aWFsaXplRnJvbShvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uKQorCSAqLworCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKKwkJZkluaXRpYWxpemluZz0gdHJ1ZTsKKwkJZkxhdW5jaENvbmZpZ3VyYXRpb249IGNvbmZpZ3VyYXRpb247CisJCWZPcmRlcmVkVGFyZ2V0cyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOworCQlzZXRNZXNzYWdlKG51bGwpOworCQlzZXREaXJ0eSh0cnVlKTsKKwkJYm9vbGVhbiBoaWRlSW50ZXJuYWw9IGZhbHNlOworCQl0cnkgeworCQkJaGlkZUludGVybmFsID0gZkxhdW5jaENvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKElBbnRMYXVuY2hDb25zdGFudHMuQVRUUl9ISURFX0lOVEVSTkFMX1RBUkdFVFMsIGZhbHNlKTsKKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQlBbnRVSVBsdWdpbi5sb2coZSk7CisJCX0KKwkJZkZpbHRlckludGVybmFsVGFyZ2V0cy5zZXRTZWxlY3Rpb24oaGlkZUludGVybmFsKTsKKwkJaGFuZGxlRmlsdGVyVGFyZ2V0c1NlbGVjdGVkKCk7CisJCWludCBzb3J0PSBTT1JUX05PTkU7CisJCXRyeSB7CisJCQlzb3J0ID0gZkxhdW5jaENvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKElBbnRMYXVuY2hDb25zdGFudHMuQVRUUl9TT1JUX1RBUkdFVFMsIHNvcnQpOworCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCUFudFVJUGx1Z2luLmxvZyhlKTsKKwkJfQorCQlmU29ydEJ1dHRvbi5zZXRTZWxlY3Rpb24oc29ydCAhPSBTT1JUX05PTkUpOworCQlzZXRTb3J0KHNvcnQpOworCQlTdHJpbmcgY29uZmlnVGFyZ2V0cz0gbnVsbDsKKwkJU3RyaW5nIG5ld0xvY2F0aW9uPSBudWxsOworCQkKKwkJdHJ5IHsKKwkJCWNvbmZpZ1RhcmdldHM9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKElBbnRMYXVuY2hDb25zdGFudHMuQVRUUl9BTlRfVEFSR0VUUywgKFN0cmluZyludWxsKTsKKwkJCW5ld0xvY2F0aW9uPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShJRXh0ZXJuYWxUb29sQ29uc3RhbnRzLkFUVFJfTE9DQVRJT04sIChTdHJpbmcpbnVsbCk7CisJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKKwkJCUFudFVJUGx1Z2luLmxvZyhBbnRMYXVuY2hDb25maWd1cmF0aW9uTWVzc2FnZXMuQW50VGFyZ2V0c1RhYl9FcnJvcl9yZWFkaW5nX2NvbmZpZ3VyYXRpb25fMTIsIGNlKTsKKwkJfQorCQkKKwkJaWYgKG5ld0xvY2F0aW9uID09IG51bGwpIHsKKwkJCWZBbGxUYXJnZXRzPSBudWxsOworCQkJaW5pdGlhbGl6ZUZvck5vVGFyZ2V0cygpOworCQkJcmV0dXJuOyAKKwkJfQorCQkKKwkJQW50VGFyZ2V0Tm9kZVtdIGFsbFRhcmdldE5vZGVzPSBnZXRUYXJnZXRzKCk7CisJCWlmIChhbGxUYXJnZXROb2RlcyA9PSBudWxsKSB7CisJCQlpbml0aWFsaXplRm9yTm9UYXJnZXRzKCk7CisJCQlyZXR1cm47IAorCQl9CisJCQorCQlTdHJpbmdbXSB0YXJnZXROYW1lcz0gQW50VXRpbC5wYXJzZVJ1blRhcmdldHMoY29uZmlnVGFyZ2V0cyk7CisJCWlmICh0YXJnZXROYW1lcy5sZW5ndGggPT0gMCkgeworCQkJZlRhYmxlVmlld2VyLnNldEFsbENoZWNrZWQoZmFsc2UpOworCQkJc2V0RXhlY3V0ZUlucHV0KGFsbFRhcmdldE5vZGVzKTsKKwkJCWlmIChmRGVmYXVsdFRhcmdldCAhPSBudWxsKSB7CisJCQkJZk9yZGVyZWRUYXJnZXRzLmFkZChmRGVmYXVsdFRhcmdldCk7CisJCQkJZlRhYmxlVmlld2VyLnNldENoZWNrZWQoZkRlZmF1bHRUYXJnZXQsIHRydWUpOworCQkJCXVwZGF0ZVNlbGVjdGlvbkNvdW50KCk7CisJCQkJdXBkYXRlTGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZygpOworCQkJfQorCQkJZkluaXRpYWxpemluZz0gZmFsc2U7CisJCQlyZXR1cm47CisJCX0KKwkJCisJCXNldEV4ZWN1dGVJbnB1dChhbGxUYXJnZXROb2Rlcyk7CisJCWZUYWJsZVZpZXdlci5zZXRBbGxDaGVja2VkKGZhbHNlKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCB0YXJnZXROYW1lcy5sZW5ndGg7IGkrKykgeworCQkJZm9yIChpbnQgaiA9IDA7IGogPCBmQWxsVGFyZ2V0cy5sZW5ndGg7IGorKykgeworCQkJCWlmICh0YXJnZXROYW1lc1tpXS5lcXVhbHMoZkFsbFRhcmdldHNbal0uZ2V0VGFyZ2V0TmFtZSgpKSkgeworCQkJCQlmT3JkZXJlZFRhcmdldHMuYWRkKGZBbGxUYXJnZXRzW2pdKTsKKwkJCQkJZlRhYmxlVmlld2VyLnNldENoZWNrZWQoZkFsbFRhcmdldHNbal0sIHRydWUpOworCQkJCX0KKwkJCX0KKwkJfQorCQl1cGRhdGVTZWxlY3Rpb25Db3VudCgpOworCQlmSW5pdGlhbGl6aW5nPSBmYWxzZTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVGb3JOb1RhcmdldHMoKSB7CisJCXNldEV4ZWN1dGVJbnB1dChuZXcgQW50VGFyZ2V0Tm9kZVswXSk7CisJCWZUYWJsZVZpZXdlci5zZXRJbnB1dChuZXcgQW50VGFyZ2V0Tm9kZVswXSk7CisJCWZJbml0aWFsaXppbmc9IGZhbHNlOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIGV4ZWN1dGUgdGFibGUncyBpbnB1dCB0byB0aGUgZ2l2ZW4gaW5wdXQuCisJICovCisJcHJpdmF0ZSB2b2lkIHNldEV4ZWN1dGVJbnB1dChPYmplY3QgaW5wdXQpIHsKKwkJZlRhYmxlVmlld2VyLnNldElucHV0KGlucHV0KTsKKwkJdXBkYXRlU2VsZWN0aW9uQ291bnQoKTsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JTGF1bmNoQ29uZmlndXJhdGlvblRhYiNwZXJmb3JtQXBwbHkob3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5KQorCSAqLworCXB1YmxpYyB2b2lkIHBlcmZvcm1BcHBseShJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZ3VyYXRpb24pIHsKKwkJLy8JYXR0cmlidXRlIGFkZGVkIGluIDMuMCwgc28gbnVsbCBtdXN0IGJlIHVzZWQgaW5zdGVhZCBvZiBmYWxzZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKKwkJaWYgKGZGaWx0ZXJJbnRlcm5hbFRhcmdldHMuZ2V0U2VsZWN0aW9uKCkpIHsKKwkJCWNvbmZpZ3VyYXRpb24uc2V0QXR0cmlidXRlKElBbnRMYXVuY2hDb25zdGFudHMuQVRUUl9ISURFX0lOVEVSTkFMX1RBUkdFVFMsIHRydWUpOworCQl9IGVsc2UgeworCQkJY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoSUFudExhdW5jaENvbnN0YW50cy5BVFRSX0hJREVfSU5URVJOQUxfVEFSR0VUUywgKFN0cmluZyludWxsKTsKKwkJfQorCQkvL2F0dHJpYnV0ZSBhZGRlZCBpbiAzLjAsIHNvIG51bGwgbXVzdCBiZSB1c2VkIGluc3RlYWQgb2YgMCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKKwkJaWYgKGZTb3J0RGlyZWN0aW9uICE9IFNPUlRfTk9ORSkgeworCQkJY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoSUFudExhdW5jaENvbnN0YW50cy5BVFRSX1NPUlRfVEFSR0VUUywgZlNvcnREaXJlY3Rpb24pOworCQl9IGVsc2UgeworCQkJY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoSUFudExhdW5jaENvbnN0YW50cy5BVFRSX1NPUlRfVEFSR0VUUywgKFN0cmluZyludWxsKTsKKwkJfQorCQkKKwkJaWYgKGZPcmRlcmVkVGFyZ2V0cy5zaXplKCkgPT0gMSkgeworCQkJQW50VGFyZ2V0Tm9kZSBpdGVtID0gKEFudFRhcmdldE5vZGUpZk9yZGVyZWRUYXJnZXRzLmdldCgwKTsKKwkJCWlmIChpdGVtLmlzRGVmYXVsdFRhcmdldCgpKSB7CisJCQkJY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoSUFudExhdW5jaENvbnN0YW50cy5BVFRSX0FOVF9UQVJHRVRTLCAoU3RyaW5nKW51bGwpOworCQkJCXJldHVybjsKKwkJCX0KKwkJfSBlbHNlIGlmIChmT3JkZXJlZFRhcmdldHMuc2l6ZSgpID09IDApIHsKKwkJCWNvbmZpZ3VyYXRpb24uc2V0QXR0cmlidXRlKElBbnRMYXVuY2hDb25zdGFudHMuQVRUUl9BTlRfVEFSR0VUUywgKFN0cmluZyludWxsKTsKKwkJCXJldHVybjsKKwkJfQorCQkKKwkJU3RyaW5nQnVmZmVyIGJ1ZmY9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJSXRlcmF0b3IgaXRlciA9IGZPcmRlcmVkVGFyZ2V0cy5pdGVyYXRvcigpOworCQlTdHJpbmcgdGFyZ2V0cyA9IG51bGw7CisJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgeworCQkJQW50VGFyZ2V0Tm9kZSBpdGVtID0gKEFudFRhcmdldE5vZGUpaXRlci5uZXh0KCk7CisJCQlidWZmLmFwcGVuZChpdGVtLmdldFRhcmdldE5hbWUoKSk7CisJCQlidWZmLmFwcGVuZCgnLCcpOworCQl9CisJCWlmIChidWZmLmxlbmd0aCgpID4gMCkgeworCQkJdGFyZ2V0cz0gYnVmZi50b1N0cmluZygpOworCQl9ICAKKworCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShJQW50TGF1bmNoQ29uc3RhbnRzLkFUVFJfQU5UX1RBUkdFVFMsIHRhcmdldHMpOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLklMYXVuY2hDb25maWd1cmF0aW9uVGFiI2dldE5hbWUoKQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIEFudExhdW5jaENvbmZpZ3VyYXRpb25NZXNzYWdlcy5BbnRUYXJnZXRzVGFiX1Rhcl9nZXRzXzE0OworCX0KKwkJCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuSUxhdW5jaENvbmZpZ3VyYXRpb25UYWIjZ2V0SW1hZ2UoKQorCSAqLworCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKKwkJcmV0dXJuIEFudFVJSW1hZ2VzLmdldEltYWdlKElBbnRVSUNvbnN0YW50cy5JTUdfVEFCX0FOVF9UQVJHRVRTKTsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JTGF1bmNoQ29uZmlndXJhdGlvblRhYiNpc1ZhbGlkKG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb24pCisJICovCisJcHVibGljIGJvb2xlYW4gaXNWYWxpZChJTGF1bmNoQ29uZmlndXJhdGlvbiBsYXVuY2hDb25maWcpIHsKKwkJaWYgKGZBbGxUYXJnZXRzID09IG51bGwgfHwgaXNEaXJ0eSgpKSB7CisJCQlpZiAoZ2V0RXJyb3JNZXNzYWdlKCkgIT0gbnVsbCAmJiAhaXNEaXJ0eSgpKSB7CisJCQkJLy9lcnJvciBpbiBwYXJzaW5nOworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0gCisJCQkvL3RhcmdldHMgbm90IHVwIHRvIGRhdGUgYW5kIG5vIGVycm9yIG1lc3NhZ2UuLi53ZSBoYXZlIG5vdCBwYXJzZWQgcmVjZW50bHkKKwkJCWluaXRpYWxpemVGcm9tKGxhdW5jaENvbmZpZyk7CisJCQlpZiAoZ2V0RXJyb3JNZXNzYWdlKCkgIT0gbnVsbCkgeworCQkJCS8vZXJyb3IgaW4gcGFyc2luZzsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCX0KKwkJCisJCXNldEVycm9yTWVzc2FnZShudWxsKTsKKwkJcmV0dXJuIHN1cGVyLmlzVmFsaWQobGF1bmNoQ29uZmlnKTsKKwl9CisJCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuQWJzdHJhY3RMYXVuY2hDb25maWd1cmF0aW9uVGFiI3NldERpcnR5KGJvb2xlYW4pCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2V0RGlydHkoYm9vbGVhbiBkaXJ0eSkgeworCQkvL3Byb3ZpZGUgcGFja2FnZSB2aXNpYmlsaXR5CisJCXN1cGVyLnNldERpcnR5KGRpcnR5KTsKKwl9CisJCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuSUxhdW5jaENvbmZpZ3VyYXRpb25UYWIjYWN0aXZhdGVkKG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSkKKwkgKi8KKwlwdWJsaWMgdm9pZCBhY3RpdmF0ZWQoSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSB3b3JraW5nQ29weSkgeworCQlpZiAoaXNEaXJ0eSgpKSB7CisJCQlzdXBlci5hY3RpdmF0ZWQod29ya2luZ0NvcHkpOworCQl9CisJfQorCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLklMYXVuY2hDb25maWd1cmF0aW9uVGFiI2RlYWN0aXZhdGVkKG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSkKKwkgKi8KKwlwdWJsaWMgdm9pZCBkZWFjdGl2YXRlZChJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IHdvcmtpbmdDb3B5KSB7CisJCWlmIChmT3JkZXJlZFRhcmdldHMuc2l6ZSgpID09IDApIHsKKwkJCS8vc2V0IHRoZSBkaXJ0eSBmbGFnIHNvIHRoYXQgdGhlIHN0YXRlIHdpbGwgYmUgcmVpbml0aWFsaXplZCBvbiBhY3RpdmF0aW9uCisJCQlzZXREaXJ0eSh0cnVlKTsKKwkJfQorCX0KKwkKKwlwcml2YXRlIFN0cmluZyB2YWxpZGF0ZUxvY2F0aW9uKCkgeworCQlTdHJpbmcgZXhwYW5kZWRMb2NhdGlvbj0gbnVsbDsKKwkJU3RyaW5nIGxvY2F0aW9uPSBudWxsOworCQlJU3RyaW5nVmFyaWFibGVNYW5hZ2VyIG1hbmFnZXIgPSBWYXJpYWJsZXNQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFN0cmluZ1ZhcmlhYmxlTWFuYWdlcigpOworCQl0cnkgeworCQkJbG9jYXRpb249IGZMYXVuY2hDb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShJRXh0ZXJuYWxUb29sQ29uc3RhbnRzLkFUVFJfTE9DQVRJT04sIChTdHJpbmcpbnVsbCk7CisJCQlpZiAobG9jYXRpb24gPT0gbnVsbCkgeworCQkJCXJldHVybiBudWxsOworCQkJfQorCQkJCisJCQlleHBhbmRlZExvY2F0aW9uPSBtYW5hZ2VyLnBlcmZvcm1TdHJpbmdTdWJzdGl0dXRpb24obG9jYXRpb24pOworCQkJaWYgKGV4cGFuZGVkTG9jYXRpb24gPT0gbnVsbCkgeworCQkJCXJldHVybiBudWxsOworCQkJfQorCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZXhwYW5kZWRMb2NhdGlvbik7CisJCQlpZiAoIWZpbGUuZXhpc3RzKCkpIHsKKwkJCQlzZXRFcnJvck1lc3NhZ2UoQW50TGF1bmNoQ29uZmlndXJhdGlvbk1lc3NhZ2VzLkFudFRhcmdldHNUYWJfMTUpOworCQkJCXJldHVybiBudWxsOworCQkJfQorCQkJaWYgKCFmaWxlLmlzRmlsZSgpKSB7CisJCQkJc2V0RXJyb3JNZXNzYWdlKEFudExhdW5jaENvbmZpZ3VyYXRpb25NZXNzYWdlcy5BbnRUYXJnZXRzVGFiXzE2KTsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJCQorCQkJcmV0dXJuIGV4cGFuZGVkTG9jYXRpb247CisJCQkKKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlMSkgeworCQkJaWYgKGxvY2F0aW9uICE9IG51bGwpIHsKKwkJCQl0cnkgeworCQkJCQltYW5hZ2VyLnZhbGlkYXRlU3RyaW5nVmFyaWFibGVzKGxvY2F0aW9uKTsKKwkJCQkJc2V0TWVzc2FnZShBbnRMYXVuY2hDb25maWd1cmF0aW9uTWVzc2FnZXMuQW50VGFyZ2V0c1RhYl8xNyk7CisJCQkJCXJldHVybiBudWxsOworCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZTIpIHsvL2ludmFsaWQgdmFyaWFibGUKKwkJCQkJc2V0RXJyb3JNZXNzYWdlKGUyLmdldFN0YXR1cygpLmdldE1lc3NhZ2UoKSk7CisJCQkJCXJldHVybiBudWxsOworCQkJCX0KKwkJCX0KKwkJCQorCQkJc2V0RXJyb3JNZXNzYWdlKGUxLmdldFN0YXR1cygpLmdldE1lc3NhZ2UoKSk7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCX0KKwkKKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc1RhcmdldFNlbGVjdGVkKCkgeworCQlyZXR1cm4gIWZPcmRlcmVkVGFyZ2V0cy5pc0VtcHR5KCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvbGF1bmNoQ29uZmlndXJhdGlvbnMvQW50V29ya2luZ0RpcmVjdG9yeUJsb2NrLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9sYXVuY2hDb25maWd1cmF0aW9ucy9BbnRXb3JraW5nRGlyZWN0b3J5QmxvY2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDczYjkxCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvbGF1bmNoQ29uZmlndXJhdGlvbnMvQW50V29ya2luZ0RpcmVjdG9yeUJsb2NrLmphdmEKQEAgLTAsMCArMSw3MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogICAgIFJlbXkgQ2hpIEppYW4gU3VlbiA8cmVteS5zdWVuQGdtYWlsLmNvbT4gLSBCdWcgMjE0Njk2IEV4cG9zZSBXb3JraW5nRGlyZWN0b3J5QmxvY2sgYXMgQVBJCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmxhdW5jaENvbmZpZ3VyYXRpb25zOworCitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLkFudFVJUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLkphdmFXb3JraW5nRGlyZWN0b3J5QmxvY2s7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5pbnRlcm5hbC5sYXVuY2hDb25maWd1cmF0aW9ucy5FeHRlcm5hbFRvb2xzVXRpbDsKKworaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuTWVzc2FnZUZvcm1hdDsKKworCitwdWJsaWMgY2xhc3MgQW50V29ya2luZ0RpcmVjdG9yeUJsb2NrIGV4dGVuZHMgSmF2YVdvcmtpbmdEaXJlY3RvcnlCbG9jayB7CisJCisJcHJpdmF0ZSBTdHJpbmcgZkRlZmF1bHRXb3JraW5nRGlyUGF0aDsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIGRlZmF1bHQgd29ya2luZyBkaXJlY3RvcnkgcGF0aAorCSAqIEByZXR1cm4gdGhlIGRlZmF1bHQgd29ya2luZyBkaXJlY3RvcnkgcGF0aAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFdvcmtpbmdEaXJQYXRoKCkgeworCQlyZXR1cm4gZkRlZmF1bHRXb3JraW5nRGlyUGF0aDsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuV29ya2luZ0RpcmVjdG9yeUJsb2NrI3NldERlZmF1bHRXb3JraW5nRGlyKCkKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0V29ya2luZ0RpcigpIHsKKwkJaWYgKGZEZWZhdWx0V29ya2luZ0RpclBhdGggPT0gbnVsbCkgeworCQkJc3VwZXIuc2V0RGVmYXVsdFdvcmtpbmdEaXIoKTsKKwkJCXJldHVybjsKKwkJfQorCQlzZXREZWZhdWx0V29ya2luZ0RpcmVjdG9yeVRleHQoZkRlZmF1bHRXb3JraW5nRGlyUGF0aCk7CisJfQorCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLklMYXVuY2hDb25maWd1cmF0aW9uVGFiI2luaXRpYWxpemVGcm9tKG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb24pCisJICovCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb20oSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgeworCQlzZXRMYXVuY2hDb25maWd1cmF0aW9uKGNvbmZpZ3VyYXRpb24pOworCQl0cnkgeworCQkJdHJ5IHsKKwkJCQlmRGVmYXVsdFdvcmtpbmdEaXJQYXRoPSBFeHRlcm5hbFRvb2xzVXRpbC5nZXRMb2NhdGlvbihjb25maWd1cmF0aW9uKS5yZW1vdmVMYXN0U2VnbWVudHMoMSkudG9PU1N0cmluZygpOworCQkJfQorCQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBjZSl7fQorCQkJU3RyaW5nIHdkID0gY29uZmlndXJhdGlvbi5nZXRBdHRyaWJ1dGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfV09SS0lOR19ESVJFQ1RPUlksIChTdHJpbmcpbnVsbCk7CisJCQlzZXREZWZhdWx0V29ya2luZ0RpcigpOworCQkJaWYgKHdkICE9IG51bGwgfHwgIWlzU2FtZUFzRGVmYXVsdCh3ZCkpIHsKKwkJCQlzZXRPdGhlcldvcmtpbmdEaXJlY3RvcnlUZXh0KHdkKTsKKwkJCX0KKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQlzZXRFcnJvck1lc3NhZ2UoTWVzc2FnZUZvcm1hdC5mb3JtYXQoQW50TGF1bmNoQ29uZmlndXJhdGlvbk1lc3NhZ2VzLkFudFdvcmtpbmdEaXJlY3RvcnlCbG9ja18wLCBuZXcgU3RyaW5nW10ge2UuZ2V0U3RhdHVzKCkuZ2V0TWVzc2FnZSgpfSkpOworCQkJQW50VUlQbHVnaW4ubG9nKGUpOworCQl9CisJfQorCQorCXByaXZhdGUgYm9vbGVhbiBpc1NhbWVBc0RlZmF1bHQoU3RyaW5nIHdvcmtpbmdEaXIpIHsKKwkJcmV0dXJuIHdvcmtpbmdEaXIgPT0gbnVsbCB8fCAod29ya2luZ0Rpci5lcXVhbHMoZkRlZmF1bHRXb3JraW5nRGlyUGF0aCkgfHwgd29ya2luZ0Rpci5lcXVhbHMoU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpKSk7IC8vJE5PTi1OTFMtMSQKKwl9Cit9CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9sYXVuY2hDb25maWd1cmF0aW9ucy9FZGl0QW50SG9tZUVudHJ5QWN0aW9uLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9sYXVuY2hDb25maWd1cmF0aW9ucy9FZGl0QW50SG9tZUVudHJ5QWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI4NjczZAotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2xhdW5jaENvbmZpZ3VyYXRpb25zL0VkaXRBbnRIb21lRW50cnlBY3Rpb24uamF2YQpAQCAtMCwwICsxLDk1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5sYXVuY2hDb25maWd1cmF0aW9uczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5jb3JlLkFudENvcmVQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmNvcmUuQW50Q29yZVByZWZlcmVuY2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5sYXVuY2hpbmcubGF1bmNoQ29uZmlndXJhdGlvbnMuQW50SG9tZUNsYXNzcGF0aEVudHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5BbnRVSVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuSUFudFVJQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5BbnRQcmVmZXJlbmNlc01lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkuYWN0aW9ucy5SdW50aW1lQ2xhc3NwYXRoQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5jbGFzc3BhdGguQ2xhc3NwYXRoRW50cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLklDbGFzc3BhdGhWaWV3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JUnVudGltZUNsYXNzcGF0aEVudHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeTI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7CisKKy8qKgorICogRWRpdHMgdGhlIEFudCBIb21lIGNsYXNzcGF0aCBlbnRyeS4KKyAqIAorICogQHNpbmNlIDMuMAorICovCitwdWJsaWMgY2xhc3MgRWRpdEFudEhvbWVFbnRyeUFjdGlvbiBleHRlbmRzIFJ1bnRpbWVDbGFzc3BhdGhBY3Rpb24geworCQorCXByaXZhdGUgQW50Q2xhc3NwYXRoVGFiIGZUYWI7CisJLyoqCisJICogQ29uc3RydWN0cyBhbiBhY3Rpb24gdG8gZWRpdCB0aGUgQW50IEhvbWUgc2V0dGluZyBmb3IgYSBsYXVuY2ggY29uZmlnLgorCSAqIAorCSAqIEBwYXJhbSB2aWV3ZXIgY2xhc3NwYXRoIHZpZXdlcgorCSAqLworCXB1YmxpYyBFZGl0QW50SG9tZUVudHJ5QWN0aW9uKElDbGFzc3BhdGhWaWV3ZXIgdmlld2VyLCBBbnRDbGFzc3BhdGhUYWIgdGFiKSB7CisJCXN1cGVyKEFudExhdW5jaENvbmZpZ3VyYXRpb25NZXNzYWdlcy5FZGl0QW50SG9tZUVudHJ5QWN0aW9uXzEsIHZpZXdlcik7CisJCWZUYWIgPSB0YWI7CisJfQorCQorCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI3J1bigpCisJICovCisJcHVibGljIHZvaWQgcnVuKCkgeworCQlJRGlhbG9nU2V0dGluZ3MgZGlhbG9nU2V0dGluZ3MgPSBBbnRVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGlhbG9nU2V0dGluZ3MoKTsKKwkJU3RyaW5nIGxhc3RVc2VkUGF0aD0gZGlhbG9nU2V0dGluZ3MuZ2V0KElBbnRVSUNvbnN0YW50cy5ESUFMT0dTVE9SRV9MQVNUQU5USE9NRSk7CisJCWlmIChsYXN0VXNlZFBhdGggPT0gbnVsbCkgeworCQkJbGFzdFVzZWRQYXRoPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpOworCQl9CisJCURpcmVjdG9yeURpYWxvZyBkaWFsb2cgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKGdldFNoZWxsKCkpOworCQlkaWFsb2cuc2V0TWVzc2FnZShBbnRQcmVmZXJlbmNlc01lc3NhZ2VzLkFudENsYXNzcGF0aEJsb2NrXzMpOworCQlkaWFsb2cuc2V0RmlsdGVyUGF0aChsYXN0VXNlZFBhdGgpOworCQlTdHJpbmcgcGF0aCA9IGRpYWxvZy5vcGVuKCk7CisJCWlmIChwYXRoID09IG51bGwpIHsKKwkJCXJldHVybjsKKwkJfQorCQlkaWFsb2dTZXR0aW5ncy5wdXQoSUFudFVJQ29uc3RhbnRzLkRJQUxPR1NUT1JFX0xBU1RBTlRIT01FLCBwYXRoKTsKKwkJQW50Q29yZVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gQW50Q29yZVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRQcmVmZXJlbmNlcygpOworCQlTdHJpbmcgZGVmYXVsdEhvbWUgPSBwcmVmZXJlbmNlcy5nZXRBbnRIb21lKCk7CisJCWlmIChwYXRoLmVxdWFsc0lnbm9yZUNhc2UoZGVmYXVsdEhvbWUpKSB7CisJCQlwYXRoID0gbnVsbDsKKwkJfQorCQlmVGFiLnNldERpcnR5KHRydWUpOworCQkvLyB1cGRhdGUgZXhpc3RpbmcgZW50cnkgb3IgYWRkIGEgbmV3IG9uZQorCQlJUnVudGltZUNsYXNzcGF0aEVudHJ5W10gZW50cmllcyA9IGdldFZpZXdlcigpLmdldEVudHJpZXMoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7CisJCQlJUnVudGltZUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gZW50cmllc1tpXTsKKwkJCWlmIChlbnRyeS5nZXRUeXBlKCkgPT0gSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeS5PVEhFUikgeworCQkJCUlSdW50aW1lQ2xhc3NwYXRoRW50cnkyIGVudHJ5MiA9IChJUnVudGltZUNsYXNzcGF0aEVudHJ5MikoKENsYXNzcGF0aEVudHJ5KWVudHJ5KS5nZXREZWxlZ2F0ZSgpOworCQkJCWlmIChlbnRyeTIuZ2V0VHlwZUlkKCkuZXF1YWxzKEFudEhvbWVDbGFzc3BhdGhFbnRyeS5UWVBFX0lEKSkgeworCQkJCQkoKEFudEhvbWVDbGFzc3BhdGhFbnRyeSllbnRyeTIpLnNldEFudEhvbWUocGF0aCk7CisJCQkJCWdldFZpZXdlcigpLnJlZnJlc2goZW50cnkpOworCQkJCQlnZXRWaWV3ZXIoKS5ub3RpZnlDaGFuZ2VkKCk7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9CisJCX0JCQkJCisJCS8vIG5vIGVudHJ5IGZvdW5kIC0gYWRkIGEgbmV3IG9uZQorCQlnZXRWaWV3ZXIoKS5hZGRFbnRyaWVzKG5ldyBJUnVudGltZUNsYXNzcGF0aEVudHJ5W117bmV3IEFudEhvbWVDbGFzc3BhdGhFbnRyeShwYXRoKX0pOwkJCisJfQorCQorCS8qKgorCSAqIEBzZWUgU2VsZWN0aW9uTGlzdGVuZXJBY3Rpb24jdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQorCSAqLworCXByb3RlY3RlZCBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKwkJcmV0dXJuIHRydWU7CisJfQkKK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2xhdW5jaENvbmZpZ3VyYXRpb25zL0lBbnRMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9sYXVuY2hDb25maWd1cmF0aW9ucy9JQW50TGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2OWI5ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9sYXVuY2hDb25maWd1cmF0aW9ucy9JQW50TGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5qYXZhCkBAIC0wLDAgKzEsMTU4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmxhdW5jaENvbmZpZ3VyYXRpb25zOworCitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy5JQW50TGF1bmNoQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuaW50ZXJuYWwubW9kZWwuSUV4dGVybmFsVG9vbENvbnN0YW50czsKKworLyoqCisgKiBDb25zdGFudCBkZWZpbml0aW9ucyBmb3IgQW50IGxhdW5jaCBjb25maWd1cmF0aW9ucy4KKyAqIDxwPgorICogQ29uc3RhbnQgZGVmaW5pdGlvbnMgb25seTsgbm90IHRvIGJlIGltcGxlbWVudGVkLgorICogPC9wPgorICogQHNpbmNlIDMuMAorICogQG5vaW1wbGVtZW50IFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgorICogQGRlcHJlY2F0ZWQgVGhpcyBpbnRlcmZhY2UgaGFzIGJlZW4gcmVwbGFjZWQgd2l0aCB7QGxpbmsgSUFudExhdW5jaENvbnN0YW50c30KKyAqLworcHVibGljIGludGVyZmFjZSBJQW50TGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cyB7CisKKwkvKioKKwkqIFN0cmluZyBhdHRyaWJ1dGUgaW5kaWNhdGluZyB0aGUgY3VzdG9tIHJ1bnRpbWUgY2xhc3NwYXRoIHRvIHVzZSBmb3IgYW4gQW50CisJKiBidWlsZC4gRGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT5udWxsPC9jb2RlPiB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgZ2xvYmFsCisJKiBjbGFzc3BhdGggaXMgdG8gYmUgdXNlZC4gRm9ybWF0IGlzIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Rpbmcgb2YgVVJMcy4KKwkqIEBkZXByZWNhdGVkIG5vIGxvbmdlciBzdXBwb3J0ZWQ6IHVzZSB7QGxpbmsgSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzI0FUVFJfQ0xBU1NQQVRIX1BST1ZJREVSfQorCSogQHNlZSBJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMjQVRUUl9ERUZBVUxUX0NMQVNTUEFUSAorCSovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9BTlRfQ1VTVE9NX0NMQVNTUEFUSCA9IElFeHRlcm5hbFRvb2xDb25zdGFudHMuUExVR0lOX0lEICsgIi5BVFRSX0FOVF9DVVNUT01fQ0xBU1NQQVRIIjsgLy8kTk9OLU5MUy0xJAorCS8qKgorCSAqIFN0cmluZyBhdHRyaWJ1dGUgaW5kaWNhdGluZyB0aGUgY3VzdG9tIEFudCBob21lIHRvIHVzZSBmb3IgYW4gQW50IGJ1aWxkLgorCSAqIERlZmF1bHQgdmFsdWUgaXMgPGNvZGU+bnVsbDwvY29kZT4gd2hpY2ggaW5kaWNhdGVzIHRoYXQgbm8gQW50IGhvbWUgaXMgdG8KKwkgKiBiZSBzZXQgCisJICogQGRlcHJlY2F0ZWQgbm8gbG9uZ2VyIHN1cHBvcnRlZDogdXNlIHtAbGluayBJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMjQVRUUl9DTEFTU1BBVEhfUFJPVklERVJ9CisJICogQHNlZSBJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMjQVRUUl9ERUZBVUxUX0NMQVNTUEFUSAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQU5UX0hPTUUgPSBJRXh0ZXJuYWxUb29sQ29uc3RhbnRzLlBMVUdJTl9JRCArICIuQVRUUl9BTlRfSE9NRSI7IC8vJE5PTi1OTFMtMSQKKwkKKwkKKwkvKioKKwkgKiBTdHJpbmcgYXR0cmlidXRlIGluZGljYXRpbmcgdGhlIEFudCB0YXJnZXRzIHRvIGV4ZWN1dGUuIERlZmF1bHQgdmFsdWUgaXMKKwkgKiA8Y29kZT5udWxsPC9jb2RlPiB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgZGVmYXVsdCB0YXJnZXQgaXMgdG8gYmUKKwkgKiBleGVjdXRlZC4gRm9ybWF0IGlzIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Rpbmcgb2YgdGFyZ2V0cy4KKwkgKiAKKwkgKiBAZGVwcmVjYXRlZCBUaGlzIGNvbnN0YW50IGhhcyBiZWVuIG1pZ3JhdGVkIHRvIHtAbGluayBvcmcuZWNsaXBzZS5hbnQudWkubGF1bmNoaW5nLklBbnRMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzfQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQU5UX1RBUkdFVFMgPSBvcmcuZWNsaXBzZS5hbnQudWkubGF1bmNoaW5nLklBbnRMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfQU5UX1RBUkdFVFM7CisJLyoqCisJICogU3RyaW5nIGF0dHJpYnV0ZSBpbmRpY2F0aW5nIHRoZSBBbnQgdGFyZ2V0cyB0byBleGVjdXRlIGFmdGVyIGEgY2xlYW4gKGZ1bGwgYnVpbGQpIGZvciBhbiBBbnQgYnVpbGRlci4gRGVmYXVsdCB2YWx1ZSBpcworCSAqIDxjb2RlPm51bGw8L2NvZGU+IHdoaWNoIGluZGljYXRlcyB0aGF0IHRoZSBkZWZhdWx0IHRhcmdldCBpcyB0byBiZQorCSAqIGV4ZWN1dGVkLiBGb3JtYXQgaXMgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdGluZyBvZiB0YXJnZXRzLgorCSAqIEBzaW5jZSAzLjEKKwkgKiAKKwkgKiBAZGVwcmVjYXRlZCBUaGlzIGNvbnN0YW50IGhhcyBiZWVuIG1pZ3JhdGVkIHRvIHtAbGluayBvcmcuZWNsaXBzZS5hbnQudWkubGF1bmNoaW5nLklBbnRMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzfQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQU5UX0FGVEVSX0NMRUFOX1RBUkdFVFMgPSBvcmcuZWNsaXBzZS5hbnQudWkubGF1bmNoaW5nLklBbnRMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfQU5UX0FGVEVSX0NMRUFOX1RBUkdFVFM7CisJLyoqCisJICogU3RyaW5nIGF0dHJpYnV0ZSBpbmRpY2F0aW5nIHRoZSBBbnQgdGFyZ2V0cyB0byBleGVjdXRlIGR1cmluZyBhIG1hbnVhbCBidWlsZCBmb3IgYW4gQW50IGJ1aWxkZXIuIERlZmF1bHQgdmFsdWUgaXMKKwkgKiA8Y29kZT5udWxsPC9jb2RlPiB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgZGVmYXVsdCB0YXJnZXQgaXMgdG8gYmUKKwkgKiBleGVjdXRlZC4gRm9ybWF0IGlzIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Rpbmcgb2YgdGFyZ2V0cy4KKwkgKiBAc2luY2UgMy4xCisJICogCisJICogQGRlcHJlY2F0ZWQgVGhpcyBjb25zdGFudCBoYXMgYmVlbiBtaWdyYXRlZCB0byB7QGxpbmsgb3JnLmVjbGlwc2UuYW50LnVpLmxhdW5jaGluZy5JQW50TGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50c30gCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9BTlRfTUFOVUFMX1RBUkdFVFMgPSBvcmcuZWNsaXBzZS5hbnQudWkubGF1bmNoaW5nLklBbnRMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfQU5UX01BTlVBTF9UQVJHRVRTOworCS8qKgorCSAqIFN0cmluZyBhdHRyaWJ1dGUgaW5kaWNhdGluZyB0aGUgQW50IHRhcmdldHMgdG8gZXhlY3V0ZSBkdXJpbmcgYW4gYXV0byBidWlsZCBmb3IgYW4gQW50IGJ1aWxkZXIuIERlZmF1bHQgdmFsdWUgaXMKKwkgKiA8Y29kZT5udWxsPC9jb2RlPiB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgZGVmYXVsdCB0YXJnZXQgaXMgdG8gYmUKKwkgKiBleGVjdXRlZC4gRm9ybWF0IGlzIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Rpbmcgb2YgdGFyZ2V0cy4KKwkgKiBAc2luY2UgMy4xCisJICogCisJICogQGRlcHJlY2F0ZWQgVGhpcyBjb25zdGFudCBoYXMgYmVlbiBtaWdyYXRlZCB0byB7QGxpbmsgb3JnLmVjbGlwc2UuYW50LnVpLmxhdW5jaGluZy5JQW50TGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50c30gCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9BTlRfQVVUT19UQVJHRVRTID0gb3JnLmVjbGlwc2UuYW50LnVpLmxhdW5jaGluZy5JQW50TGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX0FOVF9BVVRPX1RBUkdFVFM7CisJLyoqCisJICogU3RyaW5nIGF0dHJpYnV0ZSBpbmRpY2F0aW5nIHRoZSBBbnQgdGFyZ2V0cyB0byBleGVjdXRlIGR1cmluZyBhIGNsZWFuIGZvciBhbiBBbnQgYnVpbGRlci4gRGVmYXVsdCB2YWx1ZSBpcworCSAqIDxjb2RlPm51bGw8L2NvZGU+IHdoaWNoIGluZGljYXRlcyB0aGF0IHRoZSBkZWZhdWx0IHRhcmdldCBpcyB0byBiZQorCSAqIGV4ZWN1dGVkLiBGb3JtYXQgaXMgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdGluZyBvZiB0YXJnZXRzLgorCSAqIEBzaW5jZSAzLjEKKwkgKiAKKwkgKiBAZGVwcmVjYXRlZCBUaGlzIGNvbnN0YW50IGhhcyBiZWVuIG1pZ3JhdGVkIHRvIHtAbGluayBvcmcuZWNsaXBzZS5hbnQudWkubGF1bmNoaW5nLklBbnRMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzfSAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0FOVF9DTEVBTl9UQVJHRVRTID0gb3JnLmVjbGlwc2UuYW50LnVpLmxhdW5jaGluZy5JQW50TGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX0FOVF9DTEVBTl9UQVJHRVRTOworCS8qKgorCSAqIEJvb2xlYW4gYXR0cmlidXRlIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgdGFyZ2V0IHNwZWNpZmljYXRpb24gZm9yIGFuIEFudCBidWlsZGVyIGhhcyBiZWVuIHVwZGF0ZWQgZm9yCisJICogMy4xIAorCSAqIAorCSAqIEBzaW5jZSAzLjEKKwkgKiAKKwkgKiBAZGVwcmVjYXRlZCBUaGlzIGNvbnN0YW50IGhhcyBiZWVuIG1pZ3JhdGVkIHRvIHtAbGluayBvcmcuZWNsaXBzZS5hbnQudWkubGF1bmNoaW5nLklBbnRMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzfQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVEFSR0VUU19VUERBVEVEID0gb3JnLmVjbGlwc2UuYW50LnVpLmxhdW5jaGluZy5JQW50TGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1RBUkdFVFNfVVBEQVRFRDsKKwkvKioKKwkgKiBNYXAgYXR0cmlidXRlIGluZGljYXRpbmcgdGhlIEFudCBwcm9wZXJ0aWVzIHRvIGJlIGRlZmluZWQgZHVyaW5nIHRoZQorCSAqIGJ1aWxkLiBEZWZhdWx0IHZhbHVlIGlzIDxjb2RlPm51bGw8L2NvZGU+IHdoaWNoIGluZGljYXRlcyBubyBhZGRpdGlvbmFsCisJICogcHJvcGVydGllcyB3aWxsIGJlIGRlZmluZWQuCisJICogCisJICogQGRlcHJlY2F0ZWQgVGhpcyBjb25zdGFudCBoYXMgYmVlbiBtaWdyYXRlZCB0byB7QGxpbmsgb3JnLmVjbGlwc2UuYW50LnVpLmxhdW5jaGluZy5JQW50TGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50c30KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0FOVF9QUk9QRVJUSUVTID0gb3JnLmVjbGlwc2UuYW50LnVpLmxhdW5jaGluZy5JQW50TGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX0FOVF9QUk9QRVJUSUVTOwkJCQkKKwkvKioKKwkgKiBTdHJpbmcgYXR0cmlidXRlIGluZGljYXRpbmcgdGhlIEFudCB0YXJnZXRzIHRvIGV4ZWN1dGUuIERlZmF1bHQgdmFsdWUgaXMKKwkgKiA8Y29kZT5udWxsPC9jb2RlPiB3aGljaCBpbmRpY2F0ZXMgdGhhdCBubyBhZGRpdGlvbmFsIHByb3BlcnR5IGZpbGVzCisJICogd2lsbCBiZSBkZWZpbmVkLiBGb3JtYXQgaXMgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdGluZyBvZiBwcm9wZXJ0eSBmaWxlcy4KKwkgKiAKKwkgKiBAZGVwcmVjYXRlZCBUaGlzIGNvbnN0YW50IGhhcyBiZWVuIG1pZ3JhdGVkIHRvIHtAbGluayBvcmcuZWNsaXBzZS5hbnQudWkubGF1bmNoaW5nLklBbnRMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzfSAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0FOVF9QUk9QRVJUWV9GSUxFUyA9IG9yZy5lY2xpcHNlLmFudC51aS5sYXVuY2hpbmcuSUFudExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9BTlRfUFJPUEVSVFlfRklMRVM7CisJLyoqCisJICogQm9vbGVhbiBhdHRyaWJ1dGUgaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCBpbnRlcm5hbCB0YXJnZXRzICh0YXJnZXRzIHdpdGggbm8KKwkgKiBkZXNjcmlwdGlvbikgc2hvdWxkIGJlIGhpZGRlbiBmcm9tIHRoZSB1c2VyIGluIHRoZSBsYXVuY2ggY29uZmlndXJhdGlvbiBkaWFsb2cuCisJICogRGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT5mYWxzZTwvY29kZT4gd2hpY2ggaW5kaWNhdGVzIHRoYXQgYWxsIHRhcmdldHMgd2lsbCBiZQorCSAqIGRpc3BsYXllZC4KKwkgKiAKKwkgKiBAc2luY2UgMy4wCisJICogCisJICogQGRlcHJlY2F0ZWQgVGhpcyBjb25zdGFudCBoYXMgYmVlbiBtaWdyYXRlZCB0byB7QGxpbmsgb3JnLmVjbGlwc2UuYW50LnVpLmxhdW5jaGluZy5JQW50TGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50c30KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0hJREVfSU5URVJOQUxfVEFSR0VUUyA9IG9yZy5lY2xpcHNlLmFudC51aS5sYXVuY2hpbmcuSUFudExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9ISURFX0lOVEVSTkFMX1RBUkdFVFM7CisJLyoqCisJICogSW50ZWdlciBhdHRyaWJ1dGUgaW5kaWNhdGluZyB3aGljaCBjb2x1bW4gdGFyZ2V0cyBzaG91bGQgYmUgc29ydGVkIG9uLiBBCisJICogdmFsdWUgb2YgMCBpbmRpY2F0ZXMgdGFyZ2V0IG5hbWUsIDEgaW5kaWNhdGVzIHRhcmdldCBkZXNjcmlwdGlvbiwgYW5kIC0xCisJICogaW5kaWNhdGVzIG5vIHNvcnQuIERlZmF1bHQgdmFsdWUgaXMgLTEuCisJICogCisJICogQHNpbmNlIDMuMAorCSAqIAorCSAqIEBkZXByZWNhdGVkIFRoaXMgY29uc3RhbnQgaGFzIGJlZW4gbWlncmF0ZWQgdG8ge0BsaW5rIG9yZy5lY2xpcHNlLmFudC51aS5sYXVuY2hpbmcuSUFudExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHN9CisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9TT1JUX1RBUkdFVFMgPSBvcmcuZWNsaXBzZS5hbnQudWkubGF1bmNoaW5nLklBbnRMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfU09SVF9UQVJHRVRTOworCS8qKgorCSAqIEFudCBsYXVuY2ggY29uZmlndXJhdGlvbiB0eXBlIGlkZW50aWZpZXIuCisJICogCisJICogQGRlcHJlY2F0ZWQgVGhpcyBjb25zdGFudCBoYXMgYmVlbiBtaWdyYXRlZCB0byB7QGxpbmsgb3JnLmVjbGlwc2UuYW50LnVpLmxhdW5jaGluZy5JQW50TGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50c30gCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfQU5UX0xBVU5DSF9DT05GSUdVUkFUSU9OX1RZUEUgPSBvcmcuZWNsaXBzZS5hbnQudWkubGF1bmNoaW5nLklBbnRMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLklEX0FOVF9MQVVOQ0hfQ09ORklHVVJBVElPTl9UWVBFOworCS8qKgorCSAqIEFudCBidWlsZGVyIGxhdW5jaCBjb25maWd1cmF0aW9uIHR5cGUgaWRlbnRpZmllci4gQW50IHByb2plY3QgYnVpbGRlcnMKKwkgKiBhcmUgb2YgdGhpcyB0eXBlLgorCSAqIAorCSAqIEBkZXByZWNhdGVkIFRoaXMgY29uc3RhbnQgaGFzIGJlZW4gbWlncmF0ZWQgdG8ge0BsaW5rIG9yZy5lY2xpcHNlLmFudC51aS5sYXVuY2hpbmcuSUFudExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHN9IAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0FOVF9CVUlMREVSX0xBVU5DSF9DT05GSUdVUkFUSU9OX1RZUEUgPSBvcmcuZWNsaXBzZS5hbnQudWkubGF1bmNoaW5nLklBbnRMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLklEX0FOVF9CVUlMREVSX0xBVU5DSF9DT05GSUdVUkFUSU9OX1RZUEU7CisJLyoqCisJICogSWRlbnRpZmllciBmb3IgQW50IHByb2Nlc3NlcyAodmFsdWUgPGNvZGU+b3JnLmVjbGlwc2UuYW50LnVpLmFudFByb2Nlc3M8L2NvZGU+KS4gVGhpcyBpZGVudGlmaWVyIGlzCisJICogc2V0IGFzIHRoZSB2YWx1ZSBmb3IgdGhlIDxjb2RlPklQcm9jZXNzLkFUVFJfUFJPQ0VTU19UWVBFPC9jb2RlPgorCSAqIGF0dHJpYnV0ZSBpbiBwcm9jZXNzZXMgY3JlYXRlZCBieSB0aGUgQW50IGxhdW5jaCBkZWxlZ2F0ZS4KKwkgKiAKKwkgKiBAZGVwcmVjYXRlZCBUaGlzIGNvbnN0YW50IGhhcyBiZWVuIG1pZ3JhdGVkIHRvIHtAbGluayBvcmcuZWNsaXBzZS5hbnQudWkubGF1bmNoaW5nLklBbnRMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzfSAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9BTlRfUFJPQ0VTU19UWVBFID0gb3JnLmVjbGlwc2UuYW50LnVpLmxhdW5jaGluZy5JQW50TGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5JRF9BTlRfUFJPQ0VTU19UWVBFOworfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvbGF1bmNoQ29uZmlndXJhdGlvbnMvUnVuQW50U3RhdHVzSGFuZGxlci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvbGF1bmNoQ29uZmlndXJhdGlvbnMvUnVuQW50U3RhdHVzSGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MmRkZmEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9sYXVuY2hDb25maWd1cmF0aW9ucy9SdW5BbnRTdGF0dXNIYW5kbGVyLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkubGF1bmNoQ29uZmlndXJhdGlvbnM7CisKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSVN0YXR1c0hhbmRsZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuSUxhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2c7CisKKy8qKgorICogU3RhdHVzIGhhbmRsZXIgY2FsbGVkIHdoZW4gdGhlIGxhdW5jaCBkaWFsb2cgaXMgb3BlbmVkIHZpYSB0aGUgIlJ1biBBbnQuLi4iCisgKiBhY3Rpb24uIFRoaXMgYWxsb3dzIHVzIHRvIHNldCB0aGUgaW5pdGlhbCB0YWIuCisgKi8KK3B1YmxpYyBjbGFzcyBSdW5BbnRTdGF0dXNIYW5kbGVyIGltcGxlbWVudHMgSVN0YXR1c0hhbmRsZXIgeworCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklTdGF0dXNIYW5kbGVyI2hhbmRsZVN0YXR1cyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cywgamF2YS5sYW5nLk9iamVjdCkKKwkgKi8KKwlwdWJsaWMgT2JqZWN0IGhhbmRsZVN0YXR1cyhJU3RhdHVzIHN0YXR1cywgT2JqZWN0IHNvdXJjZSkgeworCQlJTGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZyBkaWFsb2cgPSAoSUxhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2cpc291cmNlOworCQlkaWFsb2cuc2V0QWN0aXZlVGFiKDMpOworCQlyZXR1cm4gbnVsbDsKKwl9CisKK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2xhdW5jaENvbmZpZ3VyYXRpb25zL1RhcmdldE9yZGVyRGlhbG9nLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9sYXVuY2hDb25maWd1cmF0aW9ucy9UYXJnZXRPcmRlckRpYWxvZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwYTdkODEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9sYXVuY2hDb25maWd1cmF0aW9ucy9UYXJnZXRPcmRlckRpYWxvZy5qYXZhCkBAIC0wLDAgKzEsMjUzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5sYXVuY2hDb25maWd1cmF0aW9uczsKKworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuSUFudFVJSGVscENvbnRleHRJZHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLm1vZGVsLkFudE1vZGVsQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5tb2RlbC5BbnRNb2RlbExhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOworCisvKioKKyAqIERpYWxvZyB0byBzcGVjaWZ5IHRhcmdldCBleGVjdXRpb24gb3JkZXIKKyAqLworcHVibGljIGNsYXNzIFRhcmdldE9yZGVyRGlhbG9nIGV4dGVuZHMgRGlhbG9nIGltcGxlbWVudHMgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciB7CisJCisJcHJpdmF0ZSBCdXR0b24gZlVwOworCXByaXZhdGUgQnV0dG9uIGZEb3duOworCXByaXZhdGUgVGFibGVWaWV3ZXIgZlZpZXdlcjsKKwlwcml2YXRlIE9iamVjdFtdIGZUYXJnZXRzOworCisJLyoqCisJICogQ29uc3RydWN0cyB0aGUgZGlhbG9nLgorCSAqIAorCSAqIEBwYXJhbSBwYXJlbnRTaGVsbAorCSAqLworCXB1YmxpYyBUYXJnZXRPcmRlckRpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgT2JqZWN0W10gdGFyZ2V0cykgeworCQlzdXBlcihwYXJlbnRTaGVsbCk7CisJCWZUYXJnZXRzID0gdGFyZ2V0czsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNjcmVhdGVEaWFsb2dBcmVhKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKKwkgKi8KKwlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJZ2V0U2hlbGwoKS5zZXRUZXh0KEFudExhdW5jaENvbmZpZ3VyYXRpb25NZXNzYWdlcy5UYXJnZXRPcmRlckRpYWxvZ19PcmRlcl9UYXJnZXRzXzEpOworCQkKKwkJQ29tcG9zaXRlIGNvbXAgPSAoQ29tcG9zaXRlKXN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKKwkJKChHcmlkTGF5b3V0KWNvbXAuZ2V0TGF5b3V0KCkpLm51bUNvbHVtbnM9IDI7CisJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXAsIFNXVC5OT05FKTsKKwkJbGFiZWwuc2V0VGV4dChBbnRMYXVuY2hDb25maWd1cmF0aW9uTWVzc2FnZXMuVGFyZ2V0T3JkZXJEaWFsb2dfX1NwZWNpZnlfdGFyZ2V0X2V4ZWN1dGlvbl9vcmRlcl9fMik7CisJCWxhYmVsLnNldEZvbnQoY29tcC5nZXRGb250KCkpOworCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOworCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7CisJCWxhYmVsLnNldExheW91dERhdGEoZ2QpOwkJCisJCQorCQljcmVhdGVUYXJnZXRMaXN0KGNvbXApOworCQkKKwkJY3JlYXRlQnV0dG9ucyhjb21wKTsKKwkJCisJCXVwZGF0ZUJ1dHRvbnMoKTsKKwkJCisJCXJldHVybiBjb21wOworCX0KKworCS8qKgorCSAqIENyZWF0ZSBidXR0b24gYXJlYSAmIGJ1dHRvbnMKKwkgKiAKKwkgKiBAcGFyYW0gY29tcAorCSAqLworCXByaXZhdGUgdm9pZCBjcmVhdGVCdXR0b25zKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJQ29tcG9zaXRlIGNvbXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOworCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7CisJCWxheW91dC5tYXJnaW5IZWlnaHQ9IDA7CisJCWxheW91dC5tYXJnaW5XaWR0aD0gMDsKKwkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKKwkJZ2QudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5CRUdJTk5JTkc7CisJCWNvbXAuc2V0TGF5b3V0KGxheW91dCk7CisJCWNvbXAuc2V0TGF5b3V0RGF0YShnZCk7CisJCQorCQlmVXAgPSBuZXcgQnV0dG9uKGNvbXAsIFNXVC5QVVNIKTsKKwkJZlVwLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7CisJCWZVcC5zZXRUZXh0KEFudExhdW5jaENvbmZpZ3VyYXRpb25NZXNzYWdlcy5UYXJnZXRPcmRlckRpYWxvZ19fVXBfMyk7CisJCXNldEJ1dHRvbkxheW91dERhdGEoZlVwKTsKKwkJZlVwLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCWhhbmRsZVVwUHJlc3NlZCgpOworCQkJfQorCQl9KTsKKwkJCisJCWZEb3duID0gbmV3IEJ1dHRvbihjb21wLCBTV1QuUFVTSCk7CisJCWZEb3duLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7CisJCWZEb3duLnNldFRleHQoQW50TGF1bmNoQ29uZmlndXJhdGlvbk1lc3NhZ2VzLlRhcmdldE9yZGVyRGlhbG9nX19Eb3duXzQpOworCQlzZXRCdXR0b25MYXlvdXREYXRhKGZEb3duKTsKKwkJZkRvd24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CisJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJaGFuZGxlRG93blByZXNzZWQoKTsKKwkJCX0KKwkJfSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGhhbmRsZURvd25QcmVzc2VkKCkgeworCQlMaXN0IHRhcmdldHMgPSBnZXRPcmRlcmVkU2VsZWN0aW9uKCk7CisJCWlmICh0YXJnZXRzLmlzRW1wdHkoKSkgeworCQkJcmV0dXJuOworCQl9CisJCUxpc3QgbGlzdD0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KGZUYXJnZXRzKSk7CisJCWludCBib3R0b20gPSBsaXN0LnNpemUoKSAtIDE7CisJCWludCBpbmRleCA9IDA7CisJCWZvciAoaW50IGkgPSB0YXJnZXRzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7CisJCQlPYmplY3QgdGFyZ2V0ID0gdGFyZ2V0cy5nZXQoaSk7CisJCQlpbmRleCA9IGxpc3QuaW5kZXhPZih0YXJnZXQpOworCQkJaWYgKGluZGV4IDwgYm90dG9tKSB7CisJCQkJYm90dG9tID0gaW5kZXggKyAxOworCQkJCU9iamVjdCB0ZW1wID0gbGlzdC5nZXQoYm90dG9tKTsKKwkJCQlsaXN0LnNldChib3R0b20sIHRhcmdldCk7CisJCQkJbGlzdC5zZXQoaW5kZXgsIHRlbXApOworCQkJfQorCQkJYm90dG9tID0gaW5kZXg7CisJCX0gCisJCXNldEVudHJpZXMobGlzdCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGhhbmRsZVVwUHJlc3NlZCgpIHsKKwkJTGlzdCB0YXJnZXRzID0gZ2V0T3JkZXJlZFNlbGVjdGlvbigpOworCQlpZiAodGFyZ2V0cy5pc0VtcHR5KCkpIHsKKwkJCXJldHVybjsKKwkJfQorCQlpbnQgdG9wID0gMDsKKwkJaW50IGluZGV4ID0gMDsKKwkJTGlzdCBsaXN0PSBuZXcgQXJyYXlMaXN0KEFycmF5cy5hc0xpc3QoZlRhcmdldHMpKTsKKwkJSXRlcmF0b3IgZW50cmllcyA9IHRhcmdldHMuaXRlcmF0b3IoKTsKKwkJd2hpbGUgKGVudHJpZXMuaGFzTmV4dCgpKSB7CisJCQlPYmplY3QgdGFyZ2V0ID0gZW50cmllcy5uZXh0KCk7CisJCQlpbmRleCA9IGxpc3QuaW5kZXhPZih0YXJnZXQpOworCQkJaWYgKGluZGV4ID4gdG9wKSB7CisJCQkJdG9wID0gaW5kZXggLSAxOworCQkJCU9iamVjdCB0ZW1wID0gbGlzdC5nZXQodG9wKTsKKwkJCQlsaXN0LnNldCh0b3AsIHRhcmdldCk7CisJCQkJbGlzdC5zZXQoaW5kZXgsIHRlbXApOworCQkJfQorCQkJdG9wID0gaW5kZXg7CisJCX0gCisJCXNldEVudHJpZXMobGlzdCk7CisJfQorCQorCS8qKgorCSAqIFVwZGF0ZXMgdGhlIGVudHJpZXMgdG8gdGhlIGVudHJpZXMgaW4gdGhlIGdpdmVuIGxpc3QKKwkgKi8KKwlwcml2YXRlIHZvaWQgc2V0RW50cmllcyhMaXN0IGxpc3QpIHsKKwkJZlRhcmdldHM9IGxpc3QudG9BcnJheSgpOworCQlmVmlld2VyLnNldElucHV0KGZUYXJnZXRzKTsKKwkJLy8gdXBkYXRlIGFsbCBzZWxlY3Rpb24gbGlzdGVuZXJzCisJCWZWaWV3ZXIuc2V0U2VsZWN0aW9uKGZWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzZWxlY3RlZCBpdGVtcyBpbiB0aGUgbGlzdCwgaW4gdGhlIG9yZGVyIHRoZXkgYXJlCisJICogZGlzcGxheWVkIChub3QgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSBzZWxlY3RlZCkuCisJICogCisJICogQHJldHVybiB0YXJnZXRzIGZvciBhbiBhY3Rpb24KKwkgKi8KKwlwcml2YXRlIExpc3QgZ2V0T3JkZXJlZFNlbGVjdGlvbigpIHsKKwkJTGlzdCB0YXJnZXRzID0gbmV3IEFycmF5TGlzdCgpOworCQlMaXN0IHNlbGVjdGlvbiA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pZlZpZXdlci5nZXRTZWxlY3Rpb24oKSkudG9MaXN0KCk7CisJCU9iamVjdFtdIGVudHJpZXMgPSBmVGFyZ2V0czsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7CisJCQlPYmplY3QgdGFyZ2V0ID0gZW50cmllc1tpXTsKKwkJCWlmIChzZWxlY3Rpb24uY29udGFpbnModGFyZ2V0KSkgeworCQkJCXRhcmdldHMuYWRkKHRhcmdldCk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHRhcmdldHM7CQkKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbGlzdCB2aWV3ZXIgZm9yIHRoZSB0YXJnZXRzCisJICogCisJICogQHBhcmFtIGNvbXAKKwkgKi8KKwlwcml2YXRlIHZvaWQgY3JlYXRlVGFyZ2V0TGlzdChDb21wb3NpdGUgY29tcCkgeworCQlmVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKGNvbXAsIFNXVC5NVUxUSSB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5CT1JERVIpOworCQlmVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IEFudE1vZGVsTGFiZWxQcm92aWRlcigpKTsKKwkKKwkJZlZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFudE1vZGVsQ29udGVudFByb3ZpZGVyKCkpOworCQlmVmlld2VyLnNldElucHV0KGZUYXJnZXRzKTsKKwkJZlZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7CisJCVRhYmxlIHRhYmxlID0gZlZpZXdlci5nZXRUYWJsZSgpOworCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOworCQlnZC5oZWlnaHRIaW50ID0gMjAwOworCQlnZC53aWR0aEhpbnQgPSAyNTA7CQkKKwkJdGFibGUuc2V0TGF5b3V0RGF0YShnZCk7CisJCXRhYmxlLnNldEZvbnQoY29tcC5nZXRGb250KCkpOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBvcmRlcmVkIHRhcmdldHMKKwkgKi8KKwlwdWJsaWMgT2JqZWN0W10gZ2V0VGFyZ2V0cygpIHsKKwkJcmV0dXJuIGZUYXJnZXRzOworCX0KKwkKKwkvKioKKwkgKiBVcGRhdGUgYnV0dG9uIGVuYWJsZW1lbnQKKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KQorCSAqLworCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7CisJCXVwZGF0ZUJ1dHRvbnMoKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIHVwZGF0ZUJ1dHRvbnMoKSB7CisJCWludFtdIHNlbGVjdGlvbnMgPSBmVmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kaWNlcygpOworCQlpbnQgbGFzdCA9IGZUYXJnZXRzLmxlbmd0aCAtIDE7CisJCWJvb2xlYW4gdXAgPSB0cnVlICYmIHNlbGVjdGlvbnMubGVuZ3RoID4gMDsKKwkJYm9vbGVhbiBkb3duID0gdHJ1ZSAmJiBzZWxlY3Rpb25zLmxlbmd0aCA+IDA7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0aW9ucy5sZW5ndGg7IGkrKykgeworCQkJaWYgKHNlbGVjdGlvbnNbaV0gPT0gMCkgeworCQkJCXVwID0gZmFsc2U7CisJCQl9CisJCQlpZiAoc2VsZWN0aW9uc1tpXSA9PSBsYXN0KSB7CisJCQkJZG93biA9IGZhbHNlOworCQkJfQorCQl9CisJCWZVcC5zZXRFbmFibGVkKHVwKTsKKwkJZkRvd24uc2V0RW5hYmxlZChkb3duKTsJCQorCX0KKwkKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93I2NvbmZpZ3VyZVNoZWxsKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsKQorCSAqLworCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIHNoZWxsKSB7CisJCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKHNoZWxsKTsKKwkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChzaGVsbCwgSUFudFVJSGVscENvbnRleHRJZHMuVEFSR0VUX09SREVSX0RJQUxPRyk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvbGF1bmNoQ29uZmlndXJhdGlvbnMvVmFyaWFibGVJbnB1dERpYWxvZy5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvbGF1bmNoQ29uZmlndXJhdGlvbnMvVmFyaWFibGVJbnB1dERpYWxvZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExYmY0ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9sYXVuY2hDb25maWd1cmF0aW9ucy9WYXJpYWJsZUlucHV0RGlhbG9nLmphdmEKQEAgLTAsMCArMSwxMjUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmxhdW5jaENvbmZpZ3VyYXRpb25zOworCitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLkFudFVJUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLlN0cmluZ1ZhcmlhYmxlU2VsZWN0aW9uRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OworCisKK3B1YmxpYyBjbGFzcyBWYXJpYWJsZUlucHV0RGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKKwkKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgRElBTE9HX1NFVFRJTkdTX1NFQ1RJT04gPSAiUnVudGltZUNsYXNzcGF0aEFjdGlvbi5WYXJpYWJsZUlucHV0RGlhbG9nIjsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgVGV4dCBmVGV4dDsKKwlwcml2YXRlIFN0cmluZyBmVmFyaWFibGVTdHJpbmc7CisJCisJcHVibGljIFZhcmlhYmxlSW5wdXREaWFsb2coU2hlbGwgc2hlbGwpIHsKKwkJc3VwZXIoc2hlbGwpOworCQlzZXRTaGVsbFN0eWxlKFNXVC5SRVNJWkUgfCBnZXRTaGVsbFN0eWxlKCkpOworCX0KKwkKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNjcmVhdGVEaWFsb2dBcmVhKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKKwkgKi8KKwlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKKyAgICAgICAgQ29tcG9zaXRlIGlubmVyPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7CisJCSgoR3JpZExheW91dClpbm5lci5nZXRMYXlvdXQoKSkubnVtQ29sdW1ucz0gMjsKKwkJCisJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGlubmVyLCBTV1QuTk9ORSk7CisJCWxhYmVsLnNldFRleHQoQW50TGF1bmNoQ29uZmlndXJhdGlvbk1lc3NhZ2VzLkFkZFZhcmlhYmxlU3RyaW5nQWN0aW9uXzIpOworCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORyk7CisgICAgICAgIGdkLmhvcml6b250YWxTcGFuPSAyOworCQlsYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKKwkJCisJCWZUZXh0ID0gbmV3IFRleHQoaW5uZXIsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKKwkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKKwkJZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7CisJCWdkLndpZHRoSGludCA9IDIwMDsKKwkJZlRleHQuc2V0TGF5b3V0RGF0YShnZCk7CisJCQorCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihpbm5lciwgU1dULlBVU0gpOyAKKwkJYnV0dG9uLnNldFRleHQoQW50TGF1bmNoQ29uZmlndXJhdGlvbk1lc3NhZ2VzLkFkZFZhcmlhYmxlU3RyaW5nQWN0aW9uXzMpOwkJCisJCWJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCXB1YmxpYyAgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBzZSkgeworCQkJCWdldFZhcmlhYmxlKCk7CisJCQl9CisJCX0pOworCQkKKwkJYXBwbHlEaWFsb2dGb250KHBhcmVudCk7CisJCXJldHVybiBpbm5lcjsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7CisJCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuT0tfSUQsIElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsIHRydWUpOworCQljcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUwsIGZhbHNlKTsKKwl9CisgICAgCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdyNjb25maWd1cmVTaGVsbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbCkKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBuZXdTaGVsbCkgeworCQlzdXBlci5jb25maWd1cmVTaGVsbChuZXdTaGVsbCk7CisJCW5ld1NoZWxsLnNldFRleHQoQW50TGF1bmNoQ29uZmlndXJhdGlvbk1lc3NhZ2VzLkFkZFZhcmlhYmxlU3RyaW5nQWN0aW9uXzQpOworCX0KKwkKKwlwcml2YXRlIHZvaWQgZ2V0VmFyaWFibGUoKSB7CisJCVN0cmluZ1ZhcmlhYmxlU2VsZWN0aW9uRGlhbG9nIHZhcmlhYmxlRGlhbG9nID0gbmV3IFN0cmluZ1ZhcmlhYmxlU2VsZWN0aW9uRGlhbG9nKGdldFNoZWxsKCkpOworCQlpbnQgcmV0dXJuQ29kZSA9IHZhcmlhYmxlRGlhbG9nLm9wZW4oKTsKKwkJaWYgKHJldHVybkNvZGUgPT0gSURpYWxvZ0NvbnN0YW50cy5PS19JRCkgeworCQkJU3RyaW5nIHZhcmlhYmxlID0gdmFyaWFibGVEaWFsb2cuZ2V0VmFyaWFibGVFeHByZXNzaW9uKCk7CisJCQlpZiAodmFyaWFibGUgIT0gbnVsbCkgeworCQkJCWZUZXh0Lmluc2VydCh2YXJpYWJsZSk7CisJCQl9CisJCX0JCQkKKwl9CisJCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjb2tQcmVzc2VkKCkKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7CisJCVN0cmluZyB2YXJpYWJsZVN0cmluZyA9IGZUZXh0LmdldFRleHQoKTsKKwkJaWYgKHZhcmlhYmxlU3RyaW5nICE9IG51bGwgJiYgdmFyaWFibGVTdHJpbmcudHJpbSgpLmxlbmd0aCgpID4gMCkgeworCQkJZlZhcmlhYmxlU3RyaW5nPSB2YXJpYWJsZVN0cmluZzsKKwkJfSBlbHNlIHsKKwkJCWZWYXJpYWJsZVN0cmluZz0gbnVsbDsKKwkJfQorCQlzdXBlci5va1ByZXNzZWQoKTsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRWYXJpYWJsZVN0cmluZygpIHsKKwkJcmV0dXJuIGZWYXJpYWJsZVN0cmluZzsKKwl9CisKKwkgLyogKG5vbi1KYXZhZG9jKQorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjZ2V0RGlhbG9nQm91bmRzU2V0dGluZ3MoKQorICAgICAqLworICAgIHByb3RlY3RlZCBJRGlhbG9nU2V0dGluZ3MgZ2V0RGlhbG9nQm91bmRzU2V0dGluZ3MoKSB7CisgICAgCSBJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MgPSBBbnRVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGlhbG9nU2V0dGluZ3MoKTsKKyAgICAgICAgIElEaWFsb2dTZXR0aW5ncyBzZWN0aW9uID0gc2V0dGluZ3MuZ2V0U2VjdGlvbihESUFMT0dfU0VUVElOR1NfU0VDVElPTik7CisgICAgICAgICBpZiAoc2VjdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgc2VjdGlvbiA9IHNldHRpbmdzLmFkZE5ld1NlY3Rpb24oRElBTE9HX1NFVFRJTkdTX1NFQ1RJT04pOworICAgICAgICAgfSAKKyAgICAgICAgIHJldHVybiBzZWN0aW9uOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL21vZGVsL0FudENvbW1lbnROb2RlLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9tb2RlbC9BbnRDb21tZW50Tm9kZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiYzdhMDgKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9tb2RlbC9BbnRDb21tZW50Tm9kZS5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkubW9kZWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuQW50VUlQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLnByZWZlcmVuY2VzLkFudEVkaXRvclByZWZlcmVuY2VDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOworCitwdWJsaWMgY2xhc3MgQW50Q29tbWVudE5vZGUgZXh0ZW5kcyBBbnRFbGVtZW50Tm9kZSB7CisJcHVibGljIEFudENvbW1lbnROb2RlKCkgeworCQlzdXBlcigiQW50Q29tbWVudCIpOyAvLyROT04tTkxTLTEkCisJfQorCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IubW9kZWwuQW50RWxlbWVudE5vZGUjaXNTdHJ1Y3R1cmFsTm9kZSgpCisJICovCisJcHVibGljIGJvb2xlYW4gaXNTdHJ1Y3R1cmFsTm9kZSgpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBjb2xsYXBzZVByb2plY3Rpb24oKSB7CisJCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmU9IEFudFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsJCQorCQlpZiAoc3RvcmUuZ2V0Qm9vbGVhbihBbnRFZGl0b3JQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9GT0xESU5HX0NPTU1FTlRTKSkgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL21vZGVsL0FudERURE5vZGUuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL21vZGVsL0FudERURE5vZGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmYyOWVmCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvbW9kZWwvQW50RFRETm9kZS5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkubW9kZWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuQW50VUlQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLnByZWZlcmVuY2VzLkFudEVkaXRvclByZWZlcmVuY2VDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOworCitwdWJsaWMgY2xhc3MgQW50RFRETm9kZSBleHRlbmRzIEFudEVsZW1lbnROb2RlIHsKKwlwdWJsaWMgQW50RFRETm9kZShTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisJCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5tb2RlbC5BbnRFbGVtZW50Tm9kZSNpc1N0cnVjdHVyYWxOb2RlKCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1N0cnVjdHVyYWxOb2RlKCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCQorCXB1YmxpYyBib29sZWFuIGNvbGxhcHNlUHJvamVjdGlvbigpIHsKKwkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZT0gQW50VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwkJCisJCWlmIChzdG9yZS5nZXRCb29sZWFuKEFudEVkaXRvclByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0ZPTERJTkdfRFREKSkgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL21vZGVsL0FudEVsZW1lbnRBZGFwdGVyRmFjdG9yeS5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvbW9kZWwvQW50RWxlbWVudEFkYXB0ZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODAxMTdmNwotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL21vZGVsL0FudEVsZW1lbnRBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkubW9kZWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeTsKKworLyoqCisgKiBBZGFwdGVyIGZhY3RvcnkgZm9yIEFudCBlbGVtZW50cyBpbiBlZGl0b3Igb3V0bGluZQorICovCitwdWJsaWMgY2xhc3MgQW50RWxlbWVudEFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgSUFkYXB0ZXJGYWN0b3J5IHsKKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3RvcnkjZ2V0QWRhcHRlcihqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuQ2xhc3MpCisJICovCisJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKE9iamVjdCBhZGFwdGFibGVPYmplY3QsIENsYXNzIGFkYXB0ZXJUeXBlKSB7CisJCWlmIChhZGFwdGFibGVPYmplY3QgaW5zdGFuY2VvZiBBbnRFbGVtZW50Tm9kZSkgeworCQkJQW50RWxlbWVudE5vZGUgbm9kZSA9IChBbnRFbGVtZW50Tm9kZSkgYWRhcHRhYmxlT2JqZWN0OworCQkJaWYgKElSZXNvdXJjZS5jbGFzcy5lcXVhbHMoYWRhcHRlclR5cGUpKSB7CisJCQkJcmV0dXJuIG5vZGUuZ2V0SUZpbGUoKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5I2dldEFkYXB0ZXJMaXN0KCkKKwkgKi8KKwlwdWJsaWMgQ2xhc3NbXSBnZXRBZGFwdGVyTGlzdCgpIHsKKwkJcmV0dXJuIG5ldyBDbGFzc1tdIHtJUmVzb3VyY2UuY2xhc3N9OworCX0KKworfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvbW9kZWwvQW50TW9kZWxDaGFuZ2VFdmVudC5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvbW9kZWwvQW50TW9kZWxDaGFuZ2VFdmVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3N2VhMjYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9tb2RlbC9BbnRNb2RlbENoYW5nZUV2ZW50LmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5tb2RlbDsKKworCitwdWJsaWMgY2xhc3MgQW50TW9kZWxDaGFuZ2VFdmVudCB7CisJCisJcHJpdmF0ZSBJQW50TW9kZWwgZk1vZGVsOworCXByaXZhdGUgYm9vbGVhbiBmUHJlZmVyZW5jZUNoYW5nZT0gZmFsc2U7CisJCisJcHVibGljIEFudE1vZGVsQ2hhbmdlRXZlbnQoSUFudE1vZGVsIG1vZGVsKSB7CisJCWZNb2RlbD0gbW9kZWw7CisJfQorCQorCXB1YmxpYyBBbnRNb2RlbENoYW5nZUV2ZW50KElBbnRNb2RlbCBtb2RlbCwgYm9vbGVhbiBwcmVmZXJlbmNlQ2hhbmdlKSB7CisJCWZNb2RlbD0gbW9kZWw7CisJCWZQcmVmZXJlbmNlQ2hhbmdlPSBwcmVmZXJlbmNlQ2hhbmdlOworCX0KKwkKKwlwdWJsaWMgSUFudE1vZGVsIGdldE1vZGVsKCkgeworCQlyZXR1cm4gZk1vZGVsOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIEFudCBtb2RlbCBoYXMgY2hhbmdlZCBhcyBhIHJlc3VsdCBvZiBhIHByZWZlcmVuY2UgY2hhbmdlLgorCSAqIEByZXR1cm4gd2hldGhlciB0aGUgbW9kZWwgaGFzIGNoYW5nZWQgZnJvbSBhIHByZWZlcmVuY2UgY2hhbmdlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzUHJlZmVyZW5jZUNoYW5nZSgpIHsKKwkJcmV0dXJuIGZQcmVmZXJlbmNlQ2hhbmdlOworCX0KK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL21vZGVsL0FudE1vZGVsQ29udGVudFByb3ZpZGVyLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9tb2RlbC9BbnRNb2RlbENvbnRlbnRQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMmNkNjEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9tb2RlbC9BbnRNb2RlbENvbnRlbnRQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsODUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLm1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOworCisKK3B1YmxpYyBjbGFzcyBBbnRNb2RlbENvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyIHsKKworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0W10gRU1QVFlfQVJSQVk9IG5ldyBPYmplY3RbMF07CisJCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjZGlzcG9zZSgpCisJICovCisJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKwl9CisgICAgCisJLyoqCisJICogZG8gbm90aGluZworCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyI2lucHV0Q2hhbmdlZChWaWV3ZXIsIE9iamVjdCwgT2JqZWN0KQorCSAqLworCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgeworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjZ2V0Q2hpbGRyZW4oT2JqZWN0KQorCSAqLworCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50Tm9kZSkgeworCQlpZiAocGFyZW50Tm9kZSBpbnN0YW5jZW9mIEFudEVsZW1lbnROb2RlKSB7CisJCQlBbnRFbGVtZW50Tm9kZSBwYXJlbnRFbGVtZW50ID0gKEFudEVsZW1lbnROb2RlKXBhcmVudE5vZGU7CisJCQlpZiAocGFyZW50RWxlbWVudC5oYXNDaGlsZHJlbigpKSB7CisJCQkJTGlzdCBjaGlsZHJlbj0gcGFyZW50RWxlbWVudC5nZXRDaGlsZE5vZGVzKCk7CisJCQkJcmV0dXJuIGNoaWxkcmVuLnRvQXJyYXkoKTsKKwkJCX0gCisJCX0gZWxzZSBpZiAocGFyZW50Tm9kZSBpbnN0YW5jZW9mIElBbnRNb2RlbCkgeworCQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7KChJQW50TW9kZWwpcGFyZW50Tm9kZSkuZ2V0UHJvamVjdE5vZGUoKX07CisJCX0KKwkJcmV0dXJuIEVNUFRZX0FSUkFZOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjZ2V0UGFyZW50KE9iamVjdCkKKwkgKi8KKwlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgYU5vZGUpIHsKKwkJQW50RWxlbWVudE5vZGUgdGVtcEVsZW1lbnQgPSAoQW50RWxlbWVudE5vZGUpYU5vZGU7CisJCXJldHVybiB0ZW1wRWxlbWVudC5nZXRQYXJlbnROb2RlKCk7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlciNoYXNDaGlsZHJlbihPYmplY3QpCisJICovCisJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGFOb2RlKSB7CisJCXJldHVybiAoKEFudEVsZW1lbnROb2RlKWFOb2RlKS5oYXNDaGlsZHJlbigpOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIjZ2V0RWxlbWVudHMoT2JqZWN0KQorCSAqLworCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7CisJCWlmIChpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBJQW50TW9kZWwgKSB7CisJCSAgICBBbnRQcm9qZWN0Tm9kZSBwcm9qZWN0Tm9kZT0gKChJQW50TW9kZWwpIGlucHV0RWxlbWVudCkuZ2V0UHJvamVjdE5vZGUoKTsKKwkJICAgIGlmIChwcm9qZWN0Tm9kZSA9PSBudWxsKSB7CisJCQkJcmV0dXJuIG5ldyBBbnRFbGVtZW50Tm9kZVswXTsKKwkJCX0gCisJCQkKKwkJCXJldHVybiBuZXcgT2JqZWN0W10ge3Byb2plY3ROb2RlfTsgCisJCX0KKwkJCisJCWlmIChpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBPYmplY3RbXSkgeworCQkJcmV0dXJuIChPYmplY3RbXSlpbnB1dEVsZW1lbnQ7CisJCX0KKwkJcmV0dXJuIEVNUFRZX0FSUkFZOworCX0KK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL21vZGVsL0FudE1vZGVsQ29yZS5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvbW9kZWwvQW50TW9kZWxDb3JlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJiN2U4MgotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL21vZGVsL0FudE1vZGVsQ29yZS5qYXZhCkBAIC0wLDAgKzEsMTE1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLm1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwubGF1bmNoaW5nLmRlYnVnLm1vZGVsLkFudExpbmVCcmVha3BvaW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5sYXVuY2hpbmcuZGVidWcubW9kZWwuRGVidWdNb2RlbE1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5BbnRVSVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXJEZWx0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JQnJlYWtwb2ludHNMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklCcmVha3BvaW50OworCitpbXBvcnQgY29tLmlibS5pY3UudGV4dC5NZXNzYWdlRm9ybWF0OworCitwdWJsaWMgY2xhc3MgQW50TW9kZWxDb3JlIGltcGxlbWVudHMgSUJyZWFrcG9pbnRzTGlzdGVuZXIgeworCQorCXByaXZhdGUgc3RhdGljIEFudE1vZGVsQ29yZSBpbnN0OworCQorCXB1YmxpYyBzdGF0aWMgQW50TW9kZWxDb3JlIGdldERlZmF1bHQoKSB7CisJCWlmIChpbnN0ID09IG51bGwpIHsKKwkJCWluc3Q9IG5ldyBBbnRNb2RlbENvcmUoKTsKKwkJfQorCQkJCisJCXJldHVybiBpbnN0OworCX0KKwkKKwlwcml2YXRlIExpc3QgZk1vZGVsQ2hhbmdlTGlzdGVuZXJzPSBuZXcgQXJyYXlMaXN0KCk7CisJCisJcHJpdmF0ZSBBbnRNb2RlbENvcmUoKSB7IH0KKworCXB1YmxpYyB2b2lkIGFkZEFudE1vZGVsTGlzdGVuZXIoSUFudE1vZGVsTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJc3luY2hyb25pemVkIChmTW9kZWxDaGFuZ2VMaXN0ZW5lcnMpIHsKKwkJCWZNb2RlbENoYW5nZUxpc3RlbmVycy5hZGQobGlzdGVuZXIpOworCQl9CisJfQorCQorCXB1YmxpYyB2b2lkIHJlbW92ZUFudE1vZGVsTGlzdGVuZXIoSUFudE1vZGVsTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJc3luY2hyb25pemVkIChmTW9kZWxDaGFuZ2VMaXN0ZW5lcnMpIHsKKwkJCWZNb2RlbENoYW5nZUxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOworCQl9CisJfQorCQorCXB1YmxpYyB2b2lkIG5vdGlmeUFudE1vZGVsTGlzdGVuZXJzKEFudE1vZGVsQ2hhbmdlRXZlbnQgZXZlbnQpIHsKKwkJSXRlcmF0b3IgaTsKKwkJc3luY2hyb25pemVkIChmTW9kZWxDaGFuZ2VMaXN0ZW5lcnMpIHsKKwkJCWk9IG5ldyBBcnJheUxpc3QoZk1vZGVsQ2hhbmdlTGlzdGVuZXJzKS5pdGVyYXRvcigpOworCQl9CisJCXdoaWxlIChpLmhhc05leHQoKSkgeworCQkJKChJQW50TW9kZWxMaXN0ZW5lcilpLm5leHQoKSkuYW50TW9kZWxDaGFuZ2VkKGV2ZW50KTsKKwkJfQorCX0KKyAgICAKKyAgICAvKioKKyAgICAgKiBVcGRhdGVzIG1lc3NhZ2UgYXR0cmlidXRlcyBvbiBhbnkgQW50IGxpbmUgYnJlYWtwb2ludHMgaWYgdGhlcmUgYXJlIGFjdGl2ZSBBbnQgZWRpdG9ycworICAgICAqIHdpdGggQW50IG1vZGVscworICAgICAqIAorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JQnJlYWtwb2ludHNMaXN0ZW5lciNicmVha3BvaW50c0FkZGVkKG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSUJyZWFrcG9pbnRbXSkKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgdXBkYXRlQnJlYWtwb2ludE1lc3NhZ2VzKGZpbmFsIElCcmVha3BvaW50W10gYnJlYWtwb2ludHMpIHsKKyAgICAgICAgSVdvcmtzcGFjZVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJyZWFrcG9pbnRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIElCcmVha3BvaW50IGJyZWFrcG9pbnQ9IGJyZWFrcG9pbnRzW2ldOworICAgICAgICAgICAgICAgICAgICBpZiAoYnJlYWtwb2ludCBpbnN0YW5jZW9mIEFudExpbmVCcmVha3BvaW50KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBJTWFya2VyIG1hcmtlciA9IGJyZWFrcG9pbnQuZ2V0TWFya2VyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFya2VyLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAJaW50IGxpbmVOdW1iZXI9IG1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5MSU5FX05VTUJFUiwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAJbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UsIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KERlYnVnTW9kZWxNZXNzYWdlcy5BbnRMaW5lQnJlYWtwb2ludF8wLCBuZXcgU3RyaW5nW10ge0ludGVnZXIudG9TdHJpbmcobGluZU51bWJlcil9KSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucnVuKHJ1bm5hYmxlLCBudWxsLCAwLCBudWxsKTsKKyAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBBbnRVSVBsdWdpbi5sb2coZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBicmVha3BvaW50c0FkZGVkKElCcmVha3BvaW50W10gYnJlYWtwb2ludHMpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBicmVha3BvaW50c1JlbW92ZWQoSUJyZWFrcG9pbnRbXSBicmVha3BvaW50cywgSU1hcmtlckRlbHRhW10gZGVsdGFzKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYnJlYWtwb2ludHNDaGFuZ2VkKElCcmVha3BvaW50W10gYnJlYWtwb2ludHMsIElNYXJrZXJEZWx0YVtdIGRlbHRhcykgeworICAgICAgICB1cGRhdGVCcmVha3BvaW50TWVzc2FnZXMoYnJlYWtwb2ludHMpOyAgICAgICAgCisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RvcEJyZWFrcG9pbnRMaXN0ZW5pbmcoKSB7CisgICAgICAgIERlYnVnUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCcmVha3BvaW50TWFuYWdlcigpLnJlbW92ZUJyZWFrcG9pbnRMaXN0ZW5lcih0aGlzKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc3RhcnRCcmVha3BvaW50TGlzdGVuaW5nKCkgeworICAgICAgICBEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnJlYWtwb2ludE1hbmFnZXIoKS5hZGRCcmVha3BvaW50TGlzdGVuZXIodGhpcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvbW9kZWwvQW50TW9kZWxMYWJlbFByb3ZpZGVyLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9tb2RlbC9BbnRNb2RlbExhYmVsUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjQxYWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvbW9kZWwvQW50TW9kZWxMYWJlbFByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw1MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkubW9kZWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb2xvclByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKKworCitwdWJsaWMgY2xhc3MgQW50TW9kZWxMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElDb2xvclByb3ZpZGVyIHsKKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIjZ2V0SW1hZ2UoT2JqZWN0KQorCSAqLworCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgYW5FbGVtZW50KSB7CisJCUFudEVsZW1lbnROb2RlIG5vZGUgPSAoQW50RWxlbWVudE5vZGUpYW5FbGVtZW50OworCQlyZXR1cm4gbm9kZS5nZXRJbWFnZSgpOworCX0KKyAgICAKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyI2dldFRleHQoT2JqZWN0KQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgbm9kZSkgeworCQlBbnRFbGVtZW50Tm9kZSBlbGVtZW50PSAoQW50RWxlbWVudE5vZGUpIG5vZGU7CisJCXJldHVybiBlbGVtZW50LmdldExhYmVsKCk7CisJfQorCisJcHVibGljIENvbG9yIGdldEZvcmVncm91bmQoT2JqZWN0IG5vZGUpIHsKKwkJaWYgKG5vZGUgaW5zdGFuY2VvZiBBbnRUYXJnZXROb2RlICYmICgoQW50VGFyZ2V0Tm9kZSlub2RlKS5pc0RlZmF1bHRUYXJnZXQoKSApIHsKKwkJCXJldHVybiBEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxVRSk7CisJCX0KKwkJCisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyBDb2xvciBnZXRCYWNrZ3JvdW5kKE9iamVjdCBlbGVtZW50KSB7CisJCXJldHVybiBudWxsOworCX0KK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL21vZGVsL0FudE1vZGVsTWVzc2FnZXMuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL21vZGVsL0FudE1vZGVsTWVzc2FnZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGRiNWJjCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvbW9kZWwvQW50TW9kZWxNZXNzYWdlcy5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKKyAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKKyAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcworICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczogCisgKiBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkubW9kZWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworCitwdWJsaWMgY2xhc3MgQW50TW9kZWxNZXNzYWdlcyBleHRlbmRzIE5MUyB7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5tb2RlbC5BbnRNb2RlbE1lc3NhZ2VzIjsvLyROT04tTkxTLTEkCisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRUYXJnZXROb2RlXzI7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQW50SW1wb3J0Tm9kZV8wOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudFRhc2tOb2RlXzA7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQW50RWxlbWVudE5vZGVfOTsKKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudE1vZGVsXzE7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQW50TW9kZWxfNDM7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQW50TW9kZWxfNDQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQW50UHJvamVjdE5vZGVQcm94eV8wOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudFByb2plY3ROb2RlUHJveHlfMTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnREZWZpbmluZ1Rhc2tOb2RlXzA7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQW50RGVmaW5pbmdUYXNrTm9kZV8xOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudFByb2plY3ROb2RlXzA7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQW50UHJvcGVydHlOb2RlXzA7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQW50UHJvcGVydHlOb2RlXzE7CisKKwlzdGF0aWMgeworCQkvLyBsb2FkIG1lc3NhZ2UgdmFsdWVzIGZyb20gYnVuZGxlIGZpbGUKKwkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgQW50TW9kZWxNZXNzYWdlcy5jbGFzcyk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL21vZGVsL0FudE1vZGVsTWVzc2FnZXMucHJvcGVydGllcyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL21vZGVsL0FudE1vZGVsTWVzc2FnZXMucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODMzMGM2Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvbW9kZWwvQW50TW9kZWxNZXNzYWdlcy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMjYgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisjIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorIworIyBDb250cmlidXRvcnM6CisjICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworQW50VGFyZ2V0Tm9kZV8yPVwgW2RlZmF1bHRdCitBbnRJbXBvcnROb2RlXzA9U2VjdXJpdHkgZXhjZXB0aW9uIGR1cmluZyBpbXBvcnQKK0FudFRhc2tOb2RlXzA9U2VjdXJpdHkgcHJvYmxlbSBjb25maWd1cmluZyB0YXNrCitBbnRFbGVtZW50Tm9kZV85PVwgW2Zyb20gezB9XQorCitBbnRNb2RlbF8xPVwgbGluZToKK0FudE1vZGVsXzQzPURlZmF1bHQgdGFyZ2V0IHswfSBkb2VzIG5vdCBleGlzdCBpbiB0aGlzIHByb2plY3QKK0FudE1vZGVsXzQ0PVRhcmdldCB7MH0gZG9lcyBub3QgZXhpc3QgaW4gdGhpcyBwcm9qZWN0CitBbnRQcm9qZWN0Tm9kZVByb3h5XzA9QnVpbGRmaWxlIG5vdCBmb3VuZAorQW50UHJvamVjdE5vZGVQcm94eV8xPU5vIHRhcmdldHMgY291bGQgYmUgZGV0ZXJtaW5lZAorQW50RGVmaW5pbmdUYXNrTm9kZV8wPVRhc2sgY291bGQgbm90IGJlIGRlZmluZWQgd2l0aGluIHRoZSBBbnQgRWRpdG9yIGNvbnRleHQKK0FudERlZmluaW5nVGFza05vZGVfMT1TZWN1cml0eSBleGNlcHRpb24gYXR0ZW1wdGluZyB0byBkZWZpbmUgdHlwZQorQW50UHJvamVjdE5vZGVfMD08VW5hYmxlIHRvIHBhcnNlIGFzIGFuIEFudCBidWlsZGZpbGU+CitBbnRQcm9wZXJ0eU5vZGVfMD1Qcm9wZXJ0eSBjb3VsZCBub3QgYmUgc2V0IHdpdGhpbiB0aGUgQW50IEVkaXRvciBjb250ZXh0CitBbnRQcm9wZXJ0eU5vZGVfMT1TZWN1cml0eSBleGNlcHRpb24gYXR0ZW1wdGluZyB0byBzZXQgcHJvcGVydHkKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL21vZGVsL0FudE1vZGVsUHJvYmxlbS5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvbW9kZWwvQW50TW9kZWxQcm9ibGVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVmMzFmZAotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL21vZGVsL0FudE1vZGVsUHJvYmxlbS5qYXZhCkBAIC0wLDAgKzEsMTQ4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLm1vZGVsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLkFudFVJUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5BbnRFZGl0b3JQcmVmZXJlbmNlQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKKworcHVibGljIGNsYXNzIEFudE1vZGVsUHJvYmxlbSBleHRlbmRzIFJlZ2lvbiBpbXBsZW1lbnRzIElQcm9ibGVtIHsKKwkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT19QUk9CTEVNPSAtMTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVZFUklUWV9XQVJOSU5HPSAwOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFVkVSSVRZX0VSUk9SPSAxOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFVkVSSVRZX0ZBVEFMX0VSUk9SPSAyOworCQorCXByaXZhdGUgU3RyaW5nIGZNZXNzYWdlOworCXByaXZhdGUgU3RyaW5nIGZFc2NhcGVkTWVzc2FnZTsKKwlwcml2YXRlIGludCBmU2V2ZXJpdHk7CisJcHJpdmF0ZSBpbnQgZkFkanVzdGVkTGVuZ3RoPSAtMTsKKwlwcml2YXRlIGludCBmTGluZU51bWJlcj0gLTE7CisJCisJcHVibGljIEFudE1vZGVsUHJvYmxlbShTdHJpbmcgbWVzc2FnZSwgaW50IHNldmVyaXR5LCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBpbnQgbGluZU51bWJlcikgeworCQlzdXBlcihvZmZzZXQsIGxlbmd0aCk7CisJCWZNZXNzYWdlPSBtZXNzYWdlOworCQlmRXNjYXBlZE1lc3NhZ2U9IGdldEVzY2FwZWQobWVzc2FnZSk7CisJCWZTZXZlcml0eT0gc2V2ZXJpdHk7CisJCWZMaW5lTnVtYmVyPSBsaW5lTnVtYmVyOworCX0KKwkKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLm91dGxpbmUuSVByb2JsZW0jZ2V0TWVzc2FnZSgpCisJICovCisJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgeworCQlyZXR1cm4gZkVzY2FwZWRNZXNzYWdlOworCX0KKwkKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLm91dGxpbmUuSVByb2JsZW0jaXNFcnJvcigpCisJICovCisJcHVibGljIGJvb2xlYW4gaXNFcnJvcigpIHsKKwkJcmV0dXJuIGZTZXZlcml0eSA9PSBTRVZFUklUWV9FUlJPUiB8fCBmU2V2ZXJpdHkgPT0gU0VWRVJJVFlfRkFUQUxfRVJST1I7CisJfQorCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3Iub3V0bGluZS5JUHJvYmxlbSNpc1dhcm5pbmcoKQorCSAqLworCXB1YmxpYyBib29sZWFuIGlzV2FybmluZygpIHsKKwkJcmV0dXJuIGZTZXZlcml0eSA9PSBTRVZFUklUWV9XQVJOSU5HOworCX0KKwkKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb24jZ2V0TGVuZ3RoKCkKKwkgKi8KKwlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKKwkJaWYgKGZBZGp1c3RlZExlbmd0aCAhPSAtMSkgeworCQkJcmV0dXJuIGZBZGp1c3RlZExlbmd0aDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZ2V0TGVuZ3RoKCk7CisJfQorCQorCS8qKgorCSAqIFNldHMgdGhlIGxlbmd0aCBmb3IgdGhpcyBwcm9ibGVtLgorCSAqLworCXB1YmxpYyB2b2lkIHNldExlbmd0aChpbnQgYWRqdXN0ZWRMZW5ndGgpIHsKKwkJZkFkanVzdGVkTGVuZ3RoPSBhZGp1c3RlZExlbmd0aDsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLm91dGxpbmUuSVByb2JsZW0jZ2V0TGluZU51bWJlcigpCisJICovCisJcHVibGljIGludCBnZXRMaW5lTnVtYmVyKCkgeworCQlyZXR1cm4gZkxpbmVOdW1iZXI7CisJfQorCQorCXByaXZhdGUgdm9pZCBhcHBlbmRFc2NhcGVkQ2hhcihTdHJpbmdCdWZmZXIgYnVmZmVyLCBjaGFyIGMpIHsKKwkJU3RyaW5nIHJlcGxhY2VtZW50PSBnZXRSZXBsYWNlbWVudChjKTsKKwkJaWYgKHJlcGxhY2VtZW50ICE9IG51bGwpIHsKKwkJCWJ1ZmZlci5hcHBlbmQocmVwbGFjZW1lbnQpOworCQl9IGVsc2UgeworCQkJYnVmZmVyLmFwcGVuZChjKTsKKwkJfQorCX0KKwkKKwlwcml2YXRlIFN0cmluZyBnZXRFc2NhcGVkKFN0cmluZyBzKSB7CisJCVN0cmluZ0J1ZmZlciByZXN1bHQ9IG5ldyBTdHJpbmdCdWZmZXIocy5sZW5ndGgoKSArIDEwKTsKKwkJZm9yIChpbnQgaT0gMDsgaSA8IHMubGVuZ3RoKCk7ICsraSkgeworCQkJYXBwZW5kRXNjYXBlZENoYXIocmVzdWx0LCBzLmNoYXJBdChpKSk7CisJCX0KKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKwkKKwlwcml2YXRlIFN0cmluZyBnZXRSZXBsYWNlbWVudChjaGFyIGMpIHsKKwkJLy8gRW5jb2RlIHNwZWNpYWwgY2hhcmFjdGVycyBpbnRvIHRoZSBlcXVpdmFsZW50IGNoYXJhY3RlciByZWZlcmVuY2VzLgorCQkvLyBFbnN1cmVzIHRoYXQgZXJyb3IgbWVzc2FnZXMgdGhhdCBpbmNsdWRlIHNwZWNpYWwgY2hhcmFjdGVycyBkbyBub3QgZ2V0CisJCS8vaW5jb3JyZWN0bHkgcmVwcmVzZW50ZWQgYXMgSFRNTCBpbiB0aGUgdGV4dCBob3ZlciAoYnVnIDU2MjU4KQorCQlzd2l0Y2ggKGMpIHsKKwkJCWNhc2UgJzwnIDoKKwkJCQlyZXR1cm4gIiZsdDsiOyAvLyROT04tTkxTLTEkCisJCQljYXNlICc+JyA6CisJCQkJcmV0dXJuICImZ3Q7IjsgLy8kTk9OLU5MUy0xJAorCQkJY2FzZSAnIicgOgorCQkJCXJldHVybiAiJnF1b3Q7IjsgLy8kTk9OLU5MUy0xJAorCQkJY2FzZSAnJicgOgorCQkJCXJldHVybiAiJmFtcDsiOyAvLyROT04tTkxTLTEkCisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3Iub3V0bGluZS5JUHJvYmxlbSNnZXRVbm1vZGlmaWVkTWVzc2FnZSgpCisJICovCisJcHVibGljIFN0cmluZyBnZXRVbm1vZGlmaWVkTWVzc2FnZSgpIHsKKwkJcmV0dXJuIGZNZXNzYWdlOworCX0KKwkKKwlwdWJsaWMgc3RhdGljIGludCBnZXRTZXZlcml0eShTdHJpbmcgcHJlZmVyZW5jZUtleSkgeworCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlPSBBbnRVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7CisJCVN0cmluZyBzZXZlcml0eUxldmVsPSBzdG9yZS5nZXRTdHJpbmcocHJlZmVyZW5jZUtleSk7CisJCWlmIChzZXZlcml0eUxldmVsLmxlbmd0aCgpID09IDAgfHwgc2V2ZXJpdHlMZXZlbC5lcXVhbHMoQW50RWRpdG9yUHJlZmVyZW5jZUNvbnN0YW50cy5CVUlMREZJTEVfRVJST1IpKSB7CisJCQlyZXR1cm4gU0VWRVJJVFlfRVJST1I7CisJCX0gZWxzZSBpZiAoc2V2ZXJpdHlMZXZlbC5lcXVhbHMoQW50RWRpdG9yUHJlZmVyZW5jZUNvbnN0YW50cy5CVUlMREZJTEVfV0FSTklORykpIHsKKwkJCXJldHVybiBTRVZFUklUWV9XQVJOSU5HOworCQl9IGVsc2UgeworCQkJcmV0dXJuIE5PX1BST0JMRU07CisJCX0KKwl9CisJCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKwkJYm9vbGVhbiBlcXVhbD0gc3VwZXIuZXF1YWxzKG8pOworCQlpZiAoZXF1YWwpIHsKKwkJCXJldHVybiAoKEFudE1vZGVsUHJvYmxlbSlvKS5nZXRVbm1vZGlmaWVkTWVzc2FnZSgpLmVxdWFscyhnZXRVbm1vZGlmaWVkTWVzc2FnZSgpKTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvbW9kZWwvQW50UHJvamVjdE5vZGVQcm94eS5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvbW9kZWwvQW50UHJvamVjdE5vZGVQcm94eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0NzUwMzMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9tb2RlbC9BbnRQcm9qZWN0Tm9kZVByb3h5LmphdmEKQEAgLTAsMCArMSwyNzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkubW9kZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuQW50VXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CisKKworcHVibGljIGNsYXNzIEFudFByb2plY3ROb2RlUHJveHkgZXh0ZW5kcyBBbnRQcm9qZWN0Tm9kZSB7CisJCisJcHJpdmF0ZSBTdHJpbmcgZkJ1aWxkRmlsZU5hbWU7CisJcHJpdmF0ZSBTdHJpbmcgZkRlZmF1bHRUYXJnZXROYW1lOworCXByaXZhdGUgYm9vbGVhbiBmUGFyc2VkPSBmYWxzZTsKKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgcHJvamVjdCBub2RlIHdpdGggdGhlIGdpdmVuIG5hbWUgYW5kIHRoZSBnaXZlbiBidWlsZCBmaWxlCisJICogbmFtZS4KKwkgKiAKKwkgKiBAcGFyYW0gbmFtZSB0aGUgcHJvamVjdCdzIG5hbWUgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHByb2plY3QncworCSAqIG5hbWUgaXMgbm90IGtub3duLiBJZiB0aGlzIHZhbHVlIGlzIDxjb2RlPm51bGw8L2NvZGU+LCB0aGUgZmlsZSB3aWxsIGJlCisJICogcGFyc2VkIHRoZSBmaXJzdCB0aW1lIGEgdmFsdWUgaXMgcmVxdWVzdGVkIHRoYXQgcmVxdWlyZXMgaXQuCisJICogQHBhcmFtIGJ1aWxkRmlsZU5hbWUKKwkgKi8KKwlwdWJsaWMgQW50UHJvamVjdE5vZGVQcm94eShTdHJpbmcgbmFtZSwgU3RyaW5nIGJ1aWxkRmlsZU5hbWUpIHsKKwkJc3VwZXIobnVsbCwgbnVsbCk7CisJCWZOYW1lPSBuYW1lOworCQlmQnVpbGRGaWxlTmFtZT0gYnVpbGRGaWxlTmFtZTsKKwl9CisJCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBwcm9qZWN0IG5vZGUgb24gdGhlIGdpdmVuIGJ1aWxkIGZpbGUuCisJICovCisJcHVibGljIEFudFByb2plY3ROb2RlUHJveHkoU3RyaW5nIGJ1aWxkRmlsZU5hbWUpIHsKKwkJdGhpcyhudWxsLCBidWlsZEZpbGVOYW1lKTsKKwl9CisJCisJcHVibGljIHZvaWQgcGFyc2VCdWlsZEZpbGUoYm9vbGVhbiBmb3JjZSkgeworCQlpZiAoZlBhcnNlZCAmJiAhZm9yY2UpIHsKKwkJCXJldHVybjsKKwkJfQorCQlmQ2hpbGROb2Rlcz0gbnVsbDsKKwkJZlBhcnNlZD0gdHJ1ZTsKKwkJQW50VGFyZ2V0Tm9kZVtdIG5vZGVzID0gbnVsbDsKKwkJSVBhdGggYnVpbGRGaWxlUGF0aD0gQW50VXRpbC5nZXRGaWxlKGdldEJ1aWxkRmlsZU5hbWUoKSkuZ2V0TG9jYXRpb24oKTsKKwkJaWYgKGJ1aWxkRmlsZVBhdGggPT0gbnVsbCkgeworCQkJc2V0UHJvYmxlbVNldmVyaXR5KEFudE1vZGVsUHJvYmxlbS5TRVZFUklUWV9FUlJPUik7CisJCQlzZXRQcm9ibGVtTWVzc2FnZShBbnRNb2RlbE1lc3NhZ2VzLkFudFByb2plY3ROb2RlUHJveHlfMCk7CisJCQlyZXR1cm47CisJCX0KKwkJbm9kZXMgPSBBbnRVdGlsLmdldFRhcmdldHMoYnVpbGRGaWxlUGF0aC50b1N0cmluZygpKTsKKwkJCisJCWlmIChub2RlcyA9PSBudWxsIHx8IG5vZGVzLmxlbmd0aCA8IDEpIHsKKwkJCXNldFByb2JsZW1TZXZlcml0eShBbnRNb2RlbFByb2JsZW0uU0VWRVJJVFlfRVJST1IpOworCQkJc2V0UHJvYmxlbU1lc3NhZ2UoQW50TW9kZWxNZXNzYWdlcy5BbnRQcm9qZWN0Tm9kZVByb3h5XzEpOworCQkJcmV0dXJuOworCQl9CisJCQorCQlBbnRQcm9qZWN0Tm9kZSBwcm9qZWN0Tm9kZSA9IG5vZGVzWzBdLmdldFByb2plY3ROb2RlKCk7CisgICAgICAgIGlmIChub2Rlc1swXS5nZXRUYXJnZXROYW1lKCkubGVuZ3RoKCkgIT0gMCkgeworICAgICAgICAgICAgLy9ub3QganVzdCB0aGUgaW1wbGljaXQgdGFyZ2V0CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgYWRkQ2hpbGROb2RlKG5vZGVzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCQkKKwkJZk1vZGVsPSBwcm9qZWN0Tm9kZS5nZXRBbnRNb2RlbCgpOworCQlmUHJvamVjdD0gKEFudE1vZGVsUHJvamVjdClwcm9qZWN0Tm9kZS5nZXRQcm9qZWN0KCk7CisJCWZMYWJlbD0gbnVsbDsKKwkJZk5hbWU9IG51bGw7CisJfQorCQorCXB1YmxpYyB2b2lkIHBhcnNlQnVpbGRGaWxlKCkgeworCQlwYXJzZUJ1aWxkRmlsZShmYWxzZSk7CisJfQorCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5tb2RlbC5BbnRQcm9qZWN0Tm9kZSNnZXREZXNjcmlwdGlvbigpCisJICovCisJcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKwkJaWYgKGZQcm9qZWN0ICE9IG51bGwpIHsKKwkJCXJldHVybiBzdXBlci5nZXREZXNjcmlwdGlvbigpOworCQl9CisJCXJldHVybiBudWxsOworCX0KKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkubW9kZWwuQW50RWxlbWVudE5vZGUjZ2V0TGFiZWwoKQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7CisJICAgIGlmIChmTmFtZSAhPSBudWxsKSB7CisJICAgICAgICByZXR1cm4gZk5hbWU7CisJICAgIH0KKwkJaWYgKGZQcm9qZWN0ID09IG51bGwpIHsKKwkJCXBhcnNlQnVpbGRGaWxlKCk7CisJCX0KKwkJU3RyaW5nQnVmZmVyIG5hbWU9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIuZ2V0TGFiZWwoKSk7CisJCUFudFByb2plY3ROb2RlIHJlYWxOb2RlPSBnZXRSZWFsTm9kZSgpOworCQlpZiAocmVhbE5vZGUgIT0gbnVsbCAmJiByZWFsTm9kZS5nZXRQcm9ibGVtTWVzc2FnZSgpICE9IG51bGwpIHsKKwkJCW5hbWUuYXBwZW5kKCIgPCIpOyAvLyROT04tTkxTLTEkCisJCQluYW1lLmFwcGVuZChnZXRSZWFsTm9kZSgpLmdldFByb2JsZW1NZXNzYWdlKCkpOworCQkJbmFtZS5hcHBlbmQoJz4nKTsKKwkJfQorCQlmTmFtZT0gbmFtZS50b1N0cmluZygpOworCQlyZXR1cm4gZk5hbWU7CisJfQorCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5tb2RlbC5BbnRFbGVtZW50Tm9kZSNnZXRDaGlsZE5vZGVzKCkKKwkgKi8KKwlwdWJsaWMgTGlzdCBnZXRDaGlsZE5vZGVzKCkgeworCQlpZiAoZlByb2plY3QgPT0gbnVsbCkgeworCQkJcGFyc2VCdWlsZEZpbGUoKTsKKwkJfQorCQlMaXN0IGNoaWxkcmVuPSBzdXBlci5nZXRDaGlsZE5vZGVzKCk7CisJCWlmIChjaGlsZHJlbiA9PSBudWxsKSB7CisJCSAgICByZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKKwkJfQorCQlyZXR1cm4gY2hpbGRyZW47CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0QnVpbGRGaWxlTmFtZSgpIHsKKwkJcmV0dXJuIGZCdWlsZEZpbGVOYW1lOworCX0KKworCXB1YmxpYyB2b2lkIHNldERlZmF1bHRUYXJnZXROYW1lKFN0cmluZyBkZWZhdWx0VGFyZ2V0KSB7CisJCWZEZWZhdWx0VGFyZ2V0TmFtZT0gZGVmYXVsdFRhcmdldDsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXREZWZhdWx0VGFyZ2V0TmFtZSgpIHsKKwkJaWYgKGZQcm9qZWN0ID09IG51bGwpIHsKKwkJCXJldHVybiBmRGVmYXVsdFRhcmdldE5hbWU7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmdldERlZmF1bHRUYXJnZXROYW1lKCk7CisJfQorCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5tb2RlbC5BbnRFbGVtZW50Tm9kZSNoYXNDaGlsZHJlbigpCisJICovCisJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oKSB7CisJCXJldHVybiB0cnVlOworCX0KKyAgICAKKyAgICAvKiAobm9uLUphdmFkb2MpCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkubW9kZWwuQW50RWxlbWVudE5vZGUjZGlzcG9zZSgpCisgICAgICovCisgICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKyAgICAgICAgaWYgKGZQcm9qZWN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHN1cGVyLmRpc3Bvc2UoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKiAobm9uLUphdmFkb2MpCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkubW9kZWwuQW50RWxlbWVudE5vZGUjaXNFcnJvck5vZGUoKQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRXJyb3JOb2RlKCkgeworICAgICAgICBpZiAoZlByb2plY3QgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmlzRXJyb3JOb2RlKCk7CisgICAgICAgIH0gCisgICAgICAgIHJldHVybiBnZXRSZWFsTm9kZSgpLmlzRXJyb3JOb2RlKCk7CisgICAgfQorICAgIAorICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5tb2RlbC5BbnRFbGVtZW50Tm9kZSNnZXRQcm9ibGVtTWVzc2FnZSgpCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRQcm9ibGVtTWVzc2FnZSgpIHsKKwkJaWYgKGlzRXJyb3JOb2RlKCkpIHsKKwkJCXJldHVybiBnZXRCdWlsZEZpbGVOYW1lKCk7CisJCX0KKyAgICAJcmV0dXJuIG51bGw7CisgICAgfQorICAgIAorICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5tb2RlbC5BbnRFbGVtZW50Tm9kZSNpc1dhcm5pbmdOb2RlKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1dhcm5pbmdOb2RlKCkgeworICAgICAgICBpZiAoZlByb2plY3QgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmlzV2FybmluZ05vZGUoKTsKKyAgICAgICAgfSAKKyAgICAgICAgcmV0dXJuIGdldFJlYWxOb2RlKCkuaXNXYXJuaW5nTm9kZSgpOworICAgIH0KKyAgICAKKwlwcml2YXRlIEFudFByb2plY3ROb2RlIGdldFJlYWxOb2RlKCkgeworCQlpZiAoZk1vZGVsICE9IG51bGwpIHsKKwkJCXJldHVybiBmTW9kZWwuZ2V0UHJvamVjdE5vZGUoKTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkubW9kZWwuQW50RWxlbWVudE5vZGUjZ2V0QW50TW9kZWwoKQorCSAqLworCXByb3RlY3RlZCBJQW50TW9kZWwgZ2V0QW50TW9kZWwoKSB7CisJCWlmIChmUHJvamVjdCA9PSBudWxsKSB7CisJCQlwYXJzZUJ1aWxkRmlsZSgpOworCQl9CisJCXJldHVybiBzdXBlci5nZXRBbnRNb2RlbCgpOworCX0KKwkKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkubW9kZWwuQW50RWxlbWVudE5vZGUjZ2V0TGVuZ3RoKCkKKwkgKi8KKwlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKKwkJaWYgKGZQcm9qZWN0ID09IG51bGwpIHsKKwkJCXBhcnNlQnVpbGRGaWxlKCk7CisJCX0KKwkJQW50UHJvamVjdE5vZGUgcmVhbE5vZGU9IGdldFJlYWxOb2RlKCk7CisJCWlmIChyZWFsTm9kZSA9PSBudWxsKSB7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJcmV0dXJuIHJlYWxOb2RlLmdldExlbmd0aCgpOworCX0KKwkKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkubW9kZWwuQW50RWxlbWVudE5vZGUjZ2V0T2Zmc2V0KCkKKwkgKi8KKwlwdWJsaWMgaW50IGdldE9mZnNldCgpIHsKKwkJaWYgKGZQcm9qZWN0ID09IG51bGwpIHsKKwkJCXBhcnNlQnVpbGRGaWxlKCk7CisJCX0KKwkJQW50UHJvamVjdE5vZGUgcmVhbE5vZGU9IGdldFJlYWxOb2RlKCk7CisJCWlmIChyZWFsTm9kZSA9PSBudWxsKSB7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJcmV0dXJuIHJlYWxOb2RlLmdldE9mZnNldCgpOworCX0KKwkKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkubW9kZWwuQW50RWxlbWVudE5vZGUjZ2V0U2VsZWN0aW9uTGVuZ3RoKCkKKwkgKi8KKwlwdWJsaWMgaW50IGdldFNlbGVjdGlvbkxlbmd0aCgpIHsKKwkJaWYgKGZQcm9qZWN0ID09IG51bGwpIHsKKwkJCXBhcnNlQnVpbGRGaWxlKCk7CisJCX0KKwkJQW50UHJvamVjdE5vZGUgcmVhbE5vZGU9IGdldFJlYWxOb2RlKCk7CisJCWlmIChyZWFsTm9kZSA9PSBudWxsKSB7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJcmV0dXJuIHJlYWxOb2RlLmdldFNlbGVjdGlvbkxlbmd0aCgpOworCX0KKwkKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkubW9kZWwuQW50RWxlbWVudE5vZGUjZ2V0QnVpbGRGaWxlUmVzb3VyY2UoKQorCSAqLworCXB1YmxpYyBJRmlsZSBnZXRCdWlsZEZpbGVSZXNvdXJjZSgpIHsKKwkJaWYgKGZQcm9qZWN0ID09IG51bGwpIHsKKwkJCWlmIChmQnVpbGRGaWxlTmFtZSAhPSBudWxsKSB7CisJCQkJcmV0dXJuIEFudFV0aWwuZ2V0RmlsZShmQnVpbGRGaWxlTmFtZSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHN1cGVyLmdldEJ1aWxkRmlsZVJlc291cmNlKCk7CisJfQorCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQorCSAqLworCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBnZXRMYWJlbCgpOworCX0KK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL21vZGVsL0FudFRhc2tOb2RlLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9tb2RlbC9BbnRUYXNrTm9kZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2YjRkZjQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9tb2RlbC9BbnRUYXNrTm9kZS5qYXZhCkBAIC0wLDAgKzEsMjE4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkubW9kZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUnVudGltZUNvbmZpZ3VyYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5jb3JlLkFudFNlY3VyaXR5RXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5BbnRVSUltYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuSUFudFVJQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5BbnRFZGl0b3JQcmVmZXJlbmNlQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKKworCitwdWJsaWMgY2xhc3MgQW50VGFza05vZGUgZXh0ZW5kcyBBbnRFbGVtZW50Tm9kZSB7CisKKwlwcml2YXRlIFRhc2sgZlRhc2s9IG51bGw7CisJcHJvdGVjdGVkIFN0cmluZyBmQmFzZUxhYmVsPSBudWxsOworCXByb3RlY3RlZCBTdHJpbmcgZkxhYmVsOworCXByaXZhdGUgU3RyaW5nIGZJZD0gbnVsbDsKKwlwcm90ZWN0ZWQgYm9vbGVhbiBmQ29uZmlndXJlZD0gZmFsc2U7CisJCisJcHVibGljIEFudFRhc2tOb2RlKFRhc2sgdGFzaykgeworCQlzdXBlcih0YXNrLmdldFRhc2tOYW1lKCkpOworCQlmVGFzaz0gdGFzazsKKwl9CisJCisJcHVibGljIEFudFRhc2tOb2RlKFRhc2sgdGFzaywgU3RyaW5nIGxhYmVsKSB7CisJCXN1cGVyKHRhc2suZ2V0VGFza05hbWUoKSk7CisJCWZUYXNrPSB0YXNrOworCQlmQmFzZUxhYmVsPSBsYWJlbDsKKwl9CQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7CisJICAgIGlmIChmTGFiZWwgPT0gbnVsbCkgeworCQkJU3RyaW5nQnVmZmVyIGxhYmVsPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJCQlpZiAoZkJhc2VMYWJlbCAhPSBudWxsKSB7CisJCQkJbGFiZWwuYXBwZW5kKGZCYXNlTGFiZWwpOworCQkJfSBlbHNlIGlmIChmSWQgIT0gbnVsbCkgeworCQkJCWxhYmVsLmFwcGVuZChmSWQpOworCQkJfSBlbHNlIHsKKwkJCQlsYWJlbC5hcHBlbmQoZlRhc2suZ2V0VGFza05hbWUoKSk7CisJCQl9CisJCQlpZiAoaXNFeHRlcm5hbCgpKSB7CisJCQkJYXBwZW5kRW50aXR5TmFtZShsYWJlbCk7CisJCQl9CisJCQlmTGFiZWw9IGxhYmVsLnRvU3RyaW5nKCk7CisJICAgIH0KKwkgICAgcmV0dXJuIGZMYWJlbDsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0QmFzZUxhYmVsKFN0cmluZyBsYWJlbCkgeworCQlmQmFzZUxhYmVsPSBsYWJlbDsKKwl9CisJCisJcHVibGljIFRhc2sgZ2V0VGFzaygpIHsKKwkJcmV0dXJuIGZUYXNrOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRUYXNrKFRhc2sgdGFzaykgeworCQlmVGFzaz0gdGFzazsKKwl9CisJCisJcHJvdGVjdGVkIEltYWdlRGVzY3JpcHRvciBnZXRCYXNlSW1hZ2VEZXNjcmlwdG9yKCkgeworCQlpZiAoZklkICE9IG51bGwpIHsKKwkJCXJldHVybiBBbnRVSUltYWdlcy5nZXRJbWFnZURlc2NyaXB0b3IoSUFudFVJQ29uc3RhbnRzLklNR19BTlRfVFlQRSk7CisJCX0KKwkJCisJCXJldHVybiBzdXBlci5nZXRCYXNlSW1hZ2VEZXNjcmlwdG9yKCk7CisJfQorCisJLyoqCisJICogVGhlIHJlZmVyZW5jZSBpZCBmb3IgdGhpcyB0YXNrCisJICogQHBhcmFtIGlkIFRoZSByZWZlcmVuY2UgaWQgZm9yIHRoaXMgdGFzaworCSAqLworCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBpZCkgeworCQlmSWQ9IGlkOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZWZlcmVuY2UgaWQgZm9yIHRoaXMgdGFzayBvciA8Y29kZT5udWxsPC9jb2RlPgorCSAqIGlmIGl0IGhhcyBubyByZWZlcmVuY2UgaWQuCisJICogQHJldHVybiBUaGUgcmVmZXJlbmNlIGlkIGZvciB0aGlzIHRhc2sKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldElkKCkgeworCQlyZXR1cm4gZklkOworCX0KKwkKKwkvKioKKwkgKiBDb25maWd1cmVzIHRoZSBhc3NvY2lhdGVkIHRhc2sgaWYgcmVxdWlyZWQuCisJICogQWxsb3dzIHN1YmNsYXNzZXMgdG8gZG8gc3BlY2lmaWMgY29uZmlndXJhdGlvbiAoc3VjaCBhcyBleGVjdXRpbmcgdGhlIHRhc2spIGJ5CisJICogY2FsbGluZyA8Y29kZT5ub2RlU3BlY2lmaWNDb25maWd1cmU8L2NvZGU+CisJICogCisJICogQHJldHVybiB3aGV0aGVyIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoaXMgbm9kZSBjb3VsZCBoYXZlIGltcGFjdCBvbiBvdGhlciBub2RlcworCSAqLworCXB1YmxpYyBib29sZWFuIGNvbmZpZ3VyZShib29sZWFuIHZhbGlkYXRlRnVsbHkpIHsKKwkJaWYgKGdldElkKCkgIT0gbnVsbCkgeworCQkJLy9lbnN1cmUgdGhhdCByZWZlcmVuY2VzIGFyZSBzZXQuLi5uZXcgZm9yIEFudCAxLjcKKwkJCXRyeSB7CisJCQkJZ2V0UHJvamVjdE5vZGUoKS5nZXRQcm9qZWN0KCkuZ2V0UmVmZXJlbmNlKGdldElkKCkpOworCQkJfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZSkgeworCQkJCWhhbmRsZUJ1aWxkRXhjZXB0aW9uKGUsIEFudEVkaXRvclByZWZlcmVuY2VDb25zdGFudHMuUFJPQkxFTV9UQVNLUyk7CisJCQl9CisJCX0gCisJCWlmICghdmFsaWRhdGVGdWxseSB8fCAoZ2V0UGFyZW50Tm9kZSgpIGluc3RhbmNlb2YgQW50VGFza05vZGUpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJaWYgKGZDb25maWd1cmVkKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJaW50IHNldmVyaXR5PSBBbnRNb2RlbFByb2JsZW0uZ2V0U2V2ZXJpdHkoQW50RWRpdG9yUHJlZmVyZW5jZUNvbnN0YW50cy5QUk9CTEVNX1RBU0tTKTsKKwkJaWYgKHNldmVyaXR5ICE9IEFudE1vZGVsUHJvYmxlbS5OT19QUk9CTEVNKSB7CisJCSAgICAvL29ubHkgY29uZmlndXJlIGlmIHRoZSB1c2VyIGNhcmVzIGFib3V0IHRoZSBwcm9ibGVtcworCQkJdHJ5IHsKKwkJCQlnZXRUYXNrKCkubWF5YmVDb25maWd1cmUoKTsKKwkJCQlmQ29uZmlndXJlZD0gdHJ1ZTsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7CisJCQkJaGFuZGxlQnVpbGRFeGNlcHRpb24oYmUsIEFudEVkaXRvclByZWZlcmVuY2VDb25zdGFudHMuUFJPQkxFTV9UQVNLUyk7CisJCQl9IGNhdGNoIChBbnRTZWN1cml0eUV4Y2VwdGlvbiBzZSkgeworCQkJCS8vZWl0aGVyIGEgc3lzdGVtIGV4aXQgb3Igc2V0dGluZyBvZiBzeXN0ZW0gcHJvcGVydHkgd2FzIGF0dGVtcHRlZAorCQkJCWhhbmRsZUJ1aWxkRXhjZXB0aW9uKG5ldyBCdWlsZEV4Y2VwdGlvbihBbnRNb2RlbE1lc3NhZ2VzLkFudFRhc2tOb2RlXzApLCBBbnRFZGl0b3JQcmVmZXJlbmNlQ29uc3RhbnRzLlBST0JMRU1fU0VDVVJJVFkpOworCQkJfQorCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVCdWlsZEV4Y2VwdGlvbihCdWlsZEV4Y2VwdGlvbiBiZSwgU3RyaW5nIHByZWZlcmVuY2VLZXkpIHsKKwkJaW50IHNldmVyaXR5PSBBbnRNb2RlbFByb2JsZW0uZ2V0U2V2ZXJpdHkocHJlZmVyZW5jZUtleSk7CisJCWlmIChzZXZlcml0eSAhPSBBbnRNb2RlbFByb2JsZW0uTk9fUFJPQkxFTSkgeworCQkJZ2V0QW50TW9kZWwoKS5oYW5kbGVCdWlsZEV4Y2VwdGlvbihiZSwgdGhpcywgc2V2ZXJpdHkpOworCQl9CisJfQorCQorCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zT2NjdXJyZW5jZShTdHJpbmcgaWRlbnRpZmllcikgeworCQlSdW50aW1lQ29uZmlndXJhYmxlIHdyYXBwZXI9IGdldFRhc2soKS5nZXRSdW50aW1lQ29uZmlndXJhYmxlV3JhcHBlcigpOworCQlNYXAgYXR0cmlidXRlTWFwPSB3cmFwcGVyLmdldEF0dHJpYnV0ZU1hcCgpOworCQlTZXQga2V5cz0gYXR0cmlidXRlTWFwLmtleVNldCgpOworICAgICAgICBib29sZWFuIGxvb2tpbmdGb3JQcm9wZXJ0eT0gaWRlbnRpZmllci5zdGFydHNXaXRoKCIkeyIpICYmIGlkZW50aWZpZXIuZW5kc1dpdGgoIn0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCWZvciAoSXRlcmF0b3IgaXRlciA9IGtleXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7ICkgeworCQkJU3RyaW5nIGtleT0gKFN0cmluZykgaXRlci5uZXh0KCk7CisJCQlTdHJpbmcgdmFsdWU9IChTdHJpbmcpIGF0dHJpYnV0ZU1hcC5nZXQoa2V5KTsKKyAgICAgICAgICAgIGlmIChsb29raW5nRm9yUHJvcGVydHkgJiYgKGtleS5lcXVhbHMoImlmIikgfHwga2V5LmVxdWFscygidW5sZXNzIikpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5pbmRleE9mKGlkZW50aWZpZXIuc3Vic3RyaW5nKDIsIGlkZW50aWZpZXIubGVuZ3RoKCkgLSAxKSkgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKGlkZW50aWZpZXIpICE9IC0xKSB7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX0KKwkJU3RyaW5nQnVmZmVyIHRleHQ9IHdyYXBwZXIuZ2V0VGV4dCgpOworCQlpZiAodGV4dC5sZW5ndGgoKSA+IDApIHsKKwkJCWlmIChsb29raW5nRm9yUHJvcGVydHkgJiYgdGV4dC5pbmRleE9mKGlkZW50aWZpZXIpICE9IC0xKSB7CisJCQkJcmV0dXJuIHRydWU7IC8vcHJvcGVydHkgcmVmIGluIHRleHQKKwkJCX0KKwkJfQorCQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcHVibGljIExpc3QgY29tcHV0ZUlkZW50aWZpZXJPZmZzZXRzKFN0cmluZyBpZGVudGlmaWVyKSB7CisgICAgICAgIFN0cmluZyB0ZXh0VG9TZWFyY2g9IGdldEFudE1vZGVsKCkuZ2V0VGV4dChnZXRPZmZzZXQoKSwgZ2V0TGVuZ3RoKCkpOworICAgICAgICBpZiAodGV4dFRvU2VhcmNoID09IG51bGwgfHwgdGV4dFRvU2VhcmNoLmxlbmd0aCgpID09IDAgfHwgaWRlbnRpZmllci5sZW5ndGgoKSA9PTApIHsKKyAgICAgICAgCXJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIExpc3QgcmVzdWx0cz0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBSdW50aW1lQ29uZmlndXJhYmxlIHdyYXBwZXI9IGdldFRhc2soKS5nZXRSdW50aW1lQ29uZmlndXJhYmxlV3JhcHBlcigpOworICAgICAgICBNYXAgYXR0cmlidXRlTWFwPSB3cmFwcGVyLmdldEF0dHJpYnV0ZU1hcCgpOworICAgICAgICBTZXQga2V5cz0gYXR0cmlidXRlTWFwLmtleVNldCgpOworCQlTdHJpbmcgbGluZVNlcD0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOyAvLyROT04tTkxTLTEkCisgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGtleXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7ICkgeworICAgICAgICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgU3RyaW5nIHZhbHVlPSAoU3RyaW5nKSBhdHRyaWJ1dGVNYXAuZ2V0KGtleSk7CisJCQlpbnQgaWRlbnRpZmllckNvcnJlY3Rpb249IDE7CisgICAgICAgICAgICBpZiAodmFsdWUuaW5kZXhPZihpZGVudGlmaWVyKSAhPSAtMSkgeworICAgICAgICAgICAgICAgIGludCBrZXlPZmZzZXQ9IHRleHRUb1NlYXJjaC5pbmRleE9mKGtleSk7CisJCQkJd2hpbGUgKGtleU9mZnNldCA+IDAgJiYgIUNoYXJhY3Rlci5pc1doaXRlc3BhY2UodGV4dFRvU2VhcmNoLmNoYXJBdChrZXlPZmZzZXQgLSAxKSkpIHsKKwkJCQkJa2V5T2Zmc2V0PSB0ZXh0VG9TZWFyY2guaW5kZXhPZihrZXksIGtleU9mZnNldCArIDEpOworCQkJCX0KKyAgICAgICAgICAgICAgICBpbnQgdmFsdWVPZmZzZXQ9IHRleHRUb1NlYXJjaC5pbmRleE9mKCciJywga2V5T2Zmc2V0KTsKKwkJCQlpbnQgdmFsdWVMaW5lPSAoKEFudE1vZGVsKWdldEFudE1vZGVsKCkpLmdldExpbmUoZ2V0T2Zmc2V0KCkgKyB2YWx1ZU9mZnNldCk7CisJCQkJCisgICAgICAgICAgICAgICAgaW50IHdpdGhpblZhbHVlT2Zmc2V0PSB2YWx1ZS5pbmRleE9mKGlkZW50aWZpZXIpOworICAgICAgICAgICAgICAgIHdoaWxlICh3aXRoaW5WYWx1ZU9mZnNldCAhPSAtMSkgeworCQkJCQlpbnQgcmVzdWx0TGluZT0gKChBbnRNb2RlbClnZXRBbnRNb2RlbCgpKS5nZXRMaW5lKGdldE9mZnNldCgpICsgdmFsdWVPZmZzZXQgKyB3aXRoaW5WYWx1ZU9mZnNldCk7CisJCQkJCS8vdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUgYXR0cmlidXRlIG1hcCBzZWVtcyB0byBiZSBtb2RpZmllZCB0byBub3QgY29udGFpbiBjb250cm9sIGNoYXJhY3RlcnMKKwkJCQkJLy9uZXcgbGluZXMsIGNhcnJpYWdlIHJldHVybnMgYW5kIHRoZXNlIGFyZSByZXBsYWNlZCB3aXRoIHNwYWNlcworCQkJCQkvL3NvIGlmIHRoZSBsaW5lIHNlcGFyYXRvciBpcyBncmVhdGVyIHRoYW4gMSBpbiBsZW5ndGggd2UgbmVlZCB0byBjb3JyZWN0IGZvciB0aGlzCisJCQkJCWludCByZXN1bHRPZmZzZXQ9IGdldE9mZnNldCgpICsgdmFsdWVPZmZzZXQgKyB3aXRoaW5WYWx1ZU9mZnNldCArIGlkZW50aWZpZXJDb3JyZWN0aW9uICsgKChyZXN1bHRMaW5lIC0gdmFsdWVMaW5lKSAqIChsaW5lU2VwLmxlbmd0aCgpIC0gMSkpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRzLmFkZChuZXcgSW50ZWdlcihyZXN1bHRPZmZzZXQpKTsKKyAgICAgICAgICAgICAgICAgICAgd2l0aGluVmFsdWVPZmZzZXQ9IHZhbHVlLmluZGV4T2YoaWRlbnRpZmllciwgd2l0aGluVmFsdWVPZmZzZXQgKyAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgCVN0cmluZyB0ZXh0PSB3cmFwcGVyLmdldFRleHQoKS50b1N0cmluZygpLnRyaW0oKTsKKyAgICAJaWYgKHRleHQubGVuZ3RoKCkgPiAwKSB7CisgICAgCQlpbnQgb2Zmc2V0PSB0ZXh0VG9TZWFyY2guaW5kZXhPZih0ZXh0LnRvU3RyaW5nKCkpOworICAgIAkJb2Zmc2V0PSB0ZXh0VG9TZWFyY2guaW5kZXhPZihpZGVudGlmaWVyLCBvZmZzZXQpOworICAgIAkJcmVzdWx0cy5hZGQobmV3IEludGVnZXIob2Zmc2V0ICsgZ2V0T2Zmc2V0KCkpKTsKKyAgICAJfQorICAgICAgICByZXR1cm4gcmVzdWx0czsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9tb2RlbC9JQW50RWxlbWVudC5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvbW9kZWwvSUFudEVsZW1lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTkxOGQxCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvbW9kZWwvSUFudEVsZW1lbnQuamF2YQpAQCAtMCwwICsxLDE4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLm1vZGVsOworCisvKioKKyAqIEludGVyZmFjZSB0byB0YWcgYWxsIEFudCBlbGVtZW50cyBmb3IgYWRhcHRlciBmYWN0b3J5IC0gY3VycmVudGx5IGVtcHR5LgorICovCitwdWJsaWMgaW50ZXJmYWNlIElBbnRFbGVtZW50IHsKKworfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvbW9kZWwvSUFudE1vZGVsTGlzdGVuZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL21vZGVsL0lBbnRNb2RlbExpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMzMjA3MAotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL21vZGVsL0lBbnRNb2RlbExpc3RlbmVyLmphdmEKQEAgLTAsMCArMSwxOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5tb2RlbDsKKworCitwdWJsaWMgaW50ZXJmYWNlIElBbnRNb2RlbExpc3RlbmVyIHsKKwkKKwlwdWJsaWMgdm9pZCBhbnRNb2RlbENoYW5nZWQoQW50TW9kZWxDaGFuZ2VFdmVudCBldmVudCk7Cit9CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9tb2RlbC9JUHJvYmxlbS5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvbW9kZWwvSVByb2JsZW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTY0NDgxCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvbW9kZWwvSVByb2JsZW0uamF2YQpAQCAtMCwwICsxLDU0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5tb2RlbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKKworCitwdWJsaWMgaW50ZXJmYWNlIElQcm9ibGVtIGV4dGVuZHMgSVJlZ2lvbiB7CisKKwkvKioKKwkgKiBBbnN3ZXIgYSBsb2NhbGl6ZWQsIGh1bWFuLXJlYWRhYmxlIG1lc3NhZ2Ugc3RyaW5nIHdoaWNoIGRlc2NyaWJlcyB0aGUgcHJvYmxlbS4KKwkgKiBUaGUgbWVzc2FnZSBoYXMgYmVlbiAiZXNjYXBlZCIgdG8gaGFuZGxlIHNwZWNpYWwgY2hhcmFjdGVycy4KKwkgKgorCSAqIEByZXR1cm4gYSBsb2NhbGl6ZWQsIGh1bWFuLXJlYWRhYmxlIG1lc3NhZ2Ugc3RyaW5nIHdoaWNoIGRlc2NyaWJlcyB0aGUgcHJvYmxlbQorCSAqLworCVN0cmluZyBnZXRNZXNzYWdlKCk7CisJCisJLyoqCisJICogQW5zd2VyIGEgbG9jYWxpemVkLCBodW1hbi1yZWFkYWJsZSBtZXNzYWdlIHN0cmluZyB3aGljaCBkZXNjcmliZXMgdGhlIHByb2JsZW0uCisJICogVGhlIG1lc3NhZ2UgaXMgaW4gaXRzIG9yaWdpbmFsIGZvcm07IHNwZWNpYWwgY2hhcmFjdGVycyBoYXZlIG5vdCBiZWVuIGVzY2FwZWQuCisJICoKKwkgKiBAcmV0dXJuIGxvY2FsaXplZCwgaHVtYW4tcmVhZGFibGUgbWVzc2FnZSBzdHJpbmcgd2hpY2ggZGVzY3JpYmVzIHRoZSBwcm9ibGVtCisJICovCisJU3RyaW5nIGdldFVubW9kaWZpZWRNZXNzYWdlKCk7CisKKwkvKioKKwkgKiBDaGVja3MgdGhlIHNldmVyaXR5IHRvIHNlZSBpZiB0aGUgRXJyb3IgYml0IGlzIHNldC4KKwkgKgorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgRXJyb3IgYml0IGlzIHNldCBmb3IgdGhlIHNldmVyaXR5LCBmYWxzZSBvdGhlcndpc2UKKwkgKi8KKwlib29sZWFuIGlzRXJyb3IoKTsKKworCS8qKgorCSAqIENoZWNrcyB0aGUgc2V2ZXJpdHkgdG8gc2VlIGlmIHRoZSBFcnJvciBiaXQgaXMgbm90IHNldC4KKwkgKgorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgRXJyb3IgYml0IGlzIG5vdCBzZXQgZm9yIHRoZSBzZXZlcml0eSwgZmFsc2Ugb3RoZXJ3aXNlCisJICovCisJYm9vbGVhbiBpc1dhcm5pbmcoKTsKKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBsaW5lIG51bWJlciBvZiB0aGlzIHByb2JsZW0uCisJICoKKwkgKiBAcmV0dXJuIHRoZSBsaW5lIG51bWJlciBvZiB0aGlzIHByb2JsZW0KKwkgKi8KKwlpbnQgZ2V0TGluZU51bWJlcigpOworfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvbW9kZWwvSVByb2JsZW1SZXF1ZXN0b3IuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL21vZGVsL0lQcm9ibGVtUmVxdWVzdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ1ZGUwMAotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL21vZGVsL0lQcm9ibGVtUmVxdWVzdG9yLmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkubW9kZWw7CisKK3B1YmxpYyBpbnRlcmZhY2UgSVByb2JsZW1SZXF1ZXN0b3IgeworCisJLyoqCisJICogTm90aWZpY2F0aW9uIG9mIGEgQW50IGJ1aWxkZmlsZSBwcm9ibGVtLgorCSAqCisJICogQHBhcmFtIHByb2JsZW0gSVByb2JsZW0gLSBUaGUgZGlzY292ZXJlZCBBbnQgYnVpbGRmaWxlIHByb2JsZW0uCisJICovCisJdm9pZCBhY2NlcHRQcm9ibGVtKElQcm9ibGVtIHByb2JsZW0pOworCisJLyoqCisJICogTm90aWZpY2F0aW9uIHNlbnQgYmVmb3JlIHN0YXJ0aW5nIHRoZSBwcm9ibGVtIGRldGVjdGlvbiBwcm9jZXNzLgorCSAqIFR5cGljYWxseSwgdGhpcyB3b3VsZCB0ZWxsIGEgcHJvYmxlbSBjb2xsZWN0b3IgdG8gY2xlYXIgcHJldmlvdXNseSByZWNvcmRlZCBwcm9ibGVtcy4KKwkgKi8KKwl2b2lkIGJlZ2luUmVwb3J0aW5nKCk7CisKKwkvKioKKwkgKiBOb3RpZmljYXRpb24gc2VudCBhZnRlciBoYXZpbmcgY29tcGxldGVkIHByb2JsZW0gZGV0ZWN0aW9uIHByb2Nlc3MuCisJICogVHlwaWNhbGx5LCB0aGlzIHdvdWxkIHRlbGwgYSBwcm9ibGVtIGNvbGxlY3RvciB0aGF0IG5vIG1vcmUgcHJvYmxlbXMgc2hvdWxkIGJlIGV4cGVjdGVkIGluIHRoaXMKKwkgKiBpdGVyYXRpb24uCisJICovCisJdm9pZCBlbmRSZXBvcnRpbmcoKTsKKworfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvbW9kZWwvSW50ZXJuYWxUYXJnZXRGaWx0ZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL21vZGVsL0ludGVybmFsVGFyZ2V0RmlsdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UwZGFhNQotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL21vZGVsL0ludGVybmFsVGFyZ2V0RmlsdGVyLmphdmEKQEAgLTAsMCArMSw1NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLm1vZGVsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRhYmxlVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOworCisKK3B1YmxpYyBjbGFzcyBJbnRlcm5hbFRhcmdldEZpbHRlciBleHRlbmRzIFZpZXdlckZpbHRlciB7CisJCisJcHJpdmF0ZSBpbnQgZkZpbHRlcmVkPSAwOworCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gdGFyZ2V0IGlzIGFuIGludGVybmFsIHRhcmdldC4gSW50ZXJuYWwKKwkgKiB0YXJnZXRzIGFyZSB0YXJnZXRzIHdoaWNoIGhhdmUgbm8gZGVzY3JpcHRpb24uIFRoZSBkZWZhdWx0IHRhcmdldAorCSAqIGlzIG5ldmVyIGNvbnNpZGVyZWQgaW50ZXJuYWwuCisJICovCisJcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2aWV3ZXIsIE9iamVjdCBwYXJlbnRFbGVtZW50LCBPYmplY3QgZWxlbWVudCkgeworCQlib29sZWFuIHJlc3VsdD0gdHJ1ZTsKKwkJaWYgKHZpZXdlciBpbnN0YW5jZW9mIENoZWNrYm94VGFibGVWaWV3ZXIpIHsKKwkJICAgIGlmICgoKENoZWNrYm94VGFibGVWaWV3ZXIpdmlld2VyKS5nZXRDaGVja2VkKGVsZW1lbnQpKSB7CisJCSAgICAgICAgLy9kbyBub3QgZmlsdGVyIG91dCAoc2VsZWN0ZWQpIGNoZWNrZWQgaXRlbXMKKwkJICAgICAgICByZXR1cm4gdHJ1ZTsKKwkJICAgIH0KKwkJfQorCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFudFRhcmdldE5vZGUpIHsKKwkJCXJlc3VsdCA9ICEoKEFudFRhcmdldE5vZGUpZWxlbWVudCkuaXNJbnRlcm5hbCgpOworCQl9IAorCQlpZiAoIXJlc3VsdCkgeworCQkJZkZpbHRlcmVkKys7CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXIjZmlsdGVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyLCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0W10pCisJICovCisJcHVibGljIE9iamVjdFtdIGZpbHRlcihWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50LCBPYmplY3RbXSBlbGVtZW50cykgeworCQlmRmlsdGVyZWQ9IDA7CisJCXJldHVybiBzdXBlci5maWx0ZXIodmlld2VyLCBwYXJlbnQsIGVsZW1lbnRzKTsKKwl9CisJCisJcHVibGljIGludCBnZXROdW1iZXJPZlRhcmdldHNGaWx0ZXJlZCgpIHsKKwkJcmV0dXJuIGZGaWx0ZXJlZDsKKwl9Cit9CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9tb2RlbC9Mb2NhdGlvblByb3ZpZGVyLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9tb2RlbC9Mb2NhdGlvblByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY2ZTMzYQotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL21vZGVsL0xvY2F0aW9uUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDQzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5tb2RlbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQuSUxvY2F0aW9uUHJvdmlkZXI7CisKK3B1YmxpYyBjbGFzcyBMb2NhdGlvblByb3ZpZGVyIHsKKwlwcml2YXRlIElFZGl0b3JJbnB1dCBmRWRpdG9ySW5wdXQ7CisJCisJcHVibGljIExvY2F0aW9uUHJvdmlkZXIoSUVkaXRvcklucHV0IGlucHV0KSB7CisJCWZFZGl0b3JJbnB1dD0gaW5wdXQ7CisJfQorCisJcHVibGljIElQYXRoIGdldExvY2F0aW9uKCkgeworCQlpZiAoZkVkaXRvcklucHV0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCkgeworCQkJcmV0dXJuICgoSUZpbGVFZGl0b3JJbnB1dClmRWRpdG9ySW5wdXQpLmdldEZpbGUoKS5nZXRMb2NhdGlvbigpOworCQl9CisJCUlMb2NhdGlvblByb3ZpZGVyIGxvY2F0aW9uUHJvdmlkZXI9IChJTG9jYXRpb25Qcm92aWRlcilmRWRpdG9ySW5wdXQuZ2V0QWRhcHRlcihJTG9jYXRpb25Qcm92aWRlci5jbGFzcyk7CisJCWlmIChsb2NhdGlvblByb3ZpZGVyICE9IG51bGwpIHsKKwkJCXJldHVybiBsb2NhdGlvblByb3ZpZGVyLmdldFBhdGgoZkVkaXRvcklucHV0KTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJcHVibGljIElGaWxlIGdldEZpbGUoKSB7CisJCWlmKGZFZGl0b3JJbnB1dCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpIHsKKwkJCXJldHVybiAoKElGaWxlRWRpdG9ySW5wdXQpZkVkaXRvcklucHV0KS5nZXRGaWxlKCk7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvQWJzdHJhY3RDbGFzc3BhdGhFbnRyeS5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvQWJzdHJhY3RDbGFzc3BhdGhFbnRyeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5MmRmMzYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9BYnN0cmFjdENsYXNzcGF0aEVudHJ5LmphdmEKQEAgLTAsMCArMSw3MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkucHJlZmVyZW5jZXM7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5jb3JlLklBbnRDbGFzc3BhdGhFbnRyeTsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q2xhc3NwYXRoRW50cnkgaW1wbGVtZW50cyBJQ2xhc3NwYXRoRW50cnkgeworCisJcHJvdGVjdGVkIExpc3QgZkNoaWxkRW50cmllcyA9IG5ldyBBcnJheUxpc3QoKTsKKwlwcm90ZWN0ZWQgSUNsYXNzcGF0aEVudHJ5IGZQYXJlbnQgPSBudWxsOworCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLnByZWZlcmVuY2VzLklDbGFzc3BhdGhFbnRyeSNnZXRFbnRyaWVzKCkKKwkgKi8KKwlwdWJsaWMgSUFudENsYXNzcGF0aEVudHJ5W10gZ2V0RW50cmllcygpIHsKKwkJcmV0dXJuIChJQW50Q2xhc3NwYXRoRW50cnlbXSlmQ2hpbGRFbnRyaWVzLnRvQXJyYXkobmV3IElBbnRDbGFzc3BhdGhFbnRyeVtmQ2hpbGRFbnRyaWVzLnNpemUoKV0pOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5JQ2xhc3NwYXRoRW50cnkjaGFzRW50cmllcygpCisJICovCisJcHVibGljIGJvb2xlYW4gaGFzRW50cmllcygpIHsKKwkJcmV0dXJuICFmQ2hpbGRFbnRyaWVzLmlzRW1wdHkoKTsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkucHJlZmVyZW5jZXMuSUNsYXNzcGF0aEVudHJ5I2dldFBhcmVudCgpCisJICovCisJcHVibGljIElDbGFzc3BhdGhFbnRyeSBnZXRQYXJlbnQoKSB7CisJCXJldHVybiBmUGFyZW50OworCX0KKwkKKwkvKioKKwkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgdG8gc2V0LgorCSAqLworCXB1YmxpYyB2b2lkIHNldFBhcmVudChJQ2xhc3NwYXRoRW50cnkgcGFyZW50KSB7CisJCWZQYXJlbnQgPSBwYXJlbnQ7CisJfQorCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmFudC5jb3JlLklBbnRDbGFzc3BhdGhFbnRyeSNnZXRFbnRyeVVSTCgpCisJICovCisJcHVibGljIFVSTCBnZXRFbnRyeVVSTCgpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmNvcmUuSUFudENsYXNzcGF0aEVudHJ5I2dldExhYmVsKCkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgeworCQlyZXR1cm4gdG9TdHJpbmcoKTsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5hbnQuY29yZS5JQW50Q2xhc3NwYXRoRW50cnkjaXNFY2xpcHNlUnVudGltZVJlcXVpcmVkKCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0VjbGlwc2VSdW50aW1lUmVxdWlyZWQoKSB7CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9BZGRQcm9wZXJ0eURpYWxvZy5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvQWRkUHJvcGVydHlEaWFsb2cuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjI1ZTJiCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvQWRkUHJvcGVydHlEaWFsb2cuamF2YQpAQCAtMCwwICsxLDE3NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkucHJlZmVyZW5jZXM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuSUFudFVJSGVscENvbnRleHRJZHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuU3RyaW5nVmFyaWFibGVTZWxlY3Rpb25EaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7CisKK3B1YmxpYyBjbGFzcyBBZGRQcm9wZXJ0eURpYWxvZyBleHRlbmRzIERpYWxvZyB7CisKKwlwcml2YXRlIFN0cmluZyBmTmFtZTsKKwlwcml2YXRlIFN0cmluZyBmVmFsdWU7CisKKwlwcml2YXRlIFN0cmluZyBmVGl0bGU7CisJCisJcHJpdmF0ZSBMYWJlbCBmTmFtZUxhYmVsOworCXByaXZhdGUgVGV4dCBmTmFtZVRleHQ7CisJcHJpdmF0ZSBMYWJlbCBmVmFsdWVMYWJlbDsKKwlwcml2YXRlIFRleHQgZlZhbHVlVGV4dDsKKwkKKwlwcml2YXRlIFN0cmluZ1tdIGZJbml0aWFsVmFsdWVzOworCisJcHVibGljIEFkZFByb3BlcnR5RGlhbG9nKFNoZWxsIHNoZWxsLCBTdHJpbmcgdGl0bGUsIFN0cmluZ1tdIGluaXRpYWxWYWx1ZXMpIHsKKwkJc3VwZXIoc2hlbGwpOworCQlmVGl0bGUgPSB0aXRsZTsKKwkJZkluaXRpYWxWYWx1ZXM9IGluaXRpYWxWYWx1ZXM7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjY3JlYXRlRGlhbG9nQXJlYShvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCisJICovCisJcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7CisJCUNvbXBvc2l0ZSBjb21wPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7CisJCSgoR3JpZExheW91dCkgY29tcC5nZXRMYXlvdXQoKSkubnVtQ29sdW1ucyA9IDI7CisJCQorCQlmTmFtZUxhYmVsID0gbmV3IExhYmVsKGNvbXAsIFNXVC5OT05FKTsKKwkJZk5hbWVMYWJlbC5zZXRUZXh0KEFudFByZWZlcmVuY2VzTWVzc2FnZXMuQWRkUHJvcGVydHlEaWFsb2dfX05hbWVfXzEpOworCQlmTmFtZUxhYmVsLnNldEZvbnQoY29tcC5nZXRGb250KCkpOworCQkKKwkJZk5hbWVUZXh0ID0gbmV3IFRleHQoY29tcCwgU1dULkJPUkRFUiB8IFNXVC5TSU5HTEUpOworCQlmTmFtZVRleHQuc2V0VGV4dChmSW5pdGlhbFZhbHVlc1swXSk7CisJCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7CisJCWdkLndpZHRoSGludCA9IDMwMDsKKwkJZk5hbWVUZXh0LnNldExheW91dERhdGEoZ2QpOworCQlmTmFtZVRleHQuc2V0Rm9udChjb21wLmdldEZvbnQoKSk7CisJCWZOYW1lVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKKwkJCQl1cGRhdGVCdXR0b25zKCk7CisJCQl9CisJCX0pOworCQkKKwkJZlZhbHVlTGFiZWwgPSBuZXcgTGFiZWwoY29tcCwgU1dULk5PTkUpOworCQlmVmFsdWVMYWJlbC5zZXRUZXh0KEFudFByZWZlcmVuY2VzTWVzc2FnZXMuQWRkUHJvcGVydHlEaWFsb2dfX1ZhbHVlX18yKTsKKwkJZlZhbHVlTGFiZWwuc2V0Rm9udChjb21wLmdldEZvbnQoKSk7CisJCQorCQlmVmFsdWVUZXh0ID0gbmV3IFRleHQoY29tcCwgU1dULkJPUkRFUiB8IFNXVC5TSU5HTEUpOworCQlmVmFsdWVUZXh0LnNldFRleHQoZkluaXRpYWxWYWx1ZXNbMV0pOworCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOworCQlnZC53aWR0aEhpbnQgPSAzMDA7CisJCWZWYWx1ZVRleHQuc2V0TGF5b3V0RGF0YShnZCk7CisJCWZWYWx1ZVRleHQuc2V0Rm9udChjb21wLmdldEZvbnQoKSk7CisJCWZWYWx1ZVRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7CisJCQkJdXBkYXRlQnV0dG9ucygpOworCQkJfQorCQl9KTsJCQorCQkKKwkJQnV0dG9uIHZhcmlhYmxlc0J1dHRvbiA9IG5ldyBCdXR0b24oY29tcCwgU1dULlBVU0gpOworCQl2YXJpYWJsZXNCdXR0b24uc2V0VGV4dChBbnRQcmVmZXJlbmNlc01lc3NhZ2VzLkFkZFByb3BlcnR5RGlhbG9nXzIpOworCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCk7CisJCWdkLmhvcml6b250YWxTcGFuID0gMjsKKwkJaW50IHdpZHRoSGludCA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuQlVUVE9OX1dJRFRIKTsKKwkJZ2Qud2lkdGhIaW50ID0gTWF0aC5tYXgod2lkdGhIaW50LCB2YXJpYWJsZXNCdXR0b24uY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCB0cnVlKS54KTsKKwkJdmFyaWFibGVzQnV0dG9uLnNldExheW91dERhdGEoZ2QpOworCQl2YXJpYWJsZXNCdXR0b24uc2V0Rm9udChjb21wLmdldEZvbnQoKSk7CisJCQorCQl2YXJpYWJsZXNCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CisJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBzZSkgeworCQkJCWdldFZhcmlhYmxlKCk7CisJCQl9CisJCX0pOworCQkKKwkJcmV0dXJuIGNvbXA7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIGdldFZhcmlhYmxlKCkgeworCQlTdHJpbmdWYXJpYWJsZVNlbGVjdGlvbkRpYWxvZyB2YXJpYWJsZXNEaWFsb2cgPSBuZXcgU3RyaW5nVmFyaWFibGVTZWxlY3Rpb25EaWFsb2coZ2V0U2hlbGwoKSk7CisJCWludCByZXR1cm5Db2RlID0gdmFyaWFibGVzRGlhbG9nLm9wZW4oKTsKKwkJaWYgKHJldHVybkNvZGUgPT0gSURpYWxvZ0NvbnN0YW50cy5PS19JRCkgeworCQkJU3RyaW5nIHZhcmlhYmxlID0gdmFyaWFibGVzRGlhbG9nLmdldFZhcmlhYmxlRXhwcmVzc2lvbigpOworCQkJaWYgKHZhcmlhYmxlICE9IG51bGwpIHsKKwkJCQlmVmFsdWVUZXh0Lmluc2VydCh2YXJpYWJsZS50cmltKCkpOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogUmV0dXJuIHRoZSBuYW1lL3ZhbHVlIHBhaXIgZW50ZXJlZCBpbiB0aGlzIGRpYWxvZy4gIElmIHRoZSBjYW5jZWwgYnV0dG9uIHdhcyBoaXQsCisJICogYm90aCB3aWxsIGJlIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqLworCXB1YmxpYyBTdHJpbmdbXSBnZXROYW1lVmFsdWVQYWlyKCkgeworCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHtmTmFtZSwgZlZhbHVlfTsKKwl9CisJCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjYnV0dG9uUHJlc3NlZChpbnQpCisJICovCisJcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgYnV0dG9uSWQpIHsKKwkJaWYgKGJ1dHRvbklkID09IElEaWFsb2dDb25zdGFudHMuT0tfSUQpIHsKKwkJCS8vaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0ODMxNgorCQkJZk5hbWU9IGZOYW1lVGV4dC5nZXRUZXh0KCkudHJpbSgpOworCQkJZlZhbHVlID0gZlZhbHVlVGV4dC5nZXRUZXh0KCkudHJpbSgpOworCQl9IGVsc2UgeworCQkJZk5hbWUgPSBudWxsOworCQkJZlZhbHVlID0gbnVsbDsKKwkJfQorCQlzdXBlci5idXR0b25QcmVzc2VkKGJ1dHRvbklkKTsKKwl9CisJCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdyNjb25maWd1cmVTaGVsbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbCkKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBzaGVsbCkgeworCQlzdXBlci5jb25maWd1cmVTaGVsbChzaGVsbCk7CisJCWlmIChmVGl0bGUgIT0gbnVsbCkgeworCQkJc2hlbGwuc2V0VGV4dChmVGl0bGUpOworCQl9CisJCWlmIChmSW5pdGlhbFZhbHVlc1swXS5sZW5ndGgoKSA9PSAwKSB7CisJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHNoZWxsLCBJQW50VUlIZWxwQ29udGV4dElkcy5BRERfUFJPUEVSVFlfRElBTE9HKTsKKwkJfSBlbHNlIHsKKwkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoc2hlbGwsIElBbnRVSUhlbHBDb250ZXh0SWRzLkVESVRfUFJPUEVSVFlfRElBTE9HKTsKKwkJfQorCX0KKwkKKwkvKioKKwkgKiBFbmFibGUgdGhlIE9LIGJ1dHRvbiBpZiB2YWxpZCBpbnB1dAorCSAqLworCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUJ1dHRvbnMoKSB7CisJCVN0cmluZyBuYW1lID0gZk5hbWVUZXh0LmdldFRleHQoKS50cmltKCk7CisJCVN0cmluZyB2YWx1ZSA9IGZWYWx1ZVRleHQuZ2V0VGV4dCgpLnRyaW0oKTsKKwkJZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuT0tfSUQpLnNldEVuYWJsZWQoKG5hbWUubGVuZ3RoKCkgPiAwKSAmJih2YWx1ZS5sZW5ndGgoKSA+IDApKTsKKwl9CisJCisJLyoqCisJICogRW5hYmxlIHRoZSBidXR0b25zIG9uIGNyZWF0aW9uLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdyNjcmVhdGUoKQorCSAqLworCXB1YmxpYyB2b2lkIGNyZWF0ZSgpIHsKKwkJc3VwZXIuY3JlYXRlKCk7CisJCXVwZGF0ZUJ1dHRvbnMoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9BbnRDbGFzc3BhdGhDb250ZW50UHJvdmlkZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL0FudENsYXNzcGF0aENvbnRlbnRQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlYzBjN2UKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9BbnRDbGFzc3BhdGhDb250ZW50UHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDIxMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkucHJlZmVyZW5jZXM7CisKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOworCisvKioKKyAqIENvbnRlbnQgcHJvdmlkZXIgdGhhdCBtYWludGFpbnMgYSBsaXN0IG9mIGNsYXNzcGF0aCBlbnRyaWVzIHdoaWNoIGFyZSBzaG93biBpbiBhIHRyZWUKKyAqIHZpZXdlci4KKyAqLworcHVibGljIGNsYXNzIEFudENsYXNzcGF0aENvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyIHsKKwlwcml2YXRlIFRyZWVWaWV3ZXIgdHJlZVZpZXdlcjsKKwlwcml2YXRlIENsYXNzcGF0aE1vZGVsIG1vZGVsPSBudWxsOworCXByaXZhdGUgYm9vbGVhbiByZWZyZXNoRW5hYmxlZD0gZmFsc2U7CisJcHJpdmF0ZSBib29sZWFuIHJlZnJlc2hSZXF1ZXN0ZWQ9IGZhbHNlOworCQkKKwlwdWJsaWMgdm9pZCBhZGQoSUNsYXNzcGF0aEVudHJ5IHBhcmVudCwgT2JqZWN0IGNoaWxkKSB7CisJCU9iamVjdCBuZXdFbnRyeT0gbnVsbDsKKwkJYm9vbGVhbiBhZGRlZD0gZmFsc2U7CisJCWlmIChwYXJlbnQgPT0gbnVsbCB8fCBwYXJlbnQgPT0gbW9kZWwpIHsKKwkJCWFkZGVkPSB0cnVlOworCQkJbmV3RW50cnk9IG1vZGVsLmFkZEVudHJ5KGNoaWxkKTsKKwkJCWlmIChuZXdFbnRyeSA9PSBudWxsKSB7CisJCQkJLy9lbnRyeSBhbHJlYWR5IGV4aXN0cworCQkJCW5ld0VudHJ5PSBtb2RlbC5jcmVhdGVFbnRyeShjaGlsZCwgbW9kZWwpOworCQkJCWFkZGVkPSBmYWxzZTsKKwkJCX0KKwkJCXBhcmVudD0gbW9kZWw7CisJCX0gZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgR2xvYmFsQ2xhc3NwYXRoRW50cmllcykgeworCQkJR2xvYmFsQ2xhc3NwYXRoRW50cmllcyBnbG9iYWxQYXJlbnQ9IChHbG9iYWxDbGFzc3BhdGhFbnRyaWVzKSBwYXJlbnQ7CisJCQluZXdFbnRyeT0gbW9kZWwuY3JlYXRlRW50cnkoY2hpbGQsIGdsb2JhbFBhcmVudCk7CisJCQlDbGFzc3BhdGhFbnRyeSBuZXdDbGFzc3BhdGhFbnRyeT0gKENsYXNzcGF0aEVudHJ5KSBuZXdFbnRyeTsKKwkJCWlmICghZ2xvYmFsUGFyZW50LmNvbnRhaW5zKG5ld0NsYXNzcGF0aEVudHJ5KSkgeworCQkJCWFkZGVkPSB0cnVlOworCQkJCWdsb2JhbFBhcmVudC5hZGRFbnRyeShuZXdDbGFzc3BhdGhFbnRyeSk7CisJCQl9CisJCX0gCisJCWlmIChuZXdFbnRyeSAhPSBudWxsKSB7CisJCQlpZiAoYWRkZWQpIHsKKwkJCQl0cmVlVmlld2VyLmFkZChwYXJlbnQsIG5ld0VudHJ5KTsKKwkJCX0KKwkJCXRyZWVWaWV3ZXIuc2V0RXhwYW5kZWRTdGF0ZShwYXJlbnQsIHRydWUpOworCQkJdHJlZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obmV3RW50cnkpLCB0cnVlKTsKKwkJCXJlZnJlc2goKTsKKwkJfQorCX0KKwkKKwlwdWJsaWMgdm9pZCBhZGQoaW50IGVudHJ5VHlwZSwgT2JqZWN0IGNoaWxkKSB7CisJCU9iamVjdCBuZXdFbnRyeT0gbW9kZWwuYWRkRW50cnkoZW50cnlUeXBlLCBjaGlsZCk7CisJCWlmIChuZXdFbnRyeSAhPSBudWxsKSB7CisJCQl0cmVlVmlld2VyLmFkZChnZXRQYXJlbnQobmV3RW50cnkpLCBuZXdFbnRyeSk7CisJCQlyZWZyZXNoKCk7CisJCX0KKwl9CisKKwlwdWJsaWMgdm9pZCByZW1vdmVBbGwoKSB7CisJCW1vZGVsLnJlbW92ZUFsbCgpOworCQlyZWZyZXNoKCk7CisJfQorCQorCXByaXZhdGUgdm9pZCByZWZyZXNoKCkgeworCQlpZiAocmVmcmVzaEVuYWJsZWQpIHsKKwkJCXRyZWVWaWV3ZXIucmVmcmVzaCgpOworCQkJcmVmcmVzaFJlcXVlc3RlZD0gZmFsc2U7CisJCX0gZWxzZSB7CisJCQlyZWZyZXNoUmVxdWVzdGVkPSB0cnVlOworCQl9CisJfQorCQorCXB1YmxpYyB2b2lkIHJlbW92ZUFsbEdsb2JhbEFudENsYXNzcGF0aEVudHJpZXMoKSB7CisJCW1vZGVsLnJlbW92ZUFsbChDbGFzc3BhdGhNb2RlbC5BTlRfSE9NRSk7CisJCXJlZnJlc2goKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElUcmVlQ29udGVudFByb3ZpZGVyI2dldFBhcmVudChPYmplY3QpCisJICovCisJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKKwkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDbGFzc3BhdGhFbnRyeSkgeworCQkJcmV0dXJuICgoQ2xhc3NwYXRoRW50cnkpZWxlbWVudCkuZ2V0UGFyZW50KCk7CisJCX0KKwkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBHbG9iYWxDbGFzc3BhdGhFbnRyaWVzKSB7CisJCQlyZXR1cm4gbW9kZWw7CisJCX0KKwkJCisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIEBzZWUgSVRyZWVDb250ZW50UHJvdmlkZXIjaGFzQ2hpbGRyZW4oT2JqZWN0KQorCSAqLworCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7CisJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ2xhc3NwYXRoRW50cnkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEdsb2JhbENsYXNzcGF0aEVudHJpZXMpIHsKKwkJCXJldHVybiAoKEdsb2JhbENsYXNzcGF0aEVudHJpZXMpZWxlbWVudCkuaGFzRW50cmllcygpOworCQkJCisJCX0gCisJCQorCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENsYXNzcGF0aE1vZGVsKSB7CisJCQlyZXR1cm4gKChDbGFzc3BhdGhNb2RlbCkgZWxlbWVudCkuaGFzRW50cmllcygpOworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyI2dldEVsZW1lbnRzKGphdmEubGFuZy5PYmplY3QpCisJICovCisJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKKwkJcmV0dXJuIGdldENoaWxkcmVuKGlucHV0RWxlbWVudCk7CisJfQorCisJCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyI2Rpc3Bvc2UoKQorCSAqLworCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjaW5wdXRDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyLCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQorCSAqLworCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgeworCQl0cmVlVmlld2VyID0gKFRyZWVWaWV3ZXIpIHZpZXdlcjsKKwkJCisJCWlmIChuZXdJbnB1dCAhPSBudWxsKSB7CisJCQltb2RlbD0gKENsYXNzcGF0aE1vZGVsKW5ld0lucHV0OworCQl9IGVsc2UgeworCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKKwkJCQltb2RlbC5yZW1vdmVBbGwoKTsKKwkJCX0KKwkJCW1vZGVsPSBudWxsOworCQl9CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQorCSAqLworCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgeworCQlpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIEdsb2JhbENsYXNzcGF0aEVudHJpZXMpIHsKKwkJCXJldHVybiAoKEdsb2JhbENsYXNzcGF0aEVudHJpZXMpcGFyZW50RWxlbWVudCkuZ2V0RW50cmllcygpOworCQl9CisJCWlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgQ2xhc3NwYXRoTW9kZWwpIHsKKwkJCXJldHVybiAoKENsYXNzcGF0aE1vZGVsKXBhcmVudEVsZW1lbnQpLmdldEVudHJpZXMoKTsKKwkJfQorCQlpZiAocGFyZW50RWxlbWVudCA9PSBudWxsKSB7CisJCQlMaXN0IGFsbD0gbmV3IEFycmF5TGlzdCgpOworCQkJT2JqZWN0W10gdG9wRW50cmllcz0gbW9kZWwuZ2V0RW50cmllcygpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b3BFbnRyaWVzLmxlbmd0aDsgaSsrKSB7CisJCQkJT2JqZWN0IG9iamVjdCA9IHRvcEVudHJpZXNbaV07CisJCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIENsYXNzcGF0aEVudHJ5KSB7CisJCQkJCWFsbC5hZGQob2JqZWN0KTsKKwkJCQl9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEdsb2JhbENsYXNzcGF0aEVudHJpZXMpIHsKKwkJCQkJYWxsLmFkZEFsbChBcnJheXMuYXNMaXN0KCgoR2xvYmFsQ2xhc3NwYXRoRW50cmllcylvYmplY3QpLmdldEVudHJpZXMoKSkpOworCQkJCX0KKwkJCX0KKwkJCXJldHVybiBhbGwudG9BcnJheSgpOworCQl9CisJCQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgdm9pZCByZW1vdmUoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7CisJCU9iamVjdFtdIGFycmF5PSBzZWxlY3Rpb24udG9BcnJheSgpOworCQltb2RlbC5yZW1vdmVBbGwoYXJyYXkpOworCQl0cmVlVmlld2VyLnJlbW92ZShhcnJheSk7CisJCXJlZnJlc2goKTsKKwl9CisKKwlwdWJsaWMgQ2xhc3NwYXRoTW9kZWwgZ2V0TW9kZWwoKSB7CisJCXJldHVybiBtb2RlbDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRSZWZyZXNoRW5hYmxlZChib29sZWFuIHJlZnJlc2hFbmFibGVkKSB7CisJCXRoaXMucmVmcmVzaEVuYWJsZWQgPSByZWZyZXNoRW5hYmxlZDsKKwkJdHJlZVZpZXdlci5nZXRUcmVlKCkuc2V0UmVkcmF3KHJlZnJlc2hFbmFibGVkKTsKKwkJaWYgKHJlZnJlc2hFbmFibGVkICYmIHJlZnJlc2hSZXF1ZXN0ZWQpIHsKKwkJCXJlZnJlc2goKTsKKwkJfQorCX0KKworCS8qKgorCSAqIEBwYXJhbSBjdXJyZW50UGFyZW50CisJICovCisJcHVibGljIHZvaWQgc2V0RW50cmllcyhJQ2xhc3NwYXRoRW50cnkgY3VycmVudFBhcmVudCwgTGlzdCBlbnRyaWVzKSB7CisJCWlmIChjdXJyZW50UGFyZW50IGluc3RhbmNlb2YgR2xvYmFsQ2xhc3NwYXRoRW50cmllcykgeworCQkJR2xvYmFsQ2xhc3NwYXRoRW50cmllcyBncm91cD0gKEdsb2JhbENsYXNzcGF0aEVudHJpZXMpIGN1cnJlbnRQYXJlbnQ7CisJCQlncm91cC5zZXRFbnRyaWVzKGVudHJpZXMpOworCQl9CisJCQorCX0KK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL0FudENsYXNzcGF0aExhYmVsUHJvdmlkZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL0FudENsYXNzcGF0aExhYmVsUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjRmNjY1Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvQW50Q2xhc3NwYXRoTGFiZWxQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTQ1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLnByZWZlcmVuY2VzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmNvcmUuQW50Q29yZVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuY29yZS5BbnRDb3JlUHJlZmVyZW5jZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmNvcmUuSUFudENsYXNzcGF0aEVudHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5BbnRVSUltYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuSUFudFVJQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5KYXZhVUk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29sb3JQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2hhcmVkSW1hZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7CisKKy8qKgorICogTGFiZWwgcHJvdmlkZXIgZm9yIGNsYXNzcGF0aCBlbGVtZW50cworICovCitwdWJsaWMgY2xhc3MgQW50Q2xhc3NwYXRoTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElMYWJlbFByb3ZpZGVyLCBJQ29sb3JQcm92aWRlciB7CisKKworCXByaXZhdGUgQW50Q2xhc3NwYXRoQmxvY2sgZkJsb2NrOworCQorCXB1YmxpYyBBbnRDbGFzc3BhdGhMYWJlbFByb3ZpZGVyKEFudENsYXNzcGF0aEJsb2NrIGJsb2NrKSB7CisJCWZCbG9jaz0gYmxvY2s7CisJfQorCisJcHJpdmF0ZSBJbWFnZSBnZXRGb2xkZXJJbWFnZSgpIHsKKwkJcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0U2hhcmVkSW1hZ2VzKCkuZ2V0SW1hZ2UoSVNoYXJlZEltYWdlcy5JTUdfT0JKX0ZPTERFUik7CisJfQorCisJcHJpdmF0ZSBJbWFnZSBnZXRKYXJJbWFnZSgpIHsKKwkJcmV0dXJuIEphdmFVSS5nZXRTaGFyZWRJbWFnZXMoKS5nZXRJbWFnZShvcmcuZWNsaXBzZS5qZHQudWkuSVNoYXJlZEltYWdlcy5JTUdfT0JKU19KQVIpOworCX0KKworCXB1YmxpYyBJbWFnZSBnZXRDbGFzc3BhdGhJbWFnZSgpIHsKKwkJcmV0dXJuIEFudFVJSW1hZ2VzLmdldEltYWdlKElBbnRVSUNvbnN0YW50cy5JTUdfVEFCX0NMQVNTUEFUSCk7CisJfQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKKwkgKi8KKwlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKKwkJU3RyaW5nIGZpbGU7CisJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ2xhc3NwYXRoRW50cnkpIHsKKwkJCUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gKENsYXNzcGF0aEVudHJ5KSBlbGVtZW50OworICAgICAgICAgICAgaWYgKGVudHJ5LmlzRWNsaXBzZVJ1bnRpbWVSZXF1aXJlZCgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFudFVJSW1hZ2VzLmdldEltYWdlKElBbnRVSUNvbnN0YW50cy5JTUdfQU5UX0VDTElQU0VfUlVOVElNRV9PQkpFQ1QpOworICAgICAgICAgICAgfQorCQkJZmlsZT0gZW50cnkudG9TdHJpbmcoKTsKKwkJCWlmIChmaWxlLmVuZHNXaXRoKCIvIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCXJldHVybiBnZXRGb2xkZXJJbWFnZSgpOworCQkJfSAKKwkJCXJldHVybiBnZXRKYXJJbWFnZSgpOworCQl9CisJCQorCQlyZXR1cm4gZ2V0Q2xhc3NwYXRoSW1hZ2UoKTsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKKwkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQW50Q2xhc3NwYXRoRW50cnkpIHsKKyAgICAgICAgICAgIElBbnRDbGFzc3BhdGhFbnRyeSBlbnRyeT0gKElBbnRDbGFzc3BhdGhFbnRyeSllbGVtZW50OworCQkJU3RyaW5nQnVmZmVyIGxhYmVsPSBuZXcgU3RyaW5nQnVmZmVyKGVudHJ5LmdldExhYmVsKCkpOworCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBHbG9iYWxDbGFzc3BhdGhFbnRyaWVzKSB7CisgICAgICAgICAgICAgICAgaWYgKCgoR2xvYmFsQ2xhc3NwYXRoRW50cmllcyllbGVtZW50KS5nZXRUeXBlKCkgPT0gQ2xhc3NwYXRoTW9kZWwuQU5UX0hPTUUpIHsKKyAgICAJCQkJQW50Q29yZVByZWZlcmVuY2VzIHByZWZzPSBBbnRDb3JlUGx1Z2luLmdldFBsdWdpbigpLmdldFByZWZlcmVuY2VzKCk7CisgICAgCQkJCVN0cmluZyBkZWZhdWx0QW50SG9tZT0gcHJlZnMuZ2V0RGVmYXVsdEFudEhvbWUoKTsKKyAgICAJCQkJU3RyaW5nIGN1cnJlbnRBbnRIb21lPSBmQmxvY2suZ2V0QW50SG9tZSgpOworICAgIAkJCQlsYWJlbC5hcHBlbmQoIiAoIik7IC8vJE5PTi1OTFMtMSQKKyAgICAJCQkJaWYgKGRlZmF1bHRBbnRIb21lID09IG51bGwgfHwgZGVmYXVsdEFudEhvbWUuZXF1YWxzKGN1cnJlbnRBbnRIb21lKSkgeworICAgIAkJCQkJbGFiZWwuYXBwZW5kKEFudFByZWZlcmVuY2VzTWVzc2FnZXMuQW50Q2xhc3NwYXRoTGFiZWxQcm92aWRlcl8wKTsKKyAgICAJCQkJfSBlbHNlIHsKKyAgICAJCQkJCWxhYmVsLmFwcGVuZChmQmxvY2suZ2V0QW50SG9tZSgpKTsJCisgICAgCQkJCX0KKyAgICAJCQkJbGFiZWwuYXBwZW5kKCcpJyk7CisgICAgICAgICAgICAgICAgfQorCQkJfSAKKwkJCXJldHVybiBsYWJlbC50b1N0cmluZygpOworCQl9CisJCXJldHVybiBlbGVtZW50LnRvU3RyaW5nKCk7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29sb3JQcm92aWRlciNnZXRCYWNrZ3JvdW5kKGphdmEubGFuZy5PYmplY3QpCisJICovCisJcHVibGljIENvbG9yIGdldEJhY2tncm91bmQoT2JqZWN0IGVsZW1lbnQpIHsKKwkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBHbG9iYWxDbGFzc3BhdGhFbnRyaWVzKSB7CisgICAgICAgICAgICBpbnQgdHlwZT0gKChHbG9iYWxDbGFzc3BhdGhFbnRyaWVzKSBlbGVtZW50KS5nZXRUeXBlKCk7CisgICAgICAgICAgICBpZiAodHlwZSA9PSBDbGFzc3BhdGhNb2RlbC5DT05UUklCVVRFRCkgeworICAgICAgICAgICAgICAgIERpc3BsYXkgZGlzcGxheT0gRGlzcGxheS5nZXRDdXJyZW50KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0lORk9fQkFDS0dST1VORCk7CisgICAgICAgICAgICB9CisJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENsYXNzcGF0aEVudHJ5KSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0QmFja2dyb3VuZCgoKENsYXNzcGF0aEVudHJ5KSBlbGVtZW50KS5nZXRQYXJlbnQoKSk7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29sb3JQcm92aWRlciNnZXRGb3JlZ3JvdW5kKGphdmEubGFuZy5PYmplY3QpCisJICovCisJcHVibGljIENvbG9yIGdldEZvcmVncm91bmQoT2JqZWN0IGVsZW1lbnQpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjYWRkTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyKQorCSAqLworCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNkaXNwb3NlKCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2lzTGFiZWxQcm9wZXJ0eShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nKQorCSAqLworCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNyZW1vdmVMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXIpCisJICovCisJcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgeworCX0KK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL0FudENsYXNzcGF0aFBhZ2UuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL0FudENsYXNzcGF0aFBhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTM0MzhjCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvQW50Q2xhc3NwYXRoUGFnZS5qYXZhCkBAIC0wLDAgKzEsMjUxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLnByZWZlcmVuY2VzOworCisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlbmFtZUZpbHRlcjsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuY29yZS5BbnRDb3JlUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5jb3JlLkFudENvcmVQcmVmZXJlbmNlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuY29yZS5JQW50Q2xhc3NwYXRoRW50cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmNvcmUuQW50Q2xhc3NwYXRoRW50cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLkFudFVJUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5JQW50VUlIZWxwQ29udGV4dElkczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFiRm9sZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYkl0ZW07CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKKworLyoqCisgKiBTdWItcGFnZSB0aGF0IGFsbG93cyB0aGUgdXNlciB0byBlbnRlciBjdXN0b20gY2xhc3NwYXRocworICogdG8gYmUgdXNlZCB3aGVuIHJ1bm5pbmcgQW50IGJ1aWxkIGZpbGVzLgorICovCitwdWJsaWMgY2xhc3MgQW50Q2xhc3NwYXRoUGFnZSBpbXBsZW1lbnRzIElBbnRCbG9ja0NvbnRhaW5lciB7CisKKwlwcml2YXRlIEFudENsYXNzcGF0aEJsb2NrIGZBbnRDbGFzc3BhdGhCbG9jaz0gbmV3IEFudENsYXNzcGF0aEJsb2NrKCk7CisJcHJpdmF0ZSBBbnRSdW50aW1lUHJlZmVyZW5jZVBhZ2UgZlByZWZlcmVuY2VQYWdlOworCXByaXZhdGUgQ2xhc3NwYXRoTW9kZWwgZk1vZGVsOworCQorCS8qKgorCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UuCisJICovCisJcHVibGljIEFudENsYXNzcGF0aFBhZ2UoQW50UnVudGltZVByZWZlcmVuY2VQYWdlIHByZWZlcmVuY2VQYWdlKSB7CisJCWZQcmVmZXJlbmNlUGFnZSA9IHByZWZlcmVuY2VQYWdlOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzcGVjaWZpZWQgdXNlciBjbGFzc3BhdGggZW50cmllcworCSAqIAorCSAqIEByZXR1cm4gc2V0IG9mIHVzZXIgY2xhc3NwYXRoIGVudHJpZXMKKwkgKi8KKwlwcm90ZWN0ZWQgSUFudENsYXNzcGF0aEVudHJ5W10gZ2V0QWRkaXRpb25hbEVudHJpZXMoKSB7CisJCXJldHVybiBmTW9kZWwuZ2V0RW50cmllcyhDbGFzc3BhdGhNb2RlbC5HTE9CQUxfVVNFUik7CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgdGhlIHNwZWNpZmllZCBhbnQgaG9tZSBjbGFzc3BhdGggZW50cmllcworCSAqLworCXByb3RlY3RlZCBJQW50Q2xhc3NwYXRoRW50cnlbXSBnZXRBbnRIb21lRW50cmllcygpIHsKKwkJcmV0dXJuIGZNb2RlbC5nZXRFbnRyaWVzKENsYXNzcGF0aE1vZGVsLkFOVF9IT01FKTsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgY29udHJpYnV0ZWQgY2xhc3NwYXRoIGVudHJpZXMKKwkgKi8KKwlwcm90ZWN0ZWQgSUFudENsYXNzcGF0aEVudHJ5W10gZ2V0Q29udHJpYnV0ZWRFbnRyaWVzKCkgeworCQlyZXR1cm4gZk1vZGVsLmdldEVudHJpZXMoQ2xhc3NwYXRoTW9kZWwuQ09OVFJJQlVURUQpOworCX0KKwkKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldEFudEhvbWUoKSB7CisJCXJldHVybiBmQW50Q2xhc3NwYXRoQmxvY2suZ2V0QW50SG9tZSgpOworCX0KKwkKKwkvKioKKwkgKiBTZXRzIHRoZSBjb250ZW50cyBvZiB0aGUgdGFibGVzIG9uIHRoaXMgcGFnZS4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgeworCQkKKwkJQW50Q29yZVByZWZlcmVuY2VzIHByZWZzPSBBbnRDb3JlUGx1Z2luLmdldFBsdWdpbigpLmdldFByZWZlcmVuY2VzKCk7CisJCWNyZWF0ZUNsYXNzcGF0aE1vZGVsKCk7CisJCWZBbnRDbGFzc3BhdGhCbG9jay5pbml0aWFsaXplQW50SG9tZShwcmVmcy5nZXRBbnRIb21lKCkpOworCQlmQW50Q2xhc3NwYXRoQmxvY2suc2V0SW5wdXQoZk1vZGVsKTsKKwkJCisJCWZQcmVmZXJlbmNlUGFnZS5zZXRFcnJvck1lc3NhZ2UobnVsbCk7CisJCWZQcmVmZXJlbmNlUGFnZS5zZXRWYWxpZCh0cnVlKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ2xhc3NwYXRoTW9kZWwoKSB7CisJCWZNb2RlbD0gbmV3IENsYXNzcGF0aE1vZGVsKCk7CisJCUFudENvcmVQcmVmZXJlbmNlcyBwcmVmcz0gQW50Q29yZVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRQcmVmZXJlbmNlcygpOworCQlmTW9kZWwuc2V0QW50SG9tZUVudHJpZXMocHJlZnMuZ2V0QW50SG9tZUNsYXNzcGF0aEVudHJpZXMoKSk7CisJCWZNb2RlbC5zZXRHbG9iYWxFbnRyaWVzKHByZWZzLmdldEFkZGl0aW9uYWxDbGFzc3BhdGhFbnRyaWVzKCkpOworICAgICAgICBmTW9kZWwuc2V0Q29udHJpYnV0ZWRFbnRyaWVzKHByZWZzLmdldENvbnRyaWJ1dGVkQ2xhc3NwYXRoRW50cmllcygpKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgeworCQlBbnRDb3JlUHJlZmVyZW5jZXMgcHJlZnM9IEFudENvcmVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0UHJlZmVyZW5jZXMoKTsKKwkJZk1vZGVsPSBuZXcgQ2xhc3NwYXRoTW9kZWwoKTsKKwkJZk1vZGVsLnNldEFudEhvbWVFbnRyaWVzKHByZWZzLmdldERlZmF1bHRBbnRIb21lRW50cmllcygpKTsKKwkJTGlzdCBhZGRpdGlvbmFsRW50cmllcz0gZ2V0RGVmYXVsdEFkZGl0aW9uYWxFbnRyaWVzKCk7CisJCWlmIChhZGRpdGlvbmFsRW50cmllcyAhPSBudWxsKSB7CisJCQlmTW9kZWwuc2V0R2xvYmFsRW50cmllcygoSUFudENsYXNzcGF0aEVudHJ5W10pIGFkZGl0aW9uYWxFbnRyaWVzLnRvQXJyYXkobmV3IElBbnRDbGFzc3BhdGhFbnRyeVthZGRpdGlvbmFsRW50cmllcy5zaXplKCldKSk7CisJCX0gZWxzZSB7CisJCQlmTW9kZWwuc2V0R2xvYmFsRW50cmllcyhuZXcgSUFudENsYXNzcGF0aEVudHJ5WzBdKTsKKwkJfQorICAgICAgICBmTW9kZWwuc2V0Q29udHJpYnV0ZWRFbnRyaWVzKHByZWZzLmdldENvbnRyaWJ1dGVkQ2xhc3NwYXRoRW50cmllcygpKTsKKwkJZkFudENsYXNzcGF0aEJsb2NrLmluaXRpYWxpemVBbnRIb21lKHByZWZzLmdldERlZmF1bHRBbnRIb21lKCkpOworCQlmQW50Q2xhc3NwYXRoQmxvY2suc2V0SW5wdXQoZk1vZGVsKTsKKwkJdXBkYXRlKCk7CisJfQorCQorCXByaXZhdGUgTGlzdCBnZXREZWZhdWx0QWRkaXRpb25hbEVudHJpZXMoKSB7CisJCUlBbnRDbGFzc3BhdGhFbnRyeSB0b29sc0phckVudHJ5PSBBbnRDb3JlUGx1Z2luLmdldFBsdWdpbigpLmdldFByZWZlcmVuY2VzKCkuZ2V0VG9vbHNKYXJFbnRyeSgpOworCQkvL1RPRE8gc2hvdWxkIHVzZSBBbnRDb3JlUHJlZmVyZW5jZXMuZ2V0VXNlckxpYnJhcmllcyB3aGVuIHByb21vdGVkIHRvIEFQSSBwb3N0IDMuMQorCQlGaWxlIGxpYkRpcj0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmhvbWUiKSwgIi5hbnQiICsgRmlsZS5zZXBhcmF0b3JDaGFyICsgImxpYiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQlVUkxbXSB1cmxzPSBudWxsOworCQl0cnkgeworCQkJdXJscz0gZ2V0TG9jYXRpb25VUkxzKGxpYkRpcik7CisJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBBbnRVSVBsdWdpbi5sb2coZSk7CisgICAgICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdCgwKTsKKwkJfQorCQkKKwkJTGlzdCBlbnRyaWVzPSBuZXcgQXJyYXlMaXN0KHVybHMubGVuZ3RoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCB1cmxzLmxlbmd0aDsgaSsrKSB7CisJCQlBbnRDbGFzc3BhdGhFbnRyeSBlbnRyeT0gbmV3IEFudENsYXNzcGF0aEVudHJ5KHVybHNbaV0pOworCQkJZW50cmllcy5hZGQoZW50cnkpOworCQl9CisJCWlmICh0b29sc0phckVudHJ5ICE9IG51bGwpIHsKKwkJCWVudHJpZXMuYWRkKHRvb2xzSmFyRW50cnkpOworCQl9CisJCXJldHVybiBlbnRyaWVzOworCX0KKwkKKwlwcml2YXRlIFVSTFtdIGdldExvY2F0aW9uVVJMcyhGaWxlIGxvY2F0aW9uKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKKwkJIGZpbmFsIFN0cmluZyBleHRlbnNpb249ICIuamFyIjsgLy8kTk9OLU5MUy0xJAorCQkgVVJMW10gdXJscyA9IG5ldyBVUkxbMF07CisJCSAKKwkJIGlmICghbG9jYXRpb24uZXhpc3RzKCkpIHsKKwkJCSByZXR1cm4gdXJsczsKKwkJIH0KKwkJIAorCQkgaWYgKCFsb2NhdGlvbi5pc0RpcmVjdG9yeSgpKSB7CisJCQkgdXJscyA9IG5ldyBVUkxbMV07CisJCQkgU3RyaW5nIHBhdGggPSBsb2NhdGlvbi5nZXRQYXRoKCk7CisJCQkgaWYgKHBhdGgudG9Mb3dlckNhc2UoKS5lbmRzV2l0aChleHRlbnNpb24pKSB7CisJCQkJIHVybHNbMF0gPSBsb2NhdGlvbi50b1VSTCgpOworCQkJIH0KKwkJCSByZXR1cm4gdXJsczsKKwkJIH0KKwkJIAorCQkgRmlsZVtdIG1hdGNoZXMgPSBsb2NhdGlvbi5saXN0RmlsZXMoCisJCQkgbmV3IEZpbGVuYW1lRmlsdGVyKCkgeworCQkJCSBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBkaXIsIFN0cmluZyBuYW1lKSB7CisJCQkJCXJldHVybiBuYW1lLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoZXh0ZW5zaW9uKTsKKwkJCQkgfQorCQkJIH0pOworCQkgCisJCSB1cmxzID0gbmV3IFVSTFttYXRjaGVzLmxlbmd0aF07CisJCSBmb3IgKGludCBpID0gMDsgaSA8IG1hdGNoZXMubGVuZ3RoOyArK2kpIHsKKwkJCSB1cmxzW2ldID0gbWF0Y2hlc1tpXS50b1VSTCgpOworCQkgfQorCQkgcmV0dXJuIHVybHM7CisJIH0KKwkKKwkvKioKKwkgKiBDcmVhdGVzIHRoZSB0YWIgaXRlbSB0aGF0IGNvbnRhaW5zIHRoaXMgc3ViLXBhZ2UuCisJICovCisJcHJvdGVjdGVkIFRhYkl0ZW0gY3JlYXRlVGFiSXRlbShUYWJGb2xkZXIgZm9sZGVyKSB7CisJCVRhYkl0ZW0gaXRlbSA9IG5ldyBUYWJJdGVtKGZvbGRlciwgU1dULk5PTkUpOworCQlpdGVtLnNldFRleHQoQW50UHJlZmVyZW5jZXNNZXNzYWdlcy5BbnRDbGFzc3BhdGhQYWdlX3RpdGxlKTsKKwkJaXRlbS5zZXRJbWFnZShmQW50Q2xhc3NwYXRoQmxvY2suZ2V0Q2xhc3NwYXRoSW1hZ2UoKSk7CisJCWl0ZW0uc2V0RGF0YSh0aGlzKTsKKwkJaXRlbS5zZXRDb250cm9sKGNyZWF0ZUNvbnRlbnRzKGZvbGRlcikpOworCQlyZXR1cm4gaXRlbTsKKwl9CisJCisJLyoqCisJICogQ3JlYXRlcyB0aGlzIHBhZ2UncyBjb250cm9scworCSAqLworCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgeworCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhcmVudCwgSUFudFVJSGVscENvbnRleHRJZHMuQU5UX0NMQVNTUEFUSF9QQUdFKTsKKwkJRm9udCBmb250ID0gcGFyZW50LmdldEZvbnQoKTsKKwkJCisJCUNvbXBvc2l0ZSB0b3AgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOworCQl0b3Auc2V0Rm9udChmb250KTsKKwkJCisJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKKwkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOworCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMjsKKwkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMjsKKwkJdG9wLnNldExheW91dChsYXlvdXQpOworCisJCXRvcC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKKworCQlmQW50Q2xhc3NwYXRoQmxvY2suc2V0Q29udGFpbmVyKHRoaXMpOworCQlmQW50Q2xhc3NwYXRoQmxvY2suY3JlYXRlQ29udGVudHModG9wKTsKKwkJCisJCXJldHVybiB0b3A7CisJfQorCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5JQW50QmxvY2tDb250YWluZXIjdXBkYXRlKCkKKwkgKi8KKwlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7CisJCWlmIChmQW50Q2xhc3NwYXRoQmxvY2suaXNWYWxpZGF0ZWQoKSl7CisJCQlyZXR1cm47CisJCX0KKwkJc2V0TWVzc2FnZShudWxsKTsKKwkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOworCQlib29sZWFuIHZhbGlkPSBmQW50Q2xhc3NwYXRoQmxvY2sudmFsaWRhdGVBbnRIb21lKCk7CisJCisJCWlmICh2YWxpZCkgeworCQkJdmFsaWQ9IGZBbnRDbGFzc3BhdGhCbG9jay52YWxpZGF0ZVRvb2xzSkFSKCk7CisJCX0KKwkJCisJCWZQcmVmZXJlbmNlUGFnZS5zZXRWYWxpZCh2YWxpZCk7CisJfQorCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5JQW50QmxvY2tDb250YWluZXIjc2V0TWVzc2FnZShqYXZhLmxhbmcuU3RyaW5nKQorCSAqLworCXB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKKwkJZlByZWZlcmVuY2VQYWdlLnNldE1lc3NhZ2UobWVzc2FnZSk7CisJfQorCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5JQW50QmxvY2tDb250YWluZXIjc2V0RXJyb3JNZXNzYWdlKGphdmEubGFuZy5TdHJpbmcpCisJICovCisJcHVibGljIHZvaWQgc2V0RXJyb3JNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSB7CisJCWZQcmVmZXJlbmNlUGFnZS5zZXRFcnJvck1lc3NhZ2UobWVzc2FnZSk7CisJfQorCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5JQW50QmxvY2tDb250YWluZXIjY3JlYXRlUHVzaEJ1dHRvbihvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIGphdmEubGFuZy5TdHJpbmcpCisJICovCisJcHVibGljIEJ1dHRvbiBjcmVhdGVQdXNoQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBidXR0b25UZXh0KSB7CisJCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlBVU0gpOworCQlidXR0b24uc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKKwkJYnV0dG9uLnNldFRleHQoYnV0dG9uVGV4dCk7CisJCWZQcmVmZXJlbmNlUGFnZS5zZXRCdXR0b25MYXlvdXREYXRhKGJ1dHRvbik7CisJCXJldHVybiBidXR0b247CisJfQorfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvQW50Q29udGVudFByb3ZpZGVyLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9BbnRDb250ZW50UHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDg3NzE4Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvQW50Q29udGVudFByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxMzggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLnByZWZlcmVuY2VzOworCisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJDb21wYXJhdG9yOworCisvKioKKyAqIENvbnRlbnQgcHJvdmlkZXIgdGhhdCBtYWludGFpbnMgYSBnZW5lcmljIGxpc3Qgb2Ygb2JqZWN0cyB3aGljaCBhcmUgc2hvd24gaW4KKyAqIGEgdGFibGUgdmlld2VyLgorICovCitwdWJsaWMgY2xhc3MgQW50Q29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgeworCXByb3RlY3RlZCBMaXN0IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOworCXByb3RlY3RlZCBUYWJsZVZpZXdlciB0YWJsZVZpZXdlcjsKKwlwcml2YXRlIFZpZXdlckNvbXBhcmF0b3IgZkNvbXBhcmF0b3I9IG51bGw7CisJLyoqCisJICogQHNpbmNlIDMuNQorCSAqLworCXByaXZhdGUgYm9vbGVhbiBkZWZhdWx0Y29tcGFyYXRvciA9IHRydWU7CisJCisJCisJLyoqCisJICogRGVmYXVsdCBDb25zdHJ1Y3RvcgorCSAqLworCXB1YmxpYyBBbnRDb250ZW50UHJvdmlkZXIoKSB7CisJfQorCQorCS8qKgorCSAqIENvbnN0cnVjdG9yCisJICogCisJICogQHBhcmFtIGRlZmF1bHRjb21wYXJhdG9yIGlmIHRoZSBkZWZhdWx0IGNvbXBhcmF0b3Igc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSByZXR1cm5lZCBkYXRhCisJICogQHNpbmNlIDMuNQorCSAqLworCXB1YmxpYyBBbnRDb250ZW50UHJvdmlkZXIoYm9vbGVhbiBkZWZhdWx0Y29tcGFyYXRvcikgeworCQl0aGlzLmRlZmF1bHRjb21wYXJhdG9yID0gZGVmYXVsdGNvbXBhcmF0b3I7CisJfQorCQorCS8qKgorCSAqIEFkZCBhbiBlbGVtZW50IHRvIHRoZSBjdXJyZW50IGxpc3Rpbmcgb2YgZWxlbWVudHMgYW5kIHRvIHRoZSB1bmRlcmx5aW5nIHZpZXdlci4gRG9lcyBub3RoaW5nCisJICogaWYgdGhlIGxpc3RpbmcgYWxyZWFkeSBjb250YWlucyB0aGUgZ2l2ZW4gZWxlbWVudAorCSAqIEBwYXJhbSBvCisJICovCisJcHVibGljIHZvaWQgYWRkKE9iamVjdCBvKSB7CisJCWlmIChlbGVtZW50cy5jb250YWlucyhvKSkgeworCQkJcmV0dXJuOworCQl9CisJCWVsZW1lbnRzLmFkZChvKTsKKwkJdGFibGVWaWV3ZXIuYWRkKG8pOworCQl0YWJsZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obyksIHRydWUpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyI2Rpc3Bvc2UoKQorCSAqLworCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyI2dldEVsZW1lbnRzKGphdmEubGFuZy5PYmplY3QpCisJICovCisJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKKwkJcmV0dXJuIGVsZW1lbnRzLnRvQXJyYXkoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlciNpbnB1dENoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXIsIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCisJICovCisJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7CisJCXRhYmxlVmlld2VyID0gKFRhYmxlVmlld2VyKSB2aWV3ZXI7CisJCWVsZW1lbnRzLmNsZWFyKCk7CisJCWlmIChuZXdJbnB1dCAhPSBudWxsKSB7CisJCQlpZihkZWZhdWx0Y29tcGFyYXRvcikgeworCQkJCXRhYmxlVmlld2VyLnNldENvbXBhcmF0b3IoZ2V0Q29tcGFyYXRvcigpKTsKKwkJCX0KKwkJCUxpc3QgbGlzdDsKKwkJCWlmIChuZXdJbnB1dCBpbnN0YW5jZW9mIExpc3QpIHsKKwkJCQlsaXN0PSAoTGlzdCkgbmV3SW5wdXQ7CisJCQl9IGVsc2UgeworCQkJCWxpc3Q9IEFycmF5cy5hc0xpc3QoKE9iamVjdFtdKSBuZXdJbnB1dCk7CQorCQkJfQorCQkJZWxlbWVudHMuYWRkQWxsKGxpc3QpOworCQl9CisJfQorCisJLyoqCisJICogUmVtb3ZlcyB0aGUgZ2l2ZW4gZWxlbWVudCBmcm9tIHRoZSBsaXN0aW5nIG9mIGVsZW1lbnRzIGFuZCBmcm9tIHRoZSBiYWNraW5nIHZpZXdlci4KKwkgKiBAcGFyYW0gbworCSAqLworCXB1YmxpYyB2b2lkIHJlbW92ZShPYmplY3QgbykgeworCQllbGVtZW50cy5yZW1vdmUobyk7CisJCXRhYmxlVmlld2VyLnJlbW92ZShvKTsKKwl9CisJCisJLyoqCisJICogUmVtb3ZlcyB0aGUgZ2l2ZW4gc2VsZWN0aW9uIG9mIHRoZSBsaXN0aW5nIG9mIGVsZW1lbnRzIGFuZCBmcm9tIHRoZSBiYWNraW5nIHZpZXdlcgorCSAqIEBwYXJhbSBzZWxlY3Rpb24KKwkgKi8KKwlwdWJsaWMgdm9pZCByZW1vdmUoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7CisJCU9iamVjdFtdIGFycmF5PSBzZWxlY3Rpb24udG9BcnJheSgpOworCQllbGVtZW50cy5yZW1vdmVBbGwoQXJyYXlzLmFzTGlzdChhcnJheSkpOworCQl0YWJsZVZpZXdlci5yZW1vdmUoYXJyYXkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGRlZmF1bHQgY29tcGFyYXRvciB3aGljaCBjb21wYXJlcyB0aGUge0BsaW5rICN0b1N0cmluZygpfSB2YWx1ZSBvZiB0aGUgZWxlbWVudHMgZm9yIG9yZGVyaW5nCisJICogQHJldHVybiB0aGUgZGVmYXVsdCBjb21wYXJhdG9yCisJICovCisJcHJvdGVjdGVkIFZpZXdlckNvbXBhcmF0b3IgZ2V0Q29tcGFyYXRvcigpIHsKKwkJaWYgKGZDb21wYXJhdG9yID09IG51bGwpIHsKKwkJCWZDb21wYXJhdG9yPSBuZXcgVmlld2VyQ29tcGFyYXRvcigpIHsKKwkJCQkvKiAobm9uLUphdmFkb2MpCisJCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckNvbXBhcmF0b3IjY29tcGFyZShvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlciwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKKwkJCQkgKi8KKwkJCQlwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IGUxLCBPYmplY3QgZTIpIHsKKwkJCQkJcmV0dXJuIGUxLnRvU3RyaW5nKCkuY29tcGFyZVRvSWdub3JlQ2FzZShlMi50b1N0cmluZygpKTsKKwkJCQl9CisJCQl9OworCQl9CisJCXJldHVybiBmQ29tcGFyYXRvcjsKKwl9Cit9CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9BbnRFZGl0b3JQcmVmZXJlbmNlQ29uc3RhbnRzLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9BbnRFZGl0b3JQcmVmZXJlbmNlQ29uc3RhbnRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ2MGIwYgotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL0FudEVkaXRvclByZWZlcmVuY2VDb25zdGFudHMuamF2YQpAQCAtMCwwICsxLDMxMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkucHJlZmVyZW5jZXM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7CisKKy8qKgorICogUHJlZmVyZW5jZSBjb25zdGFudHMgdXNlZCBmb3IgdGhlIEFudCBFZGl0b3IKKyAqLworcHVibGljIGNsYXNzIEFudEVkaXRvclByZWZlcmVuY2VDb25zdGFudHMgeworCisJcHJpdmF0ZSBBbnRFZGl0b3JQcmVmZXJlbmNlQ29uc3RhbnRzKCkgeworCX0KKwkKKwkvKioKKwkgKiBBIG5hbWVkIHByZWZlcmVuY2UgdGhhdCBjb250cm9scyBpZiB0aGUgQW50IEVkaXRvciBjb2RlIGFzc2lzdCBnZXRzIGF1dG8gYWN0aXZhdGVkLgorCSAqIDxwPgorCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Qm9vbGVhbjwvY29kZT4uCisJICogPC9wPgorCSAqLworCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENPREVBU1NJU1RfQVVUT0FDVElWQVRJT049ICJjb250ZW50X2Fzc2lzdF9hdXRvYWN0aXZhdGlvbiI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIEEgbmFtZSBwcmVmZXJlbmNlIHRoYXQgaG9sZHMgdGhlIGF1dG8gYWN0aXZhdGlvbiBkZWxheSB0aW1lIGluIG1pbGxpIHNlY29uZHMuCisJICogPHA+CisJICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5JbnQ8L2NvZGU+LgorCSAqIDwvcD4KKwkgKi8KKwlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDT0RFQVNTSVNUX0FVVE9BQ1RJVkFUSU9OX0RFTEFZPSAiY29udGVudF9hc3Npc3RfYXV0b2FjdGl2YXRpb25fZGVsYXkiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBBIG5hbWVkIHByZWZlcmVuY2UgdGhhdCBjb250cm9scyBpZiB0aGUgQW50IGVkaXRvciBjb2RlIGFzc2lzdCBpbnNlcnRzIGEKKwkgKiBwcm9wb3NhbCBhdXRvbWF0aWNhbGx5IGlmIG9ubHkgb25lIHByb3Bvc2FsIGlzIGF2YWlsYWJsZS4KKwkgKiA8cD4KKwkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkJvb2xlYW48L2NvZGU+LgorCSAqIDwvcD4KKwkgKiBAc2luY2UgMi4xCisJICovCisJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ09ERUFTU0lTVF9BVVRPSU5TRVJUPSAiY29udGVudF9hc3Npc3RfYXV0b2luc2VydCI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIEEgbmFtZWQgcHJlZmVyZW5jZSB0aGF0IGhvbGRzIHRoZSBjaGFyYWN0ZXJzIHRoYXQgYXV0byBhY3RpdmF0ZSBjb2RlIGFzc2lzdCBpbiBhbiBBbnQgYnVpbGRmaWxlLgorCSAqIDxwPgorCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+U3Jpbmc8L2NvZGU+LiBBbGwgY2hhcmFjdGVycyB0aGF0IHRyaWdnZXIgYXV0byBjb2RlIGFzc2lzdCBpbiBhbiBBbnQgYnVpbGRmaWxlLgorCSAqIDwvcD4KKwkgKi8KKwlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDT0RFQVNTSVNUX0FVVE9BQ1RJVkFUSU9OX1RSSUdHRVJTPSAiY29udGVudF9hc3Npc3RfYXV0b2FjdGl2YXRpb25fdHJpZ2dlcnNfamF2YSI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIEEgbmFtZWQgcHJlZmVyZW5jZSB0aGF0IGNvbnRyb2xzIGlmIHRoZSBBbnQgZWRpdG9yIHByZXNlbnRzIGNvZGUgYXNzaXN0IHByb3Bvc2FscyBmb3IKKwkgKiB1c2VyIGRlZmluZWQgdGFza3MKKwkgKiA8cD4KKwkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkJvb2xlYW48L2NvZGU+LgorCSAqIDwvcD4KKwkgKiBAc2luY2UgMy4wCisJICovCisJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ09ERUFTU0lTVF9VU0VSX0RFRklORURfVEFTS1M9ICJjb250ZW50X2Fzc2lzdF91c2VyRGVmaW5lZFRhc2tzIjsgLy8kTk9OLU5MUy0xJAorCQorCS8qKgorCSAqIEEgbmFtZWQgcHJlZmVyZW5jZSB0aGF0IHNwZWNpZmllcyB0aGUgdGFiIHNpemUgZm9yIHRoZSBBbnQgZm9ybWF0dGVyLgorCSAqIDxwPgorCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+aW50PC9jb2RlPi4KKwkgKiA8L3A+CisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STUFUVEVSX1RBQl9TSVpFPSAiZm9ybWF0dGVyX3RhYl9zaXplIjsgLy8kTk9OLU5MUy0xJAorCQorCS8qKgorCSAqIEEgbmFtZWQgcHJlZmVyZW5jZSB0aGF0IHNwZWNpZmllcyBpZiB0aGUgQW50IGZvcm1hdHRlciB1c2VzIHNwYWNlcyBmb3IgdGFicy4KKwkgKiA8cD4KKwkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPmJvb2xlYW48L2NvZGU+LiBJZiA8Y29kZT5mYWxzZTwvY29kZT4gc3BhY2VzIGluc3RlYWQgb2YgdGFicyBhcmUgdXNlZAorCSAqIHdoZW4gZm9ybWF0dGluZy4gSWYgPGNvZGU+dHJ1ZTwvY29kZT4gdGhlIGZvcm1hdHRlciBpbnNlcnRzIGEgdGFiIGNoYXJhY3RlciBmb3IgaW5kZW50aW5nLgorCSAqIDwvcD4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVRURVJfVEFCX0NIQVI9ICJmb3JtYXR0ZXJfdGFiX2NoYXIiOyAvLyROT04tTkxTLTEkCisJCisJLyoqCisJICogQSBuYW1lZCBwcmVmZXJlbmNlIHRoYXQgc3BlY2lmaWVzIGlmIHRoZSBBbnQgZm9ybWF0dGVyIGFsaWducyB0aGUgZmluYWwKKwkgKiAmcXVvdGUmZ3QmcXVvdGUgaW4gbXVsdGktbGluZSBlbGVtZW50IHRhZ3MKKwkgKiA8cD4KKwkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkJvb2xlYW48L2NvZGU+LiBJZiA8Y29kZT50cnVlPC9jb2RlPiB0aGUgZmluYWwKKwkgKiAmcXVvdGUmZ3QmcXVvdGUgaW4gbXVsdGktbGluZSBlbGVtZW50IHRhZ3MgYXJlIGFsaWduZWQgYnkgdGhlIGZvcm1hdHRlci4KKwkgKiA8L3A+CisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STUFUVEVSX0FMSUdOPSAiZm9ybWF0dGVyX2FsaWduIjsgLy8kTk9OLU5MUy0xJAorCQorCS8qKgorCSAqIEEgbmFtZWQgcHJlZmVyZW5jZSB0aGF0IHNwZWNpZmllcyB0aGUgbWF4aW11bSBsaW5lIGxlbmd0aCBmb3IgdGhlIEFudCBmb3JtYXR0ZXIuCisJICogPHA+CisJICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5pbnQ8L2NvZGU+LgorCSAqIDwvcD4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVRURVJfTUFYX0xJTkVfTEVOR1RIPSAiZm9ybWF0dGVyX21heF9saW5lX2xlbmd0aCI7IC8vJE5PTi1OTFMtMSQKKwkJCQorCS8qKgorCSAqIEEgbmFtZWQgcHJlZmVyZW5jZSB0aGF0IHNwZWNpZmllcyBpZiB0aGUgQW50IGZvcm1hdHRlciBzaG91bGQgd3JhcCBlbGVtZW50cyB0aGF0IGFyZSBsb25nZXIgdGhhbgorCSAqIHRoZSBtYXhpbXVtIGxpbmUgbGVuZ3RoLgorCSAqIDxwPgorCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Qm9vbGVhbjwvY29kZT4uIElmIDxjb2RlPnRydWU8L2NvZGU+IGxvbmcgZWxlbWVudHMgYXJlIHdyYXBwZWQKKwkgKiB3aGVuIGZvcm1hdHRpbmcgaW4gdGhlIGVkaXRvci4KKwkgKiA8L3A+CisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STUFUVEVSX1dSQVBfTE9ORz0gImZvcm1hdHRlcl93cmFwX2xvbmciOyAvLyROT04tTkxTLTEkCisJCisJLyoqCisJICogQm9vbGVhbiBwcmVmZXJlbmNlIGlkZW50aWZpZXIgY29uc3RhbnQgd2hpY2ggc3BlY2lmaWVzIHdoZXRoZXIgdGhlIEFudCBlZGl0b3Igc2hvdWxkCisJICogZm9ybWF0IHRlbXBsYXRlcyBvbiBpbnNlcnQuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVNUExBVEVTX1VTRV9DT0RFRk9STUFUVEVSPSAidGVtcGxhdGVzX3VzZV9jb2RlZm9ybWF0dGVyIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogUHJlZmVyZW5jZSBrZXkgc3VmZml4IGZvciBib2xkIHRleHQgc3R5bGUgcHJlZmVyZW5jZSBrZXlzLgorCSAqIAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRPUl9CT0xEX1NVRkZJWD0gIl9ib2xkIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogUHJlZmVyZW5jZSBrZXkgc3VmZml4IGZvciBpdGFsaWMgdGV4dCBzdHlsZSBwcmVmZXJlbmNlIGtleXMuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVE9SX0lUQUxJQ19TVUZGSVg9ICJfaXRhbGljIjsgLy8kTk9OLU5MUy0xJAorCQorCS8qKgorCSAqIFByZWZlcmVuY2Uga2V5IHByZWZpeCBmb3IgYWxsIHByb2JsZW0gcHJlZmVyZW5jZSBrZXlzLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0JMRU09ICJwcm9ibGVtIjsgLy8kTk9OLU5MUy0xJAorCQorCS8qKgorCSAqIFN0cmluZyBwcmVmZXJlbmNlIGlkZW50aWZpZXIgY29uc3RhbnQgd2hpY2ggc3BlY2lmaWVzIHRoZSBzZXZlcml0eSBsZXZlbCBmb3IgcHJvYmxlbXMKKwkgKiByZWxhdGVkIHRvIGNsYXNzcGF0aCBpbiB0aGUgQW50IGVkaXRvcgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0JMRU1fQ0xBU1NQQVRIPSBQUk9CTEVNICsgIl9jbGFzc3BhdGgiOyAgLy8kTk9OLU5MUy0xJAorCQorCS8qKgorCSAqIFN0cmluZyBwcmVmZXJlbmNlIGlkZW50aWZpZXIgY29uc3RhbnQgd2hpY2ggc3BlY2lmaWVzIHRoZSBzZXZlcml0eSBsZXZlbCBmb3IgcHJvYmxlbXMKKwkgKiByZWxhdGVkIHRvIHByb3BlcnRpZXMgaW4gdGhlIEFudCBlZGl0b3IKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9CTEVNX1BST1BFUlRJRVM9IFBST0JMRU0gKyAiX3Byb3BlcnRpZXMiOyAgLy8kTk9OLU5MUy0xJAorCQorCS8qKgorCSAqIFN0cmluZyBwcmVmZXJlbmNlIGlkZW50aWZpZXIgY29uc3RhbnQgd2hpY2ggc3BlY2lmaWVzIHRoZSBzZXZlcml0eSBsZXZlbCBmb3IgcHJvYmxlbXMKKwkgKiByZWxhdGVkIHRvIGltcG9ydHMgaW4gdGhlIEFudCBlZGl0b3IKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9CTEVNX0lNUE9SVFM9IFBST0JMRU0gKyAiX2ltcG9ydHMiOyAgLy8kTk9OLU5MUy0xJAorCQorCS8qKgorCSAqIFN0cmluZyBwcmVmZXJlbmNlIGlkZW50aWZpZXIgY29uc3RhbnQgd2hpY2ggc3BlY2lmaWVzIHRoZSBzZXZlcml0eSBsZXZlbCBmb3IgcHJvYmxlbXMKKwkgKiByZWxhdGVkIHRvIHRhc2tzIGluIHRoZSBBbnQgZWRpdG9yCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPQkxFTV9UQVNLUz0gUFJPQkxFTSArICJfdGFza3MiOyAgLy8kTk9OLU5MUy0xJAorICAgIAorICAgIC8qKgorICAgICAqIFN0cmluZyBwcmVmZXJlbmNlIGlkZW50aWZpZXIgY29uc3RhbnQgd2hpY2ggc3BlY2lmaWVzIHRoZSBzZXZlcml0eSBsZXZlbCBmb3IgcHJvYmxlbXMKKyAgICAgKiByZWxhdGVkIHRvIHNlY3VyaXR5IGV4Y2VwdGlvbnMgaW4gdGhlIEFudCBlZGl0b3IKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9CTEVNX1NFQ1VSSVRZPSBQUk9CTEVNICsgIl9zZWN1cml0eSI7ICAvLyROT04tTkxTLTEkCisJCisJLyoqCisJICogVGhlIGNvbnN0YW50cyBhbGxvd2FibGUgZm9yIHRoZSBzZXZlcml0eSBsZXZlbHMgZm9yIHByb2JsZW0gcHJlZmVyZW5jZXMKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCVUlMREZJTEVfRVJST1IgPSAiZXJyb3IiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVJTERGSUxFX1dBUk5JTkcgPSAid2FybmluZyI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCVUlMREZJTEVfSUdOT1JFID0gImlnbm9yZSI7IC8vJE5PTi1OTFMtMSQKKwkKKwkvKioKKwkgKiBBIG5hbWVkIHByZWZlcmVuY2UgdGhhdCBjb250cm9scyB3aGV0aGVyIHByb2JsZW0gcmVwb3J0aW5nIGlzIGVuYWJsZWQgaW4gdGhlIEFudCBlZGl0b3IuCisJICogPHA+CisJICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5Cb29sZWFuPC9jb2RlPi4KKwkgKiA8L3A+CisJICogCisJICogQHNpbmNlIDMuMQorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJVSUxERklMRV9JR05PUkVfQUxMID0gImlnbm9yZUFsbCI7IC8vJE5PTi1OTFMtMSQKKwkKKwkvKioKKwkgKiBBIG5hbWVkIHByZWZlcmVuY2UgdGhhdCBsaXN0cyB0aGUgbmFtZXMgb2YgYnVpbGRmaWxlcyB0byBub3QgZG8gcHJvYmxlbSByZXBvcnRpbmcgZm9yCisJICogPHA+CisJICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5TdHJpbmc8L2NvZGU+LgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAc2luY2UgMy4xCisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgQlVJTERGSUxFX05BTUVTX1RPX0lHTk9SRSA9ICJpZ25vcmVOYW1lcyI7IC8vJE5PTi1OTFMtMSQKKwkKKwkvKioKKwkgKiBBIG5hbWVkIHByZWZlcmVuY2UgdGhhdCBjb250cm9scyB3aGV0aGVyIGZvbGRpbmcgaXMgZW5hYmxlZCBpbiB0aGUgQW50IGVkaXRvci4KKwkgKiA8cD4KKwkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkJvb2xlYW48L2NvZGU+LgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAc2luY2UgMy4xCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVE9SX0ZPTERJTkdfRU5BQkxFRD0gImVkaXRvcl9mb2xkaW5nX2VuYWJsZWQiOyAvLyROT04tTkxTLTEkCisJCisJLyoqCisJICogQSBuYW1lZCBwcmVmZXJlbmNlIHRoYXQgc3RvcmVzIHRoZSB2YWx1ZSBmb3IgY29tbWVudCBmb2xkaW5nLgorCSAqIDxwPgorCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Qm9vbGVhbjwvY29kZT4uCisJICogPC9wPgorCSAqIAorCSAqIEBzaW5jZSAzLjEKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUT1JfRk9MRElOR19DT01NRU5UUz0gImVkaXRvcl9mb2xkaW5nX2NvbW1lbnRzIjsgLy8kTk9OLU5MUy0xJAorCQorCS8qKgorCSAqIEEgbmFtZWQgcHJlZmVyZW5jZSB0aGF0IHN0b3JlcyB0aGUgdmFsdWUgZm9yIHRhcmdldCBmb2xkaW5nLgorCSAqIDxwPgorCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Qm9vbGVhbjwvY29kZT4uCisJICogPC9wPgorCSAqIAorCSAqIEBzaW5jZSAzLjEKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUT1JfRk9MRElOR19UQVJHRVRTPSAiZWRpdG9yX2ZvbGRpbmdfdGFyZ2V0cyI7IC8vJE5PTi1OTFMtMSQKKwkKKwkvKioKKwkgKiBBIG5hbWVkIHByZWZlcmVuY2UgdGhhdCBzdG9yZXMgdGhlIHZhbHVlIGZvciBEVEQgZm9sZGluZy4KKwkgKiA8cD4KKwkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkJvb2xlYW48L2NvZGU+LgorCSAqIDwvcD4KKwkgKiAKKwkgKiBAc2luY2UgMy4xCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVE9SX0ZPTERJTkdfRFREPSAiZWRpdG9yX2ZvbGRpbmdfZHRkIjsgLy8kTk9OLU5MUy0xJAorCQorCS8qKgorCSAqIEEgbmFtZWQgcHJlZmVyZW5jZSB0aGF0IHN0b3JlcyB0aGUgdmFsdWUgZm9yIGRlZmluaW5nIGVsZW1lbnRzIGZvbGRpbmcuCisJICogPHA+CisJICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5Cb29sZWFuPC9jb2RlPi4KKwkgKiA8L3A+CisJICogCisJICogQHNpbmNlIDMuMQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRPUl9GT0xESU5HX0RFRklOSU5HPSAiZWRpdG9yX2ZvbGRpbmdfZGVmaW5pbmciOyAvLyROT04tTkxTLTEkCisJCisJLyoqCisJICogQSBuYW1lZCBwcmVmZXJlbmNlIHRoYXQgY29udHJvbHMgaWYgc2VnbWVudGVkIHZpZXcgKHNob3cgc2VsZWN0ZWQgZWxlbWVudCBvbmx5KSBpcyB0dXJuZWQgb24gb3Igb2ZmLgorCSAqIDxwPgorCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Qm9vbGVhbjwvY29kZT4uCisJICogPC9wPgorCSAqIEBzaW5jZSAzLjEKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUT1JfU0hPV19TRUdNRU5UUz0gImVkaXRvcl9zaG93X3NlZ21lbnRzIjsgLy8kTk9OLU5MUy0xJAorCQorCS8qKgorCSAqIEEgbmFtZWQgcHJlZmVyZW5jZSB0aGF0IGNvbnRyb2xzIGlmIG9jY3VycmVuY2VzIGFyZSBtYXJrZWQgaW4gdGhlIGVkaXRvcgorCSAqIDxwPgorCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Qm9vbGVhbjwvY29kZT4uCisJICogPC9wPgorCSAqIEBzaW5jZSAzLjEKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUT1JfTUFSS19PQ0NVUlJFTkNFUz0gImVkaXRvcl9tYXJrX29jY3VycmVuY2VzIjsgLy8kTk9OLU5MUy0xJAorICAgIAorICAgIC8qKgorICAgICAqIEEgbmFtZWQgcHJlZmVyZW5jZSB0aGF0IGNvbnRyb2xzIGlmIGJhY2tncm91bmQgcmVjb25jaWxpbmcgaXMgdHJpZ2dlcmVkIGJ5IHRoZSB1c2VyCisgICAgICogdHlwaW5nIGluIHRoZSBlZGl0b3IKKyAgICAgKiA8cD4KKyAgICAgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkJvb2xlYW48L2NvZGU+LgorICAgICAqIDwvcD4KKyAgICAgKiBAc2luY2UgMy4xCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVE9SX1JFQ09OQ0lMRT0gImVkaXRvcl9yZWNvbmNpbGUiOyAvLyROT04tTkxTLTEkCisJCisJLyoqCisJICogQSBuYW1lZCBwcmVmZXJlbmNlIHRoYXQgY29udHJvbHMgd2hldGhlciBvY2N1cnJlbmNlcyBhcmUgc3RpY2t5IGluIHRoZSBlZGl0b3IuCisJICogPHA+CisJICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5Cb29sZWFuPC9jb2RlPi4KKwkgKiA8L3A+CisJICoKKwkgKiBAc2luY2UgMy4xCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVE9SX1NUSUNLWV9PQ0NVUlJFTkNFUz0gInN0aWNreU9jY3VycmVuY2VzIjsgLy8kTk9OLU5MUy0xJAorCisKKwlwdWJsaWMgc3RhdGljIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRWYWx1ZXMoSVByZWZlcmVuY2VTdG9yZSBzdG9yZSkgeworCQkKKwkJc3RvcmUuc2V0RGVmYXVsdChDT0RFQVNTSVNUX0FVVE9JTlNFUlQsIHRydWUpOworCQlzdG9yZS5zZXREZWZhdWx0KENPREVBU1NJU1RfVVNFUl9ERUZJTkVEX1RBU0tTLCB0cnVlKTsKKwkJc3RvcmUuc2V0RGVmYXVsdChDT0RFQVNTSVNUX0FVVE9BQ1RJVkFUSU9OLCB0cnVlKTsKKwkJc3RvcmUuc2V0RGVmYXVsdChDT0RFQVNTSVNUX0FVVE9BQ1RJVkFUSU9OX0RFTEFZLCA1MDApOworCQlzdG9yZS5zZXREZWZhdWx0KENPREVBU1NJU1RfQVVUT0FDVElWQVRJT05fVFJJR0dFUlMsICI8JHsiKTsgLy8kTk9OLU5MUy0xJAorCQkKKwkJc3RvcmUuc2V0RGVmYXVsdChGT1JNQVRURVJfVEFCX0NIQVIsIHRydWUpOworCQlzdG9yZS5zZXREZWZhdWx0KEZPUk1BVFRFUl9UQUJfU0laRSwgNCk7CisJCXN0b3JlLnNldERlZmF1bHQoRk9STUFUVEVSX0FMSUdOLCBmYWxzZSk7CisJCXN0b3JlLnNldERlZmF1bHQoRk9STUFUVEVSX01BWF9MSU5FX0xFTkdUSCwgODApOworCQlzdG9yZS5zZXREZWZhdWx0KEZPUk1BVFRFUl9XUkFQX0xPTkcsIGZhbHNlKTsKKwkJCisJCXN0b3JlLnNldERlZmF1bHQoVEVNUExBVEVTX1VTRV9DT0RFRk9STUFUVEVSLCB0cnVlKTsKKwkJCisgICAgICAgIHN0b3JlLnNldERlZmF1bHQoUFJPQkxFTV9TRUNVUklUWSwgQlVJTERGSUxFX1dBUk5JTkcpOworCQlzdG9yZS5zZXREZWZhdWx0KFBST0JMRU1fQ0xBU1NQQVRILCBCVUlMREZJTEVfV0FSTklORyk7CisJCXN0b3JlLnNldERlZmF1bHQoUFJPQkxFTV9QUk9QRVJUSUVTLCBCVUlMREZJTEVfSUdOT1JFKTsKKwkJc3RvcmUuc2V0RGVmYXVsdChQUk9CTEVNX0lNUE9SVFMsIEJVSUxERklMRV9XQVJOSU5HKTsKKwkJc3RvcmUuc2V0RGVmYXVsdChQUk9CTEVNX1RBU0tTLCBCVUlMREZJTEVfSUdOT1JFKTsKKwkJCisJCXN0b3JlLnNldERlZmF1bHQoRURJVE9SX0ZPTERJTkdfRU5BQkxFRCwgdHJ1ZSk7CisJCQorCQlzdG9yZS5zZXREZWZhdWx0KEVESVRPUl9TSE9XX1NFR01FTlRTLCBmYWxzZSk7CisJCQorCQlzdG9yZS5zZXREZWZhdWx0KEVESVRPUl9NQVJLX09DQ1VSUkVOQ0VTLCBmYWxzZSk7CisJCXN0b3JlLnNldERlZmF1bHQoRURJVE9SX1NUSUNLWV9PQ0NVUlJFTkNFUywgdHJ1ZSk7CisJCQorCQlzdG9yZS5zZXREZWZhdWx0KEJVSUxERklMRV9JR05PUkVfQUxMLCBmYWxzZSk7CisgICAgICAgIAorICAgICAgICBzdG9yZS5zZXREZWZhdWx0KEVESVRPUl9SRUNPTkNJTEUsIHRydWUpOworCX0KK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL0FudFBhZ2UuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL0FudFBhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTUwNDdhCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvQW50UGFnZS5qYXZhCkBAIC0wLDAgKzEsNDczIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5wcmVmZXJlbmNlczsKKworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwuY29yZS5BbnRPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLkFudFVJUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5Db2x1bW5Tb3J0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1NldHRpbmdzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uTGF5b3V0RGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbldlaWdodERhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Eb3VibGVDbGlja0V2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSURvdWJsZUNsaWNrTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZUxheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJGb2xkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFiSXRlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOworCisvKioKKyAqIFByb3ZpZGVzIHRoZSBnZW5lcmljIGltcGxlbWVudGF0aW9uIGZvciBhIHN1Yi1wYWdlIGluIHRoZQorICogQW50IHByZWZlcmVuY2UgcGFnZS4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFudFBhZ2UgeworICAgIAorICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEFERF9CVVRUT04gPSBJRGlhbG9nQ29uc3RhbnRzLkNMSUVOVF9JRCArIDE7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgRURJVF9CVVRUT04gPSBJRGlhbG9nQ29uc3RhbnRzLkNMSUVOVF9JRCArIDI7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgUkVNT1ZFX0JVVFRPTiA9IElEaWFsb2dDb25zdGFudHMuQ0xJRU5UX0lEICsgMzsKKyAgICAKKwlwcm90ZWN0ZWQgU2VsZWN0aW9uQWRhcHRlciBzZWxlY3Rpb25BZGFwdGVyID0gbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CisJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCWJ1dHRvblByZXNzZWQoKChJbnRlZ2VyKSBlLndpZGdldC5nZXREYXRhKCkpLmludFZhbHVlKCkpOworCQl9CisJfTsKKwkKKwlwcml2YXRlIEFudFJ1bnRpbWVQcmVmZXJlbmNlUGFnZSBwcmVmZXJlbmNlUGFnZTsKKwlwcml2YXRlIFRhYmxlVmlld2VyIHRhYmxlVmlld2VyOworCXByaXZhdGUgQW50Q29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlcjsKKwlwcml2YXRlIEFudE9iamVjdExhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBBbnRPYmplY3RMYWJlbFByb3ZpZGVyKCk7CisJCisJcHJvdGVjdGVkIEJ1dHRvbiBlZGl0QnV0dG9uOworCXByb3RlY3RlZCBCdXR0b24gcmVtb3ZlQnV0dG9uOworICAgIAorCXByaXZhdGUgZmluYWwgU3RyaW5nW10gZlRhYmxlQ29sdW1uSGVhZGVycz0geworCSAgICAgICAgQW50UHJlZmVyZW5jZXNNZXNzYWdlcy5BbnRQYWdlXzAsIEFudFByZWZlcmVuY2VzTWVzc2FnZXMuQW50UGFnZV8xLCBBbnRQcmVmZXJlbmNlc01lc3NhZ2VzLkFudFBhZ2VfMiwgQW50UHJlZmVyZW5jZXNNZXNzYWdlcy5BbnRQYWdlXzMKKwl9OworCXByaXZhdGUgZmluYWwgQ29sdW1uTGF5b3V0RGF0YVtdIGZUYWJsZUNvbHVtbkxheW91dHM9IHsKKwkgICAgICAgIG5ldyBDb2x1bW5XZWlnaHREYXRhKDMzKSwKKwkgICAgICAgIG5ldyBDb2x1bW5XZWlnaHREYXRhKDIzKSwKKwkgICAgICAgIG5ldyBDb2x1bW5XZWlnaHREYXRhKDIyKSwKKwkgICAgICAgIG5ldyBDb2x1bW5XZWlnaHREYXRhKDIyKQorCX07ICAKKworCS8qKgorCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhpcyBwYWdlLgorCSAqLworCXB1YmxpYyBBbnRQYWdlKEFudFJ1bnRpbWVQcmVmZXJlbmNlUGFnZSBwcmVmZXJlbmNlUGFnZSkgeworCQlzdXBlcigpOworCQl0aGlzLnByZWZlcmVuY2VQYWdlID0gcHJlZmVyZW5jZVBhZ2U7CisJfQorCQorCS8qKgorCSAqIEFkZHMgYnV0dG9ucyBzcGVjaWZpYyB0byB0aGUgcGFnZS4KKwkgKi8KKwlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBhZGRCdXR0b25zVG9CdXR0b25Hcm91cChDb21wb3NpdGUgcGFyZW50KTsKKwkKKwkvKioKKwkgKiBHaXZlIHRoaXMgcGFnZSBhIGNoYW5jZSB0byBpbml0aWFsaXplIGl0c2VsZgorCSAqLworCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGluaXRpYWxpemUoKTsKKwkKKwkvKioKKwkgKiBBZGRzIGFuIG9iamVjdCB0byB0aGUgY29udGVudHMKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGRDb250ZW50KE9iamVjdCBvKSB7CisJCWlmIChjb250ZW50UHJvdmlkZXIgIT0gbnVsbCkgeworCQkJY29udGVudFByb3ZpZGVyLmFkZChvKTsKKwkJfQorCX0KKwkKKwkvKiAobm9uLUphdmFkb2MpCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkucHJlZmVyZW5jZXMuQW50UGFnZSNidXR0b25QcmVzc2VkKGludCkKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgYnV0dG9uSWQpIHsKKyAgICAgICAgc3dpdGNoIChidXR0b25JZCkgeworICAgICAgICAgICAgY2FzZSBBRERfQlVUVE9OIDoKKyAgICAgICAgICAgICAgICBhZGQoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRURJVF9CVVRUT04gOgorICAgICAgICAgICAgICAgIGVkaXQoZ2V0U2VsZWN0aW9uKCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBSRU1PVkVfQlVUVE9OIDoKKyAgICAgICAgICAgICAgICByZW1vdmUoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKwkvKioKKwkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgYnV0dG9uIHdpdGggYXBwcm9wcmlhdGUgc2l6ZSBhbmQgbGF5b3V0LgorCSAqIAorCSAqIEBwYXJhbSBwYXJlbnQgdGhlIGNvbnRyb2wgdG8gY3JlYXRlIHRoZSBidXR0b24gb24KKwkgKiBAcGFyYW0gbGFiZWxLZXkgdGhlIGtleSB0byBsb29rdXAgdGhlIGJ1dHRvbidzIGxhYmVsCisJICogQHBhcmFtIGJ1dHRvbklkIHRoZSBpZCB0byBhc3NpZ24gdG8gdGhpcyBidXR0b24KKwkgKiBAcmV0dXJuIGEgbmV3IGFuZCBpbml0aWFsaXplZCBidXR0b24KKwkgKi8KKwlwcm90ZWN0ZWQgQnV0dG9uIGNyZWF0ZVB1c2hCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGJ1dHRvblRleHQsIGludCBidXR0b25JZCkgeworCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5QVVNIKTsKKwkJYnV0dG9uLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7CisJCWJ1dHRvbi5zZXRUZXh0KGJ1dHRvblRleHQpOworCQlidXR0b24uc2V0RGF0YShuZXcgSW50ZWdlcihidXR0b25JZCkpOworCQlidXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uQWRhcHRlcik7CisJCXByZWZlcmVuY2VQYWdlLnNldEJ1dHRvbkxheW91dERhdGEoYnV0dG9uKTsKKwkJcmV0dXJuIGJ1dHRvbjsKKwl9CisJCisJLyoqCisJICogQ3JlYXRlcyB0aGUgZ3JvdXAgd2hpY2ggd2lsbCBjb250YWluIHRoZSBidXR0b25zLgorCSAqLworCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbkdyb3VwKENvbXBvc2l0ZSB0b3ApIHsKKwkJQ29tcG9zaXRlIGJ1dHRvbkdyb3VwID0gbmV3IENvbXBvc2l0ZSh0b3AsIFNXVC5OT05FKTsKKwkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOworCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKKwkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKKwkJYnV0dG9uR3JvdXAuc2V0TGF5b3V0KGxheW91dCk7CisJCWJ1dHRvbkdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfVkVSVElDQUwpKTsKKwkJYnV0dG9uR3JvdXAuc2V0Rm9udCh0b3AuZ2V0Rm9udCgpKTsKKwkJCisJCWFkZEJ1dHRvbnNUb0J1dHRvbkdyb3VwKGJ1dHRvbkdyb3VwKTsKKwl9CisJCisJLyoqCisJICogQ3JlYXRlcyB0aGUgdGFibGUgdmlld2VyLgorCSAqLworCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVRhYmxlKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJVGFibGUgdGFibGUgPSBuZXcgVGFibGUocGFyZW50LCBTV1QuTVVMVEkgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuQk9SREVSKTsKKwkJR3JpZERhdGEgZGF0YT0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7CisJCWRhdGEud2lkdGhIaW50ID0gNDI1OworCQlkYXRhLmhlaWdodEhpbnQgPSB0YWJsZS5nZXRJdGVtSGVpZ2h0KCk7CisJCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAxOworCQl0YWJsZS5zZXRMYXlvdXREYXRhKGRhdGEpOworCQl0YWJsZS5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOworICAgICAgICAKKwkJVGFibGVMYXlvdXQgdGFibGVMYXlvdXQgPSBuZXcgVGFibGVMYXlvdXQoKTsKKwkJdGFibGUuc2V0TGF5b3V0KHRhYmxlTGF5b3V0KTsKKwkJdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKKwkJdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOworCQkKKwkJY29udGVudFByb3ZpZGVyID0gZ2V0Q29udGVudFByb3ZpZGVyKCk7CisJCXRhYmxlVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHRhYmxlKTsKKwkJdGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7CisJCXRhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIodGhpcy5sYWJlbFByb3ZpZGVyKTsKKwkJdGFibGVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKKwkJCQl0YWJsZVNlbGVjdGlvbkNoYW5nZWQoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKSk7CisJCQl9CisJCX0pOworCQkKKwkJdGFibGVWaWV3ZXIuYWRkRG91YmxlQ2xpY2tMaXN0ZW5lcihuZXcgSURvdWJsZUNsaWNrTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBkb3VibGVDbGljayhEb3VibGVDbGlja0V2ZW50IGV2ZW50KSB7CisJCQkJaWYgKCFldmVudC5nZXRTZWxlY3Rpb24oKS5pc0VtcHR5KCkgJiYgZWRpdEJ1dHRvbi5pc0VuYWJsZWQoKSkgeworCQkJCQllZGl0KChJU3RydWN0dXJlZFNlbGVjdGlvbilldmVudC5nZXRTZWxlY3Rpb24oKSk7CisJCQkJfQorCQkJfQorCQl9KTsKKwkJQXJyYXlMaXN0IHNvcnRlcnMgPSBuZXcgQXJyYXlMaXN0KGZUYWJsZUNvbHVtbkhlYWRlcnMubGVuZ3RoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBmVGFibGVDb2x1bW5IZWFkZXJzLmxlbmd0aDsgaSsrKSB7CisJCSAgICB0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKGZUYWJsZUNvbHVtbkxheW91dHNbaV0pOworCQkgICAgVGFibGVDb2x1bW4gY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSwgaSk7CisJCSAgICBjb2x1bW4uc2V0UmVzaXphYmxlKGZUYWJsZUNvbHVtbkxheW91dHNbaV0ucmVzaXphYmxlKTsKKwkJICAgIGNvbHVtbi5zZXRUZXh0KGZUYWJsZUNvbHVtbkhlYWRlcnNbaV0pOworCQkgICAgc29ydGVycy5hZGQobmV3IENvbHVtblNvcnRlcih0aGlzLnRhYmxlVmlld2VyLCBjb2x1bW4pIHsKKwkJICAgIAlwdWJsaWMgU3RyaW5nIGdldENvbXBhcmVUZXh0KE9iamVjdCBvYmosIGludCBjb2x1bW5pbmRleCkgeworCQkgICAgCQlyZXR1cm4gQW50UGFnZS50aGlzLmxhYmVsUHJvdmlkZXIuZ2V0Q29sdW1uVGV4dChvYmosIGNvbHVtbmluZGV4KTsKKwkJICAgIAl9CisJCSAgICB9KTsKKwkJfQorCQkKKwkJdGFibGUuYWRkS2V5TGlzdGVuZXIobmV3IEtleUFkYXB0ZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGV2ZW50KSB7CisJCQkJaWYgKGVkaXRCdXR0b24uaXNFbmFibGVkKCkgJiYgZXZlbnQuY2hhcmFjdGVyID09IFNXVC5ERUwgJiYgZXZlbnQuc3RhdGVNYXNrID09IDApIHsKKwkJCQkJcmVtb3ZlKHRhYmxlVmlld2VyKTsKKwkJCQl9CisJCQl9CisJCX0pOwkKKwkJCisJCXJlc3RvcmVDb2x1bW5TZXR0aW5ncyhBbnRVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGlhbG9nU2V0dGluZ3MoKSwgc29ydGVycyk7CisJfQorCQorCS8qKgorCSAqIFBlcnNpc3QgdGFibGUgc2V0dGluZ3MgaW50byB0aGUgZ2l2ZSBkaWFsb2cgc3RvcmUsIHByZWZpeGVkCisJICogd2l0aCB0aGUgZ2l2ZW4ga2V5LgorCSAqIAorCSAqIEBwYXJhbSBzZXR0aW5ncyBkaWFsb2cgc3RvcmUKKwkgKiBAc2luY2UgMy41CisJICovCisJcHVibGljIHZvaWQgc2F2ZUNvbHVtblNldHRpbmdzKElEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncykgeworCQlUYWJsZSB0YWJsZSA9IHRoaXMudGFibGVWaWV3ZXIuZ2V0VGFibGUoKTsKKyAgICAgICAgaW50IGNvbHVtbkNvdW50ID0gdGFibGUuZ2V0Q29sdW1uQ291bnQoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5Db3VudDsgaSsrKSB7CisJCQlzZXR0aW5ncy5wdXQoZ2V0SGVscENvbnRleHRJZCgpICsgIi5jb2x1bW5XaWR0aCIgKyBpLCB0YWJsZS5nZXRDb2x1bW4oaSkuZ2V0V2lkdGgoKSk7CSAvLyROT04tTkxTLTEkCisJCX0KKwkJVGFibGVDb2x1bW4gY29sdW1uID0gdGFibGUuZ2V0U29ydENvbHVtbigpOworCQlpZihjb2x1bW4gIT0gbnVsbCkgeworCQkJc2V0dGluZ3MucHV0KGdldEhlbHBDb250ZXh0SWQoKSArICIuc29ydENvbHVtbiIsIHRhYmxlLmluZGV4T2YoY29sdW1uKSk7IC8vJE5PTi1OTFMtMSQKKwkJCXNldHRpbmdzLnB1dChnZXRIZWxwQ29udGV4dElkKCkgKyAiLnNvcnREaXJlY3Rpb24iLCB0YWJsZS5nZXRTb3J0RGlyZWN0aW9uKCkpOyAvLyROT04tTkxTLTEkCisJCX0KKwl9CisJCisJLyoqCisJICogUmVzdG9yZSB0YWJsZSBzZXR0aW5ncyBmcm9tIHRoZSBnaXZlbiBkaWFsb2cgc3RvcmUgdXNpbmcgdGhlCisJICogZ2l2ZW4ga2V5LgorCSAqIAorCSAqIEBwYXJhbSBzZXR0aW5ncyBkaWFsb2cgc2V0dGluZ3Mgc3RvcmUKKwkgKiBAc2luY2UgMy41CisJICovCisJcHJpdmF0ZSB2b2lkIHJlc3RvcmVDb2x1bW5TZXR0aW5ncyhJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MsIEFycmF5TGlzdCBzb3J0ZXJzKSB7CisgICAgICAgIHJlc3RvcmVDb2x1bW5XaWR0aHMoc2V0dGluZ3MpOworICAgICAgICBpbnQgaWR4ID0gMDsKKyAgICAgICAgaW50IGRpcmVjdGlvbiA9IFNXVC5ET1dOOworCQl0cnkgeworCQkJaWR4ID0gc2V0dGluZ3MuZ2V0SW50KGdldEhlbHBDb250ZXh0SWQoKSArICIuc29ydENvbHVtbiIpOyAvLyROT04tTkxTLTEkCisJCQlkaXJlY3Rpb24gPSBzZXR0aW5ncy5nZXRJbnQoZ2V0SGVscENvbnRleHRJZCgpICsgIi5zb3J0RGlyZWN0aW9uIik7IC8vJE5PTi1OTFMtMSQKKwkJfSAKKwkJY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7fQorCQlUYWJsZSB0YWJsZSA9IHRoaXMudGFibGVWaWV3ZXIuZ2V0VGFibGUoKTsKKwkJaWYodGFibGUuZ2V0Q29sdW1uQ291bnQoKSA8IDEpIHsKKwkJCXJldHVybjsKKwkJfQorCQlUYWJsZUNvbHVtbiBjb2x1bW4gPSB0YWJsZS5nZXRDb2x1bW4oaWR4KTsKKwkJaWYoY29sdW1uICE9IG51bGwpIHsKKwkJCXRhYmxlLnNldFNvcnRDb2x1bW4oY29sdW1uKTsKKwkJCXRhYmxlLnNldFNvcnREaXJlY3Rpb24oZGlyZWN0aW9uKTsKKwkJCUNvbHVtblNvcnRlciBzb3J0ZXIgPSAoQ29sdW1uU29ydGVyKSBzb3J0ZXJzLmdldChpZHgpOworCQkJc29ydGVyLnNldERpcmVjdGlvbihkaXJlY3Rpb24pOworCQl9CisJCXNvcnRlcnMuY2xlYXIoKTsKKwl9CisJCisJLyoqCisJICogUmVzdG9yZXMgdGhlIGNvbHVtbiB3aWR0aHMgZnJvbSBkaWFsb2cgc2V0dGluZ3MKKwkgKiAKKwkgKiBAcGFyYW0gc2V0dGluZ3MKKwkgKiBAc2luY2UgMy41CisJICovCisJcHJpdmF0ZSB2b2lkIHJlc3RvcmVDb2x1bW5XaWR0aHMoSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzKSB7CisJCVRhYmxlIHRhYmxlID0gdGhpcy50YWJsZVZpZXdlci5nZXRUYWJsZSgpOworICAgICAgICBpbnQgY29sdW1uQ291bnQgPSB0YWJsZS5nZXRDb2x1bW5Db3VudCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbkNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGludCB3aWR0aCA9IC0xOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB3aWR0aCA9IHNldHRpbmdzLmdldEludChnZXRIZWxwQ29udGV4dElkKCkgKyAiLmNvbHVtbldpZHRoIiArIGkpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkge30KKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKCh3aWR0aCA8PSAwKSB8fCAoaSA9PSB0YWJsZS5nZXRDb2x1bW5Db3VudCgpIC0gMSkpIHsKKyAgICAgICAgICAgIAl0YWJsZS5nZXRDb2x1bW4oaSkucGFjaygpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIAl0YWJsZS5nZXRDb2x1bW4oaSkuc2V0V2lkdGgod2lkdGgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgdGhlIGNvbnRlbnQgcHJvdmlkZXIgdG8gdXNlIGZvciB0aGUgdGFibGUgdmlld2VyCisJICogCisJICogQHJldHVybiBBbnRQYWdlQ29udGVudFByb3ZpZGVyCisJICovCisJcHJvdGVjdGVkIEFudENvbnRlbnRQcm92aWRlciBnZXRDb250ZW50UHJvdmlkZXIoKSB7CisJCXJldHVybiBuZXcgQW50Q29udGVudFByb3ZpZGVyKGZhbHNlKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBjdXJyZW50bHkgbGlzdGVkIG9iamVjdHMgaW4gdGhlIHRhYmxlIGlmIHRoZSBsaWJyYXJ5CisJICogZm9yIHRoYXQgZW50cnkgaXMgc3RpbGwgaW5jbHVkZWQgaW4gdGhlIHByZWZlcmVuY2VzLiAgRGVmYXVsdCBvYmplY3RzCisJICogYXJlIGluY2x1ZGVkIGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgb2YgdGhlIDxjb2RlPmZvckRpc3BsYXk8L2NvZGU+IHBhcmFtZXRlci4KKwkgKiBSZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgd2lkZ2V0IGhhcyBub3QgeWV0IGJlZW4gY3JlYXRlZAorCSAqIG9yIGhhcyBiZWVuIGRpc3Bvc2VkLgorCSAqIEBwYXJhbSBmb3JEaXNwbGF5IFdoZXRoZXIgdGhlIHJlc3VsdCBpcyB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIFVJIG9yIHN0b3JlZCBpbiB0aGUgcHJlZmVyZW5jZXMKKwkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIG9iamVjdHMgY3VycmVudGx5IGRpc3BsYXllZCBpbiB0aGUgdGFibGUKKwkgKi8KKwlwcm90ZWN0ZWQgTGlzdCBnZXRDb250ZW50cyhib29sZWFuIGZvckRpc3BsYXkpIHsKKwkJaWYgKHRhYmxlVmlld2VyID09IG51bGwgfHwgdGFibGVWaWV3ZXIuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJTGlzdCBlbnRyaWVzPSBnZXRQcmVmZXJlbmNlUGFnZSgpLmdldExpYnJhcnlFbnRyaWVzKCk7CisJCQorCQlPYmplY3RbXSBlbGVtZW50cyA9IGNvbnRlbnRQcm92aWRlci5nZXRFbGVtZW50cyh0YWJsZVZpZXdlci5nZXRJbnB1dCgpKTsKKwkJTGlzdCBjb250ZW50cz0gbmV3IEFycmF5TGlzdChlbGVtZW50cy5sZW5ndGgpOworCQlPYmplY3QgZWxlbWVudDsKKwkJQW50T2JqZWN0IGFudE9iamVjdDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgeworCQkJZWxlbWVudD0gZWxlbWVudHNbaV07CisJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFudE9iamVjdCkgeworCQkJCWFudE9iamVjdD0gKEFudE9iamVjdCllbGVtZW50OworCQkJCWlmIChmb3JEaXNwbGF5KSB7CisJCQkJCWlmICghYW50T2JqZWN0LmlzRGVmYXVsdCgpICYmICFlbnRyaWVzLmNvbnRhaW5zKGFudE9iamVjdC5nZXRMaWJyYXJ5RW50cnkoKSkpIHsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisJCQkJfSBlbHNlIGlmIChhbnRPYmplY3QuaXNEZWZhdWx0KCkgfHwgIWVudHJpZXMuY29udGFpbnMoYW50T2JqZWN0LmdldExpYnJhcnlFbnRyeSgpKSkgeworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQl9CisJCQljb250ZW50cy5hZGQoZWxlbWVudCk7CisJCX0KKwkJcmV0dXJuIGNvbnRlbnRzOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzZWxlY3Rpb24gaW4gdGhlIHZpZXdlciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgeworCQlpZiAodGFibGVWaWV3ZXIgPT0gbnVsbCB8fCB0YWJsZVZpZXdlci5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlyZXR1cm4gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgdGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzaGVsbCBvZiB0aGUgc3ViLXBhZ2UuCisJICovCisJcHJvdGVjdGVkIGZpbmFsIFNoZWxsIGdldFNoZWxsKCkgeworCQlpZiAodGFibGVWaWV3ZXIgPT0gbnVsbCB8fCB0YWJsZVZpZXdlci5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlyZXR1cm4gdGFibGVWaWV3ZXIuZ2V0Q29udHJvbCgpLmdldFNoZWxsKCk7CisJfQorCQorCS8qKgorCSAqIEhhbmRsZXMgdGhlIHJlbW92ZSBidXR0b24gcHJlc3NlZCBldmVudAorCSAqLworCXByb3RlY3RlZCB2b2lkIHJlbW92ZSgpIHsKKwkJcmVtb3ZlKHRhYmxlVmlld2VyKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlKFRhYmxlVmlld2VyIHZpZXdlcikgeworCQlBbnRDb250ZW50UHJvdmlkZXIgYW50Q29udGVudFByb3ZpZGVyPSAoQW50Q29udGVudFByb3ZpZGVyKXZpZXdlci5nZXRDb250ZW50UHJvdmlkZXIoKTsKKwkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXIuZ2V0U2VsZWN0aW9uKCk7CisJCUl0ZXJhdG9yIGl0ciA9IHNlbC5pdGVyYXRvcigpOworCQl3aGlsZSAoaXRyLmhhc05leHQoKSkgeworCQkJYW50Q29udGVudFByb3ZpZGVyLnJlbW92ZShpdHIubmV4dCgpKTsKKwkJfQorCX0KKwkKKwkvKioKKwkgKiBTZXRzIHRoZSBjb250ZW50cyBvZiB0aGUgdGFibGUgb24gdGhpcyBwYWdlLiAgSGFzIG5vIGVmZmVjdAorCSAqIGlmIHRoaXMgd2lkZ2V0IGhhcyBub3QgeWV0IGJlZW4gY3JlYXRlZCBvciBoYXMgYmVlbiBkaXNwb3NlZC4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXRJbnB1dChMaXN0IGlucHV0cykgeworCQlpZiAodGFibGVWaWV3ZXIgPT0gbnVsbCB8fCB0YWJsZVZpZXdlci5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7CisJCQlyZXR1cm47CisJCX0KKwkJdGFibGVWaWV3ZXIuc2V0SW5wdXQoaW5wdXRzKTsKKwkJdGFibGVTZWxlY3Rpb25DaGFuZ2VkKChJU3RydWN0dXJlZFNlbGVjdGlvbikgdGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpOworCX0KKworCS8qKgorCSAqIFVwZGF0ZXMgdGhlIGNvbnRlbnQgZWxlbWVudCBpbiB0aGUgdGFibGUgdmlld2VyLgorCSAqLworCXByb3RlY3RlZCBmaW5hbCB2b2lkIHVwZGF0ZUNvbnRlbnQoT2JqZWN0IGVsZW1lbnQpIHsKKwkJaWYgKHRhYmxlVmlld2VyID09IG51bGwgfHwgdGFibGVWaWV3ZXIuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgeworCQkJcmV0dXJuOworCQl9CisJCXRhYmxlVmlld2VyLnVwZGF0ZShlbGVtZW50LCBudWxsKTsKKwl9CisJCisJLyoqCisJICogQ3JlYXRlcyB0aGUgZGVmYXVsdCBjb250ZW50cyBvZiB0aGlzIHBhZ2UKKwkgKi8KKwlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSB0b3ApIHsKKwkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0b3AsIGdldEhlbHBDb250ZXh0SWQoKSk7CisJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKKwkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOworCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMjsKKwkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMjsKKwkJdG9wLnNldExheW91dChsYXlvdXQpOworCQkKKwkJdG9wLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOworCisJCWNyZWF0ZVRhYmxlKHRvcCk7CisJCWNyZWF0ZUJ1dHRvbkdyb3VwKHRvcCk7CisJCQorCQlyZXR1cm4gdG9wOworCX0KKwkKKwlwcm90ZWN0ZWQgQW50UnVudGltZVByZWZlcmVuY2VQYWdlIGdldFByZWZlcmVuY2VQYWdlKCkgeworCQlyZXR1cm4gcHJlZmVyZW5jZVBhZ2U7CisJfQorCQorCXByb3RlY3RlZCBUYWJsZVZpZXdlciBnZXRUYWJsZVZpZXdlcigpIHsKKwkJcmV0dXJuIHRhYmxlVmlld2VyOworCX0KKworCS8qKgorCSAqIEhhbmRsZXMgc2VsZWN0aW9uIGNoYW5nZXMgaW4gdGhlIHRhYmxlIHZpZXdlci4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCB0YWJsZVNlbGVjdGlvbkNoYW5nZWQoSVN0cnVjdHVyZWRTZWxlY3Rpb24gbmV3U2VsZWN0aW9uKSB7CisJCWludCBzaXplID0gbmV3U2VsZWN0aW9uLnNpemUoKTsKKwkJYm9vbGVhbiBlbmFibGVkPSB0cnVlOworCQkKKwkJSXRlcmF0b3IgaXRyPSBuZXdTZWxlY3Rpb24uaXRlcmF0b3IoKTsKKwkJd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKKwkJCU9iamVjdCBlbGVtZW50ID0gaXRyLm5leHQoKTsKKwkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQW50T2JqZWN0KSB7CisJCQkJQW50T2JqZWN0IGFudE9iamVjdD0gKEFudE9iamVjdCllbGVtZW50OworCQkJCWlmIChhbnRPYmplY3QuaXNEZWZhdWx0KCkpIHsKKwkJCQkJZW5hYmxlZD0gZmFsc2U7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCQllZGl0QnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZCAmJiBzaXplID09IDEpOworCQlyZW1vdmVCdXR0b24uc2V0RW5hYmxlZChlbmFibGVkICYmIHNpemUgPiAwKTsKKwl9CisJCisJLyoqCisJICogQWxsb3dzIHRoZSB1c2VyIHRvIGVkaXQgYSBjdXN0b20gQW50IG9iamVjdC4KKwkgKgorCSAqIEBwYXJhbSBzZWxlY3Rpb24gVGhlIHNlbGVjdGlvbiBjb250YWluaW5nIHRoZSBvYmplY3QgdG8gZWRpdAorCSAqLworCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGVkaXQoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBBbGxvd3MgdGhlIHVzZXIgdG8gYWRkIGEgY3VzdG9tIEFudCBvYmplY3QuCisgICAgICoKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBhZGQoKTsKKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoaXMgcGFnZSdzIGhlbHAgY29udGV4dCBpZCwgd2hpY2ggaXMgaG9va2VkCisJICogdG8gdGhpcyBwYWdlIG9uIGNyZWF0aW9uLgorCSAqIAorCSAqIEByZXR1cm4gaGVscCBjb250ZXh0IGlkCisJICovCisJcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRIZWxwQ29udGV4dElkKCk7CisKKwlwcm90ZWN0ZWQgdm9pZCBjb25uZWN0VG9Gb2xkZXIoZmluYWwgVGFiSXRlbSBpdGVtLCBUYWJGb2xkZXIgZm9sZGVyKSB7CisJCWZvbGRlci5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQlpZiAoZS5pdGVtID09IGl0ZW0pIHsKKwkJCQkJLy9yZW1vdmUgYW50IG9iamVjdHMgd2hvc2UgbGlicmFyeSBoYXMgYmVlbiByZW1vdmVkCisJCQkJCXNldElucHV0KGdldENvbnRlbnRzKHRydWUpKTsKKwkJCQl9CisJCQl9CisJCX0pOwkJCisJfQorfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvQW50UHJldmlld2VyVXBkYXRlci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvQW50UHJldmlld2VyVXBkYXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1NzIzZjQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9BbnRQcmV2aWV3ZXJVcGRhdGVyLmphdmEKQEAgLTAsMCArMSwyMjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkucHJlZmVyZW5jZXM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuQW50U291cmNlVmlld2VyQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLmZvcm1hdHRlci5Gb3JtYXR0aW5nUHJlZmVyZW5jZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5mb3JtYXR0ZXIuWG1sRm9ybWF0dGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Tb3VyY2VWaWV3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZWRUZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5BYnN0cmFjdFRleHRFZGl0b3I7CisKKy8qKgorICogSGFuZGxlcyBjaGFuZ2VzIGZvciBBbnQgcHJldmlldyB2aWV3ZXJzLgorICogCisgKiBAc2luY2UgMy4wCisgKi8KK2NsYXNzIEFudFByZXZpZXdlclVwZGF0ZXIgeworCQorCXByaXZhdGUgQ29sb3IgZkZvcmVncm91bmRDb2xvcj0gbnVsbDsKKwlwcml2YXRlIENvbG9yIGZCYWNrZ3JvdW5kQ29sb3I9IG51bGw7CisJcHJpdmF0ZSBDb2xvciBmU2VsZWN0aW9uQmFja2dyb3VuZENvbG9yPSBudWxsOworCXByaXZhdGUgQ29sb3IgZlNlbGVjdGlvbkZvcmVncm91bmRDb2xvcj0gbnVsbDsKKwkKKwkKKwkvKioKKwkgKiBDcmVhdGVzIGEgc291cmNlIHByZXZpZXcgdXBkYXRlciBmb3IgdGhlIGdpdmVuIHZpZXdlciwgY29uZmlndXJhdGlvbiBhbmQgcHJlZmVyZW5jZSBzdG9yZS4KKwkgKgorCSAqIEBwYXJhbSB2aWV3ZXIgdGhlIHZpZXdlcgorCSAqIEBwYXJhbSBjb25maWd1cmF0aW9uIHRoZSBjb25maWd1cmF0aW9uCisJICogQHBhcmFtIHByZWZlcmVuY2VTdG9yZSB0aGUgcHJlZmVyZW5jZSBzdG9yZQorCSAqLworCXB1YmxpYyBBbnRQcmV2aWV3ZXJVcGRhdGVyKGZpbmFsIFNvdXJjZVZpZXdlciB2aWV3ZXIsIGZpbmFsIEFudFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwgZmluYWwgSVByZWZlcmVuY2VTdG9yZSBwcmVmZXJlbmNlU3RvcmUpIHsKKwkJCisJCWluaXRpYWxpemVWaWV3ZXJDb2xvcnModmlld2VyLCBwcmVmZXJlbmNlU3RvcmUpOworCQkKKwkJZmluYWwgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgZm9udENoYW5nZUxpc3RlbmVyPSBuZXcgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7CisJCQkvKgorCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyI3Byb3BlcnR5Q2hhbmdlKG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudCkKKwkJCSAqLworCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgeworCQkJCWlmIChldmVudC5nZXRQcm9wZXJ0eSgpLmVxdWFscyhKRmFjZVJlc291cmNlcy5URVhUX0ZPTlQpKSB7CisJCQkJCUZvbnQgZm9udD0gSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udChKRmFjZVJlc291cmNlcy5URVhUX0ZPTlQpOworCQkJCQl2aWV3ZXIuZ2V0VGV4dFdpZGdldCgpLnNldEZvbnQoZm9udCk7CisJCQkJfQorCQkJfQorCQl9OworCQlmaW5hbCBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPSBuZXcgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7CisJCQkvKgorCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyI3Byb3BlcnR5Q2hhbmdlKG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudCkKKwkJCSAqLworCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgeworCQkJCQorCQkJCVN0cmluZyBwcm9wZXJ0eT0gZXZlbnQuZ2V0UHJvcGVydHkoKTsKKwkJCQkJCisJCQkJaWYgKEFic3RyYWN0VGV4dEVkaXRvci5QUkVGRVJFTkNFX0NPTE9SX0ZPUkVHUk9VTkQuZXF1YWxzKHByb3BlcnR5KSB8fCBBYnN0cmFjdFRleHRFZGl0b3IuUFJFRkVSRU5DRV9DT0xPUl9GT1JFR1JPVU5EX1NZU1RFTV9ERUZBVUxULmVxdWFscyhwcm9wZXJ0eSkgfHwKKwkJCQkJCUFic3RyYWN0VGV4dEVkaXRvci5QUkVGRVJFTkNFX0NPTE9SX0JBQ0tHUk9VTkQuZXF1YWxzKHByb3BlcnR5KSB8fAlBYnN0cmFjdFRleHRFZGl0b3IuUFJFRkVSRU5DRV9DT0xPUl9CQUNLR1JPVU5EX1NZU1RFTV9ERUZBVUxULmVxdWFscyhwcm9wZXJ0eSkgfHwKKwkJCQkJCUFic3RyYWN0VGV4dEVkaXRvci5QUkVGRVJFTkNFX0NPTE9SX1NFTEVDVElPTl9GT1JFR1JPVU5ELmVxdWFscyhwcm9wZXJ0eSkgfHwgQWJzdHJhY3RUZXh0RWRpdG9yLlBSRUZFUkVOQ0VfQ09MT1JfU0VMRUNUSU9OX0ZPUkVHUk9VTkRfU1lTVEVNX0RFRkFVTFQuZXF1YWxzKHByb3BlcnR5KSB8fAorCQkJCQkJQWJzdHJhY3RUZXh0RWRpdG9yLlBSRUZFUkVOQ0VfQ09MT1JfU0VMRUNUSU9OX0JBQ0tHUk9VTkQuZXF1YWxzKHByb3BlcnR5KSB8fAlBYnN0cmFjdFRleHRFZGl0b3IuUFJFRkVSRU5DRV9DT0xPUl9TRUxFQ1RJT05fQkFDS0dST1VORF9TWVNURU1fREVGQVVMVC5lcXVhbHMocHJvcGVydHkpKQorCQkJCQl7CisJCQkJCQlpbml0aWFsaXplVmlld2VyQ29sb3JzKHZpZXdlciwgcHJlZmVyZW5jZVN0b3JlKTsKKwkJCQl9IAorCQkJCQorCQkJCWlmIChjb25maWd1cmF0aW9uLmFmZmVjdHNUZXh0UHJlc2VudGF0aW9uKGV2ZW50KSkgeworCQkJCQljb25maWd1cmF0aW9uLmFkYXB0VG9QcmVmZXJlbmNlQ2hhbmdlKGV2ZW50KTsKKwkJCQkJdmlld2VyLmludmFsaWRhdGVUZXh0UHJlc2VudGF0aW9uKCk7CisJCQkJfQorCQkJCQorCQkJCWlmIChGb3JtYXR0aW5nUHJlZmVyZW5jZXMuYWZmZWN0c0Zvcm1hdHRpbmcoZXZlbnQpKSB7CisJCQkJCWZvcm1hdCh2aWV3ZXIsIHByZWZlcmVuY2VTdG9yZSk7CisJCQkJfQorCQkJfQorCisJCQkvKioKKwkJCSAqIEBwYXJhbSB2aWV3ZXIKKwkJCSAqIEBwYXJhbSBwcmVmZXJlbmNlU3RvcmUKKwkJCSAqLworCQkJcHJpdmF0ZSB2b2lkIGZvcm1hdChmaW5hbCBTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBmaW5hbCBJUHJlZmVyZW5jZVN0b3JlIHN0b3JlKSB7CisJCQkJU3RyaW5nIGNvbnRlbnRzPSBzb3VyY2VWaWV3ZXIuZ2V0RG9jdW1lbnQoKS5nZXQoKTsKKwkJCQlGb3JtYXR0aW5nUHJlZmVyZW5jZXMgcHJlZnM9IG5ldyBGb3JtYXR0aW5nUHJlZmVyZW5jZXMoKTsKKwkJCQlwcmVmcy5zZXRQcmVmZXJlbmNlU3RvcmUoc3RvcmUpOworCQkJCWNvbnRlbnRzPSBYbWxGb3JtYXR0ZXIuZm9ybWF0KGNvbnRlbnRzLCBwcmVmcyk7CisJCQkJdmlld2VyLmdldERvY3VtZW50KCkuc2V0KGNvbnRlbnRzKTsKKwkJCX0KKwkJfTsKKwkJdmlld2VyLmdldFRleHRXaWRnZXQoKS5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKKwkJCS8qCisJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyI3dpZGdldERpc3Bvc2VkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50KQorCQkJICovCisJCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZSkgeworCQkJCXByZWZlcmVuY2VTdG9yZS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOworCQkJCUpGYWNlUmVzb3VyY2VzLmdldEZvbnRSZWdpc3RyeSgpLnJlbW92ZUxpc3RlbmVyKGZvbnRDaGFuZ2VMaXN0ZW5lcik7CisJCQl9CisJCX0pOworCQlKRmFjZVJlc291cmNlcy5nZXRGb250UmVnaXN0cnkoKS5hZGRMaXN0ZW5lcihmb250Q2hhbmdlTGlzdGVuZXIpOworCQlwcmVmZXJlbmNlU3RvcmUuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKKwl9CisJCisJLyoqCisJICogSW5pdGlhbGl6ZXMgdGhlIGdpdmVuIHZpZXdlcidzIGNvbG9ycy4KKwkgKiAKKwkgKiBAcGFyYW0gdmlld2VyIHRoZSB2aWV3ZXIgdG8gYmUgaW5pdGlhbGl6ZWQKKwkgKiBAc2luY2UgMi4wCisJICovCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVZpZXdlckNvbG9ycyhJU291cmNlVmlld2VyIHZpZXdlciwgSVByZWZlcmVuY2VTdG9yZSBzdG9yZSkgeworCQkJCisJCVN0eWxlZFRleHQgc3R5bGVkVGV4dD0gdmlld2VyLmdldFRleHRXaWRnZXQoKTsKKwkJCisJCS8vIC0tLS0tLS0tLS0tIGZvcmVncm91bmQgY29sb3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJQ29sb3IgY29sb3I9IHN0b3JlLmdldEJvb2xlYW4oQWJzdHJhY3RUZXh0RWRpdG9yLlBSRUZFUkVOQ0VfQ09MT1JfRk9SRUdST1VORF9TWVNURU1fREVGQVVMVCkKKwkJCT8gbnVsbAorCQkJOiBjcmVhdGVDb2xvcihzdG9yZSwgQWJzdHJhY3RUZXh0RWRpdG9yLlBSRUZFUkVOQ0VfQ09MT1JfRk9SRUdST1VORCwgc3R5bGVkVGV4dC5nZXREaXNwbGF5KCkpOworCQlzdHlsZWRUZXh0LnNldEZvcmVncm91bmQoY29sb3IpOworCQkJCisJCWlmIChmRm9yZWdyb3VuZENvbG9yICE9IG51bGwpIHsKKwkJCWZGb3JlZ3JvdW5kQ29sb3IuZGlzcG9zZSgpOworCQl9CisJCQorCQlmRm9yZWdyb3VuZENvbG9yPSBjb2xvcjsKKwkJCisJCS8vIC0tLS0tLS0tLS0gYmFja2dyb3VuZCBjb2xvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCWNvbG9yPSBzdG9yZS5nZXRCb29sZWFuKEFic3RyYWN0VGV4dEVkaXRvci5QUkVGRVJFTkNFX0NPTE9SX0JBQ0tHUk9VTkRfU1lTVEVNX0RFRkFVTFQpCisJCQk/IG51bGwKKwkJCTogY3JlYXRlQ29sb3Ioc3RvcmUsIEFic3RyYWN0VGV4dEVkaXRvci5QUkVGRVJFTkNFX0NPTE9SX0JBQ0tHUk9VTkQsIHN0eWxlZFRleHQuZ2V0RGlzcGxheSgpKTsKKwkJc3R5bGVkVGV4dC5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKKwkJCQorCQlpZiAoZkJhY2tncm91bmRDb2xvciAhPSBudWxsKSB7CisJCQlmQmFja2dyb3VuZENvbG9yLmRpc3Bvc2UoKTsKKwkJfQorCQkJCisJCWZCYWNrZ3JvdW5kQ29sb3I9IGNvbG9yOworCQkKKwkJLy8gLS0tLS0tLS0tLS0gc2VsZWN0aW9uIGZvcmVncm91bmQgY29sb3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJY29sb3I9IHN0b3JlLmdldEJvb2xlYW4oQWJzdHJhY3RUZXh0RWRpdG9yLlBSRUZFUkVOQ0VfQ09MT1JfU0VMRUNUSU9OX0ZPUkVHUk9VTkRfU1lTVEVNX0RFRkFVTFQpCisJCQk/IG51bGwKKwkJCTogY3JlYXRlQ29sb3Ioc3RvcmUsIEFic3RyYWN0VGV4dEVkaXRvci5QUkVGRVJFTkNFX0NPTE9SX1NFTEVDVElPTl9GT1JFR1JPVU5ELCBzdHlsZWRUZXh0LmdldERpc3BsYXkoKSk7CisJCXN0eWxlZFRleHQuc2V0U2VsZWN0aW9uRm9yZWdyb3VuZChjb2xvcik7CisJCQkKKwkJaWYgKGZTZWxlY3Rpb25Gb3JlZ3JvdW5kQ29sb3IgIT0gbnVsbCkgeworCQkJZlNlbGVjdGlvbkZvcmVncm91bmRDb2xvci5kaXNwb3NlKCk7CisJCX0KKwkJCisJCWZTZWxlY3Rpb25Gb3JlZ3JvdW5kQ29sb3I9IGNvbG9yOworCQkKKwkJLy8gLS0tLS0tLS0tLSBzZWxlY3Rpb24gYmFja2dyb3VuZCBjb2xvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCWNvbG9yPSBzdG9yZS5nZXRCb29sZWFuKEFic3RyYWN0VGV4dEVkaXRvci5QUkVGRVJFTkNFX0NPTE9SX1NFTEVDVElPTl9CQUNLR1JPVU5EX1NZU1RFTV9ERUZBVUxUKQorCQkJPyBudWxsCisJCQk6IGNyZWF0ZUNvbG9yKHN0b3JlLCBBYnN0cmFjdFRleHRFZGl0b3IuUFJFRkVSRU5DRV9DT0xPUl9TRUxFQ1RJT05fQkFDS0dST1VORCwgc3R5bGVkVGV4dC5nZXREaXNwbGF5KCkpOworCQlzdHlsZWRUZXh0LnNldFNlbGVjdGlvbkJhY2tncm91bmQoY29sb3IpOworCQkJCisJCWlmIChmU2VsZWN0aW9uQmFja2dyb3VuZENvbG9yICE9IG51bGwpIHsKKwkJCWZTZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3IuZGlzcG9zZSgpOworCQl9CisJCQkKKwkJZlNlbGVjdGlvbkJhY2tncm91bmRDb2xvcj0gY29sb3I7CisJfQorCQorCS8qKgorCSAqIENyZWF0ZXMgYSBjb2xvciBmcm9tIHRoZSBpbmZvcm1hdGlvbiBzdG9yZWQgaW4gdGhlIGdpdmVuIHByZWZlcmVuY2Ugc3RvcmUuCisJICogUmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubyBzdWNoIGluZm9ybWF0aW9uIGF2YWlsYWJsZS4KKwkgKiAKKwkgKiBAcGFyYW0gc3RvcmUgdGhlIHN0b3JlIHRvIHJlYWQgZnJvbQorCSAqIEBwYXJhbSBrZXkgdGhlIGtleSB1c2VkIGZvciB0aGUgbG9va3VwIGluIHRoZSBwcmVmZXJlbmNlIHN0b3JlCisJICogQHBhcmFtIGRpc3BsYXkgdGhlIGRpc3BsYXkgdXNlZCBjcmVhdGUgdGhlIGNvbG9yCisJICogQHJldHVybiB0aGUgY3JlYXRlZCBjb2xvciBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmljYXRpb24gaW4gdGhlIHByZWZlcmVuY2Ugc3RvcmUKKwkgKiBAc2luY2UgMi4wCisJICovCisJcHJpdmF0ZSBDb2xvciBjcmVhdGVDb2xvcihJUHJlZmVyZW5jZVN0b3JlIHN0b3JlLCBTdHJpbmcga2V5LCBEaXNwbGF5IGRpc3BsYXkpIHsKKwkKKwkJUkdCIHJnYj0gbnVsbDsJCQorCQkKKwkJaWYgKHN0b3JlLmNvbnRhaW5zKGtleSkpIHsKKwkJCQorCQkJaWYgKHN0b3JlLmlzRGVmYXVsdChrZXkpKQorCQkJCXJnYj0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXREZWZhdWx0Q29sb3Ioc3RvcmUsIGtleSk7CisJCQllbHNlCisJCQkJcmdiPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKHN0b3JlLCBrZXkpOworCQkKKwkJCWlmIChyZ2IgIT0gbnVsbCkKKwkJCQlyZXR1cm4gbmV3IENvbG9yKGRpc3BsYXksIHJnYik7CisJCX0KKwkJCisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCWlmIChmRm9yZWdyb3VuZENvbG9yICE9IG51bGwpIHsKKwkJCWZGb3JlZ3JvdW5kQ29sb3IuZGlzcG9zZSgpOworCQkJZkZvcmVncm91bmRDb2xvcj0gbnVsbDsKKwkJfQorCQkKKwkJaWYgKGZCYWNrZ3JvdW5kQ29sb3IgIT0gbnVsbCkgeworCQkJZkJhY2tncm91bmRDb2xvci5kaXNwb3NlKCk7CisJCQlmQmFja2dyb3VuZENvbG9yPSBudWxsOworCQl9CisJCQorCQlpZiAoZlNlbGVjdGlvbkZvcmVncm91bmRDb2xvciAhPSBudWxsKSB7CisJCQlmU2VsZWN0aW9uRm9yZWdyb3VuZENvbG9yLmRpc3Bvc2UoKTsKKwkJCWZTZWxlY3Rpb25Gb3JlZ3JvdW5kQ29sb3I9IG51bGw7CisJCX0KKwkJCisJCWlmIChmU2VsZWN0aW9uQmFja2dyb3VuZENvbG9yICE9IG51bGwpIHsKKwkJCWZTZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3IuZGlzcG9zZSgpOworCQkJZlNlbGVjdGlvbkJhY2tncm91bmRDb2xvcj0gbnVsbDsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL0FudFByb3BlcnRpZXNQYWdlLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9BbnRQcm9wZXJ0aWVzUGFnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4MjhlZjMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9BbnRQcm9wZXJ0aWVzUGFnZS5qYXZhCkBAIC0wLDAgKzEsMTU5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5wcmVmZXJlbmNlczsKKworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5jb3JlLkFudENvcmVQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmNvcmUuUHJvcGVydHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLklBbnRVSUhlbHBDb250ZXh0SWRzOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJGb2xkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFiSXRlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOworCisvKioKKyAqIFByZWZlcmVuY2UgcGFnZSBmb3Igc2V0dGluZyBnbG9iYWwgQW50IHVzZXIgcHJvcGVydGllcy4KKyAqIEFsbCBwcm9wZXJ0aWVzIHNwZWNpZmllZCBoZXJlIHdpbGwgYmUgc2V0IGFzIHVzZXIgcHJvcGVydGllcyBvbiB0aGUgCisgKiBwcm9qZWN0IGZvciBhbnkgQW50IGJ1aWxkCisgKi8KK3B1YmxpYyBjbGFzcyBBbnRQcm9wZXJ0aWVzUGFnZSBpbXBsZW1lbnRzIElBbnRCbG9ja0NvbnRhaW5lciB7CisJCisJcHJpdmF0ZSBBbnRQcm9wZXJ0aWVzQmxvY2sgYW50UHJvcGVydGllc0Jsb2NrPSBuZXcgQW50UHJvcGVydGllc0Jsb2NrKHRoaXMpOworCXByaXZhdGUgQW50UnVudGltZVByZWZlcmVuY2VQYWdlIHByZWZlcmVuY2VQYWdlOworCQorCS8qKgorCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UuCisJICovCisJcHVibGljIEFudFByb3BlcnRpZXNQYWdlKEFudFJ1bnRpbWVQcmVmZXJlbmNlUGFnZSBwcmVmZXJlbmNlUGFnZSkgeworCQl0aGlzLnByZWZlcmVuY2VQYWdlPSBwcmVmZXJlbmNlUGFnZTsKKwl9CisJCisJLyoqCisJICogQ3JlYXRlcyB0aGUgdGFiIGl0ZW0gdGhhdCBjb250YWlucyB0aGlzIHN1Yi1wYWdlLgorCSAqLworCXByb3RlY3RlZCBUYWJJdGVtIGNyZWF0ZVRhYkl0ZW0oVGFiRm9sZGVyIGZvbGRlcikgeworCQlUYWJJdGVtIGl0ZW0gPSBuZXcgVGFiSXRlbShmb2xkZXIsIFNXVC5OT05FKTsKKwkJaXRlbS5zZXRUZXh0KEFudFByZWZlcmVuY2VzTWVzc2FnZXMuQW50UHJvcGVydGllc1BhZ2VfdGl0bGUpOworCQlpdGVtLnNldEltYWdlKEFudE9iamVjdExhYmVsUHJvdmlkZXIuZ2V0UHJvcGVydHlJbWFnZSgpKTsKKwkJaXRlbS5zZXREYXRhKHRoaXMpOworCQlpdGVtLnNldENvbnRyb2woY3JlYXRlQ29udGVudHMoZm9sZGVyKSk7CisJCXJldHVybiBpdGVtOworCX0KKwkKKwlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJRm9udCBmb250ID0gcGFyZW50LmdldEZvbnQoKTsKKwkJCisJCUNvbXBvc2l0ZSB0b3AgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOworCQl0b3Auc2V0Rm9udChmb250KTsKKwkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0b3AsIElBbnRVSUhlbHBDb250ZXh0SWRzLkFOVF9QUk9QRVJUSUVTX1BBR0UpOworCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7CisJCWxheW91dC5udW1Db2x1bW5zPSAyOworCQl0b3Auc2V0TGF5b3V0KGxheW91dCk7CisJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7CisJCXRvcC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsgCisJCQkJCisJCWFudFByb3BlcnRpZXNCbG9jay5jcmVhdGVDb250cm9sKHRvcCwgQW50UHJlZmVyZW5jZXNNZXNzYWdlcy5BbnRQcm9wZXJ0aWVzUGFnZV9fR2xvYmFsX3Byb3BlcnRpZXNfXzEsIEFudFByZWZlcmVuY2VzTWVzc2FnZXMuQW50UHJvcGVydGllc1BhZ2VfR2xvX2JhbF9wcm9wZXJ0eV9maWxlc19fMik7CisJCQorCQlyZXR1cm4gdG9wOworCX0KKwkKKwkvKioKKwkgKiBTZXRzIHRoZSBjb250ZW50cyBvZiB0aGUgdGFibGVzIG9uIHRoaXMgcGFnZS4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgeworCQlMaXN0IGFsbFByb3BlcnRpZXM9IEFudENvcmVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0UHJlZmVyZW5jZXMoKS5nZXREZWZhdWx0UHJvcGVydGllcygpOworCQlhbGxQcm9wZXJ0aWVzLmFkZEFsbChBcnJheXMuYXNMaXN0KEFudENvcmVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0UHJlZmVyZW5jZXMoKS5nZXRDdXN0b21Qcm9wZXJ0aWVzKCkpKTsKKwkJYW50UHJvcGVydGllc0Jsb2NrLnNldFByb3BlcnRpZXNJbnB1dCgoUHJvcGVydHlbXSkgYWxsUHJvcGVydGllcy50b0FycmF5KG5ldyBQcm9wZXJ0eVthbGxQcm9wZXJ0aWVzLnNpemUoKV0pKTsKKwkJYW50UHJvcGVydGllc0Jsb2NrLnNldFByb3BlcnR5RmlsZXNJbnB1dChBbnRDb3JlUGx1Z2luLmdldFBsdWdpbigpLmdldFByZWZlcmVuY2VzKCkuZ2V0Q3VzdG9tUHJvcGVydHlGaWxlcyhmYWxzZSkpOworCQlhbnRQcm9wZXJ0aWVzQmxvY2sudXBkYXRlKCk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKKwkJTGlzdCBkZWZhdWx0UHJvcGVydGllcz0gQW50Q29yZVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRQcmVmZXJlbmNlcygpLmdldERlZmF1bHRQcm9wZXJ0aWVzKCk7CisJCWFudFByb3BlcnRpZXNCbG9jay5zZXRQcm9wZXJ0aWVzSW5wdXQoKFByb3BlcnR5W10pIGRlZmF1bHRQcm9wZXJ0aWVzLnRvQXJyYXkobmV3IFByb3BlcnR5W2RlZmF1bHRQcm9wZXJ0aWVzLnNpemUoKV0pKTsKKwkJYW50UHJvcGVydGllc0Jsb2NrLnNldFByb3BlcnR5RmlsZXNJbnB1dChuZXcgU3RyaW5nWzBdKTsKKwkJYW50UHJvcGVydGllc0Jsb2NrLnVwZGF0ZSgpOworCX0KKwkKKwkvKioKKwkgKiBEZWxlZ2F0ZXMgdG8gc2F2aW5nIGFueSBhZGRpdGlvbmFsIHRhYmxlIHNldHRpbmdzIHdoZW4gdGhlIHBhZ2UgaXMgY2xvc2VkCisJICogCisJICogQHNpbmNlIDMuNQorCSAqLworCXB1YmxpYyB2b2lkIHNhdmVBZGRpdGlvbmFsU2V0dGluZ3MoKSB7CisJCWFudFByb3BlcnRpZXNCbG9jay5zYXZlU2V0dGluZ3MoKTsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IGZpbGVzCisJICogCisJICogQHJldHVybiBTdHJpbmdbXQorCSAqLworCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRQcm9wZXJ0eUZpbGVzKCkgeworCQlPYmplY3RbXSBlbGVtZW50cyA9IGFudFByb3BlcnRpZXNCbG9jay5nZXRQcm9wZXJ0eUZpbGVzKCk7CisJCVN0cmluZ1tdIGZpbGVzPSBuZXcgU3RyaW5nW2VsZW1lbnRzLmxlbmd0aF07CisJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKKwkJCWZpbGVzW2ldID0gKFN0cmluZyllbGVtZW50c1tpXTsKKwkJfQorCQlyZXR1cm4gZmlsZXM7CisJfQorCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5JQW50QmxvY2tDb250YWluZXIjc2V0TWVzc2FnZShqYXZhLmxhbmcuU3RyaW5nKQorCSAqLworCXB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKKwkJcHJlZmVyZW5jZVBhZ2Uuc2V0TWVzc2FnZShtZXNzYWdlKTsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkucHJlZmVyZW5jZXMuSUFudEJsb2NrQ29udGFpbmVyI3NldEVycm9yTWVzc2FnZShqYXZhLmxhbmcuU3RyaW5nKQorCSAqLworCXB1YmxpYyB2b2lkIHNldEVycm9yTWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgeworCQlwcmVmZXJlbmNlUGFnZS5zZXRFcnJvck1lc3NhZ2UobWVzc2FnZSk7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLnByZWZlcmVuY2VzLklBbnRCbG9ja0NvbnRhaW5lciNjcmVhdGVQdXNoQnV0dG9uKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgamF2YS5sYW5nLlN0cmluZykKKwkgKi8KKwlwdWJsaWMgQnV0dG9uIGNyZWF0ZVB1c2hCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGJ1dHRvblRleHQpIHsKKwkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUFVTSCk7CisJCWJ1dHRvbi5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOworCQlidXR0b24uc2V0VGV4dChidXR0b25UZXh0KTsKKwkJcHJlZmVyZW5jZVBhZ2Uuc2V0QnV0dG9uTGF5b3V0RGF0YShidXR0b24pOworCQlyZXR1cm4gYnV0dG9uOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5JQW50QmxvY2tDb250YWluZXIjdXBkYXRlKCkKKwkgKi8KKwlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7CisJfQorCQorCXByb3RlY3RlZCBMaXN0IGdldFByb3BlcnRpZXMoKSB7CisJCU9iamVjdFtdIGFsbFByb3BlcnRpZXM9IGFudFByb3BlcnRpZXNCbG9jay5nZXRQcm9wZXJ0aWVzKCk7CisJCUxpc3QgcHJvcGVydGllcz0gbmV3IEFycmF5TGlzdChhbGxQcm9wZXJ0aWVzLmxlbmd0aCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgYWxsUHJvcGVydGllcy5sZW5ndGg7IGkrKykgeworCQkJUHJvcGVydHkgcHJvcGVydHkgPSAoUHJvcGVydHkpYWxsUHJvcGVydGllc1tpXTsKKwkJCWlmICghcHJvcGVydHkuaXNEZWZhdWx0KCkpIHsKKwkJCQlwcm9wZXJ0aWVzLmFkZChwcm9wZXJ0eSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHByb3BlcnRpZXM7CisJfQorfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvQW50UnVudGltZVByZWZlcmVuY2VQYWdlLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9BbnRSdW50aW1lUHJlZmVyZW5jZVBhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTA5NzQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvQW50UnVudGltZVByZWZlcmVuY2VQYWdlLmphdmEKQEAgLTAsMCArMSwxNjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLnByZWZlcmVuY2VzOworCisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuY29yZS5BbnRDb3JlUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5jb3JlLkFudENvcmVQcmVmZXJlbmNlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuY29yZS5Qcm9wZXJ0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuY29yZS5UYXNrOworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5jb3JlLlR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLkFudFVJUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5JQW50VUlIZWxwQ29udGV4dElkczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFiRm9sZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7CisKKy8qKgorICogQW50IHByZWZlcmVuY2UgcGFnZSB0byBzZXQgdGhlIGNsYXNzcGF0aCwgdGFza3MsIHR5cGVzIGFuZCBwcm9wZXJ0aWVzLgorICovCitwdWJsaWMgY2xhc3MgQW50UnVudGltZVByZWZlcmVuY2VQYWdlIGV4dGVuZHMgUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UgeworCQorCXByaXZhdGUgQW50Q2xhc3NwYXRoUGFnZSBjbGFzc3BhdGhQYWdlOworCXByaXZhdGUgQW50VGFza3NQYWdlIHRhc2tzUGFnZTsKKwlwcml2YXRlIEFudFR5cGVzUGFnZSB0eXBlc1BhZ2U7CisJcHJpdmF0ZSBBbnRQcm9wZXJ0aWVzUGFnZSBwcm9wZXJ0aWVzUGFnZTsKKwkKKwkvKioKKwkgKiBDcmVhdGVzIHRoZSBwcmVmZXJlbmNlIHBhZ2UKKwkgKi8KKwlwdWJsaWMgQW50UnVudGltZVByZWZlcmVuY2VQYWdlKCkgeworCQlzZXREZXNjcmlwdGlvbihBbnRQcmVmZXJlbmNlc01lc3NhZ2VzLkFudFByZWZlcmVuY2VQYWdlX2Rlc2NyaXB0aW9uKTsKKwkJc2V0UHJlZmVyZW5jZVN0b3JlKEFudFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKSk7CisJfQorCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2gpCisJICovCisJcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgeworCX0KKwkKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI2NyZWF0ZUNvbnRlbnRzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKKwkgKi8KKwlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7CisJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZ2V0Q29udHJvbCgpLCBJQW50VUlIZWxwQ29udGV4dElkcy5BTlRfUlVOVElNRV9QUkVGRVJFTkNFX1BBR0UpOworCQlpbml0aWFsaXplRGlhbG9nVW5pdHMocGFyZW50KTsKKworCQlUYWJGb2xkZXIgZm9sZGVyID0gbmV3IFRhYkZvbGRlcihwYXJlbnQsIFNXVC5OT05FKTsKKwkJZm9sZGVyLnNldExheW91dChuZXcgVGFiRm9sZGVyTGF5b3V0KCkpOwkKKwkJZm9sZGVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOworCQlmb2xkZXIuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKKworCQljbGFzc3BhdGhQYWdlID0gbmV3IEFudENsYXNzcGF0aFBhZ2UodGhpcyk7CisJCWNsYXNzcGF0aFBhZ2UuY3JlYXRlVGFiSXRlbShmb2xkZXIpOworCQkKKwkJdGFza3NQYWdlID0gbmV3IEFudFRhc2tzUGFnZSh0aGlzKTsKKwkJdGFza3NQYWdlLmNyZWF0ZVRhYkl0ZW0oZm9sZGVyKTsKKwkJCisJCXR5cGVzUGFnZSA9IG5ldyBBbnRUeXBlc1BhZ2UodGhpcyk7CisJCXR5cGVzUGFnZS5jcmVhdGVUYWJJdGVtKGZvbGRlcik7CisKKwkJcHJvcGVydGllc1BhZ2U9IG5ldyBBbnRQcm9wZXJ0aWVzUGFnZSh0aGlzKTsKKwkJcHJvcGVydGllc1BhZ2UuY3JlYXRlVGFiSXRlbShmb2xkZXIpOworCQkKKwkJdGFza3NQYWdlLmluaXRpYWxpemUoKTsKKwkJdHlwZXNQYWdlLmluaXRpYWxpemUoKTsKKwkJY2xhc3NwYXRoUGFnZS5pbml0aWFsaXplKCk7CisJCXByb3BlcnRpZXNQYWdlLmluaXRpYWxpemUoKTsKKworCQlyZXR1cm4gZm9sZGVyOworCX0KKwkKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI3BlcmZvcm1EZWZhdWx0cygpCisJICovCisJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgeworCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKKwkJCisJCUFudENvcmVQcmVmZXJlbmNlcyBwcmVmcyA9IEFudENvcmVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0UHJlZmVyZW5jZXMoKTsKKwkJdGFza3NQYWdlLnNldElucHV0KHByZWZzLmdldERlZmF1bHRUYXNrcygpKTsKKwkJdHlwZXNQYWdlLnNldElucHV0KHByZWZzLmdldERlZmF1bHRUeXBlcygpKTsKKwkJY2xhc3NwYXRoUGFnZS5wZXJmb3JtRGVmYXVsdHMoKTsKKwkJcHJvcGVydGllc1BhZ2UucGVyZm9ybURlZmF1bHRzKCk7CisJfQorCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VQYWdlI3BlcmZvcm1PaygpCisJICovCisJcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgeworCQlBbnRDb3JlUHJlZmVyZW5jZXMgcHJlZnMgPSBBbnRDb3JlUGx1Z2luLmdldFBsdWdpbigpLmdldFByZWZlcmVuY2VzKCk7CisJCUlEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncyA9IEFudFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXREaWFsb2dTZXR0aW5ncygpOworCQkKKwkJcHJlZnMuc2V0QW50SG9tZUNsYXNzcGF0aEVudHJpZXMoY2xhc3NwYXRoUGFnZS5nZXRBbnRIb21lRW50cmllcygpKTsKKwkJCisJCQorCQlwcmVmcy5zZXRBZGRpdGlvbmFsQ2xhc3NwYXRoRW50cmllcyhjbGFzc3BhdGhQYWdlLmdldEFkZGl0aW9uYWxFbnRyaWVzKCkpOworCQkKKwkJU3RyaW5nIGFudEhvbWU9IGNsYXNzcGF0aFBhZ2UuZ2V0QW50SG9tZSgpOworCQlwcmVmcy5zZXRBbnRIb21lKGFudEhvbWUpOworCQkKKwkJTGlzdCBjb250ZW50cyA9IHRhc2tzUGFnZS5nZXRDb250ZW50cyhmYWxzZSk7CisJCWlmIChjb250ZW50cyAhPSBudWxsKSB7CisJCQlUYXNrW10gdGFza3MgPSAoVGFza1tdKSBjb250ZW50cy50b0FycmF5KG5ldyBUYXNrW2NvbnRlbnRzLnNpemUoKV0pOworCQkJcHJlZnMuc2V0Q3VzdG9tVGFza3ModGFza3MpOworCQl9CisJCQorCQl0YXNrc1BhZ2Uuc2F2ZUNvbHVtblNldHRpbmdzKHNldHRpbmdzKTsKKwkJCisJCWNvbnRlbnRzID0gdHlwZXNQYWdlLmdldENvbnRlbnRzKGZhbHNlKTsKKwkJaWYgKGNvbnRlbnRzICE9IG51bGwpIHsKKwkJCVR5cGVbXSB0eXBlcyA9IChUeXBlW10pIGNvbnRlbnRzLnRvQXJyYXkobmV3IFR5cGVbY29udGVudHMuc2l6ZSgpXSk7CisJCQlwcmVmcy5zZXRDdXN0b21UeXBlcyh0eXBlcyk7CisJCX0KKwkJCisJCXR5cGVzUGFnZS5zYXZlQ29sdW1uU2V0dGluZ3Moc2V0dGluZ3MpOworCQkKKwkJY29udGVudHMgPSBwcm9wZXJ0aWVzUGFnZS5nZXRQcm9wZXJ0aWVzKCk7CisJCWlmIChjb250ZW50cyAhPSBudWxsKSB7CisJCQlQcm9wZXJ0eVtdIHByb3BlcnRpZXMgPSAoUHJvcGVydHlbXSkgY29udGVudHMudG9BcnJheShuZXcgUHJvcGVydHlbY29udGVudHMuc2l6ZSgpXSk7CisJCQlwcmVmcy5zZXRDdXN0b21Qcm9wZXJ0aWVzKHByb3BlcnRpZXMpOworCQl9CisJCQorCQlTdHJpbmdbXSBmaWxlcyA9IHByb3BlcnRpZXNQYWdlLmdldFByb3BlcnR5RmlsZXMoKTsKKwkJcHJlZnMuc2V0Q3VzdG9tUHJvcGVydHlGaWxlcyhmaWxlcyk7CisJCQorCQlwcm9wZXJ0aWVzUGFnZS5zYXZlQWRkaXRpb25hbFNldHRpbmdzKCk7CisJCQorCQlwcmVmcy51cGRhdGVQbHVnaW5QcmVmZXJlbmNlcygpOworCQorCQlyZXR1cm4gc3VwZXIucGVyZm9ybU9rKCk7CisJfQorCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nUGFnZSNzZXRCdXR0b25MYXlvdXREYXRhKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbikKKwkgKi8KKwlwcm90ZWN0ZWQgR3JpZERhdGEgc2V0QnV0dG9uTGF5b3V0RGF0YShCdXR0b24gYnV0dG9uKSB7CisJCXJldHVybiBzdXBlci5zZXRCdXR0b25MYXlvdXREYXRhKGJ1dHRvbik7CisJfQorCQorCXByb3RlY3RlZCBMaXN0IGdldExpYnJhcnlFbnRyaWVzKCkgeworCQlMaXN0IHVybHM9IG5ldyBBcnJheUxpc3QoKTsKKwkJdXJscy5hZGRBbGwoQXJyYXlzLmFzTGlzdChjbGFzc3BhdGhQYWdlLmdldEFudEhvbWVFbnRyaWVzKCkpKTsKKwkJdXJscy5hZGRBbGwoQXJyYXlzLmFzTGlzdChjbGFzc3BhdGhQYWdlLmdldEFkZGl0aW9uYWxFbnRyaWVzKCkpKTsKKwkJdXJscy5hZGRBbGwoQXJyYXlzLmFzTGlzdChjbGFzc3BhdGhQYWdlLmdldENvbnRyaWJ1dGVkRW50cmllcygpKSk7CisJCXJldHVybiB1cmxzOworCX0KK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL0FudFRhc2tzUGFnZS5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvQW50VGFza3NQYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg4NTkyZQotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL0FudFRhc2tzUGFnZS5qYXZhCkBAIC0wLDAgKzEsMTMzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5wcmVmZXJlbmNlczsKKworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuY29yZS5BbnRDb3JlUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5jb3JlLkFudENvcmVQcmVmZXJlbmNlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuY29yZS5UYXNrOworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5JQW50VUlIZWxwQ29udGV4dElkczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFiRm9sZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYkl0ZW07CisKKy8qKgorICogU3ViLXBhZ2UgdGhhdCBhbGxvd3MgdGhlIHVzZXIgdG8gZW50ZXIgY3VzdG9tIHRhc2tzCisgKiB0byBiZSB1c2VkIHdoZW4gcnVubmluZyBBbnQgYnVpbGQgZmlsZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBBbnRUYXNrc1BhZ2UgZXh0ZW5kcyBBbnRQYWdlIHsKKyAgICAKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGluc3RhbmNlLgorCSAqLworCXB1YmxpYyBBbnRUYXNrc1BhZ2UoQW50UnVudGltZVByZWZlcmVuY2VQYWdlIHByZWZlcmVuY2VQYWdlKSB7CisJCXN1cGVyKHByZWZlcmVuY2VQYWdlKTsKKwl9CisJCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLnByZWZlcmVuY2VzLkFudFBhZ2UjYWRkQnV0dG9uc1RvQnV0dG9uR3JvdXAob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZEJ1dHRvbnNUb0J1dHRvbkdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJY3JlYXRlUHVzaEJ1dHRvbihwYXJlbnQsIEFudFByZWZlcmVuY2VzTWVzc2FnZXMuQW50VGFza3NQYWdlXzEsIEFERF9CVVRUT04pOworCQllZGl0QnV0dG9uID0gY3JlYXRlUHVzaEJ1dHRvbihwYXJlbnQsIEFudFByZWZlcmVuY2VzTWVzc2FnZXMuQW50VGFza3NQYWdlXzIsIEVESVRfQlVUVE9OKTsKKwkJcmVtb3ZlQnV0dG9uID0gY3JlYXRlUHVzaEJ1dHRvbihwYXJlbnQsIEFudFByZWZlcmVuY2VzTWVzc2FnZXMuQW50VGFza3NQYWdlXzMsIFJFTU9WRV9CVVRUT04pOworCX0KKwkKKwkvKioKKwkgKiBBbGxvd3MgdGhlIHVzZXIgdG8gZW50ZXIgYSBjdXN0b20gdGFzay4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBhZGQoKSB7CisJCVN0cmluZyB0aXRsZSA9IEFudFByZWZlcmVuY2VzTWVzc2FnZXMuQW50VGFza3NQYWdlX2FkZFRhc2tEaWFsb2dUaXRsZTsKKwkJQWRkQ3VzdG9tRGlhbG9nIGRpYWxvZyA9IGdldEN1c3RvbURpYWxvZyh0aXRsZSwgSUFudFVJSGVscENvbnRleHRJZHMuQUREX1RBU0tfRElBTE9HKTsKKwkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93LkNBTkNFTCkgeworCQkJcmV0dXJuOworCQl9CisKKwkJVGFzayB0YXNrID0gbmV3IFRhc2soKTsKKwkJdGFzay5zZXRUYXNrTmFtZShkaWFsb2cuZ2V0TmFtZSgpKTsKKwkJdGFzay5zZXRDbGFzc05hbWUoZGlhbG9nLmdldENsYXNzTmFtZSgpKTsKKwkJdGFzay5zZXRMaWJyYXJ5RW50cnkoZGlhbG9nLmdldExpYnJhcnlFbnRyeSgpKTsKKwkJYWRkQ29udGVudCh0YXNrKTsKKwl9CisJCisJcHJpdmF0ZSBBZGRDdXN0b21EaWFsb2cgZ2V0Q3VzdG9tRGlhbG9nKFN0cmluZyB0aXRsZSwgU3RyaW5nIGhlbHBDb250ZXh0KSB7CisJCUl0ZXJhdG9yIHRhc2tzPSBnZXRDb250ZW50cyh0cnVlKS5pdGVyYXRvcigpOworCQlMaXN0IG5hbWVzPSBuZXcgQXJyYXlMaXN0KCk7CisJCXdoaWxlICh0YXNrcy5oYXNOZXh0KCkpIHsKKwkJCVRhc2sgdGFzayA9IChUYXNrKSB0YXNrcy5uZXh0KCk7CisJCQluYW1lcy5hZGQodGFzay5nZXRUYXNrTmFtZSgpKTsJCisJCX0KKwkJQWRkQ3VzdG9tRGlhbG9nIGRpYWxvZyA9IG5ldyBBZGRDdXN0b21EaWFsb2coZ2V0U2hlbGwoKSwgZ2V0UHJlZmVyZW5jZVBhZ2UoKS5nZXRMaWJyYXJ5RW50cmllcygpLCBuYW1lcywgaGVscENvbnRleHQpOworCQlkaWFsb2cuc2V0VGl0bGUodGl0bGUpOworCQlkaWFsb2cuc2V0QWxyZWFkeUV4aXN0c0Vycm9yTXNnKEFudFByZWZlcmVuY2VzTWVzc2FnZXMuQW50VGFza3NQYWdlXzgpOworCQlkaWFsb2cuc2V0Tm9OYW1lRXJyb3JNc2coQW50UHJlZmVyZW5jZXNNZXNzYWdlcy5BbnRUYXNrc1BhZ2VfOSk7CisJCXJldHVybiBkaWFsb2c7CisJfQorCQorCS8qKgorCSAqIENyZWF0ZXMgdGhlIHRhYiBpdGVtIHRoYXQgY29udGFpbnMgdGhpcyBzdWItcGFnZS4KKwkgKi8KKwlwcm90ZWN0ZWQgVGFiSXRlbSBjcmVhdGVUYWJJdGVtKFRhYkZvbGRlciBmb2xkZXIpIHsKKwkJVGFiSXRlbSBpdGVtID0gbmV3IFRhYkl0ZW0oZm9sZGVyLCBTV1QuTk9ORSk7CisJCWl0ZW0uc2V0VGV4dChBbnRQcmVmZXJlbmNlc01lc3NhZ2VzLkFudFRhc2tzUGFnZV90aXRsZSk7CisJCWl0ZW0uc2V0SW1hZ2UoQW50T2JqZWN0TGFiZWxQcm92aWRlci5nZXRUYXNrSW1hZ2UoKSk7CisJCWl0ZW0uc2V0RGF0YSh0aGlzKTsKKwkJQ29tcG9zaXRlIHRvcCA9IG5ldyBDb21wb3NpdGUoZm9sZGVyLCBTV1QuTk9ORSk7CisJCXRvcC5zZXRGb250KGZvbGRlci5nZXRGb250KCkpOworCQlpdGVtLnNldENvbnRyb2woY3JlYXRlQ29udGVudHModG9wKSk7CisJCQorCQljb25uZWN0VG9Gb2xkZXIoaXRlbSwgZm9sZGVyKTsKKwkJCisJCXJldHVybiBpdGVtOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5BbnRQYWdlI2VkaXQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbikKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBlZGl0KElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgeworCQlUYXNrIHRhc2s9IChUYXNrKXNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKKwkJU3RyaW5nIHRpdGxlID0gQW50UHJlZmVyZW5jZXNNZXNzYWdlcy5BbnRUYXNrc1BhZ2VfZWRpdFRhc2tEaWFsb2dUaXRsZTsKKwkJQWRkQ3VzdG9tRGlhbG9nIGRpYWxvZyA9IGdldEN1c3RvbURpYWxvZyh0aXRsZSwgSUFudFVJSGVscENvbnRleHRJZHMuRURJVF9UQVNLX0RJQUxPRyk7CisJCWRpYWxvZy5zZXRDbGFzc05hbWUodGFzay5nZXRDbGFzc05hbWUoKSk7CisJCWRpYWxvZy5zZXROYW1lKHRhc2suZ2V0VGFza05hbWUoKSk7CisJCWRpYWxvZy5zZXRMaWJyYXJ5RW50cnkodGFzay5nZXRMaWJyYXJ5RW50cnkoKSk7CisJCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5DQU5DRUwpIHsKKwkJCXJldHVybjsKKwkJfQorCisJCXRhc2suc2V0VGFza05hbWUoZGlhbG9nLmdldE5hbWUoKSk7CisJCXRhc2suc2V0Q2xhc3NOYW1lKGRpYWxvZy5nZXRDbGFzc05hbWUoKSk7CisJCXRhc2suc2V0TGlicmFyeUVudHJ5KGRpYWxvZy5nZXRMaWJyYXJ5RW50cnkoKSk7CisJCXVwZGF0ZUNvbnRlbnQodGFzayk7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLnByZWZlcmVuY2VzLkFudFBhZ2UjaW5pdGlhbGl6ZSgpCisJICovCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKKwkJQW50Q29yZVByZWZlcmVuY2VzIHByZWZzID0gQW50Q29yZVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRQcmVmZXJlbmNlcygpOworCQlzZXRJbnB1dChwcmVmcy5nZXRUYXNrcygpKTsKKwl9CisJCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLnByZWZlcmVuY2VzLkFudFBhZ2UjZ2V0SGVscENvbnRleHRJZCgpCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBnZXRIZWxwQ29udGV4dElkKCkgeworCQlyZXR1cm4gSUFudFVJSGVscENvbnRleHRJZHMuQU5UX1RBU0tTX1BBR0U7CisJfQorfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvQW50VHlwZXNQYWdlLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9BbnRUeXBlc1BhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmI5NzFjCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvQW50VHlwZXNQYWdlLmphdmEKQEAgLTAsMCArMSwxMzQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLnByZWZlcmVuY2VzOworCisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5jb3JlLkFudENvcmVQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmNvcmUuQW50Q29yZVByZWZlcmVuY2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5jb3JlLlR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLklBbnRVSUhlbHBDb250ZXh0SWRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJGb2xkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFiSXRlbTsKKworLyoqCisgKiBTdWItcGFnZSB0aGF0IGFsbG93cyB0aGUgdXNlciB0byBlbnRlciBjdXN0b20gdHlwZXMKKyAqIHRvIGJlIHVzZWQgd2hlbiBydW5uaW5nIEFudCBidWlsZCBmaWxlcy4KKyAqLworcHVibGljIGNsYXNzIEFudFR5cGVzUGFnZSBleHRlbmRzIEFudFBhZ2UgeworICAgIAorCS8qKgorCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UuCisJICovCisJcHVibGljIEFudFR5cGVzUGFnZShBbnRSdW50aW1lUHJlZmVyZW5jZVBhZ2UgcHJlZmVyZW5jZVBhZ2UpIHsKKwkJc3VwZXIocHJlZmVyZW5jZVBhZ2UpOworCX0KKwkKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkucHJlZmVyZW5jZXMuQW50UGFnZSNhZGRCdXR0b25zVG9CdXR0b25Hcm91cChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkQnV0dG9uc1RvQnV0dG9uR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgeworCQljcmVhdGVQdXNoQnV0dG9uKHBhcmVudCwgQW50UHJlZmVyZW5jZXNNZXNzYWdlcy5BbnRUeXBlc1BhZ2VfMiwgQUREX0JVVFRPTik7CisJCWVkaXRCdXR0b24gPSBjcmVhdGVQdXNoQnV0dG9uKHBhcmVudCwgQW50UHJlZmVyZW5jZXNNZXNzYWdlcy5BbnRUeXBlc1BhZ2VfMywgRURJVF9CVVRUT04pOworCQlyZW1vdmVCdXR0b24gPSBjcmVhdGVQdXNoQnV0dG9uKHBhcmVudCwgQW50UHJlZmVyZW5jZXNNZXNzYWdlcy5BbnRUeXBlc1BhZ2VfMSwgUkVNT1ZFX0JVVFRPTik7CisJfQorCQorCS8qKgorCSAqIEFsbG93cyB0aGUgdXNlciB0byBlbnRlciBhIGN1c3RvbSB0eXBlLgorCSAqLworCXByb3RlY3RlZCB2b2lkIGFkZCgpIHsKKwkJU3RyaW5nIHRpdGxlID0gQW50UHJlZmVyZW5jZXNNZXNzYWdlcy5BbnRUeXBlc1BhZ2VfYWRkVHlwZURpYWxvZ1RpdGxlOworCQlBZGRDdXN0b21EaWFsb2cgZGlhbG9nID0gZ2V0Q3VzdG9tRGlhbG9nKHRpdGxlLCBJQW50VUlIZWxwQ29udGV4dElkcy5BRERfVFlQRV9ESUFMT0cpOworCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuQ0FOQ0VMKSB7CisJCQlyZXR1cm47CisJCX0KKworCQlUeXBlIHR5cGUgPSBuZXcgVHlwZSgpOworCQl0eXBlLnNldFR5cGVOYW1lKGRpYWxvZy5nZXROYW1lKCkpOworCQl0eXBlLnNldENsYXNzTmFtZShkaWFsb2cuZ2V0Q2xhc3NOYW1lKCkpOworCQl0eXBlLnNldExpYnJhcnlFbnRyeShkaWFsb2cuZ2V0TGlicmFyeUVudHJ5KCkpOworCQlhZGRDb250ZW50KHR5cGUpOworCX0KKwkKKwkvKioKKwkgKiBDcmVhdGVzIHRoZSB0YWIgaXRlbSB0aGF0IGNvbnRhaW5zIHRoaXMgc3ViLXBhZ2UuCisJICovCisJcHJvdGVjdGVkIFRhYkl0ZW0gY3JlYXRlVGFiSXRlbShUYWJGb2xkZXIgZm9sZGVyKSB7CisJCVRhYkl0ZW0gaXRlbSA9IG5ldyBUYWJJdGVtKGZvbGRlciwgU1dULk5PTkUpOworCQlpdGVtLnNldFRleHQoQW50UHJlZmVyZW5jZXNNZXNzYWdlcy5BbnRUeXBlc1BhZ2VfdHlwZXNQYWdlVGl0bGUpOworCQlpdGVtLnNldEltYWdlKEFudE9iamVjdExhYmVsUHJvdmlkZXIuZ2V0VHlwZUltYWdlKCkpOworCQlpdGVtLnNldERhdGEodGhpcyk7CisJCUNvbXBvc2l0ZSB0b3AgPSBuZXcgQ29tcG9zaXRlKGZvbGRlciwgU1dULk5PTkUpOworCQl0b3Auc2V0Rm9udChmb2xkZXIuZ2V0Rm9udCgpKTsJCQkKKwkJaXRlbS5zZXRDb250cm9sKGNyZWF0ZUNvbnRlbnRzKHRvcCkpOworCQkKKwkJY29ubmVjdFRvRm9sZGVyKGl0ZW0sIGZvbGRlcik7CisJCQkJCisJCXJldHVybiBpdGVtOworCX0KKwkKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkucHJlZmVyZW5jZXMuQW50UGFnZSNlZGl0KG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb24pCisJICovCisJcHJvdGVjdGVkIHZvaWQgZWRpdChJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKwkJVHlwZSB0eXBlID0gKFR5cGUpIHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKKwkJU3RyaW5nIHRpdGxlID0gQW50UHJlZmVyZW5jZXNNZXNzYWdlcy5BbnRUeXBlc1BhZ2VfZWRpdFR5cGVEaWFsb2dUaXRsZTsKKwkJQWRkQ3VzdG9tRGlhbG9nIGRpYWxvZyA9IGdldEN1c3RvbURpYWxvZyh0aXRsZSwgSUFudFVJSGVscENvbnRleHRJZHMuRURJVF9UWVBFX0RJQUxPRyk7CisJCWRpYWxvZy5zZXRDbGFzc05hbWUodHlwZS5nZXRDbGFzc05hbWUoKSk7CisJCWRpYWxvZy5zZXROYW1lKHR5cGUuZ2V0VHlwZU5hbWUoKSk7CisJCWRpYWxvZy5zZXRMaWJyYXJ5RW50cnkodHlwZS5nZXRMaWJyYXJ5RW50cnkoKSk7CisJCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5DQU5DRUwpIHsKKwkJCXJldHVybjsKKwkJfQorCisJCXR5cGUuc2V0VHlwZU5hbWUoZGlhbG9nLmdldE5hbWUoKSk7CisJCXR5cGUuc2V0Q2xhc3NOYW1lKGRpYWxvZy5nZXRDbGFzc05hbWUoKSk7CisJCXR5cGUuc2V0TGlicmFyeUVudHJ5KGRpYWxvZy5nZXRMaWJyYXJ5RW50cnkoKSk7CisJCXVwZGF0ZUNvbnRlbnQodHlwZSk7CisJfQorCQorCXByaXZhdGUgQWRkQ3VzdG9tRGlhbG9nIGdldEN1c3RvbURpYWxvZyhTdHJpbmcgdGl0bGUsIFN0cmluZyBoZWxwQ29udGV4dCkgeworCQlJdGVyYXRvciB0eXBlcz0gZ2V0Q29udGVudHModHJ1ZSkuaXRlcmF0b3IoKTsKKwkJTGlzdCBuYW1lcz0gbmV3IEFycmF5TGlzdCgpOworCQl3aGlsZSAodHlwZXMuaGFzTmV4dCgpKSB7CisJCQlUeXBlIGFUYXNrID0gKFR5cGUpIHR5cGVzLm5leHQoKTsKKwkJCW5hbWVzLmFkZChhVGFzay5nZXRUeXBlTmFtZSgpKTsKKwkJfQorCQkKKwkJQWRkQ3VzdG9tRGlhbG9nIGRpYWxvZyA9IG5ldyBBZGRDdXN0b21EaWFsb2coZ2V0U2hlbGwoKSwgZ2V0UHJlZmVyZW5jZVBhZ2UoKS5nZXRMaWJyYXJ5RW50cmllcygpLCBuYW1lcywgaGVscENvbnRleHQpOworCQlkaWFsb2cuc2V0VGl0bGUodGl0bGUpOworCQlkaWFsb2cuc2V0QWxyZWFkeUV4aXN0c0Vycm9yTXNnKEFudFByZWZlcmVuY2VzTWVzc2FnZXMuQW50VHlwZXNQYWdlXzgpOworCQlkaWFsb2cuc2V0Tm9OYW1lRXJyb3JNc2coQW50UHJlZmVyZW5jZXNNZXNzYWdlcy5BbnRUeXBlc1BhZ2VfOSk7CisJCXJldHVybiBkaWFsb2c7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLnByZWZlcmVuY2VzLkFudFBhZ2UjaW5pdGlhbGl6ZSgpCisJICovCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKKwkJQW50Q29yZVByZWZlcmVuY2VzIHByZWZzPSBBbnRDb3JlUGx1Z2luLmdldFBsdWdpbigpLmdldFByZWZlcmVuY2VzKCk7CisJCXNldElucHV0KHByZWZzLmdldFR5cGVzKCkpOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5BbnRQYWdlI2dldEhlbHBDb250ZXh0SWQoKQorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgZ2V0SGVscENvbnRleHRJZCgpIHsKKwkJcmV0dXJuIElBbnRVSUhlbHBDb250ZXh0SWRzLkFOVF9UWVBFU19QQUdFOworCX0KK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL0NsYXNzcGF0aE1vZGVsLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9DbGFzc3BhdGhNb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMzNhYWIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9DbGFzc3BhdGhNb2RlbC5qYXZhCkBAIC0wLDAgKzEsMjUwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLnByZWZlcmVuY2VzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmNvcmUuSUFudENsYXNzcGF0aEVudHJ5OworCitwdWJsaWMgY2xhc3MgQ2xhc3NwYXRoTW9kZWwgZXh0ZW5kcyBBYnN0cmFjdENsYXNzcGF0aEVudHJ5IHsKKwkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTlRfSE9NRT0gMDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTE9CQUxfVVNFUj0gMTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVU0VSPSAyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTlRSSUJVVEVEPSAzOworCQorCXByaXZhdGUgR2xvYmFsQ2xhc3NwYXRoRW50cmllcyBmQW50SG9tZUVudHJ5OworCXByaXZhdGUgR2xvYmFsQ2xhc3NwYXRoRW50cmllcyBmVXNlckdsb2JhbEVudHJ5OworICAgIHByaXZhdGUgR2xvYmFsQ2xhc3NwYXRoRW50cmllcyBmQ29udHJpYnV0ZWRHbG9iYWxFbnRyeTsKKwkKKwlwdWJsaWMgT2JqZWN0IGFkZEVudHJ5KE9iamVjdCBlbnRyeSkgeworCQlpZiAoZW50cnkgaW5zdGFuY2VvZiBHbG9iYWxDbGFzc3BhdGhFbnRyaWVzKSB7CisJCQlpZiAoIWZDaGlsZEVudHJpZXMuY29udGFpbnMoZW50cnkpKSB7CisJCQkJZkNoaWxkRW50cmllcy5hZGQoZW50cnkpOworCQkJCXJldHVybiBlbnRyeTsKKwkJCX0KKwkJCXJldHVybiBudWxsOworCQl9IAorCQlDbGFzc3BhdGhFbnRyeSBuZXdFbnRyeT0gY3JlYXRlRW50cnkoZW50cnksIG51bGwpOworCQlJdGVyYXRvciBlbnRyaWVzPSBmQ2hpbGRFbnRyaWVzLml0ZXJhdG9yKCk7CisJCXdoaWxlIChlbnRyaWVzLmhhc05leHQoKSkgeworCQkJT2JqZWN0IGVsZW1lbnQgPSBlbnRyaWVzLm5leHQoKTsKKwkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgR2xvYmFsQ2xhc3NwYXRoRW50cmllcykgeworCQkJCWlmKCgoR2xvYmFsQ2xhc3NwYXRoRW50cmllcyllbGVtZW50KS5jb250YWlucyhuZXdFbnRyeSkpIHsKKwkJCQkJcmV0dXJuIG51bGw7CisJCQkJfQorCQkJfSBlbHNlIGlmIChlbGVtZW50LmVxdWFscyhuZXdFbnRyeSkpIHsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJfQorCQlmQ2hpbGRFbnRyaWVzLmFkZChuZXdFbnRyeSk7CisJCXJldHVybiBuZXdFbnRyeTsKKwl9CisJCisJcHVibGljIE9iamVjdCBhZGRFbnRyeShpbnQgZW50cnlUeXBlLCBPYmplY3QgZW50cnkpIHsKKwkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5UGFyZW50PSBudWxsOworCQlzd2l0Y2ggKGVudHJ5VHlwZSkgeworCQkJY2FzZSBBTlRfSE9NRSA6CisJCQkJaWYgKGZBbnRIb21lRW50cnkgPT0gbnVsbCkgeworCQkJCQlTdHJpbmcgbmFtZT0gQW50UHJlZmVyZW5jZXNNZXNzYWdlcy5DbGFzc3BhdGhNb2RlbF8yOworCQkJCQlmQW50SG9tZUVudHJ5PSBjcmVhdGVHbG9iYWxFbnRyeShuZXcgSUFudENsYXNzcGF0aEVudHJ5WzBdLCBuYW1lLCBmYWxzZSwgdHJ1ZSwgQU5UX0hPTUUpOworCQkJCX0KKwkJCQllbnRyeVBhcmVudD0gZkFudEhvbWVFbnRyeTsKKwkJCQlicmVhazsKKwkJCWNhc2UgR0xPQkFMX1VTRVIgOgorCQkJCWlmIChmVXNlckdsb2JhbEVudHJ5ID09IG51bGwpIHsKKwkJCQkJU3RyaW5nIG5hbWU9IEFudFByZWZlcmVuY2VzTWVzc2FnZXMuQ2xhc3NwYXRoTW9kZWxfMzsKKwkJCQkJZlVzZXJHbG9iYWxFbnRyeT0gY3JlYXRlR2xvYmFsRW50cnkobmV3IElBbnRDbGFzc3BhdGhFbnRyeVswXSwgbmFtZSwgdHJ1ZSwgdHJ1ZSwgR0xPQkFMX1VTRVIpOworCQkJCX0KKwkJCQllbnRyeVBhcmVudD0gZlVzZXJHbG9iYWxFbnRyeTsKKwkJCQlicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ09OVFJJQlVURUQgOgorICAgICAgICAgICAgICAgIGlmIChmQ29udHJpYnV0ZWRHbG9iYWxFbnRyeSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lPSBBbnRQcmVmZXJlbmNlc01lc3NhZ2VzLkNsYXNzcGF0aE1vZGVsXzA7CisgICAgICAgICAgICAgICAgICAgIGZDb250cmlidXRlZEdsb2JhbEVudHJ5PSBjcmVhdGVHbG9iYWxFbnRyeShuZXcgSUFudENsYXNzcGF0aEVudHJ5WzBdLCBuYW1lLCB0cnVlLCB0cnVlLCBDT05UUklCVVRFRCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVudHJ5UGFyZW50PSBmQ29udHJpYnV0ZWRHbG9iYWxFbnRyeTsKKyAgICAgICAgICAgICAgICBicmVhazsKKwkJCWRlZmF1bHQgOgorCQkJCWJyZWFrOworCQl9CisJCQkKKwkJQ2xhc3NwYXRoRW50cnkgbmV3RW50cnk9IGNyZWF0ZUVudHJ5KGVudHJ5LCBlbnRyeVBhcmVudCk7CisJCUl0ZXJhdG9yIGVudHJpZXM9IGZDaGlsZEVudHJpZXMuaXRlcmF0b3IoKTsKKwkJd2hpbGUgKGVudHJpZXMuaGFzTmV4dCgpKSB7CisJCQlPYmplY3QgZWxlbWVudCA9IGVudHJpZXMubmV4dCgpOworCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBHbG9iYWxDbGFzc3BhdGhFbnRyaWVzKSB7CisJCQkJaWYoKChHbG9iYWxDbGFzc3BhdGhFbnRyaWVzKWVsZW1lbnQpLmNvbnRhaW5zKG5ld0VudHJ5KSkgeworCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKGVsZW1lbnQuZXF1YWxzKG5ld0VudHJ5KSkgeworCQkJCXJldHVybiBudWxsOworCQkJfQorCQl9CisJCWlmIChlbnRyeVBhcmVudCAhPSBudWxsKSB7CisJCQkoKEdsb2JhbENsYXNzcGF0aEVudHJpZXMpZW50cnlQYXJlbnQpLmFkZEVudHJ5KG5ld0VudHJ5KTsKKwkJfSBlbHNlIHsKKwkJCWZDaGlsZEVudHJpZXMuYWRkKG5ld0VudHJ5KTsKKwkJfQorCQlyZXR1cm4gbmV3RW50cnk7CQkKKwl9CisJCisJLyoqCisJICogUmV0dXJucyBlbnRyaWVzIG9mIHRoZSBzcGVjaWZpZWQga2luZCwgcG9zc2libHkgZW1wdHkuCisJICogCisJICogQHBhcmFtIGVudHJ5VHlwZSBraW5kIG9mIGVudHJpZXMgdG8gcmV0cmlldmUKKwkgKiBAcmV0dXJuIGVudHJpZXMgb2YgdGhlIHNwZWNpZmllZCBraW5kLCBwb3NzaWJseSBlbXB0eQorCSAqLworCXB1YmxpYyBJQW50Q2xhc3NwYXRoRW50cnlbXSBnZXRFbnRyaWVzKGludCBlbnRyeVR5cGUpIHsKKwkJc3dpdGNoIChlbnRyeVR5cGUpIHsKKwkJCWNhc2UgQU5UX0hPTUUgOgorCQkJCWlmIChmQW50SG9tZUVudHJ5ICE9IG51bGwpIHsKKwkJCQkJcmV0dXJuIGZBbnRIb21lRW50cnkuZ2V0RW50cmllcygpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgR0xPQkFMX1VTRVIgOgorCQkJCWlmIChmVXNlckdsb2JhbEVudHJ5ICE9IG51bGwpIHsKKwkJCQkJcmV0dXJuIGZVc2VyR2xvYmFsRW50cnkuZ2V0RW50cmllcygpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgVVNFUiA6IAorCQkJCXJldHVybiBnZXRVc2VyRW50cmllcygpOworCQkJY2FzZSBDT05UUklCVVRFRCA6IAorCQkJCWlmIChmQ29udHJpYnV0ZWRHbG9iYWxFbnRyeSAhPSBudWxsKSB7CisJCQkJCXJldHVybiBmQ29udHJpYnV0ZWRHbG9iYWxFbnRyeS5nZXRFbnRyaWVzKCk7CisJCQkJfQorCQkJCWJyZWFrOworCQl9CisJCXJldHVybiBuZXcgSUFudENsYXNzcGF0aEVudHJ5WzBdOworCX0KKwkKKwlwdWJsaWMgdm9pZCByZW1vdmUoT2JqZWN0IGVudHJ5KSB7CisJCWZDaGlsZEVudHJpZXMucmVtb3ZlKGVudHJ5KTsKKwkJaWYgKGVudHJ5ID09IGZVc2VyR2xvYmFsRW50cnkpIHsKKwkJCWZVc2VyR2xvYmFsRW50cnk9IG51bGw7CisJCX0KKwl9CisJCisJcHVibGljIENsYXNzcGF0aEVudHJ5IGNyZWF0ZUVudHJ5KE9iamVjdCBlbnRyeSwgSUNsYXNzcGF0aEVudHJ5IGVudHJ5UGFyZW50KSB7CisJCWlmIChlbnRyeVBhcmVudCA9PSBudWxsKSB7CisJCQllbnRyeVBhcmVudD0gdGhpczsKKwkJfSAKKwkJcmV0dXJuIG5ldyBDbGFzc3BhdGhFbnRyeShlbnRyeSwgZW50cnlQYXJlbnQpOworCX0KKworCXB1YmxpYyB2b2lkIHJlbW92ZUFsbCgpIHsKKwkJaWYgKGZBbnRIb21lRW50cnkgIT0gbnVsbCkgeworCQkJZkFudEhvbWVFbnRyeS5yZW1vdmVBbGwoKTsKKwkJfSAKKwkJaWYgKGZVc2VyR2xvYmFsRW50cnkgIT0gbnVsbCkgeworCQkJZlVzZXJHbG9iYWxFbnRyeS5yZW1vdmVBbGwoKTsKKwkJfQorCX0KKwkKKwlwdWJsaWMgdm9pZCByZW1vdmVBbGwoaW50IGVudHJ5VHlwZSkgeworCQlzd2l0Y2ggKGVudHJ5VHlwZSkgeworCQkJY2FzZSBBTlRfSE9NRSA6CisJCQkJaWYgKGZBbnRIb21lRW50cnkgIT0gbnVsbCkgeworCQkJCQlmQW50SG9tZUVudHJ5LnJlbW92ZUFsbCgpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgR0xPQkFMX1VTRVIgOgorCQkJCWlmIChmVXNlckdsb2JhbEVudHJ5ICE9IG51bGwpIHsKKwkJCQkJZlVzZXJHbG9iYWxFbnRyeS5yZW1vdmVBbGwoKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0IDoKKwkJCQlicmVhazsKKwkJfQorCX0KKwkKKwlwdWJsaWMgdm9pZCByZW1vdmVBbGwoT2JqZWN0W10gZW50cmllcykgeworCQkKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7CisJCQlPYmplY3Qgb2JqZWN0ID0gZW50cmllc1tpXTsKKwkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBDbGFzc3BhdGhFbnRyeSkgeworCQkJCUlDbGFzc3BhdGhFbnRyeSBlbnRyeVBhcmVudD0gKChDbGFzc3BhdGhFbnRyeSlvYmplY3QpLmdldFBhcmVudCgpOworCQkJCWlmIChlbnRyeVBhcmVudCBpbnN0YW5jZW9mIEdsb2JhbENsYXNzcGF0aEVudHJpZXMpIHsKKwkJCQkJKChHbG9iYWxDbGFzc3BhdGhFbnRyaWVzKWVudHJ5UGFyZW50KS5yZW1vdmVFbnRyeSgoQ2xhc3NwYXRoRW50cnkpIG9iamVjdCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJcmVtb3ZlKG9iamVjdCk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlyZW1vdmUob2JqZWN0KTsKKwkJCX0KKwkJfQorCX0KKworCXB1YmxpYyB2b2lkIHNldEFudEhvbWVFbnRyaWVzKElBbnRDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMpIHsKKwkJaWYgKGZBbnRIb21lRW50cnkgPT0gbnVsbCkgeworCQkJU3RyaW5nIG5hbWU9IEFudFByZWZlcmVuY2VzTWVzc2FnZXMuQ2xhc3NwYXRoTW9kZWxfMjsKKwkJCWZBbnRIb21lRW50cnk9IGNyZWF0ZUdsb2JhbEVudHJ5KGVudHJpZXMsIG5hbWUsIGZhbHNlLCB0cnVlLCBBTlRfSE9NRSk7CisJCX0gZWxzZSB7CisJCQlmQW50SG9tZUVudHJ5LnJlbW92ZUFsbCgpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7CisJCQkJZkFudEhvbWVFbnRyeS5hZGRFbnRyeShuZXcgQ2xhc3NwYXRoRW50cnkoZW50cmllc1tpXSwgZkFudEhvbWVFbnRyeSkpOworCQkJfQorCQl9CisJfQorCisJcHJpdmF0ZSBHbG9iYWxDbGFzc3BhdGhFbnRyaWVzIGNyZWF0ZUdsb2JhbEVudHJ5KElBbnRDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMsIFN0cmluZyBuYW1lLCBib29sZWFuIGNhbkJlUmVtb3ZlZCwgYm9vbGVhbiBhZGRFbnRyeSwgaW50IHR5cGUpIHsKKwkJCisJCUdsb2JhbENsYXNzcGF0aEVudHJpZXMgZ2xvYmFsPSBuZXcgR2xvYmFsQ2xhc3NwYXRoRW50cmllcyhuYW1lLCB0aGlzLCBjYW5CZVJlbW92ZWQsIHR5cGUpOworCQkKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7CisJCQlnbG9iYWwuYWRkRW50cnkobmV3IENsYXNzcGF0aEVudHJ5KGVudHJpZXNbaV0sIGdsb2JhbCkpOworCQl9CisJCQorCQlpZiAoYWRkRW50cnkpIHsKKwkJCWFkZEVudHJ5KGdsb2JhbCk7CisJCX0KKwkJcmV0dXJuIGdsb2JhbDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRHbG9iYWxFbnRyaWVzKElBbnRDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMpIHsKKwkJaWYgKGZVc2VyR2xvYmFsRW50cnkgPT0gbnVsbCkgeworCQkJU3RyaW5nIG5hbWU9IEFudFByZWZlcmVuY2VzTWVzc2FnZXMuQ2xhc3NwYXRoTW9kZWxfMzsKKwkJCWZVc2VyR2xvYmFsRW50cnk9IGNyZWF0ZUdsb2JhbEVudHJ5KGVudHJpZXMsIG5hbWUsIHRydWUsIHRydWUsIEdMT0JBTF9VU0VSKTsKKwkJfSBlbHNlIHsKKwkJCWZVc2VyR2xvYmFsRW50cnkucmVtb3ZlQWxsKCk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKKwkJCQlmVXNlckdsb2JhbEVudHJ5LmFkZEVudHJ5KG5ldyBDbGFzc3BhdGhFbnRyeShlbnRyaWVzW2ldLCBmVXNlckdsb2JhbEVudHJ5KSk7CisJCQl9CisJCX0KKwl9CisgICAgCisgICAgcHVibGljIHZvaWQgc2V0Q29udHJpYnV0ZWRFbnRyaWVzKElBbnRDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMpIHsKKyAgICAgICAgaWYgKGZDb250cmlidXRlZEdsb2JhbEVudHJ5ID09IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lPSBBbnRQcmVmZXJlbmNlc01lc3NhZ2VzLkNsYXNzcGF0aE1vZGVsXzA7CisgICAgICAgICAgICBmQ29udHJpYnV0ZWRHbG9iYWxFbnRyeT0gY3JlYXRlR2xvYmFsRW50cnkoZW50cmllcywgbmFtZSwgZmFsc2UsIHRydWUsIENPTlRSSUJVVEVEKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZDb250cmlidXRlZEdsb2JhbEVudHJ5LnJlbW92ZUFsbCgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgZkNvbnRyaWJ1dGVkR2xvYmFsRW50cnkuYWRkRW50cnkobmV3IENsYXNzcGF0aEVudHJ5KGVudHJpZXNbaV0sIGZDb250cmlidXRlZEdsb2JhbEVudHJ5KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisJCisJcHJpdmF0ZSBJQW50Q2xhc3NwYXRoRW50cnlbXSBnZXRVc2VyRW50cmllcygpIHsKKwkJTGlzdCB1c2VyRW50cmllcz0gbmV3IEFycmF5TGlzdChmQ2hpbGRFbnRyaWVzLnNpemUoKSk7CisJCUl0ZXJhdG9yIGl0cj0gZkNoaWxkRW50cmllcy5pdGVyYXRvcigpOworCQl3aGlsZSAoaXRyLmhhc05leHQoKSkgeworCQkJSUNsYXNzcGF0aEVudHJ5IGVsZW1lbnQgPSAoSUNsYXNzcGF0aEVudHJ5KSBpdHIubmV4dCgpOworCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBHbG9iYWxDbGFzc3BhdGhFbnRyaWVzKSB7CisJCQkJY29udGludWU7CisJCQl9CisJCQl1c2VyRW50cmllcy5hZGQoZWxlbWVudCk7CisJCX0KKwkJcmV0dXJuIChJQW50Q2xhc3NwYXRoRW50cnlbXSl1c2VyRW50cmllcy50b0FycmF5KG5ldyBJQW50Q2xhc3NwYXRoRW50cnlbdXNlckVudHJpZXMuc2l6ZSgpXSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvQ29sb3JFZGl0b3IuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL0NvbG9yRWRpdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU1NTJmYgotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL0NvbG9yRWRpdG9yLmphdmEKQEAgLTAsMCArMSwxMjMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLnByZWZlcmVuY2VzOworCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db2xvckRpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7CisKKy8qKgorICogQSAiYnV0dG9uIiBvZiBhIGNlcnRhaW4gY29sb3IgZGV0ZXJtaW5lZCBieSB0aGUgY29sb3IgcGlja2VyCisgKi8KK3B1YmxpYyBjbGFzcyBDb2xvckVkaXRvciB7CisJCisJcHJpdmF0ZSBQb2ludCBmRXh0ZW50OworCXByaXZhdGUgSW1hZ2UgZkltYWdlOworCXByaXZhdGUgUkdCIGZDb2xvclZhbHVlOworCXByaXZhdGUgQ29sb3IgZkNvbG9yOworCXByaXZhdGUgQnV0dG9uIGZCdXR0b247CisJCisJcHVibGljIENvbG9yRWRpdG9yKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJCisJCWZCdXR0b249IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUFVTSCk7CisJCWZFeHRlbnQ9IGNvbXB1dGVJbWFnZVNpemUocGFyZW50KTsKKwkJZkltYWdlPSBuZXcgSW1hZ2UocGFyZW50LmdldERpc3BsYXkoKSwgZkV4dGVudC54LCBmRXh0ZW50LnkpOworCQkKKwkJR0MgZ2M9IG5ldyBHQyhmSW1hZ2UpOworCQlnYy5zZXRCYWNrZ3JvdW5kKGZCdXR0b24uZ2V0QmFja2dyb3VuZCgpKTsKKwkJZ2MuZmlsbFJlY3RhbmdsZSgwLCAwLCBmRXh0ZW50LngsIGZFeHRlbnQueSk7CisJCWdjLmRpc3Bvc2UoKTsKKwkJCisJCWZCdXR0b24uc2V0SW1hZ2UoZkltYWdlKTsKKwkJZkJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7CisJCQkJQ29sb3JEaWFsb2cgY29sb3JEaWFsb2c9IG5ldyBDb2xvckRpYWxvZyhmQnV0dG9uLmdldFNoZWxsKCkpOworCQkJCWNvbG9yRGlhbG9nLnNldFJHQihmQ29sb3JWYWx1ZSk7CisJCQkJUkdCIG5ld0NvbG9yID0gY29sb3JEaWFsb2cub3BlbigpOworCQkJCWlmIChuZXdDb2xvciAhPSBudWxsKSB7CisJCQkJCWZDb2xvclZhbHVlPSBuZXdDb2xvcjsKKwkJCQkJdXBkYXRlQ29sb3JJbWFnZSgpOworCQkJCX0KKwkJCX0KKwkJfSk7CisJCQorCQlmQnV0dG9uLmFkZERpc3Bvc2VMaXN0ZW5lcihuZXcgRGlzcG9zZUxpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGV2ZW50KSB7CisJCQkJaWYgKGZJbWFnZSAhPSBudWxsKSAgeworCQkJCQlmSW1hZ2UuZGlzcG9zZSgpOworCQkJCQlmSW1hZ2U9IG51bGw7CisJCQkJfQorCQkJCWlmIChmQ29sb3IgIT0gbnVsbCkgeworCQkJCQlmQ29sb3IuZGlzcG9zZSgpOworCQkJCQlmQ29sb3I9IG51bGw7CisJCQkJfQorCQkJfQorCQl9KTsKKwl9CisJCisJcHVibGljIFJHQiBnZXRDb2xvclZhbHVlKCkgeworCQlyZXR1cm4gZkNvbG9yVmFsdWU7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldENvbG9yVmFsdWUoUkdCIHJnYikgeworCQlmQ29sb3JWYWx1ZT0gcmdiOworCQl1cGRhdGVDb2xvckltYWdlKCk7CisJfQorCQorCXB1YmxpYyBCdXR0b24gZ2V0QnV0dG9uKCkgeworCQlyZXR1cm4gZkJ1dHRvbjsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ29sb3JJbWFnZSgpIHsKKwkJCisJCURpc3BsYXkgZGlzcGxheT0gZkJ1dHRvbi5nZXREaXNwbGF5KCk7CisJCQorCQlHQyBnYz0gbmV3IEdDKGZJbWFnZSk7CisJCWdjLnNldEZvcmVncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxBQ0spKTsKKwkJZ2MuZHJhd1JlY3RhbmdsZSgwLCAyLCBmRXh0ZW50LnggLSAxLCBmRXh0ZW50LnkgLSA0KTsKKwkJCisJCWlmIChmQ29sb3IgIT0gbnVsbCkKKwkJCWZDb2xvci5kaXNwb3NlKCk7CisJCQkKKwkJZkNvbG9yPSBuZXcgQ29sb3IoZGlzcGxheSwgZkNvbG9yVmFsdWUpOworCQlnYy5zZXRCYWNrZ3JvdW5kKGZDb2xvcik7CisJCWdjLmZpbGxSZWN0YW5nbGUoMSwgMywgZkV4dGVudC54IC0gMiwgZkV4dGVudC55IC0gNSk7CisJCWdjLmRpc3Bvc2UoKTsKKwkJCisJCWZCdXR0b24uc2V0SW1hZ2UoZkltYWdlKTsKKwl9CisJCisJcHJvdGVjdGVkIFBvaW50IGNvbXB1dGVJbWFnZVNpemUoQ29udHJvbCB3aW5kb3cpIHsKKwkJR0MgZ2M9IG5ldyBHQyh3aW5kb3cpOworCQlGb250IGY9IEpGYWNlUmVzb3VyY2VzLmdldEZvbnRSZWdpc3RyeSgpLmdldChKRmFjZVJlc291cmNlcy5ERUZBVUxUX0ZPTlQpOworCQlnYy5zZXRGb250KGYpOworCQlpbnQgaGVpZ2h0PSBnYy5nZXRGb250TWV0cmljcygpLmdldEhlaWdodCgpOworCQlnYy5kaXNwb3NlKCk7CisJCVBvaW50IHA9IG5ldyBQb2ludChoZWlnaHQgKiAzIC0gNiwgaGVpZ2h0KTsKKwkJcmV0dXJuIHA7CisJfQorfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvRmlsZUZpbHRlci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvRmlsZUZpbHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlZDlkZGUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9GaWxlRmlsdGVyLmphdmEKQEAgLTAsMCArMSwxMTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5wcmVmZXJlbmNlczsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuQW50VUlQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKKworcHVibGljIGNsYXNzIEZpbGVGaWx0ZXIgZXh0ZW5kcyBWaWV3ZXJGaWx0ZXIgeworCisJLyoqCisJICogT2JqZWN0cyB0byBmaWx0ZXIKKwkgKi8KKwlwcml2YXRlIExpc3QgZkZpbHRlcjsKKwkKKwkvKioKKwkgKiBDb2xsZWN0aW9uIG9mIGZpbGVzIGFuZCBjb250YWluZXJzIHRvIGRpc3BsYXkKKwkgKi8KKwlwcml2YXRlIFNldCBmRmlsZXM7CisJCisJcHJpdmF0ZSBTdHJpbmcgZkV4dGVuc2lvbjsKKworICAgIHByaXZhdGUgYm9vbGVhbiBmQ29uc2lkZXJFeHRlbnNpb249IHRydWU7CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGZpbHRlciB0aGF0IGZpbHRlcnMgdGhlIGdpdmVuIAorCSAqIG9iamVjdHMuCisJICogTm90ZTogY29uc2lkZXJFeHRlbnNpb24gbXVzdCBiZSBjYWxsZWQgdG8gaW5pdGlhbGl6ZSB0aGUgZmlsdGVyCisJICovCisJcHVibGljIEZpbGVGaWx0ZXIoTGlzdCBvYmplY3RzLCBTdHJpbmcgZXh0ZW5zaW9uKSB7CisJCWZGaWx0ZXIgPSBvYmplY3RzOworCQlmRXh0ZW5zaW9uPSBleHRlbnNpb247CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXIjc2VsZWN0KG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyLCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQorCSAqLworCXB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50RWxlbWVudCwgT2JqZWN0IGVsZW1lbnQpIHsKKwkJcmV0dXJuIGZGaWxlcy5jb250YWlucyhlbGVtZW50KSAmJiAhZkZpbHRlci5jb250YWlucyhlbGVtZW50KTsKKwl9CisJCisJLyoqCisJICogU2VhcmNoIGZvciBhbGwgdGhlIG1hdGNoaW5nIGZpbGVzIGluIHRoZSB3b3Jrc3BhY2UuCisJICovCisJcHJpdmF0ZSB2b2lkIGluaXQoKSB7CisJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKEFudFVJUGx1Z2luLmdldFN0YW5kYXJkRGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7CisJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJZkZpbGVzID0gbmV3IEhhc2hTZXQoKTsKKwkJCQl0cmF2ZXJzZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLCBmRmlsZXMpOworCQkJfQorCQl9KTsKKwl9CisKKwkvKioKKwkgKiBUcmF2ZXJzZSB0aGUgZ2l2ZW4gY29udGFpbmVyLCBhZGRpbmcgZmlsZXMgdG8gdGhlIGdpdmVuIHNldC4KKwkgKiBSZXR1cm5zIHdoZXRoZXIgYW55IGZpbGVzIHdlcmUgYWRkZWQKKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gdHJhdmVyc2UoSUNvbnRhaW5lciBjb250YWluZXIsIFNldCBzZXQpIHsKKwkJYm9vbGVhbiBhZGRlZCA9IGZhbHNlOworCQl0cnkgeworCQkJSVJlc291cmNlW10gcmVzb3VyY2VzID0gY29udGFpbmVyLm1lbWJlcnMoKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VzLmxlbmd0aDsgaSsrKSB7CisJCQkJSVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VzW2ldOworCQkJCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKSB7CisJCQkJCUlGaWxlIGZpbGUgPSAoSUZpbGUpIHJlc291cmNlOworCQkJCQlTdHJpbmcgZXh0ID0gZmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCk7CisJCQkJCWlmICghZkNvbnNpZGVyRXh0ZW5zaW9uIHx8IChleHQgIT0gbnVsbCAmJiBleHQuZXF1YWxzSWdub3JlQ2FzZShmRXh0ZW5zaW9uKSkpIHsKKwkJCQkJCXNldC5hZGQoZmlsZSk7CisJCQkJCQlhZGRlZCA9IHRydWU7CisJCQkJCX0KKwkJCQl9IGVsc2UgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUNvbnRhaW5lcikgeworCQkJCQlpZiAodHJhdmVyc2UoKElDb250YWluZXIpIHJlc291cmNlLCBzZXQpKSB7CisJCQkJCQlzZXQuYWRkKHJlc291cmNlKTsKKwkJCQkJCWFkZGVkID0gdHJ1ZTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCX0KKwkJcmV0dXJuIGFkZGVkOworCX0KKwkKKwkvKioKKwkgKiBTZXRzIHdoZXRoZXIgdGhpcyBmaWx0ZXIgd2lsbCBmaWx0ZXIgYmFzZWQgb24gZXh0ZW5zaW9uLgorCSAqIEBwYXJhbSBjb25zaWRlckV4dGVuc2lvbiB3aGV0aGVyIHRvIGNvbnNpZGVyIGEgZmlsZSdzIGV4dGVuc2lvbiB3aGVuIGZpbHRlcmluZworCSAqLworCXB1YmxpYyB2b2lkIGNvbnNpZGVyRXh0ZW5zaW9uKGJvb2xlYW4gY29uc2lkZXJFeHRlbnNpb24pIHsKKwkgICAgZkNvbnNpZGVyRXh0ZW5zaW9uPSBjb25zaWRlckV4dGVuc2lvbjsKKwkgICAgaW5pdCgpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9Gb3JtYXRQcmV2aWV3Q29kZS50eHQgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9Gb3JtYXRQcmV2aWV3Q29kZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNiMjAyYwotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL0Zvcm1hdFByZXZpZXdDb2RlLnR4dApAQCAtMCwwICsxLDM1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Cis8IS0tICBTYW1wbGUgYnVpbGRmaWxlIGZvciBqYXIgY29tcG9uZW50cyAgICAgICAgICAgICAtLT4KKzwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Cis8cHJvamVjdCBuYW1lPSJzYW1wbGUiIGRlZmF1bHQ9ImJ1aWxkIj4KKworCTwhLS0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtLT4KKwk8IS0tICB0YXJnZXQ6IGluaXQgICAgICAgICAgICAgLS0+CisJPCEtLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0tPgorCTx0YXJnZXQgbmFtZT0iaW5pdCI+CisJCTxwcm9wZXJ0eSBuYW1lPSIke2VjbGlwc2UuaG9tZX0iIGxvY2F0aW9uPSIvaG9tZS9lY2xpcHNlIiAvPgorCTwvdGFyZ2V0PgorCisJPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCTwhLS0gICB0YXJnZXQ6IGJ1aWxkICAgICAgICAgICAtLT4KKwk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisJPHRhcmdldCBuYW1lPSJidWlsZCIKKwkgICAgICAgIGRlcGVuZHM9ImluaXQiCisJICAgICAgICBkZXNjcmlwdGlvbj0iLS0+IGNvbXBpbGUgYW5kIGphciB0aGlzIGNvbXBvbmVudCI+CisKKwkJPGphdmFjIHNyY2Rpcj0iJHtzcmMuaG9tZX0iCisJCSAgICAgICBkZXN0ZGlyPSIke2J1aWxkLmhvbWV9IgorCQkgICAgICAgZGVidWc9IiR7Y29tcGlsZS5kZWJ1Z30iCisJCSAgICAgICBkZXByZWNhdGlvbj0iJHtjb21waWxlLmRlcHJlY2F0aW9ufSIKKwkJICAgICAgIG9wdGltaXplPSIke2NvbXBpbGUub3B0aW1pemV9Ij4KKwkJCTxjbGFzc3BhdGggcmVmaWQ9ImNvbXBpbGUuY2xhc3NwYXRoIiAvPgorCQk8L2phdmFjPgorCisJCTxqYXIgZGVzdGZpbGU9IiR7ZGlzdC5ob21lfS8ke2FwcC5uYW1lfS5qYXIiCisJCSAgICAgYmFzZWRpcj0iJHtidWlsZC5ob21lfSIKKwkJICAgICBleGNsdWRlcz0iKiovKlVULmNsYXNzIiAvPgorCTwvdGFyZ2V0PgorCis8L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvR2xvYmFsQ2xhc3NwYXRoRW50cmllcy5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvR2xvYmFsQ2xhc3NwYXRoRW50cmllcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNDQ5MjYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9HbG9iYWxDbGFzc3BhdGhFbnRyaWVzLmphdmEKQEAgLTAsMCArMSw2OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5wcmVmZXJlbmNlczsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgY2xhc3MgR2xvYmFsQ2xhc3NwYXRoRW50cmllcyBleHRlbmRzIEFic3RyYWN0Q2xhc3NwYXRoRW50cnkgeworCXByaXZhdGUgU3RyaW5nIGZOYW1lOworCXByaXZhdGUgaW50IGZUeXBlOworCXByaXZhdGUgYm9vbGVhbiBmQ2FuQmVSZW1vdmVkPSB0cnVlOworCQorCXB1YmxpYyBHbG9iYWxDbGFzc3BhdGhFbnRyaWVzKFN0cmluZyBuYW1lLCBJQ2xhc3NwYXRoRW50cnkgcGFyZW50LCBib29sZWFuIGNhbkJlUmVtb3ZlZCwgaW50IHR5cGUpIHsKKwkJZlBhcmVudD0gcGFyZW50OworCQlmTmFtZT0gbmFtZTsKKwkJZkNhbkJlUmVtb3ZlZD0gY2FuQmVSZW1vdmVkOworCQlmVHlwZT0gdHlwZTsKKwl9CisJCQorCXB1YmxpYyB2b2lkIGFkZEVudHJ5KENsYXNzcGF0aEVudHJ5IGVudHJ5KSB7CisJCWZDaGlsZEVudHJpZXMuYWRkKGVudHJ5KTsKKwl9CisJCisJcHVibGljIHZvaWQgcmVtb3ZlRW50cnkoQ2xhc3NwYXRoRW50cnkgZW50cnkpIHsKKwkJZkNoaWxkRW50cmllcy5yZW1vdmUoZW50cnkpOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhDbGFzc3BhdGhFbnRyeSBlbnRyeSkgeworCQlyZXR1cm4gZkNoaWxkRW50cmllcy5jb250YWlucyhlbnRyeSk7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiBmTmFtZTsKKwl9CisKKwlwdWJsaWMgdm9pZCByZW1vdmVBbGwoKSB7CisJCWZDaGlsZEVudHJpZXMuY2xlYXIoKTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gY2FuQmVSZW1vdmVkKCkgeworCQlyZXR1cm4gZkNhbkJlUmVtb3ZlZDsKKwl9CisKKwkvKioKKyAgICAgKiBTZXQgdGhlIGNoaWxkIGVudHJpZXMgb2YgdGhpcyBjbGFzc3BhdGggZW50cnkuCisJICogQHBhcmFtIGVudHJpZXMgVGhlIGNoaWxkIGVudHJpZXMuCisJICovCisJcHVibGljIHZvaWQgc2V0RW50cmllcyhMaXN0IGVudHJpZXMpIHsKKwkJZkNoaWxkRW50cmllcz0gZW50cmllczsKKwl9CisJLyoqCisJICogQHJldHVybiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoaXMgZ2xvYmFsIGNsYXNzcGF0aCBlbnRyeS4KKwkgKiBAc2VlIENsYXNzcGF0aE1vZGVsI0FOVF9IT01FCisJICogQHNlZSBDbGFzc3BhdGhNb2RlbCNHTE9CQUxfVVNFUgorCSAqIEBzZWUgQ2xhc3NwYXRoTW9kZWwjQ09OVFJJQlVURUQKKwkgKi8KKwlwdWJsaWMgaW50IGdldFR5cGUoKSB7CisJCXJldHVybiBmVHlwZTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9JQW50QmxvY2tDb250YWluZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL0lBbnRCbG9ja0NvbnRhaW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwODI3OWYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9JQW50QmxvY2tDb250YWluZXIuamF2YQpAQCAtMCwwICsxLDUxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5wcmVmZXJlbmNlczsKKworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworcHVibGljIGludGVyZmFjZSBJQW50QmxvY2tDb250YWluZXIgeworCQorCS8qKgorCSAqIFNldHMgdGhlIGVycm9yIG1lc3NhZ2UgZm9yIHRoZSBjb250YWluZXIuCisJICogTWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+IHRvIHJlbW92ZSB0aGUgZXJyb3IgbWVzc2FnZS4KKwkgKiAKKwkgKiBAcGFyYW0gbWVzc2FnZSBBIHN0cmluZyBlcnJvciBtZXNzYWdlIG9yIDxjb2RlPm51bGw8L2NvZGU+CisJICovCisJcHVibGljIHZvaWQgc2V0RXJyb3JNZXNzYWdlKFN0cmluZyBtZXNzYWdlKTsKKwkKKwkvKioKKwkgKiBTZXRzIHRoZSBtZXNzYWdlIGZvciB0aGUgY29udGFpbmVyLgorCSAqIE1heSBiZSA8Y29kZT5udWxsPC9jb2RlPiB0byByZW1vdmUgdGhlIG1lc3NhZ2UuCisJICogCisJICogQHBhcmFtIG1lc3NhZ2UgQSBzdHJpbmcgbWVzc2FnZSBvciA8Y29kZT5udWxsPC9jb2RlPgorCSAqLworCXB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpOworCQorCS8qKgorCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBwcm9wZXJseSBjb25maWd1cmVkIHB1c2ggYnV0dG9uIHdpdGggCisJICogdGhlIHN1cHBsaWVkIGxhYmVsCisJICogCisJICogQHBhcmFtIHBhcmVudCBUaGUgY29tcG9zaXRlIHBhcmVudCBvZiB0aGUgYnV0dG9uCisJICogQHBhcmFtIGxhYmVsIFRoZSBidXR0b24gbGFiZWwKKwkgKiAKKwkgKiBAcmV0dXJuIGJ1dHRvbiB0aGUgY3JlYXRlZCBidXR0b24KKwkgKi8KKwlwdWJsaWMgQnV0dG9uIGNyZWF0ZVB1c2hCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsKTsKKwkKKwkvKioKKwkgKiBOb3RpZmllcyB0aGUgY29udGFpbmVyIHRoYXQgc3RhdGUgaGFzIGNoYW5nZWQuCisJICovCisJcHVibGljIHZvaWQgdXBkYXRlKCk7CisKK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL0lDbGFzc3BhdGhFbnRyeS5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvSUNsYXNzcGF0aEVudHJ5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIyOTFlMwotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL0lDbGFzc3BhdGhFbnRyeS5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkucHJlZmVyZW5jZXM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuY29yZS5JQW50Q2xhc3NwYXRoRW50cnk7CisKK3B1YmxpYyBpbnRlcmZhY2UgSUNsYXNzcGF0aEVudHJ5IGV4dGVuZHMgSUFudENsYXNzcGF0aEVudHJ5IHsKKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBjbGFzc3BhdGggZW50cmllcyB0aGF0IGFyZSB0aGUgY2hpbGRyZW4gb2YgdGhpcyBjbGFzc3BhdGggZW50cnkKKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBjaGlsZCBjbGFzc3BhdGggZW50cmllcyBvZiB0aGlzIGVudHJ5CisJICovCisJcHVibGljIElBbnRDbGFzc3BhdGhFbnRyeVtdIGdldEVudHJpZXMoKTsKKwkKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBjbGFzc3BhdGggZW50cmllcyBoYXMgY2hpbGQgZW50cmllcy4KKwkgKiAKKwkgKiBAcmV0dXJuIHdoZXRoZXIgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBjbGFzc3BhdGggZW50cnkgaGFzIGNoaWxkZXJuLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGhhc0VudHJpZXMoKTsKKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBwYXJlbnQgb2YgdGhpcyBjbGFzc3BhdGggZW50cnkKKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBwYXJlbnQgb2YgdGhpcyBjbGFzc3BhdGggZW50cnksIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCisJICovCisJcHVibGljIElDbGFzc3BhdGhFbnRyeSBnZXRQYXJlbnQoKTsKK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL01pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50LmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9NaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyYjUzN2YKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9NaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudC5qYXZhCkBAIC0wLDAgKzEsMjE2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5wcmVmZXJlbmNlczsKKworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2hhcmVkSW1hZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkud2l6YXJkcy5kYXRhdHJhbnNmZXIuSUltcG9ydFN0cnVjdHVyZVByb3ZpZGVyOworCitjbGFzcyBNaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudCBpbXBsZW1lbnRzIElXb3JrYmVuY2hBZGFwdGVyLCBJQWRhcHRhYmxlIHsKKwlwcml2YXRlIGJvb2xlYW4gcG9wdWxhdGVkID0gZmFsc2U7CisJcHJpdmF0ZSBMaXN0IGZvbGRlcnMgPSBudWxsOworCXByaXZhdGUgTGlzdCBmaWxlcyA9IG51bGw7CisJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKwlwcml2YXRlIGJvb2xlYW4gaXNEaXJlY3RvcnkgPSBmYWxzZTsKKwlwcml2YXRlIE1pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50IHBhcmVudDsKKwlwcml2YXRlIE9iamVjdCBmaWxlU3lzdGVtT2JqZWN0OworCQorCS8qKgorCSAqIENyZWF0ZSBhIDxjb2RlPk1pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50PC9jb2RlPiB3aXRoIHRoZSBzdXBwbGllZCBuYW1lIGFuZCBwYXJlbnQuCisJICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGUgZWxlbWVudCB0aGlzIHJlcHJlc2VudHMKKwkgKiBAcGFyYW0gcGFyZW50IHRoZSBjb250YWluaW5nIHBhcmVudAorCSAqIEBwYXJhbSBpc0RpcmVjdG9yeSBpbmRpY2F0ZWQgaWYgdGhpcyBjb3VsZCBoYXZlIGNoaWxkcmVuIG9yIG5vdAorCSAqLworCXB1YmxpYyBNaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudChTdHJpbmcgbmFtZSwgTWluaW1pemVkRmlsZVN5c3RlbUVsZW1lbnQgcGFyZW50LCBib29sZWFuIGlzRGlyZWN0b3J5KSB7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJCXRoaXMucGFyZW50ID0gcGFyZW50OworCQl0aGlzLmlzRGlyZWN0b3J5ID0gaXNEaXJlY3Rvcnk7CisJCWlmIChwYXJlbnQgIT0gbnVsbCkgeworCQkJcGFyZW50LmFkZENoaWxkKHRoaXMpOworCQl9CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgdGhlIGFkYXB0ZXIKKwkgKi8KKwlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgeworCQlpZiAoYWRhcHRlciA9PSBJV29ya2JlbmNoQWRhcHRlci5jbGFzcykgeworCQkJcmV0dXJuIHRoaXM7CisJCX0KKwkJLy9kZWZlciB0byB0aGUgcGxhdGZvcm0KKwkJcmV0dXJuIFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkuZ2V0QWRhcHRlcih0aGlzLCBhZGFwdGVyKTsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIHRoaXMgZWxlbWVudCByZXByZXNlbnRzIGEgZGlyZWN0b3J5LCBhbmQgZmFsc2UKKwkgKiBvdGhlcndpc2UuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNEaXJlY3RvcnkoKSB7CisJCXJldHVybiBpc0RpcmVjdG9yeTsKKwl9CisJCisJLyoqCisJICogQWRkcyB0aGUgcGFzc2VkIGNoaWxkIHRvIHRoaXMgb2JqZWN0J3MgY29sbGVjdGlvbiBvZiBjaGlsZHJlbi4KKwkgKgorCSAqIEBwYXJhbSBjaGlsZCBNaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudAorCSAqLworCXByaXZhdGUgdm9pZCBhZGRDaGlsZChNaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudCBjaGlsZCkgeworCQlpZiAoY2hpbGQuaXNEaXJlY3RvcnkoKSkgeworCQkJaWYgKGZvbGRlcnMgPT0gbnVsbCkgeworCQkJCSBmb2xkZXJzID0gbmV3IEFycmF5TGlzdCgxKTsKKwkJCX0KKwkJCWZvbGRlcnMuYWRkKGNoaWxkKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChmaWxlcyA9PSBudWxsKSB7CisJCQkJIGZpbGVzID0gbmV3IEFycmF5TGlzdCgxKTsKKwkJCX0KKwkJCWZpbGVzLmFkZChjaGlsZCk7CisJCX0KKwl9CisJLyoqCisJICogUmV0dXJucyBhIGxpc3Qgb2YgdGhlIGZpbGVzIHRoYXQgYXJlIGltbWVkaWF0ZSBjaGlsZHJlbi4gVXNlIHRoZSBzdXBwbGllZCBwcm92aWRlcgorCSAqIGlmIGl0IG5lZWRzIHRvIGJlIHBvcHVsYXRlZC4KKwkgKi8KKwlwcm90ZWN0ZWQgTGlzdCBnZXRGaWxlcyhJSW1wb3J0U3RydWN0dXJlUHJvdmlkZXIgcHJvdmlkZXIpIHsKKwkJaWYgKCFwb3B1bGF0ZWQpIHsKKwkJCXBvcHVsYXRlKHByb3ZpZGVyKTsKKwkJfQorCisJCWlmIChmaWxlcyA9PSBudWxsKSB7CisJCQkgcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7CisJCX0KKwkJcmV0dXJuIGZpbGVzOworCisJfQorCS8qKgorCSAqIFJldHVybnMgYSBsaXN0IG9mIHRoZSBmb2xkZXJzIHRoYXQgYXJlIGltbWVkaWF0ZSBjaGlsZHJlbi4gVXNlIHRoZSBzdXBwbGllZCBwcm92aWRlcgorCSAqIGlmIGl0IG5lZWRzIHRvIGJlIHBvcHVsYXRlZC4KKwkgKi8KKwlwcm90ZWN0ZWQgTGlzdCBnZXRGb2xkZXJzKElJbXBvcnRTdHJ1Y3R1cmVQcm92aWRlciBwcm92aWRlcikgeworCQlpZiAoIXBvcHVsYXRlZCkgeworCQkJcG9wdWxhdGUocHJvdmlkZXIpOworCQl9CisKKwkJcmV0dXJuIGdldEZvbGRlcnMoKTsKKworCX0KKworCXByb3RlY3RlZCBMaXN0IGdldEZvbGRlcnMoKSB7CisJCWlmIChmb2xkZXJzID09IG51bGwpeworCQkJIHJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOworCQl9CisJCXJldHVybiBmb2xkZXJzOworCX0KKwkvKioKKwkgKiBSZXR1cm4gd2hldGhlciBvciBub3QgcG9wdWxhdGlvbiBoYXMgaGFwcGVuZWQgZm9yIHRoZSByZWNlaXZlci4KKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc1BvcHVsYXRlZCgpIHsKKwkJcmV0dXJuIHRoaXMucG9wdWxhdGVkOworCX0KKwkvKioKKwkgKiBSZXR1cm4gd2hldGhlciBvciBub3QgcG9wdWxhdGlvbiBoYXMgbm90IGhhcHBlbmVkIGZvciB0aGUgcmVjZWl2ZXIuCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gbm90UG9wdWxhdGVkKCkgeworCQlyZXR1cm4gIXRoaXMucG9wdWxhdGVkOworCX0KKwkvKioKKwkgKiBQb3B1bGF0ZSB0aGUgZmlsZXMgYW5kIGZvbGRlcnMgb2YgdGhlIHJlY2VpdmVyIHVzaW5nIHRoZSBzdXBwbGllZAorCSAqIHN0cnVjdHVyZSBwcm92aWRlci4KKwkgKiBAcGFyYW0gcHJvdmlkZXIgb3JnLmVjbGlwc2UudWkud2l6YXJkcy5kYXRhdHJhbnNmZXIuSUltcG9ydFN0cnVjdHVyZVByb3ZpZGVyCisJICovCisJcHJpdmF0ZSB2b2lkIHBvcHVsYXRlKElJbXBvcnRTdHJ1Y3R1cmVQcm92aWRlciBwcm92aWRlcikgeworCisJCUxpc3QgY2hpbGRyZW4gPSBwcm92aWRlci5nZXRDaGlsZHJlbihmaWxlU3lzdGVtT2JqZWN0KTsKKwkJaWYgKGNoaWxkcmVuID09IG51bGwpIHsKKwkJCWNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgxKTsKKwkJfQorCQlJdGVyYXRvciBjaGlsZHJlbkVudW0gPSBjaGlsZHJlbi5pdGVyYXRvcigpOworCQl3aGlsZSAoY2hpbGRyZW5FbnVtLmhhc05leHQoKSkgeworCQkJT2JqZWN0IGNoaWxkID0gY2hpbGRyZW5FbnVtLm5leHQoKTsKKworCQkJU3RyaW5nIGVsZW1lbnRMYWJlbCA9IHByb3ZpZGVyLmdldExhYmVsKGNoaWxkKTsKKwkJCWJvb2xlYW4gaXNGb2xkZXI9IHByb3ZpZGVyLmlzRm9sZGVyKGNoaWxkKTsKKwkJCWlmICghaXNGb2xkZXIgJiYgIWVsZW1lbnRMYWJlbC5lbmRzV2l0aCgiLmNsYXNzIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCWNvbnRpbnVlOworCQkJfQorCQkJLy9DcmVhdGUgb25lIGxldmVsIGJlbG93CisJCQlNaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudCByZXN1bHQgPSBuZXcgTWluaW1pemVkRmlsZVN5c3RlbUVsZW1lbnQoZWxlbWVudExhYmVsLCB0aGlzLCBpc0ZvbGRlcik7CisJCQlyZXN1bHQuc2V0RmlsZVN5c3RlbU9iamVjdChjaGlsZCk7CisJCX0KKwkJc2V0UG9wdWxhdGVkKCk7CisJfQorCQorCS8qKgorCSAqCVJldHVybnMgdGhlIGZpbGUgc3lzdGVtIG9iamVjdCBwcm9wZXJ0eSBvZiB0aGlzIGVsZW1lbnQKKwkgKgorCSAqCUByZXR1cm4gdGhlIGZpbGUgc3lzdGVtIG9iamVjdAorCSAqLworCXByb3RlY3RlZCBPYmplY3QgZ2V0RmlsZVN5c3RlbU9iamVjdCgpIHsKKwkJcmV0dXJuIGZpbGVTeXN0ZW1PYmplY3Q7CisJfQorCQorCS8qKgorCSAqCVNldCB0aGUgZmlsZSBzeXN0ZW0gb2JqZWN0IHByb3BlcnR5IG9mIHRoaXMgZWxlbWVudAorCSAqCisJICoJQHBhcmFtIHZhbHVlIHRoZSBmaWxlIHN5c3RlbSBvYmplY3QKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXRGaWxlU3lzdGVtT2JqZWN0KE9iamVjdCB2YWx1ZSkgeworCQlmaWxlU3lzdGVtT2JqZWN0ID0gdmFsdWU7CisJfQorCS8qKgorCSAqIFNldCB3aGV0aGVyIG9yIG5vdCBwb3B1bGF0aW9uIGhhcyBoYXBwZW5lZCBmb3IgdGhlIHJlY2VpdmVyIHRvIHRydWUuCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2V0UG9wdWxhdGVkKCkgeworCQl0aGlzLnBvcHVsYXRlZCA9IHRydWU7CisJfQorCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKKwkgKi8KKwlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IG8pIHsKKwkJcmV0dXJuIGdldEZvbGRlcnMoKS50b0FycmF5KCk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS51aS5tb2RlbC5JV29ya2JlbmNoQWRhcHRlciNnZXRJbWFnZURlc2NyaXB0b3IoamF2YS5sYW5nLk9iamVjdCkKKwkgKi8KKwlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChpc0RpcmVjdG9yeSgpKSB7CisJCQlyZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKS5nZXRJbWFnZURlc2NyaXB0b3IoSVNoYXJlZEltYWdlcy5JTUdfT0JKX0ZPTERFUik7CisJCX0KKwkJcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RWRpdG9yUmVnaXN0cnkoKS5nZXRJbWFnZURlc2NyaXB0b3IobmFtZSk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS51aS5tb2RlbC5JV29ya2JlbmNoQWRhcHRlciNnZXRMYWJlbChqYXZhLmxhbmcuT2JqZWN0KQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoT2JqZWN0IG8pIHsKKwkJcmV0dXJuIG5hbWU7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS51aS5tb2RlbC5JV29ya2JlbmNoQWRhcHRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKKwkgKi8KKwlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgbykgeworCQlyZXR1cm4gcGFyZW50OworCX0KKworfQorCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9PdmVybGF5UHJlZmVyZW5jZVN0b3JlLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9PdmVybGF5UHJlZmVyZW5jZVN0b3JlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ0YjdmYQotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL092ZXJsYXlQcmVmZXJlbmNlU3RvcmUuamF2YQpAQCAtMCwwICsxLDQ1MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkucHJlZmVyZW5jZXM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlU3RvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7CisKKy8qKgorICogQW4gb3ZlcmxheWluZyBwcmVmZXJlbmNlIHN0b3JlLgorICovCitjbGFzcyBPdmVybGF5UHJlZmVyZW5jZVN0b3JlICBpbXBsZW1lbnRzIElQcmVmZXJlbmNlU3RvcmUgeworCQorCQorCXB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgVHlwZURlc2NyaXB0b3IgeworCQlwcml2YXRlIFR5cGVEZXNjcmlwdG9yKCkgeworCQl9CisJfQorCQorCXB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZURlc2NyaXB0b3IgQk9PTEVBTj0gbmV3IFR5cGVEZXNjcmlwdG9yKCk7CisJcHVibGljIHN0YXRpYyBmaW5hbCBUeXBlRGVzY3JpcHRvciBET1VCTEU9IG5ldyBUeXBlRGVzY3JpcHRvcigpOworCXB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZURlc2NyaXB0b3IgRkxPQVQ9IG5ldyBUeXBlRGVzY3JpcHRvcigpOworCXB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZURlc2NyaXB0b3IgSU5UPSBuZXcgVHlwZURlc2NyaXB0b3IoKTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGVEZXNjcmlwdG9yIExPTkc9IG5ldyBUeXBlRGVzY3JpcHRvcigpOworCXB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZURlc2NyaXB0b3IgU1RSSU5HPSBuZXcgVHlwZURlc2NyaXB0b3IoKTsKKwkKKwlwdWJsaWMgc3RhdGljIGNsYXNzIE92ZXJsYXlLZXkgeworCQkKKwkJVHlwZURlc2NyaXB0b3IgZkRlc2NyaXB0b3I7CisJCVN0cmluZyBmS2V5OworCQkKKwkJcHVibGljIE92ZXJsYXlLZXkoVHlwZURlc2NyaXB0b3IgZGVzY3JpcHRvciwgU3RyaW5nIGtleSkgeworCQkJZkRlc2NyaXB0b3I9IGRlc2NyaXB0b3I7CisJCQlmS2V5PSBrZXk7CisJCX0KKwl9CisJCisJcHJpdmF0ZSBjbGFzcyBQcm9wZXJ0eUxpc3RlbmVyIGltcGxlbWVudHMgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgeworCQkJCQorCQkvKgorCQkgKiBAc2VlIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyI3Byb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQpCisJCSAqLworCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7CisJCQlPdmVybGF5S2V5IGtleT0gZmluZE92ZXJsYXlLZXkoZXZlbnQuZ2V0UHJvcGVydHkoKSk7CisJCQlpZiAoa2V5ICE9IG51bGwpCisJCQkJcHJvcGFnYXRlUHJvcGVydHkoZlBhcmVudCwga2V5LCBmU3RvcmUpOyAKKwkJfQorCX0KKwkKKwkKKwlwcml2YXRlIElQcmVmZXJlbmNlU3RvcmUgZlBhcmVudDsKKwlwcml2YXRlIElQcmVmZXJlbmNlU3RvcmUgZlN0b3JlOworCXByaXZhdGUgT3ZlcmxheUtleVtdIGZPdmVybGF5S2V5czsKKwkKKwlwcml2YXRlIFByb3BlcnR5TGlzdGVuZXIgZlByb3BlcnR5TGlzdGVuZXI7CisJCisJCisJcHVibGljIE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUoSVByZWZlcmVuY2VTdG9yZSBwYXJlbnQsIE92ZXJsYXlLZXlbXSBvdmVybGF5S2V5cykgeworCQlmUGFyZW50PSBwYXJlbnQ7CisJCWZPdmVybGF5S2V5cz0gb3ZlcmxheUtleXM7CisJCWZTdG9yZT0gbmV3IFByZWZlcmVuY2VTdG9yZSgpOworCX0KKwkKKwlwcml2YXRlIE92ZXJsYXlLZXkgZmluZE92ZXJsYXlLZXkoU3RyaW5nIGtleSkgeworCQlmb3IgKGludCBpPSAwOyBpIDwgZk92ZXJsYXlLZXlzLmxlbmd0aDsgaSsrKSB7CisJCQlpZiAoZk92ZXJsYXlLZXlzW2ldLmZLZXkuZXF1YWxzKGtleSkpCisJCQkJcmV0dXJuIGZPdmVybGF5S2V5c1tpXTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJcHJpdmF0ZSBib29sZWFuIGNvdmVycyhTdHJpbmcga2V5KSB7CisJCXJldHVybiAoZmluZE92ZXJsYXlLZXkoa2V5KSAhPSBudWxsKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIHByb3BhZ2F0ZVByb3BlcnR5KElQcmVmZXJlbmNlU3RvcmUgb3JnaW4sIE92ZXJsYXlLZXkga2V5LCBJUHJlZmVyZW5jZVN0b3JlIHRhcmdldCkgeworCQkKKwkJaWYgKG9yZ2luLmlzRGVmYXVsdChrZXkuZktleSkpIHsKKwkJCWlmICghdGFyZ2V0LmlzRGVmYXVsdChrZXkuZktleSkpCisJCQkJdGFyZ2V0LnNldFRvRGVmYXVsdChrZXkuZktleSk7CisJCQlyZXR1cm47CisJCX0KKwkJCisJCVR5cGVEZXNjcmlwdG9yIGQ9IGtleS5mRGVzY3JpcHRvcjsKKwkJaWYgKEJPT0xFQU4gPT0gZCkgeworCQkJCisJCQlib29sZWFuIG9yaWdpblZhbHVlPSBvcmdpbi5nZXRCb29sZWFuKGtleS5mS2V5KTsKKwkJCWJvb2xlYW4gdGFyZ2V0VmFsdWU9IHRhcmdldC5nZXRCb29sZWFuKGtleS5mS2V5KTsKKwkJCWlmICh0YXJnZXRWYWx1ZSAhPSBvcmlnaW5WYWx1ZSkKKwkJCQl0YXJnZXQuc2V0VmFsdWUoa2V5LmZLZXksIG9yaWdpblZhbHVlKTsKKwkJCQkKKwkJfSBlbHNlIGlmIChET1VCTEUgPT0gZCkgeworCQkJCisJCQlkb3VibGUgb3JpZ2luVmFsdWU9IG9yZ2luLmdldERvdWJsZShrZXkuZktleSk7CisJCQlkb3VibGUgdGFyZ2V0VmFsdWU9IHRhcmdldC5nZXREb3VibGUoa2V5LmZLZXkpOworCQkJaWYgKHRhcmdldFZhbHVlICE9IG9yaWdpblZhbHVlKQorCQkJCXRhcmdldC5zZXRWYWx1ZShrZXkuZktleSwgb3JpZ2luVmFsdWUpOworCQkKKwkJfSBlbHNlIGlmIChGTE9BVCA9PSBkKSB7CisJCQkKKwkJCWZsb2F0IG9yaWdpblZhbHVlPSBvcmdpbi5nZXRGbG9hdChrZXkuZktleSk7CisJCQlmbG9hdCB0YXJnZXRWYWx1ZT0gdGFyZ2V0LmdldEZsb2F0KGtleS5mS2V5KTsKKwkJCWlmICh0YXJnZXRWYWx1ZSAhPSBvcmlnaW5WYWx1ZSkKKwkJCQl0YXJnZXQuc2V0VmFsdWUoa2V5LmZLZXksIG9yaWdpblZhbHVlKTsKKwkJCQkKKwkJfSBlbHNlIGlmIChJTlQgPT0gZCkgeworCisJCQlpbnQgb3JpZ2luVmFsdWU9IG9yZ2luLmdldEludChrZXkuZktleSk7CisJCQlpbnQgdGFyZ2V0VmFsdWU9IHRhcmdldC5nZXRJbnQoa2V5LmZLZXkpOworCQkJaWYgKHRhcmdldFZhbHVlICE9IG9yaWdpblZhbHVlKQorCQkJCXRhcmdldC5zZXRWYWx1ZShrZXkuZktleSwgb3JpZ2luVmFsdWUpOworCisJCX0gZWxzZSBpZiAoTE9ORyA9PSBkKSB7CisKKwkJCWxvbmcgb3JpZ2luVmFsdWU9IG9yZ2luLmdldExvbmcoa2V5LmZLZXkpOworCQkJbG9uZyB0YXJnZXRWYWx1ZT0gdGFyZ2V0LmdldExvbmcoa2V5LmZLZXkpOworCQkJaWYgKHRhcmdldFZhbHVlICE9IG9yaWdpblZhbHVlKQorCQkJCXRhcmdldC5zZXRWYWx1ZShrZXkuZktleSwgb3JpZ2luVmFsdWUpOworCisJCX0gZWxzZSBpZiAoU1RSSU5HID09IGQpIHsKKworCQkJU3RyaW5nIG9yaWdpblZhbHVlPSBvcmdpbi5nZXRTdHJpbmcoa2V5LmZLZXkpOworCQkJU3RyaW5nIHRhcmdldFZhbHVlPSB0YXJnZXQuZ2V0U3RyaW5nKGtleS5mS2V5KTsKKwkJCWlmICh0YXJnZXRWYWx1ZSAhPSBudWxsICYmIG9yaWdpblZhbHVlICE9IG51bGwgJiYgIXRhcmdldFZhbHVlLmVxdWFscyhvcmlnaW5WYWx1ZSkpCisJCQkJdGFyZ2V0LnNldFZhbHVlKGtleS5mS2V5LCBvcmlnaW5WYWx1ZSk7CisKKwkJfQorCX0KKwkKKwlwdWJsaWMgdm9pZCBwcm9wYWdhdGUoKSB7CisJCWZvciAoaW50IGk9IDA7IGkgPCBmT3ZlcmxheUtleXMubGVuZ3RoOyBpKyspCisJCQlwcm9wYWdhdGVQcm9wZXJ0eShmU3RvcmUsIGZPdmVybGF5S2V5c1tpXSwgZlBhcmVudCk7CisJfQorCQorCXByaXZhdGUgdm9pZCBsb2FkUHJvcGVydHkoSVByZWZlcmVuY2VTdG9yZSBvcmdpbiwgT3ZlcmxheUtleSBrZXksIElQcmVmZXJlbmNlU3RvcmUgdGFyZ2V0LCBib29sZWFuIGZvcmNlSW5pdGlhbGl6YXRpb24pIHsKKwkJVHlwZURlc2NyaXB0b3IgZD0ga2V5LmZEZXNjcmlwdG9yOworCQlpZiAoQk9PTEVBTiA9PSBkKSB7CisJCQkKKwkJCWlmIChmb3JjZUluaXRpYWxpemF0aW9uKQorCQkJCXRhcmdldC5zZXRWYWx1ZShrZXkuZktleSwgdHJ1ZSk7CisJCQl0YXJnZXQuc2V0VmFsdWUoa2V5LmZLZXksIG9yZ2luLmdldEJvb2xlYW4oa2V5LmZLZXkpKTsKKwkJCXRhcmdldC5zZXREZWZhdWx0KGtleS5mS2V5LCBvcmdpbi5nZXREZWZhdWx0Qm9vbGVhbihrZXkuZktleSkpOworCQkJCisJCX0gZWxzZSBpZiAoRE9VQkxFID09IGQpIHsKKwkJCQorCQkJaWYgKGZvcmNlSW5pdGlhbGl6YXRpb24pCisJCQkJdGFyZ2V0LnNldFZhbHVlKGtleS5mS2V5LCAxLjBEKTsKKwkJCXRhcmdldC5zZXRWYWx1ZShrZXkuZktleSwgb3JnaW4uZ2V0RG91YmxlKGtleS5mS2V5KSk7CisJCQl0YXJnZXQuc2V0RGVmYXVsdChrZXkuZktleSwgb3JnaW4uZ2V0RGVmYXVsdERvdWJsZShrZXkuZktleSkpOworCQkJCisJCX0gZWxzZSBpZiAoRkxPQVQgPT0gZCkgeworCQkJCisJCQlpZiAoZm9yY2VJbml0aWFsaXphdGlvbikKKwkJCQl0YXJnZXQuc2V0VmFsdWUoa2V5LmZLZXksIDEuMEYpOworCQkJdGFyZ2V0LnNldFZhbHVlKGtleS5mS2V5LCBvcmdpbi5nZXRGbG9hdChrZXkuZktleSkpOworCQkJdGFyZ2V0LnNldERlZmF1bHQoa2V5LmZLZXksIG9yZ2luLmdldERlZmF1bHRGbG9hdChrZXkuZktleSkpOworCQkJCisJCX0gZWxzZSBpZiAoSU5UID09IGQpIHsKKwkJCQorCQkJaWYgKGZvcmNlSW5pdGlhbGl6YXRpb24pCisJCQkJdGFyZ2V0LnNldFZhbHVlKGtleS5mS2V5LCAxKTsKKwkJCXRhcmdldC5zZXRWYWx1ZShrZXkuZktleSwgb3JnaW4uZ2V0SW50KGtleS5mS2V5KSk7CisJCQl0YXJnZXQuc2V0RGVmYXVsdChrZXkuZktleSwgb3JnaW4uZ2V0RGVmYXVsdEludChrZXkuZktleSkpOworCQkJCisJCX0gZWxzZSBpZiAoTE9ORyA9PSBkKSB7CisJCQkKKwkJCWlmIChmb3JjZUluaXRpYWxpemF0aW9uKQorCQkJCXRhcmdldC5zZXRWYWx1ZShrZXkuZktleSwgMUwpOworCQkJdGFyZ2V0LnNldFZhbHVlKGtleS5mS2V5LCBvcmdpbi5nZXRMb25nKGtleS5mS2V5KSk7CisJCQl0YXJnZXQuc2V0RGVmYXVsdChrZXkuZktleSwgb3JnaW4uZ2V0RGVmYXVsdExvbmcoa2V5LmZLZXkpKTsKKwkJCQorCQl9IGVsc2UgaWYgKFNUUklORyA9PSBkKSB7CisJCQkKKwkJCWlmIChmb3JjZUluaXRpYWxpemF0aW9uKQorCQkJCXRhcmdldC5zZXRWYWx1ZShrZXkuZktleSwgIjEiKTsgLy8kTk9OLU5MUy0xJAorCQkJdGFyZ2V0LnNldFZhbHVlKGtleS5mS2V5LCBvcmdpbi5nZXRTdHJpbmcoa2V5LmZLZXkpKTsKKwkJCXRhcmdldC5zZXREZWZhdWx0KGtleS5mS2V5LCBvcmdpbi5nZXREZWZhdWx0U3RyaW5nKGtleS5mS2V5KSk7CisJCQkKKwkJfQorCX0KKwkKKwlwdWJsaWMgdm9pZCBsb2FkKCkgeworCQlmb3IgKGludCBpPSAwOyBpIDwgZk92ZXJsYXlLZXlzLmxlbmd0aDsgaSsrKQorCQkJbG9hZFByb3BlcnR5KGZQYXJlbnQsIGZPdmVybGF5S2V5c1tpXSwgZlN0b3JlLCB0cnVlKTsKKwl9CisJCisJcHVibGljIHZvaWQgbG9hZERlZmF1bHRzKCkgeworCQlmb3IgKGludCBpPSAwOyBpIDwgZk92ZXJsYXlLZXlzLmxlbmd0aDsgaSsrKQorCQkJc2V0VG9EZWZhdWx0KGZPdmVybGF5S2V5c1tpXS5mS2V5KTsKKwl9CisJCisJcHVibGljIHZvaWQgc3RhcnQoKSB7CisJCWlmIChmUHJvcGVydHlMaXN0ZW5lciA9PSBudWxsKSB7CisJCQlmUHJvcGVydHlMaXN0ZW5lcj0gbmV3IFByb3BlcnR5TGlzdGVuZXIoKTsKKwkJCWZQYXJlbnQuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihmUHJvcGVydHlMaXN0ZW5lcik7CisJCX0KKwl9CisJCisJcHVibGljIHZvaWQgc3RvcCgpIHsKKwkJaWYgKGZQcm9wZXJ0eUxpc3RlbmVyICE9IG51bGwpICB7CisJCQlmUGFyZW50LnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoZlByb3BlcnR5TGlzdGVuZXIpOworCQkJZlByb3BlcnR5TGlzdGVuZXI9IG51bGw7CisJCX0KKwl9CisJCisJLyoKKwkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcikKKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisJCWZTdG9yZS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKKwl9CisJCisJLyoKKwkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcikKKwkgKi8KKwlwdWJsaWMgdm9pZCByZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisJCWZTdG9yZS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKKwl9CisJCisJLyoKKwkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoU3RyaW5nLCBPYmplY3QsIE9iamVjdCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChTdHJpbmcgbmFtZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJZlN0b3JlLmZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KG5hbWUsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7CisJfQorCisJLyoKKwkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjY29udGFpbnMoU3RyaW5nKQorCSAqLworCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKFN0cmluZyBuYW1lKSB7CisJCXJldHVybiBmU3RvcmUuY29udGFpbnMobmFtZSk7CisJfQorCQorCS8qCisJICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI2dldEJvb2xlYW4oU3RyaW5nKQorCSAqLworCXB1YmxpYyBib29sZWFuIGdldEJvb2xlYW4oU3RyaW5nIG5hbWUpIHsKKwkJcmV0dXJuIGZTdG9yZS5nZXRCb29sZWFuKG5hbWUpOworCX0KKworCS8qCisJICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI2dldERlZmF1bHRCb29sZWFuKFN0cmluZykKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBnZXREZWZhdWx0Qm9vbGVhbihTdHJpbmcgbmFtZSkgeworCQlyZXR1cm4gZlN0b3JlLmdldERlZmF1bHRCb29sZWFuKG5hbWUpOworCX0KKworCS8qCisJICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI2dldERlZmF1bHREb3VibGUoU3RyaW5nKQorCSAqLworCXB1YmxpYyBkb3VibGUgZ2V0RGVmYXVsdERvdWJsZShTdHJpbmcgbmFtZSkgeworCQlyZXR1cm4gZlN0b3JlLmdldERlZmF1bHREb3VibGUobmFtZSk7CisJfQorCisJLyoKKwkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjZ2V0RGVmYXVsdEZsb2F0KFN0cmluZykKKwkgKi8KKwlwdWJsaWMgZmxvYXQgZ2V0RGVmYXVsdEZsb2F0KFN0cmluZyBuYW1lKSB7CisJCXJldHVybiBmU3RvcmUuZ2V0RGVmYXVsdEZsb2F0KG5hbWUpOworCX0KKworCS8qCisJICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI2dldERlZmF1bHRJbnQoU3RyaW5nKQorCSAqLworCXB1YmxpYyBpbnQgZ2V0RGVmYXVsdEludChTdHJpbmcgbmFtZSkgeworCQlyZXR1cm4gZlN0b3JlLmdldERlZmF1bHRJbnQobmFtZSk7CisJfQorCisJLyoKKwkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjZ2V0RGVmYXVsdExvbmcoU3RyaW5nKQorCSAqLworCXB1YmxpYyBsb25nIGdldERlZmF1bHRMb25nKFN0cmluZyBuYW1lKSB7CisJCXJldHVybiBmU3RvcmUuZ2V0RGVmYXVsdExvbmcobmFtZSk7CisJfQorCisJLyoKKwkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjZ2V0RGVmYXVsdFN0cmluZyhTdHJpbmcpCisJICovCisJcHVibGljIFN0cmluZyBnZXREZWZhdWx0U3RyaW5nKFN0cmluZyBuYW1lKSB7CisJCXJldHVybiBmU3RvcmUuZ2V0RGVmYXVsdFN0cmluZyhuYW1lKTsKKwl9CisKKwkvKgorCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNnZXREb3VibGUoU3RyaW5nKQorCSAqLworCXB1YmxpYyBkb3VibGUgZ2V0RG91YmxlKFN0cmluZyBuYW1lKSB7CisJCXJldHVybiBmU3RvcmUuZ2V0RG91YmxlKG5hbWUpOworCX0KKworCS8qCisJICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI2dldEZsb2F0KFN0cmluZykKKwkgKi8KKwlwdWJsaWMgZmxvYXQgZ2V0RmxvYXQoU3RyaW5nIG5hbWUpIHsKKwkJcmV0dXJuIGZTdG9yZS5nZXRGbG9hdChuYW1lKTsKKwl9CisKKwkvKgorCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNnZXRJbnQoU3RyaW5nKQorCSAqLworCXB1YmxpYyBpbnQgZ2V0SW50KFN0cmluZyBuYW1lKSB7CisJCXJldHVybiBmU3RvcmUuZ2V0SW50KG5hbWUpOworCX0KKworCS8qCisJICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI2dldExvbmcoU3RyaW5nKQorCSAqLworCXB1YmxpYyBsb25nIGdldExvbmcoU3RyaW5nIG5hbWUpIHsKKwkJcmV0dXJuIGZTdG9yZS5nZXRMb25nKG5hbWUpOworCX0KKworCS8qCisJICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI2dldFN0cmluZyhTdHJpbmcpCisJICovCisJcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIG5hbWUpIHsKKwkJcmV0dXJuIGZTdG9yZS5nZXRTdHJpbmcobmFtZSk7CisJfQorCisJLyoKKwkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjaXNEZWZhdWx0KFN0cmluZykKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHQoU3RyaW5nIG5hbWUpIHsKKwkJcmV0dXJuIGZTdG9yZS5pc0RlZmF1bHQobmFtZSk7CisJfQorCisJLyoKKwkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjbmVlZHNTYXZpbmcoKQorCSAqLworCXB1YmxpYyBib29sZWFuIG5lZWRzU2F2aW5nKCkgeworCQlyZXR1cm4gZlN0b3JlLm5lZWRzU2F2aW5nKCk7CisJfQorCisJLyoKKwkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjcHV0VmFsdWUoU3RyaW5nLCBTdHJpbmcpCisJICovCisJcHVibGljIHZvaWQgcHV0VmFsdWUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgeworCQlpZiAoY292ZXJzKG5hbWUpKQorCQkJZlN0b3JlLnB1dFZhbHVlKG5hbWUsIHZhbHVlKTsKKwl9CisKKwkvKgorCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNzZXREZWZhdWx0KFN0cmluZywgZG91YmxlKQorCSAqLworCXB1YmxpYyB2b2lkIHNldERlZmF1bHQoU3RyaW5nIG5hbWUsIGRvdWJsZSB2YWx1ZSkgeworCQlpZiAoY292ZXJzKG5hbWUpKQorCQkJZlN0b3JlLnNldERlZmF1bHQobmFtZSwgdmFsdWUpOworCX0KKworCS8qCisJICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI3NldERlZmF1bHQoU3RyaW5nLCBmbG9hdCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXREZWZhdWx0KFN0cmluZyBuYW1lLCBmbG9hdCB2YWx1ZSkgeworCQlpZiAoY292ZXJzKG5hbWUpKQorCQkJZlN0b3JlLnNldERlZmF1bHQobmFtZSwgdmFsdWUpOworCX0KKworCS8qCisJICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI3NldERlZmF1bHQoU3RyaW5nLCBpbnQpCisJICovCisJcHVibGljIHZvaWQgc2V0RGVmYXVsdChTdHJpbmcgbmFtZSwgaW50IHZhbHVlKSB7CisJCWlmIChjb3ZlcnMobmFtZSkpCisJCQlmU3RvcmUuc2V0RGVmYXVsdChuYW1lLCB2YWx1ZSk7CisJfQorCisJLyoKKwkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjc2V0RGVmYXVsdChTdHJpbmcsIGxvbmcpCisJICovCisJcHVibGljIHZvaWQgc2V0RGVmYXVsdChTdHJpbmcgbmFtZSwgbG9uZyB2YWx1ZSkgeworCQlpZiAoY292ZXJzKG5hbWUpKQorCQkJZlN0b3JlLnNldERlZmF1bHQobmFtZSwgdmFsdWUpOworCX0KKworCS8qCisJICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI3NldERlZmF1bHQoU3RyaW5nLCBTdHJpbmcpCisJICovCisJcHVibGljIHZvaWQgc2V0RGVmYXVsdChTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7CisJCWlmIChjb3ZlcnMobmFtZSkpCisJCQlmU3RvcmUuc2V0RGVmYXVsdChuYW1lLCB2YWx1ZSk7CisJfQorCisJLyoKKwkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjc2V0RGVmYXVsdChTdHJpbmcsIGJvb2xlYW4pCisJICovCisJcHVibGljIHZvaWQgc2V0RGVmYXVsdChTdHJpbmcgbmFtZSwgYm9vbGVhbiB2YWx1ZSkgeworCQlpZiAoY292ZXJzKG5hbWUpKQorCQkJZlN0b3JlLnNldERlZmF1bHQobmFtZSwgdmFsdWUpOworCX0KKworCS8qCisJICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI3NldFRvRGVmYXVsdChTdHJpbmcpCisJICovCisJcHVibGljIHZvaWQgc2V0VG9EZWZhdWx0KFN0cmluZyBuYW1lKSB7CisJCWZTdG9yZS5zZXRUb0RlZmF1bHQobmFtZSk7CisJfQorCisJLyoKKwkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjc2V0VmFsdWUoU3RyaW5nLCBkb3VibGUpCisJICovCisJcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5hbWUsIGRvdWJsZSB2YWx1ZSkgeworCQlpZiAoY292ZXJzKG5hbWUpKQorCQkJZlN0b3JlLnNldFZhbHVlKG5hbWUsIHZhbHVlKTsKKwl9CisKKwkvKgorCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNzZXRWYWx1ZShTdHJpbmcsIGZsb2F0KQorCSAqLworCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuYW1lLCBmbG9hdCB2YWx1ZSkgeworCQlpZiAoY292ZXJzKG5hbWUpKQorCQkJZlN0b3JlLnNldFZhbHVlKG5hbWUsIHZhbHVlKTsKKwl9CisKKwkvKgorCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNzZXRWYWx1ZShTdHJpbmcsIGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmFtZSwgaW50IHZhbHVlKSB7CisJCWlmIChjb3ZlcnMobmFtZSkpCisJCQlmU3RvcmUuc2V0VmFsdWUobmFtZSwgdmFsdWUpOworCX0KKworCS8qCisJICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI3NldFZhbHVlKFN0cmluZywgbG9uZykKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmFtZSwgbG9uZyB2YWx1ZSkgeworCQlpZiAoY292ZXJzKG5hbWUpKQorCQkJZlN0b3JlLnNldFZhbHVlKG5hbWUsIHZhbHVlKTsKKwl9CisKKwkvKgorCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNzZXRWYWx1ZShTdHJpbmcsIFN0cmluZykKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7CisJCWlmIChjb3ZlcnMobmFtZSkpCisJCQlmU3RvcmUuc2V0VmFsdWUobmFtZSwgdmFsdWUpOworCX0KKworCS8qCisJICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI3NldFZhbHVlKFN0cmluZywgYm9vbGVhbikKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmFtZSwgYm9vbGVhbiB2YWx1ZSkgeworCQlpZiAoY292ZXJzKG5hbWUpKQorCQkJZlN0b3JlLnNldFZhbHVlKG5hbWUsIHZhbHVlKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9TdGF0dXNJbmZvLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9TdGF0dXNJbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY1MmYyNAotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL1N0YXR1c0luZm8uamF2YQpAQCAtMCwwICsxLDE3MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkucHJlZmVyZW5jZXM7CisKKworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5JQW50VUlDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKKworLyoqCisgKiBBIHNldHRhYmxlIElTdGF0dXMuCisgKiBDYW4gYmUgYW4gZXJyb3IsIHdhcm5pbmcsIGluZm8gb3Igb2suIEZvciBlcnJvciwgaW5mbyBhbmQgd2FybmluZyBzdGF0ZXMsCisgKiBhIG1lc3NhZ2UgZGVzY3JpYmVzIHRoZSBwcm9ibGVtLgorICovCitwdWJsaWMgY2xhc3MgU3RhdHVzSW5mbyBpbXBsZW1lbnRzIElTdGF0dXMgeworCisJcHJpdmF0ZSBTdHJpbmcgZlN0YXR1c01lc3NhZ2U7CisJcHJpdmF0ZSBpbnQgZlNldmVyaXR5OworCisJLyoqCisJICogQ3JlYXRlcyBhIHN0YXR1cyBzZXQgdG8gT0sgKG5vIG1lc3NhZ2UpCisJICovCisJcHVibGljIFN0YXR1c0luZm8oKSB7CisJCXRoaXMoT0ssIG51bGwpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBzdGF0dXMgLgorCSAqIEBwYXJhbSBzZXZlcml0eSBUaGUgc3RhdHVzIHNldmVyaXR5OiBFUlJPUiwgV0FSTklORywgSU5GTyBhbmQgT0suCisJICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2Ugb2YgdGhlIHN0YXR1cy4gQXBwbGllcyBvbmx5IGZvciBFUlJPUiwKKwkgKiBXQVJOSU5HIGFuZCBJTkZPLgorCSAqLworCXB1YmxpYyBTdGF0dXNJbmZvKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2UpIHsKKwkJZlN0YXR1c01lc3NhZ2U9IG1lc3NhZ2U7CisJCWZTZXZlcml0eT0gc2V2ZXJpdHk7CisJfQorCisJLyoqCisJICogIFJldHVybnMgaWYgdGhlIHN0YXR1cycgc2V2ZXJpdHkgaXMgT0suCisJICovCisJcHVibGljIGJvb2xlYW4gaXNPSygpIHsKKwkJcmV0dXJuIGZTZXZlcml0eSA9PSBJU3RhdHVzLk9LOworCX0KKworCS8qKgorCSAqICBSZXR1cm5zIGlmIHRoZSBzdGF0dXMnIHNldmVyaXR5IGlzIFdBUk5JTkcuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNXYXJuaW5nKCkgeworCQlyZXR1cm4gZlNldmVyaXR5ID09IElTdGF0dXMuV0FSTklORzsKKwl9CisKKwkvKioKKwkgKiAgUmV0dXJucyBpZiB0aGUgc3RhdHVzJyBzZXZlcml0eSBpcyBJTkZPLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzSW5mbygpIHsKKwkJcmV0dXJuIGZTZXZlcml0eSA9PSBJU3RhdHVzLklORk87CisJfQorCisJLyoqCisJICogIFJldHVybnMgaWYgdGhlIHN0YXR1cycgc2V2ZXJpdHkgaXMgRVJST1IuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNFcnJvcigpIHsKKwkJcmV0dXJuIGZTZXZlcml0eSA9PSBJU3RhdHVzLkVSUk9SOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzI2dldE1lc3NhZ2UoKQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKKwkJcmV0dXJuIGZTdGF0dXNNZXNzYWdlOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHN0YXR1cyB0byBFUlJPUi4KKwkgKiBAcGFyYW0gZXJyb3JNZXNzYWdlIFRoZSBlcnJvciBtZXNzYWdlIChjYW4gYmUgZW1wdHksIGJ1dCBub3QgbnVsbCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRFcnJvcihTdHJpbmcgZXJyb3JNZXNzYWdlKSB7CisJCUFzc2VydC5pc05vdE51bGwoZXJyb3JNZXNzYWdlKTsKKwkJZlN0YXR1c01lc3NhZ2U9IGVycm9yTWVzc2FnZTsKKwkJZlNldmVyaXR5PSBJU3RhdHVzLkVSUk9SOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHN0YXR1cyB0byBXQVJOSU5HLgorCSAqIEBwYXJhbSB3YXJuaW5nTWVzc2FnZSBUaGUgd2FybmluZyBtZXNzYWdlIChjYW4gYmUgZW1wdHksIGJ1dCBub3QgbnVsbCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRXYXJuaW5nKFN0cmluZyB3YXJuaW5nTWVzc2FnZSkgeworCQlBc3NlcnQuaXNOb3ROdWxsKHdhcm5pbmdNZXNzYWdlKTsKKwkJZlN0YXR1c01lc3NhZ2U9IHdhcm5pbmdNZXNzYWdlOworCQlmU2V2ZXJpdHk9IElTdGF0dXMuV0FSTklORzsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSBzdGF0dXMgdG8gSU5GTy4KKwkgKiBAcGFyYW0gaW5mb01lc3NhZ2UgVGhlIGluZm8gbWVzc2FnZSAoY2FuIGJlIGVtcHR5LCBidXQgbm90IG51bGwpCisJICovCisJcHVibGljIHZvaWQgc2V0SW5mbyhTdHJpbmcgaW5mb01lc3NhZ2UpIHsKKwkJQXNzZXJ0LmlzTm90TnVsbChpbmZvTWVzc2FnZSk7CisJCWZTdGF0dXNNZXNzYWdlPSBpbmZvTWVzc2FnZTsKKwkJZlNldmVyaXR5PSBJU3RhdHVzLklORk87CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgc3RhdHVzIHRvIE9LLgorCSAqLworCXB1YmxpYyB2b2lkIHNldE9LKCkgeworCQlmU3RhdHVzTWVzc2FnZT0gbnVsbDsKKwkJZlNldmVyaXR5PSBJU3RhdHVzLk9LOworCX0KKworCS8qCisJICogQHNlZSBJU3RhdHVzI21hdGNoZXMoaW50KQorCSAqLworCXB1YmxpYyBib29sZWFuIG1hdGNoZXMoaW50IHNldmVyaXR5TWFzaykgeworCQlyZXR1cm4gKGZTZXZlcml0eSAmIHNldmVyaXR5TWFzaykgIT0gMDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGFsd2F5cyA8Y29kZT5mYWxzZTwvY29kZT4uCisJICogQHNlZSBJU3RhdHVzI2lzTXVsdGlTdGF0dXMoKQorCSAqLworCXB1YmxpYyBib29sZWFuIGlzTXVsdGlTdGF0dXMoKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKgorCSAqIEBzZWUgSVN0YXR1cyNnZXRTZXZlcml0eSgpCisJICovCisJcHVibGljIGludCBnZXRTZXZlcml0eSgpIHsKKwkJcmV0dXJuIGZTZXZlcml0eTsKKwl9CisKKwkvKgorCSAqIEBzZWUgSVN0YXR1cyNnZXRQbHVnaW4oKQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0UGx1Z2luKCkgeworCQlyZXR1cm4gSUFudFVJQ29uc3RhbnRzLlBMVUdJTl9JRDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGFsd2F5cyA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAc2VlIElTdGF0dXMjZ2V0RXhjZXB0aW9uKCkKKwkgKi8KKwlwdWJsaWMgVGhyb3dhYmxlIGdldEV4Y2VwdGlvbigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyBhbHdheXMgdGhlIGVycm9yIHNldmVyaXR5LgorCSAqIEBzZWUgSVN0YXR1cyNnZXRDb2RlKCkKKwkgKi8KKwlwdWJsaWMgaW50IGdldENvZGUoKSB7CisJCXJldHVybiBmU2V2ZXJpdHk7CisJfQorCisJLyoqCisJICogUmV0dXJucyBhbHdheXMgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHNlZSBJU3RhdHVzI2dldENoaWxkcmVuKCkKKwkgKi8KKwlwdWJsaWMgSVN0YXR1c1tdIGdldENoaWxkcmVuKCkgeworCQlyZXR1cm4gbmV3IElTdGF0dXNbMF07CisJfQorCit9CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9TeW50YXhQcmV2aWV3Q29kZS50eHQgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9TeW50YXhQcmV2aWV3Q29kZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmYyODFkZAotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL1N5bnRheFByZXZpZXdDb2RlLnR4dApAQCAtMCwwICsxLDE0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCFET0NUWVBFIHByb2plY3QgICBbCis8IUVOVElUWSBjb21tb24gU1lTVEVNICJjb21tb24ueG1sIj4KK10+Cis8cHJvamVjdCBkZWZhdWx0PSJncmVldGluZ3MiPgorCSZjb21tb247CisgICAgPHRhcmdldCBuYW1lPSJncmVldGluZ3MiPgorICAgIDwhLS1TYXlpbmcgSEkKKyAgICB0byB0aGUgd29ybGQtLT4KKyAgICAgICAgPGVjaG8+CisgICAgICAgICAgICAgRWNsaXBzZSEKKyAgICAgICAgPC9lY2hvPgkJICAKKyAgICA8L3RhcmdldD4KKzwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9UYWJGb2xkZXJMYXlvdXQuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL1RhYkZvbGRlckxheW91dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkNmYzZmYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9UYWJGb2xkZXJMYXlvdXQuamF2YQpAQCAtMCwwICsxLDU0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5wcmVmZXJlbmNlczsKKworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYXlvdXQ7CisKK3B1YmxpYyBjbGFzcyBUYWJGb2xkZXJMYXlvdXQgZXh0ZW5kcyBMYXlvdXQgeworCisJcHJvdGVjdGVkIFBvaW50IGNvbXB1dGVTaXplIChDb21wb3NpdGUgY29tcG9zaXRlLCBpbnQgd0hpbnQsIGludCBoSGludCwgYm9vbGVhbiBmbHVzaENhY2hlKSB7CisJCWlmICh3SGludCAhPSBTV1QuREVGQVVMVCAmJiBoSGludCAhPSBTV1QuREVGQVVMVCkKKwkJCXJldHVybiBuZXcgUG9pbnQod0hpbnQsIGhIaW50KTsKKwkJCQorCQlDb250cm9sIFtdIGNoaWxkcmVuID0gY29tcG9zaXRlLmdldENoaWxkcmVuICgpOworCQlpbnQgY291bnQgPSBjaGlsZHJlbi5sZW5ndGg7CisJCWludCBtYXhXaWR0aCA9IDAsIG1heEhlaWdodCA9IDA7CisJCWZvciAoaW50IGk9MDsgaTxjb3VudDsgaSsrKSB7CisJCQlDb250cm9sIGNoaWxkID0gY2hpbGRyZW4gW2ldOworCQkJUG9pbnQgcHQgPSBjaGlsZC5jb21wdXRlU2l6ZSAoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCBmbHVzaENhY2hlKTsKKwkJCW1heFdpZHRoID0gTWF0aC5tYXggKG1heFdpZHRoLCBwdC54KTsKKwkJCW1heEhlaWdodCA9IE1hdGgubWF4IChtYXhIZWlnaHQsIHB0LnkpOworCQl9CisJCQorCQlpZiAod0hpbnQgIT0gU1dULkRFRkFVTFQpCisJCQltYXhXaWR0aD0gd0hpbnQ7CisJCWlmIChoSGludCAhPSBTV1QuREVGQVVMVCkKKwkJCW1heEhlaWdodD0gaEhpbnQ7CisJCQorCQlyZXR1cm4gbmV3IFBvaW50KG1heFdpZHRoLCBtYXhIZWlnaHQpOwkKKwkJCisJfQorCQorCXByb3RlY3RlZCB2b2lkIGxheW91dCAoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgYm9vbGVhbiBmbHVzaENhY2hlKSB7CisJCVJlY3RhbmdsZSByZWN0PSBjb21wb3NpdGUuZ2V0Q2xpZW50QXJlYSgpOworCQorCQlDb250cm9sW10gY2hpbGRyZW4gPSBjb21wb3NpdGUuZ2V0Q2hpbGRyZW4oKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgeworCQkJY2hpbGRyZW5baV0uc2V0Qm91bmRzKHJlY3QpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvVVJMRmllbGRFZGl0b3IuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL1VSTEZpZWxkRWRpdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ1ZTM5NgotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL1VSTEZpZWxkRWRpdG9yLmphdmEKQEAgLTAsMCArMSwxMDAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkucHJlZmVyZW5jZXM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuQW50VUlQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5TdHJpbmdCdXR0b25GaWVsZEVkaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7CisKK3B1YmxpYyBjbGFzcyBVUkxGaWVsZEVkaXRvciBleHRlbmRzIFN0cmluZ0J1dHRvbkZpZWxkRWRpdG9yIHsKKwkKKwlwdWJsaWMgVVJMRmllbGRFZGl0b3IoU3RyaW5nIG5hbWUsIFN0cmluZyBsYWJlbFRleHQsIENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJc3VwZXIobmFtZSwgbGFiZWxUZXh0LCBwYXJlbnQpOworCQlzZXRFbXB0eVN0cmluZ0FsbG93ZWQoZmFsc2UpOworCQlzZXRDaGFuZ2VCdXR0b25UZXh0KEpGYWNlUmVzb3VyY2VzLmdldFN0cmluZygib3BlbkJyb3dzZSIpKTsvLyROT04tTkxTLTEkCisJCXNldEVycm9yTWVzc2FnZShBbnRQcmVmZXJlbmNlc01lc3NhZ2VzLlVSTEZpZWxkRWRpdG9yXzApOworCX0KKwkKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlN0cmluZ0ZpZWxkRWRpdG9yI2RvQ2hlY2tTdGF0ZSgpCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gZG9DaGVja1N0YXRlKCkgeworCQlTdHJpbmcgdGV4dD0gZ2V0VGV4dENvbnRyb2woKS5nZXRUZXh0KCk7CisJCWlmICh0ZXh0ICE9IG51bGwgJiYgdGV4dC5sZW5ndGgoKSA+IDApIHsKKwkJCXRyeSB7CisJCQkJbmV3IFVSTCh0ZXh0KTsKKwkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQl9CisJCXJldHVybiB0cnVlOworCX0KKwkKKwkvKiAobm9uLUphdmFkb2MpCisgICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIFN0cmluZ0J1dHRvbkZpZWxkRWRpdG9yLgorICAgICAqIE9wZW5zIHRoZSBkaXJlY3RvcnkgY2hvb3NlciBkaWFsb2cgYW5kIHJldHVybnMgdGhlIDxjb2RlPlVSTDwvY29kZT4gb2YgdGhlIHNlbGVjdGVkIGRpcmVjdG9yeS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGNoYW5nZVByZXNzZWQoKSB7CisgICAgCVVSTCB1cmw9IG51bGw7CisJCXRyeSB7CisJCQl1cmwgPSBuZXcgVVJMKGdldFRleHRDb250cm9sKCkuZ2V0VGV4dCgpKTsKKwkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUxKSB7CisJCX0KKwkJRmlsZSBmID0gbnVsbDsKKwkJaWYgKHVybCAhPSBudWxsKSB7CisJCQlmPSBuZXcgRmlsZSh1cmwuZ2V0RmlsZSgpKTsKKwkJCWlmICghZi5leGlzdHMoKSkgeworCSAgICAgICAgICAgIGYgPSBudWxsOworCSAgICAgICAgfQorCQl9CisgICAgICAgIAorICAgICAgICBGaWxlIGQgPSBnZXREaXJlY3RvcnkoZik7CisgICAgICAgIGlmIChkID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKwkJCXJldHVybiBkLnRvVVJMKCkudG9FeHRlcm5hbEZvcm0oKTsKKwkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKwkJCUFudFVJUGx1Z2luLmxvZygiSW50ZXJuYWwgZXJyb3Igc2V0dGluZyBkb2N1bWVudGF0aW9uIGxvY2F0aW9uIiwgZSk7IC8vJE5PTi1OTFMtMSQKKwkJCXJldHVybiBudWxsOworCQl9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEhlbHBlciB0aGF0IG9wZW5zIHRoZSBkaXJlY3RvcnkgY2hvb3NlciBkaWFsb2cuCisgICAgICogQHBhcmFtIHN0YXJ0aW5nRGlyZWN0b3J5IFRoZSBkaXJlY3RvcnkgdGhlIGRpYWxvZyB3aWxsIG9wZW4gaW4uCisgICAgICogQHJldHVybiBGaWxlIEZpbGUgb3IgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICovCisgICAgcHJpdmF0ZSBGaWxlIGdldERpcmVjdG9yeShGaWxlIHN0YXJ0aW5nRGlyZWN0b3J5KSB7CisKKyAgICAgICAgRGlyZWN0b3J5RGlhbG9nIGZpbGVEaWFsb2cgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKGdldFNoZWxsKCksIFNXVC5PUEVOKTsKKyAgICAgICAgaWYgKHN0YXJ0aW5nRGlyZWN0b3J5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZpbGVEaWFsb2cuc2V0RmlsdGVyUGF0aChzdGFydGluZ0RpcmVjdG9yeS5nZXRQYXRoKCkpOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBkaXIgPSBmaWxlRGlhbG9nLm9wZW4oKTsKKyAgICAgICAgaWYgKGRpciAhPSBudWxsKSB7CisgICAgICAgICAgICBkaXIgPSBkaXIudHJpbSgpOworICAgICAgICAgICAgaWYgKGRpci5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZpbGUoZGlyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3JlZmFjdG9yaW5nL0xhdW5jaENvbmZpZ3VyYXRpb25CdWlsZGZpbGVSZW5hbWVQYXJ0aWNpcGFudC5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvcmVmYWN0b3JpbmcvTGF1bmNoQ29uZmlndXJhdGlvbkJ1aWxkZmlsZVJlbmFtZVBhcnRpY2lwYW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNjMWU3NQotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3JlZmFjdG9yaW5nL0xhdW5jaENvbmZpZ3VyYXRpb25CdWlsZGZpbGVSZW5hbWVQYXJ0aWNpcGFudC5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLnJlZmFjdG9yaW5nOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ2hhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5DaGVja0NvbmRpdGlvbnNDb250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZW5hbWVQYXJ0aWNpcGFudDsKKworcHVibGljIGNsYXNzIExhdW5jaENvbmZpZ3VyYXRpb25CdWlsZGZpbGVSZW5hbWVQYXJ0aWNpcGFudCBleHRlbmRzIFJlbmFtZVBhcnRpY2lwYW50IHsKKworCXByaXZhdGUgSUZpbGUgZkZpbGU7CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQYXJ0aWNpcGFudCNpbml0aWFsaXplKGphdmEubGFuZy5PYmplY3QpCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gaW5pdGlhbGl6ZShPYmplY3QgZWxlbWVudCkgeworCQlmRmlsZT0gKElGaWxlKSBlbGVtZW50OworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUGFydGljaXBhbnQjZ2V0TmFtZSgpCisJICovCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gUmVmYWN0b3JpbmdNZXNzYWdlcy5MYXVuY2hDb25maWd1cmF0aW9uUGFydGljaXBhbnRfMDsgCisJfQorCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1BhcnRpY2lwYW50I2NoZWNrQ29uZGl0aW9ucyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciwgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLkNoZWNrQ29uZGl0aW9uc0NvbnRleHQpCisJICovCisJcHVibGljIFJlZmFjdG9yaW5nU3RhdHVzIGNoZWNrQ29uZGl0aW9ucyhJUHJvZ3Jlc3NNb25pdG9yIHBtLCBDaGVja0NvbmRpdGlvbnNDb250ZXh0IGNvbnRleHQpIHsKKwkJcmV0dXJuIG5ldyBSZWZhY3RvcmluZ1N0YXR1cygpOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1BhcnRpY2lwYW50I2NyZWF0ZUNoYW5nZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKKwkgKi8KKwlwdWJsaWMgQ2hhbmdlIGNyZWF0ZUNoYW5nZShJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBMYXVuY2hDb25maWd1cmF0aW9uQnVpbGRmaWxlQ2hhbmdlLmNyZWF0ZUNoYW5nZXNGb3JCdWlsZGZpbGVSZW5hbWUoZkZpbGUsIGdldEFyZ3VtZW50cygpLmdldE5ld05hbWUoKSk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3JlZmFjdG9yaW5nL0xhdW5jaENvbmZpZ3VyYXRpb25JUHJvamVjdFJlbmFtZVBhcnRpY2lwYW50LmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9yZWZhY3RvcmluZy9MYXVuY2hDb25maWd1cmF0aW9uSVByb2plY3RSZW5hbWVQYXJ0aWNpcGFudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjYzllZjUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9yZWZhY3RvcmluZy9MYXVuY2hDb25maWd1cmF0aW9uSVByb2plY3RSZW5hbWVQYXJ0aWNpcGFudC5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkucmVmYWN0b3Jpbmc7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLkNoZWNrQ29uZGl0aW9uc0NvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlbmFtZVBhcnRpY2lwYW50OworCitwdWJsaWMgY2xhc3MgTGF1bmNoQ29uZmlndXJhdGlvbklQcm9qZWN0UmVuYW1lUGFydGljaXBhbnQgZXh0ZW5kcyBSZW5hbWVQYXJ0aWNpcGFudCB7CisKKwlwcml2YXRlIElQcm9qZWN0IGZQcm9qZWN0OworCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUGFydGljaXBhbnQjaW5pdGlhbGl6ZShqYXZhLmxhbmcuT2JqZWN0KQorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGluaXRpYWxpemUoT2JqZWN0IGVsZW1lbnQpIHsKKwkJZlByb2plY3Q9IChJUHJvamVjdCkgZWxlbWVudDsKKwkJcmV0dXJuIHRydWU7CisJfQorCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1BhcnRpY2lwYW50I2dldE5hbWUoKQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIFJlZmFjdG9yaW5nTWVzc2FnZXMuTGF1bmNoQ29uZmlndXJhdGlvblBhcnRpY2lwYW50XzA7IAorCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1BhcnRpY2lwYW50I2NoZWNrQ29uZGl0aW9ucyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciwgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLkNoZWNrQ29uZGl0aW9uc0NvbnRleHQpCisJICovCisJcHVibGljIFJlZmFjdG9yaW5nU3RhdHVzIGNoZWNrQ29uZGl0aW9ucyhJUHJvZ3Jlc3NNb25pdG9yIHBtLCBDaGVja0NvbmRpdGlvbnNDb250ZXh0IGNvbnRleHQpIHsKKwkJcmV0dXJuIG5ldyBSZWZhY3RvcmluZ1N0YXR1cygpOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JleHQucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLklSZWZhY3RvcmluZ1BhcnRpY2lwYW50I2NyZWF0ZUNoYW5nZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKKwkgKi8KKwlwdWJsaWMgQ2hhbmdlIGNyZWF0ZUNoYW5nZShJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCXJldHVybiBMYXVuY2hDb25maWd1cmF0aW9uQnVpbGRmaWxlQ2hhbmdlLmNyZWF0ZUNoYW5nZXNGb3JQcm9qZWN0UmVuYW1lKGZQcm9qZWN0LCBnZXRBcmd1bWVudHMoKS5nZXROZXdOYW1lKCkpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9yZWZhY3RvcmluZy9SZWZhY3RvcmluZ01lc3NhZ2VzLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9yZWZhY3RvcmluZy9SZWZhY3RvcmluZ01lc3NhZ2VzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjlkOTg5NgotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3JlZmFjdG9yaW5nL1JlZmFjdG9yaW5nTWVzc2FnZXMuamF2YQpAQCAtMCwwICsxLDMwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMKKyAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKKyAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcworICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczogCisgKiBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkucmVmYWN0b3Jpbmc7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworCitwdWJsaWMgY2xhc3MgUmVmYWN0b3JpbmdNZXNzYWdlcyBleHRlbmRzIE5MUyB7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ01lc3NhZ2VzIjsvLyROT04tTkxTLTEkCisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBMYXVuY2hDb25maWd1cmF0aW9uUGFydGljaXBhbnRfMDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBMYXVuY2hDb25maWd1cmF0aW9uQnVpbGRmaWxlQ2hhbmdlXzA7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgTGF1bmNoQ29uZmlndXJhdGlvbkJ1aWxkZmlsZUNoYW5nZV8xOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExhdW5jaENvbmZpZ3VyYXRpb25CdWlsZGZpbGVDaGFuZ2VfMjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBMYXVuY2hDb25maWd1cmF0aW9uQnVpbGRmaWxlQ2hhbmdlXzQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgTGF1bmNoQ29uZmlndXJhdGlvbkJ1aWxkZmlsZUNoYW5nZV81OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExhdW5jaENvbmZpZ3VyYXRpb25CdWlsZGZpbGVDaGFuZ2VfNjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBMYXVuY2hDb25maWd1cmF0aW9uQnVpbGRmaWxlQ2hhbmdlXzc7CisKKwlzdGF0aWMgeworCQkvLyBsb2FkIG1lc3NhZ2UgdmFsdWVzIGZyb20gYnVuZGxlIGZpbGUKKwkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgUmVmYWN0b3JpbmdNZXNzYWdlcy5jbGFzcyk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3JlZmFjdG9yaW5nL1JlZmFjdG9yaW5nTWVzc2FnZXMucHJvcGVydGllcyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3JlZmFjdG9yaW5nL1JlZmFjdG9yaW5nTWVzc2FnZXMucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGVhYzRjCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvcmVmYWN0b3JpbmcvUmVmYWN0b3JpbmdNZXNzYWdlcy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTkgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisjIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorIworIyBDb250cmlidXRvcnM6CisjICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworTGF1bmNoQ29uZmlndXJhdGlvblBhcnRpY2lwYW50XzA9QW50IExhdW5jaCBjb25maWd1cmF0aW9uIHBhcnRpY2lwYW50CitMYXVuY2hDb25maWd1cmF0aW9uQnVpbGRmaWxlQ2hhbmdlXzA9UmVuYW1lIHRoZSBBbnQgbGF1bmNoIGNvbmZpZ3VyYXRpb24gInswfSIgdG8gInsxfSIsIHVwZGF0ZSBidWlsZGZpbGUgbG9jYXRpb24gYXR0cmlidXRlCitMYXVuY2hDb25maWd1cmF0aW9uQnVpbGRmaWxlQ2hhbmdlXzE9VXBkYXRlIGJ1aWxkZmlsZSBvZiBBbnQgbGF1bmNoIGNvbmZpZ3VyYXRpb24gInswfSIKK0xhdW5jaENvbmZpZ3VyYXRpb25CdWlsZGZpbGVDaGFuZ2VfMj1VcGRhdGUgQW50IGxhdW5jaCBjb25maWd1cmF0aW9uICJ7MH0iCitMYXVuY2hDb25maWd1cmF0aW9uQnVpbGRmaWxlQ2hhbmdlXzQ9VGhlIHByb2plY3QgZm9yIHRoZSBBbnQgbGF1bmNoIGNvbmZpZ3VyYXRpb24gInswfSIgaXMgbm8gbG9uZ2VyICJ7MX0iLgorTGF1bmNoQ29uZmlndXJhdGlvbkJ1aWxkZmlsZUNoYW5nZV81PVRoZSBidWlsZGZpbGUgbG9jYXRpb24gZm9yIHRoZSBBbnQgbGF1bmNoIGNvbmZpZ3VyYXRpb24gInswfSIgaXMgbm8gbG9uZ2VyICJ7MX0iLgorTGF1bmNoQ29uZmlndXJhdGlvbkJ1aWxkZmlsZUNoYW5nZV82PVRoZSBBbnQgbGF1bmNoIGNvbmZpZ3VyYXRpb24gInswfSIgbm8gbG9uZ2VyIGV4aXN0cy4KK0xhdW5jaENvbmZpZ3VyYXRpb25CdWlsZGZpbGVDaGFuZ2VfNz1BbnQgTGF1bmNoIGNvbmZpZ3VyYXRpb24gdXBkYXRlcwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ZpZXdzL0FudFZpZXdDb250ZW50UHJvdmlkZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ZpZXdzL0FudFZpZXdDb250ZW50UHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmNjNjczCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvdmlld3MvQW50Vmlld0NvbnRlbnRQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsNzYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBjdXJyZW50IGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkudmlld3M7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkubW9kZWwuQW50TW9kZWxDb250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKKworCitwdWJsaWMgY2xhc3MgQW50Vmlld0NvbnRlbnRQcm92aWRlciBleHRlbmRzIEFudE1vZGVsQ29udGVudFByb3ZpZGVyIHsKKwkKKwlwcml2YXRlIFRyZWVWaWV3ZXIgZlRyZWVWaWV3ZXI7CisJcHJpdmF0ZSBMaXN0IGZFbGVtZW50cz0gbmV3IEFycmF5TGlzdCgpOworCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIjZ2V0RWxlbWVudHMoT2JqZWN0KQorCSAqLworCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgYW5JbnB1dEVsZW1lbnQpIHsKKwkJaWYgKGFuSW5wdXRFbGVtZW50IGluc3RhbmNlb2YgT2JqZWN0W10pIHsKKwkJCXJldHVybiBmRWxlbWVudHMudG9BcnJheSgpOworCQl9CisJCXJldHVybiBFTVBUWV9BUlJBWTsKKwl9CisJCisJcHVibGljIHZvaWQgYWRkKE9iamVjdCBvKSB7CisJCWlmIChmRWxlbWVudHMuY29udGFpbnMobykpIHsKKwkJCXJldHVybjsKKwkJfQorCQlmRWxlbWVudHMuYWRkKG8pOworCQlmVHJlZVZpZXdlci5hZGQoZlRyZWVWaWV3ZXIuZ2V0SW5wdXQoKSwgbyk7CisJCWZUcmVlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihvKSwgdHJ1ZSk7CisJfQorCQorCXB1YmxpYyB2b2lkIGFkZEFsbChPYmplY3RbXSBvKSB7CisJCWZFbGVtZW50cy5hZGRBbGwoQXJyYXlzLmFzTGlzdChvKSk7CisJCWZUcmVlVmlld2VyLmFkZChmVHJlZVZpZXdlci5nZXRJbnB1dCgpLCBvKTsKKwl9CisJCisJLyoqCisJICogZG8gbm90aGluZworCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyI2lucHV0Q2hhbmdlZChWaWV3ZXIsIE9iamVjdCwgT2JqZWN0KQorCSAqLworCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgeworCQlmVHJlZVZpZXdlcj0gKFRyZWVWaWV3ZXIpdmlld2VyOworCX0KKwkKKwlwdWJsaWMgdm9pZCByZW1vdmUoT2JqZWN0IG8pIHsKKwkJZkVsZW1lbnRzLnJlbW92ZShvKTsKKwkJZlRyZWVWaWV3ZXIucmVtb3ZlKG8pOworCX0KKwkKKwlwdWJsaWMgdm9pZCByZW1vdmVBbGwoKSB7CisJCWZUcmVlVmlld2VyLnJlbW92ZShmVHJlZVZpZXdlci5nZXRJbnB1dCgpLCBmRWxlbWVudHMudG9BcnJheSgpKTsKKwkJZkVsZW1lbnRzLmNsZWFyKCk7CisJfQorCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlciNkaXNwb3NlKCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCX0KK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ZpZXdzL0FudFZpZXdNZXNzYWdlcy5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvdmlld3MvQW50Vmlld01lc3NhZ2VzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU2OTY0NAotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ZpZXdzL0FudFZpZXdNZXNzYWdlcy5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKKyAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKKyAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcworICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczogCisgKiBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkudmlld3M7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworCitwdWJsaWMgY2xhc3MgQW50Vmlld01lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLnZpZXdzLkFudFZpZXdNZXNzYWdlcyI7Ly8kTk9OLU5MUy0xJAorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgQW50Vmlld18xOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudFZpZXdfMzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRWaWV3XzQ7CisKKworCXN0YXRpYyB7CisJCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQorCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBBbnRWaWV3TWVzc2FnZXMuY2xhc3MpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS92aWV3cy9BbnRWaWV3TWVzc2FnZXMucHJvcGVydGllcyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ZpZXdzL0FudFZpZXdNZXNzYWdlcy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwYmVjZGYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS92aWV3cy9BbnRWaWV3TWVzc2FnZXMucHJvcGVydGllcwpAQCAtMCwwICsxLDE1IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyMKKyMgQ29udHJpYnV0b3JzOgorIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK0FudFZpZXdfMT0mT3BlbiBXaXRoCitBbnRWaWV3XzM9XCBkZXBlbmRzPSIKK0FudFZpZXdfND1cIGRlc2NyaXB0aW9uPSIKKwpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvdmlld3MvYWN0aW9ucy9BZGRCdWlsZEZpbGVzQWN0aW9uLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS92aWV3cy9hY3Rpb25zL0FkZEJ1aWxkRmlsZXNBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTFjYjdkCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvdmlld3MvYWN0aW9ucy9BZGRCdWlsZEZpbGVzQWN0aW9uLmphdmEKQEAgLTAsMCArMSw5NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkudmlld3MuYWN0aW9uczsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuQW50VUlJbWFnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLkFudFV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLklBbnRVSUNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuSUFudFVJSGVscENvbnRleHRJZHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLm1vZGVsLkFudFByb2plY3ROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5tb2RlbC5BbnRQcm9qZWN0Tm9kZVByb3h5OworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5GaWxlU2VsZWN0aW9uRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS52aWV3cy5BbnRWaWV3OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7CisKKy8qKgorICogQWN0aW9uIHRoYXQgcHJvbXB0cyB0aGUgdXNlciBmb3IgYnVpbGQgZmlsZXMgYW5kIGFkZHMgdGhlIHNlbGVjdGVkIGZpbGVzIHRvCisgKiBhbiA8Y29kZT5BbnRWaWV3PC9jb2RlPgorICovCitwdWJsaWMgY2xhc3MgQWRkQnVpbGRGaWxlc0FjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisKKwlwcml2YXRlIEFudFZpZXcgdmlldzsKKworCXB1YmxpYyBBZGRCdWlsZEZpbGVzQWN0aW9uKEFudFZpZXcgdmlldykgeworCQlzdXBlcihBbnRWaWV3QWN0aW9uTWVzc2FnZXMuQWRkQnVpbGRGaWxlc0FjdGlvbl8xLCBBbnRVSUltYWdlcy5nZXRJbWFnZURlc2NyaXB0b3IoSUFudFVJQ29uc3RhbnRzLklNR19BREQpKTsKKwkJdGhpcy52aWV3PSB2aWV3OworCQlzZXRUb29sVGlwVGV4dChBbnRWaWV3QWN0aW9uTWVzc2FnZXMuQWRkQnVpbGRGaWxlc0FjdGlvbl8wKTsKKwkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0aGlzLCBJQW50VUlIZWxwQ29udGV4dElkcy5BRERfQlVJTERGSUxFX0FDVElPTik7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jcnVuKCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBydW4oKSB7CisJCVN0cmluZyB0aXRsZT0gQW50Vmlld0FjdGlvbk1lc3NhZ2VzLkFkZEJ1aWxkRmlsZXNBY3Rpb25fMjsKKwkJU3RyaW5nIG1lc3NhZ2U9IEFudFZpZXdBY3Rpb25NZXNzYWdlcy5BZGRCdWlsZEZpbGVzQWN0aW9uXzQ7CisJCVN0cmluZyBmaWx0ZXJFeHRlbnNpb249ICJ4bWwiOyAvLyROT04tTkxTLTEkCisJCVN0cmluZyBmaWx0ZXJNZXNzYWdlPSBBbnRWaWV3QWN0aW9uTWVzc2FnZXMuQWRkQnVpbGRGaWxlc0FjdGlvbl81OworCQkKKwkJRmlsZVNlbGVjdGlvbkRpYWxvZyBkaWFsb2cgPSBuZXcgRmlsZVNlbGVjdGlvbkRpYWxvZyhEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLCBnZXRCdWlsZEZpbGVzKCksIHRpdGxlLCBtZXNzYWdlLCBmaWx0ZXJFeHRlbnNpb24sIGZpbHRlck1lc3NhZ2UpOworCQlkaWFsb2cub3BlbigpOworCQlmaW5hbCBPYmplY3RbXSByZXN1bHQ9IGRpYWxvZy5nZXRSZXN1bHQoKTsKKwkJaWYgKHJlc3VsdCA9PSBudWxsKSB7CisJCQlyZXR1cm47CisJCX0KKworCQl0cnkgeworCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcm9ncmVzc1NlcnZpY2UoKS5idXN5Q3Vyc29yV2hpbGUobmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKKwkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJCQkJCW1vbml0b3IuYmVnaW5UYXNrKEFudFZpZXdBY3Rpb25NZXNzYWdlcy5BZGRCdWlsZEZpbGVzQWN0aW9uXzMsIHJlc3VsdC5sZW5ndGgpOworCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGggJiYgIW1vbml0b3IuaXNDYW5jZWxlZCgpOyBpKyspIHsKKwkJCQkJCU9iamVjdCBmaWxlID0gcmVzdWx0W2ldOworCQkJCQkJaWYgKGZpbGUgaW5zdGFuY2VvZiBJRmlsZSkgeworCQkJCQkJCVN0cmluZyBidWlsZEZpbGVOYW1lPSAoKElGaWxlKWZpbGUpLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsKKwkJCQkJCQlmaW5hbCBBbnRQcm9qZWN0Tm9kZSBwcm9qZWN0PSBuZXcgQW50UHJvamVjdE5vZGVQcm94eShidWlsZEZpbGVOYW1lKTsKKwkJCQkJCQlwcm9qZWN0LmdldE5hbWUoKTsKKwkJCQkJCQltb25pdG9yLndvcmtlZCgxKTsKKwkJCQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgeworCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQkJCQl2aWV3LmFkZFByb2plY3QocHJvamVjdCk7CisJCQkJCQkJCX0KKwkJCQkJCQl9KTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0pOworCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKKwkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworCQl9CisJfQorCisJcHJpdmF0ZSBMaXN0IGdldEJ1aWxkRmlsZXMoKSB7CisJCUFudFByb2plY3ROb2RlW10gZXhpc3RpbmdQcm9qZWN0cz0gdmlldy5nZXRQcm9qZWN0cygpOworCQlMaXN0IGJ1aWxkRmlsZXM9IG5ldyBBcnJheUxpc3QoZXhpc3RpbmdQcm9qZWN0cy5sZW5ndGgpOworCQlmb3IgKGludCBqID0gMDsgaiA8IGV4aXN0aW5nUHJvamVjdHMubGVuZ3RoOyBqKyspIHsKKwkJCUFudFByb2plY3ROb2RlIGV4aXN0aW5nUHJvamVjdCA9IGV4aXN0aW5nUHJvamVjdHNbal07CisJCQlidWlsZEZpbGVzLmFkZChBbnRVdGlsLmdldEZpbGUoZXhpc3RpbmdQcm9qZWN0LmdldEJ1aWxkRmlsZU5hbWUoKSkpOworCQl9CisJCXJldHVybiBidWlsZEZpbGVzOworCX0KK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ZpZXdzL2FjdGlvbnMvQW50T3BlbldpdGhNZW51LmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS92aWV3cy9hY3Rpb25zL0FudE9wZW5XaXRoTWVudS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4MGJmNTMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS92aWV3cy9hY3Rpb25zL0FudE9wZW5XaXRoTWVudS5qYXZhCkBAIC0wLDAgKzEsMjg3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLnZpZXdzLmFjdGlvbnM7CisKKworaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuTWVzc2FnZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5BbnRVSVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuQW50VXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuSUFudFVJQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5tb2RlbC5BbnRFbGVtZW50Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQ29udHJpYnV0aW9uSXRlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LnByb2dyYW0uUHJvZ3JhbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnVJdGVtOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JSZWdpc3RyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7CisKKy8qKgorICogCisgKiBDb2RlIG1vc3RseSBhIGNvcHkgb2YgdGhlIE9wZW5XaXRoTWVudSB3aGljaCBjYW5ub3QgYmUgZWZmZWN0aXZlbHkgc3ViY2xhc3NlZAorICovCitwdWJsaWMgY2xhc3MgQW50T3BlbldpdGhNZW51IGV4dGVuZHMgQ29udHJpYnV0aW9uSXRlbSB7CisKKwlwcml2YXRlIElXb3JrYmVuY2hQYWdlIGZQYWdlOworCXByaXZhdGUgSUVkaXRvclJlZ2lzdHJ5IGZSZWdpc3RyeSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RWRpdG9yUmVnaXN0cnkoKTsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lTVEVNX0VESVRPUl9JRD0gUGxhdGZvcm1VSS5QTFVHSU5fSUQgKyAiLlN5c3RlbUVkaXRvciI7IC8vJE5PTi1OTFMtMSQKKworCXByaXZhdGUgc3RhdGljIE1hcCBpbWFnZUNhY2hlID0gbmV3IEhhc2h0YWJsZSgxMSk7CisKKwlwcml2YXRlIEFudEVsZW1lbnROb2RlIGZOb2RlOworCQorCS8qKgorCSAqIFRoZSBpZCBvZiB0aGlzIGFjdGlvbi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9IElBbnRVSUNvbnN0YW50cy5QTFVHSU5fSUQgKyAiLkFudE9wZW5XaXRoTWVudSI7IC8vJE5PTi1OTFMtMSQKKworCXB1YmxpYyBBbnRPcGVuV2l0aE1lbnUoSVdvcmtiZW5jaFBhZ2UgcGFnZSkgeworCQlzdXBlcihJRCk7CisJCXRoaXMuZlBhZ2U9IHBhZ2U7CisJfQorCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uSXRlbSNkaXNwb3NlKCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQlzdXBlci5kaXNwb3NlKCk7CisJCUl0ZXJhdG9yIGl0ZXI9IGltYWdlQ2FjaGUudmFsdWVzKCkuaXRlcmF0b3IoKTsKKwkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisJCQlJbWFnZSBpbWFnZSA9IChJbWFnZSkgaXRlci5uZXh0KCk7CisJCQlpbWFnZS5kaXNwb3NlKCk7CisJCX0JCQorCQlpbWFnZUNhY2hlLmNsZWFyKCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyBhbiBpbWFnZSB0byBzaG93IGZvciB0aGUgY29ycmVzcG9uZGluZyBlZGl0b3IgZGVzY3JpcHRvci4KKwkgKgorCSAqIEBwYXJhbSBlZGl0b3JEZXNjIHRoZSBlZGl0b3IgZGVzY3JpcHRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gZm9yIHRoZSBzeXN0ZW0gZWRpdG9yCisJICogQHJldHVybiB0aGUgaW1hZ2Ugb3IgPGNvZGU+bnVsbDwvY29kZT4KKwkgKi8KKwlwcml2YXRlIEltYWdlIGdldEltYWdlKElFZGl0b3JEZXNjcmlwdG9yIGVkaXRvckRlc2MpIHsKKwkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzYyA9IGdldEltYWdlRGVzY3JpcHRvcihlZGl0b3JEZXNjKTsKKwkJaWYgKGltYWdlRGVzYyA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlJbWFnZSBpbWFnZSA9IChJbWFnZSkgaW1hZ2VDYWNoZS5nZXQoaW1hZ2VEZXNjKTsKKwkJaWYgKGltYWdlID09IG51bGwpIHsKKwkJCWltYWdlID0gaW1hZ2VEZXNjLmNyZWF0ZUltYWdlKCk7CisJCQlpbWFnZUNhY2hlLnB1dChpbWFnZURlc2MsIGltYWdlKTsKKwkJfQorCQlyZXR1cm4gaW1hZ2U7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgaW1hZ2UgZGVzY3JpcHRvciBmb3IgdGhlIGdpdmVuIGVkaXRvciBkZXNjcmlwdG9yLAorCSAqIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGl0IGhhcyBubyBpbWFnZS4KKwkgKi8KKwlwcml2YXRlIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoSUVkaXRvckRlc2NyaXB0b3IgZWRpdG9yRGVzYykgeworCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjID0gbnVsbDsKKwkJaWYgKGVkaXRvckRlc2MgPT0gbnVsbCkgeworCQkJaW1hZ2VEZXNjID0gZlJlZ2lzdHJ5LmdldEltYWdlRGVzY3JpcHRvcihmTm9kZS5nZXRJRmlsZSgpLmdldE5hbWUoKSk7CisJCX0gZWxzZSB7CisJCQlpbWFnZURlc2MgPSBlZGl0b3JEZXNjLmdldEltYWdlRGVzY3JpcHRvcigpOworCQl9CisJCWlmIChpbWFnZURlc2MgPT0gbnVsbCAmJiBlZGl0b3JEZXNjICE9IG51bGwpIHsKKwkJCWlmIChlZGl0b3JEZXNjLmdldElkKCkuZXF1YWxzKFNZU1RFTV9FRElUT1JfSUQpKSB7CisJCQkJaW1hZ2VEZXNjID0gZ2V0U3lzdGVtRWRpdG9ySW1hZ2VEZXNjcmlwdG9yKGZOb2RlLmdldElGaWxlKCkuZ2V0RmlsZUV4dGVuc2lvbigpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gaW1hZ2VEZXNjOworCX0KKworCS8qKgorCSAqIFJldHVybiB0aGUgaW1hZ2UgZGVzY3JpcHRvciBvZiB0aGUgc3lzdGVtIGVkaXRvcgorCSAqIHRoYXQgaXMgcmVnaXN0ZXJlZCB3aXRoIHRoZSBPUyB0byBlZGl0IGZpbGVzIG9mCisJICogdGhpcyB0eXBlLiA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lIGNhbiBiZSBmb3VuZC4KKwkgKi8KKwlwcml2YXRlIEltYWdlRGVzY3JpcHRvciBnZXRTeXN0ZW1FZGl0b3JJbWFnZURlc2NyaXB0b3IoU3RyaW5nIGV4dGVuc2lvbikgeworCQlQcm9ncmFtIGV4dGVybmFsUHJvZ3JhbSA9IG51bGw7CisJCWlmIChleHRlbnNpb24gIT0gbnVsbCkgeworCQkJZXh0ZXJuYWxQcm9ncmFtID0gUHJvZ3JhbS5maW5kUHJvZ3JhbShleHRlbnNpb24pOworCQl9CisJCWlmIChleHRlcm5hbFByb2dyYW0gPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0gCisJCXJldHVybiBuZXcgRWRpdG9ySW1hZ2VEZXNjcmlwdG9yKGV4dGVybmFsUHJvZ3JhbSk7CisJfQorCS8qKgorCSAqIENyZWF0ZXMgdGhlIG1lbnUgaXRlbSBmb3IgdGhlIGVkaXRvciBkZXNjcmlwdG9yLgorCSAqCisJICogQHBhcmFtIG1lbnUgdGhlIG1lbnUgdG8gYWRkIHRoZSBpdGVtIHRvCisJICogQHBhcmFtIGRlc2NyaXB0b3IgdGhlIGVkaXRvciBkZXNjcmlwdG9yLCBvciBudWxsIGZvciB0aGUgc3lzdGVtIGVkaXRvcgorCSAqIEBwYXJhbSBwcmVmZXJyZWRFZGl0b3IgdGhlIGRlc2NyaXB0b3Igb2YgdGhlIHByZWZlcnJlZCBlZGl0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+CisJICovCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZU1lbnVJdGVtKE1lbnUgbWVudSwgZmluYWwgSUVkaXRvckRlc2NyaXB0b3IgZGVzY3JpcHRvciwgZmluYWwgSUVkaXRvckRlc2NyaXB0b3IgcHJlZmVycmVkRWRpdG9yKSB7CisJCS8vIFhYWDogV291bGQgYmUgYmV0dGVyIHRvIHVzZSBib2xkIGhlcmUsIGJ1dCBTV1QgZG9lcyBub3Qgc3VwcG9ydCBpdC4KKwkJZmluYWwgTWVudUl0ZW0gbWVudUl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULlJBRElPKTsKKwkJYm9vbGVhbiBpc1ByZWZlcnJlZCA9IHByZWZlcnJlZEVkaXRvciAhPSBudWxsICYmIGRlc2NyaXB0b3IuZ2V0SWQoKS5lcXVhbHMocHJlZmVycmVkRWRpdG9yLmdldElkKCkpOworCQltZW51SXRlbS5zZXRTZWxlY3Rpb24oaXNQcmVmZXJyZWQpOworCQltZW51SXRlbS5zZXRUZXh0KGRlc2NyaXB0b3IuZ2V0TGFiZWwoKSk7CisJCUltYWdlIGltYWdlID0gZ2V0SW1hZ2UoZGVzY3JpcHRvcik7CisJCWlmIChpbWFnZSAhPSBudWxsKSB7CisJCQltZW51SXRlbS5zZXRJbWFnZShpbWFnZSk7CisJCX0KKwkJTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7CisJCQkvKiAobm9uLUphdmFkb2MpCisJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyI2hhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50KQorCQkJICovCisJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgeworCQkJCXN3aXRjaCAoZXZlbnQudHlwZSkgeworCQkJCQljYXNlIFNXVC5TZWxlY3Rpb24gOgorCQkJCQkJaWYgKG1lbnVJdGVtLmdldFNlbGVjdGlvbigpKSB7CisJCQkJCQkJb3BlbkVkaXRvcihkZXNjcmlwdG9yKTsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfTsKKwkJbWVudUl0ZW0uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbGlzdGVuZXIpOworCX0KKwkKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbkl0ZW0jZmlsbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51LCBpbnQpCisJICovCisJcHVibGljIHZvaWQgZmlsbChNZW51IG1lbnUsIGludCBpbmRleCkgeworCQlJRmlsZSBmaWxlUmVzb3VyY2UgPSBmTm9kZS5nZXRJRmlsZSgpOworCQlpZiAoZmlsZVJlc291cmNlID09IG51bGwpIHsKKwkJCXJldHVybjsKKwkJfQorCisJCUlFZGl0b3JEZXNjcmlwdG9yIGRlZmF1bHRFZGl0b3IgPSBmUmVnaXN0cnkuZmluZEVkaXRvcihJRWRpdG9yUmVnaXN0cnkuU1lTVEVNX0lOUExBQ0VfRURJVE9SX0lEKTsgLy8gc2hvdWxkIG5vdCBiZSBudWxsCisJCUlFZGl0b3JEZXNjcmlwdG9yIHByZWZlcnJlZEVkaXRvciA9IElERS5nZXREZWZhdWx0RWRpdG9yKGZpbGVSZXNvdXJjZSk7IC8vIG1heSBiZSBudWxsCisJCQorCQlPYmplY3RbXSBlZGl0b3JzPSBmUmVnaXN0cnkuZ2V0RWRpdG9ycyhmaWxlUmVzb3VyY2UuZ2V0TmFtZSgpKTsKKwkJQXJyYXlzLnNvcnQoZWRpdG9ycywgbmV3IENvbXBhcmF0b3IoKSB7CisJCQkvKiAobm9uLUphdmFkb2MpCisJCQkgKiBAc2VlIGphdmEudXRpbC5Db21wYXJhdG9yI2NvbXBhcmUoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKKwkJCSAqLworCQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7CisJCQkJU3RyaW5nIHMxID0gKChJRWRpdG9yRGVzY3JpcHRvcikgbzEpLmdldExhYmVsKCk7CisJCQkJU3RyaW5nIHMyID0gKChJRWRpdG9yRGVzY3JpcHRvcikgbzIpLmdldExhYmVsKCk7CisJCQkJLy9SZXR1cm4gdHJ1ZSBpZiBlbGVtZW50VHdvIGlzICdncmVhdGVyIHRoYW4nIGVsZW1lbnRPbmUKKwkJCQlyZXR1cm4gczEuY29tcGFyZVRvSWdub3JlQ2FzZShzMik7CisJCQl9CisJCX0pOworCQlJRWRpdG9yRGVzY3JpcHRvciBhbnRFZGl0b3I9IGZSZWdpc3RyeS5maW5kRWRpdG9yKCJvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLkFudEVkaXRvciIpOyAvLyROT04tTkxTLTEkCisJCQorCQlib29sZWFuIGRlZmF1bHRGb3VuZCA9IGZhbHNlOworCQlib29sZWFuIGFudEZvdW5kPSBmYWxzZTsKKwkJTGlzdCBhbHJlYWR5QWRkZWRFZGl0b3JzPSBuZXcgQXJyYXlMaXN0KGVkaXRvcnMubGVuZ3RoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBlZGl0b3JzLmxlbmd0aDsgaSsrKSB7CisJCQlJRWRpdG9yRGVzY3JpcHRvciBlZGl0b3IgPSAoSUVkaXRvckRlc2NyaXB0b3IpIGVkaXRvcnNbaV07CisJCQlpZiAoYWxyZWFkeUFkZGVkRWRpdG9ycy5jb250YWlucyhlZGl0b3IuZ2V0SWQoKSkpIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWNyZWF0ZU1lbnVJdGVtKG1lbnUsIGVkaXRvciwgcHJlZmVycmVkRWRpdG9yKTsKKwkJCWlmIChkZWZhdWx0RWRpdG9yICE9IG51bGwgJiYgZWRpdG9yLmdldElkKCkuZXF1YWxzKGRlZmF1bHRFZGl0b3IuZ2V0SWQoKSkpIHsKKwkJCQlkZWZhdWx0Rm91bmQgPSB0cnVlOworCQkJfQorCQkJaWYgKGFudEVkaXRvciAhPSBudWxsICYmIGVkaXRvci5nZXRJZCgpLmVxdWFscyhhbnRFZGl0b3IuZ2V0SWQoKSkpIHsKKwkJCQlhbnRGb3VuZD0gdHJ1ZTsKKwkJCX0KKwkJCWFscmVhZHlBZGRlZEVkaXRvcnMuYWRkKGVkaXRvci5nZXRJZCgpKTsKKwkJCQorCQl9CisKKwkJLy8gT25seSBhZGQgYSBzZXBhcmF0b3IgaWYgdGhlcmUgaXMgc29tZXRoaW5nIHRvIHNlcGFyYXRlCisJCWlmIChlZGl0b3JzLmxlbmd0aCA+IDApIHsKKwkJCW5ldyBNZW51SXRlbShtZW51LCBTV1QuU0VQQVJBVE9SKTsKKwkJfQorCisJCS8vIEFkZCBhbnQgZWRpdG9yLgorCQkgaWYgKCFhbnRGb3VuZCAmJiBhbnRFZGl0b3IgIT0gbnVsbCkgeworCQkJIGNyZWF0ZU1lbnVJdGVtKG1lbnUsIGFudEVkaXRvciwgcHJlZmVycmVkRWRpdG9yKTsKKwkJIH0KKwkJCSAKKwkJLy8gQWRkIGRlZmF1bHQgZWRpdG9yLgorCQlpZiAoIWRlZmF1bHRGb3VuZCAmJiBkZWZhdWx0RWRpdG9yICE9IG51bGwpIHsKKwkJCWNyZWF0ZU1lbnVJdGVtKG1lbnUsIGRlZmF1bHRFZGl0b3IsIHByZWZlcnJlZEVkaXRvcik7CisJCX0KKworCQkvLyBBZGQgc3lzdGVtIGVkaXRvci4KKwkJSUVkaXRvckRlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGZSZWdpc3RyeS5maW5kRWRpdG9yKElFZGl0b3JSZWdpc3RyeS5TWVNURU1fRVhURVJOQUxfRURJVE9SX0lEKTsKKwkJY3JlYXRlTWVudUl0ZW0obWVudSwgZGVzY3JpcHRvciwgcHJlZmVycmVkRWRpdG9yKTsKKwkJY3JlYXRlRGVmYXVsdE1lbnVJdGVtKG1lbnUsIGZpbGVSZXNvdXJjZSk7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25JdGVtI2lzRHluYW1pYygpCisJICovCisJcHVibGljIGJvb2xlYW4gaXNEeW5hbWljKCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJLyoqCisJICogT3BlbnMgdGhlIGdpdmVuIGVkaXRvciBvbiB0aGUgc2VsZWN0ZWQgZmlsZS4KKwkgKgorCSAqIEBwYXJhbSBlZGl0b3IgdGhlIGVkaXRvciBkZXNjcmlwdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBmb3IgdGhlIHN5c3RlbSBlZGl0b3IKKwkgKi8KKwlwcml2YXRlIHZvaWQgb3BlbkVkaXRvcihJRWRpdG9yRGVzY3JpcHRvciBlZGl0b3JEZXNjcmlwdG9yKSB7CisJCUFudFV0aWwub3BlbkluRWRpdG9yKGZQYWdlLCBlZGl0b3JEZXNjcmlwdG9yLCBmTm9kZSk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyB0aGUgbWVudSBpdGVtIGZvciB0aGUgZGVmYXVsdCBlZGl0b3IKKwkgKgorCSAqIEBwYXJhbSBtZW51IHRoZSBtZW51IHRvIGFkZCB0aGUgaXRlbSB0bworCSAqIEBwYXJhbSBmaWxlIHRoZSBmaWxlIGJlaW5nIGVkaXRlZAorCSAqIEBwYXJhbSByZWdpc3RyeSB0aGUgZWRpdG9yIHJlZ2lzdHJ5CisJICovCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZURlZmF1bHRNZW51SXRlbShNZW51IG1lbnUsIGZpbmFsIElGaWxlIGZpbGVSZXNvdXJjZSkgeworCQlmaW5hbCBNZW51SXRlbSBtZW51SXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuUkFESU8pOworCQltZW51SXRlbS5zZXRTZWxlY3Rpb24oSURFLmdldERlZmF1bHRFZGl0b3IoZmlsZVJlc291cmNlKSA9PSBudWxsKTsKKwkJbWVudUl0ZW0uc2V0VGV4dChBbnRWaWV3QWN0aW9uTWVzc2FnZXMuQW50Vmlld09wZW5XaXRoTWVudV9EZWZhdWx0X0VkaXRvcl80KTsKKworCQlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKKwkJCS8qIChub24tSmF2YWRvYykKKwkJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQpCisJCQkgKi8KKwkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7CisJCQkJc3dpdGNoIChldmVudC50eXBlKSB7CisJCQkJCWNhc2UgU1dULlNlbGVjdGlvbiA6CisJCQkJCQlpZiAobWVudUl0ZW0uZ2V0U2VsZWN0aW9uKCkpIHsKKwkJCQkJCQlJREUuc2V0RGVmYXVsdEVkaXRvcihmaWxlUmVzb3VyY2UsIG51bGwpOworCQkJCQkJCXRyeSB7CisJCQkJCQkJCUlERS5vcGVuRWRpdG9yKGZQYWdlLCBmaWxlUmVzb3VyY2UsIHRydWUpOworCQkJCQkJCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKKwkJCQkJCQkJQW50VUlQbHVnaW4ubG9nKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEFudFZpZXdBY3Rpb25NZXNzYWdlcy5BbnRWaWV3T3BlbldpdGhNZW51X0VkaXRvcl9mYWlsZWQsIG5ldyBTdHJpbmdbXXtmaWxlUmVzb3VyY2UuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCl9KSwgZSk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9OworCisJCW1lbnVJdGVtLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIGxpc3RlbmVyKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXROb2RlKEFudEVsZW1lbnROb2RlIG5vZGUpIHsKKwkJZk5vZGU9IG5vZGU7CisJfQorfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvdmlld3MvYWN0aW9ucy9BbnRWaWV3QWN0aW9uTWVzc2FnZXMuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ZpZXdzL2FjdGlvbnMvQW50Vmlld0FjdGlvbk1lc3NhZ2VzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWMzODA0YwotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ZpZXdzL2FjdGlvbnMvQW50Vmlld0FjdGlvbk1lc3NhZ2VzLmphdmEKQEAgLTAsMCArMSw1OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcworICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgorICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCisgKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOiAKKyAqIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS52aWV3cy5hY3Rpb25zOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKKworcHVibGljIGNsYXNzIEFudFZpZXdBY3Rpb25NZXNzYWdlcyBleHRlbmRzIE5MUyB7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS52aWV3cy5hY3Rpb25zLkFudFZpZXdBY3Rpb25NZXNzYWdlcyI7Ly8kTk9OLU5MUy0xJAorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2VhcmNoRm9yQnVpbGRGaWxlc0RpYWxvZ19TZWFyY2hfZm9yX0J1aWxkX0ZpbGVzXzE7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2VhcmNoRm9yQnVpbGRGaWxlc0RpYWxvZ19fSW5wdXQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2VhcmNoRm9yQnVpbGRGaWxlc0RpYWxvZ19CdWlsZF9uYW1lX2Nhbm5vdF9iZV9lbXB0eV8zOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlYXJjaEZvckJ1aWxkRmlsZXNEaWFsb2dfX1NlYXJjaF80OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlYXJjaEZvckJ1aWxkRmlsZXNEaWFsb2dfU2NvcGVfNTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWFyY2hGb3JCdWlsZEZpbGVzRGlhbG9nX19Xb3Jrc3BhY2VfNjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWFyY2hGb3JCdWlsZEZpbGVzRGlhbG9nX1dvcl9raW5nX1NldF9fNzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWFyY2hGb3JCdWlsZEZpbGVzRGlhbG9nX19DaG9vc2VfX19fODsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWFyY2hGb3JCdWlsZEZpbGVzRGlhbG9nX0luY2x1ZGVfZXJyb3JzOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlYXJjaEZvckJ1aWxkRmlsZXNEaWFsb2dfTXVzdF9zZWxlY3RfYV93b3JraW5nX3NldF8xMDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWFyY2hGb3JCdWlsZEZpbGVzRGlhbG9nX05vX3NlYXJjaGFibGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQW50Vmlld09wZW5XaXRoTWVudV9FZGl0b3JfZmFpbGVkOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudFZpZXdPcGVuV2l0aE1lbnVfRGVmYXVsdF9FZGl0b3JfNDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRCdWlsZEZpbGVzQWN0aW9uXzA7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkQnVpbGRGaWxlc0FjdGlvbl8xOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZEJ1aWxkRmlsZXNBY3Rpb25fMjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRCdWlsZEZpbGVzQWN0aW9uXzM7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkQnVpbGRGaWxlc0FjdGlvbl80OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZEJ1aWxkRmlsZXNBY3Rpb25fNTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW1vdmVBbGxBY3Rpb25fUmVtb3ZlX0FsbDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW1vdmVBbGxBY3Rpb25fMDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW1vdmVBbGxBY3Rpb25fMTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW1vdmVQcm9qZWN0QWN0aW9uX1JlbW92ZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW1vdmVQcm9qZWN0QWN0aW9uX1JlbW92ZV8yOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJ1blRhcmdldEFjdGlvbl9SdW5fMTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBSdW5UYXJnZXRBY3Rpb25fMzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBSdW5UYXJnZXRBY3Rpb25fNDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBSdW5UYXJnZXRBY3Rpb25fMjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBSdW5UYXJnZXRBY3Rpb25fMDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWFyY2hGb3JCdWlsZEZpbGVzQWN0aW9uX1NlYXJjaF8xOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlYXJjaEZvckJ1aWxkRmlsZXNBY3Rpb25fQWRkX2J1aWxkX2ZpbGVzX3dpdGhfc2VhcmNoXzI7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2VhcmNoRm9yQnVpbGRGaWxlc0FjdGlvbl9Qcm9jZXNzaW5nX3NlYXJjaF9yZXN1bHRzXzM7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2VhcmNoRm9yQnVpbGRGaWxlc0FjdGlvbl9BZGRpbmdfXzBfXzQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgUmVmcmVzaEJ1aWxkRmlsZXNBY3Rpb25fUmVmcmVzaF9CdWlsZGZpbGVzXzE7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgUmVmcmVzaEJ1aWxkRmlsZXNBY3Rpb25fUmVmcmVzaGluZ19idWlsZGZpbGVzXzM7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgUmVmcmVzaEJ1aWxkRmlsZXNBY3Rpb25fUmVmcmVzaGluZ19fMF9fNDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJJbnRlcm5hbFRhcmdldHNBY3Rpb25fMDsKKworCXN0YXRpYyB7CisJCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQorCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBBbnRWaWV3QWN0aW9uTWVzc2FnZXMuY2xhc3MpOworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS92aWV3cy9hY3Rpb25zL0FudFZpZXdBY3Rpb25NZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvdmlld3MvYWN0aW9ucy9BbnRWaWV3QWN0aW9uTWVzc2FnZXMucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODgyYmE5Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvdmlld3MvYWN0aW9ucy9BbnRWaWV3QWN0aW9uTWVzc2FnZXMucHJvcGVydGllcwpAQCAtMCwwICsxLDQ4IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyMKKyMgQ29udHJpYnV0b3JzOgorIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK1NlYXJjaEZvckJ1aWxkRmlsZXNEaWFsb2dfU2VhcmNoX2Zvcl9CdWlsZF9GaWxlc18xPVNlYXJjaCBmb3IgQnVpbGRmaWxlcworU2VhcmNoRm9yQnVpbGRGaWxlc0RpYWxvZ19fSW5wdXQ9JklucHV0IGEgYnVpbGRmaWxlIG5hbWUgKCogPSBhbnkgc3RyaW5nLCA/ID0gYW55IGNoYXJhY3Rlcik6CitTZWFyY2hGb3JCdWlsZEZpbGVzRGlhbG9nX0J1aWxkX25hbWVfY2Fubm90X2JlX2VtcHR5XzM9QnVpbGQgbmFtZSBjYW5ub3QgYmUgZW1wdHkKK1NlYXJjaEZvckJ1aWxkRmlsZXNEaWFsb2dfX1NlYXJjaF80PSZTZWFyY2gKK1NlYXJjaEZvckJ1aWxkRmlsZXNEaWFsb2dfU2NvcGVfNT1TY29wZQorU2VhcmNoRm9yQnVpbGRGaWxlc0RpYWxvZ19fV29ya3NwYWNlXzY9JldvcmtzcGFjZQorU2VhcmNoRm9yQnVpbGRGaWxlc0RpYWxvZ19Xb3Jfa2luZ19TZXRfXzc9V29yJmtpbmcgU2V0OgorU2VhcmNoRm9yQnVpbGRGaWxlc0RpYWxvZ19fQ2hvb3NlX19fXzg9JkNob29zZS4uLgorU2VhcmNoRm9yQnVpbGRGaWxlc0RpYWxvZ19JbmNsdWRlX2Vycm9ycz1JbmNsdWRlICZidWlsZGZpbGVzIHRoYXQgY29udGFpbiBlcnJvcnMKK1NlYXJjaEZvckJ1aWxkRmlsZXNEaWFsb2dfTXVzdF9zZWxlY3RfYV93b3JraW5nX3NldF8xMD1NdXN0IHNlbGVjdCBhIHdvcmtpbmcgc2V0CitTZWFyY2hGb3JCdWlsZEZpbGVzRGlhbG9nX05vX3NlYXJjaGFibGU9Tm8gc2VhcmNoYWJsZSByZXNvdXJjZXMgZm91bmQgaW4gdGhlIHNlbGVjdGVkIHdvcmtpbmcgc2V0CitBbnRWaWV3T3BlbldpdGhNZW51X0VkaXRvcl9mYWlsZWQ9RWRpdG9yIGZhaWxlZCB0byBvcGVuIGZvciB7MH0KK0FudFZpZXdPcGVuV2l0aE1lbnVfRGVmYXVsdF9FZGl0b3JfND1EZWZhdWx0IEVkaXRvcgorQWRkQnVpbGRGaWxlc0FjdGlvbl8wPUFkZCBCdWlsZGZpbGVzCitBZGRCdWlsZEZpbGVzQWN0aW9uXzE9JkFkZCBCdWlsZGZpbGVzLi4uCitBZGRCdWlsZEZpbGVzQWN0aW9uXzI9QnVpbGRmaWxlIFNlbGVjdGlvbgorQWRkQnVpbGRGaWxlc0FjdGlvbl8zPUFkZGluZyBCdWlsZGZpbGUocykuLi4KK0FkZEJ1aWxkRmlsZXNBY3Rpb25fND0mQ2hvb3NlIHRoZSBidWlsZGZpbGVzIHRvIGFkZDoKK0FkZEJ1aWxkRmlsZXNBY3Rpb25fNT0mT25seSBzaG93ICoueG1sIGZpbGVzCitSZW1vdmVBbGxBY3Rpb25fUmVtb3ZlX0FsbD1SZW1vdmUgQSZsbCBCdWlsZGZpbGVzCitSZW1vdmVBbGxBY3Rpb25fMD1SZW1vdmUgQWxsIGZyb20gVmlldworUmVtb3ZlQWxsQWN0aW9uXzE9QXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIHJlbW92ZSBhbGwgYnVpbGRmaWxlcyBmcm9tIHRoZSB2aWV3PworUmVtb3ZlUHJvamVjdEFjdGlvbl9SZW1vdmU9UmVtbyZ2ZSBCdWlsZGZpbGUKK1JlbW92ZVByb2plY3RBY3Rpb25fUmVtb3ZlXzI9UmVtb3ZlIFNlbGVjdGVkIEJ1aWxkZmlsZQorUnVuVGFyZ2V0QWN0aW9uX1J1bl8xPVImdW4KK1J1blRhcmdldEFjdGlvbl8zPVJ1biB0aGUgRGVmYXVsdCBUYXJnZXQgb2YgdGhlIFNlbGVjdGVkIEJ1aWxkZmlsZQorUnVuVGFyZ2V0QWN0aW9uXzQ9UnVuIHRoZSBTZWxlY3RlZCBUYXJnZXQKK1J1blRhcmdldEFjdGlvbl8yPUxhdW5jaGluZyBBbnQgYnVpbGRmaWxlCitSdW5UYXJnZXRBY3Rpb25fMD1SdW4gdGhlIE93bmluZyBUYXJnZXQgb2YgdGhlIFNlbGVjdGVkIFRhc2sKK1NlYXJjaEZvckJ1aWxkRmlsZXNBY3Rpb25fU2VhcmNoXzE9U2VhcmNoCitTZWFyY2hGb3JCdWlsZEZpbGVzQWN0aW9uX0FkZF9idWlsZF9maWxlc193aXRoX3NlYXJjaF8yPUFkZCBCdWlsZGZpbGVzIHdpdGggU2VhcmNoCitTZWFyY2hGb3JCdWlsZEZpbGVzQWN0aW9uX1Byb2Nlc3Npbmdfc2VhcmNoX3Jlc3VsdHNfMz1Qcm9jZXNzaW5nIHNlYXJjaCByZXN1bHRzLi4uCitTZWFyY2hGb3JCdWlsZEZpbGVzQWN0aW9uX0FkZGluZ19fMF9fND1BZGRpbmcgezB9CitSZWZyZXNoQnVpbGRGaWxlc0FjdGlvbl9SZWZyZXNoX0J1aWxkZmlsZXNfMT1SZSZmcmVzaCBCdWlsZGZpbGVzCitSZWZyZXNoQnVpbGRGaWxlc0FjdGlvbl9SZWZyZXNoaW5nX2J1aWxkZmlsZXNfMz1SZWZyZXNoaW5nIGJ1aWxkZmlsZXMuLi4KK1JlZnJlc2hCdWlsZEZpbGVzQWN0aW9uX1JlZnJlc2hpbmdfXzBfXzQ9UmVmcmVzaGluZyB7MH0KK0ZpbHRlckludGVybmFsVGFyZ2V0c0FjdGlvbl8wPUhpZGUgSW50ZXJuYWwgVGFyZ2V0cwpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvdmlld3MvYWN0aW9ucy9FZGl0b3JJbWFnZURlc2NyaXB0b3IuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ZpZXdzL2FjdGlvbnMvRWRpdG9ySW1hZ2VEZXNjcmlwdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE2MWYyMwotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ZpZXdzL2FjdGlvbnMvRWRpdG9ySW1hZ2VEZXNjcmlwdG9yLmphdmEKQEAgLTAsMCArMSw5MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkudmlld3MuYWN0aW9uczsKKworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2VEYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5wcm9ncmFtLlByb2dyYW07CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNoYXJlZEltYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOworCisvKioKKyAqIENvcHkgb2Ygb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwubWlzYy5FeHRlcm5hbFByb2dyYW1JbWFnZURlc2NyaXB0b3IgZm9yCisgKiB1c2UgaW4gdGhlIEFudFZpZXdPcGVuV2l0aE1lbnUKKyAqLworcHVibGljIGNsYXNzIEVkaXRvckltYWdlRGVzY3JpcHRvciBleHRlbmRzIEltYWdlRGVzY3JpcHRvciB7CisKKwlwdWJsaWMgUHJvZ3JhbSBwcm9ncmFtOworCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBJbWFnZURlc2NyaXB0b3IuIFRoZSBpbWFnZSBpcyBsb2FkZWQgCisJICogZnJvbSBhIGZpbGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZSA8Y29kZT5uYW1lPC9jb2RlPi4KKwkgKi8KKwlwdWJsaWMgRWRpdG9ySW1hZ2VEZXNjcmlwdG9yKFByb2dyYW0gcHJvZ3JhbSkgeworCQl0aGlzLnByb2dyYW0gPSBwcm9ncmFtOworCX0KKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorCSAqLworCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworCQlpZiAoIShvIGluc3RhbmNlb2YgRWRpdG9ySW1hZ2VEZXNjcmlwdG9yKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCUVkaXRvckltYWdlRGVzY3JpcHRvciBvdGhlciA9IChFZGl0b3JJbWFnZURlc2NyaXB0b3IpIG87CisKKwkJLy9TZWUgaWYgdGhlcmUgaXMgYSBuYW1lIC0gY29tcGFyZSBpdCBpZiBzbyBhbmQgY29tcGFyZSB0aGUgcHJvZ3JhbXMgaWYgbm90CisJCVN0cmluZyBvdGhlck5hbWUgPSBvdGhlci5wcm9ncmFtLmdldE5hbWUoKTsKKwkJaWYgKG90aGVyTmFtZSA9PSBudWxsKSB7CisJCQlyZXR1cm4gb3RoZXIucHJvZ3JhbS5lcXVhbHMocHJvZ3JhbSk7CisJCX0gCisJCXJldHVybiBvdGhlck5hbWUuZXF1YWxzKHByb2dyYW0uZ2V0TmFtZSgpKTsKKwl9CisJLyoqCisJICogUmV0dXJucyBhbiBTV1QgSW1hZ2UgdGhhdCBpcyBkZXNjcmliZWQgYnkgdGhlIGluZm9ybWF0aW9uCisJICogaW4gdGhpcyBkZXNjcmlwdG9yLiAgRWFjaCBjYWxsIHJldHVybnMgYSBuZXcgSW1hZ2UuCisJICovCisJcHVibGljIEltYWdlIGdldEltYWdlKCkgeworCQlyZXR1cm4gY3JlYXRlSW1hZ2UoKTsKKwl9CisJCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3IjZ2V0SW1hZ2VEYXRhKCkKKwkgKi8KKwlwdWJsaWMgSW1hZ2VEYXRhIGdldEltYWdlRGF0YSgpIHsKKwkJCisJCUltYWdlRGF0YSBkZWZhdWx0SW1hZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFNoYXJlZEltYWdlcygpLmdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19PQkpfRklMRSkuZ2V0SW1hZ2VEYXRhKCk7CisJCWlmIChkZWZhdWx0SW1hZ2UgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJSW1hZ2VEYXRhIGRhdGEgPSBudWxsOworCQlpZiAocHJvZ3JhbSA9PSBudWxsIHx8ICgoZGF0YSA9IHByb2dyYW0uZ2V0SW1hZ2VEYXRhKCkpID09IG51bGwpKSB7CisJCQlyZXR1cm4gZGVmYXVsdEltYWdlOworCQl9CisKKwkJLy9UaGUgaW1hZ2VzIGluIEdOT01FIGFyZSB0b28gYmlnLiBTY2FsaW5nIHRoZW0gZG9lcyBub3QgZ2l2ZSBuaWNlIHJlc3VsdCBzbyByZXR1cm4gZGVmYXVsdEltYWdlOworCQlpZiAoZGF0YS5oZWlnaHQgPiBkZWZhdWx0SW1hZ2UuaGVpZ2h0IHx8IGRhdGEud2lkdGggPiBkZWZhdWx0SW1hZ2Uud2lkdGgpIHsKKwkJCXJldHVybiBkZWZhdWx0SW1hZ2U7CisJCX0KKworCQlyZXR1cm4gZGF0YTsKKwl9CisJCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNoYXNoQ29kZSgpCisJICovCisJcHVibGljIGludCBoYXNoQ29kZSgpIHsKKwkJU3RyaW5nIHByb2dyYW1OYW1lID0gcHJvZ3JhbS5nZXROYW1lKCk7CisJCWlmIChwcm9ncmFtTmFtZSA9PSBudWxsKSB7CisJCQlyZXR1cm4gcHJvZ3JhbS5oYXNoQ29kZSgpOworCQl9IAorCQlyZXR1cm4gcHJvZ3JhbU5hbWUuaGFzaENvZGUoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS92aWV3cy9hY3Rpb25zL0ZpbHRlckludGVybmFsVGFyZ2V0c0FjdGlvbi5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvdmlld3MvYWN0aW9ucy9GaWx0ZXJJbnRlcm5hbFRhcmdldHNBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2NmNmM4Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvdmlld3MvYWN0aW9ucy9GaWx0ZXJJbnRlcm5hbFRhcmdldHNBY3Rpb24uamF2YQpAQCAtMCwwICsxLDQwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS52aWV3cy5hY3Rpb25zOworCitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLkFudFVJSW1hZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5JQW50VUlDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLnZpZXdzLkFudFZpZXc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKKworLyoqIAorICogQW4gYWN0aW9uIHdoaWNoIHRvZ2dsZXMgZmlsdGVyaW5nIG9mIGludGVybmFsIHRhcmdldHMgZnJvbSB0aGUgQW50IHZpZXcuCisgKi8KK3B1YmxpYyBjbGFzcyBGaWx0ZXJJbnRlcm5hbFRhcmdldHNBY3Rpb24gZXh0ZW5kcyBBY3Rpb24geworCisJcHJpdmF0ZSBBbnRWaWV3IGZWaWV3OworCQorCXB1YmxpYyBGaWx0ZXJJbnRlcm5hbFRhcmdldHNBY3Rpb24oQW50VmlldyB2aWV3KSB7CisJCXN1cGVyKEFudFZpZXdBY3Rpb25NZXNzYWdlcy5GaWx0ZXJJbnRlcm5hbFRhcmdldHNBY3Rpb25fMCk7CisJCWZWaWV3ID0gdmlldzsKKwkJc2V0SW1hZ2VEZXNjcmlwdG9yKEFudFVJSW1hZ2VzLmdldEltYWdlRGVzY3JpcHRvcihJQW50VUlDb25zdGFudHMuSU1HX0ZJTFRFUl9JTlRFUk5BTF9UQVJHRVRTKSk7CisJCXNldFRvb2xUaXBUZXh0KEFudFZpZXdBY3Rpb25NZXNzYWdlcy5GaWx0ZXJJbnRlcm5hbFRhcmdldHNBY3Rpb25fMCk7CisJCXNldENoZWNrZWQoZlZpZXcuaXNGaWx0ZXJJbnRlcm5hbFRhcmdldHMoKSk7CisJfQorCQorCS8qKgorCSAqIFRvZ2dsZXMgdGhlIGZpbHRlcmluZyBvZiBpbnRlcm5hbCB0YXJnZXRzIGZyb20gdGhlIEFudCB2aWV3CisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNydW4oKQorCSAqLworCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJZlZpZXcuc2V0RmlsdGVySW50ZXJuYWxUYXJnZXRzKGlzQ2hlY2tlZCgpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS92aWV3cy9hY3Rpb25zL1JlZnJlc2hCdWlsZEZpbGVzQWN0aW9uLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS92aWV3cy9hY3Rpb25zL1JlZnJlc2hCdWlsZEZpbGVzQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY4NWVlMgotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ZpZXdzL2FjdGlvbnMvUmVmcmVzaEJ1aWxkRmlsZXNBY3Rpb24uamF2YQpAQCAtMCwwICsxLDExNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS52aWV3cy5hY3Rpb25zOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uaWJtLmljdS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLkFudFVJSW1hZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5JQW50VUlDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLklBbnRVSUhlbHBDb250ZXh0SWRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5tb2RlbC5BbnRQcm9qZWN0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkubW9kZWwuQW50UHJvamVjdE5vZGVQcm94eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkubW9kZWwuQW50VGFyZ2V0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkudmlld3MuQW50VmlldzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVVwZGF0ZTsKKworLyoqCisgKiBBY3Rpb24gd2hpY2ggcmVmcmVzaGVzIHRoZSBzZWxlY3RlZCBidWlsZGZpbGVzIGluIHRoZSBBbnQgdmlldworICovCitwdWJsaWMgY2xhc3MgUmVmcmVzaEJ1aWxkRmlsZXNBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gaW1wbGVtZW50cyBJVXBkYXRlIHsKKworCXByaXZhdGUgQW50VmlldyBmVmlldzsKKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UmVmcmVzaEJ1aWxkRmlsZXNBY3Rpb248L2NvZGU+IHdoaWNoIHdpbGwgcmVmcmVzaCBidWlsZGZpbGVzIAorCSAqIGluIHRoZSBnaXZlbiBBbnQgdmlldy4KKwkgKiBAcGFyYW0gdmlldyB0aGUgQW50IHZpZXcgd2hvc2Ugc2VsZWN0aW9uIHRoaXMgYWN0aW9uIHdpbGwgdXNlIHdoZW4KKwkgKiBkZXRlcm1pbmluZyB3aGljaCBidWlsZGZpbGVzIHRvIHJlZnJlc2guCisJICovCisJcHVibGljIFJlZnJlc2hCdWlsZEZpbGVzQWN0aW9uKEFudFZpZXcgdmlldykgeworCQlzdXBlcihBbnRWaWV3QWN0aW9uTWVzc2FnZXMuUmVmcmVzaEJ1aWxkRmlsZXNBY3Rpb25fUmVmcmVzaF9CdWlsZGZpbGVzXzEsIEFudFVJSW1hZ2VzLmdldEltYWdlRGVzY3JpcHRvcihJQW50VUlDb25zdGFudHMuSU1HX1JFRlJFU0gpKTsKKwkJc2V0VG9vbFRpcFRleHQoQW50Vmlld0FjdGlvbk1lc3NhZ2VzLlJlZnJlc2hCdWlsZEZpbGVzQWN0aW9uX1JlZnJlc2hfQnVpbGRmaWxlc18xKTsKKwkJZlZpZXcgPSB2aWV3OworCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRoaXMsIElBbnRVSUhlbHBDb250ZXh0SWRzLlJFRlJFU0hfQlVJTERGSUxFX0FDVElPTik7CisJfQorCisJLyoqCisJICogUmVmcmVzaGVzIHRoZSBzZWxlY3RlZCBidWlsZGZpbGVzIChvciBhbGwgYnVpbGRmaWxlcyBpZiBub25lIHNlbGVjdGVkKSBpbiB0aGUgQW50IHZpZXcKKwkgKi8KKwlwdWJsaWMgdm9pZCBydW4oKSB7CisJCWZpbmFsIFNldCBwcm9qZWN0cz0gZ2V0U2VsZWN0ZWRQcm9qZWN0cygpOworCQlpZiAocHJvamVjdHMuaXNFbXB0eSgpKSB7CisJCQkvLyBJZiBubyBzZWxlY3Rpb24sIGFkZCBhbGwKKwkJCUFudFByb2plY3ROb2RlW10gYWxsUHJvamVjdHM9IGZWaWV3LmdldFByb2plY3RzKCk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGFsbFByb2plY3RzLmxlbmd0aDsgaSsrKSB7CisJCQkJcHJvamVjdHMuYWRkKGFsbFByb2plY3RzW2ldKTsKKwkJCX0KKwkJfQorCQlmaW5hbCBJdGVyYXRvciBpdGVyPSBwcm9qZWN0cy5pdGVyYXRvcigpOworCQlpZiAoIWl0ZXIuaGFzTmV4dCgpKSB7CisJCQlyZXR1cm47CisJCX0KKwkJCisJCXRyeSB7CisJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFByb2dyZXNzU2VydmljZSgpLmJ1c3lDdXJzb3JXaGlsZShuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgeworCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKwkJCQkJbW9uaXRvci5iZWdpblRhc2soQW50Vmlld0FjdGlvbk1lc3NhZ2VzLlJlZnJlc2hCdWlsZEZpbGVzQWN0aW9uX1JlZnJlc2hpbmdfYnVpbGRmaWxlc18zLCBwcm9qZWN0cy5zaXplKCkpOworCQkJCQlBbnRQcm9qZWN0Tm9kZVByb3h5IHByb2plY3Q7CisJCQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgeworCQkJCQkJcHJvamVjdD0gKEFudFByb2plY3ROb2RlUHJveHkpIGl0ZXIubmV4dCgpOworCQkJCQkJbW9uaXRvci5zdWJUYXNrKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEFudFZpZXdBY3Rpb25NZXNzYWdlcy5SZWZyZXNoQnVpbGRGaWxlc0FjdGlvbl9SZWZyZXNoaW5nX18wX180LCBuZXcgU3RyaW5nW10ge3Byb2plY3QuZ2V0QnVpbGRGaWxlTmFtZSgpfSkpOworCQkJCQkJcHJvamVjdC5wYXJzZUJ1aWxkRmlsZSh0cnVlKTsKKwkJCQkJCW1vbml0b3Iud29ya2VkKDEpOworCQkJCQl9CisJCQkJfQorCQkJfSk7CisJCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgeworCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisJCX0KKwkJZlZpZXcuZ2V0Vmlld2VyKCkucmVmcmVzaCgpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHNlbGVjdGVkIHByb2plY3Qgbm9kZXMgdG8gcmVmcmVzaAorCSAqIAorCSAqIEByZXR1cm4gU2V0IHRoZSBzZWxlY3RlZCA8Y29kZT5Qcm9qZWN0Tm9kZTwvY29kZT5zIHRvIHJlZnJlc2guCisJICovCisJcHJpdmF0ZSBTZXQgZ2V0U2VsZWN0ZWRQcm9qZWN0cygpIHsKKwkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBmVmlldy5nZXRWaWV3ZXIoKS5nZXRTZWxlY3Rpb24oKTsKKwkJSGFzaFNldCBzZXQ9IG5ldyBIYXNoU2V0KCk7CisJCUl0ZXJhdG9yIGl0ZXIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsKKwkJT2JqZWN0IGRhdGE7CisJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgeworCQkJZGF0YT0gaXRlci5uZXh0KCk7CisJCQlpZiAoZGF0YSBpbnN0YW5jZW9mIEFudFByb2plY3ROb2RlKSB7CisJCQkJc2V0LmFkZChkYXRhKTsKKwkJCX0gZWxzZSBpZiAoZGF0YSBpbnN0YW5jZW9mIEFudFRhcmdldE5vZGUpIHsKKwkJCQlzZXQuYWRkKCgoQW50VGFyZ2V0Tm9kZSkgZGF0YSkuZ2V0UHJvamVjdE5vZGUoKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHNldDsKKwl9CisKKwkvKioKKwkgKiBVcGRhdGVzIHRoZSBlbmFibGVtZW50IG9mIHRoaXMgYWN0aW9uIGJhc2VkIG9uIHRoZSB1c2VyJ3Mgc2VsZWN0aW9uCisJICovCisJcHVibGljIHZvaWQgdXBkYXRlKCkgeworCQlzZXRFbmFibGVkKGZWaWV3LmdldFByb2plY3RzKCkubGVuZ3RoID4gMCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS92aWV3cy9hY3Rpb25zL1JlbW92ZUFsbEFjdGlvbi5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvdmlld3MvYWN0aW9ucy9SZW1vdmVBbGxBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDhhYzYwCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvdmlld3MvYWN0aW9ucy9SZW1vdmVBbGxBY3Rpb24uamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS52aWV3cy5hY3Rpb25zOworCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuQW50VUlJbWFnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLklBbnRVSUNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuSUFudFVJSGVscENvbnRleHRJZHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLnZpZXdzLkFudFZpZXc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklVcGRhdGU7CisKK3B1YmxpYyBjbGFzcyBSZW1vdmVBbGxBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gaW1wbGVtZW50cyBJVXBkYXRlIHsKKwlwcml2YXRlIEFudFZpZXcgdmlldzsKKwkKKwlwdWJsaWMgUmVtb3ZlQWxsQWN0aW9uKEFudFZpZXcgdmlldykgeworCQlzdXBlcihBbnRWaWV3QWN0aW9uTWVzc2FnZXMuUmVtb3ZlQWxsQWN0aW9uX1JlbW92ZV9BbGwsIEFudFVJSW1hZ2VzLmdldEltYWdlRGVzY3JpcHRvcihJQW50VUlDb25zdGFudHMuSU1HX1JFTU9WRV9BTEwpKTsKKwkJc2V0RGVzY3JpcHRpb24oQW50Vmlld0FjdGlvbk1lc3NhZ2VzLlJlbW92ZUFsbEFjdGlvbl9SZW1vdmVfQWxsKTsKKwkJc2V0VG9vbFRpcFRleHQoQW50Vmlld0FjdGlvbk1lc3NhZ2VzLlJlbW92ZUFsbEFjdGlvbl9SZW1vdmVfQWxsKTsKKwkJdGhpcy52aWV3PSB2aWV3OworCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRoaXMsIElBbnRVSUhlbHBDb250ZXh0SWRzLlJFTU9WRV9BTExfQUNUSU9OKTsKKwl9CisJCisJcHVibGljIHZvaWQgcnVuKCkgeworCQlib29sZWFuIHByb2NlZWQgPSBNZXNzYWdlRGlhbG9nLm9wZW5RdWVzdGlvbih2aWV3LmdldFZpZXdTaXRlKCkuZ2V0U2hlbGwoKSwgQW50Vmlld0FjdGlvbk1lc3NhZ2VzLlJlbW92ZUFsbEFjdGlvbl8wLCBBbnRWaWV3QWN0aW9uTWVzc2FnZXMuUmVtb3ZlQWxsQWN0aW9uXzEpOworCQlpZiAocHJvY2VlZCkgeworCQkJdmlldy5yZW1vdmVBbGxQcm9qZWN0cygpOworCQl9CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVXBkYXRlI3VwZGF0ZSgpCisJICovCisJcHVibGljIHZvaWQgdXBkYXRlKCkgeworCQlzZXRFbmFibGVkKHZpZXcuZ2V0Vmlld2VyKCkuZ2V0VHJlZSgpLmdldEl0ZW1Db3VudCgpICE9IDApOworCX0KK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ZpZXdzL2FjdGlvbnMvUmVtb3ZlUHJvamVjdEFjdGlvbi5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvdmlld3MvYWN0aW9ucy9SZW1vdmVQcm9qZWN0QWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM3NjNlMQotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ZpZXdzL2FjdGlvbnMvUmVtb3ZlUHJvamVjdEFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsNzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLnZpZXdzLmFjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLkFudFVJSW1hZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5JQW50VUlDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLklBbnRVSUhlbHBDb250ZXh0SWRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5tb2RlbC5BbnRQcm9qZWN0Tm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkudmlld3MuQW50VmlldzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklVcGRhdGU7CisKKy8qKgorICogQWN0aW9uIHRoYXQgcmVtb3ZlcyBzZWxlY3RlZCBidWlsZCBmaWxlcyBmcm9tIGFuIDxjb2RlPkFudFZpZXc8L2NvZGU+CisgKi8KK3B1YmxpYyBjbGFzcyBSZW1vdmVQcm9qZWN0QWN0aW9uIGV4dGVuZHMgQWN0aW9uIGltcGxlbWVudHMgSVVwZGF0ZSB7CisJCisJcHJpdmF0ZSBBbnRWaWV3IHZpZXc7CisJCisJcHVibGljIFJlbW92ZVByb2plY3RBY3Rpb24oQW50VmlldyB2aWV3KSB7CisJCXN1cGVyKEFudFZpZXdBY3Rpb25NZXNzYWdlcy5SZW1vdmVQcm9qZWN0QWN0aW9uX1JlbW92ZSwgQW50VUlJbWFnZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKElBbnRVSUNvbnN0YW50cy5JTUdfUkVNT1ZFKSk7CisJCXRoaXMudmlldz0gdmlldzsKKwkJc2V0VG9vbFRpcFRleHQoQW50Vmlld0FjdGlvbk1lc3NhZ2VzLlJlbW92ZVByb2plY3RBY3Rpb25fUmVtb3ZlXzIpOworCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRoaXMsIElBbnRVSUhlbHBDb250ZXh0SWRzLlJFTU9WRV9QUk9KRUNUX0FDVElPTik7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNydW4oKQorCSAqLworCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXcuZ2V0Vmlld2VyKCkuZ2V0U2VsZWN0aW9uKCk7CisJCUl0ZXJhdG9yIGl0ZXI9IHNlbGVjdGlvbi5pdGVyYXRvcigpOworCQlPYmplY3QgZWxlbWVudDsKKwkJTGlzdCBwcm9qZWN0Tm9kZXM9IG5ldyBBcnJheUxpc3QoKTsKKwkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisJCQllbGVtZW50PSBpdGVyLm5leHQoKTsKKwkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQW50UHJvamVjdE5vZGUpIHsKKwkJCQlwcm9qZWN0Tm9kZXMuYWRkKGVsZW1lbnQpOworCQkJfQorCQl9CisJCXZpZXcucmVtb3ZlUHJvamVjdHMocHJvamVjdE5vZGVzKTsKKwl9CisJCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklVcGRhdGUjdXBkYXRlKCkKKwkgKi8KKwlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7CisJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbj0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3LmdldFZpZXdlcigpLmdldFNlbGVjdGlvbigpOworCQlpZiAoc2VsZWN0aW9uLmlzRW1wdHkoKSkgeworCQkJc2V0RW5hYmxlZChmYWxzZSk7CisJCQlyZXR1cm47CisJCX0KKwkJT2JqZWN0IGVsZW1lbnQ7CisJCUl0ZXJhdG9yIGl0ZXI9IHNlbGVjdGlvbi5pdGVyYXRvcigpOworCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKwkJCWVsZW1lbnQ9IGl0ZXIubmV4dCgpOworCQkJaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIEFudFByb2plY3ROb2RlKSkgeworCQkJCXNldEVuYWJsZWQoZmFsc2UpOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCQlzZXRFbmFibGVkKHRydWUpOworCX0KKwkKK30KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ZpZXdzL2FjdGlvbnMvUnVuVGFyZ2V0QWN0aW9uLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS92aWV3cy9hY3Rpb25zL1J1blRhcmdldEFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4OTkzZTYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS92aWV3cy9hY3Rpb25zL1J1blRhcmdldEFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTMwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLnZpZXdzLmFjdGlvbnM7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLkFudFVJSW1hZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5JQW50VUlDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLklBbnRVSUhlbHBDb250ZXh0SWRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5sYXVuY2hDb25maWd1cmF0aW9ucy5BbnRMYXVuY2hTaG9ydGN1dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkubW9kZWwuQW50RWxlbWVudE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLm1vZGVsLkFudFByb2plY3ROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5tb2RlbC5BbnRUYXJnZXROb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5tb2RlbC5BbnRUYXNrTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkudmlld3MuQW50VmlldzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaE1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkucHJvZ3Jlc3MuVUlKb2I7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVXBkYXRlOworCisvKioKKyAqIEFjdGlvbiB3aGljaCBydW5zIHRoZSBzZWxlY3RlZCB0YXJnZXQgb3IgdGhlIGRlZmF1bHQgdGFyZ2V0IG9mIHRoZSBzZWxlY3RlZAorICogcHJvamVjdCBpbiB0aGUgQW50Vmlldy4KKyAqLworcHVibGljIGNsYXNzIFJ1blRhcmdldEFjdGlvbiBleHRlbmRzIEFjdGlvbiBpbXBsZW1lbnRzIElVcGRhdGUgeworCQorCXByaXZhdGUgQW50VmlldyBmVmlldzsKKwkKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlJ1blRhcmdldEFjdGlvbjwvY29kZT4gd2hpY2ggd2lsbCBleGVjdXRlCisJICogdGFyZ2V0cyBpbiB0aGUgZ2l2ZW4gdmlldy4KKwkgKiBAcGFyYW0gdmlldyB0aGUgQW50IHZpZXcgd2hvc2Ugc2VsZWN0aW9uIHRoaXMgYWN0aW9uIHdpbGwgdXNlIHdoZW4KKwkgKiBkZXRlcm1pbmluZyB3aGljaCB0YXJnZXQgdG8gcnVuLgorCSAqLworCXB1YmxpYyBSdW5UYXJnZXRBY3Rpb24oQW50VmlldyB2aWV3KSB7CisJCQorCQlzZXRUZXh0KEFudFZpZXdBY3Rpb25NZXNzYWdlcy5SdW5UYXJnZXRBY3Rpb25fUnVuXzEpOworCQlzZXRJbWFnZURlc2NyaXB0b3IoQW50VUlJbWFnZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKElBbnRVSUNvbnN0YW50cy5JTUdfUlVOKSk7CisJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGhpcywgSUFudFVJSGVscENvbnRleHRJZHMuUlVOX1RBUkdFVF9BQ1RJT04pOworCisJCXNldFRvb2xUaXBUZXh0KEFudFZpZXdBY3Rpb25NZXNzYWdlcy5SdW5UYXJnZXRBY3Rpb25fMyk7CisJCWZWaWV3PSB2aWV3OworCX0KKworCS8qKgorCSAqIEV4ZWN1dGVzIHRoZSBhcHByb3ByaWF0ZSB0YXJnZXQgYmFzZWQgb24gdGhlIHNlbGVjdGlvbiBpbiB0aGUgQW50IHZpZXcuCisJICovCisJcHVibGljIHZvaWQgcnVuKCkgeworCQlydW4oZ2V0U2VsZWN0ZWRFbGVtZW50KCkpOworCX0KKwkKKwkvKioKKyAgICAgKiBAcGFyYW0gc2VsZWN0ZWRFbGVtZW50IFRoZSBlbGVtZW50IHRvIHVzZSBhcyB0aGUgY29udGV4dCBmb3IgbGF1bmNoaW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgcnVuKGZpbmFsIEFudEVsZW1lbnROb2RlIHNlbGVjdGVkRWxlbWVudCkgeworICAgICAgICBVSUpvYiBqb2I9IG5ldyBVSUpvYihBbnRWaWV3QWN0aW9uTWVzc2FnZXMuUnVuVGFyZ2V0QWN0aW9uXzIpIHsKKwkJCXB1YmxpYyBJU3RhdHVzIHJ1bkluVUlUaHJlYWQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJCQkJbGF1bmNoKHNlbGVjdGVkRWxlbWVudCk7CisJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7CisJCQl9CisJCX07CisJCWpvYi5zY2hlZHVsZSgpOworICAgIH0KKworICAgIC8qKgorCSAqIExhdW5jaGVzIHRoZSBnaXZlbiBBbnQgZWxlbWVudCBub2RlCisJICogQHBhcmFtIG5vZGUgdGhlIG5vZGUgdG8gdXNlIHRvIGxhdW5jaAorCSAqIEBzZWUgQW50TGF1bmNoU2hvcnRjdXQjbGF1bmNoKEFudEVsZW1lbnROb2RlLCBTdHJpbmcpCisJICovCisJcHVibGljIHZvaWQgbGF1bmNoKEFudEVsZW1lbnROb2RlIG5vZGUpIHsKKwkJQW50TGF1bmNoU2hvcnRjdXQgc2hvcnRjdXQ9IG5ldyBBbnRMYXVuY2hTaG9ydGN1dCgpOworCQlzaG9ydGN1dC5zZXRTaG93RGlhbG9nKGZhbHNlKTsKKwkJc2hvcnRjdXQubGF1bmNoKG5vZGUsIElMYXVuY2hNYW5hZ2VyLlJVTl9NT0RFKTsKKwl9CisKKwkvKioKKwkgKiBVcGRhdGVzIHRoZSBlbmFibGVtZW50IG9mIHRoaXMgYWN0aW9uIGJhc2VkIG9uIHRoZSB1c2VyJ3Mgc2VsZWN0aW9uCisJICovCisJcHVibGljIHZvaWQgdXBkYXRlKCkgeworCQlBbnRFbGVtZW50Tm9kZSBzZWxlY3Rpb249IGdldFNlbGVjdGVkRWxlbWVudCgpOworCQlib29sZWFuIGVuYWJsZWQ9IGZhbHNlOworCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgQW50VGFyZ2V0Tm9kZSkgeworCQkJaWYgKCEoKEFudFRhcmdldE5vZGUpIHNlbGVjdGlvbikuaXNFcnJvck5vZGUoKSkgeworCQkJCXNldFRvb2xUaXBUZXh0KEFudFZpZXdBY3Rpb25NZXNzYWdlcy5SdW5UYXJnZXRBY3Rpb25fNCk7CisJCQkJZW5hYmxlZD0gdHJ1ZTsKKwkJCX0KKwkJfSBlbHNlIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBBbnRQcm9qZWN0Tm9kZSkgeworCQkJaWYgKCEoKEFudFByb2plY3ROb2RlKSBzZWxlY3Rpb24pLmlzRXJyb3JOb2RlKCkpIHsKKwkJCQllbmFibGVkPSB0cnVlOworCQkJCXNldFRvb2xUaXBUZXh0KEFudFZpZXdBY3Rpb25NZXNzYWdlcy5SdW5UYXJnZXRBY3Rpb25fMyk7CisJCQl9CisJCX0gIGVsc2UgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIEFudFRhc2tOb2RlKSB7CisJCQlpZiAoISgoQW50VGFza05vZGUpIHNlbGVjdGlvbikuaXNFcnJvck5vZGUoKSkgeworCQkJCWVuYWJsZWQ9IHRydWU7CisJCQkJc2V0VG9vbFRpcFRleHQoQW50Vmlld0FjdGlvbk1lc3NhZ2VzLlJ1blRhcmdldEFjdGlvbl8wKTsKKwkJCX0KKwkJfQorCQlzZXRFbmFibGVkKGVuYWJsZWQpOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzZWxlY3RlZCBub2RlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG1vcmUgdGhhbiBvbmUgZWxlbWVudCBpcyBzZWxlY3RlZC4KKwkgKiAKKwkgKiBAcmV0dXJuIEFudEVsZW1lbnROb2RlIHRoZSBzZWxlY3RlZCBub2RlCisJICovCisJcHJpdmF0ZSBBbnRFbGVtZW50Tm9kZSBnZXRTZWxlY3RlZEVsZW1lbnQoKSB7CisJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbj0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBmVmlldy5nZXRWaWV3ZXIoKS5nZXRTZWxlY3Rpb24oKTsKKwkJaWYgKHNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCUl0ZXJhdG9yIGl0ZXI9IHNlbGVjdGlvbi5pdGVyYXRvcigpOworCQlPYmplY3QgZGF0YT0gaXRlci5uZXh0KCk7CisJCWlmIChpdGVyLmhhc05leHQoKSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJcmV0dXJuIChBbnRFbGVtZW50Tm9kZSkgZGF0YTsKKwl9CQorfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvdmlld3MvYWN0aW9ucy9TZWFyY2hGb3JCdWlsZEZpbGVzQWN0aW9uLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS92aWV3cy9hY3Rpb25zL1NlYXJjaEZvckJ1aWxkRmlsZXNBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTM3NTVmCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvdmlld3MvYWN0aW9ucy9TZWFyY2hGb3JCdWlsZEZpbGVzQWN0aW9uLmphdmEKQEAgLTAsMCArMSw5NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS52aWV3cy5hY3Rpb25zOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CitpbXBvcnQgY29tLmlibS5pY3UudGV4dC5NZXNzYWdlRm9ybWF0OworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5BbnRVSUltYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuSUFudFVJQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5JQW50VUlIZWxwQ29udGV4dElkczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkubW9kZWwuQW50UHJvamVjdE5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLm1vZGVsLkFudFByb2plY3ROb2RlUHJveHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLnZpZXdzLkFudFZpZXc7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOworCisvKioKKyAqIFRoaXMgYWN0aW9uIG9wZW5zIGEgZGlhbG9nIHRvIHNlYXJjaCBmb3IgYnVpbGQgZmlsZXMgYW5kIGFkZHMgdGhlIHJlc3VsdGluZworICogcHJvamVjdHMgdG8gdGhlIGFudCB2aWV3LgorICovCitwdWJsaWMgY2xhc3MgU2VhcmNoRm9yQnVpbGRGaWxlc0FjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisJcHJpdmF0ZSBBbnRWaWV3IHZpZXc7CisJCisJcHVibGljIFNlYXJjaEZvckJ1aWxkRmlsZXNBY3Rpb24oQW50VmlldyB2aWV3KSB7CisJCXN1cGVyKEFudFZpZXdBY3Rpb25NZXNzYWdlcy5TZWFyY2hGb3JCdWlsZEZpbGVzQWN0aW9uX1NlYXJjaF8xLCBBbnRVSUltYWdlcy5nZXRJbWFnZURlc2NyaXB0b3IoSUFudFVJQ29uc3RhbnRzLklNR19TRUFSQ0gpKTsKKwkJc2V0VG9vbFRpcFRleHQoQW50Vmlld0FjdGlvbk1lc3NhZ2VzLlNlYXJjaEZvckJ1aWxkRmlsZXNBY3Rpb25fQWRkX2J1aWxkX2ZpbGVzX3dpdGhfc2VhcmNoXzIpOworCQl0aGlzLnZpZXc9IHZpZXc7CisJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGhpcywgSUFudFVJSGVscENvbnRleHRJZHMuU0VBUkNIX0ZPUl9CVUlMREZJTEVTX0FDVElPTik7CisJfQorCQorCS8qKgorCSAqIE9wZW5zIHRoZSA8Y29kZT5TZWFyY2hGb3JCdWlsZEZpbGVzRGlhbG9nPC9jb2RlPiBhbmQgYWRkcyB0aGUgcmVzdWx0cyB0bworCSAqIHRoZSBhbnQgdmlldy4KKwkgKi8KKwlwdWJsaWMgdm9pZCBydW4oKSB7CisJCVNlYXJjaEZvckJ1aWxkRmlsZXNEaWFsb2cgZGlhbG9nPSBuZXcgU2VhcmNoRm9yQnVpbGRGaWxlc0RpYWxvZygpOworCQlpZiAoZGlhbG9nLm9wZW4oKSAhPSBXaW5kb3cuQ0FOQ0VMKSB7CisJCQlmaW5hbCBJRmlsZVtdIGZpbGVzPSBkaWFsb2cuZ2V0UmVzdWx0cygpOworCQkJZmluYWwgYm9vbGVhbiBpbmNsdWRlRXJyb3JOb2Rlcz0gZGlhbG9nLmdldEluY2x1ZGVFcnJvclJlc3VsdHMoKTsKKwkJCWZpbmFsIEFudFByb2plY3ROb2RlW10gZXhpc3RpbmdQcm9qZWN0cz0gdmlldy5nZXRQcm9qZWN0cygpOworCQkJdHJ5IHsKKwkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFByb2dyZXNzU2VydmljZSgpLmJ1c3lDdXJzb3JXaGlsZShuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgeworCQkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJCQkJCQltb25pdG9yLmJlZ2luVGFzayhBbnRWaWV3QWN0aW9uTWVzc2FnZXMuU2VhcmNoRm9yQnVpbGRGaWxlc0FjdGlvbl9Qcm9jZXNzaW5nX3NlYXJjaF9yZXN1bHRzXzMsIGZpbGVzLmxlbmd0aCk7CisJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aCAmJiAhbW9uaXRvci5pc0NhbmNlbGVkKCk7IGkrKykgeworCQkJCQkJCVN0cmluZyBidWlsZEZpbGVOYW1lPSBmaWxlc1tpXS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCk7CisJCQkJCQkJbW9uaXRvci5zdWJUYXNrKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEFudFZpZXdBY3Rpb25NZXNzYWdlcy5TZWFyY2hGb3JCdWlsZEZpbGVzQWN0aW9uX0FkZGluZ19fMF9fNCwgbmV3IFN0cmluZ1tdIHtidWlsZEZpbGVOYW1lfSkpOworCQkJCQkJCWlmIChhbHJlYWR5QWRkZWQoYnVpbGRGaWxlTmFtZSkpIHsKKwkJCQkJCQkJLy8gRG9uJ3QgcGFyc2UgcHJvamVjdHMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBhZGRlZC4KKwkJCQkJCQkJY29udGludWU7CisJCQkJCQkJfQorCQkJCQkJCWZpbmFsIEFudFByb2plY3ROb2RlUHJveHkgcHJvamVjdD0gbmV3IEFudFByb2plY3ROb2RlUHJveHkoYnVpbGRGaWxlTmFtZSk7CisJCQkJCQkJLy8gRm9yY2UgdGhlIHByb2plY3QgdG8gYmUgcGFyc2VkIHNvIHRoZSBlcnJvciBzdGF0ZSBpcyBzZXQuCisJCQkJCQkJcHJvamVjdC5wYXJzZUJ1aWxkRmlsZSgpOworCQkJCQkJCW1vbml0b3Iud29ya2VkKDEpOworCQkJCQkJCWlmIChpbmNsdWRlRXJyb3JOb2RlcyB8fCAhKHByb2plY3QuaXNFcnJvck5vZGUoKSkpIHsKKwkJCQkJCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKKwkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJCQkJCQl2aWV3LmFkZFByb2plY3QocHJvamVjdCk7CisJCQkJCQkJCQl9CisJCQkJCQkJCX0pOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCQkvKioKKwkJCQkJICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgZ2l2ZW4gYnVpbGQgZmlsZSBhbHJlYWR5CisJCQkJCSAqIGV4aXN0cyBpbiB0aGUgYW50IHZpZXcuCisJCQkJCSAqLworCQkJCQlwcml2YXRlIGJvb2xlYW4gYWxyZWFkeUFkZGVkKFN0cmluZyBidWlsZEZpbGVOYW1lKSB7CisJCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGV4aXN0aW5nUHJvamVjdHMubGVuZ3RoOyBqKyspIHsKKwkJCQkJCQlBbnRQcm9qZWN0Tm9kZSBleGlzdGluZ1Byb2plY3QgPSBleGlzdGluZ1Byb2plY3RzW2pdOworCQkJCQkJCWlmIChleGlzdGluZ1Byb2plY3QuZ2V0QnVpbGRGaWxlTmFtZSgpLmVxdWFscyhidWlsZEZpbGVOYW1lKSkgeworCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCX0KKwkJCQl9KTsKKwkJCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgeworCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworCQkJfQorCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvdWkvbGF1bmNoaW5nL0lBbnRMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC91aS9sYXVuY2hpbmcvSUFudExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDkzYzAwCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvdWkvbGF1bmNoaW5nL0lBbnRMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLmphdmEKQEAgLTAsMCArMSwxNDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC51aS5sYXVuY2hpbmc7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nLklBbnRMYXVuY2hDb25zdGFudHM7CisKKy8qKgorICogQ29uc3RhbnQgZGVmaW5pdGlvbnMgZm9yIEFudCBsYXVuY2ggY29uZmlndXJhdGlvbnMuCisgKiAKKyAqIEBzaW5jZSAzLjQKKyAqIEBub2ltcGxlbWVudCBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KKyAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgSUFudExhdW5jaENvbnN0YW50c30KKyAqLworcHVibGljIGludGVyZmFjZSBJQW50TGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cyB7CisKKwkvKioKKwkgKiBBbnQgbGF1bmNoIGNvbmZpZ3VyYXRpb24gdHlwZSBpZGVudGlmaWVyLgorCSAqIAorCSAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgSUFudExhdW5jaENvbnN0YW50cyNJRF9BTlRfTEFVTkNIX0NPTkZJR1VSQVRJT05fVFlQRX0KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9BTlRfTEFVTkNIX0NPTkZJR1VSQVRJT05fVFlQRSA9IElBbnRMYXVuY2hDb25zdGFudHMuSURfQU5UX0xBVU5DSF9DT05GSUdVUkFUSU9OX1RZUEU7CisKKwkvKioKKwkgKiBBbnQgYnVpbGRlciBsYXVuY2ggY29uZmlndXJhdGlvbiB0eXBlIGlkZW50aWZpZXIuIEFudCBwcm9qZWN0IGJ1aWxkZXJzCisJICogYXJlIG9mIHRoaXMgdHlwZS4KKwkgKiAKKwkgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIElBbnRMYXVuY2hDb25zdGFudHMjSURfQU5UX0JVSUxERVJfTEFVTkNIX0NPTkZJR1VSQVRJT05fVFlQRX0KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9BTlRfQlVJTERFUl9MQVVOQ0hfQ09ORklHVVJBVElPTl9UWVBFID0gSUFudExhdW5jaENvbnN0YW50cy5JRF9BTlRfQlVJTERFUl9MQVVOQ0hfQ09ORklHVVJBVElPTl9UWVBFOworCQorCS8qKgorCSAqIFN0cmluZyBhdHRyaWJ1dGUgaW5kaWNhdGluZyB0aGUgQW50IHRhcmdldHMgdG8gZXhlY3V0ZS4gRGVmYXVsdCB2YWx1ZSBpcworCSAqIDxjb2RlPm51bGw8L2NvZGU+IHdoaWNoIGluZGljYXRlcyB0aGF0IHRoZSBkZWZhdWx0IHRhcmdldCBpcyB0byBiZQorCSAqIGV4ZWN1dGVkLiBGb3JtYXQgaXMgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdGluZyBvZiB0YXJnZXRzLgorCSAqIAorCSAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgSUFudExhdW5jaENvbnN0YW50cyNBVFRSX0FOVF9UQVJHRVRTfQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQU5UX1RBUkdFVFMgPSBJQW50TGF1bmNoQ29uc3RhbnRzLkFUVFJfQU5UX1RBUkdFVFM7CisJCisJLyoqCisJICogU3RyaW5nIGF0dHJpYnV0ZSBpbmRpY2F0aW5nIHRoZSBBbnQgdGFyZ2V0cyB0byBleGVjdXRlIGFmdGVyIGEgY2xlYW4gKGZ1bGwgYnVpbGQpIGZvciBhbiBBbnQgYnVpbGRlci4gRGVmYXVsdCB2YWx1ZSBpcworCSAqIDxjb2RlPm51bGw8L2NvZGU+IHdoaWNoIGluZGljYXRlcyB0aGF0IHRoZSBkZWZhdWx0IHRhcmdldCBpcyB0byBiZQorCSAqIGV4ZWN1dGVkLiBGb3JtYXQgaXMgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdGluZyBvZiB0YXJnZXRzLgorCSAqIAorCSAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgSUFudExhdW5jaENvbnN0YW50cyNBVFRSX0FOVF9BRlRFUl9DTEVBTl9UQVJHRVRTfQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQU5UX0FGVEVSX0NMRUFOX1RBUkdFVFMgPSBJQW50TGF1bmNoQ29uc3RhbnRzLkFUVFJfQU5UX0FGVEVSX0NMRUFOX1RBUkdFVFM7CisJCisJLyoqCisJICogU3RyaW5nIGF0dHJpYnV0ZSBpbmRpY2F0aW5nIHRoZSBBbnQgdGFyZ2V0cyB0byBleGVjdXRlIGR1cmluZyBhIG1hbnVhbCBidWlsZCBmb3IgYW4gQW50IGJ1aWxkZXIuIERlZmF1bHQgdmFsdWUgaXMKKwkgKiA8Y29kZT5udWxsPC9jb2RlPiB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgZGVmYXVsdCB0YXJnZXQgaXMgdG8gYmUKKwkgKiBleGVjdXRlZC4gRm9ybWF0IGlzIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Rpbmcgb2YgdGFyZ2V0cy4KKwkgKiAKKwkgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIElBbnRMYXVuY2hDb25zdGFudHMjQVRUUl9BTlRfTUFOVUFMX1RBUkdFVFN9CisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9BTlRfTUFOVUFMX1RBUkdFVFMgPSBJQW50TGF1bmNoQ29uc3RhbnRzLkFUVFJfQU5UX01BTlVBTF9UQVJHRVRTOworCQorCS8qKgorCSAqIFN0cmluZyBhdHRyaWJ1dGUgaW5kaWNhdGluZyB0aGUgQW50IHRhcmdldHMgdG8gZXhlY3V0ZSBkdXJpbmcgYW4gYXV0byBidWlsZCBmb3IgYW4gQW50IGJ1aWxkZXIuIERlZmF1bHQgdmFsdWUgaXMKKwkgKiA8Y29kZT5udWxsPC9jb2RlPiB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgZGVmYXVsdCB0YXJnZXQgaXMgdG8gYmUKKwkgKiBleGVjdXRlZC4gRm9ybWF0IGlzIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Rpbmcgb2YgdGFyZ2V0cy4KKwkgKiAKKwkgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIElBbnRMYXVuY2hDb25zdGFudHMjQVRUUl9BTlRfQVVUT19UQVJHRVRTfQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQU5UX0FVVE9fVEFSR0VUUyA9IElBbnRMYXVuY2hDb25zdGFudHMuQVRUUl9BTlRfQVVUT19UQVJHRVRTOworCQorCS8qKgorCSAqIFN0cmluZyBhdHRyaWJ1dGUgaW5kaWNhdGluZyB0aGUgQW50IHRhcmdldHMgdG8gZXhlY3V0ZSBkdXJpbmcgYSBjbGVhbiBmb3IgYW4gQW50IGJ1aWxkZXIuIERlZmF1bHQgdmFsdWUgaXMKKwkgKiA8Y29kZT5udWxsPC9jb2RlPiB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgZGVmYXVsdCB0YXJnZXQgaXMgdG8gYmUKKwkgKiBleGVjdXRlZC4gRm9ybWF0IGlzIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Rpbmcgb2YgdGFyZ2V0cy4KKwkgKiAKKwkgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIElBbnRMYXVuY2hDb25zdGFudHMjQVRUUl9BTlRfQ0xFQU5fVEFSR0VUU30KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0FOVF9DTEVBTl9UQVJHRVRTID0gSUFudExhdW5jaENvbnN0YW50cy5BVFRSX0FOVF9DTEVBTl9UQVJHRVRTOworCQorCS8qKgorCSAqIEJvb2xlYW4gYXR0cmlidXRlIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgdGFyZ2V0IHNwZWNpZmljYXRpb24gZm9yIGFuIEFudCBidWlsZGVyIAorCSAqIGhhcyBiZWVuIHVwZGF0ZWQgZm9yIDMuMSAKKwkgKiAKKwkgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIElBbnRMYXVuY2hDb25zdGFudHMjQVRUUl9UQVJHRVRTX1VQREFURUR9CisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9UQVJHRVRTX1VQREFURUQgPSBJQW50TGF1bmNoQ29uc3RhbnRzLkFUVFJfVEFSR0VUU19VUERBVEVEOworCQorCS8qKgorCSAqIE1hcCBhdHRyaWJ1dGUgaW5kaWNhdGluZyB0aGUgQW50IHByb3BlcnRpZXMgdG8gYmUgZGVmaW5lZCBkdXJpbmcgdGhlCisJICogYnVpbGQuIERlZmF1bHQgdmFsdWUgaXMgPGNvZGU+bnVsbDwvY29kZT4gd2hpY2ggaW5kaWNhdGVzIG5vIGFkZGl0aW9uYWwKKwkgKiBwcm9wZXJ0aWVzIHdpbGwgYmUgZGVmaW5lZC4KKwkgKiAKKwkgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIElBbnRMYXVuY2hDb25zdGFudHMjQVRUUl9BTlRfUFJPUEVSVElFU30KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0FOVF9QUk9QRVJUSUVTID0gSUFudExhdW5jaENvbnN0YW50cy5BVFRSX0FOVF9QUk9QRVJUSUVTOwkJCQkJCisJCisJLyoqCisJICogU3RyaW5nIGF0dHJpYnV0ZSBpbmRpY2F0aW5nIHRoZSBBbnQgdGFyZ2V0cyB0byBleGVjdXRlLiBEZWZhdWx0IHZhbHVlIGlzCisJICogPGNvZGU+bnVsbDwvY29kZT4gd2hpY2ggaW5kaWNhdGVzIHRoYXQgbm8gYWRkaXRpb25hbCBwcm9wZXJ0eSBmaWxlcworCSAqIHdpbGwgYmUgZGVmaW5lZC4gRm9ybWF0IGlzIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Rpbmcgb2YgcHJvcGVydHkgZmlsZXMuCisJICogCisJICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayBJQW50TGF1bmNoQ29uc3RhbnRzI0FUVFJfQU5UX1BST1BFUlRZX0ZJTEVTfQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQU5UX1BST1BFUlRZX0ZJTEVTID0gSUFudExhdW5jaENvbnN0YW50cy5BVFRSX0FOVF9QUk9QRVJUWV9GSUxFUzsKKwkKKwkvKioKKwkgKiBCb29sZWFuIGF0dHJpYnV0ZSBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IGludGVybmFsIHRhcmdldHMgKHRhcmdldHMgd2l0aCBubworCSAqIGRlc2NyaXB0aW9uKSBzaG91bGQgYmUgaGlkZGVuIGZyb20gdGhlIHVzZXIgaW4gdGhlIGxhdW5jaCBjb25maWd1cmF0aW9uIGRpYWxvZy4KKwkgKiBEZWZhdWx0IHZhbHVlIGlzIDxjb2RlPmZhbHNlPC9jb2RlPiB3aGljaCBpbmRpY2F0ZXMgdGhhdCBhbGwgdGFyZ2V0cyB3aWxsIGJlCisJICogZGlzcGxheWVkLgorCSAqIAorCSAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgSUFudExhdW5jaENvbnN0YW50cyNBVFRSX0hJREVfSU5URVJOQUxfVEFSR0VUU30KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0hJREVfSU5URVJOQUxfVEFSR0VUUyA9IElBbnRMYXVuY2hDb25zdGFudHMuQVRUUl9ISURFX0lOVEVSTkFMX1RBUkdFVFM7CisJCisJLyoqCisJICogSW50ZWdlciBhdHRyaWJ1dGUgaW5kaWNhdGluZyB3aGljaCBjb2x1bW4gdGFyZ2V0cyBzaG91bGQgYmUgc29ydGVkIG9uLiBBCisJICogdmFsdWUgb2YgMCBpbmRpY2F0ZXMgdGFyZ2V0IG5hbWUsIDEgaW5kaWNhdGVzIHRhcmdldCBkZXNjcmlwdGlvbiwgYW5kIC0xCisJICogaW5kaWNhdGVzIG5vIHNvcnQuIERlZmF1bHQgdmFsdWUgaXMgLTEuCisJICogCisJICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayBJQW50TGF1bmNoQ29uc3RhbnRzI0FUVFJfU09SVF9UQVJHRVRTfQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfU09SVF9UQVJHRVRTID0gSUFudExhdW5jaENvbnN0YW50cy5BVFRSX1NPUlRfVEFSR0VUUzsKKworCS8qKgorCSAqIEJvb2xlYW4gYXR0cmlidXRlIGluZGljYXRpbmcgaWYgdGhlIGRlZmF1bHQgVk0gaW5zdGFsbCBzaG91bGQgYmUgdXNlZCBmb3IgdGhlIHNlcGFyYXRlIEpSRSBidWlsZAorCSAqIERlZmF1bHQgdmFsdWUgaXMgPGNvZGU+ZmFsc2U8L2NvZGU+IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQorCSAqIAorCSAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgSUFudExhdW5jaENvbnN0YW50cyNBVFRSX0RFRkFVTFRfVk1fSU5TVEFMTH0KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0RFRkFVTFRfVk1fSU5TVEFMTCA9IElBbnRMYXVuY2hDb25zdGFudHMuQVRUUl9ERUZBVUxUX1ZNX0lOU1RBTEw7CisKKwkvKioKKwkgKiBJZGVudGlmaWVyIGZvciBBbnQgcHJvY2Vzc2VzICh2YWx1ZSA8Y29kZT5vcmcuZWNsaXBzZS5hbnQudWkuYW50UHJvY2VzczwvY29kZT4pLiBUaGlzIGlkZW50aWZpZXIgaXMKKwkgKiBzZXQgYXMgdGhlIHZhbHVlIGZvciB0aGUgPGNvZGU+SVByb2Nlc3MuQVRUUl9QUk9DRVNTX1RZUEU8L2NvZGU+CisJICogYXR0cmlidXRlIGluIHByb2Nlc3NlcyBjcmVhdGVkIGJ5IHRoZSBBbnQgbGF1bmNoIGRlbGVnYXRlLgorCSAqIAorCSAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgSUFudExhdW5jaENvbnN0YW50cyNJRF9BTlRfUFJPQ0VTU19UWVBFfQorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0FOVF9QUk9DRVNTX1RZUEUgPSBJQW50TGF1bmNoQ29uc3RhbnRzLklEX0FOVF9QUk9DRVNTX1RZUEU7Cit9CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC91aS9sYXVuY2hpbmcvcGFja2FnZS5odG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvdWkvbGF1bmNoaW5nL3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWZkNDg0Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvdWkvbGF1bmNoaW5nL3BhY2thZ2UuaHRtbApAQCAtMCwwICsxLDEzIEBACis8IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgorPGh0bWw+Cis8aGVhZD4KKyAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgorICAgPHRpdGxlPlBhY2thZ2UtbGV2ZWwgSmF2YWRvYzwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keT4KK1Byb3ZpZGVzIHN1cHBvcnQgZm9yIEFudCBsYXVuY2hpbmcuCis8aDI+CitQYWNrYWdlIFNwZWNpZmljYXRpb248L2gyPgorVGhpcyBwYWNrYWdlIGRlZmluZXMgY29uc3RhbnRzIGZvciBBbnQgbGF1bmNoIGNvbmZpZ3VyYXRpb24gYXR0cmlidXRlcy4gCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL1JlbW90ZSBBbnQgU3VwcG9ydC9NRVRBLUlORi9lY2xpcHNlLmluZiBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvUmVtb3RlIEFudCBTdXBwb3J0L01FVEEtSU5GL2VjbGlwc2UuaW5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ZGYzYWIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL1JlbW90ZSBBbnQgU3VwcG9ydC9NRVRBLUlORi9lY2xpcHNlLmluZgpAQCAtMCwwICsxIEBACitqYXJwcm9jZXNzb3IuZXhjbHVkZS5zaWduPXRydWUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL1JlbW90ZSBBbnQgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvYW50c3VwcG9ydC9pbnB1dGhhbmRsZXIvUHJveHlJbnB1dEhhbmRsZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvUmVtb3RlIEFudCBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9hbnRzdXBwb3J0L2lucHV0aGFuZGxlci9Qcm94eUlucHV0SGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ZTA2YzMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL1JlbW90ZSBBbnQgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvYW50c3VwcG9ydC9pbnB1dGhhbmRsZXIvUHJveHlJbnB1dEhhbmRsZXIuamF2YQpAQCAtMCwwICsxLDI2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmFudHN1cHBvcnQuaW5wdXRoYW5kbGVyOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuaW5wdXQuSW5wdXRIYW5kbGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LmlucHV0LklucHV0UmVxdWVzdDsKKworcHVibGljIGNsYXNzIFByb3h5SW5wdXRIYW5kbGVyIGltcGxlbWVudHMgSW5wdXRIYW5kbGVyIHsKKwkKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5pbnB1dC5JbnB1dEhhbmRsZXIjaGFuZGxlSW5wdXQob3JnLmFwYWNoZS50b29scy5hbnQuaW5wdXQuSW5wdXRSZXF1ZXN0KQorCSAqLworCXB1YmxpYyB2b2lkIGhhbmRsZUlucHV0KElucHV0UmVxdWVzdCByZXF1ZXN0KSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworCQluZXcgU1dUSW5wdXRIYW5kbGVyKCkuaGFuZGxlSW5wdXQocmVxdWVzdCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9SZW1vdGUgQW50IFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2FudHN1cHBvcnQvaW5wdXRoYW5kbGVyL1JlbW90ZUFudE1lc3NhZ2VzLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL1JlbW90ZSBBbnQgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvYW50c3VwcG9ydC9pbnB1dGhhbmRsZXIvUmVtb3RlQW50TWVzc2FnZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjMyNDU4Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9SZW1vdGUgQW50IFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2FudHN1cHBvcnQvaW5wdXRoYW5kbGVyL1JlbW90ZUFudE1lc3NhZ2VzLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5hbnRzdXBwb3J0LmlucHV0aGFuZGxlcjsKKworCitpbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7CisKK3B1YmxpYyBjbGFzcyBSZW1vdGVBbnRNZXNzYWdlcyB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmFudHN1cHBvcnQuaW5wdXRoYW5kbGVyLlJlbW90ZUFudE1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAorCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzb3VyY2VCdW5kbGUgUkVTT1VSQ0VfQlVORExFID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKEJVTkRMRV9OQU1FKTsKKworCXByaXZhdGUgUmVtb3RlQW50TWVzc2FnZXMoKSB7CisJfQorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKKwkJdHJ5IHsKKwkJCXJldHVybiBSRVNPVVJDRV9CVU5ETEUuZ2V0U3RyaW5nKGtleSk7CisJCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm4gJyEnICsga2V5ICsgJyEnOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9SZW1vdGUgQW50IFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2FudHN1cHBvcnQvaW5wdXRoYW5kbGVyL1JlbW90ZUFudE1lc3NhZ2VzLnByb3BlcnRpZXMgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL1JlbW90ZSBBbnQgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvYW50c3VwcG9ydC9pbnB1dGhhbmRsZXIvUmVtb3RlQW50TWVzc2FnZXMucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDIyZTY5Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9SZW1vdGUgQW50IFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2FudHN1cHBvcnQvaW5wdXRoYW5kbGVyL1JlbW90ZUFudE1lc3NhZ2VzLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxNyBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisjIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjCisjIENvbnRyaWJ1dG9yczoKKyMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitTV1RJbnB1dEhhbmRsZXIuMD1VbmFibGUgdG8gcmVzcG9uZCB0byBpbnB1dCByZXF1ZXN0IGFzIGEgcmVzdWx0IG9mIHRoZSB1c2VyIHNwZWNpZmllZCAtbm9pbnB1dCBjb21tYW5kCitTV1RJbnB1dEhhbmRsZXIuMT1BbnQgSW5wdXQgUmVxdWVzdAorU1dUSW5wdXRIYW5kbGVyLjI9VW5hYmxlIHRvIHJlc3BvbmQgdG8gPGlucHV0PiByZXF1ZXN0CitTV1RJbnB1dEhhbmRsZXIuMz1JbnB1dCBkb2VzIG5vdCBtYXRjaCB2YWxpZGFyZ3MgYXR0cmlidXRlCitTV1RJbnB1dEhhbmRsZXIuND1PSworU1dUSW5wdXRIYW5kbGVyLjU9Q2FuY2VsCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL1JlbW90ZSBBbnQgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvYW50c3VwcG9ydC9pbnB1dGhhbmRsZXIvU1dUSW5wdXRIYW5kbGVyLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL1JlbW90ZSBBbnQgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvYW50c3VwcG9ydC9pbnB1dGhhbmRsZXIvU1dUSW5wdXRIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI3N2YxMwotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvUmVtb3RlIEFudCBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9hbnRzdXBwb3J0L2lucHV0aGFuZGxlci9TV1RJbnB1dEhhbmRsZXIuamF2YQpAQCAtMCwwICsxLDI1MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogICAgIEJyb2NrIEphbmljemFrIChicm9ja2pAdHBnLmNvbS5hdSkgLSBCdWcgMTQ1NzM2CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuYW50c3VwcG9ydC5pbnB1dGhhbmRsZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5pbnB1dC5EZWZhdWx0SW5wdXRIYW5kbGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LmlucHV0LklucHV0UmVxdWVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5pbnB1dC5NdWx0aXBsZUNob2ljZUlucHV0UmVxdWVzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udE1ldHJpY3M7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OworCitwdWJsaWMgY2xhc3MgU1dUSW5wdXRIYW5kbGVyIGV4dGVuZHMgRGVmYXVsdElucHV0SGFuZGxlciB7CisJCisJcHJpdmF0ZSBUZXh0IGZUZXh0OworCXByaXZhdGUgQ29tYm8gZkNvbWJvOworCXByaXZhdGUgVGV4dCBmRXJyb3JNZXNzYWdlVGV4dDsKKwlwcml2YXRlIEJ1dHRvbiBmT2tCdXR0b247CisJcHJpdmF0ZSBTaGVsbCBmRGlhbG9nOworCXByaXZhdGUgRm9udE1ldHJpY3MgZkZvbnRNZXRyaWNzOworCXByb3RlY3RlZCBJbnB1dFJlcXVlc3QgZlJlcXVlc3Q7CisgICAgcHJpdmF0ZSBib29sZWFuIGZGaXJzdFZhbGlkYXRpb249IHRydWU7CisJCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuaW5wdXQuSW5wdXRIYW5kbGVyI2hhbmRsZUlucHV0KG9yZy5hcGFjaGUudG9vbHMuYW50LmlucHV0LklucHV0UmVxdWVzdCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBoYW5kbGVJbnB1dChJbnB1dFJlcXVlc3QgcmVxdWVzdCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKwkJaWYgKFN5c3RlbS5nZXRQcm9wZXJ0eSgiZWNsaXBzZS5hbnQubm9JbnB1dCIpICE9IG51bGwpIHsgLy8kTk9OLU5MUy0xJAorCQkJdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKFJlbW90ZUFudE1lc3NhZ2VzLmdldFN0cmluZygiU1dUSW5wdXRIYW5kbGVyLjAiKSk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlmRmlyc3RWYWxpZGF0aW9uPSB0cnVlOworCQlmUmVxdWVzdD0gcmVxdWVzdDsKKwkJQnVpbGRFeGNlcHRpb25bXSBwcm9ibGVtPSBuZXcgQnVpbGRFeGNlcHRpb25bMV07CisJCVJ1bm5hYmxlIHJ1bm5hYmxlPSBnZXRIYW5kbGVJbnB1dFJ1bm5hYmxlKHByb2JsZW0pOworCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhydW5uYWJsZSk7CisJCWlmIChwcm9ibGVtWzBdICE9IG51bGwpIHsKKwkJCXRocm93IHByb2JsZW1bMF07CisJCX0KKwl9CisJCisJcHJvdGVjdGVkIFJ1bm5hYmxlIGdldEhhbmRsZUlucHV0UnVubmFibGUoZmluYWwgQnVpbGRFeGNlcHRpb25bXSBwcm9ibGVtKSB7CisJCXJldHVybiBuZXcgUnVubmFibGUoKSB7CisJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJU3RyaW5nIHByb21wdDsKKwkJCQlpZiAoZlJlcXVlc3QgaW5zdGFuY2VvZiBNdWx0aXBsZUNob2ljZUlucHV0UmVxdWVzdCkgeworCQkJCQlwcm9tcHQgPSBmUmVxdWVzdC5nZXRQcm9tcHQoKTsKKwkJCQl9IGVsc2UgeworCQkJCQlwcm9tcHQgPSBnZXRQcm9tcHQoZlJlcXVlc3QpOworCQkJCX0KKwkJICAgICAgIAlTdHJpbmcgdGl0bGU9IFJlbW90ZUFudE1lc3NhZ2VzLmdldFN0cmluZygiU1dUSW5wdXRIYW5kbGVyLjEiKTsgLy8kTk9OLU5MUy0xJAorCQkgICAgICAgCWJvb2xlYW5bXSByZXN1bHQgPSBuZXcgYm9vbGVhblsxXTsKKwkJCQlvcGVuKHRpdGxlLCBwcm9tcHQsIHJlc3VsdCk7CisJCQorCQkJCWlmICghcmVzdWx0WzBdKSB7CisJCQkJCXByb2JsZW1bMF09IG5ldyBCdWlsZEV4Y2VwdGlvbihSZW1vdGVBbnRNZXNzYWdlcy5nZXRTdHJpbmcoIlNXVElucHV0SGFuZGxlci4yIikpOyAvLyROT04tTkxTLTEkCisJCQkJfQorCQkJfQorCQl9OworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBvcGVuKFN0cmluZyB0aXRsZSwgU3RyaW5nIHByb21wdCwgYm9vbGVhbltdIHJlc3VsdCkgeworCQljcmVhdGVEaWFsb2codGl0bGUsIHByb21wdCwgcmVzdWx0KTsKKwkJdmFsaWRhdGVJbnB1dCgpOworCQlmRGlhbG9nLm9wZW4oKTsKKworCQl3aGlsZSAoIWZEaWFsb2cuaXNEaXNwb3NlZCgpKSB7CisJCQlpZiAoIWZEaWFsb2cuZ2V0RGlzcGxheSgpLnJlYWRBbmREaXNwYXRjaCgpKSBmRGlhbG9nLmdldERpc3BsYXkoKS5zbGVlcCgpOworCQl9CisJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmRpc3Bvc2UoKTsKKwl9CisKKyAgICBwcml2YXRlIHZvaWQgY3JlYXRlRGlhbG9nKFN0cmluZyB0aXRsZSwgU3RyaW5nIHByb21wdCwgYm9vbGVhbltdIHJlc3VsdCkgeworICAgICAgICBEaXNwbGF5IGRpc3BsYXk9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOworCQlmRGlhbG9nID0gbmV3IFNoZWxsKGRpc3BsYXksIFNXVC5ESUFMT0dfVFJJTSB8IFNXVC5BUFBMSUNBVElPTl9NT0RBTCB8IFNXVC5SRVNJWkUpOworCQlpbml0aWFsaXplRGlhbG9nVW5pdHMoZkRpYWxvZyk7CisJCWZEaWFsb2cuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOworCQkKKwkJR3JpZERhdGEgZ2Q9IG5ldyBHcmlkRGF0YShTV1QuRklMTCk7CisJCWdkLmhvcml6b250YWxTcGFuPSAyOworCQlmRGlhbG9nLnNldExheW91dERhdGEoZ2QpOworCQlmRGlhbG9nLnNldFRleHQodGl0bGUpOworCQlMYWJlbCBsYWJlbD0gbmV3IExhYmVsKGZEaWFsb2csIFNXVC5XUkFQKTsKKwkJbGFiZWwuc2V0VGV4dChwcm9tcHQpOworCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkdSQUJfVkVSVElDQUwgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIpOworICAgICAgICAKKyAgICAgICAgZGF0YS53aWR0aEhpbnQgPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscygzMDApOyAvL2Zyb20gSURpYWxvZ0NvbnN0YW50cy5NSU5JTVVNX01FU1NBR0VfQVJFQV9XSURUSAorICAgICAgICBsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOworICAgICAgICBsYWJlbC5zZXRGb250KGZEaWFsb2cuZ2V0Rm9udCgpKTsKKyAgICAgICAgCisgICAgICAgIGlmIChmUmVxdWVzdCBpbnN0YW5jZW9mIE11bHRpcGxlQ2hvaWNlSW5wdXRSZXF1ZXN0KSB7CisgICAgICAgIAlmQ29tYm8gPSBuZXcgQ29tYm8oZkRpYWxvZywgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkpOworICAgICAgICAJZkNvbWJvLmFkZCgiIik7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgCWZvciAoSXRlcmF0b3IgaSA9ICgoTXVsdGlwbGVDaG9pY2VJbnB1dFJlcXVlc3QpZlJlcXVlc3QpLmdldENob2ljZXMoKS5pdGVyYXRvcigpO2kuaGFzTmV4dCgpOykgeworICAgICAgICAJCWZDb21iby5hZGQoKFN0cmluZylpLm5leHQoKSk7CisgICAgICAgIAkJZkNvbWJvLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTHwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7CisgICAgICAgIAkJZkNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJCQl2YWxpZGF0ZUlucHV0KCk7CisJCQkJCX0KKwkJCQl9KTsKKyAgICAgICAgCX0KKyAgICAgICAgfSBlbHNlIHsKKwkgICAgICAgIGZUZXh0ID0gbmV3IFRleHQoZkRpYWxvZywgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOworCSAgICAgICAgZlRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKKwkgICAgICAgIGZUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKKwkgICAgICAgICAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKKwkgICAgICAgICAgICAgICAgdmFsaWRhdGVJbnB1dCgpOworCSAgICAgICAgICAgIH0KKwkgICAgICAgIH0pOworICAgICAgICB9CisJCQorICAgIAlTdHJpbmcgdmFsdWUgPSBudWxsOworCQl0cnkgeworCQkJZlJlcXVlc3QuZ2V0Q2xhc3MoKS5nZXRNZXRob2QoImdldERlZmF1bHRWYWx1ZSIsIG5ldyBDbGFzc1swXSk7IC8vJE5PTi1OTFMtMSQKKwkJCXZhbHVlID0gZlJlcXVlc3QuZ2V0RGVmYXVsdFZhbHVlKCk7CisJCX0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKKwkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKKwkJCS8vcHJlIEFudCAxLjcuMAorCQl9CisJCQorCQlmRXJyb3JNZXNzYWdlVGV4dCA9IG5ldyBUZXh0KGZEaWFsb2csIFNXVC5SRUFEX09OTFkpOworICAgICAgICBmRXJyb3JNZXNzYWdlVGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKKyAgICAgICAgZkVycm9yTWVzc2FnZVRleHQuc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSURHRVRfQkFDS0dST1VORCkpOworICAgICAgICAKKwkJY3JlYXRlQnV0dG9uQmFyKGZEaWFsb2csIHJlc3VsdCk7CisJCQorCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJaWYgKGZDb21ibyAhPSBudWxsKSB7CisJCQkJZkNvbWJvLnNlbGVjdChmQ29tYm8uaW5kZXhPZih2YWx1ZSkpOworCQkJfSBlbHNlIHsKKwkJCQlmVGV4dC5zZXRUZXh0KHZhbHVlKTsKKwkJCQlmVGV4dC5zZWxlY3RBbGwoKTsKKwkJCX0KKwkJfQorCQlmRGlhbG9nLnBhY2soKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRFcnJvck1lc3NhZ2UoU3RyaW5nIGVycm9yTWVzc2FnZSkgeworICAgICAgICBmRXJyb3JNZXNzYWdlVGV4dC5zZXRUZXh0KGVycm9yTWVzc2FnZSA9PSBudWxsID8gIiIgOiBlcnJvck1lc3NhZ2UpOyAvLyROT04tTkxTLTEkCisgICAgICAgIGZPa0J1dHRvbi5zZXRFbmFibGVkKGVycm9yTWVzc2FnZSA9PSBudWxsKTsKKyAgICAgICAgZkVycm9yTWVzc2FnZVRleHQuZ2V0UGFyZW50KCkudXBkYXRlKCk7CisgICAgfQorICAgIAorICAgIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlSW5wdXQoKSB7CisgICAgICAgIFN0cmluZyBlcnJvck1lc3NhZ2UgPSBudWxsOworICAgICAgICBpZiAoZlJlcXVlc3QgaW5zdGFuY2VvZiBNdWx0aXBsZUNob2ljZUlucHV0UmVxdWVzdCkgeworICAgICAgICAJZlJlcXVlc3Quc2V0SW5wdXQoZkNvbWJvLmdldFRleHQoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgIAlmUmVxdWVzdC5zZXRJbnB1dChmVGV4dC5nZXRUZXh0KCkpOworICAgICAgICB9CisgICAgICAgIGlmICghZlJlcXVlc3QuaXNJbnB1dFZhbGlkKCkpIHsKKyAgICAgICAgICAgIGlmIChmRmlyc3RWYWxpZGF0aW9uKSB7CisgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlPSAiIjsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgICAgIGZGaXJzdFZhbGlkYXRpb249IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2U9IFJlbW90ZUFudE1lc3NhZ2VzLmdldFN0cmluZygiU1dUSW5wdXRIYW5kbGVyLjMiKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgfSAKKyAgICAgICB9CisgICAgICAgCisgICAgICAgIHNldEVycm9yTWVzc2FnZShlcnJvck1lc3NhZ2UpOyAKKyAgICB9CisgICAgCisgICAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQsIGJvb2xlYW5bXSByZXN1bHQpIHsKKyAgICAgICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7CisgICAgICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKKyAgICAgICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAyOyAKKyAgICAgICAgbGF5b3V0Lm1ha2VDb2x1bW5zRXF1YWxXaWR0aCA9IHRydWU7CisgICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKKyAgICAgICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUik7CisgICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOworICAgICAgICBjb21wb3NpdGUuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKKyAgICAgICAKKyAgICAgICAgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihjb21wb3NpdGUsIHJlc3VsdCk7CisgICAgICAgIHJldHVybiBjb21wb3NpdGU7CisgICAgfQorICAgIAorICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgYm9vbGVhbltdIHJlc3VsdCkgeworICAgIAlmT2tCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlBVU0gpOworCQlmT2tCdXR0b24uc2V0VGV4dChSZW1vdGVBbnRNZXNzYWdlcy5nZXRTdHJpbmcoIlNXVElucHV0SGFuZGxlci40IikpOyAvLyROT04tTkxTLTEkCisJCXNldEJ1dHRvbkxheW91dERhdGEoZk9rQnV0dG9uKTsKKwkJCisJCUJ1dHRvbiBjYW5jZWwgPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlBVU0gpOworCQljYW5jZWwuc2V0VGV4dChSZW1vdGVBbnRNZXNzYWdlcy5nZXRTdHJpbmcoIlNXVElucHV0SGFuZGxlci41IikpOyAvLyROT04tTkxTLTEkCisJCUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKKwkJCQlyZXN1bHRbMF0gPSBldmVudC53aWRnZXQgPT0gZk9rQnV0dG9uOworCQkJCWZEaWFsb2cuY2xvc2UoKTsKKwkJCX0KKwkJfTsKKwkJc2V0QnV0dG9uTGF5b3V0RGF0YShjYW5jZWwpOworCQlmT2tCdXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbGlzdGVuZXIpOworCQlmRGlhbG9nLnNldERlZmF1bHRCdXR0b24oZk9rQnV0dG9uKTsKKwkJY2FuY2VsLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIGxpc3RlbmVyKTsKKyAgICAgICAgLy9kbyB0aGlzIGhlcmUgYmVjYXVzZSBzZXR0aW5nIHRoZSB0ZXh0IHdpbGwgc2V0IGVuYWJsZW1lbnQgb24gdGhlIG9rIGJ1dHRvbgorCQlpZiAoZlJlcXVlc3QgaW5zdGFuY2VvZiBNdWx0aXBsZUNob2ljZUlucHV0UmVxdWVzdCkgeworCQkJZkNvbWJvLnNldEZvY3VzKCk7CisJCX0gZWxzZSB7CisJCQlmVGV4dC5zZXRGb2N1cygpOworCQl9CisgICAgfQorICAgIAorICAgIHByaXZhdGUgdm9pZCBzZXRCdXR0b25MYXlvdXREYXRhKEJ1dHRvbiBidXR0b24pIHsKKwkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOworCQlpbnQgd2lkdGhIaW50ID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoNjEpOyAvL2Zyb20gSURpYWxvZ0NvbnN0YW50cy5CVVRUT05fV0lEVEgKKwkJUG9pbnQgbWluU2l6ZSA9IGJ1dHRvbi5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIHRydWUpOworCQlkYXRhLndpZHRoSGludCA9IE1hdGgubWF4KHdpZHRoSGludCwgbWluU2l6ZS54KTsKKwkJYnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7CisJfQorCisJcHJpdmF0ZSBpbnQgY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoaW50IGRsdXMpIHsKKyAgICAgICAgLy8gcm91bmQgdG8gdGhlIG5lYXJlc3QgcGl4ZWwKKyAgICAgICAgcmV0dXJuIChmRm9udE1ldHJpY3MuZ2V0QXZlcmFnZUNoYXJXaWR0aCgpICogZGx1cyArIDQgLyAyKSAvIDQ7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZURpYWxvZ1VuaXRzKENvbnRyb2wgY29udHJvbCkgeworICAgICAgICAvLyBDb21wdXRlIGFuZCBzdG9yZSBhIGZvbnQgbWV0cmljCisgICAgICAgIEdDIGdjID0gbmV3IEdDKGNvbnRyb2wpOworICAgICAgICBnYy5zZXRGb250KGNvbnRyb2wuZ2V0Rm9udCgpKTsKKyAgICAgICAgZkZvbnRNZXRyaWNzID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsKKyAgICAgICAgZ2MuZGlzcG9zZSgpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2Fib3V0Lmh0bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2Fib3V0Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU5NGQwNwotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvYWJvdXQuaHRtbApAQCAtMCwwICsxLDU0IEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgorICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgorPHRpdGxlPkFib3V0PC90aXRsZT4KKzwvaGVhZD4KKzxib2R5IGxhbmc9IkVOLVVTIj4KKzxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgorIAorPHA+T2N0b2JlciA4LCAyMDA5PC9wPgkKKzxoMz5MaWNlbnNlPC9oMz4KKworPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCitpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCitFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAorYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KK0ZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CisKKzxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCitiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5CithcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCitwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKK2luZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50CithbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgorCis8aDM+VGhpcmQgUGFydHkgQ29udGVudDwvaDM+CisKKzxwPlRoZSBDb250ZW50IGluY2x1ZGVzIGl0ZW1zIHRoYXQgaGF2ZSBiZWVuIHNvdXJjZWQgZnJvbSB0aGlyZCBwYXJ0aWVzIGFzIHNldCBvdXQgYmVsb3cuIElmIHlvdSAKK2RpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgZm9sbG93aW5nIGlzIHByb3ZpZGVkIAorZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSwgYW5kIHlvdSBzaG91bGQgbG9vayB0byB0aGUgUmVkaXN0cmlidXRvciZyc3F1bztzIGxpY2Vuc2UgZm9yIAordGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdXNlLjwvcD4KKworPGg0PkFudCAxLjcuMTwvaDQ+CisKKzxwPlRoZSBmb2xsb3dpbmcgY2xhc3NlcyBpbiB0aGUgcGx1Zy1pbiBKQVIgYXJlIGJhc2VkIG9uIEFudCBjb2RlIGRldmVsb3BlZCBieSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHNoYWxsIGJlIGRlZmluZWQgYXMgdGhlICZxdW90O0FudC1EZXJpdmVkIFdvcmsmcXVvdDs6PC9wPgorCis8dWw+CisJPGxpPm9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IudXRpbHMuUHJvamVjdEhlbHBlcjwvbGk+Cis8L3VsPgorCis8cD5UaGUgb2JqZWN0IGNvZGUgZm9yIFByb2plY3RIZWxwZXIgaXMgbG9jYXRlZAoraW4gdGhlIHBsdWctaW4gSkFSIGFuZCB0aGUgc291cmNlIGNvZGUgaXMgbG9jYXRlZCBpbiBzcmMuemlwLjwvcD4KKworPHA+WW91ciB1c2Ugb2YgdGhlIEFudC1EZXJpdmVkIFdvcmsgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMC4gIEEgY29weSBvZiB0aGUgbGljZW5zZSBpcyBjb250YWluZWQKK2luIHRoZSBmaWxlIDxhIGhyZWY9ImFib3V0X2ZpbGVzL2FzbC12MjAudHh0IiB0YXJnZXQ9Il9ibGFuayI+YWJvdXRfZmlsZXMvYXNsLXYyMC50eHQ8L2E+IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCAKKzxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC5odG1sIiB0YXJnZXQ9Il9ibGFuayI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLmh0bWw8L2E+LjwvcD4KKworPHA+VGhlIG5hbWVzICZxdW90O0FudCZxdW90OyBhbmQgICZxdW90O0FwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uJnF1b3Q7IG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIAorc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uICBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCA8YSBocmVmPSJtYWlsdG86YXBhY2hlQGFwYWNoZS5vcmciPmFwYWNoZUBhcGFjaGUub3JnPC9hPi48L3A+CisKKzxwPlRoZSBBcGFjaGUgYXR0cmlidXRpb24gPGEgaHJlZj0iYWJvdXRfZmlsZXMvTk9USUNFIiB0YXJnZXQ9Il9ibGFuayI+Tk9USUNFPC9hPiBmaWxlIGlzIGluY2x1ZGVkIHdpdGggdGhlIENvbnRlbnQgaW4gYWNjb3JkYW5jZSB3aXRoIDRkIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuPC9wPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvYWJvdXRfZmlsZXMvTk9USUNFIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9hYm91dF9maWxlcy9OT1RJQ0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZiNmRkZQotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvYWJvdXRfZmlsZXMvTk9USUNFCkBAIC0wLDAgKzEsMTUgQEAKKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgID09ICBOT1RJQ0UgZmlsZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzZWN0aW9uIDQgZCBvZiAgICAgICAgICAgICAgICAgICAgPT0KKyAgID09ICB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0KKyAgID09ICBpbiB0aGlzIGNhc2UgZm9yIHRoZSBBcGFjaGUgQW50IGRpc3RyaWJ1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgPT0KKyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQorICAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4KKworICAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGFsc28gc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IDoKKyAgICAgLSB0aGUgVzNDIGNvbnNvcnRpdW0gKGh0dHA6Ly93d3cudzNjLm9yZykgLAorICAgICAtIHRoZSBTQVggcHJvamVjdCAoaHR0cDovL3d3dy5zYXhwcm9qZWN0Lm9yZykKKworICAgUGxlYXNlIHJlYWQgdGhlIGRpZmZlcmVudCBMSUNFTlNFIGZpbGVzIHByZXNlbnQgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mCisgICB0aGlzIGRpc3RyaWJ1dGlvbi4KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvYWJvdXRfZmlsZXMvYXNsLXYyMC50eHQgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2Fib3V0X2ZpbGVzL2FzbC12MjAudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2NDU2OTUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2Fib3V0X2ZpbGVzL2FzbC12MjAudHh0CkBAIC0wLDAgKzEsMjAyIEBACisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0CisgICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCisKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgorCisgICAxLiBEZWZpbml0aW9ucy4KKworICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKKyAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgorCisgICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQorICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCisgICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCisgICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAorICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCisgICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgorICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCisgICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgorCisgICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgorCisgICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKKyAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KKyAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisKKyAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCisgICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CisgICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCisgICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCisKKyAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCisgICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCisgICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKKyAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCisKKyAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKKyAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKKyAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKKyAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCisgICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KKyAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKKyAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCisKKyAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCisgICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCisgICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKKyAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKKyAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgorICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCisgICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50CisgICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bworICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKKyAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCisgICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKKyAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCisgICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKKworICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAorICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCisKKyAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAorICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCisgICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgorCisgICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKKyAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAorICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKKyAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCisgICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCisgICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQorICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKKyAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKKyAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0CisgICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCisgICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKKyAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KKworICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKKyAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAorICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKKyAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgorICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCisKKyAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKKworICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCisgICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAorICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCisgICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgorICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKKworICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCisgICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAorICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAorICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAorICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQorICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCisgICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgorICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAorICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKKyAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKKyAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCisgICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KKyAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQorICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAorICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAorICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KKworICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCisgICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCisgICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKKyAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAorICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KKworICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAorICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCisgICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCisgICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5CisgICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAorICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgorCisgICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCisgICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCisgICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKKyAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgorCisgICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKKyAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKKyAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisgICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucworICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQorICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCisgICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKKyAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KKworICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCisgICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKKyAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5CisgICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQorICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAorICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCisgICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCisgICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCisgICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAorICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgorICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgorCisgICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCisgICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAorICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKKyAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCisgICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQorICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKKyAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKKyAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQorICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgorICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCisKKyAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworCisgICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCisKKyAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCisgICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCisgICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQorICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKKyAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQorICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQorICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCisgICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCisKKyAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQorCisgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9idWlsZC5wcm9wZXJ0aWVzIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9idWlsZC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5YTVjYzQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2J1aWxkLnByb3BlcnRpZXMKQEAgLTAsMCArMSwzMyBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisjIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjCisjIENvbnRyaWJ1dG9yczoKKyMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworc291cmNlLi4gPSBBbnQgVG9vbHMgU3VwcG9ydC8sXAorICAgICAgICAgICAgICAgICAgIEFudCBFZGl0b3IvCisKK3NvdXJjZS5saWIvYW50cnVubmVyLmphciA9IEFudCBSdW5uZXIgU3VwcG9ydC8KKworc291cmNlLmxpYi9yZW1vdGVBbnQuamFyID0gUmVtb3RlIEFudCBTdXBwb3J0LworCitzcmMuaW5jbHVkZXMgPSBhYm91dC5odG1sLFwKKyAgICAgICAgICAgICAgIGFib3V0X2ZpbGVzLworCitiaW4uaW5jbHVkZXMgPSBpY29ucy8sXAorICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAorICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCisgICAgICAgICAgICAgICBhYm91dC5odG1sLFwKKyAgICAgICAgICAgICAgIHRlbXBsYXRlcy8sXAorICAgICAgICAgICAgICAgLixcCisgICAgICAgICAgICAgICBsaWIvKi5qYXIsXAorICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKKyAgICAgICAgICAgICAgIGFib3V0X2ZpbGVzLworCQkJCQoramFycy5jb21waWxlLm9yZGVyPS4sbGliL2FudHJ1bm5lci5qYXIsbGliL3JlbW90ZUFudC5qYXIKK291dHB1dC5saWIvYW50cnVubmVyLmphciA9IGFudF9ydW5uZXJfc3VwcG9ydF9iaW4vCitvdXRwdXQubGliL3JlbW90ZUFudC5qYXIgPSByZW1vdGVfc3VwcG9ydF9iaW4vCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2J1aWxkZmlsZXMvZXhwb3J0cGx1Z2luLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvYnVpbGRmaWxlcy9leHBvcnRwbHVnaW4ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExNWI5YzkKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2J1aWxkZmlsZXMvZXhwb3J0cGx1Z2luLnhtbApAQCAtMCwwICsxLDQ0IEBACis8IS0tIEV4cG9ydCBhIGphciBvZiAuY2xhc3MgZmlsZXMgZm9yIHRoZSBvcmcuZWNsaXBzZS5hbnQudWkgRWNsaXBzZSBwbHVnLWluCisgICAgIGFsb25nIHdpdGggb3RoZXIgaW1wb3J0YW50IHBsdWdpbiBmaWxlcyB0byB0aGUgInBsdWdpbi1leHBvcnQiIHN1YmRpcmVjdG9yeQorICAgICBvZiB0aGUgdGFyZ2V0IEVjbGlwc2UgaW5zdGFsbGF0aW9uIC0tPgorPHByb2plY3QgbmFtZT0iRXhwb3J0IGFudHVpIiBkZWZhdWx0PSJleHBvcnQiIGJhc2VkaXI9Ii4uIj4KKworCTwhLS0gU2V0IHRoZSB0aW1lc3RhbXAgYW5kIGltcG9ydGFudCBwcm9wZXJ0aWVzIC0tPgorCTx0YXJnZXQgbmFtZT0iaW5pdCI+CisJCTx0c3RhbXAvPgorCQk8cHJvcGVydHkgbmFtZT0iZGVzdGRpciIgdmFsdWU9Ii4uLy4uL3BsdWdpbi1leHBvcnQiIC8+CisJCTxwcm9wZXJ0eSBuYW1lPSJkZXN0IiAgdmFsdWU9IiR7ZGVzdGRpcn0vb3JnLmVjbGlwc2UuYW50LnVpXzMuMC4wIiAvPgorCTwvdGFyZ2V0PgorCisJPCEtLSBDcmVhdGUgdGhlIGphciBvZiAuY2xhc3MgZmlsZXMsIGFuZCBjb3B5IG90aGVyIGltcG9ydGFudCBmaWxlcyB0byBleHBvcnQgZGlyIC0tPgorCTx0YXJnZXQgbmFtZT0iZXhwb3J0IiBkZXBlbmRzPSJpbml0Ij4KKwkJPG1rZGlyIGRpcj0iJHtkZXN0ZGlyfSIgLz4KKwkJPGRlbGV0ZSBkaXI9IiR7ZGVzdH0iIC8+CisJCTxta2RpciBkaXI9IiR7ZGVzdH0iIC8+CisJCTxkZWxldGUgZGlyPSIke2Rlc3R9L2xpYiIvPgorCQk8bWtkaXIgZGlyPSIke2Rlc3R9L2xpYiIvPgorCQk8amFyIGRlc3RmaWxlPSIke2Rlc3R9L2FudHVpLmphciI+CisJCQk8ZmlsZXNldCBkaXI9ImJpbiI+CisJCQkJPGV4Y2x1ZGUgbmFtZT0ib3JnL2VjbGlwc2UvYW50L3VpL2ludGVybmFsL2FudHN1cHBvcnQvKiIvPgorCQkJCTxleGNsdWRlIG5hbWU9Im9yZy9lY2xpcHNlL2FudC91aS9pbnRlcm5hbC9hbnRzdXBwb3J0L2lucHV0aGFuZGxlci8qIi8+CisJCQkJPGV4Y2x1ZGUgbmFtZT0ib3JnL2VjbGlwc2UvYW50L3VpL2ludGVybmFsL2FudHN1cHBvcnQvbG9nZ2VyLyoiLz4KKwkJCTwvZmlsZXNldD4KKwkJPC9qYXI+CisJCTwhLS0gQ3JlYXRlIHRoZSBzb3VyY2UgemlwIC0tPgorCQk8emlwIGRlc3RmaWxlPSIke2Rlc3R9L2FudHVpc3JjLnppcCI+CisJCQk8ZmlsZXNldCBkaXI9IkFudCBUb29scyBTdXBwb3J0Ii8+CisJCQk8ZmlsZXNldCBkaXI9IkFudCBSdW5uZXIgU3VwcG9ydCIvPgorCQkJPGZpbGVzZXQgZGlyPSJBbnQgRWRpdG9yIi8+CisJCTwvemlwPgorCQk8Y29weSBmaWxlPSJwbHVnaW4ueG1sIiB0b2Rpcj0iJHtkZXN0fSIvPgorCQk8Y29weSBmaWxlPSJwbHVnaW4ucHJvcGVydGllcyIgdG9kaXI9IiR7ZGVzdH0iLz4KKwkJPGNvcHkgZmlsZT0iLmNsYXNzcGF0aCIgdG9kaXI9IiR7ZGVzdH0iLz4KKwkJPGNvcHkgZmlsZT0iLm9wdGlvbnMiIHRvZGlyPSIke2Rlc3R9Ii8+CisJCTxjb3B5IGZpbGU9ImxpYi9hbnRydW5uZXIuamFyIiB0b2Rpcj0iJHtkZXN0fS9saWIiLz4KKwkJPGNvcHkgZmlsZT0ibGliL3JlbW90ZUFudC5qYXIiIHRvZGlyPSIke2Rlc3R9L2xpYiIvPgorCQk8Y29weSB0b2Rpcj0iJHtkZXN0fS9pY29ucyI+CisJCQk8ZmlsZXNldCBkaXI9Imljb25zIiAvPgorCQk8L2NvcHk+CQkKKwk8L3RhcmdldD4KKwkKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9kbGNsMTYvYWRkX2NvLmdpZiBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9kbGNsMTYvYWRkX2NvLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDkyNTk4Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL2RsY2wxNi9hZGRfY28uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9kbGNsMTYvYWxwaGFfbW9kZS5naWYgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvZGxjbDE2L2FscGhhX21vZGUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxZTMxOGUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvZGxjbDE2L2FscGhhX21vZGUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9kbGNsMTYvYW50X3RhcmdldHMuZ2lmIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL2RsY2wxNi9hbnRfdGFyZ2V0cy5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFjYzJjZgotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9kbGNsMTYvYW50X3RhcmdldHMuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9kbGNsMTYvZXhwb3J0QW50X2NvLmdpZiBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9kbGNsMTYvZXhwb3J0QW50X2NvLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTJlMzY1Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL2RsY2wxNi9leHBvcnRBbnRfY28uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9kbGNsMTYvZmlsdGVyX2ltcG9ydGVkX2VsZW1lbnRzLmdpZiBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9kbGNsMTYvZmlsdGVyX2ltcG9ydGVkX2VsZW1lbnRzLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTcxNzIxCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL2RsY2wxNi9maWx0ZXJfaW1wb3J0ZWRfZWxlbWVudHMuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9kbGNsMTYvZmlsdGVyX2ludGVybmFsX3RhcmdldHMuZ2lmIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL2RsY2wxNi9maWx0ZXJfaW50ZXJuYWxfdGFyZ2V0cy5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdkYTgxZQotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9kbGNsMTYvZmlsdGVyX2ludGVybmFsX3RhcmdldHMuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9kbGNsMTYvZmlsdGVyX3Byb3BlcnRpZXMuZ2lmIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL2RsY2wxNi9maWx0ZXJfcHJvcGVydGllcy5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q5ZWU4NAotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9kbGNsMTYvZmlsdGVyX3Byb3BlcnRpZXMuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9kbGNsMTYvZmlsdGVyX3RvcF9sZXZlbC5naWYgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvZGxjbDE2L2ZpbHRlcl90b3BfbGV2ZWwuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjMWNlMTUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvZGxjbDE2L2ZpbHRlcl90b3BfbGV2ZWwuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9kbGNsMTYvcHJvcGVydGllcy5naWYgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvZGxjbDE2L3Byb3BlcnRpZXMuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmYmY5ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvZGxjbDE2L3Byb3BlcnRpZXMuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9kbGNsMTYvcmVmcmVzaC5naWYgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvZGxjbDE2L3JlZnJlc2guZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0YTFkMzgKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvZGxjbDE2L3JlZnJlc2guZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9kbGNsMTYvcmVtb3ZlX2NvLmdpZiBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9kbGNsMTYvcmVtb3ZlX2NvLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTllNDYyCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL2RsY2wxNi9yZW1vdmVfY28uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9kbGNsMTYvcmVtb3ZlYWxsX2NvLmdpZiBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9kbGNsMTYvcmVtb3ZlYWxsX2NvLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2QxYmU1Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL2RsY2wxNi9yZW1vdmVhbGxfY28uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9kbGNsMTYvcnVuX3Rvb2wuZ2lmIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL2RsY2wxNi9ydW5fdG9vbC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI1MmJmMAotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9kbGNsMTYvcnVuX3Rvb2wuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9kbGNsMTYvc2VhcmNoLmdpZiBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9kbGNsMTYvc2VhcmNoLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjQ2YTYzCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL2RsY2wxNi9zZWFyY2guZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9kbGNsMTYvc3luY2VkLmdpZiBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9kbGNsMTYvc3luY2VkLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjZlNDNhCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL2RsY2wxNi9zeW5jZWQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9kdG9vbDE2L21hcmtfb2NjdXJyZW5jZXMuZ2lmIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL2R0b29sMTYvbWFya19vY2N1cnJlbmNlcy5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFmNGQzYgotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9kdG9vbDE2L21hcmtfb2NjdXJyZW5jZXMuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9kdG9vbDE2L3NlZ21lbnRfZWRpdC5naWYgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9zZWdtZW50X2VkaXQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzZGEwZjAKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9zZWdtZW50X2VkaXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9lbGNsMTYvYWRkX2NvLmdpZiBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9lbGNsMTYvYWRkX2NvLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTJlYjg4Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL2VsY2wxNi9hZGRfY28uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9lbGNsMTYvYWxwaGFfbW9kZS5naWYgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvZWxjbDE2L2FscGhhX21vZGUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwN2QzNGYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvZWxjbDE2L2FscGhhX21vZGUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9lbGNsMTYvYW50X3RhcmdldHMuZ2lmIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL2VsY2wxNi9hbnRfdGFyZ2V0cy5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RiMDQwMgotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9lbGNsMTYvYW50X3RhcmdldHMuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9lbGNsMTYvZXhwb3J0QW50X2NvLmdpZiBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9lbGNsMTYvZXhwb3J0QW50X2NvLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjQzYTM1Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL2VsY2wxNi9leHBvcnRBbnRfY28uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9lbGNsMTYvZmlsdGVyX2ltcG9ydGVkX2VsZW1lbnRzLmdpZiBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9lbGNsMTYvZmlsdGVyX2ltcG9ydGVkX2VsZW1lbnRzLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTdmOGE5Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL2VsY2wxNi9maWx0ZXJfaW1wb3J0ZWRfZWxlbWVudHMuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9lbGNsMTYvZmlsdGVyX2ludGVybmFsX3RhcmdldHMuZ2lmIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL2VsY2wxNi9maWx0ZXJfaW50ZXJuYWxfdGFyZ2V0cy5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU3Mzg3YwotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9lbGNsMTYvZmlsdGVyX2ludGVybmFsX3RhcmdldHMuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9lbGNsMTYvZmlsdGVyX3Byb3BlcnRpZXMuZ2lmIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL2VsY2wxNi9maWx0ZXJfcHJvcGVydGllcy5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y0NmNmMAotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9lbGNsMTYvZmlsdGVyX3Byb3BlcnRpZXMuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9lbGNsMTYvZmlsdGVyX3RvcF9sZXZlbC5naWYgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvZWxjbDE2L2ZpbHRlcl90b3BfbGV2ZWwuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1OGUwODIKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvZWxjbDE2L2ZpbHRlcl90b3BfbGV2ZWwuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9lbGNsMTYvcHJvcGVydGllcy5naWYgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvZWxjbDE2L3Byb3BlcnRpZXMuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyMjNjZmMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvZWxjbDE2L3Byb3BlcnRpZXMuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9lbGNsMTYvcmVmcmVzaC5naWYgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvZWxjbDE2L3JlZnJlc2guZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjYTA0ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvZWxjbDE2L3JlZnJlc2guZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9lbGNsMTYvcmVtb3ZlX2NvLmdpZiBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9lbGNsMTYvcmVtb3ZlX2NvLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2Q5YzU0Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL2VsY2wxNi9yZW1vdmVfY28uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9lbGNsMTYvcmVtb3ZlYWxsX2NvLmdpZiBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9lbGNsMTYvcmVtb3ZlYWxsX2NvLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGEzNzg1Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL2VsY2wxNi9yZW1vdmVhbGxfY28uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9lbGNsMTYvcnVuX3Rvb2wuZ2lmIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL2VsY2wxNi9ydW5fdG9vbC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdmNDEwMgotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9lbGNsMTYvcnVuX3Rvb2wuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9lbGNsMTYvc2VhcmNoLmdpZiBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9lbGNsMTYvc2VhcmNoLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTQwYTAxCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL2VsY2wxNi9zZWFyY2guZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9lbGNsMTYvc3luY2VkLmdpZiBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9lbGNsMTYvc3luY2VkLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzA5MzRiCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL2VsY2wxNi9zeW5jZWQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9ldG9vbDE2L21hcmtfb2NjdXJyZW5jZXMuZ2lmIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL2V0b29sMTYvbWFya19vY2N1cnJlbmNlcy5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ3YzE3NQotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9ldG9vbDE2L21hcmtfb2NjdXJyZW5jZXMuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9ldG9vbDE2L3NlZ21lbnRfZWRpdC5naWYgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9zZWdtZW50X2VkaXQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjYzVmYjYKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9zZWdtZW50X2VkaXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9ldmlldzE2L2FudF92aWV3LmdpZiBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9ldmlldzE2L2FudF92aWV3LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGQ5NTY0Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL2V2aWV3MTYvYW50X3ZpZXcuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9vYmoxNi9hbnQuZ2lmIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL29iajE2L2FudC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc5OTU0MgotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9vYmoxNi9hbnQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9vYmoxNi9hbnRfYnVpbGRmaWxlLmdpZiBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9vYmoxNi9hbnRfYnVpbGRmaWxlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGYzNDY5Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL29iajE2L2FudF9idWlsZGZpbGUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9vYmoxNi9hbnRfdGFyZ2V0X2Vyci5naWYgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvb2JqMTYvYW50X3RhcmdldF9lcnIuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiYzYwNjgKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvb2JqMTYvYW50X3RhcmdldF9lcnIuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9vYmoxNi9jbGFzc3BhdGguZ2lmIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL29iajE2L2NsYXNzcGF0aC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJmYzQxYQotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9vYmoxNi9jbGFzc3BhdGguZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9vYmoxNi9kZWZhdWx0dGFyZ2V0X29iai5naWYgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvb2JqMTYvZGVmYXVsdHRhcmdldF9vYmouZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiY2YyZjgKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvb2JqMTYvZGVmYXVsdHRhcmdldF9vYmouZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9vYmoxNi9lY2xpcHNlX29iai5naWYgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvb2JqMTYvZWNsaXBzZV9vYmouZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViN2I5MGMKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvb2JqMTYvZWNsaXBzZV9vYmouZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9vYmoxNi9pbXBvcnRfb2JqLmdpZiBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9vYmoxNi9pbXBvcnRfb2JqLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGU5MTMwCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL29iajE2L2ltcG9ydF9vYmouZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9vYmoxNi9tYWNyb2RlZl9vYmouZ2lmIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL29iajE2L21hY3JvZGVmX29iai5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc1M2I5NgotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9vYmoxNi9tYWNyb2RlZl9vYmouZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9vYmoxNi9tYWluX3RhYi5naWYgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvb2JqMTYvbWFpbl90YWIuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliOWY3OWEKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvb2JqMTYvbWFpbl90YWIuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9vYmoxNi9uZXdfYW50X3Byb2plY3QuZ2lmIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL29iajE2L25ld19hbnRfcHJvamVjdC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc3ZDEzYgotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9vYmoxNi9uZXdfYW50X3Byb2plY3QuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9vYmoxNi9wcm9wX3BzLmdpZiBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9vYmoxNi9wcm9wX3BzLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjIzY2ZjCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL29iajE2L3Byb3BfcHMuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9vYmoxNi9wcm9wZXJ0eV9vYmouZ2lmIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL29iajE2L3Byb3BlcnR5X29iai5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgyNzdjZgotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9vYmoxNi9wcm9wZXJ0eV9vYmouZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9vYmoxNi90YXJnZXRpbnRlcm5hbF9vYmouZ2lmIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL29iajE2L3RhcmdldGludGVybmFsX29iai5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGExYTE2NgotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9vYmoxNi90YXJnZXRpbnRlcm5hbF9vYmouZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9vYmoxNi90YXJnZXRwdWJsaWNfb2JqLmdpZiBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9vYmoxNi90YXJnZXRwdWJsaWNfb2JqLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDZhOTAzCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL29iajE2L3RhcmdldHB1YmxpY19vYmouZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9vYmoxNi90YXNrX29iai5naWYgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFza19vYmouZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5MTRlZDcKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFza19vYmouZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9vYmoxNi90YXNrZGVmX29iai5naWYgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFza2RlZl9vYmouZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwN2QxZjQKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFza2RlZl9vYmouZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9vYmoxNi90ZW1wbGF0ZV9vYmouZ2lmIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL29iajE2L3RlbXBsYXRlX29iai5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRkZTVmYgotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9vYmoxNi90ZW1wbGF0ZV9vYmouZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9vYmoxNi90eXBlLmdpZiBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9vYmoxNi90eXBlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmE1OGM1Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL29iajE2L3R5cGUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9vdnIxNi9lcnJvcl9jby5naWYgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvb3ZyMTYvZXJyb3JfY28uZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExOWRjY2MKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvb3ZyMTYvZXJyb3JfY28uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9vdnIxNi9pbXBvcnRfY28uZ2lmIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL292cjE2L2ltcG9ydF9jby5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBhMjRiMgotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9vdnIxNi9pbXBvcnRfY28uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9vdnIxNi93YXJuaW5nX2NvLmdpZiBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9vdnIxNi93YXJuaW5nX2NvLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTJkYWM0Ci0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL292cjE2L3dhcm5pbmdfY28uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC93aXpiYW4vYW50X3dpei5wbmcgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvd2l6YmFuL2FudF93aXoucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4N2E3NzUKLS0tIC9kZXYvbnVsbAorKysgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvd2l6YmFuL2FudF93aXoucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC93aXpiYW4vZXhwb3J0X2FudF93aXoucG5nIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL3dpemJhbi9leHBvcnRfYW50X3dpei5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE0MmJkOAotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC93aXpiYW4vZXhwb3J0X2FudF93aXoucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvdGVtcGxhdGVzL2FudC5wcm9wZXJ0aWVzIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS90ZW1wbGF0ZXMvYW50LnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdiM2E4ZgotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvdGVtcGxhdGVzL2FudC5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMjggQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisjIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorIyAKKyMgQ29udHJpYnV0b3JzOgorIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2ZpbGVzZXRUZW1wbGF0ZTEuZGVzY3JpcHRpb249IGZpbGVzZXQgdHlwZSB3aXRoIGluY2x1ZGUgY2xhdXNlCit0YXJnZXRUZW1wbGF0ZTEuZGVzY3JpcHRpb249IHB1YmxpYyB0YXJnZXQKK3RhcmdldFRlbXBsYXRlMi5kZXNjcmlwdGlvbj0gcHJpdmF0ZSB0YXJnZXQKK3Byb3BlcnR5VGVtcGxhdGUxLmRlc2NyaXB0aW9uPSBwcm9wZXJ0eSB3aXRoIG5hbWUgYW5kIGxvY2F0aW9uCitwcm9wZXJ0eVRlbXBsYXRlMi5kZXNjcmlwdGlvbj0gcHJvcGVydHkgd2l0aCBuYW1lIGFuZCB2YWx1ZQorbWFjcm9kZWZUZW1wbGF0ZS5kZXNjcmlwdGlvbj0gbWFjcm9kZWYgd2l0aCBhIHNpbmdsZSBhdHRyaWJ1dGUKK2RlbGV0ZVRlbXBsYXRlMS5kZXNjcmlwdGlvbj0gZGVsZXRlIGZpbGVzIGluIGEgZmlsZXNldAorZGVsZXRlVGVtcGxhdGUyLmRlc2NyaXB0aW9uPSBkZWxldGUgZmlsZXMgaW4gYSByZWZlcmVuY2VkIGZpbGVzZXQKKworamF2YWNUZW1wbGF0ZTEuZGVzY3JpcHRpb249IGFkZCBhIGphdmFjIHRhc2sKK2J1aWxkRmlsZVRlbXBsYXRlMS5uYW1lPSBCdWlsZGZpbGUgdGVtcGxhdGUKK2J1aWxkRmlsZVRlbXBsYXRlMS5kZXNjcmlwdGlvbj0gc2ltcGxlIGJ1aWxkZmlsZSB3aXRoIHR3byB0YXJnZXRzCisKK2FudENvbW1lbnQubmFtZT0gY29tbWVudAorYW50Q29tbWVudC5kZXNjcmlwdGlvbj0gY29tbWVudHMgdGhlIHNlbGVjdGVkIHdvcmQKK2FudExpbmVDb21tZW50Lm5hbWU9IGNvbW1lbnQgbGluZQorYW50TGluZUNvbW1lbnQuZGVzY3JpcHRpb249IGNvbW1lbnRzIHRoZSBzZWxlY3RlZCBsaW5lClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS90ZW1wbGF0ZXMvYW50LnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvdGVtcGxhdGVzL2FudC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU3OTAzMAotLS0gL2Rldi9udWxsCisrKyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvdGVtcGxhdGVzL2FudC54bWwKQEAgLTAsMCArMSwxNjcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+CisKKzwhLS0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogICAgIE1hcnRpbiBLYXJwaXNlayAobWFydGluLmthcnBpc2VrQGdtYWlsLmNvbSkgLSBidWcgMTk5MDE0CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gCistLT4KKworPHRlbXBsYXRlcz4KKworPHRlbXBsYXRlIAorCWNvbnRleHQ9Im9yZy5lY2xpcHNlLmFudC51aS50ZW1wbGF0ZUNvbnRleHRUeXBlLnRhc2siIAorCWRlc2NyaXB0aW9uPSIlamF2YWNUZW1wbGF0ZTEuZGVzY3JpcHRpb24iIAorCWlkPSJvcmcuZWNsaXBzZS5hbnQudWkudGVtcGxhdGVzLmphdmFjMSIgCisJbmFtZT0iamF2YWMiPiZsdDtqYXZhYyBzcmNkaXI9JnF1b3Q7JHtzcmN9JnF1b3Q7CisgICAgICAgICBkZXN0ZGlyPSZxdW90OyR7ZHN0fSZxdW90OworICAgICAgICAgY2xhc3NwYXRoPSZxdW90OyR7amFyZmlsZX0mcXVvdDsKKyAgICAgICAgIGRlYnVnPSZxdW90OyR7b259JnF1b3Q7CisJLyZndDske2N1cnNvcn08L3RlbXBsYXRlPgorCis8dGVtcGxhdGUgCisJY29udGV4dD0ib3JnLmVjbGlwc2UuYW50LnVpLnRlbXBsYXRlQ29udGV4dFR5cGUudGFzayIgCisJZGVzY3JpcHRpb249IiVmaWxlc2V0VGVtcGxhdGUxLmRlc2NyaXB0aW9uIiAKKwlpZD0ib3JnLmVjbGlwc2UuYW50LnVpLnRlbXBsYXRlcy5maWxlc2V0MSIgCisJbmFtZT0iZmlsZXNldCI+PCFbQ0RBVEFbPGZpbGVzZXQgZGlyPSIke2Rpcn0iIGlkPSIke2lkfSI+CisgICAgPGluY2x1ZGUgbmFtZT0iJHtpbmNsdWRlfSIvPgorICAgIDxleGNsdWRlIG5hbWU9IiR7ZXhjbHVkZX0iLz4KKzwvZmlsZXNldD4KKyR7Y3Vyc29yfV1dPjwvdGVtcGxhdGU+CisKKzx0ZW1wbGF0ZSAKKyAgICBjb250ZXh0PSJvcmcuZWNsaXBzZS5hbnQudWkudGVtcGxhdGVDb250ZXh0VHlwZS50YXNrIiAKKyAgICBkZXNjcmlwdGlvbj0iJWRlbGV0ZVRlbXBsYXRlMS5kZXNjcmlwdGlvbiIgCisgICAgaWQ9Im9yZy5lY2xpcHNlLmFudC51aS50ZW1wbGF0ZXMuZGVsZXRlMSIgCisgICAgbmFtZT0iZGVsZXRlIj48IVtDREFUQVs8ZGVsZXRlPgorCTxmaWxlc2V0IGRpcj0iJHtkaXJ9Ij4KKwkgICAgPGluY2x1ZGUgbmFtZT0iJHtpbmNsdWRlfSIvPgorCSAgICA8ZXhjbHVkZSBuYW1lPSIke2V4Y2x1ZGV9Ii8+CisJPC9maWxlc2V0PgorPC9kZWxldGU+Ciske2N1cnNvcn1dXT48L3RlbXBsYXRlPgorCis8dGVtcGxhdGUgCisgICAgY29udGV4dD0ib3JnLmVjbGlwc2UuYW50LnVpLnRlbXBsYXRlQ29udGV4dFR5cGUudGFzayIgCisgICAgZGVzY3JpcHRpb249IiVkZWxldGVUZW1wbGF0ZTIuZGVzY3JpcHRpb24iIAorICAgIGlkPSJvcmcuZWNsaXBzZS5hbnQudWkudGVtcGxhdGVzLmRlbGV0ZTIiIAorICAgIG5hbWU9ImRlbGV0ZSI+PCFbQ0RBVEFbPGRlbGV0ZT4KKyAgICA8ZmlsZXNldCByZWZpZD0iJHtjdXJzb3J9Ii8+Cis8L2RlbGV0ZT5dXT4KKzwvdGVtcGxhdGU+CisKKzx0ZW1wbGF0ZSAKKyAgICBjb250ZXh0PSJvcmcuZWNsaXBzZS5hbnQudWkudGVtcGxhdGVDb250ZXh0VHlwZS50YXNrIiAKKyAgICBkZXNjcmlwdGlvbj0iJXByb3BlcnR5VGVtcGxhdGUxLmRlc2NyaXB0aW9uIiAKKyAgICBpZD0ib3JnLmVjbGlwc2UuYW50LnVpLnRlbXBsYXRlcy5wcm9wZXJ0eTEiIAorICAgIG5hbWU9InByb3BlcnR5Ij4mbHQ7cHJvcGVydHkgbmFtZT0mcXVvdDske25hbWV9JnF1b3Q7IGxvY2F0aW9uPSZxdW90OyR7bG9jYXRpb259JnF1b3Q7LyZndDsKKzwvdGVtcGxhdGU+CisKKzx0ZW1wbGF0ZSAKKyAgICBjb250ZXh0PSJvcmcuZWNsaXBzZS5hbnQudWkudGVtcGxhdGVDb250ZXh0VHlwZS50YXNrIiAKKyAgICBkZXNjcmlwdGlvbj0iJXByb3BlcnR5VGVtcGxhdGUyLmRlc2NyaXB0aW9uIiAKKyAgICBpZD0ib3JnLmVjbGlwc2UuYW50LnVpLnRlbXBsYXRlcy5wcm9wZXJ0eTIiIAorICAgIG5hbWU9InByb3BlcnR5Ij4mbHQ7cHJvcGVydHkgbmFtZT0mcXVvdDske25hbWV9JnF1b3Q7IHZhbHVlPSZxdW90OyR7dmFsdWV9JnF1b3Q7LyZndDsKKzwvdGVtcGxhdGU+CisKKzx0ZW1wbGF0ZSAKKwljb250ZXh0PSJvcmcuZWNsaXBzZS5hbnQudWkudGVtcGxhdGVDb250ZXh0VHlwZS50YXJnZXQiIAorCWRlc2NyaXB0aW9uPSIldGFyZ2V0VGVtcGxhdGUxLmRlc2NyaXB0aW9uIiAKKwlpZD0ib3JnLmVjbGlwc2UuYW50LnVpLnRlbXBsYXRlcy50YXJnZXQxIiAKKwluYW1lPSJ0YXJnZXQiPjwhW0NEQVRBWzwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IAorICAgICAgICAgIHRhcmdldDogJHtuYW1lfSAgICAgICAgICAgICAgCisgICAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgICAgPHRhcmdldCBuYW1lPSIke25hbWV9IiBkZXBlbmRzPSIke2RlcGVuZHN9IiBkZXNjcmlwdGlvbj0iJHtkZXNjcmlwdGlvbn0iPgorICAgICAgICAke2N1cnNvcn0KKyAgICA8L3RhcmdldD4KK11dPjwvdGVtcGxhdGU+CisKKzx0ZW1wbGF0ZSAKKyAgICBjb250ZXh0PSJvcmcuZWNsaXBzZS5hbnQudWkudGVtcGxhdGVDb250ZXh0VHlwZS50YXJnZXQiIAorICAgIGRlc2NyaXB0aW9uPSIldGFyZ2V0VGVtcGxhdGUyLmRlc2NyaXB0aW9uIiAKKyAgICBpZD0ib3JnLmVjbGlwc2UuYW50LnVpLnRlbXBsYXRlcy50YXJnZXQyIiAKKyAgICBuYW1lPSJ0YXJnZXQiPjwhW0NEQVRBWzwhLS0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIAorICAgICAgICAgIHRhcmdldDogJHtuYW1lfSAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtLT4KKyAgICA8dGFyZ2V0IG5hbWU9IiR7bmFtZX0iPgorICAgICAgICAgICAgJHtjdXJzb3J9CisgICAgPC90YXJnZXQ+CitdXT48L3RlbXBsYXRlPgorCis8dGVtcGxhdGUgCisgICAgY29udGV4dD0ib3JnLmVjbGlwc2UuYW50LnVpLnRlbXBsYXRlQ29udGV4dFR5cGUudGFzayIgCisgICAgZGVzY3JpcHRpb249IiVtYWNyb2RlZlRlbXBsYXRlLmRlc2NyaXB0aW9uIiAKKyAgICBpZD0ib3JnLmVjbGlwc2UuYW50LnVpLnRlbXBsYXRlcy5tYWNyb2RlZiIgCisgICAgbmFtZT0ibWFjcm9kZWYiPjwhW0NEQVRBWzwhLS0gPSA9ID0gPSA9ID0gPSA9ID0gPSA9ID0gPSA9ID0gPSA9CisgICAgICAgICAgbWFjcm9kZWY6ICR7bmFtZX0gICAgICAgICAgCisgICAgICAgICA9ID0gPSA9ID0gPSA9ID0gPSA9ID0gPSA9ID0gPSA9ID0gLS0+CisgICAgPG1hY3JvZGVmIG5hbWU9IiR7bmFtZX0iPgorICAgICAgICA8YXR0cmlidXRlIG5hbWU9IiR7YXJnbmFtZX0iIGRlZmF1bHQ9IiR7ZGVmYXVsdH0iIC8+CisgICAgICAgIDxzZXF1ZW50aWFsPgorICAgICAgICAgICAgJHtjdXJzb3J9CisgICAgICAgIDwvc2VxdWVudGlhbD4KKyAgICA8L21hY3JvZGVmPgorXV0+PC90ZW1wbGF0ZT4KKworPHRlbXBsYXRlIAorCWNvbnRleHQ9Im9yZy5lY2xpcHNlLmFudC51aS50ZW1wbGF0ZUNvbnRleHRUeXBlLmJ1aWxkRmlsZSIgCisJZGVzY3JpcHRpb249IiVidWlsZEZpbGVUZW1wbGF0ZTEuZGVzY3JpcHRpb24iIAorCWlkPSJvcmcuZWNsaXBzZS5hbnQudWkudGVtcGxhdGVzLmJ1aWxkRmlsZTEiIAorCW5hbWU9IiVidWlsZEZpbGVUZW1wbGF0ZTEubmFtZSI+PCFbQ0RBVEFbPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAKKyAgICAgJHtkYXRlfSAke3RpbWV9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworICAgICAke3Byb2plY3R9ICAgIAorICAgICAke2Rlc2NyaXB0aW9ufQorICAgICAgICAgICAgICAgICAgIAorICAgICAke3VzZXJ9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorPHByb2plY3QgbmFtZT0iJHtwcm9qZWN0fSIgZGVmYXVsdD0iJHtkZWZhdWx0fSI+CisgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgICAgJHtkZXNjcmlwdGlvbn0KKyAgICA8L2Rlc2NyaXB0aW9uPgorCisgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gCisgICAgICAgICAgdGFyZ2V0OiAke2RlZmF1bHR9ICAgICAgICAgICAgICAKKyAgICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgICA8dGFyZ2V0IG5hbWU9IiR7ZGVmYXVsdH0iIGRlcGVuZHM9IiR7ZGVwZW5kc30iIGRlc2NyaXB0aW9uPSIke2Rlc2NyaXB0aW9ufSI+CisgICAgICAgICR7Y3Vyc29yfQorICAgIDwvdGFyZ2V0PgorCisgICAgPCEtLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gCisgICAgICAgICAgdGFyZ2V0OiAke2RlcGVuZHN9ICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0tPgorICAgIDx0YXJnZXQgbmFtZT0iJHtkZXBlbmRzfSI+CisgICAgPC90YXJnZXQ+CisKKzwvcHJvamVjdD4KK11dPjwvdGVtcGxhdGU+CisKKzx0ZW1wbGF0ZSBuYW1lPSIlYW50Q29tbWVudC5uYW1lIiBkZXNjcmlwdGlvbj0iJWFudENvbW1lbnQuZGVzY3JpcHRpb24iCisJY29udGV4dD0ib3JnLmVjbGlwc2UuYW50LnVpLnRlbXBsYXRlQ29udGV4dFR5cGUuYnVpbGRGaWxlIiAKKwlpZD0ib3JnLmVjbGlwc2UuYW50LnVpLnRlbXBsYXRlcy5jb21tZW50MSIgPjwhW0NEQVRBWzwhLS0gJHt3b3JkX3NlbGVjdGlvbn0tLT5dXT48L3RlbXBsYXRlPgorCis8dGVtcGxhdGUgbmFtZT0iJWFudENvbW1lbnQubmFtZSIgZGVzY3JpcHRpb249IiVhbnRDb21tZW50LmRlc2NyaXB0aW9uIgorCWNvbnRleHQ9Im9yZy5lY2xpcHNlLmFudC51aS50ZW1wbGF0ZUNvbnRleHRUeXBlLnRhc2siIAorCWlkPSJvcmcuZWNsaXBzZS5hbnQudWkudGVtcGxhdGVzLmNvbW1lbnQyIj48IVtDREFUQVs8IS0tICR7d29yZF9zZWxlY3Rpb259LS0+XV0+PC90ZW1wbGF0ZT4KKworPHRlbXBsYXRlIG5hbWU9IiVhbnRMaW5lQ29tbWVudC5uYW1lIiBkZXNjcmlwdGlvbj0iJWFudExpbmVDb21tZW50LmRlc2NyaXB0aW9uIgorCWNvbnRleHQ9Im9yZy5lY2xpcHNlLmFudC51aS50ZW1wbGF0ZUNvbnRleHRUeXBlLmJ1aWxkRmlsZSIgCisJaWQ9Im9yZy5lY2xpcHNlLmFudC51aS50ZW1wbGF0ZXMuY29tbWVudDMiPjwhW0NEQVRBWzwhLS0KKyR7bGluZV9zZWxlY3Rpb259CistLT5dXT48L3RlbXBsYXRlPgorCis8dGVtcGxhdGUgbmFtZT0iJWFudExpbmVDb21tZW50Lm5hbWUiIGRlc2NyaXB0aW9uPSIlYW50TGluZUNvbW1lbnQuZGVzY3JpcHRpb24iCisJY29udGV4dD0ib3JnLmVjbGlwc2UuYW50LnVpLnRlbXBsYXRlQ29udGV4dFR5cGUudGFzayIKKwlpZD0ib3JnLmVjbGlwc2UuYW50LnVpLnRlbXBsYXRlcy5jb21tZW50NCI+PCFbQ0RBVEFbPCEtLQorJHtsaW5lX3NlbGVjdGlvbn0KKy0tPl1dPjwvdGVtcGxhdGU+CisKKzwvdGVtcGxhdGVzPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvdGVtcGxhdGVzL3Jlc29sdmVyLmdpZiBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvdGVtcGxhdGVzL3Jlc29sdmVyLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTI2NjczCi0tLSAvZGV2L251bGwKKysrIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS90ZW1wbGF0ZXMvcmVzb2x2ZXIuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLy5jbGFzc3BhdGggYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci8uY2xhc3NwYXRoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNzM5MzMKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci8uY2xhc3NwYXRoCkBAIC0wLDAgKzEsNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxjbGFzc3BhdGg+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNCIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgorPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci8uY3ZzaWdub3JlIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IvLmN2c2lnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDQ2M2FmCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IvLmN2c2lnbm9yZQpAQCAtMCwwICsxLDIgQEAKK2JpbgorYnVpbGQueG1sCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci8ub3B0aW9ucyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLy5vcHRpb25zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyYzcxNGYKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci8ub3B0aW9ucwpAQCAtMCwwICsxLDUgQEAKKyMgRGVidWdnaW5nIG9wdGlvbnMgZm9yIHRoZSBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yIHBsdWdpbgorCisjIFR1cm4gb24gZ2VuZXJhbCBkZWJ1Z2dpbmcgZm9yIHRoZSBwbHVnaW4uCitvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL2RlYnVnPWZhbHNlCisKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLy5wcm9qZWN0IGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IvLnByb2plY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWIxM2ExMAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLy5wcm9qZWN0CkBAIC0wLDAgKzEsMzMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdERlc2NyaXB0aW9uPgorCTxuYW1lPm9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3I8L25hbWU+CisJPGNvbW1lbnQ+PC9jb21tZW50PgorCTxwcm9qZWN0cz4KKwk8L3Byb2plY3RzPgorCTxidWlsZFNwZWM+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5kcy5jb3JlLmJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCTwvYnVpbGRTcGVjPgorCTxuYXR1cmVzPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+CisJPC9uYXR1cmVzPgorPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc5MGMzMgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpAQCAtMCwwICsxLDgxIEBACisjRnJpIE5vdiAwNyAxNTo1Nzo1NCBFU1QgMjAwOAorZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5jb21wYXJpbmdJZGVudGljYWw9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhdGFsT3B0aW9uYWxFcnJvcj1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3M9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHVibGljCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdIYXNoQ29kZU1ldGhvZD1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXB1YmxpYworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTeW5jaHJvbml6ZWRPbkluaGVyaXRlZE1ldGhvZD1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsUmVmZXJlbmNlPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wYXJhbWV0ZXJBc3NpZ25tZW50PWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG90ZW50aWFsTnVsbFJlZmVyZW5jZT1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudE51bGxDaGVjaz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50U3VwZXJpbnRlcmZhY2U9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uRXhlbXB0RXhjZXB0aW9uQW5kVGhyb3dhYmxlPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25JbmNsdWRlRG9jQ29tbWVudFJlZmVyZW5jZT1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJJbmNsdWRlRG9jQ29tbWVudFJlZmVyZW5jZT1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkV2FybmluZ1Rva2VuPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IvT1NHSS1JTkYvYnVuZGxlR3JvdXAueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IvT1NHSS1JTkYvYnVuZGxlR3JvdXAueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjZDM3MTcKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9PU0dJLUlORi9idW5kbGVHcm91cC54bWwKQEAgLTAsMCArMSw3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHNjcjpjb21wb25lbnQgeG1sbnM6c2NyPSJodHRwOi8vd3d3Lm9zZ2kub3JnL3htbG5zL3Njci92MS4xLjAiIGltbWVkaWF0ZT0iZmFsc2UiIG5hbWU9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IuYnVuZGxlZ3JvdXAiPgorICAgPGltcGxlbWVudGF0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29uZmlndXJhdG9yLkJ1bmRsZUdyb3VwQ29tcG9uZW50Ii8+CisgICA8c2VydmljZT4KKyAgICAgIDxwcm92aWRlIGludGVyZmFjZT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklCdW5kbGVHcm91cFByb3ZpZGVyIi8+CisgICA8L3NlcnZpY2U+Cis8L3Njcjpjb21wb25lbnQ+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9hYm91dC5odG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IvYWJvdXQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjAyMzMwCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IvYWJvdXQuaHRtbApAQCAtMCwwICsxLDI4IEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgorICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgorPHRpdGxlPkFib3V0PC90aXRsZT4KKzwvaGVhZD4KKzxib2R5IGxhbmc9IkVOLVVTIj4KKzxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgorIAorPHA+SnVuZSAyLCAyMDA2PC9wPgkKKzxoMz5MaWNlbnNlPC9oMz4KKworPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCitpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCitFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAorYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KK0ZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CisKKzxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCitiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5CithcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCitwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKK2luZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50CithbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgorCis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IvYnVpbGQucHJvcGVydGllcyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL2J1aWxkLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU3NDYyMgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL2J1aWxkLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxOCBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisjIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjCisjIENvbnRyaWJ1dG9yczoKKyMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworYmluLmluY2x1ZGVzID0gLm9wdGlvbnMsXAorICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCisgICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCisgICAgICAgICAgICAgICAuLFwKKyAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCisgICAgICAgICAgICAgICBPU0dJLUlORi8KK3NyYy5pbmNsdWRlcyA9IGFib3V0Lmh0bWwKK3NvdXJjZS4uID0gc3JjLwpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IvcGx1Z2luLnByb3BlcnRpZXMgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9wbHVnaW4ucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjI0YTdmCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IvcGx1Z2luLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxMyBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisjIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjCisjIENvbnRyaWJ1dG9yczoKKyMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworcGx1Z2luTmFtZT0gSW5zdGFsbC9VcGRhdGUgQ29uZmlndXJhdG9yCitwcm92aWRlck5hbWU9IEVjbGlwc2Uub3JnCisKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29uZmlndXJhdG9yL3BhY2thZ2UuaHRtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29uZmlndXJhdG9yL3BhY2thZ2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTBmOWY2Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb25maWd1cmF0b3IvcGFja2FnZS5odG1sCkBAIC0wLDAgKzEsMjIgQEAKKzwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+Cis8aHRtbD4KKzxoZWFkPgorICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+CisgICA8bWV0YSBuYW1lPSJBdXRob3IiIGNvbnRlbnQ9IklCTSI+CisgICA8bWV0YSBuYW1lPSJHRU5FUkFUT1IiIGNvbnRlbnQ9Ik1vemlsbGEvNC43MiBbZW5dIChXaW5kb3dzIE5UIDUuMDsgVSkgW05ldHNjYXBlXSI+CisgICA8dGl0bGU+UGFja2FnZS1sZXZlbCBKYXZhZG9jPC90aXRsZT4KKzwvaGVhZD4KKzxib2R5PgorUHJvdmlkZXMgc3VwcG9ydCBmb3IgYWNjZXNzaW5nIHBsYXRmb3JtIGNvbmZpZ3VyYXRpb24gZGF0YS4KKzxoMj4KK1BhY2thZ2UgU3BlY2lmaWNhdGlvbjwvaDI+CitUaGlzIHBhY2thZ2UgY29udGFpbnMgaW50ZXJmYWNlcyBmb3IgYWNjZXNzaW5nIGFuZCBtYW5pcHVsYXRpbmcgdGhlIGxvY2FsCitzeXN0ZW0gaW5zdGFsbGF0aW9uIGFuZCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLiAKKzxwPgorPGI+Tm90ZTo8L2I+IFRoaXMgcGFja2FnZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCitjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKK2Zyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCisocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorPC9wPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb25maWd1cmF0b3IvQnVuZGxlTWFuaWZlc3QuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL0J1bmRsZU1hbmlmZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI2MTI0ZQotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL0J1bmRsZU1hbmlmZXN0LmphdmEKQEAgLTAsMCArMSwxMjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqICAgICBKYW1lcyBEIE1pbGVzIChJQk0gQ29ycC4pIC0gYnVnIDE4MjY2NiwgdHJpbSBzcGFjZXMgZnJvbSB2ZXJzaW9uIGlkCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvbmZpZ3VyYXRvcjsKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS51dGlsLmphci4qOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLio7CitpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLio7CisvKioKKyAqIFBhcnNlcyBNQU5JRkVTVC5NRgorICovCitwdWJsaWMgY2xhc3MgQnVuZGxlTWFuaWZlc3QgaW1wbGVtZW50cyBJQ29uZmlndXJhdGlvbkNvbnN0YW50cyB7CisJcHJpdmF0ZSBGaWxlIG1hbmlmZXN0RmlsZTsKKwlwcml2YXRlIFBsdWdpbkVudHJ5IHBsdWdpbkVudHJ5OworCXByaXZhdGUgSU9FeGNlcHRpb24gZXhjZXB0aW9uOworCXByaXZhdGUgU3RyaW5nIGJ1bmRsZVVSTDsKKwkvKioKKwkgKiBDb25zdHJ1Y3RvciBmb3IgbG9jYWwgZmlsZQorCSAqLworCXB1YmxpYyBCdW5kbGVNYW5pZmVzdChGaWxlIG1hbmlmZXN0KSB7CisJCXN1cGVyKCk7CisJCW1hbmlmZXN0RmlsZSA9IG1hbmlmZXN0OworCQlpZiAobWFuaWZlc3QuZXhpc3RzKCkgJiYgIW1hbmlmZXN0LmlzRGlyZWN0b3J5KCkpIHsKKwkJCUZpbGVJbnB1dFN0cmVhbSBmb3MgPSBudWxsOworCQkJdHJ5IHsKKwkJCQlmb3MgPSBuZXcgRmlsZUlucHV0U3RyZWFtKG1hbmlmZXN0KTsKKwkJCQlwYXJzZShmb3MpOworCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisJCQl9IGZpbmFsbHkgeworCQkJCWlmIChmb3MgIT0gbnVsbCkgeworCQkJCQl0cnkgeworCQkJCQkJZm9zLmNsb3NlKCk7CisJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKwkJLyoqCisJCSAqIENvbnN0cnVjdG9yIGZvciBsb2NhbCBmaWxlCisJCSAqLworCQlwdWJsaWMgQnVuZGxlTWFuaWZlc3QoSW5wdXRTdHJlYW0gaW5wdXQsIFN0cmluZyBidW5kbGVVcmwpIHsKKwkJCXN1cGVyKCk7CisJCQlidW5kbGVVUkwgPSBidW5kbGVVcmw7CisJCQlpZiAoaW5wdXQgIT0gbnVsbCkgeworCQkJCXBhcnNlKGlucHV0KTsKKwkJCX0KKwkJfQorCS8qKgorCSAqIFBhcnNlcyBtYW5pZmVzdCwgY3JlYXRlcyBQbHVnaW5FbnRyeSBpZiBtYW5pZmVzdCBpcyB2YWxpZCwgc3RvcmVzCisJICogZXhjZXB0aW9uIGlmIGFueSBvY2N1cnMKKwkgKiAKKwkgKiBAcGFyYW0gaW4KKwkgKiAgICAgICAgICAgIElucHV0U3RyZWFtCisJICovCisJcHJpdmF0ZSB2b2lkIHBhcnNlKElucHV0U3RyZWFtIGluKSB7CisJCXRyeSB7CisJCQlNYW5pZmVzdCBtID0gbmV3IE1hbmlmZXN0KGluKTsKKwkJCUF0dHJpYnV0ZXMgYSA9IG0uZ2V0TWFpbkF0dHJpYnV0ZXMoKTsKKwkJCS8vIHBsdWdpbiBpZAorCQkJU3RyaW5nIHN5bWJvbGljTmFtZSA9IGEuZ2V0VmFsdWUoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpOworCQkJaWYgKHN5bWJvbGljTmFtZSA9PSBudWxsKSB7CisJCQkJLy8gSW4gRWNsaXBzZSBtYW5pZmVzdCBtdXN0IGhhdmUgQnVuZGxlLVN5bWJvbGljTmFtZSBhdHRyaWJ1dGUKKwkJCQlyZXR1cm47CisJCQl9CisJCQlTdHJpbmcgaWQ7CisJCQl0cnkgeworCQkJCU1hbmlmZXN0RWxlbWVudFtdIGVsZW1lbnRzID0gTWFuaWZlc3RFbGVtZW50LnBhcnNlSGVhZGVyKAorCQkJCQkJQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsIHN5bWJvbGljTmFtZSk7CisJCQkJaWQgPSBlbGVtZW50c1swXS5nZXRWYWx1ZSgpOworCQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGJlKSB7CisJCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKGJlLmdldE1lc3NhZ2UoKSk7CisJCQl9CisJCQkvLyBwbHVnaW4gdmVyc2lvbgorCQkJU3RyaW5nIHZlcnNpb24gPSBhLmdldFZhbHVlKENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTik7CisJCQlpZiAodmVyc2lvbiA9PSBudWxsKSB7CisJCQkJVXRpbHMubG9nKE5MUy5iaW5kKE1lc3NhZ2VzLkJ1bmRsZU1hbmlmZXN0X25vVmVyc2lvbiwgKG5ldyBTdHJpbmdbXSB7IENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgaWQgfSkpKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQl2ZXJzaW9uID0gdmVyc2lvbi50cmltKCk7CisJCQlTdHJpbmcgaG9zdFBsdWdpbiA9IGEuZ2V0VmFsdWUoQ29uc3RhbnRzLkZSQUdNRU5UX0hPU1QpOworCQkJcGx1Z2luRW50cnkgPSBuZXcgUGx1Z2luRW50cnkoKTsKKwkJCXBsdWdpbkVudHJ5LnNldFZlcnNpb25lZElkZW50aWZpZXIobmV3IFZlcnNpb25lZElkZW50aWZpZXIoaWQsCisJCQkJCXZlcnNpb24pKTsKKwkJCXBsdWdpbkVudHJ5LmlzRnJhZ21lbnQoaG9zdFBsdWdpbiAhPSBudWxsCisJCQkJCSYmIGhvc3RQbHVnaW4ubGVuZ3RoKCkgPiAwKTsKKwkJCS8vIFNldCBVUkwKKwkJCWlmKGJ1bmRsZVVSTCE9bnVsbCl7CisJCQkJcGx1Z2luRW50cnkuc2V0VVJMKGJ1bmRsZVVSTCk7CisJCQl9ZWxzZXsKKwkJCQlGaWxlIHBsdWdpbkRpciA9IG1hbmlmZXN0RmlsZS5nZXRQYXJlbnRGaWxlKCk7CisJCQkJaWYgKHBsdWdpbkRpciAhPSBudWxsKSB7CisJCQkJCXBsdWdpbkRpciA9IHBsdWdpbkRpci5nZXRQYXJlbnRGaWxlKCk7CisJCQkJfQorCQkJCWlmIChwbHVnaW5EaXIgIT0gbnVsbCl7CisJCQkJCXBsdWdpbkVudHJ5LnNldFVSTChQTFVHSU5TICsgIi8iICsgcGx1Z2luRGlyLmdldE5hbWUoKSArICIvIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCX0KKwkJCX0KKwkJCS8vCisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworCQkJZXhjZXB0aW9uID0gaW9lOworCQl9CisJfQorCXB1YmxpYyBib29sZWFuIGV4aXN0cygpIHsKKwkJcmV0dXJuIGV4Y2VwdGlvbiAhPSBudWxsIHx8IHBsdWdpbkVudHJ5ICE9IG51bGw7CisJfQorCS8qKgorCSAqIE9idGFpbnMgUGx1Z2luRW50cnkgZnJvbSBhIG1hbmlmZXN0LgorCSAqIAorCSAqIEByZXR1cm4gUGx1Z2luRW50cnkgb3IgbnVsbCBpZiB2YWxpZCBtYW5pZmVzdCBkb2VzIG5vdCBleGlzdAorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKwkgKiAgICAgICAgICAgICBpZiBleGNlcHRpb24gZHVyaW5nIHBhcnNpbmcKKwkgKi8KKwlwdWJsaWMgUGx1Z2luRW50cnkgZ2V0UGx1Z2luRW50cnkoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlpZiAoZXhjZXB0aW9uICE9IG51bGwpIHsKKwkJCXRocm93IGV4Y2VwdGlvbjsKKwkJfSAKKwkJcmV0dXJuIHBsdWdpbkVudHJ5OwkJCisJfQorfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb25maWd1cmF0b3IvQ29uZmlndXJhdGlvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb25maWd1cmF0b3IvQ29uZmlndXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmODNiYjEKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvbmZpZ3VyYXRvci9Db25maWd1cmF0aW9uLmphdmEKQEAgLTAsMCArMSwyMzUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqICAgICBKYW1lcyBEIE1pbGVzIChJQk0gQ29ycC4pIC0gYnVnIDE3NjI1MCwgQ29uZmlndXJhdG9yIG5lZWRzIHRvIGhhbmRsZSBtb3JlIHBsYXRmb3JtIHVybHMgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvbmZpZ3VyYXRvcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuKjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci4qOworaW1wb3J0IG9yZy53M2MuZG9tLio7CisKK3B1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uIGltcGxlbWVudHMgSUNvbmZpZ3VyYXRpb25Db25zdGFudHMgeworCQorCXByaXZhdGUgSGFzaE1hcCBzaXRlcyA9IG5ldyBIYXNoTWFwKCk7CisJcHJpdmF0ZSBIYXNoTWFwIHBsYXRmb3JtVVJMcyA9IG5ldyBIYXNoTWFwKCk7CisJcHJpdmF0ZSBEYXRlIGRhdGU7CisJcHJpdmF0ZSBsb25nIGxhc3RNb2RpZmllZDsgLy8gbmVlZGVkIHRvIGFjY291bnQgZm9yIGZpbGUgc3lzdGVtIGxpbWl0YXRpb25zCisJcHJpdmF0ZSBVUkwgdXJsOworCXByaXZhdGUgYm9vbGVhbiB0cmFuc2llbnRDb25maWc7CisJcHJpdmF0ZSBib29sZWFuIGlzRGlydHk7CisJcHJpdmF0ZSBDb25maWd1cmF0aW9uIGxpbmtlZENvbmZpZzsgLy8gc2hhcmVkIGNvbmZpZ3VyYXRpb24KKwlwcml2YXRlIFVSTCBhc3NvY2lhdGVkSW5zdGFsbFVSTCA9IFV0aWxzLmdldEluc3RhbGxVUkwoKTsKKwkKKwlwdWJsaWMgQ29uZmlndXJhdGlvbigpIHsKKwkJdGhpcyhuZXcgRGF0ZSgpKTsKKwkJLy8gdGhlIGNvbmZpZyBpcyBjcmVhdGVkIG5vdyBvciBvdXQgb2YgYSBwbGF0Zm9ybS54bWwgd2l0aG91dCBhIGRhdGUKKwkJaXNEaXJ0eSA9IHRydWU7CisJfQorCXB1YmxpYyBDb25maWd1cmF0aW9uKERhdGUgZGF0ZSkgIHsKKwkJdGhpcy5kYXRlID0gZGF0ZTsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0VVJMKFVSTCB1cmwpIHsKKwkJdGhpcy51cmwgPSB1cmw7CisJfQorCQorCXB1YmxpYyBVUkwgZ2V0VVJMKCkgeworCQlyZXR1cm4gdXJsOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRMaW5rZWRDb25maWcoQ29uZmlndXJhdGlvbiBsaW5rZWRDb25maWcpIHsKKwkJdGhpcy5saW5rZWRDb25maWcgPSBsaW5rZWRDb25maWc7CisJCS8vIG1ha2UgYWxsIHRoZSBzaXRlcyByZWFkLW9ubHkKKwkJU2l0ZUVudHJ5W10gbGlua2VkU2l0ZXMgPSBsaW5rZWRDb25maWcuZ2V0U2l0ZXMoKTsKKwkJZm9yIChpbnQgaT0wOyBpPGxpbmtlZFNpdGVzLmxlbmd0aDsgaSsrKQorCQkJbGlua2VkU2l0ZXNbaV0uc2V0VXBkYXRlYWJsZShmYWxzZSk7CisJfQorCQorCXB1YmxpYyBDb25maWd1cmF0aW9uIGdldExpbmtlZENvbmZpZygpIHsKKwkJcmV0dXJuIGxpbmtlZENvbmZpZzsKKwl9CisJCisJLyoqCisJICogQHJldHVybiB0cnVlIGlmIHRoZSBjb25maWcgbmVlZHMgdG8gYmUgc2F2ZWQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0RpcnR5KCkgeworCQlyZXR1cm4gaXNEaXJ0eTsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0RGlydHkoYm9vbGVhbiBkaXJ0eSkgeworCQlpc0RpcnR5ID0gZGlydHk7CisJfQorCQorCXB1YmxpYyB2b2lkIGFkZFNpdGVFbnRyeShTdHJpbmcgdXJsLCBTaXRlRW50cnkgc2l0ZSkgeworCQl1cmwgPSBVdGlscy5jYW5vbmljYWxpemVVUkwodXJsKTsKKwkJLy8gb25seSBhZGQgdGhlIHNhbWUgc2l0ZSBvbmNlCisJCWlmIChzaXRlcy5nZXQodXJsKSA9PSBudWxsICYmIChsaW5rZWRDb25maWcgPT0gbnVsbCB8fCBsaW5rZWRDb25maWcuc2l0ZXMuZ2V0KHVybCkgPT0gbnVsbCkpIHsKKwkJCXNpdGUuc2V0Q29uZmlnKHRoaXMpOworCQkJc2l0ZXMucHV0KHVybCwgc2l0ZSk7CisJCQlpZih1cmwuc3RhcnRzV2l0aCgicGxhdGZvcm06Iikpey8vJE5PTi1OTFMtMSQKKwkJCQlVUkwgcFVSTDsKKwkJCQl0cnkgeworCQkJCQlVUkwgcmVsU2l0ZT0gbnVsbDsKKwkJCQkJaWYgKHVybCAhPSBudWxsICYmIHVybC5zdGFydHNXaXRoKCJwbGF0Zm9ybTovY29uZmlnIikpIHsKKwkJCQkJCS8vIHVybCBmb3IgbG9jYXRpb24gb2YgY29uZmlndXJhdGlvbiBpcyByZWxhdGl2ZSB0byBwbGF0Zm9ybS54bWwKKwkJCQkJCVVSTCBjb25maWdfbG9jID0gZ2V0VVJMKCk7CisJCQkJCQlyZWxTaXRlID0gbmV3IFVSTChjb25maWdfbG9jLCAiLi4iKTsKKwkJCQkJfWVsc2V7CisJCQkJCQlyZWxTaXRlID0gZ2V0SW5zdGFsbFVSTCgpOworCQkJCQl9CisJCQkJCQorCQkJCQlwVVJMID0gbmV3IFVSTCh1cmwpOworCQkJCQlVUkwgclVSTCA9IFBsYXRmb3JtQ29uZmlndXJhdGlvbi5yZXNvbHZlUGxhdGZvcm1VUkwocFVSTCwgcmVsU2l0ZSk7CisJCQkJCVN0cmluZyByZXNvbHZlZFVSTCA9IHJVUkwudG9FeHRlcm5hbEZvcm0oKTsKKwkJCQkJcGxhdGZvcm1VUkxzLnB1dChyZXNvbHZlZFVSTCwgcFVSTCk7CisJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCQkvLyBjYW4ndCByZXNvbHZlIHNvIGNhbid0IGhhdmUgbG9vayB1cC4KKwkJCQl9CisJCQl9CisJCX0KKwl9CisJCisJcHVibGljIHZvaWQgcmVtb3ZlU2l0ZUVudHJ5KFN0cmluZyB1cmwpIHsKKwkJdXJsID1VdGlscy5jYW5vbmljYWxpemVVUkwodXJsKTsJCQorCQlzaXRlcy5yZW1vdmUodXJsKTsKKwkJaWYodXJsLnN0YXJ0c1dpdGgoInBsYXRmb3JtOiIpKXsgLy8kTk9OLU5MUy0xJAorCQkJVVJMIHBVUkw7CisJCQl0cnkgeworCQkJCVVSTCByZWxTaXRlPSBudWxsOworCQkJCWlmICh1cmwgIT0gbnVsbCAmJiB1cmwuc3RhcnRzV2l0aCgicGxhdGZvcm06L2NvbmZpZyIpKSB7CisJCQkJCS8vIHVybCBmb3IgbG9jYXRpb24gb2YgY29uZmlndXJhdGlvbiBpcyByZWxhdGl2ZSB0byBwbGF0Zm9ybS54bWwKKwkJCQkJVVJMIGNvbmZpZ19sb2MgPSBnZXRVUkwoKTsKKwkJCQkJcmVsU2l0ZSA9IG5ldyBVUkwoY29uZmlnX2xvYywgIi4uIik7CisJCQkJfWVsc2V7CisJCQkJCXJlbFNpdGUgPSBnZXRJbnN0YWxsVVJMKCk7CisJCQkJfQorCQkJCQorCQkJCXBVUkwgPSBuZXcgVVJMKHVybCk7CisJCQkJVVJMIHJVUkwgPSBQbGF0Zm9ybUNvbmZpZ3VyYXRpb24ucmVzb2x2ZVBsYXRmb3JtVVJMKHBVUkwsIHJlbFNpdGUpOworCQkJCVN0cmluZyByZXNvbHZlZFVSTCA9IHJVUkwudG9FeHRlcm5hbEZvcm0oKTsKKwkJCQlwbGF0Zm9ybVVSTHMucmVtb3ZlKHJlc29sdmVkVVJMKTsKKwkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQkvLyBjYW4ndCByZXNvbHZlIHNvIGNhbid0IGhhdmUgbG9vayB1cC4KKwkJCX0KKwkJfQorCX0KKwkKKwlwdWJsaWMgU2l0ZUVudHJ5IGdldFNpdGVFbnRyeShTdHJpbmcgdXJsKSB7CisJCXVybCA9IFV0aWxzLmNhbm9uaWNhbGl6ZVVSTCh1cmwpOwkJCisJCVNpdGVFbnRyeSBzaXRlID0gKFNpdGVFbnRyeSlzaXRlcy5nZXQodXJsKTsKKwkJaWYgKHNpdGUgPT0gbnVsbCAmJiBsaW5rZWRDb25maWcgIT0gbnVsbCkKKwkJCXNpdGUgPSBsaW5rZWRDb25maWcuZ2V0U2l0ZUVudHJ5KHVybCk7CisJCXJldHVybiBzaXRlOworCX0KKwkKKwlwdWJsaWMgU2l0ZUVudHJ5W10gZ2V0U2l0ZXMoKSB7CisJCWlmIChsaW5rZWRDb25maWcgPT0gbnVsbCkKKwkJCXJldHVybiAoU2l0ZUVudHJ5W10pIHNpdGVzLnZhbHVlcygpLnRvQXJyYXkobmV3IFNpdGVFbnRyeVtzaXRlcy5zaXplKCldKTsKKwkJQXJyYXlMaXN0IGNvbWJpbmVkU2l0ZXMgPSBuZXcgQXJyYXlMaXN0KHNpdGVzLnZhbHVlcygpKTsKKwkJY29tYmluZWRTaXRlcy5hZGRBbGwobGlua2VkQ29uZmlnLnNpdGVzLnZhbHVlcygpKTsKKwkJcmV0dXJuIChTaXRlRW50cnlbXSkgY29tYmluZWRTaXRlcy50b0FycmF5KG5ldyBTaXRlRW50cnlbY29tYmluZWRTaXRlcy5zaXplKCldKTsKKwl9CisJCisJcHVibGljIEVsZW1lbnQgdG9YTUwoRG9jdW1lbnQgZG9jKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CQorCQl0cnkgeworCQkJRWxlbWVudCBjb25maWdFbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQoQ0ZHKTsKKworCQkJY29uZmlnRWxlbWVudC5zZXRBdHRyaWJ1dGUoQ0ZHX1ZFUlNJT04sIFZFUlNJT04pOworCQkJY29uZmlnRWxlbWVudC5zZXRBdHRyaWJ1dGUoQ0ZHX0RBVEUsIFN0cmluZy52YWx1ZU9mKGRhdGUuZ2V0VGltZSgpKSk7CisJCQlTdHJpbmcgdHJhbnNpdG9yeSA9IGlzVHJhbnNpZW50KCkgPyAidHJ1ZSIgOiAiZmFsc2UiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCWNvbmZpZ0VsZW1lbnQuc2V0QXR0cmlidXRlKENGR19UUkFOU0lFTlQsIHRyYW5zaXRvcnkpOworCQkJCQkJCisJCQlpZiAobGlua2VkQ29uZmlnICE9IG51bGwpIHsKKwkJCQkvLyBtYWtlIGV4dGVybmFsaXplZCBVUkwgaW5zdGFsbCByZWxhdGl2ZSAKKwkJCQljb25maWdFbGVtZW50LnNldEF0dHJpYnV0ZShDRkdfU0hBUkVEX1VSTCwgVXRpbHMubWFrZVJlbGF0aXZlKGdldEluc3RhbGxVUkwoKSwgbGlua2VkQ29uZmlnLmdldFVSTCgpKS50b0V4dGVybmFsRm9ybSgpKTsKKwkJCX0KKworCQkJLy8gY29sbGVjdCBzaXRlIGVudHJpZXMKKwkJCVNpdGVFbnRyeVtdIGxpc3QgPSAoU2l0ZUVudHJ5W10pIHNpdGVzLnZhbHVlcygpLnRvQXJyYXkobmV3IFNpdGVFbnRyeVswXSk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKKwkJCQlpZiAobGlua2VkQ29uZmlnICE9IG51bGwgJiYgbGlua2VkQ29uZmlnLmdldFNpdGVFbnRyeShsaXN0W2ldLmdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkpICE9IG51bGwpCisJCQkJCWNvbnRpbnVlOworCQkJCUVsZW1lbnQgc2l0ZUVsZW1lbnQgPSBsaXN0W2ldLnRvWE1MKGRvYyk7CisJCQkJY29uZmlnRWxlbWVudC5hcHBlbmRDaGlsZChzaXRlRWxlbWVudCk7CisJCQl9CisJCQkKKwkJCXJldHVybiBjb25maWdFbGVtZW50OworCQkJCisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBVdGlscy5uZXdDb3JlRXhjZXB0aW9uKCIiLCBlKTsgLy8kTk9OLU5MUy0xJAorCQl9IAorCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBpc1RyYW5zaWVudCgpIHsKKwkJcmV0dXJuIHRyYW5zaWVudENvbmZpZzsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0VHJhbnNpZW50KGJvb2xlYW4gaXNUcmFuc2llbnQpIHsKKwkJdGhpcy50cmFuc2llbnRDb25maWcgPSBpc1RyYW5zaWVudDsKKwl9CisJCisJcHVibGljIERhdGUgZ2V0RGF0ZSgpIHsKKwkJcmV0dXJuIGRhdGU7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldERhdGUoRGF0ZSBkYXRlKSB7CisJCXRoaXMuZGF0ZSA9IGRhdGU7CisJfQorCQorCXB1YmxpYyBib29sZWFuIHVuY29uZmlndXJlRmVhdHVyZUVudHJ5KElQbGF0Zm9ybUNvbmZpZ3VyYXRpb24uSUZlYXR1cmVFbnRyeSBmZWF0dXJlKSB7CisJCVNpdGVFbnRyeVtdIHNpdGVzID0gZ2V0U2l0ZXMoKTsKKwkJZm9yIChpbnQgaT0wOyBpPHNpdGVzLmxlbmd0aDsgaSsrKQorCQkJaWYgKHNpdGVzW2ldLnVuY29uZmlndXJlRmVhdHVyZUVudHJ5KGZlYXR1cmUpKQorCQkJCXJldHVybiB0cnVlOworCQlyZXR1cm4gZmFsc2U7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldExhc3RNb2RpZmllZChsb25nIGxhc3RNb2RpZmllZCkgeworCQl0aGlzLmxhc3RNb2RpZmllZCA9IGxhc3RNb2RpZmllZDsKKwl9CisJCisJcHVibGljIGxvbmcgbGFzdE1vZGlmaWVkKCkgeworCQlyZXR1cm4gKGxhc3RNb2RpZmllZCAhPSAwKSA/IGxhc3RNb2RpZmllZCA6IGRhdGUuZ2V0VGltZSgpOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB1cmwgYXMgYSBwbGF0Zm9ybTovIHVybCwgaWYgcG9zc2libGUsIGVsc2UgbGVhdmVzIGl0IHVuY2hhbmdlZAorCSAqIEBwYXJhbSB1cmwKKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIFVSTCBhc1BsYXRmb3JtVVJMKFVSTCB1cmwpIHsKKwkJdHJ5IHsKKwkJCWlmICh1cmwuZ2V0UHJvdG9jb2woKS5lcXVhbHMoImZpbGUiKSkgey8vJE5PTi1OTFMtMSQKKwkJCQlTdHJpbmcgclVybCA9IHVybC50b0V4dGVybmFsRm9ybSgpOworCQkJCVVSTCBwVXJsID0gKFVSTClwbGF0Zm9ybVVSTHMuZ2V0KHJVcmwpOworCQkJCWlmKHBVcmwgPT0gbnVsbCkKKwkJCQkJcmV0dXJuIHVybDsKKwkJCQlyZXR1cm4gcFVybDsKKwkJCX0KKwkJCXJldHVybiB1cmw7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm4gdXJsOworCQl9CisJfQorCQkKKwlwdWJsaWMgVVJMIGdldEluc3RhbGxVUkwoKSB7CisJCXJldHVybiBhc3NvY2lhdGVkSW5zdGFsbFVSTDsKKwl9CisJCQorCXB1YmxpYyB2b2lkIHNldEluc3RhbGxMb2NhdGlvbihVUkwgaW5zdGFsbFVSTCkgeworCQlhc3NvY2lhdGVkSW5zdGFsbFVSTCA9IGluc3RhbGxVUkw7CisJfQorfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb25maWd1cmF0b3IvRmVhdHVyZUVudHJ5LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvbmZpZ3VyYXRvci9GZWF0dXJlRW50cnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzE5MTJmCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb25maWd1cmF0b3IvRmVhdHVyZUVudHJ5LmphdmEKQEAgLTAsMCArMSwzNjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29uZmlndXJhdG9yOworCitpbXBvcnQgamF2YS5uZXQuKjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb25maWd1cmF0b3IuYnJhbmRpbmcuKjsKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuKjsKK2ltcG9ydCBvcmcudzNjLmRvbS4qOworCisKKy8qKgorICogCisgKiBGZWF0dXJlIGluZm9ybWF0aW9uCisgKi8KK3B1YmxpYyBjbGFzcyBGZWF0dXJlRW50cnkKKwkJaW1wbGVtZW50cworCQkJSVBsYXRmb3JtQ29uZmlndXJhdGlvbi5JRmVhdHVyZUVudHJ5LAorCQkJSUNvbmZpZ3VyYXRpb25Db25zdGFudHMsCisJCQlJQnVuZGxlR3JvdXAsCisJCQlJQnVuZGxlR3JvdXBDb25zdGFudHMsCisJCQlJUHJvZHVjdENvbnN0YW50cyB7CisJcHJpdmF0ZSBTdHJpbmcgaWQ7CisJcHJpdmF0ZSBTdHJpbmcgdmVyc2lvbjsKKwlwcml2YXRlIFN0cmluZyBwbHVnaW5WZXJzaW9uOworCXByaXZhdGUgU3RyaW5nIGFwcGxpY2F0aW9uOworCXByaXZhdGUgVVJMW10gcm9vdDsKKwlwcml2YXRlIGJvb2xlYW4gcHJpbWFyeTsKKwlwcml2YXRlIFN0cmluZyBwbHVnaW5JZGVudGlmaWVyOworCXByaXZhdGUgU3RyaW5nIHVybDsKKwlwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKKwlwcml2YXRlIFN0cmluZyBsaWNlbnNlVVJMOworCXByaXZhdGUgQXJyYXlMaXN0IHBsdWdpbnM7CisJcHJpdmF0ZSBBYm91dEluZm8gYnJhbmRpbmc7CisJcHJpdmF0ZSBTaXRlRW50cnkgc2l0ZTsKKwlwcml2YXRlIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlOworCXByaXZhdGUgYm9vbGVhbiBmdWxseVBhcnNlZDsKKworCXB1YmxpYyBGZWF0dXJlRW50cnkoU3RyaW5nIGlkLCBTdHJpbmcgdmVyc2lvbiwgU3RyaW5nIHBsdWdpbklkZW50aWZpZXIsIFN0cmluZyBwbHVnaW5WZXJzaW9uLCBib29sZWFuIHByaW1hcnksIFN0cmluZyBhcHBsaWNhdGlvbiwgVVJMW10gcm9vdCkgeworCQlpZiAoaWQgPT0gbnVsbCkKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJdGhpcy5pZCA9IGlkOworCQl0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOworCQl0aGlzLnBsdWdpblZlcnNpb24gPSBwbHVnaW5WZXJzaW9uOworCQl0aGlzLnBsdWdpbklkZW50aWZpZXIgPSBwbHVnaW5JZGVudGlmaWVyOworCQl0aGlzLnByaW1hcnkgPSBwcmltYXJ5OworCQl0aGlzLmFwcGxpY2F0aW9uID0gYXBwbGljYXRpb247CisJCXRoaXMucm9vdCA9IChyb290ID09IG51bGwgPyBuZXcgVVJMWzBdIDogcm9vdCk7CisJfQorCisJcHVibGljIEZlYXR1cmVFbnRyeSggU3RyaW5nIGlkLCBTdHJpbmcgdmVyc2lvbiwgU3RyaW5nIHBsdWdpblZlcnNpb24sIGJvb2xlYW4gcHJpbWFyeSwgU3RyaW5nIGFwcGxpY2F0aW9uLCBVUkxbXSByb290KSB7CisJCXRoaXMoaWQsIHZlcnNpb24sIGlkLCBwbHVnaW5WZXJzaW9uLCBwcmltYXJ5LCBhcHBsaWNhdGlvbiwgcm9vdCk7CisJfQorCisJcHVibGljIHZvaWQgc2V0U2l0ZShTaXRlRW50cnkgc2l0ZSkgeworCQl0aGlzLnNpdGUgPSBzaXRlOworCX0KKwkKKwlwdWJsaWMgU2l0ZUVudHJ5IGdldFNpdGUoKSB7CisJCXJldHVybiB0aGlzLnNpdGU7CisJfQorCQorCXB1YmxpYyB2b2lkIGFkZFBsdWdpbihQbHVnaW5FbnRyeSBwbHVnaW4pIHsKKwkJaWYgKHBsdWdpbnMgPT0gbnVsbCkKKwkJCXBsdWdpbnMgPSBuZXcgQXJyYXlMaXN0KCk7CisJCXBsdWdpbnMuYWRkKHBsdWdpbik7CisJfQorCQorCXB1YmxpYyBQbHVnaW5FbnRyeVtdIGdldFBsdWdpbkVudHJpZXMoKSB7CisJCWlmIChwbHVnaW5zID09IG51bGwpCisJCQlmdWxsUGFyc2UoKTsKKwkJcmV0dXJuIChQbHVnaW5FbnRyeVtdKXBsdWdpbnMudG9BcnJheShuZXcgUGx1Z2luRW50cnlbcGx1Z2lucy5zaXplKCldKTsKKwl9CisJCisJLyoqCisJICogU2V0cyB0aGUgdXJsIHN0cmluZyAocmVsYXRpdmUgdG8gdGhlIHNpdGUgdXJsKQorCSAqIEBwYXJhbSB1cmwKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRVUkwoU3RyaW5nIHVybCkgeworCQl0aGlzLnVybCA9IHVybDsKKwl9CisJCisJLyoqCisJICogQHJldHVybiB0aGUgZmVhdHVyZSB1cmwgKHJlbGF0aXZlIHRvIHRoZSBzaXRlKTogZmVhdHVyZXMvb3JnLmVjbGlwc2UucGxhdGZvcm0vCisJICovCisJcHVibGljIFN0cmluZyBnZXRVUkwoKSB7CisvLwkJaWYgKHVybCA9PSBudWxsKQorLy8JCQl1cmwgPSBGRUFUVVJFUyArICIvIiArIGlkICsgIl8iICsgdmVyc2lvbiArICIvIjsKKwkJcmV0dXJuIHVybDsKKwl9CisJCisJLyoKKwkgKiBAc2VlIElGZWF0dXJlRW50cnkjZ2V0RmVhdHVyZUlkZW50aWZpZXIoKQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0RmVhdHVyZUlkZW50aWZpZXIoKSB7CisJCXJldHVybiBpZDsKKwl9CisKKwkvKgorCSAqIEBzZWUgSUZlYXR1cmVFbnRyeSNnZXRGZWF0dXJlVmVyc2lvbigpCisJICovCisJcHVibGljIFN0cmluZyBnZXRGZWF0dXJlVmVyc2lvbigpIHsKKwkJcmV0dXJuIHZlcnNpb247CisJfQorCisJLyoKKwkgKiBAc2VlIElGZWF0dXJlRW50cnkjZ2V0RmVhdHVyZVBsdWdpblZlcnNpb24oKQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0RmVhdHVyZVBsdWdpblZlcnNpb24oKSB7CisJCXJldHVybiBwbHVnaW5WZXJzaW9uICE9IG51bGwgJiYgcGx1Z2luVmVyc2lvbi5sZW5ndGgoKSA+IDAgPyBwbHVnaW5WZXJzaW9uIDogbnVsbDsKKwl9CisKKwkvKgorCSAqIEBzZWUgSUZlYXR1cmVFbnRyeSNnZXRGZWF0dXJlUGx1Z2luSWRlbnRpZmllcigpCisJICovCisJcHVibGljIFN0cmluZyBnZXRGZWF0dXJlUGx1Z2luSWRlbnRpZmllcigpIHsKKwkJLy8gaWYgbm8gcGx1Z2luIGlzIHNwZWNpZmllZCwgdXNlIHRoZSBmZWF0dXJlIGlkCisJCXJldHVybiBwbHVnaW5JZGVudGlmaWVyICE9IG51bGwgJiYgcGx1Z2luSWRlbnRpZmllci5sZW5ndGgoKSA+IDAgPyBwbHVnaW5JZGVudGlmaWVyIDogaWQ7CisJfQorCQorCS8qCisJICogQHNlZSBJRmVhdHVyZUVudHJ5I2dldEZlYXR1cmVBcHBsaWNhdGlvbigpCisJICovCisJcHVibGljIFN0cmluZyBnZXRGZWF0dXJlQXBwbGljYXRpb24oKSB7CisJCXJldHVybiBhcHBsaWNhdGlvbjsKKwl9CisKKwkvKgorCSAqIEBzZWUgSUZlYXR1cmVFbnRyeSNnZXRGZWF0dXJlUm9vdFVSTHMoKQorCSAqLworCXB1YmxpYyBVUkxbXSBnZXRGZWF0dXJlUm9vdFVSTHMoKSB7CisJCXJldHVybiByb290OworCX0KKworCS8qCisJICogQHNlZSBJRmVhdHVyZUVudHJ5I2NhbkJlUHJpbWFyeSgpCisJICovCisJcHVibGljIGJvb2xlYW4gY2FuQmVQcmltYXJ5KCkgeworCQlyZXR1cm4gcHJpbWFyeTsKKwl9CisKKwlwdWJsaWMgRWxlbWVudCB0b1hNTChEb2N1bWVudCBkb2MpIHsKKwkJVVJMIGluc3RhbGxVUkwgPSBnZXRTaXRlKCkuZ2V0Q29uZmlnKCkuZ2V0SW5zdGFsbFVSTCgpOwkKKwkJCisJCUVsZW1lbnQgZmVhdHVyZUVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudChDRkdfRkVBVFVSRV9FTlRSWSk7CQkKKwkJLy8gd3JpdGUgb3V0IGZlYXR1cmUgZW50cnkgc2V0dGluZ3MKKwkJaWYgKGlkICE9IG51bGwpCisJCQlmZWF0dXJlRWxlbWVudC5zZXRBdHRyaWJ1dGUoQ0ZHX0ZFQVRVUkVfRU5UUllfSUQsIGlkKTsgCisJCWlmIChwcmltYXJ5KQorCQkJZmVhdHVyZUVsZW1lbnQuc2V0QXR0cmlidXRlKENGR19GRUFUVVJFX0VOVFJZX1BSSU1BUlksICJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKHZlcnNpb24gIT0gbnVsbCkKKwkJCWZlYXR1cmVFbGVtZW50LnNldEF0dHJpYnV0ZShDRkdfRkVBVFVSRV9FTlRSWV9WRVJTSU9OLCB2ZXJzaW9uKTsgCisJCWlmIChwbHVnaW5WZXJzaW9uICE9IG51bGwgJiYgIXBsdWdpblZlcnNpb24uZXF1YWxzKHZlcnNpb24pICYmIHBsdWdpblZlcnNpb24ubGVuZ3RoKCkgPiAwKQorCQkJZmVhdHVyZUVsZW1lbnQuc2V0QXR0cmlidXRlKENGR19GRUFUVVJFX0VOVFJZX1BMVUdJTl9WRVJTSU9OLCBwbHVnaW5WZXJzaW9uKTsgCisJCWlmIChwbHVnaW5JZGVudGlmaWVyICE9IG51bGwgJiYgIXBsdWdpbklkZW50aWZpZXIuZXF1YWxzKGlkKSAmJiBwbHVnaW5JZGVudGlmaWVyLmxlbmd0aCgpID4gMCkKKwkJCWZlYXR1cmVFbGVtZW50LnNldEF0dHJpYnV0ZShDRkdfRkVBVFVSRV9FTlRSWV9QTFVHSU5fSURFTlRJRklFUiwgcGx1Z2luSWRlbnRpZmllcik7CisJCWlmIChhcHBsaWNhdGlvbiAhPSBudWxsKQorCQkJZmVhdHVyZUVsZW1lbnQuc2V0QXR0cmlidXRlKENGR19GRUFUVVJFX0VOVFJZX0FQUExJQ0FUSU9OLCBhcHBsaWNhdGlvbik7CisJCWlmICh1cmwgIT0gbnVsbCkKKwkJCS8vIG1ha2UgZXh0ZXJuYWxpemVkIFVSTCBpbnN0YWxsIHJlbGF0aXZlCisJCQlmZWF0dXJlRWxlbWVudC5zZXRBdHRyaWJ1dGUoQ0ZHX1VSTCwgVXRpbHMubWFrZVJlbGF0aXZlKGluc3RhbGxVUkwsIHVybCkpOworCQkKKwkJVVJMW10gcm9vdHMgPSBnZXRGZWF0dXJlUm9vdFVSTHMoKTsKKwkJZm9yIChpbnQgaT0wOyBpPHJvb3RzLmxlbmd0aDsgaSsrKSB7CisJCQkvLyBtYWtlIGV4dGVybmFsaXplZCBVUkwgaW5zdGFsbCByZWxhdGl2ZQorCQkJU3RyaW5nIHJvb3QgPSBVdGlscy5tYWtlUmVsYXRpdmUoaW5zdGFsbFVSTCwgcm9vdHNbaV0pLnRvRXh0ZXJuYWxGb3JtKCk7CisJCQlpZiAocm9vdC50cmltKCkubGVuZ3RoKCkgPiAwKXsKKwkJCQlFbGVtZW50IHJvb3RFbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQoQ0ZHX0ZFQVRVUkVfRU5UUllfUk9PVCk7CisJCQkJcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKHJvb3QpKTsKKwkJCQlmZWF0dXJlRWxlbWVudC5hcHBlbmRDaGlsZChyb290RWxlbWVudCk7CisJCQl9CisJCX0KKwkJCisJCXJldHVybiBmZWF0dXJlRWxlbWVudDsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7CisJCXRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKKwl9CisJCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklCdW5kbGVHcm91cCNnZXRCdW5kbGVzKCkKKwkgKi8KKwlwdWJsaWMgQnVuZGxlW10gZ2V0QnVuZGxlcygpIHsKKwkJaWYgKHBsdWdpbnMgPT0gbnVsbCkKKwkJCWZ1bGxQYXJzZSgpOworCQkKKwkJQXJyYXlMaXN0IGJ1bmRsZXMgPSBuZXcgQXJyYXlMaXN0KHBsdWdpbnMuc2l6ZSgpKTsKKwkJZm9yIChpbnQgaT0wOyBpPHBsdWdpbnMuc2l6ZSgpOyBpKyspIHsKKwkJCVBsdWdpbkVudHJ5IHBsdWdpbiA9IChQbHVnaW5FbnRyeSlwbHVnaW5zLmdldChpKTsKKwkJCS8vIGdldCB0aGUgaGlnaGVzdCB2ZXJzaW9uIGZvciB0aGUgcGx1Z2luCisJCQlCdW5kbGUgYnVuZGxlID0gVXRpbHMuZ2V0QnVuZGxlKHBsdWdpbi5nZXRQbHVnaW5JZGVudGlmaWVyKCkpOworCQkJaWYgKGJ1bmRsZSAhPSBudWxsKQorCQkJCWJ1bmRsZXMuYWRkKGJ1bmRsZSk7CisJCX0KKwkJcmV0dXJuIChCdW5kbGVbXSlidW5kbGVzLnRvQXJyYXkobmV3IEJ1bmRsZVtidW5kbGVzLnNpemUoKV0pOworCX0KKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUJ1bmRsZUdyb3VwI2dldERlc2NyaXB0aW9uKCkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworCQlpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkKKwkJCWZ1bGxQYXJzZSgpOworCQlyZXR1cm4gZGVzY3JpcHRpb247CisJfQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQnVuZGxlR3JvdXAjZ2V0SWRlbnRpZmllcigpCisJICovCisJcHVibGljIFN0cmluZyBnZXRJZGVudGlmaWVyKCkgeworCQlyZXR1cm4gaWQ7CisJfQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQnVuZGxlR3JvdXAjZ2V0TmFtZSgpCisJICovCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlpZiAoYnJhbmRpbmcgPT0gbnVsbCkKKwkJCWJyYW5kaW5nID0gQWJvdXRJbmZvLnJlYWRGZWF0dXJlSW5mbyhpZCwgdmVyc2lvbiwgZ2V0RmVhdHVyZVBsdWdpbklkZW50aWZpZXIoKSk7CisJCXJldHVybiBicmFuZGluZy5nZXRQcm9kdWN0TmFtZSgpOworCX0KKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUJ1bmRsZUdyb3VwI2dldFByb3BlcnR5KGphdmEubGFuZy5TdHJpbmcpCisJICovCisJcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eShTdHJpbmcga2V5KSB7CisJCWlmIChrZXkgPT0gbnVsbCkKKwkJCXJldHVybiBudWxsOworCQkKKwkJaWYgKGJyYW5kaW5nID09IG51bGwpCisJCQlicmFuZGluZyA9IEFib3V0SW5mby5yZWFkRmVhdHVyZUluZm8oaWQsIHZlcnNpb24sIGdldEZlYXR1cmVQbHVnaW5JZGVudGlmaWVyKCkpOworCQkKKwkJLy8gSUJ1bmRsZUdyb3VwQ29uc3RhbnRzCisJCWlmIChrZXkuZXF1YWxzKEZFQVRVUkVfSU1BR0UpKQorCQkJcmV0dXJuIGJyYW5kaW5nLmdldEZlYXR1cmVJbWFnZVVSTCgpID09IG51bGwgPyBudWxsIDogYnJhbmRpbmcuZ2V0RmVhdHVyZUltYWdlVVJMKCkudG9FeHRlcm5hbEZvcm0oKTsKKwkJZWxzZSBpZiAoa2V5LmVxdWFscyhUSVBTX0FORF9UUklDS1NfSFJFRikpIAorCQkJcmV0dXJuIGJyYW5kaW5nLmdldFRpcHNBbmRUcmlja3NIcmVmKCk7CisJCWVsc2UgaWYgKGtleS5lcXVhbHMoSUJ1bmRsZUdyb3VwQ29uc3RhbnRzLldFTENPTUVfUEFHRSkpIC8vIHNhbWUgdmFsdWUgaXMgdXNlZCBieSBwcm9kdWN0IGFuZCBidW5kbGUgZ3JvdXAKKwkJCXJldHVybiBicmFuZGluZy5nZXRXZWxjb21lUGFnZVVSTCgpID09IG51bGwgPyBudWxsIDogYnJhbmRpbmcuZ2V0V2VsY29tZVBhZ2VVUkwoKS50b0V4dGVybmFsRm9ybSgpOworCQllbHNlIGlmIChrZXkuZXF1YWxzKFdFTENPTUVfUEVSU1BFQ1RJVkUpKQorCQkJcmV0dXJuIGJyYW5kaW5nLmdldFdlbGNvbWVQZXJzcGVjdGl2ZUlkKCk7CisJCWVsc2UgaWYgKGtleS5lcXVhbHMoQlJBTkRJTkdfQlVORExFX0lEKSkKKwkJCXJldHVybiBwbHVnaW5JZGVudGlmaWVyOworCQllbHNlIGlmIChrZXkuZXF1YWxzKEJSQU5ESU5HX0JVTkRMRV9WRVJTSU9OKSkKKwkJCXJldHVybiBwbHVnaW5WZXJzaW9uOworCQkvLyBJUHJvZHVjdENvbnN0YW50cworCQllbHNlIGlmIChrZXkuZXF1YWxzKEFQUF9OQU1FKSkgCisJCQlyZXR1cm4gYnJhbmRpbmcuZ2V0QXBwTmFtZSgpOworCQllbHNlIGlmIChrZXkuZXF1YWxzKEFCT1VUX1RFWFQpKQorCQkJcmV0dXJuIGJyYW5kaW5nLmdldEFib3V0VGV4dCgpOworCQllbHNlIGlmIChrZXkuZXF1YWxzKEFCT1VUX0lNQUdFKSkKKwkJCXJldHVybiBicmFuZGluZy5nZXRBYm91dEltYWdlVVJMKCkgPT0gbnVsbCA/IG51bGwgOiBicmFuZGluZy5nZXRBYm91dEltYWdlVVJMKCkudG9FeHRlcm5hbEZvcm0oKTsKKwkJZWxzZSBpZiAoa2V5LmVxdWFscyhXSU5ET1dfSU1BR0UpKQorCQkJcmV0dXJuIGJyYW5kaW5nLmdldFdpbmRvd0ltYWdlVVJMKCk9PSBudWxsID8gbnVsbCA6IGJyYW5kaW5nLmdldFdpbmRvd0ltYWdlVVJMKCkudG9FeHRlcm5hbEZvcm0oKTsKKwkJZWxzZSBpZiAoa2V5LmVxdWFscyhXSU5ET1dfSU1BR0VTKSkgeworCQkJVVJMW10gdXJscyA9IGJyYW5kaW5nLmdldFdpbmRvd0ltYWdlc1VSTHMoKTsKKwkJCWlmICh1cmxzID09IG51bGwpCisJCQkJcmV0dXJuIG51bGw7CisJCQlTdHJpbmdCdWZmZXIgd2luZG93SW1hZ2VzVVJMcyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJCWZvciAoaW50IGk9MDsgaTx1cmxzLmxlbmd0aDsgaSsrKXsKKwkJCQl3aW5kb3dJbWFnZXNVUkxzLmFwcGVuZCh1cmxzW2ldLnRvRXh0ZXJuYWxGb3JtKCkpOworCQkJCWlmIChpICE9IHVybHMubGVuZ3RoLTEpCisJCQkJCXdpbmRvd0ltYWdlc1VSTHMuYXBwZW5kKCcsJyk7CisJCQl9CisJCQlyZXR1cm4gd2luZG93SW1hZ2VzVVJMcy50b1N0cmluZygpOworCQl9IGVsc2UgaWYgKGtleS5lcXVhbHMoTElDRU5TRV9IUkVGKSkKKwkJCXJldHVybiBnZXRMaWNlbnNlVVJMKCk7CisJCQorCQlyZXR1cm4gbnVsbDsKKwl9CisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklCdW5kbGVHcm91cCNnZXRQcm92aWRlck5hbWUoKQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0UHJvdmlkZXJOYW1lKCkgeworCQlpZiAoYnJhbmRpbmcgPT0gbnVsbCkKKwkJCWJyYW5kaW5nID0gQWJvdXRJbmZvLnJlYWRGZWF0dXJlSW5mbyhpZCwgdmVyc2lvbiwgZ2V0RmVhdHVyZVBsdWdpbklkZW50aWZpZXIoKSk7CisJCXJldHVybiBicmFuZGluZy5nZXRQcm92aWRlck5hbWUoKTsKKwl9CisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklCdW5kbGVHcm91cCNnZXRWZXJzaW9uKCkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB7CisJCXJldHVybiB2ZXJzaW9uOworCX0KKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2R1Y3QjZ2V0QXBwbGljYXRpb24oKQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0QXBwbGljYXRpb24oKSB7CisJCXJldHVybiBhcHBsaWNhdGlvbjsKKwl9CisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9kdWN0I2dldElkKCkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldElkKCkgeworCQlyZXR1cm4gaWQ7CisJfQorCQorCXB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpeworCQlpZiAocmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkKKwkJCXJldHVybiByZXNvdXJjZUJ1bmRsZTsKKwkJCisJCS8vIERldGVybWluZSB0aGUgcHJvcGVydGllcyBmaWxlIGxvY2F0aW9uCisJCWlmIChzaXRlID09IG51bGwpCisJCQlyZXR1cm4gbnVsbDsKKwkJCisJCVJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IG51bGw7CisJCXRyeSB7CisJCQlVUkwgcHJvcGVydGllc1VSTCA9IG5ldyBVUkwoc2l0ZS5nZXRSZXNvbHZlZFVSTCgpLCBnZXRVUkwoKSk7CisJCQlDbGFzc0xvYWRlciBsID0gbmV3IFVSTENsYXNzTG9hZGVyKG5ldyBVUkxbXSB7IHByb3BlcnRpZXNVUkwgfSwgbnVsbCk7CisJCQlidW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoSUNvbmZpZ3VyYXRpb25Db25zdGFudHMuQ0ZHX0ZFQVRVUkVfRU5UUlksIFV0aWxzLmdldERlZmF1bHRMb2NhbGUoKSwgbCk7CisJCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7CisJCQlVdGlscy5sb2coZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOyAKKwkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKwkJCVV0aWxzLmxvZyhlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7IAorCQl9CisJCXJldHVybiBidW5kbGU7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldExpY2Vuc2VVUkwoU3RyaW5nIGxpY2Vuc2VVUkwpIHsKKwkJdGhpcy5saWNlbnNlVVJMID0gbGljZW5zZVVSTDsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRMaWNlbnNlVVJMKCkgeworCQlpZiAobGljZW5zZVVSTCA9PSBudWxsKQorCQkJZnVsbFBhcnNlKCk7CisJCWlmIChsaWNlbnNlVVJMID09IG51bGwpCisJCQlyZXR1cm4gbnVsbDsKKwkJCisJCVN0cmluZyByZXNvbHZlZFVSTCA9IFV0aWxzLmdldFJlc291cmNlU3RyaW5nKGdldFJlc291cmNlQnVuZGxlKCksIGxpY2Vuc2VVUkwpOworCQlpZiAocmVzb2x2ZWRVUkwuc3RhcnRzV2l0aCgiaHR0cDovLyIpKSAvLyROT04tTkxTLTEkCisJCQlyZXR1cm4gcmVzb2x2ZWRVUkw7CisJCXRyeSB7CisJCQlyZXR1cm4gbmV3IFVSTChnZXRTaXRlKCkuZ2V0UmVzb2x2ZWRVUkwoKSwgZ2V0VVJMKCkgKyByZXNvbHZlZFVSTCkudG9FeHRlcm5hbEZvcm0oKTsKKwkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiByZXNvbHZlZFVSTDsKKwkJfQorCX0KKwkKKwlwcml2YXRlIHZvaWQgZnVsbFBhcnNlKCkgeworCQlpZiAoZnVsbHlQYXJzZWQpCisJCQlyZXR1cm47CisJCWZ1bGx5UGFyc2VkID0gdHJ1ZTsKKwkJaWYgKHBsdWdpbnMgPT0gbnVsbCkgCisJCQlwbHVnaW5zID0gbmV3IEFycmF5TGlzdCgpOworCQlGdWxsRmVhdHVyZVBhcnNlciBwYXJzZXIgPSBuZXcgRnVsbEZlYXR1cmVQYXJzZXIodGhpcyk7CisJCXBhcnNlci5wYXJzZSgpOworCX0KKwkKKwlwdWJsaWMgQnVuZGxlIGdldERlZmluaW5nQnVuZGxlKCkgeworCQlyZXR1cm4gVXRpbHMuZ2V0QnVuZGxlKGdldEZlYXR1cmVQbHVnaW5JZGVudGlmaWVyKCkpOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBoYXNCcmFuZGluZygpIHsKKyAgICAgICAgU3RyaW5nIGJ1bmRsZUlkID0gZ2V0RmVhdHVyZVBsdWdpbklkZW50aWZpZXIoKTsKKwkJcmV0dXJuIGJ1bmRsZUlkICE9IG51bGwgJiYgVXRpbHMuZ2V0QnVuZGxlKGJ1bmRsZUlkKSAhPSBudWxsOworCX0KK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL0ZlYXR1cmVQYXJzZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL0ZlYXR1cmVQYXJzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmNlNTk5Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb25maWd1cmF0b3IvRmVhdHVyZVBhcnNlci5qYXZhCkBAIC0wLDAgKzEsMTM1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvbmZpZ3VyYXRvcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEubmV0Lio7CisKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy4qOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKK2ltcG9ydCBvcmcueG1sLnNheC4qOworaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuKjsKKworLyoqCisgKiBEZWZhdWx0IGZlYXR1cmUgcGFyc2VyLgorICogUGFyc2VzIHRoZSBmZWF0dXJlIG1hbmlmZXN0IGZpbGUgYXMgZGVmaW5lZCBieSB0aGUgcGxhdGZvcm0uCisgKiAKKyAqIEBzaW5jZSAzLjAKKyAqLworcHVibGljIGNsYXNzIEZlYXR1cmVQYXJzZXIgZXh0ZW5kcyBEZWZhdWx0SGFuZGxlciB7CisKKwlwcml2YXRlIFNBWFBhcnNlciBwYXJzZXI7CisJcHJpdmF0ZSBGZWF0dXJlRW50cnkgZmVhdHVyZTsKKwlwcml2YXRlIFVSTCB1cmw7CisKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBTQVhQYXJzZXJGYWN0b3J5IHBhcnNlckZhY3RvcnkgPQorCQlTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGEgZmVhdHVyZSBwYXJzZXIuCisJICovCisJcHVibGljIEZlYXR1cmVQYXJzZXIoKSB7CisJCXN1cGVyKCk7CisJCXRyeSB7CisJCQlwYXJzZXJGYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOworCQkJdGhpcy5wYXJzZXIgPSBwYXJzZXJGYWN0b3J5Lm5ld1NBWFBhcnNlcigpOworCQl9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbihlKTsKKwkJfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbihlKTsKKwkJfQorCX0KKwkvKioKKwkgKiBQYXJzZXMgdGhlIHNwZWNpZmllZCB1cmwgYW5kIGNvbnN0cnVjdHMgYSBmZWF0dXJlCisJICovCisJcHVibGljIEZlYXR1cmVFbnRyeSBwYXJzZShVUkwgZmVhdHVyZVVSTCl7CisJCWZlYXR1cmU9bnVsbDsKKwkJSW5wdXRTdHJlYW0gaW4gPSBudWxsOworCQl0cnkgeworCQkJdGhpcy51cmwgPSBmZWF0dXJlVVJMOworCQkJaW4gPSBmZWF0dXJlVVJMLm9wZW5TdHJlYW0oKTsKKwkJCXBhcnNlci5wYXJzZShuZXcgSW5wdXRTb3VyY2UoaW4pLCB0aGlzKTsKKwkJfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQl9IGZpbmFsbHkgeworCQkJaWYgKGluICE9IG51bGwpCisJCQkJdHJ5IHsKKwkJCQkJaW4uY2xvc2UoKTsKKwkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMSkgeworCQkJCQlVdGlscy5sb2coZTEuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKKwkJCQl9CisJCX0KKwkJcmV0dXJuIGZlYXR1cmU7CisJfQorCisJLyoqCisJICogSGFuZGxlIHN0YXJ0IG9mIGVsZW1lbnQgdGFncworCSAqIEBzZWUgRGVmYXVsdEhhbmRsZXIjc3RhcnRFbGVtZW50KFN0cmluZywgU3RyaW5nLCBTdHJpbmcsIEF0dHJpYnV0ZXMpCisJICogQHNpbmNlIDIuMAorCSAqLworCXB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisKKwkJVXRpbHMuZGVidWcoIlN0YXJ0IEVsZW1lbnQ6IHVyaToiICsgdXJpICsgIiBsb2NhbCBOYW1lOiIgKyBsb2NhbE5hbWUgKyAiIHFOYW1lOiIgKyBxTmFtZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisKKwkJaWYgKCJmZWF0dXJlIi5lcXVhbHMobG9jYWxOYW1lKSkgeyAvLyROT04tTkxTLTEkCisJCQlwcm9jZXNzRmVhdHVyZShhdHRyaWJ1dGVzKTsKKwkJCS8vIHN0b3AgcGFyc2luZyBub3cKKwkJCXRocm93IG5ldyBTQVhFeGNlcHRpb24oIiIpOyAvLyROT04tTkxTLTEkCisJCX0gCisJfQorCisJLyoKKwkgKiBQcm9jZXNzIGZlYXR1cmUgaW5mb3JtYXRpb24KKwkgKi8KKwlwcml2YXRlIHZvaWQgcHJvY2Vzc0ZlYXR1cmUoQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7CisKKwkJLy8gaWRlbnRpZmllciBhbmQgdmVyc2lvbgorCQlTdHJpbmcgaWQgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJpZCIpOyAvLyROT04tTkxTLTEkCisJCVN0cmluZyB2ZXIgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJ2ZXJzaW9uIik7IC8vJE5PTi1OTFMtMSQKKworCQlpZiAoaWQgPT0gbnVsbCB8fCBpZC50cmltKCkuZXF1YWxzKCIiKSAvLyROT04tTkxTLTEkCisJCXx8IHZlciA9PSBudWxsIHx8IHZlci50cmltKCkuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCisJCQlTeXN0ZW0ub3V0LnByaW50bG4oTkxTLmJpbmQoTWVzc2FnZXMuRmVhdHVyZVBhcnNlcl9JZE9yVmVyc2lvbkludmFsaWQsIChuZXcgU3RyaW5nW10geyBpZCwgdmVyfSkpKTsKKwkJfSBlbHNlIHsKKy8vCQkJU3RyaW5nIGxhYmVsID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgibGFiZWwiKTsgLy8kTk9OLU5MUy0xJAorLy8JCQlTdHJpbmcgcHJvdmlkZXIgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJwcm92aWRlci1uYW1lIik7IC8vJE5PTi1OTFMtMSQKKy8vCQkJU3RyaW5nIGltYWdlVVJMID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiaW1hZ2UiKTsgLy8kTk9OLU5MUy0xJAorCQkJU3RyaW5nIG9zID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgib3MiKTsgLy8kTk9OLU5MUy0xJAorCQkJU3RyaW5nIHdzID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgid3MiKTsgLy8kTk9OLU5MUy0xJAorCQkJU3RyaW5nIG5sID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgibmwiKTsgLy8kTk9OLU5MUy0xJAorCQkJU3RyaW5nIGFyY2ggPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJhcmNoIik7IC8vJE5PTi1OTFMtMSQKKwkJCWlmICghVXRpbHMuaXNWYWxpZEVudmlyb25tZW50KG9zLCB3cywgYXJjaCwgbmwpKSAKKwkJCQlyZXR1cm47CisvLwkJCVN0cmluZyBleGNsdXNpdmUgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJleGNsdXNpdmUiKTsgLy8kTk9OLU5MUy0xJAorLy8JCQlTdHJpbmcgYWZmaW5pdHkgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJjb2xvY2F0aW9uLWFmZmluaXR5Iik7IC8vJE5PTi1OTFMtMSQKKworCQkJU3RyaW5nIHByaW1hcnkgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJwcmltYXJ5Iik7IC8vJE5PTi1OTFMtMSQKKwkJCWJvb2xlYW4gaXNQcmltYXJ5ID0gInRydWUiLmVxdWFscyhwcmltYXJ5KTsgLy8kTk9OLU5MUy0xJAorCQkJU3RyaW5nIGFwcGxpY2F0aW9uID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiYXBwbGljYXRpb24iKTsgLy8kTk9OLU5MUy0xJAorCQkJU3RyaW5nIHBsdWdpbiA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInBsdWdpbiIpOyAvLyROT04tTkxTLTEkCisKKwkJCS8vVE9ETyByb290VVJMcworCQkJZmVhdHVyZSA9IG5ldyBGZWF0dXJlRW50cnkoaWQsIHZlciwgcGx1Z2luLCAiIiwgaXNQcmltYXJ5LCBhcHBsaWNhdGlvbiwgbnVsbCApOyAvLyROT04tTkxTLTEkCisJCQlpZiAoImZpbGUiLmVxdWFscyh1cmwuZ2V0UHJvdG9jb2woKSkpIHsgLy8kTk9OLU5MUy0xJAorCQkJCUZpbGUgZiA9IG5ldyBGaWxlKHVybC5nZXRGaWxlKCkucmVwbGFjZSgnLycsIEZpbGUuc2VwYXJhdG9yQ2hhcikpOworCQkJCWZlYXR1cmUuc2V0VVJMKCJmZWF0dXJlcyIgKyAiLyIgKyBmLmdldFBhcmVudEZpbGUoKS5nZXROYW1lKCkgKyAiLyIpOy8vICsgZi5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJfSBlbHNlIHsKKwkJCQkvLyBleHRlcm5hbGl6ZWQgVVJMcyBtaWdodCBiZSBpbiByZWxhdGl2ZSBmb3JtLCBlbnN1cmUgdGhleSBhcmUgYWJzb2x1dGUJCQkJCisJCQkJZmVhdHVyZS5zZXRVUkwoVXRpbHMubWFrZUFic29sdXRlKFV0aWxzLmdldEluc3RhbGxVUkwoKSwgdXJsKS50b0V4dGVybmFsRm9ybSgpKTsKKwkJCX0KKworCQkJVXRpbHMuCisJCQkJZGVidWcoIkVuZCBwcm9jZXNzIERlZmF1bHRGZWF0dXJlIHRhZzogaWQ6IiAraWQgKyAiIHZlcjoiICt2ZXIgKyAiIHVybDoiICsgZmVhdHVyZS5nZXRVUkwoKSk7IAkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL0Z1bGxGZWF0dXJlUGFyc2VyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvbmZpZ3VyYXRvci9GdWxsRmVhdHVyZVBhcnNlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0NzU2MjYKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvbmZpZ3VyYXRvci9GdWxsRmVhdHVyZVBhcnNlci5qYXZhCkBAIC0wLDAgKzEsMTUwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvbmZpZ3VyYXRvcjsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEubmV0Lio7CitpbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOworCitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuKjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CitpbXBvcnQgb3JnLnhtbC5zYXguKjsKK2ltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLio7CisKKy8qKgorICogQSBtb3JlIGNvbXBsZXRlIGZlYXR1cmUgcGFyc2VyLiBJdCBhZGRzIHRoZSBwbHVnaW5zIGxpc3RlZCB0byB0aGUgZmVhdHVyZS4KKyAqLworcHVibGljIGNsYXNzIEZ1bGxGZWF0dXJlUGFyc2VyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIgaW1wbGVtZW50cyBJQ29uZmlndXJhdGlvbkNvbnN0YW50c3sKKworCXByaXZhdGUgU0FYUGFyc2VyIHBhcnNlcjsKKwlwcml2YXRlIEZlYXR1cmVFbnRyeSBmZWF0dXJlOworCXByaXZhdGUgVVJMIHVybDsKKwlwcml2YXRlIGJvb2xlYW4gaXNEZXNjcmlwdGlvbjsKKwlwcml2YXRlIFN0cmluZ0J1ZmZlciBkZXNjcmlwdGlvbiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKworCXByaXZhdGUgZmluYWwgc3RhdGljIFNBWFBhcnNlckZhY3RvcnkgcGFyc2VyRmFjdG9yeSA9CisJCVNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBmZWF0dXJlIHBhcnNlci4KKwkgKi8KKwlwdWJsaWMgRnVsbEZlYXR1cmVQYXJzZXIoRmVhdHVyZUVudHJ5IGZlYXR1cmUpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5mZWF0dXJlID0gZmVhdHVyZTsKKwkJdHJ5IHsKKwkJCXBhcnNlckZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7CisJCQl0aGlzLnBhcnNlciA9IHBhcnNlckZhY3RvcnkubmV3U0FYUGFyc2VyKCk7CisJCX0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgeworCQkJU3lzdGVtLm91dC5wcmludGxuKGUpOworCQl9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgeworCQkJU3lzdGVtLm91dC5wcmludGxuKGUpOworCQl9CisJfQorCS8qKgorCSAqLworCXB1YmxpYyB2b2lkIHBhcnNlKCl7CisJCUlucHV0U3RyZWFtIGluID0gbnVsbDsKKwkJdHJ5IHsKKwkJCWlmIChmZWF0dXJlLmdldFNpdGUoKSA9PSBudWxsKQorCQkJCXJldHVybjsKKwkJCXRoaXMudXJsID0gbmV3IFVSTChmZWF0dXJlLmdldFNpdGUoKS5nZXRSZXNvbHZlZFVSTCgpLCBmZWF0dXJlLmdldFVSTCgpICsgRkVBVFVSRV9YTUwpOworCQkJaW4gPSB1cmwub3BlblN0cmVhbSgpOworCQkJcGFyc2VyLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShpbiksIHRoaXMpOworCQl9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgeworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCX0gZmluYWxseSB7CisJCQlpZiAoaW4gIT0gbnVsbCkKKwkJCQl0cnkgeworCQkJCQlpbi5jbG9zZSgpOworCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUxKSB7CisJCQkJCVV0aWxzLmxvZyhlMS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOworCQkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIEhhbmRsZSBzdGFydCBvZiBlbGVtZW50IHRhZ3MKKwkgKiBAc2VlIERlZmF1bHRIYW5kbGVyI3N0YXJ0RWxlbWVudChTdHJpbmcsIFN0cmluZywgU3RyaW5nLCBBdHRyaWJ1dGVzKQorCSAqIEBzaW5jZSAyLjAKKwkgKi8KKwlwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBTQVhFeGNlcHRpb24geworCisJCVV0aWxzLmRlYnVnKCJTdGFydCBFbGVtZW50OiB1cmk6IiArIHVyaSArICIgbG9jYWwgTmFtZToiICsgbG9jYWxOYW1lICsgIiBxTmFtZToiICsgcU5hbWUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCisJCWlmICgicGx1Z2luIi5lcXVhbHMobG9jYWxOYW1lKSkgeyAvLyROT04tTkxTLTEkCisJCQlwcm9jZXNzUGx1Z2luKGF0dHJpYnV0ZXMpOworCQl9IGVsc2UgaWYgKCJkZXNjcmlwdGlvbiIuZXF1YWxzKGxvY2FsTmFtZSkpeyAvLyROT04tTkxTLTEkCisJCQlpc0Rlc2NyaXB0aW9uID0gdHJ1ZTsKKwkJfSBlbHNlIGlmICgibGljZW5zZSIuZXF1YWxzKGxvY2FsTmFtZSkpIHsgLy8kTk9OLU5MUy0xJAorCQkJcHJvY2Vzc0xpY2Vuc2UoYXR0cmlidXRlcyk7CisJCX0KKwl9CisKKwkvKgorCSAqIFByb2Nlc3MgZmVhdHVyZSBpbmZvcm1hdGlvbgorCSAqLworCXByaXZhdGUgdm9pZCBwcm9jZXNzUGx1Z2luKEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgeworCisJCS8vIGlkZW50aWZpZXIgYW5kIHZlcnNpb24KKwkJU3RyaW5nIGlkID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiaWQiKTsgLy8kTk9OLU5MUy0xJAorCQlTdHJpbmcgdmVyID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgidmVyc2lvbiIpOyAvLyROT04tTkxTLTEkCisKKwkJaWYgKGlkID09IG51bGwgfHwgaWQudHJpbSgpLmVxdWFscygiIikgLy8kTk9OLU5MUy0xJAorCQl8fCB2ZXIgPT0gbnVsbCB8fCB2ZXIudHJpbSgpLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJU3lzdGVtLm91dC5wcmludGxuKE5MUy5iaW5kKE1lc3NhZ2VzLkZlYXR1cmVQYXJzZXJfSWRPclZlcnNpb25JbnZhbGlkLCAobmV3IFN0cmluZ1tdIHsgaWQsIHZlcn0pKSk7CisJCX0gZWxzZSB7CisvLwkJCVN0cmluZyBsYWJlbCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImxhYmVsIik7IC8vJE5PTi1OTFMtMSQKKy8vCQkJU3RyaW5nIHByb3ZpZGVyID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgicHJvdmlkZXItbmFtZSIpOyAvLyROT04tTkxTLTEkCisJCQlTdHJpbmcgbmwgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJubCIpOyAvLyROT04tTkxTLTEkCisJCQlTdHJpbmcgb3MgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJvcyIpOyAvLyROT04tTkxTLTEkCisJCQlTdHJpbmcgd3MgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJ3cyIpOyAvLyROT04tTkxTLTEkCisJCQlTdHJpbmcgYXJjaCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImFyY2giKTsgLy8kTk9OLU5MUy0xJAorCQkJaWYgKCFVdGlscy5pc1ZhbGlkRW52aXJvbm1lbnQob3MsIHdzLCBhcmNoLG5sKSkKKwkJCQlyZXR1cm47CisKKwkJCVBsdWdpbkVudHJ5IHBsdWdpbiA9IG5ldyBQbHVnaW5FbnRyeSgpOworCQkJcGx1Z2luLnNldFBsdWdpbklkZW50aWZpZXIoaWQpOworCQkJcGx1Z2luLnNldFBsdWdpblZlcnNpb24odmVyKTsKKwkJCWZlYXR1cmUuYWRkUGx1Z2luKHBsdWdpbik7CisJCQkKKwkJCVV0aWxzLgorCQkJCWRlYnVnKCJFbmQgcHJvY2VzcyBEZWZhdWx0RmVhdHVyZSB0YWc6IGlkOiIgK2lkICsgIiB2ZXI6IiArdmVyICsgIiB1cmw6IiArIGZlYXR1cmUuZ2V0VVJMKCkpOyAJIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCX0KKwl9CisJCisJcHJpdmF0ZSB2b2lkIHByb2Nlc3NMaWNlbnNlKEF0dHJpYnV0ZXMgYXR0cmlidXRlcyApeworCQlmZWF0dXJlLnNldExpY2Vuc2VVUkwoYXR0cmlidXRlcy5nZXRWYWx1ZSgidXJsIikpOyAvLyROT04tTkxTLTEkCisJfQorCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyI2NoYXJhY3RlcnMoY2hhcltdLCBpbnQsIGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBjaGFyYWN0ZXJzKGNoYXJbXSBjaCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKQorCQkJdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisJCWlmICghaXNEZXNjcmlwdGlvbikKKwkJCXJldHVybjsKKwkJZGVzY3JpcHRpb24uYXBwZW5kKGNoLCBzdGFydCwgbGVuZ3RoKTsKKwl9CisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXIjZW5kRWxlbWVudChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQorCSAqLworCXB1YmxpYyB2b2lkIGVuZEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lKQorCQkJdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisJCWlmICgiZGVzY3JpcHRpb24iLmVxdWFscyhsb2NhbE5hbWUpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCWlzRGVzY3JpcHRpb24gPSBmYWxzZTsKKwkJCVN0cmluZyBkID0gZGVzY3JpcHRpb24udG9TdHJpbmcoKS50cmltKCk7CisJCQlSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBmZWF0dXJlLmdldFJlc291cmNlQnVuZGxlKCk7CisJCQlmZWF0dXJlLnNldERlc2NyaXB0aW9uKFV0aWxzLmdldFJlc291cmNlU3RyaW5nKGJ1bmRsZSwgZCkpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb25maWd1cmF0b3IvSUNvbmZpZ3VyYXRpb25Db25zdGFudHMuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL0lDb25maWd1cmF0aW9uQ29uc3RhbnRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTcyMDViYwotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL0lDb25maWd1cmF0aW9uQ29uc3RhbnRzLmphdmEKQEAgLTAsMCArMSw1OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb25maWd1cmF0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLklQbGF0Zm9ybUNvbmZpZ3VyYXRpb24uKjsKKworLyoqCisgKiBDb25zdGFudHMKKyAqLworcHVibGljIGludGVyZmFjZSBJQ29uZmlndXJhdGlvbkNvbnN0YW50cyB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRV9QUk9EVUNUID0gImVjbGlwc2UucHJvZHVjdCI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFX0FQUExJQ0FUSU9OID0gImVjbGlwc2UuYXBwbGljYXRpb24iOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0ZHID0gImNvbmZpZyI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDRkdfU0lURSA9ICJzaXRlIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENGR19VUkwgPSAidXJsIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENGR19QT0xJQ1kgPSAicG9saWN5IjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gQ0ZHX1BPTElDWV9UWVBFID0geyAiVVNFUi1JTkNMVURFIiwgIlVTRVItRVhDTFVERSIsICJNQU5BR0VELU9OTFkiIH07IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0ZHX1BPTElDWV9UWVBFX1VOS05PV04gPSAiVU5LTk9XTiI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDRkdfTElTVCA9ICJsaXN0IjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENGR19VUERBVEVBQkxFID0gInVwZGF0ZWFibGUiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0ZHX0xJTktfRklMRSA9ICJsaW5rZmlsZSI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDRkdfRkVBVFVSRV9FTlRSWSA9ICJmZWF0dXJlIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENGR19GRUFUVVJFX0VOVFJZX0lEID0gImlkIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENGR19GRUFUVVJFX0VOVFJZX1BSSU1BUlkgPSAicHJpbWFyeSI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDRkdfRkVBVFVSRV9FTlRSWV9WRVJTSU9OID0gInZlcnNpb24iOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0ZHX0ZFQVRVUkVfRU5UUllfUExVR0lOX1ZFUlNJT04gPSAicGx1Z2luLXZlcnNpb24iOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0ZHX0ZFQVRVUkVfRU5UUllfUExVR0lOX0lERU5USUZJRVIgPSAicGx1Z2luLWlkZW50aWZpZXIiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0ZHX0ZFQVRVUkVfRU5UUllfQVBQTElDQVRJT04gPSAiYXBwbGljYXRpb24iOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0ZHX0ZFQVRVUkVfRU5UUllfUk9PVCA9ICJyb290IjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENGR19EQVRFID0gImRhdGUiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0ZHX1BMVUdJTiA9ICJwbHVnaW4iOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0ZHX0ZSQUdNRU5UID0gImZyYWdtZW50IjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENGR19FTkFCTEVEID0gImVuYWJsZWQiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0ZHX1NIQVJFRF9VUkwgPSAic2hhcmVkX3VyIjsgLy8kTk9OLU5MUy0xJAorCQorCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0ZHX1ZFUlNJT04gPSAidmVyc2lvbiI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDRkdfVFJBTlNJRU5UID0gInRyYW5zaWVudCI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OID0gIjMuMCI7IC8vJE5PTi1OTFMtMSQKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfUE9MSUNZX1RZUEUgPSBJU2l0ZVBvbGljeS5VU0VSX0VYQ0xVREU7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBERUZBVUxUX1BPTElDWV9MSVNUID0gbmV3IFN0cmluZ1swXTsKKwkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5TID0gInBsdWdpbnMiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkVBVFVSRVMgPSAiZmVhdHVyZXMiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX1hNTCA9ICJwbHVnaW4ueG1sIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZSQUdNRU5UX1hNTCA9ICJmcmFnbWVudC54bWwiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUQV9NQU5JRkVTVF9NRiA9ICJNRVRBLUlORi9NQU5JRkVTVC5NRiI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGRUFUVVJFX1hNTCA9ICJmZWF0dXJlLnhtbCI7IC8vJE5PTi1OTFMtMSQKK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL0xvY2tlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb25maWd1cmF0b3IvTG9ja2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE3NmVhYgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL0xvY2tlci5qYXZhCkBAIC0wLDAgKzEsMjEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29uZmlndXJhdG9yOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworLyoqCisgKiBJbnRlcm5hbCBjbGFzcy4KKyAqLworcHVibGljIGludGVyZmFjZSBMb2NrZXIgeworCXB1YmxpYyBib29sZWFuIGxvY2soKSB0aHJvd3MgSU9FeGNlcHRpb247CisJcHVibGljIHZvaWQgcmVsZWFzZSgpOworfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb25maWd1cmF0b3IvTG9ja2VyX0phdmFJby5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb25maWd1cmF0b3IvTG9ja2VyX0phdmFJby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MmVhMWUKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvbmZpZ3VyYXRvci9Mb2NrZXJfSmF2YUlvLmphdmEKQEAgLTAsMCArMSw1MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb25maWd1cmF0b3I7CisKK2ltcG9ydCBqYXZhLmlvLio7CisKKy8qKgorICogSW50ZXJuYWwgY2xhc3MuCisgKi8KK3B1YmxpYyBjbGFzcyBMb2NrZXJfSmF2YUlvIGltcGxlbWVudHMgTG9ja2VyIHsKKwlwcml2YXRlIEZpbGUgbG9ja0ZpbGU7CisJcHJpdmF0ZSBSYW5kb21BY2Nlc3NGaWxlIGxvY2tSQUY7CisKKwlwdWJsaWMgTG9ja2VyX0phdmFJbyhGaWxlIGxvY2tGaWxlKSB7CisJCXRoaXMubG9ja0ZpbGUgPSBsb2NrRmlsZTsKKwl9CisKKwlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gbG9jaygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCS8vaWYgdGhlIGxvY2sgZmlsZSBhbHJlYWR5IGV4aXN0cywgdHJ5IHRvIGRlbGV0ZSwKKwkJLy9hc3N1bWUgZmFpbHVyZSBtZWFucyBhbm90aGVyIGVjbGlwc2UgaGFzIGl0IG9wZW4KKwkJaWYgKGxvY2tGaWxlLmV4aXN0cygpKQorCQkJbG9ja0ZpbGUuZGVsZXRlKCk7CisJCWlmIChsb2NrRmlsZS5leGlzdHMoKSkKKwkJCXJldHVybiBmYWxzZTsKKworCQkvL29wZW4gdGhlIGxvY2sgZmlsZSBzbyBvdGhlciBpbnN0YW5jZXMgY2FuJ3QgY28tZXhpc3QKKwkJbG9ja1JBRiA9IG5ldyBSYW5kb21BY2Nlc3NGaWxlKGxvY2tGaWxlLCAicnciKTsgLy8kTk9OLU5MUy0xJAorCQlsb2NrUkFGLndyaXRlQnl0ZSgwKTsKKworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVsZWFzZSgpIHsKKwkJdHJ5IHsKKwkJCWlmIChsb2NrUkFGICE9IG51bGwpIHsKKwkJCQlsb2NrUkFGLmNsb3NlKCk7CisJCQkJbG9ja1JBRiA9IG51bGw7CisJCQl9CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCS8vZG9uJ3QgY29tcGxhaW4sIHdlJ3JlIG1ha2luZyBhIGJlc3QgZWZmb3J0IHRvIGNsZWFuIHVwCisJCX0KKwkJaWYgKGxvY2tGaWxlICE9IG51bGwpCisJCQlsb2NrRmlsZS5kZWxldGUoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvbmZpZ3VyYXRvci9Mb2NrZXJfSmF2YU5pby5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb25maWd1cmF0b3IvTG9ja2VyX0phdmFOaW8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2ZhZDM0Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb25maWd1cmF0b3IvTG9ja2VyX0phdmFOaW8uamF2YQpAQCAtMCwwICsxLDcxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAgKiAgICBBbmRyZWkgTG9za3V0b3YgLSBidWcgNDQ3MzUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29uZmlndXJhdG9yOworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLkZpbGVMb2NrOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLk92ZXJsYXBwaW5nRmlsZUxvY2tFeGNlcHRpb247CisKKy8qKgorICogSW50ZXJuYWwgY2xhc3MuCisgKi8KK3B1YmxpYyBjbGFzcyBMb2NrZXJfSmF2YU5pbyBpbXBsZW1lbnRzIExvY2tlciB7CisJcHJpdmF0ZSBGaWxlIGxvY2tGaWxlOworCXByaXZhdGUgUmFuZG9tQWNjZXNzRmlsZSByYWY7CisJcHJpdmF0ZSBGaWxlTG9jayBmaWxlTG9jazsKKworCXB1YmxpYyBMb2NrZXJfSmF2YU5pbyhGaWxlIGxvY2tGaWxlKSB7CisJCXRoaXMubG9ja0ZpbGUgPSBsb2NrRmlsZTsKKwl9CisKKwlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gbG9jaygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXJhZiA9IG5ldyBSYW5kb21BY2Nlc3NGaWxlKGxvY2tGaWxlLCAicnciKTsgLy8kTk9OLU5MUy0xJAorCQl0cnl7CisJCQkvKgorCQkJICogZml4IGZvciBidWcgaHR0cDovL2J1Z3Muc3VuLmNvbS92aWV3X2J1Zy5kbz9idWdfaWQ9NjYyODU3NSBhbmQKKwkJCSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD00NDczNSNjMTcKKwkJCSAqLworCQkJZmlsZUxvY2sgPSByYWYuZ2V0Q2hhbm5lbCgpLnRyeUxvY2soMCwgMSwgZmFsc2UpOworCQl9IGNhdGNoKE92ZXJsYXBwaW5nRmlsZUxvY2tFeGNlcHRpb24gZSkgeworCQkJZmlsZUxvY2sgPSBudWxsOworCQl9IGZpbmFsbHkgeworCQkJaWYgKGZpbGVMb2NrICE9IG51bGwpCisJCQkJcmV0dXJuIHRydWU7CisJCQlyYWYuY2xvc2UoKTsKKwkJCXJhZiA9IG51bGw7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZWxlYXNlKCkgeworCQlpZiAoZmlsZUxvY2sgIT0gbnVsbCkgeworCQkJdHJ5IHsKKwkJCQlmaWxlTG9jay5yZWxlYXNlKCk7CisJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJLy9kb24ndCBjb21wbGFpbiwgd2UncmUgbWFraW5nIGEgYmVzdCBlZmZvcnQgdG8gY2xlYW4gdXAKKwkJCX0KKwkJCWZpbGVMb2NrID0gbnVsbDsKKwkJfQorCQlpZiAocmFmICE9IG51bGwpIHsKKwkJCXRyeSB7CisJCQkJcmFmLmNsb3NlKCk7CisJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJLy9kb24ndCBjb21wbGFpbiwgd2UncmUgbWFraW5nIGEgYmVzdCBlZmZvcnQgdG8gY2xlYW4gdXAKKwkJCX0KKwkJCXJhZiA9IG51bGw7CisJCX0KKwkJaWYgKGxvY2tGaWxlICE9IG51bGwpIHsKKwkJCWxvY2tGaWxlLmRlbGV0ZSgpOworCQkJbG9ja0ZpbGUgPSBudWxsOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb25maWd1cmF0b3IvTWVzc2FnZXMuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL01lc3NhZ2VzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY4ODhhNgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL01lc3NhZ2VzLmphdmEKQEAgLTAsMCArMSw2NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb25maWd1cmF0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworCitwdWJsaWMgZmluYWwgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMgeworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb25maWd1cmF0b3IubWVzc2FnZXMiOy8vJE5PTi1OTFMtMSQKKworCXByaXZhdGUgTWVzc2FnZXMoKSB7CisJCS8vIERvIG5vdCBpbnN0YW50aWF0ZQorCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNmaWdfdW5hYmxlVG9Mb2FkX25vVVJMOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNmaWdfdW5hYmxlVG9TYXZlX25vVVJMOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNmaWdfdW5hYmxlVG9TYXZlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbGxlZFNpdGVQYXJzZXJfVW5hYmxlVG9DcmVhdGVVUkw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zdGFsbGVkU2l0ZVBhcnNlcl9VbmFibGVUb0NyZWF0ZVVSTEZvckZpbGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zdGFsbGVkU2l0ZVBhcnNlcl9FcnJvclBhcnNpbmdGaWxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbGxlZFNpdGVQYXJzZXJfRXJyb3JBY2Nlc3Npbmc7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zdGFsbGVkU2l0ZVBhcnNlcl9kYXRlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJ1bmRsZU1hbmlmZXN0X25vVmVyc2lvbjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBGZWF0dXJlUGFyc2VyX0lkT3JWZXJzaW9uSW52YWxpZDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBCdW5kbGVHcm91cFByb3ZpZGVyOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25BY3RpdmF0b3JfaW5pdGlhbGl6ZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uQWN0aXZhdG9yX2NyZWF0ZUNvbmZpZzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uQWN0aXZhdG9yX3VuaW5zdGFsbEJ1bmRsZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uUGFyc2VyX2Nhbm5vdExvYWRTaGFyZWRJbnN0YWxsOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25BY3RpdmF0b3JfaW5zdGFsbEJ1bmRsZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBQbHVnaW5FbnRyeV92ZXJzaW9uRXJyb3I7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSW5pRmlsZVJlYWRlcl9NaXNzaW5nRGVzYzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBJbmlGaWxlUmVhZGVyX09wZW5JTklFcnJvcjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBJbmlGaWxlUmVhZGVyX1JlYWRJbmlFcnJvcjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBJbmlGaWxlUmVhZGVyX1JlYWRQcm9wRXJyb3I7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSW5pRmlsZVJlYWRlcl9SZWFkTWFwRXJyb3I7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2l0ZUVudHJ5X2NvbXB1dGVQbHVnaW5TdGFtcDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTaXRlRW50cnlfY2Fubm90RmluZEZlYXR1cmVJbkRpcjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTaXRlRW50cnlfZHVwbGljYXRlRmVhdHVyZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTaXRlRW50cnlfcGx1Z2luc0RpcjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBQbGF0Zm9ybUNvbmZpZ3VyYXRpb25fZXhwZWN0aW5nUGxhdGZvcm1YTUxvckRpcmVjdG9yeTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBQbGF0Zm9ybUNvbmZpZ3VyYXRpb25fY2Fubm90QmFja3VwQ29uZmlnOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBsYXRmb3JtQ29uZmlndXJhdGlvbl9jYW5ub3RDbG9zZVN0cmVhbTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBQbGF0Zm9ybUNvbmZpZ3VyYXRpb25fY2Fubm90Q2xvc2VUZW1wRmlsZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBQbGF0Zm9ybUNvbmZpZ3VyYXRpb25fY2Fubm90UmVuYW1lVGVtcEZpbGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgUGxhdGZvcm1Db25maWd1cmF0aW9uX2Nhbm5vdExvYWRDb25maWc7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgUGxhdGZvcm1Db25maWd1cmF0aW9uX2Nhbm5vdExvYWREZWZhdWx0U2l0ZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBQbGF0Zm9ybUNvbmZpZ3VyYXRpb25fY2Fubm90RmluZENvbmZpZ0ZpbGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgUGxhdGZvcm1Db25maWd1cmF0aW9uX2Nhbm5vdFNhdmVOb25FeGlzdGluZ0NvbmZpZzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBQbHVnaW5QYXJzZXJfcGx1Z2luX25vX2lkOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBsdWdpblBhcnNlcl9wbHVnaW5fbm9fdmVyc2lvbjsKKworCXN0YXRpYyB7CisJCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIE1lc3NhZ2VzLmNsYXNzKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxQcmludEhhbmRsZXJfdW5zdXBwb3J0ZWROb2RlVHlwZTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvbmZpZ3VyYXRvci9QbGF0Zm9ybUNvbmZpZ3VyYXRpb25GYWN0b3J5LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvbmZpZ3VyYXRvci9QbGF0Zm9ybUNvbmZpZ3VyYXRpb25GYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzljNDQ0OAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL1BsYXRmb3JtQ29uZmlndXJhdGlvbkZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDQ0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvbmZpZ3VyYXRvcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworCitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci5JUGxhdGZvcm1Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IuSVBsYXRmb3JtQ29uZmlndXJhdGlvbkZhY3Rvcnk7CisKK3B1YmxpYyBjbGFzcyBQbGF0Zm9ybUNvbmZpZ3VyYXRpb25GYWN0b3J5IGltcGxlbWVudHMgSVBsYXRmb3JtQ29uZmlndXJhdGlvbkZhY3RvcnkgeworCXB1YmxpYyBJUGxhdGZvcm1Db25maWd1cmF0aW9uIGdldEN1cnJlbnRQbGF0Zm9ybUNvbmZpZ3VyYXRpb24oKSB7CisJCXJldHVybiBQbGF0Zm9ybUNvbmZpZ3VyYXRpb24uZ2V0Q3VycmVudCgpOworCX0KKwkKKwlwdWJsaWMgSVBsYXRmb3JtQ29uZmlndXJhdGlvbiBnZXRQbGF0Zm9ybUNvbmZpZ3VyYXRpb24oVVJMIHVybCkJdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCXJldHVybiBuZXcgUGxhdGZvcm1Db25maWd1cmF0aW9uKHVybCk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlpZiAoZSBpbnN0YW5jZW9mIElPRXhjZXB0aW9uKQorCQkJCXRocm93IChJT0V4Y2VwdGlvbillOworCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKwkJfQorCX0KKwkKKwlwdWJsaWMgSVBsYXRmb3JtQ29uZmlndXJhdGlvbiBnZXRQbGF0Zm9ybUNvbmZpZ3VyYXRpb24oVVJMIHVybCwgVVJMIGxvYykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCXJldHVybiBuZXcgUGxhdGZvcm1Db25maWd1cmF0aW9uKHVybCwgbG9jKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCWlmIChlIGluc3RhbmNlb2YgSU9FeGNlcHRpb24pCisJCQkJdGhyb3cgKElPRXhjZXB0aW9uKWU7CisJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworCQl9CisJfQorCQorfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb25maWd1cmF0b3IvUGx1Z2luRW50cnkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL1BsdWdpbkVudHJ5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NhNGYyMwotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL1BsdWdpbkVudHJ5LmphdmEKQEAgLTAsMCArMSwxNjYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29uZmlndXJhdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKKworCisvKioKKyAqLworcHVibGljIGNsYXNzIFBsdWdpbkVudHJ5IHsKKworCXByaXZhdGUgU3RyaW5nIHBsdWdpbklkOworCXByaXZhdGUgU3RyaW5nIHBsdWdpblZlcnNpb247CisJcHJpdmF0ZSBib29sZWFuIGlzRnJhZ21lbnQgPSBmYWxzZTsKKwlwcml2YXRlIFZlcnNpb25lZElkZW50aWZpZXIgdmVyc2lvbklkOworCXByaXZhdGUgU3RyaW5nIHVybDsKKwkKKwlwdWJsaWMgUGx1Z2luRW50cnkoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogQHJldHVybiB1cmwgcmVsYXRpdmUgdG8gdGhlIHNpdGUgbG9jYXRpb246IHBsdWdpbnMvb3JnLmVjbGlwc2UuZm9vL3BsdWdpbi54bWwKKwkgKiBOb3RlOiB0byBkbzogd2Ugc2hvdWxkIHByb2JhYmx5IG9ubHkgdXNlIHBsdWdpbnMvb3JnLmVjbGlwc2UuZm9vLyBpbiB0aGUgZnV0dXJlCisJICovCisJcHVibGljIFN0cmluZyBnZXRVUkwoKSB7CisJCXJldHVybiB1cmw7CisJfQorCQorCS8qKgorCSAqIHVybCBpcyByZWxhdGl2ZSB0byB0aGUgc2l0ZQorCSAqLworCXB1YmxpYyB2b2lkIHNldFVSTChTdHJpbmcgdXJsKSB7CisJCXRoaXMudXJsID0gdXJsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHBsdWctaW4gaWRlbnRpZmllciBmb3IgdGhpcyBlbnRyeS4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBwbHVnLWluIGlkZW50aWZpZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+CisJICovCisJcHVibGljIFN0cmluZyBnZXRQbHVnaW5JZGVudGlmaWVyKCkgeworCQlyZXR1cm4gcGx1Z2luSWQ7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcGx1Zy1pbiB2ZXJzaW9uIGZvciB0aGlzIGVudHJ5LgorCSAqIAorCSAqIEByZXR1cm4gdGhlIHBsdWctaW4gdmVyc2lvbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFBsdWdpblZlcnNpb24oKSB7CisJCXJldHVybiBwbHVnaW5WZXJzaW9uOworCX0KKworCS8qKgorCSAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBlbnRyeSBkZXNjcmliZXMgYSBmdWxsIHBsdWctaW4sIG9yIAorCSAqIGEgcGx1Zy1pbiBmcmFnbWVudC4KKwkgKiAKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBlbnRyeSBpcyBhIHBsdWctaW4gZnJhZ21lbnQsIAorCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgZW50cnkgaXMgYSBwbHVnLWluCisJICovCisJcHVibGljIGJvb2xlYW4gaXNGcmFnbWVudCgpIHsKKwkJcmV0dXJuIGlzRnJhZ21lbnQ7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgZW50cnkgcGx1Zy1pbiBpZGVudGlmaWVyLgorCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuCisJICoKKwkgKiBAcGFyYW0gcGx1Z2luSWQgdGhlIGVudHJ5IGlkZW50aWZpZXIuCisJICovCisJdm9pZCBzZXRQbHVnaW5JZGVudGlmaWVyKFN0cmluZyBwbHVnaW5JZCkgeworCQl0aGlzLnBsdWdpbklkID0gcGx1Z2luSWQ7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgZW50cnkgcGx1Zy1pbiB2ZXJzaW9uLgorCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuCisJICoKKwkgKiBAcGFyYW0gcGx1Z2luVmVyc2lvbiB0aGUgZW50cnkgdmVyc2lvbi4KKwkgKi8KKwl2b2lkIHNldFBsdWdpblZlcnNpb24oU3RyaW5nIHBsdWdpblZlcnNpb24pIHsKKwkJdGhpcy5wbHVnaW5WZXJzaW9uID0gcGx1Z2luVmVyc2lvbjsKKwl9CisKKwkvKioKKwkgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIGVudHJ5IHJlcHJlc2VudHMgYSBmcmFnbWVudCBvciBwbHVnLWluLgorCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuCisJICoKKwkgKiBAcGFyYW0gaXNGcmFnbWVudCBmcmFnbWVudCBzZXR0aW5nCisJICovCisJcHVibGljIHZvaWQgaXNGcmFnbWVudChib29sZWFuIGlzRnJhZ21lbnQpIHsKKwkJdGhpcy5pc0ZyYWdtZW50ID0gaXNGcmFnbWVudDsKKwl9CisKKwkvKioKKwkgKiBAc2VlIE9iamVjdCN0b1N0cmluZygpCisJICovCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJU3RyaW5nIG1zZyA9IChnZXRQbHVnaW5JZGVudGlmaWVyKCkhPW51bGwpP2dldFBsdWdpbklkZW50aWZpZXIoKS50b1N0cmluZygpOiIiOyAvLyROT04tTkxTLTEkCisJCW1zZyArPSBnZXRQbHVnaW5WZXJzaW9uKCkhPW51bGw/IiAiK2dldFBsdWdpblZlcnNpb24oKS50b1N0cmluZygpOiIiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJbXNnICs9IGlzRnJhZ21lbnQoKT8iIGZyYWdtZW50IjoiIHBsdWdpbiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQlyZXR1cm4gbXNnOworCX0KKworCisJLyoqCisJICogUmV0dXJucyB0aGUgaWRlbnRpZmllciBvZiB0aGlzIHBsdWdpbiBlbnRyeQorCSAqLworCXB1YmxpYyBWZXJzaW9uZWRJZGVudGlmaWVyIGdldFZlcnNpb25lZElkZW50aWZpZXIoKSB7CisJCWlmICh2ZXJzaW9uSWQgIT0gbnVsbCkKKwkJCXJldHVybiB2ZXJzaW9uSWQ7CisKKwkJU3RyaW5nIGlkID0gZ2V0UGx1Z2luSWRlbnRpZmllcigpOworCQlTdHJpbmcgdmVyID0gZ2V0UGx1Z2luVmVyc2lvbigpOworCQlpZiAoaWQgIT0gbnVsbCAmJiB2ZXIgIT0gbnVsbCkgeworCQkJdHJ5IHsKKwkJCQl2ZXJzaW9uSWQgPSBuZXcgVmVyc2lvbmVkSWRlbnRpZmllcihpZCwgdmVyKTsKKwkJCQlyZXR1cm4gdmVyc2lvbklkOworCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQlVdGlscy5sb2coTkxTLmJpbmQoTWVzc2FnZXMuUGx1Z2luRW50cnlfdmVyc2lvbkVycm9yLCAobmV3IFN0cmluZ1tdIHsgaWQsIHZlciB9KSkpOworCQkJfQorCQl9CisKKwkJdmVyc2lvbklkID0gbmV3IFZlcnNpb25lZElkZW50aWZpZXIoIiIsbnVsbCk7IC8vJE5PTi1OTFMtMSQKKwkJcmV0dXJuIHZlcnNpb25JZDsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSBpZGVudGlmaWVyIG9mIHRoaXMgcGx1Z2luIGVudHJ5LiAKKwkgKiAKKwkgKi8KKwl2b2lkIHNldFZlcnNpb25lZElkZW50aWZpZXIoVmVyc2lvbmVkSWRlbnRpZmllciBpZGVudGlmaWVyKSB7CisJCXNldFBsdWdpbklkZW50aWZpZXIoaWRlbnRpZmllci5nZXRJZGVudGlmaWVyKCkpOworCQlzZXRQbHVnaW5WZXJzaW9uKGlkZW50aWZpZXIuZ2V0VmVyc2lvbigpLnRvU3RyaW5nKCkpOworCX0JCisKKwkvKioKKwkgKiBDb21wYXJlcyB0d28gcGx1Z2luIGVudHJpZXMgZm9yIGVxdWFsaXR5CisJICogCisJICogQHBhcmFtIG9iamVjdCBwbHVnaW4gZW50cnkgb2JqZWN0IHRvIGNvbXBhcmUgd2l0aAorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHR3byBlbnRyaWVzIGFyZSBlcXVhbCwgCisJICogPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQorCSAqLworCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KSB7CisJCWlmICghKG9iamVjdCBpbnN0YW5jZW9mIFBsdWdpbkVudHJ5KSkKKwkJCXJldHVybiBmYWxzZTsKKwkJUGx1Z2luRW50cnkgZSA9IChQbHVnaW5FbnRyeSkgb2JqZWN0OworCQlyZXR1cm4gZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmVxdWFscyhlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSk7CisJfQorCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjaGFzaENvZGUoKQorCSAqLworCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisJCXJldHVybiBnZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuaGFzaENvZGUoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvbmZpZ3VyYXRvci9QbHVnaW5QYXJzZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL1BsdWdpblBhcnNlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExODhhNjQKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvbmZpZ3VyYXRvci9QbHVnaW5QYXJzZXIuamF2YQpAQCAtMCwwICsxLDEyOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb25maWd1cmF0b3I7CisKKworaW1wb3J0IGphdmEuaW8uKjsKKworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLio7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworaW1wb3J0IG9yZy54bWwuc2F4Lio7CitpbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy4qOworCisvKioKKyAqIFBhcnNlIGRlZmF1bHQgZmVhdHVyZS54bWwKKyAqLworCitwdWJsaWMgY2xhc3MgUGx1Z2luUGFyc2VyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIgaW1wbGVtZW50cyBJQ29uZmlndXJhdGlvbkNvbnN0YW50cyB7CisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU0FYUGFyc2VyRmFjdG9yeSBwYXJzZXJGYWN0b3J5ID0KKwkJU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworCXByaXZhdGUgU0FYUGFyc2VyIHBhcnNlcjsKKwlwcml2YXRlIFBsdWdpbkVudHJ5IHBsdWdpbkVudHJ5OworICAgIHByaXZhdGUgU3RyaW5nIGxvY2F0aW9uOworCisJcHJpdmF0ZSBjbGFzcyBQYXJzZUNvbXBsZXRlRXhjZXB0aW9uIGV4dGVuZHMgU0FYRXhjZXB0aW9uIHsKKwkJCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisgICAgICAgIHB1YmxpYyBQYXJzZUNvbXBsZXRlRXhjZXB0aW9uKFN0cmluZyBhcmcwKSB7CisJCQlzdXBlcihhcmcwKTsKKwkJfQorCX0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yIGZvciBEZWZhdWx0RmVhdHVyZVBhcnNlcgorCSAqLworCXB1YmxpYyBQbHVnaW5QYXJzZXIoKSB7CisJCXN1cGVyKCk7CisJCXRyeSB7CisJCQlwYXJzZXJGYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOworCQkJdGhpcy5wYXJzZXIgPSBwYXJzZXJGYWN0b3J5Lm5ld1NBWFBhcnNlcigpOworCQl9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbihlKTsKKwkJfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbihlKTsKKwkJfQorCX0KKworCS8qKgorCSAqIEBzaW5jZSAyLjAKKwkgKi8KKwlwdWJsaWMgc3luY2hyb25pemVkIFBsdWdpbkVudHJ5IHBhcnNlKEZpbGUgcGx1Z2luRmlsZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCQlGaWxlSW5wdXRTdHJlYW0gaW4gPSBudWxsOworCQl0cnl7CisJCQlpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ocGx1Z2luRmlsZSk7CisJCQlyZXR1cm4gcGFyc2UoaW4sIFBMVUdJTlMgKyAiLyIgKyBwbHVnaW5GaWxlLmdldFBhcmVudEZpbGUoKS5nZXROYW1lKCkgKyAiLyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJfWZpbmFsbHl7CisJCQlpZiAoaW4gIT0gbnVsbCl7CisJCQkJdHJ5eworCQkJCQlpbi5jbG9zZSgpOworCQkJCX1jYXRjaChJT0V4Y2VwdGlvbiBlKXsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJLyoqCisJICogQHNpbmNlIDMuMAorCSAqLworCXB1YmxpYyBzeW5jaHJvbml6ZWQgUGx1Z2luRW50cnkgcGFyc2UoSW5wdXRTdHJlYW0gaW4sIFN0cmluZyBidW5kbGVVcmwpIHRocm93cyBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKyAgICAgICAgICAgIGxvY2F0aW9uID0gYnVuZGxlVXJsOworCQkJcGx1Z2luRW50cnkgPSBuZXcgUGx1Z2luRW50cnkoKTsKKwkJCXBsdWdpbkVudHJ5LnNldFVSTChidW5kbGVVcmwpOworCQkJcGFyc2VyLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShpbiksIHRoaXMpOworCQl9IGNhdGNoIChQYXJzZUNvbXBsZXRlRXhjZXB0aW9uIGUpIHsKKwkJCS8vIGV4cGVjdGVkLCB3ZSBzdG9wcGVkIHRoZSBwYXJzaW5nIHdoZW4gd2UgaGF2ZSB0aGUgaW5mb3JtYXRpb24gd2UgbmVlZAorCQkJLy8vIG5vIG5lZWQgdG8gcHVyc3VlIHRoZSBwYXJzaW5nCisJCX0KKwkJcmV0dXJuIHBsdWdpbkVudHJ5OworCX0KKworCS8qKgorCSAqIEBzZWUgRGVmYXVsdEhhbmRsZXIjc3RhcnRFbGVtZW50KFN0cmluZywgU3RyaW5nLCBTdHJpbmcsIEF0dHJpYnV0ZXMpCisJICovCisJcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKworCQlTdHJpbmcgdGFnID0gbG9jYWxOYW1lLnRyaW0oKTsKKworCQlpZiAodGFnLmVxdWFsc0lnbm9yZUNhc2UoQ0ZHX1BMVUdJTikpIHsKKwkJCXBsdWdpbkVudHJ5LmlzRnJhZ21lbnQoZmFsc2UpOwkJCQorCQkJcHJvY2Vzc1BsdWdpbihhdHRyaWJ1dGVzKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWlmICh0YWcuZXF1YWxzSWdub3JlQ2FzZShDRkdfRlJBR01FTlQpKSB7CisJCQlwbHVnaW5FbnRyeS5pc0ZyYWdtZW50KHRydWUpOwkJCQorCQkJcHJvY2Vzc1BsdWdpbihhdHRyaWJ1dGVzKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCS8qKiAKKwkgKiBwcm9jZXNzIHBsdWdpbiBlbnRyeSBpbmZvCisJICovCisJcHJpdmF0ZSB2b2lkIHByb2Nlc3NQbHVnaW4oQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgUGFyc2VDb21wbGV0ZUV4Y2VwdGlvbiB7CisJCVN0cmluZyBpZCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImlkIik7IC8vJE5PTi1OTFMtMSQKKwkJU3RyaW5nIHZlcnNpb24gPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJ2ZXJzaW9uIik7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKGlkID09IG51bGwgfHwgaWQudHJpbSgpLmxlbmd0aCgpID09IDApIHsKKwkJCWlkID0gIl9ub19pZF8iOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICBVdGlscy5sb2coTkxTLmJpbmQoTWVzc2FnZXMuUGx1Z2luUGFyc2VyX3BsdWdpbl9ub19pZCwgKG5ldyBTdHJpbmdbXSB7IGxvY2F0aW9uIH0pKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZlcnNpb24gPT0gbnVsbCB8fCB2ZXJzaW9uLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICB2ZXJzaW9uID0gIjAuMC4wIjsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgVXRpbHMubG9nKE5MUy5iaW5kKE1lc3NhZ2VzLlBsdWdpblBhcnNlcl9wbHVnaW5fbm9fdmVyc2lvbiwgKG5ldyBTdHJpbmdbXSB7IGxvY2F0aW9uIH0pKSk7CisgICAgICAgIH0KKwkJcGx1Z2luRW50cnkuc2V0VmVyc2lvbmVkSWRlbnRpZmllcihuZXcgVmVyc2lvbmVkSWRlbnRpZmllcihpZCwgdmVyc2lvbikpOworCQkKKwkJLy8gc3RvcCBwYXJzaW5nIG5vdworCQl0aHJvdyBuZXcgUGFyc2VDb21wbGV0ZUV4Y2VwdGlvbigiIik7IC8vJE5PTi1OTFMtMSQKKwl9Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvbmZpZ3VyYXRvci9TaXRlRW50cnkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL1NpdGVFbnRyeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5N2NiYzgKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvbmZpZ3VyYXRvci9TaXRlRW50cnkuamF2YQpAQCAtMCwwICsxLDc3MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb25maWd1cmF0b3I7CisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS5uZXQuKjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLnppcC4qOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLmVudmlyb25tZW50Lio7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci5JUGxhdGZvcm1Db25maWd1cmF0aW9uLio7CitpbXBvcnQgb3JnLnczYy5kb20uKjsKK2ltcG9ydCBvcmcueG1sLnNheC4qOworCisKK3B1YmxpYyBjbGFzcyBTaXRlRW50cnkgaW1wbGVtZW50cyBJUGxhdGZvcm1Db25maWd1cmF0aW9uLklTaXRlRW50cnksIElDb25maWd1cmF0aW9uQ29uc3RhbnRzewkKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFDX09TX01BUktFUiA9ICIuRFNfU3RvcmUiOyAvLyROT04tTkxTLTEkCisJCisJcHJpdmF0ZSBVUkwgdXJsOyAvLyB0aGlzIGlzIHRoZSBleHRlcm5hbCBVUkwgZm9yIHRoZSBzaXRlCisJcHJpdmF0ZSBVUkwgcmVzb2x2ZWRVUkw7IC8vIHRoaXMgaXMgdGhlIHJlc29sdmVkIFVSTCB1c2VkIGludGVybmFsbHkKKwlwcml2YXRlIElTaXRlUG9saWN5IHBvbGljeTsKKwlwcml2YXRlIGJvb2xlYW4gdXBkYXRlYWJsZSA9IHRydWU7CisJcHJpdmF0ZSBNYXAgZmVhdHVyZUVudHJpZXM7CisJcHJpdmF0ZSBBcnJheUxpc3QgcGx1Z2luRW50cmllczsKKwlwcml2YXRlIGxvbmcgY2hhbmdlU3RhbXA7CisJcHJpdmF0ZSBsb25nIGZlYXR1cmVzQ2hhbmdlU3RhbXA7CisJcHJpdmF0ZSBsb25nIHBsdWdpbnNDaGFuZ2VTdGFtcDsKKwlwcml2YXRlIFN0cmluZyBsaW5rRmlsZU5hbWU7CisJcHJpdmF0ZSBib29sZWFuIGVuYWJsZWQgPSB0cnVlOworCXByaXZhdGUgQ29uZmlndXJhdGlvbiBjb25maWc7CisJCisJcHJpdmF0ZSBzdGF0aWMgRmVhdHVyZVBhcnNlciBmZWF0dXJlUGFyc2VyID0gbmV3IEZlYXR1cmVQYXJzZXIoKTsKKwlwcml2YXRlIHN0YXRpYyBQbHVnaW5QYXJzZXIgcGx1Z2luUGFyc2VyID0gbmV3IFBsdWdpblBhcnNlcigpOworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNNYWNPUyA9IFV0aWxzLmdldE9TKCkuZXF1YWxzKENvbnN0YW50cy5PU19NQUNPU1gpOworCisJcHVibGljIFNpdGVFbnRyeShVUkwgdXJsKSB7CisJCXRoaXModXJsLG51bGwpOworCX0KKwkKKwlwdWJsaWMgU2l0ZUVudHJ5KFVSTCB1cmwsIElTaXRlUG9saWN5IHBvbGljeSkgeworCQlpZiAodXJsID09IG51bGwpCisJCQl0cnkgeworCQkJCXVybCA9IG5ldyBVUkwoInBsYXRmb3JtOi9iYXNlLyIpOyAvLyROT04tTkxTLTEkIHRyeSB1c2luZyBwbGF0Zm9ybS1yZWxhdGl2ZSBVUkwKKwkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisJCQkJdXJsID0gUGxhdGZvcm1Db25maWd1cmF0aW9uLmdldEluc3RhbGxVUkwoKTsgLy8gZW5zdXJlIHdlIGNvbWUgdXAgLi4uIHVzZSBhYnNvbHV0ZSBmaWxlIFVSTAorCQkJfQorCQkJCisJCWlmIChwb2xpY3kgPT0gbnVsbCkKKwkJCXBvbGljeSA9IG5ldyBTaXRlUG9saWN5KFBsYXRmb3JtQ29uZmlndXJhdGlvbi5nZXREZWZhdWx0UG9saWN5KCksIERFRkFVTFRfUE9MSUNZX0xJU1QpOworCisJCWlmICh1cmwuZ2V0UHJvdG9jb2woKS5lcXVhbHMoImZpbGUiKSkgeyAvLyROT04tTkxTLTEkCisJCQl0cnkgeworCQkJCS8vIFRPRE8gcmVtb3ZlIHRoaXMgd2hlbiBwbGF0Zm9ybSBmaXhlcyBsb2NhbCBmaWxlIHVybCdzCisJCQkJdGhpcy51cmwgPSBuZXcgRmlsZSh1cmwuZ2V0RmlsZSgpKS50b1VSTCgpOyAKKwkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlMSkgeworCQkJCXRoaXMudXJsID0gdXJsOworCQkJfQorCQl9IGVsc2UKKwkJCXRoaXMudXJsID0gdXJsOworCQkKKwkJdGhpcy5wb2xpY3kgPSBwb2xpY3k7CisJCXRoaXMucmVzb2x2ZWRVUkwgPSB0aGlzLnVybDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDb25maWcoQ29uZmlndXJhdGlvbiBjb25maWcpIHsKKwkJdGhpcy5jb25maWcgPSBjb25maWc7CisJCWlmICh1cmwuZ2V0UHJvdG9jb2woKS5lcXVhbHMoInBsYXRmb3JtIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJdHJ5IHsKKwkJCQkvLyByZXNvbHZlIHRoZSBjb25maWcgbG9jYXRpb24gcmVsYXRpdmUgdG8gdGhlIGNvbmZpZ1VSTAorCQkJCWlmICh1cmwuZ2V0UGF0aCgpLnN0YXJ0c1dpdGgoIi9jb25maWciKSkgewkKKwkJCQkJVVJMIGNvbmZpZ1VSTCA9IGNvbmZpZy5nZXRVUkwoKTsKKwkJCQkJVVJMIGNvbmZpZ19sb2MgPSBuZXcgVVJMKGNvbmZpZ1VSTCwgIi4uIik7CisJCQkJCXJlc29sdmVkVVJMID0gUGxhdGZvcm1Db25maWd1cmF0aW9uLnJlc29sdmVQbGF0Zm9ybVVSTCh1cmwsIGNvbmZpZ19sb2MpOyAvLyAxOTUzNgorCQkJCX0KKwkJCQllbHNlIAorCQkJCQlyZXNvbHZlZFVSTCA9IFBsYXRmb3JtQ29uZmlndXJhdGlvbi5yZXNvbHZlUGxhdGZvcm1VUkwodXJsLCBjb25maWcuZ2V0SW5zdGFsbFVSTCgpKTsgLy8gMTk1MzYKKwkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQkvLyB3aWxsIHVzZSB0aGUgYmFzZWxpbmUgVVJMIC4uLgorCQkJfQorCQl9CisJfQorCQorCXB1YmxpYyBDb25maWd1cmF0aW9uIGdldENvbmZpZygpIHsKKwkJcmV0dXJuIGNvbmZpZzsKKwl9CisJCisJLyoKKwkgKiBAc2VlIElTaXRlRW50cnkjZ2V0VVJMKCkKKwkgKi8KKwlwdWJsaWMgVVJMIGdldFVSTCgpIHsKKwkJcmV0dXJuIHVybDsKKwl9CisKKwkvKgorCSogQHNlZSBJU2l0ZUVudHJ5I2dldFNpdGVQb2xpY3koKQorCSovCisJcHVibGljIElTaXRlUG9saWN5IGdldFNpdGVQb2xpY3koKSB7CisJCXJldHVybiBwb2xpY3k7CisJfQorCisJLyoKKwkgKiBAc2VlIElTaXRlRW50cnkjc2V0U2l0ZVBvbGljeShJU2l0ZVBvbGljeSkKKwkgKi8KKwlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0U2l0ZVBvbGljeShJU2l0ZVBvbGljeSBwb2xpY3kpIHsKKwkJaWYgKHBvbGljeSA9PSBudWxsKQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQl0aGlzLnBvbGljeSA9IHBvbGljeTsKKwl9CisKKwkvKgorCSAqIEBzZWUgSVNpdGVFbnRyeSNnZXRGZWF0dXJlcygpCisJICovCisJcHVibGljIFN0cmluZ1tdIGdldEZlYXR1cmVzKCkgeworCQlyZXR1cm4gZ2V0RGV0ZWN0ZWRGZWF0dXJlcygpOworCX0KKworCS8qCisJICogQHNlZSBJU2l0ZUVudHJ5I2dldFBsdWdpbnMoKQorCSAqLworCXB1YmxpYyBTdHJpbmdbXSBnZXRQbHVnaW5zKCkgeworCisJCUlTaXRlUG9saWN5IHBvbGljeSA9IGdldFNpdGVQb2xpY3koKTsKKworCQlpZiAocG9saWN5LmdldFR5cGUoKSA9PSBJU2l0ZVBvbGljeS5VU0VSX0lOQ0xVREUpCisJCQlyZXR1cm4gcG9saWN5LmdldExpc3QoKTsKKworCQlpZiAocG9saWN5LmdldFR5cGUoKSA9PSBJU2l0ZVBvbGljeS5VU0VSX0VYQ0xVREUpIHsKKwkJCUFycmF5TGlzdCBkZXRlY3RlZFBsdWdpbnMgPSBuZXcgQXJyYXlMaXN0KEFycmF5cy5hc0xpc3QoZ2V0RGV0ZWN0ZWRQbHVnaW5zKCkpKTsKKwkJCVN0cmluZ1tdIGV4Y2x1ZGVkUGx1Z2lucyA9IHBvbGljeS5nZXRMaXN0KCk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGV4Y2x1ZGVkUGx1Z2lucy5sZW5ndGg7IGkrKykgeworCQkJCWlmIChkZXRlY3RlZFBsdWdpbnMuY29udGFpbnMoZXhjbHVkZWRQbHVnaW5zW2ldKSkKKwkJCQkJZGV0ZWN0ZWRQbHVnaW5zLnJlbW92ZShleGNsdWRlZFBsdWdpbnNbaV0pOworCQkJfQorCQkJcmV0dXJuIChTdHJpbmdbXSkgZGV0ZWN0ZWRQbHVnaW5zLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7CisJCX0KKwkJCisJCWlmIChwb2xpY3kuZ2V0VHlwZSgpID09IElTaXRlUG9saWN5Lk1BTkFHRURfT05MWSkgeworCQkJUGx1Z2luRW50cnlbXSBtYW5hZ2VkUGx1Z2lucyA9IGdldE1hbmFnZWRQbHVnaW5zKCk7CisJCQlTdHJpbmdbXSBtYW5hZ2VkUGx1Z2luc1VSTHMgPSBuZXcgU3RyaW5nW21hbmFnZWRQbHVnaW5zLmxlbmd0aF07CisJCQlmb3IgKGludCBpPTA7IGk8bWFuYWdlZFBsdWdpbnMubGVuZ3RoOyBpKyspCisJCQkJbWFuYWdlZFBsdWdpbnNVUkxzW2ldID0gbWFuYWdlZFBsdWdpbnNbaV0uZ2V0VVJMKCk7CisJCQkKKwkJCXJldHVybiBtYW5hZ2VkUGx1Z2luc1VSTHM7CisJCX0KKworCQkvLyBiYWQgcG9saWN5IHR5cGUKKwkJcmV0dXJuIG5ldyBTdHJpbmdbMF07CisJfQorCisJcHJpdmF0ZSBQbHVnaW5FbnRyeVtdIGdldE1hbmFnZWRQbHVnaW5zKCkgeworCQkvLyBOb3RlOgorCQkvLyBXZSBkZXRlY3QgYWxsIHRoZSBwbHVnaW5zIG9uIHRoZSBzaXRlLCBidXQgaXQgd291bGQgYmUgZmFzdGVyCisJCS8vIHRvIGp1c3QgbG9va3VwIHRoZSBwbHVnaW5zIHRoYXQgY29ycmVzcG9uZCB0byB0aGUgZW50cmllcyBmb3VuZCBpbiBlYWNoIGZlYXR1cmUuCisJCS8vIFRPRE8gZml4IHRoZSBhYm92ZQorCQlpZiAocGx1Z2luRW50cmllcyA9PSBudWxsKQorCQkJZGV0ZWN0UGx1Z2lucygpOworCQlpZiAoZmVhdHVyZUVudHJpZXMgPT0gbnVsbCkKKwkJCWRldGVjdEZlYXR1cmVzKCk7CisJCQorCQkvLyBjYWNoZSBhbGwgdGhlIHBsdWdpbiBlbnRyaWVzIGZvciBmYXN0ZXIgbG9va3VwIGxhdGVyCisJCU1hcCBjYWNoZWRQbHVnaW5zID0gbmV3IEhhc2hNYXAocGx1Z2luRW50cmllcy5zaXplKCkpOworCQlmb3IgKGludCBpPTA7IGk8cGx1Z2luRW50cmllcy5zaXplKCk7IGkrKykgeworCQkJUGx1Z2luRW50cnkgcCA9IChQbHVnaW5FbnRyeSlwbHVnaW5FbnRyaWVzLmdldChpKTsKKwkJCWNhY2hlZFBsdWdpbnMucHV0KHAuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLCBwKTsKKwkJfQorCQkKKwkJQXJyYXlMaXN0IG1hbmFnZWRQbHVnaW5zID0gbmV3IEFycmF5TGlzdCgpOworCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yPWZlYXR1cmVFbnRyaWVzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKKwkJCU9iamVjdCBmZWF0dXJlID0gaXRlcmF0b3IubmV4dCgpOworCQkJaWYgKCEoZmVhdHVyZSBpbnN0YW5jZW9mIEZlYXR1cmVFbnRyeSkpCisJCQkJY29udGludWU7CisJCQkKKwkJCVBsdWdpbkVudHJ5W10gcGx1Z2lucyA9ICgoRmVhdHVyZUVudHJ5KWZlYXR1cmUpLmdldFBsdWdpbkVudHJpZXMoKTsKKwkJCWZvciAoaW50IGk9MDsgaTxwbHVnaW5zLmxlbmd0aDsgaSsrKQorCQkJCWlmIChjYWNoZWRQbHVnaW5zLmNvbnRhaW5zS2V5KHBsdWdpbnNbaV0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpKSkKKwkJCQkJbWFuYWdlZFBsdWdpbnMuYWRkKGNhY2hlZFBsdWdpbnMuZ2V0KHBsdWdpbnNbaV0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpKSk7CisJCQkJCQorCQl9CisJCXJldHVybiAoUGx1Z2luRW50cnlbXSltYW5hZ2VkUGx1Z2lucy50b0FycmF5KG5ldyBQbHVnaW5FbnRyeVttYW5hZ2VkUGx1Z2lucy5zaXplKCldKTsKKwl9CisJCisJcHVibGljIFBsdWdpbkVudHJ5W10gZ2V0UGx1Z2luRW50cmllcygpIHsKKwkJU3RyaW5nW10gcGx1Z2luVVJMcyA9IGdldFBsdWdpbnMoKTsKKwkJLy8gaGFzaCB0aGUgYXJyYXksIGZvciBmYXN0ZXIgbG9va3VwcworCQlIYXNoTWFwIG1hcCA9IG5ldyBIYXNoTWFwKHBsdWdpblVSTHMubGVuZ3RoKTsKKwkJZm9yIChpbnQgaT0wOyBpPHBsdWdpblVSTHMubGVuZ3RoOyBpKyspCisJCQltYXAucHV0KHBsdWdpblVSTHNbaV0sIHBsdWdpblVSTHNbaV0pOworCQkKKwkJaWYgKHBsdWdpbkVudHJpZXMgPT0gbnVsbCkKKwkJCQlkZXRlY3RQbHVnaW5zKCk7CisJCQorCQlBcnJheUxpc3QgcGx1Z2lucyA9IG5ldyBBcnJheUxpc3QocGx1Z2luVVJMcy5sZW5ndGgpOworCQlmb3IgKGludCBpPTA7IGk8cGx1Z2luRW50cmllcy5zaXplKCk7IGkrKykgeworCQkJUGx1Z2luRW50cnkgcCA9IChQbHVnaW5FbnRyeSlwbHVnaW5FbnRyaWVzLmdldChpKTsKKwkJCWlmIChtYXAuY29udGFpbnNLZXkocC5nZXRVUkwoKSkpCisJCQkJcGx1Z2lucy5hZGQocCk7CisJCX0KKwkJcmV0dXJuIChQbHVnaW5FbnRyeVtdKXBsdWdpbnMudG9BcnJheShuZXcgUGx1Z2luRW50cnlbcGx1Z2lucy5zaXplKCldKTsKKwl9CisJCisJLyoKKwkgKiBAc2VlIElTaXRlRW50cnkjZ2V0Q2hhbmdlU3RhbXAoKQorCSAqLworCXB1YmxpYyBsb25nIGdldENoYW5nZVN0YW1wKCkgeworCQlpZiAoY2hhbmdlU3RhbXAgPT0gMCkKKwkJCWNvbXB1dGVDaGFuZ2VTdGFtcCgpOworCQlyZXR1cm4gY2hhbmdlU3RhbXA7CisJfQorCisJLyoKKwkgKiBAc2VlIElTaXRlRW50cnkjZ2V0RmVhdHVyZXNDaGFuZ2VTdGFtcCgpCisJICovCisJcHVibGljIGxvbmcgZ2V0RmVhdHVyZXNDaGFuZ2VTdGFtcCgpIHsKKwkJaWYgKGZlYXR1cmVzQ2hhbmdlU3RhbXAgPT0gMCkKKwkJCWNvbXB1dGVGZWF0dXJlc0NoYW5nZVN0YW1wKCk7CisJCXJldHVybiBmZWF0dXJlc0NoYW5nZVN0YW1wOworCX0KKworCS8qCisJICogQHNlZSBJU2l0ZUVudHJ5I2dldFBsdWdpbnNDaGFuZ2VTdGFtcCgpCisJICovCisJcHVibGljIGxvbmcgZ2V0UGx1Z2luc0NoYW5nZVN0YW1wKCkgeworCQlpZiAocGx1Z2luc0NoYW5nZVN0YW1wID09IDApCisJCQljb21wdXRlUGx1Z2luc0NoYW5nZVN0YW1wKCk7CisJCXJldHVybiBwbHVnaW5zQ2hhbmdlU3RhbXA7CisJfQorCisJLyoKKwkgKiBAc2VlIElTaXRlRW50cnkjaXNVcGRhdGVhYmxlKCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1VwZGF0ZWFibGUoKSB7CisJCXJldHVybiB1cGRhdGVhYmxlOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRVcGRhdGVhYmxlKGJvb2xlYW4gdXBkYXRlYWJsZSkgeworCQl0aGlzLnVwZGF0ZWFibGUgPSB1cGRhdGVhYmxlOworCX0KKworCS8qCisJICogQHNlZSBJU2l0ZUVudHJ5I2lzTmF0aXZlbHlMaW5rZWQoKQorCSAqLworCXB1YmxpYyBib29sZWFuIGlzTmF0aXZlbHlMaW5rZWQoKSB7CisJCXJldHVybiBpc0V4dGVybmFsbHlMaW5rZWRTaXRlKCk7CisJfQorCisJcHVibGljIFVSTCBnZXRSZXNvbHZlZFVSTCgpIHsKKwkJcmV0dXJuIHJlc29sdmVkVVJMOworCX0KKwkKKwkvKioKKwkgKiBEZXRlY3QgbmV3IGZlYXR1cmVzICh0aW1lc3RhbXAgPiBjdXJyZW50IHNpdGUgdGltZXN0YW1wKQorCSAqIGFuZCB2YWxpZGF0ZXMgZXhpc3RpbmcgZmVhdHVyZXMgKHRoZXkgbWlnaHQgaGF2ZSBiZWVuIHJlbW92ZWQpCisJICovCisJcHJpdmF0ZSB2b2lkIGRldGVjdEZlYXR1cmVzKCkgeworCisJCWlmIChmZWF0dXJlRW50cmllcyAhPSBudWxsKQorCQkJdmFsaWRhdGVGZWF0dXJlRW50cmllcygpOworCQllbHNlCisJCQlmZWF0dXJlRW50cmllcyA9IG5ldyBIYXNoTWFwKCk7CisKKwkJaWYgKCFQbGF0Zm9ybUNvbmZpZ3VyYXRpb24uc3VwcG9ydHNEZXRlY3Rpb24ocmVzb2x2ZWRVUkwsIGNvbmZpZy5nZXRJbnN0YWxsVVJMKCkpKQorCQkJcmV0dXJuOworCisJCS8vIGxvY2F0ZSBmZWF0dXJlIGVudHJpZXMgb24gc2l0ZQorCQlGaWxlIHNpdGVSb290ID0gbmV3IEZpbGUocmVzb2x2ZWRVUkwuZ2V0RmlsZSgpLnJlcGxhY2UoJy8nLCBGaWxlLnNlcGFyYXRvckNoYXIpKTsKKwkJRmlsZSBmZWF0dXJlc0RpciA9IG5ldyBGaWxlKHNpdGVSb290LCBGRUFUVVJFUyk7CisJCWlmIChmZWF0dXJlc0Rpci5leGlzdHMoKSkgeworCQkJLy8gaGFuZGxlIHRoZSBpbnN0YWxsZWQgZmVhdHVyZXMgdW5kZXIgdGhlIGZlYXR1cmVzIGRpcmVjdG9yeQorCQkJRmlsZVtdIGRpcnMgPSBmZWF0dXJlc0Rpci5saXN0RmlsZXMobmV3IEZpbGVGaWx0ZXIoKSB7CisJCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgZikgeworCQkJCQkvLyBtYWMgb3MgZm9sZGVycyBjb250YWluIGEgZmlsZSAuRFNfU3RvcmUgaW4gZWFjaCBmb2xkZXIsIGFuZCB3ZSBuZWVkIHRvIHNraXAgaXQgKGJ1ZyA3Njg2OSkgCisJCQkJCWlmIChpc01hY09TICYmIGYuZ2V0TmFtZSgpLmVxdWFscyhNQUNfT1NfTUFSS0VSKSkKKwkJCQkJCXJldHVybiBmYWxzZTsKKwkJCQkJYm9vbGVhbiB2YWxpZCA9IGYuaXNEaXJlY3RvcnkoKSAmJiAobmV3IEZpbGUoZixGRUFUVVJFX1hNTCkuZXhpc3RzKCkpOworCQkJCQlpZiAoIXZhbGlkKQorCQkJCQkJVXRpbHMubG9nKE5MUy5iaW5kKE1lc3NhZ2VzLlNpdGVFbnRyeV9jYW5ub3RGaW5kRmVhdHVyZUluRGlyLCAobmV3IFN0cmluZ1tdIHsgZi5nZXRBYnNvbHV0ZVBhdGgoKSB9KSkpOworCQkJCQlyZXR1cm4gdmFsaWQ7CisJCQkJfQorCQkJfSk7CisJCQorCQkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IGRpcnMubGVuZ3RoOyBpbmRleCsrKSB7CisJCQkJdHJ5IHsKKwkJCQkJRmlsZSBmZWF0dXJlWE1MID0gbmV3IEZpbGUoZGlyc1tpbmRleF0sIEZFQVRVUkVfWE1MKTsKKwkJCQkJaWYgKGZlYXR1cmVYTUwubGFzdE1vZGlmaWVkKCkgPD0gZmVhdHVyZXNDaGFuZ2VTdGFtcCAmJgorCQkJCQkJZGlyc1tpbmRleF0ubGFzdE1vZGlmaWVkKCkgPD0gZmVhdHVyZXNDaGFuZ2VTdGFtcCkKKwkJCQkJCWNvbnRpbnVlOworCQkJCQlVUkwgZmVhdHVyZVVSTCA9IGZlYXR1cmVYTUwudG9VUkwoKTsKKwkJCQkJRmVhdHVyZUVudHJ5IGZlYXR1cmVFbnRyeSA9IGZlYXR1cmVQYXJzZXIucGFyc2UoZmVhdHVyZVVSTCk7CisJCQkJCWlmIChmZWF0dXJlRW50cnkgIT0gbnVsbCkKKwkJCQkJCWFkZEZlYXR1cmVFbnRyeShmZWF0dXJlRW50cnkpOworCQkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisJCQkJCVV0aWxzLmxvZyhOTFMuYmluZChNZXNzYWdlcy5JbnN0YWxsZWRTaXRlUGFyc2VyX1VuYWJsZVRvQ3JlYXRlVVJMRm9yRmlsZSwgKG5ldyBTdHJpbmdbXSB7IGZlYXR1cmVzRGlyLmdldEFic29sdXRlUGF0aCgpIH0pKSk7CisJCQkJfQorCQkJfQorCQl9CisJCQorCQlVdGlscy5kZWJ1ZyhyZXNvbHZlZFVSTC50b1N0cmluZygpICsgIiBsb2NhdGVkICAiICsgZmVhdHVyZUVudHJpZXMuc2l6ZSgpICsgIiBmZWF0dXJlKHMpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCX0KKwkKKwkvKioKKwkgKiBEZXRlY3QgbmV3IHBsdWdpbnMgKHRpbWVzdGFtcCA+IGN1cnJlbnQgc2l0ZSB0aW1lc3RhbXApCisJICogYW5kIHZhbGlkYXRlcyBleGlzdGluZyBwbHVnaW5zICh0aGV5IG1pZ2h0IGhhdmUgYmVlbiByZW1vdmVkKQorCSAqLworCXByaXZhdGUgdm9pZCBkZXRlY3RQbHVnaW5zKCkgeworCQlib29sZWFuIGNvbXBhcmVUaW1lU3RhbXBzID0gZmFsc2U7CisJCWlmIChwbHVnaW5FbnRyaWVzICE9IG51bGwpIHsKKwkJCXZhbGlkYXRlUGx1Z2luRW50cmllcygpOworCQkJY29tcGFyZVRpbWVTdGFtcHMgPSB0cnVlOyAvLyBvbmx5IHBpY2sgdXAgbmV3ZXIgcGx1Z2lucworCQl9IGVsc2UKKwkJCXBsdWdpbkVudHJpZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisKKwkJaWYgKCFQbGF0Zm9ybUNvbmZpZ3VyYXRpb24uc3VwcG9ydHNEZXRlY3Rpb24ocmVzb2x2ZWRVUkwsIGNvbmZpZy5nZXRJbnN0YWxsVVJMKCkpKQorCQkJcmV0dXJuOworCisJCS8vIGxvY2F0ZSBwbHVnaW4gZW50cmllcyBvbiBzaXRlCisJCUZpbGUgcGx1Z2luc0RpciA9IG5ldyBGaWxlKHJlc29sdmVkVVJMLmdldEZpbGUoKSwgUExVR0lOUyk7CisJCQorCQlpZiAocGx1Z2luc0Rpci5leGlzdHMoKSAmJiBwbHVnaW5zRGlyLmlzRGlyZWN0b3J5KCkpIHsKKwkJCUZpbGVbXSBmaWxlcyA9IHBsdWdpbnNEaXIubGlzdEZpbGVzKCk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7CisJCQkJaWYoZmlsZXNbaV0uaXNEaXJlY3RvcnkoKSl7CisJCQkJCWRldGVjdFVucGFja2VkUGx1Z2luKGZpbGVzW2ldLCBjb21wYXJlVGltZVN0YW1wcyk7CisJCQkJfWVsc2UgaWYoZmlsZXNbaV0uZ2V0TmFtZSgpLmVuZHNXaXRoKCIuamFyIikpeyAvLyROT04tTkxTLTEkCisJCQkJCWRldGVjdFBhY2tlZFBsdWdpbihmaWxlc1tpXSwgY29tcGFyZVRpbWVTdGFtcHMpOworCQkJCX1lbHNleworCQkJCQkvLyBub3QgYnVuZGxlIGZpbGUKKwkJCQl9CisJCQl9CisJCX0gCisJCQorCQlVdGlscy5kZWJ1ZyhyZXNvbHZlZFVSTC50b1N0cmluZygpICsgIiBsb2NhdGVkICAiICsgcGx1Z2luRW50cmllcy5zaXplKCkgKyAiIHBsdWdpbihzKSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gZmlsZSBhIHBsdWdpbiBqYXIKKwkgKiBAcGFyYW0gY29tcGFyZVRpbWVTdGFtcHMgc2V0IHRvIHRydWUgd2hlbiBsb29raW5nIGZvciBwbHVnaW5zIGNoYW5nZWQgc2luY2UgbGFzdCB0aW1lIHRoZXkgd2VyZSBkZXRlY3RlZAorCSAqLworCXByaXZhdGUgdm9pZCBkZXRlY3RQYWNrZWRQbHVnaW4oRmlsZSBmaWxlLCBib29sZWFuIGNvbXBhcmVUaW1lU3RhbXBzKSB7CisJCS8vIHBsdWdpbiB0byBydW4gZGlyZWN0bHkgZnJvbSBqYXIKKwkJaWYgKGNvbXBhcmVUaW1lU3RhbXBzICYmIGZpbGUubGFzdE1vZGlmaWVkKCkgPD0gcGx1Z2luc0NoYW5nZVN0YW1wKSB7CisJCQlyZXR1cm47CisJCX0KKwkJU3RyaW5nIGVudHJ5TmFtZSA9IE1FVEFfTUFOSUZFU1RfTUY7CisJCVppcEZpbGUgeiA9IG51bGw7CisJCUlucHV0U3RyZWFtIGJ1bmRsZU1hbmlmZXN0SW4gPSBudWxsOworCQlJbnB1dFN0cmVhbSBwbHVnaW5NYW5pZmVzdEluID0gbnVsbDsKKwkJU3RyaW5nIHBsdWdpblVSTCA9IFBMVUdJTlMgKyAiLyIgKyBmaWxlLmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJAorCQl0cnkgeworCQkJLy8gRmlyc3QsIGNoZWNrIGlmIGhhcyB2YWxpZCBidW5kbGUgbWFuaWZlc3QKKwkJCXogPSBuZXcgWmlwRmlsZShmaWxlKTsKKwkJCWlmICh6LmdldEVudHJ5KGVudHJ5TmFtZSkgIT0gbnVsbCkgeworCQkJCWJ1bmRsZU1hbmlmZXN0SW4gPSB6LmdldElucHV0U3RyZWFtKG5ldyBaaXBFbnRyeShlbnRyeU5hbWUpKTsKKwkJCQlCdW5kbGVNYW5pZmVzdCBtYW5pZmVzdCA9IG5ldyBCdW5kbGVNYW5pZmVzdChidW5kbGVNYW5pZmVzdEluLAorCQkJCQkJcGx1Z2luVVJMKTsKKwkJCQlpZiAobWFuaWZlc3QuZXhpc3RzKCkpIHsKKwkJCQkJYWRkUGx1Z2luRW50cnkobWFuaWZlc3QuZ2V0UGx1Z2luRW50cnkoKSk7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9CisJCQkvLyBubyBidW5kbGUgbWFuaWZlc3QsIGNoZWNrIGZvciBwbHVnaW4ueG1sIG9yIGZyYWdtZW50LnhtbAorCQkJZW50cnlOYW1lID0gUExVR0lOX1hNTDsKKwkJCWlmICh6LmdldEVudHJ5KGVudHJ5TmFtZSkgPT0gbnVsbCkgeworCQkJCWVudHJ5TmFtZSA9IEZSQUdNRU5UX1hNTDsKKwkJCX0KKwkJCWlmICh6LmdldEVudHJ5KGVudHJ5TmFtZSkgIT0gbnVsbCkgeworCQkJCXBsdWdpbk1hbmlmZXN0SW4gPSB6LmdldElucHV0U3RyZWFtKG5ldyBaaXBFbnRyeShlbnRyeU5hbWUpKTsKKwkJCQlQbHVnaW5FbnRyeSBlbnRyeTEgPSBwbHVnaW5QYXJzZXIucGFyc2UocGx1Z2luTWFuaWZlc3RJbiwKKwkJCQkJCXBsdWdpblVSTCk7CisJCQkJYWRkUGx1Z2luRW50cnkoZW50cnkxKTsKKwkJCX0KKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZTUpIHsKKwkJCVN0cmluZyBwbHVnaW5GaWxlU3RyaW5nMiA9IHBsdWdpblVSTCArICIhIiArIGVudHJ5TmFtZTsgLy8kTk9OLU5MUy0xJAorCQkJVXRpbHMubG9nKE5MUy5iaW5kKE1lc3NhZ2VzLkluc3RhbGxlZFNpdGVQYXJzZXJfRXJyb3JBY2Nlc3NpbmcsIChuZXcgU3RyaW5nW10geyBwbHVnaW5GaWxlU3RyaW5nMiB9KSkpOworCQl9IGNhdGNoIChTQVhFeGNlcHRpb24gZTMpIHsKKwkJCVN0cmluZyBwbHVnaW5GaWxlU3RyaW5nMSA9IHBsdWdpblVSTCArICIhIiArIGVudHJ5TmFtZTsgLy8kTk9OLU5MUy0xJAorCQkJVXRpbHMubG9nKE5MUy5iaW5kKE1lc3NhZ2VzLkluc3RhbGxlZFNpdGVQYXJzZXJfRXJyb3JQYXJzaW5nRmlsZSwgKG5ldyBTdHJpbmdbXSB7IHBsdWdpbkZpbGVTdHJpbmcxIH0pKSk7CisJCX0gZmluYWxseSB7CisJCQlpZiAoYnVuZGxlTWFuaWZlc3RJbiAhPSBudWxsKSB7CisJCQkJdHJ5IHsKKwkJCQkJYnVuZGxlTWFuaWZlc3RJbi5jbG9zZSgpOworCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGU0KSB7CisJCQkJfQorCQkJfQorCQkJaWYgKHBsdWdpbk1hbmlmZXN0SW4gIT0gbnVsbCkgeworCQkJCXRyeSB7CisJCQkJCXBsdWdpbk1hbmlmZXN0SW4uY2xvc2UoKTsKKwkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMikgeworCQkJCX0KKwkJCX0KKwkJCWlmICh6ICE9IG51bGwpIHsKKwkJCQl0cnkgeworCQkJCQl6LmNsb3NlKCk7CisJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZTEpIHsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJLyoqCisJICogQHBhcmFtIGZpbGUgYSBwbHVnaW4gZGlyZWN0b3J5CisJICogQHBhcmFtIGNvbXBhcmVUaW1lU3RhbXBzIHNldCB0byB0cnVlIHdoZW4gbG9va2luZyBmb3IgcGx1Z2lucyBjaGFuZ2VkIHNpbmNlIGxhc3QgdGltZSB0aGV5IHdlcmUgZGV0ZWN0ZWQKKwkgKi8KKwlwcml2YXRlIHZvaWQgZGV0ZWN0VW5wYWNrZWRQbHVnaW4oRmlsZSBmaWxlLCBib29sZWFuIGNvbXBhcmVUaW1lU3RhbXBzKSB7CisJCS8vIHVucGFja2VkIHBsdWdpbgorCQlsb25nIGRpclRpbWVzdGFtcCA9IGZpbGUubGFzdE1vZGlmaWVkKCk7CisJCUZpbGUgcGx1Z2luRmlsZSA9IG5ldyBGaWxlKGZpbGUsIE1FVEFfTUFOSUZFU1RfTUYpOworCQl0cnkgeworCQkJLy8gRmlyc3QsIGNoZWNrIGlmIGhhcyB2YWxpZCBidW5kbGUgbWFuaWZlc3QKKwkJCUJ1bmRsZU1hbmlmZXN0IGJ1bmRsZU1hbmlmZXN0ID0gbmV3IEJ1bmRsZU1hbmlmZXN0KHBsdWdpbkZpbGUpOworCQkJaWYgKGJ1bmRsZU1hbmlmZXN0LmV4aXN0cygpKSB7CisJCQkJaWYgKGNvbXBhcmVUaW1lU3RhbXBzCisJCQkJCQkmJiBkaXJUaW1lc3RhbXAgPD0gcGx1Z2luc0NoYW5nZVN0YW1wCisJCQkJCQkmJiBwbHVnaW5GaWxlLmxhc3RNb2RpZmllZCgpIDw9IHBsdWdpbnNDaGFuZ2VTdGFtcCkKKwkJCQkJcmV0dXJuOworCQkJCVBsdWdpbkVudHJ5IGVudHJ5ID0gYnVuZGxlTWFuaWZlc3QuZ2V0UGx1Z2luRW50cnkoKTsKKwkJCQlhZGRQbHVnaW5FbnRyeShlbnRyeSk7CisJCQl9IGVsc2UgeworCQkJCS8vIG5vIGJ1bmRsZSBtYW5pZmVzdCwgY2hlY2sgZm9yIHBsdWdpbi54bWwgb3IgZnJhZ21lbnQueG1sCisJCQkJcGx1Z2luRmlsZSA9IG5ldyBGaWxlKGZpbGUsIFBMVUdJTl9YTUwpOworCQkJCWlmICghcGx1Z2luRmlsZS5leGlzdHMoKSkgeyAKKwkJCQkJcGx1Z2luRmlsZSA9IG5ldyBGaWxlKGZpbGUsIEZSQUdNRU5UX1hNTCk7IAorCQkJCX0KKwkJCQlpZiAocGx1Z2luRmlsZS5leGlzdHMoKSAmJiAhcGx1Z2luRmlsZS5pc0RpcmVjdG9yeSgpKSB7CisJCQkJCS8vIFRPRE8gaW4gdGhlIGZ1dHVyZSwgYXNzdW1lIHRoYXQgdGhlIHRpbWVzdGFtcHMgYXJlIG5vdAorCQkJCQkvLyByZWxpYWJsZSwKKwkJCQkJLy8gb3IgdGhhdCB0aGUgdXNlciBtYW51YWxseSBtb2RpZmllZCBhbiBleGlzdGluZyBwbHVnaW4sCisJCQkJCS8vIHNvCisJCQkJCS8vIHRoZSBhcHBhcmVudGx5IG1vZGlmZWQgcGx1Z2luIG1heSBhY3R1YWxseSBiZSBjb25maWd1cmVkCisJCQkJCS8vIGFscmVhZHkuCisJCQkJCS8vIFdlIHdpbGwgbmVlZCB0byBkb3VibGUgY2hlY2sgZm9yIHRoaXMuIEVORCB0byBkby4KKwkJCQkJaWYgKGNvbXBhcmVUaW1lU3RhbXBzIAorCQkJCQkJCSYmIGRpclRpbWVzdGFtcCA8PSBwbHVnaW5zQ2hhbmdlU3RhbXAKKwkJCQkJCQkmJiBwbHVnaW5GaWxlLmxhc3RNb2RpZmllZCgpIDw9IHBsdWdpbnNDaGFuZ2VTdGFtcCkKKwkJCQkJCXJldHVybjsKKwkJCQkJUGx1Z2luRW50cnkgZW50cnkgPSBwbHVnaW5QYXJzZXIucGFyc2UocGx1Z2luRmlsZSk7CisJCQkJCWFkZFBsdWdpbkVudHJ5KGVudHJ5KTsKKwkJCQl9CisJCQl9CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCVN0cmluZyBwbHVnaW5GaWxlU3RyaW5nID0gcGx1Z2luRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKKwkJCWlmIChDb25maWd1cmF0aW9uQWN0aXZhdG9yLkRFQlVHKQorCQkJCVV0aWxzLmxvZyhVdGlscy5uZXdTdGF0dXMoTkxTLmJpbmQoTWVzc2FnZXMuSW5zdGFsbGVkU2l0ZVBhcnNlcl9FcnJvclBhcnNpbmdGaWxlLCAobmV3IFN0cmluZ1tdIHsgcGx1Z2luRmlsZVN0cmluZyB9KSksIGUpKTsKKwkJCWVsc2UKKwkJCQlVdGlscy5sb2coTkxTLmJpbmQoTWVzc2FnZXMuSW5zdGFsbGVkU2l0ZVBhcnNlcl9FcnJvckFjY2Vzc2luZywgKG5ldyBTdHJpbmdbXSB7IHBsdWdpbkZpbGVTdHJpbmcgfSkpKTsKKwkJfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKKwkJCVN0cmluZyBwbHVnaW5GaWxlU3RyaW5nID0gcGx1Z2luRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKKwkJCVV0aWxzLmxvZyhOTFMuYmluZChNZXNzYWdlcy5JbnN0YWxsZWRTaXRlUGFyc2VyX0Vycm9yUGFyc2luZ0ZpbGUsIChuZXcgU3RyaW5nW10geyBwbHVnaW5GaWxlU3RyaW5nIH0pKSk7CisgICAgICAgIH0KKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIGxpc3Qgb2YgZmVhdHVyZSB1cmwncyAocmVsYXRpdmUgdG8gc2l0ZSkKKwkgKi8KKwlwcml2YXRlIHN5bmNocm9uaXplZCBTdHJpbmdbXSBnZXREZXRlY3RlZEZlYXR1cmVzKCkgeworCQlpZiAoZmVhdHVyZUVudHJpZXMgPT0gbnVsbCkKKwkJCWRldGVjdEZlYXR1cmVzKCk7CisJCVN0cmluZ1tdIGZlYXR1cmVzID0gbmV3IFN0cmluZ1tmZWF0dXJlRW50cmllcy5zaXplKCldOworCQlJdGVyYXRvciBpdGVyYXRvciA9IGZlYXR1cmVFbnRyaWVzLnZhbHVlcygpLml0ZXJhdG9yKCk7CisJCWZvciAoaW50IGk9MDsgaTxmZWF0dXJlcy5sZW5ndGg7IGkrKykKKwkJCWZlYXR1cmVzW2ldID0gKChGZWF0dXJlRW50cnkpaXRlcmF0b3IubmV4dCgpKS5nZXRVUkwoKTsKKwkJcmV0dXJuIGZlYXR1cmVzOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gbGlzdCBvZiBwbHVnaW4gdXJsJ3MgKHJlbGF0aXZlIHRvIHNpdGUpCisJICovCisJcHJpdmF0ZSBzeW5jaHJvbml6ZWQgU3RyaW5nW10gZ2V0RGV0ZWN0ZWRQbHVnaW5zKCkgeworCQlpZiAocGx1Z2luRW50cmllcyA9PSBudWxsKQorCQkJZGV0ZWN0UGx1Z2lucygpOworCQkKKwkJU3RyaW5nW10gcGx1Z2lucyA9IG5ldyBTdHJpbmdbcGx1Z2luRW50cmllcy5zaXplKCldOworCQlmb3IgKGludCBpPTA7IGk8cGx1Z2lucy5sZW5ndGg7IGkrKykKKwkJCXBsdWdpbnNbaV0gPSAoKFBsdWdpbkVudHJ5KXBsdWdpbkVudHJpZXMuZ2V0KGkpKS5nZXRVUkwoKTsKKwkJcmV0dXJuIHBsdWdpbnM7CisJfQorCisJcHJpdmF0ZSB2b2lkIGNvbXB1dGVDaGFuZ2VTdGFtcCgpIHsKKwkJY2hhbmdlU3RhbXAgPSBNYXRoLm1heChjb21wdXRlRmVhdHVyZXNDaGFuZ2VTdGFtcCgpLCBjb21wdXRlUGx1Z2luc0NoYW5nZVN0YW1wKCkpOworLy8JCWNoYW5nZVN0YW1wSXNWYWxpZCA9IHRydWU7CisJfQorCisJcHJpdmF0ZSBzeW5jaHJvbml6ZWQgbG9uZyBjb21wdXRlRmVhdHVyZXNDaGFuZ2VTdGFtcCgpIHsKKwkJaWYgKGZlYXR1cmVzQ2hhbmdlU3RhbXAgPiAwKQorCQkJcmV0dXJuIGZlYXR1cmVzQ2hhbmdlU3RhbXA7CisJCQorCQlsb25nIHN0YXJ0ID0gMDsKKwkJaWYgKENvbmZpZ3VyYXRpb25BY3RpdmF0b3IuREVCVUcpCisJCQlzdGFydCA9IChuZXcgRGF0ZSgpKS5nZXRUaW1lKCk7CisJCVN0cmluZ1tdIGZlYXR1cmVzID0gZ2V0RmVhdHVyZXMoKTsKKwkKKwkJLy8gY29tcHV0ZSBzdGFtcCBmb3IgdGhlIGZlYXR1cmVzIGRpcmVjdG9yeQorCQlsb25nIGRpclN0YW1wID0gMDsKKwkJaWYgKFBsYXRmb3JtQ29uZmlndXJhdGlvbi5zdXBwb3J0c0RldGVjdGlvbihyZXNvbHZlZFVSTCwgY29uZmlnLmdldEluc3RhbGxVUkwoKSkpIHsKKwkJCUZpbGUgcm9vdCA9IG5ldyBGaWxlKHJlc29sdmVkVVJMLmdldEZpbGUoKS5yZXBsYWNlKCcvJywgRmlsZS5zZXBhcmF0b3JDaGFyKSk7CisJCQlGaWxlIGZlYXR1cmVzRGlyID0gbmV3IEZpbGUocm9vdCwgRkVBVFVSRVMpOworCQkJZGlyU3RhbXAgPSBmZWF0dXJlc0Rpci5sYXN0TW9kaWZpZWQoKTsKKwkJfQorCQlmZWF0dXJlc0NoYW5nZVN0YW1wID0gTWF0aC5tYXgoZGlyU3RhbXAsIGNvbXB1dGVTdGFtcChmZWF0dXJlcykpOworCQlpZiAoQ29uZmlndXJhdGlvbkFjdGl2YXRvci5ERUJVRykgeworCQkJbG9uZyBlbmQgPSAobmV3IERhdGUoKSkuZ2V0VGltZSgpOworCQkJVXRpbHMuZGVidWcocmVzb2x2ZWRVUkwudG9TdHJpbmcoKSArICIgZmVhdHVyZSBzdGFtcDogIiArIGZlYXR1cmVzQ2hhbmdlU3RhbXAgKyAiIGluICIgKyAoZW5kIC0gc3RhcnQpICsgIm1zIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkICAgCisJCX0KKwkJcmV0dXJuIGZlYXR1cmVzQ2hhbmdlU3RhbXA7CisJfQorCisJcHJpdmF0ZSBzeW5jaHJvbml6ZWQgbG9uZyBjb21wdXRlUGx1Z2luc0NoYW5nZVN0YW1wKCkgeworCQlpZiAocGx1Z2luc0NoYW5nZVN0YW1wID4gMCkKKwkJCXJldHVybiBwbHVnaW5zQ2hhbmdlU3RhbXA7CisJCQorCQlpZiAoIVBsYXRmb3JtQ29uZmlndXJhdGlvbi5zdXBwb3J0c0RldGVjdGlvbihyZXNvbHZlZFVSTCwgY29uZmlnLmdldEluc3RhbGxVUkwoKSkpIHsKKwkJCVV0aWxzLmxvZyhOTFMuYmluZChNZXNzYWdlcy5TaXRlRW50cnlfY29tcHV0ZVBsdWdpblN0YW1wLCAobmV3IFN0cmluZ1tdIHsgcmVzb2x2ZWRVUkwudG9FeHRlcm5hbEZvcm0oKSB9KSkpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQkvLyBjb21wdXRlIHN0YW1wIGZvciB0aGUgcGx1Z2lucyBkaXJlY3RvcnkKKwkJRmlsZSByb290ID0gbmV3IEZpbGUocmVzb2x2ZWRVUkwuZ2V0RmlsZSgpLnJlcGxhY2UoJy8nLCBGaWxlLnNlcGFyYXRvckNoYXIpKTsKKwkJRmlsZSBwbHVnaW5zRGlyID0gbmV3IEZpbGUocm9vdCwgUExVR0lOUyk7CisJCWlmICghcGx1Z2luc0Rpci5leGlzdHMoKSB8fCAhcGx1Z2luc0Rpci5pc0RpcmVjdG9yeSgpKSB7CisJCQlVdGlscy5kZWJ1ZyhOTFMuYmluZChNZXNzYWdlcy5TaXRlRW50cnlfcGx1Z2luc0RpciwgKG5ldyBTdHJpbmdbXSB7IHBsdWdpbnNEaXIuZ2V0QWJzb2x1dGVQYXRoKCkgfSkpKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJcGx1Z2luc0NoYW5nZVN0YW1wID0gcGx1Z2luc0Rpci5sYXN0TW9kaWZpZWQoKTsKKwkJcmV0dXJuIHBsdWdpbnNDaGFuZ2VTdGFtcDsKKwl9CisKKwlwcml2YXRlIGxvbmcgY29tcHV0ZVN0YW1wKFN0cmluZ1tdIHRhcmdldHMpIHsKKworCQlsb25nIHJlc3VsdCA9IDA7CisJCWlmICghUGxhdGZvcm1Db25maWd1cmF0aW9uLnN1cHBvcnRzRGV0ZWN0aW9uKHJlc29sdmVkVVJMLCBjb25maWcuZ2V0SW5zdGFsbFVSTCgpKSkgeworCQkJLy8gTk9URTogIHRoaXMgcGF0aCBzaG91bGQgbm90IGJlIGV4ZWN1dGVkIHVudGlsIHdlIHN1cHBvcnQgcnVubmluZworCQkJLy8gICAgICAgIGZyb20gYW4gYXJiaXRyYXJ5IFVSTCAoaW4gcGFydGljdWxhciBmcm9tIGh0dHAgc2VydmVyKS4gRm9yCisJCQkvLyAgICAgICAgbm93IGp1c3QgY29tcHV0ZSBzdGFtcCBhY3Jvc3MgdGhlIGxpc3Qgb2YgbmFtZXMuIEV2ZW50dWFsbHkKKwkJCS8vICAgICAgICB3aGVuIGdlbmVyYWwgVVJMcyBhcmUgc3VwcG9ydGVkIHdlIG5lZWQgdG8gZG8gYmV0dGVyIChmYWN0b3IKKwkJCS8vICAgICAgICBpbiBhdCBsZWFzdCB0aGUgZXhpc3RlbmNlIG9mIHRoZSB0YXJnZXQpLiBIb3dldmVyLCBnaXZlbiB0aGlzCisJCQkvLyAgICAgICAgY29kZSBleGVjdXRlcyBlYXJseSBvbiB0aGUgc3RhcnR1cCBzZXF1ZW5jZSB3ZSBuZWVkIHRvIGJlCisJCQkvLyAgICAgICAgZXh0cmVtZWx5IG1pbmRmdWwgb2YgcGVyZm9ybWFuY2UgaXNzdWVzLgorCQkJLy8gSW4gZmFjdCwgd2Ugc2hvdWxkIGdldCB0aGUgbGFzdCBtb2RpZmllZCBmcm9tIHRoZSBjb25uZWN0aW9uCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHRhcmdldHMubGVuZ3RoOyBpKyspCisJCQkJcmVzdWx0IF49IHRhcmdldHNbaV0uaGFzaENvZGUoKTsKKwkJCVV0aWxzLmRlYnVnKCIqV0FSTklORyogY29tcHV0aW5nIHN0YW1wIHVzaW5nIFVSTCBoYXNoY29kZXMgb25seSIpOyAvLyROT04tTkxTLTEkCisJCX0gZWxzZSB7CisJCQkvLyBjb21wdXRlIHN0YW1wIGFjcm9zcyBsb2NhbCB0YXJnZXRzCisJCQlGaWxlIHJvb3RGaWxlID0gbmV3IEZpbGUocmVzb2x2ZWRVUkwuZ2V0RmlsZSgpLnJlcGxhY2UoJy8nLCBGaWxlLnNlcGFyYXRvckNoYXIpKTsKKwkJCWlmIChyb290RmlsZS5leGlzdHMoKSkgeworCQkJCUZpbGUgZiA9IG51bGw7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0YXJnZXRzLmxlbmd0aDsgaSsrKSB7CisJCQkJCWYgPSBuZXcgRmlsZShyb290RmlsZSwgdGFyZ2V0c1tpXSk7CisJCQkJCWlmIChmLmV4aXN0cygpKQorCQkJCQkJcmVzdWx0ID0gTWF0aC5tYXgocmVzdWx0LCBmLmxhc3RNb2RpZmllZCgpKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlyZXR1cm4gcmVzdWx0OworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRMaW5rRmlsZU5hbWUoU3RyaW5nIGxpbmtGaWxlTmFtZSkgeworCQl0aGlzLmxpbmtGaWxlTmFtZSA9IGxpbmtGaWxlTmFtZTsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRMaW5rRmlsZU5hbWUoKSB7CisJCXJldHVybiBsaW5rRmlsZU5hbWU7CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNFeHRlcm5hbGx5TGlua2VkU2l0ZSgpIHsKKwkJcmV0dXJuIChsaW5rRmlsZU5hbWUgIT0gbnVsbCAmJiAhbGlua0ZpbGVOYW1lLnRyaW0oKS5lcXVhbHMoIiIpKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZWZyZXNoKCkgeworCQkvLyByZXNldCBjb21wdXRlZCB2YWx1ZXMuIFdpbGwgYmUgdXBkYXRlZCBvbiBuZXh0IGFjY2Vzcy4KKwkJZmVhdHVyZXNDaGFuZ2VTdGFtcCA9IDA7CisJCXBsdWdpbnNDaGFuZ2VTdGFtcCA9IDA7CisJCWNoYW5nZVN0YW1wID0gMDsKKwkJZmVhdHVyZUVudHJpZXMgPSBudWxsOworCQlwbHVnaW5FbnRyaWVzID0gbnVsbDsKKwl9CisJCisJcHVibGljIHZvaWQgcmVmcmVzaFBsdWdpbnMoKSB7CisJCS8vIHJlc2V0IGNvbXB1dGVkIHZhbHVlcy4gV2lsbCBiZSB1cGRhdGVkIG9uIG5leHQgYWNjZXNzLgorCQlwbHVnaW5zQ2hhbmdlU3RhbXAgPSAwOworCQljaGFuZ2VTdGFtcCA9IDA7CisJCXBsdWdpbkVudHJpZXMgPSBudWxsOworCX0KKwkKKwlwdWJsaWMgdm9pZCBhZGRGZWF0dXJlRW50cnkoSUZlYXR1cmVFbnRyeSBmZWF0dXJlKSB7CisJCWlmIChmZWF0dXJlRW50cmllcyA9PSBudWxsKQorCQkJZmVhdHVyZUVudHJpZXMgPSBuZXcgSGFzaE1hcCgpOworCQkvLyBNYWtlIHN1cmUgd2Uga2VlcCB0aGUgbGFyZ2VyIHZlcnNpb24gb2Ygc2FtZSBmZWF0dXJlCisJCUlGZWF0dXJlRW50cnkgZXhpc3RpbmcgPSAoRmVhdHVyZUVudHJ5KWZlYXR1cmVFbnRyaWVzLmdldChmZWF0dXJlLmdldEZlYXR1cmVJZGVudGlmaWVyKCkpOworCQlpZiAoZXhpc3RpbmcgIT0gbnVsbCkgeworCQkJVmVyc2lvbmVkSWRlbnRpZmllciBleGlzdGluZ1ZlcnNpb24gPSBuZXcgVmVyc2lvbmVkSWRlbnRpZmllcihleGlzdGluZy5nZXRGZWF0dXJlSWRlbnRpZmllcigpLCBleGlzdGluZy5nZXRGZWF0dXJlVmVyc2lvbigpKTsKKwkJCVZlcnNpb25lZElkZW50aWZpZXIgbmV3VmVyc2lvbiA9IG5ldyBWZXJzaW9uZWRJZGVudGlmaWVyKGZlYXR1cmUuZ2V0RmVhdHVyZUlkZW50aWZpZXIoKSwgZmVhdHVyZS5nZXRGZWF0dXJlVmVyc2lvbigpKTsKKwkJCWlmIChleGlzdGluZ1ZlcnNpb24uZ2V0VmVyc2lvbigpLmNvbXBhcmVUbyhuZXdWZXJzaW9uLmdldFZlcnNpb24oKSkgPCAwKSB7CisJCQkJZmVhdHVyZUVudHJpZXMucHV0KGZlYXR1cmUuZ2V0RmVhdHVyZUlkZW50aWZpZXIoKSwgZmVhdHVyZSk7CisJCQkJcGx1Z2luc0NoYW5nZVN0YW1wID0gMDsKKwkJCX0gZWxzZSBpZiAoZXhpc3RpbmdWZXJzaW9uLmVxdWFscyhuZXdWZXJzaW9uKSkgeworCQkJCS8vIGxvZyBlcnJvciBpZiBzYW1lIGZlYXR1cmUgdmVyc2lvbi9pZCBidXQgYSBkaWZmZXJlbnQgdXJsCisJCQkJaWYgKGZlYXR1cmUgaW5zdGFuY2VvZiBGZWF0dXJlRW50cnkgJiYgZXhpc3RpbmcgaW5zdGFuY2VvZiBGZWF0dXJlRW50cnkgJiYKKwkJCQkJCSEoKEZlYXR1cmVFbnRyeSlmZWF0dXJlKS5nZXRVUkwoKS5lcXVhbHMoKChGZWF0dXJlRW50cnkpZXhpc3RpbmcpLmdldFVSTCgpKSkKKwkJCQlVdGlscy5sb2coTkxTLmJpbmQoTWVzc2FnZXMuU2l0ZUVudHJ5X2R1cGxpY2F0ZUZlYXR1cmUsIChuZXcgU3RyaW5nW10geyBnZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpLCBleGlzdGluZy5nZXRGZWF0dXJlSWRlbnRpZmllcigpIH0pKSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlmZWF0dXJlRW50cmllcy5wdXQoZmVhdHVyZS5nZXRGZWF0dXJlSWRlbnRpZmllcigpLCBmZWF0dXJlKTsKKwkJCXBsdWdpbnNDaGFuZ2VTdGFtcCA9IDA7CisJCX0KKwkJaWYgKGZlYXR1cmUgaW5zdGFuY2VvZiBGZWF0dXJlRW50cnkpCisJCQkoKEZlYXR1cmVFbnRyeSlmZWF0dXJlKS5zZXRTaXRlKHRoaXMpOworCX0KKwkKKwlwdWJsaWMgRmVhdHVyZUVudHJ5W10gZ2V0RmVhdHVyZUVudHJpZXMoKSB7CisJCWlmIChmZWF0dXJlRW50cmllcyA9PSBudWxsKQorCQkJZGV0ZWN0RmVhdHVyZXMoKTsKKwkJCisJCWlmIChmZWF0dXJlRW50cmllcyA9PSBudWxsKQorCQkJcmV0dXJuIG5ldyBGZWF0dXJlRW50cnlbMF07CisJCXJldHVybiAoRmVhdHVyZUVudHJ5W10pZmVhdHVyZUVudHJpZXMudmFsdWVzKCkudG9BcnJheShuZXcgRmVhdHVyZUVudHJ5W2ZlYXR1cmVFbnRyaWVzLnNpemUoKV0pOworCX0KKwkKKwlwdWJsaWMgdm9pZCBhZGRQbHVnaW5FbnRyeShQbHVnaW5FbnRyeSBwbHVnaW4pIHsKKwkJaWYgKHBsdWdpbkVudHJpZXMgPT0gbnVsbCkKKwkJCXBsdWdpbkVudHJpZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisJCS8vIE5vdGU6IHdlIGNvdWxkIHVzZSB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhlIHNhbWUgcGx1Z2luLCBsaWtlIHdlIGRvIGZvciBmZWF0dXJlcywgYnV0IHdlIGxldCB0aGUgcnVudGltZSBmaWd1cmUgaXQgb3V0CisJCXBsdWdpbkVudHJpZXMuYWRkKHBsdWdpbik7CisJfQorCQorCXB1YmxpYyBQbHVnaW5FbnRyeVtdIGdldEFsbFBsdWdpbkVudHJpZXMoKSB7CisJCWlmIChwbHVnaW5FbnRyaWVzID09IG51bGwpCisJCQlkZXRlY3RQbHVnaW5zKCk7CisJCXJldHVybiAoUGx1Z2luRW50cnlbXSlwbHVnaW5FbnRyaWVzLnRvQXJyYXkobmV3IFBsdWdpbkVudHJ5W3BsdWdpbkVudHJpZXMuc2l6ZSgpXSk7CisJfQorCQorCXB1YmxpYyB2b2lkIGxvYWRGcm9tRGlzayhsb25nIGxhc3RDaGFuZ2UpIHRocm93cyBDb3JlRXhjZXB0aW9ueworCQlmZWF0dXJlc0NoYW5nZVN0YW1wID0gbGFzdENoYW5nZTsKKwkJcGx1Z2luc0NoYW5nZVN0YW1wID0gbGFzdENoYW5nZTsKKwkJZGV0ZWN0RmVhdHVyZXMoKTsKKwkJZGV0ZWN0UGx1Z2lucygpOworCX0KKwkKKwkvKioKKwkgKiBTYXZlcyBzdGF0ZSBhcyB4bWwgY29udGVudCBpbiBhIGdpdmVuIHBhcmVudCBlbGVtZW50CisJICogQHBhcmFtIGRvYworCSAqLworCXB1YmxpYyBFbGVtZW50IHRvWE1MKERvY3VtZW50IGRvYykgeworCisJCUVsZW1lbnQgc2l0ZUVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudChDRkdfU0lURSk7CisJCQorCQlpZiAoZ2V0VVJMKCkgIT0gbnVsbCkgeworCQkJVVJMIHRvUGVyc2lzdCA9IChjb25maWcgPT0gbnVsbCB8fCBjb25maWcuaXNUcmFuc2llbnQoKSkgPyBnZXRVUkwoKSA6IFV0aWxzLm1ha2VSZWxhdGl2ZShVdGlscy5nZXRJbnN0YWxsVVJMKCksIGdldFVSTCgpKTsKKwkJCXNpdGVFbGVtZW50LnNldEF0dHJpYnV0ZShDRkdfVVJMLCB0b1BlcnNpc3QudG9TdHJpbmcoKSk7CisJCX0KKwkJCisJCXNpdGVFbGVtZW50LnNldEF0dHJpYnV0ZShDRkdfRU5BQkxFRCwgaXNFbmFibGVkKCkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCXNpdGVFbGVtZW50LnNldEF0dHJpYnV0ZShDRkdfVVBEQVRFQUJMRSwgaXNVcGRhdGVhYmxlKCkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCWlmIChpc0V4dGVybmFsbHlMaW5rZWRTaXRlKCkpIAorCQkJc2l0ZUVsZW1lbnQuc2V0QXR0cmlidXRlKENGR19MSU5LX0ZJTEUsIGdldExpbmtGaWxlTmFtZSgpLnRyaW0oKS5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKSk7IAorCisJCWludCB0eXBlID0gZ2V0U2l0ZVBvbGljeSgpLmdldFR5cGUoKTsKKwkJU3RyaW5nIHR5cGVTdHJpbmcgPSBDRkdfUE9MSUNZX1RZUEVfVU5LTk9XTjsKKwkJdHJ5IHsKKwkJCXR5cGVTdHJpbmcgPSBDRkdfUE9MSUNZX1RZUEVbdHlwZV07CisJCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgeworCQkJLy8gaWdub3JlIGJhZCBhdHRyaWJ1dGUgLi4uCisJCX0KKwkJc2l0ZUVsZW1lbnQuc2V0QXR0cmlidXRlKENGR19QT0xJQ1ksIHR5cGVTdHJpbmcpOyAKKwkJU3RyaW5nW10gbGlzdCA9IGdldFNpdGVQb2xpY3koKS5nZXRMaXN0KCk7CisJCWlmIChsaXN0Lmxlbmd0aCA+IDApIHsKKwkJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoMjU2KTsKKwkJCWZvciAoaW50IGk9MDsgaTxsaXN0Lmxlbmd0aC0xOyBpKyspIHsKKwkJCQlzYi5hcHBlbmQobGlzdFtpXSk7CisJCQkJc2IuYXBwZW5kKCcsJyk7CisJCQl9CisJCQlzYi5hcHBlbmQobGlzdFtsaXN0Lmxlbmd0aC0xXSk7CisJCQlzaXRlRWxlbWVudC5zZXRBdHRyaWJ1dGUoQ0ZHX0xJU1QsIHNiLnRvU3RyaW5nKCkpOworCQl9CisvLwkJLy8gbm90ZTogd2UgZG9uJ3Qgc2F2ZSBmZWF0dXJlcyBpbnNpZGUgdGhlIHNpdGUgZWxlbWVudC4KKwkJCisJCS8vIGNvbGxlY3QgZmVhdHVyZSBlbnRyaWVzCisvLwkJY29uZmlnRWxlbWVudC5zZXRBdHRyaWJ1dGUoQ0ZHX0ZFQVRVUkVfRU5UUllfREVGQVVMVCwgZGVmYXVsdEZlYXR1cmUpOworCQlGZWF0dXJlRW50cnlbXSBmZWF0cyA9IGdldEZlYXR1cmVFbnRyaWVzKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHMubGVuZ3RoOyBpKyspIHsKKwkJCUVsZW1lbnQgZmVhdHVyZUVsZW1lbnQgPSBmZWF0c1tpXS50b1hNTChkb2MpOworCQkJc2l0ZUVsZW1lbnQuYXBwZW5kQ2hpbGQoZmVhdHVyZUVsZW1lbnQpOworCQl9CisJCQorCQlyZXR1cm4gc2l0ZUVsZW1lbnQ7CisJfQorCQorCXByaXZhdGUgdm9pZCB2YWxpZGF0ZUZlYXR1cmVFbnRyaWVzKCkgeworCQlGaWxlIHJvb3QgPSBuZXcgRmlsZShyZXNvbHZlZFVSTC5nZXRGaWxlKCkucmVwbGFjZSgnLycsIEZpbGUuc2VwYXJhdG9yQ2hhcikpOworCQlJdGVyYXRvciBpdGVyYXRvciA9IGZlYXR1cmVFbnRyaWVzLnZhbHVlcygpLml0ZXJhdG9yKCk7CisJCUNvbGxlY3Rpb24gZGVsZXRlZEZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOworCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCUZlYXR1cmVFbnRyeSBmZWF0dXJlID0gKEZlYXR1cmVFbnRyeSlpdGVyYXRvci5uZXh0KCk7CisJCQkvLyBOb3RlOiBpbiB0aGUgZnV0dXJlLCB3ZSBjYW4gY2hlY2sgZm9yIGFic29sdXRlIHVybCBhcyB3ZWxsLgorCQkJLy8gICAgICAgRm9yIG5vdywgZmVhdHVyZSB1cmwgaXMgZmVhdHVyZXMvb3JnLmVjbGlwc2UuZm9vL2ZlYXR1cmUueG1sCisJCQlGaWxlIGZlYXR1cmVYTUwgPSBuZXcgRmlsZShyb290LCBmZWF0dXJlLmdldFVSTCgpKTsKKwkJCWlmICghZmVhdHVyZVhNTC5leGlzdHMoKSkKKwkJCQlkZWxldGVkRmVhdHVyZXMuYWRkKGZlYXR1cmUuZ2V0RmVhdHVyZUlkZW50aWZpZXIoKSk7CisJCX0KKwkJZm9yKEl0ZXJhdG9yIGl0PWRlbGV0ZWRGZWF0dXJlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KXsKKwkJCWZlYXR1cmVFbnRyaWVzLnJlbW92ZShpdC5uZXh0KCkpOworCQl9CisJfQorCQorCXByaXZhdGUgdm9pZCB2YWxpZGF0ZVBsdWdpbkVudHJpZXMoKSB7CisJCUZpbGUgcm9vdCA9IG5ldyBGaWxlKHJlc29sdmVkVVJMLmdldEZpbGUoKS5yZXBsYWNlKCcvJywgRmlsZS5zZXBhcmF0b3JDaGFyKSk7CisJCUNvbGxlY3Rpb24gZGVsZXRlZFBsdWdpbnMgPSBuZXcgQXJyYXlMaXN0KCk7CisJCWZvciAoaW50IGk9MDsgaTxwbHVnaW5FbnRyaWVzLnNpemUoKTsgaSsrKSB7CisJCQlQbHVnaW5FbnRyeSBwbHVnaW4gPSAoUGx1Z2luRW50cnkpcGx1Z2luRW50cmllcy5nZXQoaSk7CisJCQkvLyBOb3RlOiBpbiB0aGUgZnV0dXJlLCB3ZSBjYW4gY2hlY2sgZm9yIGFic29sdXRlIHVybCBhcyB3ZWxsLgorCQkJLy8gICAgICAgRm9yIG5vdywgZmVhdHVyZSB1cmwgaXMgcGx1Z2lucy9vcmcuZWNsaXBzZS5mb28vcGx1Z2luLnhtbAorCQkJRmlsZSBwbHVnaW5Mb2NhdGlvbiA9IG5ldyBGaWxlKHJvb3QsIHBsdWdpbi5nZXRVUkwoKSk7CisJCQlpZiAoIXBsdWdpbkxvY2F0aW9uLmV4aXN0cygpKQorCQkJCWRlbGV0ZWRQbHVnaW5zLmFkZChwbHVnaW4pOworCQl9CisJCWZvcihJdGVyYXRvciBpdD1kZWxldGVkUGx1Z2lucy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KXsKKwkJCXBsdWdpbkVudHJpZXMucmVtb3ZlKGl0Lm5leHQoKSk7CisJCX0KKwl9CisJCisJcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgeworCQlyZXR1cm4gZW5hYmxlZDsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZSkgeworCQl0aGlzLmVuYWJsZWQgPSBlbmFibGU7CisJfQorCQorCXB1YmxpYyBGZWF0dXJlRW50cnkgZ2V0RmVhdHVyZUVudHJ5KFN0cmluZyBpZCkgeworCQlGZWF0dXJlRW50cnlbXSBmZWF0dXJlcyA9IGdldEZlYXR1cmVFbnRyaWVzKCk7CisJCWZvciAoaW50IGk9MDsgaTxmZWF0dXJlcy5sZW5ndGg7IGkrKykKKwkJCWlmIChmZWF0dXJlc1tpXS5nZXRGZWF0dXJlSWRlbnRpZmllcigpLmVxdWFscyhpZCkpIAorCQkJCXJldHVybiBmZWF0dXJlc1tpXTsKKwkJcmV0dXJuIG51bGw7CisJfQorCQorCQorCXB1YmxpYyBib29sZWFuIHVuY29uZmlndXJlRmVhdHVyZUVudHJ5KElGZWF0dXJlRW50cnkgZmVhdHVyZSkgeworCQlGZWF0dXJlRW50cnkgZXhpc3RpbmdGZWF0dXJlID0gZ2V0RmVhdHVyZUVudHJ5KGZlYXR1cmUuZ2V0RmVhdHVyZUlkZW50aWZpZXIoKSk7CisJCWlmIChleGlzdGluZ0ZlYXR1cmUgIT0gbnVsbCkKKwkJCWZlYXR1cmVFbnRyaWVzLnJlbW92ZShleGlzdGluZ0ZlYXR1cmUuZ2V0RmVhdHVyZUlkZW50aWZpZXIoKSk7CisJCXJldHVybiBleGlzdGluZ0ZlYXR1cmUgIT0gbnVsbDsKKwl9CisJCisJLyoKKwkgKiBUaGlzIGlzIGEgYml0IG9mIGEgaGFjay4KKwkgKiBXaGVuIG5vIGZlYXR1cmVzIHdlcmUgYWRkZWQgdG8gdGhlIHNpdGUsIGJ1dCB0aGUgc2l0ZSBpcyBpbml0aWFsaXplZCBmcm9tIHBsYXRmb3JtLnhtbCAKKwkgKiB3ZSBuZWVkIHRvIHNldCB0aGUgZmVhdHVyZSBzZXQgdG8gZW1wdHksIHNvIHdlIGRvbid0IHRyeSB0byBkZXRlY3QgdGhlbS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplZCgpIHsgCisJCWlmIChmZWF0dXJlRW50cmllcyA9PSBudWxsKQorCQkJZmVhdHVyZUVudHJpZXMgPSBuZXcgSGFzaE1hcCgpOworCX0KK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL1NpdGVQb2xpY3kuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL1NpdGVQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2MzN2I5Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb25maWd1cmF0b3IvU2l0ZVBvbGljeS5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29uZmlndXJhdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IuSVBsYXRmb3JtQ29uZmlndXJhdGlvbi4qOworCisKK3B1YmxpYyBjbGFzcyBTaXRlUG9saWN5IGltcGxlbWVudHMgSVBsYXRmb3JtQ29uZmlndXJhdGlvbi5JU2l0ZVBvbGljeSB7CisKKwlwcml2YXRlIGludCB0eXBlOworCXByaXZhdGUgU3RyaW5nW10gbGlzdDsKKworCXB1YmxpYyBTaXRlUG9saWN5KCkgeworCX0KKwlwdWJsaWMgU2l0ZVBvbGljeShpbnQgdHlwZSwgU3RyaW5nW10gbGlzdCkgeworCQlpZiAodHlwZSAhPSBJU2l0ZVBvbGljeS5VU0VSX0lOQ0xVREUgJiYgdHlwZSAhPSBJU2l0ZVBvbGljeS5VU0VSX0VYQ0xVREUgJiYgdHlwZSAhPSBJU2l0ZVBvbGljeS5NQU5BR0VEX09OTFkpCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCXRoaXMudHlwZSA9IHR5cGU7CisKKwkJaWYgKGxpc3QgPT0gbnVsbCkKKwkJCXRoaXMubGlzdCA9IG5ldyBTdHJpbmdbMF07CisJCWVsc2UKKwkJCXRoaXMubGlzdCA9IGxpc3Q7CisJfQorCisJLyoKKwkgKiBAc2VlIElTaXRlUG9saWN5I2dldFR5cGUoKQorCSAqLworCXB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKKwkJcmV0dXJuIHR5cGU7CisJfQorCisJLyoKKwkqIEBzZWUgSVNpdGVQb2xpY3kjZ2V0TGlzdCgpCisJKi8KKwlwdWJsaWMgU3RyaW5nW10gZ2V0TGlzdCgpIHsKKwkJcmV0dXJuIGxpc3Q7CisJfQorCisJLyoKKwkgKiBAc2VlIElTaXRlUG9saWN5I3NldExpc3QoU3RyaW5nW10pCisJICovCisJcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldExpc3QoU3RyaW5nW10gbGlzdCkgeworCQlpZiAobGlzdCA9PSBudWxsKQorCQkJdGhpcy5saXN0ID0gbmV3IFN0cmluZ1swXTsKKwkJZWxzZQorCQkJdGhpcy5saXN0ID0gbGlzdDsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL1VwZGF0ZVVSTERlY29kZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL1VwZGF0ZVVSTERlY29kZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzNiNDlmCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb25maWd1cmF0b3IvVXBkYXRlVVJMRGVjb2Rlci5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29uZmlndXJhdG9yOworCitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTERlY29kZXI7CisKK3B1YmxpYyBjbGFzcyBVcGRhdGVVUkxEZWNvZGVyIHsKKwlzdGF0aWMgYm9vbGVhbiBpbml0PWZhbHNlOworCXN0YXRpYyBib29sZWFuIHVzZUVuYz10cnVlOworCQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlY29kZShTdHJpbmcgcywgU3RyaW5nIGVuYykgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24geworCQlpZiAoIWluaXQpIHsKKwkJCWluaXQgPSB0cnVlOworCQkJdHJ5IHsKKwkJCQlyZXR1cm4gVVJMRGVjb2Rlci5kZWNvZGUocywgZW5jKTsKKwkJCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEVycm9yIGUpIHsKKwkJCQl1c2VFbmM9ZmFsc2U7CQkJCQorCQkJfQorCQl9CisJCQorCQlpZiAodXNlRW5jKSB7CisJCQlyZXR1cm4gVVJMRGVjb2Rlci5kZWNvZGUocywgZW5jKTsKKwkJfSAJCQkKKwkJcmV0dXJuIFVSTERlY29kZXIuZGVjb2RlKHMpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb25maWd1cmF0b3IvVmVyc2lvbmVkSWRlbnRpZmllci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb25maWd1cmF0b3IvVmVyc2lvbmVkSWRlbnRpZmllci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzNmUyNTMKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvbmZpZ3VyYXRvci9WZXJzaW9uZWRJZGVudGlmaWVyLmphdmEKQEAgLTAsMCArMSw2NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb25maWd1cmF0b3I7CisKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKKworcHVibGljIGNsYXNzIFZlcnNpb25lZElkZW50aWZpZXIgeworCXByaXZhdGUgU3RyaW5nIGlkZW50aWZpZXI7CisJcHJpdmF0ZSBWZXJzaW9uIHZlcnNpb247CisKKwlwdWJsaWMgVmVyc2lvbmVkSWRlbnRpZmllcihTdHJpbmcgaWQsIFN0cmluZyB2ZXJzaW9uKSB7CisJCXRoaXMuaWRlbnRpZmllciA9IGlkOworCQl0aGlzLnZlcnNpb24gPSBWZXJzaW9uLnBhcnNlVmVyc2lvbih2ZXJzaW9uKTsKKwl9CisKKwlwdWJsaWMgVmVyc2lvbiBnZXRWZXJzaW9uKCkgeworCQlyZXR1cm4gdmVyc2lvbjsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldElkZW50aWZpZXIoKSB7CisJCXJldHVybiBpZGVudGlmaWVyOworCX0KKworCXByaXZhdGUgYm9vbGVhbiBlcXVhbElkZW50aWZpZXJzKFZlcnNpb25lZElkZW50aWZpZXIgaWQpIHsKKwkJaWYgKGlkID09IG51bGwpCisJCQlyZXR1cm4gaWRlbnRpZmllciA9PSBudWxsOworCQlyZXR1cm4gaWQuaWRlbnRpZmllci5lcXVhbHMoaWRlbnRpZmllcik7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworCQlpZiAodGhpcyA9PSBvYmopCisJCQlyZXR1cm4gdHJ1ZTsKKwkJaWYgKCEob2JqIGluc3RhbmNlb2YgVmVyc2lvbmVkSWRlbnRpZmllcikpCisJCQlyZXR1cm4gZmFsc2U7CisKKwkJVmVyc2lvbmVkSWRlbnRpZmllciBvdGhlciA9IChWZXJzaW9uZWRJZGVudGlmaWVyKSBvYmo7CisJCWlmICghZXF1YWxJZGVudGlmaWVycyhvdGhlcikpCisJCQlyZXR1cm4gZmFsc2U7CisJCXJldHVybiB2ZXJzaW9uLmVxdWFscyhvdGhlci5nZXRWZXJzaW9uKCkpOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjaGFzaENvZGUoKQorCSAqLworCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisJCXJldHVybiAoaWRlbnRpZmllciArICJfIiArIGdldFZlcnNpb24oKSkuaGFzaENvZGUoKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQorCSAqLworCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiBpZGVudGlmaWVyICsgIl8iICsgZ2V0VmVyc2lvbigpOyAvLyROT04tTkxTLTEkCisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL1hNTFByaW50SGFuZGxlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb25maWd1cmF0b3IvWE1MUHJpbnRIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE0OTgyYQotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL1hNTFByaW50SGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsMTMzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29uZmlndXJhdG9yOworCitpbXBvcnQgamF2YS5pby4qOworCitpbXBvcnQgb3JnLnczYy5kb20uKjsKKworCitwdWJsaWMgY2xhc3MgWE1MUHJpbnRIYW5kbGVyIHsKKwkvLwl1c2VkIHRvIHByaW50IFhNTCBmaWxlCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0hFQUQgPSAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9IRUFEX0VORF9UQUcgPSAiPz4iOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0RCTF9RVU9URVMgPSAiXCIiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1NQQUNFID0gIiAiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0JFR0lOX1RBRyA9ICI8IjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9FTkRfVEFHID0gIj4iOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0VRVUFMID0gIj0iOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1NMQVNIID0gIi8iOyAvLyROT04tTkxTLTEkCisKKwlwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRCZWdpbkVsZW1lbnQoV3JpdGVyIHhtbFdyaXRlciwgU3RyaW5nIGVsZW1lbnRTdHJpbmcpIHRocm93cyBJT0V4Y2VwdGlvbnsKKwkJU3RyaW5nQnVmZmVyIHRlbXAgPSBuZXcgU3RyaW5nQnVmZmVyKFhNTF9CRUdJTl9UQUcpOworCQl0ZW1wLmFwcGVuZChlbGVtZW50U3RyaW5nKS5hcHBlbmQoWE1MX0VORF9UQUcpLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAorCQl4bWxXcml0ZXIud3JpdGUodGVtcC50b1N0cmluZygpKTsKKworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBwcmludEVuZEVsZW1lbnQoV3JpdGVyIHhtbFdyaXRlciwgU3RyaW5nIGVsZW1lbnRTdHJpbmcpIHRocm93cyBJT0V4Y2VwdGlvbnsKKwkJU3RyaW5nQnVmZmVyIHRlbXAgPSBuZXcgU3RyaW5nQnVmZmVyKFhNTF9CRUdJTl9UQUcpOworCQl0ZW1wLmFwcGVuZChYTUxfU0xBU0gpLmFwcGVuZChlbGVtZW50U3RyaW5nKS5hcHBlbmQoWE1MX0VORF9UQUcpLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAorCQl4bWxXcml0ZXIud3JpdGUodGVtcC50b1N0cmluZygpKTsKKworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBwcmludEhlYWQoV3JpdGVyIHhtbFdyaXRlciwgU3RyaW5nIGVuY29kaW5nKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlTdHJpbmdCdWZmZXIgdGVtcCA9IG5ldyBTdHJpbmdCdWZmZXIoWE1MX0hFQUQpOworCQl0ZW1wLmFwcGVuZChlbmNvZGluZykuYXBwZW5kKFhNTF9EQkxfUVVPVEVTKS5hcHBlbmQoWE1MX0hFQURfRU5EX1RBRykuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCisJCXhtbFdyaXRlci53cml0ZSh0ZW1wLnRvU3RyaW5nKCkpOworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdyYXBBdHRyaWJ1dGVGb3JQcmludChTdHJpbmcgYXR0cmlidXRlLCBTdHJpbmcgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCVN0cmluZ0J1ZmZlciB0ZW1wID0gbmV3IFN0cmluZ0J1ZmZlcihYTUxfU1BBQ0UpOworCQl0ZW1wLmFwcGVuZChhdHRyaWJ1dGUpLmFwcGVuZChYTUxfRVFVQUwpLmFwcGVuZChYTUxfREJMX1FVT1RFUykKKwkJCQkuYXBwZW5kKGVuY29kZSh2YWx1ZSkudG9TdHJpbmcoKSkuYXBwZW5kKFhNTF9EQkxfUVVPVEVTKTsKKwkJcmV0dXJuIHRlbXAudG9TdHJpbmcoKTsKKworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBwcmludE5vZGUoV3JpdGVyIHhtbFdyaXRlciwgTm9kZSBub2RlLFN0cmluZyBlbmNvZGluZykgIHRocm93cyBFeGNlcHRpb257CisJCWlmIChub2RlID09IG51bGwpIHsKKwkJCXJldHVybjsKKwkJfQorCisJCXN3aXRjaCAobm9kZS5nZXROb2RlVHlwZSgpKSB7CisJCWNhc2UgTm9kZS5ET0NVTUVOVF9OT0RFOiB7CisJCQlwcmludEhlYWQoeG1sV3JpdGVyLGVuY29kaW5nKTsKKwkJCXByaW50Tm9kZSh4bWxXcml0ZXIsICgoRG9jdW1lbnQpIG5vZGUpLmdldERvY3VtZW50RWxlbWVudCgpLGVuY29kaW5nKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgTm9kZS5FTEVNRU5UX05PREU6IHsKKwkJCS8vZ2V0IHRoZSBhdHRyaWJ1dGUgbGlzdCBmb3IgdGhpcyBub2RlLgorCQkJU3RyaW5nQnVmZmVyIHRlbXBFbGVtZW50U3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcihub2RlLmdldE5vZGVOYW1lKCkpOworCQkJTmFtZWROb2RlTWFwIGF0dHJpYnV0ZUxpc3QgPSBub2RlLmdldEF0dHJpYnV0ZXMoKTsKKwkJCWlmICggYXR0cmlidXRlTGlzdCAhPSBudWxsICkgeworCQkJCWZvcihpbnQgaT0gMDsgaSA8YXR0cmlidXRlTGlzdC5nZXRMZW5ndGgoKTtpKyspeworCQkJCQlOb2RlIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZUxpc3QuaXRlbShpKTsKKwkJCQkJdGVtcEVsZW1lbnRTdHJpbmcuYXBwZW5kKHdyYXBBdHRyaWJ1dGVGb3JQcmludChhdHRyaWJ1dGUuZ2V0Tm9kZU5hbWUoKSxhdHRyaWJ1dGUuZ2V0Tm9kZVZhbHVlKCkpKTsKKwkJCQl9CisJCQl9CisJCQlwcmludEJlZ2luRWxlbWVudCh4bWxXcml0ZXIsdGVtcEVsZW1lbnRTdHJpbmcudG9TdHJpbmcoKSk7CisJCQkKKwkJCS8vIGRvIHRoaXMgcmVjdXJzaXZlbHkgZm9yIHRoZSBjaGlsZCBub2Rlcy4KKwkJCU5vZGVMaXN0IGNoaWxkTm9kZXMgPSBub2RlLmdldENoaWxkTm9kZXMoKTsKKwkJCWlmIChjaGlsZE5vZGVzICE9IG51bGwpIHsKKwkJCQlpbnQgbGVuZ3RoID0gY2hpbGROb2Rlcy5nZXRMZW5ndGgoKTsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCQkJCXByaW50Tm9kZSh4bWxXcml0ZXIsIGNoaWxkTm9kZXMuaXRlbShpKSxlbmNvZGluZyk7CisJCQkJfQorCQkJfQorCQkJCisJCQlwcmludEVuZEVsZW1lbnQoeG1sV3JpdGVyLG5vZGUuZ2V0Tm9kZU5hbWUoKSk7CisJCQlicmVhazsKKwkJfQorCQkKKwkJY2FzZSBOb2RlLlRFWFRfTk9ERTogeworCQkJeG1sV3JpdGVyLndyaXRlKGVuY29kZShub2RlLmdldE5vZGVWYWx1ZSgpKS50b1N0cmluZygpKTsKKwkJCWJyZWFrOworCQl9CisJCWRlZmF1bHQ6IHsKKwkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5YTUxQcmludEhhbmRsZXJfdW5zdXBwb3J0ZWROb2RlVHlwZSk7CisJCQkKKwkJfQorCQl9CisKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZ0J1ZmZlciBlbmNvZGUoU3RyaW5nIHZhbHVlKSB7CisJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoKCk7IGkrKykgeworCQkJY2hhciBjID0gdmFsdWUuY2hhckF0KGkpOworCQkJc3dpdGNoIChjKSB7CisJCQkJY2FzZSAnJicgOgorCQkJCQlidWYuYXBwZW5kKCImYW1wOyIpOyAvLyROT04tTkxTLTEkCisJCQkJCWJyZWFrOworCQkJCWNhc2UgJzwnIDoKKwkJCQkJYnVmLmFwcGVuZCgiJmx0OyIpOyAvLyROT04tTkxTLTEkCisJCQkJCWJyZWFrOworCQkJCWNhc2UgJz4nIDoKKwkJCQkJYnVmLmFwcGVuZCgiJmd0OyIpOyAvLyROT04tTkxTLTEkCisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ1wnJyA6CisJCQkJCWJ1Zi5hcHBlbmQoIiZhcG9zOyIpOyAvLyROT04tTkxTLTEkCisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ1wiJyA6CisJCQkJCWJ1Zi5hcHBlbmQoIiZxdW90OyIpOyAvLyROT04tTkxTLTEkCisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQgOgorCQkJCQlidWYuYXBwZW5kKGMpOworCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlyZXR1cm4gYnVmOworCX0KK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL2JyYW5kaW5nL0Fib3V0SW5mby5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb25maWd1cmF0b3IvYnJhbmRpbmcvQWJvdXRJbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU1NTMwYgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL2JyYW5kaW5nL0Fib3V0SW5mby5qYXZhCkBAIC0wLDAgKzEsMjUzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvbmZpZ3VyYXRvci5icmFuZGluZzsKKworaW1wb3J0IGphdmEubmV0Lio7CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOworCisKKy8qKgorICogVGhlIGluZm9ybWF0aW9uIHdpdGhpbiB0aGlzIG9iamVjdCBpcyBvYnRhaW5lZCBmcm9tIHRoZSBhYm91dCBJTkkgZmlsZS4KKyAqIFRoaXMgZmlsZSByZXNpZGVzIHdpdGhpbiBhbiBpbnN0YWxsIGNvbmZpZ3VyYXRpb25zIGRpcmVjdG9yeSBhbmQgbXVzdCBiZSBhIAorICogc3RhbmRhcmQgamF2YSBwcm9wZXJ0eSBmaWxlLiAgCisgKiA8cD4KKyAqIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZCBvciBzdWJjbGFzc2VkIGJ5IGNsaWVudHMuCisgKiA8L3A+CisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBBYm91dEluZm8geworCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBJTklfRklMRU5BTUUgPSAiYWJvdXQuaW5pIjsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBQUk9QRVJUSUVTX0ZJTEVOQU1FID0gImFib3V0LnByb3BlcnRpZXMiOyAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIE1BUFBJTkdTX0ZJTEVOQU1FID0gImFib3V0Lm1hcHBpbmdzIjsgLy8kTk9OLU5MUy0xJAorCisJcHJpdmF0ZSBTdHJpbmcgZmVhdHVyZUlkOworCXByaXZhdGUgU3RyaW5nIHZlcnNpb25JZCA9ICIiOyAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBTdHJpbmcgZmVhdHVyZVBsdWdpbkxhYmVsOworCXByaXZhdGUgU3RyaW5nIHByb3ZpZGVyTmFtZTsKKwlwcml2YXRlIFN0cmluZyBhcHBOYW1lOworCXByaXZhdGUgVVJMIHdpbmRvd0ltYWdlVVJMOworCXByaXZhdGUgVVJMW10gd2luZG93SW1hZ2VzVVJMczsKKwlwcml2YXRlIFVSTCBhYm91dEltYWdlVVJMOworCXByaXZhdGUgVVJMIGZlYXR1cmVJbWFnZVVSTDsKKwlwcml2YXRlIFVSTCB3ZWxjb21lUGFnZVVSTDsKKwlwcml2YXRlIFN0cmluZyBhYm91dFRleHQ7CisJcHJpdmF0ZSBTdHJpbmcgd2VsY29tZVBlcnNwZWN0aXZlOworCXByaXZhdGUgU3RyaW5nIHRpcHNBbmRUcmlja3NIcmVmOworCisKKwkvKgorCSAqIENyZWF0ZSBhIG5ldyBhYm91dCBpbmZvIGZvciBhIGZlYXR1cmUgd2l0aCB0aGUgZ2l2ZW4gaWQuCisJICovCisJLyogcGFja2FnZSAqLyBBYm91dEluZm8oU3RyaW5nIGZlYXR1cmVJZCkgeworCQlzdXBlcigpOworCQl0aGlzLmZlYXR1cmVJZCA9IGZlYXR1cmVJZDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgZmVhdHVyZSB3aXRoIHRoZSAKKwkgKiBnaXZlbiBpZC4KKwkgKiAKKwkgKiBAcGFyYW0gZmVhdHVyZUlkIHRoZSBmZWF0dXJlIGlkCisJICogQHBhcmFtIHZlcnNpb25JZCB0aGUgdmVyc2lvbiBpZCAob2YgdGhlIGZlYXR1cmUpCisJICogQHBhcmFtIHBsdWdpbklkIHRoZSBwbHVnLWluIGlkCisJICogQHJldHVybiB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIGZlYXR1cmUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIEFib3V0SW5mbyByZWFkRmVhdHVyZUluZm8oU3RyaW5nIGZlYXR1cmVJZCwgU3RyaW5nIHZlcnNpb25JZCwgU3RyaW5nIHBsdWdpbklkKSB7CisvLwkJQXNzZXJ0LmlzTm90TnVsbChmZWF0dXJlSWQpOworLy8JCUFzc2VydC5pc05vdE51bGwodmVyc2lvbklkKTsKKy8vCQlBc3NlcnQuaXNOb3ROdWxsKHBsdWdpbklkKTsKKwkJSW5pRmlsZVJlYWRlciByZWFkZXIgPSBuZXcgSW5pRmlsZVJlYWRlcihmZWF0dXJlSWQsIHBsdWdpbklkLCBJTklfRklMRU5BTUUsIFBST1BFUlRJRVNfRklMRU5BTUUsIE1BUFBJTkdTX0ZJTEVOQU1FKTsKKwkJcmVhZGVyLmxvYWQoKTsKKy8vIGJ1ZyA3ODAzMQorLy8JCWlmICghc3RhdHVzLmlzT0soKSkgeworLy8JCQkvL3JldHVybiBudWxsOworLy8JCQlyZXR1cm4gbmV3IEFib3V0SW5mbyhmZWF0dXJlSWQpOyAvLyBkdW1teSBhYm91dCBpbmZvCisvLwkJfQorCQkKKwkJQWJvdXRJbmZvIGluZm8gPSBuZXcgQWJvdXRJbmZvKGZlYXR1cmVJZCk7CisJCUhhc2h0YWJsZSBydW50aW1lTWFwcGluZ3MgID0gbmV3IEhhc2h0YWJsZSgpOworCQlydW50aW1lTWFwcGluZ3MucHV0KCJ7ZmVhdHVyZVZlcnNpb259IiwgdmVyc2lvbklkKTsgLy8kTk9OLU5MUy0xJAorCQlpbmZvLnZlcnNpb25JZCA9IHZlcnNpb25JZDsKKwkJaW5mby5mZWF0dXJlUGx1Z2luTGFiZWwgPSByZWFkZXIuZ2V0RmVhdHVyZVBsdWdpbkxhYmVsKCk7CisJCWluZm8ucHJvdmlkZXJOYW1lID0gcmVhZGVyLmdldFByb3ZpZGVyTmFtZSgpOworCQlpbmZvLmFwcE5hbWUgPSByZWFkZXIuZ2V0U3RyaW5nKCJhcHBOYW1lIiwgdHJ1ZSwgcnVudGltZU1hcHBpbmdzKTsgLy8kTk9OLU5MUy0xJAorCQlpbmZvLmFib3V0VGV4dCA9IHJlYWRlci5nZXRTdHJpbmcoImFib3V0VGV4dCIsIHRydWUsIHJ1bnRpbWVNYXBwaW5ncyk7IC8vJE5PTi1OTFMtMSQKKwkJaW5mby53aW5kb3dJbWFnZVVSTCA9IHJlYWRlci5nZXRVUkwoIndpbmRvd0ltYWdlIik7IC8vJE5PTi1OTFMtMSQKKwkJLy8gbG9vayBmb3IgdGhlIG5ld2VyIGFycmF5LCBidXQgaWYgaXRzIG5vdCB0aGVyZSB0aGVuIHVzZSB0aGUgb2xkZXIsCisJCS8vIHNpbmdsZSBpbWFnZSBkZWZpbml0aW9uCisJCWluZm8ud2luZG93SW1hZ2VzVVJMcyA9IHJlYWRlci5nZXRVUkxzKCJ3aW5kb3dJbWFnZXMiKTsgLy8kTk9OLU5MUy0xJAorCQlpbmZvLmFib3V0SW1hZ2VVUkwgPSByZWFkZXIuZ2V0VVJMKCJhYm91dEltYWdlIik7IC8vJE5PTi1OTFMtMSQKKwkJaW5mby5mZWF0dXJlSW1hZ2VVUkwgPSByZWFkZXIuZ2V0VVJMKCJmZWF0dXJlSW1hZ2UiKTsgLy8kTk9OLU5MUy0xJAorCQlpbmZvLndlbGNvbWVQYWdlVVJMID0gcmVhZGVyLmdldFVSTCgid2VsY29tZVBhZ2UiKTsgLy8kTk9OLU5MUy0xJAorCQlpbmZvLndlbGNvbWVQZXJzcGVjdGl2ZSA9IHJlYWRlci5nZXRTdHJpbmcoIndlbGNvbWVQZXJzcGVjdGl2ZSIsIGZhbHNlLCBydW50aW1lTWFwcGluZ3MpOyAvLyROT04tTkxTLTEkCisJCWluZm8udGlwc0FuZFRyaWNrc0hyZWYgPSByZWFkZXIuZ2V0U3RyaW5nKCJ0aXBzQW5kVHJpY2tzSHJlZiIsIGZhbHNlLCBydW50aW1lTWFwcGluZ3MpOyAvLyROT04tTkxTLTEkCisJCXJldHVybiBpbmZvOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBVUkwgZm9yIGFuIGltYWdlIHdoaWNoIGNhbiBiZSBzaG93biBpbiBhbiAiYWJvdXQiIGRpYWxvZyAKKwkgKiBmb3IgdGhpcyBwcm9kdWN0LiBQcm9kdWN0cyBkZXNpZ25lZCB0byBydW4gImhlYWRsZXNzIiB0eXBpY2FsbHkgd291bGQgbm90IAorCSAqIGhhdmUgc3VjaCBhbiBpbWFnZS4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBVUkwgZm9yIGFuIGFib3V0IGltYWdlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCisJICovCisJcHVibGljIFVSTCBnZXRBYm91dEltYWdlVVJMKCkgeworCQlyZXR1cm4gYWJvdXRJbWFnZVVSTDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBVUkwgZm9yIGFuIGltYWdlIHdoaWNoIGNhbiBiZSBzaG93biBpbiBhbiAiYWJvdXQgZmVhdHVyZXMiIAorCSAqIGRpYWxvZy4gUHJvZHVjdHMgZGVzaWduZWQgdG8gcnVuICJoZWFkbGVzcyIgdHlwaWNhbGx5IHdvdWxkIG5vdCBoYXZlIHN1Y2ggYW4gaW1hZ2UuCisJICogCisJICogQHJldHVybiB0aGUgVVJMIGZvciBhIGZlYXR1cmUgaW1hZ2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKKwkgKi8KKwlwdWJsaWMgVVJMIGdldEZlYXR1cmVJbWFnZVVSTCgpIHsKKwkJcmV0dXJuIGZlYXR1cmVJbWFnZVVSTDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzaW1wbGUgbmFtZSBvZiB0aGUgZmVhdHVyZSBpbWFnZSBmaWxlLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIHNpbXBsZSBuYW1lIG9mIHRoZSBmZWF0dXJlIGltYWdlIGZpbGUsCisJICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0RmVhdHVyZUltYWdlTmFtZSgpIHsKKwkJaWYgKGZlYXR1cmVJbWFnZVVSTCAhPSBudWxsKSB7CisJCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgoZmVhdHVyZUltYWdlVVJMLmdldFBhdGgoKSk7CisJCQlyZXR1cm4gcGF0aC5sYXN0U2VnbWVudCgpOworCQl9IAorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkJCisJLyoqCisJICogUmV0dXJucyBhIGxhYmVsIGZvciB0aGUgZmVhdHVyZSBwbHVnbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4uCisJICovCisJcHVibGljIFN0cmluZyBnZXRGZWF0dXJlTGFiZWwoKSB7CisJCXJldHVybiBmZWF0dXJlUGx1Z2luTGFiZWw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgaWQgZm9yIHRoaXMgZmVhdHVyZS4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBmZWF0dXJlIGlkCisJICovCisJcHVibGljIFN0cmluZyBnZXRGZWF0dXJlSWQoKSB7CisJCXJldHVybiBmZWF0dXJlSWQ7CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgdGhlIHRleHQgdG8gc2hvdyBpbiBhbiAiYWJvdXQiIGRpYWxvZyBmb3IgdGhpcyBwcm9kdWN0LgorCSAqIFByb2R1Y3RzIGRlc2lnbmVkIHRvIHJ1biAiaGVhZGxlc3MiIHR5cGljYWxseSB3b3VsZCBub3QgaGF2ZSBzdWNoIHRleHQuCisJICogCisJICogQHJldHVybiB0aGUgYWJvdXQgdGV4dCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0QWJvdXRUZXh0KCkgeworCQlyZXR1cm4gYWJvdXRUZXh0OworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGFwcGxpY2F0aW9uIG5hbWUgb3IgPGNvZGU+bnVsbDwvY29kZT4uCisJICogTm90ZSB0aGlzIGlzIG5ldmVyIHNob3duIHRvIHRoZSB1c2VyLgorCSAqIEl0IGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgU1dUIERpc3BsYXkuCisJICogPHA+CisJICogT24gTW90aWYsIGZvciBleGFtcGxlLCB0aGlzIGNhbiBiZSB1c2VkCisJICogdG8gc2V0IHRoZSBuYW1lIHVzZWQgZm9yIHJlc291cmNlIGxvb2t1cC4KKwkgKiA8L3A+CisJICoKKwkgKiBAcmV0dXJuIHRoZSBhcHBsaWNhdGlvbiBuYW1lLCBvciA8Y29kZT5udWxsPC9jb2RlPgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0QXBwTmFtZSgpIHsKKwkJcmV0dXJuIGFwcE5hbWU7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcHJvZHVjdCBuYW1lIG9yIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIFRoaXMgaXMgc2hvd24gaW4gdGhlIHdpbmRvdyB0aXRsZSBhbmQgdGhlIEFib3V0IGFjdGlvbi4KKwkgKgorCSAqIEByZXR1cm4gdGhlIHByb2R1Y3QgbmFtZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFByb2R1Y3ROYW1lKCkgeworCQlyZXR1cm4gZmVhdHVyZVBsdWdpbkxhYmVsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHByb3ZpZGVyIG5hbWUgb3IgPGNvZGU+bnVsbDwvY29kZT4uCisJICoKKwkgKiBAcmV0dXJuIHRoZSBwcm92aWRlciBuYW1lLCBvciA8Y29kZT5udWxsPC9jb2RlPgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0UHJvdmlkZXJOYW1lKCkgeworCQlyZXR1cm4gcHJvdmlkZXJOYW1lOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZlYXR1cmUgdmVyc2lvbiBpZC4KKwkgKgorCSAqIEByZXR1cm4gdGhlIHZlcnNpb24gaWQgb2YgdGhlIGZlYXR1cmUKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFZlcnNpb25JZCgpIHsKKwkJcmV0dXJuIHZlcnNpb25JZDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgPGNvZGU+VVJMPC9jb2RlPiBmb3IgdGhlIHdlbGNvbWUgcGFnZS4KKwkgKiBQcm9kdWN0cyBkZXNpZ25lZCB0byBydW4gImhlYWRsZXNzIiB0eXBpY2FsbHkgd291bGQgbm90IGhhdmUgc3VjaCBhbiBwYWdlLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIHdlbGNvbWUgcGFnZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQorCSAqLworCXB1YmxpYyBVUkwgZ2V0V2VsY29tZVBhZ2VVUkwoKSB7CisJCXJldHVybiB3ZWxjb21lUGFnZVVSTDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBJRCBvZiBhIHBlcnNwZWN0aXZlIGluIHdoaWNoIHRvIHNob3cgdGhlIHdlbGNvbWUgcGFnZS4KKwkgKiBNYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisJICogCisJICogQHJldHVybiB0aGUgd2VsY29tZSBwYWdlIHBlcnNwZWN0aXZlIGlkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCisJICovCisJcHVibGljIFN0cmluZyBnZXRXZWxjb21lUGVyc3BlY3RpdmVJZCgpIHsKKwkJcmV0dXJuIHdlbGNvbWVQZXJzcGVjdGl2ZTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiBmb3IgdGhlIHRpcHMgYW5kIHRyaWNrIGhyZWYuCisJICogCisJICogQHJldHVybiB0aGUgdGlwcyBhbmQgdHJpY2tzIGhyZWYsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFRpcHNBbmRUcmlja3NIcmVmKCkgeworCQlyZXR1cm4gdGlwc0FuZFRyaWNrc0hyZWY7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgaW1hZ2UgdXJsIGZvciB0aGUgd2luZG93IGltYWdlIHRvIHVzZSBmb3IgdGhpcyBwcm9kdWN0LgorCSAqIFByb2R1Y3RzIGRlc2lnbmVkIHRvIHJ1biAiaGVhZGxlc3MiIHR5cGljYWxseSB3b3VsZCBub3QgaGF2ZSBzdWNoIGFuIGltYWdlLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGltYWdlIHVybCBmb3IgdGhlIHdpbmRvdyBpbWFnZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQorCSAqLworCXB1YmxpYyBVUkwgZ2V0V2luZG93SW1hZ2VVUkwoKSB7CisJCXJldHVybiB3aW5kb3dJbWFnZVVSTDsKKwl9CisJCisJLyoqCisJICogUmV0dXJuIGFuIGFycmF5IG9mIGltYWdlIFVSTHMgZm9yIHRoZSB3aW5kb3cgaW1hZ2VzIHRvIHVzZSBmb3IKKwkgKiB0aGlzIHByb2R1Y3QuIFRoZSBleHBlY3RhdGlvbnMgaXMgdGhhdCB0aGUgZWxlbWVudHMgd2lsbCBiZSB0aGUgc2FtZQorCSAqIGltYWdlIHJlbmRlcmVkIGF0IGRpZmZlcmVudCBzaXplcy4gUHJvZHVjdHMgZGVzaWduZWQgdG8gcnVuICJoZWFkbGVzcyIKKwkgKiB0eXBpY2FsbHkgd291bGQgbm90IGhhdmUgc3VjaCBpbWFnZXMuCisJICogCisJICogQHJldHVybiBhbiBhcnJheSBvZiB0aGUgaW1hZ2UgZGVzY3JpcHRvcnMgZm9yIHRoZSB3aW5kb3cgaW1hZ2VzLCBvcgorCSAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQorCSAqIEBzaW5jZSAzLjAKKwkgKi8KKwlwdWJsaWMgVVJMW10gZ2V0V2luZG93SW1hZ2VzVVJMcygpIHsKKwkJcmV0dXJuIHdpbmRvd0ltYWdlc1VSTHM7CisJfQorfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb25maWd1cmF0b3IvYnJhbmRpbmcvSUJ1bmRsZUdyb3VwQ29uc3RhbnRzLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvbmZpZ3VyYXRvci9icmFuZGluZy9JQnVuZGxlR3JvdXBDb25zdGFudHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGY2NmNkCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb25maWd1cmF0b3IvYnJhbmRpbmcvSUJ1bmRsZUdyb3VwQ29uc3RhbnRzLmphdmEKQEAgLTAsMCArMSw2NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb25maWd1cmF0b3IuYnJhbmRpbmc7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLklQbGF0Zm9ybUNvbmZpZ3VyYXRpb24uSUZlYXR1cmVFbnRyeTsKKworLyoqCisgKiBUaGVzZSBjb25zdGFudHMgZGVmaW5lIHRoZSBzZXQgb2YgcHJvcGVydGllcyB0aGF0IHRoZSBVSSBleHBlY3RzIHRvCisgKiBiZSBhdmFpbGFibGUgdmlhIDxjb2RlPklCdW5kbGVHcm91cC5nZXRQcm9wZXJ0eShTdHJpbmcpPC9jb2RlPi4KKyAqIAorICogQHNpbmNlIDMuMAorICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUJ1bmRsZUdyb3VwI2dldFByb3BlcnR5KFN0cmluZykKKyAqLworcHVibGljIGludGVyZmFjZSBJQnVuZGxlR3JvdXBDb25zdGFudHMgeworCS8qKgorCSAqIEFuIGltYWdlIHdoaWNoIGNhbiBiZSBzaG93biBpbiBhbiAiYWJvdXQgZmVhdHVyZXMiIGRpYWxvZyAoMzJ4MzIpLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZFQVRVUkVfSU1BR0UgPSAiZmVhdHVyZUltYWdlIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogQSBoZWxwIHJlZmVyZW5jZSBmb3IgdGhlIGZlYXR1cmUncyB0aXBzIGFuZCB0cmlja3MgcGFnZSAob3B0aW9uYWwpLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRJUFNfQU5EX1RSSUNLU19IUkVGID0gInRpcHNBbmRUcmlja3NIcmVmIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogQSBVUkwgZm9yIHRoZSBmZWF0dXJlJ3Mgd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCisgICAgICogKCRubCQvIHByZWZpeCB0byBwZXJtaXQgbG9jYWxlLXNwZWNpZmljIHRyYW5zbGF0aW9ucyBvZiBlbnRpcmUgZmlsZSkuCisJICogUHJvZHVjdHMgZGVzaWduZWQgdG8gcnVuICJoZWFkbGVzcyIgdHlwaWNhbGx5IHdvdWxkIG5vdCBoYXZlIHN1Y2ggYSBwYWdlLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFTENPTUVfUEFHRSA9ICJ3ZWxjb21lUGFnZSI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFRoZSBpZCBvZiBhIHBlcnNwZWN0aXZlIGluIHdoaWNoIHRvIHNob3cgdGhlIHdlbGNvbWUgcGFnZQorCSAqIChvcHRpb25hbCkuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VMQ09NRV9QRVJTUEVDVElWRSA9ICJ3ZWxjb21lUGVyc3BlY3RpdmUiOyAvLyROT04tTkxTLTEkCisJCisJLyoqCisJICogVGhlIFVSTCBvZiB0aGUgbGljZW5zZSBwYWdlIGZvciB0aGUgZmVhdHVyZQorCSAqIChvcHRpb25hbCkuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElDRU5TRV9IUkVGID0gImxpY2Vuc2VIcmVmIjsgLy8kTk9OLU5MUy0xJAorCQorCS8qKgorCSAqIFRoZSBpZCBvZiB0aGUgYnVuZGxlIGdyb3VwJ3MgYnJhbmRpbmcgYnVuZGxlLgorCSAqIEBzZWUgSUZlYXR1cmVFbnRyeSNnZXRGZWF0dXJlUGx1Z2luSWRlbnRpZmllcigpCisJICogQHNpbmNlIDMuMworCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJSQU5ESU5HX0JVTkRMRV9JRD0gImJyYW5kaW5nQnVuZGxlSWQiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBUaGUgdmVyc2lvbiBvZiB0aGUgZmVhdHVyZSBicmFuZGluZyBidW5kbGUuCisJICogQHNlZSBJRmVhdHVyZUVudHJ5I2dldEZlYXR1cmVQbHVnaW5WZXJzaW9uKCkKKwkgKiBAc2luY2UgMy4zCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlJBTkRJTkdfQlVORExFX1ZFUlNJT049ICJicmFuZGluZ0J1bmRsZVZlcnNpb24iOyAvLyROT04tTkxTLTEkCit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvbmZpZ3VyYXRvci9icmFuZGluZy9JUHJvZHVjdENvbnN0YW50cy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb25maWd1cmF0b3IvYnJhbmRpbmcvSVByb2R1Y3RDb25zdGFudHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTYyMGRiCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb25maWd1cmF0b3IvYnJhbmRpbmcvSVByb2R1Y3RDb25zdGFudHMuamF2YQpAQCAtMCwwICsxLDc3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvbmZpZ3VyYXRvci5icmFuZGluZzsKKworLyoqCisgKiBUaGVzZSBjb25zdGFudHMgZGVmaW5lIHRoZSBzZXQgb2YgcHJvcGVydGllcyB0aGF0IHRoZSBVSSBleHBlY3RzIHRvCisgKiBiZSBhdmFpbGFibGUgdmlhIDxjb2RlPklQcm9kdWN0LmdldFByb3BlcnR5KFN0cmluZyk8L2NvZGU+LgorICogCisgKiBAc2luY2UgMy4wCisgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZHVjdCNnZXRQcm9wZXJ0eShTdHJpbmcpCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSVByb2R1Y3RDb25zdGFudHMgeworCS8qKgorCSAqIFRoZSBhcHBsaWNhdGlvbiBuYW1lLCB1c2VkIHRvIGluaXRpYWxpemUgdGhlIFNXVCBEaXNwbGF5LiAgVGhpcworCSAqIHZhbHVlIGlzIGRpc3RpbmN0IGZyb20gdGhlIHN0cmluZyBkaXNwbGF5ZWQgaW4gdGhlIGFwcGxpY2F0aW9uCisJICogdGl0bGUgYmFyLgorCSAqIDxwPgorCSAqIEUuZy4sIE9uIG1vdGlmLCB0aGlzIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgbmFtZSB1c2VkIGZvcgorCSAqIHJlc291cmNlIGxvb2t1cC4KKwkgKiA8L3A+CisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQX05BTUUgPSAiYXBwTmFtZSI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFRoZSB0ZXh0IHRvIHNob3cgaW4gYW4gImFib3V0IiBkaWFsb2cgZm9yIHRoaXMgcHJvZHVjdC4KKwkgKiBQcm9kdWN0cyBkZXNpZ25lZCB0byBydW4gImhlYWRsZXNzIiB0eXBpY2FsbHkgd291bGQgbm90CisJICogaGF2ZSBzdWNoIHRleHQuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUJPVVRfVEVYVCA9ICJhYm91dFRleHQiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBBbiBpbWFnZSB3aGljaCBjYW4gYmUgc2hvd24gaW4gYW4gImFib3V0IiBkaWFsb2cgZm9yIHRoaXMKKwkgKiBwcm9kdWN0LiBQcm9kdWN0cyBkZXNpZ25lZCB0byBydW4gImhlYWRsZXNzIiB0eXBpY2FsbHkgd291bGQgbm90IAorCSAqIGhhdmUgc3VjaCBhbiBpbWFnZS4KKwkgKiA8cD4KKyAgICAgKiBBIGZ1bGwtc2l6ZWQgcHJvZHVjdCBpbWFnZSAobm8gbGFyZ2VyIHRoYW4gNTAweDMzMCBwaXhlbHMpIGlzCisgICAgICogc2hvd24gd2l0aG91dCB0aGUgImFib3V0VGV4dCIgYmx1cmIuICBBIGhhbGYtc2l6ZWQgcHJvZHVjdCBpbWFnZQorICAgICAqIChubyBsYXJnZXIgdGhhbiAyNTB4MzMwIHBpeGVscykgaXMgc2hvd24gd2l0aCB0aGUgImFib3V0VGV4dCIKKyAgICAgKiBibHVyYiBiZXNpZGUgaXQuCisgICAgICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUJPVVRfSU1BR0UgPSAiYWJvdXRJbWFnZSI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIEFuIGltYWdlIHRvIGJlIHVzZWQgYXMgdGhlIHdpbmRvdyBpY29uIGZvciB0aGlzIHByb2R1Y3QgKDE2eDE2KS4gIAorCSAqIFByb2R1Y3RzIGRlc2lnbmVkIHRvIHJ1biAiaGVhZGxlc3MiIHR5cGljYWxseSB3b3VsZCBub3QgaGF2ZSBzdWNoIGFuIGltYWdlLgorCSAqIDxwPgorCSAqIElmIHRoZSA8Y29kZT5XSU5ET1dfSU1BR0VTPC9jb2RlPiBwcm9wZXJ0eSBpcyBnaXZlbiwgdGhlbiBpdCBzdXBlcmNlZGVzCisJICogdGhpcyBvbmUuCisJICogPC9wPgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdJTkRPV19JTUFHRSA9ICJ3aW5kb3dJbWFnZSI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIEFuIGFycmF5IG9mIG9uZSBvciBtb3JlIGltYWdlcyB0byBiZSB1c2VkIGZvciB0aGlzIHByb2R1Y3QuICBUaGUKKwkgKiBleHBlY3RhdGlvbiBpcyB0aGF0IHRoZSBhcnJheSB3aWxsIGNvbnRhaW4gdGhlIHNhbWUgaW1hZ2UgcmVuZGVyZWQKKwkgKiBhdCBkaWZmZXJlbnQgc2l6ZXMgKDE2eDE2IGFuZCAzMngzMikuICAKKwkgKiBQcm9kdWN0cyBkZXNpZ25lZCB0byBydW4gImhlYWRsZXNzIiB0eXBpY2FsbHkgd291bGQgbm90IGhhdmUgc3VjaCBpbWFnZXMuCisJICogPHA+CisJICogSWYgdGhpcyBwcm9wZXJ0eSBpcyBnaXZlbiwgdGhlbiBpdCBzdXBlcmNlZGVzIDxjb2RlPldJTkRPV19JTUFHRTwvY29kZT4uCisJICogPC9wPgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdJTkRPV19JTUFHRVMgPSAid2luZG93SW1hZ2VzIjsgLy8kTk9OLU5MUy0xJAorCS8qKgorCSAqIEEgVVJMIGZvciB0aGUgcHJvZHVjdHMncyB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKKwkgKiAoJG5sJC8gcHJlZml4IHRvIHBlcm1pdCBsb2NhbGUtc3BlY2lmaWMgdHJhbnNsYXRpb25zIG9mIGVudGlyZSBmaWxlKS4KKwkgKiBQcm9kdWN0cyBkZXNpZ25lZCB0byBydW4gImhlYWRsZXNzIiB0eXBpY2FsbHkgd291bGQgbm90IGhhdmUgc3VjaCBhIHBhZ2UuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VMQ09NRV9QQUdFID0gIndlbGNvbWVQYWdlIjsgIC8vJE5PTi1OTFMtMSQKK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL2JyYW5kaW5nL0luaUZpbGVSZWFkZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL2JyYW5kaW5nL0luaUZpbGVSZWFkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTJkNGJkCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb25maWd1cmF0b3IvYnJhbmRpbmcvSW5pRmlsZVJlYWRlci5qYXZhCkBAIC0wLDAgKzEsMzY2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvbmZpZ3VyYXRvci5icmFuZGluZzsKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLm5ldC4qOworaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OyAvLyBDYW4ndCB1c2UgSUNVLCBwb3NzaWJsZSBsYXVuY2ggcHJvYmxlbT8KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnR5UmVzb3VyY2VCdW5kbGU7CitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvbmZpZ3VyYXRvci5NZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29uZmlndXJhdG9yLlV0aWxzOworaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay4qOworCisvKioKKyAqIFJlYWRzIHRoZSBpbmZvcm1hdGlvbiBmb3VuZCBpbiBhbiAiSU5JIiBmaWxlLiBUaGlzIGZpbGUgbXVzdCBiZSBpbiBhCisgKiBzdGFuZGFyZCBKYXZhIHByb3BlcnRpZXMgZm9ybWF0LiBBIHByb3BlcnRpZXMgZmlsZSBtYXkgYWxzbyBiZSBwcm92aWRlZAorICogdG8gTkwgdmFsdWVzIGluIHRoZSBJTkkgZmlsZSAtIHZhbHVlcyBtdXN0IHN0YXJ0IHdpdGggdGhlICUgcHJlZml4LiBBCisgKiBtYXBwaW5nIGZpbGUgbWF5IGFsc28gYmUgcHJvdmlkZWQgdGhhdCBjb250YWlucyAiZmlsbC1pbnMiIGZvciB0aGUKKyAqIHByb3BlcnRpZXMgZmlsZSAtIGZvcm1hdCBiZWluZyAibiA9IHNvbWUgdGV4dCIsIHdoZXJlIG4gaXMgYSBudW1iZXIuCisgKi8KK3B1YmxpYyBjbGFzcyBJbmlGaWxlUmVhZGVyIHsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUElEID0gIm9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IiOyAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RhdHVzIE9LX1NUQVRVUyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgUElELCAwLCAiIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1BSRUZJWCA9ICIlIjsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRE9VQkxFX1BSRUZJWCA9ICIlJSI7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkxTX1RBRyA9ICIkbmwkIjsgLy8kTk9OLU5MUy0xJAorCisJcHJpdmF0ZSBTdHJpbmcgZmVhdHVyZUlkOworCXByaXZhdGUgU3RyaW5nIHBsdWdpbklkOworCXByaXZhdGUgU3RyaW5nIGluaUZpbGVuYW1lOworCXByaXZhdGUgU3RyaW5nIHByb3BlcnRpZXNGaWxlbmFtZTsKKwlwcml2YXRlIFN0cmluZyBtYXBwaW5nc0ZpbGVuYW1lOworCXByaXZhdGUgUHJvcGVydGllcyBpbmkgPSBudWxsOworCXByaXZhdGUgUHJvcGVydHlSZXNvdXJjZUJ1bmRsZSBwcm9wZXJ0aWVzID0gbnVsbDsKKwlwcml2YXRlIFN0cmluZ1tdIG1hcHBpbmdzID0gbnVsbDsKKwlwcml2YXRlIEJ1bmRsZSBidW5kbGU7CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIElOSSBmaWxlIHJlYWRlciB0aGF0IGNhbiBwYXJzZSB0aGUgY29udGVudHMgaW50byBrZXksdmFsdWUgcGFpcnMuCisJICogCisJICogQHBhcmFtIGZlYXR1cmVJZCB0aGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGZlYXR1cmUsIG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+CisJICogQHBhcmFtIHBsdWdpbklkIHRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgZmVhdHVyZSBwbHVnLWluLCBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPgorCSAqIEBwYXJhbSBpbmlGaWxlbmFtZSB0aGUgSU5JIGZpbGUgbmFtZSwgbXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4KKwkgKiBAcGFyYW0gcHJvcGVydGllc0ZpbGVuYW1lIHRoZSBwcm9wZXJ0aWVzIGZpbGVuYW1lLCBjYW4gYmUgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IHJlcXVpcmVkCisJICogQHBhcmFtIG1hcHBpbmdzRmlsZW5hbWUgdGhlIG1hcHBpbmdzIGZpbGVuYW1lLCBjYW4gYmUgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IHJlcXVpcmVkCisJICovCisJcHVibGljIEluaUZpbGVSZWFkZXIoU3RyaW5nIGZlYXR1cmVJZCwgU3RyaW5nIHBsdWdpbklkLCBTdHJpbmcgaW5pRmlsZW5hbWUsIFN0cmluZyBwcm9wZXJ0aWVzRmlsZW5hbWUsIFN0cmluZyBtYXBwaW5nc0ZpbGVuYW1lKSB7CisJCXN1cGVyKCk7CisJCQorCQlpZiAoZmVhdHVyZUlkID09IG51bGwgfHwgcGx1Z2luSWQgPT0gbnVsbCB8fCBpbmlGaWxlbmFtZSA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCX0KKwkJCQorCQl0aGlzLmZlYXR1cmVJZCA9IGZlYXR1cmVJZDsKKwkJdGhpcy5wbHVnaW5JZCA9IHBsdWdpbklkOworCQl0aGlzLmluaUZpbGVuYW1lID0gaW5pRmlsZW5hbWU7CisJCXRoaXMucHJvcGVydGllc0ZpbGVuYW1lID0gcHJvcGVydGllc0ZpbGVuYW1lOworCQl0aGlzLm1hcHBpbmdzRmlsZW5hbWUgPSBtYXBwaW5nc0ZpbGVuYW1lOworCX0KKworCS8qKgorCSAqIFJlYWQgdGhlIGNvbnRlbnRzIG9mIHRoZSBJTkksIHByb3BlcnRpZXMsIGFuZCBtYXBwaW5ncyBmaWxlcy4KKwkgKiBEb2VzIG5vdGhpbmcgaWYgdGhlIGNvbnRlbnQgaGFzIGFscmVhZHkgYmVlbiByZWFkIGFuZCBwYXJzZWQuCisJICogCisJICogQHJldHVybiBhbiA8Y29kZT5JU3RhdHVzPC9jb2RlPiBpbmRpY2F0aW5nIHRoZSBzdWNjZXNzIG9yIGZhaWx1cmUKKwkgKiAJb2YgcmVhZGluZyBhbmQgcGFyc2luZyB0aGUgSU5JIGZpbGUgY29udGVudAorCSAqLworCXB1YmxpYyBJU3RhdHVzIGxvYWQoKSB7CisJCWlmIChpbmkgIT0gbnVsbCkKKwkJCXJldHVybiBPS19TVEFUVVM7CisJCQkKKwkJLy8gYXR0ZW1wdCB0byBsb2NhdGUgdGhlIGNvcnJlc3BvbmRpbmcgcGx1Z2luCisJCWJ1bmRsZSA9IFV0aWxzLmdldEJ1bmRsZShwbHVnaW5JZCk7CisJCWlmIChidW5kbGUgPT0gbnVsbCB8fCBidW5kbGUuZ2V0U3RhdGUoKSA9PSBCdW5kbGUuVU5JTlNUQUxMRUQgfHwgYnVuZGxlLmdldFN0YXRlKCkgPT0gQnVuZGxlLklOU1RBTExFRCkgeworCQkJYnVuZGxlID0gbnVsbDsgLy8gbWFrZSBpdCBudWxsIGZvciBvdGhlciB0ZXN0IGRvd24gdGhlIHJvYWQKKwkJCVN0cmluZyBtZXNzYWdlID0gTkxTLmJpbmQoTWVzc2FnZXMuSW5pRmlsZVJlYWRlcl9NaXNzaW5nRGVzYywgKG5ldyBTdHJpbmdbXSB7IGZlYXR1cmVJZCB9KSk7CisJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQSUQsIDAsIG1lc3NhZ2UsIG51bGwpOworCQl9CisKKwkJLy8gRGV0ZXJtaW5lIHRoZSBpbmkgZmlsZSBsb2NhdGlvbgorCQlVUkwgaW5pVVJMID0gbnVsbDsKKwkJSU9FeGNlcHRpb24gaW9lID0gbnVsbDsKKwkJaW5pVVJMID0gRmlsZUxvY2F0b3IuZmluZChidW5kbGUsIG5ldyBQYXRoKE5MU19UQUcpLmFwcGVuZChpbmlGaWxlbmFtZSksIG51bGwpOworCQlpZiAoaW5pVVJMID09IG51bGwpIHsKKwkJCVN0cmluZyBtZXNzYWdlID0gTkxTLmJpbmQoTWVzc2FnZXMuSW5pRmlsZVJlYWRlcl9PcGVuSU5JRXJyb3IsIChuZXcgU3RyaW5nW10geyBpbmlGaWxlbmFtZSB9KSk7CisJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQSUQsIDAsIG1lc3NhZ2UsIGlvZSk7CisJCX0KKwkJCisJCS8vIERldGVybWluZSB0aGUgcHJvcGVydGllcyBmaWxlIGxvY2F0aW9uCisJCVVSTCBwcm9wZXJ0aWVzVVJMID0gbnVsbDsKKwkJaWYgKHByb3BlcnRpZXNGaWxlbmFtZSAhPSBudWxsICYgcHJvcGVydGllc0ZpbGVuYW1lLmxlbmd0aCgpID4gMCkgeworCQkJcHJvcGVydGllc1VSTCA9IEZpbGVMb2NhdG9yLmZpbmQoYnVuZGxlLCBuZXcgUGF0aChOTFNfVEFHKS5hcHBlbmQocHJvcGVydGllc0ZpbGVuYW1lKSwgbnVsbCk7CisJCX0KKworCQkvLyBEZXRlcm1pbmUgdGhlIG1hcHBpbmdzIGZpbGUgbG9jYXRpb24KKwkJVVJMIG1hcHBpbmdzVVJMID0gbnVsbDsKKwkJaWYgKG1hcHBpbmdzRmlsZW5hbWUgIT0gbnVsbCAmJiBtYXBwaW5nc0ZpbGVuYW1lLmxlbmd0aCgpID4gMCkgeworCQkJbWFwcGluZ3NVUkwgPSBGaWxlTG9jYXRvci5maW5kKGJ1bmRsZSwgbmV3IFBhdGgoTkxTX1RBRykuYXBwZW5kKG1hcHBpbmdzRmlsZW5hbWUpLCBudWxsKTsKKwkJfQorCisJCS8vIE9LIHRvIHBhc3MgbnVsbCBwcm9wZXJ0aWVzIGFuZC9vciBtYXBwaW5nIGZpbGUKKwkJcmV0dXJuIGxvYWQoaW5pVVJMLCBwcm9wZXJ0aWVzVVJMLCBtYXBwaW5nc1VSTCk7CisJfQorCQkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzdHJpbmcgdmFsdWUgZm9yIHRoZSBnaXZlbiBrZXksIG9yIDxjb2RlPm51bGw8L2NvZGU+LgorCSAqIFRoZSBzdHJpbmcgdmFsdWUgaXMgTkxTIGlmIHJlcXVlc3RlZC4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBzdHJpbmcgdmFsdWUgZm9yIHRoZSBnaXZlbiBrZXksIG9yIDxjb2RlPm51bGw8L2NvZGU+CisJICovCisJcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgYm9vbGVhbiBkb05scywgSGFzaHRhYmxlIHJ1bnRpbWVNYXBwaW5ncykgeworCQlpZiAoaW5pID09IG51bGwpCisJCQlyZXR1cm4gbnVsbDsKKwkJU3RyaW5nIHZhbHVlID0gaW5pLmdldFByb3BlcnR5KGtleSk7CisJCWlmICh2YWx1ZSAhPSBudWxsICYmIGRvTmxzKQorCQkJcmV0dXJuIGdldFJlc291cmNlU3RyaW5nKHZhbHVlLCBydW50aW1lTWFwcGluZ3MpOworCQlyZXR1cm4gdmFsdWU7CisJfQorCisKKwkvKioKKwkgKiBSZXR1cm5zIGEgVVJMIGZvciB0aGUgZ2l2ZW4ga2V5LCBvciA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiAKKwkgKiBAcmV0dXJuIGEgVVJMIGZvciB0aGUgZ2l2ZW4ga2V5LCBvciA8Y29kZT5udWxsPC9jb2RlPgorCSAqLworCXB1YmxpYyBVUkwgZ2V0VVJMKFN0cmluZyBrZXkpIHsKKwkJaWYgKGluaSA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisKKwkJVVJMIHVybCA9IG51bGw7CisJCVN0cmluZyBmaWxlTmFtZSA9IGluaS5nZXRQcm9wZXJ0eShrZXkpOworCQlpZiAoZmlsZU5hbWUgIT0gbnVsbCkgeworCQkJaWYgKGJ1bmRsZSA9PSBudWxsKQorCQkJCXJldHVybiBudWxsOworCQkJdXJsID0gRmlsZUxvY2F0b3IuZmluZChidW5kbGUsIG5ldyBQYXRoKGZpbGVOYW1lKSwgbnVsbCk7CisJCX0KKwkJcmV0dXJuIHVybDsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyBhIGFycmF5IG9mIFVSTCBmb3IgdGhlIGdpdmVuIGtleSwgb3IgPGNvZGU+bnVsbDwvY29kZT4uIFRoZQorCSAqIHByb3BlcnR5IHZhbHVlIHNob3VsZCBiZSBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIHVybHMsIHRva2VucyBmb3IKKwkgKiB3aGljaCBidW5kbGUgY2Fubm90IGJ1aWxkIGFuIHVybCB3aWxsIGhhdmUgYSBudWxsIGVudHJ5LgorCSAqIAorCSAqIEBwYXJhbSBrZXkgbmFtZSBvZiB0aGUgcHJvcGVydHkgY29udGFpbmluZyB0aGUgcmVxdWVzdGVkIHVybHMKKwkgKiBAcmV0dXJuIGEgVVJMIGZvciB0aGUgZ2l2ZW4ga2V5LCBvciA8Y29kZT5udWxsPC9jb2RlPgorCSAqIEBzaW5jZSAzLjAKKwkgKi8KKwlwdWJsaWMgVVJMW10gZ2V0VVJMcyhTdHJpbmcga2V5KSB7CisJCWlmIChpbmkgPT0gbnVsbCB8fCBidW5kbGUgPT0gbnVsbCkKKwkJCXJldHVybiBudWxsOworCisJCVN0cmluZyB2YWx1ZSA9IGluaS5nZXRQcm9wZXJ0eShrZXkpOworCQlpZiAodmFsdWUgPT0gbnVsbCkKKwkJCXJldHVybiBudWxsOworCisJCVN0cmluZ1Rva2VuaXplciB0b2tlbnMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHZhbHVlLCAiLCIpOyAvLyROT04tTkxTLTEkCisJCUFycmF5TGlzdCBhcnJheSA9IG5ldyBBcnJheUxpc3QoMTApOworCQl3aGlsZSAodG9rZW5zLmhhc01vcmVUb2tlbnMoKSkgeworCQkJU3RyaW5nIHN0ciA9IHRva2Vucy5uZXh0VG9rZW4oKS50cmltKCk7CisJCQlhcnJheS5hZGQoRmlsZUxvY2F0b3IuZmluZChidW5kbGUsIG5ldyBQYXRoKHN0ciksIG51bGwpKTsKKwkJfQorCisJCVVSTFtdIHVybHMgPSBuZXcgVVJMW2FycmF5LnNpemUoKV07CisJCWFycmF5LnRvQXJyYXkodXJscyk7CisJCXJldHVybiB1cmxzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZlYXR1cmUgcGx1Z2luIGxhYmVsLCBvciA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBmZWF0dXJlIHBsdWdpbiBsYWJsZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldEZlYXR1cmVQbHVnaW5MYWJlbCgpIHsKKwkJaWYgKGJ1bmRsZSA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisJCXJldHVybiAoU3RyaW5nKWJ1bmRsZS5nZXRIZWFkZXJzKCkuZ2V0KENvbnN0YW50cy5CVU5ETEVfTkFNRSk7CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgdGhlIHByb3ZpZGVyIG5hbWUgZm9yIHRoaXMgZmVhdHVyZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4uCisJICogCisJICogQHJldHVybiB0aGUgcHJvdmlkZXIgbmFtZSBmb3IgdGhpcyBmZWF0dXJlLCBvciA8Y29kZT5udWxsPC9jb2RlPgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0UHJvdmlkZXJOYW1lKCkgeworCQlpZiAoYnVuZGxlID09IG51bGwpCisJCQlyZXR1cm4gbnVsbDsKKwkJcmV0dXJuIChTdHJpbmcpYnVuZGxlLmdldEhlYWRlcnMoKS5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRU5ET1IpOworCX0KKwkKKwkvKgorCSAqIFJldHVybnMgYSByZXNvdXJjZSBzdHJpbmcgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYXJndW1lbnQgCisJICogdmFsdWUgYW5kIGJ1bmRsZS4KKwkgKiBJZiB0aGUgYXJndW1lbnQgdmFsdWUgc3BlY2lmaWVzIGEgcmVzb3VyY2Uga2V5LCB0aGUgc3RyaW5nCisJICogaXMgbG9va2VkIHVwIGluIHRoZSBnaXZlbiByZXNvdXJjZSBidW5kbGUuIElmIHRoZSBhcmd1bWVudCBkb2VzIG5vdAorCSAqIHNwZWNpZnkgYSB2YWxpZCBrZXksIHRoZSBhcmd1bWVudCBpdHNlbGYgaXMgcmV0dXJuZWQgYXMgdGhlCisJICogcmVzb3VyY2Ugc3RyaW5nLiBUaGUga2V5IGxvb2t1cCBpcyBwZXJmb3JtZWQgYWdhaW5zdCB0aGUKKwkgKiBzcGVjaWZpZWQgcmVzb3VyY2UgYnVuZGxlLiBJZiBhIHJlc291cmNlIHN0cmluZyAKKwkgKiBjb3JyZXNwb25kaW5nIHRvIHRoZSBrZXkgaXMgbm90IGZvdW5kIGluIHRoZSByZXNvdXJjZSBidW5kbGUKKwkgKiB0aGUga2V5IHZhbHVlLCBvciBhbnkgZGVmYXVsdCB0ZXh0IGZvbGxvd2luZyB0aGUga2V5IGluIHRoZQorCSAqIGFyZ3VtZW50IHZhbHVlIGlzIHJldHVybmVkIGFzIHRoZSByZXNvdXJjZSBzdHJpbmcuCisJICogQSBrZXkgaXMgaWRlbnRpZmllZCBhcyBhIHN0cmluZyBiZWdpbmluZyB3aXRoIHRoZSAiJSIgY2hhcmFjdGVyLgorCSAqIE5vdGUgdGhhdCB0aGUgIiUiIGNoYXJhY3RlciBpcyBzdHJpcHBlZCBvZmYgcHJpb3IgdG8gbG9va3VwCisJICogaW4gdGhlIHJlc291cmNlIGJ1bmRsZS4KKwkgKiA8cD4KKwkgKiBGb3IgZXhhbXBsZSwgYXNzdW1lIHJlc291cmNlIGJ1bmRsZSBwbHVnaW4ucHJvcGVydGllcyBjb250YWlucworCSAqIG5hbWUgPSBQcm9qZWN0IE5hbWUKKwkgKiA8cHJlPgorCSAqICAgICA8bGk+Z2V0UmVzb3VyY2VTdHJpbmcoIkhlbGxvIFdvcmxkIikgcmV0dXJucyAiSGVsbG8gV29ybGQiPC9saT4KKwkgKiAgICAgPGxpPmdldFJlc291cmNlU3RyaW5nKCIlbmFtZSIpIHJldHVybnMgIlByb2plY3QgTmFtZSI8L2xpPgorCSAqICAgICA8bGk+Z2V0UmVzb3VyY2VTdHJpbmcoIiVuYW1lIEhlbGxvIFdvcmxkIikgcmV0dXJucyAiUHJvamVjdCBOYW1lIjwvbGk+CisJICogICAgIDxsaT5nZXRSZXNvdXJjZVN0cmluZygiJWFiY2QgSGVsbG8gV29ybGQiKSByZXR1cm5zICJIZWxsbyBXb3JsZCI8L2xpPgorCSAqICAgICA8bGk+Z2V0UmVzb3VyY2VTdHJpbmcoIiVhYmNkIikgcmV0dXJucyAiJWFiY2QiPC9saT4KKwkgKiAgICAgPGxpPmdldFJlc291cmNlU3RyaW5nKCIlJW5hbWUiKSByZXR1cm5zICIlbmFtZSI8L2xpPgorCSAqICAgICA8bGk+Z2V0UmVzb3VyY2VTdHJpbmcoPGNvZGU+bnVsbDwvY29kZT4pIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT48L2xpPgorCSAqIDwvcHJlPgorCSAqIDwvcD4KKwkgKgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgb3IgPGNvZGU+bnVsbDwvY29kZT4KKwkgKiBAcGFyYW0gcnVudGltZU1hcHBpbmdzIHJ1bnRpbWUgbWFwcGluZ3Mgb3IgPGNvZGU+bnVsbDwvY29kZT4KKwkgKiBAcmV0dXJuIHRoZSByZXNvdXJjZSBzdHJpbmcKKwkgKi8KKwkgcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcgdmFsdWUsIEhhc2h0YWJsZSBydW50aW1lTWFwcGluZ3MpIHsKKwkJCisJCWlmICh2YWx1ZSA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisJCVN0cmluZyBzID0gdmFsdWUudHJpbSgpOworCisJCWlmICghcy5zdGFydHNXaXRoKEtFWV9QUkVGSVgpKQorCQkJcmV0dXJuIHM7CisKKwkJaWYgKHMuc3RhcnRzV2l0aChLRVlfRE9VQkxFX1BSRUZJWCkpCisJCQlyZXR1cm4gcy5zdWJzdHJpbmcoMSk7CisKKwkJaW50IGl4ID0gcy5pbmRleE9mKCIgIik7IC8vJE5PTi1OTFMtMSQKKwkJU3RyaW5nIGtleSA9IGl4ID09IC0xID8gcyA6IHMuc3Vic3RyaW5nKDAsIGl4KTsKKwkJU3RyaW5nIGRmbHQgPSBpeCA9PSAtMSA/IHMgOiBzLnN1YnN0cmluZyhpeCArIDEpOworCisJCWlmIChwcm9wZXJ0aWVzID09IG51bGwpCisJCQlyZXR1cm4gZGZsdDsKKworCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKKwkJdHJ5IHsKKwkJCXJlc3VsdCA9IHByb3BlcnRpZXMuZ2V0U3RyaW5nKGtleS5zdWJzdHJpbmcoMSkpOworCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgeworCQkJcmV0dXJuIGRmbHQ7CisJCX0KKwkJaWYgKHJ1bnRpbWVNYXBwaW5ncyAhPSBudWxsKSB7CisJCQlmb3IgKEVudW1lcmF0aW9uIGUgPSBydW50aW1lTWFwcGluZ3Mua2V5cygpOyBlLmhhc01vcmVFbGVtZW50cygpOykgeworCQkJCVN0cmluZyBrZXlWYWx1ZSA9IChTdHJpbmcpIGUubmV4dEVsZW1lbnQoKTsKKwkJCQlpbnQgaSA9IHJlc3VsdC5pbmRleE9mKGtleVZhbHVlKTsKKwkJCQlpZiAoaSAhPSAtMSkgeworCQkJCQlTdHJpbmcgczEgPSByZXN1bHQuc3Vic3RyaW5nKDAsaSk7CisJCQkJCVN0cmluZyBzMiA9IChTdHJpbmcpIHJ1bnRpbWVNYXBwaW5ncy5nZXQoa2V5VmFsdWUpOworCQkJCQlTdHJpbmcgczMgPSByZXN1bHQuc3Vic3RyaW5nKGkra2V5VmFsdWUubGVuZ3RoKCkpOworCQkJCQlyZXN1bHQgPSBzMSArIHMyICsgczM7CisJCQkJfQorCQkJfQorCQl9CisJCisJCWlmIChyZXN1bHQuaW5kZXhPZigneycpICE9IC0xKSB7CisJCQkvLyBXZSB0ZXN0IGZvciB0aGUgY3VybHkgYnJhY2VzIHNpbmNlIGR1ZSB0byBOTCBpc3N1ZXMgd2UgZG8gbm90CisJCQkvLyB3YW50IHRvIHVzZSBNZXNzYWdlRm9ybWF0IHVubGVzcyB3ZSBoYXZlIHRvLgorCQkJdHJ5IHsKKwkJCQlyZXN1bHQgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChyZXN1bHQsIG1hcHBpbmdzKTsKKwkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisJCQkJLy9pZ25vcmUgYW5kIHJldHVybiBzdHJpbmcgd2l0aG91dCBib3VuZCBwYXJhbWV0ZXJzCisJCQl9CisJCX0KKwkJCisJCXJldHVybiByZXN1bHQ7CQorCX0KKworCS8qCisJICogUmVhZCB0aGUgY29udGVudHMgb2YgdGhlIGluaSwgcHJvcGVydGllcywgYW5kIG1hcHBpbmdzIGZpbGVzLgorCSAqLworCXByaXZhdGUgSVN0YXR1cyBsb2FkKFVSTCBpbmlVUkwsIFVSTCBwcm9wZXJ0aWVzVVJMLCBVUkwgbWFwcGluZ3NVUkwpIHsKKworCQlJbnB1dFN0cmVhbSBpcyA9IG51bGw7CisJCXRyeSB7CisJCQlpcyA9IGluaVVSTC5vcGVuU3RyZWFtKCk7CisJCQlpbmkgPSBuZXcgUHJvcGVydGllcygpOworCQkJaW5pLmxvYWQoaXMpOworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQlpbmkgPSBudWxsOworCQkJU3RyaW5nIG1lc3NhZ2UgPSBOTFMuYmluZChNZXNzYWdlcy5JbmlGaWxlUmVhZGVyX1JlYWRJbmlFcnJvciwgKG5ldyBTdHJpbmdbXSB7IGluaVVSTC50b0V4dGVybmFsRm9ybSgpIH0pKTsKKwkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBJRCwgMCwgbWVzc2FnZSwgZSk7CisJCX0gZmluYWxseSB7CisJCQl0cnkgeworCQkJCWlmIChpcyAhPSBudWxsKQorCQkJCQlpcy5jbG9zZSgpOworCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJfQorCQl9CisKKwkJaWYgKHByb3BlcnRpZXNVUkwgIT0gbnVsbCkgeworCQkJaXMgPSBudWxsOworCQkJdHJ5IHsKKwkJCQlpcyA9IHByb3BlcnRpZXNVUkwub3BlblN0cmVhbSgpOworCQkJCXByb3BlcnRpZXMgPSBuZXcgUHJvcGVydHlSZXNvdXJjZUJ1bmRsZShpcyk7CisJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJcHJvcGVydGllcyA9IG51bGw7CisJCQkJU3RyaW5nIG1lc3NhZ2UgPSBOTFMuYmluZChNZXNzYWdlcy5JbmlGaWxlUmVhZGVyX1JlYWRQcm9wRXJyb3IsIChuZXcgU3RyaW5nW10geyBwcm9wZXJ0aWVzVVJMLnRvRXh0ZXJuYWxGb3JtKCkgfSkpOworCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBJRCwgMCwgbWVzc2FnZSwgZSk7CisJCQl9IGZpbmFsbHkgeworCQkJCXRyeSB7CisJCQkJCWlmIChpcyAhPSBudWxsKQorCQkJCQkJaXMuY2xvc2UoKTsKKwkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJfQorCQkJfQorCQl9CisKKwkJUHJvcGVydHlSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBudWxsOworCQlpZiAobWFwcGluZ3NVUkwgIT0gbnVsbCkgeworCQkJaXMgPSBudWxsOworCQkJdHJ5IHsKKwkJCQlpcyA9IG1hcHBpbmdzVVJMLm9wZW5TdHJlYW0oKTsKKwkJCQlidW5kbGUgPSBuZXcgUHJvcGVydHlSZXNvdXJjZUJ1bmRsZShpcyk7CisJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJYnVuZGxlID0gbnVsbDsKKwkJCQlTdHJpbmcgbWVzc2FnZSA9IE5MUy5iaW5kKE1lc3NhZ2VzLkluaUZpbGVSZWFkZXJfUmVhZE1hcEVycm9yLCAobmV3IFN0cmluZ1tdIHsgbWFwcGluZ3NVUkwudG9FeHRlcm5hbEZvcm0oKSB9KSk7CisJCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUElELCAwLCBtZXNzYWdlLCBlKTsKKwkJCX0gZmluYWxseSB7CisJCQkJdHJ5IHsKKwkJCQkJaWYgKGlzICE9IG51bGwpCisJCQkJCQlpcy5jbG9zZSgpOworCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQl9CisJCQl9CisJCX0KKworCQlBcnJheUxpc3QgbWFwcGluZ3NMaXN0ID0gbmV3IEFycmF5TGlzdCgpOworCQlpZiAoYnVuZGxlICE9IG51bGwpIHsKKwkJCWJvb2xlYW4gZm91bmQgPSB0cnVlOworCQkJaW50IGkgPSAwOworCQkJd2hpbGUgKGZvdW5kKSB7CisJCQkJdHJ5IHsKKwkJCQkJbWFwcGluZ3NMaXN0LmFkZChidW5kbGUuZ2V0U3RyaW5nKEludGVnZXIudG9TdHJpbmcoaSkpKTsKKwkJCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgeworCQkJCQlmb3VuZCA9IGZhbHNlOworCQkJCX0KKwkJCQlpKys7CisJCQl9CisJCX0KKwkJbWFwcGluZ3MgPSAoU3RyaW5nW10pbWFwcGluZ3NMaXN0LnRvQXJyYXkobmV3IFN0cmluZ1ttYXBwaW5nc0xpc3Quc2l6ZSgpXSk7CisJCQorCQlyZXR1cm4gT0tfU1RBVFVTOworCX0KK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL21lc3NhZ2VzLnByb3BlcnRpZXMgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvbmZpZ3VyYXRvci9tZXNzYWdlcy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiYzBjNmEKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvbmZpZ3VyYXRvci9tZXNzYWdlcy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNTggQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisjIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorIworIyBDb250cmlidXRvcnM6CisjICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyBCb290IHBsdWdpbiBtZXNzYWdlIGNhdGFsb2cKKworIyMjIFBsYXRmb3JtIENvbmZpZ3VyYXRpb24KK2NmaWdfdW5hYmxlVG9Mb2FkX25vVVJMPUNvbmZpZ3VyYXRpb24gZmlsZSBsb2NhdGlvbiBub3Qgc3BlY2lmaWVkCitjZmlnX3VuYWJsZVRvU2F2ZV9ub1VSTD1Db25maWd1cmF0aW9uIGZpbGUgc2F2ZSBsb2NhdGlvbiBub3Qgc3BlY2lmaWVkCitjZmlnX3VuYWJsZVRvU2F2ZT1VbmFibGUgdG8gc2F2ZSBjb25maWd1cmF0aW9uIGZpbGUgXCJ7MH1cIgorCitJbnN0YWxsZWRTaXRlUGFyc2VyX1VuYWJsZVRvQ3JlYXRlVVJMPSBJbnRlcm5hbCBFcnJvci4gVW5hYmxlIHRvIGNyZWF0ZSBVUkwgZnJvbSBcInswfVwiLgorSW5zdGFsbGVkU2l0ZVBhcnNlcl9VbmFibGVUb0NyZWF0ZVVSTEZvckZpbGU9IFVuYWJsZSB0byBjcmVhdGUgVVJMIGZyb20gXCJ7MH1cIi4KK0luc3RhbGxlZFNpdGVQYXJzZXJfRXJyb3JQYXJzaW5nRmlsZT0gVW5hYmxlIHRvIHBhcnNlIGZpbGUgXCJ7MH1cIi4KK0luc3RhbGxlZFNpdGVQYXJzZXJfRXJyb3JBY2Nlc3Npbmc9IFVuYWJsZSB0byBhY2Nlc3MgZmlsZSBcInswfVwiLgorSW5zdGFsbGVkU2l0ZVBhcnNlcl9kYXRlID0gSW52YWxpZCBkYXRlIGF0dHJpYnV0ZSB7MH0KK0J1bmRsZU1hbmlmZXN0X25vVmVyc2lvbiA9IHswfSBhdHRyaWJ1dGUgbm90IGZvdW5kIGluIG1hbmlmZXN0IGZvciBidW5kbGUgXCJ7MX1cIi4gIEJ1bmRsZSB3aWxsIGJlIGlnbm9yZWQuCisKK0ZlYXR1cmVQYXJzZXJfSWRPclZlcnNpb25JbnZhbGlkPSBFcnJvciBwYXJzaW5nIGZlYXR1cmUgc3RyZWFtLiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb3IgdGhlIHZlcnNpb24gaXMgbnVsbCBvciBlbXB0eTogdW5pcXVlIGlkZW50aWZpZXI9XCJ7MH1cIiB2ZXJzaW9uPVwiezF9XCIuCisKK0J1bmRsZUdyb3VwUHJvdmlkZXI9VXBkYXRlIE1hbmFnZXIgQ29uZmlndXJhdG9yCisKK0NvbmZpZ3VyYXRpb25BY3RpdmF0b3JfaW5pdGlhbGl6ZT1DYW5ub3QgaW5pdGlhbGl6ZSB0aGUgVXBkYXRlIENvbmZpZ3VyYXRvcgorQ29uZmlndXJhdGlvbkFjdGl2YXRvcl9jcmVhdGVDb25maWc9Q2Fubm90IGNyZWF0ZSBjb25maWd1cmF0aW9uIGluIHswfQorQ29uZmlndXJhdGlvbkFjdGl2YXRvcl91bmluc3RhbGxCdW5kbGU9Q291bGQgbm90IHVuaW5zdGFsbCB1bnVzZWQgYnVuZGxlIHswfQorQ29uZmlndXJhdGlvblBhcnNlcl9jYW5ub3RMb2FkU2hhcmVkSW5zdGFsbD1Db3VsZCBub3QgbG9hZCBmcm9tIHNoYXJlZCBpbnN0YWxsCitDb25maWd1cmF0aW9uQWN0aXZhdG9yX2luc3RhbGxCdW5kbGU9Q291bGQgbm90IGluc3RhbGwgYnVuZGxlIHswfQorUGx1Z2luRW50cnlfdmVyc2lvbkVycm9yPVVuYWJsZSB0byBjcmVhdGUgdmVyc2lvbmVkIGlkZW50aWZpZXI6IHswfSB7MX0KKworSW5pRmlsZVJlYWRlcl9NaXNzaW5nRGVzYyA9IENhbm5vdCBmaW5kIHBsdWdpbiBmb3IgZmVhdHVyZSB7MH0KK0luaUZpbGVSZWFkZXJfT3BlbklOSUVycm9yID0gQ2Fubm90IG9wZW4gYnJhbmRpbmcgZmlsZSB7MH0KK0luaUZpbGVSZWFkZXJfUmVhZEluaUVycm9yID0gRXJyb3IgcmVhZGluZyBicmFuZGluZyBmaWxlIHswfQorSW5pRmlsZVJlYWRlcl9SZWFkUHJvcEVycm9yID0gRXJyb3IgcmVhZGluZyBicmFuZGluZyBwcm9wZXJ0aWVzIGZpbGUgezB9CitJbmlGaWxlUmVhZGVyX1JlYWRNYXBFcnJvciA9IEVycm9yIHJlYWRpbmcgbWFwcGluZyBmaWxlcyB7MH0KKworU2l0ZUVudHJ5X2NvbXB1dGVQbHVnaW5TdGFtcCA9IENhbm5vdCBjb21wdXRlIHBsdWdpbnMgY2hhbmdlIHN0YW1wIGZvciBzaXRlIHswfSBiZWNhdXNlIGl0IGRvZXMgbm90IHN1cHBvcnQgcGx1Z2luIGRldGVjdGlvbi4KK1NpdGVFbnRyeV9jYW5ub3RGaW5kRmVhdHVyZUluRGlyPVVuYWJsZSB0byBmaW5kIGZlYXR1cmUueG1sIGluIGRpcmVjdG9yeTogezB9CitTaXRlRW50cnlfZHVwbGljYXRlRmVhdHVyZT1EdXBsaWNhdGUgZmVhdHVyZSBmb3VuZCBvbiBzaXRlIHswfSA6IHsxfQorU2l0ZUVudHJ5X3BsdWdpbnNEaXIgPSB7MH0gaXMgbm90IGEgdmFsaWQgcGx1Z2lucyBkaXJlY3RvcnkuCitQbGF0Zm9ybUNvbmZpZ3VyYXRpb25fZXhwZWN0aW5nUGxhdGZvcm1YTUxvckRpcmVjdG9yeT1FaXRoZXIgc3BlY2lmeSB0aGUgY29uZmlndXJhdGlvbiBkaXJlY3Rvcnkgb3IgYSBmaWxlIG5hbWVkIHBsYXRmb3JtLnhtbAorUGxhdGZvcm1Db25maWd1cmF0aW9uX2Nhbm5vdEJhY2t1cENvbmZpZz1DYW5ub3QgYmFja3VwIGN1cnJlbnQgY29uZmlndXJhdGlvbgorUGxhdGZvcm1Db25maWd1cmF0aW9uX2Nhbm5vdENsb3NlU3RyZWFtPUNvdWxkIG5vdCBjbG9zZSBvdXRwdXQgc3RyZWFtIGZvcgorUGxhdGZvcm1Db25maWd1cmF0aW9uX2Nhbm5vdENsb3NlVGVtcEZpbGU9Q291bGQgbm90IGNsb3NlIG91dHB1dCBzdHJlYW0gZm9yIHRlbXAgZmlsZQorUGxhdGZvcm1Db25maWd1cmF0aW9uX2Nhbm5vdFJlbmFtZVRlbXBGaWxlPUNvdWxkIG5vdCByZW5hbWUgY29uZmlndXJhdGlvbiB0ZW1wIGZpbGUKK1BsYXRmb3JtQ29uZmlndXJhdGlvbl9jYW5ub3RMb2FkQ29uZmlnPUNhbm5vdCBsb2FkIGNvbmZpZ3VyYXRpb24gZnJvbQorUGxhdGZvcm1Db25maWd1cmF0aW9uX2Nhbm5vdExvYWREZWZhdWx0U2l0ZT1DYW5ub3QgbG9hZCBkZWZhdWx0IHNpdGUKK1BsYXRmb3JtQ29uZmlndXJhdGlvbl9jYW5ub3RGaW5kQ29uZmlnRmlsZT1QbGF0Zm9ybSBjb25maWd1cmF0aW9uIGZpbGUgY2Fubm90IGJlIGZvdW5kCitQbGF0Zm9ybUNvbmZpZ3VyYXRpb25fY2Fubm90U2F2ZU5vbkV4aXN0aW5nQ29uZmlnPUNvbmZpZ3VyYXRpb24gY2Fubm90IGJlIHNhdmVkIGJlY2F1c2UgaXQgZG9lcyBub3QgZXhpc3QKKworUGx1Z2luUGFyc2VyX3BsdWdpbl9ub19pZCA9IFBsdWdpbiBkb2VzIG5vdCBoYXZlIGEgdmFsaWQgaWRlbnRpZmllcjogezB9CitQbHVnaW5QYXJzZXJfcGx1Z2luX25vX3ZlcnNpb24gPSBQbHVnaW4gZG9lcyBub3QgaGF2ZSBhIHZhbGlkIHZlcnNpb246IHswfQorWE1MUHJpbnRIYW5kbGVyX3Vuc3VwcG9ydGVkTm9kZVR5cGU9VW5zdXBwb3J0ZWQgWE1MIE5vZGUgVHlwZS4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5saW51eC8uY2xhc3NwYXRoIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmxpbnV4Ly5jbGFzc3BhdGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg0ODI0OQotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5saW51eC8uY2xhc3NwYXRoCkBAIC0wLDAgKzEsNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCis8Y2xhc3NwYXRoPg0KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4NCisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPg0KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCis8L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubGludXgvLmN2c2lnbm9yZSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5saW51eC8uY3ZzaWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1ZTgyZDcKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubGludXgvLmN2c2lnbm9yZQpAQCAtMCwwICsxIEBACitiaW4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubGludXgvLnByb2plY3QgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubGludXgvLnByb2plY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc4ZTJiNwotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5saW51eC8ucHJvamVjdApAQCAtMCwwICsxLDMzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KKzxwcm9qZWN0RGVzY3JpcHRpb24+DQorCTxuYW1lPm9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmxpbnV4PC9uYW1lPg0KKwk8Y29tbWVudD48L2NvbW1lbnQ+DQorCTxwcm9qZWN0cz4NCisJCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmNvcmUuYm9vdDwvcHJvamVjdD4NCisJCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmNvcmUucnVudGltZTwvcHJvamVjdD4NCisJCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5PC9wcm9qZWN0Pg0KKwkJPHByb2plY3Q+b3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvcjwvcHJvamVjdD4NCisJCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlPC9wcm9qZWN0Pg0KKwk8L3Byb2plY3RzPg0KKwk8YnVpbGRTcGVjPg0KKwkJPGJ1aWxkQ29tbWFuZD4NCisJCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCisJCQk8YXJndW1lbnRzPg0KKwkJCTwvYXJndW1lbnRzPg0KKwkJPC9idWlsZENvbW1hbmQ+DQorCQk8YnVpbGRDb21tYW5kPg0KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQorCQkJPGFyZ3VtZW50cz4NCisJCQk8L2FyZ3VtZW50cz4NCisJCTwvYnVpbGRDb21tYW5kPg0KKwkJPGJ1aWxkQ29tbWFuZD4NCisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCisJCQk8YXJndW1lbnRzPg0KKwkJCTwvYXJndW1lbnRzPg0KKwkJPC9idWlsZENvbW1hbmQ+DQorCTwvYnVpbGRTcGVjPg0KKwk8bmF0dXJlcz4NCisJCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPg0KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQorCTwvbmF0dXJlcz4NCis8L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubGludXgvYWJvdXQuaHRtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5saW51eC9hYm91dC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MDIzMzAKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubGludXgvYWJvdXQuaHRtbApAQCAtMCwwICsxLDI4IEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgorICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgorPHRpdGxlPkFib3V0PC90aXRsZT4KKzwvaGVhZD4KKzxib2R5IGxhbmc9IkVOLVVTIj4KKzxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgorIAorPHA+SnVuZSAyLCAyMDA2PC9wPgkKKzxoMz5MaWNlbnNlPC9oMz4KKworPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCitpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCitFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAorYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KK0ZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CisKKzxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCitiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5CithcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCitwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKK2luZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50CithbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgorCis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmxpbnV4L2J1aWxkLnByb3BlcnRpZXMgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubGludXgvYnVpbGQucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjUwMTBjCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmxpbnV4L2J1aWxkLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxNiBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisjIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjCisjIENvbnRyaWJ1dG9yczoKKyMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworYmluLmluY2x1ZGVzID0gb3MvLFwKKyAgICAgICAgICAgICAgIGZyYWdtZW50LnByb3BlcnRpZXMsXAorICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCisgICAgICAgICAgICAgICBNRVRBLUlORi8KK3NyYy5pbmNsdWRlcyA9IHNyYy8sXAorICAgICAgICAgICAgICAgYWJvdXQuaHRtbApkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmxpbnV4L29zL2xpbnV4L3g4Ni9saWJ1cGRhdGUuc28gYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubGludXgvb3MvbGludXgveDg2L2xpYnVwZGF0ZS5zbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDcxMGJlCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmxpbnV4L29zL2xpbnV4L3g4Ni9saWJ1cGRhdGUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmxpbnV4L3NyYy9idWlsZC54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubGludXgvc3JjL2J1aWxkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWE0ZTYzCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmxpbnV4L3NyYy9idWlsZC54bWwKQEAgLTAsMCArMSw3MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxwcm9qZWN0IG5hbWU9ImJ1aWxkbGlicmFyeSIgZGVmYXVsdD0icnVuIiBiYXNlZGlyPSIuIj4gCisgIAorICA8IS0tIFRoZSBwcm9wZXJ0aWVzICR7ZWNsaXBzZS1ob21lfSAke2pkay1wYXRofSBzaG91bGQgYmUgcGFzc2VkIGludG8gdGhpcyBzY3JpcHQgLS0+CisgIDwhLS0gU2V0IGEgbWVhbmluZ2Z1bCBkZWZhdWx0IHZhbHVlIGZvciB3aGVuIGl0IGlzIG5vdC4gLS0+CisgIDxwcm9wZXJ0eSBuYW1lPSJlY2xpcHNlLWhvbWUiIHZhbHVlPSIke2Jhc2VkaXJ9Ly4uLy4uIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJqZGstcGF0aCIgdmFsdWU9IiR7amF2YS5ob21lfSIvPgorICA8cHJvcGVydHkgbmFtZT0iaW5zdGFsbEFyY2giIHZhbHVlPSJ4ODYiIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJkZXN0aW5hdGlvbiIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5saW51eC9vcy9saW51eC8ke2luc3RhbGxBcmNofS8iLz4KKyAgPHByb3BlcnR5IG5hbWU9Im9iai1wYXRoIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmxpbnV4L3NyYy8iLz4KKyAgPHByb3BlcnR5IG5hbWU9InNyYy1wYXRoIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmxpbnV4L3NyYy8iLz4gIAorICAKKyAgPCEtLSBzZXRzIHRoZSBwcm9wZXJ0aWVzIC0tPgorICA8cHJvcGVydHkgbmFtZT0ibGlicmFyeS1uYW1lIiB2YWx1ZT0ibGlidXBkYXRlIi8+ICAKKyAgPHByb3BlcnR5IG5hbWU9ImxpYnJhcnktcGxhdGZvcm0iIHZhbHVlPSJzbyIvPiAgICAKKyAgPHByb3BlcnR5IG5hbWU9ImxpYnJhcnktZmlsZSIgdmFsdWU9IiR7bGlicmFyeS1uYW1lfS4ke2xpYnJhcnktcGxhdGZvcm19Ii8+CisgIAorICA8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGFsbCBpbml0aWFsaXphdGlvbiBjb2RlIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSBmb3IgLS0+CisgIDwhLS0gYWxsIHRlc3RzIHRoYXQgYXJlIHRvIGJlIHJ1bi4gSW5pdGlhbGl6YXRpb24gZm9yIGluZGl2aWR1YWwgdGVzdHMgLS0+CisgIDwhLS0gc2hvdWxkIGJlIGRvbmUgd2l0aGluIHRoZSBib2R5IG9mIHRoZSBzdWl0ZSB0YXJnZXQuIC0tPgorICA8dGFyZ2V0IG5hbWU9ImluaXQiPgorICAgIDx0c3RhbXAvPgorICAgIDxkZWxldGU+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7b2JqLXBhdGh9IiBpbmNsdWRlcz0iJHtsaWJyYXJ5LWZpbGV9Ii8+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7b2JqLXBhdGh9IiBpbmNsdWRlcz0iJHtsaWJyYXJ5LW5hbWV9Lm8iLz4KKyAgICA8L2RlbGV0ZT4KKyAgPC90YXJnZXQ+CisgIAorICA8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGNvZGUgdG8gY2xlYW51cCB0aGUgdGVzdGluZyBlbnZpcm9ubWVudCBhZnRlciAtLT4KKyAgPCEtLSBhZnRlciBhbGwgb2YgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4uIFlvdSBjYW4gdXNlIHRoaXMgdGFyZ2V0IHRvIC0tPgorICA8IS0tIGRlbGV0ZSB0ZW1wb3JhcnkgZmlsZXMgdGhhdCBoYXZlIGJlZW4gY3JlYXRlZC4gLS0+CisgIDx0YXJnZXQgbmFtZT0iY2xlYW51cCI+CisgICAgICA8ZGVsZXRlPgorICAgICAgPGZpbGVzZXQgZGlyPSIke29iai1wYXRofSIgaW5jbHVkZXM9IiR7bGlicmFyeS1maWxlfSIvPgorICAgICAgPGZpbGVzZXQgZGlyPSIke29iai1wYXRofSIgaW5jbHVkZXM9IiR7bGlicmFyeS1uYW1lfS5vIi8+CisgICAgPC9kZWxldGU+CisgIDwvdGFyZ2V0PgorICAKKyAgCisgIDwhLS0gVGhpcyB0YXJnZXQgcnVucyB0aGUgYnVpbGQuIC0tPgorICA8dGFyZ2V0IG5hbWU9InJ1biIgZGVwZW5kcz0iaW5pdCxidWlsZCxjbGVhbnVwIj4KKyAgPC90YXJnZXQ+CisgIAorICA8IS0tIFRoaXMgdGFyZ2V0IGJ1aWxkIHRoZSBsaWJyYXJ5IC0tPgorICA8dGFyZ2V0IG5hbWU9ImJ1aWxkIj4KKyAgICA8ZWNobyBtZXNzYWdlPSJCdWlsZGluZyAke2xpYnJhcnktZmlsZX0iLz4KKworICAgIDxwcm9wZXJ0eSBuYW1lPSJoZWFkZXItcGF0aCIgdmFsdWU9IiR7amRrLXBhdGh9Ly4uL2luY2x1ZGUiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGVhZGVyLWxpbnV4LXBhdGgiIHZhbHVlPSIke2hlYWRlci1wYXRofS9saW51eCIgLz4KKworCTxlY2hvIG1lc3NhZ2U9ImdjYyAtbyAgJHtsaWJyYXJ5LWZpbGV9IC1zaGFyZWQgLUkke3NyYy1wYXRofSAtSSR7aGVhZGVyLWxpbnV4LXBhdGh9IC1mUElDICR7bGlicmFyeS1maWxlfSIvPgorCisgICAgPGFwcGx5IGV4ZWN1dGFibGU9ImdjYyIgZGVzdD0iJHtlY2xpcHNlLWhvbWV9LyIgcGFyYWxsZWw9ImZhbHNlIj4KKyAgICAgIDxhcmcgdmFsdWU9Ii1vIi8+CisgICAgICA8YXJnIHZhbHVlPSIke2xpYnJhcnktZmlsZX0iLz4KKyAgICAgIDxhcmcgdmFsdWU9Ii1zaGFyZWQiLz4KKyAgICAgIDxhcmcgdmFsdWU9Ii1JJHtzcmMtcGF0aH0iLz4KKyAgICAgIDxhcmcgdmFsdWU9Ii1JJHtoZWFkZXItcGF0aH0iLz4gICAgICAKKyAgICAgIDxhcmcgdmFsdWU9Ii1JJHtoZWFkZXItbGludXgtcGF0aH0iLz4KKyAgICAgIDxhcmcgdmFsdWU9Ii1mUElDIi8+CisJICA8c3JjZmlsZS8+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7c3JjLXBhdGh9IiBpbmNsdWRlcz0iKi5jIi8+CisgICAgICA8bWFwcGVyIHR5cGU9Imdsb2IiIGZyb209IiouYyIgdG89IioubyIvPgorICAgIDwvYXBwbHk+CisgICAgCisJPG1vdmUgZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IiB0b2Rpcj0iJHtkZXN0aW5hdGlvbn0iLz4KKyAgPC90YXJnZXQ+CisgIAorICAKKzwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubGludXgvc3JjL3VwZGF0ZS5oIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmxpbnV4L3NyYy91cGRhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2RkYjhjCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmxpbnV4L3NyYy91cGRhdGUuaApAQCAtMCwwICsxLDc2IEBACisvKiBETyBOT1QgRURJVCBUSElTIEZJTEUgLSBpdCBpcyBtYWNoaW5lIGdlbmVyYXRlZCAqLw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQoroCoNCisgKiBDb250cmlidXRvcnM6DQorICogICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorIA0KKyNpbmNsdWRlIDxqbmkuaD4NCisvKiBIZWFkZXIgZm9yIGNsYXNzIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mbyAqLw0KKw0KKyNpZm5kZWYgX0luY2x1ZGVkX29yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mbw0KKyNkZWZpbmUgX0luY2x1ZGVkX29yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mbw0KKyNpZmRlZiBfX2NwbHVzcGx1cw0KK2V4dGVybiAiQyIgew0KKyNlbmRpZg0KKyN1bmRlZiBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fU0laRV9VTktOT1dODQorI2RlZmluZSBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fU0laRV9VTktOT1dOIC0xTA0KKyN1bmRlZiBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fVk9MVU1FX1VOS05PV04NCisjZGVmaW5lIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfVU5LTk9XTiAtMUwNCisjdW5kZWYgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9JTlZBTElEX1BBVEgNCisjZGVmaW5lIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfSU5WQUxJRF9QQVRIIC0yTA0KKyN1bmRlZiBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fVk9MVU1FX1JFTU9WQUJMRQ0KKyNkZWZpbmUgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9SRU1PVkFCTEUgMUwNCisjdW5kZWYgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9GSVhFRA0KKyNkZWZpbmUgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9GSVhFRCAyTA0KKyN1bmRlZiBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fVk9MVU1FX1JFTU9URQ0KKyNkZWZpbmUgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9SRU1PVEUgM0wNCisjdW5kZWYgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9DRFJPTQ0KKyNkZWZpbmUgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9DRFJPTSA0TA0KKyN1bmRlZiBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fVk9MVU1FX1JBTURJU0sNCisjZGVmaW5lIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfUkFNRElTSyA1TA0KKy8qIEluYWNjZXNzaWJsZSBzdGF0aWM6IGxpc3RlbmVycyAqLw0KKy8qIEluYWNjZXNzaWJsZSBzdGF0aWM6IGhhc05hdGl2ZXMgKi8NCisvKg0KKyAqIENsYXNzOiAgICAgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvDQorICogTWV0aG9kOiAgICBuYXRpdmVHZXRGcmVlU3BhY2UNCisgKiBTaWduYXR1cmU6IChMamF2YS9pby9GaWxlOylKDQorICovDQorSk5JRVhQT1JUIGpsb25nIEpOSUNBTEwgSmF2YV9vcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fbmF0aXZlR2V0RnJlZVNwYWNlDQorICAoSk5JRW52ICosIGpjbGFzcywgam9iamVjdCk7DQorDQorLyoNCisgKiBDbGFzczogICAgIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mbw0KKyAqIE1ldGhvZDogICAgbmF0aXZlR2V0TGFiZWwNCisgKiBTaWduYXR1cmU6IChMamF2YS9pby9GaWxlOylMamF2YS9sYW5nL1N0cmluZzsNCisgKi8NCitKTklFWFBPUlQganN0cmluZyBKTklDQUxMIEphdmFfb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX25hdGl2ZUdldExhYmVsDQorICAoSk5JRW52ICosIGpjbGFzcywgam9iamVjdCk7DQorDQorLyoNCisgKiBDbGFzczogICAgIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mbw0KKyAqIE1ldGhvZDogICAgbmF0aXZlR2V0VHlwZQ0KKyAqIFNpZ25hdHVyZTogKExqYXZhL2lvL0ZpbGU7KUkNCisgKi8NCitKTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX25hdGl2ZUdldFR5cGUNCisgIChKTklFbnYgKiwgamNsYXNzLCBqb2JqZWN0KTsNCisNCisvKg0KKyAqIENsYXNzOiAgICAgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvDQorICogTWV0aG9kOiAgICBuYXRpdmVMaXN0TW91bnRQb2ludHMNCisgKiBTaWduYXR1cmU6ICgpW0xqYXZhL2xhbmcvU3RyaW5nOw0KKyAqLw0KK0pOSUVYUE9SVCBqb2JqZWN0QXJyYXkgSk5JQ0FMTCBKYXZhX29yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19uYXRpdmVMaXN0TW91bnRQb2ludHMNCisgIChKTklFbnYgKiwgamNsYXNzKTsNCisNCisjaWZkZWYgX19jcGx1c3BsdXMNCit9DQorDQorI2VuZGlmDQorI2VuZGlmDQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLndpbjMyLy5wcm9qZWN0IGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLndpbjMyLy5wcm9qZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjOWIyOGYKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUud2luMzIvLnByb2plY3QKQEAgLTAsMCArMSwyMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCis8cHJvamVjdERlc2NyaXB0aW9uPg0KKwk8bmFtZT5vcmcuZWNsaXBzZS51cGRhdGUuY29yZS53aW4zMjwvbmFtZT4NCisJPGNvbW1lbnQ+PC9jb21tZW50Pg0KKwk8cHJvamVjdHM+DQorCTwvcHJvamVjdHM+DQorCTxidWlsZFNwZWM+DQorCQk8YnVpbGRDb21tYW5kPg0KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQorCQkJPGFyZ3VtZW50cz4NCisJCQk8L2FyZ3VtZW50cz4NCisJCTwvYnVpbGRDb21tYW5kPg0KKwkJPGJ1aWxkQ29tbWFuZD4NCisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCisJCQk8YXJndW1lbnRzPg0KKwkJCTwvYXJndW1lbnRzPg0KKwkJPC9idWlsZENvbW1hbmQ+DQorCTwvYnVpbGRTcGVjPg0KKwk8bmF0dXJlcz4NCisJCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KKwk8L25hdHVyZXM+DQorPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLndpbjMyL2Fib3V0Lmh0bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUud2luMzIvYWJvdXQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjAyMzMwCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLndpbjMyL2Fib3V0Lmh0bWwKQEAgLTAsMCArMSwyOCBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKKyAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KKzx0aXRsZT5BYm91dDwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keSBsYW5nPSJFTi1VUyI+Cis8aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KKyAKKzxwPkp1bmUgMiwgMjAwNjwvcD4JCis8aDM+TGljZW5zZTwvaDM+CisKKzxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAoraW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQorRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKK2F0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCitGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgorCis8cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAorYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQorYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAorcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCitpbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAorYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KKworPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS53aW4zMi9idWlsZC5wcm9wZXJ0aWVzIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLndpbjMyL2J1aWxkLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdkZGFjYQotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS53aW4zMi9idWlsZC5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTYgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisjIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorIworIyBDb250cmlidXRvcnM6CisjICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2Jpbi5pbmNsdWRlcyA9IG9zLyxcCisgICAgICAgICAgICAgICBmcmFnbWVudC5wcm9wZXJ0aWVzLFwKKyAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAorICAgICAgICAgICAgICAgTUVUQS1JTkYvCitzcmMuaW5jbHVkZXMgPSBhYm91dC5odG1sLFwKKyAgICAgICAgICAgICAgIHNyYy8KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS53aW4zMi9vcy93aW4zMi9pYTY0L3VwZGF0ZS5kbGwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUud2luMzIvb3Mvd2luMzIvaWE2NC91cGRhdGUuZGxsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjZTQ2OTQKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUud2luMzIvb3Mvd2luMzIvaWE2NC91cGRhdGUuZGxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS53aW4zMi9vcy93aW4zMi94ODYvdXBkYXRlLmRsbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS53aW4zMi9vcy93aW4zMi94ODYvdXBkYXRlLmRsbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjE5NGQyCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLndpbjMyL29zL3dpbjMyL3g4Ni91cGRhdGUuZGxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS53aW4zMi9zcmMvYnVpbGQueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLndpbjMyL3NyYy9idWlsZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTIyODZiNwotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS53aW4zMi9zcmMvYnVpbGQueG1sCkBAIC0wLDAgKzEsNzQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdCBuYW1lPSJidWlsZGxpYnJhcnkiIGRlZmF1bHQ9InJ1biIgYmFzZWRpcj0iLiI+IAorICAKKyAgPCEtLSBUaGUgcHJvcGVydGllcyAke2VjbGlwc2UtaG9tZX0gJHtqZGstcGF0aH0gc2hvdWxkIGJlIHBhc3NlZCBpbnRvIHRoaXMgc2NyaXB0IC0tPgorICA8IS0tIFRoZSBQYXRoIHNob3VsZCBwb2ludCB0byB0aGUgYmluIGRpcmVjdG9yeSBvZiBCQ0M1NSAtLT4KKyAgPCEtLSBodHRwOi8vd3d3LmJvcmxhbmQuY29tL3Byb2R1Y3RzL2Rvd25sb2Fkcy9kb3dubG9hZF9jYnVpbGRlci5odG1sIC0tPgorICAKKyAgPCEtLSBTZXQgYSBtZWFuaW5nZnVsIGRlZmF1bHQgdmFsdWUgZm9yIHdoZW4gaXQgaXMgbm90LiAtLT4KKyAgPHByb3BlcnR5IG5hbWU9ImVjbGlwc2UtaG9tZSIgdmFsdWU9IiR7YmFzZWRpcn0vLi4vLi4iLz4KKyAgPHByb3BlcnR5IG5hbWU9Impkay1wYXRoIiB2YWx1ZT0iJHtqYXZhLmhvbWV9Ii8+ICAKKyAgPHByb3BlcnR5IG5hbWU9ImRlc3RpbmF0aW9uIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLndpbjMyL29zL3dpbjMyL3g4Ni8iLz4KKyAgPHByb3BlcnR5IG5hbWU9Im9iai1wYXRoIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLndpbjMyL3NyYyIvPgorICA8cHJvcGVydHkgbmFtZT0ic3JjLXBhdGgiIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUud2luMzIvc3JjLyIvPiAgCisgIAorICA8IS0tIHNldHMgdGhlIHByb3BlcnRpZXMgLS0+CisgIDxwcm9wZXJ0eSBuYW1lPSJsaWJyYXJ5LW5hbWUiIHZhbHVlPSJ1cGRhdGUiLz4gIAorICA8cHJvcGVydHkgbmFtZT0ibGlicmFyeS1wbGF0Zm9ybSIgdmFsdWU9ImRsbCIvPiAgICAKKyAgPHByb3BlcnR5IG5hbWU9ImxpYnJhcnktZmlsZSIgdmFsdWU9IiR7bGlicmFyeS1uYW1lfS4ke2xpYnJhcnktcGxhdGZvcm19Ii8+CisgIAorICA8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGFsbCBpbml0aWFsaXphdGlvbiBjb2RlIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSBmb3IgLS0+CisgIDwhLS0gYWxsIHRlc3RzIHRoYXQgYXJlIHRvIGJlIHJ1bi4gSW5pdGlhbGl6YXRpb24gZm9yIGluZGl2aWR1YWwgdGVzdHMgLS0+CisgIDwhLS0gc2hvdWxkIGJlIGRvbmUgd2l0aGluIHRoZSBib2R5IG9mIHRoZSBzdWl0ZSB0YXJnZXQuIC0tPgorICA8dGFyZ2V0IG5hbWU9ImluaXQiPgorICAgIDx0c3RhbXAvPgorICAgIDxkZWxldGU+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7b2JqLXBhdGh9IiBpbmNsdWRlcz0iJHtsaWJyYXJ5LWZpbGV9Ii8+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7b2JqLXBhdGh9IiBpbmNsdWRlcz0iJHtsaWJyYXJ5LW5hbWV9Lm9iaiIvPgorICAgICAgPGZpbGVzZXQgZGlyPSIke29iai1wYXRofSIgaW5jbHVkZXM9IiR7bGlicmFyeS1uYW1lfS50ZHMiLz4gICAgICAgICAgICAKKyAgICA8L2RlbGV0ZT4KKyAgPC90YXJnZXQ+CisgIAorICA8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGNvZGUgdG8gY2xlYW51cCB0aGUgdGVzdGluZyBlbnZpcm9ubWVudCBhZnRlciAtLT4KKyAgPCEtLSBhZnRlciBhbGwgb2YgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4uIFlvdSBjYW4gdXNlIHRoaXMgdGFyZ2V0IHRvIC0tPgorICA8IS0tIGRlbGV0ZSB0ZW1wb3JhcnkgZmlsZXMgdGhhdCBoYXZlIGJlZW4gY3JlYXRlZC4gLS0+CisgIDx0YXJnZXQgbmFtZT0iY2xlYW51cCI+CisgICAgICA8ZGVsZXRlPgorICAgICAgPGZpbGVzZXQgZGlyPSIke29iai1wYXRofSIgaW5jbHVkZXM9IiR7bGlicmFyeS1maWxlfSIvPgorICAgICAgPGZpbGVzZXQgZGlyPSIke29iai1wYXRofSIgaW5jbHVkZXM9IiR7bGlicmFyeS1uYW1lfS5vYmoiLz4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHtvYmotcGF0aH0iIGluY2x1ZGVzPSIke2xpYnJhcnktbmFtZX0udGRzIi8+ICAgICAgICAgICAgCisgICAgPC9kZWxldGU+CisgIDwvdGFyZ2V0PgorICAKKyAgCisgIDwhLS0gVGhpcyB0YXJnZXQgcnVucyB0aGUgdGVzdCBzdWl0ZS4gQW55IGFjdGlvbnMgdGhhdCBuZWVkIHRvIGhhcHBlbiAtLT4KKyAgPCEtLSBhZnRlciBhbGwgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4gc2hvdWxkIGdvIGhlcmUuIC0tPgorICA8dGFyZ2V0IG5hbWU9InJ1biIgZGVwZW5kcz0iaW5pdCxidWlsZCxjbGVhbnVwIj4KKyAgPC90YXJnZXQ+CisgIAorICA8IS0tIFRoaXMgdGFyZ2V0IGJ1aWxkIHRoZSBkbGwgLS0+CisgIDx0YXJnZXQgbmFtZT0iYnVpbGQiPgorICAgIDxlY2hvIG1lc3NhZ2U9IkJ1aWxkaW5nICR7bGlicmFyeS1maWxlfSIvPgorCisgICAgPHByb3BlcnR5IG5hbWU9ImhlYWRlci1wYXRoIiB2YWx1ZT0iJHtqZGstcGF0aH0vaW5jbHVkZSIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoZWFkZXItd2luZG93cy1wYXRoIiB2YWx1ZT0iJHtoZWFkZXItcGF0aH0vd2luMzIiIC8+CisKKwk8ZWNobyBtZXNzYWdlPSJiY2MzMiAtSSR7c3JjLXBhdGh9IC1JJHtoZWFkZXItd2luZG93cy1wYXRofSAtV0QiLz4KKworICAgIDxhcHBseSBleGVjdXRhYmxlPSJiY2MzMiIgZGVzdD0iJHtlY2xpcHNlLWhvbWV9LyIgcGFyYWxsZWw9ImZhbHNlIj4KKyAgICAgIDxhcmcgdmFsdWU9Ii1JJHtzcmMtcGF0aH0iLz4KKyAgICAgIDxhcmcgdmFsdWU9Ii1JJHtoZWFkZXItcGF0aH0iLz4gICAgICAKKyAgICAgIDxhcmcgdmFsdWU9Ii1JJHtoZWFkZXItd2luZG93cy1wYXRofSIvPiAKKyAgICAgIDwhLS0gYXJnIHZhbHVlPSItRFVOSUNPREUiIC0tPiAKKwkgIDxhcmcgdmFsdWU9Ii13LTgwNTciLz4gICAgICAgICAgIAorICAgICAgPGFyZyB2YWx1ZT0iLVdEIi8+CisJICA8c3JjZmlsZS8+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7c3JjLXBhdGh9IiBpbmNsdWRlcz0iKi5jcHAiLz4KKyAgICAgIDxtYXBwZXIgdHlwZT0iZ2xvYiIgZnJvbT0iKi5jcHAiIHRvPSIqLm9iaiIvPgorICAgIDwvYXBwbHk+CisgICAgCisJPG1vdmUgZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IiB0b2Rpcj0iJHtkZXN0aW5hdGlvbn0iLz4KKyAgPC90YXJnZXQ+CisgIAorICAKKzwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUud2luMzIvc3JjL21ha2UuYmF0IGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLndpbjMyL3NyYy9tYWtlLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjEwNWIwCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLndpbjMyL3NyYy9tYWtlLmJhdApAQCAtMCwwICsxLDE3IEBACityZW0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorcmVtICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCityZW0gIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKK3JlbSAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCityZW0gIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CityZW0gIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCityZW0gCityZW0gIENvbnRyaWJ1dG9yczoKK3JlbSAgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorcmVtICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK2RlbCB1cGRhdGUub2JqCitkZWwgdXBkYXRlLmRsbAorc2V0IHdpbl9pbmNsdWRlPWs6XG1zdmM2MFx2Yzk4XGluY2x1ZGUKK3NldCBsaWJfaW5jbHVkZXM9SzpcTXN2YzYwXFZDOThcTGliXFVVSUQuTElCIEs6XE1zdmM2MFxWQzk4XExpYlxMSUJDTVQuTElCIEs6XE1zdmM2MFxWQzk4XExpYlxPTEROQU1FUy5MSUIgSzpcTXN2YzYwXFZDOThcTGliXEtFUk5FTDMyLkxJQgorc2V0IGpka19pbmNsdWRlPWQ6XHZtXGpkazEuNC4yXGluY2x1ZGUKK3NldCBkbGxfbmFtZT11cGRhdGUKK2NsIC1JJXdpbl9pbmNsdWRlJSAtSSVqZGtfaW5jbHVkZSUgLUklamRrX2luY2x1ZGUlXHdpbjMyIC1MRCB1cGRhdGUuY3BwIC1GZSVkbGxfbmFtZSUgL2xpbmsgJWxpYl9pbmNsdWRlcyUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS53aW4zMi9zcmMvc2V0dXAuYmF0IGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLndpbjMyL3NyYy9zZXR1cC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZmNTc0NgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS53aW4zMi9zcmMvc2V0dXAuYmF0CkBAIC0wLDAgKzEsMTMgQEAKK3JlbSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCityZW0gIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KK3JlbSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworcmVtICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKK3JlbSAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKK3JlbSAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKK3JlbSAKK3JlbSAgQ29udHJpYnV0b3JzOgorcmVtICAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCityZW0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorc2V0IHBhdGg9JXBhdGglO0s6XG1zdmM2MFx2Yzk4XGJpbjtLOlxtc3ZjNjBcQ29tbW9uXE1TRGV2OThcQmluCitzZXQgdGVtcD1kOlx0ZW1wCitzZXQgdG1wPWQ6XHRlbXAKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS53aW4zMi9zcmMvdXBkYXRlLmNwcCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS53aW4zMi9zcmMvdXBkYXRlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmNhZTQzCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLndpbjMyL3NyYy91cGRhdGUuY3BwCkBAIC0wLDAgKzEsMzgxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KKyAqDQorICogQ29udHJpYnV0b3JzOg0KKyAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKyMgaW5jbHVkZSAidXBkYXRlLmgiDQorIyBpbmNsdWRlIDx3aW5kb3dzLmg+DQorIyBpbmNsdWRlIDx3aW5pb2N0bC5oPiAvLyBJT0NUTCBjb2RlczogTWVkaWFUeXBlDQorDQorLy8gc2V0IHRvIDEgZm9yIERFQlVHDQoraW50IERFQlVHID0gMDsNCisNCisvLyBHTE9CQUwgTUVUSE9EUw0KKy8vIC0tLS0tLS0tLS0tLS0tLQ0KKw0KKy8qDQorICoNCisgKi8NCitqc3RyaW5nIFdpbmRvd3NUb2pzdHJpbmcoIEpOSUVudiogam5pZW52LCBjaGFyKiBidWYgKQ0KK3sNCisgIGpzdHJpbmcgcnRuID0gMDsNCisgIHdjaGFyX3QqIGJ1ZmZlciA9IDA7DQorICBpbnQgYnVmZmVyTGVuID0gc3RybGVuKGJ1Zik7ICANCisgIGlmKCBidWZmZXJMZW4gPT0gMCApew0KKyAgICBydG4gPSBqbmllbnYgLT5OZXdTdHJpbmdVVEYoYnVmKTsNCisJaWYgKERFQlVHKQ0KKwkJcHJpbnRmKCJXaW5kb3dzVG9KU3RyaW5nIEJ1ZmZlciBpcyBlbXB0eVxuIik7ICAgIA0KKyAgfSBlbHNlIHsNCisgICAgaW50IGxlbmd0aCA9IE11bHRpQnl0ZVRvV2lkZUNoYXIoIENQX0FDUCwgMCwgKExQQ1NUUilidWYsIGJ1ZmZlckxlbiwgTlVMTCwgMCApOw0KKyAgICBidWZmZXIgPSAod2NoYXJfdCopbWFsbG9jKCBsZW5ndGgqMiArIDEgKTsNCisgICAgaWYoaW50IGVycj1NdWx0aUJ5dGVUb1dpZGVDaGFyKCBDUF9BQ1AsIDAsIChMUENTVFIpYnVmLCBidWZmZXJMZW4sIChMUFdTVFIpYnVmZmVyLCBsZW5ndGggKSA+MCApew0KKyAgICAgIHJ0biA9IGpuaWVudi0+TmV3U3RyaW5nKChqY2hhciopYnVmZmVyLCBsZW5ndGggKTsNCisgICAgfSBlbHNlIHsNCisJCWlmIChERUJVRykNCisJCQlwcmludGYoIk11bHRpQnl0ZVRvV2lkZUNoYXIgJWlcbiIsZXJyKTsgICAgDQorICAgIH0NCisgIH0NCisgIGlmKCBidWZmZXIgKQ0KKyAgIGZyZWUoIGJ1ZmZlciApOw0KKyAgcmV0dXJuIHJ0bjsNCit9DQorDQorDQorDQorLyoNCisgKiBjYWxscyBHZXRWb2x1bWVJbmZvcm1hdGlvbiB0byByZXRyaXZlIHRoZSBsYWJlbCBvZiB0aGUgdm9sdW1lDQorICogUmV0dXJucyBOVUxMIGlmIGFuIGVycm9yIG9jY3Vycw0KKyAqIEBwYXJhbSBkcml2ZUxldHRlciBwYXRoIHRvIHRoZSBkcml2ZSAiYzpcXCINCisgKiBAcHJhbWEgam5pZW52IEpOSUVudmlyb25tZW50DQorICovDQoranN0cmluZyBnZXRMYWJlbChUQ0hBUiBkcml2ZUxldHRlcltdLEpOSUVudiAqIGpuaWVudil7DQorDQorCWpzdHJpbmcgcmVzdWx0ID0gTlVMTDsNCisJVENIQVIgYnVmWzEyOF07CQ0KKwkNCisJLy8gYWx3YXlzIHJldHVybiBudWxsIGFzIFVOSUNPREUgaXMgbm90IGltcGxlbWVudGVkDQorCS8vIGhvdyBjYW4gd2UgZ2V0IHRoZSBsYWJlbCBvZiBhIHZvbHVtZSBhcyBVTklDT0RFIGNoYXIgPw0KKwlyZXR1cm4gcmVzdWx0Ow0KKwkNCisJaW50IGVyciA9IEdldFZvbHVtZUluZm9ybWF0aW9uKA0KKwkJZHJpdmVMZXR0ZXIsDQorCQlidWYsDQorCQlzaXplb2YoYnVmKSAtIDEsDQorCQlOVUxMLA0KKwkJTlVMTCwNCisJCU5VTEwsDQorCQlOVUxMLA0KKwkJMCk7DQorCWlmIChlcnIpew0KKwkJcmVzdWx0ID0gV2luZG93c1RvanN0cmluZyhqbmllbnYsIGJ1Zik7DQorCX0gZWxzZSB7DQorCQlpZiAoREVCVUcpDQorCQkJcHJpbnRmKCJFcnJvciBHZXRWb2x1bWVJbmZvcm1hdGlvbiAlaVxuIixlcnIpOwkJCQkNCisgCX0NCisJcmV0dXJuIHJlc3VsdDsNCit9DQorDQorLyoNCisgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIFJlbW92YWJsZSBEcml2ZSANCisgKiBSZXR1cm5zIA0KKyAqIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfRkxPUFBZXzMNCisgKiBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fVk9MVU1FX0ZMT1BQWV81DQorICogb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9SRU1PVkFCTEUNCisgKi8NCitqbG9uZyBnZXRGbG9wcHkoVENIQVIgZHJpdmVMZXR0ZXJbXSl7DQorDQorCVRDSEFSIGZsb3BweVBhdGhbOF07DQorCUhBTkRMRSBoYW5kbGU7DQorCURJU0tfR0VPTUVUUlkgZ2VvbWV0cnlbMjBdOw0KKwlEV09SRCBkdzsNCisJamxvbmcgVU5LTk9XTiA9IG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfUkVNT1ZBQkxFOw0KKw0KKwlzcHJpbnRmKGZsb3BweVBhdGgsICJcXFxcLlxcJWM6IiwgZHJpdmVMZXR0ZXJbMF0pOw0KKwlpZiAoREVCVUcpDQorCQlwcmludGYoIlBhdGggJXNcbiIsZmxvcHB5UGF0aCk7DQorCS8vIEJVRyAyNTcxOQ0KKyAgICBTZXRFcnJvck1vZGUoIFNFTV9GQUlMQ1JJVElDQUxFUlJPUlMgKTsgCQkNCisJaGFuZGxlPUNyZWF0ZUZpbGUoZmxvcHB5UGF0aCwwLEZJTEVfU0hBUkVfUkVBRCxOVUxMLE9QRU5fQUxXQVlTLDAsTlVMTCk7DQorCWlmIChoYW5kbGU9PUlOVkFMSURfSEFORExFX1ZBTFVFKXsNCisJCWlmIChERUJVRykNCisJCQlwcmludGYoIkludmFsaWQgSGFuZGxlICVzXG4iLGZsb3BweVBhdGgpOw0KKwkJcmV0dXJuIFVOS05PV047DQorCX0gZWxzZSB7DQorCQlpZihEZXZpY2VJb0NvbnRyb2woaGFuZGxlLA0KKwkJCUlPQ1RMX0RJU0tfR0VUX01FRElBX1RZUEVTLDAsMCwNCisJCQlnZW9tZXRyeSxzaXplb2YoZ2VvbWV0cnkpLCZkdywwKSANCisJCQkmJiBkdz4wKSB7DQorCQkJc3dpdGNoKGdlb21ldHJ5WzBdLk1lZGlhVHlwZSl7DQorCQkJIGNhc2UgRjVfMTYwXzUxMjoNCisJCQkgY2FzZSBGNV8xODBfNTEyOg0KKwkJCSBjYXNlIEY1XzMyMF81MTI6DQorCQkJIGNhc2UgRjVfMzIwXzEwMjQ6DQorCQkJIGNhc2UgRjVfMzYwXzUxMjoNCisJCQkgY2FzZSBGNV8xUHQyXzUxMjoNCisJCQkJaWYgKERFQlVHKQ0KKwkJCQkJcHJpbnRmKCJGb3VuZCA1IDEvNCBEcml2ZVxuIik7CQkJCSAJDQorCQkJIAlyZXR1cm4gb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9GTE9QUFlfNTsNCisJCQkgY2FzZSBGM183MjBfNTEyOgkJCSAJCQkJIAkJCQkgCQkJCSAJCQkJIA0KKwkJCSBjYXNlIEYzXzFQdDQ0XzUxMjoNCisJCQkgY2FzZSBGM18yUHQ4OF81MTI6DQorCQkJIGNhc2UgRjNfMjBQdDhfNTEyOgkJCQkgCQkJCSAJCQkJIA0KKwkJCQlpZiAoREVCVUcpDQorCQkJCQlwcmludGYoIkZvdW5kIDMgMS8yIERyaXZlXG4iKTsJCQkJIAkNCisJCQkgCXJldHVybiBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fVk9MVU1FX0ZMT1BQWV8zOw0KKwkJCSBkZWZhdWx0Og0KKwkJCSAJcmV0dXJuIFVOS05PV047DQorCQkJfQ0KKwkJfQ0KKwl9DQorCXJldHVybiBVTktOT1dOOwkNCit9DQorDQorLyoNCisgKiBSZXR1cm5zIHRoZSBVTkMgbmFtZSBvZiBhIHJlbW90ZSBkcml2ZQ0KKyAqIChcXE1hY2hpbmVccGF0aFxwYXRoMVxwYXRoMiQpDQorICogcmV0dXJucyBOVUxMIGlmIGFuIGVycm9yIG9jY3Vycw0KKyAqLw0KKyBqc3RyaW5nIGdldFJlbW90ZU5ldHdvcmtOYW1lKFRDSEFSIGRyaXZlTGV0dGVyW10sSk5JRW52ICogam5pZW52KXsNCisgCQ0KKyAJdW5zaWduZWQgbG9uZyBzaXplID0yNTY7DQorIAlUQ0hBUiBidWZbMjU2XTsJDQorIAlUQ0hBUiBkcml2ZVBhdGhbMl07DQorIAlEV09SRCBlcnI7DQorIAlqc3RyaW5nIHJlc3VsdCA9IE5VTEw7DQorIAkNCisgCS8vIGFsd2F5cyByZXR1cm4gTlVMTCBhcyBVTklDT0RFIG5vdCBpbXBsZW1lbnRlZA0KKwkvLyBob3cgY2FuIHdlIGdldCB0aGUgbGFiZWwgb2YgYSByZW1vdGUgbmV0d29yayBuYW1lIGFzIFVOSUNPREUgY2hhciA/IAkNCisgCXJldHVybiByZXN1bHQ7DQorIAkNCisJc3ByaW50Zihkcml2ZVBhdGgsICIlYzoiLCBkcml2ZUxldHRlclswXSk7IAkNCisgCWVyciA9IFdOZXRHZXRDb25uZWN0aW9uKGRyaXZlUGF0aCxidWYsJnNpemUpOw0KKyAJDQorIAlpZiAoZXJyPT1XTl9TVUNDRVNTKXsNCisJCXJlc3VsdCA9IFdpbmRvd3NUb2pzdHJpbmcoam5pZW52LGJ1Zik7DQorCX0gZWxzZSB7DQorCQlpZiAoREVCVUcpDQorCQkJcHJpbnRmKCJFcnJvciBXTkV0R2V0Q29ubmVjdGlvbiAlaSIsZXJyKTsJCQkJDQorIAl9DQorCXJldHVybiByZXN1bHQ7DQorIH0NCisNCisNCisvLyBKTkkgTUVUSE9EUw0KKy8vIC0tLS0tLS0tLS0tLS0tLQ0KKw0KKy8qDQorICogQ2xhc3M6ICAgICBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm8NCisgKiBNZXRob2Q6ICAgIG5hdGl2ZUdldEZyZWVTcGFjZQ0KKyAqIFNpZ25hdHVyZTogKExqYXZhL2lvL0ZpbGU7KUoNCisgKi8NCitKTklFWFBPUlQgamxvbmcgSk5JQ0FMTCBKYXZhX29yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19uYXRpdmVHZXRGcmVlU3BhY2UoDQorCUpOSUVudiAqIGpuaWVudiwNCisJamNsYXNzIGphdmFDbGFzcywNCisJam9iamVjdCBmaWxlKSB7DQorDQorCS8vIHRvIHJldHJpdmUgdGhlIFN0cmluZw0KKwlqY2xhc3MgY2xzOw0KKwlqbWV0aG9kSUQgaWQ7DQorCWpvYmplY3Qgb2JqOw0KKw0KKwkvLyBqYXZhLmlvLkZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkNCisJY29uc3QgVENIQVIgKiBscERpcmVjdG9yeU5hbWU7DQorDQorCS8vIFdpbmRvd3MgUGFyYW1ldGVycw0KKwlfX2ludDY0IGk2NEZyZWVCeXRlc0F2YWlsYWJsZVRvQ2FsbGVyOw0KKwlfX2ludDY0IGk2NFRvdGFsTnVtYmVyT2ZCeXRlczsNCisJX19pbnQ2NCBpNjRUb3RhbE51bWJlck9mRnJlZUJ5dGVzOw0KKw0KKwkvLyBmaXJzdCwgb2J0YWluIHRoZSBQYXRoIGZyb20gdGhlIGphdmEuaW8uRmlsZSBwYXJhbWV0ZXINCisJY2xzID0gam5pZW52IC0+IEdldE9iamVjdENsYXNzKGZpbGUpOw0KKwlpZCA9IGpuaWVudiAtPiBHZXRNZXRob2RJRChjbHMsICJnZXRBYnNvbHV0ZVBhdGgiLCAiKClMamF2YS9sYW5nL1N0cmluZzsiKTsNCisJb2JqID0gam5pZW52IC0+IENhbGxPYmplY3RNZXRob2QoZmlsZSwgaWQpOw0KKwlscERpcmVjdG9yeU5hbWUgPSBqbmllbnYgLT4gR2V0U3RyaW5nVVRGQ2hhcnMoKGpzdHJpbmcpIG9iaiwgMCk7DQorCWlmIChERUJVRykNCisJCXByaW50ZigiRGlyZWN0b3J5OiBbJXNdXG4iLGxwRGlyZWN0b3J5TmFtZSk7DQorDQorCWludCBzdWNjZXNzID0gR2V0RGlza0ZyZWVTcGFjZUV4KA0KKwkJCQlscERpcmVjdG9yeU5hbWUsDQorCQkJCShQVUxBUkdFX0lOVEVHRVIpICYgaTY0RnJlZUJ5dGVzQXZhaWxhYmxlVG9DYWxsZXIsDQorCQkJCShQVUxBUkdFX0lOVEVHRVIpICYgaTY0VG90YWxOdW1iZXJPZkJ5dGVzLA0KKwkJCQkoUFVMQVJHRV9JTlRFR0VSKSAmIGk2NFRvdGFsTnVtYmVyT2ZGcmVlQnl0ZXMpOw0KKwkJCQ0KKwlpZiAoc3VjY2Vzcykgew0KKwkJcmV0dXJuIChqbG9uZykgaTY0RnJlZUJ5dGVzQXZhaWxhYmxlVG9DYWxsZXI7DQorCX0gZWxzZSB7DQorCQlyZXR1cm4gb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1NJWkVfVU5LTk9XTjsNCisJfQ0KK30NCisNCisvKg0KKyAqIENsYXNzOiAgICAgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvDQorICogTWV0aG9kOiAgICBuYXRpdmVHZXRMYWJlbA0KKyAqIFNpZ25hdHVyZTogKExqYXZhL2lvL0ZpbGU7KUxqYXZhL2xhbmcvU3RyaW5nOw0KKyAqLw0KK0pOSUVYUE9SVCBqc3RyaW5nIEpOSUNBTEwgSmF2YV9vcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fbmF0aXZlR2V0TGFiZWwoDQorCUpOSUVudiAqIGpuaWVudiwNCisJamNsYXNzIGphdmFDbGFzcywNCisJam9iamVjdCBmaWxlKSB7DQorDQorCS8vIHRvIHJldHJpdmUgdGhlIFN0cmluZw0KKwlqY2xhc3MgY2xzOw0KKwlqbWV0aG9kSUQgaWQ7DQorCWpvYmplY3Qgb2JqOw0KKw0KKwkvLyBqYXZhLmlvLkZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkNCisJY29uc3QgVENIQVIgKiBscERpcmVjdG9yeU5hbWU7DQorDQorCS8vIG9idGFpbiB0aGUgU3RyaW5nIGZyb20gdGhlIHBhcmFtZXRlcg0KKwljbHMgPSBqbmllbnYgLT4gR2V0T2JqZWN0Q2xhc3MoZmlsZSk7DQorCWlkID0gam5pZW52IC0+IEdldE1ldGhvZElEKGNscywgImdldEFic29sdXRlUGF0aCIsICIoKUxqYXZhL2xhbmcvU3RyaW5nOyIpOw0KKwlvYmogPSBqbmllbnYgLT4gQ2FsbE9iamVjdE1ldGhvZChmaWxlLCBpZCk7DQorCWxwRGlyZWN0b3J5TmFtZSA9IGpuaWVudiAtPiBHZXRTdHJpbmdVVEZDaGFycygoanN0cmluZykgb2JqLCAwKTsNCisJaWYgKERFQlVHKQ0KKwkJcHJpbnRmKCJEaXJlY3Rvcnk6IFslc11cbiIsbHBEaXJlY3RvcnlOYW1lKTsNCisNCisJLy8NCisJanN0cmluZyByZXN1bHQgPSBOVUxMOw0KKwkNCisJLy8gTWFrZSBzdXJlIHdlIGhhdmUgYSBTdHJpbmcgb2YgdGhlIEZvcm06IDxsZXR0ZXI+Og0KKwlpZiAoJzonID09IGxwRGlyZWN0b3J5TmFtZVsxXSkgew0KKwkJVENIQVIgZHJpdmVMZXR0ZXJbNF07IC8vIEM6XFwgZm9yIGV4YW1wbGUNCisJCW1lbWNweShkcml2ZUxldHRlciwgbHBEaXJlY3RvcnlOYW1lLCAyKTsNCisJCXN0cmNweShkcml2ZUxldHRlciArIDIsICJcXCIpOw0KKwkJc3dpdGNoIChHZXREcml2ZVR5cGUoZHJpdmVMZXR0ZXIpKSB7DQorCQkJY2FzZSBEUklWRV9SRU1PVEUgOg0KKwkJCQkvLyBjaGVjayBuYW1lIG9mIG1hY2hpbmUgYW5kIHBhdGggb2YgcmVtb3RlDQorCQkJCWlmIChERUJVRykNCisJCQkJCXByaW50ZigiUmVtb3RlIERyaXZlIik7DQorCQkJCXJlc3VsdCA9IGdldFJlbW90ZU5ldHdvcmtOYW1lKGRyaXZlTGV0dGVyLGpuaWVudik7CQkJCQ0KKwkJCQlicmVhazsNCisJCQlkZWZhdWx0IDoNCisJCQkJaWYgKERFQlVHKQ0KKwkJCQkJcHJpbnRmKCJBbm90aGVyIERyaXZlIGF0ICVzIiwgZHJpdmVMZXR0ZXIpOw0KKwkJCQlyZXN1bHQgPSBnZXRMYWJlbChkcml2ZUxldHRlcixqbmllbnYpOw0KKwkJCQlicmVhazsNCisJCX0gDQorCX0gDQorDQorCXJldHVybiByZXN1bHQ7DQorfQ0KKw0KKy8qDQorICogQ2xhc3M6ICAgICBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm8NCisgKiBNZXRob2Q6ICAgIG5hdGl2ZUdldFR5cGUNCisgKiBTaWduYXR1cmU6IChMamF2YS9pby9GaWxlOylJDQorICovDQorSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX29yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19uYXRpdmVHZXRUeXBlKA0KKwlKTklFbnYgKiBqbmllbnYsDQorCWpjbGFzcyBqYXZhQ2xhc3MsDQorCWpvYmplY3QgZmlsZSkgew0KKw0KKwkvLyB0byByZXRyaXZlIHRoZSBTdHJpbmcNCisJamNsYXNzIGNsczsNCisJam1ldGhvZElEIGlkOw0KKwlqb2JqZWN0IG9iajsNCisNCisJLy8gamF2YS5pby5GaWxlLmdldEFic29sdXRlUGF0aCgpDQorCWNvbnN0IFRDSEFSICogbHBEaXJlY3RvcnlOYW1lOw0KKw0KKwkvLyBvYnRhaW4gdGhlIFN0cmluZyBmcm9tIHRoZSBwYXJhbWV0ZXINCisJY2xzID0gam5pZW52IC0+IEdldE9iamVjdENsYXNzKGZpbGUpOw0KKwlpZCA9IGpuaWVudiAtPiBHZXRNZXRob2RJRChjbHMsICJnZXRBYnNvbHV0ZVBhdGgiLCAiKClMamF2YS9sYW5nL1N0cmluZzsiKTsNCisJb2JqID0gam5pZW52IC0+IENhbGxPYmplY3RNZXRob2QoZmlsZSwgaWQpOw0KKwlscERpcmVjdG9yeU5hbWUgPSBqbmllbnYgLT4gR2V0U3RyaW5nVVRGQ2hhcnMoKGpzdHJpbmcpIG9iaiwgMCk7DQorCWlmIChERUJVRykNCisJCXByaW50ZigiRGlyZWN0b3J5OiBbJXNdXG4iLGxwRGlyZWN0b3J5TmFtZSk7DQorDQorCWludCByZXN1bHQgPSBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fVk9MVU1FX1VOS05PV047DQorCQ0KKwkvLyBNYWtlIHN1cmUgd2UgaGF2ZSBhIFN0cmluZyBvZiB0aGUgRm9ybTogPGxldHRlcj46DQorCWlmICgnOicgPT0gbHBEaXJlY3RvcnlOYW1lWzFdKSB7DQorCQlUQ0hBUiBkcml2ZUxldHRlcls0XTsgLy9DOlxcIGZvciBleGFtcGxlDQorCQltZW1jcHkoZHJpdmVMZXR0ZXIsIGxwRGlyZWN0b3J5TmFtZSwgMik7DQorCQlzdHJjcHkoZHJpdmVMZXR0ZXIgKyAyLCAiXFwiKTsNCisNCisJCXN3aXRjaCAoR2V0RHJpdmVUeXBlKGRyaXZlTGV0dGVyKSkgew0KKwkJCWNhc2UgRFJJVkVfUkVNT1ZBQkxFIDoNCisJCQkJLy8gY2hlY2sgaWYgZmxvcHB5IDMuNSwgZmxvcHB5IDUuMjUJDQorCQkJCS8vIG9yIG90aGVyIHJlbW92YWJsZSBkZXZpY2UgKFVTQixQQ01DSUEgLi4uKQ0KKwkJCQlpZiAoREVCVUcpDQorCQkJCQlwcmludGYoIlJlbW92YWJsZSBEZXZpY2UiKTsNCisJCQkJcmVzdWx0ID0gZ2V0RmxvcHB5KGRyaXZlTGV0dGVyKTsJCQkJCQ0KKwkJCQlicmVhazsNCisJCQljYXNlIERSSVZFX0NEUk9NIDoNCisJCQkJcmVzdWx0ID0gb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9DRFJPTTsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSBEUklWRV9GSVhFRCA6DQorCQkJCXJlc3VsdCA9IG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfRklYRUQ7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgRFJJVkVfUkVNT1RFIDoNCisJCQkJcmVzdWx0ID0gb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9SRU1PVEU7DQorCQkJCWJyZWFrOw0KKwkJCWNhc2UgRFJJVkVfTk9fUk9PVF9ESVIgOg0KKwkJCQlyZXN1bHQgPSBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fVk9MVU1FX0lOVkFMSURfUEFUSDsNCisJCQkJYnJlYWs7DQorCQkJY2FzZSBEUklWRV9SQU1ESVNLIDoNCisJCQkJcmVzdWx0ID0gb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9SQU1ESVNLOw0KKwkJCQlicmVhazsJCQkNCisJCQljYXNlIERSSVZFX1VOS05PV04gOg0KKwkJCWRlZmF1bHQgOg0KKwkJCQlyZXN1bHQgPSBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fVk9MVU1FX1VOS05PV047DQorCQkJCWJyZWFrOw0KKwkJfQ0KKwl9IGVsc2Ugew0KKwkJcmVzdWx0ID0gb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9JTlZBTElEX1BBVEg7DQorCX0NCisNCisJcmV0dXJuIHJlc3VsdDsNCit9DQorDQorLyoNCisgKiBDbGFzczogICAgIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mbw0KKyAqIE1ldGhvZDogICAgbmF0aXZlTGlzdE1vdW50UG9pbnRzDQorICogU2lnbmF0dXJlOiAoKVtMamF2YS9sYW5nL1N0cmluZzsNCisgKi8NCitKTklFWFBPUlQgam9iamVjdEFycmF5IEpOSUNBTEwgSmF2YV9vcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fbmF0aXZlTGlzdE1vdW50UG9pbnRzKA0KKwlKTklFbnYgKiBqbmllbnYsDQorCWpjbGFzcyBqYXZhQ2xhc3MpIHsNCisNCisJLy8NCisJRFdPUkQgbG9nRHJpdmVzOw0KKwlVSU5UIGRyaXZlOw0KKwlUQ0hBUiBkcml2ZU5hbWVbMTAwXTsNCisJam9iamVjdEFycmF5IHJldHVybkFycmF5Ow0KKwlpbnQgbkRyaXZlID0gMDsNCisNCisJLy8gDQorCWpjbGFzcyBzdHJpbmdDbGFzczsNCisJam9iamVjdCBlbXB0eTsNCisJaW50IGluZGV4ID0gMDsNCisJam9iamVjdCBzdHI7DQorDQorDQorCWxvZ0RyaXZlcyA9IEdldExvZ2ljYWxEcml2ZXMoKTsNCisJZm9yIChkcml2ZSA9IDA7IGRyaXZlIDwgMzI7IGRyaXZlKyspIHsNCisJCWlmIChsb2dEcml2ZXMgJiAoMSA8PCBkcml2ZSkpIHsNCisJCQluRHJpdmUrKzsNCisJCX0NCisJfQ0KKw0KKwlzdHJpbmdDbGFzcyA9IGpuaWVudiAtPiBGaW5kQ2xhc3MoImphdmEvbGFuZy9TdHJpbmciKTsNCisJZW1wdHkgPSBqbmllbnYgLT4gTmV3U3RyaW5nVVRGKCIiKTsNCisJcmV0dXJuQXJyYXkgPSBqbmllbnYgLT4gTmV3T2JqZWN0QXJyYXkobkRyaXZlLCBzdHJpbmdDbGFzcywgZW1wdHkpOw0KKw0KKwlmb3IgKGRyaXZlID0gMDsgZHJpdmUgPCAzMjsgZHJpdmUrKykgew0KKwkJaWYgKGxvZ0RyaXZlcyAmICgxIDw8IGRyaXZlKSkgew0KKwkJCXNwcmludGYoZHJpdmVOYW1lLCAiJWM6XFwiLCBkcml2ZSArICdBJyk7DQorCQkJc3RyID0gam5pZW52IC0+IE5ld1N0cmluZ1VURihkcml2ZU5hbWUpOw0KKwkJCWpuaWVudiAtPiBTZXRPYmplY3RBcnJheUVsZW1lbnQocmV0dXJuQXJyYXksIGluZGV4LCBzdHIpOw0KKwkJCWluZGV4Kys7DQorCQl9DQorCX0NCisNCisJcmV0dXJuIHJldHVybkFycmF5Ow0KK30NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUud2luMzIvc3JjL3VwZGF0ZS5oIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLndpbjMyL3NyYy91cGRhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2NhN2UwCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLndpbjMyL3NyYy91cGRhdGUuaApAQCAtMCwwICsxLDc5IEBACisvKiBETyBOT1QgRURJVCBUSElTIEZJTEUgLSBpdCBpcyBtYWNoaW5lIGdlbmVyYXRlZCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKK6AqCisgKiBDb250cmlidXRvcnM6CisgKiAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgPGpuaS5oPg0KKy8qIEhlYWRlciBmb3IgY2xhc3Mgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvICovCisKKyNpZm5kZWYgX0luY2x1ZGVkX29yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mbworI2RlZmluZSBfSW5jbHVkZWRfb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvDQorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZg0KKyN1bmRlZiBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fU0laRV9VTktOT1dOCisjZGVmaW5lIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19TSVpFX1VOS05PV04gLTFMDQorI3VuZGVmIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfVU5LTk9XTgorI2RlZmluZSBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fVk9MVU1FX1VOS05PV04gLTFMDQorI3VuZGVmIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfSU5WQUxJRF9QQVRICisjZGVmaW5lIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfSU5WQUxJRF9QQVRIIC0yTA0KKyN1bmRlZiBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fVk9MVU1FX1JFTU9WQUJMRQorI2RlZmluZSBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fVk9MVU1FX1JFTU9WQUJMRSAxTA0KKyN1bmRlZiBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fVk9MVU1FX0ZJWEVECisjZGVmaW5lIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfRklYRUQgMkwNCisjdW5kZWYgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9SRU1PVEUKKyNkZWZpbmUgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9SRU1PVEUgM0wKKyN1bmRlZiBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fVk9MVU1FX0NEUk9NCisjZGVmaW5lIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfQ0RST00gNEwKKyN1bmRlZiBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fVk9MVU1FX1JBTURJU0sKKyNkZWZpbmUgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9SQU1ESVNLIDVMCisjdW5kZWYgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9GTE9QUFlfNQorI2RlZmluZSBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fVk9MVU1FX0ZMT1BQWV81IDZMCisjdW5kZWYgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9GTE9QUFlfMworI2RlZmluZSBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fVk9MVU1FX0ZMT1BQWV8zIDdMDQorLyogSW5hY2Nlc3NpYmxlIHN0YXRpYzogbGlzdGVuZXJzICovDQorLyogSW5hY2Nlc3NpYmxlIHN0YXRpYzogaGFzTmF0aXZlcyAqLw0KKy8qDQorICogQ2xhc3M6ICAgICBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm8NCisgKiBNZXRob2Q6ICAgIG5hdGl2ZUdldEZyZWVTcGFjZQ0KKyAqIFNpZ25hdHVyZTogKExqYXZhL2lvL0ZpbGU7KUoNCisgKi8NCitKTklFWFBPUlQgamxvbmcgSk5JQ0FMTCBKYXZhX29yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19uYXRpdmVHZXRGcmVlU3BhY2UNCisgIChKTklFbnYgKiwgamNsYXNzLCBqb2JqZWN0KTsKKw0KKy8qDQorICogQ2xhc3M6ICAgICBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm8NCisgKiBNZXRob2Q6ICAgIG5hdGl2ZUdldExhYmVsDQorICogU2lnbmF0dXJlOiAoTGphdmEvaW8vRmlsZTspTGphdmEvbGFuZy9TdHJpbmc7DQorICovDQorSk5JRVhQT1JUIGpzdHJpbmcgSk5JQ0FMTCBKYXZhX29yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19uYXRpdmVHZXRMYWJlbA0KKyAgKEpOSUVudiAqLCBqY2xhc3MsIGpvYmplY3QpOworDQorLyoNCisgKiBDbGFzczogICAgIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mbw0KKyAqIE1ldGhvZDogICAgbmF0aXZlR2V0VHlwZQ0KKyAqIFNpZ25hdHVyZTogKExqYXZhL2lvL0ZpbGU7KUkNCisgKi8NCitKTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX25hdGl2ZUdldFR5cGUNCisgIChKTklFbnYgKiwgamNsYXNzLCBqb2JqZWN0KTsKKw0KKy8qDQorICogQ2xhc3M6ICAgICBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm8NCisgKiBNZXRob2Q6ICAgIG5hdGl2ZUxpc3RNb3VudFBvaW50cw0KKyAqIFNpZ25hdHVyZTogKClbTGphdmEvbGFuZy9TdHJpbmc7DQorICovDQorSk5JRVhQT1JUIGpvYmplY3RBcnJheSBKTklDQUxMIEphdmFfb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX25hdGl2ZUxpc3RNb3VudFBvaW50cw0KKyAgKEpOSUVudiAqLCBqY2xhc3MpOworDQorI2lmZGVmIF9fY3BsdXNwbHVzCit9CisKKyNlbmRpZg0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS8uY2xhc3NwYXRoIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLy5jbGFzc3BhdGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU0YTA5NAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS8uY2xhc3NwYXRoCkBAIC0wLDAgKzEsOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCis8Y2xhc3NwYXRoPg0KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4NCisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iamFycHJvY2Vzc29yIi8+DQorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjQiLz4NCisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KKzwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS8uY3ZzaWdub3JlIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLy5jdnNpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVlODJkNwotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS8uY3ZzaWdub3JlCkBAIC0wLDAgKzEgQEAKK2JpbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS8ub3B0aW9ucyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS8ub3B0aW9ucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmY2MTk3Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLy5vcHRpb25zCkBAIC0wLDAgKzEsOSBAQAorb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvZGVidWc9dHJ1ZQ0KK29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2RlYnVnL3dhcm5pbmc9ZmFsc2UNCitvcmcuZWNsaXBzZS51cGRhdGUuY29yZS9kZWJ1Zy9wYXJzaW5nPWZhbHNlDQorb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvZGVidWcvaW5zdGFsbD1mYWxzZQ0KK29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2RlYnVnL2NvbmZpZ3VyYXRpb249ZmFsc2UNCitvcmcuZWNsaXBzZS51cGRhdGUuY29yZS9kZWJ1Zy90eXBlPWZhbHNlDQorb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvZGVidWcvd2ViPWZhbHNlDQorb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvZGVidWcvaW5zdGFsbGhhbmRsZXI9ZmFsc2UNCitvcmcuZWNsaXBzZS51cGRhdGUuY29yZS9kZWJ1Zy9yZWNvbmNpbGVyPWZhbHNlDQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLy5wcm9qZWN0IGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLy5wcm9qZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNThmZDQKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvLnByb2plY3QKQEAgLTAsMCArMSwyNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCis8cHJvamVjdERlc2NyaXB0aW9uPg0KKwk8bmFtZT5vcmcuZWNsaXBzZS51cGRhdGUuY29yZTwvbmFtZT4NCisJPGNvbW1lbnQ+PC9jb21tZW50Pg0KKwk8YnVpbGRTcGVjPg0KKwkJPGJ1aWxkQ29tbWFuZD4NCisJCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCisJCQk8YXJndW1lbnRzPg0KKwkJCTwvYXJndW1lbnRzPg0KKwkJPC9idWlsZENvbW1hbmQ+DQorCQk8YnVpbGRDb21tYW5kPg0KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQorCQkJPGFyZ3VtZW50cz4NCisJCQk8L2FyZ3VtZW50cz4NCisJCTwvYnVpbGRDb21tYW5kPg0KKwkJPGJ1aWxkQ29tbWFuZD4NCisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCisJCQk8YXJndW1lbnRzPg0KKwkJCTwvYXJndW1lbnRzPg0KKwkJPC9idWlsZENvbW1hbmQ+DQorCTwvYnVpbGRTcGVjPg0KKwk8bmF0dXJlcz4NCisJCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPg0KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQorCTwvbmF0dXJlcz4NCis8L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2Q2ZTg3Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpAQCAtMCwwICsxLDg2IEBACisjV2VkIEZlYiAxMSAxMjowNjoxMCBFU1QgMjAwOQorZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5jb21wYXJpbmdJZGVudGljYWw9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZWFkQ29kZT1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhbGx0aHJvdWdoQ2FzZT1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmF0YWxPcHRpb25hbEVycm9yPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFncz1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wdWJsaWMKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0hhc2hDb2RlTWV0aG9kPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wdWJsaWMKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHVibGljCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1N5bmNocm9uaXplZE9uSW5oZXJpdGVkTWV0aG9kPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm51bGxSZWZlcmVuY2U9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBhcmFtZXRlckFzc2lnbm1lbnQ9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3RlbnRpYWxOdWxsUmVmZXJlbmNlPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50TnVsbENoZWNrPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZWR1bmRhbnRTdXBlcmludGVyZmFjZT1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25FeGVtcHRFeGNlcHRpb25BbmRUaHJvd2FibGU9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbkluY2x1ZGVEb2NDb21tZW50UmVmZXJlbmNlPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlckluY2x1ZGVEb2NDb21tZW50UmVmZXJlbmNlPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRXYXJuaW5nVG9rZW49d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvYWJvdXQuaHRtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9hYm91dC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MDIzMzAKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvYWJvdXQuaHRtbApAQCAtMCwwICsxLDI4IEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgorICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgorPHRpdGxlPkFib3V0PC90aXRsZT4KKzwvaGVhZD4KKzxib2R5IGxhbmc9IkVOLVVTIj4KKzxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgorIAorPHA+SnVuZSAyLCAyMDA2PC9wPgkKKzxoMz5MaWNlbnNlPC9oMz4KKworPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCitpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCitFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAorYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KK0ZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CisKKzxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCitiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5CithcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCitwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKK2luZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50CithbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgorCis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2J1aWxkLnByb3BlcnRpZXMgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvYnVpbGQucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzM1ZDA3Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2J1aWxkLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyMiBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKyMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQorIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisjDQorIyBDb250cmlidXRvcnM6DQorIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KK3NvdXJjZS4uID0gc3JjLyxcDQorICAgICAgICAgICBqYXJwcm9jZXNzb3IvDQorYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcDQorICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXA0KKyAgICAgICAgICAgICAgIC4sXA0KKyAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXA0KKyAgICAgICAgICAgICAgIC5vcHRpb25zLFwNCisgICAgICAgICAgICAgICBNRVRBLUlORi8NCitzcmMuaW5jbHVkZXMgPSBhYm91dC5odG1sLFwNCisgICAgICAgICAgICAgICBzY2hlbWEvDQorb3V0cHV0Li4gPSBiaW4vDQorY3VzdG9tQnVpbGRDYWxsYmFja3M9Y3VzdG9tQnVpbGRDYWxsYmFja3MueG1sDQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2N1c3RvbUJ1aWxkQ2FsbGJhY2tzLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9jdXN0b21CdWlsZENhbGxiYWNrcy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI2NDU2ZgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9jdXN0b21CdWlsZENhbGxiYWNrcy54bWwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2phcnByb2Nlc3Nvci9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvamFycHJvY2Vzc29yL0NvbW1hbmRTdGVwLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvamFycHJvY2Vzc29yL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9qYXJwcm9jZXNzb3IvQ29tbWFuZFN0ZXAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWMxN2QzCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2phcnByb2Nlc3Nvci9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvamFycHJvY2Vzc29yL0NvbW1hbmRTdGVwLmphdmEKQEAgLTAsMCArMSw3MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuamFycHJvY2Vzc29yOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworCisvKioKKyAqIEBhdXRob3IgYW5pZWZlckBjYS5pYm0uY29tCisgKgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29tbWFuZFN0ZXAgaW1wbGVtZW50cyBJUHJvY2Vzc1N0ZXAgeworCXByb3RlY3RlZCBTdHJpbmcgY29tbWFuZCA9IG51bGw7CisJcHJvdGVjdGVkIFN0cmluZyBleHRlbnNpb24gPSBudWxsOworCXByaXZhdGUgIFByb3BlcnRpZXMgb3B0aW9ucyA9IG51bGw7CisJcHJvdGVjdGVkIGJvb2xlYW4gdmVyYm9zZSA9IGZhbHNlOworCQorCXB1YmxpYyBDb21tYW5kU3RlcChQcm9wZXJ0aWVzIG9wdGlvbnMsIFN0cmluZyBjb21tYW5kLCBTdHJpbmcgZXh0ZW5zaW9uLCBib29sZWFuIHZlcmJvc2UpIHsKKwkJdGhpcy5jb21tYW5kID0gY29tbWFuZDsKKwkJdGhpcy5leHRlbnNpb24gPSBleHRlbnNpb247CisJCXRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CisJCXRoaXMudmVyYm9zZSA9IHZlcmJvc2U7CisJfQorCisJcHJvdGVjdGVkIHN0YXRpYyBpbnQgZXhlY3V0ZShTdHJpbmdbXSBjbWQpIHsKKwkJcmV0dXJuIGV4ZWN1dGUoY21kLCBmYWxzZSk7CisJfQorCQorCXByb3RlY3RlZCBzdGF0aWMgaW50IGV4ZWN1dGUoU3RyaW5nW10gY21kLCBib29sZWFuIHZlcmJvc2UpIHsKKwkJUnVudGltZSBydW50aW1lID0gUnVudGltZS5nZXRSdW50aW1lKCk7CisJCVByb2Nlc3MgcHJvYyA9IG51bGw7CisJCXRyeSB7CisJCQlwcm9jID0gcnVudGltZS5leGVjKGNtZCk7CisJCQlTdHJlYW1Qcm9jZXNzb3IgZXJyb3JTdHJlYW1Qcm9jZXNzb3IgPSBuZXcgU3RyZWFtUHJvY2Vzc29yKHByb2MuZ2V0RXJyb3JTdHJlYW0oKSwgU3RyZWFtUHJvY2Vzc29yLlNUREVSUiwgdmVyYm9zZSk7IC8vJE5PTi1OTFMtMSQKKwkJCVN0cmVhbVByb2Nlc3NvciBvdXRwdXRTdHJlYW1Qcm9jZXNzb3IgPSBuZXcgU3RyZWFtUHJvY2Vzc29yKHByb2MuZ2V0SW5wdXRTdHJlYW0oKSwgU3RyZWFtUHJvY2Vzc29yLlNURE9VVCwgdmVyYm9zZSk7IC8vJE5PTi1OTFMtMSQKKwkJCWVycm9yU3RyZWFtUHJvY2Vzc29yLnN0YXJ0KCk7CisJCQlvdXRwdXRTdHJlYW1Qcm9jZXNzb3Iuc3RhcnQoKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCWlmKHZlcmJvc2UpIHsKKwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIGV4ZWN1dGluZyBjb21tYW5kICIgKyBVdGlscy5jb25jYXQoY21kKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJfQorCQkJcmV0dXJuIC0xOworCQl9CisJCXRyeSB7CisJCQlpbnQgcmVzdWx0ID0gcHJvYy53YWl0Rm9yKCk7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisJCQlpZih2ZXJib3NlKQorCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCX0KKwkJcmV0dXJuIC0xOworCX0KKwkKKwlwdWJsaWMgUHJvcGVydGllcyBnZXRPcHRpb25zKCkgeworCQlpZihvcHRpb25zID09IG51bGwpCisJCQlvcHRpb25zID0gbmV3IFByb3BlcnRpZXMoKTsKKwkJcmV0dXJuIG9wdGlvbnM7CisJfQorCQorCXB1YmxpYyB2b2lkIGFkanVzdEluZihGaWxlIGlucHV0LCBQcm9wZXJ0aWVzIGluZiwgTGlzdCBjb250YWluZXJzKSB7CisJCS8vbm90aGluZworCX0KK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9qYXJwcm9jZXNzb3Ivb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2phcnByb2Nlc3Nvci9JUHJvY2Vzc1N0ZXAuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9qYXJwcm9jZXNzb3Ivb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2phcnByb2Nlc3Nvci9JUHJvY2Vzc1N0ZXAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGM0MzhlCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2phcnByb2Nlc3Nvci9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvamFycHJvY2Vzc29yL0lQcm9jZXNzU3RlcC5qYXZhCkBAIC0wLDAgKzEsNjUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmphcnByb2Nlc3NvcjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworLyoqCisgKiBAYXV0aG9yIGFuaWVmZXJAY2EuaWJtLmNvbQorICoKKyAqLworcHVibGljIGludGVyZmFjZSBJUHJvY2Vzc1N0ZXAgeworCQorCS8qKgorCSAqIFRoZSBlZmZlY3Qgb2YgdGhpcyBwcm9jZXNzaW5nIHN0ZXAgaWYgdGhlIEphclByb2Nlc3NvciB3YXMgdG8gcmVjdXJzZSBvbiB0aGlzIGVudHJ5LgorCSAqIFJldHVybiBudWxsIGlmIHRoaXMgc3RlcCB3aWxsIG5vdCBkbyBhbnl0aGluZyB3aXRoIHRoaXMgZW50cnkuCisJICogUmV0dXJuIHRoZSBuZXcgZW50cnlOYW1lIGlmIHRoaXMgc3RlcCB3aWxsIG1vZGlmeSB0aGlzIGVudHJ5IG9uIHJlY3Vyc2lvbi4KKwkgKiBAcGFyYW0gZW50cnlOYW1lCisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBTdHJpbmcgcmVjdXJzaW9uRWZmZWN0KFN0cmluZyBlbnRyeU5hbWUpOworCQorCS8qKgorCSAqIFBlcmZvcm0gc29tZSBwcm9jZXNzaW5nIG9uIHRoZSBpbnB1dCBmaWxlIGJlZm9yZSB0aGUgSmFyUHJvY2Vzc29yIGNvbnNpZGVycyB0aGUgZW50cmllcyBmb3IgcmVjdXJzaW9uLgorCSAqICByZXR1cm4gdGhlIGZpbGUgY29udGFpbmluZyB0aGUgcmVzdWx0IG9mIHRoZSBwcm9jZXNzaW5nCisJICogQHBhcmFtIGlucHV0CisJICogQHBhcmFtIHdvcmtpbmdEaXJlY3RvcnkKKwkgKiBAcGFyYW0gY29udGFpbmVyczogaW5mIHByb3BlcnRpZXMgZm9yIGNvbnRhaW5pbmcgamFycywgaW5uZXJtb3N0IGphciBpcyBmaXJzdCBvbiB0aGUgbGlzdAorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgRmlsZSBwcmVQcm9jZXNzKEZpbGUgaW5wdXQsIEZpbGUgd29ya2luZ0RpcmVjdG9yeSwgTGlzdCBjb250YWluZXJzKTsKKwkKKwkvKioKKwkgKiBQZXJmb3JtIHNvbWUgcHJvY2Vzc2luZyBvbiB0aGUgaW5wdXQgZmlsZSBhZnRlciB0aGUgSmFyUHJvY2Vzc29yIHJldHVybnMgZnJvbSByZWN1cnNpb24KKwkgKiByZXR1cm4gdGhlIGZpbGUgY29udGFpbmluZyB0aGUgcmVzdWx0IG9mIHRoZSBwcm9jZXNzaW5nCisJICogQHBhcmFtIGlucHV0CisJICogQHBhcmFtIHdvcmtpbmdEaXJlY3RvcnkKKwkgKiBAcGFyYW0gY29udGFpbmVyczogaW5mIHByb3BlcnRpZXMgZm9yIGNvbnRhaW5pbmcgamFycywgaW5uZXJtb3N0IGphciBpcyBmaXJzdCBvbiB0aGUgbGlzdAorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgRmlsZSBwb3N0UHJvY2VzcyhGaWxlIGlucHV0LCBGaWxlIHdvcmtpbmdEaXJlY3RvcnksIExpc3QgY29udGFpbmVycyk7CisJCisJLyoqCisJICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoaXMgcHJvY2VzcyBzdGVwCisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0U3RlcE5hbWUoKTsKKworCS8qKgorCSAqIEFkanVzdCBhbnkgcHJvcGVydGllcyBpbiB0aGUgZWNsaXBzZS5pbmYgYXMgYXBwcm9wcmlhdGUgZm9yIHRoaXMgc3RlcAorCSAqIEBwYXJhbSBpbnB1dAorCSAqIEBwYXJhbSBpbmYKKwkgKiBAcGFyYW0gY29udGFpbmVyczogaW5mIHByb3BlcnRpZXMgZm9yIGNvbnRhaW5pbmcgamFycywgaW5uZXJtb3N0IGphciBpcyBmaXJzdCBvbiB0aGUgbGlzdAorCSAqLworCXB1YmxpYyB2b2lkIGFkanVzdEluZihGaWxlIGlucHV0LCBQcm9wZXJ0aWVzIGluZiwgTGlzdCBjb250YWluZXJzKTsKK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9qYXJwcm9jZXNzb3Ivb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2phcnByb2Nlc3Nvci9KYXJQcm9jZXNzb3IuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9qYXJwcm9jZXNzb3Ivb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2phcnByb2Nlc3Nvci9KYXJQcm9jZXNzb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWYzNzA0Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2phcnByb2Nlc3Nvci9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvamFycHJvY2Vzc29yL0phclByb2Nlc3Nvci5qYXZhCkBAIC0wLDAgKzEsMzkzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5qYXJwcm9jZXNzb3I7CisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLmphci4qOworCisvKioKKyAqIEBhdXRob3IgYW5pZWZlckBjYS5pYm0uY29tCisgKgorICovCitwdWJsaWMgY2xhc3MgSmFyUHJvY2Vzc29yIHsKKwlwcml2YXRlIExpc3Qgc3RlcHMgPSBuZXcgQXJyYXlMaXN0KCk7CisJcHJpdmF0ZSBTdHJpbmcgd29ya2luZ0RpcmVjdG9yeSA9ICIiOyAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBpbnQgZGVwdGggPSAtMTsKKwlwcml2YXRlIGJvb2xlYW4gdmVyYm9zZSA9IGZhbHNlOworCXByaXZhdGUgYm9vbGVhbiBwcm9jZXNzQWxsID0gZmFsc2U7CisJcHJpdmF0ZSBMaW5rZWRMaXN0IGNvbnRhaW5pbmdJbmZzID0gbmV3IExpbmtlZExpc3QoKTsKKworCXN0YXRpYyBwdWJsaWMgSmFyUHJvY2Vzc29yIGdldFVucGFja1Byb2Nlc3NvcihQcm9wZXJ0aWVzIHByb3BlcnRpZXMpIHsKKwkJaWYgKCFjYW5QZXJmb3JtVW5wYWNrKCkpCisJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwkJSmFyUHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBKYXJQcm9jZXNzb3IoKTsKKwkJcHJvY2Vzc29yLmFkZFByb2Nlc3NTdGVwKG5ldyBVbnBhY2tTdGVwKHByb3BlcnRpZXMpKTsKKwkJcmV0dXJuIHByb2Nlc3NvcjsKKwl9CisKKwlzdGF0aWMgcHVibGljIEphclByb2Nlc3NvciBnZXRQYWNrUHJvY2Vzc29yKFByb3BlcnRpZXMgcHJvcGVydGllcykgeworCQlpZiAoIWNhblBlcmZvcm1QYWNrKCkpCisJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwkJSmFyUHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBKYXJQcm9jZXNzb3IoKTsKKwkJcHJvY2Vzc29yLmFkZFByb2Nlc3NTdGVwKG5ldyBQYWNrU3RlcChwcm9wZXJ0aWVzKSk7CisJCXJldHVybiBwcm9jZXNzb3I7CisJfQorCisJc3RhdGljIHB1YmxpYyBib29sZWFuIGNhblBlcmZvcm1QYWNrKCkgeworCQlyZXR1cm4gUGFja1N0ZXAuY2FuUGFjaygpOworCX0KKworCXN0YXRpYyBwdWJsaWMgYm9vbGVhbiBjYW5QZXJmb3JtVW5wYWNrKCkgeworCQlyZXR1cm4gVW5wYWNrU3RlcC5jYW5VbnBhY2soKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFdvcmtpbmdEaXJlY3RvcnkoKSB7CisJCXJldHVybiB3b3JraW5nRGlyZWN0b3J5OworCX0KKworCXB1YmxpYyB2b2lkIHNldFdvcmtpbmdEaXJlY3RvcnkoU3RyaW5nIGRpcikgeworCQlpZihkaXIgIT0gbnVsbCkKKwkJCXdvcmtpbmdEaXJlY3RvcnkgPSBkaXI7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldFZlcmJvc2UoYm9vbGVhbiB2ZXJib3NlKSB7CisJCXRoaXMudmVyYm9zZSA9IHZlcmJvc2U7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldFByb2Nlc3NBbGwoYm9vbGVhbiBhbGwpeworCQl0aGlzLnByb2Nlc3NBbGwgPSBhbGw7CisJfQorCisJcHVibGljIHZvaWQgYWRkUHJvY2Vzc1N0ZXAoSVByb2Nlc3NTdGVwIHN0ZXApIHsKKwkJc3RlcHMuYWRkKHN0ZXApOworCX0KKworCXB1YmxpYyB2b2lkIGNsZWFyUHJvY2Vzc1N0ZXBzKCkgeworCQlzdGVwcy5jbGVhcigpOworCX0KKworCS8qKgorCSAqIFJlY3JlYXRlIGEgamFyIGZpbGUuICBUaGUgcmVwbGFjZW1lbnRzIG1hcCBzcGVjaWZpZXMgZW50cnkgbmFtZXMgdG8gYmUgcmVwbGFjZWQsIHRoZSByZXBsYWNlbWVudHMgYXJlCisJICogZXhwZWN0ZWQgdG8gYmUgZm91bmQgaW4gZGlyZWN0b3J5LgorCSAqIAorCSAqIEBwYXJhbSBqYXIgLSBUaGUgaW5wdXQgamFyCisJICogQHBhcmFtIG91dHB1dEphciAtIHRoZSBvdXRwdXQKKwkgKiBAcGFyYW0gcmVwbGFjZW1lbnRzIC0gbWFwIG9mIGVudHJ5TmFtZSAtPiBuZXcgZW50cnlOYW1lCisJICogQHBhcmFtIGRpcmVjdG9yeSAtIGxvY2F0aW9uIHRvIGZpbmQgZmlsZSBmb3IgbmV3IGVudHJ5TmFtZQorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKwkgKi8KKwlwcml2YXRlIHZvaWQgcmVjcmVhdGVKYXIoSmFyRmlsZSBqYXIsIEphck91dHB1dFN0cmVhbSBvdXRwdXRKYXIsIE1hcCByZXBsYWNlbWVudHMsIEZpbGUgZGlyZWN0b3J5LCBQcm9wZXJ0aWVzIGluZikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJSW5wdXRTdHJlYW0gaW4gPSBudWxsOworCQlib29sZWFuIG1hcmtlZCA9IGZhbHNlOworCQl0cnkgeworCQkJRW51bWVyYXRpb24gZW50cmllcyA9IGphci5lbnRyaWVzKCk7CisJCQlmb3IgKEphckVudHJ5IGVudHJ5ID0gKEphckVudHJ5KSBlbnRyaWVzLm5leHRFbGVtZW50KCk7IGVudHJ5ICE9IG51bGw7IGVudHJ5ID0gZW50cmllcy5oYXNNb3JlRWxlbWVudHMoKSA/IChKYXJFbnRyeSkgZW50cmllcy5uZXh0RWxlbWVudCgpIDogbnVsbCkgeworCQkJCUZpbGUgcmVwbGFjZW1lbnQgPSBudWxsOworCQkJCUphckVudHJ5IG5ld0VudHJ5ID0gbnVsbDsKKwkJCQlpZiAocmVwbGFjZW1lbnRzLmNvbnRhaW5zS2V5KGVudHJ5LmdldE5hbWUoKSkpIHsKKwkJCQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSByZXBsYWNlbWVudHMuZ2V0KGVudHJ5LmdldE5hbWUoKSk7CisJCQkJCXJlcGxhY2VtZW50ID0gbmV3IEZpbGUoZGlyZWN0b3J5LCBuYW1lKTsKKwkJCQkJaWYgKG5hbWUgIT0gbnVsbCkgeworCQkJCQkJaWYgKHJlcGxhY2VtZW50LmV4aXN0cygpKSB7CisJCQkJCQkJdHJ5IHsKKwkJCQkJCQkJaW4gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKHJlcGxhY2VtZW50KSk7CisJCQkJCQkJCW5ld0VudHJ5ID0gbmV3IEphckVudHJ5KG5hbWUpOworCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJCQkJCWlmICh2ZXJib3NlKSB7CisJCQkJCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJXYXJuaW5nOiBQcm9ibGVtIHJlYWRpbmcgIiArcmVwbGFjZW1lbnQuZ2V0UGF0aCgpICsgIiwgdXNpbmcgIiArIGphci5nZXROYW1lKCkgKyBGaWxlLnNlcGFyYXRvciArIGVudHJ5LmdldE5hbWUoKSAgKyAiIGluc3RlYWQuIik7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQl9IGVsc2UgaWYgKHZlcmJvc2UpIHsKKwkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIldhcm5pbmc6ICIgKyByZXBsYWNlbWVudC5nZXRQYXRoKCkgKyAiIG5vdCBmb3VuZCwgdXNpbmcgIiArIGphci5nZXROYW1lKCkgKyBGaWxlLnNlcGFyYXRvciArIGVudHJ5LmdldE5hbWUoKSArICIgaW5zdGVhZC4iKTsJCisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKG5ld0VudHJ5ID09IG51bGwpIHsKKwkJCQkJdHJ5IHsKKwkJCQkJCWluID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oamFyLmdldElucHV0U3RyZWFtKGVudHJ5KSk7CisJCQkJCQluZXdFbnRyeSA9IG5ldyBKYXJFbnRyeShlbnRyeS5nZXROYW1lKCkpOworCQkJCQl9IGNhdGNoKCBFeGNlcHRpb24gZSApIHsKKwkJCQkJCWlmKHZlcmJvc2UpIHsKKwkJCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRVJST1I6IHByb2JsZW0gcmVhZGluZyAiICsgZW50cnkuZ2V0TmFtZSgpICsgIiBmcm9tICIgKyBqYXIuZ2V0TmFtZSgpKTsKKwkJCQkJCX0KKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisJCQkJfQorCQkJCW5ld0VudHJ5LnNldFRpbWUoZW50cnkuZ2V0VGltZSgpKTsKKwkJCQlvdXRwdXRKYXIucHV0TmV4dEVudHJ5KG5ld0VudHJ5KTsKKwkJCQlpZiAoZW50cnkuZ2V0TmFtZSgpLmVxdWFscyhVdGlscy5NQVJLX0ZJTEVfTkFNRSkpIHsKKwkJCQkJLy9UaGUgZWNsaXBzZS5pbmYgZmlsZSB3YXMgcmVhZCBpbiBlYXJsaWVyLCBkb24ndCBuZWVkIHRvIHJlcmVhZCBpdCwganVzdCB3cml0ZSBpdCBvdXQgbm93CisJCQkJCVV0aWxzLnN0b3JlUHJvcGVydGllcyhpbmYsIG91dHB1dEphcik7CisJCQkJCW1hcmtlZCA9IHRydWU7CisJCQkJfSBlbHNlIHsKKwkJCQkJVXRpbHMudHJhbnNmZXJTdHJlYW1zKGluLCBvdXRwdXRKYXIsIGZhbHNlKTsKKwkJCQl9CisJCQkJb3V0cHV0SmFyLmNsb3NlRW50cnkoKTsKKwkJCQlpbi5jbG9zZSgpOworCisJCQkJLy9kZWxldGUgdGhlIG5lc3RlZCBqYXIgZmlsZQorCQkJCWlmIChyZXBsYWNlbWVudCAhPSBudWxsKSB7CisJCQkJCXJlcGxhY2VtZW50LmRlbGV0ZSgpOworCQkJCX0KKwkJCX0KKwkJCWlmICghbWFya2VkKSB7CisJCQkJSmFyRW50cnkgZW50cnkgPSBuZXcgSmFyRW50cnkoVXRpbHMuTUFSS19GSUxFX05BTUUpOworCQkJCW91dHB1dEphci5wdXROZXh0RW50cnkoZW50cnkpOworCQkJCVV0aWxzLnN0b3JlUHJvcGVydGllcyhpbmYsIG91dHB1dEphcik7CisJCQkJb3V0cHV0SmFyLmNsb3NlRW50cnkoKTsKKwkJCX0KKwkJfSBmaW5hbGx5IHsKKwkJCVV0aWxzLmNsb3NlKG91dHB1dEphcik7CisJCQlVdGlscy5jbG9zZShqYXIpOworCQkJVXRpbHMuY2xvc2UoaW4pOworCQl9CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgcmVjdXJzaW9uRWZmZWN0KFN0cmluZyBlbnRyeU5hbWUpIHsKKwkJU3RyaW5nIHJlc3VsdCA9IG51bGw7CisJCWZvciAoSXRlcmF0b3IgaXRlciA9IHN0ZXBzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworCQkJSVByb2Nlc3NTdGVwIHN0ZXAgPSAoSVByb2Nlc3NTdGVwKSBpdGVyLm5leHQoKTsKKworCQkJcmVzdWx0ID0gc3RlcC5yZWN1cnNpb25FZmZlY3QoZW50cnlOYW1lKTsKKwkJCWlmIChyZXN1bHQgIT0gbnVsbCkKKwkJCQllbnRyeU5hbWUgPSByZXN1bHQ7CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlwcml2YXRlIHZvaWQgZXh0cmFjdEVudHJpZXMoSmFyRmlsZSBqYXIsIEZpbGUgdGVtcERpciwgTWFwIGRhdGEsIFByb3BlcnRpZXMgaW5mKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlpZihpbmYgIT0gbnVsbCApIHsKKwkJCS8vc2tpcCBpZiBleGNsdWRpbmcgY2hpbGRyZW4KKwkJCWlmKGluZi5jb250YWluc0tleShVdGlscy5NQVJLX0VYQ0xVREVfQ0hJTERSRU4pKXsKKwkJCQlTdHJpbmcgZXhjbHVkZUNoaWxkcmVuID0gaW5mLmdldFByb3BlcnR5KFV0aWxzLk1BUktfRVhDTFVERV9DSElMRFJFTik7CisJCQkJaWYoIEJvb2xlYW4udmFsdWVPZihleGNsdWRlQ2hpbGRyZW4pLmJvb2xlYW5WYWx1ZSgpICkKKwkJCQkJaWYodmVyYm9zZSl7CisJCQkJCQlmb3IoaW50IGkgPSAwOyBpIDw9IGRlcHRoOyBpKyspCisJCQkJCQkJU3lzdGVtLm91dC5wcmludCgiICAiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJDaGlsZHJlbiBvZiAiICsgamFyLmdldE5hbWUoKSArICJhcmUgZXhjbHVkZWQgZnJvbSBwcm9jZXNzaW5nLiIpOworCQkJCQl9CisJCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCQkKKwkJRW51bWVyYXRpb24gZW50cmllcyA9IGphci5lbnRyaWVzKCk7CisJCWlmIChlbnRyaWVzLmhhc01vcmVFbGVtZW50cygpKSB7CisJCQlmb3IgKEphckVudHJ5IGVudHJ5ID0gKEphckVudHJ5KSBlbnRyaWVzLm5leHRFbGVtZW50KCk7IGVudHJ5ICE9IG51bGw7IGVudHJ5ID0gZW50cmllcy5oYXNNb3JlRWxlbWVudHMoKSA/IChKYXJFbnRyeSkgZW50cmllcy5uZXh0RWxlbWVudCgpIDogbnVsbCkgeworCQkJCVN0cmluZyBuYW1lID0gZW50cnkuZ2V0TmFtZSgpOworCQkJCVN0cmluZyBuZXdOYW1lID0gcmVjdXJzaW9uRWZmZWN0KG5hbWUpOworCQkJCWlmIChuZXdOYW1lICE9IG51bGwpIHsKKwkJCQkJaWYodmVyYm9zZSl7CisJCQkJCQlmb3IoaW50IGkgPSAwOyBpIDw9IGRlcHRoOyBpKyspCisJCQkJCQkJU3lzdGVtLm91dC5wcmludCgiICAiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJQcm9jZXNzaW5nIG5lc3RlZCBmaWxlOiAiICsgbmFtZSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJfQorCQkJCQkvL2V4dHJhY3QgZW50cnkgdG8gdGVtcCBkaXJlY3RvcnkKKwkJCQkJRmlsZSBleHRyYWN0ZWQgPSBuZXcgRmlsZSh0ZW1wRGlyLCBuYW1lKTsKKwkJCQkJRmlsZSBwYXJlbnREaXIgPSBleHRyYWN0ZWQuZ2V0UGFyZW50RmlsZSgpOworCQkJCQlpZiAoIXBhcmVudERpci5leGlzdHMoKSkKKwkJCQkJCXBhcmVudERpci5ta2RpcnMoKTsKKworCQkJCQlJbnB1dFN0cmVhbSBpbiA9IG51bGw7CisJCQkJCU91dHB1dFN0cmVhbSBvdXQgPSBudWxsOworCQkJCQl0cnkgeworCQkJCQkJaW4gPSBqYXIuZ2V0SW5wdXRTdHJlYW0oZW50cnkpOworCQkJCQkJb3V0ID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGV4dHJhY3RlZCkpOworCQkJCQkJVXRpbHMudHJhbnNmZXJTdHJlYW1zKGluLCBvdXQsIHRydWUpOyAvL3RoaXMgd2lsbCBjbG9zZSBib3RoIHN0cmVhbXMKKwkJCQkJfSBmaW5hbGx5IHsKKwkJCQkJCVV0aWxzLmNsb3NlKGluKTsKKwkJCQkJCVV0aWxzLmNsb3NlKG91dCk7CisJCQkJCX0KKwkJCQkJZXh0cmFjdGVkLnNldExhc3RNb2RpZmllZChlbnRyeS5nZXRUaW1lKCkpOworCisJCQkJCS8vcmVjdXJzZQorCQkJCQljb250YWluaW5nSW5mcy5hZGRGaXJzdChpbmYpOworCQkJCQlTdHJpbmcgZGlyID0gZ2V0V29ya2luZ0RpcmVjdG9yeSgpOworCQkJCQlzZXRXb3JraW5nRGlyZWN0b3J5KHBhcmVudERpci5nZXRDYW5vbmljYWxQYXRoKCkpOworCQkJCQlGaWxlIHJlc3VsdCA9IHByb2Nlc3NKYXIoZXh0cmFjdGVkKTsKKworCQkJCQluZXdOYW1lID0gbmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5sZW5ndGgoKSAtIGV4dHJhY3RlZC5nZXROYW1lKCkubGVuZ3RoKCkpICsgcmVzdWx0LmdldE5hbWUoKTsKKwkJCQkJZGF0YS5wdXQobmFtZSwgbmV3TmFtZSk7CisKKwkJCQkJc2V0V29ya2luZ0RpcmVjdG9yeShkaXIpOworCQkJCQljb250YWluaW5nSW5mcy5yZW1vdmVGaXJzdCgpOworCisJCQkJCS8vZGVsZXRlIHRoZSBleHRyYWN0ZWQgaXRlbSBsZWF2aW5nIHRoZSByZWN1cnNpb24gcmVzdWx0CisJCQkJCWlmICghbmFtZS5lcXVhbHMobmV3TmFtZSkpCisJCQkJCQlleHRyYWN0ZWQuZGVsZXRlKCk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcHJpdmF0ZSBGaWxlIHByZVByb2Nlc3MoRmlsZSBpbnB1dCwgRmlsZSB0ZW1wRGlyKSB7CisJCUZpbGUgcmVzdWx0ID0gbnVsbDsKKwkJZm9yIChJdGVyYXRvciBpdGVyID0gc3RlcHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisJCQlJUHJvY2Vzc1N0ZXAgc3RlcCA9IChJUHJvY2Vzc1N0ZXApIGl0ZXIubmV4dCgpOworCQkJcmVzdWx0ID0gc3RlcC5wcmVQcm9jZXNzKGlucHV0LCB0ZW1wRGlyLCBjb250YWluaW5nSW5mcyk7CisJCQlpZiAocmVzdWx0ICE9IG51bGwpCisJCQkJaW5wdXQgPSByZXN1bHQ7CisJCX0KKwkJcmV0dXJuIGlucHV0OworCX0KKworCXByaXZhdGUgRmlsZSBwb3N0UHJvY2VzcyhGaWxlIGlucHV0LCBGaWxlIHRlbXBEaXIpIHsKKwkJRmlsZSByZXN1bHQgPSBudWxsOworCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzdGVwcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKwkJCUlQcm9jZXNzU3RlcCBzdGVwID0gKElQcm9jZXNzU3RlcCkgaXRlci5uZXh0KCk7CisJCQlyZXN1bHQgPSBzdGVwLnBvc3RQcm9jZXNzKGlucHV0LCB0ZW1wRGlyLCBjb250YWluaW5nSW5mcyk7CisJCQlpZiAocmVzdWx0ICE9IG51bGwpCisJCQkJaW5wdXQgPSByZXN1bHQ7CisJCX0KKwkJcmV0dXJuIGlucHV0OworCX0KKworCXByaXZhdGUgdm9pZCBhZGp1c3RJbmYoRmlsZSBpbnB1dCwgUHJvcGVydGllcyBpbmYpIHsKKwkJZm9yIChJdGVyYXRvciBpdGVyID0gc3RlcHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisJCQlJUHJvY2Vzc1N0ZXAgc3RlcCA9IChJUHJvY2Vzc1N0ZXApIGl0ZXIubmV4dCgpOworCQkJc3RlcC5hZGp1c3RJbmYoaW5wdXQsIGluZiwgY29udGFpbmluZ0luZnMpOworCQl9CisJfQorCisJcHVibGljIEZpbGUgcHJvY2Vzc0phcihGaWxlIGlucHV0KSB0aHJvd3MgSU9FeGNlcHRpb24geworCQkrK2RlcHRoOworCQlsb25nIGxhc3RNb2RpZmllZCA9IGlucHV0Lmxhc3RNb2RpZmllZCgpOworCQlGaWxlIHdvcmtpbmdEaXIgPSBuZXcgRmlsZShnZXRXb3JraW5nRGlyZWN0b3J5KCkpOworCQlpZiAoIXdvcmtpbmdEaXIuZXhpc3RzKCkpCisJCQl3b3JraW5nRGlyLm1rZGlycygpOworCisJCWJvb2xlYW4gc2tpcCA9IFV0aWxzLnNob3VsZFNraXBKYXIoaW5wdXQsIHByb2Nlc3NBbGwsIHZlcmJvc2UpOworCQlpZiAoZGVwdGggPT0gMCAmJiB2ZXJib3NlKSB7CisJCQlpZiAoc2tpcCkKKwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNraXBwaW5nICIgKyBpbnB1dC5nZXRQYXRoKCkpOyAvLyROT04tTkxTLTEkCisJCQllbHNlIHsKKwkJCQlTeXN0ZW0ub3V0LnByaW50KCJSdW5uaW5nICIpOyAvLyROT04tTkxTLTEkIAorCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHN0ZXBzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworCQkJCQlJUHJvY2Vzc1N0ZXAgc3RlcCA9IChJUHJvY2Vzc1N0ZXApIGl0ZXIubmV4dCgpOworCQkJCQlTeXN0ZW0ub3V0LnByaW50KHN0ZXAuZ2V0U3RlcE5hbWUoKSArICIgIik7IC8vJE5PTi1OTFMtMSQKKwkJCQl9CisJCQkJU3lzdGVtLm91dC5wcmludGxuKCJvbiAiICsgaW5wdXQuZ2V0UGF0aCgpKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQl9CisKKwkJaWYgKHNraXApIHsKKwkJCS8vVGhpcyBqYXIgd2FzIG5vdCBtYXJrZWQgYXMgY29uZGl0aW9uZWQsIGFuZCB3ZSBhcmUgb25seSBwcm9jZXNzaW5nIGNvbmRpdGlvbmVkIGphcnMsIHNvIGRvIG5vdGhpbmcKKwkJCS0tZGVwdGg7CisJCQlyZXR1cm4gaW5wdXQ7CisJCX0KKworCQkvL3ByZQorCQlGaWxlIHdvcmtpbmdGaWxlID0gcHJlUHJvY2VzcyhpbnB1dCwgd29ya2luZ0Rpcik7CisKKwkJLy9FeHRyYWN0IGVudHJpZXMgZnJvbSBqYXIgYW5kIHJlY3Vyc2Ugb24gdGhlbQorCQlGaWxlIHRlbXBEaXIgPSBudWxsOworCQlpZiAoZGVwdGggPT0gMCkgeworCQkJdGVtcERpciA9IG5ldyBGaWxlKHdvcmtpbmdEaXIsICJ0ZW1wLiIgKyB3b3JraW5nRmlsZS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCisJCX0gZWxzZSB7CisJCQlGaWxlIHBhcmVudCA9IHdvcmtpbmdEaXIuZ2V0UGFyZW50RmlsZSgpOworCQkJdGVtcERpciA9IG5ldyBGaWxlKHBhcmVudCwgInRlbXBfIiArIGRlcHRoICsgJ18nICsgd29ya2luZ0ZpbGUuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAorCQl9CisKKwkJSmFyRmlsZSBqYXIgPSBuZXcgSmFyRmlsZSh3b3JraW5nRmlsZSwgZmFsc2UpOworCQlNYXAgcmVwbGFjZW1lbnRzID0gbmV3IEhhc2hNYXAoKTsKKwkJUHJvcGVydGllcyBpbmYgPSBVdGlscy5nZXRFY2xpcHNlSW5mKHdvcmtpbmdGaWxlLCB2ZXJib3NlKTsKKwkJZXh0cmFjdEVudHJpZXMoamFyLCB0ZW1wRGlyLCByZXBsYWNlbWVudHMsIGluZik7CisKKwkJaWYgKGluZiAhPSBudWxsKQorCQkJYWRqdXN0SW5mKHdvcmtpbmdGaWxlLCBpbmYpOworCisJCS8vUmVjcmVhdGUgdGhlIGphciB3aXRoIHJlcGxhY2VtZW50cy4gCisJCS8vVE9ETzogVGhpcyBpcyBub3Qgc3RyaWN0bHkgbmVjZXNzYXJ5IGlmIHdlIGRpZG4ndCBjaGFuZ2UgdGhlIGluZiBmaWxlIGFuZCBkaWRuJ3QgY2hhbmdlIGFueSBjb250ZW50CisJCUZpbGUgdGVtcEphciA9IG51bGw7CisJCXRlbXBKYXIgPSBuZXcgRmlsZSh0ZW1wRGlyLCB3b3JraW5nRmlsZS5nZXROYW1lKCkpOworCQlGaWxlIHBhcmVudCA9IHRlbXBKYXIuZ2V0UGFyZW50RmlsZSgpOworCQlpZiAoIXBhcmVudC5leGlzdHMoKSkKKwkJCXBhcmVudC5ta2RpcnMoKTsKKwkJSmFyT3V0cHV0U3RyZWFtIGphck91dCA9IG5ldyBKYXJPdXRwdXRTdHJlYW0obmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRlbXBKYXIpKSk7CisJCXJlY3JlYXRlSmFyKGphciwgamFyT3V0LCByZXBsYWNlbWVudHMsIHRlbXBEaXIsIGluZik7CisKKwkJamFyLmNsb3NlKCk7CisJCWlmICh0ZW1wSmFyICE9IG51bGwpIHsKKwkJCWlmICghd29ya2luZ0ZpbGUuZXF1YWxzKGlucHV0KSkgeworCQkJCXdvcmtpbmdGaWxlLmRlbGV0ZSgpOworCQkJfQorCQkJd29ya2luZ0ZpbGUgPSB0ZW1wSmFyOworCQl9CisKKwkJLy9wb3N0CisJCUZpbGUgcmVzdWx0ID0gcG9zdFByb2Nlc3Mod29ya2luZ0ZpbGUsIHdvcmtpbmdEaXIpOworCQkKKwkJLy9oYXZlIHRvIG5vcm1hbGl6ZSBhZnRlciB0aGUgcG9zdCBzdGVwcworCQlub3JtYWxpemUocmVzdWx0LCB3b3JraW5nRGlyKTsKKwkJCisJCWlmICghcmVzdWx0LmVxdWFscyh3b3JraW5nRmlsZSkgJiYgIXdvcmtpbmdGaWxlLmVxdWFscyhpbnB1dCkpCisJCQl3b3JraW5nRmlsZS5kZWxldGUoKTsKKwkJaWYgKCFyZXN1bHQuZ2V0UGFyZW50RmlsZSgpLmVxdWFscyh3b3JraW5nRGlyKSkgeworCQkJRmlsZSBmaW5hbEZpbGUgPSBuZXcgRmlsZSh3b3JraW5nRGlyLCByZXN1bHQuZ2V0TmFtZSgpKTsKKwkJCWlmIChmaW5hbEZpbGUuZXhpc3RzKCkpCisJCQkJZmluYWxGaWxlLmRlbGV0ZSgpOworCQkJcmVzdWx0LnJlbmFtZVRvKGZpbmFsRmlsZSk7CisJCQlyZXN1bHQgPSBmaW5hbEZpbGU7CisJCX0KKworCQlpZiAodGVtcERpci5leGlzdHMoKSkKKwkJCVV0aWxzLmNsZWFyKHRlbXBEaXIpOworCisJCXJlc3VsdC5zZXRMYXN0TW9kaWZpZWQobGFzdE1vZGlmaWVkKTsKKwkJLS1kZXB0aDsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIG5vcm1hbGl6ZShGaWxlIGlucHV0LCBGaWxlIHdvcmtpbmdEaXJlY3RvcnkpIHsKKwkJaWYoaW5wdXQuZ2V0TmFtZSgpLmVuZHNXaXRoKFV0aWxzLlBBQ0tFRF9TVUZGSVgpKSB7CisJCQkvL25vdCBhIGphcgorCQkJcmV0dXJuOworCQl9CisJCXRyeSB7CisJCQlGaWxlIHRlbXBKYXIgPSBuZXcgRmlsZSh3b3JraW5nRGlyZWN0b3J5LCAidGVtcF8iICsgaW5wdXQuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAorCQkJSmFyRmlsZSBqYXIgPSBudWxsOworCQkJdHJ5IHsKKwkJCQlqYXIgPSBuZXcgSmFyRmlsZShpbnB1dCwgZmFsc2UpOworCQkJfSBjYXRjaCAoSmFyRXhjZXB0aW9uIGUpIHsKKwkJCQkvL25vdCBhIGphcgorCQkJCXJldHVybiA7CisJCQl9CisJCQlKYXJPdXRwdXRTdHJlYW0gamFyT3V0ID0gbmV3IEphck91dHB1dFN0cmVhbShuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0odGVtcEphcikpKTsKKwkJCUlucHV0U3RyZWFtIGluID0gbnVsbDsKKwkJCXRyeSB7CisJCQkJRW51bWVyYXRpb24gZW50cmllcyA9IGphci5lbnRyaWVzKCk7CisJCQkJZm9yIChKYXJFbnRyeSBlbnRyeSA9IChKYXJFbnRyeSkgZW50cmllcy5uZXh0RWxlbWVudCgpOyBlbnRyeSAhPSBudWxsOyBlbnRyeSA9IGVudHJpZXMuaGFzTW9yZUVsZW1lbnRzKCkgPyAoSmFyRW50cnkpIGVudHJpZXMubmV4dEVsZW1lbnQoKSA6IG51bGwpIHsKKwkJCQkJSmFyRW50cnkgbmV3RW50cnkgPSBuZXcgSmFyRW50cnkoZW50cnkuZ2V0TmFtZSgpKTsKKwkJCQkJbmV3RW50cnkuc2V0VGltZShlbnRyeS5nZXRUaW1lKCkpOworCQkJCQlpbiA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGphci5nZXRJbnB1dFN0cmVhbShlbnRyeSkpOworCQkJCQlqYXJPdXQucHV0TmV4dEVudHJ5KG5ld0VudHJ5KTsKKwkJCQkJVXRpbHMudHJhbnNmZXJTdHJlYW1zKGluLCBqYXJPdXQsIGZhbHNlKTsKKwkJCQkJamFyT3V0LmNsb3NlRW50cnkoKTsKKwkJCQkJaW4uY2xvc2UoKTsKKwkJCQl9CisJCQl9IGZpbmFsbHkgeworCQkJCVV0aWxzLmNsb3NlKGphck91dCk7CisJCQkJVXRpbHMuY2xvc2UoamFyKTsKKwkJCQlVdGlscy5jbG9zZShpbik7CisJCQl9CisJCQl0ZW1wSmFyLnNldExhc3RNb2RpZmllZChpbnB1dC5sYXN0TW9kaWZpZWQoKSk7CisJCQlpbnB1dC5kZWxldGUoKTsKKwkJCXRlbXBKYXIucmVuYW1lVG8oaW5wdXQpOworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQlpZiAodmVyYm9zZSkgeworCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igbm9ybWFsaXppbmcgamFyICIgKyBpbnB1dC5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCisJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCX0KKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9qYXJwcm9jZXNzb3Ivb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2phcnByb2Nlc3Nvci9KYXJQcm9jZXNzb3JFeGVjdXRvci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2phcnByb2Nlc3Nvci9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvamFycHJvY2Vzc29yL0phclByb2Nlc3NvckV4ZWN1dG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYwNzg1ZAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9qYXJwcm9jZXNzb3Ivb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2phcnByb2Nlc3Nvci9KYXJQcm9jZXNzb3JFeGVjdXRvci5qYXZhCkBAIC0wLDAgKzEsMTQwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmphcnByb2Nlc3NvcjsKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLlppcEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuamFycHJvY2Vzc29yLk1haW4uT3B0aW9uczsKKworcHVibGljIGNsYXNzIEphclByb2Nlc3NvckV4ZWN1dG9yIHsKKwlwdWJsaWMgdm9pZCBydW5KYXJQcm9jZXNzb3IoT3B0aW9ucyBvcHRpb25zKSB7CisJCWlmIChvcHRpb25zLmlucHV0LmlzRmlsZSgpICYmIG9wdGlvbnMuaW5wdXQuZ2V0TmFtZSgpLmVuZHNXaXRoKCIuemlwIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJWmlwUHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBaaXBQcm9jZXNzb3IoKTsKKwkJCXByb2Nlc3Nvci5zZXRXb3JraW5nRGlyZWN0b3J5KG9wdGlvbnMub3V0cHV0RGlyKTsKKwkJCXByb2Nlc3Nvci5zZXRTaWduQ29tbWFuZChvcHRpb25zLnNpZ25Db21tYW5kKTsKKwkJCXByb2Nlc3Nvci5zZXRQYWNrKG9wdGlvbnMucGFjayk7CisJCQlwcm9jZXNzb3Iuc2V0UmVwYWNrKG9wdGlvbnMucmVwYWNrIHx8IChvcHRpb25zLnBhY2sgJiYgb3B0aW9ucy5zaWduQ29tbWFuZCAhPSBudWxsKSk7CisJCQlwcm9jZXNzb3Iuc2V0VW5wYWNrKG9wdGlvbnMudW5wYWNrKTsKKwkJCXByb2Nlc3Nvci5zZXRWZXJib3NlKG9wdGlvbnMudmVyYm9zZSk7CisJCQlwcm9jZXNzb3Iuc2V0UHJvY2Vzc0FsbChvcHRpb25zLnByb2Nlc3NBbGwpOworCQkJdHJ5IHsKKwkJCQlwcm9jZXNzb3IucHJvY2Vzc1ppcChvcHRpb25zLmlucHV0KTsKKwkJCX0gY2F0Y2ggKFppcEV4Y2VwdGlvbiBlKSB7CisJCQkJaWYgKG9wdGlvbnMudmVyYm9zZSkKKwkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQlpZiAob3B0aW9ucy52ZXJib3NlKQorCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJfQorCQl9IGVsc2UgeworCQkJSmFyUHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBKYXJQcm9jZXNzb3IoKTsKKwkJCUphclByb2Nlc3NvciBwYWNrUHJvY2Vzc29yID0gbnVsbDsKKworCQkJcHJvY2Vzc29yLnNldFdvcmtpbmdEaXJlY3Rvcnkob3B0aW9ucy5vdXRwdXREaXIpOworCQkJcHJvY2Vzc29yLnNldFByb2Nlc3NBbGwob3B0aW9ucy5wcm9jZXNzQWxsKTsKKwkJCXByb2Nlc3Nvci5zZXRWZXJib3NlKG9wdGlvbnMudmVyYm9zZSk7CisKKwkJCS8vbG9hZCBvcHRpb25zIGZpbGUKKwkJCVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisJCQlpZiAob3B0aW9ucy5pbnB1dC5pc0RpcmVjdG9yeSgpKSB7CisJCQkJRmlsZSBwYWNrUHJvcGVydGllcyA9IG5ldyBGaWxlKG9wdGlvbnMuaW5wdXQsICJwYWNrLnByb3BlcnRpZXMiKTsKKwkJCQlpZiAocGFja1Byb3BlcnRpZXMuZXhpc3RzKCkgJiYgcGFja1Byb3BlcnRpZXMuaXNGaWxlKCkpIHsKKwkJCQkJSW5wdXRTdHJlYW0gaW4gPSBudWxsOworCQkJCQl0cnkgeworCQkJCQkJaW4gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKHBhY2tQcm9wZXJ0aWVzKSk7CisJCQkJCQlwcm9wZXJ0aWVzLmxvYWQoaW4pOworCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJCQlpZiAob3B0aW9ucy52ZXJib3NlKQorCQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQkJCX0gZmluYWxseSB7CisJCQkJCQlVdGlscy5jbG9zZShpbik7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCWlmIChvcHRpb25zLnVucGFjaykKKwkJCQlhZGRVbnBhY2tTdGVwKHByb2Nlc3NvciwgcHJvcGVydGllcywgb3B0aW9ucyk7CisKKwkJCWlmIChvcHRpb25zLnJlcGFjayB8fCAob3B0aW9ucy5wYWNrICYmIG9wdGlvbnMuc2lnbkNvbW1hbmQgIT0gbnVsbCkpCisJCQkJYWRkUGFja1VucGFja1N0ZXAocHJvY2Vzc29yLCBwcm9wZXJ0aWVzLCBvcHRpb25zKTsKKworCQkJaWYgKG9wdGlvbnMuc2lnbkNvbW1hbmQgIT0gbnVsbCkKKwkJCQlhZGRTaWduU3RlcChwcm9jZXNzb3IsIHByb3BlcnRpZXMsIG9wdGlvbnMpOworCisJCQlpZiAob3B0aW9ucy5wYWNrKSB7CisJCQkJcGFja1Byb2Nlc3NvciA9IG5ldyBKYXJQcm9jZXNzb3IoKTsKKwkJCQlwYWNrUHJvY2Vzc29yLnNldFdvcmtpbmdEaXJlY3Rvcnkob3B0aW9ucy5vdXRwdXREaXIpOworCQkJCXBhY2tQcm9jZXNzb3Iuc2V0UHJvY2Vzc0FsbChvcHRpb25zLnByb2Nlc3NBbGwpOworCQkJCXBhY2tQcm9jZXNzb3Iuc2V0VmVyYm9zZShvcHRpb25zLnZlcmJvc2UpOworCQkJCWFkZFBhY2tTdGVwKHBhY2tQcm9jZXNzb3IsIHByb3BlcnRpZXMsIG9wdGlvbnMpOworCQkJfQorCisJCQl0cnkgeworCQkJCXByb2Nlc3Mob3B0aW9ucy5pbnB1dCwgb3B0aW9ucy51bnBhY2sgPyBVdGlscy5QQUNLX0daX0ZJTFRFUiA6IFV0aWxzLkpBUl9GSUxURVIsIG9wdGlvbnMudmVyYm9zZSwgcHJvY2Vzc29yLCBwYWNrUHJvY2Vzc29yKTsKKwkJCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisJCQkJaWYgKG9wdGlvbnMudmVyYm9zZSkKKwkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCX0KKwkJfQorCX0KKworCXByb3RlY3RlZCB2b2lkIHByb2Nlc3MoRmlsZSBpbnB1dCwgRmlsZUZpbHRlciBmaWx0ZXIsIGJvb2xlYW4gdmVyYm9zZSwgSmFyUHJvY2Vzc29yIHByb2Nlc3NvciwgSmFyUHJvY2Vzc29yIHBhY2tQcm9jZXNzb3IpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24geworCQlpZiAoIWlucHV0LmV4aXN0cygpKQorCQkJdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigpOworCisJCUZpbGVbXSBmaWxlcyA9IG51bGw7CisJCWlmIChpbnB1dC5pc0RpcmVjdG9yeSgpKSB7CisJCQlmaWxlcyA9IGlucHV0Lmxpc3RGaWxlcygpOworCQl9IGVsc2UgaWYgKGZpbHRlci5hY2NlcHQoaW5wdXQpKSB7CisJCQlmaWxlcyA9IG5ldyBGaWxlW10ge2lucHV0fTsKKwkJfQorCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7CisJCQlpZiAoZmlsZXNbaV0uaXNEaXJlY3RvcnkoKSkgeworCQkJCVN0cmluZyBkaXIgPSBwcm9jZXNzb3IuZ2V0V29ya2luZ0RpcmVjdG9yeSgpOworCQkJCXByb2Nlc3Nvci5zZXRXb3JraW5nRGlyZWN0b3J5KGRpciArICIvIiArIGZpbGVzW2ldLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQlpZiAocGFja1Byb2Nlc3NvciAhPSBudWxsKQorCQkJCQlwYWNrUHJvY2Vzc29yLnNldFdvcmtpbmdEaXJlY3RvcnkoZGlyICsgIi8iICsgZmlsZXNbaV0uZ2V0TmFtZSgpKTsKKwkJCQlwcm9jZXNzKGZpbGVzW2ldLCBmaWx0ZXIsIHZlcmJvc2UsIHByb2Nlc3NvciwgcGFja1Byb2Nlc3Nvcik7CisJCQkJcHJvY2Vzc29yLnNldFdvcmtpbmdEaXJlY3RvcnkoZGlyKTsKKwkJCQlpZiAocGFja1Byb2Nlc3NvciAhPSBudWxsKQorCQkJCQlwYWNrUHJvY2Vzc29yLnNldFdvcmtpbmdEaXJlY3RvcnkoZGlyKTsKKwkJCX0gZWxzZSBpZiAoZmlsdGVyLmFjY2VwdChmaWxlc1tpXSkpIHsKKwkJCQl0cnkgeworCQkJCQlGaWxlIHJlc3VsdCA9IHByb2Nlc3Nvci5wcm9jZXNzSmFyKGZpbGVzW2ldKTsKKwkJCQkJaWYgKHBhY2tQcm9jZXNzb3IgIT0gbnVsbCAmJiByZXN1bHQgIT0gbnVsbCAmJiByZXN1bHQuZXhpc3RzKCkpIHsKKwkJCQkJCXBhY2tQcm9jZXNzb3IucHJvY2Vzc0phcihyZXN1bHQpOworCQkJCQl9CisJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCQlpZiAodmVyYm9zZSkKKwkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcHVibGljIHZvaWQgYWRkUGFja1VucGFja1N0ZXAoSmFyUHJvY2Vzc29yIHByb2Nlc3NvciwgUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBPcHRpb25zIG9wdGlvbnMpIHsKKwkJcHJvY2Vzc29yLmFkZFByb2Nlc3NTdGVwKG5ldyBQYWNrVW5wYWNrU3RlcChwcm9wZXJ0aWVzLCBvcHRpb25zLnZlcmJvc2UpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBhZGRTaWduU3RlcChKYXJQcm9jZXNzb3IgcHJvY2Vzc29yLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIE9wdGlvbnMgb3B0aW9ucykgeworCQlwcm9jZXNzb3IuYWRkUHJvY2Vzc1N0ZXAobmV3IFNpZ25Db21tYW5kU3RlcChwcm9wZXJ0aWVzLCBvcHRpb25zLnNpZ25Db21tYW5kLCBvcHRpb25zLnZlcmJvc2UpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBhZGRQYWNrU3RlcChKYXJQcm9jZXNzb3IgcHJvY2Vzc29yLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIE9wdGlvbnMgb3B0aW9ucykgeworCQlwcm9jZXNzb3IuYWRkUHJvY2Vzc1N0ZXAobmV3IFBhY2tTdGVwKHByb3BlcnRpZXMsIG9wdGlvbnMudmVyYm9zZSkpOworCX0KKworCXB1YmxpYyB2b2lkIGFkZFVucGFja1N0ZXAoSmFyUHJvY2Vzc29yIHByb2Nlc3NvciwgUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBPcHRpb25zIG9wdGlvbnMpIHsKKwkJcHJvY2Vzc29yLmFkZFByb2Nlc3NTdGVwKG5ldyBVbnBhY2tTdGVwKHByb3BlcnRpZXMsIG9wdGlvbnMudmVyYm9zZSkpOworCX0KK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9qYXJwcm9jZXNzb3Ivb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2phcnByb2Nlc3Nvci9NYWluLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvamFycHJvY2Vzc29yL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9qYXJwcm9jZXNzb3IvTWFpbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzZDhlMGEKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvamFycHJvY2Vzc29yL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9qYXJwcm9jZXNzb3IvTWFpbi5qYXZhCkBAIC0wLDAgKzEsMTE3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmphcnByb2Nlc3NvcjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKKworcHVibGljIGNsYXNzIE1haW4geworCisJcHVibGljIHN0YXRpYyBjbGFzcyBPcHRpb25zIHsKKwkJcHVibGljIFN0cmluZyBvdXRwdXREaXIgPSAiLiI7IC8vJE5PTi1OTFMtMSQKKwkJcHVibGljIFN0cmluZyBzaWduQ29tbWFuZCA9IG51bGw7CisJCXB1YmxpYyBib29sZWFuIHBhY2sgPSBmYWxzZTsKKwkJcHVibGljIGJvb2xlYW4gcmVwYWNrID0gZmFsc2U7CisJCXB1YmxpYyBib29sZWFuIHVucGFjayA9IGZhbHNlOworCQlwdWJsaWMgYm9vbGVhbiB2ZXJib3NlID0gZmFsc2U7CisJCXB1YmxpYyBib29sZWFuIHByb2Nlc3NBbGwgPSBmYWxzZTsKKwkJcHVibGljIEZpbGUgaW5wdXQgPSBudWxsOworCX0KKworCXByaXZhdGUgc3RhdGljIHZvaWQgcHJpbnRVc2FnZSgpIHsKKwkJU3lzdGVtLm91dC5wcmludGxuKCJbLW9wdGlvbiAuLi5dLi4uIGlucHV0Iik7IC8vJE5PTi1OTFMtMSQKKwkJU3lzdGVtLm91dC5wcmludGxuKCJUaGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIHN1cHBvcnRlZDoiKTsgLy8kTk9OLU5MUy0xJAorCQlTeXN0ZW0ub3V0LnByaW50bG4oIi1wcm9jZXNzQWxsICAgICBwcm9jZXNzIGFsbCBqYXJzLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhleSB3ZXJlIHByZXZpb3VzbHkgbm9ybWFsaXplZCIpOyAvLyROT04tTkxTLTEkCisJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgICAgICAgICAgIEJ5IGRlZmF1bHQgb25seSBub3JtYWxpemVkIGphcnMgd2lsbCBiZSBwcm9jZXNzZWQuIik7IC8vJE5PTi1OTFMtMSQKKwkJU3lzdGVtLm91dC5wcmludGxuKCItcmVwYWNrICAgICAgICAgbm9ybWFsaXplIGphcnMgIik7IC8vJE5PTi1OTFMtMSQKKwkJU3lzdGVtLm91dC5wcmludGxuKCItc2lnbiA8Y29tbWFuZD4gc2lnbiBqYXJzIHVzaW5nIDxjb21tYW5kPiIpOyAvLyROT04tTkxTLTEkCisJCVN5c3RlbS5vdXQucHJpbnRsbigiLXBhY2sgICAgICAgICAgIHBhY2sgdGhlIGphcnMuICBwYWNrIGFuZCByZXBhY2sgYXJlIHJlZHVuZGFudCB1bmxlc3MiKTsgLy8kTk9OLU5MUy0xJAorCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgICAgICAgICAgICBzaWduIGlzIGFsc28gc3BlY2lmaWVkLiIpOyAvLyROT04tTkxTLTEkCisJCVN5c3RlbS5vdXQucHJpbnRsbigiLXVucGFjayAgICAgICAgIHVucGFjayBwYWNrLmd6IGZpbGVzLiBVbnBhY2sgaXMgbXV0dWFsbHkgZXhjbHVzaXZlIik7IC8vJE5PTi1OTFMtMSQKKwkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgICAgICAgICAgICAgd2l0aCByZXBhY2ssIHNpZ24gYW5kIHBhY2suIik7IC8vJE5PTi1OTFMtMSQKKwkJU3lzdGVtLm91dC5wcmludGxuKCk7CisJCVN5c3RlbS5vdXQucHJpbnRsbigiLW91dHB1dERpciA8ZGlyPiAgdGhlIG91dHB1dCBkaXJlY3RvcnkiKTsgLy8kTk9OLU5MUy0xJAorCQlTeXN0ZW0ub3V0LnByaW50bG4oIi12ZXJib3NlICAgICAgICB2ZXJib3NlIG1vZGUgIik7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwlwdWJsaWMgc3RhdGljIE9wdGlvbnMgcHJvY2Vzc0FyZ3VtZW50cyhTdHJpbmdbXSBhcmdzKSB7CisJCWlmIChhcmdzLmxlbmd0aCA9PSAwKSB7CisJCQlwcmludFVzYWdlKCk7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCU9wdGlvbnMgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7CisJCWludCBpID0gMDsKKwkJZm9yICg7IGkgPCBhcmdzLmxlbmd0aCAtIDE7IGkrKykgeworCQkJaWYgKGFyZ3NbaV0uZXF1YWxzKCItcGFjayIpKSB7Ly8kTk9OLU5MUy0xJAorCQkJCW9wdGlvbnMucGFjayA9IHRydWU7CisJCQl9IGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItdW5wYWNrIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCW9wdGlvbnMudW5wYWNrID0gdHJ1ZTsKKwkJCX0gZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi1zaWduIikgJiYgaSA8IGFyZ3MubGVuZ3RoIC0gMikgeyAvLyROT04tTkxTLTEkCisJCQkJaWYgKGFyZ3NbaSArIDFdLnN0YXJ0c1dpdGgoIi0iKSkgeyAvLyROT04tTkxTLTEkCisJCQkJCXByaW50VXNhZ2UoKTsKKwkJCQkJcmV0dXJuIG51bGw7CisJCQkJfQorCQkJCW9wdGlvbnMuc2lnbkNvbW1hbmQgPSBhcmdzWysraV07CisJCQl9IGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItcmVwYWNrIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCW9wdGlvbnMucmVwYWNrID0gdHJ1ZTsKKwkJCX0gZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi1vdXRwdXREaXIiKSAmJiBpIDwgYXJncy5sZW5ndGggLSAyKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlpZiAoYXJnc1tpICsgMV0uc3RhcnRzV2l0aCgiLSIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQkJcHJpbnRVc2FnZSgpOworCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQl9CisJCQkJb3B0aW9ucy5vdXRwdXREaXIgPSBhcmdzWysraV07CisJCQl9IGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItdmVyYm9zZSIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlvcHRpb25zLnZlcmJvc2UgPSB0cnVlOworCQkJfSAgZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi1wcm9jZXNzQWxsIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCW9wdGlvbnMucHJvY2Vzc0FsbCA9IHRydWU7CisJCQl9IAorCQl9CisKKwkJb3B0aW9ucy5pbnB1dCA9IG5ldyBGaWxlKGFyZ3NbaV0pOworCisJCVN0cmluZyBwcm9ibGVtTWVzc2FnZSA9IG51bGw7CisJCVN0cmluZyBpbnB1dE5hbWUgPSBvcHRpb25zLmlucHV0LmdldE5hbWUoKTsKKwkJaWYgKG9wdGlvbnMudW5wYWNrKSB7CisJCQlpZiAoIUphclByb2Nlc3Nvci5jYW5QZXJmb3JtVW5wYWNrKCkpIHsKKwkJCQlwcm9ibGVtTWVzc2FnZSA9ICJUaGUgdW5wYWNrMjAwIGNvbW1hbmQgY2Fubm90IGJlIGZvdW5kLiI7IC8vJE5PTi1OTFMtMSQKKwkJCX0gZWxzZSAJaWYgKG9wdGlvbnMuaW5wdXQuaXNGaWxlKCkgJiYgIWlucHV0TmFtZS5lbmRzV2l0aCgiLnppcCIpICYmICFpbnB1dE5hbWUuZW5kc1dpdGgoIi5wYWNrLmd6IikpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJcHJvYmxlbU1lc3NhZ2UgPSAiSW5wdXQgZmlsZSBpcyBub3QgYSBwYWNrLmd6IGZpbGUuIjsgLy8kTk9OLU5MUy0xJAorCQkJfSBlbHNlIAlpZiAob3B0aW9ucy5wYWNrIHx8IG9wdGlvbnMucmVwYWNrIHx8IG9wdGlvbnMuc2lnbkNvbW1hbmQgIT0gbnVsbCkgeworCQkJCXByb2JsZW1NZXNzYWdlID0gIlBhY2ssIHJlcGFjayBvciBzaWduIGNhbm5vdCBiZSBzcGVjaWZpZWQgd2l0aCB1bnBhY2suIjsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKG9wdGlvbnMuaW5wdXQuaXNGaWxlKCkgJiYgIWlucHV0TmFtZS5lbmRzV2l0aCgiLnppcCIpICYmICFpbnB1dE5hbWUuZW5kc1dpdGgoIi5qYXIiKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQlwcm9ibGVtTWVzc2FnZSA9ICJJbnB1dCBmaWxlIGlzIG5vdCBhIGphciBmaWxlLiI7IC8vJE5PTi1OTFMtMSQKKwkJCX0gZWxzZQlpZiAoKG9wdGlvbnMucGFjayB8fCBvcHRpb25zLnJlcGFjaykgJiYgIUphclByb2Nlc3Nvci5jYW5QZXJmb3JtUGFjaygpKSB7CisJCQkJcHJvYmxlbU1lc3NhZ2UgPSAiVGhlIHBhY2syMDAgY29tbWFuZCBjYW4gbm90IGJlIGZvdW5kLiI7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJfQorCQlpZihwcm9ibGVtTWVzc2FnZSAhPSBudWxsKXsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbihwcm9ibGVtTWVzc2FnZSk7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKKwkJCXByaW50VXNhZ2UoKTsKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJcmV0dXJuIG9wdGlvbnM7CisJfQorCQorCS8qKgorCSAqIEBwYXJhbSBhcmdzCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworCQlPcHRpb25zIG9wdGlvbnMgPSBwcm9jZXNzQXJndW1lbnRzKGFyZ3MpOworCQlpZiAob3B0aW9ucyA9PSBudWxsKQorCQkJcmV0dXJuOworCQluZXcgSmFyUHJvY2Vzc29yRXhlY3V0b3IoKS5ydW5KYXJQcm9jZXNzb3Iob3B0aW9ucyk7CisJfQorCit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvamFycHJvY2Vzc29yL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9qYXJwcm9jZXNzb3IvUGFja1N0ZXAuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9qYXJwcm9jZXNzb3Ivb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2phcnByb2Nlc3Nvci9QYWNrU3RlcC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhZmQ2MzgKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvamFycHJvY2Vzc29yL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9qYXJwcm9jZXNzb3IvUGFja1N0ZXAuamF2YQpAQCAtMCwwICsxLDE5NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5qYXJwcm9jZXNzb3I7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK3B1YmxpYyBjbGFzcyBQYWNrU3RlcCBleHRlbmRzIENvbW1hbmRTdGVwIHsKKworCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIHBhY2tDb21tYW5kID0gbnVsbDsKKwlwcml2YXRlIHN0YXRpYyBCb29sZWFuIGNhblBhY2sgPSBudWxsOworCisJcHJpdmF0ZSBTZXQgZXhjbHVzaW9ucyA9IENvbGxlY3Rpb25zLkVNUFRZX1NFVDsKKworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjYW5QYWNrKCkgeworCQlpZiAoY2FuUGFjayAhPSBudWxsKQorCQkJcmV0dXJuIGNhblBhY2suYm9vbGVhblZhbHVlKCk7CisKKwkJU3RyaW5nW10gbG9jYXRpb25zID0gVXRpbHMuZ2V0UGFjazIwMENvbW1hbmRzKCJwYWNrMjAwIik7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKGxvY2F0aW9ucyA9PSBudWxsKSB7CisJCQljYW5QYWNrID0gQm9vbGVhbi5GQUxTRTsKKwkJCXBhY2tDb21tYW5kID0gbnVsbDsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCWludCByZXN1bHQ7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbG9jYXRpb25zLmxlbmd0aDsgaSsrKSB7CisJCQlpZiAobG9jYXRpb25zW2ldID09IG51bGwpCisJCQkJY29udGludWU7CisJCQlyZXN1bHQgPSBleGVjdXRlKG5ldyBTdHJpbmdbXSB7bG9jYXRpb25zW2ldLCAiLVYifSk7IC8vJE5PTi1OTFMtMSQKKwkJCWlmIChyZXN1bHQgPT0gMCkgeworCQkJCXBhY2tDb21tYW5kID0gbG9jYXRpb25zW2ldOworCQkJCWNhblBhY2sgPSBCb29sZWFuLlRSVUU7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX0KKworCQljYW5QYWNrID0gQm9vbGVhbi5GQUxTRTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXB1YmxpYyBQYWNrU3RlcChQcm9wZXJ0aWVzIG9wdGlvbnMpIHsKKwkJc3VwZXIob3B0aW9ucywgbnVsbCwgbnVsbCwgZmFsc2UpOworCQlleGNsdXNpb25zID0gVXRpbHMuZ2V0UGFja0V4Y2x1c2lvbnMob3B0aW9ucyk7CisJfQorCisJcHVibGljIFBhY2tTdGVwKFByb3BlcnRpZXMgb3B0aW9ucywgYm9vbGVhbiB2ZXJib3NlKSB7CisJCXN1cGVyKG9wdGlvbnMsIG51bGwsIG51bGwsIHZlcmJvc2UpOworCQlleGNsdXNpb25zID0gVXRpbHMuZ2V0UGFja0V4Y2x1c2lvbnMob3B0aW9ucyk7CisJfQorCisJcHVibGljIFN0cmluZyByZWN1cnNpb25FZmZlY3QoU3RyaW5nIGVudHJ5TmFtZSkgeworCQlpZiAoY2FuUGFjaygpICYmIGVudHJ5TmFtZS5lbmRzV2l0aCgiLmphciIpICYmICFleGNsdXNpb25zLmNvbnRhaW5zKGVudHJ5TmFtZSkpIHsgLy8kTk9OLU5MUy0xJAorCQkJcmV0dXJuIGVudHJ5TmFtZSArIFV0aWxzLlBBQ0tFRF9TVUZGSVg7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIEZpbGUgcHJlUHJvY2VzcyhGaWxlIGlucHV0LCBGaWxlIHdvcmtpbmdEaXJlY3RvcnksIExpc3QgY29udGFpbmVycykgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgRmlsZSBwb3N0UHJvY2VzcyhGaWxlIGlucHV0LCBGaWxlIHdvcmtpbmdEaXJlY3RvcnksIExpc3QgY29udGFpbmVycykgeworCQlpZiAoY2FuUGFjaygpICYmIHBhY2tDb21tYW5kICE9IG51bGwpIHsKKwkJCVByb3BlcnRpZXMgaW5mID0gVXRpbHMuZ2V0RWNsaXBzZUluZihpbnB1dCwgdmVyYm9zZSk7CisJCQlpZiAoIXNob3VsZFBhY2soaW5wdXQsIGNvbnRhaW5lcnMsIGluZikpCisJCQkJcmV0dXJuIG51bGw7CisJCQlGaWxlIG91dHB1dEZpbGUgPSBuZXcgRmlsZSh3b3JraW5nRGlyZWN0b3J5LCBpbnB1dC5nZXROYW1lKCkgKyBVdGlscy5QQUNLRURfU1VGRklYKTsKKwkJCXRyeSB7CisJCQkJU3RyaW5nW10gY21kID0gZ2V0Q29tbWFuZChpbnB1dCwgb3V0cHV0RmlsZSwgaW5mLCBjb250YWluZXJzKTsKKwkJCQlpbnQgcmVzdWx0ID0gZXhlY3V0ZShjbWQsIHZlcmJvc2UpOworCQkJCWlmIChyZXN1bHQgIT0gMCAmJiB2ZXJib3NlKQorCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yOiAiICsgcmVzdWx0ICsgIiB3YXMgcmV0dXJuZWQgZnJvbSBjb21tYW5kOiAiICsgVXRpbHMuY29uY2F0KGNtZCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQlpZiAodmVyYm9zZSkKKwkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJCXJldHVybiBvdXRwdXRGaWxlOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCXByb3RlY3RlZCBib29sZWFuIHNob3VsZFBhY2soRmlsZSBpbnB1dCwgTGlzdCBjb250YWluZXJzLCBQcm9wZXJ0aWVzIGluZikgeworCQkvLzE6IGV4Y2x1ZGUgYnkgY29udGFpbmVycworCQkvLyBpbm5lcm1vc3QgamFyIGlzIGZpcnN0IG9uIHRoZSBsaXN0LCBpdCBjYW4gb3ZlcnJpZGUgb3V0ZXIgamFycworCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gY29udGFpbmVycy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7CisJCQlQcm9wZXJ0aWVzIGNvbnRhaW5lciA9IChQcm9wZXJ0aWVzKSBpdGVyYXRvci5uZXh0KCk7CisJCQlpZiAoY29udGFpbmVyLmNvbnRhaW5zS2V5KFV0aWxzLk1BUktfRVhDTFVERV9DSElMRFJFTl9QQUNLKSkgeworCQkJCWlmIChCb29sZWFuLnZhbHVlT2YoY29udGFpbmVyLmdldFByb3BlcnR5KFV0aWxzLk1BUktfRVhDTFVERV9DSElMRFJFTl9QQUNLKSkuYm9vbGVhblZhbHVlKCkpIHsKKwkJCQkJaWYgKHZlcmJvc2UpCisJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oaW5wdXQuZ2V0TmFtZSgpICsgIiBpcyBleGNsdWRlZCBmcm9tIHBhY2syMDAgYnkgaXRzIGNvbnRhaW5lcnMuIik7CisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQkvLzI6IGV4Y2x1ZGVkIGJ5IHNlbGYKKwkJaWYgKGluZiAhPSBudWxsICYmIGluZi5jb250YWluc0tleShVdGlscy5NQVJLX0VYQ0xVREVfUEFDSykgJiYgQm9vbGVhbi52YWx1ZU9mKGluZi5nZXRQcm9wZXJ0eShVdGlscy5NQVJLX0VYQ0xVREVfUEFDSykpLmJvb2xlYW5WYWx1ZSgpKSB7CisJCQlpZiAodmVyYm9zZSkKKwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkV4Y2x1ZGluZyAiICsgaW5wdXQuZ2V0TmFtZSgpICsgIiBmcm9tICIgKyBnZXRTdGVwTmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0Q29tbWFuZChGaWxlIGlucHV0LCBGaWxlIG91dHB1dEZpbGUsIFByb3BlcnRpZXMgaW5mLCBMaXN0IGNvbnRhaW5lcnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCVN0cmluZ1tdIGNtZCA9IG51bGw7CisJCVN0cmluZyBhcmd1bWVudHMgPSBnZXRBcmd1bWVudHMoaW5wdXQsIGluZiwgY29udGFpbmVycyk7CisJCWlmIChhcmd1bWVudHMgIT0gbnVsbCAmJiBhcmd1bWVudHMubGVuZ3RoKCkgPiAwKSB7CisJCQlTdHJpbmdbXSBhcmdzID0gVXRpbHMudG9TdHJpbmdBcnJheShhcmd1bWVudHMsICIsIik7IC8vJE5PTi1OTFMtMSQKKwkJCWNtZCA9IG5ldyBTdHJpbmdbMyArIGFyZ3MubGVuZ3RoXTsKKwkJCWNtZFswXSA9IHBhY2tDb21tYW5kOworCQkJU3lzdGVtLmFycmF5Y29weShhcmdzLCAwLCBjbWQsIDEsIGFyZ3MubGVuZ3RoKTsKKwkJCWNtZFtjbWQubGVuZ3RoIC0gMl0gPSBvdXRwdXRGaWxlLmdldENhbm9uaWNhbFBhdGgoKTsKKwkJCWNtZFtjbWQubGVuZ3RoIC0gMV0gPSBpbnB1dC5nZXRDYW5vbmljYWxQYXRoKCk7CisJCX0gZWxzZSB7CisJCQljbWQgPSBuZXcgU3RyaW5nW10ge3BhY2tDb21tYW5kLCBvdXRwdXRGaWxlLmdldENhbm9uaWNhbFBhdGgoKSwgaW5wdXQuZ2V0Q2Fub25pY2FsUGF0aCgpfTsKKwkJfQorCQlyZXR1cm4gY21kOworCX0KKworCXByb3RlY3RlZCBTdHJpbmcgZ2V0QXJndW1lbnRzKEZpbGUgaW5wdXQsIFByb3BlcnRpZXMgaW5mLCBMaXN0IGNvbnRhaW5lcnMpIHsJCisJCS8vMTogRXhwbGljaXRseSBtYXJrZWQgaW4gb3VyIC5pbmYgZmlsZQorCQlpZiAoaW5mICE9IG51bGwgJiYgaW5mLmNvbnRhaW5zS2V5KFV0aWxzLlBBQ0tfQVJHUykpIHsKKwkJCXJldHVybiAgaW5mLmdldFByb3BlcnR5KFV0aWxzLlBBQ0tfQVJHUyk7CisJCX0KKworCQkvLzI6IERlZmF1bHRzIHNldCBpbiBvbmUgb2Ygb3VyIGNvbnRhaW5pbmcgamFycworCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gY29udGFpbmVycy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7CisJCQlQcm9wZXJ0aWVzIGNvbnRhaW5lciA9IChQcm9wZXJ0aWVzKSBpdGVyYXRvci5uZXh0KCk7CisJCQlpZiAoY29udGFpbmVyLmNvbnRhaW5zS2V5KFV0aWxzLkRFRkFVTFRfUEFDS19BUkdTKSkgeworCQkJCXJldHVybiBjb250YWluZXIuZ2V0UHJvcGVydHkoVXRpbHMuREVGQVVMVF9QQUNLX0FSR1MpOworCQkJfQorCQl9CisKKwkJLy8zOiBTZXQgYnkgbmFtZSBpbiBvdXRzaWRlIHBhY2sucHJvcGVydGllcyBmaWxlCisJCVByb3BlcnRpZXMgb3B0aW9ucyA9IGdldE9wdGlvbnMoKTsKKwkJU3RyaW5nIGFyZ3NLZXkgPSBpbnB1dC5nZXROYW1lKCkgKyBVdGlscy5QQUNLX0FSR1NfU1VGRklYOworCQlpZiAob3B0aW9ucy5jb250YWluc0tleShhcmdzS2V5KSkgeworCQkJcmV0dXJuIG9wdGlvbnMuZ2V0UHJvcGVydHkoYXJnc0tleSk7CisJCX0KKworCQkvLzQ6IFNldCBieSBkZWZhdWx0IGluIG91dHNpZGUgcGFjay5wcm9wZXJ0aWVzIGZpbGUKKwkJaWYgKG9wdGlvbnMuY29udGFpbnNLZXkoVXRpbHMuREVGQVVMVF9QQUNLX0FSR1MpKSB7CisJCQlyZXR1cm4gb3B0aW9ucy5nZXRQcm9wZXJ0eShVdGlscy5ERUZBVUxUX1BBQ0tfQVJHUyk7CisJCX0KKworCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFN0ZXBOYW1lKCkgeworCQlyZXR1cm4gIlBhY2siOyAvLyROT04tTkxTLTEkCisJfQorCisJcHVibGljIHZvaWQgYWRqdXN0SW5mKEZpbGUgaW5wdXQsIFByb3BlcnRpZXMgaW5mLCBMaXN0IGNvbnRhaW5lcnMpIHsKKwkJaWYgKGlucHV0ID09IG51bGwgfHwgaW5mID09IG51bGwpCisJCQlyZXR1cm47CisKKwkJLy9kb24ndCBiZSB2ZXJib3NlIHRvIGNoZWNrIGlmIHdlIHNob3VsZCBtYXJrIHRoZSBpbmYKKwkJYm9vbGVhbiB2ID0gdmVyYm9zZTsKKwkJdmVyYm9zZSA9IGZhbHNlOworCQlpZiAoIXNob3VsZFBhY2soaW5wdXQsIGNvbnRhaW5lcnMsIGluZikpIHsKKwkJCXZlcmJvc2UgPSB2OworCQkJcmV0dXJuOworCQl9CisJCXZlcmJvc2UgPSB2OworCisJCS8vbWFyayBhcyBjb25kaXRpb25lZCBpZiBub3QgcHJldmlvdXNseSBtYXJrZWQuICBBIHNpZ25lZCBqYXIgaXMgYXNzdW1lZCB0byBiZSBwcmV2aW91c2x5IGNvbmRpdGlvbmVkLgorCQlpZiAoaW5mLmdldFByb3BlcnR5KFV0aWxzLk1BUktfUFJPUEVSVFkpID09IG51bGwpIHsKKwkJCWluZi5wdXQoVXRpbHMuTUFSS19QUk9QRVJUWSwgInRydWUiKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJLy9yZWNvcmQgYXJndW1lbnRzIHVzZWQKKwkJCVN0cmluZyBhcmd1bWVudHMgPSBpbmYuZ2V0UHJvcGVydHkoVXRpbHMuUEFDS19BUkdTKTsKKwkJCWlmIChhcmd1bWVudHMgPT0gbnVsbCkgeworCQkJCWFyZ3VtZW50cyA9IGdldEFyZ3VtZW50cyhpbnB1dCwgaW5mLCBjb250YWluZXJzKTsKKwkJCQlpZiAoYXJndW1lbnRzICE9IG51bGwgJiYgYXJndW1lbnRzLmxlbmd0aCgpID4gMCkKKwkJCQkJaW5mLnB1dChVdGlscy5QQUNLX0FSR1MsIGFyZ3VtZW50cyk7CisJCQl9CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvamFycHJvY2Vzc29yL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9qYXJwcm9jZXNzb3IvUGFja1VucGFja1N0ZXAuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9qYXJwcm9jZXNzb3Ivb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2phcnByb2Nlc3Nvci9QYWNrVW5wYWNrU3RlcC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxOTgxMmIKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvamFycHJvY2Vzc29yL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9qYXJwcm9jZXNzb3IvUGFja1VucGFja1N0ZXAuamF2YQpAQCAtMCwwICsxLDg4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmphcnByb2Nlc3NvcjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8qKgorICogQGF1dGhvciBhbmllZmVyQGNhLmlibS5jb20KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBQYWNrVW5wYWNrU3RlcCBleHRlbmRzIFBhY2tTdGVwIHsKKwlwcml2YXRlIFNldCBleGNsdXNpb25zID0gbnVsbDsKKworCXB1YmxpYyBQYWNrVW5wYWNrU3RlcChQcm9wZXJ0aWVzIG9wdGlvbnMpIHsKKwkJc3VwZXIob3B0aW9ucyk7CisJCWV4Y2x1c2lvbnMgPSBVdGlscy5nZXRQYWNrRXhjbHVzaW9ucyhvcHRpb25zKTsKKwl9CisKKwlwdWJsaWMgUGFja1VucGFja1N0ZXAoUHJvcGVydGllcyBvcHRpb25zLCBib29sZWFuIHZlcmJvc2UpIHsKKwkJc3VwZXIob3B0aW9ucywgdmVyYm9zZSk7CisJCWV4Y2x1c2lvbnMgPSBVdGlscy5nZXRQYWNrRXhjbHVzaW9ucyhvcHRpb25zKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIHJlY3Vyc2lvbkVmZmVjdChTdHJpbmcgZW50cnlOYW1lKSB7CisJCWlmIChjYW5QYWNrKCkgJiYgZW50cnlOYW1lLmVuZHNXaXRoKCIuamFyIikgJiYgIWV4Y2x1c2lvbnMuY29udGFpbnMoZW50cnlOYW1lKSkgeyAvLyROT04tTkxTLTEkCisJCQlyZXR1cm4gZW50cnlOYW1lOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5qYXJwcm9jZXNzb3IuUGFja1N0ZXAjcG9zdFByb2Nlc3MoamF2YS5pby5GaWxlLCBqYXZhLmlvLkZpbGUsIGphdmEudXRpbC5MaW5rZWRMaXN0KQorCSAqLworCXB1YmxpYyBGaWxlIHBvc3RQcm9jZXNzKEZpbGUgaW5wdXQsIEZpbGUgd29ya2luZ0RpcmVjdG9yeSwgTGlzdCBjb250YWluZXJzKSB7CisJCWlmIChjYW5QYWNrKCkgJiYgcGFja0NvbW1hbmQgIT0gbnVsbCAmJiBpbnB1dCAhPSBudWxsKSB7CisJCQlQcm9wZXJ0aWVzIGluZiA9IFV0aWxzLmdldEVjbGlwc2VJbmYoaW5wdXQsIHZlcmJvc2UpOworCQkJaWYgKCFzaG91bGRQYWNrKGlucHV0LCBjb250YWluZXJzLCBpbmYpKQorCQkJCXJldHVybiBudWxsOworCQkJRmlsZSB0ZW1wRmlsZSA9IG5ldyBGaWxlKHdvcmtpbmdEaXJlY3RvcnksICJ0ZW1wXyIgKyBpbnB1dC5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCisJCQl0cnkgeworCQkJCVN0cmluZ1tdIHRtcCA9IGdldENvbW1hbmQoaW5wdXQsIHRlbXBGaWxlLCBpbmYsIGNvbnRhaW5lcnMpOworCQkJCVN0cmluZ1tdIGNtZCA9IG5ldyBTdHJpbmdbdG1wLmxlbmd0aCArIDFdOworCQkJCWNtZFswXSA9IHRtcFswXTsKKwkJCQljbWRbMV0gPSAiLXIiOyAvLyROT04tTkxTLTEkCisJCQkJU3lzdGVtLmFycmF5Y29weSh0bXAsIDEsIGNtZCwgMiwgdG1wLmxlbmd0aCAtIDEpOworCisJCQkJaW50IHJlc3VsdCA9IGV4ZWN1dGUoY21kLCB2ZXJib3NlKTsKKwkJCQlpZiAocmVzdWx0ID09IDAgJiYgdGVtcEZpbGUuZXhpc3RzKCkpIHsKKwkJCQkJRmlsZSBmaW5hbEZpbGUgPSBuZXcgRmlsZSh3b3JraW5nRGlyZWN0b3J5LCBpbnB1dC5nZXROYW1lKCkpOworCQkJCQlpZiAoZmluYWxGaWxlLmV4aXN0cygpKQorCQkJCQkJZmluYWxGaWxlLmRlbGV0ZSgpOworCQkJCQl0ZW1wRmlsZS5yZW5hbWVUbyhmaW5hbEZpbGUpOworCQkJCQlyZXR1cm4gZmluYWxGaWxlOworCQkJCX0gZWxzZSBpZiAodmVyYm9zZSkgeworCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yOiAiICsgcmVzdWx0ICsgIiB3YXMgcmV0dXJuZWQgZnJvbSBjb21tYW5kOiAiICsgVXRpbHMuY29uY2F0KGNtZCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQl9CisJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJaWYgKHZlcmJvc2UpCisJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmphcnByb2Nlc3Nvci5QYWNrU3RlcCNwcmVQcm9jZXNzKGphdmEuaW8uRmlsZSwgamF2YS5pby5GaWxlLCBqYXZhLnV0aWwuTGlua2VkTGlzdCkKKwkgKi8KKwlwdWJsaWMgRmlsZSBwcmVQcm9jZXNzKEZpbGUgaW5wdXQsIEZpbGUgd29ya2luZ0RpcmVjdG9yeSwgTGlzdCBjb250YWluZXJzKSB7CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0U3RlcE5hbWUoKSB7CisJCXJldHVybiAiUmVwYWNrIjsgLy8kTk9OLU5MUy0xJAorCX0KK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9qYXJwcm9jZXNzb3Ivb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2phcnByb2Nlc3Nvci9TaWduQ29tbWFuZFN0ZXAuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9qYXJwcm9jZXNzb3Ivb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2phcnByb2Nlc3Nvci9TaWduQ29tbWFuZFN0ZXAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODJlZDc1Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2phcnByb2Nlc3Nvci9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvamFycHJvY2Vzc29yL1NpZ25Db21tYW5kU3RlcC5qYXZhCkBAIC0wLDAgKzEsMTAxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmphcnByb2Nlc3NvcjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitwdWJsaWMgY2xhc3MgU2lnbkNvbW1hbmRTdGVwIGV4dGVuZHMgQ29tbWFuZFN0ZXAgeworCXByaXZhdGUgU2V0IGV4Y2x1c2lvbnMgPSBudWxsOworCisJcHVibGljIFNpZ25Db21tYW5kU3RlcChQcm9wZXJ0aWVzIG9wdGlvbnMsIFN0cmluZyBjb21tYW5kKSB7CisJCXN1cGVyKG9wdGlvbnMsIGNvbW1hbmQsICIuamFyIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkCisJCWV4Y2x1c2lvbnMgPSBVdGlscy5nZXRTaWduRXhjbHVzaW9ucyhvcHRpb25zKTsKKwl9CisKKwlwdWJsaWMgU2lnbkNvbW1hbmRTdGVwKFByb3BlcnRpZXMgb3B0aW9ucywgU3RyaW5nIGNvbW1hbmQsIGJvb2xlYW4gdmVyYm9zZSkgeworCQlzdXBlcihvcHRpb25zLCBjb21tYW5kLCAiLmphciIsIHZlcmJvc2UpOyAvLyROT04tTkxTLTEkCisJCWV4Y2x1c2lvbnMgPSBVdGlscy5nZXRTaWduRXhjbHVzaW9ucyhvcHRpb25zKTsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuamFycHJvY2Vzc29yLklQcm9jZXNzU3RlcCNyZWN1cnNpb25FZmZlY3QoamF2YS5sYW5nLlN0cmluZykKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIHJlY3Vyc2lvbkVmZmVjdChTdHJpbmcgZW50cnlOYW1lKSB7CisJCWlmIChlbnRyeU5hbWUuZW5kc1dpdGgoZXh0ZW5zaW9uKSAmJiAhZXhjbHVzaW9ucy5jb250YWlucyhlbnRyeU5hbWUpKQorCQkJcmV0dXJuIGVudHJ5TmFtZTsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmphcnByb2Nlc3Nvci5JUHJvY2Vzc1N0ZXAjcHJlUHJvY2VzcyhqYXZhLmlvLkZpbGUsIGphdmEuaW8uRmlsZSkKKwkgKi8KKwlwdWJsaWMgRmlsZSBwcmVQcm9jZXNzKEZpbGUgaW5wdXQsIEZpbGUgd29ya2luZ0RpcmVjdG9yeSwgTGlzdCBjb250YWluZXJzKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5qYXJwcm9jZXNzb3IuSVByb2Nlc3NTdGVwI3Bvc3RQcm9jZXNzKGphdmEuaW8uRmlsZSwgamF2YS5pby5GaWxlKQorCSAqLworCXB1YmxpYyBGaWxlIHBvc3RQcm9jZXNzKEZpbGUgaW5wdXQsIEZpbGUgd29ya2luZ0RpcmVjdG9yeSwgTGlzdCBjb250YWluZXJzKSB7CisJCWlmIChjb21tYW5kICE9IG51bGwgJiYgaW5wdXQgIT0gbnVsbCAmJiBzaG91bGRTaWduKGlucHV0LCBjb250YWluZXJzKSkgeworCQkJdHJ5IHsKKwkJCQlTdHJpbmdbXSBjbWQgPSBuZXcgU3RyaW5nW10ge2NvbW1hbmQsIGlucHV0LmdldENhbm9uaWNhbFBhdGgoKX07CisJCQkJaW50IHJlc3VsdCA9IGV4ZWN1dGUoY21kLCB2ZXJib3NlKTsKKwkJCQlpZiAocmVzdWx0ID09IDApIHsKKwkJCQkJcmV0dXJuIGlucHV0OworCQkJCX0gZWxzZSBpZiAodmVyYm9zZSkgeworCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yOiAiICsgcmVzdWx0ICsgIiB3YXMgcmV0dXJuZWQgZnJvbSBjb21tYW5kOiAiICsgVXRpbHMuY29uY2F0KGNtZCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQl9CisJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJaWYgKHZlcmJvc2UpIHsKKwkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIGJvb2xlYW4gc2hvdWxkU2lnbihGaWxlIGlucHV0LCBMaXN0IGNvbnRhaW5lcnMpIHsKKwkJUHJvcGVydGllcyBpbmYgPSBudWxsOworCisJCS8vMTogQXJlIHdlIGV4Y2x1ZGVkIGZyb20gc2lnbmluZyBieSBvdXIgcGFyZW50cz8KKwkJLy9pbm5lcm1vc3QgamFyIGlzIGZpcnN0IG9uIHRoZSBsaXN0LCBpdCBvdmVycmlkZXMgb3V0ZXIgamFycworCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gY29udGFpbmVycy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7CisJCQlpbmYgPSAoUHJvcGVydGllcykgaXRlcmF0b3IubmV4dCgpOworCQkJaWYgKGluZi5jb250YWluc0tleShVdGlscy5NQVJLX0VYQ0xVREVfQ0hJTERSRU5fU0lHTikpeworCQkJCWlmKEJvb2xlYW4udmFsdWVPZihpbmYuZ2V0UHJvcGVydHkoVXRpbHMuTUFSS19FWENMVURFX0NISUxEUkVOX1NJR04pKS5ib29sZWFuVmFsdWUoKSkgeworCQkJCQlpZiAodmVyYm9zZSkKKwkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihpbnB1dC5nZXROYW1lKCkgKyAiaXMgZXhjbHVkZWQgZnJvbSBzaWduaW5nIGJ5IGl0cyBjb250YWluZXJzLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCS8vMjogSXMgdGhpcyBqYXIgaXRzZWxmIG1hcmtlZCBhcyBleGNsdWRlPworCQlpbmYgPSBVdGlscy5nZXRFY2xpcHNlSW5mKGlucHV0LCB2ZXJib3NlKTsKKwkJaWYgKGluZiAhPSBudWxsICYmIGluZi5jb250YWluc0tleShVdGlscy5NQVJLX0VYQ0xVREVfU0lHTikgJiYgQm9vbGVhbi52YWx1ZU9mKGluZi5nZXRQcm9wZXJ0eShVdGlscy5NQVJLX0VYQ0xVREVfU0lHTikpLmJvb2xlYW5WYWx1ZSgpKSB7CisJCQlpZiAodmVyYm9zZSkKKwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkV4Y2x1ZGluZyAiICsgaW5wdXQuZ2V0TmFtZSgpICsgIiBmcm9tIHNpZ25pbmcuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCXJldHVybiB0cnVlOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0U3RlcE5hbWUoKSB7CisJCXJldHVybiAiU2lnbiI7IC8vJE5PTi1OTFMtMSQKKwl9Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvamFycHJvY2Vzc29yL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9qYXJwcm9jZXNzb3IvU3RyZWFtUHJvY2Vzc29yLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvamFycHJvY2Vzc29yL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9qYXJwcm9jZXNzb3IvU3RyZWFtUHJvY2Vzc29yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBiNWMzYQotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9qYXJwcm9jZXNzb3Ivb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2phcnByb2Nlc3Nvci9TdHJlYW1Qcm9jZXNzb3IuamF2YQpAQCAtMCwwICsxLDUzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5qYXJwcm9jZXNzb3I7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworCitwdWJsaWMgY2xhc3MgU3RyZWFtUHJvY2Vzc29yIGV4dGVuZHMgVGhyZWFkIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVERFUlIgPSAiU1RERVJSIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNURE9VVCA9ICJTVERPVVQiOyAvLyROT04tTkxTLTEkCisKKwlwcml2YXRlIElucHV0U3RyZWFtIGlucHV0U3RyZWFtOworCXByaXZhdGUgU3RyaW5nIG5hbWU7CisJcHJpdmF0ZSBib29sZWFuIHZlcmJvc2U7CisKKwlwdWJsaWMgU3RyZWFtUHJvY2Vzc29yKElucHV0U3RyZWFtIGlzLCBTdHJpbmcgbmFtZSwgYm9vbGVhbiB2ZXJib3NlKSB7CisJCXRoaXMuaW5wdXRTdHJlYW0gPSBpczsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwkJdGhpcy52ZXJib3NlID0gdmVyYm9zZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBydW4oKSB7CisJCXRyeSB7CisJCQlJbnB1dFN0cmVhbVJlYWRlciBpc3IgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW5wdXRTdHJlYW0pOworCQkJQnVmZmVyZWRSZWFkZXIgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoaXNyKTsKKwkJCXdoaWxlICh0cnVlKSB7CisJCQkJU3RyaW5nIHMgPSBici5yZWFkTGluZSgpOworCQkJCWlmIChzID09IG51bGwpIHsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWlmICh2ZXJib3NlKSB7CisJCQkJCWlmIChTVERFUlIuZXF1YWxzKG5hbWUpKQorCQkJCQkJU3lzdGVtLmVyci5wcmludGxuKG5hbWUgKyAiOiAiICsgcyk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJZWxzZQorCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKG5hbWUgKyAiOiAiICsgcyk7IC8vJE5PTi1OTFMtMSQKKwkJCQl9CisJCQl9CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCX0KKwl9CisKK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9qYXJwcm9jZXNzb3Ivb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2phcnByb2Nlc3Nvci9VbnBhY2tTdGVwLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvamFycHJvY2Vzc29yL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9qYXJwcm9jZXNzb3IvVW5wYWNrU3RlcC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkMzBkZDgKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvamFycHJvY2Vzc29yL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9qYXJwcm9jZXNzb3IvVW5wYWNrU3RlcC5qYXZhCkBAIC0wLDAgKzEsMTE3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5qYXJwcm9jZXNzb3I7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworLyoqCisgKiBAYXV0aG9yIGFuaWVmZXIKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBVbnBhY2tTdGVwIGV4dGVuZHMgQ29tbWFuZFN0ZXAgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVOUEFDS0VSX1BST1BFUlRZID0gIm9yZy5lY2xpcHNlLnVwZGF0ZS5qYXJwcm9jZXNzb3IuVW5wYWNrZXIiOyAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBzdGF0aWMgQm9vbGVhbiBjYW5VbnBhY2sgPSBudWxsOworCXByaXZhdGUgc3RhdGljIFN0cmluZyB1bnBhY2tDb21tYW5kID0gbnVsbDsKKworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjYW5VbnBhY2soKSB7CisJCWlmIChjYW5VbnBhY2sgIT0gbnVsbCkKKwkJCXJldHVybiBjYW5VbnBhY2suYm9vbGVhblZhbHVlKCk7CisKKwkJU3RyaW5nW10gbG9jYXRpb25zID0gVXRpbHMuZ2V0UGFjazIwMENvbW1hbmRzKCJ1bnBhY2syMDAiKTsgLy8kTk9OLU5MUy0xJAorCQlpZiAobG9jYXRpb25zID09IG51bGwpIHsKKwkJCWNhblVucGFjayA9IEJvb2xlYW4uRkFMU0U7CisJCQl1bnBhY2tDb21tYW5kID0gbnVsbDsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCWludCByZXN1bHQ7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbG9jYXRpb25zLmxlbmd0aDsgaSsrKSB7CisJCQlpZiAobG9jYXRpb25zW2ldID09IG51bGwpCisJCQkJY29udGludWU7CisJCQlyZXN1bHQgPSBleGVjdXRlKG5ldyBTdHJpbmdbXSB7bG9jYXRpb25zW2ldLCAiLVYifSk7IC8vJE5PTi1OTFMtMSQKKwkJCWlmIChyZXN1bHQgPT0gMCkgeworCQkJCXVucGFja0NvbW1hbmQgPSBsb2NhdGlvbnNbaV07CisJCQkJY2FuVW5wYWNrID0gQm9vbGVhbi5UUlVFOworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9CisKKwkJY2FuVW5wYWNrID0gQm9vbGVhbi5GQUxTRTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXB1YmxpYyBVbnBhY2tTdGVwKFByb3BlcnRpZXMgb3B0aW9ucykgeworCQlzdXBlcihvcHRpb25zLCBudWxsLCBudWxsLCBmYWxzZSk7CisJfQorCisJcHVibGljIFVucGFja1N0ZXAoUHJvcGVydGllcyBvcHRpb25zLCBib29sZWFuIHZlcmJvc2UpIHsKKwkJc3VwZXIob3B0aW9ucywgbnVsbCwgbnVsbCwgdmVyYm9zZSk7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmphcnByb2Nlc3Nvci5JUHJvY2Vzc1N0ZXAjcmVjdXJzaW9uRWZmZWN0KGphdmEubGFuZy5TdHJpbmcpCisJICovCisJcHVibGljIFN0cmluZyByZWN1cnNpb25FZmZlY3QoU3RyaW5nIGVudHJ5TmFtZSkgeworCQlpZiAoY2FuVW5wYWNrKCkgJiYgZW50cnlOYW1lLmVuZHNXaXRoKFV0aWxzLlBBQ0tFRF9TVUZGSVgpKSB7CisJCQlyZXR1cm4gZW50cnlOYW1lLnN1YnN0cmluZygwLCBlbnRyeU5hbWUubGVuZ3RoKCkgLSBVdGlscy5QQUNLRURfU1VGRklYLmxlbmd0aCgpKTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuamFycHJvY2Vzc29yLklQcm9jZXNzU3RlcCNwcmVQcm9jZXNzKGphdmEuaW8uRmlsZSwgamF2YS5pby5GaWxlKQorCSAqLworCXB1YmxpYyBGaWxlIHByZVByb2Nlc3MoRmlsZSBpbnB1dCwgRmlsZSB3b3JraW5nRGlyZWN0b3J5LCBMaXN0IGNvbnRhaW5lcnMpIHsKKwkJaWYgKGNhblVucGFjaygpICYmIHVucGFja0NvbW1hbmQgIT0gbnVsbCkgeworCQkJU3RyaW5nIG5hbWUgPSBpbnB1dC5nZXROYW1lKCk7CisJCQlpZiAobmFtZS5lbmRzV2l0aChVdGlscy5QQUNLRURfU1VGRklYKSkgeworCQkJCW5hbWUgPSBuYW1lLnN1YnN0cmluZygwLCBuYW1lLmxlbmd0aCgpIC0gVXRpbHMuUEFDS0VEX1NVRkZJWC5sZW5ndGgoKSk7CisKKwkJCQlGaWxlIHVucGFja2VkID0gbmV3IEZpbGUod29ya2luZ0RpcmVjdG9yeSwgbmFtZSk7CisJCQkJRmlsZSBwYXJlbnQgPSB1bnBhY2tlZC5nZXRQYXJlbnRGaWxlKCk7CisJCQkJaWYgKCFwYXJlbnQuZXhpc3RzKCkpCisJCQkJCXBhcmVudC5ta2RpcnMoKTsKKwkJCQl0cnkgeworCQkJCQlTdHJpbmcgb3B0aW9ucyA9IGdldE9wdGlvbnMoKS5nZXRQcm9wZXJ0eShpbnB1dC5nZXROYW1lKCkgKyAiLnVucGFjay5hcmdzIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJU3RyaW5nW10gY21kID0gbnVsbDsKKwkJCQkJaWYgKG9wdGlvbnMgIT0gbnVsbCkgeworCQkJCQkJY21kID0gbmV3IFN0cmluZ1tdIHt1bnBhY2tDb21tYW5kLCBvcHRpb25zLCBpbnB1dC5nZXRDYW5vbmljYWxQYXRoKCksIHVucGFja2VkLmdldENhbm9uaWNhbFBhdGgoKX07CisJCQkJCX0gZWxzZSB7CisJCQkJCQljbWQgPSBuZXcgU3RyaW5nW10ge3VucGFja0NvbW1hbmQsIGlucHV0LmdldENhbm9uaWNhbFBhdGgoKSwgdW5wYWNrZWQuZ2V0Q2Fub25pY2FsUGF0aCgpfTsKKwkJCQkJfQorCQkJCQlpbnQgcmVzdWx0ID0gZXhlY3V0ZShjbWQsIHZlcmJvc2UpOworCQkJCQlpZiAocmVzdWx0ICE9IDAgJiYgdmVyYm9zZSkKKwkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3I6ICIgKyByZXN1bHQgKyAiIHdhcyByZXR1cm5lZCBmcm9tIGNvbW1hbmQ6ICIgKyBVdGlscy5jb25jYXQoY21kKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQkJaWYgKHZlcmJvc2UpCisJCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQl9CisJCQkJcmV0dXJuIHVucGFja2VkOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5qYXJwcm9jZXNzb3IuSVByb2Nlc3NTdGVwI3Bvc3RQcm9jZXNzKGphdmEuaW8uRmlsZSwgamF2YS5pby5GaWxlKQorCSAqLworCXB1YmxpYyBGaWxlIHBvc3RQcm9jZXNzKEZpbGUgaW5wdXQsIEZpbGUgd29ya2luZ0RpcmVjdG9yeSwgTGlzdCBjb250YWluZXJzKSB7CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0U3RlcE5hbWUoKSB7CisJCXJldHVybiAiVW5wYWNrIjsgLy8kTk9OLU5MUy0xJAorCX0KK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9qYXJwcm9jZXNzb3Ivb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2phcnByb2Nlc3Nvci9VdGlscy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2phcnByb2Nlc3Nvci9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvamFycHJvY2Vzc29yL1V0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY0ZWJiZgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9qYXJwcm9jZXNzb3Ivb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2phcnByb2Nlc3Nvci9VdGlscy5qYXZhCkBAIC0wLDAgKzEsMzI2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmphcnByb2Nlc3NvcjsKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuamFyLio7CitpbXBvcnQgamF2YS51dGlsLnppcC5aaXBFeGNlcHRpb247CisKKy8qKgorICogQGF1dGhvciBhbmllZmVyQGNhLmlibS5jb20KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBVdGlscyB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFSS19GSUxFX05BTUUgPSAiTUVUQS1JTkYvZWNsaXBzZS5pbmYiOyAvLyROT04tTkxTLTEkCisJCisJLyoKKwkgKiBQcm9wZXJ0aWVzIGZvdW5kIGluIG91dGVyIHBhY2sucHJvcGVydGllcyBmaWxlCisJICovCisJLy9jb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBqYXJzIHRvIGV4Y2x1ZGUgZnJvbSBzaWdpbmluZworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNJR05fRVhDTFVERVMgPSAic2lnbi5leGNsdWRlcyI7IC8vJE5PTi1OTFMtMSQKKwkvL2NvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGphcnMgdG8gZXhsY2x1ZGUgZnJvbSBwYWNraW5nCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFDS19FWENMVURFUyA9ICJwYWNrLmV4Y2x1ZGVzIjsgLy8kTk9OLU5MUy0xJAorCS8vU3VmZml4IHVzZWQgd2hlbiBzcGVjaWZ5aW5nIGFyZ3VtZW50cyB0byB1c2Ugd2hlbiBydW5uaW5nIHBhY2syMDAgb24gYSBqYXIKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLX0FSR1NfU1VGRklYID0gIi5wYWNrLmFyZ3MiOyAvLyROT04tTkxTLTEkCisJCisJLyoKKwkgKiBQcm9wZXJ0aWVzIGZvdW5kIGluIGJvdGggcGFjay5wcm9wZXJ0aWVzIGFuZCBlY2xpcHNlLmluZgorCSAqLworCS8vCURlZmF1bHQgYXJndW1lbnRzIHRvIHVzZSB3aGVuIHJ1bm5pbmcgcGFjazIwMC4KKwkvLyBBZmZlY3RzIGFsbCBqYXJzIHdoZW4gc3BlY2lmaWVkIGluIHBhY2sucHJvcGVydGllcywgYWZmZWN0cyBjaGlsZHJlbiB3aGVuIHNwZWNpZmllZCBpbiBlY2xpcHNlLmluZgorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfUEFDS19BUkdTID0gInBhY2syMDAuZGVmYXVsdC5hcmdzIjsgLy8kTk9OLU5MUy0xJAorCQorCS8qCisJICogUHJvcGVydGllcyBmb3VuZCBpbiBlY2xpcHNlLmluZiBmaWxlCisJICovCisJLy9UaGlzIGphciBoYXMgYmVlbiBjb25kaXRpb25lZCB3aXRoIHBhY2syMDAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVJLX1BST1BFUlRZID0gInBhY2syMDAuY29uZGl0aW9uZWQiOyAvLyROT04tTkxTLTEkCisJLy9FeGNsdWRlIHRoaXMgamFyIGZyb20gcHJvY2Vzc2luZworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUktfRVhDTFVERSA9ICJqYXJwcm9jZXNzb3IuZXhjbHVkZSI7IC8vJE5PTi1OTFMtMSQKKwkvL0V4Y2x1ZGUgdGhpcyBqYXIgZnJvbSBwYWNrMjAwCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFSS19FWENMVURFX1BBQ0sgPSAiamFycHJvY2Vzc29yLmV4Y2x1ZGUucGFjayI7IC8vJE5PTi1OTFMtMSQKKwkvL0V4Y2x1ZGUgdGhpcyBqYXIgZnJvbSBzaWduaW5nCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFSS19FWENMVURFX1NJR04gPSAiamFycHJvY2Vzc29yLmV4Y2x1ZGUuc2lnbiI7IC8vJE5PTi1OTFMtMSQKKwkvL0V4Y2x1ZGUgdGhpcyBqYXIncyBjaGlsZHJlbiBmcm9tIHByb2Nlc3NpbmcKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVJLX0VYQ0xVREVfQ0hJTERSRU4gPSAiamFycHJvY2Vzc29yLmV4Y2x1ZGUuY2hpbGRyZW4iOworCS8vRXhjbHVkZSB0aGlzIGphcidzIGNoaWxkcmVuIGZyb20gcGFjazIwMAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUktfRVhDTFVERV9DSElMRFJFTl9QQUNLID0gImphcnByb2Nlc3Nvci5leGNsdWRlLmNoaWxkcmVuLnBhY2siOworCS8vRXhjbHVkZSB0aGlzIGphcidzIGNoaWxkcmVuIGZyb20gc2lnbmluZworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUktfRVhDTFVERV9DSElMRFJFTl9TSUdOID0gImphcnByb2Nlc3Nvci5leGNsdWRlLmNoaWxkcmVuLnNpZ24iOworCS8vQXJndW1lbnRzIHVzZWQgaW4gcGFjazIwMCBmb3IgdGhpcyBqYXIKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLX0FSR1MgPSAicGFjazIwMC5hcmdzIjsgLy8kTk9OLU5MUy0xJAorCQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBQ0syMDBfUFJPUEVSVFkgPSAib3JnLmVjbGlwc2UudXBkYXRlLmphcnByb2Nlc3Nvci5wYWNrMjAwIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpSRSA9ICJAanJlIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEggPSAiQHBhdGgiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ORSA9ICJAbm9uZSI7IC8vJE5PTi1OTFMtMSQKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBQ0tFRF9TVUZGSVggPSAiLnBhY2suZ3oiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFSX1NVRkZJWCA9ICIuamFyIjsgLy8kTk9OLU5MUy0xJAorCisJcHVibGljIHN0YXRpYyBmaW5hbCBGaWxlRmlsdGVyIEpBUl9GSUxURVIgPSBuZXcgRmlsZUZpbHRlcigpIHsKKwkJcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgcGF0aG5hbWUpIHsKKwkJCXJldHVybiBwYXRobmFtZS5pc0ZpbGUoKSAmJiBwYXRobmFtZS5nZXROYW1lKCkuZW5kc1dpdGgoIi5qYXIiKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJfTsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgRmlsZUZpbHRlciBQQUNLX0daX0ZJTFRFUiA9IG5ldyBGaWxlRmlsdGVyKCkgeworCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBwYXRobmFtZSkgeworCQkJcmV0dXJuIHBhdGhuYW1lLmlzRmlsZSgpICYmIHBhdGhuYW1lLmdldE5hbWUoKS5lbmRzV2l0aChQQUNLRURfU1VGRklYKTsKKwkJfQorCX07CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgY2xvc2UoT2JqZWN0IHN0cmVhbSkgeworCQlpZiAoc3RyZWFtICE9IG51bGwpIHsKKwkJCXRyeSB7CisJCQkJaWYgKHN0cmVhbSBpbnN0YW5jZW9mIElucHV0U3RyZWFtKQorCQkJCQkoKElucHV0U3RyZWFtKSBzdHJlYW0pLmNsb3NlKCk7CisJCQkJZWxzZSBpZiAoc3RyZWFtIGluc3RhbmNlb2YgT3V0cHV0U3RyZWFtKQorCQkJCQkoKE91dHB1dFN0cmVhbSkgc3RyZWFtKS5jbG9zZSgpOworCQkJCWVsc2UgaWYgKHN0cmVhbSBpbnN0YW5jZW9mIEphckZpbGUpCisJCQkJCSgoSmFyRmlsZSkgc3RyZWFtKS5jbG9zZSgpOworCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCS8vaWdub3JlCisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBnZXQgdGhlIHNldCBvZiBjb21tYW5kcyB0byB0cnkgdG8gZXhlY3V0ZSBwYWNrL3VucGFjayAKKwkgKiBAcGFyYW0gY21kLCB0aGUgY29tbWFuZCwgZWl0aGVyICJwYWNrMjAwIiBvciAidW5wYWNrMjAwIgorCSAqIEByZXR1cm4gU3RyaW5nIFtdIG9yIG51bGwKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldFBhY2syMDBDb21tYW5kcyhTdHJpbmcgY21kKSB7CisJCVN0cmluZ1tdIGxvY2F0aW9ucyA9IG51bGw7CisJCVN0cmluZyBwcm9wID0gU3lzdGVtLmdldFByb3BlcnR5KFBBQ0syMDBfUFJPUEVSVFkpOworCQlTdHJpbmcgamF2YUhvbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaG9tZSIpOyAvLyROT04tTkxTLTEkCisJCWlmIChOT05FLmVxdWFscyhwcm9wKSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0gZWxzZSBpZiAoSlJFLmVxdWFscyhwcm9wKSkgeworCQkJbG9jYXRpb25zID0gbmV3IFN0cmluZ1tdIHtqYXZhSG9tZSArICIvYmluLyIgKyBjbWR9OyAvLyROT04tTkxTLTEkCisJCX0gZWxzZSBpZiAoUEFUSC5lcXVhbHMocHJvcCkpIHsKKwkJCWxvY2F0aW9ucyA9IG5ldyBTdHJpbmdbXSB7Y21kfTsKKwkJfSBlbHNlIGlmIChwcm9wID09IG51bGwpIHsKKwkJCWxvY2F0aW9ucyA9IG5ldyBTdHJpbmdbXSB7amF2YUhvbWUgKyAiL2Jpbi8iICsgY21kLCBjbWR9OyAvLyROT04tTkxTLTEkIAorCQl9IGVsc2UgeworCQkJbG9jYXRpb25zID0gbmV3IFN0cmluZ1tdIHtwcm9wICsgIi8iICsgY21kfTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCXJldHVybiBsb2NhdGlvbnM7CisJfQorCisJLyoqCisJICogVHJhbnNmZXJzIGFsbCBhdmFpbGFibGUgYnl0ZXMgZnJvbSB0aGUgZ2l2ZW4gaW5wdXQgc3RyZWFtIHRvIHRoZSBnaXZlbgorCSAqIG91dHB1dCBzdHJlYW0uIENsb3NlcyBib3RoIHN0cmVhbXMgaWYgY2xvc2UgPT0gdHJ1ZSwgcmVnYXJkbGVzcyBvZiBmYWlsdXJlLiAKKwkgKiBGbHVzaGVzIHRoZSBkZXN0aW5hdGlvbiBzdHJlYW0gaWYgY2xvc2UgPT0gZmFsc2UKKwkgKiAKKwkgKiBAcGFyYW0gc291cmNlCisJICogQHBhcmFtIGRlc3RpbmF0aW9uCisJICogQHBhcmFtIGNsb3NlIAorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgdHJhbnNmZXJTdHJlYW1zKElucHV0U3RyZWFtIHNvdXJjZSwgT3V0cHV0U3RyZWFtIGRlc3RpbmF0aW9uLCBib29sZWFuIGNsb3NlKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlzb3VyY2UgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShzb3VyY2UpOworCQlkZXN0aW5hdGlvbiA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShkZXN0aW5hdGlvbik7CisJCXRyeSB7CisJCQlieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbODE5Ml07CisJCQl3aGlsZSAodHJ1ZSkgeworCQkJCWludCBieXRlc1JlYWQgPSAtMTsKKwkJCQlpZiAoKGJ5dGVzUmVhZCA9IHNvdXJjZS5yZWFkKGJ1ZmZlcikpID09IC0xKQorCQkJCQlicmVhazsKKwkJCQlkZXN0aW5hdGlvbi53cml0ZShidWZmZXIsIDAsIGJ5dGVzUmVhZCk7CisJCQl9CisJCX0gZmluYWxseSB7CisJCQlpZiAoY2xvc2UpIHsKKwkJCQljbG9zZShzb3VyY2UpOworCQkJCWNsb3NlKGRlc3RpbmF0aW9uKTsKKwkJCX0gZWxzZSB7CisJCQkJZGVzdGluYXRpb24uZmx1c2goKTsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIERlbGV0ZXMgYWxsIHRoZSBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgZnJvbSB0aGUgZ2l2ZW4gcm9vdCBkb3duIChpbmNsdXNpdmUpLgorCSAqIFJldHVybnMgZmFsc2UgaWYgd2UgY291bGQgbm90IGRlbGV0ZSBzb21lIGZpbGUgb3IgYW4gZXhjZXB0aW9uIG9jY3VycmVkCisJICogYXQgYW55IHBvaW50IGluIHRoZSBkZWxldGlvbi4KKwkgKiBFdmVuIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMsIGEgYmVzdCBlZmZvcnQgaXMgbWFkZSB0byBjb250aW51ZSBkZWxldGluZy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2xlYXIoamF2YS5pby5GaWxlIHJvb3QpIHsKKwkJYm9vbGVhbiByZXN1bHQgPSBjbGVhckNoaWxkcmVuKHJvb3QpOworCQl0cnkgeworCQkJaWYgKHJvb3QuZXhpc3RzKCkpCisJCQkJcmVzdWx0ICY9IHJvb3QuZGVsZXRlKCk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlyZXN1bHQgPSBmYWxzZTsKKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIERlbGV0ZXMgYWxsIHRoZSBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgZnJvbSB0aGUgZ2l2ZW4gcm9vdCBkb3duLCBleGNlcHQgZm9yIAorCSAqIHRoZSByb290IGl0c2VsZi4KKwkgKiBSZXR1cm5zIGZhbHNlIGlmIHdlIGNvdWxkIG5vdCBkZWxldGUgc29tZSBmaWxlIG9yIGFuIGV4Y2VwdGlvbiBvY2N1cnJlZAorCSAqIGF0IGFueSBwb2ludCBpbiB0aGUgZGVsZXRpb24uCisJICogRXZlbiBpZiBhbiBleGNlcHRpb24gb2NjdXJzLCBhIGJlc3QgZWZmb3J0IGlzIG1hZGUgdG8gY29udGludWUgZGVsZXRpbmcuCisJICovCisJcHVibGljIHN0YXRpYyBib29sZWFuIGNsZWFyQ2hpbGRyZW4oamF2YS5pby5GaWxlIHJvb3QpIHsKKwkJYm9vbGVhbiByZXN1bHQgPSB0cnVlOworCQlpZiAocm9vdC5pc0RpcmVjdG9yeSgpKSB7CisJCQlTdHJpbmdbXSBsaXN0ID0gcm9vdC5saXN0KCk7CisJCQkvLyBmb3Igc29tZSB1bmtub3duIHJlYXNvbiwgbGlzdCgpIGNhbiByZXR1cm4gbnVsbC4gIAorCQkJLy8gSnVzdCBza2lwIHRoZSBjaGlsZHJlbiBJZiBpdCBkb2VzLgorCQkJaWYgKGxpc3QgIT0gbnVsbCkKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspCisJCQkJCXJlc3VsdCAmPSBjbGVhcihuZXcgamF2YS5pby5GaWxlKHJvb3QsIGxpc3RbaV0pKTsKKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXB1YmxpYyBzdGF0aWMgU2V0IGdldFBhY2tFeGNsdXNpb25zKFByb3BlcnRpZXMgcHJvcGVydGllcykgeworCQlpZiAocHJvcGVydGllcyA9PSBudWxsKQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX1NFVDsKKworCQlTdHJpbmcgcGFja0V4Y2x1ZGVzID0gcHJvcGVydGllcy5nZXRQcm9wZXJ0eShQQUNLX0VYQ0xVREVTKTsKKwkJaWYgKHBhY2tFeGNsdWRlcyAhPSBudWxsKSB7CisJCQlTdHJpbmdbXSBleGNsdWRlcyA9IHRvU3RyaW5nQXJyYXkocGFja0V4Y2x1ZGVzLCAiLCIpOyAvLyROT04tTkxTLTEkCisJCQlTZXQgcGFja0V4Y2x1c2lvbnMgPSBuZXcgSGFzaFNldCgpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleGNsdWRlcy5sZW5ndGg7IGkrKykgeworCQkJCXBhY2tFeGNsdXNpb25zLmFkZChleGNsdWRlc1tpXSk7CisJCQl9CisJCQlyZXR1cm4gcGFja0V4Y2x1c2lvbnM7CisJCX0KKwkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX1NFVDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFNldCBnZXRTaWduRXhjbHVzaW9ucyhQcm9wZXJ0aWVzIHByb3BlcnRpZXMpIHsKKwkJaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkKKwkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9TRVQ7CisJCVN0cmluZyBzaWduRXhjbHVkZXMgPSBwcm9wZXJ0aWVzLmdldFByb3BlcnR5KFNJR05fRVhDTFVERVMpOworCQlpZiAoc2lnbkV4Y2x1ZGVzICE9IG51bGwpIHsKKwkJCVN0cmluZ1tdIGV4Y2x1ZGVzID0gdG9TdHJpbmdBcnJheShzaWduRXhjbHVkZXMsICIsIik7IC8vJE5PTi1OTFMtMSQKKwkJCVNldCBzaWduRXhjbHVzaW9ucyA9IG5ldyBIYXNoU2V0KCk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGV4Y2x1ZGVzLmxlbmd0aDsgaSsrKSB7CisJCQkJc2lnbkV4Y2x1c2lvbnMuYWRkKGV4Y2x1ZGVzW2ldKTsKKwkJCX0KKwkJCXJldHVybiBzaWduRXhjbHVzaW9uczsKKwkJfQorCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfU0VUOworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmNhdChTdHJpbmdbXSBhcnJheSkgeworCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQlmb3IgKGludCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7CisJCQlpZiAoaSA+IDApCisJCQkJYnVmZmVyLmFwcGVuZCgnICcpOworCQkJYnVmZmVyLmFwcGVuZChhcnJheVtpXSk7CisJCX0KKwkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gdG9TdHJpbmdBcnJheShTdHJpbmcgaW5wdXQsIFN0cmluZyBzZXBhcmF0b3IpIHsKKwkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoaW5wdXQsIHNlcGFyYXRvcik7CisJCWludCBjb3VudCA9IHRva2VuaXplci5jb3VudFRva2VucygpOworCQlTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nW2NvdW50XTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCQlyZXN1bHRbaV0gPSB0b2tlbml6ZXIubmV4dFRva2VuKCkudHJpbSgpOworCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoqCisJICogR2V0IHRoZSBwcm9wZXJ0aWVzIGZyb20gdGhlIGVjbGlwc2UuaW5mIGZpbGUgZnJvbSB0aGUgZ2l2ZW4gamFyLiAgSWYgdGhlIGZpbGUgaXMgbm90IGEgamFyLCBudWxsIGlzIHJldHVybmVkLgorCSAqIElmIHRoZSBmaWxlIGlzIGEgamFyLCBidXQgZG9lcyBub3QgY29udGFpbiBhbiBlY2xpcHNlLmluZiBmaWxlLCBhbiBlbXB0eSBQcm9wZXJ0aWVzIG9iamVjdCBpcyByZXR1cm5lZC4KKwkgKiBAcGFyYW0gamFyRmlsZQorCSAqIEByZXR1cm4gVGhlIGVjbGlwc2UuaW5mIHByb3BlcnRpZXMgZm9yIHRoZSBnaXZlbiBqYXIgZmlsZQorCSAqLworCXB1YmxpYyBzdGF0aWMgUHJvcGVydGllcyBnZXRFY2xpcHNlSW5mKEZpbGUgamFyRmlsZSwgYm9vbGVhbiB2ZXJib3NlKSB7CisJCWlmIChqYXJGaWxlID09IG51bGwgfHwgIWphckZpbGUuZXhpc3RzKCkpIHsKKwkJCWlmICh2ZXJib3NlKQorCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRmFpbGVkIHRvIG9idGFpbiBlY2xpcHNlLmluZiBkdWUgdG8gbWlzc2luZyBqYXIgZmlsZTogIiArIGphckZpbGUpOworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJSmFyRmlsZSBqYXIgPSBudWxsOworCQl0cnkgeworCQkJamFyID0gbmV3IEphckZpbGUoamFyRmlsZSwgZmFsc2UpOworCQl9IGNhdGNoIChaaXBFeGNlcHRpb24gZSkgeworCQkJLy9ub3QgYSBqYXIsIGRvbid0IGJvdGhlciBsb2dnaW5nIHRoaXMuCisJCQlyZXR1cm4gbnVsbDsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJaWYgKHZlcmJvc2UpIHsKKwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkZhaWxlZCB0byBvYnRhaW4gZWNsaXBzZS5pbmYgZHVlIHRvIElPRXhjZXB0aW9uOiAiICsgamFyRmlsZSk7CisJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCX0KKwkJCXJldHVybiBudWxsOworCQl9CisJCXRyeSB7CisJCQlKYXJFbnRyeSBtYXJrID0gamFyLmdldEphckVudHJ5KE1BUktfRklMRV9OQU1FKTsKKwkJCWlmIChtYXJrICE9IG51bGwpIHsKKwkJCQlJbnB1dFN0cmVhbSBpbiA9IGphci5nZXRJbnB1dFN0cmVhbShtYXJrKTsKKwkJCQlQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKKwkJCQlwcm9wcy5sb2FkKGluKTsKKwkJCQlpbi5jbG9zZSgpOworCQkJCXJldHVybiBwcm9wczsKKwkJCX0KKwkJCXJldHVybiBuZXcgUHJvcGVydGllcygpOworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQlpZiAodmVyYm9zZSkgeworCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRmFpbGVkIHRvIG9idGFpbiBlY2xpcHNlLmluZiBkdWUgdG8gSU9FeGNlcHRpb246ICIgKyBqYXJGaWxlKTsKKwkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJfQorCQkJcmV0dXJuIG51bGw7CisJCX0gZmluYWxseSB7CisJCQljbG9zZShqYXIpOworCQl9CisJfQorCisJcHVibGljIHN0YXRpYyBib29sZWFuIHNob3VsZFNraXBKYXIoRmlsZSBpbnB1dCwgYm9vbGVhbiBwcm9jZXNzQWxsLCBib29sZWFuIHZlcmJvc2UpIHsKKwkJUHJvcGVydGllcyBpbmYgPSBnZXRFY2xpcHNlSW5mKGlucHV0LCB2ZXJib3NlKTsKKwkJaWYgKGluZiA9PSBudWxsKSB7CisJCQkvL25vdCBhIGphciwgY291bGQgYmUgYSBwYWNrLmd6CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJU3RyaW5nIGV4Y2x1ZGUgPSBpbmYuZ2V0UHJvcGVydHkoTUFSS19FWENMVURFKTsKKworCQkvL3dhcyBtYXJrZWQgYXMgZXhjbHVkZSwgd2Ugc2hvdWxkIHNraXAKKwkJaWYgKGV4Y2x1ZGUgIT0gbnVsbCAmJiBCb29sZWFuLnZhbHVlT2YoZXhjbHVkZSkuYm9vbGVhblZhbHVlKCkpCisJCQlyZXR1cm4gdHJ1ZTsKKworCQkvL3Byb2Nlc3MgYWxsIHdhcyBzZXQsIGRvbid0IHNraXAKKwkJaWYgKHByb2Nlc3NBbGwpCisJCQlyZXR1cm4gZmFsc2U7CisKKwkJLy9vdGhlcndpc2UsIHdlIHNraXAgaWYgbm90IG1hcmtlZCBtYXJrZWQKKwkJU3RyaW5nIG1hcmtlZCA9IGluZi5nZXRQcm9wZXJ0eShNQVJLX1BST1BFUlRZKTsKKwkJcmV0dXJuICFCb29sZWFuLnZhbHVlT2YobWFya2VkKS5ib29sZWFuVmFsdWUoKTsKKwl9CisKKwkvKioKKwkgKiBTdG9yZXMgdGhlIGdpdmVuIHByb3BlcnRpZXMgaW4gdGhlIG91dHB1dCBzdHJlYW0uICBXZSBzdG9yZSB0aGUgcHJvcGVydGllcyAKKwkgKiBpbiBzb3J0ZWQgb3JkZXIgc28gdGhhdCB0aGUgc2lnbmluZyBoYXNoIGRvZXNuJ3QgY2hhbmdlIGlmIHRoZSBwcm9wZXJ0aWVzIGRpZG4ndCBjaGFuZ2UuIAorCSAqIEBwYXJhbSBwcm9wcworCSAqIEBwYXJhbSBzdHJlYW0KKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgc3RvcmVQcm9wZXJ0aWVzKFByb3BlcnRpZXMgcHJvcHMsIE91dHB1dFN0cmVhbSBzdHJlYW0pIHsKKwkJUHJpbnRTdHJlYW0gcHJpbnRTdHJlYW0gPSBuZXcgUHJpbnRTdHJlYW0oc3RyZWFtKTsKKwkJcHJpbnRTdHJlYW0ucHJpbnQoIiNQcm9jZXNzZWQgdXNpbmcgSmFycHJvY2Vzc29yXG4iKTsgLy8kTk9OLU5MUy0xJAorCQlTb3J0ZWRNYXAgc29ydGVkID0gbmV3IFRyZWVNYXAocHJvcHMpOworCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzb3J0ZWQua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisJCQlTdHJpbmcga2V5ID0gKFN0cmluZykgaXRlci5uZXh0KCk7CisJCQlwcmludFN0cmVhbS5wcmludChrZXkpOworCQkJcHJpbnRTdHJlYW0ucHJpbnQoIiA9ICIpOyAvLyROT04tTkxTLTEkCisJCQlwcmludFN0cmVhbS5wcmludChzb3J0ZWQuZ2V0KGtleSkpOworCQkJcHJpbnRTdHJlYW0ucHJpbnQoIlxuIik7CisKKwkJfQorCQlwcmludFN0cmVhbS5mbHVzaCgpOworCX0KK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9qYXJwcm9jZXNzb3Ivb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2phcnByb2Nlc3Nvci9aaXBQcm9jZXNzb3IuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9qYXJwcm9jZXNzb3Ivb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2phcnByb2Nlc3Nvci9aaXBQcm9jZXNzb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMThiNjY3Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2phcnByb2Nlc3Nvci9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvamFycHJvY2Vzc29yL1ppcFByb2Nlc3Nvci5qYXZhCkBAIC0wLDAgKzEsMjQzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5qYXJwcm9jZXNzb3I7CisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLnppcC4qOworCisvKioKKyAqIEBhdXRob3IgYW5pZWZlckBjYS5pYm0uY29tCisgKgorICovCitwdWJsaWMgY2xhc3MgWmlwUHJvY2Vzc29yIHsKKworCXByaXZhdGUgSVByb2Nlc3NTdGVwIHNpZ25TdGVwID0gbnVsbDsKKwlwcml2YXRlIElQcm9jZXNzU3RlcCBwYWNrU3RlcCA9IG51bGw7CisJcHJpdmF0ZSBJUHJvY2Vzc1N0ZXAgcGFja1VucGFja1N0ZXAgPSBudWxsOworCXByaXZhdGUgSVByb2Nlc3NTdGVwIHVucGFja1N0ZXAgPSBudWxsOworCisJcHJpdmF0ZSBTdHJpbmcgd29ya2luZ0RpcmVjdG9yeSA9IG51bGw7CisJcHJpdmF0ZSBQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBudWxsOworCXByaXZhdGUgU2V0IHBhY2tFeGNsdXNpb25zID0gbnVsbDsKKwlwcml2YXRlIFNldCBzaWduRXhjbHVzaW9ucyA9IG51bGw7CisJcHJpdmF0ZSBTdHJpbmcgY29tbWFuZCA9IG51bGw7CisJcHJpdmF0ZSBib29sZWFuIHBhY2tpbmcgPSBmYWxzZTsKKwlwcml2YXRlIGJvb2xlYW4gc2lnbmluZyA9IGZhbHNlOworCXByaXZhdGUgYm9vbGVhbiByZXBhY2tpbmcgPSBmYWxzZTsKKwlwcml2YXRlIGJvb2xlYW4gdW5wYWNraW5nID0gZmFsc2U7CisJcHJpdmF0ZSBib29sZWFuIHZlcmJvc2UgPSBmYWxzZTsKKwlwcml2YXRlIGJvb2xlYW4gcHJvY2Vzc0FsbCA9IGZhbHNlOworCisJcHVibGljIHZvaWQgc2V0V29ya2luZ0RpcmVjdG9yeShTdHJpbmcgZGlyKSB7CisJCXdvcmtpbmdEaXJlY3RvcnkgPSBkaXI7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRXb3JraW5nRGlyZWN0b3J5KCkgeworCQlpZiAod29ya2luZ0RpcmVjdG9yeSA9PSBudWxsKQorCQkJd29ya2luZ0RpcmVjdG9yeSA9ICIuIjsgLy8kTk9OLU5MUy0xJAorCQlyZXR1cm4gd29ya2luZ0RpcmVjdG9yeTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTaWduQ29tbWFuZChTdHJpbmcgY29tbWFuZCkgeworCQl0aGlzLmNvbW1hbmQgPSBjb21tYW5kOworCQl0aGlzLnNpZ25pbmcgPSAoY29tbWFuZCAhPSBudWxsKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRQYWNrKGJvb2xlYW4gcGFjaykgeworCQl0aGlzLnBhY2tpbmcgPSBwYWNrOworCX0KKworCXB1YmxpYyB2b2lkIHNldFJlcGFjayhib29sZWFuIHJlcGFjaykgeworCQl0aGlzLnJlcGFja2luZyA9IHJlcGFjazsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRVbnBhY2soYm9vbGVhbiB1bnBhY2spIHsKKwkJdGhpcy51bnBhY2tpbmcgPSB1bnBhY2s7CisJfQorCisJcHVibGljIHZvaWQgc2V0VmVyYm9zZShib29sZWFuIHZlcmJvc2UpIHsKKwkJdGhpcy52ZXJib3NlID0gdmVyYm9zZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRQcm9jZXNzQWxsKGJvb2xlYW4gYWxsKSB7CisJCXRoaXMucHJvY2Vzc0FsbCA9IGFsbDsKKwl9CisKKwlwdWJsaWMgdm9pZCBwcm9jZXNzWmlwKEZpbGUgemlwRmlsZSkgdGhyb3dzIFppcEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCQlpZiAodmVyYm9zZSkKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiUHJvY2Vzc2luZyAiICsgemlwRmlsZS5nZXRQYXRoKCkpOyAvLyROT04tTkxTLTEkCisJCVppcEZpbGUgemlwID0gbmV3IFppcEZpbGUoemlwRmlsZSk7CisJCWluaXRpYWxpemUoemlwKTsKKworCQlTdHJpbmcgZXh0ZW5zaW9uID0gdW5wYWNraW5nID8gInBhY2suZ3oiIDogIi5qYXIiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJRmlsZSB0ZW1wRGlyID0gbmV3IEZpbGUoZ2V0V29ya2luZ0RpcmVjdG9yeSgpLCAidGVtcF8iICsgemlwRmlsZS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCisJCUphclByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgSmFyUHJvY2Vzc29yKCk7CisJCXByb2Nlc3Nvci5zZXRWZXJib3NlKHZlcmJvc2UpOworCQlwcm9jZXNzb3Iuc2V0UHJvY2Vzc0FsbChwcm9jZXNzQWxsKTsKKwkJcHJvY2Vzc29yLnNldFdvcmtpbmdEaXJlY3RvcnkodGVtcERpci5nZXRDYW5vbmljYWxQYXRoKCkpOworCQlpZiAodW5wYWNraW5nKSB7CisJCQlwcm9jZXNzb3IuYWRkUHJvY2Vzc1N0ZXAodW5wYWNrU3RlcCk7CisJCX0KKworCQlGaWxlIG91dHB1dEZpbGUgPSBuZXcgRmlsZShnZXRXb3JraW5nRGlyZWN0b3J5KCksIHppcEZpbGUuZ2V0TmFtZSgpICsgIi50ZW1wIik7IC8vJE5PTi1OTFMtMSQKKwkJRmlsZSBwYXJlbnQgPSBvdXRwdXRGaWxlLmdldFBhcmVudEZpbGUoKTsKKwkJaWYgKCFwYXJlbnQuZXhpc3RzKCkpCisJCQlwYXJlbnQubWtkaXJzKCk7CisJCVppcE91dHB1dFN0cmVhbSB6aXBPdXQgPSBuZXcgWmlwT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKG91dHB1dEZpbGUpKTsKKwkJRW51bWVyYXRpb24gZW50cmllcyA9IHppcC5lbnRyaWVzKCk7CisJCWlmIChlbnRyaWVzLmhhc01vcmVFbGVtZW50cygpKSB7CisJCQlmb3IgKFppcEVudHJ5IGVudHJ5ID0gKFppcEVudHJ5KSBlbnRyaWVzLm5leHRFbGVtZW50KCk7IGVudHJ5ICE9IG51bGw7IGVudHJ5ID0gZW50cmllcy5oYXNNb3JlRWxlbWVudHMoKSA/IChaaXBFbnRyeSkgZW50cmllcy5uZXh0RWxlbWVudCgpIDogbnVsbCkgeworCQkJCVN0cmluZyBuYW1lID0gZW50cnkuZ2V0TmFtZSgpOworCisJCQkJSW5wdXRTdHJlYW0gZW50cnlTdHJlYW0gPSB6aXAuZ2V0SW5wdXRTdHJlYW0oZW50cnkpOworCisJCQkJYm9vbGVhbiBwYWNrID0gcGFja2luZyAmJiAhcGFja0V4Y2x1c2lvbnMuY29udGFpbnMobmFtZSk7CisJCQkJYm9vbGVhbiBzaWduID0gc2lnbmluZyAmJiAhc2lnbkV4Y2x1c2lvbnMuY29udGFpbnMobmFtZSk7CisJCQkJYm9vbGVhbiByZXBhY2sgPSByZXBhY2tpbmcgJiYgIXBhY2tFeGNsdXNpb25zLmNvbnRhaW5zKG5hbWUpOworCisJCQkJRmlsZSBleHRyYWN0ZWRGaWxlID0gbnVsbDsKKworCQkJCWlmIChlbnRyeS5nZXROYW1lKCkuZW5kc1dpdGgoZXh0ZW5zaW9uKSAmJiAocGFjayB8fCBzaWduIHx8IHJlcGFjayB8fCB1bnBhY2tpbmcpKSB7CisJCQkJCWV4dHJhY3RlZEZpbGUgPSBuZXcgRmlsZSh0ZW1wRGlyLCBuYW1lKTsKKwkJCQkJcGFyZW50ID0gZXh0cmFjdGVkRmlsZS5nZXRQYXJlbnRGaWxlKCk7CisJCQkJCWlmICghcGFyZW50LmV4aXN0cygpKQorCQkJCQkJcGFyZW50Lm1rZGlycygpOworCQkJCQlpZiAodmVyYm9zZSkKKwkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXh0cmFjdGluZyAiICsgZW50cnkuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlGaWxlT3V0cHV0U3RyZWFtIGV4dHJhY3RlZCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGV4dHJhY3RlZEZpbGUpOworCQkJCQlVdGlscy50cmFuc2ZlclN0cmVhbXMoZW50cnlTdHJlYW0sIGV4dHJhY3RlZCwgdHJ1ZSk7IC8vIHRoaXMgd2lsbCBjbG9zZSB0aGUgc3RyZWFtCisJCQkJCWVudHJ5U3RyZWFtID0gbnVsbDsKKworCQkJCQlib29sZWFuIHNraXAgPSBVdGlscy5zaG91bGRTa2lwSmFyKGV4dHJhY3RlZEZpbGUsIHByb2Nlc3NBbGwsIHZlcmJvc2UpOworCQkJCQlpZiAoc2tpcCkgeworCQkJCQkJLy9za2lwcGluZyB0aGlzIGZpbGUgCisJCQkJCQllbnRyeVN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZXh0cmFjdGVkRmlsZSk7CisJCQkJCQlpZiAodmVyYm9zZSkKKwkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZW50cnkuZ2V0TmFtZSgpICsgIiBpcyBub3QgbWFya2VkLCBza2lwcGluZy4iKTsgLy8kTk9OLU5MUy0xJAorCQkJCQl9IGVsc2UgeworCQkJCQkJaWYgKHVucGFja2luZykgeworCQkJCQkJCUZpbGUgcmVzdWx0ID0gcHJvY2Vzc29yLnByb2Nlc3NKYXIoZXh0cmFjdGVkRmlsZSk7CisJCQkJCQkJbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDAsIG5hbWUubGVuZ3RoKCkgLSBleHRyYWN0ZWRGaWxlLmdldE5hbWUoKS5sZW5ndGgoKSkgKyByZXN1bHQuZ2V0TmFtZSgpOworCQkJCQkJCWV4dHJhY3RlZEZpbGUgPSByZXN1bHQ7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWlmIChyZXBhY2sgfHwgc2lnbikgeworCQkJCQkJCQlwcm9jZXNzb3IuY2xlYXJQcm9jZXNzU3RlcHMoKTsKKwkJCQkJCQkJaWYgKHJlcGFjaykKKwkJCQkJCQkJCXByb2Nlc3Nvci5hZGRQcm9jZXNzU3RlcChwYWNrVW5wYWNrU3RlcCk7CisJCQkJCQkJCWlmIChzaWduKQorCQkJCQkJCQkJcHJvY2Vzc29yLmFkZFByb2Nlc3NTdGVwKHNpZ25TdGVwKTsKKwkJCQkJCQkJZXh0cmFjdGVkRmlsZSA9IHByb2Nlc3Nvci5wcm9jZXNzSmFyKGV4dHJhY3RlZEZpbGUpOworCQkJCQkJCX0KKwkJCQkJCQlpZiAocGFjaykgeworCQkJCQkJCQlwcm9jZXNzb3IuY2xlYXJQcm9jZXNzU3RlcHMoKTsKKwkJCQkJCQkJcHJvY2Vzc29yLmFkZFByb2Nlc3NTdGVwKHBhY2tTdGVwKTsKKwkJCQkJCQkJRmlsZSBtb2RpZmllZEZpbGUgPSBwcm9jZXNzb3IucHJvY2Vzc0phcihleHRyYWN0ZWRGaWxlKTsKKwkJCQkJCQkJaWYgKG1vZGlmaWVkRmlsZS5leGlzdHMoKSkgeworCQkJCQkJCQkJdHJ5IHsKKwkJCQkJCQkJCQlTdHJpbmcgbmV3TmFtZSA9IG5hbWUuc3Vic3RyaW5nKDAsIG5hbWUubGVuZ3RoKCkgLSBleHRyYWN0ZWRGaWxlLmdldE5hbWUoKS5sZW5ndGgoKSkgKyBtb2RpZmllZEZpbGUuZ2V0TmFtZSgpOworCQkJCQkJCQkJCWlmICh2ZXJib3NlKSB7CisJCQkJCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQWRkaW5nICIgKyBuZXdOYW1lICsgIiB0byAiICsgb3V0cHV0RmlsZS5nZXRQYXRoKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCk7CisJCQkJCQkJCQkJfQorCQkJCQkJCQkJCVppcEVudHJ5IHppcEVudHJ5ID0gbmV3IFppcEVudHJ5KG5ld05hbWUpOworCQkJCQkJCQkJCWVudHJ5U3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShtb2RpZmllZEZpbGUpOworCQkJCQkJCQkJCXppcE91dC5wdXROZXh0RW50cnkoemlwRW50cnkpOworCQkJCQkJCQkJCVV0aWxzLnRyYW5zZmVyU3RyZWFtcyhlbnRyeVN0cmVhbSwgemlwT3V0LCBmYWxzZSk7IC8vd2Ugd2FudCB0byBrZWVwIHppcE91dCBvcGVuCisJCQkJCQkJCQkJZW50cnlTdHJlYW0uY2xvc2UoKTsKKwkJCQkJCQkJCQlVdGlscy5jbGVhcihtb2RpZmllZEZpbGUpOworCQkJCQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCQkJCQkJCVV0aWxzLmNsb3NlKGVudHJ5U3RyZWFtKTsKKwkJCQkJCQkJCQlpZiAodmVyYm9zZSkgeworCQkJCQkJCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIldhcm5pbmc6IFByb2JsZW0gcmVhZGluZyAiICsgbW9kaWZpZWRGaWxlLmdldFBhdGgoKSArICIuIik7CisJCQkJCQkJCQkJfQorCQkJCQkJCQkJfQorCQkJCQkJCQkJZW50cnlTdHJlYW0gPSBudWxsOworCQkJCQkJCQl9IGVsc2UgaWYgKHZlcmJvc2UpIHsKKwkJCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiV2FybmluZzogIiArIG1vZGlmaWVkRmlsZS5nZXRQYXRoKCkgKyAiIG5vdCBmb3VuZC4iKTsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCWlmIChleHRyYWN0ZWRGaWxlLmV4aXN0cygpKSB7CisJCQkJCQkJdHJ5IHsKKwkJCQkJCQkJZW50cnlTdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGV4dHJhY3RlZEZpbGUpOworCQkJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQkJCQkJaWYgKHZlcmJvc2UpIHsKKwkJCQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIldhcm5pbmc6IFByb2JsZW0gcmVhZGluZyAiICsgZXh0cmFjdGVkRmlsZS5nZXRQYXRoKCkgKyAiLiIpOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfQorCisJCQkJCQlpZiAodmVyYm9zZSAmJiBlbnRyeVN0cmVhbSAhPSBudWxsKSB7CisJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJBZGRpbmcgIiArIG5hbWUgKyAiIHRvICIgKyBvdXRwdXRGaWxlLmdldFBhdGgoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCWlmIChlbnRyeVN0cmVhbSAhPSBudWxsKSB7CisJCQkJCVppcEVudHJ5IG5ld0VudHJ5ID0gbmV3IFppcEVudHJ5KG5hbWUpOworCQkJCQl0cnkgeworCQkJCQkJemlwT3V0LnB1dE5leHRFbnRyeShuZXdFbnRyeSk7CisJCQkJCQlVdGlscy50cmFuc2ZlclN0cmVhbXMoZW50cnlTdHJlYW0sIHppcE91dCwgZmFsc2UpOworCQkJCQkJemlwT3V0LmNsb3NlRW50cnkoKTsKKwkJCQkJfSBjYXRjaCAoWmlwRXhjZXB0aW9uIGUpIHsKKwkJCQkJCWlmKHZlcmJvc2UpIHsKKwkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIldhcm5pbmc6ICIgKyBuYW1lICsgIiBhbHJlYWR5IGV4aXN0cyBpbiAiICsgb3V0cHV0RmlsZS5nZXROYW1lKCkgKyAiLiAgU2tpcHBpbmcuIik7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJZW50cnlTdHJlYW0uY2xvc2UoKTsKKwkJCQl9CisKKwkJCQlpZiAoZXh0cmFjdGVkRmlsZSAhPSBudWxsKQorCQkJCQlVdGlscy5jbGVhcihleHRyYWN0ZWRGaWxlKTsKKwkJCQkKKwkJCQlpZiAodmVyYm9zZSkgeworCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKKwkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJQcm9jZXNzaW5nICIgKyB6aXBGaWxlLmdldFBhdGgoKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQl9CisJCQl9CisJCX0KKwkJemlwT3V0LmNsb3NlKCk7CisJCXppcC5jbG9zZSgpOworCisJCUZpbGUgZmluYWxGaWxlID0gbmV3IEZpbGUoZ2V0V29ya2luZ0RpcmVjdG9yeSgpLCB6aXBGaWxlLmdldE5hbWUoKSk7CisJCWlmIChmaW5hbEZpbGUuZXhpc3RzKCkpCisJCQlmaW5hbEZpbGUuZGVsZXRlKCk7CisJCW91dHB1dEZpbGUucmVuYW1lVG8oZmluYWxGaWxlKTsKKwkJVXRpbHMuY2xlYXIodGVtcERpcik7CisJfQorCisJcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoWmlwRmlsZSB6aXApIHsKKwkJWmlwRW50cnkgZW50cnkgPSB6aXAuZ2V0RW50cnkoInBhY2sucHJvcGVydGllcyIpOyAvLyROT04tTkxTLTEkCisJCXByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOworCQlpZiAoZW50cnkgIT0gbnVsbCkgeworCQkJSW5wdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKKwkJCXRyeSB7CisJCQkJc3RyZWFtID0gemlwLmdldElucHV0U3RyZWFtKGVudHJ5KTsKKwkJCQlwcm9wZXJ0aWVzLmxvYWQoc3RyZWFtKTsKKwkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQlpZiAodmVyYm9zZSkKKwkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCX0gZmluYWxseSB7CisJCQkJVXRpbHMuY2xvc2Uoc3RyZWFtKTsKKwkJCX0KKwkJfQorCisJCXBhY2tFeGNsdXNpb25zID0gVXRpbHMuZ2V0UGFja0V4Y2x1c2lvbnMocHJvcGVydGllcyk7CisJCXNpZ25FeGNsdXNpb25zID0gVXRpbHMuZ2V0U2lnbkV4Y2x1c2lvbnMocHJvcGVydGllcyk7CisKKwkJcGFja1VucGFja1N0ZXAgPSBuZXcgUGFja1VucGFja1N0ZXAocHJvcGVydGllcywgdmVyYm9zZSk7CisJCXBhY2tTdGVwID0gbmV3IFBhY2tTdGVwKHByb3BlcnRpZXMsIHZlcmJvc2UpOworCQlzaWduU3RlcCA9IG5ldyBTaWduQ29tbWFuZFN0ZXAocHJvcGVydGllcywgY29tbWFuZCwgdmVyYm9zZSk7CisJCXVucGFja1N0ZXAgPSBuZXcgVW5wYWNrU3RlcChwcm9wZXJ0aWVzLCB2ZXJib3NlKTsKKwl9Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvamFycHJvY2Vzc29yL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9qYXJwcm9jZXNzb3IvcGFjay1yZWFkbWUuaHRtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9qYXJwcm9jZXNzb3Ivb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2phcnByb2Nlc3Nvci9wYWNrLXJlYWRtZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNWZlNWUKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvamFycHJvY2Vzc29yL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9qYXJwcm9jZXNzb3IvcGFjay1yZWFkbWUuaHRtbApAQCAtMCwwICsxLDgyIEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgorPGh0bWw+Cis8aGVhZD4KKyAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+CisgIDx0aXRsZT5FY2xpcHNlIHVwZGF0ZSBwYWNraW5nIHRvb2wgcmVhZG1lPC90aXRsZT4KKzwvaGVhZD4KKzxib2R5PgorPGgxPkVjbGlwc2UgdXBkYXRlIHBhY2tpbmcgdG9vbDwvaDE+CisKKzxoMz5PdmVydmlldzwvaDM+CitUaGUgdXBkYXRlIHBhY2tpbmcgdG9vbCBwcm9jZXNzZXMgYSBoaWVyYXJjaHkgb2YgYXJiaXRyYXJpbHkgbmVzdGVkCitKQVJzIGFuZCBaSVAgZmlsZXMuICBJdCBpcyBhIGdlbmVyaWMgdXRpbGl0eSB0aGF0IHBlcmZvcm1zIGEgZGVwdGggZmlyc3QgdHJhdmVyc2FsIG9mIAorYSBuZXN0ZWQgaGllcmFyY2h5IG9mIFpJUHMgYW5kIEpBUnMsIHBlcmZvcm1zIHZhcmlvdXMgY29tbWFuZHMgb24KK2VhY2ggb2YgdGhlIEpBUnMgaW4gdGhlIGhpZXJhcmNoeSwgYW5kIHRoZW4gcmVidWlsZHMgdGhlIHNhbWUgaGllcmFyY2h5CitvZiBaSVBzIGFuZCBKQVJzIGFnYWluLiAgQ3VycmVudGx5IGl0cyBtYWluIGZ1bmN0aW9ucyBhcmU6Cis8dWw+CisJPGxpPlBhY2tpbmcgSkFScyB1c2luZyB0aGUgSmF2YSAxLjUgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNS4wL2RvY3MvdG9vbGRvY3Mvc2hhcmUvcGFjazIwMC5odG1sIj5wYWNrMjAwPC9hPgorCSBjb21tYW5kLjwvbGk+CisJIDxsaT5VbnBhY2tpbmcgUEFDSy5HWnMgdXNpbmcgdGhlIEphdmEgMS41IDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjUuMC9kb2NzL3Rvb2xkb2NzL3NoYXJlL3VucGFjazIwMC5odG1sIj51bnBhY2syMDA8L2E+CisJIGNvbW1hbmQuPC9saT4KKwkgPGxpPk5vcm1hbGl6aW5nIEpBUnMgZm9yIGZ1dHVyZSBjb21wcmVzc2lvbiBieSBwYWNrMjAwLiBUaGlzIGlzIGFjY29tcGxpc2hlZAorCSBieSBydW5uaW5nIHRoZSBwYWNrMjAwIGNvbW1hbmQgd2l0aCB0aGUgPHR0Pi0tcmVwYWNrPC90dD4gY29tbWFuZCBsaW5lIGFyZ3VtZW50LjwvbGk+CisJIDxsaT5TaWduaW5nIEpBUnMgdG8gYWxsb3cgZm9yIGF1dGhlbnRpY2F0aW9uIG9mIHRoZSBvcmlnaW4gb2YgSkFScy4gVGhpcyBpcyBhY2NvbXBsaXNoZWQgYnkKKwkgcnVubmluZyBhIHN1cHBsaWVkIGNvbW1hbmQgKHR5cGljYWxseSB0aGUgY29tbWFuZCB3aWxsIGp1c3QgYmUgYSB3cmFwcGVyIGFyb3VuZAorCSB0aGUgSmF2YSA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS4zL2RvY3MvdG9vbGRvY3Mvd2luMzIvamFyc2lnbmVyLmh0bWwiPmphcnNpZ25lcjwvYT4gdG9vbCkuPC9saT4KKzwvdWw+CitUaGUgcGFja2luZyB0b29sIGlzIHVzZWQgaW4gdGhlIGZvbGxvd2luZyBjb250ZXh0czoKKzx1bD4KKwk8bGk+RHVyaW5nIGEgUERFIGJ1aWxkLCB0byBwcmVwYXJlIEpBUnMgZm9yIHVwbG9hZGluZyB0byBhbiBFY2xpcHNlCisJdXBkYXRlIHNpdGUuICBJbiB0aGlzIHVzYWdlLCBpdCBpcyB1c2VkIHRvIGJvdGggbm9tYWxpemUgSkFSIGNvbnRlbnRzCisJKHBhY2syMDAgLXJlcGFjayksIGFuZCBzaWduIEpBUnMuPC9saT4KKwk8bGk+T24gYW4gdXBkYXRlIHNpdGUsIHRvIGNvbnZlcnQgdHJhZGl0aW9uYWwgSkFSIGNvbnRlbnQgaW50byB0aGUgCisJY29tcHJlc3NlZCBwYWNrMjAwIGZvcm1hdC48L2xpPgorCTxsaT5Gcm9tIGFuIEVjbGlwc2UgY2xpZW50IGFwcGxpY2F0aW9uIGR1cmluZyB1cGRhdGUsIHRvIGNvbnZlcnQKKwljb21wcmVzc2VkIHBhY2syMDAgZm9ybWF0IGNvbnRlbnQgaW50byBleGVjdXRhYmxlIEpBUiBmaWxlcy48L2xpPgorPC91bD4KKzxoMz5Ub29sIHVzYWdlPC9oMz4KK1RvIHJ1biB0aGUgcGFja2luZyB0b29sLCB5b3UgbmVlZCBhIDEuNSBKUkUgaW5zdGFsbGVkLiBUaGUgdG9vbCBpcyBydW4KK2J5IGludm9raW5nIEphdmEgYXMgZm9sbG93czoKKworPHByZT4KKwlqYXZhIGphcnByb2Nlc3Nvci5qYXIgW29wdGlvbnNdIGlucHV0Cis8L3ByZT4KKworV2hlcmUgPHR0PmlucHV0PC90dD4gaXMgZWl0aGVyIGEgemlwIGZpbGUsIGEgZGlyZWN0b3J5LCBvciBhIEpBUiAob3IgYSBwYWNrLmd6IGZpbGUpLiBBbGwgZmlsZXMgZW5kaW5nIAoraW4gIi5qYXIiIG9yICIucGFjay5neiIgaW4gdGhlIHByb3ZpZGVkIHppcCBvciBkaXJlY3RvcnkgaGllcmFyY2h5Cit3aWxsIGJlIHByb2Nlc3NlZC4gCitUaGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBhcmUgc3VwcG9ydGVkOgorPHVsPgorPGxpPi1yZXBhY2sgOiBOb3JtYWxpemUgdGhlIGphcnMgdXNpbmcgcGFjazIwMCA8dHQ+LS1yZXBhY2s8L3R0PjwvbGk+Cis8bGk+LXNpZ24gJmx0O2NtZCZndDsgOiBzaWducyB0aGUgamFycyBieSBleGVjdXRpbmcgdGhlIHByb3ZpZGVkIGNvbW1hbmQuICAKK1RoZSBjb21tYW5kIHdpbGwgYmUgcHJvdmlkZWQgYSBzaW5nbGUgYXJndW1lbnQgdGhhdCB3aWxsIGJlIHRoZSBmdWxsIHBhdGggb2YgdGhlIEpBUiB0byBwcm9jZXNzLgorPC9saT4KKzxsaT4tcGFjayA6IGZvciBlYWNoIGlucHV0IGluIEpBUiBmb3JtLCBwcm9kdWNlIGEgY29ycmVzcG9uZGluZyBvdXRwdXQKK2luIHBhY2tlZCBmb3JtLiAgRm9yIGFuIGlucHV0ICJhLmphciIsIHRoZSBvdXRwdXQgaXMgYS5qYXIucGFjay5nei4gIAorPC9saT4KKzxsaT4tdW5wYWNrIDogZm9yIGVhY2ggaW5wdXQgaW4gcGFja2VkIGZvcm0sIHByb2R1Y2UgYSBjb3JyZXNwb25kaW5nIG91dHB1dAoraW4gdW5wYWNrZWQgZm9ybS4gIEZvciBhbiBpbnB1dCAiYS5qYXIucGFjay5neiIsIHRoZSBvdXRwdXQgaXMgImEuamFyIi4gLXVucGFjayBpcyBtdXR1YWxseSBleGNsdXNpdmUgd2l0aCAtcmVwYWNrLCAtcGFjayBhbmQgLXNpZ24uPC9saT4KKzxsaT4tb3V0cHV0RGlyICZsdDtkaXImZ3Q7IDogVGhlIGRpcmVjdG9yeSB0byBwdXQgdGhlIHRvb2wncyBvdXRwdXQgaW50by4gIElmIHRoZSBpbnB1dCB3YXMgYSB6aXAgZmlsZSwgdGhlbiBhbiBvdXRwdXQgemlwIGZpbGUgd2lsbCBiZQorY3JlYXRlZCBjb250YWluZyBhbGwgdGhlIG91dHB1dCBmaWxlcy4gIElmIHRoZSBpbnB1dCB3YXMgYSBkaXJlY3RvcnksIGZvciBlYWNoIGlucHV0IGZpbGUgdGhlcmUgaXMgYSBjb3JyZXNwb25kaW5nIG91dHB1dCBmaWxlIGluIHRoZSBvdXRwdXQgZGlyZWN0b3J5LiBCeSBkZWZhdWx0IHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGlzIHVzZWQuICBJZiB0aGUgaW5wdXQgaXMgaW4gdGhlIHNhbWUKK2RpcmVjdG9yeSBhcyB0aGUgb3V0cHV0LCB0aGUgaW5wdXQgZmlsZXMgbWF5IGJlIG92ZXJ3cml0dGVuLjwvbGk+Cis8L3VsPgorCitBZGRpdGlvbmFsbHksIHdoZW4gdGhlIGlucHV0IGlzIGEgemlwIGZpbGUsIGl0IG1heSBjb250YWluIGEgZmlsZSBjYWxsZWQKKzx0dD5wYWNrLnByb3BlcnRpZXM8L3R0Pi4gIFRoZSBwYWNrLnByb3BlcnRpZXMgZmlsZSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHZhbHVlczoKKzx1bD4KKzxsaT5wYWNrLmV4Y2x1ZGVzID0gIGphck5hbWVbLCBqYXJOYW1lXSogOiBBIGNvbW1hLWRlbGltaXRlZCBsaXN0IG9mIEpBUnMgdGhhdCBzaG91bGQgbm90IGJlIHBhY2tlZCBvciByZXBhY2tlZC4KKzwvbGk+Cis8bGk+c2lnbi5leGNsdWRlcyA9ICBqYXJOYW1lWywgamFyTmFtZV0qIDogQSBjb21tYS1kZWxpbWl0ZWQgbGlzdCBvZiBKQVJzIHRoYXQgc2hvdWxkIG5vdCBiZSBzaWduZWQuCis8L2xpPgorPGxpPiZsdDtqYXJuYW1lJmd0Oy5wYWNrLmFyZ3MgPSBvcHRpb25bLCBvcHRpb25dKiA6IEEgY29tbWEtZGVsaW1pdGVkIGxpc3Qgb2YgYWRkaXRpb25hbCBhcmd1bWVudHMgdGhhdCBzaG91bGQKK2JlIHBhc3NlZCB0byBwYWNrMjAwIHdoZW4gcGFja2luZyBhbnkgamFyIHdpdGggbmFtZSAmbHQ7amFybmFtZSZndDsuCis8L3VsPgorPC9wPgorPHA+Cis8Zm9udCBzaXplPS0xPgorQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycyAyMDA2LiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCithcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSAKKzxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjA8L2E+LgorPC9mb250PgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3ByZWZlcmVuY2VzLmluaSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9wcmVmZXJlbmNlcy5pbmkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkzNmU3ZgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9wcmVmZXJlbmNlcy5pbmkKQEAgLTAsMCArMSw4IEBACisjIFRoZSBwb3J0IG51bWJlciBvbiB3aGljaCB0aGUgc2V2ZXIgbGlzdGVucyBmb3IgaHR0cCByZXF1ZXN0cy4KKyMgSWYgdGhlIHBvcnQgaXMgMCBhbmQgYXJiaXRyYXJ5IHBvcnQgaXMgcGlja2VkIGJ5IHRoZSBzeXN0ZW0uCisKKyMgRGVmaW5lcyB0aGUgcG9saWN5IHVybCB0aGF0IGNvbnRhaW5zIGRpcmVjdGl2ZXMgZm9yIHJlZGlyZWN0aW5nIAorIyB1cGRhdGVzIHRvIGRpZmZlcmVudCB1cGRhdGUgc2l0ZXMuCisjdXBkYXRlUG9saWN5VVJMPQorCisKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zY2hlbWEvZmVhdHVyZVR5cGVzLmV4c2QgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc2NoZW1hL2ZlYXR1cmVUeXBlcy5leHNkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1MTdmMTAKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc2NoZW1hL2ZlYXR1cmVUeXBlcy5leHNkCkBAIC0wLDAgKzEsMTIyIEBACis8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/Pg0KKzwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+DQorPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlIj4NCis8YW5ub3RhdGlvbj4NCisgICAgICA8YXBwSW5mbz4NCisgICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZSIgaWQ9ImZlYXR1cmVUeXBlcyIgbmFtZT0iRmVhdHVyZSBUeXBlIEZhY3RvcnkiLz4NCisgICAgICA8L2FwcEluZm8+DQorICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgVGhlIHBsYXRmb3JtIHVwZGF0ZSBtZWNoYW5pc20gc3VwcG9ydHMgcGx1Z2dhYmxlIGZlYXR1cmUgdHlwZQoraW1wbGVtZW50YXRpb25zLiBBIG5ldyBmZWF0dXJlIHR5cGUgY2FuIGJlIHJlZ2lzdGVyZWQgaW4gb3JkZXIKK3RvIHN1cHBvcnQKK2FsdGVybmF0ZSBwYWNrYWdpbmcgYW5kIHZlcmlmaWNhdGlvbiBzY2hlbWVzLgorJmx0O3AmZ3Q7CitUaGUgJmx0O2NvZGUmZ3Q7ZmVhdHVyZVR5cGVzJmx0Oy9jb2RlJmd0OworZXh0ZW5zaW9uIHBvaW50IGFsbG93cyBhbHRlcm5hdGUgZmVhdHVyZSBpbXBsZW1lbnRhdGlvbnMgdG8gYmUKK3JlZ2lzdGVyZWQgdXNpbmcgYSBzeW1ib2xpYyB0eXBlIGlkZW50aWZpZXIuIFdoZW5ldmVyIHRoZSAKK3R5cGUgaXMgcmVmZXJlbmNlZCB1c2luZyB0aGlzIGlkZW50aWZpZXIsIHRoZSBzdXBwbGllZCBmYWN0b3J5CitpcyB1c2VkIHRvIGNyZWF0ZSB0aGUgY29ycmVjdCBjb25jcmV0ZSBmZWF0dXJlIGltcGxlbWVudGF0aW9uLgorJmx0Oy9wJmd0Ow0KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICA8L2Fubm90YXRpb24+DQorDQorICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4NCisgICAgICA8Y29tcGxleFR5cGU+DQorICAgICAgICAgPHNlcXVlbmNlPg0KKyAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZmVhdHVyZS1mYWN0b3J5IiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQorICAgICAgICAgPC9zZXF1ZW5jZT4NCisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgICAgICAgIG11c3QgYmUgc3BlY2lmaWVkIGFzICZsdDtiJmd0O29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmVUeXBlcyZsdDsvYiZndDsNCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KKyAgICAgICAgIDwvYXR0cmlidXRlPg0KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+DQorICAgICAgICAgICAgPGFubm90YXRpb24+DQorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgICAgICAgbXVzdCBiZSBzcGVjaWZpZWQuIElkZW50aWZpZXMgdGhlIG5ldyBmZWF0dXJlIHR5cGUNCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KKyAgICAgICAgIDwvYXR0cmlidXRlPg0KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4NCisgICAgICAgICAgICA8YW5ub3RhdGlvbj4NCisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICAgICAgICBvcHRpb25hbCBkaXNwbGF5YWJsZSBsYWJlbCBmb3IgdGhlIG5ldyBmZWF0dXJlIHR5cGUNCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgICAgPGFwcEluZm8+DQorICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPg0KKyAgICAgICAgICAgICAgIDwvYXBwSW5mbz4NCisgICAgICAgICAgICA8L2Fubm90YXRpb24+DQorICAgICAgICAgPC9hdHRyaWJ1dGU+DQorICAgICAgPC9jb21wbGV4VHlwZT4NCisgICA8L2VsZW1lbnQ+DQorDQorICAgPGVsZW1lbnQgbmFtZT0iZmVhdHVyZS1mYWN0b3J5Ij4NCisgICAgICA8Y29tcGxleFR5cGU+DQorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCisgICAgICAgICAgICA8YW5ub3RhdGlvbj4NCisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICAgICAgICBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgZmFjdG9yeSBjbGFzcyBmb3IgdGhlIGlkZW50aWZpZWQgZmVhdHVyZSB0eXBlDQorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgICAgIDxhcHBJbmZvPg0KKyAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi5JSW5zdGFsbERlbHRhSGFuZGxlciIvPg0KKyAgICAgICAgICAgICAgIDwvYXBwSW5mbz4NCisgICAgICAgICAgICA8L2Fubm90YXRpb24+DQorICAgICAgICAgPC9hdHRyaWJ1dGU+DQorICAgICAgPC9jb21wbGV4VHlwZT4NCisgICA8L2VsZW1lbnQ+DQorDQorICAgPGFubm90YXRpb24+DQorICAgICAgPGFwcEluZm8+DQorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPg0KKyAgICAgIDwvYXBwSW5mbz4NCisgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgbmV3IGZlYXR1cmUgdHlwZSByZWdpc3RyYXRpb246CismbHQ7cCZndDsKKyZsdDtwcmUmZ3Q7CisgICAmbHQ7ZXh0ZW5zaW9uCisgICAgICBpZD0mcXVvdDtjdXN0b20mcXVvdDsKKyAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmVUeXBlcyZxdW90OworICAgICAgbmFtZT0mcXVvdDtDdXN0b20gcGFja2FnZWQgZmVhdHVyZSZxdW90OyZndDsKKyAgICAgICZsdDtmZWF0dXJlLWZhY3RvcnkKKyAgICAgICAgICBjbGFzcz0mcXVvdDtjb20ueHl6LnVwZGF0ZS5DdXN0b21GZWF0dXJlRmFjdG9yeSZxdW90OyZndDsKKyAgICAgICZsdDsvZmVhdHVyZS1mYWN0b3J5Jmd0OworICAgJmx0Oy9leHRlbnNpb24mZ3Q7CismbHQ7L3ByZSZndDsKKyZsdDsvcCZndDsNCisgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgPC9hbm5vdGF0aW9uPg0KKw0KKyAgIDxhbm5vdGF0aW9uPg0KKyAgICAgIDxhcHBJbmZvPg0KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPg0KKyAgICAgIDwvYXBwSW5mbz4NCisgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICBSZWdpc3RlcmVkIGZhY3RvcnkgY2xhc3NlcyBtdXN0IGltcGxlbWVudCAKKyZsdDtjb2RlJmd0OyZsdDtiJmd0O29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlRmFjdG9yeSZsdDsvYiZndDsmbHQ7L2NvZGUmZ3Q7DQorICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgIDwvYW5ub3RhdGlvbj4NCisNCisgICA8YW5ub3RhdGlvbj4NCisgICAgICA8YXBwSW5mbz4NCisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+DQorICAgICAgPC9hcHBJbmZvPg0KKyAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgIFRoZSBwbGF0Zm9ybSBzdXBwbGllcyB0d28gc3RhbmRhcmQgaW1wbGVtZW50YXRpb25zIG9mIGZlYXR1cmUKK3R5cGVzLiBPbmUgcmVwcmVzZW50aW5nIHRoZSBkZWZhdWx0IHBhY2thZ2VkIGZlYXR1cmUgdHlwZSwgYW5kCit0aGUgb3RoZXIgcmVwcmVzZW50aW5nIGFuIGluc3RhbGxlZCBmZWF0dXJlIHR5cGUuDQorICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgIDwvYW5ub3RhdGlvbj4NCisNCisgICA8YW5ub3RhdGlvbj4NCisgICAgICA8YXBwSW5mbz4NCisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPg0KKyAgICAgIDwvYXBwSW5mbz4NCisgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCitBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Lg0KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICA8L2Fubm90YXRpb24+DQorDQorPC9zY2hlbWE+DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NjaGVtYS9pbnN0YWxsSGFuZGxlcnMuZXhzZCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zY2hlbWEvaW5zdGFsbEhhbmRsZXJzLmV4c2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg0YTI1ZgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zY2hlbWEvaW5zdGFsbEhhbmRsZXJzLmV4c2QKQEAgLTAsMCArMSwxMTMgQEAKKzw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+DQorPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4NCis8c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUiPg0KKzxhbm5vdGF0aW9uPg0KKyAgICAgIDxhcHBJbmZvPg0KKyAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlIiBpZD0iaW5zdGFsbEhhbmRsZXJzIiBuYW1lPSJHbG9iYWwgSW5zdGFsbCBIYW5kbGVycyIvPg0KKyAgICAgIDwvYXBwSW5mbz4NCisgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICBFeHRlbnNpb24gcG9pbnQgZm9yIHJlZ2lzdGVyaW5nIGdsb2JhbCBpbnN0YWxsIGhhbmRsZXJzLiBHbG9iYWwKK2luc3RhbGwgaGFuZGxlcnMgY2FuIGJlIHJlZmVyZW5jZWQgYnkgZmVhdHVyZXMgCisodXNpbmcgdGhlICZsdDtjb2RlJmd0OyZhbXA7bHQ7ZmVhdHVyZSZhbXA7Z3Q7ICZhbXA7bHQ7aW5zdGFsbC1oYW5kbGVyJmFtcDtndDsmbHQ7L2NvZGUmZ3Q7Cit0YWdzKSB3aXRob3V0IGhhdmluZyB0byBpbmNsdWRlIGEgY29weSBvZiB0aGUgaGFuZGxlciBjb2RlIGFzCitwYXJ0IG9mIHRoZSBkb3dubG9hZGFibGUgZmVhdHVyZS4NCisgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgPC9hbm5vdGF0aW9uPg0KKw0KKyAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+DQorICAgICAgPGNvbXBsZXhUeXBlPg0KKyAgICAgICAgIDxzZXF1ZW5jZT4NCisgICAgICAgICAgICA8ZWxlbWVudCByZWY9Imluc3RhbGwtaGFuZGxlciIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPg0KKyAgICAgICAgIDwvc2VxdWVuY2U+DQorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCisgICAgICAgICAgICA8YW5ub3RhdGlvbj4NCisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICAgICAgICBtdXN0IGJlIHNwZWNpZmllZCBhcyAmbHQ7YiZndDtvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5pbnN0YWxsSGFuZGxlcnMmbHQ7L2ImZ3Q7DQorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCisgICAgICAgICA8L2F0dHJpYnV0ZT4NCisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPg0KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgICAgICAgIG11c3QgYmUgc3BlY2lmaWVkLiBJZGVudGlmaWVzIHRoZSBuZXcgaW5zdGFsbCBoYW5kbGVyDQorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCisgICAgICAgICA8L2F0dHJpYnV0ZT4NCisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+DQorICAgICAgICAgICAgPGFubm90YXRpb24+DQorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgICAgICAgb3B0aW9uYWwgZGlzcGxheWFibGUgbGFiZWwgZm9yIHRoZSBuZXcgaW5zdGFsbCBoYW5kbGVyDQorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgICAgIDxhcHBJbmZvPg0KKyAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4NCisgICAgICAgICAgICAgICA8L2FwcEluZm8+DQorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KKyAgICAgICAgIDwvYXR0cmlidXRlPg0KKyAgICAgIDwvY29tcGxleFR5cGU+DQorICAgPC9lbGVtZW50Pg0KKw0KKyAgIDxlbGVtZW50IG5hbWU9Imluc3RhbGwtaGFuZGxlciI+DQorICAgICAgPGNvbXBsZXhUeXBlPg0KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQorICAgICAgICAgICAgPGFubm90YXRpb24+DQorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgICAgICAgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGhhbmRsZXIgaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIHRoZSBpZGVudGlmaWVkCitpbnN0YWxsIGhhbmRsZXINCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KKyAgICAgICAgIDwvYXR0cmlidXRlPg0KKyAgICAgIDwvY29tcGxleFR5cGU+DQorICAgPC9lbGVtZW50Pg0KKw0KKyAgIDxhbm5vdGF0aW9uPg0KKyAgICAgIDxhcHBJbmZvPg0KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4NCisgICAgICA8L2FwcEluZm8+DQorICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIG5ldyBnbG9iYWwgaW5zdGFsbCBoYW5kbGVyIHJlZ2lzdHJhdGlvbjoKKyZsdDtwJmd0OworJmx0O3ByZSZndDsKKyAgICZsdDtleHRlbnNpb24KKyAgICAgICAgaWQ9JnF1b3Q7Y3VzdG9tJnF1b3Q7CisgICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmluc3RhbGxIYW5kbGVycyZxdW90OworICAgICAgICBuYW1lPSZxdW90O0N1c3RvbSBpbnN0YWxsIGhhbmRsZXImcXVvdDsmZ3Q7CisgICAgICZsdDtpbnN0YWxsLWhhbmRsZXIKKyAgICAgICAgY2xhc3M9JnF1b3Q7Y29tLnh5ei51cGRhdGUuQ3VzdG9tSW5zdGFsbEhhbmRsZXImcXVvdDsmZ3Q7CisgICAgICZsdDsvaW5zdGFsbC1oYW5kbGVyJmd0OworICAgJmx0Oy9leHRlbnNpb24mZ3Q7CismbHQ7L3ByZSZndDsKKyZsdDsvcCZndDsNCisgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgPC9hbm5vdGF0aW9uPg0KKw0KKyAgIDxhbm5vdGF0aW9uPg0KKyAgICAgIDxhcHBJbmZvPg0KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPg0KKyAgICAgIDwvYXBwSW5mbz4NCisgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICBSZWdpc3RlcmVkIGluc3RhbGwgaGFuZGxlciBjbGFzc2VzIG11c3QgaW1wbGVtZW50IAorJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUluc3RhbGxIYW5kbGVyJmx0Oy9jb2RlJmd0OyBpbnRlcmZhY2UuCitJbXBsZW1lbnRlcnMgc2hvdWxkIGV4dGVuZCBiYXNlIGNsYXNzICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkJhc2VJbnN0YWxsSGFuZGxlciZsdDsvY29kZSZndDsuDQorICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgIDwvYW5ub3RhdGlvbj4NCisNCisgICA8YW5ub3RhdGlvbj4NCisgICAgICA8YXBwSW5mbz4NCisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+DQorICAgICAgPC9hcHBJbmZvPg0KKyAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgIFRoZSBwbGF0Zm9ybSBzdXBwbGllcyBhIHNpbXBsZSBpbnN0YWxsIGhhbmRsZXIgdGhhdCBpcyByZWdpc3RlcmVkIGFzICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkRlZmF1bHRJbnN0YWxsSGFuZGxlciZsdDsvY29kZSZndDsuIElmIHVzZWQsIGl0IHdpbGwgY29weSBhbnkgbm9uLXBsdWctaW4gZGF0YSBlbnRyaWVzIHByb3ZpZGVkIHdpdGggdGhlIGZlYXR1cmUgaW50byB0aGUgZmVhdHVyZSBpbnN0YWxsYXRpb24gZGlyZWN0b3J5Lg0KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICA8L2Fubm90YXRpb24+DQorDQorICAgPGFubm90YXRpb24+DQorICAgICAgPGFwcEluZm8+DQorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4NCisgICAgICA8L2FwcEluZm8+DQorICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0Oy4NCisgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgPC9hbm5vdGF0aW9uPg0KKw0KKzwvc2NoZW1hPg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zY2hlbWEvc2l0ZVR5cGVzLmV4c2QgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc2NoZW1hL3NpdGVUeXBlcy5leHNkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwMmRjMTYKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc2NoZW1hL3NpdGVUeXBlcy5leHNkCkBAIC0wLDAgKzEsMTE5IEBACis8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/Pg0KKzwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+DQorPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlIj4NCis8YW5ub3RhdGlvbj4NCisgICAgICA8YXBwSW5mbz4NCisgICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZSIgaWQ9InNpdGVUeXBlcyIgbmFtZT0iU2l0ZSBUeXBlIEZhY3RvcnkiLz4NCisgICAgICA8L2FwcEluZm8+DQorICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgVGhlIHBsYXRmb3JtIHVwZGF0ZSBtZWNoYW5pc20gc3VwcG9ydHMgcGx1Z2dhYmxlIHNpdGUgdHlwZQoraW1wbGVtZW50YXRpb25zLiBBIG5ldyBzaXRlIHR5cGUgY2FuIGJlIHJlZ2lzdGVyZWQgaW4gb3JkZXIKK3RvIHN1cHBvcnQgYWx0ZXJuYXRlIHNpdGUgbGF5b3V0IHNjaGVtZXMuCismbHQ7cCZndDsKK1RoZSAmbHQ7Y29kZSZndDtzaXRlVHlwZXMmbHQ7L2NvZGUmZ3Q7CitleHRlbnNpb24gcG9pbnQgYWxsb3dzIGFsdGVybmF0ZSBzaXRlIGltcGxlbWVudGF0aW9ucyB0byBiZQorcmVnaXN0ZXJlZCB1c2luZyBhIHN5bWJvbGljIHR5cGUgaWRlbnRpZmllci4gV2hlbmV2ZXIgdGhlIAordHlwZSBpcyByZWZlcmVuY2VkIHVzaW5nIHRoaXMgaWRlbnRpZmllciwgdGhlIHN1cHBsaWVkIGZhY3RvcnkKK2lzIHVzZWQgdG8gY3JlYXRlIHRoZSBjb3JyZWN0IGNvbmNyZXRlIHNpdGUgaW1wbGVtZW50YXRpb24uCismbHQ7L3AmZ3Q7DQorICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgIDwvYW5ub3RhdGlvbj4NCisNCisgICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPg0KKyAgICAgIDxjb21wbGV4VHlwZT4NCisgICAgICAgICA8c2VxdWVuY2U+DQorICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJzaXRlLWZhY3RvcnkiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4NCisgICAgICAgICA8L3NlcXVlbmNlPg0KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQorICAgICAgICAgICAgPGFubm90YXRpb24+DQorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgICAgICAgICAgbXVzdCBiZSBzcGVjaWZpZWQgYXMgJmx0O2ImZ3Q7b3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuc2l0ZVR5cGVzJmx0Oy9iJmd0Ow0KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICA8L2Fubm90YXRpb24+DQorICAgICAgICAgPC9hdHRyaWJ1dGU+DQorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4NCisgICAgICAgICAgICA8YW5ub3RhdGlvbj4NCisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICAgICAgICBtdXN0IGJlIHNwZWNpZmllZC4gSWRlbnRpZmllcyB0aGUgbmV3IHNpdGUgdHlwZQ0KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICA8L2Fubm90YXRpb24+DQorICAgICAgICAgPC9hdHRyaWJ1dGU+DQorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPg0KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgICAgICAgIG9wdGlvbmFsIGRpc3BsYXlhYmxlIGxhYmVsIGZvciB0aGUgbmV3IHNpdGUgdHlwZQ0KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICAgICAgICA8YXBwSW5mbz4NCisgICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+DQorICAgICAgICAgICAgICAgPC9hcHBJbmZvPg0KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCisgICAgICAgICA8L2F0dHJpYnV0ZT4NCisgICAgICA8L2NvbXBsZXhUeXBlPg0KKyAgIDwvZWxlbWVudD4NCisNCisgICA8ZWxlbWVudCBuYW1lPSJzaXRlLWZhY3RvcnkiPg0KKyAgICAgIDxjb21wbGV4VHlwZT4NCisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgICAgICAgIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBmYWN0b3J5IGNsYXNzIGZvciB0aGUgaWRlbnRpZmllZAorc2l0ZSB0eXBlDQorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCisgICAgICAgICA8L2F0dHJpYnV0ZT4NCisgICAgICA8L2NvbXBsZXhUeXBlPg0KKyAgIDwvZWxlbWVudD4NCisNCisgICA8YW5ub3RhdGlvbj4NCisgICAgICA8YXBwSW5mbz4NCisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+DQorICAgICAgPC9hcHBJbmZvPg0KKyAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBuZXcgc2l0ZSB0eXBlIHJlZ2lzdHJhdGlvbi4KKyZsdDtwJmd0OworJmx0O3ByZSZndDsKKyAgICZsdDtleHRlbnNpb24KKyAgICAgICAgaWQ9JnF1b3Q7Y3VzdG9tJnF1b3Q7CisgICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnNpdGVUeXBlcyZxdW90OworICAgICAgICBuYW1lPSZxdW90O0N1c3RvbSBzaXRlJnF1b3Q7Jmd0OworICAgICAgJmx0O3NpdGUtZmFjdG9yeQorICAgICAgICAgIGNsYXNzPSZxdW90O2NvbS54eXoudXBkYXRlLkN1c3RvbVNpdGVGYWN0b3J5JnF1b3Q7Jmd0OworICAgICAgJmx0Oy9zaXRlLWZhY3RvcnkmZ3Q7CisgICAmbHQ7L2V4dGVuc2lvbiZndDsKKyZsdDsvcHJlJmd0OworJmx0Oy9wJmd0Ow0KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICA8L2Fubm90YXRpb24+DQorDQorICAgPGFubm90YXRpb24+DQorICAgICAgPGFwcEluZm8+DQorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+DQorICAgICAgPC9hcHBJbmZvPg0KKyAgICAgIDxkb2N1bWVudGF0aW9uPg0KKyAgICAgICAgIFJlZ2lzdGVyZWQgZmFjdG9yeSBjbGFzc2VzIG11c3QgaW1wbGVtZW50IAorJmx0O2NvZGUmZ3Q7Jmx0O2ImZ3Q7b3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVNpdGVGYWN0b3J5Jmx0Oy9iJmd0OyZsdDsvY29kZSZndDsNCisgICAgICA8L2RvY3VtZW50YXRpb24+DQorICAgPC9hbm5vdGF0aW9uPg0KKw0KKyAgIDxhbm5vdGF0aW9uPg0KKyAgICAgIDxhcHBJbmZvPg0KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4NCisgICAgICA8L2FwcEluZm8+DQorICAgICAgPGRvY3VtZW50YXRpb24+DQorICAgICAgICAgVGhlIHBsYXRmb3JtIHN1cHBsaWVzIHR3byBzdGFuZGFyZCBpbXBsZW1lbnRhdGlvbnMgb2Ygc2l0ZQordHlwZXMuIE9uZSByZXByZXNlbnRpbmcgdGhlIGRlZmF1bHQgdXBkYXRlIHNlcnZlciB0eXBlLCBhbmQKK3RoZSBvdGhlciByZXByZXNlbnRpbmcgdGhlIGxvY2FsIGZpbGUgc3lzdGVtIHNpdGUuDQorICAgICAgPC9kb2N1bWVudGF0aW9uPg0KKyAgIDwvYW5ub3RhdGlvbj4NCisNCisgICA8YW5ub3RhdGlvbj4NCisgICAgICA8YXBwSW5mbz4NCisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPg0KKyAgICAgIDwvYXBwSW5mbz4NCisgICAgICA8ZG9jdW1lbnRhdGlvbj4NCisgICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCitBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Lg0KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCisgICA8L2Fubm90YXRpb24+DQorDQorPC9zY2hlbWE+DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9CYXNlU2l0ZUxvY2FsRmFjdG9yeS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9CYXNlU2l0ZUxvY2FsRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhYjU3MTQKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0Jhc2VTaXRlTG9jYWxGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm1vZGVsLio7CisvKioKKyAqIAorICovCitwdWJsaWMgY2xhc3MgQmFzZVNpdGVMb2NhbEZhY3RvcnkgeworCS8qCisJICogCisJICovCisJcHVibGljIEluc3RhbGxDb25maWd1cmF0aW9uTW9kZWwgY3JlYXRlSW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbCgpIHsKKwkJcmV0dXJuIG5ldyBJbnN0YWxsQ29uZmlndXJhdGlvbigpOworCX0KKwkvKgorCSAqIAorCSAqLworCXB1YmxpYyBDb25maWd1cmF0aW9uQWN0aXZpdHlNb2RlbCBjcmVhdGVDb25maWd1cmF0aW9uQWN0aXZpdHlNb2RlbCgpIHsKKwkJcmV0dXJuIG5ldyBDb25maWd1cmF0aW9uQWN0aXZpdHkoKTsKKwl9CisJLyoKKwkgKiAKKwkgKi8KKwlwdWJsaWMgQ29uZmlndXJlZFNpdGVNb2RlbCBjcmVhdGVDb25maWd1cmF0aW9uU2l0ZU1vZGVsKCkgeworCQlyZXR1cm4gbmV3IENvbmZpZ3VyZWRTaXRlKCk7CisJfQorCS8qCisJICogCisJICovCisJcHVibGljIENvbmZpZ3VyYXRpb25Qb2xpY3lNb2RlbCBjcmVhdGVDb25maWd1cmF0aW9uUG9saWN5TW9kZWwoKSB7CisJCXJldHVybiBuZXcgQ29uZmlndXJhdGlvblBvbGljeSgpOworCX0KKwkvKioKKwkgKiAKKwkgKi8KKwlwdWJsaWMgQ29uZmlndXJlZFNpdGVNb2RlbCBjcmVhdGVDb25maWd1cmF0aW9uU2l0ZU1vZGVsKFNpdGVNb2RlbCBzaXRlLCBpbnQgcG9saWN5KSB7CisJCS8vY3JlYXRlIGNvbmZpZyBzaXRlCisJCUNvbmZpZ3VyZWRTaXRlTW9kZWwgY29uZmlnU2l0ZSA9IHRoaXMuY3JlYXRlQ29uZmlndXJhdGlvblNpdGVNb2RlbCgpOworCQljb25maWdTaXRlLnNldFNpdGVNb2RlbChzaXRlKTsKKwkJQ29uZmlndXJhdGlvblBvbGljeU1vZGVsIHBvbGljeU1vZGVsID0gdGhpcy5jcmVhdGVDb25maWd1cmF0aW9uUG9saWN5TW9kZWwoKTsKKwkJcG9saWN5TW9kZWwuc2V0UG9saWN5KHBvbGljeSk7CisJCWNvbmZpZ1NpdGUuc2V0Q29uZmlndXJhdGlvblBvbGljeU1vZGVsKHBvbGljeU1vZGVsKTsKKwkJKChDb25maWd1cmF0aW9uUG9saWN5KSBwb2xpY3lNb2RlbCkuc2V0Q29uZmlndXJlZFNpdGVNb2RlbChjb25maWdTaXRlKTsKKwkJcmV0dXJuIGNvbmZpZ1NpdGU7CisJfQorfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9Db25maWd1cmF0aW9uQWN0aXZpdHkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvQ29uZmlndXJhdGlvbkFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZiYmM4NAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvQ29uZmlndXJhdGlvbkFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLklBY3Rpdml0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi5JSW5zdGFsbENvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm1vZGVsLkNvbmZpZ3VyYXRpb25BY3Rpdml0eU1vZGVsOworcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25BY3Rpdml0eQorCWV4dGVuZHMgQ29uZmlndXJhdGlvbkFjdGl2aXR5TW9kZWwKKwlpbXBsZW1lbnRzIElBY3Rpdml0eSB7CisJCQorCS8qKgorCSAqIERlZmF1bHQgY29uc3RydWN0b3IKKwkgKi8JCQorCXB1YmxpYyBDb25maWd1cmF0aW9uQWN0aXZpdHkoKSB7CisJfQorCQorCS8qKgorCSAqIENvbnN0cnVjdG9yIHdpdGggYWN0aW9uCisJICovCisJcHVibGljIENvbmZpZ3VyYXRpb25BY3Rpdml0eShpbnQgYWN0aW9uKSB7CisJCXN1cGVyKCk7CisJCXNldEFjdGlvbihhY3Rpb24pOworCQlzZXRTdGF0dXMoU1RBVFVTX05PSyk7CisJfQorCQorCS8qCisJICogQHNlZSBJQWN0aXZpdHkjZ2V0SW5zdGFsbENvbmZpZ3VyYXRpb24oKQorCSAqLworCXB1YmxpYyBJSW5zdGFsbENvbmZpZ3VyYXRpb24gZ2V0SW5zdGFsbENvbmZpZ3VyYXRpb24oKSB7CisJCXJldHVybiAoSUluc3RhbGxDb25maWd1cmF0aW9uKSBnZXRJbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsKCk7CisJfQorCQorCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsKKwkJaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBDb25maWd1cmF0aW9uQWN0aXZpdHkpKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAodGhpcyA9PSBvdGhlcikKKwkJCXJldHVybiB0cnVlOworCQkKKwkJQ29uZmlndXJhdGlvbkFjdGl2aXR5IGFjdGl2aXR5ID0gKENvbmZpZ3VyYXRpb25BY3Rpdml0eSkgb3RoZXI7CisJCXJldHVybiBnZXRBY3Rpb24oKSA9PSBhY3Rpdml0eS5nZXRBY3Rpb24oKQorCQkJCSYmIGdldExhYmVsKCkuZXF1YWxzKGFjdGl2aXR5LmdldExhYmVsKCkpCisJCQkJJiYgZ2V0U3RhdHVzKCkgPT0gYWN0aXZpdHkuZ2V0U3RhdHVzKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9Db25maWd1cmF0aW9uUG9saWN5LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0NvbmZpZ3VyYXRpb25Qb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDdlNDgyCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9Db25maWd1cmF0aW9uUG9saWN5LmphdmEKQEAgLTAsMCArMSw1MjQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS5uZXQuKjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5tb2RlbC4qOworCisvKioKKyAqIAorICovCitwdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvblBvbGljeSBleHRlbmRzIENvbmZpZ3VyYXRpb25Qb2xpY3lNb2RlbCB7CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RvciBmb3IgQ29uZmlndXJhdGlvblBvbGljeU1vZGVsLgorCSAqLworCXB1YmxpYyBDb25maWd1cmF0aW9uUG9saWN5KCkgeworCX0KKworCS8qKgorCSAqIENvcHkgQ29uc3RydWN0b3IgZm9yIENvbmZpZ3VyYXRpb25Qb2xpY3lNb2RlbC4KKwkgKi8KKwlwdWJsaWMgQ29uZmlndXJhdGlvblBvbGljeShDb25maWd1cmF0aW9uUG9saWN5IGNvbmZpZ1BvbGljeSkgeworCQlzdXBlcigpOworCQlzZXRQb2xpY3koY29uZmlnUG9saWN5LmdldFBvbGljeSgpKTsKKwkJc2V0Q29uZmlndXJlZEZlYXR1cmVSZWZlcmVuY2VzKGNvbmZpZ1BvbGljeS5nZXRDb25maWd1cmVkRmVhdHVyZXMoKSk7CisJCXNldFVuY29uZmlndXJlZEZlYXR1cmVSZWZlcmVuY2VzKGNvbmZpZ1BvbGljeS5nZXRVbmNvbmZpZ3VyZWRGZWF0dXJlcygpKTsKKwkJc2V0Q29uZmlndXJlZFNpdGVNb2RlbChjb25maWdQb2xpY3kuZ2V0Q29uZmlndXJlZFNpdGVNb2RlbCgpKTsKKwl9CisKKwkvKioKKwkgKiBAc2luY2UgMi4wCisJICovCisJcHJpdmF0ZSBib29sZWFuIGlzVW5jb25maWd1cmVkKElGZWF0dXJlUmVmZXJlbmNlIGZlYXR1cmVSZWZlcmVuY2UpIHsKKworCQlpZiAoZmVhdHVyZVJlZmVyZW5jZSA9PSBudWxsKQorCQkJcmV0dXJuIGZhbHNlOworCisJCS8vIHJldHVybnMgdHJ1ZSBpZiB0aGUgZmVhdHVyZSBpcyBwYXJ0IG9mIHRoZSBjb25maWd1cmVkIGxpc3QKKwkJSUZlYXR1cmVSZWZlcmVuY2VbXSByZWZzID0gZ2V0VW5jb25maWd1cmVkRmVhdHVyZXMoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZzLmxlbmd0aDsgaSsrKSB7CisJCQlpZiAoZmVhdHVyZVJlZmVyZW5jZS5lcXVhbHMocmVmc1tpXSkpIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoqCisJICogQHNpbmNlIDIuMAorCSAqLworCXB1YmxpYyBib29sZWFuIGlzQ29uZmlndXJlZChJRmVhdHVyZVJlZmVyZW5jZSBmZWF0dXJlUmVmZXJlbmNlKSB7CisKKwkJaWYgKGZlYXR1cmVSZWZlcmVuY2UgPT0gbnVsbCkKKwkJCXJldHVybiBmYWxzZTsKKworCQkvLyByZXR1cm5zIHRydWUgaWYgdGhlIGZlYXR1cmUgaXMgcGFydCBvZiB0aGUgY29uZmlndXJlZCBsaXN0CisJCUlGZWF0dXJlUmVmZXJlbmNlW10gcmVmcyA9IGdldENvbmZpZ3VyZWRGZWF0dXJlcygpOworCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZnMubGVuZ3RoOyBpKyspIHsKKwkJCWlmIChmZWF0dXJlUmVmZXJlbmNlLmVxdWFscyhyZWZzW2ldKSkgeworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKioKKwkgKiBhZGRzIHRoZSBmZWF0dXJlIHRvIHRoZSBsaXN0IG9mIGZlYXR1cmVzIGlmIHRoZSBwb2xpY3kgaXMgVVNFUl9JTkNMVURFCisJICovCisJcHVibGljIHZvaWQgY29uZmlndXJlKElGZWF0dXJlUmVmZXJlbmNlIGZlYXR1cmVSZWZlcmVuY2UsIGJvb2xlYW4gY2FsbEluc3RhbGxIYW5kbGVyLCBib29sZWFuIGNyZWF0ZUFjdGl2aXR5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisKKwkJaWYgKGlzQ29uZmlndXJlZChmZWF0dXJlUmVmZXJlbmNlKSkgLy8gYWxyZWFkeSBjb25maWd1cmVkCisJCQlyZXR1cm47CisKKwkJaWYgKGZlYXR1cmVSZWZlcmVuY2UgPT0gbnVsbCkgeworCQkJVXBkYXRlQ29yZS53YXJuKCJUaGUgZmVhdHVyZSByZWZlcmVuY2UgdG8gY29uZmlndXJlIGlzIG51bGwiKTsgLy8kTk9OLU5MUy0xJAorCQkJcmV0dXJuOworCQl9CisKKwkJSUZlYXR1cmUgZmVhdHVyZSA9IG51bGw7CisJCXRyeSB7CisJCQlmZWF0dXJlID0gZmVhdHVyZVJlZmVyZW5jZS5nZXRGZWF0dXJlKG51bGwpOworCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCWlmICghVXBkYXRlTWFuYWdlclV0aWxzLmlzT3B0aW9uYWwoZmVhdHVyZVJlZmVyZW5jZSkpIHsKKwkJCQlVUkwgdXJsID0gZmVhdHVyZVJlZmVyZW5jZS5nZXRVUkwoKTsKKwkJCQlTdHJpbmcgdXJsU3RyaW5nID0gKHVybCAhPSBudWxsKSA/IHVybC50b0V4dGVybmFsRm9ybSgpIDogIjxubyBmZWF0dXJlIHJlZmVyZW5jZSB1cmw+IjsgLy8kTk9OLU5MUy0xJAorCQkJCVVwZGF0ZUNvcmUud2FybigiRXJyb3IgcmV0cmlldmluZyBmZWF0dXJlOiIgKyB1cmxTdHJpbmcsIGUpOyAvLyROT04tTkxTLTEkCisJCQkJcmV0dXJuOworCQkJfQorCQl9CisJCWlmIChmZWF0dXJlID09IG51bGwpIHsKKwkJCVVSTCB1cmwgPSBmZWF0dXJlUmVmZXJlbmNlLmdldFVSTCgpOworCQkJU3RyaW5nIHVybFN0cmluZyA9ICh1cmwgIT0gbnVsbCkgPyB1cmwudG9FeHRlcm5hbEZvcm0oKSA6ICI8bm8gZmVhdHVyZSByZWZlcmVuY2UgdXJsPiI7IC8vJE5PTi1OTFMtMSQKKwkJCVVwZGF0ZUNvcmUud2FybigiVGhlIGZlYXR1cmUgdG8gdW5jb25maWd1cmUgaXMgbnVsbDogZmVhdHVyZSByZWZlcmVuY2UgaXM6IiArIHVybFN0cmluZyk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCisJCS8vIFNldHVwIG9wdGlvbmFsIGluc3RhbGwgaGFuZGxlcgorCQlJbnN0YWxsSGFuZGxlclByb3h5IGhhbmRsZXIgPSBudWxsOworCQlpZiAoY2FsbEluc3RhbGxIYW5kbGVyICYmIGZlYXR1cmUuZ2V0SW5zdGFsbEhhbmRsZXJFbnRyeSgpICE9IG51bGwpCisJCQloYW5kbGVyID0gbmV3IEluc3RhbGxIYW5kbGVyUHJveHkoSUluc3RhbGxIYW5kbGVyLkhBTkRMRVJfQUNUSU9OX0NPTkZJR1VSRSwgZmVhdHVyZSwgZmVhdHVyZS5nZXRJbnN0YWxsSGFuZGxlckVudHJ5KCksIG51bGwpOworCQlib29sZWFuIHN1Y2Nlc3MgPSBmYWxzZTsKKwkJVGhyb3dhYmxlIG9yaWdpbmFsRXhjZXB0aW9uID0gbnVsbDsKKworCQkvLyBkbyB0aGUgY29uZmlndXJlIGFjdGlvbgorCQl0cnkgeworCQkJaWYgKGhhbmRsZXIgIT0gbnVsbCkKKwkJCQloYW5kbGVyLmNvbmZpZ3VyZUluaXRpYXRlZCgpOworCisJCQlDb25maWd1cmF0aW9uQWN0aXZpdHkgYWN0aXZpdHkgPSBudWxsOworCQkJaWYgKGNyZWF0ZUFjdGl2aXR5KSB7CisJCQkJYWN0aXZpdHkgPSBuZXcgQ29uZmlndXJhdGlvbkFjdGl2aXR5KElBY3Rpdml0eS5BQ1RJT05fQ09ORklHVVJFKTsKKwkJCQlhY3Rpdml0eS5zZXRMYWJlbChmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKTsKKwkJCQlhY3Rpdml0eS5zZXREYXRlKG5ldyBEYXRlKCkpOworCQkJfQorCisJCQlhZGRDb25maWd1cmVkRmVhdHVyZVJlZmVyZW5jZSgoRmVhdHVyZVJlZmVyZW5jZU1vZGVsKSBmZWF0dXJlUmVmZXJlbmNlKTsKKworCQkJLy8gZXZlcnl0aGluZyBkb25lIG9rCisJCQlpZiAoYWN0aXZpdHkgIT0gbnVsbCkgeworCQkJCUluc3RhbGxDb25maWd1cmF0aW9uIGluc3RhbGxDb25maWcgPSAoSW5zdGFsbENvbmZpZ3VyYXRpb24pIFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCk7CisJCQkJYWN0aXZpdHkuc2V0U3RhdHVzKElBY3Rpdml0eS5TVEFUVVNfT0spOworCQkJCWluc3RhbGxDb25maWcuYWRkQWN0aXZpdHkoYWN0aXZpdHkpOworCQkJfQorCisJCQlpZiAoaGFuZGxlciAhPSBudWxsKQorCQkJCWhhbmRsZXIuY29tcGxldGVDb25maWd1cmUoKTsKKworCQkJc3VjY2VzcyA9IHRydWU7CisJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisJCQlvcmlnaW5hbEV4Y2VwdGlvbiA9IHQ7CisJCX0gZmluYWxseSB7CisJCQlUaHJvd2FibGUgbmV3RXhjZXB0aW9uID0gbnVsbDsKKwkJCXRyeSB7CisJCQkJaWYgKGhhbmRsZXIgIT0gbnVsbCkKKwkJCQkJaGFuZGxlci5jb25maWd1cmVDb21wbGV0ZWQoc3VjY2Vzcyk7CisJCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgeworCQkJCW5ld0V4Y2VwdGlvbiA9IHQ7CisJCQl9CisJCQlpZiAob3JpZ2luYWxFeGNlcHRpb24gIT0gbnVsbCkgLy8gb3JpZ2luYWwgZXhjZXB0aW9uIHdpbnMKKwkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5JbnN0YWxsSGFuZGxlcl9lcnJvciwgKG5ldyBTdHJpbmdbXSB7IGZlYXR1cmUuZ2V0TGFiZWwoKSB9KSksIG9yaWdpbmFsRXhjZXB0aW9uKTsKKwkJCWlmIChuZXdFeGNlcHRpb24gIT0gbnVsbCkKKwkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5JbnN0YWxsSGFuZGxlcl9lcnJvciwgKG5ldyBTdHJpbmdbXSB7IGZlYXR1cmUuZ2V0TGFiZWwoKSB9KSksIG5ld0V4Y2VwdGlvbik7CisJCX0KKwl9CisKKwkvKioKKwkgKiBjaGVjayBpZiB0aGUgcGx1Z2lucyB0byB1bmNvbmZpZ3VyZSBhcmUgcmVxdWlyZWQgYnkgb3RoZXIgY29uZmlndXJlZCBmZWF0dXJlIGFuZAorCSAqIGFkZHMgdGhlIGZlYXR1cmUgdG8gdGhlIGxpc3Qgb2YgdW5jb25maWd1cmVkIGZlYXR1cmVzIAorCSAqLworCXB1YmxpYyBib29sZWFuIHVuY29uZmlndXJlKElGZWF0dXJlUmVmZXJlbmNlIGZlYXR1cmVSZWZlcmVuY2UsIGJvb2xlYW4gY2FsbEluc3RhbGxIYW5kbGVyLCBib29sZWFuIGNyZWF0ZUFjdGl2aXR5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisKKwkJaWYgKGlzVW5jb25maWd1cmVkKGZlYXR1cmVSZWZlcmVuY2UpKSB7CisJCQlVcGRhdGVDb3JlLndhcm4oIkZlYXR1cmUgYWxyZWFkeSB1bmNvbmZpZ3VyZWQiKTsgLy8kTk9OLU5MUy0xJAorCQkJcmV0dXJuIHRydWU7CisJCX0KKworCQlpZiAoZmVhdHVyZVJlZmVyZW5jZSA9PSBudWxsKSB7CisJCQlVcGRhdGVDb3JlLndhcm4oIlRoZSBmZWF0dXJlIHJlZmVyZW5jZSB0byB1bmNvbmZpZ3VyZSBpcyBudWxsIik7IC8vJE5PTi1OTFMtMSQKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCUlGZWF0dXJlIGZlYXR1cmUgPSBudWxsOworCQl0cnkgeworCQkJZmVhdHVyZSA9IGZlYXR1cmVSZWZlcmVuY2UuZ2V0RmVhdHVyZShudWxsKTsKKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQlpZiAoIVVwZGF0ZU1hbmFnZXJVdGlscy5pc09wdGlvbmFsKGZlYXR1cmVSZWZlcmVuY2UpKSB7CisJCQkJVVJMIHVybCA9IGZlYXR1cmVSZWZlcmVuY2UuZ2V0VVJMKCk7CisJCQkJU3RyaW5nIHVybFN0cmluZyA9ICh1cmwgIT0gbnVsbCkgPyB1cmwudG9FeHRlcm5hbEZvcm0oKSA6ICI8bm8gZmVhdHVyZSByZWZlcmVuY2UgdXJsPiI7IC8vJE5PTi1OTFMtMSQKKwkJCQlVcGRhdGVDb3JlLndhcm4oIkVycm9yIHJldHJpZXZpbmcgZmVhdHVyZToiICsgdXJsU3RyaW5nLCBlKTsgLy8kTk9OLU5MUy0xJAorCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfQorCisJCWlmIChmZWF0dXJlID09IG51bGwpIHsKKwkJCVVSTCB1cmwgPSBmZWF0dXJlUmVmZXJlbmNlLmdldFVSTCgpOworCQkJU3RyaW5nIHVybFN0cmluZyA9ICh1cmwgIT0gbnVsbCkgPyB1cmwudG9FeHRlcm5hbEZvcm0oKSA6ICI8bm8gZmVhdHVyZSByZWZlcmVuY2UgdXJsPiI7IC8vJE5PTi1OTFMtMSQKKwkJCVVwZGF0ZUNvcmUud2FybigiVGhlIGZlYXR1cmUgdG8gdW5jb25maWd1cmUgaXMgbnVsbDogZmVhdHVyZSByZWZlcmVuY2UgaXM6IiArIHVybFN0cmluZyk7IC8vJE5PTi1OTFMtMSQKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCS8vIFNldHVwIG9wdGlvbmFsIGluc3RhbGwgaGFuZGxlcgorCQlJbnN0YWxsSGFuZGxlclByb3h5IGhhbmRsZXIgPSBudWxsOworCQlpZiAoY2FsbEluc3RhbGxIYW5kbGVyICYmIGZlYXR1cmUuZ2V0SW5zdGFsbEhhbmRsZXJFbnRyeSgpICE9IG51bGwpIHsKKwkJCWhhbmRsZXIgPSBuZXcgSW5zdGFsbEhhbmRsZXJQcm94eShJSW5zdGFsbEhhbmRsZXIuSEFORExFUl9BQ1RJT05fVU5DT05GSUdVUkUsIGZlYXR1cmUsIGZlYXR1cmUuZ2V0SW5zdGFsbEhhbmRsZXJFbnRyeSgpLCBudWxsKTsKKwkJfQorCisJCWJvb2xlYW4gc3VjY2VzcyA9IGZhbHNlOworCQlUaHJvd2FibGUgb3JpZ2luYWxFeGNlcHRpb24gPSBudWxsOworCisJCS8vIGRvIHRoZSB1bmNvbmZpZ3VyZSBhY3Rpb24KKwkJdHJ5IHsKKworCQkJQ29uZmlndXJhdGlvbkFjdGl2aXR5IGFjdGl2aXR5ID0gbnVsbDsKKwkJCWlmIChjcmVhdGVBY3Rpdml0eSkgeworCQkJCWFjdGl2aXR5ID0gbmV3IENvbmZpZ3VyYXRpb25BY3Rpdml0eShJQWN0aXZpdHkuQUNUSU9OX1VOQ09ORklHVVJFKTsKKwkJCQlhY3Rpdml0eS5zZXRMYWJlbChmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKTsKKwkJCQlhY3Rpdml0eS5zZXREYXRlKG5ldyBEYXRlKCkpOworCQkJfQorCisJCQlJbnN0YWxsQ29uZmlndXJhdGlvbiBpbnN0YWxsQ29uZmlnID0gbnVsbDsKKworCQkJLy8gb25seSBhc2sgZm9yIGluc3RhbGwgY29uZmlnIGlzIGFjdGl2aXR5IGNyZWF0ZWQuCisJCQkvLyBwcmV2ZW50cyBsb29wcyBkdXJpbmcgcmVjb25jaWxpYXRpb24KKwkJCWlmIChhY3Rpdml0eSAhPSBudWxsKQorCQkJCWluc3RhbGxDb25maWcgPSAoKEluc3RhbGxDb25maWd1cmF0aW9uKSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpKTsKKworCQkJLy8gQWxsb3cgdW5jb25maWd1cmUgaWYgdGhlIGZlYXR1cmUgaXMgb3B0aW9uYWwgZnJvbSBhbGwgdGhlIHBhcmVudHMKKwkJCS8vIG9yIGlmIHRoZSBmZWF0dXJlIGlzIG1hbmRhdG9yeSBhbmQgbm9uIG9mIGl0cyBwYXJlbnQgYXJlIGNvbmZpZ3VyZWQKKwkJCS8vIHJlbW92ZWQsIG5vdCBhIGNvcmUgaXNzdWUgKHNvIGRlZXAgZG93bikKKwkJCS8vaWYgKHZhbGlkYXRlTm9Db25maWd1cmVkUGFyZW50cyhmZWF0dXJlKSkgeworCQkJaWYgKGhhbmRsZXIgIT0gbnVsbCkKKwkJCQloYW5kbGVyLnVuY29uZmlndXJlSW5pdGlhdGVkKCk7CisJCQlhZGRVbmNvbmZpZ3VyZWRGZWF0dXJlUmVmZXJlbmNlKChGZWF0dXJlUmVmZXJlbmNlTW9kZWwpIGZlYXR1cmVSZWZlcmVuY2UpOworCQkJaWYgKGhhbmRsZXIgIT0gbnVsbCkKKwkJCQloYW5kbGVyLmNvbXBsZXRlVW5jb25maWd1cmUoKTsKKworCQkJLy8gZXZlcnl0aGluZyBkb25lIG9rCisJCQlpZiAoYWN0aXZpdHkgIT0gbnVsbCkgeworCQkJCWFjdGl2aXR5LnNldFN0YXR1cyhJQWN0aXZpdHkuU1RBVFVTX09LKTsKKwkJCQlpbnN0YWxsQ29uZmlnLmFkZEFjdGl2aXR5KGFjdGl2aXR5KTsKKwkJCX0KKwkJCXN1Y2Nlc3MgPSB0cnVlOworCQkJLy99IGVsc2UgeworCQkJLy8JaWYgKGFjdGl2aXR5ICE9IG51bGwpIHsKKwkJCS8vCQlhY3Rpdml0eS5zZXRTdGF0dXMoSUFjdGl2aXR5LlNUQVRVU19OT0spOworCQkJLy8JCWluc3RhbGxDb25maWcuYWRkQWN0aXZpdHlNb2RlbCgoQ29uZmlndXJhdGlvbkFjdGl2aXR5TW9kZWwpIGFjdGl2aXR5KTsKKwkJCS8vCX0KKwkJCS8vfQorCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgeworCQkJb3JpZ2luYWxFeGNlcHRpb24gPSB0OworCQl9IGZpbmFsbHkgeworCQkJVGhyb3dhYmxlIG5ld0V4Y2VwdGlvbiA9IG51bGw7CisJCQl0cnkgeworCQkJCWlmIChoYW5kbGVyICE9IG51bGwpCisJCQkJCWhhbmRsZXIudW5jb25maWd1cmVDb21wbGV0ZWQoc3VjY2Vzcyk7CisJCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgeworCQkJCW5ld0V4Y2VwdGlvbiA9IHQ7CisJCQl9CisJCQlpZiAob3JpZ2luYWxFeGNlcHRpb24gIT0gbnVsbCkgLy8gb3JpZ2luYWwgZXhjZXB0aW9uIHdpbnMKKwkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5JbnN0YWxsSGFuZGxlcl9lcnJvciwgKG5ldyBTdHJpbmdbXSB7IGZlYXR1cmUuZ2V0TGFiZWwoKSB9KSksIG9yaWdpbmFsRXhjZXB0aW9uKTsKKwkJCWlmIChuZXdFeGNlcHRpb24gIT0gbnVsbCkKKwkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5JbnN0YWxsSGFuZGxlcl9lcnJvciwgKG5ldyBTdHJpbmdbXSB7IGZlYXR1cmUuZ2V0TGFiZWwoKSB9KSksIG5ld0V4Y2VwdGlvbik7CisJCX0KKworCQlpZiAoIXN1Y2Nlc3MpIHsKKwkJCVVSTCB1cmwgPSBmZWF0dXJlUmVmZXJlbmNlLmdldFVSTCgpOworCQkJU3RyaW5nIHVybFN0cmluZyA9ICh1cmwgIT0gbnVsbCkgPyB1cmwudG9FeHRlcm5hbEZvcm0oKSA6ICI8bm8gZmVhdHVyZSByZWZlcmVuY2UgdXJsPiI7IC8vJE5PTi1OTFMtMSQKKwkJCVVwZGF0ZUNvcmUud2FybigiVW5hYmxlIHRvIHVuY29uZmlndXJlOiIgKyB1cmxTdHJpbmcpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJcmV0dXJuIHN1Y2Nlc3M7CisJfQorCisJLyoqCisJICogQ2FsY3VsYXRlcyB0aGUgcGx1Z2luIGxpc3QgZm9yIHRoZSBwb2xpY3kuIEZvciAiSU5DTFVERSIgcG9saWN5LCB0aGlzCisJICogY29ycmVzcG9uZHMgdG8gdGhlIHBsdWdpbnMgZm9yIGNvbmZpZ3VyZWQgZmVhdHVyZXMuIEZvciAiRVhDTFVERSIKKwkgKiBwb2xpY3ksIHRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIHBsdWdpbnMgZm9yIHVuY29uZmlndXJlZCBmZWF0dXJlcyB0aGF0CisJICogYXJlIG5vdCByZWZlcmVuY2VkIGJ5IGFueSBjb25maWd1cmVkIGZlYXR1cmVzLgorCSAqLworCXB1YmxpYyBTdHJpbmdbXSBnZXRQbHVnaW5QYXRoKElTaXRlIHNpdGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJLy8gVE9ETyB3ZSBtYXkgbmVlZCB0byBleGNsdWRlIHBhdGNoZWQgcGx1Z2lucyBoZXJlLCBidXQgdGhpcyBzaG91bGQgYmUgZ29vZCBlbm91Z2ggZm9yIG5vdworCQlpZiAoZ2V0UG9saWN5KCkgPT0gSVBsYXRmb3JtQ29uZmlndXJhdGlvbi5JU2l0ZVBvbGljeS5NQU5BR0VEX09OTFkpCisJCQlyZXR1cm4gbmV3IFN0cmluZ1swXTsKKwkJCQorCQlTdHJpbmdbXSBwbHVnaW5QYXRoczsKKwkJLy8gTm90ZTogU2luY2UgMy4wTTcgd2UgbGVhdmUgcGF0Y2hlZCBmZWF0dXJlcyBjb25maWd1cmVkLAorCQkvLyBhbmQgdGFrZSB0aGlzIGludG8gYWNjb3VudCB3aGVuIGNvbXB1dGluZyBjb25maWd1cmVkIHBsdWdpbnMKKwkJLy8gYWxsIHVuY29uZmlndXJlZCBmZWF0dXJlcy4gTm90ZSB0aGF0IHBhdGNoZWQgZmVhdHVyZXMgYXJlIHN0aWxsCisJCS8vIGNvbmZpZ3VyZWQKKwkJSUZlYXR1cmVSZWZlcmVuY2VbXSB1bmNvbmZpZ3VyZWRGZWF0dXJlcyA9IGdldFVuY29uZmlndXJlZEZlYXR1cmVzKCk7CisJCS8vIGFsbCBjb25maWd1cmVkIGZlYXR1cmVzLCBpbmNsdWRpbmcgcGF0Y2hlcyBhbmQgcGF0Y2hlZCBmZWF0dXJlcworCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGNvbmZpZ3VyZWRGZWF0dXJlcyA9IGdldENvbmZpZ3VyZWRGZWF0dXJlcygpOworCQlpZiAoIWlzRW5hYmxlZCgpKSB7CisJCQlpZiAoZ2V0UG9saWN5KCkgPT0gSVBsYXRmb3JtQ29uZmlndXJhdGlvbi5JU2l0ZVBvbGljeS5VU0VSX0lOQ0xVREUpIHsKKwkJCQkvLyBkaXNhYmxlZCBzaXRlLCBJTkNMVURFIHBvbGljeQorCQkJCXBsdWdpblBhdGhzID0gbmV3IFN0cmluZ1swXTsKKwkJCX0gZWxzZSB7CisJCQkJLy8gZGlzYWJsZWQgc2l0ZSwgRVhDTFVERSBwb2xpY3kKKwkJCQlwbHVnaW5QYXRocyA9IGdldEFsbEtub3duUGx1Z2luU3RyaW5ncyhzaXRlLAorCQkJCQkJY29uZmlndXJlZEZlYXR1cmVzLCB1bmNvbmZpZ3VyZWRGZWF0dXJlcyk7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvLyBQYXRjaGVkRmVhdHVyZXMgKG1heSBoYXZlIG5vIHBhdGNoZXMpIHdpdGggY29ycmVzcG9uZGluZyBwYXRjaGVzCisJCQlQYXRjaGVkRmVhdHVyZVtdIHBhdGNoZWRGZWF0dXJlcyA9IGJ1aWxkUGF0Y2hlZEZlYXR1cmVzKGNvbmZpZ3VyZWRGZWF0dXJlcyk7CisJCQlpZiAoZ2V0UG9saWN5KCkgPT0gSVBsYXRmb3JtQ29uZmlndXJhdGlvbi5JU2l0ZVBvbGljeS5VU0VSX0lOQ0xVREUpIHsKKwkJCQkvLyBlbmFibGVkIHNpdGUsIElOQ0xVREUgcG9saWN5CisJCQkJcGx1Z2luUGF0aHMgPSBnZXRDb25maWd1cmVkUGx1Z2luU3RyaW5ncyhzaXRlLCBwYXRjaGVkRmVhdHVyZXMpOworCQkJfSBlbHNlIHsKKwkJCQkvLyBlbmFibGVkIHNpdGUsIEVYQ0xVREUgcG9saWN5IC0gdGhlIHVzdWFsIHNjZW5hcmlvIGZvciBsb2NhbAorCQkJCS8vIHNpdGUuCisJCQkJLy8gcmV0dXJuIGFsbCBrbm93biBNSU5VUyBjb25maWd1cmVkIHBsdWdpbnMKKwkJCQlwbHVnaW5QYXRocyA9IHN1YnRyYWN0KGdldEFsbEtub3duUGx1Z2luU3RyaW5ncyhzaXRlLAorCQkJCQkJY29uZmlndXJlZEZlYXR1cmVzLCB1bmNvbmZpZ3VyZWRGZWF0dXJlcyksCisJCQkJCQlnZXRDb25maWd1cmVkUGx1Z2luU3RyaW5ncyhzaXRlLCBwYXRjaGVkRmVhdHVyZXMpKTsKKwkJCX0KKwkJfQorCQkvL1RSQUNFCisJCWlmIChVcGRhdGVDb3JlLkRFQlVHICYmIFVwZGF0ZUNvcmUuREVCVUdfU0hPV19SRUNPTkNJTEVSKSB7CisJCQlVcGRhdGVDb3JlCisJCQkJCS5kZWJ1ZygiR2V0UGx1Z2luUGF0aCBmb3I6ICIgLy8kTk9OLU5MUy0xJAorCQkJCQkJCSsgKChzaXRlID09IG51bGwpID8gIjxObyBzaXRlPiIgOiBzaXRlLmdldFVSTCgpIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCS50b1N0cmluZygpKSk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHBsdWdpblBhdGhzLmxlbmd0aDsgaSsrKSB7CisJCQkJVXBkYXRlQ29yZS5kZWJ1ZygiVG8gd3JpdGU6IiArIHBsdWdpblBhdGhzW2ldKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQl9CisJCXJldHVybiBwbHVnaW5QYXRoczsKKwl9CisJCisJLyoqCisJICogT2J0YWlucyBQYXRjaGVkRmVhdHVyZXMgLSBub24gcGF0Y2ggZmVhdHVyZXMgd2l0aCBjb3JyZXNwb25kaW5nIHBhdGNoZXMgaWYgYW55CisJICogCisJICogQHBhcmFtIGZlYXR1cmVzCisJICogICAgICAgICAgICBhcnJheSBvZiBmZWF0dXJlcyB0byBvcGVyYXRlIHdpdGgKKwkgKiBAcmV0dXJuIFBhdGNoZXMKKwkgKi8KKwlwcml2YXRlIFBhdGNoZWRGZWF0dXJlW10gYnVpbGRQYXRjaGVkRmVhdHVyZXMoSUZlYXR1cmVSZWZlcmVuY2VbXSBmZWF0dXJlcykgeworCQkvLyBQYXRjaGVkRmVhdHVyZXMgYnkgVmVyc2lvbmVkSWRlbnRpZmllcgorCQlNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKKwkJLy8gQ3JlYXRlIGEgbWFwIG9mIGZlYXR1cmVzIChub3QgcGF0Y2hlcykKKwkJZm9yIChpbnQgZiA9IDA7IGYgPCBmZWF0dXJlcy5sZW5ndGg7IGYrKykgeworCQkJSUZlYXR1cmVSZWZlcmVuY2UgZmVhdHVyZVJlZiA9IGZlYXR1cmVzW2ZdOworCQkJdHJ5IHsKKwkJCQlpZihmZWF0dXJlUmVmLmlzUGF0Y2goKSl7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlWZXJzaW9uZWRJZGVudGlmaWVyIHZpID0gZmVhdHVyZVJlZi5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7CisJCQkJbWFwLnB1dCh2aSwgbmV3IFBhdGNoZWRGZWF0dXJlKGZlYXR1cmVzW2ZdKSk7CisJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCQlVcGRhdGVDb3JlLndhcm4obnVsbCwgZSk7CisJCQl9CisJCX0KKwkJLy8gYXR0YWNoIHBhdGNoZXMgdG8gZmVhdHVyZXMKKwkJZm9yIChpbnQgZiA9IDA7IGYgPCBmZWF0dXJlcy5sZW5ndGg7IGYrKykgeworCQkJSUZlYXR1cmVSZWZlcmVuY2UgcGF0Y2hDYW5kaWRhdGUgPSBmZWF0dXJlc1tmXTsKKwkJCXRyeSB7CisJCQkJSUZlYXR1cmUgZmVhdHVyZSA9IHBhdGNoQ2FuZGlkYXRlLmdldEZlYXR1cmUobnVsbCk7CisJCQkJSUltcG9ydFtdIGltcG9ydHMgPSBmZWF0dXJlLmdldEltcG9ydHMoKTsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IGltcG9ydHMubGVuZ3RoOyBpKyspIHsKKwkJCQkJSUltcG9ydCBvbmVJbXBvcnQgPSBpbXBvcnRzW2ldOworCQkJCQlpZiAoIW9uZUltcG9ydC5pc1BhdGNoKCkpCisJCQkJCQljb250aW51ZTsKKwkJCQkJLy8gaXQgaXMgYSBwYXRjaCBmb3IKKwkJCQkJVmVyc2lvbmVkSWRlbnRpZmllciBwYXRjaGVkSWRlbnRpZmllciA9CisJCQkJCQlvbmVJbXBvcnQuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOworCQkJCQlQYXRjaGVkRmVhdHVyZSBwZj0oUGF0Y2hlZEZlYXR1cmUpIG1hcC5nZXQocGF0Y2hlZElkZW50aWZpZXIpOworCQkJCQlpZiAocGYhPW51bGwpIHsKKwkJCQkJCXBmLmFkZFBhdGNoKHBhdGNoQ2FuZGlkYXRlKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCS8vIHBhdGNoZWQgZmVhdHVyZSBub3QgZW5hYmxlZAorCQkJCQl9CisJCQkJfQorCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkJVXBkYXRlQ29yZS53YXJuKG51bGwsIGUpOworCQkJfQorCQl9CisJCUNvbGxlY3Rpb24gcGF0Y2hlZEZlYXR1cmVzPW1hcC52YWx1ZXMoKTsKKwkJcmV0dXJuIChQYXRjaGVkRmVhdHVyZVtdKXBhdGNoZWRGZWF0dXJlcy50b0FycmF5KG5ldyBQYXRjaGVkRmVhdHVyZVtwYXRjaGVkRmVhdHVyZXMuc2l6ZSgpXSk7CisJfQorCQorCS8qKgorCSAqIEBzaW5jZSAyLjAKKwkgKi8KKwlwdWJsaWMgSUZlYXR1cmVSZWZlcmVuY2VbXSBnZXRDb25maWd1cmVkRmVhdHVyZXMoKSB7CisJCUZlYXR1cmVSZWZlcmVuY2VNb2RlbFtdIHJlc3VsdCA9IGdldENvbmZpZ3VyZWRGZWF0dXJlc01vZGVsKCk7CisJCWlmIChyZXN1bHQubGVuZ3RoID09IDApCisJCQlyZXR1cm4gbmV3IElGZWF0dXJlUmVmZXJlbmNlWzBdOworCQllbHNlCisJCQlyZXR1cm4gKElGZWF0dXJlUmVmZXJlbmNlW10pIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiBAc2luY2UgMi4wCisJICovCisJcHVibGljIElGZWF0dXJlUmVmZXJlbmNlW10gZ2V0VW5jb25maWd1cmVkRmVhdHVyZXMoKSB7CisJCUZlYXR1cmVSZWZlcmVuY2VNb2RlbFtdIHJlc3VsdCA9IGdldFVuY29uZmlndXJlZEZlYXR1cmVzTW9kZWwoKTsKKwkJaWYgKHJlc3VsdC5sZW5ndGggPT0gMCkKKwkJCXJldHVybiBuZXcgSUZlYXR1cmVSZWZlcmVuY2VbMF07CisJCWVsc2UKKwkJCXJldHVybiAoSUZlYXR1cmVSZWZlcmVuY2VbXSkgcmVzdWx0OworCX0KKworCS8qKgorCSAqIEdldHMgdGhlIGNvbmZpZ3VyZWRTaXRlLgorCSAqIEByZXR1cm4gUmV0dXJucyBhIElDb25maWd1cmVkU2l0ZQorCSAqLworCXB1YmxpYyBJQ29uZmlndXJlZFNpdGUgZ2V0Q29uZmlndXJlZFNpdGUoKSB7CisJCXJldHVybiAoSUNvbmZpZ3VyZWRTaXRlKSBnZXRDb25maWd1cmVkU2l0ZU1vZGVsKCk7CisJfQorCisJLyoqCisJICogcmVtb3ZlcyBhIGZlYXR1cmUgcmVmZXJlbmNlCisJICovCisJcHVibGljIHZvaWQgcmVtb3ZlRmVhdHVyZVJlZmVyZW5jZShJRmVhdHVyZVJlZmVyZW5jZSBmZWF0dXJlUmVmKSB7CisJCWlmIChmZWF0dXJlUmVmIGluc3RhbmNlb2YgRmVhdHVyZVJlZmVyZW5jZU1vZGVsKSB7CisJCQlyZW1vdmVGZWF0dXJlUmVmZXJlbmNlKChGZWF0dXJlUmVmZXJlbmNlTW9kZWwpIGZlYXR1cmVSZWYpOworCQl9CisJfQorCisJLyoqCisJICogQHJldHVybiBhbiBhcnJheSBvZiBwbHVnaW4gcGF0aCBmb3IgdGhlIGFycmF5IG9mIGZlYXR1cmUgcmVmZXJlbmNlLiBGb3IKKwkgKiAgICAgICAgIGZlYXR1cmVzIHRoYXQgaGF2ZSBwYXRjaGVzLCBwbHVnaW4gcGF0aCB3aWxsCisJICogICAgICAgICBwb2ludCB0byBwbHVnaW4gd2l0aCB0aGUgc2FtZSBJRCBwcm92aWRlZCBieSB0aGUgcGF0Y2ggaWYgaXQKKwkgKiAgICAgICAgIGV4aXN0cy4gRWFjaCBwbHVnaW4gcGF0aCBvbmx5IGFwcGVhcnMgb25jZSBbYnVnIDIxNzUwXQorCSAqLworCXByaXZhdGUgU3RyaW5nW10gZ2V0Q29uZmlndXJlZFBsdWdpblN0cmluZ3MoSVNpdGUgc2l0ZSwgUGF0Y2hlZEZlYXR1cmVbXSBmZWF0dXJlcykgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfQ09ORklHVVJBVElPTil7CisJCQlVcGRhdGVDb3JlLndhcm4oIkNPTkZJR1VSRUQgUExVR0lOUyIpOyAvLyROT04tTkxTLTEkCisJCX0KKwkKKwkJLy8gVXNlIHNldCB0byBlbGltaW5hdGUgcGx1Z2lucyB3aXRoIHNhbWUgSUQgYW5kIHZlcnNpb24uCisJCS8vIERpZmZlcmVudCB2ZXJzaW9ucyBvZiBwbHVnaW5zIHdpdGggc2FtZSBJRCBhcmUgYWxsb3dlZCBpZiBjb21pbmcgZnJvbSBkaWZmZXJlbnQgZmVhdHVyZXMKKwkJU2V0IGZlYXR1cmVQbHVnaW5zID0gbmV3IEhhc2hTZXQoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5sZW5ndGg7IGkrKykgeworCQkJRmVhdHVyZVBsdWdpbltdIHBsdWdpbnMgPSBmZWF0dXJlc1tpXS5nZXRQbHVnaW5zKCk7CisJCQlmZWF0dXJlUGx1Z2lucy5hZGRBbGwoQXJyYXlzLmFzTGlzdChwbHVnaW5zKSk7CisJCX0KKwkJU2V0IHBsdWdpblN0cmluZ3MgPSBnZXRQbHVnaW5TdHJpbmdzKHNpdGUsIChGZWF0dXJlUGx1Z2luW10pIGZlYXR1cmVQbHVnaW5zLnRvQXJyYXkobmV3IEZlYXR1cmVQbHVnaW5bZmVhdHVyZVBsdWdpbnMuc2l6ZSgpXSkpOworCQlyZXR1cm4gKFN0cmluZ1tdKSBwbHVnaW5TdHJpbmdzLnRvQXJyYXkobmV3IFN0cmluZ1twbHVnaW5TdHJpbmdzLnNpemUoKV0pOworCX0KKwkvKioKKwkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHBsdWdpbiBwYXRoIGZvciBldmVyeSBwbHVnaW4gaW4ga25vd24gZmVhdHVyZXMKKwkgKi8KKwlwcml2YXRlIFN0cmluZ1tdIGdldEFsbEtub3duUGx1Z2luU3RyaW5ncyhJU2l0ZSBzaXRlLCBJRmVhdHVyZVJlZmVyZW5jZVtdIGNvbmZpZ3VyZWQsSUZlYXR1cmVSZWZlcmVuY2VbXSB1bmNvbmZpZ3VyZWQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX0NPTkZJR1VSQVRJT04peworCQkJVXBkYXRlQ29yZS53YXJuKCJBTEwgUExVR0lOUyIpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJLy8gQWRkIGZlYXR1cmVzLCBwYXRjaGVkIGZlYXR1cmVzLCBvciBwYXRjaGVzCisJCUlGZWF0dXJlUmVmZXJlbmNlW10gYWxsPW5ldyBJRmVhdHVyZVJlZmVyZW5jZVtjb25maWd1cmVkLmxlbmd0aCt1bmNvbmZpZ3VyZWQubGVuZ3RoXTsKKwkJU3lzdGVtLmFycmF5Y29weShjb25maWd1cmVkLCAwLCBhbGwsIDAsIGNvbmZpZ3VyZWQubGVuZ3RoKTsKKwkJU3lzdGVtLmFycmF5Y29weSh1bmNvbmZpZ3VyZWQsIDAsIGFsbCwgY29uZmlndXJlZC5sZW5ndGgsIHVuY29uZmlndXJlZC5sZW5ndGgpOworCQkvLworCQlTZXQgcGF0Y2hlZFBsdWdpbnMgPSBuZXcgSGFzaFNldCgpOworCQlmb3IgKGludCBpPTA7IGk8IGFsbC5sZW5ndGg7IGkrKykgeworCQkJdHJ5IHsKKwkJCQlJRmVhdHVyZSBmZWF0dXJlID0gYWxsW2ldLmdldEZlYXR1cmUobnVsbCk7CisJCQkJaWYgKGZlYXR1cmUgPT0gbnVsbCkgeworCQkJCQlVcGRhdGVDb3JlLndhcm4oIk51bGwgRmVhdHVyZSIsIG5ldyBFeGNlcHRpb24oKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJY29udGludWU7CisJCQkJfQorCisJCQkJSVBsdWdpbkVudHJ5W10gZW50cmllcyA9IGZlYXR1cmUuZ2V0UGx1Z2luRW50cmllcygpOworCQkJCS8vIGFkZCBldmVyeSBwbHVnaW4gdG8gdGhlIG1hcAorCQkJCWZvciAoaW50IGVudHIgPSAwOyBlbnRyIDwgZW50cmllcy5sZW5ndGg7IGVudHIrKykgeworCQkJCQlwYXRjaGVkUGx1Z2lucy5hZGQobmV3IEZlYXR1cmVQbHVnaW4oZW50cmllc1tlbnRyXSwgZmVhdHVyZSkpOworCQkJCX0KKworCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkJVXBkYXRlQ29yZS53YXJuKG51bGwsIGUpOworCQkJfQorCQl9CisJCVNldCBwbHVnaW5TdHJpbmdzID0gZ2V0UGx1Z2luU3RyaW5ncyhzaXRlLCAgKEZlYXR1cmVQbHVnaW5bXSlwYXRjaGVkUGx1Z2lucy50b0FycmF5KG5ldyBGZWF0dXJlUGx1Z2luW3BhdGNoZWRQbHVnaW5zLnNpemUoKV0pKTsKKwkJcmV0dXJuIChTdHJpbmdbXSkgcGx1Z2luU3RyaW5ncy50b0FycmF5KG5ldyBTdHJpbmdbcGx1Z2luU3RyaW5ncy5zaXplKCldKTsKKwl9CisJLyoqCisJICogQHBhcmFtIHNpdGUKKwkgKiBAcGFyYW0gcGx1Z2luc1tdCisJICogQHJldHVybiB2YWxpZCBzdHJpbmcgcG9pbnRpbmcgdG8gcGx1Z2lucyBpbiBnaXZlbiBmZWF0dXJlcworCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgorCSAqLworCXByaXZhdGUgU2V0IGdldFBsdWdpblN0cmluZ3MoSVNpdGUgc2l0ZSwgRmVhdHVyZVBsdWdpbltdIHBsdWdpbnMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJU2V0IHBsdWdpblN0cmluZ3M9bmV3IEhhc2hTZXQoKTsKKwkJZm9yIChpbnQgaT0wOyBpPCBwbHVnaW5zLmxlbmd0aDsgaSsrKSB7CisJCQlJUGx1Z2luRW50cnkgZW50cnkgPSBwbHVnaW5zW2ldLmdldEVudHJ5KCk7CisJCQlJRmVhdHVyZSBmZWF0dXJlPXBsdWdpbnNbaV0uZ2V0RmVhdHVyZSgpOworCisJCQkvLyBvYnRhaW4gdGhlIHBhdGggb2YgdGhlIHBsdWdpbiBkaXJlY3RvcmllcyBvbiB0aGUgc2l0ZQorCQkJQ29udGVudFJlZmVyZW5jZVtdIGZlYXR1cmVDb250ZW50UmVmZXJlbmNlID0gbnVsbDsKKwkJCXRyeSB7CisJCQkJZmVhdHVyZUNvbnRlbnRSZWZlcmVuY2UgPSBmZWF0dXJlLmdldEZlYXR1cmVDb250ZW50UHJvdmlkZXIoKS5nZXRQbHVnaW5FbnRyeUFyY2hpdmVSZWZlcmVuY2VzKGVudHJ5LCBudWxsIC8qSVByb2dyZXNzTW9uaXRvciovCisJCQkJKTsKKwkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJCVVwZGF0ZUNvcmUud2FybihudWxsLCBlKTsKKwkJCX0KKworCQkJLy8gdHJhbnNmb3JtIGludG8gYSB2YWxpZCBTdHJpbmcKKwkJCWlmIChmZWF0dXJlQ29udGVudFJlZmVyZW5jZSAhPSBudWxsKSB7CisJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBmZWF0dXJlQ29udGVudFJlZmVyZW5jZS5sZW5ndGg7IGorKykgeworCQkJCQlVUkwgdXJsID0gc2l0ZS5nZXRTaXRlQ29udGVudFByb3ZpZGVyKCkuZ2V0QXJjaGl2ZVJlZmVyZW5jZShmZWF0dXJlQ29udGVudFJlZmVyZW5jZVtqXS5nZXRJZGVudGlmaWVyKCkpOworCQkJCQlpZiAodXJsICE9IG51bGwpIHsKKwkJCQkJCS8vIG1ha2UgaXQgcmVsYXRpdmUgdG8gdGhlIHNpdGUKKwkJCQkJCVN0cmluZyBwYXRoID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTEFzU3RyaW5nKHNpdGUuZ2V0VVJMKCksIHVybCk7CisJCQkJCQkvLyBhZGQgZW5kICIvIgorCQkJCQkJaWYoIXBhdGguZW5kc1dpdGgoIi5qYXIiKSkgLy8kTk9OLU5MUy0xJAorCQkJCQkJCXBhdGggKz0gKHBhdGguZW5kc1dpdGgoRmlsZS5zZXBhcmF0b3IpIHx8IHBhdGguZW5kc1dpdGgoIi8iKSkgPyAiIiA6ICIvIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQkJCXBsdWdpblN0cmluZ3MuYWRkKHBhdGgpOworCQkJCQkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX0NPTkZJR1VSQVRJT04pCisJCQkJCQkJVXBkYXRlQ29yZS53YXJuKCJBZGQgcGx1Z2luOiAiICsgcGF0aCArICIgdG8gdGhlIGxpc3QiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIHBsdWdpblN0cmluZ3M7CisJfQorCisJLyoqCisJICoJIE9idGFpbnMgc3RyaW5ncyBleGlzdGluZyBpbiB0aGUgYWxsU3RyaW5ncyBhcnJheSwgYnV0IG5vdCBpbiB0aGUgc3RyaW5nc1RvUmVtb3ZlCisJICovCisJcHJpdmF0ZSBTdHJpbmdbXSBzdWJ0cmFjdChTdHJpbmdbXSBhbGxTdHJpbmdzLCBTdHJpbmdbXSBzdHJpbmdzVG9SZW1vdmUpIHsKKwkJSGFzaFNldCByZXN1bHRMaXN0ID0gbmV3IEhhc2hTZXQoQXJyYXlzLmFzTGlzdChhbGxTdHJpbmdzKSk7CisJCXJlc3VsdExpc3QucmVtb3ZlQWxsKEFycmF5cy5hc0xpc3Qoc3RyaW5nc1RvUmVtb3ZlKSk7CisJCXJldHVybiAoU3RyaW5nW10pcmVzdWx0TGlzdC50b0FycmF5KG5ldyBTdHJpbmdbcmVzdWx0TGlzdC5zaXplKCldKTsKKwl9Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0NvbmZpZ3VyZWRTaXRlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0NvbmZpZ3VyZWRTaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I1OTI3MAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvQ29uZmlndXJlZFNpdGUuamF2YQpAQCAtMCwwICsxLDExMzYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsKKworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkxpc3RlbmVyTGlzdDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0eVJlc291cmNlQnVuZGxlOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi5JQWN0aXZpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uSUNvbmZpZ3VyZWRTaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLklDb25maWd1cmVkU2l0ZUNoYW5nZWRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi5JSW5zdGFsbENvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uSVByb2JsZW1IYW5kbGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IuQ29uZmlndXJhdG9yVXRpbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci5JUGxhdGZvcm1Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVBsdWdpbkVudHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklTaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklTaXRlRmVhdHVyZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JVmVyaWZpY2F0aW9uTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuU2l0ZU1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuVXRpbGl0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlZlcnNpb25lZElkZW50aWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuSW5zdGFsbEFib3J0ZWRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm1vZGVsLkNvbmZpZ3VyZWRTaXRlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm9wZXJhdGlvbnMuVXBkYXRlVXRpbHM7CisKKy8qKgorICogQSBDb25maWd1cmVkIHNpdGUgbWFuYWdlcyB0aGUgQ29uZmlndXJlZCBhbmQgdW5jb25maWd1cmVkIGZlYXR1cmVzIG9mIGEgU2l0ZQorICovCitwdWJsaWMgY2xhc3MgQ29uZmlndXJlZFNpdGUgZXh0ZW5kcyBDb25maWd1cmVkU2l0ZU1vZGVsIGltcGxlbWVudHMgSUNvbmZpZ3VyZWRTaXRlIHsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9EVUNUX1NJVEVfTUFSS0VSID0gIi5lY2xpcHNlcHJvZHVjdCI7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1NJVEVfTUFSS0VSID0gIi5lY2xpcHNlZXh0ZW5zaW9uIjsgLy8kTk9OLU5MUy0xJAorCisJLy8gbGlzdGVuZXJzCQorCXByaXZhdGUgTGlzdGVuZXJMaXN0IGxpc3RlbmVycyA9IG5ldyBMaXN0ZW5lckxpc3QoTGlzdGVuZXJMaXN0LklERU5USVRZKTsKKworCS8vIHZlcmlmaWNhdGlvbiBzdGF0dXMKKwlwcml2YXRlIElTdGF0dXMgdmVyaWZ5U3RhdHVzOworCisJLy8gdHJhbnNpZW50OiB0cnVlIGlmIHRoZSBzaXRlIHdhcyBqdXN0IGNyZWF0ZWQgc28gd2UgY2FuIHJlbW92ZSBpdAorCXByaXZhdGUgdHJhbnNpZW50IGJvb2xlYW4ganVzdENyZWF0ZWQgPSBmYWxzZTsKKworCS8qCisJICogRGVmYXVsdCBDb25zdHJ1Y3RvcgorCSAqLworCXB1YmxpYyBDb25maWd1cmVkU2l0ZSgpIHsKKwl9CisKKwkvKgorCSAqIENvcHkgQ29uc3RydWN0b3IKKwkgKiBBcyBvZiBub3csIGNvbmZpZ1NpdGUgY2FuIG9ubHkgYmUgb2YgdHlwZSBDb25maWd1cmVkU2l0ZQorCSAqLworCXB1YmxpYyBDb25maWd1cmVkU2l0ZShJQ29uZmlndXJlZFNpdGUgY29uZmlnU2l0ZSkgeworCQlDb25maWd1cmVkU2l0ZSBjU2l0ZSA9IChDb25maWd1cmVkU2l0ZSkgY29uZmlnU2l0ZTsKKwkJc2V0U2l0ZU1vZGVsKGNTaXRlLmdldFNpdGVNb2RlbCgpKTsKKwkJc2V0Q29uZmlndXJhdGlvblBvbGljeU1vZGVsKG5ldyBDb25maWd1cmF0aW9uUG9saWN5KGNTaXRlLmdldENvbmZpZ3VyYXRpb25Qb2xpY3koKSkpOworCQlzZXRVcGRhdGFibGUoY1NpdGUuaXNVcGRhdGFibGUoKSk7CisJCXNldEVuYWJsZWQoY1NpdGUuaXNFbmFibGVkKCkpOworCQlzZXRQcmV2aW91c1BsdWdpblBhdGgoY1NpdGUuZ2V0UHJldmlvdXNQbHVnaW5QYXRoKCkpOworCQlzZXRQbGF0Zm9ybVVSTFN0cmluZyhjU2l0ZS5nZXRQbGF0Zm9ybVVSTFN0cmluZygpKTsKKwl9CisKKwkvKgorCSAqICBBZGRzIGEgbGlzdGVuZXIKKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRDb25maWd1cmVkU2l0ZUNoYW5nZWRMaXN0ZW5lcihJQ29uZmlndXJlZFNpdGVDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7CisJfQorCisJLyoKKwkgKiBSZW1vdmVzIGEgbGlzdGVuZXIKKwkgKi8KKwlwdWJsaWMgdm9pZCByZW1vdmVDb25maWd1cmVkU2l0ZUNoYW5nZWRMaXN0ZW5lcihJQ29uZmlndXJlZFNpdGVDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJbGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7CisJfQorCisJLyoKKwkgKiBAc2VlIElDb25maWd1cmVkU2l0ZSNpbnN0YWxsKElGZWF0dXJlLElWZXJpZmljYXRpb25MaXN0ZW5lciwgSVByb2dyZXNzTW9uaXRvcikKKwkgKi8KKwlwdWJsaWMgSUZlYXR1cmVSZWZlcmVuY2UgaW5zdGFsbChJRmVhdHVyZSBmZWF0dXJlLCBJVmVyaWZpY2F0aW9uTGlzdGVuZXIgdmVyaWZpY2F0aW9uTGlzdGVuZXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEluc3RhbGxBYm9ydGVkRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGluc3RhbGwoZmVhdHVyZSwgbnVsbCwgdmVyaWZpY2F0aW9uTGlzdGVuZXIsIG1vbml0b3IpOworCX0KKworCS8qCisJICogQHNlZSBJQ29uZmlndXJlZFNpdGUjaW5zdGFsbChJRmVhdHVyZSwgSUZlYXR1cmVSZWZlcmVuY2UsIElWZXJpZmljYXRpb25MaXN0ZW5lciwgSVByb2dyZXNzTW9uaXRvcikKKwkgKi8KKwlwdWJsaWMgSUZlYXR1cmVSZWZlcmVuY2UgaW5zdGFsbChJRmVhdHVyZSBmZWF0dXJlLCBJRmVhdHVyZVJlZmVyZW5jZVtdIG9wdGlvbmFsRmVhdHVyZXMsIElWZXJpZmljYXRpb25MaXN0ZW5lciB2ZXJpZmljYXRpb25MaXN0ZW5lciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW5zdGFsbEFib3J0ZWRFeGNlcHRpb24sIENvcmVFeGNlcHRpb24geworCisJCS8vIGNoYW5nZSB0aGUgc3RhdHVzIGlmIGp1c3RDcmVhdGVkCisJCWlmIChqdXN0Q3JlYXRlZCkganVzdENyZWF0ZWQ9ZmFsc2U7CisKKwkJLy8gQ29uZmlnU2l0ZSBpcyByZWFkIG9ubHkgCisJCWlmICghaXNVcGRhdGFibGUoKSkgeworCQkJU3RyaW5nIGVycm9yTWVzc2FnZSA9IE5MUy5iaW5kKE1lc3NhZ2VzLkNvbmZpZ3VyZWRTaXRlX05vbkluc3RhbGxhYmxlU2l0ZSwgKG5ldyBTdHJpbmdbXSB7IGdldFNpdGUoKS5nZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpIH0pKTsKKwkJCUlTdGF0dXMgc3RhdHVzID0gdmVyaWZ5VXBkYXRhYmxlU3RhdHVzKCk7CisJCQlpZiAoc3RhdHVzICE9IG51bGwpCisJCQkJZXJyb3JNZXNzYWdlICs9ICIgIiArIHN0YXR1cy5nZXRNZXNzYWdlKCk7IC8vJE5PTi1OTFMtMSQKKwkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKGVycm9yTWVzc2FnZSwgbnVsbCk7CisJCX0KKworCQkvLyBmZWF0dXJlIGlzIG51bGwKKwkJaWYgKGZlYXR1cmUgPT0gbnVsbCkgeworCQkJU3RyaW5nIGVycm9yTWVzc2FnZSA9IE1lc3NhZ2VzLkNvbmZpZ3VyZWRTaXRlX051bGxGZWF0dXJlVG9JbnN0YWxsOyAKKwkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKGVycm9yTWVzc2FnZSwgbnVsbCk7CisJCX0KKworCQkvLyBmZWF0dXJlIHJlZmVyZW5jZSB0byByZXR1cm4KKwkJSUZlYXR1cmVSZWZlcmVuY2UgaW5zdGFsbGVkRmVhdHVyZVJlZjsKKwkJSUZlYXR1cmUgaW5zdGFsbGVkRmVhdHVyZSA9IG51bGw7CisKKwkJLy8gY3JlYXRlIHRoZSBBY3Rpdml0eSAoSU5TVEFMTCkKKwkJQ29uZmlndXJhdGlvbkFjdGl2aXR5IGFjdGl2aXR5ID0gbmV3IENvbmZpZ3VyYXRpb25BY3Rpdml0eShJQWN0aXZpdHkuQUNUSU9OX0ZFQVRVUkVfSU5TVEFMTCk7CisJCWFjdGl2aXR5LnNldExhYmVsKGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpOworCQlhY3Rpdml0eS5zZXREYXRlKG5ldyBEYXRlKCkpOworCisJCXRyeSB7CisJCQlpbnN0YWxsZWRGZWF0dXJlUmVmID0gZ2V0U2l0ZSgpLmluc3RhbGwoZmVhdHVyZSwgb3B0aW9uYWxGZWF0dXJlcywgdmVyaWZpY2F0aW9uTGlzdGVuZXIsIG1vbml0b3IpOworCisJCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfSU5TVEFMTCkgeworCQkJCVVwZGF0ZUNvcmUuZGVidWcoIlN1Y2Vzc2Z1bGx5IGluc3RhbGxlZDogIiArIGluc3RhbGxlZEZlYXR1cmVSZWYuZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKSk7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKworCQkJaWYgKGluc3RhbGxlZEZlYXR1cmVSZWYgIT0gbnVsbCkgeworCQkJCXRyeSB7CisJCQkJCWluc3RhbGxlZEZlYXR1cmUgPSBpbnN0YWxsZWRGZWF0dXJlUmVmLmdldEZlYXR1cmUobnVsbCk7CisJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkJCVVwZGF0ZUNvcmUud2FybihudWxsLCBlKTsKKwkJCQl9CisJCQl9CisKKwkJCS8vIGV2ZXJ5dGhpbmcgZG9uZSBvaworCQkJYWN0aXZpdHkuc2V0U3RhdHVzKElBY3Rpdml0eS5TVEFUVVNfT0spOworCisJCQkvLyBub3RpZnkgbGlzdGVuZXJzCisJCQlPYmplY3RbXSBzaXRlTGlzdGVuZXJzID0gbGlzdGVuZXJzLmdldExpc3RlbmVycygpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXRlTGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7CisJCQkJaWYgKGluc3RhbGxlZEZlYXR1cmUgIT0gbnVsbCkgeworCQkJCQlJQ29uZmlndXJlZFNpdGVDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIgPSAoKElDb25maWd1cmVkU2l0ZUNoYW5nZWRMaXN0ZW5lcikgc2l0ZUxpc3RlbmVyc1tpXSk7CisJCQkJCWxpc3RlbmVyLmZlYXR1cmVJbnN0YWxsZWQoaW5zdGFsbGVkRmVhdHVyZSk7CisJCQkJfQorCQkJfQorCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCS8vIG5vdCBvaywgc2V0IEFjdGl2aXR5IHN0YXR1cworCQkJYWN0aXZpdHkuc2V0U3RhdHVzKElBY3Rpdml0eS5TVEFUVVNfTk9LKTsKKwkJCXRocm93IGU7CisJCX0gZmluYWxseSB7CisJCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY3VycmVudCA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCk7CisJCQkoKEluc3RhbGxDb25maWd1cmF0aW9uKSBjdXJyZW50KS5hZGRBY3Rpdml0eShhY3Rpdml0eSk7CisJCX0KKwkJLy8gY2FsbCB0aGUgY29uZmlndXJlIHRhc2sJCisJCWlmIChpbnN0YWxsZWRGZWF0dXJlICE9IG51bGwpCisJCQljb25maWd1cmUoaW5zdGFsbGVkRmVhdHVyZSwgb3B0aW9uYWxGZWF0dXJlcywgdHJ1ZSk7CisJCS8qY2FsbEluc3RhbGxIYW5kbGVyKi8KKworCQlyZXR1cm4gaW5zdGFsbGVkRmVhdHVyZVJlZjsKKwl9CisKKwkvKgorCSAqIEBzZWUgSUNvbmZpZ3VyZWRTaXRlI3JlbW92ZShJRmVhdHVyZSwgSVByb2dyZXNzTW9uaXRvcikKKwkgKi8KKwlwdWJsaWMgdm9pZCByZW1vdmUoSUZlYXR1cmUgZmVhdHVyZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisKKwkJLy8gQ29uZmlnU2l0ZSBpcyByZWFkIG9ubHkKKwkJaWYgKCFpc1VwZGF0YWJsZSgpKSB7CisJCQlTdHJpbmcgZXJyb3JNZXNzYWdlID0gTkxTLmJpbmQoTWVzc2FnZXMuQ29uZmlndXJlZFNpdGVfTm9uVW5pbnN0YWxsYWJsZVNpdGUsIChuZXcgU3RyaW5nW10geyBnZXRTaXRlKCkuZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKSB9KSk7CisJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihlcnJvck1lc3NhZ2UsIG51bGwpOworCQl9CisKKwkJLy8gY3JlYXRlIHRoZSBBY3Rpdml0eQorCQlDb25maWd1cmF0aW9uQWN0aXZpdHkgYWN0aXZpdHkgPSBuZXcgQ29uZmlndXJhdGlvbkFjdGl2aXR5KElBY3Rpdml0eS5BQ1RJT05fRkVBVFVSRV9SRU1PVkUpOworCQlhY3Rpdml0eS5zZXRMYWJlbChmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKTsKKwkJYWN0aXZpdHkuc2V0RGF0ZShuZXcgRGF0ZSgpKTsKKworCQl0cnkgeworCQkJSUZlYXR1cmVSZWZlcmVuY2UgcmVmZXJlbmNlVG9SZW1vdmUgPSBudWxsOworCQkJSVNpdGVGZWF0dXJlUmVmZXJlbmNlW10gZmVhdHVyZVJlZiA9IGdldFNpdGUoKS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpOworCQkJSVNpdGVGZWF0dXJlUmVmZXJlbmNlIHJlZiA9IGdldFNpdGUoKS5nZXRGZWF0dXJlUmVmZXJlbmNlKGZlYXR1cmUpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlUmVmLmxlbmd0aDsgaSsrKSB7CisJCQkJaWYgKGZlYXR1cmVSZWZbaV0uZXF1YWxzKHJlZikpIHsKKwkJCQkJcmVmZXJlbmNlVG9SZW1vdmUgPSBmZWF0dXJlUmVmW2ldOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCS8vIHdlIGZvdW5kIGEgZmVhdHVyZSByZWZlcmVuY2Ugb24gdGhlIHNpdGUgbWF0Y2hpbmcgdGhlIGZlYXR1cmUJCQkKKwkJCWlmIChyZWZlcmVuY2VUb1JlbW92ZSAhPSBudWxsKSB7CisJCQkJLy8gQ2hlY2sgaWYgZmVhdHVyZSBpcyB1bmNvbmZpZ3VyZWQgYmVmb3JlIHdlIHJlbW92ZSBpdAorCQkJCS8vIG91ciBVSSB3aWxsIGNoZWNrLgorCQkJCS8vIEZvciBub24tVUkgYXBwbGljYXRpb24sIHRocm93IGVycm9yIGlzIGZlYXR1cmUgaXMgY29uZmlndXJlZAorCQkJCWlmIChnZXRDb25maWd1cmF0aW9uUG9saWN5KCkuaXNDb25maWd1cmVkKHJlZmVyZW5jZVRvUmVtb3ZlKSkgeworCQkJCQlJRmVhdHVyZSBmZWF0dXJlVG9SZW1vdmUgPSByZWZlcmVuY2VUb1JlbW92ZS5nZXRGZWF0dXJlKG51bGwpOworCQkJCQlTdHJpbmcgZmVhdHVyZUxhYmVsID0gKGZlYXR1cmVUb1JlbW92ZSA9PSBudWxsKSA/IG51bGwgOiBmZWF0dXJlVG9SZW1vdmUuZ2V0TGFiZWwoKTsKKwkJCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oTkxTLmJpbmQoTWVzc2FnZXMuQ29uZmlndXJlZFNpdGVfVW5hYmxlVG9SZW1vdmVDb25maWd1cmVkRmVhdHVyZSwgKG5ldyBTdHJpbmdbXSB7IGZlYXR1cmVMYWJlbCB9KSksIG51bGwpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oTkxTLmJpbmQoTWVzc2FnZXMuQ29uZmlndXJlZFNpdGVfVW5hYmxlVG9GaW5kRmVhdHVyZSwgKG5ldyBTdHJpbmdbXSB7IGZlYXR1cmUuZ2V0VVJMKCkudG9TdHJpbmcoKSB9KSksCisJCQkJbnVsbCk7CisJCQl9CisKKwkJCS8vIHJlbW92ZSB0aGUgZmVhdHVyZQorCQkJZ2V0U2l0ZSgpLnJlbW92ZShmZWF0dXJlLCBtb25pdG9yKTsKKwkJCWdldENvbmZpZ3VyYXRpb25Qb2xpY3koKS5yZW1vdmVGZWF0dXJlUmVmZXJlbmNlKHJlZmVyZW5jZVRvUmVtb3ZlKTsKKwkJCS8vIGV2ZXJ5dGhpbmcgZG9uZSBvaworCQkJYWN0aXZpdHkuc2V0U3RhdHVzKElBY3Rpdml0eS5TVEFUVVNfT0spOworCQkJLy8gbm90aWZ5IGxpc3RlbmVycworCQkJT2JqZWN0W10gc2l0ZUxpc3RlbmVycyA9IGxpc3RlbmVycy5nZXRMaXN0ZW5lcnMoKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l0ZUxpc3RlbmVycy5sZW5ndGg7IGkrKykgeworCQkJCSgoSUNvbmZpZ3VyZWRTaXRlQ2hhbmdlZExpc3RlbmVyKSBzaXRlTGlzdGVuZXJzW2ldKS5mZWF0dXJlUmVtb3ZlZChmZWF0dXJlKTsKKwkJCX0KKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQlhY3Rpdml0eS5zZXRTdGF0dXMoSUFjdGl2aXR5LlNUQVRVU19OT0spOworCQkJdGhyb3cgZTsKKwkJfSBmaW5hbGx5IHsKKwkJCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjdXJyZW50ID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKTsKKwkJCSgoSW5zdGFsbENvbmZpZ3VyYXRpb24pIGN1cnJlbnQpLmFkZEFjdGl2aXR5KGFjdGl2aXR5KTsKKwkJfQorCX0KKworCS8qCisJICogQHNlZSBJQ29uZmlndXJlZFNpdGUjY29uZmlndXJlKElGZWF0dXJlKSAKKwkgKi8KKwlwdWJsaWMgdm9pZCBjb25maWd1cmUoSUZlYXR1cmUgZmVhdHVyZSkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQljb25maWd1cmUoZmVhdHVyZSwgbnVsbCwgdHJ1ZSAvKmNhbGxJbnN0YWxsSGFuZGxlciovCisJCSk7CisJfQorCisJLyoKKwkgKiAKKwkgKi8KKwlwcml2YXRlIHZvaWQgY29uZmlndXJlKElGZWF0dXJlIGZlYXR1cmUsIElGZWF0dXJlUmVmZXJlbmNlW10gb3B0aW9uYWxGZWF0dXJlcywgYm9vbGVhbiBjYWxsSW5zdGFsbEhhbmRsZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKworCQlpZiAoZmVhdHVyZSA9PSBudWxsKSB7CisJCQlVcGRhdGVDb3JlLndhcm4oIkF0dGVtcHRpbmcgdG8gY29uZmlndXJlIGEgbnVsbCBmZWF0dXJlIGluIHNpdGU6IiArIGdldFNpdGUoKS5nZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpKTsgLy8kTk9OLU5MUy0xJAorCQkJcmV0dXJuOworCQl9CisKKwkJQ29uZmlndXJhdGlvblBvbGljeSBjb25maWdQb2xpY3kgPSBnZXRDb25maWd1cmF0aW9uUG9saWN5KCk7CisJCWlmIChjb25maWdQb2xpY3kgPT0gbnVsbCkKKwkJCXJldHVybjsKKworCQkvLyBib3R0b20gdXAgYXBwcm9hY2gsIHNhbWUgY29uZmlndXJlZFNpdGUKKwkJSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZVtdIGNoaWxkcmVuUmVmID0gZmVhdHVyZS5nZXRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCk7CisJCWlmIChvcHRpb25hbEZlYXR1cmVzICE9IG51bGwpIHsKKwkJCWNoaWxkcmVuUmVmID0gY2hpbGRyZW5Ub0NvbmZpZ3VyZShjaGlsZHJlblJlZiwgb3B0aW9uYWxGZWF0dXJlcyk7CisJCX0KKworCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuUmVmLmxlbmd0aDsgaSsrKSB7CisJCQl0cnkgeworCQkJCUlGZWF0dXJlIGNoaWxkID0gY2hpbGRyZW5SZWZbaV0uZ2V0RmVhdHVyZShudWxsKTsKKwkJCQljb25maWd1cmUoY2hpbGQsIG9wdGlvbmFsRmVhdHVyZXMsIGNhbGxJbnN0YWxsSGFuZGxlcik7CisJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCQkvLyBpZiBub3QgYW4gb3B0aW9uYWwgZmVhdHVyZSwgdGhyb3cgZXhjZXB0aW9uCisJCQkJaWYgKCFjaGlsZHJlblJlZltpXS5pc09wdGlvbmFsKCkpIHsKKwkJCQkJVXBkYXRlQ29yZS53YXJuKCJVbmFibGUgdG8gY29uZmlndXJlIGNoaWxkIGZlYXR1cmU6ICIgKyBjaGlsZHJlblJlZltpXSArICIgIiArIGUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkJdGhyb3cgZTsKKwkJCQl9CisJCQl9CisJCX0KKworCQkvLyBjb25maWd1cmUgcm9vdCBmZWF0dXJlIAkKKwkJSUZlYXR1cmVSZWZlcmVuY2UgZmVhdHVyZVJlZmVyZW5jZSA9IGdldFNpdGUoKS5nZXRGZWF0dXJlUmVmZXJlbmNlKGZlYXR1cmUpOworCQljb25maWdQb2xpY3kuY29uZmlndXJlKGZlYXR1cmVSZWZlcmVuY2UsIGNhbGxJbnN0YWxsSGFuZGxlciwgdHJ1ZSk7CisKKwkJLy8gbm90aWZ5IGxpc3RlbmVycworCQlPYmplY3RbXSBzaXRlTGlzdGVuZXJzID0gbGlzdGVuZXJzLmdldExpc3RlbmVycygpOworCQlmb3IgKGludCBpID0gMDsgaSA8IHNpdGVMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKKwkJCSgoSUNvbmZpZ3VyZWRTaXRlQ2hhbmdlZExpc3RlbmVyKSBzaXRlTGlzdGVuZXJzW2ldKS5mZWF0dXJlQ29uZmlndXJlZChmZWF0dXJlKTsKKwkJfQorCX0KKworCS8qCisJICogUmV0dXJuIHRoZSBvcHRpb25hbCBjaGlsZHJlbiB0byBjb25maWd1cmUKKwkgKiAKKwkgKiBAcGFyYW0gY2hpbGRyZW4gYWxsIHRoZSBuZXN0ZWQgZmVhdHVyZXMKKwkgKiBAcGFyYW0gb3B0aW9uYWxmZWF0dXJlcyBvcHRpb25hbCBmZWF0dXJlcyB0byBpbnN0YWxsCisJICogQHJldHVybiBJRmVhdHVyZVJlZmVyZW5jZVtdCisJICovCisJcHJpdmF0ZSBJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlW10gY2hpbGRyZW5Ub0NvbmZpZ3VyZShJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlW10gY2hpbGRyZW4sIElGZWF0dXJlUmVmZXJlbmNlW10gb3B0aW9uYWxmZWF0dXJlcykgeworCisJCUxpc3QgY2hpbGRyZW5Ub0luc3RhbGwgPSBuZXcgQXJyYXlMaXN0KCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKKwkJCUlJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2Ugb3B0aW9uYWxGZWF0dXJlVG9Db25maWd1cmUgPSBjaGlsZHJlbltpXTsKKwkJCWlmICghb3B0aW9uYWxGZWF0dXJlVG9Db25maWd1cmUuaXNPcHRpb25hbCgpKSB7CisJCQkJY2hpbGRyZW5Ub0luc3RhbGwuYWRkKG9wdGlvbmFsRmVhdHVyZVRvQ29uZmlndXJlKTsKKwkJCX0gZWxzZSB7CisJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBvcHRpb25hbGZlYXR1cmVzLmxlbmd0aDsgaisrKSB7CisJCQkJCS8vIG11c3QgY29tcGFyZSBmZWF0dXJlIGFzIG9wdGlvbmFsRmVhdHVyZXMgYXJlIGZyb20gdGhlIGluc3RhbGwgc2l0ZQorCQkJCQkvLyB3aGVyZSBjaGlsZHJlbiBhcmUgb24gdGhlIGxvY2FsIHNpdGUKKwkJCQkJdHJ5IHsKKwkJCQkJCUlGZWF0dXJlIGluc3RhbGxlZENoaWxkcmVuID0gb3B0aW9uYWxmZWF0dXJlc1tqXS5nZXRGZWF0dXJlKG51bGwpOworCQkJCQkJaWYgKGluc3RhbGxlZENoaWxkcmVuLmVxdWFscyhvcHRpb25hbEZlYXR1cmVUb0NvbmZpZ3VyZS5nZXRGZWF0dXJlKG51bGwpKSkgeworCQkJCQkJCWNoaWxkcmVuVG9JbnN0YWxsLmFkZChvcHRpb25hbEZlYXR1cmVUb0NvbmZpZ3VyZSk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJCQkJVXBkYXRlQ29yZS53YXJuKCIiLCBlKTsgLy8kTk9OLU5MUy0xJAorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisKKwkJSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZVtdIHJlc3VsdCA9IG5ldyBJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlW2NoaWxkcmVuVG9JbnN0YWxsLnNpemUoKV07CisJCWlmIChjaGlsZHJlblRvSW5zdGFsbC5zaXplKCkgPiAwKSB7CisJCQljaGlsZHJlblRvSW5zdGFsbC50b0FycmF5KHJlc3VsdCk7CisJCX0KKworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qCisJICogQHNlZSBJQ29uZmlndXJlZFNpdGUjdW5jb25maWd1cmUoSUZlYXR1cmUpCisJICovCisJcHVibGljIGJvb2xlYW4gdW5jb25maWd1cmUoSUZlYXR1cmUgZmVhdHVyZSkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQkvLyB0aGUgZmlyc3QgY2FsbCBzb3VsZCBkaXNhYmxlIHdpdGhvdXQgY2hlY2tpbmcgZm9yIGVuYWJsZSBwYXJlbnQKKwkJcmV0dXJuIHVuY29uZmlndXJlKGZlYXR1cmUsIHRydWUsIGZhbHNlKTsKKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gdW5jb25maWd1cmUoSUZlYXR1cmUgZmVhdHVyZSwgYm9vbGVhbiBpbmNsdWRlUGF0Y2hlcywgYm9vbGVhbiB2ZXJpZnlFbmFibGVQYXJlbnQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJSUZlYXR1cmVSZWZlcmVuY2UgZmVhdHVyZVJlZmVyZW5jZSA9IGdldFNpdGUoKS5nZXRGZWF0dXJlUmVmZXJlbmNlKGZlYXR1cmUpOworCisJCWlmIChmZWF0dXJlUmVmZXJlbmNlID09IG51bGwpIHsKKwkJCVVwZGF0ZUNvcmUud2FybigiVW5hYmxlIHRvIHJldHJpZXZlIEZlYXR1cmUgUmVmZXJlbmNlIGZvciBmZWF0dXJlIiArIGZlYXR1cmUpOyAvLyROT04tTkxTLTEkCisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlDb25maWd1cmF0aW9uUG9saWN5IGNvbmZpZ1BvbGljeSA9IGdldENvbmZpZ3VyYXRpb25Qb2xpY3koKTsKKwkJaWYgKGNvbmZpZ1BvbGljeSA9PSBudWxsKQorCQkJcmV0dXJuIGZhbHNlOworCisJCS8vIHZlcmlmeSBubyBlbmFibGUgcGFyZW50CisJCWlmICh2ZXJpZnlFbmFibGVQYXJlbnQgJiYgIXZhbGlkYXRlTm9Db25maWd1cmVkUGFyZW50cyhmZWF0dXJlKSkgeworCQkJVXBkYXRlQ29yZS53YXJuKCJUaGUgZmVhdHVyZSAiICsgZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkgKyAiIHRvIGRpc2FibGUgaXMgbmVlZGVkIGJ5IGFub3RoZXIgZW5hYmxlIGZlYXR1cmUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlib29sZWFuIHN1Y2Vzc2Z1bGx5VW5jb25maWd1cmVkID0gZmFsc2U7CisJCXRyeSB7CisJCQlzdWNlc3NmdWxseVVuY29uZmlndXJlZCA9IGNvbmZpZ1BvbGljeS51bmNvbmZpZ3VyZShmZWF0dXJlUmVmZXJlbmNlLCB0cnVlLCB0cnVlKTsKKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQlVUkwgdXJsID0gZmVhdHVyZVJlZmVyZW5jZS5nZXRVUkwoKTsKKwkJCVN0cmluZyB1cmxTdHJpbmcgPSAodXJsICE9IG51bGwpID8gdXJsLnRvRXh0ZXJuYWxGb3JtKCkgOiAiPG5vIGZlYXR1cmUgcmVmZXJlbmNlIHVybD4iOyAvLyROT04tTkxTLTEkCisJCQlVcGRhdGVDb3JlLndhcm4oIlVuYWJsZSB0byB1bmNvbmZpZ3VyZSIgKyB1cmxTdHJpbmcsIGUpOyAvLyROT04tTkxTLTEkCisJCQl0aHJvdyBlOworCQl9CisJCWlmIChzdWNlc3NmdWxseVVuY29uZmlndXJlZCkgeworCQkJLy8gMi4wLjI6IHVuY29uZmlndXJlIHBhdGNoZXMgdGhhdCByZWZlcmVuY2UgdGhpcyBmZWF0dXJlLgorCQkJLy8gQSBwYXRjaCBpcyBhIGZlYXR1cmUgdGhhdCBjb250YWlucyBhbiBpbXBvcnQKKwkJCS8vIHN0YXRlbWVudCB3aXRoIHBhdGNoPSJ0cnVlIiBhbmQgYW4gaWQvdmVyc2lvbgorCQkJLy8gdGhhdCBtYXRjaGVzIGFuIGFscmVhZHkgaW5zdGFsbGVkIGFuZCBjb25maWd1cmVkCisJCQkvLyBmZWF0dXJlLiBXaGVuIHBhdGNoZWQgZmVhdHVyZSBpcyB1bmNvbmZpZ3VyZWQsCisJCQkvLyBhbGwgdGhlIHBhdGNoZXMgdGhhdCByZWZlcmVuY2UgaXQgbXVzdCBiZSAKKwkJCS8vIHVuY29uZmlndXJlZCBhcyB3ZWxsCisJCQkvLyAoaW4gY29udHJhc3QsIHBhdGNoZWQgZmVhdHVyZXMgY2FuIGJlCisJCQkvLyBjb25maWd1cmVkIHdpdGhvdXQgdGhlIHBhdGNoZXMpLgorCQkJaWYgKGluY2x1ZGVQYXRjaGVzKQorCQkJCXVuY29uZmlndXJlUGF0Y2hlcyhmZWF0dXJlKTsKKworCQkJLy8gdG9wIGRvd24gYXBwcm9hY2gsIHNhbWUgY29uZmlndXJlZFNpdGUKKwkJCUlJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VbXSBjaGlsZHJlblJlZiA9IGZlYXR1cmUuZ2V0SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlblJlZi5sZW5ndGg7IGkrKykgeworCQkJCXRyeSB7CisJCQkJCUlGZWF0dXJlIGNoaWxkID0gY2hpbGRyZW5SZWZbaV0uZ2V0RmVhdHVyZShudWxsKTsgLy8gZGlzYWJsZSB0aGUgZXhhY3QgZmVhdHVyZQorCQkJCQl1bmNvbmZpZ3VyZShjaGlsZCwgaW5jbHVkZVBhdGNoZXMsIHRydWUpOyAvLyBjaGVjayBmb3IgcGFyZW50IGFzIHdlIHNob3VsZCBiZSB0aGUgb25seSBwYXJlbnQuCisJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkJCS8vIHNraXAgYW55IGJhZCBjaGlsZHJlbgorCQkJCQlVcGRhdGVDb3JlLndhcm4oIlVuYWJsZSB0byB1bmNvbmZpZ3VyZSBjaGlsZCBmZWF0dXJlOiAiICsgY2hpbGRyZW5SZWZbaV0gKyAiICIgKyBlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJfQorCQkJfQorCisJCQkvLyBub3RpZnkgbGlzdGVuZXJzCisJCQlPYmplY3RbXSBzaXRlTGlzdGVuZXJzID0gbGlzdGVuZXJzLmdldExpc3RlbmVycygpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXRlTGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7CisJCQkJSUNvbmZpZ3VyZWRTaXRlQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyID0gKChJQ29uZmlndXJlZFNpdGVDaGFuZ2VkTGlzdGVuZXIpIHNpdGVMaXN0ZW5lcnNbaV0pOworCQkJCWxpc3RlbmVyLmZlYXR1cmVVbmNvbmZpZ3VyZWQoZmVhdHVyZSk7CisJCQl9CisKKwkJCXJldHVybiB0cnVlOworCQl9IGVsc2UgeworCQkJVVJMIHVybCA9IGZlYXR1cmVSZWZlcmVuY2UuZ2V0VVJMKCk7CisJCQlTdHJpbmcgdXJsU3RyaW5nID0gKHVybCAhPSBudWxsKSA/IHVybC50b0V4dGVybmFsRm9ybSgpIDogIjxubyBmZWF0dXJlIHJlZmVyZW5jZSB1cmw+IjsgLy8kTk9OLU5MUy0xJAorCQkJVXBkYXRlQ29yZS53YXJuKCJVbmFibGUgdG8gdW5jb25maWd1cmU6IiArIHVybFN0cmluZyk7IC8vJE5PTi1OTFMtMSQKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0KKworCS8qCisJICogTG9vayBmb3IgZmVhdHVyZXMgdGhhdCBoYXZlIGFuIGltcG9ydCByZWZlcmVuY2UKKwkgKiB0aGF0IHBvaW50cyB0byB0aGlzIGZlYXR1cmUgYW5kIHdoZXJlIHBhdGNoPXRydWUuCisJICogVW5jb25maWd1cmUgYWxsIHRoZSBtYXRjaGluZyBwYXRjaGVzLCBidXQKKwkgKiBkbyBub3QgZG8gdGhlIHNhbWUgbG9va3VwIGZvciB0aGVtCisJICogYmVjYXVzZSBwYXRjaGVzIGNhbm5vdCBoYXZlIHBhdGNoZXMgdGhlbXNlbHZlcy4KKwkgKi8KKworCXByaXZhdGUgdm9pZCB1bmNvbmZpZ3VyZVBhdGNoZXMoSUZlYXR1cmUgZmVhdHVyZSkgeworCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGZyZWZzID0gZ2V0Q29uZmlndXJlZEZlYXR1cmVzKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgZnJlZnMubGVuZ3RoOyBpKyspIHsKKwkJCUlGZWF0dXJlUmVmZXJlbmNlIGZyZWYgPSBmcmVmc1tpXTsKKwkJCXRyeSB7CisJCQkJSUZlYXR1cmUgY2FuZGlkYXRlID0gZnJlZi5nZXRGZWF0dXJlKG51bGwpOworCQkJCWlmIChjYW5kaWRhdGUuZXF1YWxzKGZlYXR1cmUpKQorCQkJCQljb250aW51ZTsKKworCQkJCWlmIChVcGRhdGVVdGlscy5pc1BhdGNoKGZlYXR1cmUsIGNhbmRpZGF0ZSkpCisJCQkJCXVuY29uZmlndXJlKGNhbmRpZGF0ZSwgZmFsc2UsIGZhbHNlKTsKKwkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJCVVwZGF0ZUNvcmUud2FybigiIiwgZSk7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJfQorCX0KKworCS8qCisJICogQHNlZSBJQ29uZmlndXJlZFNpdGUjZ2V0Q29uZmlndXJlZEZlYXR1cmVzKCkKKwkgKi8KKwlwdWJsaWMgSUZlYXR1cmVSZWZlcmVuY2VbXSBnZXRDb25maWd1cmVkRmVhdHVyZXMoKSB7CisJCWlmIChpc0VuYWJsZWQoKSkKKwkJCXJldHVybiBnZXRSYXdDb25maWd1cmVkRmVhdHVyZXMoKTsKKwkJZWxzZQorCQkJcmV0dXJuIG5ldyBJU2l0ZUZlYXR1cmVSZWZlcmVuY2VbMF07CisJfQorCisJLyoKKwkgKiBAc2VlIElDb25maWd1cmVkU2l0ZSNnZXRDb25maWd1cmVkRmVhdHVyZXMoKQorCSAqLworCXByaXZhdGUgSUZlYXR1cmVSZWZlcmVuY2VbXSBnZXRSYXdDb25maWd1cmVkRmVhdHVyZXMoKSB7CisJCUNvbmZpZ3VyYXRpb25Qb2xpY3kgY29uZmlnUG9saWN5ID0gZ2V0Q29uZmlndXJhdGlvblBvbGljeSgpOworCQlpZiAoY29uZmlnUG9saWN5ID09IG51bGwpCisJCQlyZXR1cm4gbmV3IElTaXRlRmVhdHVyZVJlZmVyZW5jZVswXTsKKworCQlyZXR1cm4gY29uZmlnUG9saWN5LmdldENvbmZpZ3VyZWRGZWF0dXJlcygpOworCX0KKworCS8qCisJICogYWRkcyBjb25maWd1cmVkIGFuZCB1bmNvbmZpZ3VyZWQgZmVhdHVyZSByZWZlcmVuY2VzCisJICovCisJcHVibGljIElGZWF0dXJlUmVmZXJlbmNlW10gZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKSB7CisKKwkJQ29uZmlndXJhdGlvblBvbGljeSBjb25maWdQb2xpY3kgPSBnZXRDb25maWd1cmF0aW9uUG9saWN5KCk7CisJCWlmIChjb25maWdQb2xpY3kgPT0gbnVsbCkKKwkJCXJldHVybiBuZXcgSVNpdGVGZWF0dXJlUmVmZXJlbmNlWzBdOworCisJCUlGZWF0dXJlUmVmZXJlbmNlW10gY29uZmlndXJlZEZlYXR1cmVzID0gZ2V0Q29uZmlndXJlZEZlYXR1cmVzKCk7CisJCWludCBjb25mTGVuID0gY29uZmlndXJlZEZlYXR1cmVzLmxlbmd0aDsKKwkJSUZlYXR1cmVSZWZlcmVuY2VbXSB1bmNvbmZpZ3VyZWRGZWF0dXJlcyA9IGNvbmZpZ1BvbGljeS5nZXRVbmNvbmZpZ3VyZWRGZWF0dXJlcygpOworCQlpbnQgdW5jb25mTGVuID0gdW5jb25maWd1cmVkRmVhdHVyZXMubGVuZ3RoOworCisJCUlGZWF0dXJlUmVmZXJlbmNlW10gcmVzdWx0ID0gbmV3IElGZWF0dXJlUmVmZXJlbmNlW2NvbmZMZW4gKyB1bmNvbmZMZW5dOworCQlpZiAoY29uZkxlbiA+IDApIHsKKwkJCVN5c3RlbS5hcnJheWNvcHkoY29uZmlndXJlZEZlYXR1cmVzLCAwLCByZXN1bHQsIDAsIGNvbmZMZW4pOworCQl9CisJCWlmICh1bmNvbmZMZW4gPiAwKSB7CisJCQlTeXN0ZW0uYXJyYXljb3B5KHVuY29uZmlndXJlZEZlYXR1cmVzLCAwLCByZXN1bHQsIGNvbmZMZW4sIHVuY29uZkxlbik7CisJCX0KKworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qCisJICogQ29uZmlndXJlIGFuZCB1bmNvbmZpZ3VyZSBhcHByb3ByaWF0ZSBmZWF0dXJlIHRvCisJICogYmVjb21lICdsaWtlJyBjdXJyZW50Q29uZmlndXJhdGlvbiB3aGljaCBpcyB0aGUgY29uZmlndXJhdGlvbgorCSAqIHRoZSB1c2VyIHdhbnRzIHRvIHJldmVydCB0by4KKwkgKiAKKwkgKiBBbGwgZmVhdHVyZXMgZnJvbSBjdXJyZW50Q29uZmlndXJhdGlvbiBzaG91bGQgYmUgY29uZmlndXJlZAorCSAqLworCXB1YmxpYyB2b2lkIHJldmVydFRvKElDb25maWd1cmVkU2l0ZSBvbGRDb25maWd1cmF0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElQcm9ibGVtSGFuZGxlciBoYW5kbGVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworCisJCUNvbmZpZ3VyZWRTaXRlIG9sZENvbmZpZ3VyZWRTaXRlID0gKENvbmZpZ3VyZWRTaXRlKSBvbGRDb25maWd1cmF0aW9uOworCisJCS8vIHJldHJpZXZlIHRoZSBmZWF0dXJlIHRoYXQgd2VyZSBjb25maWd1cmVkCisJCUlGZWF0dXJlUmVmZXJlbmNlW10gY29uZmlndXJlZEZlYXR1cmVzID0gb2xkQ29uZmlndXJlZFNpdGUudmFsaWRDb25maWd1cmVkRmVhdHVyZXMoaGFuZGxlcik7CisKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWd1cmVkRmVhdHVyZXMubGVuZ3RoOyBpKyspIHsKKwkJCWdldENvbmZpZ3VyYXRpb25Qb2xpY3koKS5jb25maWd1cmUoY29uZmlndXJlZEZlYXR1cmVzW2ldLCB0cnVlLCB0cnVlKTsKKwkJfQorCisJCS8vIGNhbGN1bGF0ZSBhbGwgdGhlIGZlYXR1cmVzIHdlIGhhdmUgdG8gdW5jb25maWd1cmUgZnJvbSB0aGUgY3VycmVudCBzdGF0ZSB0byB0aGlzIHN0YXRlCisJCS8vIGluIHRoZSBoaXN0b3J5LiAJCQkJCisJCUxpc3QgZmVhdHVyZVRvVW5jb25maWd1cmUgPSBvbGRDb25maWd1cmVkU2l0ZS5jYWxjdWxhdGVVbmNvbmZpZ3VyZWRGZWF0dXJlcyhjb25maWd1cmVkRmVhdHVyZXMpOworCisJCS8vIGZvciBlYWNoIHVuY29uZmlndXJlZCBmZWF0dXJlIGNoZWNrIGlmIGl0IHN0aWxsIGV4aXN0cworCQkvLyBpZiBzbyBhZGQgYXMgdW5jb25maWd1cmVkCisJCUl0ZXJhdG9yIGl0ZXIgPSBmZWF0dXJlVG9VbmNvbmZpZ3VyZS5pdGVyYXRvcigpOworCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKwkJCUlGZWF0dXJlUmVmZXJlbmNlIGVsZW1lbnQgPSAoSUZlYXR1cmVSZWZlcmVuY2UpIGl0ZXIubmV4dCgpOworCQkJdHJ5IHsKKwkJCQkvLyBkbyBub3QgbG9nIGFjdGl2aXR5CisJCQkJZ2V0Q29uZmlndXJhdGlvblBvbGljeSgpLnVuY29uZmlndXJlKGVsZW1lbnQsIHRydWUsIHRydWUpOworCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkJLy8gbG9nIG5vIGZlYXR1cmUgdG8gdW5jb25maWd1cmUKKwkJCQlTdHJpbmcgdXJsID0gZWxlbWVudC5nZXRVUkwoKS50b1N0cmluZygpOworCQkJCUlTaXRlIHNpdGUgPSBlbGVtZW50LmdldFNpdGUoKTsKKwkJCQlTdHJpbmcgc2l0ZVN0cmluZyA9IChzaXRlICE9IG51bGwpID8gc2l0ZS5nZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpIDogTWVzc2FnZXMuQ29uZmlndXJlZFNpdGVfTm9TaXRlOyAKKwkJCQlVcGRhdGVDb3JlLndhcm4oTkxTLmJpbmQoTWVzc2FnZXMuQ29uZmlndXJlZFNpdGVfQ2Fubm90RmluZEZlYXR1cmVUb1VuY29uZmlndXJlLCAobmV3IFN0cmluZ1tdIHsgdXJsLCBzaXRlU3RyaW5nIH0pKSwgZSk7IAorCQkJfQorCQl9CisJCS8vfSAvLyBlbmQgVVNFUl9FWENMVURFCisJfQorCisJLyoKKwkgKiBXZSBoYXZlIHRvIGtlZXAgb3VyIGNvbmZpZ3VyZWQgZmVhdHVyZQorCSAqIGNoZWNrIGlmIHRoZXkgYXJlIGFsbCB2YWxpZAorCSAqIFJldHVybiB0aGUgdmFsaWQgY29uZmlndXJlZCBmZWF0dXJlcworCSAqLworCXByaXZhdGUgSUZlYXR1cmVSZWZlcmVuY2VbXSB2YWxpZENvbmZpZ3VyZWRGZWF0dXJlcyhJUHJvYmxlbUhhbmRsZXIgaGFuZGxlcikgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKworCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGNvbmZpZ3VyZWRGZWF0dXJlcyA9IGdldENvbmZpZ3VyZWRGZWF0dXJlcygpOworCQlpZiAoY29uZmlndXJlZEZlYXR1cmVzICE9IG51bGwpIHsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlndXJlZEZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7CisJCQkJSUZlYXR1cmUgZmVhdHVyZSA9IG51bGw7CisKKwkJCQkvLyBhdHRlbXB0IHRvIGFjY2VzcyB0aGUgZmVhdHVyZQorCQkJCXRyeSB7CisJCQkJCWZlYXR1cmUgPSBjb25maWd1cmVkRmVhdHVyZXNbaV0uZ2V0RmVhdHVyZShudWxsKTsKKwkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCQkJLy8gbm90aWZ5IHdlIGNhbm5vdCBmaW5kIHRoZSBmZWF0dXJlCisJCQkJCVVwZGF0ZUNvcmUud2FybihudWxsLCBlKTsKKwkJCQkJU3RyaW5nIGZlYXR1cmVTdHJpbmcgPSBjb25maWd1cmVkRmVhdHVyZXNbaV0uZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKTsKKwkJCQkJaWYgKCFoYW5kbGVyLnJlcG9ydFByb2JsZW0oTkxTLmJpbmQoTWVzc2FnZXMuQ29uZmlndXJlZFNpdGVfQ2Fubm90RmluZEZlYXR1cmVUb0NvbmZpZ3VyZSwgKG5ldyBTdHJpbmdbXSB7IGZlYXR1cmVTdHJpbmcgfSkpKSkgeworCQkJCQkJdGhyb3cgbmV3IEludGVycnVwdGVkRXhjZXB0aW9uKCk7CisJCQkJCX0KKwkJCQl9CisKKwkJCQkvLyB2ZXJpZnkgYWxsIHRoZSBwbHVnaW5zIHN0aWxsIGV4aXN0CisJCQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgeworCQkJCQkvLyBnZXQgcGx1Z2luIGlkZW50aWZpZXIKKwkJCQkJTGlzdCBzaXRlUGx1Z2luSWRlbnRpZmllcnMgPSBuZXcgQXJyYXlMaXN0KCk7CisJCQkJCUlTaXRlIHNpdGUgPSBmZWF0dXJlLmdldFNpdGUoKTsKKwkJCQkJSVBsdWdpbkVudHJ5W10gc2l0ZVBsdWdpbkVudHJpZXMgPSBudWxsOworCisJCQkJCWlmIChzaXRlICE9IG51bGwpIHsKKwkJCQkJCXNpdGVQbHVnaW5FbnRyaWVzID0gc2l0ZS5nZXRQbHVnaW5FbnRyaWVzKCk7CisJCQkJCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgc2l0ZVBsdWdpbkVudHJpZXMubGVuZ3RoOyBpbmRleCsrKSB7CisJCQkJCQkJSVBsdWdpbkVudHJ5IGVudHJ5ID0gc2l0ZVBsdWdpbkVudHJpZXNbaW5kZXhdOworCQkJCQkJCXNpdGVQbHVnaW5JZGVudGlmaWVycy5hZGQoZW50cnkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpKTsKKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJCWlmIChzaXRlUGx1Z2luRW50cmllcy5sZW5ndGggPiAwKSB7CisJCQkJCQlJUGx1Z2luRW50cnlbXSBmZWF0dXJlUGx1Z2luRW50cmllcyA9IGZlYXR1cmUuZ2V0UGx1Z2luRW50cmllcygpOworCQkJCQkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IGZlYXR1cmVQbHVnaW5FbnRyaWVzLmxlbmd0aDsgaW5kZXgrKykgeworCQkJCQkJCUlQbHVnaW5FbnRyeSBjdXJyZW50RmVhdHVyZVBsdWdpbkVudHJ5ID0gZmVhdHVyZVBsdWdpbkVudHJpZXNbaW5kZXhdOworCQkJCQkJCWlmICghY29udGFpbnMoY3VycmVudEZlYXR1cmVQbHVnaW5FbnRyeS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCksIHNpdGVQbHVnaW5JZGVudGlmaWVycykpIHsKKwkJCQkJCQkJLy8gdGhlIHBsdWdpbiBkZWZpbmVkIGJ5IHRoZSBmZWF0dXJlCisJCQkJCQkJCS8vIGRvZXNuJ3Qgc2VlbSB0byBleGlzdCBvbiB0aGUgc2l0ZQorCQkJCQkJCQlTdHJpbmcgbXNnID0gIkVycm9yIHZlcmlmeWluZyBleGlzdGVuY2Ugb2YgcGx1Z2luOiIgKyBjdXJyZW50RmVhdHVyZVBsdWdpbkVudHJ5LmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpOyAvLyROT04tTkxTLTEkCisJCQkJCQkJCVVwZGF0ZUNvcmUubG9nKG1zZywgbmV3IEV4Y2VwdGlvbigpKTsKKworCQkJCQkJCQlTdHJpbmcgc2l0ZVN0cmluZyA9IChzaXRlICE9IG51bGwpID8gc2l0ZS5nZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpIDogTWVzc2FnZXMuQ29uZmlndXJlZFNpdGVfTm9TaXRlOwkKKwkJCQkJCQkJU3RyaW5nIGVycm9yTGFiZWwgPSBOTFMuYmluZChNZXNzYWdlcy5Db25maWd1cmVkU2l0ZV9DYW5ub3RGaW5kUGx1Z2luRW50cnksIChuZXcgU3RyaW5nW10geyBjdXJyZW50RmVhdHVyZVBsdWdpbkVudHJ5LmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpLCBzaXRlU3RyaW5nIH0pKTsKKwkJCQkJCQkJaWYgKGhhbmRsZXIgPT0gbnVsbCkgeworCQkJCQkJCQkJdGhyb3cgbmV3IEludGVycnVwdGVkRXhjZXB0aW9uKGVycm9yTGFiZWwpOworCQkJCQkJCQl9CisJCQkJCQkJCWlmICghaGFuZGxlci5yZXBvcnRQcm9ibGVtKGVycm9yTGFiZWwpKSB7CisJCQkJCQkJCQl0aHJvdyBuZXcgSW50ZXJydXB0ZWRFeGNlcHRpb24oKTsKKwkJCQkJCQkJfQorCQkJCQkJCX0gLy8gZW5kIGlmIG5vdCBmb3VuZCBpbiBzaXRlCisJCQkJCQl9IC8vIGVuZCBmb3IKKwkJCQkJfQorCQkJCX0KKwkJCX0gLy8gZW5kIGZvciBjb25maWd1cmVkIGZlYXR1cmUKKwkJfQorCQlyZXR1cm4gY29uZmlndXJlZEZlYXR1cmVzOworCX0KKworCS8qCisJICogV2UgYXJlIGluIHRoZSBwcm9jZXNzIG9mIGNhbGN1bGF0aW5nIHRoZSBkZWx0YSBiZXR3ZWVuIHdoYXQgd2FzIGNvbmZpZ3VyZWQgaW4gdGhlIGN1cnJlbnQKKwkgKiBjb25maWd1cmF0aW9uIHRoYXQgaXMgbm90IGNvbmZpZ3VyZWQgbm93CisJICogCisJICogd2UgaGF2ZSB0byBmaWd1cmUgb3V0IHdoYXQgZmVhdHVyZSBoYXZlIGJlZW4gdW5jb25maWd1cmVkIGZvciB0aGUgd2hvbGUKKwkgKiBoaXN0b3J5IGJldHdlZW4gY3VycmVudCBhbmQgdXMuLi4gCisJICogCisJICogaXMgaXQgYXMgc2ltcGxlIGFzICBnZXQgYWxsIGNvbmZpZ3VyZWQsIGFuZCB1bmNvbmZpZ3VyZWQsCisJICogdGhlIGRvIHRoZSBkZWx0YSB3aXRoIHdoYXQgc2hvdWxkIGJlIGNvbmZpZ3VyZWQKKwkgKiAKKwkgKi8KKwlwcml2YXRlIExpc3QgY2FsY3VsYXRlVW5jb25maWd1cmVkRmVhdHVyZXMoSUZlYXR1cmVSZWZlcmVuY2VbXSBjb25maWd1cmVkRmVhdHVyZXMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKworCQlTZXQgZmVhdHVyZVRvVW5jb25maWd1cmVTZXQgPSBuZXcgSGFzaFNldCgpOworCisJCS8vIGxvb3AgZm9yIGFsbCBoaXN0b3J5CisJCS8vIHRyeSB0byBzZWUgaWYgdGhlIGNvbmZpZ3VyZWQgc2l0ZSBleGlzdGVkCisJCS8vIGlmIGl0IGRvZXMsIGdldCB0aGUgdW5jb25maWd1cmVkIGZlYXR1cmVzIAorCQkvLyBhbmQgdGhlIGNvbmZpZ3VyZWQgb25lCisJCUlJbnN0YWxsQ29uZmlndXJhdGlvbltdIGhpc3RvcnkgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKS5nZXRDb25maWd1cmF0aW9uSGlzdG9yeSgpOworCisJCWZvciAoaW50IGkgPSAwOyBpIDwgaGlzdG9yeS5sZW5ndGg7IGkrKykgeworCQkJSUluc3RhbGxDb25maWd1cmF0aW9uIGVsZW1lbnQgPSBoaXN0b3J5W2ldOworCQkJSUNvbmZpZ3VyZWRTaXRlW10gY29uZmlnU2l0ZXMgPSBlbGVtZW50LmdldENvbmZpZ3VyZWRTaXRlcygpOworCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjb25maWdTaXRlcy5sZW5ndGg7IGorKykgeworCQkJCUNvbmZpZ3VyZWRTaXRlIGNvbmZpZ1NpdGUgPSAoQ29uZmlndXJlZFNpdGUpIGNvbmZpZ1NpdGVzW2pdOworCQkJCWlmIChjb25maWdTaXRlLmdldFNpdGUoKS5lcXVhbHMoZ2V0U2l0ZSgpKSkgeworCQkJCQlmZWF0dXJlVG9VbmNvbmZpZ3VyZVNldC5hZGRBbGwoQXJyYXlzLmFzTGlzdChjb25maWdTaXRlLmdldENvbmZpZ3VyYXRpb25Qb2xpY3koKS5nZXRVbmNvbmZpZ3VyZWRGZWF0dXJlcygpKSk7CisJCQkJCWZlYXR1cmVUb1VuY29uZmlndXJlU2V0LmFkZEFsbChBcnJheXMuYXNMaXN0KGNvbmZpZ1NpdGUuZ2V0Q29uZmlndXJhdGlvblBvbGljeSgpLmdldENvbmZpZ3VyZWRGZWF0dXJlcygpKSk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJLy8gcmVtb3ZlIHRoZSB1bmNvbmZpZ3VyZWQgZmVhdHVyZSB3ZSBmb3VuZCB0aGF0IGFyZSBub3cgdG8gYmUgY29uZmlndXJlZCAKKwkJLy8gKHRoZXkgbWF5IGhhdmUgYmVlbiB1bmNvbmZpZ3VyZWQgaW4gdGhlIHBhc3QsIGJ1dCB0aGUgcmV2ZXJ0IG1ha2VzIHRoZW0gY29uZmlndXJlZCkKKwkJTGlzdCBmZWF0dXJlVG9VbmNvbmZpZ3VyZUxpc3QgPSByZW1vdmUoY29uZmlndXJlZEZlYXR1cmVzLCBmZWF0dXJlVG9VbmNvbmZpZ3VyZVNldCk7CisKKwkJcmV0dXJuIGZlYXR1cmVUb1VuY29uZmlndXJlTGlzdDsKKwl9CisKKwkvKgorCSAqIFV0aWxpdGllczogUmVtb3ZlIGFuIGFycmF5IG9mIGZlYXR1cmUgcmVmZXJlbmNlcworCSAqIGZyb20gYSBsaXN0CisJICovCisJcHJpdmF0ZSBMaXN0IHJlbW92ZShJRmVhdHVyZVJlZmVyZW5jZVtdIGZlYXR1cmVSZWZzLCBTZXQgc2V0KSB7CisJCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOworCisJCWlmIChzZXQgPT0gbnVsbCkKKwkJCXJldHVybiByZXN1bHQ7CisKKwkJLy8gaWYgYW4gZWxlbWVudCBvZiB0aGUgbGlzdCBpcyBOT1QgZm91bmQgaW4gdGhlIGFycmF5LAorCQkvLyBhZGQgaXQgdG8gdGhlIHJlc3VsdCBsaXN0CQkJCisJCUl0ZXJhdG9yIGl0ZXIgPSBzZXQuaXRlcmF0b3IoKTsKKwkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisJCQlJRmVhdHVyZVJlZmVyZW5jZSBlbGVtZW50ID0gKElGZWF0dXJlUmVmZXJlbmNlKSBpdGVyLm5leHQoKTsKKwkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZVJlZnMubGVuZ3RoOyBpKyspIHsKKwkJCQlpZiAoZWxlbWVudC5lcXVhbHMoZmVhdHVyZVJlZnNbaV0pKSB7CisJCQkJCWZvdW5kID0gdHJ1ZTsKKwkJCQl9CisJCQl9CisKKwkJCWlmICghZm91bmQpCisJCQkJcmVzdWx0LmFkZChlbGVtZW50KTsKKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qCisJICogSSBoYXZlIGlzc3VlcyB3aGVuIHJ1bm5pbmcgbGlzdC5jb250YWluKHZlcnNpb25lZElkZW50aWZpZXIpCisJICogVGhlIGNvZGUgcnVucyB0aGUgT2JqZWN0LmVxdWFscyBpbnN0ZWFkIG9mIHRoZSBWZXJzaW9uZWRJZGVudGlmaWVyLmVxdWFscworCSAqLworCXByaXZhdGUgYm9vbGVhbiBjb250YWlucyhWZXJzaW9uZWRJZGVudGlmaWVyIGlkLCBMaXN0IGxpc3QpIHsKKwkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOworCQlpZiAobGlzdCAhPSBudWxsICYmICFsaXN0LmlzRW1wdHkoKSkgeworCQkJSXRlcmF0b3IgaXRlciA9IGxpc3QuaXRlcmF0b3IoKTsKKwkJCXdoaWxlIChpdGVyLmhhc05leHQoKSAmJiAhZm91bmQpIHsKKwkJCQlWZXJzaW9uZWRJZGVudGlmaWVyIGVsZW1lbnQgPSAoVmVyc2lvbmVkSWRlbnRpZmllcikgaXRlci5uZXh0KCk7CisJCQkJaWYgKGVsZW1lbnQuZXF1YWxzKGlkKSkgeworCQkJCQlmb3VuZCA9IHRydWU7CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBmb3VuZDsKKwl9CisKKwkvKgorCSAqIAorCSAqLworCXB1YmxpYyBDb25maWd1cmF0aW9uUG9saWN5IGdldENvbmZpZ3VyYXRpb25Qb2xpY3koKSB7CisJCXJldHVybiAoQ29uZmlndXJhdGlvblBvbGljeSkgZ2V0Q29uZmlndXJhdGlvblBvbGljeU1vZGVsKCk7CisJfQorCisJLyoKKwkgKiAKKwkgKi8KKwlwdWJsaWMgSVNpdGUgZ2V0U2l0ZSgpIHsKKwkJcmV0dXJuIChJU2l0ZSkgZ2V0U2l0ZU1vZGVsKCk7CisJfQorCisJLyoKKwkgKiAKKwkgKi8KKwlwdWJsaWMgSUluc3RhbGxDb25maWd1cmF0aW9uIGdldEluc3RhbGxDb25maWd1cmF0aW9uKCkgeworCQlyZXR1cm4gKElJbnN0YWxsQ29uZmlndXJhdGlvbikgZ2V0SW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbCgpOworCX0KKworCS8qCisJICogCisJICovCisJcHVibGljIElTdGF0dXMgZ2V0QnJva2VuU3RhdHVzKElGZWF0dXJlIGZlYXR1cmUpIHsKKworCQlJU3RhdHVzIGZlYXR1cmVTdGF0dXMgPSBjcmVhdGVTdGF0dXMoSVN0YXR1cy5PSywgSUZlYXR1cmUuU1RBVFVTX0hBUFBZLCAiIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKKworCQkvLyBjaGVjayB0aGUgUGx1Z2lucyBvZiBhbGwgdGhlIGZlYXR1cmVzCisJCS8vIGV2ZXJ5IHBsdWdpbiBvZiB0aGUgZmVhdHVyZSBtdXN0IGJlIG9uIHRoZSBzaXRlCisJCUlQbHVnaW5FbnRyeVtdIHNpdGVFbnRyaWVzID0gZ2V0U2l0ZSgpLmdldFBsdWdpbkVudHJpZXMoKTsKKwkJSVBsdWdpbkVudHJ5W10gZmVhdHVyZXNFbnRyaWVzID0gZmVhdHVyZS5nZXRQbHVnaW5FbnRyaWVzKCk7CisJCUlQbHVnaW5FbnRyeVtdIHJlc3VsdCA9IFVwZGF0ZU1hbmFnZXJVdGlscy5kaWZmKGZlYXR1cmVzRW50cmllcywgc2l0ZUVudHJpZXMpOworCQlpZiAocmVzdWx0ICE9IG51bGwgJiYgKHJlc3VsdC5sZW5ndGggIT0gMCkpIHsKKwkJCVN0cmluZyBtc2cgPSBNZXNzYWdlcy5TaXRlTG9jYWxfRmVhdHVyZVVuSGFwcHk7IAorCQkJTXVsdGlTdGF0dXMgbXVsdGkgPSBuZXcgTXVsdGlTdGF0dXMoZmVhdHVyZVN0YXR1cy5nZXRQbHVnaW4oKSwgSUZlYXR1cmUuU1RBVFVTX1VOSEFQUFksIG1zZywgbnVsbCk7CisKKwkJCWZvciAoaW50IGsgPSAwOyBrIDwgcmVzdWx0Lmxlbmd0aDsgaysrKSB7CisJCQkJVmVyc2lvbmVkSWRlbnRpZmllciBpZCA9IHJlc3VsdFtrXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7CisJCQkJT2JqZWN0W10gdmFsdWVzID0gbmV3IFN0cmluZ1tdIHsgIiIsICIiIH07IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCWlmIChpZCAhPSBudWxsKSB7CisJCQkJCXZhbHVlcyA9IG5ldyBPYmplY3RbXSB7IGlkLmdldElkZW50aWZpZXIoKSwgaWQuZ2V0VmVyc2lvbigpfTsKKwkJCQl9CisJCQkJU3RyaW5nIG1zZzEgPSBOTFMuYmluZChNZXNzYWdlcy5Db25maWd1cmVkU2l0ZV9NaXNzaW5nUGx1Z2luc0Jyb2tlbkZlYXR1cmUsIHZhbHVlcyk7CisJCQkJVXBkYXRlQ29yZS53YXJuKG1zZzEpOworCQkJCUlTdGF0dXMgc3RhdHVzID0gY3JlYXRlU3RhdHVzKElTdGF0dXMuRVJST1IsIElGZWF0dXJlLlNUQVRVU19VTkhBUFBZLCBtc2cxLCBudWxsKTsKKwkJCQltdWx0aS5hZGQoc3RhdHVzKTsKKwkJCX0KKwkJCXJldHVybiBtdWx0aTsKKwkJfQorCisJCS8vIGNoZWNrIG9zLCBhcmNoLCBhbmQgd3MKKworCQlTdHJpbmcgbXNnID0gTWVzc2FnZXMuU2l0ZUxvY2FsX0ZlYXR1cmVIYXBweTsgCisJCXJldHVybiBjcmVhdGVTdGF0dXMoSVN0YXR1cy5PSywgSUZlYXR1cmUuU1RBVFVTX0hBUFBZLCBtc2csIG51bGwpOworCX0KKworCS8qCisJICogCisJICovCisJcHVibGljIGJvb2xlYW4gaXNDb25maWd1cmVkKElGZWF0dXJlIGZlYXR1cmUpIHsKKwkJaWYgKCFpc0VuYWJsZWQoKSkKKwkJCXJldHVybiBmYWxzZTsKKworCQlpZiAoZ2V0Q29uZmlndXJhdGlvblBvbGljeSgpID09IG51bGwpCisJCQlyZXR1cm4gZmFsc2U7CisJCUlGZWF0dXJlUmVmZXJlbmNlIGZlYXR1cmVSZWZlcmVuY2UgPSBnZXRTaXRlKCkuZ2V0RmVhdHVyZVJlZmVyZW5jZShmZWF0dXJlKTsKKwkJaWYgKGZlYXR1cmVSZWZlcmVuY2UgPT0gbnVsbCkgeworCQkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX1dBUk5JTkdTKQorCQkJCVVwZGF0ZUNvcmUud2FybigiVW5hYmxlIHRvIHJldHJpZXZlIGZlYXR1cmVSZWZlcmVuY2UgZm9yIGZlYXR1cmU6IiArIGZlYXR1cmUpOyAvLyROT04tTkxTLTEkCisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuIGdldENvbmZpZ3VyYXRpb25Qb2xpY3koKS5pc0NvbmZpZ3VyZWQoZmVhdHVyZVJlZmVyZW5jZSk7CisJfQorCisJLyoqCisJICogQHNlZSBPYmplY3QjdG9TdHJpbmcoKQorCSAqLworCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCWlmIChnZXRTaXRlKCkgPT0gbnVsbCkKKwkJCXJldHVybiAiTm8gU2l0ZSI7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKGdldFNpdGUoKS5nZXRVUkwoKSA9PSBudWxsKQorCQkJcmV0dXJuICJObyBVUkwiOyAvLyROT04tTkxTLTEkCisJCXJldHVybiBnZXRTaXRlKCkuZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElDb25maWd1cmVkU2l0ZSN2ZXJpZnlVcGRhdGFibGVTdGF0dXMoKQorCSAqLworCXB1YmxpYyBJU3RhdHVzIHZlcmlmeVVwZGF0YWJsZVN0YXR1cygpIHsKKworCQlpZiAodmVyaWZ5U3RhdHVzICE9IG51bGwpCisJCQlyZXR1cm4gdmVyaWZ5U3RhdHVzOworCisJCVVSTCBzaXRlVVJMID0gZ2V0U2l0ZSgpLmdldFVSTCgpOworCQlpZiAoc2l0ZVVSTCA9PSBudWxsKSB7CisJCQl2ZXJpZnlTdGF0dXMgPSBjcmVhdGVTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTWVzc2FnZXMuQ29uZmlndXJlZFNpdGVfU2l0ZVVSTE51bGwsIG51bGwpOyAKKwkJCXJldHVybiB2ZXJpZnlTdGF0dXM7CisJCX0KKworCQlpZiAoISJmaWxlIi5lcXVhbHNJZ25vcmVDYXNlKHNpdGVVUkwuZ2V0UHJvdG9jb2woKSkpIHsgLy8kTk9OLU5MUy0xJAorCQkJdmVyaWZ5U3RhdHVzID0gY3JlYXRlU3RhdHVzKElTdGF0dXMuRVJST1IsIE1lc3NhZ2VzLkNvbmZpZ3VyZWRTaXRlX05vbkxvY2FsU2l0ZSwgbnVsbCk7IAorCQkJcmV0dXJuIHZlcmlmeVN0YXR1czsKKwkJfQorCisJCVN0cmluZyBzaXRlTG9jYXRpb24gPSBzaXRlVVJMLmdldEZpbGUoKTsKKwkJRmlsZSBmaWxlID0gbmV3IEZpbGUoc2l0ZUxvY2F0aW9uKTsKKworCQkvLyBnZXQgdGhlIHByb2R1Y3QgbmFtZSBvZiB0aGUgcHJpdmF0ZSBtYXJrZXIKKwkJLy8gaWYgdGhlcmUgaXMgbm8gcHJpdmF0ZSBtYXJrZXIsIGNoZWNrIGlmIHRoZSBzaXRlIGlzIGNvbnRhaW5lZCBpbiBhbm90aGVyIHNpdGUKKwkJLy8gaWYgdGhlcmUgaXMgYSBtYXJrZXIgYW5kIHRoaXMgaXMgYSBkaWZmZXJlbnQgcHJvZHVjdCwgcmV0dXJuIGZhbHNlCisJCS8vIG90aGVyd2lzZSBkb24ndCBjaGVjayBpZiB3ZSBhcmUgY29udGFpbmVkIGluIGFub3RoZXIgc2l0ZQorCQlTdHJpbmcgcHJvZHVjdE5hbWUgPSBnZXRQcm9kdWN0TmFtZShmaWxlKTsKKwkJaWYgKHByb2R1Y3ROYW1lICE9IG51bGwpIHsKKwkJCWlmICghcHJvZHVjdE5hbWUuZXF1YWxzKGdldFByb2R1Y3RJZGVudGlmaWVyKCJpZCIsIGdldFByb2R1Y3RGaWxlKCkpKSkgeyAvLyROT04tTkxTLTEkCisJCQkJdmVyaWZ5U3RhdHVzID0gY3JlYXRlU3RhdHVzKElTdGF0dXMuRVJST1IsIE5MUy5iaW5kKE1lc3NhZ2VzLkNvbmZpZ3VyZWRTaXRlX05vdFNhbWVQcm9kdWN0SWQsIChuZXcgU3RyaW5nW10geyBwcm9kdWN0TmFtZSB9KSksIG51bGwpOworCQkJCXJldHVybiB2ZXJpZnlTdGF0dXM7CisJCQl9CisJCX0gZWxzZSB7CisJCQlGaWxlIGNvbnRhaW5lciA9IGdldFNpdGVDb250YWluaW5nKGZpbGUpOworCQkJLy8gYWxsb3cgdGhlIGluc3RhbGwgbG9jYXRpb24gdG8gcGFzcyBldmVuIHRob3VnaCBpdCBsb29rcyBsaWtlIHRoaXMKKwkJCS8vIHNpdGUgaXMgY29udGFpbmVkIGluIGFub3RoZXIgc2l0ZQorCQkJaWYgKGNvbnRhaW5lciAhPSBudWxsICYmICFzaXRlTG9jYXRpb24uZXF1YWxzKFBsYXRmb3JtLmdldEluc3RhbGxMb2NhdGlvbigpLmdldFVSTCgpLmdldEZpbGUoKSkpIHsKKwkJCQl2ZXJpZnlTdGF0dXMgPSBjcmVhdGVTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTkxTLmJpbmQoTWVzc2FnZXMuQ29uZmlndXJlZFNpdGVfQ29udGFpbmVkSW5Bbm90aGVyU2l0ZSwgKG5ldyBTdHJpbmdbXSB7IGNvbnRhaW5lci5nZXRBYnNvbHV0ZVBhdGgoKSB9KSksIG51bGwpOworCQkJCXJldHVybiB2ZXJpZnlTdGF0dXM7CisJCQl9CisJCX0KKworCQlpZiAoIWNhbldyaXRlKGZpbGUpKSB7CisJCQl2ZXJpZnlTdGF0dXMgPSBjcmVhdGVTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTWVzc2FnZXMuQ29uZmlndXJlZFNpdGVfUmVhZE9ubHlTaXRlLCBudWxsKTsgCisJCQlyZXR1cm4gdmVyaWZ5U3RhdHVzOworCQl9CisKKwkJdmVyaWZ5U3RhdHVzID0gY3JlYXRlU3RhdHVzKElTdGF0dXMuT0ssICIiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAorCQlzZXRVcGRhdGFibGUodHJ1ZSk7CisJCXJldHVybiB2ZXJpZnlTdGF0dXM7CisJfQorCisJLyoKKwkgKiBWZXJpZnkgd2UgY2FuIHdyaXRlIG9uIHRoZSBmaWxlIHN5c3RlbQorCSAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjYW5Xcml0ZShGaWxlIGZpbGUpIHsKKyAgICAgICAgaWYgKGZpbGUuY2FuV3JpdGUoKSA9PSBmYWxzZSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBpZiAoIWZpbGUuaXNEaXJlY3RvcnkoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBGaWxlIGZpbGVUZXN0ID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgCS8vIHdlIHVzZSB0aGUgLmRsbCBzdWZmaXggdG8gcHJvcGVybHkgdGVzdCBvbiBWaXN0YSB2aXJ0dWFsIGRpcmVjdG9yaWVzCisgICAgICAgIAkvLyBvbiBWaXN0YSB5b3UgYXJlIG5vdCBhbGxvd2VkIHRvIHdyaXRlIGV4ZWN1dGFibGUgZmlsZXMgb24gdmlydHVhbCBkaXJlY3RvcmllcyBsaWtlICJQcm9ncmFtIEZpbGVzIgorICAgICAgICAgICAgZmlsZVRlc3QgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJ3cml0dGFibGVBcmVhIiwgIi5kbGwiLCBmaWxlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vSWYgYW4gZXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIHRyeWluZyB0byBjcmVhdGUgdGhlIGZpbGUsIGl0IG1lYW5zIHRoYXQgaXQgaXMgbm90IHdyaXRhYmxlCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoZmlsZVRlc3QgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBmaWxlVGVzdC5kZWxldGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKwkvKgorCSAqIENoZWNrIGlmIHRoZSBkaXJlY3RvcnkgY29udGFpbnMgYSBtYXJrZXIKKwkgKiBpZiBub3QgYXNrIGFsbCBkaXJlY3RvcnkgY2hpbGRyZW4gdG8gY2hlY2sKKwkgKiBpZiBvbmUgdmFsaWRhdGVzIHRoZSBjb25kaXRpb24sIHJldHVybnMgdGhlIG1hcmtlcgorCSAqLworCXByaXZhdGUgc3RhdGljIEZpbGUgZ2V0U2l0ZUNvbnRhaW5pbmcoRmlsZSBmaWxlKSB7CisKKwkJaWYgKGZpbGUgPT0gbnVsbCkKKwkJCXJldHVybiBudWxsOworCisJCVVwZGF0ZUNvcmUud2FybigiSXNDb250YWluZWQ6IENoZWNraW5nIGZvciBtYXJrZXJzIGF0OiIgKyBmaWxlKTsgLy8kTk9OLU5MUy0xJAorCQlpZiAoZmlsZS5leGlzdHMoKSAmJiBmaWxlLmlzRGlyZWN0b3J5KCkpIHsKKwkJCUZpbGUgcHJvZHVjdEZpbGUgPSBuZXcgRmlsZShmaWxlLCBQUk9EVUNUX1NJVEVfTUFSS0VSKTsKKwkJCUZpbGUgZXh0ZW5zaW9uRmlsZSA9IG5ldyBGaWxlKGZpbGUsIEVYVEVOU0lPTl9TSVRFX01BUktFUik7CisJCQlpZiAocHJvZHVjdEZpbGUuZXhpc3RzKCkgfHwgZXh0ZW5zaW9uRmlsZS5leGlzdHMoKSkKKwkJCQlyZXR1cm4gZmlsZTsKKy8vCQkJLy8gZG8gbm90IGNoZWNrIGlmIGEgbWFya2VyIGV4aXN0cyBpbiB0aGUgY3VycmVudCBidXQgc3RhcnQgZnJvbSB0aGUgcGFyZW50CisvLwkJCS8vIHRoZSBjdXJyZW50IGlzIGFuYWx5emUgYnkgZ2V0UHJvZHVjdG5hbWUoKQorLy8JCQlpZiAoZmlsZS5nZXRQYXJlbnRGaWxlKCkgIT0gbnVsbCkgeworLy8JCQkJRmlsZSBwcml2YXRlRmlsZSA9IG5ldyBGaWxlKGZpbGUuZ2V0UGFyZW50RmlsZSgpLCBQUklWQVRFX1NJVEVfTUFSS0VSKTsKKy8vCQkJCWlmIChwcml2YXRlRmlsZS5leGlzdHMoKSkKKy8vCQkJCQlyZXR1cm4gZmlsZS5nZXRQYXJlbnRGaWxlKCk7CisvLwkJCX0KKwkJfQorCQlyZXR1cm4gZ2V0U2l0ZUNvbnRhaW5pbmcoZmlsZS5nZXRQYXJlbnRGaWxlKCkpOworCX0KKworCS8qCisJICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgcHJvZHVjdCBpZiB0aGUgaWRlbnRpZmllciBvZiB0aGUgcHJpdmF0ZSBTaXRlIG1hcmt1cCBpcyBub3QKKwkgKiB0aGUgc2FtZSBhcyB0aGUgaWRlbnRpZmllciBvZiB0aGUgcHJvZHVjdCB0aGUgd29ya2JlbmNoIHdhcyBzdGFydGVkIHdpdGguCisJICogSWYgdGhlIHByb2R1Y3QgaXMgdGhlIHNhbWUsIHJldHVybiBudWxsLgorCSAqLworCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRQcm9kdWN0TmFtZShGaWxlIGZpbGUpIHsKKworCQlpZiAoZmlsZSA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisKKwkJRmlsZSBtYXJrZXJGaWxlID0gbmV3IEZpbGUoZmlsZSwgRVhURU5TSU9OX1NJVEVfTUFSS0VSICk7CisJCWlmICghbWFya2VyRmlsZS5leGlzdHMoKSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlGaWxlIHByb2R1Y3RGaWxlID0gZ2V0UHJvZHVjdEZpbGUoKTsKKwkJU3RyaW5nIHByb2R1Y3RJZCA9IG51bGw7CisJCVN0cmluZyBwcml2YXRlSWQgPSBudWxsOworCQlpZiAocHJvZHVjdEZpbGUgIT0gbnVsbCkgeworCQkJcHJvZHVjdElkID0gZ2V0UHJvZHVjdElkZW50aWZpZXIoImlkIiwgcHJvZHVjdEZpbGUpOyAvLyROT04tTkxTLTEkCisJCQlwcml2YXRlSWQgPSBnZXRQcm9kdWN0SWRlbnRpZmllcigiaWQiLCBtYXJrZXJGaWxlKTsgLy8kTk9OLU5MUy0xJAorCQkJaWYgKHByb2R1Y3RJZCA9PSBudWxsKSB7CisJCQkJVXBkYXRlQ29yZS53YXJuKCJQcm9kdWN0IElEIGlzIG51bGwgYXQ6IiArIHByb2R1Y3RGaWxlKTsgLy8kTk9OLU5MUy0xJAorCQkJCXJldHVybiBudWxsOworCQkJfQorCQkJaWYgKCFwcm9kdWN0SWQuZXF1YWxzSWdub3JlQ2FzZShwcml2YXRlSWQpKSB7CisJCQkJVXBkYXRlQ29yZS53YXJuKCJQcm9kdWN0IGlkIGF0IiArIHByb2R1Y3RGaWxlICsgIiBEaWZmZXJlbnQgdGhhbjoiICsgbWFya2VyRmlsZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCVN0cmluZyBuYW1lID0gZ2V0UHJvZHVjdElkZW50aWZpZXIoIm5hbWUiLCBtYXJrZXJGaWxlKTsgLy8kTk9OLU5MUy0xJAorCQkJCVN0cmluZyB2ZXJzaW9uID0gZ2V0UHJvZHVjdElkZW50aWZpZXIoInZlcnNpb24iLCBtYXJrZXJGaWxlKTsgLy8kTk9OLU5MUy0xJAorCQkJCVN0cmluZyBtYXJrZXJJRCA9IChuYW1lID09IG51bGwpID8gdmVyc2lvbiA6IG5hbWUgKyAiOiIgKyB2ZXJzaW9uOyAvLyROT04tTkxTLTEkCisJCQkJaWYgKG1hcmtlcklEID09IG51bGwpCisJCQkJCW1hcmtlcklEID0gIiI7IC8vJE5PTi1OTFMtMSQKKwkJCQlyZXR1cm4gbWFya2VySUQ7CisJCQl9IGVsc2UgeworCQkJCXJldHVybiBwcml2YXRlSWQ7CisJCQl9CisJCX0gZWxzZSB7CisJCQlVcGRhdGVDb3JlLndhcm4oIlByb2R1Y3QgTWFya2VyIGRvZXNuJ3QgZXhpc3Q6IiArIHByb2R1Y3RGaWxlKTsgLy8kTk9OLU5MUy0xJAorCQl9CisKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoKKwkgKiBSZXR1cm5zIHRoZSBpZGVudGlmaWVyIG9mIHRoZSBwcm9kdWN0IGZyb20gdGhlIHByb3BlcnR5IGZpbGUKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0UHJvZHVjdElkZW50aWZpZXIoU3RyaW5nIGlkZW50aWZpZXIsIEZpbGUgcHJvcGVydHlGaWxlKSB7CisJCVN0cmluZyByZXN1bHQgPSBudWxsOworCQlpZiAoaWRlbnRpZmllciA9PSBudWxsKQorCQkJcmV0dXJuIHJlc3VsdDsKKwkJSW5wdXRTdHJlYW0gaW4gPSBudWxsOworCQl0cnkgeworCQkJaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHByb3BlcnR5RmlsZSk7CisJCQlQcm9wZXJ0eVJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IG5ldyBQcm9wZXJ0eVJlc291cmNlQnVuZGxlKGluKTsKKwkJCXJlc3VsdCA9IGJ1bmRsZS5nZXRTdHJpbmcoaWRlbnRpZmllcik7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCWlmIChVcGRhdGVDb3JlLkRFQlVHICYmIFVwZGF0ZUNvcmUuREVCVUdfU0hPV19JTlNUQUxMKQorCQkJCVVwZGF0ZUNvcmUuZGVidWcoIkV4Y2VwdGlvbiByZWFkaW5nIHByb3BlcnR5IGZpbGU6IiArIHByb3BlcnR5RmlsZSk7IC8vJE5PTi1OTFMtMSQKKwkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKKwkJCWlmIChVcGRhdGVDb3JlLkRFQlVHICYmIFVwZGF0ZUNvcmUuREVCVUdfU0hPV19JTlNUQUxMKQorCQkJCVVwZGF0ZUNvcmUuZGVidWcoIkV4Y2VwdGlvbiByZWFkaW5nICciICsgaWRlbnRpZmllciArICInIGZyb20gcHJvcGVydHkgZmlsZToiICsgcHJvcGVydHlGaWxlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCX0gZmluYWxseSB7CisJCQlpZiAoaW4gIT0gbnVsbCkKKwkJCQl0cnkgeworCQkJCQlpbi5jbG9zZSgpOworCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUxKSB7CisJCQkJfQorCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoKKwkgKiBSZXR1cm5zIHRoZSBpZGVudGlmaWVyIG9mIHRoZSBwcm9kdWN0IGZyb20gdGhlIHByb3BlcnR5IGZpbGUKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBGaWxlIGdldFByb2R1Y3RGaWxlKCkgeworCisJCVN0cmluZyBwcm9kdWN0SW5zdGFsbERpcmVjdG9yeSA9IENvbmZpZ3VyYXRvclV0aWxzLmdldEluc3RhbGxVUkwoKS5nZXRGaWxlKCk7CisJCWlmIChwcm9kdWN0SW5zdGFsbERpcmVjdG9yeSAhPSBudWxsKSB7CisJCQlGaWxlIHByb2R1Y3RGaWxlID0gbmV3IEZpbGUocHJvZHVjdEluc3RhbGxEaXJlY3RvcnksIFBST0RVQ1RfU0lURV9NQVJLRVIpOworCQkJaWYgKHByb2R1Y3RGaWxlLmV4aXN0cygpKSB7CisJCQkJcmV0dXJuIHByb2R1Y3RGaWxlOworCQkJfSBlbHNlIHsKKwkJCQlVcGRhdGVDb3JlLndhcm4oIlByb2R1Y3QgbWFya2VyIGRvZXNuJ3QgZXhpc3Q6IiArIHByb2R1Y3RGaWxlKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQl9IGVsc2UgeworCQkJVXBkYXRlQ29yZS53YXJuKCJDYW5ub3QgcmV0cmlldmUgaW5zdGFsbCBVUkwgZnJvbSBCb290TG9hZGVyIik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKgorCSAqIAorCSAqLworCS8qcGFja2FnZSovCisJYm9vbGVhbiBjcmVhdGVQcml2YXRlU2l0ZU1hcmtlcigpIHsKKwkJVVJMIHNpdGVVUkwgPSBnZXRTaXRlKCkuZ2V0VVJMKCk7CisJCWlmIChzaXRlVVJMID09IG51bGwpIHsKKwkJCVVwZGF0ZUNvcmUud2FybigiVW5hYmxlIHRvIGNyZWF0ZSBtYXJrZXIuIFRoZSBTaXRlIHVybCBpcyBudWxsLiIpOyAvLyROT04tTkxTLTEkCisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpZiAoISJmaWxlIi5lcXVhbHNJZ25vcmVDYXNlKHNpdGVVUkwuZ2V0UHJvdG9jb2woKSkpIHsgLy8kTk9OLU5MUy0xJAorCQkJVXBkYXRlQ29yZS53YXJuKCJVbmFibGUgdG8gY3JlYXRlIHByaXZhdGUgbWFya2VyLiBUaGUgU2l0ZSBpcyBub3Qgb24gdGhlIGxvY2FsIGZpbGUgc3lzdGVtLiIpOyAvLyROT04tTkxTLTEkCisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlTdHJpbmcgc2l0ZUxvY2F0aW9uID0gc2l0ZVVSTC5nZXRGaWxlKCk7CisJCUZpbGUgcHJvZHVjdEZpbGUgPSBnZXRQcm9kdWN0RmlsZSgpOworCQlib29sZWFuIHN1Y2Nlc3MgPSBmYWxzZTsKKwkJaWYgKHByb2R1Y3RGaWxlICE9IG51bGwpIHsKKwkJCVN0cmluZyBwcm9kdWN0SWQgPSBnZXRQcm9kdWN0SWRlbnRpZmllcigiaWQiLCBwcm9kdWN0RmlsZSk7IC8vJE5PTi1OTFMtMSQKKwkJCVN0cmluZyBwcm9kdWN0TmFtZSA9IGdldFByb2R1Y3RJZGVudGlmaWVyKCJuYW1lIiwgcHJvZHVjdEZpbGUpOyAvLyROT04tTkxTLTEkCisJCQlTdHJpbmcgcHJvZHVjdFZlciA9IGdldFByb2R1Y3RJZGVudGlmaWVyKCJ2ZXJzaW9uIiwgcHJvZHVjdEZpbGUpOyAvLyROT04tTkxTLTEkCisJCQlpZiAocHJvZHVjdElkICE9IG51bGwpIHsKKwkJCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShzaXRlTG9jYXRpb24sIEVYVEVOU0lPTl9TSVRFX01BUktFUik7CisJCQkJaWYgKCFmaWxlLmV4aXN0cygpKSB7CisJCQkJCU91dHB1dFN0cmVhbSBvdXQgPSBudWxsOworCQkJCQlPdXRwdXRTdHJlYW1Xcml0ZXIgb3V0V3JpdGVyID0gbnVsbDsKKwkJCQkJdHJ5IHsKKwkJCQkJCW91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpOworCQkJCQkJb3V0V3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihvdXQsICJVVEY4Iik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCW91dFdyaXRlci53cml0ZSgiaWQ9IiArIHByb2R1Y3RJZCsiXG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJCQlpZiAocHJvZHVjdE5hbWUgIT0gbnVsbCkKKwkJCQkJCQlvdXRXcml0ZXIud3JpdGUoIm5hbWU9IiArIHByb2R1Y3ROYW1lKyJcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkJCWlmIChwcm9kdWN0VmVyICE9IG51bGwpCisJCQkJCQkJb3V0V3JpdGVyLndyaXRlKCJ2ZXJzaW9uPSIgKyBwcm9kdWN0VmVyKyJcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkJCXN1Y2Nlc3MgPSB0cnVlOworCQkJCQkJanVzdENyZWF0ZWQgPSB0cnVlOworCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCQkJVXBkYXRlQ29yZS53YXJuKCJVbmFibGUgdG8gY3JlYXRlIHByaXZhdGUgTWFya2VyIGF0OiIgKyBmaWxlLCBlKTsgLy8kTk9OLU5MUy0xJAorCQkJCQl9IGZpbmFsbHkgeworCQkJCQkJdHJ5IHsKKwkJCQkJCQlpZiAob3V0V3JpdGVyICE9IG51bGwpCisJCQkJCQkJCW91dFdyaXRlci5jbG9zZSgpOworCQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZTEpIHsKKwkJCQkJCX0KKwkJCQkJCXRyeSB7CisJCQkJCQkJaWYgKG91dCAhPSBudWxsKQorCQkJCQkJCQlvdXQuY2xvc2UoKTsKKwkJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUyKSB7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIHN1Y2Nlc3M7CisJfQorCisKKwkvKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZGlyZWN0b3J5IG9mIHRoZSBTaXRlIGNvbnRhaW5zCisJICogLmVjbGlwc2VleHRlbnNpb24KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0V4dGVuc2lvblNpdGUoKSB7CisJCXJldHVybiBjb250YWluc01hcmtlcihFWFRFTlNJT05fU0lURV9NQVJLRVIpOworCX0KKworCS8qCisJICogUmV0dXJucyB0cnVlIGlmIHRoZSBkaXJlY3Rvcnkgb2YgdGhlIFNpdGUgY29udGFpbnMKKwkgKiAuZWNsaXBzZWV4dGVuc2lvbgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzUHJvZHVjdFNpdGUoKSB7CisJCXJldHVybiBjb250YWluc01hcmtlcihQUk9EVUNUX1NJVEVfTUFSS0VSKTsKKwl9CisKKwkvKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZGlyZWN0b3J5IG9mIHRoZSBTaXRlIGNvbnRhaW5zCisJICogLmVjbGlwc2VleHRlbnNpb24KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1ByaXZhdGVTaXRlKCkgeworCQlyZXR1cm4gaXNFeHRlbnNpb25TaXRlKCk7CisJfQorCisJLyoKKwkgKiAKKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gY29udGFpbnNNYXJrZXIoU3RyaW5nIG1hcmtlcikgeworCQlJU2l0ZSBzaXRlID0gZ2V0U2l0ZSgpOworCQlpZiAoc2l0ZSA9PSBudWxsKSB7CisJCQlVcGRhdGVDb3JlLndhcm4oIkNvbnRhaW5zIE1hcmtlcnM6VGhlIHNpdGUgaXMgbnVsbCIpOyAvLyROT04tTkxTLTEkCisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlVUkwgdXJsID0gc2l0ZS5nZXRVUkwoKTsKKwkJaWYgKHVybCA9PSBudWxsKSB7CisJCQlVcGRhdGVDb3JlLndhcm4oIkNvbnRhaW5zIE1hcmtlcnM6U2l0ZSBVUkwgaXMgbnVsbCIpOyAvLyROT04tTkxTLTEkCisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJaWYgKCEiZmlsZSIuZXF1YWxzSWdub3JlQ2FzZSh1cmwuZ2V0UHJvdG9jb2woKSkpIHsgLy8kTk9OLU5MUy0xJAorCQkJVXBkYXRlQ29yZS53YXJuKCJDb250YWlucyBNYXJrZXJzOk5vbiBmaWxlIHByb3RvY29sIik7IC8vJE5PTi1OTFMtMSQKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlGaWxlIGZpbGUgPSBuZXcgRmlsZSh1cmwuZ2V0RmlsZSgpKTsKKwkJaWYgKCFmaWxlLmV4aXN0cygpKSB7CisJCQlVcGRhdGVDb3JlLndhcm4oIkNvbnRhaW5zIE1hcmtlcnM6VGhlIHNpdGUgZG9lc24ndCBleGlzdDoiICsgZmlsZSk7IC8vJE5PTi1OTFMtMSQKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlGaWxlIGV4dGVuc2lvbiA9IG5ldyBGaWxlKGZpbGUsIG1hcmtlcik7CisJCWlmICghZXh0ZW5zaW9uLmV4aXN0cygpKSB7CisJCQlVcGRhdGVDb3JlLndhcm4oIkNvbnRhaW5zIE1hcmtlcnM6VGhlIGV4dGVuc2lvbmZpbGUgZG9lcyBub3QgZXhpc3Q6IiArIGV4dGVuc2lvbik7IC8vJE5PTi1OTFMtMSQKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgU2l0ZSBpcyBhbHJlYWR5IG5hdGl2ZWx5IGxpbmtlZAorCSAqLworCXB1YmxpYyBib29sZWFuIGlzTmF0aXZlbHlMaW5rZWQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCVN0cmluZyBwbGF0Zm9ybVN0cmluZyA9IGdldFBsYXRmb3JtVVJMU3RyaW5nKCk7CisJCWlmIChwbGF0Zm9ybVN0cmluZyA9PSBudWxsKSB7CisJCQlVcGRhdGVDb3JlLndhcm4oIlVuYWJsZSB0byByZXRyaWV2ZSBwbGF0Zm9ybVN0cmluZyIpOyAvLyROT04tTkxTLTEkCisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlVUkwgc2l0ZVVSTCA9IG51bGw7CisJCXRyeSB7CisJCQkvLyBjaGVjayBpZiB0aGUgc2l0ZSBleGlzdHMgYW5kIGlzIHVwZGF0ZWFibGUKKwkJCS8vIHVwZGF0ZSBjb25maWdTaXRlCisJCQlVUkwgdXJsVG9DaGVjayA9IG5ldyBVUkwocGxhdGZvcm1TdHJpbmcpOworCQkJSVBsYXRmb3JtQ29uZmlndXJhdGlvbiBydW50aW1lQ29uZmlnID0gQ29uZmlndXJhdG9yVXRpbHMuZ2V0Q3VycmVudFBsYXRmb3JtQ29uZmlndXJhdGlvbigpOworCQkJSVBsYXRmb3JtQ29uZmlndXJhdGlvbi5JU2l0ZUVudHJ5IGVudHJ5ID0gcnVudGltZUNvbmZpZy5maW5kQ29uZmlndXJlZFNpdGUodXJsVG9DaGVjayk7CisJCQlpZiAoZW50cnkgIT0gbnVsbCkgeworCQkJCXJldHVybiBlbnRyeS5pc05hdGl2ZWx5TGlua2VkKCk7CisJCQl9IGVsc2UgeworCQkJCVVwZGF0ZUNvcmUud2FybigiVW5hYmxlIHRvIHJldHJpZXZlIHNpdGU6IiArIHBsYXRmb3JtU3RyaW5nICsgIiBmcm9tIHBsYXRmb3JtLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCX0KKworCQkJLy8gY2hlY2sgYnkgY29tcGFyaW5nIFVSTHMKKwkJCUlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24uSVNpdGVFbnRyeVtdIHNpdGVzID0gcnVudGltZUNvbmZpZy5nZXRDb25maWd1cmVkU2l0ZXMoKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l0ZXMubGVuZ3RoOyBpKyspIHsKKwkJCQlzaXRlVVJMID0gc2l0ZXNbaV0uZ2V0VVJMKCk7CisJCQkJVVJMIHJlc29sdmVkVVJMID0gRmlsZUxvY2F0b3IucmVzb2x2ZShzaXRlVVJMKTsKKwkJCQlpZiAoVXBkYXRlTWFuYWdlclV0aWxzLnNhbWVVUkwocmVzb2x2ZWRVUkwsIHVybFRvQ2hlY2spKQorCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKwkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChNZXNzYWdlcy5Db25maWd1cmVkU2l0ZV9VbmFibGVSZXNvbHZlVVJMLCAobmV3IFN0cmluZ1tdIHsgcGxhdGZvcm1TdHJpbmcgfSkpOworCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24obXNnLCBlKTsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKE1lc3NhZ2VzLkNvbmZpZ3VyZWRTaXRlX1VuYWJsZVRvQWNjZXNzU2l0ZSwgKG5ldyBPYmplY3RbXSB7IHNpdGVVUkwgfSkpOworCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24obXNnLCBlKTsKKwkJfQorCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKgorCSogd2UgaGF2ZSB0byBjaGVjayB0aGF0IG5vIGNvbmZpZ3VyZWQvZW5hYmxlIHBhcmVudCBpbmNsdWRlIHRoaXMgZmVhdHVyZQorCSovCisJcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRlTm9Db25maWd1cmVkUGFyZW50cyhJRmVhdHVyZSBmZWF0dXJlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCWlmIChmZWF0dXJlID09IG51bGwpIHsKKwkJCVVwZGF0ZUNvcmUud2FybigiQ29uZmlndXJhdGlvblBvbGljeTogdmFsaWRhdGUgRmVhdHVyZSBpcyBudWxsIik7IC8vJE5PTi1OTFMtMSQKKwkJCXJldHVybiB0cnVlOworCQl9CisKKwkJSUZlYXR1cmVSZWZlcmVuY2VbXSBwYXJlbnRzID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFBhcmVudEZlYXR1cmVzKGZlYXR1cmUsIGdldENvbmZpZ3VyZWRGZWF0dXJlcygpLCBmYWxzZSk7CisJCXJldHVybiAocGFyZW50cy5sZW5ndGggPT0gMCk7CisJfQorCit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0NvbnRlbnRDb25zdW1lci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9Db250ZW50Q29uc3VtZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Mjc4YTdjCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9Db250ZW50Q29uc3VtZXIuamF2YQpAQCAtMCwwICsxLDI0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7CisKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7CisKKy8qKgorICogQSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvciBJRmVhdHVyZUNvbnRlbnRDb25zdW1lcgorICogPC9wPgorICogQHNpbmNlIDIuMAorICovCisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb250ZW50Q29uc3VtZXIgaW1wbGVtZW50cyBJQ29udGVudENvbnN1bWVyIHsKKworfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9Db3JlRXhjZXB0aW9uV2l0aFJvb3RDYXVzZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9Db3JlRXhjZXB0aW9uV2l0aFJvb3RDYXVzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MjI5NTkKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0NvcmVFeGNlcHRpb25XaXRoUm9vdENhdXNlLmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CisKK3B1YmxpYyBjbGFzcyBDb3JlRXhjZXB0aW9uV2l0aFJvb3RDYXVzZSBleHRlbmRzIENvcmVFeGNlcHRpb24geworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNjgzMjk5MzIzOTkyNjc2NzQwM0w7CisJCisJcHJpdmF0ZSBUaHJvd2FibGUgZSA9IG51bGw7CisJCisJcHVibGljIENvcmVFeGNlcHRpb25XaXRoUm9vdENhdXNlKElTdGF0dXMgc3RhdHVzKSB7CisJCXN1cGVyKHN0YXR1cyk7CisJfQorCisJcHVibGljIHZvaWQgc2V0Um9vdEV4Y2VwdGlvbihUaHJvd2FibGUgZSkgeworCQl0aGlzLmUgPSBlOwkKKwl9CisKKwlwdWJsaWMgVGhyb3dhYmxlIGdldFJvb3RFeGNlcHRpb24oKSB7CisJCXJldHVybiBlOworCX0KKworCQorfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9EZWZhdWx0SW5zdGFsbEhhbmRsZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvRGVmYXVsdEluc3RhbGxIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTAyOWIwNAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvRGVmYXVsdEluc3RhbGxIYW5kbGVyLmphdmEKQEAgLTAsMCArMSwxNDggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEudXRpbC5qYXIuKjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5KYXJDb250ZW50UmVmZXJlbmNlLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuKjsKKworLyoqCisgKiBEZWZhdWx0IEltcGxlbWVudGF0aW9uIG9mIEluc3RhbGxIYW5kbGVyCisgKi8KK3B1YmxpYyBjbGFzcyBEZWZhdWx0SW5zdGFsbEhhbmRsZXIgZXh0ZW5kcyBCYXNlSW5zdGFsbEhhbmRsZXIgeworCisJLyoKKwkgKiBAc2VlIElJbnN0YWxsSGFuZGxlciNub25QbHVnaW5EYXRhRG93bmxvYWRlZChJTm9uUGx1Z2luRW50cnlbXSwgSVZlcmlmaWNhdGlvbkxpc3RlbmVyKQorCSAqLworCXB1YmxpYyB2b2lkIG5vblBsdWdpbkRhdGFEb3dubG9hZGVkKAorCQlJTm9uUGx1Z2luRW50cnlbXSBub25QbHVnaW5EYXRhLAorCQlJVmVyaWZpY2F0aW9uTGlzdGVuZXIgbGlzdGVuZXIpCisJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKKworCQkvLyB2ZXJpZnkgbm9uLXBsdWdpbiBhcmNoaXZlcy4gVGhlIERlZmF1bHRJbnN0YWxsSGFuZGxlciBhc3N1bWVzCisJCS8vIHRoZSB2ZXJpZmllciBhc3NvY2lhdGVkIHdpdGggdGhlIGZlYXR1cmUgaXMgYWJsZSB0byB2ZXJpZnkgdGhlCisJCS8vIGRhdGEgYXJjaGl2ZXMuCisJCWlmIChub25QbHVnaW5EYXRhID09IG51bGwgfHwgbm9uUGx1Z2luRGF0YS5sZW5ndGggPT0gMCkKKwkJCXJldHVybjsKKworCQl0aGlzLm5vblBsdWdpbkVudHJpZXMgPSBub25QbHVnaW5EYXRhOworCQlJRmVhdHVyZUNvbnRlbnRQcm92aWRlciBwcm92aWRlciA9IHRoaXMuZmVhdHVyZS5nZXRGZWF0dXJlQ29udGVudFByb3ZpZGVyKCk7CisJCUlWZXJpZmllciB2ZXJpZmllciA9IHByb3ZpZGVyLmdldFZlcmlmaWVyKCk7CisJCWlmICh2ZXJpZmllciA9PSBudWxsKQorCQkJcmV0dXJuOworCisJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5ub25QbHVnaW5FbnRyaWVzLmxlbmd0aDsgaSsrKSB7CisJCQlDb250ZW50UmVmZXJlbmNlW10gYXJjaGl2ZXMgPQorCQkJCXByb3ZpZGVyLmdldE5vblBsdWdpbkVudHJ5QXJjaGl2ZVJlZmVyZW5jZXMobm9uUGx1Z2luRW50cmllc1tpXSwgdGhpcy5tb25pdG9yKTsKKwkJCUlWZXJpZmljYXRpb25SZXN1bHQgcmVzdWx0OworCQkJZm9yIChpbnQgaiA9IDA7IGogPCBhcmNoaXZlcy5sZW5ndGg7IGorKykgeworCisJCQkJLy8gc2VlIGlmIHRoZSBkYXRhIGVudHJ5IGlzIGEgamFyCisJCQkJQ29udGVudFJlZmVyZW5jZSBhcmNoaXZlID0gYXJjaGl2ZXNbal07CisJCQkJaWYgKCEoYXJjaGl2ZXNbal0gaW5zdGFuY2VvZiBKYXJDb250ZW50UmVmZXJlbmNlKQorCQkJCQkmJiBhcmNoaXZlc1tqXS5nZXRJZGVudGlmaWVyKCkuZW5kc1dpdGgoIi5qYXIiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJCXRyeSB7CisJCQkJCQlhcmNoaXZlID0KKwkJCQkJCQluZXcgSmFyQ29udGVudFJlZmVyZW5jZShhcmNoaXZlc1tqXS5nZXRJZGVudGlmaWVyKCksIGFyY2hpdmVzW2pdLmFzRmlsZSgpKTsKKwkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCQl9CisJCQkJfQorCisJCQkJcmVzdWx0ID0gdmVyaWZpZXIudmVyaWZ5KHRoaXMuZmVhdHVyZSwgYXJjaGl2ZSwgZmFsc2UsIHRoaXMubW9uaXRvcik7CisJCQkJaWYgKHJlc3VsdCAhPSBudWxsKQorCQkJCQlwcm9tcHRGb3JWZXJpZmljYXRpb24ocmVzdWx0LCBsaXN0ZW5lcik7CisJCQl9CisJCX0KKwl9CisKKwkvKgorCSAqIEBzZWUgSUluc3RhbGxIYW5kbGVyI2NvbXBsZXRlSW5zdGFsbChJRmVhdHVyZUNvbnRlbnRDb25zdW1lcikKKwkgKi8KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZUluc3RhbGwoSUZlYXR1cmVDb250ZW50Q29uc3VtZXIgY29uc3VtZXIpCisJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKKworCQkvLyBwbHVnaW5zIGhhdmUgYmVlbiBpbnN0YWxsZWQuIENoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGFueQorCQkvLyBub24tcGx1Z2luIGVudHJpZXMgdGhhdCBuZWVkIHRvIGJlIGhhbmRsZWQuCisJCWlmICh0aGlzLm5vblBsdWdpbkVudHJpZXMgPT0gbnVsbCB8fCB0aGlzLm5vblBsdWdpbkVudHJpZXMubGVuZ3RoID09IDApCisJCQlyZXR1cm47CisKKwkJLy8gaW5zdGFsbCBub24tcGx1Z2luIGFyY2hpdmVzCisJCUlGZWF0dXJlQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0gdGhpcy5mZWF0dXJlLmdldEZlYXR1cmVDb250ZW50UHJvdmlkZXIoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLm5vblBsdWdpbkVudHJpZXMubGVuZ3RoOyBpKyspIHsKKwkJCUNvbnRlbnRSZWZlcmVuY2VbXSBhcmNoaXZlID0KKwkJCQlwcm92aWRlci5nZXROb25QbHVnaW5FbnRyeUFyY2hpdmVSZWZlcmVuY2VzKG5vblBsdWdpbkVudHJpZXNbaV0sIHRoaXMubW9uaXRvcik7CisJCQlJQ29udGVudENvbnN1bWVyIG5vblBsdWdpbkNvbnN1bWVyID0gY29uc3VtZXIub3Blbihub25QbHVnaW5FbnRyaWVzW2ldKTsKKwkJCWZvciAoaW50IGogPSAwOyBqIDwgYXJjaGl2ZS5sZW5ndGg7IGorKykgeworCQkJCVN0cmluZyBpZCA9IGFyY2hpdmVbal0uZ2V0SWRlbnRpZmllcigpOworCQkJCWlmIChpZC5lbmRzV2l0aCgiLmphciIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQkJLy8gdGhlIG5vbi1wbHVnaW4gYXJjaGl2ZSBpcyBhIGphci4gVW5wYWNrIGl0IGludG8KKwkJCQkJLy8gYSBkaXJlY3RvcnkgY29uc3RydWN0ZWQgdXNpbmcgdGhlIGFyY2hpdmUgaWQKKwkJCQkJdHJ5IHsKKwkJCQkJCWZpbmFsIFN0cmluZyBwcmVmaXggPSBpZC5zdWJzdHJpbmcoMCwgaWQubGVuZ3RoKCkgLSA0KSArICIvIjsgLy8kTk9OLU5MUy0xJAorCQkJCQkJSmFyQ29udGVudFJlZmVyZW5jZSBqYXJSZWYgPSBuZXcgSmFyQ29udGVudFJlZmVyZW5jZSgiIiwgYXJjaGl2ZVtqXS5hc0ZpbGUoKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCUNvbnRlbnRTZWxlY3RvciBzZWxlY3RvciA9IG5ldyBDb250ZW50U2VsZWN0b3IoKSB7CisJCQkJCQkJcHVibGljIFN0cmluZyBkZWZpbmVJZGVudGlmaWVyKEphckVudHJ5IGVudHJ5KSB7CisJCQkJCQkJCWlmIChlbnRyeSA9PSBudWxsKQorCQkJCQkJCQkJcmV0dXJuIG51bGw7CisJCQkJCQkJCWVsc2UKKwkJCQkJCQkJCXJldHVybiBwcmVmaXggKyBlbnRyeS5nZXROYW1lKCk7CisJCQkJCQkJfQorCQkJCQkJfTsKKwkJCQkJCUNvbnRlbnRSZWZlcmVuY2VbXSBlbnRyaWVzID0gamFyUmVmLnBlZWsoc2VsZWN0b3IsIHRoaXMubW9uaXRvcik7CisJCQkJCQlmb3IgKGludCBrID0gMDsgayA8IGVudHJpZXMubGVuZ3RoOyBrKyspIHsKKwkJCQkJCQlub25QbHVnaW5Db25zdW1lci5zdG9yZShlbnRyaWVzW2tdLCB0aGlzLm1vbml0b3IpOworCQkJCQkJfQorCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJCQl0aHJvdyBVdGlsaXRpZXMKKwkJCQkJCQkubmV3Q29yZUV4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5KYXJWZXJpZmljYXRpb25TZXJ2aWNlX0NhbmNlbEluc3RhbGwsIChuZXcgU3RyaW5nW10geyBpZCB9KSksCisJCQkJCQllKTsKKwkJCQkJfQorCisJCQkJfSBlbHNlIHsKKwkJCQkJLy8gdGhlIG5vbi1wbHVnaW4gYXJjaGl2ZSBpcyBub3QgYSBqYXIuIEluc3RhbGwgaXQgYXNpcy4KKwkJCQkJbm9uUGx1Z2luQ29uc3VtZXIuc3RvcmUoYXJjaGl2ZVtqXSwgdGhpcy5tb25pdG9yKTsKKwkJCQl9CisJCQl9CisJCQlub25QbHVnaW5Db25zdW1lci5jbG9zZSgpOworCQl9CisJfQorCisJLyoKKwkgKiAKKwkgKi8KKwlwcml2YXRlIHZvaWQgcHJvbXB0Rm9yVmVyaWZpY2F0aW9uKAorCQlJVmVyaWZpY2F0aW9uUmVzdWx0IHZlcmlmaWNhdGlvblJlc3VsdCwKKwkJSVZlcmlmaWNhdGlvbkxpc3RlbmVyIGxpc3RlbmVyKQorCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisKKwkJaWYgKGxpc3RlbmVyID09IG51bGwpCisJCQlyZXR1cm47CisJCWludCByZXN1bHQgPSBsaXN0ZW5lci5wcm9tcHQodmVyaWZpY2F0aW9uUmVzdWx0KTsKKworCQlpZiAocmVzdWx0ID09IElWZXJpZmljYXRpb25MaXN0ZW5lci5DSE9JQ0VfQUJPUlQpIHsKKwkJCUV4Y2VwdGlvbiBlID0gdmVyaWZpY2F0aW9uUmVzdWx0LmdldFZlcmlmaWNhdGlvbkV4Y2VwdGlvbigpOworCQkJdGhyb3cgbmV3IEluc3RhbGxBYm9ydGVkRXhjZXB0aW9uKE1lc3NhZ2VzLkphclZlcmlmaWNhdGlvblNlcnZpY2VfQ2FuY2VsSW5zdGFsbCxlKTsgCisJCX0KKwkJaWYgKHJlc3VsdCA9PSBJVmVyaWZpY2F0aW9uTGlzdGVuZXIuQ0hPSUNFX0VSUk9SKSB7CisJCQl0aHJvdyBVdGlsaXRpZXMKKwkJCQkubmV3Q29yZUV4Y2VwdGlvbihNZXNzYWdlcy5KYXJWZXJpZmljYXRpb25TZXJ2aWNlX1Vuc3VjZXNzZnVsVmVyaWZpY2F0aW9uLCAKKwkJCXZlcmlmaWNhdGlvblJlc3VsdC5nZXRWZXJpZmljYXRpb25FeGNlcHRpb24oKSk7CisJCX0KKworCQlyZXR1cm47CisJfQorfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9EZWx0YUluc3RhbGxIYW5kbGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0RlbHRhSW5zdGFsbEhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTJkNzM1Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9EZWx0YUluc3RhbGxIYW5kbGVyLmphdmEKQEAgLTAsMCArMSwxNzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEubmV0LlVSTDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuQmFzZUluc3RhbGxIYW5kbGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkNvbnRlbnRSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmVDb250ZW50Q29uc3VtZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVBsdWdpbkVudHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlBsdWdpbkVudHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlNpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm9wZXJhdGlvbnMuVXBkYXRlVXRpbHM7CisKKy8qKgorICogSW5zdGFsbCBoYW5kbGVyIGZvciBwYXJ0aWFsIHBsdWdpbiBkZWxpdmVyeTogY29weSBkZWx0YSBjb250ZW50IGZyb20gb2xkIHBsdWdpbiBpbnRvIHRoZSBuZXcgb25lLgorICogVGhlIG5ldyBwbHVnaW4gc2hvdWxkIG9ubHkgY29udGFpbiBmaWxlcyB0aGF0IGhhdmUgY2hhbmdlZC4KKyAqLworcHVibGljIGNsYXNzIERlbHRhSW5zdGFsbEhhbmRsZXIgZXh0ZW5kcyBCYXNlSW5zdGFsbEhhbmRsZXIgeworCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBQTFVHSU5fWE1MID0gInBsdWdpbi54bWwiOyAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEZSQUdNRU5UX1hNTCA9ICJmcmFnbWVudC54bWwiOyAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIE1FVEFfTUFOSUZFU1QgPSAiTUVUQS1JTkYvTUFOSUZFU1QuTUYiOyAvLyROT04tTkxTLTEkCisKKwlwcm90ZWN0ZWQgSUZlYXR1cmUgb2xkRmVhdHVyZTsKKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklJbnN0YWxsSGFuZGxlciNjb21wbGV0ZUluc3RhbGwob3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmVDb250ZW50Q29uc3VtZXIpCisJICovCisJcHVibGljIHZvaWQgY29tcGxldGVJbnN0YWxsKElGZWF0dXJlQ29udGVudENvbnN1bWVyIGNvbnN1bWVyKQorCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCXRyeSB7CisJCQlpZiAocGx1Z2luRW50cmllcyA9PSBudWxsKQorCQkJCXJldHVybjsKKworCQkJaWYgKCFmZWF0dXJlLmlzUGF0Y2goKSkgeworCQkJCS8vIEdldCB0aGUgb2xkIGZlYXR1cmUKKwkJCQlJRmVhdHVyZVtdIG9sZEZlYXR1cmVzID0gVXBkYXRlVXRpbHMKKwkJCQkJCS5nZXRJbnN0YWxsZWRGZWF0dXJlcyhmZWF0dXJlKTsKKwkJCQlpZiAob2xkRmVhdHVyZXMubGVuZ3RoID09IDApCisJCQkJCXJldHVybjsKKwkJCQlvbGRGZWF0dXJlID0gb2xkRmVhdHVyZXNbMF07CisJCQl9IGVsc2UgeworCQkJCW9sZEZlYXR1cmUgPSBVcGRhdGVVdGlscy5nZXRQYXRjaGVkRmVhdHVyZShmZWF0dXJlKTsKKwkJCQlpZiAob2xkRmVhdHVyZSA9PSBudWxsKSB7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9CisJCQkKKwkJCUlQbHVnaW5FbnRyeVtdIG9sZFBsdWdpbnMgPSBvbGRGZWF0dXJlLmdldFBsdWdpbkVudHJpZXMoKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGx1Z2luRW50cmllcy5sZW5ndGg7IGkrKykgeworCQkJCUlQbHVnaW5FbnRyeSBuZXdQbHVnaW4gPSBwbHVnaW5FbnRyaWVzW2ldOworCQkJCUlQbHVnaW5FbnRyeSBvbGRQbHVnaW4gPQorCQkJCQlnZXRQbHVnaW5FbnRyeSgKKwkJCQkJCW9sZFBsdWdpbnMsCisJCQkJCQluZXdQbHVnaW4uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldElkZW50aWZpZXIoKSk7CisJCQkJaWYgKG9sZFBsdWdpbiA9PSBudWxsKQorCQkJCQljb250aW51ZTsKKwkJCQl0cnkgeworCQkJCQlvdmVybGF5UGx1Z2luKG9sZFBsdWdpbiwgbmV3UGx1Z2luLCBjb25zdW1lcik7CisJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbigKKwkJCQkJCW5ldyBTdGF0dXMoCisJCQkJCQkJSVN0YXR1cy5FUlJPUiwKKwkJCQkJCQlVcGRhdGVVdGlscy5nZXRQbHVnaW5JZCgpLAorCQkJCQkJCTEsCisJCQkJCQkJIiIsIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQllKSk7CisJCQkJfQorCQkJfQorCQl9IGZpbmFsbHkgeworCQkJLy9pZiAoY29udGVudENvbnN1bWVyICE9IG51bGwpCisJCQkvLwljb250ZW50Q29uc3VtZXIuY2xvc2UoKTsKKwkJfQorCX0KKworCXByb3RlY3RlZCBJUGx1Z2luRW50cnkgZ2V0UGx1Z2luRW50cnkoSVBsdWdpbkVudHJ5W10gcGx1Z2lucywgU3RyaW5nIGlkKSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgcGx1Z2lucy5sZW5ndGg7IGkrKykKKwkJCWlmIChwbHVnaW5zW2ldLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRJZGVudGlmaWVyKCkuZXF1YWxzKGlkKSkKKwkJCQlyZXR1cm4gcGx1Z2luc1tpXTsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHJvdGVjdGVkIGJvb2xlYW4gcmVmZXJlbmNlRXhpc3RzKAorCQlDb250ZW50UmVmZXJlbmNlW10gcmVmZXJlbmNlcywKKwkJQ29udGVudFJlZmVyZW5jZSByZWYpIHsKKwkJU3RyaW5nIGlkID0gcmVmLmdldElkZW50aWZpZXIoKTsKKwkJaWYgKGlkID09IG51bGwpCisJCQlyZXR1cm4gZmFsc2U7CisKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZlcmVuY2VzLmxlbmd0aDsgaSsrKQorCQkJaWYgKGlkLmVxdWFscyhyZWZlcmVuY2VzW2ldLmdldElkZW50aWZpZXIoKSkpCisJCQkJcmV0dXJuIHRydWU7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBvdmVybGF5UGx1Z2luKAorCQlJUGx1Z2luRW50cnkgb2xkUGx1Z2luLAorCQlJUGx1Z2luRW50cnkgbmV3UGx1Z2luLAorCQlJRmVhdHVyZUNvbnRlbnRDb25zdW1lciBjb25zdW1lcikKKwkJdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKwkJaWYobmV3UGx1Z2luIGluc3RhbmNlb2YgUGx1Z2luRW50cnkgJiYgISgoUGx1Z2luRW50cnkpbmV3UGx1Z2luKS5pc1VucGFjaygpKXsKKwkJCS8vIHBhcnRpYWwgcGx1Zy1pbnMgKGluIHBhdGNoZXMpIG11c3QgYWx3YXlzIGJlIHVucGFja2VkCisJCQlyZXR1cm47CisJCX0KKwkJCisJCS8vIGNvcHkgdGhlIGNvbnRlbnQgb2YgdGhlIG9sZCBwbHVnaW4gb3ZlciB0aGUgbmV3IG9uZSwgYnV0IG9ubHkKKwkJLy8gdGhvc2UgZmlsZXMgdGhhdCBkbyBub3QgZXhpc3Qgb24gdGhlIHRhcmdldAorCQlDb250ZW50UmVmZXJlbmNlW10gb2xkUmVmZXJlbmNlcyA9CisJCQlvbGRGZWF0dXJlCisJCQkJLmdldEZlYXR1cmVDb250ZW50UHJvdmlkZXIoKQorCQkJCS5nZXRQbHVnaW5FbnRyeUNvbnRlbnRSZWZlcmVuY2VzKAorCQkJCW9sZFBsdWdpbiwKKwkJCQludWxsKTsKKwkJQ29udGVudFJlZmVyZW5jZVtdIG5ld1JlZmVyZW5jZXMgPQorCQkJZmVhdHVyZQorCQkJCS5nZXRGZWF0dXJlQ29udGVudFByb3ZpZGVyKCkKKwkJCQkuZ2V0UGx1Z2luRW50cnlDb250ZW50UmVmZXJlbmNlcygKKwkJCQluZXdQbHVnaW4sCisJCQkJbnVsbCk7CisKKwkJVVJMIG5ld1VSTCA9IG5ldyBVUkwoY29uc3VtZXIuZ2V0RmVhdHVyZSgpLmdldFNpdGUoKS5nZXRVUkwoKSwKKwkJCQlTaXRlLkRFRkFVTFRfUExVR0lOX1BBVEgKKwkJCQkJCSsgbmV3UGx1Z2luLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKTsKKwkJU3RyaW5nIHBsdWdpblBhdGggPSBuZXdVUkwuZ2V0RmlsZSgpOworCQlmb3IgKGludCBpID0gMDsgaSA8IG9sZFJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsKKwkJCWlmIChpc1BsdWdpbk1hbmlmZXN0KG9sZFJlZmVyZW5jZXNbaV0pCisJCQkJfHwgcmVmZXJlbmNlRXhpc3RzKG5ld1JlZmVyZW5jZXMsIG9sZFJlZmVyZW5jZXNbaV0pKQorCQkJCWNvbnRpbnVlOworCisJCQlJbnB1dFN0cmVhbSBpbnB1dCA9IG51bGw7CisJCQl0cnkgeworCQkJCWlucHV0ID0gb2xkUmVmZXJlbmNlc1tpXS5nZXRJbnB1dFN0cmVhbSgpOworCQkJCUZpbGUgdGFyZ2V0RmlsZSA9CisJCQkJCW5ldyBGaWxlKHBsdWdpblBhdGgsIG9sZFJlZmVyZW5jZXNbaV0uZ2V0SWRlbnRpZmllcigpKTsKKwkJCQlVcGRhdGVNYW5hZ2VyVXRpbHMuY29weVRvTG9jYWwoCisJCQkJCWlucHV0LAorCQkJCQl0YXJnZXRGaWxlLmdldEFic29sdXRlUGF0aCgpLAorCQkJCQludWxsKTsKKwkJCQlVcGRhdGVNYW5hZ2VyVXRpbHMuY2hlY2tQZXJtaXNzaW9ucygKKwkJCQkJb2xkUmVmZXJlbmNlc1tpXSwKKwkJCQkJcGx1Z2luUGF0aCk7CisJCQkJLy8gMjAzMDUKKwkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQljb250aW51ZTsKKwkJCX0gZmluYWxseSB7CisJCQkJaWYoaW5wdXQgIT0gbnVsbCl7CisJCQkJCXRyeXsKKwkJCQkJCWlucHV0LmNsb3NlKCk7CisJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNQbHVnaW5NYW5pZmVzdChDb250ZW50UmVmZXJlbmNlIHJlZikgeworCQlTdHJpbmcgaWQgPSByZWYuZ2V0SWRlbnRpZmllcigpOworCQlyZXR1cm4gUExVR0lOX1hNTC5lcXVhbHMoaWQpIHx8IEZSQUdNRU5UX1hNTC5lcXVhbHMoaWQpIHx8IE1FVEFfTUFOSUZFU1QuZXF1YWxzKGlkKTsKKwl9Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0RpZ2VzdC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9EaWdlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2UxNjE2Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9EaWdlc3QuamF2YQpAQCAtMCwwICsxLDU0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuamFyLkphckZpbGU7CitpbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkphckNvbnRlbnRSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuRmVhdHVyZU1vZGVsOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKKworcHVibGljIGNsYXNzIERpZ2VzdCB7CisJCisJcHJpdmF0ZSBVUkwgc291cmNlOworCXByaXZhdGUgRmlsZSBsb2NhbFNvdXJjZTsKKwlwcml2YXRlIEphckZpbGUgZGlnZXN0SmFyOworCXByaXZhdGUgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW07CisJCisKKwlwdWJsaWMgRGlnZXN0KFVSTCBzb3VyY2UpeworCQl0aGlzLnNvdXJjZSA9IHNvdXJjZTsKKwl9CisJCisJcHVibGljIEZlYXR1cmVNb2RlbFtdIHBhcnNlRGlnZXN0KCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24geworCQlEaWdlc3RDb250ZW50UHJvdmlkZXIgZGlnZXN0Q29udGVudFByb3ZpZGVyID0gbmV3IERpZ2VzdENvbnRlbnRQcm92aWRlcihzb3VyY2UpOworCQlsb2NhbFNvdXJjZSA9IGRpZ2VzdENvbnRlbnRQcm92aWRlci5hc0xvY2FsUmVmZXJlbmNlKG5ldyBKYXJDb250ZW50UmVmZXJlbmNlKCBudWxsLCBzb3VyY2UpLCBudWxsKS5hc0ZpbGUoKTsKKwkJZGlnZXN0SmFyID0gbmV3IEphckZpbGUobG9jYWxTb3VyY2UpOworCQkKKwkJWmlwRW50cnkgZGlnZXN0RW50cnkgPSBkaWdlc3RKYXIuZ2V0RW50cnkoImRpZ2VzdC54bWwiKTsgLy8kTk9OLU5MUy0xJAorCQkKKwkJaWYgKGRpZ2VzdEVudHJ5ICE9IG51bGwpIHsKKwkJCWlucHV0U3RyZWFtID0gZGlnZXN0SmFyLmdldElucHV0U3RyZWFtKGRpZ2VzdEVudHJ5KTsKKwkJCURpZ2VzdFBhcnNlciBkaWdlc3QgPSBuZXcgRGlnZXN0UGFyc2VyKCk7CisJCQlkaWdlc3QuaW5pdChuZXcgTGl0ZUZlYXR1cmVGYWN0b3J5KCkpOworCQkJcmV0dXJuIGRpZ2VzdC5wYXJzZShpbnB1dFN0cmVhbSk7CisJCX0gZWxzZSB7CisJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihudWxsKTsKKwkJfQorCX0KKworfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9EaWdlc3RDb250ZW50UHJvdmlkZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvRGlnZXN0Q29udGVudFByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM4NDhhYQotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvRGlnZXN0Q29udGVudFByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw4NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5Db250ZW50UmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkZlYXR1cmVDb250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSU5vblBsdWdpbkVudHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklQbHVnaW5FbnRyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JVmVyaWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSW5zdGFsbE1vbml0b3I7CisKK3B1YmxpYyBjbGFzcyBEaWdlc3RDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBGZWF0dXJlQ29udGVudFByb3ZpZGVyIHsKKworCXB1YmxpYyBEaWdlc3RDb250ZW50UHJvdmlkZXIoVVJMIGJhc2UpIHsKKwkJc3VwZXIoYmFzZSk7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgorCX0KKwkKKwkKKwlwdWJsaWMgQ29udGVudFJlZmVyZW5jZSBhc0xvY2FsUmVmZXJlbmNlKCBDb250ZW50UmVmZXJlbmNlIHJlZiwKKwkJCUluc3RhbGxNb25pdG9yIG1vbml0b3IpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7CisJCXJldHVybiBzdXBlci5hc0xvY2FsUmVmZXJlbmNlKHJlZiwgbW9uaXRvcik7CisJfQorCisJcHVibGljIENvbnRlbnRSZWZlcmVuY2VbXSBnZXRBcmNoaXZlUmVmZXJlbmNlcyhJbnN0YWxsTW9uaXRvciBtb25pdG9yKQorCQkJdGhyb3dzIENvcmVFeGNlcHRpb24geworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyBDb250ZW50UmVmZXJlbmNlW10gZ2V0RmVhdHVyZUVudHJ5QXJjaGl2ZVJlZmVyZW5jZXMoCisJCQlJbnN0YWxsTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIENvbnRlbnRSZWZlcmVuY2VbXSBnZXRGZWF0dXJlRW50cnlDb250ZW50UmVmZXJlbmNlcygKKwkJCUluc3RhbGxNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgQ29udGVudFJlZmVyZW5jZSBnZXRGZWF0dXJlTWFuaWZlc3RSZWZlcmVuY2UoSW5zdGFsbE1vbml0b3IgbW9uaXRvcikKKwkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgQ29udGVudFJlZmVyZW5jZVtdIGdldE5vblBsdWdpbkVudHJ5QXJjaGl2ZVJlZmVyZW5jZXMoCisJCQlJTm9uUGx1Z2luRW50cnkgbm9uUGx1Z2luRW50cnksIEluc3RhbGxNb25pdG9yIG1vbml0b3IpCisJCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIENvbnRlbnRSZWZlcmVuY2VbXSBnZXRQbHVnaW5FbnRyeUFyY2hpdmVSZWZlcmVuY2VzKAorCQkJSVBsdWdpbkVudHJ5IHBsdWdpbkVudHJ5LCBJbnN0YWxsTW9uaXRvciBtb25pdG9yKQorCQkJdGhyb3dzIENvcmVFeGNlcHRpb24geworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyBDb250ZW50UmVmZXJlbmNlW10gZ2V0UGx1Z2luRW50cnlDb250ZW50UmVmZXJlbmNlcygKKwkJCUlQbHVnaW5FbnRyeSBwbHVnaW5FbnRyeSwgSW5zdGFsbE1vbml0b3IgbW9uaXRvcikKKwkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgSVZlcmlmaWVyIGdldFZlcmlmaWVyKCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCXJldHVybiBudWxsOworCX0KKworfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9EaWdlc3RQYXJzZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvRGlnZXN0UGFyc2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2EwNzgyYgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvRGlnZXN0UGFyc2VyLmphdmEKQEAgLTAsMCArMSwxNjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXI7CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC5GZWF0dXJlTW9kZWxGYWN0b3J5OworaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7CitpbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uOworaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI7CisKK3B1YmxpYyBjbGFzcyBEaWdlc3RQYXJzZXIgZXh0ZW5kcyBEZWZhdWx0SGFuZGxlciB7CisKKwlwcml2YXRlIEludGVybmFsRmVhdHVyZVBhcnNlciBmZWF0dXJlUGFyc2VyOworCQorCXByaXZhdGUgQXJyYXlMaXN0IGZlYXR1cmVNb2RlbHM7CisKKwlwcml2YXRlIFNBWFBhcnNlciBwYXJzZXI7CisKKwlwcml2YXRlIEZlYXR1cmVNb2RlbEZhY3RvcnkgZmFjdG9yeTsKKworCXByaXZhdGUgU3RyaW5nIGxvY2F0aW9uOworCQorCXByaXZhdGUgZmluYWwgc3RhdGljIFNBWFBhcnNlckZhY3RvcnkgcGFyc2VyRmFjdG9yeSA9CisJCVNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKwkKKwlwdWJsaWMgRGlnZXN0UGFyc2VyKCkgeworCQlzdXBlcigpOworCQlmZWF0dXJlUGFyc2VyID0gbmV3IEludGVybmFsRmVhdHVyZVBhcnNlcigpOworCQl0cnkgeworCQkJcGFyc2VyRmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKKwkJCXRoaXMucGFyc2VyID0gcGFyc2VyRmFjdG9yeS5uZXdTQVhQYXJzZXIoKTsKKwkJfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7CisJCQlVcGRhdGVDb3JlLmxvZyhlKTsKKwkJfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKKwkJCVVwZGF0ZUNvcmUubG9nKGUpOworCQl9CisJfQorCisJcHVibGljIHZvaWQgaW5pdChGZWF0dXJlTW9kZWxGYWN0b3J5IGZhY3RvcnkpIHsKKwkJaW5pdChmYWN0b3J5LCBudWxsKTsKKwl9CisgICAgCisgICAgLyoqCisgICAgICogQHBhcmFtIGZhY3RvcnkKKyAgICAgKiBAcGFyYW0gbG9jYXRpb24KKyAgICAgKiBAc2luY2UgMy4xCisgICAgICovCisgICAgcHVibGljIHZvaWQgaW5pdChGZWF0dXJlTW9kZWxGYWN0b3J5IGZhY3RvcnksIFN0cmluZyBsb2NhdGlvbikgeworICAgIAkKKyAgICAJdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTsKKyAgICAJdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOworICAgIAlmYWN0b3J5ID0gbmV3IExpdGVGZWF0dXJlRmFjdG9yeSgpOworICAgIAlmZWF0dXJlTW9kZWxzID0gbmV3IEFycmF5TGlzdCgpOworICAgIAlmZWF0dXJlUGFyc2VyLmludGVybmFsSW5pdChmYWN0b3J5LCBsb2NhdGlvbik7CisgICAgfQorCisJLyoqCisJICogUGFyc2VzIHRoZSBzcGVjaWZpZWQgaW5wdXQgc3RlYW0gYW5kIGNvbnN0cnVjdHMgYSBmZWF0dXJlIG1vZGVsLgorCSAqIFRoZSBpbnB1dCBzdHJlYW0gaXMgbm90IGNsb3NlZCBhcyBwYXJ0IG9mIHRoaXMgb3BlcmF0aW9uLgorCSAqIAorCSAqIEBwYXJhbSBpbiBpbnB1dCBzdHJlYW0KKwkgKiBAcmV0dXJuIGZlYXR1cmUgbW9kZWwKKwkgKiBAZXhjZXB0aW9uIFNBWEV4Y2VwdGlvbgorCSAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24KKwkgKiBAc2luY2UgMi4wCisJICovCisJcHVibGljIExpdGVGZWF0dXJlW10gcGFyc2UoSW5wdXRTdHJlYW0gaW4pIHRocm93cyBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKwkJCisJCXBhcnNlci5wYXJzZShuZXcgSW5wdXRTb3VyY2UoaW4pLCB0aGlzKTsJCisJCXJldHVybiAoTGl0ZUZlYXR1cmVbXSlmZWF0dXJlTW9kZWxzLnRvQXJyYXkoIG5ldyBMaXRlRmVhdHVyZVtmZWF0dXJlTW9kZWxzLnNpemUoKV0pOworCX0KKworCisJLyoqCisJICogUmV0dXJucyBhbGwgc3RhdHVzIG9iamVjdHMgYWNjdW11bGF0ZWQgYnkgdGhlIHBhcnNlci4KKwkgKgorCSAqIEByZXR1cm4gbXVsdGktc3RhdHVzIGNvbnRhaW5pbmcgYWNjdW11bGF0ZWQgc3RhdHVzLCBvciA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAc2luY2UgMi4wCisJICovCisJcHVibGljIE11bHRpU3RhdHVzIGdldFN0YXR1cygpIHsKKwkJcmV0dXJuIGZlYXR1cmVQYXJzZXIuZ2V0U3RhdHVzKCk7CisJfQorCisJLyoqCisJICogSGFuZGxlIHN0YXJ0IG9mIGVsZW1lbnQgdGFncworCSAqIEBzZWUgRGVmYXVsdEhhbmRsZXIjc3RhcnRFbGVtZW50KFN0cmluZywgU3RyaW5nLCBTdHJpbmcsIEF0dHJpYnV0ZXMpCisJICogQHNpbmNlIDIuMAorCSAqLworCXB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisJCWlmKGxvY2FsTmFtZS5lcXVhbHMoImRpZ2VzdCIpKSAvLyROT04tTkxTLTEkCisJCQlyZXR1cm47CisJCWlmKGxvY2FsTmFtZS5lcXVhbHMoImZlYXR1cmUiKSkgLy8kTk9OLU5MUy0xJAorCQkJZmVhdHVyZVBhcnNlci5pbnRlcm5hbEluaXQoZmFjdG9yeSwgbG9jYXRpb24pOworCQkKKwkJZmVhdHVyZVBhcnNlci5zdGFydEVsZW1lbnQodXJpLCBsb2NhbE5hbWUsIHFOYW1lLCBhdHRyaWJ1dGVzKTsKKwl9CisKKwkvKioKKwkgKiBIYW5kbGUgZW5kIG9mIGVsZW1lbnQgdGFncworCSAqIEBzZWUgRGVmYXVsdEhhbmRsZXIjZW5kRWxlbWVudChTdHJpbmcsIFN0cmluZywgU3RyaW5nKQorCSAqIEBzaW5jZSAyLjAKKwkgKi8KKwlwdWJsaWMgdm9pZCBlbmRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSkgeworCQlpZihsb2NhbE5hbWUuZXF1YWxzKCJkaWdlc3QiKSkgLy8kTk9OLU5MUy0xJAorCQkJcmV0dXJuOworCQlmZWF0dXJlUGFyc2VyLmVuZEVsZW1lbnQodXJpLCBsb2NhbE5hbWUsIHFOYW1lKTsKKwkJaWYobG9jYWxOYW1lLmVxdWFscygiZmVhdHVyZSIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCXRyeSB7CisJCQkJZmVhdHVyZU1vZGVscy5hZGQoZmVhdHVyZVBhcnNlci5nZXRGZWF0dXJlTW9kZWwoKSk7CisJCQl9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgeworCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQl9IAorCQl9CisJfQorCQorCisJLyoqCisJICogSGFuZGxlIGNoYXJhY3RlciB0ZXh0CisJICogQHNlZSBEZWZhdWx0SGFuZGxlciNjaGFyYWN0ZXJzKGNoYXJbXSwgaW50LCBpbnQpCisJICogQHNpbmNlIDIuMAorCSAqLworCXB1YmxpYyB2b2lkIGNoYXJhY3RlcnMoY2hhcltdIGNoLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKKwkJZmVhdHVyZVBhcnNlci5jaGFyYWN0ZXJzKGNoLCBzdGFydCwgbGVuZ3RoKTsKKwl9CisKKwkvKioKKwkgKiBIYW5kbGUgZXJyb3JzCisJICogQHNlZSBEZWZhdWx0SGFuZGxlciNlcnJvcihTQVhQYXJzZUV4Y2VwdGlvbikKKwkgKiBAc2luY2UgMi4wCisJICovCisJcHVibGljIHZvaWQgZXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZXgpIHsKKwkJZmVhdHVyZVBhcnNlci5lcnJvcihleCk7CisJfQorCisJLyoqCisJICogSGFuZGxlIGZhdGFsIGVycm9ycworCSAqIEBzZWUgRGVmYXVsdEhhbmRsZXIjZmF0YWxFcnJvcihTQVhQYXJzZUV4Y2VwdGlvbikKKwkgKiBAZXhjZXB0aW9uIFNBWEV4Y2VwdGlvbgorCSAqIEBzaW5jZSAyLjAKKwkgKi8KKwlwdWJsaWMgdm9pZCBmYXRhbEVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGV4KSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKwkJZmVhdHVyZVBhcnNlci5mYXRhbEVycm9yKGV4KTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyI2lnbm9yYWJsZVdoaXRlc3BhY2UoY2hhcltdLCBpbnQsIGludCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBpZ25vcmFibGVXaGl0ZXNwYWNlKGNoYXJbXSBhcmcwLCBpbnQgYXJnMSwgaW50IGFyZzIpIHRocm93cyBTQVhFeGNlcHRpb24geworCQlmZWF0dXJlUGFyc2VyLmlnbm9yYWJsZVdoaXRlc3BhY2UoYXJnMCwgYXJnMSwgYXJnMik7CisJfQorfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9FbXB0eURpcmVjdG9yeUV4Y2VwdGlvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9FbXB0eURpcmVjdG9yeUV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczMmUxNzQKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0VtcHR5RGlyZWN0b3J5RXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwyNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CisKK3B1YmxpYyBjbGFzcyBFbXB0eURpcmVjdG9yeUV4Y2VwdGlvbiBleHRlbmRzIENvcmVFeGNlcHRpb24geworCisJLyoqCisJICogCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTc2MjkzMDY2Nzg4MzI2NTIyOEw7CisKKwlwdWJsaWMgRW1wdHlEaXJlY3RvcnlFeGNlcHRpb24oSVN0YXR1cyBzdGF0dXMpIHsKKwkJc3VwZXIoc3RhdHVzKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvRXJyb3JSZWNvdmVyeUxvZy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9FcnJvclJlY292ZXJ5TG9nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg3NzY0YgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvRXJyb3JSZWNvdmVyeUxvZy5qYXZhCkBAIC0wLDAgKzEsMjcwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7CisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci5Db25maWd1cmF0b3JVdGlsczsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLklQbGF0Zm9ybUNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuVXRpbGl0aWVzOworCisKKy8qKgorICogTWFuYWdlcyB0aGUgZXJyb3IvcmVjb3ZlciBsb2cgZmlsZQorICovCitwdWJsaWMgY2xhc3MgRXJyb3JSZWNvdmVyeUxvZyB7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX1JFQ09WRVJZX0xPRyA9ICJlcnJvcl9yZWNvdmVyeS5sb2ciOyAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19FTlRSWV9LRVkgPSAiTG9nRW50cnkuIjsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVRVUk5fQ0FSUklBR0UgPSAiXHJcbiI7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5EX09GX0ZJTEUgPSAiZW9mPWVvZiI7IC8vJE5PTi1OTFMtMSQKKworCS8vCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBUlRfSU5TVEFMTF9MT0cgPSAJIlNUQVJUX0lOU1RBTExfTE9HIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9FTlRSWSA9IAkJIlBMVUdJTiI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGUkFHTUVOVF9FTlRSWSA9IAkJIkZSQUdNRU5UIjsJIC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTUFOSUZFU1RfRU5UUlkgPSAJCSJCVU5ETEVfTUFOSUZFU1QiOwkgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9KQVJfRU5UUlkgPSAJCQkiQlVORExFIjsJIC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGRUFUVVJFX0VOVFJZID0gCQkiRkVBVFVSRSI7IC8vJE5PTi1OTFMtMSQyCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxMX0lOU1RBTExFRCA9IAkJIkFMTF9GRUFUVVJFU19JTlNUQUxMRUQiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVOQU1FX0VOVFJZID0gCQkiUkVOQU1FIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVORF9JTlNUQUxMX0xPRyA9IAkiRU5EX0lOU1RBTExfTE9HIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVJUX1JFTU9WRV9MT0cgPSAJIlJFTU9WRV9MT0ciOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5EX0FCT1VUX1JFTU9WRSA9CSJFTkRfQUJPVVRfVE9fUkVNT1ZFIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFTEVURV9FTlRSWSA9IAkJIkRFTEVURSI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTkRfUkVNT1ZFX0xPRyA9IAkJIkVORF9SRU1PVkVfTE9HIjsgLy8kTk9OLU5MUy0xJAorCisJcHJpdmF0ZSBzdGF0aWMgRXJyb3JSZWNvdmVyeUxvZyBpbnN0OworCXByaXZhdGUgRmlsZVdyaXRlciBvdXQ7CisJcHJpdmF0ZSBpbnQgaW5kZXg7CisJcHJpdmF0ZSBMaXN0IHBhdGhzOworCQorCXByaXZhdGUgYm9vbGVhbiBvcGVuID0gZmFsc2U7CisJcHJpdmF0ZSBpbnQgbmJPZk9wZW4gPSAwOworCQorCisJLyoqCisJICogQ29uc3RydWN0b3IgZm9yIEVycm9yUmVjb3ZlcnlMb2cuCisJICovCisJcHJpdmF0ZSBFcnJvclJlY292ZXJ5TG9nKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIFNpbmdsZXRvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgRXJyb3JSZWNvdmVyeUxvZyBnZXRMb2coKSB7CisJCWlmIChpbnN0ID09IG51bGwpeworCQkJaW5zdCA9IG5ldyBFcnJvclJlY292ZXJ5TG9nKCk7CisJCX0KKwkJcmV0dXJuIGluc3Q7CisJfQorCisJLyoqCisJICogZ2V0IGEgdW5pcXVlIGlkZW50aWZlciBmb3IgdGhlIGZpbGUsIGVuc3VyZSB1bmlxdWVuZXNzIHVwIHRvIG5vdworCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldExvY2FsUmFuZG9tSWRlbnRpZmllcihTdHJpbmcgcGF0aCkgeworCQkKKwkJaWYgKHBhdGg9PW51bGwpIHJldHVybiBudWxsOworCQkKKwkJLy8gdmVyaWZ5IGlmIGl0IHdpbGwgYmUgYSBkaXJlY3Rvcnkgd2l0aG91dCBjcmVhdGluZyB0aGUgZmlsZQorCQkvLyBhcyBpdCBkb2Vzbid0IGV4aXN0IHlldAorCQlpZiAocGF0aC5lbmRzV2l0aChGaWxlLnNlcGFyYXRvcikgfHwgcGF0aC5lbmRzV2l0aCgiLyIpKSAvLyROT04tTkxTLTEkCisJCQlyZXR1cm4gcGF0aDsKKwkJRmlsZSBmaWxlID0gbmV3IEZpbGUocGF0aCk7CisJCVN0cmluZyBuZXdOYW1lID0KKwkJCVVwZGF0ZU1hbmFnZXJVdGlscy5nZXRMb2NhbFJhbmRvbUlkZW50aWZpZXIoZmlsZS5nZXROYW1lKCksIG5ldyBEYXRlKCkpOworCQl3aGlsZSAobmV3IEZpbGUoZmlsZS5nZXRQYXJlbnRGaWxlKCksIG5ld05hbWUpLmV4aXN0cygpKSB7CisJCQluZXdOYW1lID0KKwkJCQlVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0TG9jYWxSYW5kb21JZGVudGlmaWVyKGZpbGUuZ2V0TmFtZSgpLCBuZXcgRGF0ZSgpKTsKKwkJfQorCQlGaWxlIG5ld0ZpbGUgPSBuZXcgRmlsZShmaWxlLmdldFBhcmVudEZpbGUoKSxuZXdOYW1lKTsKKwkJcmV0dXJuIG5ld0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7CisJfQorCisJLyoqCisJICogcmV0dXJucyB0aGUgbG9nIGZpbGUgCisJICogV2UgZG8gbm90IGNoZWNrIGlmIHRoZSBmaWxlIGV4aXN0cworCSAqLworCXB1YmxpYyBGaWxlIGdldFJlY292ZXJ5TG9nRmlsZSgpIHsKKwkJSVBsYXRmb3JtQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0KKwkJCUNvbmZpZ3VyYXRvclV0aWxzLmdldEN1cnJlbnRQbGF0Zm9ybUNvbmZpZ3VyYXRpb24oKTsKKwkJVVJMIGxvY2F0aW9uID0gY29uZmlndXJhdGlvbi5nZXRDb25maWd1cmF0aW9uTG9jYXRpb24oKTsKKwkJU3RyaW5nIGxvY2F0aW9uU3RyaW5nID0gbG9jYXRpb24uZ2V0RmlsZSgpOworCQlGaWxlIHBsYXRmb3JtQ29uZmlndXJhdGlvbiA9IG5ldyBGaWxlKGxvY2F0aW9uU3RyaW5nKTsKKwkJaWYgKCFwbGF0Zm9ybUNvbmZpZ3VyYXRpb24uaXNEaXJlY3RvcnkoKSkgcGxhdGZvcm1Db25maWd1cmF0aW9uID0gcGxhdGZvcm1Db25maWd1cmF0aW9uLmdldFBhcmVudEZpbGUoKTsKKwkJcmV0dXJuIG5ldyBGaWxlKHBsYXRmb3JtQ29uZmlndXJhdGlvbiwgRVJST1JfUkVDT1ZFUllfTE9HKTsKKwl9CisKKworCS8qKgorCSAqIE9wZW4gdGhlIGxvZworCSAqLworCXB1YmxpYyB2b2lkIG9wZW4oU3RyaW5nIGxvZ0VudHJ5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCWlmIChvcGVuKSB7CisJCQluYk9mT3BlbisrOwkJCQorCQkJVXBkYXRlQ29yZS53YXJuKCJPcGVuIG5lc3RlZCBFcnJvci9SZWNvdmVyeSBsb2cgIyIrbmJPZk9wZW4rIjoiK2xvZ0VudHJ5KTsJCQkJIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJcmV0dXJuOworCQl9CisJCQorCQlGaWxlIGxvZ0ZpbGUgPSBudWxsOwkJCisJCXRyeSB7CisJCQlsb2dGaWxlID0gZ2V0UmVjb3ZlcnlMb2dGaWxlKCk7CisJCQlvdXQgPSBuZXcgRmlsZVdyaXRlcihsb2dGaWxlKTsKKwkJCWluZGV4ID0gMDsKKwkJCXBhdGhzPW51bGw7CisJCQlvcGVuPXRydWU7CisJCQluYk9mT3Blbj0wOworCQkJVXBkYXRlQ29yZS53YXJuKCJTdGFydCBuZXcgRXJyb3IvUmVjb3ZlcnkgbG9nICMiK25iT2ZPcGVuKyI6Iitsb2dFbnRyeSk7CQkJCQkJCSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oCisJCQkJTkxTLmJpbmQoTWVzc2FnZXMuVXBkYXRlTWFuYWdlclV0aWxzX1VuYWJsZVRvTG9nLCAobmV3IE9iamVjdFtdIHsgbG9nRmlsZSB9KSksCisJCQkJZSk7CisJCX0KKwkJCisJCWFwcGVuZChsb2dFbnRyeSk7CisJfQorCisJLyoqCisJICogQXBwZW5kIHRoZSBzdHJpbmcgdG8gdGhlIGxvZyBhbmQgZmx1c2gKKwkgKi8KKwlwdWJsaWMgdm9pZCBhcHBlbmQoU3RyaW5nIGxvZ0VudHJ5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCUZpbGUgbG9nRmlsZSA9IG51bGw7CisJCXRyeSB7CisJCQlpZiAoIW9wZW4pIHsKKwkJCQlVcGRhdGVDb3JlLndhcm4oIkludGVybmFsIEVycm9yOiBUaGUgRXJyb3IvUmVjb3ZlcnkgbG9nIGlzIG5vdCBvcGVuOiIrbG9nRW50cnkpOwkJCQkgLy8kTk9OLU5MUy0xJAorCQkJCXJldHVybjsKKwkJCX0KKworCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoTE9HX0VOVFJZX0tFWSk7CisJCQlidWZmZXIuYXBwZW5kKGluZGV4KTsKKwkJCWJ1ZmZlci5hcHBlbmQoIj0iKTsgLy8kTk9OLU5MUy0xJAorCQkJYnVmZmVyLmFwcGVuZChsb2dFbnRyeSk7CisJCQlidWZmZXIuYXBwZW5kKFJFVFVSTl9DQVJSSUFHRSk7CisKKwkJCW91dC53cml0ZShidWZmZXIudG9TdHJpbmcoKSk7CisJCQlvdXQuZmx1c2goKTsKKwkJCWluZGV4Kys7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKAorCQkJCU5MUy5iaW5kKE1lc3NhZ2VzLlVwZGF0ZU1hbmFnZXJVdGlsc19VbmFibGVUb0xvZywgKG5ldyBPYmplY3RbXSB7IGxvZ0ZpbGUgfSkpLAorCQkJCWUpOworCQl9CisJfQorCisJLyoqCisJICogQXBwZW5kIHRoZSBzdHJpbmcgdG8gdGhlIGxvZyBhbmQgZmx1c2gKKwkgKi8KKwlwdWJsaWMgdm9pZCBhcHBlbmRQYXRoKFN0cmluZyBsb2dFbnRyeSwgU3RyaW5nIHBhdGgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJaWYgKHBhdGggPT0gbnVsbCkKKwkJCXJldHVybjsKKwkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIobG9nRW50cnkpOworCQlidWZmZXIuYXBwZW5kKCIgIik7IC8vJE5PTi1OTFMtMSQKKwkJYnVmZmVyLmFwcGVuZChwYXRoKTsKKwkJYXBwZW5kKGJ1ZmZlci50b1N0cmluZygpKTsKKwkJCisJCWFkZFBhdGgocGF0aCk7CisJfQorCisJLyoqCisJICogQ2xvc2UgYW55IG9wZW4gcmVjb3ZlcnkgbG9nCisJICovCisJcHVibGljIHZvaWQgY2xvc2UoU3RyaW5nIGxvZ0VudHJ5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCQorCQlpZiAobmJPZk9wZW4+MCl7CisJCQlVcGRhdGVDb3JlLndhcm4oIkNsb3NlIG5lc3RlZCBFcnJvci9SZWNvdmVyeSBsb2cgIyIrbmJPZk9wZW4rIjoiK2xvZ0VudHJ5KTsJCQkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQluYk9mT3Blbi0tOwkJCQorCQkJcmV0dXJuOworCQl9CQkJCisJCQorCQlVcGRhdGVDb3JlLndhcm4oIkNsb3NlIEVycm9yL1JlY292ZXJ5IGxvZyAjIituYk9mT3BlbisiOiIrbG9nRW50cnkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJYXBwZW5kKGxvZ0VudHJ5KTsKKwkJaWYgKG91dCAhPSBudWxsKSB7CisJCQl0cnkgeworCQkJCW91dC53cml0ZShFTkRfT0ZfRklMRSk7CisJCQkJb3V0LmZsdXNoKCk7CisJCQkJb3V0LmNsb3NlKCk7CisJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7IC8vZWF0IHRoZSBleGNlcHRpb24KKwkJCX0gZmluYWxseSB7CisJCQkJb3V0ID0gbnVsbDsKKwkJCQlvcGVuPWZhbHNlOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogRGVsZXRlIHRoZSBmaWxlIGZyb20gdGhlIGZpbGUgc3lzdGVtCisJICovCisJcHVibGljIHZvaWQgZGVsZXRlKCkgeworCQkvL0ZpbGUgbG9nRmlsZSA9IGdldFJlY292ZXJ5TG9nRmlsZSgpOworCQlnZXRSZWNvdmVyeUxvZ0ZpbGUoKTsKKwkJLy9pZiAobG9nRmlsZS5leGlzdHMoKSkKKwkJCS8vbG9nRmlsZS5kZWxldGUoKTsJCisJfQorCisJLyoqCisJICogCisJICovCisJcHJpdmF0ZSB2b2lkIGFkZFBhdGgoU3RyaW5nIHBhdGgpeworCQlpZiAocGF0aHM9PW51bGwpIHBhdGhzID0gbmV3IEFycmF5TGlzdCgpOworCQlwYXRocy5hZGQocGF0aCk7CisJfQorCQorCS8qCisJICogY3JlYXRlcyBhIFN0YXR1cworCSAqLworCXByaXZhdGUgSVN0YXR1cyBjcmVhdGVTdGF0dXMoaW50IHN0YXR1c1NldmVyaXR5LCBTdHJpbmcgbXNnLCBFeGNlcHRpb24gZSl7CisJCVN0cmluZyBpZCA9CisJCQlVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpOworCQorCQlTdHJpbmdCdWZmZXIgY29tcGxldGVTdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKCIiKTsgLy8kTk9OLU5MUy0xJAorCQlpZiAobXNnIT1udWxsKQorCQkJY29tcGxldGVTdHJpbmcuYXBwZW5kKG1zZyk7CisJCWlmIChlIT1udWxsKXsKKwkJCWNvbXBsZXRlU3RyaW5nLmFwcGVuZCgiXHJcblsiKTsgLy8kTk9OLU5MUy0xJAorCQkJY29tcGxldGVTdHJpbmcuYXBwZW5kKGUudG9TdHJpbmcoKSk7CisJCQljb21wbGV0ZVN0cmluZy5hcHBlbmQoIl1cclxuIik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlyZXR1cm4gbmV3IFN0YXR1cyhzdGF0dXNTZXZlcml0eSwgaWQsIElTdGF0dXMuT0ssIGNvbXBsZXRlU3RyaW5nLnRvU3RyaW5nKCksIGUpOworCX0JCisJCisJLyoqCisJICogcmV0dXJuIGEgbXVsdGkgc3RhdHVzLCAKKwkgKiB0aGUgY2hpbGRyZW4gYXJlIHRoZSBmaWxlIHRoYXQgY291bGRuJ3QgYmUgcmVtb3ZlZAorCSAqLworCXB1YmxpYyBJU3RhdHVzIHJlbW92ZUZyb21GaWxlU3lzdGVtKEZpbGUgZmlsZSkgeworCQkKKwkJSVN0YXR1cyBtYWluU3RhdHVzID0gY3JlYXRlU3RhdHVzKElTdGF0dXMuT0ssIiIsbnVsbCk7IC8vJE5PTi1OTFMtMSQKKwkJTXVsdGlTdGF0dXMgbXVsdGkgPSBuZXcgTXVsdGlTdGF0dXMobWFpblN0YXR1cy5nZXRQbHVnaW4oKSxtYWluU3RhdHVzLmdldENvZGUoKSwiIixudWxsKTsJCSAvLyROT04tTkxTLTEkCisJCQorCQlpZiAoIWZpbGUuZXhpc3RzKCkpeworCQkJbXVsdGkuYWRkKGNyZWF0ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLE1lc3NhZ2VzLkVycm9yUmVjb3ZlcnlMb2dfbm9GaWxldG9SZW1vdmUrZmlsZSxudWxsKSk7IAorCQkJcmV0dXJuIG11bHRpOworCQl9CisJCQkKKwkJaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgeworCQkJU3RyaW5nW10gZmlsZXMgPSBmaWxlLmxpc3QoKTsKKwkJCWlmIChmaWxlcyAhPSBudWxsKSAvLyBiZSBjYXJlZnVsIHNpbmNlIGZpbGUubGlzdCgpIGNhbiByZXR1cm4gbnVsbAorCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyArK2kpeworCQkJCQltdWx0aS5hZGRBbGwocmVtb3ZlRnJvbUZpbGVTeXN0ZW0obmV3IEZpbGUoZmlsZSwgZmlsZXNbaV0pKSk7CisJCQkJfQorCQl9CisJCQorCQlpZiAoIWZpbGUuZGVsZXRlKCkpIHsKKwkJCVN0cmluZyBtc2cgPSAiVW5hYmxlIHRvIHJlbW92ZSBmaWxlIiArZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsgLy8kTk9OLU5MUy0xJCAKKwkJCW11bHRpLmFkZChjcmVhdGVTdGF0dXMoSVN0YXR1cy5FUlJPUixtc2csbnVsbCkpOworCQl9CisJCXJldHVybiBtdWx0aTsKKwl9CQorCQorfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9FeHRlbmRlZFNpdGUuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvRXh0ZW5kZWRTaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAxMGJhYgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvRXh0ZW5kZWRTaXRlLmphdmEKQEAgLTAsMCArMSwxNTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JVVJMRW50cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuVmVyc2lvbmVkSWRlbnRpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwubW9kZWwuU2l0ZVdpdGhUaW1lc3RhbXA7CisKK3B1YmxpYyBjbGFzcyBFeHRlbmRlZFNpdGUgZXh0ZW5kcyBTaXRlV2l0aFRpbWVzdGFtcCAvKlNpdGUqLyB7CisJCisJcHJpdmF0ZSBib29sZWFuIGRpZ2VzdEV4aXN0OworCXByaXZhdGUgU3RyaW5nW10gYXZhaWxhYmxlTG9jYWxzOworCXByaXZhdGUgU3RyaW5nIGRpZ2VzdFVSTDsKKwlwcml2YXRlIExpdGVGZWF0dXJlW10gbGl0ZUZlYXR1cmVzOworCXByaXZhdGUgTGl0ZUZlYXR1cmVbXSBhbGxMaXRlRmVhdHVyZXM7CisJcHJpdmF0ZSBJVVJMRW50cnlbXSBhc3NvY2lhdGVTaXRlczsKKwlwcml2YXRlIGJvb2xlYW4gcGFjazIwMCA9IGZhbHNlOworCXByaXZhdGUgSVVSTEVudHJ5IHNlbGVjdGVkTWlycm9yOworCQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0RGlnZXN0VVJMKCkgeworCQlyZXR1cm4gZGlnZXN0VVJMOworCX0KKwlwdWJsaWMgdm9pZCBzZXREaWdlc3RVUkwoU3RyaW5nIGRpZ2VzdFVSTCkgeworCQl0aGlzLmRpZ2VzdFVSTCA9IGRpZ2VzdFVSTDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nW10gZ2V0QXZhaWxhYmxlTG9jYWxzKCkgeworCQlyZXR1cm4gYXZhaWxhYmxlTG9jYWxzOworCX0KKwlwdWJsaWMgdm9pZCBzZXRBdmFpbGFibGVMb2NhbHMoU3RyaW5nW10gYXZhaWxhYmxlTG9jYWxzKSB7CisJCXRoaXMuYXZhaWxhYmxlTG9jYWxzID0gYXZhaWxhYmxlTG9jYWxzOworCX0KKwlwdWJsaWMgYm9vbGVhbiBpc0RpZ2VzdEV4aXN0KCkgeworCQlyZXR1cm4gZGlnZXN0RXhpc3Q7CisJfQorCXB1YmxpYyB2b2lkIHNldERpZ2VzdEV4aXN0KGJvb2xlYW4gZGlnZXN0RXhpc3QpIHsKKwkJdGhpcy5kaWdlc3RFeGlzdCA9IGRpZ2VzdEV4aXN0OworCX0KKwlwdWJsaWMgTGl0ZUZlYXR1cmVbXSBnZXRMaXRlRmVhdHVyZXMoKSB7CisJCWlmIChnZXRDdXJyZW50Q29uZmlndXJlZFNpdGUoKSE9bnVsbCkKKwkJCXJldHVybiBmaWx0ZXJGZWF0dXJlcyhnZXROb25GaWx0ZXJlZExpdGVGZWF0dXJlcygpKTsKKwkJZWxzZSAKKwkJCXJldHVybiBnZXROb25GaWx0ZXJlZExpdGVGZWF0dXJlcygpOworCX0KKwlwdWJsaWMgdm9pZCBzZXRMaXRlRmVhdHVyZXMoTGl0ZUZlYXR1cmVbXSBsaXRlRmVhdHVyZXMpIHsKKwkJCisJCWlmICgobGl0ZUZlYXR1cmVzID09IG51bGwpIHx8IChsaXRlRmVhdHVyZXMubGVuZ3RoID09IDApKQorCQkJcmV0dXJuOworCQl0aGlzLmFsbExpdGVGZWF0dXJlcyA9IGxpdGVGZWF0dXJlczsKKwkJTGlzdCB0ZW1wID0gbmV3IEFycmF5TGlzdCgpOworCQlmb3IoaW50IGkgPSAwOyBpIDwgYWxsTGl0ZUZlYXR1cmVzLmxlbmd0aCA7IGkrKykgeworCQkJaWYgKGdldEZlYXR1cmVSZWZlcmVuY2UoYWxsTGl0ZUZlYXR1cmVzW2ldKSAhPSBudWxsKSB7CisJCQkJdGVtcC5hZGQoYWxsTGl0ZUZlYXR1cmVzW2ldKTsKKwkJCX0KKwkJfQorCQlpZiAoIXRlbXAuaXNFbXB0eSgpKSB7CisJCQl0aGlzLmxpdGVGZWF0dXJlcyA9IChMaXRlRmVhdHVyZVtdKXRlbXAudG9BcnJheSggbmV3IExpdGVGZWF0dXJlW3RlbXAuc2l6ZSgpXSk7CisJCX0KKwl9CisJCisJcHVibGljIExpdGVGZWF0dXJlIGdldExpdGVGZWF0dXJlKFZlcnNpb25lZElkZW50aWZpZXIgdmlkKSB7CisJCWlmIChhbGxMaXRlRmVhdHVyZXMgPT0gbnVsbCkKKwkJCXJldHVybiBudWxsOworCQkKKwkJZm9yKGludCBpID0gMDsgaSA8IGFsbExpdGVGZWF0dXJlcy5sZW5ndGggOyBpKyspIHsKKwkJCWlmICh2aWQuZXF1YWxzKGFsbExpdGVGZWF0dXJlc1tpXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkpKSB7CisJCQkJcmV0dXJuIGFsbExpdGVGZWF0dXJlc1tpXTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJcHVibGljIExpdGVGZWF0dXJlW10gZ2V0Tm9uRmlsdGVyZWRMaXRlRmVhdHVyZXMoKSB7CisJCXJldHVybiBsaXRlRmVhdHVyZXM7CisJfQorCXB1YmxpYyB2b2lkIHNldE5vbkZpbHRlcmVkTGl0ZUZlYXR1cmVzKExpdGVGZWF0dXJlW10gbGl0ZUZlYXR1cmVzKSB7CisJCXRoaXMubGl0ZUZlYXR1cmVzID0gbGl0ZUZlYXR1cmVzOworCX0KKwkKKwkKKwkvKioKKwkgKiBHZXQgd2hldGhlciBvciBub3QgdGhpcyBzaXRlIG1heSBjb250YWluIGphcnMgcGFja2VkIHdpdGggcGFjazIwMC4KKwkgKiBUaGUgcGFja2VkIHZlcnNpb24gb2YgZm9vLmphciwgaXMgZXhwZWN0ZWQgdG8gYmUgZm9vLmphci5wYWNrLmd6CisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzUGFjazIwMCgpIHsKKwkJcmV0dXJuIHBhY2syMDA7CisJfQorCQorCS8qKgorCSAqIFNldCB3aGV0aGVyIG9yIG5vdCB0aGlzIHNpdGUgbWF5IGNvbnRhaW4gamFycyBwYWNrZWQgd2l0aCBwYWNrMjAwCisJICogVGhlIHBhY2tlZCB2ZXJzaW9uIG9mIGZvby5qYXIgaXMgZXhwZWN0ZWQgdG8gYmUgZm9vLmphci5wYWNrLmd6CisJICogQHBhcmFtIHBhY2sKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTdXBwb3J0c1BhY2syMDAoYm9vbGVhbiBwYWNrKXsKKwkJcGFjazIwMCA9IHBhY2s7CisJfQorCQorCS8qCisJICogTWV0aG9kIGZpbHRlckZlYXR1cmVzLgorCSAqIEFsc28gaW1wbGVtZW50ZWQgaW4gRmVhdHVyZQorCSAqICAKKwkgKiBAcGFyYW0gbGlzdAorCSAqIEByZXR1cm4gTGlzdAorCSAqLworCXByaXZhdGUgTGl0ZUZlYXR1cmVbXSBmaWx0ZXJGZWF0dXJlcyhMaXRlRmVhdHVyZVtdIGFsbEluY2x1ZGVkKSB7CisJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKwkJaWYgKGFsbEluY2x1ZGVkIT1udWxsKXsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWxsSW5jbHVkZWQubGVuZ3RoOyBpKyspIHsKKwkJCQlMaXRlRmVhdHVyZSBpbmNsdWRlZCA9IGFsbEluY2x1ZGVkW2ldOworCQkJCWlmIChVcGRhdGVNYW5hZ2VyVXRpbHMuaXNWYWxpZEVudmlyb25tZW50KGluY2x1ZGVkKSkKKwkJCQkJbGlzdC5hZGQoaW5jbHVkZWQpOworCQkJCWVsc2V7CisJCQkJCWlmIChVcGRhdGVDb3JlLkRFQlVHICYmIFVwZGF0ZUNvcmUuREVCVUdfU0hPV19XQVJOSU5HUyl7CisJCQkJCQlVcGRhdGVDb3JlLndhcm4oIkZpbHRlcmVkIG91dCBmZWF0dXJlIHJlZmVyZW5jZToiK2luY2x1ZGVkKTsgLy8kTk9OLU5MUy0xJAorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCQorCQlMaXRlRmVhdHVyZVtdIHJlc3VsdCA9IG5ldyBMaXRlRmVhdHVyZVtsaXN0LnNpemUoKV07CisJCWlmICghbGlzdC5pc0VtcHR5KCkpeworCQkJbGlzdC50b0FycmF5KHJlc3VsdCk7CisJCX0KKwkJCisJCXJldHVybiByZXN1bHQ7CQorCX0KKwlwdWJsaWMgSVVSTEVudHJ5W10gZ2V0QXNzb2NpYXRlU2l0ZXMoKSB7CisJCXJldHVybiBhc3NvY2lhdGVTaXRlczsKKwl9CisJcHVibGljIHZvaWQgc2V0QXNzb2NpYXRlU2l0ZXMoSVVSTEVudHJ5W10gYXNzb2NpYXRlU2l0ZXMpIHsKKwkJdGhpcy5hc3NvY2lhdGVTaXRlcyA9IGFzc29jaWF0ZVNpdGVzOworCX0KKwkKKwlwdWJsaWMgSVVSTEVudHJ5IGdldFNlbGVjdGVkTWlycm9yKCkgeworCQlyZXR1cm4gc2VsZWN0ZWRNaXJyb3I7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldFNlbGVjdGVkTWlycm9yKElVUkxFbnRyeSBzZWxlY3RlZE1pcnJvcikgeworCQl0aGlzLnNlbGVjdGVkTWlycm9yID0gc2VsZWN0ZWRNaXJyb3I7CisJfQorCit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0V4dGVuZGVkU2l0ZVVSTEZhY3RvcnkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvRXh0ZW5kZWRTaXRlVVJMRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlYTM5ODEKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0V4dGVuZGVkU2l0ZVVSTEZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDI1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC5TaXRlTW9kZWw7CisKK3B1YmxpYyBjbGFzcyBFeHRlbmRlZFNpdGVVUkxGYWN0b3J5IGV4dGVuZHMgU2l0ZVVSTEZhY3RvcnkgeworCQorCXB1YmxpYyBTaXRlTW9kZWwgY3JlYXRlU2l0ZU1hcE1vZGVsKCkgeworCQlyZXR1cm4gbmV3IEV4dGVuZGVkU2l0ZSgpOworCX0KKworCQorICAgIC8vcHVibGljIFNpdGVGZWF0dXJlUmVmZXJlbmNlTW9kZWwgY3JlYXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsKCkgeworICAgIC8vICAgIHJldHVybiBuZXcgVXBkYXRlU2l0ZUxpdGVGZWF0dXJlUmVmZXJlbmNlKCk7CisgICAgLy99Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0ZhdGFsSU9FeGNlcHRpb24uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvRmF0YWxJT0V4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MmVlMDYKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0ZhdGFsSU9FeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDIxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitwdWJsaWMgY2xhc3MgRmF0YWxJT0V4Y2VwdGlvbiBleHRlbmRzIElPRXhjZXB0aW9uIHsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA3NjkwMzE4MDg3NTA1NDc5MDM5TDsKKworCXB1YmxpYyBGYXRhbElPRXhjZXB0aW9uKFN0cmluZyBzdHJpbmcpIHsKKwkJc3VwZXIoc3RyaW5nKTsKKwl9Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0ZlYXR1cmVDb250ZW50Q29uc3VtZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvRmVhdHVyZUNvbnRlbnRDb25zdW1lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3OGRlNjkKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0ZlYXR1cmVDb250ZW50Q29uc3VtZXIuamF2YQpAQCAtMCwwICsxLDI2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7CisKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuKjsKKworLyoqCisgKiBBIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZm9yIElGZWF0dXJlQ29udGVudENvbnN1bWVyCisgKiA8L3A+CisgKiBAc2luY2UgMi4wCisgKi8KKworcHVibGljIGFic3RyYWN0IGNsYXNzIEZlYXR1cmVDb250ZW50Q29uc3VtZXIgZXh0ZW5kcyBNb2RlbE9iamVjdAorCWltcGxlbWVudHMgSUZlYXR1cmVDb250ZW50Q29uc3VtZXIgeworCit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0ZlYXR1cmVEb3dubG9hZEV4Y2VwdGlvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9GZWF0dXJlRG93bmxvYWRFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWYxZDYxCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9GZWF0dXJlRG93bmxvYWRFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDM5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKKworLyoqCisgKiBFeGNlcHRpb24gdGhyb3duIHdoZW4gSU9FeGNlcHRpb24gZHVyaW5nIGRvd25sb2FkaW5nIGZlYXR1cmVzCisgKiAKKyAqIEBzaW5jZSAzLjAKKyAqLworcHVibGljIGNsYXNzIEZlYXR1cmVEb3dubG9hZEV4Y2VwdGlvbiBleHRlbmRzIENvcmVFeGNlcHRpb24geworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKyAgICAvKioKKwkgKiBDb25zdHJ1Y3QgdGhlIGV4Y2VwdGlvbiBpbmRpY2F0aW5nIGVuY2xvc2luZyBDb3JlRXhjZXB0aW9uCisJICogCisJICogQHNpbmNlIDMuMAorCSAqLworCXB1YmxpYyBGZWF0dXJlRG93bmxvYWRFeGNlcHRpb24oU3RyaW5nIG1zZywgRXhjZXB0aW9uIGUpIHsKKwkJc3VwZXIoCisJCQluZXcgU3RhdHVzKAorCQkJCUlTdGF0dXMuSU5GTywKKwkJCQkib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUiLCAvLyROT04tTkxTLTEkCisJCQkJSVN0YXR1cy5PSywKKwkJCQltc2csCisJCQkJZSkpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9GZWF0dXJlRW50cnlXcmFwcGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0ZlYXR1cmVFbnRyeVdyYXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTFlY2E1Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9GZWF0dXJlRW50cnlXcmFwcGVyLmphdmEKQEAgLTAsMCArMSw3NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2R1Y3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvbmZpZ3VyYXRvci5GZWF0dXJlRW50cnk7CitpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKKworLyoqCisgKiBDbGFzcyB1c2VkIHRvIHdyYXBwZXIgZmVhdHVyZSBlbnRyeSBvYmplY3RzLiBUaGlzIGNsYXNzIGlzIG5lY2Vzc2FyeQorICogdG8gcmVtb3ZlIHRoZSBkZXBlZGFuY3kgb2YgdGhlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Igb24gCisgKiB0aGUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIGJ1bmRsZS4KKyAqCisgKiBAc2luY2UgMy4yCisgKi8KK3B1YmxpYyBjbGFzcyBGZWF0dXJlRW50cnlXcmFwcGVyIGltcGxlbWVudHMgSVByb2R1Y3QgeworCisJcHJpdmF0ZSBGZWF0dXJlRW50cnkgZW50cnk7CisKKwkvKgorCSAqIENvbnN0cnVjdG9yIGZvciB0aGUgY2xhc3MuCisJICovCisJcHVibGljIEZlYXR1cmVFbnRyeVdyYXBwZXIoRmVhdHVyZUVudHJ5IGVudHJ5KSB7CisJCXN1cGVyKCk7CisJCXRoaXMuZW50cnkgPSBlbnRyeTsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2R1Y3QjZ2V0QXBwbGljYXRpb24oKQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0QXBwbGljYXRpb24oKSB7CisJCXJldHVybiBlbnRyeS5nZXRBcHBsaWNhdGlvbigpOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZHVjdCNnZXROYW1lKCkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiBlbnRyeS5nZXROYW1lKCk7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9kdWN0I2dldERlc2NyaXB0aW9uKCkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworCQlyZXR1cm4gZW50cnkuZ2V0RGVzY3JpcHRpb24oKTsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2R1Y3QjZ2V0SWQoKQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7CisJCXJldHVybiBlbnRyeS5nZXRJZCgpOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZHVjdCNnZXRQcm9wZXJ0eShqYXZhLmxhbmcuU3RyaW5nKQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkoU3RyaW5nIGtleSkgeworCQlyZXR1cm4gZW50cnkuZ2V0UHJvcGVydHkoa2V5KTsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2R1Y3QjZ2V0RGVmaW5pbmdCdW5kbGUoKQorCSAqLworCXB1YmxpYyBCdW5kbGUgZ2V0RGVmaW5pbmdCdW5kbGUoKSB7CisJCXJldHVybiBlbnRyeS5nZXREZWZpbmluZ0J1bmRsZSgpOworCX0KK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvRmVhdHVyZUV4ZWN1dGFibGVDb250ZW50Q29uc3VtZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvRmVhdHVyZUV4ZWN1dGFibGVDb250ZW50Q29uc3VtZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjI2ZDg3Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9GZWF0dXJlRXhlY3V0YWJsZUNvbnRlbnRDb25zdW1lci5qYXZhCkBAIC0wLDAgKzEsMTg4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7CisKKyAKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuQ29udGVudFJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JQ29udGVudENvbnN1bWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlQ29udGVudENvbnN1bWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklOb25QbHVnaW5FbnRyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JUGx1Z2luRW50cnk7CisKKy8qKgorICogQ29udGVudENvbnN1bWVyIEltcGxlbWVudGF0aW9uIGZvciBhIEZlYXR1cmVFeGVjdXRhYmxlCisgKi8KKworcHVibGljIGNsYXNzIEZlYXR1cmVFeGVjdXRhYmxlQ29udGVudENvbnN1bWVyIGV4dGVuZHMgRmVhdHVyZUNvbnRlbnRDb25zdW1lciB7CisKKwlwcml2YXRlIElGZWF0dXJlIGZlYXR1cmU7CisJcHJpdmF0ZSBib29sZWFuIGNsb3NlZD0gZmFsc2U7CisJcHJpdmF0ZSBib29sZWFuIGFib3J0ZWQ9IGZhbHNlOwkKKwlwcml2YXRlIElTaXRlQ29udGVudENvbnN1bWVyIGNvbnRlbnRDb25zdW1lcjsKKwlwcml2YXRlIElGZWF0dXJlQ29udGVudENvbnN1bWVyIHBhcmVudCA9IG51bGw7CisJcHJpdmF0ZSBMaXN0IC8qIG9mIElGZWF0dXJlQ29udGVudENPbnN1bWVyICovIGNoaWxkcmVuOworCisJLyoKKwkgKiBAc2VlIElDb250ZW50Q29uc3VtZXIjb3BlbihJTm9uUGx1Z2luRW50cnkpCisJICovCisJcHVibGljIElDb250ZW50Q29uc3VtZXIgb3BlbihJTm9uUGx1Z2luRW50cnkgbm9uUGx1Z2luRW50cnkpCisJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJQ29udGVudENvbnN1bWVyIGNvbnMgPSBuZXcgTm9uUGx1Z2luRW50cnlDb250ZW50Q29uc3VtZXIoCisJCQlnZXRDb250ZW50Q29uc3VtZXIoKS5vcGVuKG5vblBsdWdpbkVudHJ5KSk7CisJCXJldHVybiBjb25zOworCX0KKworCS8qCisJICogQHNlZSBJQ29udGVudENvbnN1bWVyI29wZW4oSVBsdWdpbkVudHJ5KQorCSAqLworCXB1YmxpYyBJQ29udGVudENvbnN1bWVyIG9wZW4oSVBsdWdpbkVudHJ5IHBsdWdpbkVudHJ5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCUNvbnRlbnRDb25zdW1lciBjb25zID0gbmV3IFBsdWdpbkVudHJ5Q29udGVudENvbnN1bWVyKGdldENvbnRlbnRDb25zdW1lcigpLm9wZW4ocGx1Z2luRW50cnkpKTsKKwkJcmV0dXJuIGNvbnM7CQkKKwl9CisKKwkvKgorCSAqIEBzZWUgSUNvbnRlbnRDb25zdW1lciNhZGRDaGlsZChJRmVhdHVyZSkKKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRDaGlsZChJRmVhdHVyZSBjaGlsZCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlJRmVhdHVyZUNvbnRlbnRDb25zdW1lciBjaGlsZENvbnN1bWVyID0gY2hpbGQuZ2V0RmVhdHVyZUNvbnRlbnRDb25zdW1lcigpOworCQljaGlsZENvbnN1bWVyLnNldFBhcmVudCh0aGlzKTsKKwkJaWYgKGNoaWxkcmVuPT1udWxsKSBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKKwkJY2hpbGRyZW4uYWRkKGNoaWxkQ29uc3VtZXIpOworCQlyZXR1cm47CisJfQorCisKKwkvKgorCSAqIEBzZWUgSUZlYXR1cmVDb250ZW50Q29uc3VtZXIjc3RvcmUoQ29udGVudFJlZmVyZW5jZSwgSVByb2dyZXNzTW9uaXRvcikKKwkgKi8KKwlwdWJsaWMgdm9pZCBzdG9yZShDb250ZW50UmVmZXJlbmNlIGNvbnRlbnRSZWZlcmVuY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKKwkJdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlnZXRDb250ZW50Q29uc3VtZXIoKS5zdG9yZShjb250ZW50UmVmZXJlbmNlLCBtb25pdG9yKTsKKwl9CisKKwkvKgorCSAqIEBzZWUgSUZlYXR1cmVDb250ZW50Q29uc3VtZXIjY2xvc2UoKQorCSAqLworCXB1YmxpYyBJRmVhdHVyZVJlZmVyZW5jZSBjbG9zZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJCisJCWlmICghY2xvc2VkICYmIGdldFBhcmVudCgpIT1udWxsKXsKKwkJCWNsb3NlZD10cnVlOworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJCisJCS8vIHBhcmVudCBjb25zdW1lciwgbG9nIHdlIGFyZSBhYm91dCB0byByZW5hbWUKKwkJLy8gbG9nIGZpbGVzIGhhdmUgYmVlbiBkb3dubG9hZGVkCisJCWlmIChnZXRQYXJlbnQoKT09bnVsbCl7CisJCQlFcnJvclJlY292ZXJ5TG9nLmdldExvZygpLmFwcGVuZChFcnJvclJlY292ZXJ5TG9nLkFMTF9JTlNUQUxMRUQpOworCQl9CisJCQorCQlJRmVhdHVyZVJlZmVyZW5jZSByZWY9IG51bGw7CisJCWlmIChjb250ZW50Q29uc3VtZXIgIT0gbnVsbCkKKwkJCXJlZiA9IGNvbnRlbnRDb25zdW1lci5jbG9zZSgpOworCQkKKwkJLy8gY2xvc2UgbmVzdGVkIGZlYXR1cmUKKwkJSUZlYXR1cmVDb250ZW50Q29uc3VtZXJbXSBjaGlsZHJlbiA9IGdldENoaWxkcmVuKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKKwkJCWNoaWxkcmVuW2ldLmNsb3NlKCk7CisJCX0KKwkJCQkJCQkKKwkJcmV0dXJuIHJlZjsKKwl9CisKKwkvKgorCSAqIEBzZWUgSUZlYXR1cmVDb250ZW50Q29uc3VtZXIjc2V0RmVhdHVyZShJRmVhdHVyZSkKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRGZWF0dXJlKElGZWF0dXJlIGZlYXR1cmUpIHsKKwkJdGhpcy5mZWF0dXJlPSBmZWF0dXJlOworCX0KKworCS8qCisJICogU2V0cyB0aGUgcGFyZW50IAorCSAqLworCXB1YmxpYyB2b2lkIHNldFBhcmVudChJRmVhdHVyZUNvbnRlbnRDb25zdW1lciBmZWF0dXJlQ29udGVudENvbnN1bWVyKSB7CisJCXRoaXMucGFyZW50PSBmZWF0dXJlQ29udGVudENvbnN1bWVyOworCX0KKworCS8qCisJICogcmV0dXJucyB0aGUgQ29udGVudCBDb25zdW1lciBmb3IgdGhlIGZlYXR1cmUKKwkgKiAKKwkgKiBSaWdodCBub3cgd2UgYXJlIHRoZSBvbmx5IG9uZSB0byBpbXBsZW1lbnQgU2l0ZUNvbnRlbnRDb25zdW1lcgorCSAqIE5lZWQgdG8gYmUgZXhwb3NlZCBhcyBBUEkgcG9zdCB2Mi4wCisJICovCisJcHJpdmF0ZSBJU2l0ZUNvbnRlbnRDb25zdW1lciBnZXRDb250ZW50Q29uc3VtZXIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCWlmIChjb250ZW50Q29uc3VtZXIgPT0gbnVsbCkKKwkJCWlmIChmZWF0dXJlLmdldFNpdGUoKSBpbnN0YW5jZW9mIFNpdGVGaWxlKSB7CisJCQkJU2l0ZUZpbGUgc2l0ZT0gKFNpdGVGaWxlKSBmZWF0dXJlLmdldFNpdGUoKTsKKwkJCQljb250ZW50Q29uc3VtZXI9IHNpdGUuY3JlYXRlU2l0ZUNvbnRlbnRDb25zdW1lcihmZWF0dXJlKTsKKwkJCX0gZWxzZSB7CisJCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJCQl9CisJCXJldHVybiBjb250ZW50Q29uc3VtZXI7CisJfQorCisJLyoKKwkgKiBAc2VlIElGZWF0dXJlQ29udGVudENvbnN1bWVyI2Fib3J0KCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBhYm9ydCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKworCQlpZiAoYWJvcnRlZCkgcmV0dXJuOworCQkKKwkJSUZlYXR1cmVDb250ZW50Q29uc3VtZXJbXSBjaGlsZHJlbiA9IGdldENoaWxkcmVuKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKKwkJCXRyeSB7CisJCQljaGlsZHJlbltpXS5hYm9ydCgpOworCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpeworCQkJCS8vZG8gTm90aGluZworCQkJfQorCQl9CisKKwkJLy8gZG8gbm90IGNsb3NlIHBsdWdpbiBhbmQgbm9uIHBsdWdpbiBjb250ZW50IGNvbnN1bWVyCisJCS8vIHRoZSBjb250ZW50Q29uc3VtZXIgd2lsbCBhYm9ydCB0aGVtCisJCS8vIHdlIGRvIG5vdCBuZWVkIHRvIGFib3J0IHRoZSBOb25QbHVnaW5FbnRyeUNvbnRlbnRDb25zdW1lciBhbmQgUGx1Z2luRW50cnlDb250ZW50Q29uc3VtZQorCisJCS8vaW1wbGVtZW50IHRoZSBjbGVhbnVwCisJCWlmIChjb250ZW50Q29uc3VtZXIhPW51bGwpCisJCQljb250ZW50Q29uc3VtZXIuYWJvcnQoKTsKKwkJCisJCWFib3J0ZWQgPSB0cnVlOworCX0KKworCS8qCisJICogQHNlZSBJRmVhdHVyZUNvbnRlbnRDb25zdW1lciNnZXRGZWF0dXJlKCkKKwkgKi8KKwlwdWJsaWMgSUZlYXR1cmUgZ2V0RmVhdHVyZSgpeworCQlyZXR1cm4gZmVhdHVyZTsKKwl9CisKKwkvKgorCSAqIEBzZWUgSUZlYXR1cmVDb250ZW50Q29uc3VtZXIjZ2V0UGFyZW50KCkKKwkgKi8KKwlwdWJsaWMgSUZlYXR1cmVDb250ZW50Q29uc3VtZXIgZ2V0UGFyZW50KCl7CisJCXJldHVybiBwYXJlbnQ7CisJfQorCisJLyoKKwkgKiBAc2VlIElGZWF0dXJlQ29udGVudENvbnN1bWVyI2dldENoaWxkcmVuKCkKKwkgKi8KKwlwdWJsaWMgSUZlYXR1cmVDb250ZW50Q29uc3VtZXJbXSBnZXRDaGlsZHJlbigpeworCQlpZiAoY2hpbGRyZW49PW51bGwgfHwgY2hpbGRyZW4uc2l6ZSgpID09IDApCisJCQlyZXR1cm4gbmV3IElGZWF0dXJlQ29udGVudENvbnN1bWVyWzBdOworCisJCXJldHVybiAoSUZlYXR1cmVDb250ZW50Q29uc3VtZXJbXSkgY2hpbGRyZW4udG9BcnJheShhcnJheVR5cGVGb3IoY2hpbGRyZW4pKTsKKwl9Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0ZlYXR1cmVFeGVjdXRhYmxlQ29udGVudFByb3ZpZGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0ZlYXR1cmVFeGVjdXRhYmxlQ29udGVudFByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJmNGM3MQotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvRmVhdHVyZUV4ZWN1dGFibGVDb250ZW50UHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDI2MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS5uZXQuKjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKKworLyoqCisgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIGEgRXhlY3V0YWJsZSBGZWF0dXJlIENvbnRlbnQgUHJvdmlkZXIKKyAqLworCitwdWJsaWMgY2xhc3MgRmVhdHVyZUV4ZWN1dGFibGVDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBGZWF0dXJlQ29udGVudFByb3ZpZGVyIHsKKworCS8qCisJICogQ29uc3RydWN0b3IgCisJICovCisJcHVibGljIEZlYXR1cmVFeGVjdXRhYmxlQ29udGVudFByb3ZpZGVyKFVSTCB1cmwpIHsKKwkJc3VwZXIodXJsKTsKKwl9CisKKwkvKgorCSAqIFJldHVybiB0aGUgcGF0aCBmb3IgYSBwbHVnaW5FbnRyeQorCSAqLworCXByaXZhdGUgU3RyaW5nIGdldFBhdGgoSVBsdWdpbkVudHJ5IHBsdWdpbkVudHJ5KQorCQl0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24geworCisJCS8vIGdldCB0aGUgVVJMIG9mIHRoZSBBcmNoaXZlIGZpbGUgdGhhdCBjb250YWlucyB0aGUgcGx1Z2luIGVudHJ5CisJCUlTaXRlQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0gZ2V0RmVhdHVyZSgpLmdldFNpdGUoKS5nZXRTaXRlQ29udGVudFByb3ZpZGVyKCk7CisJCVVSTCBmaWxlVVJMID0gcHJvdmlkZXIuZ2V0QXJjaGl2ZVJlZmVyZW5jZShnZXRQYXRoSUQocGx1Z2luRW50cnkpKTsKKwkJU3RyaW5nIHJlc3VsdCA9IGZpbGVVUkwuZ2V0RmlsZSgpOworCisJCWlmICghcmVzdWx0LmVuZHNXaXRoKCIuamFyIikgJiYgIXJlc3VsdC5lbmRzV2l0aCgiLyIpICYmICFyZXN1bHQuZW5kc1dpdGgoRmlsZS5zZXBhcmF0b3IpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCXJlc3VsdCArPSBGaWxlLnNlcGFyYXRvcjsKKwkJRmlsZSBwbHVnaW5QYXRoID0gbmV3IEZpbGUocmVzdWx0KTsKKwkJaWYgKCFwbHVnaW5QYXRoLmV4aXN0cygpKQorCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKAorCQkJCU5MUy5iaW5kKE1lc3NhZ2VzLkZlYXR1cmVFeGVjdXRhYmxlQ29udGVudFByb3ZpZGVyX0ZpbGVEb2VzTm90RXhpc3QsIChuZXcgU3RyaW5nW10geyByZXN1bHQgfSkpKTsKKworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qCisJICogUmV0dXJucyB0aGUgcGF0aCBmb3IgdGhlIEZlYXR1cmUKKwkgKi8KKwlwcml2YXRlIFN0cmluZyBnZXRGZWF0dXJlUGF0aCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCVN0cmluZyByZXN1bHQgPSBnZXRGZWF0dXJlKCkuZ2V0VVJMKCkuZ2V0RmlsZSgpOworCisJCS8vIHJldHVybiB0aGUgbGlzdCBvZiBhbGwgc3ViZGlyZWN0b3JpZXMKKwkJaWYgKCEocmVzdWx0LmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSB8fCByZXN1bHQuZW5kc1dpdGgoIi8iKSkpIC8vJE5PTi1OTFMtMSQKKwkJCXJlc3VsdCArPSBGaWxlLnNlcGFyYXRvcjsKKwkJRmlsZSBwbHVnaW5EaXIgPSBuZXcgRmlsZShyZXN1bHQpOworCQlpZiAoIXBsdWdpbkRpci5leGlzdHMoKSkKKwkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigKKwkJCQlOTFMuYmluZChNZXNzYWdlcy5GZWF0dXJlRXhlY3V0YWJsZUNvbnRlbnRQcm92aWRlcl9GaWxlRG9lc05vdEV4aXN0LCAobmV3IFN0cmluZ1tdIHsgcmVzdWx0IH0pKSk7CisKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKgorCSAqIFJldHVybnMgYWxsIHRoZSBmaWxlcyB1bmRlciB0aGUgZGlyZWN0b3J5CisJICogUmVjdXJzaXZlIGNhbGwKKwkgKi8KKwlwcml2YXRlIExpc3QgZ2V0RmlsZXMoRmlsZSBkaXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOworCisJCWlmICghZGlyLmlzRGlyZWN0b3J5KCkpIHsKKwkJCVN0cmluZyBtc2cgPQorCQkJCU5MUy5iaW5kKE1lc3NhZ2VzLkZlYXR1cmVFeGVjdXRhYmxlQ29udGVudFByb3ZpZGVyX0ludmFsaWREaXJlY3RvcnksIChuZXcgU3RyaW5nW10geyBkaXIuZ2V0QWJzb2x1dGVQYXRoKCkgfSkpOworCisJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24obXNnKTsKKworCQl9CisKKwkJRmlsZVtdIGZpbGVzID0gZGlyLmxpc3RGaWxlcygpOworCQlpZiAoZmlsZXMgIT0gbnVsbCkKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyArK2kpIHsKKwkJCQlpZiAoZmlsZXNbaV0uaXNEaXJlY3RvcnkoKSkgeworCQkJCQlyZXN1bHQuYWRkQWxsKGdldEZpbGVzKGZpbGVzW2ldKSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJcmVzdWx0LmFkZChmaWxlc1tpXSk7CisJCQkJfQorCQkJfQorCisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoKKwkgKiBAc2VlIElGZWF0dXJlQ29udGVudFByb3ZpZGVyI2dldFZlcmlmaWVyKCkKKwkgKi8KKwlwdWJsaWMgSVZlcmlmaWVyIGdldFZlcmlmaWVyKCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKgorCSAqIEBzZWUgSUZlYXR1cmVDb250ZW50UHJvdmlkZXIjZ2V0RmVhdHVyZU1hbmlmZXN0UmVmZXJlbmNlKCkKKwkgKi8KKwlwdWJsaWMgQ29udGVudFJlZmVyZW5jZSBnZXRGZWF0dXJlTWFuaWZlc3RSZWZlcmVuY2UoSW5zdGFsbE1vbml0b3IgbW9uaXRvcikKKwkJdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlDb250ZW50UmVmZXJlbmNlIHJlc3VsdCA9IG51bGw7CisJCXRyeSB7CisJCQlyZXN1bHQgPSBuZXcgQ29udGVudFJlZmVyZW5jZShGZWF0dXJlLkZFQVRVUkVfWE1MLCBuZXcgVVJMKGdldFVSTCgpLCBGZWF0dXJlLkZFQVRVUkVfWE1MKSk7CisKKwkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKAorCQkJCU5MUy5iaW5kKE1lc3NhZ2VzLkZlYXR1cmVFeGVjdXRhYmxlQ29udGVudFByb3ZpZGVyX1VuYWJsZVRvQ3JlYXRlVVJMRm9yLCAobmV3IFN0cmluZ1tdIHsgZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKSArICIgIiArIEZlYXR1cmUuRkVBVFVSRV9YTUwgfSkpLCAvLyROT04tTkxTLTEkCisJCQkJZSk7CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKgorCSAqIEBzZWUgSUZlYXR1cmVDb250ZW50UHJvdmlkZXIjZ2V0QXJjaGl2ZVJlZmVyZW5jZXMoKQorCSAqLworCXB1YmxpYyBDb250ZW50UmVmZXJlbmNlW10gZ2V0QXJjaGl2ZVJlZmVyZW5jZXMoSW5zdGFsbE1vbml0b3IgbW9uaXRvcikKKwkJdGhyb3dzIENvcmVFeGNlcHRpb24geworCQkvLyBleGVjdXRhYmxlIGZlYXR1cmUgZG9lcyBub3QgY29udGFpbiBhcmNoaXZlcworCQlyZXR1cm4gbmV3IENvbnRlbnRSZWZlcmVuY2VbMF07CisJfQorCisJLyoKKwkgKiBAc2VlIElGZWF0dXJlQ29udGVudFByb3ZpZGVyI2dldFBsdWdpbkVudHJ5QXJjaGl2ZVJlZmVyZW5jZXMoSVBsdWdpbkVudHJ5KQorCSAqLworCXB1YmxpYyBDb250ZW50UmVmZXJlbmNlW10gZ2V0UGx1Z2luRW50cnlBcmNoaXZlUmVmZXJlbmNlcygKKwkJSVBsdWdpbkVudHJ5IHBsdWdpbkVudHJ5LAorCQlJbnN0YWxsTW9uaXRvciBtb25pdG9yKQorCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCUNvbnRlbnRSZWZlcmVuY2VbXSByZXN1bHQgPSBuZXcgQ29udGVudFJlZmVyZW5jZVsxXTsKKwkJU3RyaW5nIGFyY2hpdmVJRCA9IGdldFBhdGhJRChwbHVnaW5FbnRyeSk7CisJCXRyeSB7CisJCQlGaWxlIGFyY2hpdmVGaWxlID0gbmV3IEZpbGUoZ2V0UGF0aChwbHVnaW5FbnRyeSkpOworCQkJaWYoIWFyY2hpdmVGaWxlLmlzRGlyZWN0b3J5KCkgJiYgYXJjaGl2ZUZpbGUuZ2V0TmFtZSgpLmVuZHNXaXRoKCIuamFyIikpeyAvLyROT04tTkxTLTEkCisJCQkJcmVzdWx0WzBdID0gbmV3IEphckNvbnRlbnRSZWZlcmVuY2UoYXJjaGl2ZUlELCBhcmNoaXZlRmlsZSk7CQkJCQorCQkJfSBlbHNlIHsKKwkJCQlyZXN1bHRbMF0gPQorCQkJCQluZXcgQ29udGVudFJlZmVyZW5jZShhcmNoaXZlSUQsIGFyY2hpdmVGaWxlKTsKKwkJCX0KKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oCisJCQkJCU5MUy5iaW5kKE1lc3NhZ2VzLkZlYXR1cmVFeGVjdXRhYmxlQ29udGVudFByb3ZpZGVyX1VuYWJsZVRvUmV0cmlldmVQbHVnaW5FbnRyeSwgKG5ldyBTdHJpbmdbXSB7IHBsdWdpbkVudHJ5LmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpIH0pKSwKKwkJCQkJZSk7CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKgorCSAqIEBzZWUgSUZlYXR1cmVDb250ZW50UHJvdmlkZXIjZ2V0Tm9uUGx1Z2luRW50cnlBcmNoaXZlUmVmZXJlbmNlcyhJTm9uUGx1Z2luRW50cnkpCisJICovCisJcHVibGljIENvbnRlbnRSZWZlcmVuY2VbXSBnZXROb25QbHVnaW5FbnRyeUFyY2hpdmVSZWZlcmVuY2VzKAorCQlJTm9uUGx1Z2luRW50cnkgbm9uUGx1Z2luRW50cnksCisJCUluc3RhbGxNb25pdG9yIG1vbml0b3IpCisJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKKworCQlDb250ZW50UmVmZXJlbmNlW10gcmVzdWx0ID0gbmV3IENvbnRlbnRSZWZlcmVuY2VbMV07CisJCVVSTCBmaWxlVVJMOworCisJCS8vdHJ5IHsKKwkJLy8gZ2V0IHRoZSBVUkwgb2YgdGhlIEFyY2hpdmUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBwbHVnaW4gZW50cnkKKwkJSVNpdGVDb250ZW50UHJvdmlkZXIgcHJvdmlkZXIgPSBnZXRGZWF0dXJlKCkuZ2V0U2l0ZSgpLmdldFNpdGVDb250ZW50UHJvdmlkZXIoKTsKKwkJZmlsZVVSTCA9IHByb3ZpZGVyLmdldEFyY2hpdmVSZWZlcmVuY2UoZ2V0UGF0aElEKG5vblBsdWdpbkVudHJ5KSk7CisKKwkJU3RyaW5nIGZpbGVTdHJpbmcgPSBmaWxlVVJMLmdldEZpbGUoKTsKKwkJRmlsZSBub25QbHVnaW5EYXRhID0gbmV3IEZpbGUoZmlsZVN0cmluZyk7CisJCWlmICghbm9uUGx1Z2luRGF0YS5leGlzdHMoKSkKKwkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKAorCQkJCU5MUy5iaW5kKE1lc3NhZ2VzLkZlYXR1cmVFeGVjdXRhYmxlQ29udGVudFByb3ZpZGVyX0ZpbGVEb2VzTm90RXhpc3QsIChuZXcgU3RyaW5nW10geyBmaWxlU3RyaW5nIH0pKSwgCisJCQkJbnVsbCk7IAorCisJCXRyeSB7CisJCQlyZXN1bHRbMF0gPQorCQkJCW5ldyBDb250ZW50UmVmZXJlbmNlKG5vblBsdWdpbkVudHJ5LmdldElkZW50aWZpZXIoKSwgbm9uUGx1Z2luRGF0YS50b1VSTCgpKTsKKwkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKAorCQkJCU5MUy5iaW5kKE1lc3NhZ2VzLkZlYXR1cmVFeGVjdXRhYmxlQ29udGVudFByb3ZpZGVyX1VuYWJsZVRvUmV0cmlldmVOb25QbHVnaW5FbnRyeSwgKG5ldyBTdHJpbmdbXSB7IG5vblBsdWdpbkVudHJ5LmdldElkZW50aWZpZXIoKS50b1N0cmluZygpIH0pKSwKKwkJCQllKTsKKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qCisJICogQHNlZSBJRmVhdHVyZUNvbnRlbnRQcm92aWRlciNnZXRGZWF0dXJlRW50cnlBcmNoaXZlUmVmZXJlbmNlcygpCisJICovCisJcHVibGljIENvbnRlbnRSZWZlcmVuY2VbXSBnZXRGZWF0dXJlRW50cnlBcmNoaXZlUmVmZXJlbmNlcyhJbnN0YWxsTW9uaXRvciBtb25pdG9yKQorCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCUNvbnRlbnRSZWZlcmVuY2VbXSBjb250ZW50UmVmZXJlbmNlcyA9IG5ldyBDb250ZW50UmVmZXJlbmNlWzFdOworCQljb250ZW50UmVmZXJlbmNlc1swXSA9IG5ldyBDb250ZW50UmVmZXJlbmNlKG51bGwsIGdldFVSTCgpKTsKKwkJcmV0dXJuIGNvbnRlbnRSZWZlcmVuY2VzOworCX0KKworCS8qCisJICogQHNlZSBJRmVhdHVyZUNvbnRlbnRQcm92aWRlciNnZXRGZWF0dXJlRW50cnlBcmNoaXZlc0NvbnRlbnRSZWZlcmVuY2VzKCkKKwkgKi8KKwlwdWJsaWMgQ29udGVudFJlZmVyZW5jZVtdIGdldEZlYXR1cmVFbnRyeUNvbnRlbnRSZWZlcmVuY2VzKEluc3RhbGxNb25pdG9yIG1vbml0b3IpCisJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJQ29udGVudFJlZmVyZW5jZVtdIHJlc3VsdCA9IG5ldyBDb250ZW50UmVmZXJlbmNlWzBdOworCQl0cnkgeworCQkJRmlsZSBmZWF0dXJlRGlyID0gbmV3IEZpbGUoZ2V0RmVhdHVyZVBhdGgoKSk7CisJCQlMaXN0IGZpbGVzID0gZ2V0RmlsZXMoZmVhdHVyZURpcik7CisJCQlyZXN1bHQgPSBuZXcgQ29udGVudFJlZmVyZW5jZVtmaWxlcy5zaXplKCldOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspIHsKKwkJCQlGaWxlIGN1cnJlbnRGaWxlID0gKEZpbGUpIGZpbGVzLmdldChpKTsKKwkJCQlyZXN1bHRbaV0gPSBuZXcgQ29udGVudFJlZmVyZW5jZShjdXJyZW50RmlsZS5nZXROYW1lKCksIGN1cnJlbnRGaWxlLnRvVVJMKCkpOworCQkJfQorCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbigKKwkJCQlOTFMuYmluZChNZXNzYWdlcy5GZWF0dXJlRXhlY3V0YWJsZUNvbnRlbnRQcm92aWRlcl9VbmFibGVUb1JldHJpZXZlRmVhdHVyZUVudHJ5LCAobmV3IFN0cmluZ1tdIHsgZ2V0RmVhdHVyZSgpLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpIH0pKSwKKwkJCQllKTsKKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qCisJICogQHNlZSBJRmVhdHVyZUNvbnRlbnRQcm92aWRlciNnZXRQbHVnaW5FbnRyeUNvbnRlbnRSZWZlcmVuY2VzKElQbHVnaW5FbnRyeSkKKwkgKi8KKwlwdWJsaWMgQ29udGVudFJlZmVyZW5jZVtdIGdldFBsdWdpbkVudHJ5Q29udGVudFJlZmVyZW5jZXMoCisJCUlQbHVnaW5FbnRyeSBwbHVnaW5FbnRyeSwKKwkJSW5zdGFsbE1vbml0b3IgbW9uaXRvcikKKwkJdGhyb3dzIENvcmVFeGNlcHRpb24geworCisJCUNvbnRlbnRSZWZlcmVuY2VbXSByZWZlcmVuY2VzID0gZ2V0UGx1Z2luRW50cnlBcmNoaXZlUmVmZXJlbmNlcyhwbHVnaW5FbnRyeSwgbW9uaXRvcik7CisJCUNvbnRlbnRSZWZlcmVuY2VbXSByZXN1bHQgPSBuZXcgQ29udGVudFJlZmVyZW5jZVswXTsKKworCQl0cnkgeworCQkJaWYgKHJlZmVyZW5jZXNbMF0gaW5zdGFuY2VvZiBKYXJDb250ZW50UmVmZXJlbmNlKSB7CisJCQkJcmVzdWx0ID0gKChKYXJDb250ZW50UmVmZXJlbmNlKXJlZmVyZW5jZXNbMF0pLnBlZWsobnVsbCwgbW9uaXRvcik7CisJCQl9IGVsc2UgeworCQkJCS8vIHJldHVybiB0aGUgbGlzdCBvZiBhbGwgc3ViZGlyZWN0b3JpZXMKKwkJCQlGaWxlIHBsdWdpbkRpciA9IG5ldyBGaWxlKGdldFBhdGgocGx1Z2luRW50cnkpKTsKKwkJCQlVUkwgcGx1Z2luVVJMID0gcGx1Z2luRGlyLnRvVVJMKCk7CisJCQkJTGlzdCBmaWxlcyA9IGdldEZpbGVzKHBsdWdpbkRpcik7CisJCQkJcmVzdWx0ID0gbmV3IENvbnRlbnRSZWZlcmVuY2VbZmlsZXMuc2l6ZSgpXTsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykgeworCQkJCQlGaWxlIGN1cnJlbnRGaWxlID0gKEZpbGUpIGZpbGVzLmdldChpKTsKKwkJCQkJU3RyaW5nIHJlbGF0aXZlU3RyaW5nID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTEFzU3RyaW5nKHBsdWdpblVSTCwgY3VycmVudEZpbGUudG9VUkwoKSk7CisJCQkJCXJlc3VsdFtpXSA9IG5ldyBDb250ZW50UmVmZXJlbmNlKHJlbGF0aXZlU3RyaW5nLCBjdXJyZW50RmlsZS50b1VSTCgpKTsKKwkJCQl9CisJCQl9CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKAorCQkJCU1lc3NhZ2VzLkZlYXR1cmVFeGVjdXRhYmxlQ29udGVudFByb3ZpZGVyX1VuYWJsZVRvUmV0cml2ZUFyY2hpdmVDb250ZW50UmVmCisJCQkJCSsgcGx1Z2luRW50cnkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCksCisJCQkJZSk7CisJCX0KKwkJCisJCS8vWzIwODY2XSB3ZSBkaWQgbm90IHByZXNlcnZlIGV4ZWN1dGFibGUgYml0CisJCXZhbGlkYXRlUGVybWlzc2lvbnMocmVzdWx0KTsKKwkJCisJCXJldHVybiByZXN1bHQ7CisJfQorfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9GZWF0dXJlRXhlY3V0YWJsZUZhY3RvcnkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvRmVhdHVyZUV4ZWN1dGFibGVGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTcwYTY4OAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvRmVhdHVyZUV4ZWN1dGFibGVGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwxMzIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuQmFzZUZlYXR1cmVGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmVDb250ZW50Q29uc3VtZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmVDb250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVNpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuVXRpbGl0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLkZlYXR1cmVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5jb25uZWN0aW9uLkNvbm5lY3Rpb25GYWN0b3J5OworCisvKioKKyAqIEZlYXR1cmVGYWN0b3J5IGZvciBFeGVjdXRhYmxlIEZlYXR1cmVzCisgKi8KK3B1YmxpYyBjbGFzcyBGZWF0dXJlRXhlY3V0YWJsZUZhY3RvcnkgZXh0ZW5kcyBCYXNlRmVhdHVyZUZhY3RvcnkgeworCisJLyoKKwkgKiBAc2VlIElGZWF0dXJlRmFjdG9yeSNjcmVhdGVGZWF0dXJlKFVSTCxJU2l0ZSxJUHJvZ3Jlc3NNb25pdG9yKQorCSAqLworCXB1YmxpYyBJRmVhdHVyZSBjcmVhdGVGZWF0dXJlKFVSTCB1cmwsIElTaXRlIHNpdGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCisJCVRhcmdldEZlYXR1cmUgZmVhdHVyZSA9IG51bGw7CisJCUlucHV0U3RyZWFtIGZlYXR1cmVTdHJlYW0gPSBudWxsOworCQlpZiAobW9uaXRvciA9PSBudWxsKQorCQkJbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7CisKKwkJaWYgKHVybCA9PSBudWxsKQorCQkJcmV0dXJuIGNyZWF0ZUZlYXR1cmUoc2l0ZSk7CisKKwkJLy8gdGhlIFVSTCBzaG91bGQgcG9pbnQgdG8gYSBkaXJlY3RvcnkKKwkJdXJsID0gdmFsaWRhdGUodXJsKTsKKworCQl0cnkgeworCQkJSUZlYXR1cmVDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyID0gbmV3IEZlYXR1cmVFeGVjdXRhYmxlQ29udGVudFByb3ZpZGVyKHVybCk7CisvLwkJCS8vIFBFUkY6IERvIG5vdCBjcmVhdGUgRmVhdHVyZUNvbnRlbnRDb25zdW1lcgorLy8gYnVnIDc5ODkzCisJCQlJRmVhdHVyZUNvbnRlbnRDb25zdW1lciBjb250ZW50Q29uc3VtZXIgPW5ldyBGZWF0dXJlRXhlY3V0YWJsZUNvbnRlbnRDb25zdW1lcigpOworCisJCQlVUkwgbm9uUmVzb2x2ZWRVUkwgPSBjb250ZW50UHJvdmlkZXIuZ2V0RmVhdHVyZU1hbmlmZXN0UmVmZXJlbmNlKG51bGwpLmFzVVJMKCk7CisJCQlVUkwgcmVzb2x2ZWRVUkwgPSBVUkxFbmNvZGVyLmVuY29kZShub25SZXNvbHZlZFVSTCk7CisJCQlmZWF0dXJlU3RyZWFtID0gQ29ubmVjdGlvbkZhY3RvcnkuZ2V0KHJlc29sdmVkVVJMKS5nZXRJbnB1dFN0cmVhbSgpOworCisJCQlmZWF0dXJlID0gKFRhcmdldEZlYXR1cmUpIHRoaXMucGFyc2VGZWF0dXJlKGZlYXR1cmVTdHJlYW0sIHJlc29sdmVkVVJMLnRvRXh0ZXJuYWxGb3JtKCkpOworCQkJbW9uaXRvci53b3JrZWQoMSk7CisJCQlmZWF0dXJlLnNldFNpdGUoc2l0ZSk7CisKKwkJCWZlYXR1cmUuc2V0RmVhdHVyZUNvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOworLy8JCQkvLyBQRVJGOiBGZWF0dXJlQ29udGVudENvbnN1bWVyCisvLyBidWcgNzk4OTMKKwkJCWZlYXR1cmUuc2V0Q29udGVudENvbnN1bWVyKGNvbnRlbnRDb25zdW1lcik7CisKKwkJCWZlYXR1cmUucmVzb2x2ZSh1cmwsIHVybCk7CisJCQlmZWF0dXJlLm1hcmtSZWFkT25seSgpOworCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IGU7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5GZWF0dXJlRmFjdG9yeV9DcmVhdGluZ0Vycm9yLCAobmV3IFN0cmluZ1tdIHsgdXJsLnRvRXh0ZXJuYWxGb3JtKCkgfSkpLCBlKTsKKwkJfSBmaW5hbGx5IHsKKwkJCXRyeSB7CisJCQkJaWYgKGZlYXR1cmVTdHJlYW0gIT0gbnVsbCkKKwkJCQkJZmVhdHVyZVN0cmVhbS5jbG9zZSgpOworCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJfQorCQl9CisJCXJldHVybiBmZWF0dXJlOworCX0KKworCS8qCisJICogQHNlZSBGZWF0dXJlTW9kZWxGYWN0b3J5I2NyZWF0ZUZlYXR1cmVNb2RlbCgpCisJICovCisJcHVibGljIEZlYXR1cmVNb2RlbCBjcmVhdGVGZWF0dXJlTW9kZWwoKSB7CisJCXJldHVybiBuZXcgVGFyZ2V0RmVhdHVyZSgpOworCX0KKworCS8qCisJICogQ3JlYXRlcyBhbiBlbXB0eSBmZWF0dXJlIG9uIHRoZSBzaXRlIAorCSAqLworCXByaXZhdGUgSUZlYXR1cmUgY3JlYXRlRmVhdHVyZShJU2l0ZSBzaXRlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCVRhcmdldEZlYXR1cmUgZmVhdHVyZSA9IG51bGw7CisKKwkJSUZlYXR1cmVDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyID0gbmV3IEZlYXR1cmVFeGVjdXRhYmxlQ29udGVudFByb3ZpZGVyKG51bGwpOworCQlJRmVhdHVyZUNvbnRlbnRDb25zdW1lciBjb250ZW50Q29uc3VtZXIgPSBuZXcgRmVhdHVyZUV4ZWN1dGFibGVDb250ZW50Q29uc3VtZXIoKTsKKwkJZmVhdHVyZSA9IChUYXJnZXRGZWF0dXJlKSBjcmVhdGVGZWF0dXJlTW9kZWwoKTsKKwkJZmVhdHVyZS5zZXRTaXRlKHNpdGUpOworCQlmZWF0dXJlLnNldEZlYXR1cmVDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKKwkJZmVhdHVyZS5zZXRDb250ZW50Q29uc3VtZXIoY29udGVudENvbnN1bWVyKTsKKworCQkvLyBkbyBub3QgbWFyayByZWFkIG9ubHkgeWV0Li4uCQorCQlyZXR1cm4gZmVhdHVyZTsKKwl9CisKKwkvKgorCSAqIHZhbGlkYXRlcyBhIFVSTCBhcyBhIGRpcmVjdG9yeSBVUkwKKwkgKi8KKwlwcml2YXRlIFVSTCB2YWxpZGF0ZShVUkwgdXJsKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisKKwkJaWYgKHVybCA9PSBudWxsKQorCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oTWVzc2FnZXMuRmVhdHVyZUV4ZWN1dGFibGVGYWN0b3J5X051bGxVUkwsIG51bGwpOyAKKworCQlpZiAoISh1cmwuZ2V0RmlsZSgpLmVuZHNXaXRoKCIvIikgfHwgdXJsLmdldEZpbGUoKS5lbmRzV2l0aChGaWxlLnNlcGFyYXRvcikgfHwgdXJsLmdldEZpbGUoKS5lbmRzV2l0aChGZWF0dXJlLkZFQVRVUkVfWE1MKSkpIHsgLy8kTk9OLU5MUy0xJAorCQkJdHJ5IHsKKwkJCQlTdHJpbmcgcGF0aCA9IHVybC5nZXRGaWxlKCkgKyAiLyI7IC8vJE5PTi1OTFMtMSQKKwkJCQl1cmwgPSBuZXcgVVJMKHVybC5nZXRQcm90b2NvbCgpLCB1cmwuZ2V0SG9zdCgpLCB1cmwuZ2V0UG9ydCgpLCBwYXRoKTsKKwkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisJCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oTkxTLmJpbmQoTWVzc2FnZXMuRmVhdHVyZUV4ZWN1dGFibGVGYWN0b3J5X0Nhbm5vdENyZWF0ZVVSTCwgKG5ldyBTdHJpbmdbXSB7IHVybC50b0V4dGVybmFsRm9ybSgpIH0pKSwgZSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHVybDsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvRmVhdHVyZVBhY2thZ2VkQ29udGVudFByb3ZpZGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0ZlYXR1cmVQYWNrYWdlZENvbnRlbnRQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzZmMxODAKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0ZlYXR1cmVQYWNrYWdlZENvbnRlbnRQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsNDY2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5GZWF0dXJlQ29udGVudFByb3ZpZGVyOworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNpZ25lZGNvbnRlbnQuU2lnbmVkQ29udGVudEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5qYXJwcm9jZXNzb3IuSmFyUHJvY2Vzc29yOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5qYXJwcm9jZXNzb3IuVXRpbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnNlY3VyaXR5LkphclZlcmlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC52ZXJpZmllci5DZXJ0VmVyaWZpZXI7CisKKy8qKgorICogQ29udGVudCBQcm92aWRlciBvZiBhIEZlYXR1cmUgUGFja2FnZQorICovCitwdWJsaWMgY2xhc3MgRmVhdHVyZVBhY2thZ2VkQ29udGVudFByb3ZpZGVyIGV4dGVuZHMgRmVhdHVyZUNvbnRlbnRQcm92aWRlciB7CisKKwlwcml2YXRlIENvbnRlbnRSZWZlcmVuY2UgbG9jYWxNYW5pZmVzdCA9IG51bGw7CisJcHJpdmF0ZSBDb250ZW50UmVmZXJlbmNlW10gbG9jYWxGZWF0dXJlRmlsZXMgPSBuZXcgQ29udGVudFJlZmVyZW5jZVswXTsKKwlwcml2YXRlIElWZXJpZmllciBqYXJWZXJpZmllciA9IG51bGw7CisJcHJpdmF0ZSBFeHRlbmRlZFNpdGUgc2l0ZU1vZGVsID0gbnVsbDsKKwlwcml2YXRlIGJvb2xlYW4gY29udGludWVPbkVycm9yOworCS8qCisJICogZmlsdGVyIGZvciBmaWxlIHdpdGggLmphcgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgRmlsZW5hbWVGaWx0ZXIgZmlsdGVyID0gbmV3IEZpbGVuYW1lRmlsdGVyKCkgeworCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBkaXIsIFN0cmluZyBuYW1lKSB7CisJCQlyZXR1cm4gbmFtZS5lbmRzV2l0aChGZWF0dXJlQ29udGVudFByb3ZpZGVyLkpBUl9FWFRFTlNJT04pOworCQl9CisJfTsKKworCS8qCisJICogQ29uc3RydWN0b3IKKwkgKi8KKwlwdWJsaWMgRmVhdHVyZVBhY2thZ2VkQ29udGVudFByb3ZpZGVyKFVSTCB1cmwsIElTaXRlIHNpdGUpIHsKKwkJc3VwZXIodXJsKTsKKwkJaWYgKHNpdGUgaW5zdGFuY2VvZiBFeHRlbmRlZFNpdGUpIHsKKwkJCXRoaXMuc2l0ZU1vZGVsID0gKEV4dGVuZGVkU2l0ZSkgc2l0ZTsKKwkJfQorCX0KKwkKKwkvKgorCSAqIFJldHVybnMgYSBuZXcgdmVyaWZpZXIgZm9yIGVhY2ggdG9wLWxldmVsIGluc3RhbGwKKwkgKiAoaWYgdGhlIHZlcmlmaWVyIGhhcyBhIHBhcmVudCwgcmV0dXJuIHRoZSB2ZXJpZmllcgorCSAqIG90aGVyd2lzZSByZWluaXRpYWxpemUpCisJICovCisJcHVibGljIElWZXJpZmllciBnZXRWZXJpZmllcigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJU2lnbmVkQ29udGVudEZhY3RvcnkgZmFjdG9yeSA9IFVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0U2lnbmVkQ29udGVudEZhY3RvcnkoKTsKKwkJaWYgKGphclZlcmlmaWVyID09IG51bGwgfHwgamFyVmVyaWZpZXIuZ2V0UGFyZW50KCkgPT0gbnVsbCkgeworCQkJaWYgKGZhY3RvcnkgIT0gbnVsbCkKKwkJCQlqYXJWZXJpZmllciA9IG5ldyBDZXJ0VmVyaWZpZXIoVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXRTaWduZWRDb250ZW50RmFjdG9yeSgpKTsKKwkJCWVsc2UKKwkJCQlqYXJWZXJpZmllciA9IG5ldyBKYXJWZXJpZmllcigpOworCQkJcmV0dXJuIGphclZlcmlmaWVyOworCQl9CisKKwkJLy8gcmUtaW5pdCB3aWxsIGJlIGRvbmUgaWYgdGhlIHBhcmVudCBjaGFuZ2VzCisJCXJldHVybiBqYXJWZXJpZmllcjsKKwl9CisKKwkvKgorCSAqIEBzZWUgSUZlYXR1cmVDb250ZW50UHJvdmlkZXIjZ2V0RmVhdHVyZU1hbmlmZXN0UmVmZXJlbmNlKCkKKwkgKi8KKwlwdWJsaWMgQ29udGVudFJlZmVyZW5jZSBnZXRGZWF0dXJlTWFuaWZlc3RSZWZlcmVuY2UoSW5zdGFsbE1vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCisJCS8vIGNoZWNrIHRvIHNlZSBpZiB3ZSBhbHJlYWR5IGhhdmUgbG9jYWwgY29weSBvZiB0aGUgbWFuaWZlc3QKKwkJaWYgKGxvY2FsTWFuaWZlc3QgIT0gbnVsbCkKKwkJCXJldHVybiBsb2NhbE1hbmlmZXN0OworCQlDb250ZW50UmVmZXJlbmNlW10gZmVhdHVyZUFyY2hpdmVSZWZlcmVuY2UgPSBnZXRGZWF0dXJlRW50cnlBcmNoaXZlUmVmZXJlbmNlcyhtb25pdG9yKTsKKwkJSmFyQ29udGVudFJlZmVyZW5jZSBmZWF0dXJlSmFyUmVmZXJlbmNlID0gbnVsbDsKKwkJdHJ5IHsKKworCQkJLy8gZm9yY2UgZmVhdHVyZSBhcmNoaXZlIHRvIGxvY2FsLgorCQkJLy8gVGhpcyBjb250ZW50IHByb3ZpZGVyIGFsd2F5cyBhc3N1bWVzIGV4YWN0bHkgMSBhcmNoaXZlIGZpbGUgKGluZGV4IFswXSkJCQorCQkJZmVhdHVyZUphclJlZmVyZW5jZSA9IChKYXJDb250ZW50UmVmZXJlbmNlKSBhc0xvY2FsUmVmZXJlbmNlKGZlYXR1cmVBcmNoaXZlUmVmZXJlbmNlWzBdLCBudWxsKTsKKwkJCS8vIHdlIG5lZWQgdG8gdW5wYWNrIGFyY2hpdmUgbG9jYWxseSBmb3IgVUkgYnJvd3NlciByZWZlcmVuY2VzIHRvIGJlIHJlc29sdmVkIGNvcnJlY3RseQorCQkJbG9jYWxGZWF0dXJlRmlsZXMgPSBmZWF0dXJlSmFyUmVmZXJlbmNlLnVucGFjayhnZXRXb3JraW5nRGlyZWN0b3J5KCksIG51bGwsIG1vbml0b3IpOworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBlcnJvclJldHJpZXZpbmcoRmVhdHVyZS5GRUFUVVJFX1hNTCwgZmVhdHVyZUphclJlZmVyZW5jZSwgZSk7IAorCQl9CisKKwkJLy8gZmluZCB0aGUgbWFuaWZlc3QgaW4gdGhlIHVucGFja2VkIGZlYXR1cmUgZmlsZXMKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NhbEZlYXR1cmVGaWxlcy5sZW5ndGg7IGkrKykgeworCQkJaWYgKGxvY2FsRmVhdHVyZUZpbGVzW2ldLmdldElkZW50aWZpZXIoKS5lcXVhbHMoRmVhdHVyZS5GRUFUVVJFX1hNTCkpIHsKKwkJCQlsb2NhbE1hbmlmZXN0ID0gbG9jYWxGZWF0dXJlRmlsZXNbaV07CisJCQkJLy8gY2FjaGUgcmVmZXJlbmNlIHRvIG1hbmlmZXN0CisJCQkJcmV0dXJuIGxvY2FsTWFuaWZlc3Q7CisJCQl9CisJCX0KKworCQkvLyB0aGUgbWFuaWZlc3QgaGFzIG5vdCBiZWVuIGZvdW5kCisJCVN0cmluZ1tdIHZhbHVlcyA9IG5ldyBTdHJpbmdbXSB7IEZlYXR1cmUuRkVBVFVSRV9YTUwsIGdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCl9OworCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5GZWF0dXJlUGFja2FnZWRDb250ZW50UHJvdmlkZXJfTm9NYW5pZmVzdEZpbGUsIHZhbHVlcyksIG5ldyBFeGNlcHRpb24oKSk7IAorCisJfQorCisJLyoKKwkgKiBAc2VlIElGZWF0dXJlQ29udGVudFByb3ZpZGVyI2dldEFyY2hpdmVSZWZlcmVuY2VzKCkKKwkgKi8KKwlwdWJsaWMgQ29udGVudFJlZmVyZW5jZVtdIGdldEFyY2hpdmVSZWZlcmVuY2VzKEluc3RhbGxNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKworCQlJUGx1Z2luRW50cnlbXSBlbnRyaWVzID0gZ2V0RmVhdHVyZSgpLmdldFBsdWdpbkVudHJpZXMoKTsKKwkJSU5vblBsdWdpbkVudHJ5W10gbm9uRW50cmllcyA9IGdldEZlYXR1cmUoKS5nZXROb25QbHVnaW5FbnRyaWVzKCk7CisJCUxpc3QgbGlzdEFsbENvbnRlbnRSZWYgPSBuZXcgQXJyYXlMaXN0KCk7CisJCUNvbnRlbnRSZWZlcmVuY2VbXSBhbGxDb250ZW50UmVmID0gbmV3IENvbnRlbnRSZWZlcmVuY2VbMF07CisKKwkJLy8gZmVhdHVyZQorCQlsaXN0QWxsQ29udGVudFJlZi5hZGRBbGwoQXJyYXlzLmFzTGlzdChnZXRGZWF0dXJlRW50cnlBcmNoaXZlUmVmZXJlbmNlcyhtb25pdG9yKSkpOworCisJCS8vIHBsdWdpbnMKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7CisJCQlsaXN0QWxsQ29udGVudFJlZi5hZGRBbGwoQXJyYXlzLmFzTGlzdChnZXRQbHVnaW5FbnRyeUFyY2hpdmVSZWZlcmVuY2VzKGVudHJpZXNbaV0sIG1vbml0b3IpKSk7CisJCX0KKworCQkvLyBub24gcGx1Z2lucworCQlmb3IgKGludCBpID0gMDsgaSA8IG5vbkVudHJpZXMubGVuZ3RoOyBpKyspIHsKKwkJCWxpc3RBbGxDb250ZW50UmVmLmFkZEFsbChBcnJheXMuYXNMaXN0KGdldE5vblBsdWdpbkVudHJ5QXJjaGl2ZVJlZmVyZW5jZXMobm9uRW50cmllc1tpXSwgbW9uaXRvcikpKTsKKwkJfQorCisJCS8vIHRyYW5zZm9ybSBMaXN0IGluIEFycmF5CisJCWlmIChsaXN0QWxsQ29udGVudFJlZi5zaXplKCkgPiAwKSB7CisJCQlhbGxDb250ZW50UmVmID0gbmV3IENvbnRlbnRSZWZlcmVuY2VbbGlzdEFsbENvbnRlbnRSZWYuc2l6ZSgpXTsKKwkJCWxpc3RBbGxDb250ZW50UmVmLnRvQXJyYXkoYWxsQ29udGVudFJlZik7CisJCX0KKworCQlyZXR1cm4gYWxsQ29udGVudFJlZjsKKwl9CisKKwkvKgorCSAqIEBzZWUgSUZlYXR1cmVDb250ZW50UHJvdmlkZXIjZ2V0RmVhdHVyZUVudHJ5QXJjaGl2ZVJlZmVyZW5jZXMoKQorCSAqLworCXB1YmxpYyBDb250ZW50UmVmZXJlbmNlW10gZ2V0RmVhdHVyZUVudHJ5QXJjaGl2ZVJlZmVyZW5jZXMoSW5zdGFsbE1vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCisJCS8vMSBqYXIgZmlsZSA8LT4gMSBmZWF0dXJlCisJCS8vIHdlIHdpbGwgcmV0dXJuIHRoZSBKQVIgZmlsZSAKKwkJQ29udGVudFJlZmVyZW5jZVtdIHJlZmVyZW5jZXMgPSBuZXcgQ29udGVudFJlZmVyZW5jZVsxXTsKKwkJQ29udGVudFJlZmVyZW5jZSBjdXJyZW50UmVmZXJlbmNlID0gbnVsbDsKKwkJU3RyaW5nIGFyY2hpdmVJRCA9IG51bGw7CisKKwkJdHJ5IHsKKwkJCWFyY2hpdmVJRCA9IChnZXRGZWF0dXJlKCkgIT0gbnVsbCkgPyBnZXRGZWF0dXJlKCkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkgOiAiIjsJLy8kTk9OLU5MUy0xJAorCQkJY3VycmVudFJlZmVyZW5jZSA9IG5ldyBKYXJDb250ZW50UmVmZXJlbmNlKGFyY2hpdmVJRCwgZ2V0VVJMKCkpOworCQkJY3VycmVudFJlZmVyZW5jZSA9IGFzTG9jYWxSZWZlcmVuY2UoY3VycmVudFJlZmVyZW5jZSwgbW9uaXRvcik7CisJCQlyZWZlcmVuY2VzWzBdID0gY3VycmVudFJlZmVyZW5jZTsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJcmVmZXJlbmNlc1swXSA9IGNvbnRpbnVlT25FcnJvck9yUmV0aHJvdyhhcmNoaXZlSUQsIGUpOyAKKwkJfQkJCisJCXJldHVybiByZWZlcmVuY2VzOworCX0KKworCS8qCisJICogQHNlZSBJRmVhdHVyZUNvbnRlbnRQcm92aWRlciNnZXRQbHVnaW5FbnRyeUFyY2hpdmVSZWZlcmVuY2VzKElQbHVnaW5FbnRyeSkKKwkgKi8KKwlwdWJsaWMgQ29udGVudFJlZmVyZW5jZVtdIGdldFBsdWdpbkVudHJ5QXJjaGl2ZVJlZmVyZW5jZXMoSVBsdWdpbkVudHJ5IHBsdWdpbkVudHJ5LCBJbnN0YWxsTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisKKwkJLy8gMSBwbHVnaW4gPC0+IDEgamFyCisJCS8vIHdlIHJldHVybiB0aGUgSkFSIGZpbGUJCisJCUNvbnRlbnRSZWZlcmVuY2VbXSByZWZlcmVuY2VzID0gbmV3IENvbnRlbnRSZWZlcmVuY2VbMV07CisJCVN0cmluZyBhcmNoaXZlSUQgPSBnZXRQYXRoSUQocGx1Z2luRW50cnkpOworCQlJU2l0ZSBzaXRlID0gKGdldEZlYXR1cmUoKSA9PSBudWxsKSA/IG51bGwgOiBnZXRGZWF0dXJlKCkuZ2V0U2l0ZSgpOworCQlJU2l0ZUNvbnRlbnRQcm92aWRlciBzaXRlQ29udGVudFByb3ZpZGVyID0gKHNpdGUgPT0gbnVsbCkgPyBudWxsIDogc2l0ZS5nZXRTaXRlQ29udGVudFByb3ZpZGVyKCk7CisJCVVSTCB1cmwgPSAoc2l0ZUNvbnRlbnRQcm92aWRlciA9PSBudWxsKSA/IG51bGwgOiBzaXRlQ29udGVudFByb3ZpZGVyLmdldEFyY2hpdmVSZWZlcmVuY2UoYXJjaGl2ZUlEKTsKKworCQl0cnkgeworCQkJcmVmZXJlbmNlc1swXSA9IHJldHJpZXZlTG9jYWxKYXIobmV3IEphckNvbnRlbnRSZWZlcmVuY2UoYXJjaGl2ZUlELCB1cmwpLCBtb25pdG9yKTsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJcmVmZXJlbmNlc1swXSA9IGNvbnRpbnVlT25FcnJvck9yUmV0aHJvdyhhcmNoaXZlSUQsIGUpOworCQl9CisJCXJldHVybiByZWZlcmVuY2VzOworCX0KKworCXByaXZhdGUgQ29udGVudFJlZmVyZW5jZSByZXRyaWV2ZUxvY2FsSmFyKEphckNvbnRlbnRSZWZlcmVuY2UgcmVmZXJlbmNlLCBJbnN0YWxsTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24geworCQkvL0lmIHRoZSBzaXRlIGRvZXMgbm90IHN1cHBvcnQgcGFjazIwMCwganVzdCBnZXQgdGhlIGphciBhcyBub3JtYWwKKwkJaWYoc2l0ZU1vZGVsID09IG51bGwgfHwgIXNpdGVNb2RlbC5zdXBwb3J0c1BhY2syMDAoKSB8fCAhSmFyUHJvY2Vzc29yLmNhblBlcmZvcm1VbnBhY2soKSkgeworCQkJQ29udGVudFJlZmVyZW5jZSBjb250ZW50UmVmZXJlbmNlID0gbnVsbDsKKwkJCXRyeSB7CisJCQkJY29udGVudFJlZmVyZW5jZSA9IGFzTG9jYWxSZWZlcmVuY2UocmVmZXJlbmNlLCBtb25pdG9yKTsKKwkJCX0KKwkJCWNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworCQkJCWNvbnRlbnRSZWZlcmVuY2UgPSBjb250aW51ZU9uRXJyb3JPclJldGhyb3cocmVmZXJlbmNlLmdldElkZW50aWZpZXIoKSwgZSk7CisJCQl9CisJCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCWNvbnRlbnRSZWZlcmVuY2UgPSBjb250aW51ZU9uRXJyb3JPclJldGhyb3cocmVmZXJlbmNlLmdldElkZW50aWZpZXIoKSwgZSk7CisJCQl9CisJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkJY29udGVudFJlZmVyZW5jZSA9IGNvbnRpbnVlT25FcnJvck9yUmV0aHJvdyhyZWZlcmVuY2UuZ2V0SWRlbnRpZmllcigpLCBlKTsKKwkJCX0KKwkJCXJldHVybiBjb250ZW50UmVmZXJlbmNlOworCQl9CisJCQorCQlDb250ZW50UmVmZXJlbmNlIHBhY2tlZFJlZiA9IG51bGw7CisJCVN0cmluZyBrZXkgPSByZWZlcmVuY2UudG9TdHJpbmcoKTsKKwkJT2JqZWN0IGphckxvY2sgPSBMb2NrTWFuYWdlci5nZXRMb2NrKGtleSk7CisJCXN5bmNocm9uaXplZCAoamFyTG9jaykgeworCQkJLy9kbyB3ZSBoYXZlIHRoaXMgamFyIGFscmVhZHk/CisJCQlGaWxlIGxvY2FsRmlsZSA9IFV0aWxpdGllcy5sb29rdXBMb2NhbEZpbGUoa2V5KTsKKwkJCWlmIChsb2NhbEZpbGUgIT0gbnVsbCkgeworCQkJCS8vIGNoZWNrIGlmIHRoZSBjYWNoZWQgZmlsZSBpcyBzdGlsbCB2YWxpZCAobm8gbmV3ZXIgdmVyc2lvbiBvbiBzZXJ2ZXIpCisJCQkJaWYgKFVwZGF0ZU1hbmFnZXJVdGlscy5pc1NhbWVUaW1lc3RhbXAocmVmZXJlbmNlLmFzVVJMKCksIGxvY2FsRmlsZS5sYXN0TW9kaWZpZWQoKSkpIHsKKwkJCQkJTG9ja01hbmFnZXIucmV0dXJuTG9jayhrZXkpOworCQkJCQlyZXR1cm4gcmVmZXJlbmNlLmNyZWF0ZUNvbnRlbnRSZWZlcmVuY2UocmVmZXJlbmNlLmdldElkZW50aWZpZXIoKSwgbG9jYWxGaWxlKTsKKwkJCQl9CisJCQl9CisKKwkJCXRyeSB7CisJCQkJLy9kb24ndCBoYXZlIGphciwgY2hlY2sgZm9yIHBhY2suZ3oKKwkJCQlVUkwgcGFja0daVVJMID0gbmV3IFVSTChyZWZlcmVuY2UuYXNVUkwoKS50b0V4dGVybmFsRm9ybSgpICsgIi5wYWNrLmd6Iik7IC8vJE5PTi1OTFMtMSQKKwkJCQlwYWNrZWRSZWYgPSBhc0xvY2FsUmVmZXJlbmNlKG5ldyBKYXJDb250ZW50UmVmZXJlbmNlKHJlZmVyZW5jZS5nZXRJZGVudGlmaWVyKCksIHBhY2tHWlVSTCksIG1vbml0b3IpOworCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCS8vbm8gcGFjay5negorCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKXsKKwkJCQkvL25vIHBhY2suZ3oKKwkJCX0KKwkJfQorCQkKKwkJaWYgKHBhY2tlZFJlZiA9PSBudWxsKSB7CisJCQkvL25vIHBhY2suZ3ogb24gc2VydmVyLCBnZXQgbm9ybWFsIGphcgorCQkJQ29udGVudFJlZmVyZW5jZSBjb250ZW50UmVmZXJlbmNlID0gbnVsbDsKKwkJCXRyeSB7CisJCQkJY29udGVudFJlZmVyZW5jZSA9IGFzTG9jYWxSZWZlcmVuY2UocmVmZXJlbmNlLCBtb25pdG9yKTsKKwkJCX0KKwkJCWNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworCQkJCWNvbnRlbnRSZWZlcmVuY2UgPSBjb250aW51ZU9uRXJyb3JPclJldGhyb3cocmVmZXJlbmNlLmdldElkZW50aWZpZXIoKSwgZSk7CisJCQl9CisJCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCWNvbnRlbnRSZWZlcmVuY2UgPSBjb250aW51ZU9uRXJyb3JPclJldGhyb3cocmVmZXJlbmNlLmdldElkZW50aWZpZXIoKSwgZSk7CisJCQl9CisJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkJY29udGVudFJlZmVyZW5jZSA9IGNvbnRpbnVlT25FcnJvck9yUmV0aHJvdyhyZWZlcmVuY2UuZ2V0SWRlbnRpZmllcigpLCBlKTsKKwkJCX0KKwkJCXJldHVybiBjb250ZW50UmVmZXJlbmNlOworCQl9CisKKwkJYm9vbGVhbiBzdWNjZXNzID0gZmFsc2U7CisJCXN5bmNocm9uaXplZCAoamFyTG9jaykgeworCQkJU3RyaW5nIHBhY2tlZCA9IHBhY2tlZFJlZi50b1N0cmluZygpOworCQkJT2JqZWN0IHBhY2tlZExvY2sgPSBMb2NrTWFuYWdlci5nZXRMb2NrKHBhY2tlZCk7CisJCQlzeW5jaHJvbml6ZWQgKHBhY2tlZExvY2spIHsKKwkJCQl0cnkgeworCQkJCQlGaWxlIHRlbXBGaWxlID0gcGFja2VkUmVmLmFzRmlsZSgpOworCQkJCQlsb25nIHRpbWVTdGFtcCA9IHRlbXBGaWxlLmxhc3RNb2RpZmllZCgpOworCQorCQkJCQlKYXJQcm9jZXNzb3IgcHJvY2Vzc29yID0gSmFyUHJvY2Vzc29yLmdldFVucGFja1Byb2Nlc3NvcihudWxsKTsKKwkJCQkJcHJvY2Vzc29yLnNldFdvcmtpbmdEaXJlY3RvcnkodGVtcEZpbGUuZ2V0UGFyZW50KCkpOworCQorCQkJCQlGaWxlIHBhY2tlZEZpbGUgPSBuZXcgRmlsZSh0ZW1wRmlsZS50b1N0cmluZygpICsgVXRpbHMuUEFDS0VEX1NVRkZJWCk7CisJCQkJCXRlbXBGaWxlLnJlbmFtZVRvKHBhY2tlZEZpbGUpOworCQkJCQkKKwkJCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgeworCQkJCQkJbW9uaXRvci5zYXZlU3RhdGUoKTsKKwkJCQkJCW1vbml0b3Iuc3ViVGFzayhNZXNzYWdlcy5KYXJDb250ZW50UmVmZXJlbmNlX1VucGFja2luZyArICIgIiArIHJlZmVyZW5jZS5nZXRJZGVudGlmaWVyKCkgKyBVdGlscy5QQUNLRURfU1VGRklYKTsgIC8vJE5PTi1OTFMtMSQKKwkJCQkJCW1vbml0b3Iuc2hvd0NvcHlEZXRhaWxzKGZhbHNlKTsKKwkJCQkJfQorCQkJCQkvL3VucGFja2luZyB0aGUgamFyIHdpbGwgc3RyaXAgdGhlICIucGFjay5neiIgYW5kIGxlYXZlIHVzIGJhY2sgd2l0aCB0aGUgb3JpZ2luYWwgZmlsZW5hbWUKKwkJCQkJdHJ5IHsKKwkJCQkJCXByb2Nlc3Nvci5wcm9jZXNzSmFyKHBhY2tlZEZpbGUpOworCQkJCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgeworCQkJCQkJLy9zb21ldGhpbmcgaXMgd3JvbmcgdW5wYWNraW5nCisJCQkJCX0KKwkKKwkJCQkJaWYodGVtcEZpbGUuZXhpc3RzKCkgJiYgdGVtcEZpbGUubGVuZ3RoKCkgPiAwKXsKKwkJCQkJCXN1Y2Nlc3MgPSB0cnVlOworCQkJCQkJdGVtcEZpbGUuc2V0TGFzdE1vZGlmaWVkKHRpbWVTdGFtcCk7CisJCQkJCQlVdGlsaXRpZXMubWFwTG9jYWxGaWxlKGtleSwgdGVtcEZpbGUpOworCQkJCQkJVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXRVcGRhdGVTZXNzaW9uKCkubWFya1Zpc2l0ZWQocmVmZXJlbmNlLmFzVVJMKCkpOworCQkJCQl9CisJCQkJfSBmaW5hbGx5IHsKKwkJCQkJTG9ja01hbmFnZXIucmV0dXJuTG9jayhwYWNrZWQpOworCQkJCQlMb2NrTWFuYWdlci5yZXR1cm5Mb2NrKGtleSk7CisJCQkJCWlmKG1vbml0b3IgIT0gbnVsbCkKKwkJCQkJCW1vbml0b3IucmVzdG9yZVN0YXRlKCk7CisJCQkJfQorCQkJfQorCQl9CisJCWlmKCFzdWNjZXNzKXsKKwkJCS8vU29tZXRoaW5nIHdlbnQgd3Jvbmcgd2l0aCB0aGUgdW5wYWNrLCBnZXQgdGhlIG5vcm1hbCBqYXIuCisJCQlDb250ZW50UmVmZXJlbmNlIGNvbnRlbnRSZWZlcmVuY2UgPSBudWxsOworCQkJdHJ5IHsKKwkJCQljb250ZW50UmVmZXJlbmNlID0gYXNMb2NhbFJlZmVyZW5jZShyZWZlcmVuY2UsIG1vbml0b3IpOworCQkJfQorCQkJY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisJCQkJY29udGVudFJlZmVyZW5jZSA9IGNvbnRpbnVlT25FcnJvck9yUmV0aHJvdyhyZWZlcmVuY2UuZ2V0SWRlbnRpZmllcigpLCBlKTsKKwkJCX0KKwkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJY29udGVudFJlZmVyZW5jZSA9IGNvbnRpbnVlT25FcnJvck9yUmV0aHJvdyhyZWZlcmVuY2UuZ2V0SWRlbnRpZmllcigpLCBlKTsKKwkJCX0KKwkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCQljb250ZW50UmVmZXJlbmNlID0gY29udGludWVPbkVycm9yT3JSZXRocm93KHJlZmVyZW5jZS5nZXRJZGVudGlmaWVyKCksIGUpOworCQkJfQorCQkJcmV0dXJuIGNvbnRlbnRSZWZlcmVuY2U7CisJCX0KKwkJcmV0dXJuIHBhY2tlZFJlZjsKKwl9CisKKwkvKgorCSAqIEBzZWUgSUZlYXR1cmVDb250ZW50UHJvdmlkZXIjZ2V0Tm9uUGx1Z2luRW50cnlBcmNoaXZlUmVmZXJlbmNlcyhJTm9uUGx1Z2luRW50cnkpCisJICovCisJcHVibGljIENvbnRlbnRSZWZlcmVuY2VbXSBnZXROb25QbHVnaW5FbnRyeUFyY2hpdmVSZWZlcmVuY2VzKElOb25QbHVnaW5FbnRyeSBub25QbHVnaW5FbnRyeSwgSW5zdGFsbE1vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCisJCS8vIGFyY2hpdmUgPSBmZWF0dXJlLzxpZD5fPHZlcj4vPGZpbGU+CisJCVN0cmluZyBhcmNoaXZlSUQgPSBTaXRlLkRFRkFVTFRfRkVBVFVSRV9QQVRIICsgKChnZXRGZWF0dXJlKCkgIT0gbnVsbCkgPyBnZXRGZWF0dXJlKCkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkgOiAiIik7IC8vJE5PTi1OTFMtMSQKKwkJYXJjaGl2ZUlEICs9ICIvIiArIG5vblBsdWdpbkVudHJ5LmdldElkZW50aWZpZXIoKTsgLy8kTk9OLU5MUy0xJAorCisJCUNvbnRlbnRSZWZlcmVuY2VbXSByZWZlcmVuY2VzID0gbmV3IENvbnRlbnRSZWZlcmVuY2VbMV07CisJCUNvbnRlbnRSZWZlcmVuY2UgY3VycmVudFJlZmVyZW5jZSA9IG51bGw7CisKKwkJdHJ5IHsKKwkJCUlTaXRlIHNpdGUgPSAoZ2V0RmVhdHVyZSgpID09IG51bGwpID8gbnVsbCA6IGdldEZlYXR1cmUoKS5nZXRTaXRlKCk7CisJCQlJU2l0ZUNvbnRlbnRQcm92aWRlciBzaXRlQ29udGVudFByb3ZpZGVyID0gKHNpdGUgPT0gbnVsbCkgPyBudWxsIDogc2l0ZS5nZXRTaXRlQ29udGVudFByb3ZpZGVyKCk7CisJCQlVUkwgdXJsID0gKHNpdGVDb250ZW50UHJvdmlkZXIgPT0gbnVsbCkgPyBudWxsIDogc2l0ZUNvbnRlbnRQcm92aWRlci5nZXRBcmNoaXZlUmVmZXJlbmNlKGFyY2hpdmVJRCk7CisKKwkJCWN1cnJlbnRSZWZlcmVuY2UgPSBuZXcgQ29udGVudFJlZmVyZW5jZShub25QbHVnaW5FbnRyeS5nZXRJZGVudGlmaWVyKCksIHVybCk7CisJCQljdXJyZW50UmVmZXJlbmNlID0gYXNMb2NhbFJlZmVyZW5jZShjdXJyZW50UmVmZXJlbmNlLCBtb25pdG9yKTsKKwkJCXJlZmVyZW5jZXNbMF0gPSBjdXJyZW50UmVmZXJlbmNlOworCisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCXJlZmVyZW5jZXNbMF0gPSBjb250aW51ZU9uRXJyb3JPclJldGhyb3coYXJjaGl2ZUlELCBlKTsKKwkJfQorCisJCXJldHVybiByZWZlcmVuY2VzOworCX0KKworCisJLyoKKwkgKiBAc2VlIElGZWF0dXJlQ29udGVudFByb3ZpZGVyI2dldEZlYXR1cmVFbnRyeUNvbnRlbnRSZWZlcmVuY2VzKCkKKwkgKi8KKwlwdWJsaWMgQ29udGVudFJlZmVyZW5jZVtdIGdldEZlYXR1cmVFbnRyeUNvbnRlbnRSZWZlcmVuY2VzKEluc3RhbGxNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKworCQlyZXR1cm4gbG9jYWxGZWF0dXJlRmlsZXM7IC8vIHJldHVybiBjYWNoZWQgZmVhdHVyZSByZWZlcmVuY2VzCisJCS8vIE5vdGU6IGFzc3VtZXMgdGhpcyBjb250ZW50IHByb3ZpZGVyIGlzIGFsd2F5cyBjYWxsZWQgZmlyc3QgdG8KKwkJLy8gICAgICAgZ2V0IHRoZSBmZWF0dXJlIG1hbmlmZXN0LiBUaGlzIGZvcmNlcyB0aGUgZmVhdHVyZSBmaWxlcworCQkvLyAgICAgICB0byBiZSB1bnBhY2tlZCBhbmQgY2FjaGVzIHRoZSByZWZlcmVuY2VzCisJfQorCisJLyoKKwkgKiBAc2VlIElGZWF0dXJlQ29udGVudFByb3ZpZGVyI2dldFBsdWdpbkVudHJ5Q29udGVudFJlZmVyZW5jZXMoSVBsdWdpbkVudHJ5KQorCSAqLworCXB1YmxpYyBDb250ZW50UmVmZXJlbmNlW10gZ2V0UGx1Z2luRW50cnlDb250ZW50UmVmZXJlbmNlcyhJUGx1Z2luRW50cnkgcGx1Z2luRW50cnksIEluc3RhbGxNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKworCQlDb250ZW50UmVmZXJlbmNlW10gcmVmZXJlbmNlcyA9IGdldFBsdWdpbkVudHJ5QXJjaGl2ZVJlZmVyZW5jZXMocGx1Z2luRW50cnksIG1vbml0b3IpOworCQlDb250ZW50UmVmZXJlbmNlW10gcGx1Z2luUmVmZXJlbmNlcyA9IG5ldyBDb250ZW50UmVmZXJlbmNlWzBdOworCisJCXRyeSB7CisJCQlpZiAocmVmZXJlbmNlc1swXSBpbnN0YW5jZW9mIEphckNvbnRlbnRSZWZlcmVuY2UpIHsKKwkJCQlKYXJDb250ZW50UmVmZXJlbmNlIGxvY2FsUmVmID0gKEphckNvbnRlbnRSZWZlcmVuY2UpIGFzTG9jYWxSZWZlcmVuY2UocmVmZXJlbmNlc1swXSwgbW9uaXRvcik7CisJCQkJcGx1Z2luUmVmZXJlbmNlcyA9IGxvY2FsUmVmLnBlZWsobnVsbCwgbW9uaXRvcik7CisJCQl9IGVsc2UgeworCQkJCS8vIHJldHVybiB0aGUgbGlzdCBvZiBhbGwgc3ViZGlyZWN0b3JpZXMKKwkJCQlMaXN0IGZpbGVzID0gZ2V0RmlsZXMocmVmZXJlbmNlc1swXS5hc0ZpbGUoKSk7CisJCQkJcGx1Z2luUmVmZXJlbmNlcyA9IG5ldyBDb250ZW50UmVmZXJlbmNlW2ZpbGVzLnNpemUoKV07CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwbHVnaW5SZWZlcmVuY2VzLmxlbmd0aDsgaSsrKSB7CisJCQkJCUZpbGUgY3VycmVudEZpbGUgPSAoRmlsZSkgZmlsZXMuZ2V0KGkpOworCQkJCQlwbHVnaW5SZWZlcmVuY2VzW2ldID0gbmV3IENvbnRlbnRSZWZlcmVuY2UobnVsbCwgY3VycmVudEZpbGUudG9VUkwoKSk7CisJCQkJfQorCQkJfQorCisJCQkvL1syMDg2Nl0gd2UgZGlkIG5vdCBwcmVzZXJ2ZSBleGVjdXRhYmxlIGJpdAorCQkJdmFsaWRhdGVQZXJtaXNzaW9ucyhwbHVnaW5SZWZlcmVuY2VzKTsKKworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBlcnJvclJldHJpZXZpbmcocGx1Z2luRW50cnkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCksIHJlZmVyZW5jZXNbMF0sIGUpOworCQl9CisJCXJldHVybiBwbHVnaW5SZWZlcmVuY2VzOworCX0KKworCS8qCisJICogcmV0dXJuIGFsbCB0aGUgZmlsZXMgdW5kZXIgdGhlIGRpcmVjdG9yeQorCSAqLworCXByaXZhdGUgTGlzdCBnZXRGaWxlcyhGaWxlIGRpcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7CisKKwkJaWYgKCFkaXIuaXNEaXJlY3RvcnkoKSkKKwkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5GZWF0dXJlUGFja2FnZWRDb250ZW50UHJvdmlkZXJfSW52YWxpZERpcmVjdG9yeSwgKG5ldyBTdHJpbmdbXSB7IGRpci5nZXRQYXRoKCkgfSkpKTsKKworCQlGaWxlW10gZmlsZXMgPSBkaXIubGlzdEZpbGVzKCk7CisJCWlmIChmaWxlcyAhPSBudWxsKSAvLyBiZSBjYXJlZnVsIHNpbmNlIGl0IGNhbiBiZSBudWxsCisJCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgKytpKSB7CisJCQkJaWYgKGZpbGVzW2ldLmlzRGlyZWN0b3J5KCkpIHsKKwkJCQkJcmVzdWx0LmFkZEFsbChnZXRGaWxlcyhmaWxlc1tpXSkpOworCQkJCX0gZWxzZSB7CisJCQkJCXJlc3VsdC5hZGQoZmlsZXNbaV0pOworCQkJCX0KKwkJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKgorCSAqIAorCSAqLworCXByaXZhdGUgQ29yZUV4Y2VwdGlvbiBlcnJvclJldHJpZXZpbmcoU3RyaW5nIG9iaiwgQ29udGVudFJlZmVyZW5jZSBhcmNoaXZlLCBFeGNlcHRpb24gZSkgeworCisJCVN0cmluZ1tdIHZhbHVlcyA9IG5ldyBTdHJpbmdbXSB7IG9iaiB9OworCisJCXJldHVybiBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5GZWF0dXJlUGFja2FnZWRDb250ZW50UHJvdmlkZXJfRXJyb3JSZXRyaWV2aW5nLCB2YWx1ZXMpLCBlKTsJIAkKKworCX0KKworCisJcHVibGljIHZvaWQgc2V0Q29udGludWVPbkVycm9yKGJvb2xlYW4gY29udGludWVPbkVycm9yKSB7CisJCXRoaXMuY29udGludWVPbkVycm9yID0gY29udGludWVPbkVycm9yOworCX0KKwkKKwkvKiogCisJICogVGhpcyBtZXRob2QgaXMgdXNlZCBmb3Igd2hlbiBhIGNvcmUgZXhjZXB0aW9uIGlzIGRldGVjdGVkLCBzbywgaWYgaXRzIGRlY2lkZWQgdG8gcmV0aHJvdywgdGhlbiAKKwkgKiBhIGNvcmUgZXhjZXB0aW9uIG9kZXMgbm90IGhhdmUgdG8gYmUgcmVjcmVhdGVkLiAKKwkgKiAKKwkgKiBAcGFyYW0gYXJjaGl2ZUlEIGlkIG9mIHRoZSBhcmNoaXZlIGZpbGUKKwkgKiBAcGFyYW0gQ29yZUV4Y2VwdGlvbiAKKwkgKiBAcmV0dXJuIE51bGxSZWZlcmVuY2UgaWYgaXRzIGRlY2lkZWQgbm90IHRvIGNvbnRpbnVlCisJICogQHRocm93cyBDb3JlRXhjZXB0aW9uCisJICovCisJLypwcml2YXRlIENvbnRlbnRSZWZlcmVuY2UgY29udGludWVPckVycm9yT3JSZXRocm93KFN0cmluZyBhcmNoaXZlSUQsIENvcmVFeGNlcHRpb24gY29yZUV4Y2VwdGlvbikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlDb250ZW50UmVmZXJlbmNlIHJlZmVyZW5jZSA9IG51bGw7CisKKwkJaWYgKGNvbnRpbnVlT25FcnJvcikgeworCQkJLy8gdGhpcyBDb250ZW50UmVmZXJlbmNlIHdpdGhvdXQgYSBmaWxlIG9yIFVSTCBpcyBwdXJlbHkgYQorCQkJLy8gIm1pc3NpbmcgamFyIiByZWZlcmVuY2UuCisJCQlyZWZlcmVuY2UgPSBuZXcgTnVsbENvbnRlbnRSZWZlcmVuY2UoYXJjaGl2ZUlEKTsKKworCQkJU3RyaW5nIG1zZyA9ICIgICAgQ29udGludWVPbkVycm9yOiBUaGUgZm9sbG93aW5nIElEIHdhcyBub3QgZm91bmQsIHNvIHdhcyBza2lwcGVkLCBhbmQgaXMgbm90IG9uIG1pcm9yIHNpdGU6ICIgKyBhcmNoaXZlSUQ7IC8vJE5PTi1OTFMtMSQKKwkJCVN0cmluZyBpZCA9IFVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCk7CisJCQlJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBpZCAsIDAsIG1zZywgbnVsbCk7CisJCQlVcGRhdGVDb3JlLmxvZyhzdGF0dXMpOworCQkJCisJCX0KKwkJZWxzZSB7CisJCQl0aHJvdyBjb3JlRXhjZXB0aW9uOworCQl9CisJCXJldHVybiByZWZlcmVuY2U7CisJfSovCisJCisJcHJpdmF0ZSBDb250ZW50UmVmZXJlbmNlIGNvbnRpbnVlT25FcnJvck9yUmV0aHJvdyhTdHJpbmcgYXJjaGl2ZUlELCBFeGNlcHRpb24gZSkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlDb250ZW50UmVmZXJlbmNlIHJlZmVyZW5jZSA9IG51bGw7CisKKwkJaWYgKGNvbnRpbnVlT25FcnJvcikgeyAKKwkJCS8vIHRoaXMgQ29udGVudFJlZmVyZW5jZSB3aXRob3V0IGEgZmlsZSBvciBVUkwgaXMgcHVyZWx5IGEKKwkJCS8vICJtaXNzaW5nIGphciIgcmVmZXJlbmNlLgorCQkJcmVmZXJlbmNlID0gbmV3IE51bGxDb250ZW50UmVmZXJlbmNlKGFyY2hpdmVJRCk7CisJCQkKKwkJCVN0cmluZyBtc2cgPSAiICAgIENvbnRpbnVlT25FcnJvcjogVGhlIGZvbGxvd2luZyBJRCB3YXMgbm90IGZvdW5kLCBzbyB3YXMgc2tpcHBlZCwgYW5kIGlzIG5vdCBvbiBtaXJvciBzaXRlOiAiICsgYXJjaGl2ZUlEOyAvLyROT04tTkxTLTEkCisJCQlTdHJpbmcgaWQgPSBVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpOworCQkJSVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgaWQgLCAwLCBtc2csIG51bGwpOworCQkJVXBkYXRlQ29yZS5sb2coc3RhdHVzKTsJCisJCQkKKwkJfQorCQllbHNlIHsKKwkJCXRocm93IGVycm9yUmV0cmlldmluZyhhcmNoaXZlSUQsIHJlZmVyZW5jZSwgZSk7CisJCX0KKwkJcmV0dXJuIHJlZmVyZW5jZTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvRmVhdHVyZVBhY2thZ2VkRmFjdG9yeS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9GZWF0dXJlUGFja2FnZWRGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM1NTY1MQotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvRmVhdHVyZVBhY2thZ2VkRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsODIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS5uZXQuKjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC4qOworCisvKioKKyAqIEZhY3RvcnkgZm9yIEZlYXR1cmUgUGFja2FnZWQKKyAqLworcHVibGljIGNsYXNzIEZlYXR1cmVQYWNrYWdlZEZhY3RvcnkgZXh0ZW5kcyBCYXNlRmVhdHVyZUZhY3RvcnkgeworCisJLyoKKwkgKiBAc2VlIElGZWF0dXJlRmFjdG9yeSNjcmVhdGVGZWF0dXJlKFVSTCxJU2l0ZSxJUHJvZ3Jlc3NNb25pdG9yKQorCSAqLworCXB1YmxpYyBJRmVhdHVyZSBjcmVhdGVGZWF0dXJlKFVSTCB1cmwsSVNpdGUgc2l0ZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCUZlYXR1cmUgZmVhdHVyZSA9IG51bGw7CisJCUlucHV0U3RyZWFtIGZlYXR1cmVTdHJlYW0gPSBudWxsOworCQlpZiAobW9uaXRvciA9PSBudWxsKQorCQkJbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7CisJCW1vbml0b3IuYmVnaW5UYXNrKG51bGwsMik7CisJCW1vbml0b3Iud29ya2VkKDEpOworCQkJCisJCQkJCQorCQl0cnkgewkKKwkJCUlGZWF0dXJlQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciA9IG5ldyBGZWF0dXJlUGFja2FnZWRDb250ZW50UHJvdmlkZXIodXJsLCBzaXRlKTsJCisJCQlDb250ZW50UmVmZXJlbmNlIG1hbmlmZXN0ID0gY29udGVudFByb3ZpZGVyLmdldEZlYXR1cmVNYW5pZmVzdFJlZmVyZW5jZShudWxsLypJUHJvZ3Jlc3NNb25pdG9yKi8pOworCQkJZmVhdHVyZVN0cmVhbSA9IG1hbmlmZXN0LmdldElucHV0U3RyZWFtKCk7CisJCQlmZWF0dXJlID0gKEZlYXR1cmUpcGFyc2VGZWF0dXJlKGZlYXR1cmVTdHJlYW0pOworCQkJbW9uaXRvci53b3JrZWQoMSk7CisJCisJCQkvLyBpZiB0aGVyZSBpcyBubyB1cGRhdGUgVVJMIGZvciB0aGUgRmVhdHVyZQorCQkJLy8gdXNlIHRoZSBTaXRlIFVSTAorCQkJaWYgKGZlYXR1cmUuZ2V0VXBkYXRlU2l0ZUVudHJ5KCk9PW51bGwpeworCQkJCVVSTEVudHJ5TW9kZWwgZW50cnlNb2RlbCA9IGNyZWF0ZVVSTEVudHJ5TW9kZWwoKTsKKwkJCQlVUkwgc2l0ZVVybCA9IHNpdGUuZ2V0VVJMKCk7CisJCQkJaWYgKHNpdGVVcmwhPW51bGwpeworCQkJCQllbnRyeU1vZGVsLnNldFVSTFN0cmluZyhzaXRlVXJsLnRvRXh0ZXJuYWxGb3JtKCkpOworCQkJCQllbnRyeU1vZGVsLnJlc29sdmUoc2l0ZVVybCxudWxsKTsKKwkJCQkJZmVhdHVyZS5zZXRVcGRhdGVTaXRlRW50cnlNb2RlbChlbnRyeU1vZGVsKTsKKwkJCQl9CisJCQl9CQorCQkJZmVhdHVyZS5zZXRGZWF0dXJlQ29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7CisJCQlmZWF0dXJlLnNldFNpdGUoc2l0ZSk7CQkJCQkJCisJCQlVUkwgYmFzZVVybCA9IG51bGw7CisJCQl0cnkgeworCQkJCWJhc2VVcmwgPSBuZXcgVVJMKG1hbmlmZXN0LmFzVVJMKCksIi4iKTsgLy8gbWFrZSBzdXJlIHdlIGhhdmUgVVJMIHRvIGZlYXR1cmUgZGlyZWN0b3J5IC8vJE5PTi1OTFMtMSQKKwkJCX0gY2F0Y2goTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsJCisJCQl9CisJCQlmZWF0dXJlLnJlc29sdmUoYmFzZVVybCwgYmFzZVVybCk7CisJCQlmZWF0dXJlLm1hcmtSZWFkT25seSgpOwkJCQorCQl9ICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKXsKKwkJCXRocm93IGU7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oTkxTLmJpbmQoTWVzc2FnZXMuRmVhdHVyZUZhY3RvcnlfQ3JlYXRpbmdFcnJvciwgKG5ldyBTdHJpbmdbXSB7IHVybC50b0V4dGVybmFsRm9ybSgpIH0pKSwgZSk7CisJCX1maW5hbGx5IHsKKwkJCXRyeSB7CisJCQkJaWYgKGZlYXR1cmVTdHJlYW0hPW51bGwpCQorCQkJCQlmZWF0dXJlU3RyZWFtLmNsb3NlKCk7CisJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQl9CisJCX0KKwkJcmV0dXJuIGZlYXR1cmU7CisJfQorICAgIAorICAgIHB1YmxpYyBJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VNb2RlbCBjcmVhdGVJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VNb2RlbCgpIHsKKyAgICAgcmV0dXJuIG5ldyBVcGRhdGVTaXRlSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9GZWF0dXJlUGx1Z2luLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0ZlYXR1cmVQbHVnaW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDAyZWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9GZWF0dXJlUGx1Z2luLmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7CisvKioKKyAqIEFuIElQbHVnaW5FbnRyeSAtIElGZWF0dXJlIHBhaXIuCisgKiBUaGUgSUZlYXR1cmUgaXMgYSBmZWF0dWUgb3IgYSBwYXRjaCB3aWNoIGRlbGl2ZXJlZCB0aGUgcGx1Z2luCisgKi8KK3B1YmxpYyBjbGFzcyBGZWF0dXJlUGx1Z2luIHsKKwlwcml2YXRlIElQbHVnaW5FbnRyeSBwbHVnaW5FbnRyeTsKKwlwcml2YXRlIElGZWF0dXJlIGZlYXR1cmU7CisJcHVibGljIEZlYXR1cmVQbHVnaW4oSVBsdWdpbkVudHJ5IGVudHJ5LCBJRmVhdHVyZSBmZWF0dXJlKSB7CisJCXBsdWdpbkVudHJ5ID0gZW50cnk7CisJCXRoaXMuZmVhdHVyZSA9IGZlYXR1cmU7CisJfQorCXB1YmxpYyBJUGx1Z2luRW50cnkgZ2V0RW50cnkoKSB7CisJCXJldHVybiBwbHVnaW5FbnRyeTsKKwl9CisJcHVibGljIElGZWF0dXJlIGdldEZlYXR1cmUoKSB7CisJCXJldHVybiBmZWF0dXJlOworCX0KKwkvKioKKwkgKiBQbHVnaW5zIGFyZSBlcXVhbCBpZiB0aGVpciBJRHMgYW5kIHZlcnNpb25zIGFyZSB0aGUgc2FtZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKwkJaWYgKG8gaW5zdGFuY2VvZiBGZWF0dXJlUGx1Z2luKSB7CisJCQlGZWF0dXJlUGx1Z2luIHAgPSAoRmVhdHVyZVBsdWdpbikgbzsKKwkJCXJldHVybiBnZXRFbnRyeSgpLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5lcXVhbHMocC5nZXRFbnRyeSgpLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSk7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKwlwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworCQlyZXR1cm4gZ2V0RW50cnkoKS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuaGFzaENvZGUoKTsKKwl9CisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuIHBsdWdpbkVudHJ5ICsgIiBpbiAiICsgZmVhdHVyZTsgLy8kTk9OLU5MUy0xJAorCX0KK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvRmVhdHVyZVR5cGVGYWN0b3J5LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0ZlYXR1cmVUeXBlRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2YWVhYzQKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0ZlYXR1cmVUeXBlRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsODkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7CisKKy8qKgorICogTWFuYWdlcyBGZWF0dXJlRmFjdG9yeSBleHRlbnNpb24gcG9pbnQKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEZlYXR1cmVUeXBlRmFjdG9yeSB7CisKKwlwcml2YXRlIHN0YXRpYyBGZWF0dXJlVHlwZUZhY3RvcnkgaW5zdDsKKwlwcml2YXRlIE1hcCBmYWN0b3JpZXM7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lNUExFX0VYVEVOU0lPTl9JRCA9ICJmZWF0dXJlVHlwZXMiOwkvLyROT04tTkxTLTEkCQorCisJLyoKKwkgKiBoaWRlIGNvbnN0cnVjdG9yCisJICovCisJcHJpdmF0ZSBGZWF0dXJlVHlwZUZhY3RvcnkoKSB7CisJfQorCisJLyoKKwkgKiBTaW5nbGV0b24gcGF0dGVybgorCSAqLworCXB1YmxpYyBzdGF0aWMgRmVhdHVyZVR5cGVGYWN0b3J5IGdldEluc3RhbmNlKCkgeworCQlpZiAoaW5zdCA9PSBudWxsKQorCQkJaW5zdCA9IG5ldyBGZWF0dXJlVHlwZUZhY3RvcnkoKTsKKwkJcmV0dXJuIGluc3Q7CisJfQorCisJLyoKKwkgKiByZXR1cm4gdGhlIGZhY3RvcnkgZm9yIHRoZSBhc3NvY2lhdGVkIHR5cGUKKwkgKi8KKwlwdWJsaWMgSUZlYXR1cmVGYWN0b3J5IGdldEZhY3RvcnkoU3RyaW5nIHR5cGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJLy8KKwkJT2JqZWN0IGluc3RhbmNlID0gZ2V0RmFjdG9yaWVzKCkuZ2V0KHR5cGUpOworCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgeworCQkJaW5zdGFuY2UgPSBjcmVhdGVGYWN0b3J5Rm9yKHR5cGUpOworCQkJZ2V0RmFjdG9yaWVzKCkucHV0KHR5cGUsIGluc3RhbmNlKTsKKwkJfQorCQlyZXR1cm4gKElGZWF0dXJlRmFjdG9yeSkgaW5zdGFuY2U7CisJfQorCisJLyoKKwkgKiBjcmVhdGVzIGEgZmFjdG9yeSBmb3IgdGhlIGFzc29jaWF0ZWQgdHlwZSBhbmQgY2FjaGUgaXQgCisJICovCisJcHJpdmF0ZSBJRmVhdHVyZUZhY3RvcnkgY3JlYXRlRmFjdG9yeUZvcihTdHJpbmcgdHlwZSkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlJRmVhdHVyZUZhY3RvcnkgcmVzdWx0ID0gbnVsbDsKKworCQlTdHJpbmcgcGx1Z2luSUQgPQorCQkJVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKTsKKwkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKKwkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPQorCQkJcmVnaXN0cnkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKHBsdWdpbklELCBTSU1QTEVfRVhURU5TSU9OX0lELCB0eXBlKTsKKworCQlpZiAoZWxlbWVudHMgPT0gbnVsbCB8fCBlbGVtZW50cy5sZW5ndGggPT0gMCkgeworCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oCisJCQkJCU5MUy5iaW5kKE1lc3NhZ2VzLkZlYXR1cmVUeXBlRmFjdG9yeV9VbmFibGVUb0ZpbmRGZWF0dXJlRmFjdG9yeSwgKG5ldyBTdHJpbmdbXSB7IHR5cGUgfSkpLAorCQkJCQludWxsKTsKKwkJfSAKKworCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCA9IGVsZW1lbnRzWzBdOworCQlyZXN1bHQgPSAoSUZlYXR1cmVGYWN0b3J5KSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7CS8vJE5PTi1OTFMtMSQKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKgorCSAqIAorCSAqLworCXByaXZhdGUgTWFwIGdldEZhY3RvcmllcygpIHsKKwkJaWYgKGZhY3RvcmllcyA9PSBudWxsKQorCQkJZmFjdG9yaWVzID0gbmV3IEhhc2hNYXAoKTsKKwkJcmV0dXJuIGZhY3RvcmllczsKKwl9Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0ZpbGVGcmFnbWVudC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9GaWxlRnJhZ21lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDkyNTBmCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9GaWxlRnJhZ21lbnQuamF2YQpAQCAtMCwwICsxLDMwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsKKworaW1wb3J0IGphdmEuaW8uKjsKKworCitwdWJsaWMgY2xhc3MgRmlsZUZyYWdtZW50eworCXByaXZhdGUgRmlsZSBmaWxlOworCXByaXZhdGUgbG9uZyBieXRlczsKKwlwdWJsaWMgRmlsZUZyYWdtZW50KEZpbGUgZmlsZSwgbG9uZyBzaXplKXsKKwkJdGhpcy5maWxlPWZpbGU7CisJCXRoaXMuYnl0ZXM9c2l6ZTsKKwl9CisJcHVibGljIEZpbGUgZ2V0RmlsZSgpeworCQlyZXR1cm4gZmlsZTsKKwl9CisJcHVibGljIGxvbmcgZ2V0U2l6ZSgpeworCQlyZXR1cm4gYnl0ZXM7CisJfQorfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9GcmFnbWVudEVudHJ5LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0ZyYWdtZW50RW50cnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTc1MTFmCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9GcmFnbWVudEVudHJ5LmphdmEKQEAgLTAsMCArMSw3MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOworCisKKy8qKgorICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIHJldHJpZXZlIHRoZSBmcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIGEgcGx1Z2luLgorICovCitwdWJsaWMgY2xhc3MgRnJhZ21lbnRFbnRyeSB7CisJCisJcHJpdmF0ZSBTdHJpbmcgcGx1Z2luSWQ7CisJcHJpdmF0ZSBTdHJpbmcgcGx1Z2luVmVyc2lvbjsKKwlwcml2YXRlIFN0cmluZyBuYW1lOyAKKwlwcml2YXRlIFN0cmluZyBsb2NhdGlvbjsKKwkKKwlwdWJsaWMgRnJhZ21lbnRFbnRyeShTdHJpbmcgaWQsIFN0cmluZyB2ZXJzaW9uLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxvY2F0aW9uKSB7CisJCXRoaXMucGx1Z2luSWQgPSBpZDsKKwkJdGhpcy5wbHVnaW5WZXJzaW9uID0gdmVyc2lvbjsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwkJdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIHBsdWdpbiB0cmFuc2xhdGFibGUgbmFtZQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIG5hbWU7CisJfQorCQorCS8qKgorCSAqIEByZXR1cm4gdGhlIGxvY2F0aW9uIG9mIHRoZSBwbHVnaW4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uKCkgeworCQlyZXR1cm4gbG9jYXRpb247CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgdGhlIHBsdWctaW4gaWRlbnRpZmllciBmb3IgdGhpcyBlbnRyeS4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBwbHVnLWluIGlkZW50aWZpZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+CisJICovCisJcHVibGljIFN0cmluZyBnZXRQbHVnaW5JZGVudGlmaWVyKCkgeworCQlyZXR1cm4gcGx1Z2luSWQ7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcGx1Zy1pbiB2ZXJzaW9uIGZvciB0aGlzIGVudHJ5LgorCSAqIAorCSAqIEByZXR1cm4gdGhlIHBsdWctaW4gdmVyc2lvbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFBsdWdpblZlcnNpb24oKSB7CisJCXJldHVybiBwbHVnaW5WZXJzaW9uOworCX0KKworCS8qKgorCSAqIEBzZWUgT2JqZWN0I3RvU3RyaW5nKCkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlTdHJpbmcgbXNnID0gKGdldFBsdWdpbklkZW50aWZpZXIoKSE9bnVsbCk/Z2V0UGx1Z2luSWRlbnRpZmllcigpLnRvU3RyaW5nKCk6IiI7IC8vJE5PTi1OTFMtMSQKKwkJbXNnICs9IGdldFBsdWdpblZlcnNpb24oKSE9bnVsbD8iICIrZ2V0UGx1Z2luVmVyc2lvbigpLnRvU3RyaW5nKCk6IiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQlyZXR1cm4gbXNnOworCX0KK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvSVNpdGVDb250ZW50Q29uc3VtZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvSVNpdGVDb250ZW50Q29uc3VtZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzhiYTdkCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9JU2l0ZUNvbnRlbnRDb25zdW1lci5qYXZhCkBAIC0wLDAgKzEsNjYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsKKworIAoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7CisgCisgLyoqCisgICogQSBzaXRlIGNvbnRlbnQgY29uc3VtZXIgbWFuYWdlcyB0aGUgc3RvcmFnZSBvciBhcmNoaXZlcywgcGx1Z2lucyBhbmQKKyAgKiBmZWF0dXJlIGluc2lkZSBhbiA8Y29kZT4gSVNpdGU8L2NvZGU+CisgICovCisgCitwdWJsaWMgaW50ZXJmYWNlIElTaXRlQ29udGVudENvbnN1bWVyIHsKKworCS8qKgorCSAqIFN0b3JlcyBhIGNvbnRlbnQgcmVmZXJlbmNlIGludG8gdGhlIFNpdGVDb250ZW50Q29uc3VtZXIKKwkgKiBAcGFyYW0gY29udGVudFJlZmVyZW5jZSB0aGUgY29udGVudCByZWZlcmVuY2UgdG8gc3RvcmUKKwkgKiBAcGFyYW0gbW9uaXRvciB0aGUgcHJvZ3Jlc3MgbW9uaXRvcgorCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMgc3RvcmluZyB0aGUgY29udGVudCByZWZlcmVuY2UKKwkgKiBAc2luY2UgMi4wIAorCSAqLworCXB1YmxpYyB2b2lkIHN0b3JlKENvbnRlbnRSZWZlcmVuY2UgY29udGVudFJlZmVyZW5jZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKKworCS8qKgorCSAqIG9wZW5zIGEgTm9uIHBsdWdpbiBFbnRyeSBmb3Igc3RvcmFnZQorCSAqIEByZXR1cm4gdGhlIG5ldyBGZWF0dXJlQ29udGVudENvbnN1bWVyIGZvciB0aGlzIDxjb2RlPklOb25QbHVnaW5FbnRyeTwvY29kZT4KKwkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgdGhlIG9wZW5zIGlzIGRvbmUgb24gYSBGZWF0dXJlQ29udGVudENvbnN1bWVyIHBhcmVudCBvdGhlciB0aGFuIGFuIElGZWF0dXJlLgorCSAqIEBzaW5jZSAyLjAgCisJICovCisJcHVibGljIElDb250ZW50Q29uc3VtZXIgb3BlbihJTm9uUGx1Z2luRW50cnkgbm9uUGx1Z2luRW50cnkpIHRocm93cyBDb3JlRXhjZXB0aW9uOworCisJLyoqCisJICogb3BlbnMgYSBOb24gcGx1Z2luIEVudHJ5IGZvciBzdG9yYWdlCisJICogQHJldHVybiB0aGUgbmV3IEZlYXR1cmVDb250ZW50Q29uc3VtZXIgZm9yIHRoaXMgPGNvZGU+SVBsdWdpbkVudHJ5PC9jb2RlPgorCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiB0aGUgb3BlbnMgaXMgZG9uZSBvbiBhIEZlYXR1cmVDb250ZW50Q29uc3VtZXIgcGFyZW50IG90aGVyIHRoYW4gYW4gSUZlYXR1cmUuCisJICogQHNpbmNlIDIuMCAKKwkgKi8KKwlwdWJsaWMgSUNvbnRlbnRDb25zdW1lciBvcGVuKElQbHVnaW5FbnRyeSBwbHVnaW5FbnRyeSkgdGhyb3dzIENvcmVFeGNlcHRpb247CisJCisJLyoqCisJICogY2xvc2VzIHRoZSBvcGVuZWQgU2l0ZUNvbnRlbnRDb25zdW1lcgorCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgorCSAqIEBzaW5jZSAyLjAgCisJICovCisJcHVibGljIElGZWF0dXJlUmVmZXJlbmNlIGNsb3NlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gOwkKKwkKKworCS8qKgorCSAqIGFib3J0cyB0aGUgb3BlbmVkIFNpdGVDb250ZW50Q29uc3VtZXIKKwkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KKwkgKiBAc2luY2UgMi4wIAorCSAqLworCXB1YmxpYyB2b2lkIGFib3J0KCkgdGhyb3dzIENvcmVFeGNlcHRpb247CQkKKwkKK30KKworCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0luc3RhbGxDb25maWd1cmF0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0luc3RhbGxDb25maWd1cmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA4MDFkZAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvSW5zdGFsbENvbmZpZ3VyYXRpb24uamF2YQpAQCAtMCwwICsxLDk3NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOworCitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm1vZGVsLlNpdGVMb2NhbE1vZGVsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkxpc3RlbmVyTGlzdDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLklBY3Rpdml0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi5JQ29uZmlndXJlZFNpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uSUluc3RhbGxDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLklJbnN0YWxsQ29uZmlndXJhdGlvbkNoYW5nZWRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi5JUHJvYmxlbUhhbmRsZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci5Db25maWd1cmF0b3JVdGlsczsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLklQbGF0Zm9ybUNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuRmVhdHVyZUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JUGx1Z2luRW50cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVNpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVNpdGVDb250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVNpdGVGZWF0dXJlUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlNpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuU2l0ZU1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuVXRpbGl0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlZlcnNpb25lZElkZW50aWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuU2l0ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb25maWd1cmF0b3IuQ29uZmlndXJhdGlvbkFjdGl2YXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29uZmlndXJhdG9yLkZlYXR1cmVFbnRyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29uZmlndXJhdG9yLlBsYXRmb3JtQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29uZmlndXJhdG9yLlBsdWdpbkVudHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb25maWd1cmF0b3IuU2l0ZUVudHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5tb2RlbC5Db25maWd1cmF0aW9uQWN0aXZpdHlNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwubW9kZWwuQ29uZmlndXJlZFNpdGVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwubW9kZWwuSW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbDsKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOworCisvKioKKyAqIE1hbmFnZXMgQ29uZmlndXJlZFNpdGVzCisgKgorICovCisKK3B1YmxpYyBjbGFzcyBJbnN0YWxsQ29uZmlndXJhdGlvbiBleHRlbmRzIEluc3RhbGxDb25maWd1cmF0aW9uTW9kZWwgaW1wbGVtZW50cyBJSW5zdGFsbENvbmZpZ3VyYXRpb24geworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNXaW5kb3dzID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIikuc3RhcnRzV2l0aCgiV2luIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCXByaXZhdGUgTGlzdGVuZXJMaXN0IGxpc3RlbmVycyA9IG5ldyBMaXN0ZW5lckxpc3QoTGlzdGVuZXJMaXN0LklERU5USVRZKTsKKworCS8qCisJICogZGVmYXVsdCBjb25zdHJ1Y3Rvci4KKwkgKi8KKwlwdWJsaWMgSW5zdGFsbENvbmZpZ3VyYXRpb24oKSB7CisJfQorCisJLyoKKwkgKiBDb3B5IGNvbnN0cnVjdG9yIAorCSAqIEBzaW5jZSAzLjAKKwkgKi8KKwlwdWJsaWMgSW5zdGFsbENvbmZpZ3VyYXRpb24oSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZykgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7CisJCXRoaXMoY29uZmlnLCBudWxsLCBudWxsKTsKKwl9CisJCisJLyoKKwkgKiBjb3B5IGNvbnN0cnVjdG9yCisJICovCisJcHVibGljIEluc3RhbGxDb25maWd1cmF0aW9uKElJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcsIFVSTCBuZXdMb2NhdGlvbiwgU3RyaW5nIGxhYmVsKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKKwkJLy8gc2V0IGN1cnJlbnQgZGF0ZSBhbmQgdGltZWxpbmUgYXMgY2FsbGVyIGNhbiBjYWxsIHNldERhdGUgaWYgdGhlCisJCS8vIGRhdGUgb24gdGhlIFVSTCBzdHJpbmcgaGFzIHRvIGJlIHRoZSBzYW1lCisJCURhdGUgbm93ID0gbmV3IERhdGUoKTsKKwkJc2V0Q3JlYXRpb25EYXRlKG5vdyk7CisJCXNldEN1cnJlbnQoZmFsc2UpOworCQkKKwkJaWYgKG5ld0xvY2F0aW9uID09IG51bGwpIHsKKwkJCVN0cmluZyBuZXdGaWxlTmFtZSA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRMb2NhbFJhbmRvbUlkZW50aWZpZXIoU2l0ZUxvY2FsTW9kZWwuQ09ORklHX0ZJTEUsIG5vdyk7CisJCQluZXdMb2NhdGlvbiA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwoKChMb2NhbFNpdGUpU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkpLmdldExvY2F0aW9uVVJMKCksIG5ld0ZpbGVOYW1lLCBudWxsKTsKKwkJfQorCQlzZXRMb2NhdGlvblVSTFN0cmluZyhuZXdMb2NhdGlvbi50b0V4dGVybmFsRm9ybSgpKTsKKwkJCisJCWlmIChsYWJlbCA9PSBudWxsKQorCQkJbGFiZWwgPSBVdGlsaXRpZXMuZm9ybWF0KG5vdyk7CisJCXNldExhYmVsKGxhYmVsKTsKKworCQkvLyBkbyBub3QgY29weSBsaXN0IG9mIGxpc3RlbmVycyBub3IgYWN0aXZpdGllcworCQkvLyBtYWtlIGEgY29weSBvZiB0aGUgc2l0ZUNvbmZpZ3VyYXRpb24gb2JqZWN0CisJCWlmIChjb25maWcgIT0gbnVsbCkgeworCQkJSUNvbmZpZ3VyZWRTaXRlW10gY3NpdGVzID0gY29uZmlnLmdldENvbmZpZ3VyZWRTaXRlcygpOworCQkJaWYgKGNzaXRlcyAhPSBudWxsKSB7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjc2l0ZXMubGVuZ3RoOyBpKyspIHsKKwkJCQkJQ29uZmlndXJlZFNpdGUgY29uZmlnU2l0ZSA9IG5ldyBDb25maWd1cmVkU2l0ZShjc2l0ZXNbaV0pOworCQkJCQlhZGRDb25maWd1cmF0aW9uU2l0ZU1vZGVsKGNvbmZpZ1NpdGUpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCXJlc29sdmUobmV3TG9jYXRpb24sIG51bGwpOworCQkvLyBubyBuZWVkIHRvIHBhcnNlIGZpbGUsIGFsbCBkYXRhIGFyZSBpbml0aWFsaXplZAorCQlpbml0aWFsaXplZCA9IHRydWU7CisJfQorCQorCisJLyoKKwkgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGNvbmZpZ3VyZWQgc2l0ZXMgb3IgYW4gZW1wdHkgYXJyYXkKKwkgKi8KKwlwdWJsaWMgSUNvbmZpZ3VyZWRTaXRlW10gZ2V0Q29uZmlndXJlZFNpdGVzKCkgeworCQlDb25maWd1cmVkU2l0ZU1vZGVsW10gcmVzdWx0ID0gZ2V0Q29uZmlndXJhdGlvblNpdGVzTW9kZWwoKTsKKwkJaWYgKHJlc3VsdC5sZW5ndGggPT0gMCkKKwkJCXJldHVybiBuZXcgSUNvbmZpZ3VyZWRTaXRlWzBdOworCQllbHNlCisJCQlyZXR1cm4gKElDb25maWd1cmVkU2l0ZVtdKSByZXN1bHQ7CisJfQorCisJLyoKKwkgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHNpdGUgcG9saWN5CisJICovCisJcHJpdmF0ZSBpbnQgZ2V0RGVmYXVsdFBvbGljeSgpIHsKKwkJcmV0dXJuIFBsYXRmb3JtQ29uZmlndXJhdGlvbi5nZXREZWZhdWx0UG9saWN5KCk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIENvbmZpZ3VyYXRpb24gU2l0ZSBhbmQgYSBuZXcgU2l0ZQorCSAqIFRoZSBwb2xpY3kgaXMgZnJvbSA8Y29kZT4gb3JnLmVjbGlwc2UuY29yZS5ib290LklQbGF0Zm9ybUNvbmZpZ3VyYXRpb248L2NvZGU+CisJICovCisJcHVibGljIElDb25maWd1cmVkU2l0ZSBjcmVhdGVDb25maWd1cmVkU2l0ZShGaWxlIGZpbGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKworCQlpZiAoIWZpbGUuZ2V0TmFtZSgpLmVxdWFscygiZWNsaXBzZSIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCWZpbGUgPSBuZXcgRmlsZShmaWxlLCAiZWNsaXBzZSIpOyAvLyROT04tTkxTLTEkCisJCQlmaWxlLm1rZGlycygpOworCQl9CisJCQorCQlpZiAoaXNEdXBsaWNhdGVTaXRlKGZpbGUpKQorCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oTkxTLmJpbmQoTWVzc2FnZXMuSW5zdGFsbENvbmZpZ3VyYXRpb25fbG9jYXRpb25fZXhpc3RzLCAobmV3IFN0cmluZ1tdIHsgZmlsZS5nZXRQYXRoKCkgfSkpLG51bGwpOworCQlJU2l0ZSBzaXRlID0gSW50ZXJuYWxTaXRlTWFuYWdlci5jcmVhdGVTaXRlKGZpbGUpOworCisJCS8vY3JlYXRlIGEgY29uZmlnIHNpdGUgYXJvdW5kIHRoZSBzaXRlCisJCS8vIGV2ZW4gaWYgdGhlIHNpdGUgPT0gbnVsbAorCQlCYXNlU2l0ZUxvY2FsRmFjdG9yeSBmYWN0b3J5ID0gbmV3IEJhc2VTaXRlTG9jYWxGYWN0b3J5KCk7CisJCUNvbmZpZ3VyZWRTaXRlIGNvbmZpZ1NpdGUgPSAoQ29uZmlndXJlZFNpdGUpIGZhY3RvcnkuY3JlYXRlQ29uZmlndXJhdGlvblNpdGVNb2RlbCgoU2l0ZU1vZGVsKSBzaXRlLCBnZXREZWZhdWx0UG9saWN5KCkpOworCisJCWlmIChjb25maWdTaXRlLmlzTmF0aXZlbHlMaW5rZWQoKSkgeworCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oTWVzc2FnZXMuSW5zdGFsbENvbmZpZ3VyYXRpb25fQWxyZWFkeU5hdGl2ZWx5TGlua2VkLCBudWxsKTsgCisJCX0KKwkJCisJCWlmIChjb25maWdTaXRlLmlzUHJvZHVjdFNpdGUoKSkgeworCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oTWVzc2FnZXMuSW5zdGFsbENvbmZpZ3VyYXRpb25fQWxyZWFkeVByb2R1Y3RTaXRlLCBudWxsKTsgCisJCX0KKwkJCisJCWlmIChzaXRlICE9IG51bGwpIHsKKwkJCWNvbmZpZ1NpdGUuc2V0UGxhdGZvcm1VUkxTdHJpbmcoc2l0ZS5nZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpKTsKKworCQkJLy8gb2J0YWluIHRoZSBsaXN0IG9mIHBsdWdpbnMKKwkJCUlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24gcnVudGltZUNvbmZpZ3VyYXRpb24gPSBDb25maWd1cmF0b3JVdGlscy5nZXRDdXJyZW50UGxhdGZvcm1Db25maWd1cmF0aW9uKCk7CisJCQlDb25maWd1cmF0aW9uUG9saWN5IGNvbmZpZ3VyYXRpb25Qb2xpY3kgPSBjb25maWdTaXRlLmdldENvbmZpZ3VyYXRpb25Qb2xpY3koKTsKKwkJCVN0cmluZ1tdIHBsdWdpblBhdGggPSBuZXcgU3RyaW5nWzBdOworCQkJaWYgKGNvbmZpZ3VyYXRpb25Qb2xpY3kuZ2V0UG9saWN5KCkgPT0gSVBsYXRmb3JtQ29uZmlndXJhdGlvbi5JU2l0ZVBvbGljeS5VU0VSX0lOQ0xVREUpCisJCQkJcGx1Z2luUGF0aCA9IGNvbmZpZ3VyYXRpb25Qb2xpY3kuZ2V0UGx1Z2luUGF0aChzaXRlKTsKKworCQkJLy8gY3JlYXRlIG5ldyBTaXRlIGluIGNvbmZpZ3VyYXRpb24KKwkJCUlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24uSVNpdGVQb2xpY3kgc2l0ZVBvbGljeSA9IHJ1bnRpbWVDb25maWd1cmF0aW9uLmNyZWF0ZVNpdGVQb2xpY3koY29uZmlndXJhdGlvblBvbGljeS5nZXRQb2xpY3koKSwgcGx1Z2luUGF0aCk7CisKKwkJCS8vIGNoYW5nZSBydW50aW1lCisJCQlJUGxhdGZvcm1Db25maWd1cmF0aW9uLklTaXRlRW50cnkgc2l0ZUVudHJ5ID0gcnVudGltZUNvbmZpZ3VyYXRpb24uY3JlYXRlU2l0ZUVudHJ5KHNpdGUuZ2V0VVJMKCksIHNpdGVQb2xpY3kpOworCQkJcnVudGltZUNvbmZpZ3VyYXRpb24uY29uZmlndXJlU2l0ZShzaXRlRW50cnkpOworCisJCQkvLyBpZiB0aGUgcHJpdmF0cmUgbWFya2VyIGRvZXNuJ3QgYWxyZWFkeSBleGlzdCBjcmVhdGUgaXQKKwkJCWNvbmZpZ1NpdGUuY3JlYXRlUHJpdmF0ZVNpdGVNYXJrZXIoKTsKKwkJCSgoU2l0ZU1vZGVsKXNpdGUpLnNldENvbmZpZ3VyZWRTaXRlTW9kZWwoY29uZmlnU2l0ZSk7CisJCX0KKwkJLy8gY29uZmlndXJlIGFsbCBmZWF0dXJlcyBhcyBlbmFibGUKKwkJY29uZmlndXJlKGNvbmZpZ1NpdGUpOworCQkKKwkJcmV0dXJuIGNvbmZpZ1NpdGU7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIENvbmZpZ3VyYXRpb24gU2l0ZSBhbmQgYSBuZXcgU2l0ZSBhcyBhIHByaXZhdGUgbGluayBzaXRlCisJICogVGhlIHBvbGljeSBpcyBmcm9tIDxjb2RlPiBvcmcuZWNsaXBzZS5jb3JlLmJvb3QuSVBsYXRmb3JtQ29uZmlndXJhdGlvbjwvY29kZT4KKwkgKi8KKwlwdWJsaWMgSUNvbmZpZ3VyZWRTaXRlIGNyZWF0ZUxpbmtlZENvbmZpZ3VyZWRTaXRlKEZpbGUgZmlsZSkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlyZXR1cm4gY3JlYXRlQ29uZmlndXJlZFNpdGUoZmlsZSk7CisvLwkJaWYgKGlzRHVwbGljYXRlU2l0ZShmaWxlKSkKKy8vCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oVXBkYXRlVXRpbHMuZ2V0Rm9ybWF0dGVkTWVzc2FnZSgiSW5zdGFsbENvbmZpZ3VyYXRpb24ubG9jYXRpb24uZXhpc3RzIiwgZmlsZS5nZXRQYXRoKCkpLG51bGwpOworLy8JCQorLy8JCUlTaXRlIHNpdGUgPSBJbnRlcm5hbFNpdGVNYW5hZ2VyLmNyZWF0ZVNpdGUoZmlsZSk7CisvLworLy8JCS8vY3JlYXRlIGEgY29uZmlnIHNpdGUgYXJvdW5kIHRoZSBzaXRlCisvLwkJLy8gZXZlbiBpZiB0aGUgc2l0ZSA9PSBudWxsCisvLwkJQmFzZVNpdGVMb2NhbEZhY3RvcnkgZmFjdG9yeSA9IG5ldyBCYXNlU2l0ZUxvY2FsRmFjdG9yeSgpOworLy8JCUNvbmZpZ3VyZWRTaXRlIGNvbmZpZ1NpdGUgPSAoQ29uZmlndXJlZFNpdGUpIGZhY3RvcnkuY3JlYXRlQ29uZmlndXJhdGlvblNpdGVNb2RlbCgoU2l0ZU1vZGVsKSBzaXRlLCBnZXREZWZhdWx0UG9saWN5KCkpOworLy8KKy8vCQlpZiAoIWNvbmZpZ1NpdGUuaXNFeHRlbnNpb25TaXRlKCkpIHsKKy8vCQkJU3RyaW5nIG1zZyA9IFBvbGljeS5iaW5kKCJJbnN0YWxsQ29uZmlndXJhdGlvbi5Ob3RBbkV4dGVuc2lvblNpdGUiKTsKKy8vCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24obXNnLCBudWxsKTsKKy8vCQl9CisvLworLy8JCWlmIChjb25maWdTaXRlLmlzTmF0aXZlbHlMaW5rZWQoKSkgeworLy8JCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbigiSW5zdGFsbENvbmZpZ3VyYXRpb24uQWxyZWFkeU5hdGl2ZWx5TGlua2VkIiwgbnVsbCk7CisvLwkJfQorLy8KKy8vCQlpZiAoc2l0ZSAhPSBudWxsKSB7CisvLwkJCWNvbmZpZ1NpdGUuc2V0UGxhdGZvcm1VUkxTdHJpbmcoc2l0ZS5nZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpKTsKKy8vCisvLwkJCS8vIG9idGFpbiB0aGUgbGlzdCBvZiBwbHVnaW5zCisvLwkJCUlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24gcnVudGltZUNvbmZpZ3VyYXRpb24gPSBDb25maWd1cmF0b3JVdGlscy5nZXRDdXJyZW50UGxhdGZvcm1Db25maWd1cmF0aW9uKCk7CisvLwkJCUNvbmZpZ3VyYXRpb25Qb2xpY3kgY29uZmlndXJhdGlvblBvbGljeSA9IGNvbmZpZ1NpdGUuZ2V0Q29uZmlndXJhdGlvblBvbGljeSgpOworLy8JCQlTdHJpbmdbXSBwbHVnaW5QYXRoID0gbmV3IFN0cmluZ1swXTsKKy8vCQkJaWYgKGNvbmZpZ3VyYXRpb25Qb2xpY3kuZ2V0UG9saWN5KCkgPT0gSVBsYXRmb3JtQ29uZmlndXJhdGlvbi5JU2l0ZVBvbGljeS5VU0VSX0lOQ0xVREUpCisvLwkJCQlwbHVnaW5QYXRoID0gY29uZmlndXJhdGlvblBvbGljeS5nZXRQbHVnaW5QYXRoKHNpdGUpOworLy8KKy8vCQkJLy8gY3JlYXRlIG5ldyBTaXRlIGluIGNvbmZpZ3VyYXRpb24KKy8vCQkJSVBsYXRmb3JtQ29uZmlndXJhdGlvbi5JU2l0ZVBvbGljeSBzaXRlUG9saWN5ID0gcnVudGltZUNvbmZpZ3VyYXRpb24uY3JlYXRlU2l0ZVBvbGljeShjb25maWd1cmF0aW9uUG9saWN5LmdldFBvbGljeSgpLCBwbHVnaW5QYXRoKTsKKy8vCisvLwkJCS8vIGNoYW5nZSBydW50aW1lCisvLwkJCUlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24uSVNpdGVFbnRyeSBzaXRlRW50cnkgPSBydW50aW1lQ29uZmlndXJhdGlvbi5jcmVhdGVTaXRlRW50cnkoc2l0ZS5nZXRVUkwoKSwgc2l0ZVBvbGljeSk7CisvLwkJCXJ1bnRpbWVDb25maWd1cmF0aW9uLmNvbmZpZ3VyZVNpdGUoc2l0ZUVudHJ5KTsKKy8vCisvLwkJfQorLy8KKy8vCQkvLyBjb25maWd1cmUgYWxsIGZlYXR1cmVzIGFzIGVuYWJsZQorLy8JCWNvbmZpZ3VyZShjb25maWdTaXRlKTsKKy8vCisvLwkJcmV0dXJuIGNvbmZpZ1NpdGU7CisJfQorCisJLyoKKwkgKkNvbmZpZ3VyZSBhbGwgZmVhdHVyZXMgYXMgRW5hYmxlIENoZWNrIHdlIG9ubHkgZW5hYmxlIGhpZ2hlc3QgdmVyc2lvbgorCSAqLworCXByaXZhdGUgdm9pZCBjb25maWd1cmUoQ29uZmlndXJlZFNpdGUgbGlua2VkU2l0ZSkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlJU2l0ZSBzaXRlID0gbGlua2VkU2l0ZS5nZXRTaXRlKCk7CisJCUlTaXRlRmVhdHVyZVJlZmVyZW5jZVtdIG5ld0ZlYXR1cmVzUmVmID0gc2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpOworCisJCWZvciAoaW50IGkgPSAwOyBpIDwgbmV3RmVhdHVyZXNSZWYubGVuZ3RoOyBpKyspIHsKKwkJCS8vIFRSQUNFCisJCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfUkVDT05DSUxFUikgeworCQkJCVN0cmluZyByZWNvbmNpbGlhdGlvblR5cGUgPSAiZW5hYmxlIChvcHRpbWlzdGljKSI7IC8vJE5PTi1OTFMtMSQKKwkJCQlVcGRhdGVDb3JlLmRlYnVnKCJOZXcgTGlua2VkIFNpdGU6TmV3IEZlYXR1cmU6ICIgKyBuZXdGZWF0dXJlc1JlZltpXS5nZXRVUkwoKSArICIgYXMgIiArIHJlY29uY2lsaWF0aW9uVHlwZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJfQorCQkJQ29uZmlndXJhdGlvblBvbGljeSBwb2xpY3kgPSBsaW5rZWRTaXRlLmdldENvbmZpZ3VyYXRpb25Qb2xpY3koKTsKKwkJCXBvbGljeS5jb25maWd1cmUobmV3RmVhdHVyZXNSZWZbaV0sIHRydWUsIGZhbHNlKTsKKwkJfQorCQlTaXRlUmVjb25jaWxlci5jaGVja0NvbmZpZ3VyZWRGZWF0dXJlcyhsaW5rZWRTaXRlKTsKKwl9CisKKwkvKgorCSAqCisJICovCisJcHVibGljIHZvaWQgYWRkQ29uZmlndXJlZFNpdGUoSUNvbmZpZ3VyZWRTaXRlIHNpdGUpIHsKKwkJaWYgKCFpc0N1cnJlbnQoKSAmJiBpc1JlYWRPbmx5KCkpCisJCQlyZXR1cm47CisKKwkJQ29uZmlndXJhdGlvbkFjdGl2aXR5IGFjdGl2aXR5ID0gbmV3IENvbmZpZ3VyYXRpb25BY3Rpdml0eShJQWN0aXZpdHkuQUNUSU9OX1NJVEVfSU5TVEFMTCk7CisJCWFjdGl2aXR5LnNldExhYmVsKHNpdGUuZ2V0U2l0ZSgpLmdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkpOworCQlhY3Rpdml0eS5zZXREYXRlKG5ldyBEYXRlKCkpOworCQlDb25maWd1cmVkU2l0ZU1vZGVsIGNvbmZpZ1NpdGVNb2RlbCA9IChDb25maWd1cmVkU2l0ZU1vZGVsKSBzaXRlOworCQlhZGRDb25maWd1cmF0aW9uU2l0ZU1vZGVsKGNvbmZpZ1NpdGVNb2RlbCk7CisJCWNvbmZpZ1NpdGVNb2RlbC5zZXRJbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsKHRoaXMpOworCisJCS8vIG5vdGlmeSBsaXN0ZW5lcnMKKwkJT2JqZWN0W10gY29uZmlndXJhdGlvbkxpc3RlbmVycyA9IGxpc3RlbmVycy5nZXRMaXN0ZW5lcnMoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWd1cmF0aW9uTGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7CisJCQlJSW5zdGFsbENvbmZpZ3VyYXRpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIgPSAoKElJbnN0YWxsQ29uZmlndXJhdGlvbkNoYW5nZWRMaXN0ZW5lcikgY29uZmlndXJhdGlvbkxpc3RlbmVyc1tpXSk7CisJCQlsaXN0ZW5lci5pbnN0YWxsU2l0ZUFkZGVkKHNpdGUpOworCQl9CisKKwkJLy8gZXZlcnl0aGluZyBkb25lIG9rCisJCWFjdGl2aXR5LnNldFN0YXR1cyhJQWN0aXZpdHkuU1RBVFVTX09LKTsKKwkJdGhpcy5hZGRBY3Rpdml0eShhY3Rpdml0eSk7CisJfQorCisJLyoqCisJICogTWV0aG9kIGFkZEFjdGl2aXR5LgorCSAqIEBwYXJhbSBhY3Rpdml0eQorCSAqLworCXB1YmxpYyB2b2lkIGFkZEFjdGl2aXR5KElBY3Rpdml0eSBhY3Rpdml0eSkgeworCQlhZGRBY3Rpdml0eU1vZGVsKChDb25maWd1cmF0aW9uQWN0aXZpdHlNb2RlbClhY3Rpdml0eSk7CisJfQorCisJLyoKKwkgKgorCSAqLworCXB1YmxpYyB2b2lkIHJlbW92ZUNvbmZpZ3VyZWRTaXRlKElDb25maWd1cmVkU2l0ZSBzaXRlKSB7CisJCWlmICghaXNDdXJyZW50KCkgJiYgaXNSZWFkT25seSgpKQorCQkJcmV0dXJuOworCisJCWlmIChyZW1vdmVDb25maWd1cmF0aW9uU2l0ZU1vZGVsKChDb25maWd1cmVkU2l0ZU1vZGVsKSBzaXRlKSkgeworCQkJLy8gbm90aWZ5IGxpc3RlbmVycworCQkJT2JqZWN0W10gY29uZmlndXJhdGlvbkxpc3RlbmVycyA9IGxpc3RlbmVycy5nZXRMaXN0ZW5lcnMoKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlndXJhdGlvbkxpc3RlbmVycy5sZW5ndGg7IGkrKykgeworCQkJCUlJbnN0YWxsQ29uZmlndXJhdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lciA9ICgoSUluc3RhbGxDb25maWd1cmF0aW9uQ2hhbmdlZExpc3RlbmVyKSBjb25maWd1cmF0aW9uTGlzdGVuZXJzW2ldKTsKKwkJCQlsaXN0ZW5lci5pbnN0YWxsU2l0ZVJlbW92ZWQoc2l0ZSk7CisJCQl9CisJCQkKKwkJCS8vYWN0aXZpdHkKKwkJCUNvbmZpZ3VyYXRpb25BY3Rpdml0eSBhY3Rpdml0eSA9IG5ldyBDb25maWd1cmF0aW9uQWN0aXZpdHkoSUFjdGl2aXR5LkFDVElPTl9TSVRFX1JFTU9WRSk7CisJCQlhY3Rpdml0eS5zZXRMYWJlbChzaXRlLmdldFNpdGUoKS5nZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpKTsKKwkJCWFjdGl2aXR5LnNldERhdGUobmV3IERhdGUoKSk7CisJCQlhY3Rpdml0eS5zZXRTdGF0dXMoSUFjdGl2aXR5LlNUQVRVU19PSyk7CisJCQl0aGlzLmFkZEFjdGl2aXR5KGFjdGl2aXR5KTsKKwkJfQorCX0KKworCS8qCisJICogQHNlZSBJSW5zdGFsbENvbmZpZ3VyYXRpb24jYWRkSW5zdGFsbENvbmZpZ3VyYXRpb25DaGFuZ2VkTGlzdGVuZXIoSUluc3RhbGxDb25maWd1cmF0aW9uQ2hhbmdlZExpc3RlbmVyKQorCSAqLworCXB1YmxpYyB2b2lkIGFkZEluc3RhbGxDb25maWd1cmF0aW9uQ2hhbmdlZExpc3RlbmVyKElJbnN0YWxsQ29uZmlndXJhdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgeworCQlsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKKwl9CisKKwkvKgorCSAqIEBzZWUgSUluc3RhbGxDb25maWd1cmF0aW9uI3JlbW92ZUluc3RhbGxDb25maWd1cmF0aW9uQ2hhbmdlZExpc3RlbmVyKElJbnN0YWxsQ29uZmlndXJhdGlvbkNoYW5nZWRMaXN0ZW5lcikKKwkgKi8KKwlwdWJsaWMgdm9pZCByZW1vdmVJbnN0YWxsQ29uZmlndXJhdGlvbkNoYW5nZWRMaXN0ZW5lcihJSW5zdGFsbENvbmZpZ3VyYXRpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJbGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7CisJfQorCisKKwkvKgorCSAqIERlbGV0ZXMgdGhlIGNvbmZpZ3VyYXRpb24gZnJvbSBpdHMgVVJML2xvY2F0aW9uCisJICovCisJcHVibGljIHZvaWQgcmVtb3ZlKCkgeworCQkvLyBzYXZlIHRoZSBjb25maWd1cmF0aW9uCisJCWlmICgiZmlsZSIuZXF1YWxzSWdub3JlQ2FzZShnZXRVUkwoKS5nZXRQcm90b2NvbCgpKSkgeyAvLyROT04tTkxTLTEkCisJCQkvLyB0aGUgbG9jYXRpb24gcG9pbnRzIHRvIGEgZmlsZQorCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZ2V0VVJMKCkuZ2V0RmlsZSgpKTsKKwkJCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShmaWxlKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFNhdmVzIHRoZSBjb25maWd1cmF0aW9uIGludG8gaXRzIFVSTC9sb2NhdGlvbgorCSAqIGFuZCBjaGFuZ2VzIHRoZSBwbGF0Zm9ybSBjb25maWd1cmF0aW9uLgorCSAqIFRoZSBydW50aW1lIHNpdGUgZW50cmllcyBmcm9tIHBsYXRmb3JtLnhtbCBhcmUgdXBkYXRlZCBhcyByZXF1aXJlZAorCSAqIChjYW5ub3QgcmVjcmVhdGUgdGhlc2UgYmVjYXVzZSBtdXN0IHByZXNlcnZlIG90aGVyIHJ1bnRpbWUgc3RhdGUpIFsxODUyMF0KKwkgKiBAcmV0dXJuIHRydWUgaWYgcmVzdGFydCBpcyBuZWVkZWQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBzYXZlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQkKKwkJLy8gV3JpdGUgaW5mbyAgaW50byBwbGF0Zm9ybSBmb3IgdGhlIG5leHQgcnVudGltZQorCQlJUGxhdGZvcm1Db25maWd1cmF0aW9uIHJ1bnRpbWVDb25maWd1cmF0aW9uID0gQ29uZmlndXJhdG9yVXRpbHMuZ2V0Q3VycmVudFBsYXRmb3JtQ29uZmlndXJhdGlvbigpOworCQlDb25maWd1cmVkU2l0ZU1vZGVsW10gY29uZmlndXJhdGlvblNpdGVzID0gZ2V0Q29uZmlndXJhdGlvblNpdGVzTW9kZWwoKTsKKworCQkvLyBjbGVhbiBjb25maWd1cmVkIEVudHJpZXMgZnJvbSBwbGF0Zm9ybSBydW50aW1lCisJCUlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24uSUZlYXR1cmVFbnRyeVtdIGNvbmZpZ3VyZWRGZWF0dXJlRW50cmllcyA9IHJ1bnRpbWVDb25maWd1cmF0aW9uLmdldENvbmZpZ3VyZWRGZWF0dXJlRW50cmllcygpOworCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZ3VyZWRGZWF0dXJlRW50cmllcy5sZW5ndGg7IGkrKykgeworCQkJcnVudGltZUNvbmZpZ3VyYXRpb24udW5jb25maWd1cmVGZWF0dXJlRW50cnkoY29uZmlndXJlZEZlYXR1cmVFbnRyaWVzW2ldKTsKKwkJfQorCisJCS8vIFsxOTk1OF0gcmVtZW1iZXIgc2l0ZXMgY3VycmVudGx5IGNvbmZpZ3VyZWQgYnkgcnVudGltZSAodXNlCisJCS8vIHRlbXAgY29uZmlndXJhdGlvbiBvYmplY3QgcmF0aGVyIHRoYW4gYSBzdHJhaWdodCBsaXN0IHRvIGVuc3VyZQorCQkvLyBjb3JyZWN0IGxvb2t1cCkKKwkJSVBsYXRmb3JtQ29uZmlndXJhdGlvbiB0ZW1wQ29uZmlnID0gbnVsbDsKKwkJdHJ5IHsKKwkJCXRlbXBDb25maWcgPSBDb25maWd1cmF0b3JVdGlscy5nZXRQbGF0Zm9ybUNvbmZpZ3VyYXRpb24obnVsbCk7CisJCQlJUGxhdGZvcm1Db25maWd1cmF0aW9uLklTaXRlRW50cnlbXSB0bXBTaXRlcyA9IHJ1bnRpbWVDb25maWd1cmF0aW9uLmdldENvbmZpZ3VyZWRTaXRlcygpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0bXBTaXRlcy5sZW5ndGg7IGkrKykgeworCQkJCXRlbXBDb25maWcuY29uZmlndXJlU2l0ZSh0bXBTaXRlc1tpXSk7CisJCQl9CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCS8vIGFzc3VtZSBubyBjdXJyZW50bHkgY29uZmlndXJlZCBzaXRlcworCQl9CisKKwkJLy9jaGVjayBzaXRlcworCQljaGVja1NpdGVzKGNvbmZpZ3VyYXRpb25TaXRlcywgcnVudGltZUNvbmZpZ3VyYXRpb24pOworCisJCS8vIFNhdmUgdGhlIHBsdWdpbiBwYXRoLCBwcmltYXJ5IGZlYXR1cmUgYW5kIHBsYXRmb3JtCisJCWZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlndXJhdGlvblNpdGVzLmxlbmd0aDsgaSsrKSB7CisJCQlDb25maWd1cmVkU2l0ZSBjU2l0ZSA9ICgoQ29uZmlndXJlZFNpdGUpIGNvbmZpZ3VyYXRpb25TaXRlc1tpXSk7CisJCQlDb25maWd1cmF0aW9uUG9saWN5IGNvbmZpZ3VyYXRpb25Qb2xpY3kgPSBjU2l0ZS5nZXRDb25maWd1cmF0aW9uUG9saWN5KCk7CisKKwkJCXNhdmVQbHVnaW5QYXRoKGNTaXRlLCBydW50aW1lQ29uZmlndXJhdGlvbiwgdGVtcENvbmZpZyk7CisKKwkJCS8vIElGIHByaW1hcnkgZmVhdHVyZSBVUkwgb3IgcGxhdGZvcm0gZmVhdHVyZSBVUkwgdGhhdCB3ZSBuZWVkIHRvIHBhc3MgdG8gcnVudGltZSBjb25maWcKKwkJCS8vIGlzIHBhcnQgb2YgcGxhdGZvcm06YmFzZTosIHdyaXRlIGl0IGFzIHBsYXRmb3JtOmJhc2U6IFVSTAorCQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBjb25maWd1cmVkRmVhdHVyZXNSZWYgPSBjb25maWd1cmF0aW9uUG9saWN5LmdldENvbmZpZ3VyZWRGZWF0dXJlcygpOworCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjb25maWd1cmVkRmVhdHVyZXNSZWYubGVuZ3RoOyBqKyspIHsKKwkJCQlJRmVhdHVyZSBmZWF0dXJlID0gbnVsbDsKKwkJCQl0cnkgeworCQkJCQlmZWF0dXJlID0gY29uZmlndXJlZEZlYXR1cmVzUmVmW2pdLmdldEZlYXR1cmUobnVsbCk7CisJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkJCVVwZGF0ZUNvcmUud2FybihudWxsLCBlKTsKKwkJCQl9CisJCQkJc2F2ZUZlYXR1cmVFbnRyeShjU2l0ZSwgZmVhdHVyZSwgcnVudGltZUNvbmZpZ3VyYXRpb24pOworCQkJfQorCQl9CisKKwkJLy8gWzE5OTU4XSByZW1vdmUgYW55IGV4dHJhIHNpdGUgZW50cmllcyBmcm9tIHJ1bnRpbWUgY29uZmlndXJhdGlvbgorCQkvLyAoc2l0ZSBlbnRyaWVzIHRoYXQgbm8gbG9uZ2VyIGV4aXN0IGluIHRoaXMgY29uZmlndXJhdGlvbikKKwkJaWYgKHRlbXBDb25maWcgIT0gbnVsbCkgeworCQkJSVBsYXRmb3JtQ29uZmlndXJhdGlvbi5JU2l0ZUVudHJ5W10gdG1wU2l0ZXMgPSB0ZW1wQ29uZmlnLmdldENvbmZpZ3VyZWRTaXRlcygpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0bXBTaXRlcy5sZW5ndGg7IGkrKykgeworCQkJCXJ1bnRpbWVDb25maWd1cmF0aW9uLnVuY29uZmlndXJlU2l0ZSh0bXBTaXRlc1tpXSk7CisJCQl9CisJCX0KKworCQl0cnkgeworCQkJcnVudGltZUNvbmZpZ3VyYXRpb24uc2F2ZSgpOworCQkJLy8gbG9nIGNvbmZpZ3VyYXRpb24gYW5kIGFjdGl2aXRpZXMKKwkJCXRoaXMuZGF0ZSA9IG5ldyBEYXRlKHJ1bnRpbWVDb25maWd1cmF0aW9uLmdldENoYW5nZVN0YW1wKCkpOworCQkJaWYgKCJmaWxlIi5lcXVhbHNJZ25vcmVDYXNlKGdldFVSTCgpLmdldFByb3RvY29sKCkpKSAvLyROT04tTkxTLTEkCisJCQkJVXBkYXRlQ29yZS5sb2codGhpcyk7CisJCQlyZXNldEFjdGl2aXRpZXMoKTsKKwkJCXJldHVybiBpc1Jlc3RhcnROZWVkZWQocnVudGltZUNvbmZpZ3VyYXRpb24pOworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQlDb3JlRXhjZXB0aW9uIGV4YyA9IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLkluc3RhbGxDb25maWd1cmF0aW9uX1VuYWJsZVRvU2F2ZVBsYXRmb3JtQ29uZmlndXJhdGlvbiwgKG5ldyBTdHJpbmdbXSB7IHJ1bnRpbWVDb25maWd1cmF0aW9uLmdldENvbmZpZ3VyYXRpb25Mb2NhdGlvbigpLnRvRXh0ZXJuYWxGb3JtKCkgfSkpLCBlKTsKKwkJCVVwZGF0ZUNvcmUud2FybigiIixleGMpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCisJLyoKKwkgKiBXcml0ZSB0aGUgcGx1Z2luIHBhdGggZm9yIGVhY2ggc2l0ZQorCSAqIERvIG5vdCBjaGVjayBpZiB0aGUgc2l0ZSBhbHJlYWR5IGV4aXN0ZWQgYmVmb3JlIFsxNjY5Nl0uCisJICogUmV1c2UgYW55IHJ1bnRpbWUgc2l0ZSBvYmplY3RzIGluIHBsYXRmb3JtLmNmZyAodG8gcHJlc2VydmUgc3RhdGUpIFsxODUyMF0uCisJICovCisJcHJpdmF0ZSB2b2lkIHNhdmVQbHVnaW5QYXRoKENvbmZpZ3VyZWRTaXRlIGNTaXRlLCBJUGxhdGZvcm1Db25maWd1cmF0aW9uIHJ1bnRpbWVDb25maWd1cmF0aW9uLCBJUGxhdGZvcm1Db25maWd1cmF0aW9uIHRlbXBDb25maWcpIC8vIFsxOTk1OF0KKwl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisKKwkJQ29uZmlndXJhdGlvblBvbGljeSBjb25maWd1cmF0aW9uUG9saWN5ID0gY1NpdGUuZ2V0Q29uZmlndXJhdGlvblBvbGljeSgpOworCisJCS8vIGNyZWF0ZSBhIElTaXRlUG9saWN5IChwb2xpY3ksIHBsdWdpblBhdGgpCisJCS8vIGZvciB0aGUgc2l0ZQorCQlTdHJpbmdbXSBwbHVnaW5QYXRoID0gY29uZmlndXJhdGlvblBvbGljeS5nZXRQbHVnaW5QYXRoKGNTaXRlLmdldFNpdGUoKSk7CisJCUlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24uSVNpdGVQb2xpY3kgc2l0ZVBvbGljeSA9IHJ1bnRpbWVDb25maWd1cmF0aW9uLmNyZWF0ZVNpdGVQb2xpY3koY29uZmlndXJhdGlvblBvbGljeS5nZXRQb2xpY3koKSwgcGx1Z2luUGF0aCk7CisKKwkJLy8gZ2V0IHRoZSBVUkwgb2YgdGhlIHNpdGUgdGhhdCBtYXRjaGVzIHRoZSBvbmUgcGxhdGZvcm0uY2ZnIGdhdmUgdXMKKwkJVVJMIHVybFRvQ2hlY2sgPSBudWxsOworCQl0cnkgeworCQkJdXJsVG9DaGVjayA9IG5ldyBVUkwoY1NpdGUuZ2V0UGxhdGZvcm1VUkxTdHJpbmcoKSk7CisJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5JbnN0YWxsQ29uZmlndXJhdGlvbl9VbmFibGVUb0NyZWF0ZVVSTCwgKG5ldyBTdHJpbmdbXSB7IGNTaXRlLmdldFBsYXRmb3JtVVJMU3RyaW5nKCkgfSkpLCBlKTsKKwkJfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKE1lc3NhZ2VzLkluc3RhbGxDb25maWd1cmF0aW9uX1VuYWJsZVRvQ2FzdCwgZSk7CQorCQl9CisKKwkJLy8gdXBkYXRlIHJ1bnRpbWUgY29uZmlndXJhdGlvbiBbMTg1MjBdCisJCS8vIE5vdGU6IHdlIG11c3Qgbm90IGJsaW5kbHkgcmVwbGFjZSB0aGUgc2l0ZSBlbnRyaWVzIGJlY2F1c2UgdGhleQorCQkvLyAgICAgICBjb250YWluIGFkZGl0aW9uYWwgcnVudGltZSBzdGF0ZSB0aGF0IG5lZWRzIHRvIGJlIHByZXNlcnZlZC4KKwkJSVBsYXRmb3JtQ29uZmlndXJhdGlvbi5JU2l0ZUVudHJ5IHNpdGVFbnRyeSA9IHJ1bnRpbWVDb25maWd1cmF0aW9uLmZpbmRDb25maWd1cmVkU2l0ZSh1cmxUb0NoZWNrKTsKKwkJaWYgKHNpdGVFbnRyeSA9PSBudWxsKQorCQkJc2l0ZUVudHJ5ID0gcnVudGltZUNvbmZpZ3VyYXRpb24uY3JlYXRlU2l0ZUVudHJ5KHVybFRvQ2hlY2ssIHNpdGVQb2xpY3kpOworCQllbHNlIHsKKwkJCXNpdGVFbnRyeS5zZXRTaXRlUG9saWN5KHNpdGVQb2xpY3kpOworCQkJKChTaXRlRW50cnkpc2l0ZUVudHJ5KS5yZWZyZXNoUGx1Z2lucygpOworCQkJaWYgKHRlbXBDb25maWcgIT0gbnVsbCkgLy8gWzE5OTU4XSByZW1vdmUgcmV1c2VkIGVudHJpZXMgZnJvbSBsaXN0CisJCQkJdGVtcENvbmZpZy51bmNvbmZpZ3VyZVNpdGUoc2l0ZUVudHJ5KTsKKwkJfQorCQkoKFNpdGVFbnRyeSlzaXRlRW50cnkpLnNldEVuYWJsZWQoY1NpdGUuaXNFbmFibGVkKCkpOworCQlydW50aW1lQ29uZmlndXJhdGlvbi5jb25maWd1cmVTaXRlKHNpdGVFbnRyeSwgdHJ1ZSAvKnJlcGxhY2UgaWYgZXhpc3RzKi8pOworCX0KKworCS8qCisJICogU2F2ZSB0aGUgRmVhdHVyZSBlbnRyeQorCSAqIFRoZSBmZWF0dXJlIGNhbiBiZSBhIHByaW1hcnkgZmVhdHVyZSBhbmQvb3IgYSBwbGF0Zm9ybSBmZWF0dXJlCisJICovCisJcHJpdmF0ZSB2b2lkIHNhdmVGZWF0dXJlRW50cnkoQ29uZmlndXJlZFNpdGUgY1NpdGUsIElGZWF0dXJlIGZlYXR1cmUsIElQbGF0Zm9ybUNvbmZpZ3VyYXRpb24gcnVudGltZUNvbmZpZ3VyYXRpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJaWYgKGZlYXR1cmUgPT0gbnVsbCkKKwkJCXJldHVybjsKKworCQkvLyBnZXQgdGhlIFVSTCBvZiB0aGUgcGx1Z2luIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGZlYXR1cmUgKHBsdWdpbmlkID0gZmVhdHVyZWlkKQorCQlTdHJpbmcgaWQgPSBmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRJZGVudGlmaWVyKCk7CisJCUlQbHVnaW5FbnRyeVtdIGVudHJpZXMgPSBmZWF0dXJlLmdldFBsdWdpbkVudHJpZXMoKTsKKwkJVVJMIHVybCA9IG51bGw7CisJCUlQbHVnaW5FbnRyeSBmZWF0dXJlUGx1Z2luID0gbnVsbDsKKwkJZm9yIChpbnQgayA9IDA7IGsgPCBlbnRyaWVzLmxlbmd0aDsgaysrKSB7CisJCQlpZiAoaWQuZXF1YWxzSWdub3JlQ2FzZShlbnRyaWVzW2tdLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRJZGVudGlmaWVyKCkpKSB7CisJCQkJdXJsID0gZ2V0UnVudGltZUNvbmZpZ3VyYXRpb25VUkwoZW50cmllc1trXSwgY1NpdGUpOworCQkJCWZlYXR1cmVQbHVnaW4gPSBlbnRyaWVzW2tdOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCVN0cmluZyBwbHVnaW5WZXJzaW9uID0gbnVsbDsKKwkJaWYgKGZlYXR1cmVQbHVnaW4gIT0gbnVsbCkKKwkJCXBsdWdpblZlcnNpb24gPSBmZWF0dXJlUGx1Z2luLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRWZXJzaW9uKCkudG9TdHJpbmcoKTsKKworICAgICAgICAvLyBGaW5kIHRoZSBzaXRlCisgICAgICAgIFNpdGVFbnRyeSBzaXRlRW50cnkgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgVVJMIGZlYXR1cmVVcmwgPSBuZXcgVVJMKGNTaXRlLmdldFBsYXRmb3JtVVJMU3RyaW5nKCkpOworICAgICAgICAgICAgc2l0ZUVudHJ5ID0gKFNpdGVFbnRyeSlydW50aW1lQ29uZmlndXJhdGlvbi5maW5kQ29uZmlndXJlZFNpdGUoZmVhdHVyZVVybCk7CisgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5JbnN0YWxsQ29uZmlndXJhdGlvbl9VbmFibGVUb0NyZWF0ZVVSTCwgKG5ldyBTdHJpbmdbXSB7IGNTaXRlLmdldFBsYXRmb3JtVVJMU3RyaW5nKCkgfSkpLCBlKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKE1lc3NhZ2VzLkluc3RhbGxDb25maWd1cmF0aW9uX1VuYWJsZVRvQ2FzdCwgZSk7ICAgIAorICAgICAgICB9CisKKyAgICAgICAgLy8gaWYgdGhlIFVSTCBkb2Vzbid0IGV4aXN0IHRocm93IGEgQ29yZUV4Y2VwdGlvbgorICAgICAgICBpZiAoc2l0ZUVudHJ5ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBDb3JlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkxTLmJpbmQoTWVzc2FnZXMuSW5zdGFsbENvbmZpZ3VyYXRpb25fdW5hYmxlVG9GaW5kU2l0ZSwgKG5ldyBTdHJpbmdbXSB7IGNTaXRlLmdldFNpdGUoKS5nZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpLCBydW50aW1lQ29uZmlndXJhdGlvbi5nZXRDb25maWd1cmF0aW9uTG9jYXRpb24oKS50b0V4dGVybmFsRm9ybSgpIH0pKSkpOworICAgICAgICB9CisKKwkJLy8gd3JpdGUgdGhlIHByaW1hcnkgZmVhdHVyZXMKKwkJaWYgKGZlYXR1cmUuaXNQcmltYXJ5KCkpIHsKKwkJCS8vIGdldCBhbnkgZnJhZ21lbnRzIGZvciB0aGUgZmVhdHVyZSBwbHVnaW4KKwkJCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOworCQkJaWYgKHVybCAhPSBudWxsKQorCQkJCWxpc3QuYWRkKHVybCk7CisJCQlpZiAoZmVhdHVyZVBsdWdpbiAhPSBudWxsKSB7CisJCQkJVVJMW10gZnJhZ21lbnRzID0gZ2V0UnVudGltZUZyYWdtZW50VVJMcyhmZWF0dXJlUGx1Z2luKTsKKwkJCQlsaXN0LmFkZEFsbChBcnJheXMuYXNMaXN0KGZyYWdtZW50cykpOworCQkJfQorCQkJVVJMW10gcm9vdHMgPSAoVVJMW10pIGxpc3QudG9BcnJheShuZXcgVVJMWzBdKTsKKwkJCVN0cmluZyBwbHVnaW5JZGVudGlmaWVyID0gZmVhdHVyZS5nZXRQcmltYXJ5UGx1Z2luSUQoKTsKKworCQkJLy8gc2F2ZSBpbmZvcm1hdGlvbiBpbiBydW50aW1lIHBsYXRmb3JtIHN0YXRlCisJCQlTdHJpbmcgdmVyc2lvbiA9IGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldFZlcnNpb24oKS50b1N0cmluZygpOworCQkJU3RyaW5nIGFwcGxpY2F0aW9uID0gZmVhdHVyZS5nZXRBcHBsaWNhdGlvbigpOworCQkJRmVhdHVyZUVudHJ5IGZlYXR1cmVFbnRyeSA9IChGZWF0dXJlRW50cnkpcnVudGltZUNvbmZpZ3VyYXRpb24uY3JlYXRlRmVhdHVyZUVudHJ5KGlkLCB2ZXJzaW9uLCBwbHVnaW5JZGVudGlmaWVyLCBwbHVnaW5WZXJzaW9uLCB0cnVlLCBhcHBsaWNhdGlvbiwgcm9vdHMpOworCQkJZmVhdHVyZUVudHJ5LnNldFVSTChnZXRGZWF0dXJlUmVsYXRpdmVVUkwoZmVhdHVyZSkpOworCQkJc2l0ZUVudHJ5LmFkZEZlYXR1cmVFbnRyeShmZWF0dXJlRW50cnkpOworCQl9IGVsc2UgeworCQkJLy8gd3JpdGUgbm9uLXByaW1hcnkgZmVhdHVyZSBlbnRyaWVzCisJCQlTdHJpbmcgdmVyc2lvbiA9IGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldFZlcnNpb24oKS50b1N0cmluZygpOworCQkJU3RyaW5nIHBsdWdpbklkZW50aWZpZXIgPSBmZWF0dXJlLmdldFByaW1hcnlQbHVnaW5JRCgpOworCQkJRmVhdHVyZUVudHJ5IGZlYXR1cmVFbnRyeSA9IChGZWF0dXJlRW50cnkpcnVudGltZUNvbmZpZ3VyYXRpb24uY3JlYXRlRmVhdHVyZUVudHJ5KGlkLCB2ZXJzaW9uLCBwbHVnaW5JZGVudGlmaWVyLCBwbHVnaW5WZXJzaW9uLCBmYWxzZSwgbnVsbCwgbnVsbCk7CisJCQlmZWF0dXJlRW50cnkuc2V0VVJMKGdldEZlYXR1cmVSZWxhdGl2ZVVSTChmZWF0dXJlKSk7CisJCQlzaXRlRW50cnkuYWRkRmVhdHVyZUVudHJ5KGZlYXR1cmVFbnRyeSk7CisJCX0KKworCQkvLyB3cml0ZSB0aGUgcGxhdGZvcm0gZmVhdHVyZXMgKGZlYXR1cmVzIHRoYXQgY29udGFpbiBzcGVjaWFsIHBsYXRmb3JtIHBsdWdpbnMpCisJCUlQbHVnaW5FbnRyeVtdIHBsYXRmb3JtUGx1Z2lucyA9IGdldFBsYXRmb3JtUGx1Z2lucyhmZWF0dXJlLCBydW50aW1lQ29uZmlndXJhdGlvbik7CisJCWZvciAoaW50IGsgPSAwOyBrIDwgcGxhdGZvcm1QbHVnaW5zLmxlbmd0aDsgaysrKSB7CisJCQlpZCA9IHBsYXRmb3JtUGx1Z2luc1trXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0SWRlbnRpZmllcigpOworCQkJdXJsID0gZ2V0UnVudGltZUNvbmZpZ3VyYXRpb25VUkwocGxhdGZvcm1QbHVnaW5zW2tdLCBjU2l0ZSk7CisJCQlpZiAodXJsICE9IG51bGwpIHsKKwkJCQlydW50aW1lQ29uZmlndXJhdGlvbi5zZXRCb290c3RyYXBQbHVnaW5Mb2NhdGlvbihpZCwgdXJsKTsKKwkJCX0KKwkJfQorCX0KKworCS8qCisJICogTG9nIGlmIHdlIGFyZSBhYm91dCB0byBjcmVhdGUgYSBzaXRlIHRoYXQgZGlkbid0IGV4aXN0IGJlZm9yZQorCSAqIGluIHBsYXRmb3JtLmNmZyBbMTY2OTZdLgorCSAqLworCXByaXZhdGUgdm9pZCBjaGVja1NpdGVzKENvbmZpZ3VyZWRTaXRlTW9kZWxbXSBjb25maWd1cmF0aW9uU2l0ZXMsIElQbGF0Zm9ybUNvbmZpZ3VyYXRpb24gcnVudGltZUNvbmZpZ3VyYXRpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKworCQkvLyBjaGVjayBhbGwgdGhlIHNpdGVzIHdlIGFyZSBhYm91dCB0byB3cml0ZSBhbHJlYWR5IGV4aXN0ZWQKKwkJLy8gdGhleSBzaG91bGQgaGF2ZSBleGlzdGVkIGVpdGhlciBiZWNhdXNlIHRoZXkgd2VyZSBjcmVhdGVkIGJ5CisJCS8vIHVwZGF0ZU1hbmFnZXIgb3IgYmVjYXVzZSB3ZSByZWFkIHRoZW0gZnJvbSBwbGF0Zm9ybS5jZmcKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWd1cmF0aW9uU2l0ZXMubGVuZ3RoOyBpKyspIHsKKwkJCS8vIGdldCB0aGUgVVJMIG9mIHRoZSBzaXRlIHRoYXQgbWF0Y2hlcyB0aGUgb25lIHBsYXRmb3JtLmNmZyBnYXZlIHVzCisJCQlVUkwgdXJsVG9DaGVjayA9IG51bGw7CisJCQl0cnkgeworCQkJCXVybFRvQ2hlY2sgPSBuZXcgVVJMKGNvbmZpZ3VyYXRpb25TaXRlc1tpXS5nZXRQbGF0Zm9ybVVSTFN0cmluZygpKTsKKwkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisJCQkJVXBkYXRlQ29yZS53YXJuKE5MUy5iaW5kKE1lc3NhZ2VzLkluc3RhbGxDb25maWd1cmF0aW9uX1VuYWJsZVRvQ3JlYXRlVVJMLCAobmV3IFN0cmluZ1tdIHsgY29uZmlndXJhdGlvblNpdGVzW2ldLmdldFBsYXRmb3JtVVJMU3RyaW5nKCkgfSkpLCBlKTsKKwkJCX0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7CisJCQkJVXBkYXRlQ29yZS53YXJuKE1lc3NhZ2VzLkluc3RhbGxDb25maWd1cmF0aW9uX1VuYWJsZVRvQ2FzdCwgZSk7CisJCQl9CisKKwkJCS8vIGlmIHRoZSBVUkwgZG9lc24ndCBleGl0cyBsb2cgaXQKKwkJCUlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24uSVNpdGVFbnRyeSBzaXRlRW50cnkgPSBydW50aW1lQ29uZmlndXJhdGlvbi5maW5kQ29uZmlndXJlZFNpdGUodXJsVG9DaGVjayk7CisJCQlpZiAoc2l0ZUVudHJ5ID09IG51bGwpIHsKKwkJCQlVcGRhdGVDb3JlLndhcm4oTkxTLmJpbmQoTWVzc2FnZXMuSW5zdGFsbENvbmZpZ3VyYXRpb25fdW5hYmxlVG9GaW5kU2l0ZSwgKG5ldyBTdHJpbmdbXSB7IHVybFRvQ2hlY2sudG9FeHRlcm5hbEZvcm0oKSwgcnVudGltZUNvbmZpZ3VyYXRpb24uZ2V0Q29uZmlndXJhdGlvbkxvY2F0aW9uKCkudG9FeHRlcm5hbEZvcm0oKSB9KSkpOyAKKwkJCX0KKwkJfQorCX0KKworCisJLyoKKwkgKiByZXZlcnRzIHRoaXMgY29uZmlndXJhdGlvbiB0byB0aGUgbWF0Y2ggdGhlIG5ldyBvbmUKKwkgKgorCSAqIENvbXBhcmUgdGhlIG9sZFNpdGVzIHdpdGggdGhlIGN1cnJlbnRPbmUuIHRoZSBvbGQgc3RhdGUgaXMgdGhlIHN0YXRlIHdlIHdhbnQgdG8gcmV2ZXJ0IHRvLgorCSAqCisJICogSWYgYSBzaXRlIHdhcyBpbiBvbGQgc3RhdGUsIGJ1dCBub3QgaW4gdGhlIGN1cnJlbnRPbmUsIGtlZXAgaXQgaW4gdGhlIGhhc2guCisJICogSWYgYSBzaXRlIGlzIGluIHRoZSBjdXJyZW50T25lIGJ1dCB3YXMgbm90IGluIHRoZSBvbGQgc3RhdGUsIHVuY29uZmlndXJlIGFsbCBmZWF0dXJlcyBhbmQgYWRkIGl0IGluIHRoZSBoYXNoCisJICogSWYgYSBzaXRlIHdhcyBpbiBiYW90aCBzdGF0ZSwgY2FsY3VsYXRlIHRoZSAnZGVsdGEnIGFuZCByZS1zZXQgaXQgaW4gdGhlIGhhc2ggbWFwCisJICoKKwkgKiBBdCB0aGUgZW5kLCBzZXQgdGhlIGNvbmZpZ3VyZWQgc2l0ZSBmcm9tIHRoZSBuZXcgc2l0ZXMgaGFzaCBtYXAKKwkgKgorCSAqLworCXB1YmxpYyB2b2lkIHJldmVydFRvKElJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElQcm9ibGVtSGFuZGxlciBoYW5kbGVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworCisJCUlDb25maWd1cmVkU2l0ZVtdIG9sZENvbmZpZ1NpdGVzID0gY29uZmlndXJhdGlvbi5nZXRDb25maWd1cmVkU2l0ZXMoKTsKKwkJSUNvbmZpZ3VyZWRTaXRlW10gbm93Q29uZmlnU2l0ZXMgPSB0aGlzLmdldENvbmZpZ3VyZWRTaXRlcygpOworCisJCS8vIGNyZWF0ZSBhIGhhc2h0YWJsZSBvZiB0aGUgKm9sZCogYW5kICpuZXcqIHNpdGVzCisJCU1hcCBvbGRTaXRlc01hcCA9IG5ldyBIYXNodGFibGUoMCk7CisJCU1hcCBuZXdTaXRlc01hcCA9IG5ldyBIYXNodGFibGUoMCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgb2xkQ29uZmlnU2l0ZXMubGVuZ3RoOyBpKyspIHsKKwkJCUlDb25maWd1cmVkU2l0ZSBlbGVtZW50ID0gb2xkQ29uZmlnU2l0ZXNbaV07CisJCQlvbGRTaXRlc01hcC5wdXQoZWxlbWVudC5nZXRTaXRlKCkuZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKSwgZWxlbWVudCk7CisJCQluZXdTaXRlc01hcC5wdXQoZWxlbWVudC5nZXRTaXRlKCkuZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKSwgZWxlbWVudCk7CisJCX0KKwkJLy8gY3JlYXRlIGxpc3Qgb2YgYWxsIHRoZSBzaXRlcyB0aGF0IG1hcCB0aGUgKm9sZCogc2l0ZXMKKwkJLy8gd2Ugd2FudCB0aGUgaW50ZXJzZWN0aW9uIGJldHdlZW4gdGhlIG9sZCBzaXRlcyBhbmQgdGhlIGN1cnJlbnQgc2l0ZXMKKwkJaWYgKG5vd0NvbmZpZ1NpdGVzICE9IG51bGwpIHsKKwkJCVN0cmluZyBrZXkgPSBudWxsOworCisJCQlmb3IgKGludCBpID0gMDsgaSA8IG5vd0NvbmZpZ1NpdGVzLmxlbmd0aDsgaSsrKSB7CisJCQkJa2V5ID0gbm93Q29uZmlnU2l0ZXNbaV0uZ2V0U2l0ZSgpLmdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCk7CisJCQkJSUNvbmZpZ3VyZWRTaXRlIG9sZFNpdGUgPSAoSUNvbmZpZ3VyZWRTaXRlKSBvbGRTaXRlc01hcC5nZXQoa2V5KTsKKwkJCQlpZiAob2xkU2l0ZSAhPSBudWxsKSB7CisJCQkJCS8vIHRoZSBTaXRlIGV4aXN0ZWQgYmVmb3JlLCBjYWxjdWxhdGUgdGhlIGRlbHRhIGJldHdlZW4gaXRzIGN1cnJlbnQgc3RhdGUgYW5kIHRoZQorCQkJCQkvLyBzdGF0ZSB3ZSBhcmUgcmV2ZXJ0aW5nIHRvIGFuZCBwdXQgaXQgYmFjayBpbnRvIHRoZSBtYXAKKwkJCQkJICgoQ29uZmlndXJlZFNpdGUpIG5vd0NvbmZpZ1NpdGVzW2ldKS5yZXZlcnRUbyhvbGRTaXRlLCBtb25pdG9yLCBoYW5kbGVyKTsKKwkJCQl9IGVsc2UgeworCQkJCQkvLyB0aGUgc2l0ZSBkaWRuJ3QgZXhpc3QgaW4gdGhlIEluc3RhbGxDb25maWd1cmF0aW9uIHdlIGFyZSByZXZlcnRpbmcgdG8KKwkJCQkJLy8gdW5jb25maWd1cmUgZXZlcnl0aGluZyBmcm9tIHRoaXMgc2l0ZSBzbyBpdCBpcyBzdGlsbCBwcmVzZW50CisJCQkJCUlTaXRlRmVhdHVyZVJlZmVyZW5jZVtdIGZlYXR1cmVzVG9VbmNvbmZpZ3VyZSA9IG5vd0NvbmZpZ1NpdGVzW2ldLmdldFNpdGUoKS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpOworCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGZlYXR1cmVzVG9VbmNvbmZpZ3VyZS5sZW5ndGg7IGorKykgeworCQkJCQkJSUZlYXR1cmUgZmVhdHVyZVRvVW5jb25maWd1cmUgPSBudWxsOworCQkJCQkJdHJ5IHsKKwkJCQkJCQlmZWF0dXJlVG9VbmNvbmZpZ3VyZSA9IGZlYXR1cmVzVG9VbmNvbmZpZ3VyZVtqXS5nZXRGZWF0dXJlKG51bGwpOworCQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkJCQkJVXBkYXRlQ29yZS53YXJuKG51bGwsIGUpOworCQkJCQkJfQorCQkJCQkJaWYgKGZlYXR1cmVUb1VuY29uZmlndXJlICE9IG51bGwpCisJCQkJCQkJbm93Q29uZmlnU2l0ZXNbaV0udW5jb25maWd1cmUoZmVhdHVyZVRvVW5jb25maWd1cmUpOworCQkJCQl9CisJCQkJfQorCQkJCW5ld1NpdGVzTWFwLnB1dChrZXksbm93Q29uZmlnU2l0ZXNbaV0pOworCQkJfQorCisJCQkvLyB0aGUgbmV3IGNvbmZpZ3VyYXRpb24gaGFzIHRoZSBleGFjdCBzYW1lIHNpdGVzIGFzIHRoZSBvbGQgY29uZmlndXJhdGlvbgorCQkJLy8gdGhlIG9sZCBjb25maWd1cmF0aW9uIGluIHRoZSBNYXAgYXJlIGVpdGhlciBhcy1pcyBiZWNhdXNlIHRoZXkgZG9uJ3QgZXhpc3QKKwkJCS8vIGluIHRoZSBjdXJyZW50IG9uZSwgb3IgdGhleSBhcmUgdGhlIGRlbHRhIGZyb20gdGhlIGN1cnJlbnQgb25lIHRvIHRoZSBvbGQgb25lCisJCQlDb2xsZWN0aW9uIHNpdGVzID0gbmV3U2l0ZXNNYXAudmFsdWVzKCk7CisJCQlpZiAoc2l0ZXMgIT0gbnVsbCAmJiAhc2l0ZXMuaXNFbXB0eSgpKSB7CisJCQkJQ29uZmlndXJlZFNpdGVNb2RlbFtdIHNpdGVzTW9kZWwgPSBuZXcgQ29uZmlndXJlZFNpdGVNb2RlbFtzaXRlcy5zaXplKCldOworCQkJCXNpdGVzLnRvQXJyYXkoc2l0ZXNNb2RlbCk7CisJCQkJc2V0Q29uZmlndXJhdGlvblNpdGVNb2RlbChzaXRlc01vZGVsKTsKKwkJCX0KKwkJfQorCX0KKworCS8qCisJICogQHNlZSBJSW5zdGFsbENvbmZpZ3VyYXRpb24jZ2V0QWN0aXZpdGllcygpCisJICovCisJcHVibGljIElBY3Rpdml0eVtdIGdldEFjdGl2aXRpZXMoKSB7CisJCWlmIChnZXRBY3Rpdml0eU1vZGVsKCkubGVuZ3RoID09IDApCisJCQlyZXR1cm4gbmV3IElBY3Rpdml0eVswXTsKKwkJcmV0dXJuIChJQWN0aXZpdHlbXSkgZ2V0QWN0aXZpdHlNb2RlbCgpOworCX0KKworCS8qCisJICogcmV0dXJucyB0aGUgbGlzdCBvZiBwbGF0Zm9ybSBwbHVnaW5zIG9mIHRoZSBmZWF0dXJlIG9yIGFuIGVtcHR5IGxpc3QKKwkgKiBpZiB0aGUgZmVhdHVyZSBkb2Vzbid0IGNvbnRhaW4gYW55IHBsYXRmb3JtIHBsdWdpbnMKKwkgKi8KKwlwcml2YXRlIElQbHVnaW5FbnRyeVtdIGdldFBsYXRmb3JtUGx1Z2lucyhJRmVhdHVyZSBmZWF0dXJlLCBJUGxhdGZvcm1Db25maWd1cmF0aW9uIHJ1bnRpbWVDb25maWd1cmF0aW9uKSB7CisJCU1hcCBmZWF0dXJlUGxhdGZvcm1QbHVnaW5zID0gbmV3IEhhc2hNYXAoKTsKKwkJU3RyaW5nW10gcGxhdGZvcm1QbHVnaW5JRCA9IHJ1bnRpbWVDb25maWd1cmF0aW9uLmdldEJvb3RzdHJhcFBsdWdpbklkZW50aWZpZXJzKCk7CisJCUlQbHVnaW5FbnRyeVtdIGZlYXR1cmVQbHVnaW5zID0gZmVhdHVyZS5nZXRQbHVnaW5FbnRyaWVzKCk7CisKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBwbGF0Zm9ybVBsdWdpbklELmxlbmd0aDsgaSsrKSB7CisJCQlTdHJpbmcgZmVhdHVyZVBsdWdpbklkID0gbnVsbDsKKwkJCWZvciAoaW50IGogPSAwOyBqIDwgZmVhdHVyZVBsdWdpbnMubGVuZ3RoOyBqKyspIHsKKwkJCQlmZWF0dXJlUGx1Z2luSWQgPSBmZWF0dXJlUGx1Z2luc1tqXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0SWRlbnRpZmllcigpOworCQkJCWlmIChwbGF0Zm9ybVBsdWdpbklEW2ldLmVxdWFscyhmZWF0dXJlUGx1Z2luSWQpKSB7CisJCQkJCWZlYXR1cmVQbGF0Zm9ybVBsdWdpbnMucHV0KHBsYXRmb3JtUGx1Z2luSURbaV0sIGZlYXR1cmVQbHVnaW5zW2pdKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlDb2xsZWN0aW9uIHZhbHVlcyA9IGZlYXR1cmVQbGF0Zm9ybVBsdWdpbnMudmFsdWVzKCk7CisJCWlmICh2YWx1ZXMgPT0gbnVsbCB8fCB2YWx1ZXMuc2l6ZSgpID09IDApCisJCQlyZXR1cm4gbmV3IElQbHVnaW5FbnRyeVswXTsKKworCQlJUGx1Z2luRW50cnlbXSByZXN1bHQgPSBuZXcgSVBsdWdpbkVudHJ5W3ZhbHVlcy5zaXplKCldOworCQlJdGVyYXRvciBpdGVyID0gdmFsdWVzLml0ZXJhdG9yKCk7CisJCWludCBpbmRleCA9IDA7CisJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgeworCQkJcmVzdWx0W2luZGV4XSA9ICgoSVBsdWdpbkVudHJ5KSBpdGVyLm5leHQoKSk7CisJCQlpbmRleCsrOworCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoKKwkgKiByZXR1cm5zIHRoZSBVUkwgb2YgdGhlIHBsdWdpbkVudHJ5IG9uIHRoZSBzaXRlCisJICogVHJhbnNmb3JtIHRoZSBVUkwgdG8gdXNlIHBsYXRmb3JtOiBwcm90b2NvbCBpZiBuZWVkZWQKKwkgKiByZXR1cm4gbnVsbCBpZiB0aGUgVVJMIHRvIHdyaXRlIGlzIG5vdCB2YWxpZAorCSAqLworCXByaXZhdGUgVVJMIGdldFJ1bnRpbWVDb25maWd1cmF0aW9uVVJMKElQbHVnaW5FbnRyeSBlbnRyeSwgQ29uZmlndXJlZFNpdGUgY1NpdGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKworCQlTdHJpbmcgcm9vdFN0cmluZyA9IGNTaXRlLmdldFBsYXRmb3JtVVJMU3RyaW5nKCk7CisJCVN0cmluZyBwbHVnaW5QYXRoSUQgPSBnZXRQYXRoSUQoZW50cnkpOworCQl0cnkgeworCQkJSVNpdGVDb250ZW50UHJvdmlkZXIgc2l0ZUNvbnRlbnRQcm92aWRlciA9IGNTaXRlLmdldFNpdGUoKS5nZXRTaXRlQ29udGVudFByb3ZpZGVyKCk7CisJCQlVUkwgcGx1Z2luRW50cnlmdWxsVVJMID0gc2l0ZUNvbnRlbnRQcm92aWRlci5nZXRBcmNoaXZlUmVmZXJlbmNlKHBsdWdpblBhdGhJRCk7CisKKwkJCS8vCisJCQlpZiAoIXJvb3RTdHJpbmcuc3RhcnRzV2l0aCgicGxhdGZvcm0iKSkgeyAvLyROT04tTkxTLTEkCisJCQkJLy8gREVCVUc6CisJCQkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX0NPTkZJR1VSQVRJT04pCisJCQkJCVVwZGF0ZUNvcmUuZGVidWcoImdldFJ1bnRpbWVDb25maWd1cmF0aW9uIFBsdWdpbiBFbnRyeSBGdWxsIFVSTDoiICsgcGx1Z2luRW50cnlmdWxsVVJMICsgIiBQbGF0Zm9ybSBTdHJpbmc6IiArIHJvb3RTdHJpbmcgKyAiIFtOT04gUExBVEZPUk0gVVJMXS4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCQlyZXR1cm4gcGx1Z2luRW50cnlmdWxsVVJMOworCQkJfQorCisJCQkvL1VSTCBwbHVnaW5FbnRyeVJvb3RVUkwgPSBQbGF0Zm9ybS5yZXNvbHZlKG5ldyBVUkwocm9vdFN0cmluZykpOworCQkJLy8gRG8gbm90IHJlc29sdmUgWzE2NTA3XSwganVzdCB1c2UgcGxhdGZvcm06YmFzZS8gYXMgYSByb290CisJCQkvLyByb290U3RyaW5nID0gcGxhdGZvcm06YmFzZQorCQkJLy8gcGx1Z2luUm9vdCA9IC9ob21lL2EKKwkJCS8vIHBsdWdpbkZ1bGwgPSAvaG9tZS9hL2MvYm9vdC5qYXIKKwkJCS8vIHJlbGF0aXZlID0gcGxhdGZvcm06L2Jhc2UvYy9ib290LmphcgorCQkJVVJMIHBsdWdpbkVudHJ5Um9vdFVSTCA9IGNTaXRlLmdldFNpdGUoKS5nZXRVUkwoKTsKKwkJCVN0cmluZyByZWxhdGl2ZVN0cmluZyA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkxBc1N0cmluZyhwbHVnaW5FbnRyeVJvb3RVUkwsIHBsdWdpbkVudHJ5ZnVsbFVSTCk7CisJCQlVUkwgcmVzdWx0ID0gbmV3IFVSTChuZXcgVVJMKHJvb3RTdHJpbmcpLCByZWxhdGl2ZVN0cmluZyk7CisKKwkJCS8vIERFQlVHOgorCQkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX0NPTkZJR1VSQVRJT04pCisJCQkJVXBkYXRlQ29yZS5kZWJ1ZygiZ2V0UnVudGltZUNvbmZpZ3VyYXRpb24gcGx1Z2luIEVudHJ5IEZ1bGwgVVJMOiIgKyBwbHVnaW5FbnRyeWZ1bGxVUkwgKyAiIFBsYXRmb3JtIFN0cmluZzoiICsgcm9vdFN0cmluZyArICIgU2l0ZSBVUkw6IiArIHBsdWdpbkVudHJ5Um9vdFVSTCArICIgUmVsYXRpdmU6IiArIHJlbGF0aXZlU3RyaW5nKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAorCisJCQkvLyB2ZXJpZnkgd2UgYXJlIGFib3V0IHRvIHdyaXRlIGEgdmFsaWQgZmlsZSBVUkwKKwkJCS8vIGNoZWNrIHdpdGggZnVsbFVSTCBhcyBpdCBpcyBub3QgcmVzb2x2ZWQgdG8gcGxhdGZvcm06YmFzZS8KKwkJCWlmIChwbHVnaW5FbnRyeWZ1bGxVUkwgIT0gbnVsbCkgeworCQkJCWlmICgiZmlsZSIuZXF1YWxzKHBsdWdpbkVudHJ5ZnVsbFVSTC5nZXRQcm90b2NvbCgpKSkgeyAvLyROT04tTkxTLTEkCisJCQkJCVN0cmluZyBmaWxlU3RyaW5nID0gcGx1Z2luRW50cnlmdWxsVVJMLmdldEZpbGUoKTsKKwkJCQkJaWYgKCFuZXcgRmlsZShmaWxlU3RyaW5nKS5leGlzdHMoKSkgeworCQkJCQkJVXBkYXRlQ29yZS53YXJuKCJUaGUgVVJMOiIgKyByZXN1bHQgKyAiIGRvZXNuJ3QgcG9pbnQgdG8gYSB2YWxpZCBwbGF0Zm9ybSBwbHVnaW4uVGhlIFVSTCB3aWxsIG5vdCBiZSB3cml0dGVuIGluIHRoZSBwbGF0Zm9ybSBjb25maWd1cmF0aW9uIiwgbmV3IEV4Y2VwdGlvbigpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oTkxTLmJpbmQoTWVzc2FnZXMuSW5zdGFsbENvbmZpZ3VyYXRpb25fVW5hYmxlVG9DcmVhdGVVUkwsIChuZXcgU3RyaW5nW10geyByb290U3RyaW5nIH0pKSwgZSk7CisJCX0KKwl9CisKKwkvKgorCSAqIFJldHVybiBVUkxzIGZvciBhbnkgZnJhZ21lbnRzIHRoYXQgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIHBsdWdpbiBlbnRyeQorCSAqLworCXByaXZhdGUgVVJMW10gZ2V0UnVudGltZUZyYWdtZW50VVJMcyhJUGx1Z2luRW50cnkgZW50cnkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKworCQkvLyBnZXQgdGhlIGlkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbnRyeQorCQlWZXJzaW9uZWRJZGVudGlmaWVyIHZpZCA9IGVudHJ5LmdldFZlcnNpb25lZElkZW50aWZpZXIoKTsKKworCQkvLyBnZXQgdGhlIHBsdWdpbiBkZXNjcmlwdG9yIGZyb20gdGhlIHJlZ2lzdHJ5CisJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUodmlkLmdldElkZW50aWZpZXIoKSk7CisJCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOworCQlpZiAoYnVuZGxlICE9IG51bGwgJiYgYnVuZGxlLmdldFN0YXRlKCkgIT0gQnVuZGxlLlVOSU5TVEFMTEVEICYmIGJ1bmRsZS5nZXRTdGF0ZSgpICE9IEJ1bmRsZS5JTlNUQUxMRUQpIHsKKwkJCUZyYWdtZW50RW50cnlbXSBmcmFnbWVudHMgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0RnJhZ21lbnRzKGJ1bmRsZSk7CisJCQlmb3IgKGludCBpID0gMDsgZnJhZ21lbnRzICE9IG51bGwgJiYgaSA8IGZyYWdtZW50cy5sZW5ndGg7IGkrKykgeworCQkJCVN0cmluZyBsb2NhdGlvbiA9IGZyYWdtZW50c1tpXS5nZXRMb2NhdGlvbigpOworCQkJCXRyeSB7CisJCQkJCVVSTCBsb2NhdGlvblVSTCA9IG5ldyBVUkwobG9jYXRpb24pOworCQkJCQlsb2NhdGlvblVSTCA9IEZpbGVMb2NhdG9yLnRvRmlsZVVSTChGaWxlTG9jYXRvci5yZXNvbHZlKGxvY2F0aW9uVVJMKSk7CisJCQkJCWxpc3QuYWRkKGFzSW5zdGFsbFJlbGF0aXZlVVJMKGxvY2F0aW9uVVJMKSk7CisJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCQkvLyBza2lwIGJhZCBmcmFnbWVudHMKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIChVUkxbXSkgbGlzdC50b0FycmF5KG5ldyBVUkxbMF0pOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHBhdGggaWRlbnRpZmllciBmb3IgYSBwbHVnaW4gZW50cnkuCisJICogPGNvZGU+cGx1Z2lucy8mbHQ7cGx1Z2luSWQ+XyZsdDtwbHVnaW5WZXJzaW9uPi5qYXI8L2NvZGU+CisJICogQHJldHVybiB0aGUgcGF0aCBpZGVudGlmaWVyCisJICovCisJcHJpdmF0ZSBTdHJpbmcgZ2V0UGF0aElEKElQbHVnaW5FbnRyeSBlbnRyeSkgeworCQlyZXR1cm4gU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRIICsgZW50cnkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkgKyBGZWF0dXJlQ29udGVudFByb3ZpZGVyLkpBUl9FWFRFTlNJT047CisJfQorCisJLyoqCisJICogVHJ5IHRvIHJlY2FzdCBVUkwgYXMgcGxhdGZvcm06L2Jhc2UvCisJICovCisJcHJpdmF0ZSBVUkwgYXNJbnN0YWxsUmVsYXRpdmVVUkwoVVJMIHVybCkgeworCQkvLyBnZXQgbG9jYXRpb24gb2YgaW5zdGFsbAorCQlVUkwgaW5zdGFsbCA9IENvbmZpZ3VyYXRvclV0aWxzLmdldEluc3RhbGxVUkwoKTsKKworCQkvLyB0cnkgdG8gZGV0ZXJtaW5lIGlmIHN1cHBsaWVkIFVSTCBjYW4gYmUgcmVjYXN0IGFzIGluc3RhbGwtcmVsYXRpdmUKKwkJaWYgKGluc3RhbGwuZ2V0UHJvdG9jb2woKS5lcXVhbHModXJsLmdldFByb3RvY29sKCkpKSB7CisJCQlpZiAoaW5zdGFsbC5nZXRQcm90b2NvbCgpLmVxdWFscygiZmlsZSIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlTdHJpbmcgaW5zdGFsbFMgPSBuZXcgRmlsZShpbnN0YWxsLmdldEZpbGUoKSkuZ2V0QWJzb2x1dGVQYXRoKCkucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJyk7CisJCQkJaWYgKCFpbnN0YWxsUy5lbmRzV2l0aCgiLyIpKSAvLyROT04tTkxTLTEkCisJCQkJCWluc3RhbGxTICs9ICIvIjsgLy8kTk9OLU5MUy0xJAorCQkJCVN0cmluZyB1cmxTID0gbmV3IEZpbGUodXJsLmdldEZpbGUoKSkuZ2V0QWJzb2x1dGVQYXRoKCkucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJyk7CisJCQkJaWYgKCF1cmxTLmVuZHNXaXRoKCIvIikpIC8vJE5PTi1OTFMtMSQKKwkJCQkJdXJsUyArPSAiLyI7IC8vJE5PTi1OTFMtMSQKKwkJCQlpbnQgaXggPSBpbnN0YWxsUy5sYXN0SW5kZXhPZigiLyIpOyAvLyROT04tTkxTLTEkCisJCQkJaWYgKGl4ICE9IC0xKSB7CisJCQkJCWluc3RhbGxTID0gaW5zdGFsbFMuc3Vic3RyaW5nKDAsIGl4ICsgMSk7CisJCQkJCWlmICh1cmxTLnN0YXJ0c1dpdGgoaW5zdGFsbFMpKSB7CisJCQkJCQl0cnkgeworCQkJCQkJCXJldHVybiBuZXcgVVJMKCJwbGF0Zm9ybTovYmFzZS8iICsgdXJsUy5zdWJzdHJpbmcoaW5zdGFsbFMubGVuZ3RoKCkpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gdXJsOworCX0KKwkKKwlwcml2YXRlIGJvb2xlYW4gaXNEdXBsaWNhdGVTaXRlKEZpbGUgc2l0ZURpcmVjdG9yeSkgeworCQlJQ29uZmlndXJlZFNpdGVbXSBzaXRlcyA9IGdldENvbmZpZ3VyZWRTaXRlcygpOworCQlVUkwgZmlsZVVSTDsKKwkJdHJ5IHsKKwkJCWZpbGVVUkwgPSBzaXRlRGlyZWN0b3J5LnRvVVJMKCk7CisJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXRlcy5sZW5ndGg7IGkrKykgeworCQkJVVJMIHVybCA9IHNpdGVzW2ldLmdldFNpdGUoKS5nZXRVUkwoKTsKKwkJCWlmIChVcGRhdGVNYW5hZ2VyVXRpbHMuc2FtZVVSTChmaWxlVVJMLCB1cmwpKQorCQkJCXJldHVybiB0cnVlOworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisJCisJLyoKKwkgKiBSZXR1cm5zIHRoZSBmZWF0dXJlIHVybCByZWxhdGl2ZSB0byB0aGUgc2l0ZS4KKwkgKi8KKwlwcml2YXRlIFN0cmluZyBnZXRGZWF0dXJlUmVsYXRpdmVVUkwoSUZlYXR1cmUgZmVhdHVyZSkgeworCQlTdHJpbmcgdXJsID0gZmVhdHVyZS5nZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpOworCQlTdHJpbmcgc2l0ZVVSTCA9IGZlYXR1cmUuZ2V0U2l0ZSgpLmdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCk7CisJCS8vIFRPRE8gZml4IHRoaXMuIHRvVVJMKCkgcmV0dXJucyBmaWxlOi9kOi9lY2xpcHNlL2V0Yy4uLiB3aGVhcmVhcyB0aGUgCisJCS8vIHBsYXRmb3JtLmFzTG9jYWxVUkwoKSByZXR1cm5zIGZpbGU6ZDovZWNsaXBzZS9ldGMuLi4gKG5vIGxlYWRpbmcgLyApCisvLwkJaWYgKHVybC5zdGFydHNXaXRoKCJmaWxlOi8iKSAmJiBQbGF0Zm9ybS5nZXRPUygpLmVxdWFscygid2luMzIiKSkKKy8vCQkJdXJsID0gImZpbGU6IiArIHVybC5zdWJzdHJpbmcoNik7CisJCQorCQlpZiAodXJsLnN0YXJ0c1dpdGgoc2l0ZVVSTCkpCisJCQlyZXR1cm4gdXJsLnN1YnN0cmluZyhzaXRlVVJMLmxlbmd0aCgpKTsKKwkJZWxzZQorCQkJcmV0dXJuIHVybDsKKwl9CisJCisJLyoqCisJICogQHJldHVybiB0cnVlIGlmIHJlc3RhcnQgaXMgbmVlZGVkCisJICovCisJcHJpdmF0ZSBib29sZWFuIGlzUmVzdGFydE5lZWRlZChJUGxhdGZvcm1Db25maWd1cmF0aW9uIHJ1bnRpbWVDb25maWcpIHsKKworCQkvLyBGaXJzdCwgY3JlYXRlIGEgbWFwIGZvciBmYXN0ZXIgbG9va3VwcworCQlTZXQgbmV3UGx1Z2luc1NldCA9IG51bGw7CisJCWlmIChydW50aW1lQ29uZmlnIGluc3RhbmNlb2YgUGxhdGZvcm1Db25maWd1cmF0aW9uKSB7CisJCQluZXdQbHVnaW5zU2V0ID0gKChQbGF0Zm9ybUNvbmZpZ3VyYXRpb24pcnVudGltZUNvbmZpZykuZ2V0UGx1Z2luUGF0aHMoKTsKKwkJCS8vIE9uIHdpbmRvd3MsIHdlIHdpbGwgYmUgZG9pbmcgY2FzZSBpbnNlbnNpdGl2ZSBzZWFyY2ggYXMgd2VsbCwgc28gbG93ZXIgaXQgbm93CisJCQlpZiAoaXNXaW5kb3dzKSB7CisJCQkJU3RyaW5nW10gbmV3UGx1Z2luc1NldEFycmF5ID0gKFN0cmluZ1tdKW5ld1BsdWdpbnNTZXQudG9BcnJheSggbmV3IFN0cmluZ1tuZXdQbHVnaW5zU2V0LnNpemUoKV0pOworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbmV3UGx1Z2luc1NldEFycmF5Lmxlbmd0aDsgaSsrKSB7CisJCQkJCW5ld1BsdWdpbnNTZXQuYWRkKG5ld1BsdWdpbnNTZXRBcnJheVtpXS50b0xvd2VyQ2FzZSgpKTsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQlVUkxbXSBuZXdCdW5kbGVQYXRocyA9IHJ1bnRpbWVDb25maWcuZ2V0UGx1Z2luUGF0aCgpOworCQkJbmV3UGx1Z2luc1NldCA9IG5ldyBIYXNoU2V0KG5ld0J1bmRsZVBhdGhzLmxlbmd0aCk7CisJCQlmb3IgKGludCBpPTA7IGk8bmV3QnVuZGxlUGF0aHMubGVuZ3RoOyBpKyspIHsKKwkJCQkKKwkJCQlTdHJpbmcgcGx1Z2luTG9jYXRpb24gPSBuZXdCdW5kbGVQYXRoc1tpXS5nZXRGaWxlKCk7CisJCQkJbmV3UGx1Z2luc1NldC5hZGQocGx1Z2luTG9jYXRpb24pOworCQkJCS8vIE9uIHdpbmRvd3MsIHdlIHdpbGwgYmUgZG9pbmcgY2FzZSBpbnNlbnNpdGl2ZSBzZWFyY2ggYXMgd2VsbCwgc28gbG93ZXIgaXQgbm93CisJCQkJaWYgKGlzV2luZG93cykKKwkJCQkJbmV3UGx1Z2luc1NldC5hZGQocGx1Z2luTG9jYXRpb24udG9Mb3dlckNhc2UoKSk7CisJCQl9CisJCX0KKwkJCisJCQorCQkKKwkJQnVuZGxlW10gb2xkQnVuZGxlcyA9IFVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlQ29udGV4dCgpLmdldEJ1bmRsZXMoKTsKKworCQlpbnQgb2Zmc2V0ID0gQ29uZmlndXJhdGlvbkFjdGl2YXRvci5VUERBVEVfUFJFRklYLmxlbmd0aCgpOworCQlmb3IgKGludCBpPTA7IGk8b2xkQnVuZGxlcy5sZW5ndGg7IGkrKykgeworCQkJaWYgKG9sZEJ1bmRsZXNbaV0uZ2V0QnVuZGxlSWQoKSA9PSAwKQorCQkJCWNvbnRpbnVlOyAvLyBza2lwIHRoZSBzeXN0ZW0gYnVuZGxlCisJCQlTdHJpbmcgb2xkQnVuZGxlTG9jYXRpb24gPSBvbGRCdW5kbGVzW2ldLmdldExvY2F0aW9uKCk7CisJCQkvLyBEb24ndCB3b3JyeSBhYm91dCBidW5kbGVzIHdlIGRpZCBub3QgaW5zdGFsbAorCQkJaWYgKCFvbGRCdW5kbGVMb2NhdGlvbi5zdGFydHNXaXRoKENvbmZpZ3VyYXRpb25BY3RpdmF0b3IuVVBEQVRFX1BSRUZJWCkpCisJCQkJY29udGludWU7CisJCQlvbGRCdW5kbGVMb2NhdGlvbiA9IG9sZEJ1bmRsZUxvY2F0aW9uLnN1YnN0cmluZyhvZmZzZXQpOworCQkJCisJCQlpZiAobmV3UGx1Z2luc1NldC5jb250YWlucyhvbGRCdW5kbGVMb2NhdGlvbikpCisJCQkJY29udGludWU7CisJCQlpZiAoaXNXaW5kb3dzICYmIG5ld1BsdWdpbnNTZXQuY29udGFpbnMob2xkQnVuZGxlTG9jYXRpb24udG9Mb3dlckNhc2UoKSkpCisJCQkJY29udGludWU7CisJCQkKKwkJCWlmIChVcGRhdGVDb3JlLkRFQlVHICYmIFVwZGF0ZUNvcmUuREVCVUdfU0hPV19DT05GSUdVUkFUSU9OKQorCQkJCVVwZGF0ZUNvcmUuZGVidWcoIkJ1bmRsZSAiICsgb2xkQnVuZGxlTG9jYXRpb24gKyAiIGhhcyBiZWVuIHJlbW92ZWQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQkKKwkJaWYgKHJ1bnRpbWVDb25maWcgaW5zdGFuY2VvZiBQbGF0Zm9ybUNvbmZpZ3VyYXRpb24pIHsKKwkJCXJldHVybiBhcmVUaGVyZU5ld1ZlcnNpb25PZk9sZFBsdWdpbnMoICgoUGxhdGZvcm1Db25maWd1cmF0aW9uKXJ1bnRpbWVDb25maWcpLmdldFBsdWdpbnMoKSwgb2xkQnVuZGxlcyk7CisJCX0KKworCQlyZXR1cm4gZmFsc2U7CisJfQorCQorCS8qKgorCSAqIFRoZSBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGlmIGFsbCBvbGQgcGx1Zy1pbnMgZXhpc3QgaW4gdGhlIG5ldworCSAqIGNvbmZpZ3VyYXRpb24uIERldGVybWluZXMgaWYgYSBuZXcgdmVyc2lvbiB3YXMgYWRkZWQgdG8gYW55IHBsdWdpbiBJRCwgc28KKwkgKiBtb3JlIHZlcnNpb25zIGFyZSBlbmFibGVkIGZvciBhbnkgZ2l2ZW4gcGx1Zy1pbiBpZCB0aGVuIGluIG9sZAorCSAqIGNvbmZpZ3VyYXRpb24uCisJICogCisJICogQHBhcmFtIG5ld0NvbmZpZ3VyYXRpb25QbHVnaW5zCisJICogQHBhcmFtIG9sZENvbmZpZ3VyYXRpb25CdW5kbGVzCisJICogQHJldHVybgorCSAqLworCXByaXZhdGUgYm9vbGVhbiBhcmVUaGVyZU5ld1ZlcnNpb25PZk9sZFBsdWdpbnMoUGx1Z2luRW50cnlbXSBuZXdDb25maWd1cmF0aW9uUGx1Z2lucywgQnVuZGxlW10gb2xkQ29uZmlndXJhdGlvbkJ1bmRsZXMpIHsKKworCQkKKwkJZm9yICggaW50IGkgPSAwOyBpIDwgb2xkQ29uZmlndXJhdGlvbkJ1bmRsZXMubGVuZ3RoOyBpKyspIHsKKwkJCWlmIChvbGRDb25maWd1cmF0aW9uQnVuZGxlc1tpXS5nZXRCdW5kbGVJZCgpID09IDApCisJCQkJY29udGludWU7IC8vIHNraXAgdGhlIHN5c3RlbSBidW5kbGUKKwkJCWlmICggZ2V0TnVtYmVyT2ZQbHVnaW5zKG9sZENvbmZpZ3VyYXRpb25CdW5kbGVzW2ldLmdldFN5bWJvbGljTmFtZSgpLCBvbGRDb25maWd1cmF0aW9uQnVuZGxlcykgIT0gZ2V0TnVtYmVyT2ZQbHVnaW5zKG9sZENvbmZpZ3VyYXRpb25CdW5kbGVzW2ldLmdldFN5bWJvbGljTmFtZSgpLCBuZXdDb25maWd1cmF0aW9uUGx1Z2lucykpIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZmFsc2U7CQkJCQorCX0KKworCXByaXZhdGUgaW50IGdldE51bWJlck9mUGx1Z2lucyhTdHJpbmcgc3ltYm9saWNOYW1lLCBQbHVnaW5FbnRyeVtdIG5ld0NvbmZpZ3VyYXRpb25QbHVnaW5zKSB7CisJCQorCQlpbnQgbnVtYmVyT2ZQbHVnaW5zID0gMDsKKwkJCisJCWZvciAoIGludCBpID0gMDsgaSA8IG5ld0NvbmZpZ3VyYXRpb25QbHVnaW5zLmxlbmd0aDsgaSsrKSB7CisJCQlpZiAoIHN5bWJvbGljTmFtZS5lcXVhbHMobmV3Q29uZmlndXJhdGlvblBsdWdpbnNbaV0uZ2V0UGx1Z2luSWRlbnRpZmllcigpKSkgeworCQkJCW51bWJlck9mUGx1Z2lucysrOworCQkJfQorCQl9CisJCQorCQlyZXR1cm4gbnVtYmVyT2ZQbHVnaW5zOworCX0KKworCXByaXZhdGUgaW50IGdldE51bWJlck9mUGx1Z2lucyhTdHJpbmcgc3ltYm9saWNOYW1lLCBCdW5kbGVbXSBvbGRDb25maWd1cmF0aW9uQnVuZGxlcykgeworCisJCWludCBudW1iZXJPZlBsdWdpbnMgPSAwOworCQkKKwkJZm9yICggaW50IGkgPSAwOyBpIDwgb2xkQ29uZmlndXJhdGlvbkJ1bmRsZXMubGVuZ3RoOyBpKyspIHsKKwkJCWlmICggc3ltYm9saWNOYW1lLmVxdWFscyhvbGRDb25maWd1cmF0aW9uQnVuZGxlc1tpXS5nZXRTeW1ib2xpY05hbWUoKSkpIHsKKwkJCQludW1iZXJPZlBsdWdpbnMrKzsKKwkJCX0KKwkJfQorCQkKKwkJcmV0dXJuIG51bWJlck9mUGx1Z2luczsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorCSAqLworCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisJCWlmICh0aGlzID09IG9iaikKKwkJCXJldHVybiB0cnVlOworCQlpZiAoIShvYmogaW5zdGFuY2VvZiBJbnN0YWxsQ29uZmlndXJhdGlvbikpCisJCQlyZXR1cm4gZmFsc2U7CisJCQorCQlJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcgPSAoSW5zdGFsbENvbmZpZ3VyYXRpb24pb2JqOworCQorCQlyZXR1cm4gZ2V0Q3JlYXRpb25EYXRlKCkuZXF1YWxzKGNvbmZpZy5nZXRDcmVhdGlvbkRhdGUoKSkgJiYgCisJCQkJZ2V0TGFiZWwoKS5lcXVhbHMoY29uZmlnLmdldExhYmVsKCkpICYmCisJCQkJZ2V0TG9jYXRpb25VUkxTdHJpbmcoKS5lcXVhbHMoY29uZmlnLmdldExvY2F0aW9uVVJMU3RyaW5nKCkpOworCX0KK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvSW5zdGFsbEhhbmRsZXJQcm94eS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9JbnN0YWxsSGFuZGxlclByb3h5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI0N2YzNAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvSW5zdGFsbEhhbmRsZXJQcm94eS5qYXZhCkBAIC0wLDAgKzEsNjEzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEubmV0LlVSTENsYXNzTG9hZGVyOworaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5Db250ZW50UmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlQ29udGVudENvbnN1bWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklJbnN0YWxsSGFuZGxlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JSW5zdGFsbEhhbmRsZXJFbnRyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JSW5zdGFsbEhhbmRsZXJXaXRoRmlsdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklOb25QbHVnaW5FbnRyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JUGx1Z2luRW50cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVZlcmlmaWNhdGlvbkxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkluc3RhbGxNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlV0aWxpdGllczsKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOworCitwdWJsaWMgY2xhc3MgSW5zdGFsbEhhbmRsZXJQcm94eSBpbXBsZW1lbnRzIElJbnN0YWxsSGFuZGxlcldpdGhGaWx0ZXIgeworCisJcHJpdmF0ZSBJRmVhdHVyZSBmZWF0dXJlID0gbnVsbDsKKwlwcml2YXRlIGludCB0eXBlOworCXByaXZhdGUgSUluc3RhbGxIYW5kbGVyIGhhbmRsZXIgPSBudWxsOworCXByaXZhdGUgSVN0YXR1cyBzYXZlZFN0YXR1cyA9IG51bGw7CisJcHJpdmF0ZSBib29sZWFuIERFQlVHID0gZmFsc2U7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUX1BMVUdJTiA9ICJvcmcuZWNsaXBzZS51cGRhdGUuY29yZSI7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVUlfUExVR0lOID0gIm9yZy5lY2xpcHNlLnVpIjsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRfUE9JTlQgPSAiaW5zdGFsbEhhbmRsZXJzIjsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgTWV0aG9kIG5vblBsdWdpbkRhdGFBY2NlcHRvciA9IG51bGw7CisKKwkvKioKKwkgKiBBIGNsYXNzIGxvYWRlciB0aGF0IGNvbWJpbmVzIGEgdGhlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlIHBsdWdpbiBjbGFzcyBsb2FkZXIgd2l0aCB0aGUKKwkgKiBvcmcuZWNsaXBzZS51aSBjbGFzcyBsb2FkZXIgKG9ubHkgd2hlbiBVSSBpcyBhY3RpdmUpLgorCSAqLworCXByaXZhdGUgc3RhdGljIGNsYXNzIEluc3RhbGxIYW5kbGVyQ2xhc3NMb2FkZXIgZXh0ZW5kcyBVUkxDbGFzc0xvYWRlciB7CisJCXByaXZhdGUgQnVuZGxlIHVwZGF0ZUNvcmU7CisJCXByaXZhdGUgQnVuZGxlIGVjbGlwc2VVSTsKKworCQlwdWJsaWMgSW5zdGFsbEhhbmRsZXJDbGFzc0xvYWRlcihVUkxbXSBjbGFzc3BhdGgpIHsKKwkJCXN1cGVyKGNsYXNzcGF0aCk7CisJCQl1cGRhdGVDb3JlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKEVYVF9QTFVHSU4pOworCQkJZWNsaXBzZVVJID0gUGxhdGZvcm0uZ2V0QnVuZGxlKFVJX1BMVUdJTik7CisJCQlpZiAoZWNsaXBzZVVJICE9IG51bGwgJiYgZWNsaXBzZVVJLmdldFN0YXRlKCkgIT0gQnVuZGxlLkFDVElWRSkgCisJCQkJZWNsaXBzZVVJID0gbnVsbDsKKwkJfQorCisJCXB1YmxpYyBDbGFzcyBsb2FkQ2xhc3MoU3RyaW5nIGNsYXNzTmFtZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworCQkJLy8gRmlyc3QgY2hlY2sgdXBkYXRlIGNvcmUgcGx1Z2luIGxvYWRlciwgdGhlbiB0aGUgZWNsaXBzZSB1aSBwbHVnaW4gbG9hZGVyCisJCQlDbGFzcyBjID0gbnVsbDsKKwkJCXRyeSB7CisJCQkJYyA9IHVwZGF0ZUNvcmUubG9hZENsYXNzKGNsYXNzTmFtZSk7CisJCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKwkJCQl0cnkgeworCQkJCQlpZihlY2xpcHNlVUkgIT0gbnVsbCkKKwkJCQkJCWMgPSBlY2xpcHNlVUkubG9hZENsYXNzKGNsYXNzTmFtZSk7CisJCQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlMikgeworCQkJCX0gZmluYWxseSB7CisJCQkJfQorCQkJfSBmaW5hbGx5IHsKKwkJCX0KKwkJCWlmIChjICE9IG51bGwpCisJCQkJcmV0dXJuIGM7CisJCQllbHNlCisJCQkJcmV0dXJuIHN1cGVyLmxvYWRDbGFzcyhjbGFzc05hbWUpOworCQl9CisKKwkJcHVibGljIFVSTCBnZXRSZXNvdXJjZShTdHJpbmcgcmVzTmFtZSkgeworCQkJLy8gRmlyc3QgY2hlY2sgdXBkYXRlIGNvcmUgcGx1Z2luIGxvYWRlciwgdGhlbiB0aGUgZWNsaXBzZSB1aSBwbHVnaW4gbG9hZGVyCisJCQlVUkwgdSA9IHVwZGF0ZUNvcmUuZ2V0UmVzb3VyY2UocmVzTmFtZSk7CisJCQlpZih1ID09IG51bGwgJiYgZWNsaXBzZVVJICE9IG51bGwpCisJCQkJdSA9IGVjbGlwc2VVSS5nZXRSZXNvdXJjZShyZXNOYW1lKTsKKwkJCQkKKwkJCWlmICh1ICE9IG51bGwpCisJCQkJcmV0dXJuIHU7CisJCQllbHNlCisJCQkJcmV0dXJuIHN1cGVyLmdldFJlc291cmNlKHJlc05hbWUpOworCQl9CisJfQorCQorCXB1YmxpYyBJbnN0YWxsSGFuZGxlclByb3h5KAorCQlpbnQgdHlwZSwKKwkJSUZlYXR1cmUgZmVhdHVyZSwKKwkJSUluc3RhbGxIYW5kbGVyRW50cnkgZW50cnksCisJCUluc3RhbGxNb25pdG9yIG1vbml0b3IpCisJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKKworCQlpbml0aWFsaXplKHR5cGUsIGZlYXR1cmUsIGVudHJ5LCBtb25pdG9yKTsKKwl9CisKKwkvKgorCSAqIEBzZWUgSUluc3RhbGxIYW5kbGVyI2luaXRpYWxpemUKKwkgKi8KKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplKAorCQlpbnQgdHlwZSwKKwkJSUZlYXR1cmUgZmVhdHVyZSwKKwkJSUluc3RhbGxIYW5kbGVyRW50cnkgZW50cnksCisJCUluc3RhbGxNb25pdG9yIG1vbml0b3IpCisJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKKworCQlERUJVRyA9IFVwZGF0ZUNvcmUuREVCVUdfU0hPV19JSEFORExFUjsKKwkJLy8gdmFsaWRhdGUgYXJndW1lbnRzCisJCWlmIChmZWF0dXJlID09IG51bGwpCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCXRoaXMuZmVhdHVyZSA9IGZlYXR1cmU7CisJCXRoaXMudHlwZSA9IHR5cGU7CisKKwkJLy8gIGNoZWNrIGlmIHdlIGhhdmUgYSBoYW5kbGVyIGVudHJ5IHNwZWNpZmllZCBpbiB0aGUgZmVhdHVyZS54bWwKKwkJaWYgKGVudHJ5ID09IG51bGwpIHsKKwkJCWlmIChERUJVRykKKwkJCQlkZWJ1Zygibm90IHNwZWNpZmllZCIpOyAvLyROT04tTkxTLTEkCisJCQlyZXR1cm47IC8vIG5vIGhhbmRsZXIgZW50cnkKKwkJfQorCisJCVN0cmluZyBsaWJyYXJ5ID0gZW50cnkuZ2V0TGlicmFyeSgpOworCQlTdHJpbmcgaGFuZGxlck5hbWUgPSBlbnRyeS5nZXRIYW5kbGVyTmFtZSgpOworCQlpZiAoaGFuZGxlck5hbWUgPT0gbnVsbCB8fCBoYW5kbGVyTmFtZS50cmltKCkuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCisJCQlpZiAoREVCVUcpCisJCQkJZGVidWcoIm5vdCBzcGVjaWZpZWQiKTsgLy8kTk9OLU5MUy0xJAorCQkJcmV0dXJuOyAvLyBubyBoYW5kbGVyIGNsYXNzIHNwYWNpZmllZCBpbiBlbnRyeQorCQl9CisJCWlmIChERUJVRykgeworCQkJZGVidWcoImhhbmRsZXI9IiArIGhhbmRsZXJOYW1lKTsgLy8kTk9OLU5MUy0xJAorCQkJZGVidWcoInBhdGg9ICAgIiArIGxpYnJhcnkpOyAvLyROT04tTkxTLTEkCisJCX0KKworCQkvLyBnZXQgaGFuZGxlciBpbnN0YW5jZQorCQl0cnkgeworCQkJaWYgKGxpYnJhcnkgPT0gbnVsbCB8fCBsaWJyYXJ5LnRyaW0oKS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCisJCQkJdGhpcy5oYW5kbGVyID0gZ2V0R2xvYmFsSGFuZGxlcihoYW5kbGVyTmFtZSk7CisJCQllbHNlCisJCQkJdGhpcy5oYW5kbGVyID0gZ2V0TG9jYWxIYW5kbGVyKGxpYnJhcnksIGhhbmRsZXJOYW1lKTsKKwkJCWlmICh0aGlzLmhhbmRsZXIgPT0gbnVsbCkKKwkJCQlyZXR1cm47CisJCQloYW5kbGVyLmluaXRpYWxpemUodHlwZSwgZmVhdHVyZSwgZW50cnksIG1vbml0b3IpOworCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKwkJCWhhbmRsZUV4Y2VwdGlvbkluSW5pdCgKKwkJCQlOTFMuYmluZChNZXNzYWdlcy5JbnN0YWxsSGFuZGxlcl9ub3RGb3VuZCwgKG5ldyBTdHJpbmdbXSB7IGZlYXR1cmUuZ2V0TGFiZWwoKSB9KSksCisJCQkJZSk7CisKKwkJfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKKwkJCWhhbmRsZUV4Y2VwdGlvbkluSW5pdCgKKwkJCQlOTFMuYmluZChNZXNzYWdlcy5JbnN0YWxsSGFuZGxlcl9pbnZhbGlkSGFuZGxlciwgKG5ldyBTdHJpbmdbXSB7IGZlYXR1cmUuZ2V0TGFiZWwoKSB9KSksCisJCQkJZSk7CisJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJaGFuZGxlRXhjZXB0aW9uSW5Jbml0KG51bGwsIGUpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJaGFuZGxlRXhjZXB0aW9uSW5Jbml0KAorCQkJCU5MUy5iaW5kKE1lc3NhZ2VzLkluc3RhbGxIYW5kbGVyX3VuYWJsZVRvQ3JlYXRlSGFuZGxlciwgKG5ldyBTdHJpbmdbXSB7IGZlYXR1cmUuZ2V0TGFiZWwoKSB9KSksCisJCQkJZSk7CisJCX0KKworCX0KKworCS8qCisJICogQHNlZSBJSW5zdGFsbEhhbmRsZXIjaW5zdGFsbEluaXRpYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGluc3RhbGxJbml0aWF0ZWQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCWlmIChoYW5kbGVyID09IG51bGwpCisJCQlyZXR1cm47CisJCWVsc2UgeworCQkJdHJ5IHsKKwkJCQlpZiAoREVCVUcpCisJCQkJCWRlYnVnKCJjYWxsaW5nIGluc3RhbGxJbml0aWF0ZWQoKSIpOyAvLyROT04tTkxTLTEkCisJCQkJaGFuZGxlci5pbnN0YWxsSW5pdGlhdGVkKCk7CisJCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgeworCQkJCWhhbmRsZUV4Y2VwdGlvbkluQ2FsbChlLCBmZWF0dXJlKTsKKwkJCX0KKwkJfQorCX0KKworCS8qCisJICogQHNlZSBJSW5zdGFsbEhhbmRsZXIjYWxsUGx1Z2luc0Rvd25sb2FkZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBwbHVnaW5zRG93bmxvYWRlZChJUGx1Z2luRW50cnlbXSBwbHVnaW5zKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCWlmIChoYW5kbGVyID09IG51bGwpCisJCQlyZXR1cm47CisJCWVsc2UgeworCQkJdHJ5IHsKKwkJCQlpZiAoREVCVUcpCisJCQkJCWRlYnVnKCJjYWxsaW5nIHBsdWdpbnNEb3dubG9hZGVkKCkiKTsgLy8kTk9OLU5MUy0xJAorCQkJCWhhbmRsZXIucGx1Z2luc0Rvd25sb2FkZWQocGx1Z2lucyk7CisJCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgeworCQkJCWhhbmRsZUV4Y2VwdGlvbkluQ2FsbChlLCBmZWF0dXJlKTsKKwkJCX0KKwkJfQorCX0KKworCS8qCisJICogQHNlZSBJSW5zdGFsbEhhbmRsZXIjYWxsUGx1Z2luc0luc3RhbGxlZAorCSAqLworCXB1YmxpYyB2b2lkIGNvbXBsZXRlSW5zdGFsbChJRmVhdHVyZUNvbnRlbnRDb25zdW1lciBjb25zdW1lcikKKwkJdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlpZiAoaGFuZGxlciA9PSBudWxsKQorCQkJcmV0dXJuOworCQllbHNlIHsKKwkJCXRyeSB7CisJCQkJaWYgKERFQlVHKQorCQkJCQlkZWJ1ZygiY2FsbGluZyBjb21wbGV0ZUluc3RhbGwoKSIpOyAvLyROT04tTkxTLTEkCisJCQkJaGFuZGxlci5jb21wbGV0ZUluc3RhbGwoY29uc3VtZXIpOworCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKKwkJCQloYW5kbGVFeGNlcHRpb25JbkNhbGwoZSwgZmVhdHVyZSk7CisJCQl9CisJCX0KKwl9CisKKwkvKgorCSAqIEBzZWUgSUluc3RhbGxIYW5kbGVyI2FsbERhdGFEb3dubG9hZGVkCisJICovCisJcHVibGljIHZvaWQgbm9uUGx1Z2luRGF0YURvd25sb2FkZWQoCisJCUlOb25QbHVnaW5FbnRyeVtdIG5vblBsdWdpbkRhdGEsCisJCUlWZXJpZmljYXRpb25MaXN0ZW5lciBsaXN0ZW5lcikKKwkJdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlpZiAoaGFuZGxlciA9PSBudWxsKQorCQkJcmV0dXJuOworCQllbHNlIHsKKwkJCXRyeSB7CisJCQkJaWYgKERFQlVHKQorCQkJCQlkZWJ1ZygiY2FsbGluZyBub25QbHVnaW5EYXRhRG93bmxvYWRlZCgpIik7IC8vJE5PTi1OTFMtMSQKKwkJCQloYW5kbGVyLm5vblBsdWdpbkRhdGFEb3dubG9hZGVkKG5vblBsdWdpbkRhdGEsIGxpc3RlbmVyKTsKKwkJCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisJCQkJaGFuZGxlRXhjZXB0aW9uSW5DYWxsKGUsIGZlYXR1cmUpOworCQkJfQorCQl9CisJfQorCisJLyoKKwkgKiBAc2VlIElJbnN0YWxsSGFuZGxlciNpbnN0YWxsQ29tcGxldGVkCisJICovCisJcHVibGljIHZvaWQgaW5zdGFsbENvbXBsZXRlZChib29sZWFuIHN1Y2Nlc3MpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJaWYgKGhhbmRsZXIgPT0gbnVsbCkKKwkJCXJldHVybjsKKwkJZWxzZSB7CisJCQl0cnkgeworCQkJCWlmIChERUJVRykKKwkJCQkJZGVidWcoImNhbGxpbmcgaW5zdGFsbENvbXBsZXRlZCgpIik7IC8vJE5PTi1OTFMtMSQKKwkJCQloYW5kbGVyLmluc3RhbGxDb21wbGV0ZWQoc3VjY2Vzcyk7CisJCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgeworCQkJCWhhbmRsZUV4Y2VwdGlvbkluQ2FsbChlLCBmZWF0dXJlKTsKKwkJCX0KKwkJfQorCX0KKworCS8qCisJICogQHNlZSBJSW5zdGFsbEhhbmRsZXIjY29uZmlndXJlSW5pdGlhdGVkCisJICovCisJcHVibGljIHZvaWQgY29uZmlndXJlSW5pdGlhdGVkKCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlpZiAoaGFuZGxlciA9PSBudWxsKQorCQkJcmV0dXJuOworCQllbHNlIHsKKwkJCXRyeSB7CisJCQkJaWYgKERFQlVHKQorCQkJCQlkZWJ1ZygiY2FsbGluZyBjb25maWd1cmVJbml0aWF0ZWQoKSIpOyAvLyROT04tTkxTLTEkCisJCQkJaGFuZGxlci5jb25maWd1cmVJbml0aWF0ZWQoKTsKKwkJCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisJCQkJaGFuZGxlRXhjZXB0aW9uSW5DYWxsKGUsIGZlYXR1cmUpOworCQkJfQorCQl9CisJfQorCisJLyoKKwkgKiBAc2VlIElJbnN0YWxsSGFuZGxlciNjb21wbGV0ZUNvbmZpZ3VyZQorCSAqLworCXB1YmxpYyB2b2lkIGNvbXBsZXRlQ29uZmlndXJlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlpZiAoaGFuZGxlciA9PSBudWxsKQorCQkJcmV0dXJuOworCQllbHNlIHsKKwkJCXRyeSB7CisJCQkJaWYgKERFQlVHKQorCQkJCQlkZWJ1ZygiY2FsbGluZyBjb21wbGV0ZUNvbmZpZ3VyZSgpIik7IC8vJE5PTi1OTFMtMSQKKwkJCQloYW5kbGVyLmNvbXBsZXRlQ29uZmlndXJlKCk7CisJCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgeworCQkJCWhhbmRsZUV4Y2VwdGlvbkluQ2FsbChlLCBmZWF0dXJlKTsKKwkJCX0KKwkJfQorCX0KKworCS8qCisJICogQHNlZSBJSW5zdGFsbEhhbmRsZXIjY29uZmlndXJlQ29tcGxldGVkCisJICovCisJcHVibGljIHZvaWQgY29uZmlndXJlQ29tcGxldGVkKGJvb2xlYW4gc3VjY2VzcykgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlpZiAoaGFuZGxlciA9PSBudWxsKQorCQkJcmV0dXJuOworCQllbHNlIHsKKwkJCXRyeSB7CisJCQkJaWYgKERFQlVHKQorCQkJCQlkZWJ1ZygiY2FsbGluZyBjb25maWd1cmVDb21wbGV0ZWQoKSIpOyAvLyROT04tTkxTLTEkCisJCQkJaGFuZGxlci5jb25maWd1cmVDb21wbGV0ZWQoc3VjY2Vzcyk7CisJCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgeworCQkJCWhhbmRsZUV4Y2VwdGlvbkluQ2FsbChlLCBmZWF0dXJlKTsKKwkJCX0KKwkJfQorCX0KKworCS8qCisJICogQHNlZSBJSW5zdGFsbEhhbmRsZXIjdW5jb25maWd1cmVJbml0aWF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCB1bmNvbmZpZ3VyZUluaXRpYXRlZCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJaWYgKGhhbmRsZXIgPT0gbnVsbCkKKwkJCXJldHVybjsKKwkJZWxzZSB7CisJCQl0cnkgeworCQkJCWlmIChERUJVRykKKwkJCQkJZGVidWcoImNhbGxpbmcgdW5jb25maWd1cmVJbml0aWF0ZWQoKSIpOyAvLyROT04tTkxTLTEkCisJCQkJaGFuZGxlci51bmNvbmZpZ3VyZUluaXRpYXRlZCgpOworCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKKwkJCQloYW5kbGVFeGNlcHRpb25JbkNhbGwoZSwgZmVhdHVyZSk7CisJCQl9CisJCX0KKwl9CisKKwkvKgorCSAqIEBzZWUgSUluc3RhbGxIYW5kbGVyI2NvbXBsZXRlVW5jb25maWd1cmUKKwkgKi8KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZVVuY29uZmlndXJlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlpZiAoaGFuZGxlciA9PSBudWxsKQorCQkJcmV0dXJuOworCQllbHNlIHsKKwkJCXRyeSB7CisJCQkJaWYgKERFQlVHKQorCQkJCQlkZWJ1ZygiY2FsbGluZyBjb21wbGV0ZVVuY29uZmlndXJlKCkiKTsgLy8kTk9OLU5MUy0xJAorCQkJCWhhbmRsZXIuY29tcGxldGVVbmNvbmZpZ3VyZSgpOworCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKKwkJCQloYW5kbGVFeGNlcHRpb25JbkNhbGwoZSwgZmVhdHVyZSk7CisJCQl9CisJCX0KKwl9CisKKwkvKgorCSAqIEBzZWUgSUluc3RhbGxIYW5kbGVyI3VuY29uZmlndXJlQ29tcGxldGVkCisJICovCisJcHVibGljIHZvaWQgdW5jb25maWd1cmVDb21wbGV0ZWQoYm9vbGVhbiBzdWNjZXNzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCWlmIChoYW5kbGVyID09IG51bGwpIHsKKwkJCWlmIChzYXZlZFN0YXR1cyA9PSBudWxsKQorCQkJCXJldHVybjsKKwkJCWVsc2UKKwkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzYXZlZFN0YXR1cyk7IC8vIGRlbGF5ZWQgZXhjZXB0aW9uCisJCX0gZWxzZSB7CisJCQl0cnkgeworCQkJCWlmIChERUJVRykKKwkJCQkJZGVidWcoImNhbGxpbmcgdW5jb25maWd1cmVDb21wbGV0ZWQoKSIpOyAvLyROT04tTkxTLTEkCisJCQkJaGFuZGxlci51bmNvbmZpZ3VyZUNvbXBsZXRlZChzdWNjZXNzKTsKKwkJCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisJCQkJaGFuZGxlRXhjZXB0aW9uSW5DYWxsKGUsIGZlYXR1cmUpOworCQkJfQorCQkJaWYgKHNhdmVkU3RhdHVzICE9IG51bGwpCisJCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc2F2ZWRTdGF0dXMpOyAvLyBkZWxheWVkIGV4Y2VwdGlvbgorCQl9CisJfQorCisJLyoKKwkgKiBAc2VlIElJbnN0YWxsSGFuZGxlciN1bmluc3RhbGxJbml0aWF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCB1bmluc3RhbGxJbml0aWF0ZWQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCWlmIChoYW5kbGVyID09IG51bGwpCisJCQlyZXR1cm47CisJCWVsc2UgeworCQkJdHJ5IHsKKwkJCQlpZiAoREVCVUcpCisJCQkJCWRlYnVnKCJjYWxsaW5nIHVuaW5zdGFsbEluaXRpYXRlZCgpIik7IC8vJE5PTi1OTFMtMSQKKwkJCQloYW5kbGVyLnVuaW5zdGFsbEluaXRpYXRlZCgpOworCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKKwkJCQloYW5kbGVFeGNlcHRpb25JbkNhbGwoZSwgZmVhdHVyZSk7CisJCQl9CisJCX0KKwl9CisKKwkvKgorCSAqIEBzZWUgSUluc3RhbGxIYW5kbGVyI2NvbXBsZXRlVW5pbnN0YWxsCisJICovCisJcHVibGljIHZvaWQgY29tcGxldGVVbmluc3RhbGwoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCWlmIChoYW5kbGVyID09IG51bGwpCisJCQlyZXR1cm47CisJCWVsc2UgeworCQkJdHJ5IHsKKwkJCQlpZiAoREVCVUcpCisJCQkJCWRlYnVnKCJjYWxsaW5nIGNvbXBsZXRlVW5pbnN0YWxsKCkiKTsgLy8kTk9OLU5MUy0xJAorCQkJCWhhbmRsZXIuY29tcGxldGVVbmluc3RhbGwoKTsKKwkJCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisJCQkJaGFuZGxlRXhjZXB0aW9uSW5DYWxsKGUsIGZlYXR1cmUpOworCQkJfQorCQl9CisJfQorCisJLyoKKwkgKiBAc2VlIElJbnN0YWxsSGFuZGxlciN1bmluc3RhbGxDb21wbGV0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCB1bmluc3RhbGxDb21wbGV0ZWQoYm9vbGVhbiBzdWNjZXNzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCWlmIChoYW5kbGVyID09IG51bGwpIHsKKwkJCWlmIChzYXZlZFN0YXR1cyA9PSBudWxsKQorCQkJCXJldHVybjsKKwkJCWVsc2UKKwkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzYXZlZFN0YXR1cyk7IC8vIGRlbGF5ZWQgZXhjZXB0aW9uCisJCX0gZWxzZSB7CisJCQl0cnkgeworCQkJCWlmIChERUJVRykKKwkJCQkJZGVidWcoImNhbGxpbmcgdW5pbnN0YWxsQ29tcGxldGVkKCkiKTsgLy8kTk9OLU5MUy0xJAorCQkJCWhhbmRsZXIudW5pbnN0YWxsQ29tcGxldGVkKHN1Y2Nlc3MpOworCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKKwkJCQloYW5kbGVFeGNlcHRpb25JbkNhbGwoZSwgZmVhdHVyZSk7CisJCQl9CisJCQlpZiAoc2F2ZWRTdGF0dXMgIT0gbnVsbCkKKwkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzYXZlZFN0YXR1cyk7IC8vIGRlbGF5ZWQgZXhjZXB0aW9uCisJCX0KKwl9CisKKwkvKgorCSAqIGNvbW1vbiBleGNlcHRpb24gaGFuZGxpbmcgZm9yIGluaXRpYWxpemF0aW9uCisJICovCisJcHJpdmF0ZSB2b2lkIGhhbmRsZUV4Y2VwdGlvbkluSW5pdChTdHJpbmcgcywgRXhjZXB0aW9uIGUpCisJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKKworCQlDb3JlRXhjZXB0aW9uIGNlOworCQlpZiAoZSBpbnN0YW5jZW9mIENvcmVFeGNlcHRpb24pCisJCQljZSA9IChDb3JlRXhjZXB0aW9uKSBlOworCQllbHNlCisJCQljZSA9IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKHMsIGUpOworCisJCWlmIChpc1VuZG9BY3Rpb24oKSkgeworCQkJLy8gZm9yICJ1bmRvIiBvcGVyYXRpb25zLCBkZWFjdGl2YXRlIGhhbmRsZXIgYW5kIGxvZyBlcnJvcgorCQkJU3RyaW5nIGlkID0KKwkJCQlVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpOworCQkJSVN0YXR1cyBzdGF0dXMgPQorCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgaWQsIDAsICJJbnN0YWxsSGFuZGxlci5kZWFjdGl2YXRlZCIsIGNlKTsJLy8kTk9OLU5MUy0xJAorCQkJVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXRMb2coKS5sb2coc3RhdHVzKTsKKwkJCWhhbmRsZXIgPSBudWxsOyAvLyBkaXNhYmxlIHN1YnNlcXVlbnQgaGFuZGxlciBjYWxscworCQkJc2F2ZWRTdGF0dXMgPSBzdGF0dXM7CisJCX0gZWxzZQorCQkJLy8gZm9yICJkbyIgb3BlcmF0aW9ucywgaHVybCAuLi4KKwkJCXRocm93IGNlOworCX0KKworCS8qCisJICogY29tbW9uIGV4Y2VwdGlvbiBoYW5kbGluZyBmb3IgY2FsbHMgdG8gaW5zdGFsbCBoYW5kbGVyCisJICovCisJcHJpdmF0ZSB2b2lkIGhhbmRsZUV4Y2VwdGlvbkluQ2FsbChUaHJvd2FibGUgZSwgSUZlYXR1cmUgZmVhdHVyZSkKKwkJdGhyb3dzIENvcmVFeGNlcHRpb24geworCisJCUNvcmVFeGNlcHRpb24gY2U7CisJCWlmIChlIGluc3RhbmNlb2YgQ29yZUV4Y2VwdGlvbikKKwkJCWNlID0gKENvcmVFeGNlcHRpb24pIGU7CisJCWVsc2UKKwkJCWNlID0KKwkJCQlVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbigKKwkJCQkJTkxTLmJpbmQoTWVzc2FnZXMuSW5zdGFsbEhhbmRsZXJfY2FsbEV4Y2VwdGlvbiwgKG5ldyBTdHJpbmdbXSB7IGZlYXR1cmUuZ2V0TGFiZWwoKSB9KSksCisJCQkJCWUpOworCQkKKwkJaWYgKGlzVW5kb0FjdGlvbigpKSB7CisJCQkvLyBmb3IgInVuZG8iIG9wZXJhdGlvbnMsIGRlYWN0aXZhdGUgaGFuZGxlciBhbmQgbG9nIGVycm9yCisJCQlTdHJpbmcgaWQgPQorCQkJCVVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCk7CisJCQlJU3RhdHVzIHN0YXR1cyA9CisJCQkJbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBpZCwgMCwgIkluc3RhbGxIYW5kbGVyLmRlYWN0aXZhdGVkIiwgY2UpOwkvLyROT04tTkxTLTEkCisJCQlVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldExvZygpLmxvZyhzdGF0dXMpOworCQkJaGFuZGxlciA9IG51bGw7IC8vIGRpc2FibGUgc3Vic2VxdWVudCBoYW5kbGVyIGNhbGxzCisJCQlzYXZlZFN0YXR1cyA9IHN0YXR1czsKKwkJfSBlbHNlCisJCQkvLyBmb3IgImRvIiBvcGVyYXRpb25zLCBodXJsIC4uLgorCQkJdGhyb3cgY2U7CisJfQorCisJLyoKKwkgKiBJbmRpY2F0ZXMgd2hldGhlciB3ZSBhcmUgZG9pbmcgKGluc3RhbGwsIGNvbmZpZ3VyZSkgb3IgCisJICogdW5kb2luZyAodW5pbnN0YWxsLCB1bmNvbmZpZ3VyZSkKKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gaXNVbmRvQWN0aW9uKCkgeworCQlpZiAodGhpcy50eXBlID09IElJbnN0YWxsSGFuZGxlci5IQU5ETEVSX0FDVElPTl9JTlNUQUxMCisJCQl8fCB0aGlzLnR5cGUgPT0gSUluc3RhbGxIYW5kbGVyLkhBTkRMRVJfQUNUSU9OX0NPTkZJR1VSRSkKKwkJCXJldHVybiBmYWxzZTsgLy8gY2F1c2VzIGV4Y2VwdGlvbiB0byBiZSB0aHJvd24gYW5kIGFjdGlvbiBhYm9ydGVkCisJCWVsc2UKKwkJCXJldHVybiB0cnVlOyAvLyBjYXVzZXMgZXhjZXB0aW9uIHRvIGJlIGxvZ2dlZCBhbmQgYWN0aW9uIGNvbnRpbnVlcworCX0KKworCS8qCisJICogZ2V0IGFuIGluc3RhbmNlIG9mIGhhbmRsZXIgZG93bmxvYWRlZCBhcyBwYXJ0IG9mIHRoZSBmZWF0dXJlCisJICovCisJcHJpdmF0ZSBJSW5zdGFsbEhhbmRsZXIgZ2V0TG9jYWxIYW5kbGVyKFN0cmluZyBsaWJzLCBTdHJpbmcgbmFtZSkKKwkJdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHsKKworCQkvLyBHZXQgYmFzZWxpbmUgVVJMIGZvciBoYW5kbGVyIChyZWxhdGl2ZSB0byBmZWF0dXJlLnhtbCkuIEZvcgorCQkvLyBmZWF0dXJlcyBiZWluZyBpbnN0YWxsZWQgZnJvbSBhIHNlcnZlciAoZWcuIGh0dHAgcHJvdG9jb2wpCisJCS8vIHRoZSBVUkwgd2lsbCBtb3N0IGxpa2VseSBiZSB0byBhIGxvY2FsIGZpbGUgY29weSBjb250YWluaW5nIHRoZQorCQkvLyB1bnBhY2tlZCBmZWF0dXJlIGphci4KKwkJQ29udGVudFJlZmVyZW5jZSBiYXNlUmVmID0KKwkJCWZlYXR1cmUuZ2V0RmVhdHVyZUNvbnRlbnRQcm92aWRlcigpLmdldEZlYXR1cmVNYW5pZmVzdFJlZmVyZW5jZShudWxsKTsKKwkJVVJMIGJhc2UgPSBudWxsOworCQlpZiAoYmFzZVJlZiAhPSBudWxsKQorCQkJYmFzZSA9IGJhc2VSZWYuYXNVUkwoKTsKKwkJaWYgKGJhc2UgPT0gbnVsbCkKKwkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKAorCQkJCU5MUy5iaW5kKE1lc3NhZ2VzLkluc3RhbGxIYW5kbGVyX3VuYWJsZVRvQ3JlYXRlSGFuZGxlciwgKG5ldyBTdHJpbmdbXSB7IHRoaXMuZmVhdHVyZS5nZXRMYWJlbCgpIH0pKSwKKwkJCQludWxsKTsKKworCisJCS8vIGRldGVybWluZSBsb2FkZXIgY2xhc3MgcGF0aAorCQlTdHJpbmdUb2tlbml6ZXIgbGlicmFyaWVzID0gbmV3IFN0cmluZ1Rva2VuaXplcihsaWJzLCAiLCIpOyAvLyROT04tTkxTLTEkCisJCVVSTFtdIGNwID0gbmV3IFVSTFtsaWJyYXJpZXMuY291bnRUb2tlbnMoKV07CisJCWZvciggaW50IHRva2VuID0gMDsgdG9rZW4gPCBjcC5sZW5ndGg7IHRva2VuKyspIHsKKwkJCWNwW3Rva2VuXSA9IG5ldyBVUkwoYmFzZSwgbGlicmFyaWVzLm5leHRUb2tlbigpKTsKKwkJfQorCQlpZiAodGhpcy50eXBlID09IElJbnN0YWxsSGFuZGxlci5IQU5ETEVSX0FDVElPTl9VTklOU1RBTEwpIHsKKwkJCS8vIGNoZWNrIGlmIHdlIGFyZSBkb2luZyB1bmluc3RhbGwKKwkJCS8vIC4uLiBuZWVkIHRvIG1ha2UgdGVtcCBjb3B5IG9mIGxpYnJhcnkgKGJlaW5nIHJlbW92ZWQpCisJCQlVUkxbXSBqYXJzID0gbmV3IFVSTFtjcC5sZW5ndGhdOworCQkJZm9yKCBpbnQgamFyID0gMDsgamFyIDwgY3AubGVuZ3RoOyBqYXIrKykgeworCQkJCUZpbGUgdGVtcExpYiA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoInRtcCIgKyBqYXIsICIuamFyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCXRlbXBMaWIuZGVsZXRlT25FeGl0KCk7CisJCQkJRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBudWxsOworCQkJCUlucHV0U3RyZWFtIGlzID0gbnVsbDsKKwkJCQl0cnkgeworCQkJCQlmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0ZW1wTGliKTsKKwkJCQkJaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGNwW2phcl0uZ2V0UGF0aCgpKTsKKwkJCQkJVXRpbGl0aWVzLmNvcHkoaXMsIGZvcywgbnVsbCk7CisJCQkJfSBmaW5hbGx5IHsKKwkJCQkJaWYgKGZvcyAhPSBudWxsKQorCQkJCQkJdHJ5IHsKKwkJCQkJCQlmb3MuY2xvc2UoKTsKKwkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJCQl9CisJCQkJCWlmIChpcyAhPSBudWxsKQorCQkJCQkJdHJ5IHsKKwkJCQkJCQlpcy5jbG9zZSgpOworCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQkJCX0KKwkJCQl9CisJCQkJamFyc1tqYXJdID0gdGVtcExpYi50b1VSTCgpOworCQkJfQorCQkJY3AgPSBqYXJzOworCQl9CisKKwkJLy8gY3JlYXRlIGNsYXNzIGxvYWRlciwgbG9hZCBhbmQgaW5zdGFudGlhdGUgaGFuZGxlcgorCQlDbGFzc0xvYWRlciBsb2FkZXIgPSBuZXcgSW5zdGFsbEhhbmRsZXJDbGFzc0xvYWRlcihjcCk7CisJCUNsYXNzIGNsYXp6ID0gbG9hZGVyLmxvYWRDbGFzcyhuYW1lKTsKKwkJSUluc3RhbGxIYW5kbGVyIGhhbmRsZXIgPSAoSUluc3RhbGxIYW5kbGVyKSBjbGF6ei5uZXdJbnN0YW5jZSgpOworCQlyZXR1cm4gaGFuZGxlcjsKKwl9CisKKwkvKgorCSAqIGdldCBpbnN0YW5jZSBvZiBnbG9iYWwgaGFuZGxlciByZWdpc3RlcmVkIHZpYSBleHRlbnNpb24gcG9pbnQKKwkgKi8KKwlwcml2YXRlIElJbnN0YWxsSGFuZGxlciBnZXRHbG9iYWxIYW5kbGVyKFN0cmluZyBuYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKKwkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gaGFuZGxlckV4dGVuc2lvbiA9CisJCQlyZWcuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKEVYVF9QTFVHSU4sIEVYVF9QT0lOVCwgbmFtZSk7CisJCWlmIChoYW5kbGVyRXh0ZW5zaW9uID09IG51bGwgfHwgaGFuZGxlckV4dGVuc2lvbi5sZW5ndGggPD0gMCkKKwkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKAorCQkJCU5MUy5iaW5kKE1lc3NhZ2VzLkluc3RhbGxIYW5kbGVyX3VuYWJsZVRvQ3JlYXRlSGFuZGxlciwgKG5ldyBTdHJpbmdbXSB7IHRoaXMuZmVhdHVyZS5nZXRMYWJlbCgpIH0pKSwKKwkJCQludWxsKTsKKworCQlyZXR1cm4gKElJbnN0YWxsSGFuZGxlcikgaGFuZGxlckV4dGVuc2lvblswXS5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOyAvLyROT04tTkxTLTEkCisJfQorCQorCXByaXZhdGUgdm9pZCBkZWJ1ZyhTdHJpbmcgcykgeworCQlTdHJpbmcgcGZ4ID0gKGZlYXR1cmU9PW51bGwpID8gIiIgOiBmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpOyAvLyROT04tTkxTLTEkCisJCVN5c3RlbS5vdXQucHJpbnRsbigiSW5zdGFsbEhhbmRsZXJbIitwZngrIl06ICIgKyBzKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJfQorCisJcHVibGljIGJvb2xlYW4gYWNjZXB0Tm9uUGx1Z2luRGF0YShJTm9uUGx1Z2luRW50cnkgZGF0YSkgeworCQlCb29sZWFuIHJlc3VsdCA9IG5ldyBCb29sZWFuKHRydWUpOworCQlpZiAoaGFuZGxlciAhPSBudWxsKXsKKwkJCWlmIChERUJVRykKKwkJCQlkZWJ1ZygiY2FsbGluZyBhY2NlcHROb25QbHVnaW5EYXRhKCkiKTsgLy8kTk9OLU5MUy0xJAorCQkJaWYoaGFuZGxlciBpbnN0YW5jZW9mIElJbnN0YWxsSGFuZGxlcldpdGhGaWx0ZXIpCisJCQkJcmV0dXJuICgoSUluc3RhbGxIYW5kbGVyV2l0aEZpbHRlciloYW5kbGVyKS5hY2NlcHROb25QbHVnaW5EYXRhKGRhdGEpOworCQkJZWxzZXsgLy9zdXBwb3J0IHVwZ3JhZGUgZnJvbSBsZWdhY3kgdmVyc2lvbnMKKwkJCQlpZihnZXROb25QbHVnaW5EYXRhQWNjZXB0b3IoKSAhPSBudWxsKXsKKwkJCQkJdHJ5eworCQkJCQkJT2JqZWN0W10gcGFyYW0gPSB7ZGF0YX07CisJCQkJCQlyZXN1bHQgPSAoQm9vbGVhbilnZXROb25QbHVnaW5EYXRhQWNjZXB0b3IoKS5pbnZva2UoaGFuZGxlcixwYXJhbSk7CisJCQkJCX1jYXRjaChFeGNlcHRpb24gZSl7CisJCQkJCQkvL3RvZG8KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gcmVzdWx0LmJvb2xlYW5WYWx1ZSgpOworCX0KKwlwcml2YXRlIE1ldGhvZCBnZXROb25QbHVnaW5EYXRhQWNjZXB0b3IoKXsKKwkJaWYobm9uUGx1Z2luRGF0YUFjY2VwdG9yID09IG51bGwpeworCQkJdHJ5eworCQkJCUNsYXNzW10gdHlwZXMgPSB7SU5vblBsdWdpbkVudHJ5LmNsYXNzfTsKKwkJCQlub25QbHVnaW5EYXRhQWNjZXB0b3IgPSBoYW5kbGVyLmdldENsYXNzKCkuZ2V0TWV0aG9kKCJhY2NlcHROb25QbHVnaW5EYXRhIix0eXBlcyk7IC8vJE5PTi1OTFMtMSQKKwkJCX1jYXRjaChOb1N1Y2hNZXRob2RFeGNlcHRpb24gbnNtZSl7CisJCQl9CisJCX0KKwkJcmV0dXJuIG5vblBsdWdpbkRhdGFBY2NlcHRvcjsKKwl9Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0luc3RhbGxMb2dQYXJzZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvSW5zdGFsbExvZ1BhcnNlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5NWQzOGMKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0luc3RhbGxMb2dQYXJzZXIuamF2YQpAQCAtMCwwICsxLDI0NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7CisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS5uZXQuKjsKK2ltcG9ydCBqYXZhLnRleHQuUGFyc2VFeGNlcHRpb247CitpbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwub3BlcmF0aW9ucy4qOworCisKKy8qKgorICogUGFyc2VzIHRoZSBpbnN0YWxsYXRpb24gbG9nIGFuZCBjcmVhdGVzIGluc3RhbGxhdGlvbiBjb25maWd1cmF0aW9uIG9iamVjdHMKKyAqLworcHVibGljIGNsYXNzIEluc3RhbGxMb2dQYXJzZXIgeworCXByaXZhdGUgSVBhdGggbG9nUGF0aDsKKwlwcml2YXRlIEJ1ZmZlcmVkUmVhZGVyIGJ1ZmZSZWFkOworCXByaXZhdGUgSW5zdGFsbENvbmZpZ3VyYXRpb24gY3VycmVudENvbmZpZ3VyYXRpb247CisJcHJpdmF0ZSBIYXNoTWFwIGluc3RhbGxDb25maWdNYXA7CisJcHJpdmF0ZSBDb21wYXJhdG9yIGNvbXBhcmF0b3I7CisJCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZFQVRVUkVfSU5TVEFMTCA9ICJmZWF0dXJlLWluc3RhbGwiOyAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZFQVRVUkVfUkVNT1ZFID0gImZlYXR1cmUtcmVtb3ZlIjsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTSVRFX0lOU1RBTEwgPSAic2l0ZS1pbnN0YWxsIjsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTSVRFX1JFTU9WRSA9ICJzaXRlLXJlbW92ZSI7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5DT05GSUdVUkUgPSAiZmVhdHVyZS1kaXNhYmxlIjsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdVUkUgPSAiZmVhdHVyZS1lbmFibGUiOyAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFVkVSVCA9ICJyZXZlcnQiOyAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFQ09OQ0lMSUFUSU9OID0gInJlY29uY2lsaWF0aW9uIjsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVTRVJWRUQgPSAicHJlc2VydmUtY29uZmlndXJhdGlvbiI7IC8vJE5PTi1OTFMtMSQJCisJCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElWSVRZID0gIiFBQ1RJVklUWSI7IC8vJE5PTi1OTFMtMSQKKwkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVUNDRVNTID0gInN1Y2Nlc3MiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFJTFVSRSA9ICJmYWlsdXJlIjsgLy8kTk9OLU5MUy0xJAorCisJCisJcHVibGljIEluc3RhbGxMb2dQYXJzZXIoKXsKKwkJU3RyaW5nIGxvYyA9IENvbmZpZ3VyYXRvclV0aWxzLmdldEN1cnJlbnRQbGF0Zm9ybUNvbmZpZ3VyYXRpb24oKS5nZXRDb25maWd1cmF0aW9uTG9jYXRpb24oKS5nZXRGaWxlKCk7CisJCWxvZ1BhdGggPSBuZXcgUGF0aChsb2MpLnJlbW92ZUxhc3RTZWdtZW50cygxKS5hcHBlbmQoImluc3RhbGwubG9nIik7ICAvLyROT04tTkxTLTEkCisJCWluc3RhbGxDb25maWdNYXAgPSBuZXcgSGFzaE1hcCgpOworCQl0cnkgeworCQkJSW5zdGFsbENvbmZpZ3VyYXRpb25bXSBjb25maWdzID0gKEluc3RhbGxDb25maWd1cmF0aW9uW10pU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkuZ2V0Q29uZmlndXJhdGlvbkhpc3RvcnkoKTsKKwkJCWZvciAoaW50IGk9MDtpPGNvbmZpZ3MubGVuZ3RoOyBpKyspeworCQkJCWlmICghY29uZmlnc1tpXS5pc0N1cnJlbnQoKSkKKwkJCQkJaW5zdGFsbENvbmZpZ01hcC5wdXQobmV3IExvbmcoY29uZmlnc1tpXS5nZXRDcmVhdGlvbkRhdGUoKS5nZXRUaW1lKCkpLCBjb25maWdzW2ldKTsKKwkJCX0KKwkJCS8vIE5lZWQgdG8gbWFrZSBhIGNvcHkgb2YgdGhlIGN1cnJlbnQgY29uZmlnIGluc3RlYWQKKwkJCUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZyA9IGdldENvbmZpZ0NvcHkoKEluc3RhbGxDb25maWd1cmF0aW9uKVNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkpOworCQkJaW5zdGFsbENvbmZpZ01hcC5wdXQobmV3IExvbmcoY29uZmlnLmdldENyZWF0aW9uRGF0ZSgpLmdldFRpbWUoKSksIGNvbmZpZyk7CisJCQkKKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQlVcGRhdGVDb3JlLmxvZyhlKTsKKwkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpeworCQkJVXBkYXRlQ29yZS5sb2coZSk7CisJCX0KKwkJY29tcGFyYXRvciA9IG5ldyBDb21wYXJhdG9yKCl7CisJCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IGUxLCBPYmplY3QgZTIpIHsKKwkJCQlEYXRlIGRhdGUxID0gKChJbnN0YWxsQ29uZmlndXJhdGlvbillMSkuZ2V0Q3JlYXRpb25EYXRlKCk7CisJCQkJRGF0ZSBkYXRlMiA9ICgoSW5zdGFsbENvbmZpZ3VyYXRpb24pZTIpLmdldENyZWF0aW9uRGF0ZSgpOworCQkJCXJldHVybiBkYXRlMS5iZWZvcmUoZGF0ZTIpID8gMSA6IC0xOworCQkJfQorCQl9OworCX0KKwlwcml2YXRlIEluc3RhbGxDb25maWd1cmF0aW9uIGdldENvbmZpZ0NvcHkoSW5zdGFsbENvbmZpZ3VyYXRpb24gb3JpZ0NvbmZpZykgdGhyb3dzIENvcmVFeGNlcHRpb24sIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbnsKKwkJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IEluc3RhbGxDb25maWd1cmF0aW9uKG9yaWdDb25maWcsIG9yaWdDb25maWcuZ2V0VVJMKCksIG9yaWdDb25maWcuZ2V0TGFiZWwoKSApOworCQljb25maWcuc2V0Q3JlYXRpb25EYXRlKG9yaWdDb25maWcuZ2V0Q3JlYXRpb25EYXRlKCkpOworCQlyZXR1cm4gY29uZmlnOworCX0KKwlwdWJsaWMgdm9pZCBwYXJzZUluc3RhbGxhdGlvbkxvZygpeworCQl0cnkgeworCQkJb3BlbkxvZygpOworCQkJcGFyc2VMb2coKTsKKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQlVcGRhdGVVdGlscy5sb2dFeGNlcHRpb24oZSk7CisJCX0gZmluYWxseSB7CisJCQljbG9zZUxvZygpOworCQl9CisJfQorCQorCXByaXZhdGUgdm9pZCBvcGVuTG9nKCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQl0cnkgeworCQkgICAgLy8gdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KKwkJICAgIElucHV0U3RyZWFtIGlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShsb2dQYXRoLnRvT1NTdHJpbmcoKSk7CisJCSAgICAvLyB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbgorCQkgICAgSW5wdXRTdHJlYW1SZWFkZXIgaXNyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGlzLCJVVEYtOCIpOyAvLyROT04tTkxTLTEkCisJCSAgICBidWZmUmVhZCA9IG5ldyBCdWZmZXJlZFJlYWRlcihpc3IpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJdGhyb3dDb3JlRXhjZXB0aW9uKGUpOworCQl9CisJfQorCQorCXByaXZhdGUgdm9pZCB0aHJvd0NvcmVFeGNlcHRpb24oVGhyb3dhYmxlIGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oCisJCQluZXcgU3RhdHVzKAorCQkJCUlTdGF0dXMuRVJST1IsCisJCQkJVXBkYXRlVXRpbHMuZ2V0UGx1Z2luSWQoKSwKKwkJCQlJU3RhdHVzLkVSUk9SLAorCQkJCU1lc3NhZ2VzLkluc3RhbGxMb2dQYXJzZXJfZXJyb3JzLCAKKwkJCQllKSk7CisJfQorCQorCXByaXZhdGUgdm9pZCBwYXJzZUxvZygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJLy8gCQkuaW5zdGFsbC1sb2cgdGVtcGxhdGUKKwkJLy8JCSFDT05GSUdVUkFUSU9OIDxjb25maWd1cmF0aW9uLWRhdGU+CisJCS8vCQkhQUNUSVZJVFkgPGRhdGU+IDx0YXJnZXQ+IDxhY3Rpb24+IDxzdGF0dXM+CisKKwkJdHJ5IHsKKwkJCVN0cmluZyB0eXBlLCBzdGF0dXMsIGFjdGlvbjsKKwkJCVN0cmluZ1Rva2VuaXplciBodG1sQ29kZTsKKworCQkJd2hpbGUgKGJ1ZmZSZWFkLnJlYWR5KCkpIHsKKworCQkJCWh0bWxDb2RlID0gbmV3IFN0cmluZ1Rva2VuaXplcihidWZmUmVhZC5yZWFkTGluZSgpKTsKKwkJCQl3aGlsZSAoIShodG1sQ29kZS5oYXNNb3JlRWxlbWVudHMoKSkpIHsKKwkJCQkJaWYgKCFidWZmUmVhZC5yZWFkeSgpKQorCQkJCQkJcmV0dXJuOworCQkJCQlodG1sQ29kZSA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoYnVmZlJlYWQucmVhZExpbmUoKSk7CisJCQkJfQorCisJCQkJdHlwZSA9IGh0bWxDb2RlLm5leHRUb2tlbigpLnRyaW0oKTsKKworCQkJCWlmICh0eXBlLmVxdWFscyhBQ1RJVklUWSkpIHsKKwkJCQkJU3RyaW5nIHRpbWUgPSBodG1sQ29kZS5uZXh0VG9rZW4oKTsKKwkJCQkJU3RyaW5nIGRhdGU7CisJCQkJCVN0cmluZ0J1ZmZlciB0YXJnZXQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJCQkJCWRhdGUgPSBodG1sQ29kZS5uZXh0VG9rZW4oIi4iKTsgIC8vJE5PTi1OTFMtMSQKKwkJCQkJaHRtbENvZGUubmV4dFRva2VuKCIgIik7ICAvLyROT04tTkxTLTEkCisJCQkJCXdoaWxlIChodG1sQ29kZS5jb3VudFRva2VucygpID4gMil7CisJCQkJCQl0YXJnZXQuYXBwZW5kKCIgIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCXRhcmdldC5hcHBlbmQoaHRtbENvZGUubmV4dFRva2VuKCkpOworCQkJCQl9CisJCQkJCQorCQkJCQlhY3Rpb24gPSBodG1sQ29kZS5uZXh0VG9rZW4oKTsKKwkJCQkJc3RhdHVzID0gaHRtbENvZGUubmV4dFRva2VuKCk7CisJCQkJCWNyZWF0ZUFjdGl2aXR5KGFjdGlvbiwgdGltZSwgZGF0ZSwgc3RhdHVzLCB0YXJnZXQudG9TdHJpbmcoKSwgY3VycmVudENvbmZpZ3VyYXRpb24pOworCQkJCX0gIGVsc2UgeworCQkJCQlTdHJpbmcgdGltZSA9IGh0bWxDb2RlLm5leHRUb2tlbigpOworCQkJCQlTdHJpbmdCdWZmZXIgZGF0ZTsKKwkJCQkJZGF0ZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJCQkJd2hpbGUgKGh0bWxDb2RlLmNvdW50VG9rZW5zKCkgPiAwKXsKKwkJCQkJCWlmIChkYXRlLmxlbmd0aCgpICE9IDApCisJCQkJCQkJZGF0ZS5hcHBlbmQoIiAiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJZGF0ZS5hcHBlbmQoaHRtbENvZGUubmV4dFRva2VuKCkpOworCQkJCQl9CisJCQkJCWN1cnJlbnRDb25maWd1cmF0aW9uID0gKEluc3RhbGxDb25maWd1cmF0aW9uKWluc3RhbGxDb25maWdNYXAuZ2V0KG5ldyBMb25nKHRpbWUpKTsKKwkJCQl9CisJCQl9CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvd0NvcmVFeGNlcHRpb24oZSk7CisJCX0KKwl9CisJCisJcHJpdmF0ZSB2b2lkIGNsb3NlTG9nKCkgeworCQl0cnkgeworCQkJaWYgKGJ1ZmZSZWFkICE9IG51bGwpCisJCQkJYnVmZlJlYWQuY2xvc2UoKTsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQl9IGZpbmFsbHkgeworCQkJYnVmZlJlYWQgPSBudWxsOworCQl9CisJfQorCXByaXZhdGUgSUFjdGl2aXR5IGNyZWF0ZUFjdGl2aXR5KFN0cmluZyBhY3Rpb24sIFN0cmluZyB0aW1lLCBTdHJpbmcgZGF0ZSwgU3RyaW5nIHN0YXR1cywgU3RyaW5nIHRhcmdldCwgSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnKXsKKwkJQ29uZmlndXJhdGlvbkFjdGl2aXR5IGEgPSBuZXcgQ29uZmlndXJhdGlvbkFjdGl2aXR5KCk7CisKKwkJaW50IGNvZGUgPSAwOworCQlpZiAoRkVBVFVSRV9JTlNUQUxMLmVxdWFscyhhY3Rpb24pKQorCQkJY29kZSA9IElBY3Rpdml0eS5BQ1RJT05fRkVBVFVSRV9JTlNUQUxMOworCQllbHNlIGlmIChGRUFUVVJFX1JFTU9WRS5lcXVhbHMoYWN0aW9uKSkKKwkJCWNvZGUgPSBJQWN0aXZpdHkuQUNUSU9OX0ZFQVRVUkVfUkVNT1ZFOworCQllbHNlIGlmIChTSVRFX0lOU1RBTEwuZXF1YWxzKGFjdGlvbikpCisJCQljb2RlID0gSUFjdGl2aXR5LkFDVElPTl9TSVRFX0lOU1RBTEw7CisJCWVsc2UgaWYgKFNJVEVfUkVNT1ZFLmVxdWFscyhhY3Rpb24pKQorCQkJY29kZSA9IElBY3Rpdml0eS5BQ1RJT05fU0lURV9SRU1PVkU7CisJCWVsc2UgaWYgKFVOQ09ORklHVVJFLmVxdWFscyhhY3Rpb24pKQorCQkJY29kZSA9IElBY3Rpdml0eS5BQ1RJT05fVU5DT05GSUdVUkU7CisJCWVsc2UgaWYgKENPTkZJR1VSRS5lcXVhbHMoYWN0aW9uKSkKKwkJCWNvZGUgPSBJQWN0aXZpdHkuQUNUSU9OX0NPTkZJR1VSRTsKKwkJZWxzZSBpZiAoUkVWRVJULmVxdWFscyhhY3Rpb24pKQorCQkJY29kZSA9IElBY3Rpdml0eS5BQ1RJT05fUkVWRVJUOworCQllbHNlIGlmIChSRUNPTkNJTElBVElPTi5lcXVhbHMoYWN0aW9uKSkKKwkJCWNvZGUgPSBJQWN0aXZpdHkuQUNUSU9OX1JFQ09OQ0lMSUFUSU9OOworCQllbHNlIGlmIChQUkVTRVJWRUQuZXF1YWxzKGFjdGlvbikpCisJCQljb2RlID0gSUFjdGl2aXR5LkFDVElPTl9BRERfUFJFU0VSVkVEOworCQkKKwkJYS5zZXRBY3Rpb24oY29kZSk7CisJCXRyeSB7CisJCQlsb25nIGFjdGl2aXR5VGltZSA9IExvbmcucGFyc2VMb25nKHRpbWUpOworCQkJYS5zZXREYXRlKG5ldyBEYXRlKGFjdGl2aXR5VGltZSkpOworCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworCQkJLy9QQUwgZm91bmRhdGlvbgorCQkJLy9hLnNldERhdGUobmV3IERhdGUoZGF0ZSkpOworCQkJdHJ5IHsKKwkJCQlhLnNldERhdGUobmV3IFNpbXBsZURhdGVGb3JtYXQoKS5wYXJzZShkYXRlKSk7CisJCQl9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlMSkgeworCQkJCS8vaWdub3JlCisJCQl9CisJCX0KKwkJYS5zZXRTdGF0dXMoU1VDQ0VTUy5lcXVhbHMoc3RhdHVzKSA/IElBY3Rpdml0eS5TVEFUVVNfT0sgOiBJQWN0aXZpdHkuU1RBVFVTX05PSyk7CisJCWEuc2V0TGFiZWwodGFyZ2V0KTsKKwkJYS5zZXRJbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsKGNvbmZpZyk7CisJCQorCQlpZiAoY29uZmlnICE9IG51bGwgJiYgIWNvbmZpZ0NvbnRhaW5zQWN0aXZpdHkoY29uZmlnLCBhKSl7CisJCQljb25maWcuYWRkQWN0aXZpdHkoYSk7CisJCX0KKwkJCisJCXJldHVybiBhOworCX0KKwkKKwlwcml2YXRlIGJvb2xlYW4gY29uZmlnQ29udGFpbnNBY3Rpdml0eShJbnN0YWxsQ29uZmlndXJhdGlvbiBjLCBJQWN0aXZpdHkgYSl7CisJCUlBY3Rpdml0eVtdIGFjdGl2aXRpZXMgPSBjLmdldEFjdGl2aXRpZXMoKTsKKwkJZm9yIChpbnQgaSA9IDAgOyBpPGFjdGl2aXRpZXMubGVuZ3RoOyBpKyspeworCQkJaWYgKGEuZXF1YWxzKGFjdGl2aXRpZXNbaV0pKQorCQkJCXJldHVybiB0cnVlOworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwdWJsaWMgSW5zdGFsbENvbmZpZ3VyYXRpb25bXSBnZXRDb25maWd1cmF0aW9ucygpeworCQlDb2xsZWN0aW9uIGNvbmZpZ1NldCA9IGluc3RhbGxDb25maWdNYXAudmFsdWVzKCk7CisJCUluc3RhbGxDb25maWd1cmF0aW9uW10gY29uZmlncyA9IChJbnN0YWxsQ29uZmlndXJhdGlvbltdKSBjb25maWdTZXQudG9BcnJheShuZXcgSW5zdGFsbENvbmZpZ3VyYXRpb25bY29uZmlnU2V0LnNpemUoKV0pOworCQlBcnJheXMuc29ydChjb25maWdzLCBjb21wYXJhdG9yKTsKKwkJcmV0dXJuIGNvbmZpZ3M7CisJfQorfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9JbnN0YWxsUmVnaXN0cnkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvSW5zdGFsbFJlZ2lzdHJ5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRlNzNlOQotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvSW5zdGFsbFJlZ2lzdHJ5LmphdmEKQEAgLTAsMCArMSwxODMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOworCisvKioKKyAqIEtlZXBzIHRyYWNrIG9mIGFsbCB0aGUgZmVhdHVyZXMgYW5kIHBsdWdpbnMgaW5zdGFsbGVkIGJ5IFVwZGF0ZSBtZ3IKKyAqIHNvIHRoZXkgY2FuIGJlIHVuaW5zdGFsbGVkIGxhdGVyLgorICogVGhlIGluZm8gaXMgcGVyc2lzdGVkIGluIHRoZSAuY29uZmlnL3JlZ2lzdHJ5IGZpbGUgYW5kIGVhY2ggZW50cnkgaGFzIGEga2V5PWtleSB3aGVyZQorICogZm9yIGZlYXR1cmUgdGhpcyBrZXkgaXMgZmVhdHVyZV88aWQ+Xzx2ZXJzaW9uPiBhbmQgZm9yIHBsdWdpbnMKKyAqIGtleSBpcyBwbHVnaW5fPGlkPl88dmVyc2lvbj4uIE5vcm1hbGx5LCBnZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkgd2lsbAorICogcmV0dXJuIDxpZD5fPHZlcnNpb24+LiBFZzogZmVhdHVyZV9vcmcuZWNsaXBzZS5wbGF0Zm9ybV8zLjAuMAorICogCisgKi8KK3B1YmxpYyBjbGFzcyBJbnN0YWxsUmVnaXN0cnkgZXh0ZW5kcyBQcm9wZXJ0aWVzIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworICAgIHByaXZhdGUgRmlsZSBmaWxlID0gbnVsbDsKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgUkVHSVNUUlkgPSAicmVnaXN0cnkiOyAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBzdGF0aWMgSW5zdGFsbFJlZ2lzdHJ5IGluc3RhbmNlOworCQorCS8vIHBsdWdpbnMgaW5zdGFsbGVkIGluIHRoaXMgZWNsaXBzZSBzZXNzaW9uCisJcHJpdmF0ZSBIYXNoTWFwIGp1c3RJbnN0YWxsZWRQbHVnaW5zID0gbmV3IEhhc2hNYXAoKTsKKwkKKwkvKioKKwkgKiBDcmVhdGVzIGVtcHR5IFByb3BlcnRpZXMuCisJICovCisJcHJpdmF0ZSBJbnN0YWxsUmVnaXN0cnkoKSB7CisJCXN1cGVyKCk7CisJCVN0cmluZyBjb25maWdGaWxlID0KKwkJCUNvbmZpZ3VyYXRvclV0aWxzCisJCQkJLmdldEN1cnJlbnRQbGF0Zm9ybUNvbmZpZ3VyYXRpb24oKQorCQkJCS5nZXRDb25maWd1cmF0aW9uTG9jYXRpb24oKQorCQkJCS5nZXRGaWxlKCk7CisJCWZpbGUgPSBuZXcgRmlsZShjb25maWdGaWxlKTsKKwkJZmlsZSA9IGZpbGUuZ2V0UGFyZW50RmlsZSgpOworCQlmaWxlID0gbmV3IEZpbGUoZmlsZSwgUkVHSVNUUlkpOworCQlyZXN0b3JlKCk7CisJfQorCisJLyoqCisJICogU2luZ2xldG9uCisJICovCisJcHVibGljIHN0YXRpYyBJbnN0YWxsUmVnaXN0cnkgZ2V0SW5zdGFuY2UoKSB7CisJCWlmIChpbnN0YW5jZSA9PSBudWxsKQorCQkJaW5zdGFuY2UgPSBuZXcgSW5zdGFsbFJlZ2lzdHJ5KCk7CisJCXJldHVybiBpbnN0YW5jZTsKKwl9CisKKwkvKioKKwkgKiBSZXN0b3JlcyBjb250ZW50cyBvZiB0aGUgUHJvcGVydGllcyBmcm9tIGEgZmlsZS4KKwkgKiBAcmV0dXJuIHRydWUgaWYgcGVyc2lzdGFudCBkYXRhIHdhcyByZWFkIGluCisJICovCisJcHVibGljIGJvb2xlYW4gcmVzdG9yZSgpIHsKKwkJSW5wdXRTdHJlYW0gaW4gPSBudWxsOworCQlib29sZWFuIGxvYWRlZCA9IGZhbHNlOworCQljbGVhcigpOworCQkvLyBUZXN0IGlmIHdlIGhhdmUgYSBjb250cmlidXRpb24gZmlsZSB0byBzdGFydCB3aXRoCisJCS8vIElmIHRoaXMgaXMgYSBjbGVhbiBzdGFydCwgdGhlbiB3ZSB3aWxsIG5vdCBoYXZlIGEgCisJCS8vIGNvbnRyaWJ1dGlvbiBmaWxlLiByZXR1cm4gZmFsc2UuCisJCWlmICghZmlsZS5leGlzdHMoKSkKKwkJCXJldHVybiBsb2FkZWQ7CisJCXRyeSB7CisJCQlpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7CisJCQlzdXBlci5sb2FkKGluKTsKKwkJCWxvYWRlZCA9IHRydWU7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCVVwZGF0ZUNvcmUubG9nKGUpOworCQl9IGZpbmFsbHkgeworCQkJaWYgKGluICE9IG51bGwpCisJCQkJdHJ5IHsKKwkJCQkJaW4uY2xvc2UoKTsKKwkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJfQorCQl9CisJCXJldHVybiBsb2FkZWQ7CisJfQorCS8qKgorCSAqIFNhdmVzIGNvbnRlbnRzIG9mIHRoZSB0YWJsZSB0byBhIGZpbGUuCisJICogQHJldHVybiB0cnVlIGlmIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bAorCSAqLworCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBzYXZlKCkgeworCQlPdXRwdXRTdHJlYW0gb3V0ID0gbnVsbDsKKwkJYm9vbGVhbiByZXQgPSBmYWxzZTsKKwkJdHJ5IHsKKwkJCW91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpOworCQkJc3VwZXIuc3RvcmUob3V0LCAiVGhpcyBpcyBhIGdlbmVyYXRlZCBmaWxlOyBkbyBub3QgZWRpdC4iKTsgLy8kTk9OLU5MUy0xJAorCQkJcmV0ID0gdHJ1ZTsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJVXBkYXRlQ29yZS5sb2coZSk7CisJCX0gZmluYWxseSB7CisJCQl0cnkgeworCQkJCWlmIChvdXQgIT0gbnVsbCkgeworCQkJCQlvdXQuY2xvc2UoKTsKKwkJCQl9CisJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQl9CisJCX0KKwkJcmV0dXJuIHJldDsKKwl9CisJCisJLyoqCisJICogUmVnaXN0ZXJzIGFuIGluc3RhbGxlZCBmZWF0dXJlIHNvIGl0IGNhbiBiZSB1bmluc3RhbGxlZCBsYXRlci4KKwkgKiBAcGFyYW0gZmVhdHVyZSBmZWF0dXJlIHRvIHJlZ2lzdGVyLgorCSAqLworCXB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgcmVnaXN0ZXJGZWF0dXJlKElGZWF0dXJlIGZlYXR1cmUpIHsKKwkJU3RyaW5nIG5hbWUgPSAiZmVhdHVyZV8iK2ZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOyAvLyROT04tTkxTLTEkCisJCWlmIChJbnN0YWxsUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXQobmFtZSkgPT0gbnVsbCkgeworCQkJSW5zdGFsbFJlZ2lzdHJ5LmdldEluc3RhbmNlKCkucHV0KG5hbWUsIG5hbWUpOworCQkJLy8gd2Ugc2F2ZSBhZnRlciBlYWNoIHJlZ2lzdHJhdGlvbgorCQkJSW5zdGFsbFJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuc2F2ZSgpOworCQl9CisJfQorCQorCS8qKgorCSAqIFJlZ2lzdGVycyBhbiBpbnN0YWxsZWQgZmVhdHVyZSBzbyBpdCBjYW4gYmUgdW5pbnN0YWxsZWQgbGF0ZXIuCisJICogQHBhcmFtIHBsdWdpbkVudHJ5IHBsdWdpbiB0byByZWdpc3Rlci4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIHJlZ2lzdGVyUGx1Z2luKElQbHVnaW5FbnRyeSBwbHVnaW5FbnRyeSkgeworCQlTdHJpbmcgbmFtZSA9ICJwbHVnaW5fIitwbHVnaW5FbnRyeS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKEluc3RhbGxSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldChuYW1lKSA9PSBudWxsKSB7CisJCQlJbnN0YWxsUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5wdXQobmFtZSwgbmFtZSk7CisJCQkvLyB3ZSBzYXZlIGFmdGVyIGVhY2ggcmVnaXN0cmF0aW9uCisJCQlJbnN0YWxsUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5zYXZlKCk7CisJCX0KKwkJCisJCS8vIGFkZCBwbHVnaW4gdG8gdGhlIGxpc3Qgb2YganVzdCBpbnN0YWxsZWQgcGx1Z2lucyAuCisJCUluc3RhbGxSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmp1c3RJbnN0YWxsZWRQbHVnaW5zLnB1dChuYW1lLG5hbWUpOworCX0KKwkKKwkvKioKKwkgKiBSZW1vdmVzIHNwZWNpZmllZCBmZWF0dXJlIGZyb20gcmVnaXN0cnkKKwkgKgorCSAqLworCXB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgdW5yZWdpc3RlckZlYXR1cmUoSUZlYXR1cmUgZmVhdHVyZSkgeworCQlTdHJpbmcgbmFtZSA9ICJmZWF0dXJlXyIrZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7IC8vJE5PTi1OTFMtMSQKKwkJSW5zdGFsbFJlZ2lzdHJ5LmdldEluc3RhbmNlKCkucmVtb3ZlKG5hbWUpOworCX0KKwkKKwkvKioKKwkgKiBSZW1vdmVzIHNwZWNpZmllZCBwbHVnaW4gZnJvbSByZWdpc3RyeQorCSAqCisJICovCisJcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCB1bnJlZ2lzdGVyUGx1Z2luKElQbHVnaW5FbnRyeSBwbHVnaW5FbnRyeSkgeworCQlTdHJpbmcgbmFtZSA9ICJwbHVnaW5fIitwbHVnaW5FbnRyeS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7IC8vJE5PTi1OTFMtMSQKKwkJSW5zdGFsbFJlZ2lzdHJ5LmdldEluc3RhbmNlKCkucmVtb3ZlKG5hbWUpOworCQkKKwkJLy8gcmVtb3ZlIHRoZSBwbHVnaW4gZnJvbSB0aGUgbGlzdCBvZiBqdXN0IGluc3RhbGxlZCBwbHVnaW5zIChpZiBuZWVkZWQpLgorCQlJbnN0YWxsUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5qdXN0SW5zdGFsbGVkUGx1Z2lucy5yZW1vdmUobmFtZSk7CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcGx1Z2luIHdhcyBpbnN0YWxsZWQgZHVyaW5nIHRoaXMgZWNsaXBzZSBzZXNzaW9uCisJICogQHBhcmFtIHBsdWdpbkVudHJ5CisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzUGx1Z2luSnVzdEluc3RhbGxlZChJUGx1Z2luRW50cnkgcGx1Z2luRW50cnkpIHsKKwkJU3RyaW5nIG5hbWUgPSAicGx1Z2luXyIrcGx1Z2luRW50cnkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOyAvLyROT04tTkxTLTEkCisJCXJldHVybiBJbnN0YWxsUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5qdXN0SW5zdGFsbGVkUGx1Z2lucy5nZXQobmFtZSkgIT0gbnVsbDsKKwl9CisJCisJLyoqCisJICogVGhpcyBtZXRob2QgaXMgb25seSBuZWVkZWQgZm9yIHRoZSB1cGRhdGUgSlVuaXQgdGVzdHMuCisJICoKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgY2xlYW51cCgpIHsKKwkJSW5zdGFsbFJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuanVzdEluc3RhbGxlZFBsdWdpbnMuY2xlYXIoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0ludGVybmFsU2l0ZU1hbmFnZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvSW50ZXJuYWxTaXRlTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwMTY1MDEKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0ludGVybmFsU2l0ZU1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDM5NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk11bHRpU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uSUxvY2FsU2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JU2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JU2l0ZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVNpdGVGYWN0b3J5RXh0ZW5zaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkphckNvbnRlbnRSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuU2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5VdGlsaXRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuSW52YWxpZFNpdGVUeXBlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLmNvbm5lY3Rpb24uQ29ubmVjdGlvbkZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuY29ubmVjdGlvbi5JUmVzcG9uc2U7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm1vZGVsLklUaW1lc3RhbXA7CisKKy8qKgorICogCisgKi8KK3B1YmxpYyBjbGFzcyBJbnRlcm5hbFNpdGVNYW5hZ2VyIHsKKworCXB1YmxpYyBzdGF0aWMgSUxvY2FsU2l0ZSBsb2NhbFNpdGU7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1NJVEVfVFlQRSA9IFNpdGVVUkxDb250ZW50UHJvdmlkZXIuU0lURV9UWVBFOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0VYRUNVVEFCTEVfU0lURV9UWVBFID0gU2l0ZUZpbGVDb250ZW50UHJvdmlkZXIuU0lURV9UWVBFOworCisJcHJpdmF0ZSBzdGF0aWMgTWFwIGVzdGltYXRlczsKKworCS8vIGNhY2hlIGZvdW5kIHNpdGVzCisJcHJpdmF0ZSBzdGF0aWMgTWFwIHNpdGVzID0gbmV3IEhhc2hNYXAoKTsKKwkvLyBjYWNoZSBodHRwIHVwZGF0ZWQgdXJsCisJcHJpdmF0ZSBzdGF0aWMgTWFwIGh0dHBTaXRlc1VwZGF0ZWRVcmxzID0gbmV3IEhhc2hNYXAoKTsKKwkvLyBjYWNoZSB0aW1lc3RhbXBzCisJcHJpdmF0ZSBzdGF0aWMgTWFwIHNpdGVUaW1lc3RhbXBzID0gbmV3IEhhc2hNYXAoKTsKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2xvYmFsVXNlQ2FjaGUgPSB0cnVlOworCisJLy8gdHJ1ZSBpZiBhbiBleGNlcHRpb24gb2NjdXJlZCBjcmVhdGluZyBsb2NhbFNpdGUKKwkvLyBzbyB3ZSBjYWNoZSBpdCBhbmQgZG9uJ3QgYXR0ZW1wdCB0byBjcmVhdGUgaXQgYWdhaW4KKwlwcml2YXRlIHN0YXRpYyBDb3JlRXhjZXB0aW9uIGV4Y2VwdGlvbk9jY3VyZWQgPSBudWxsOworCisJLyoKKwkgKiBAc2VlIFNpdGVNYW5hZ2VyI2dldExvY2FsU2l0ZSgpCisJICovCisJcHVibGljIHN0YXRpYyBJTG9jYWxTaXRlIGdldExvY2FsU2l0ZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGludGVybmFsR2V0TG9jYWxTaXRlKCk7CisJfQorCisJLyoKKwkgKiBJbnRlcm5hbCBjYWxsIGlmIG9wdGltaXN0aWMgcmVjb25jaWxpYXRpb24gbmVlZGVkCisJICovCisJcHJpdmF0ZSBzdGF0aWMgSUxvY2FsU2l0ZSBpbnRlcm5hbEdldExvY2FsU2l0ZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKworCQkvLyBpZiBhbiBleGNlcHRpb24gb2NjdXJlZCB3aGlsZSByZXRyaWV2aW5nIHRoZSBTaXRlCisJCS8vIHJldGhyb3cgaXQKKwkJaWYgKGV4Y2VwdGlvbk9jY3VyZWQgIT0gbnVsbCkKKwkJCXRocm93IGV4Y2VwdGlvbk9jY3VyZWQ7CisKKwkJaWYgKGxvY2FsU2l0ZSA9PSBudWxsKSB7CisJCQl0cnkgeworCQkJCWxvY2FsU2l0ZSA9IExvY2FsU2l0ZS5pbnRlcm5hbEdldExvY2FsU2l0ZSgpOworCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkJZXhjZXB0aW9uT2NjdXJlZCA9IGU7CisJCQkJdGhyb3cgZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbG9jYWxTaXRlOworCX0KKwkKKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVmFsaWRDYWNoZWRTaXRlKFVSTCBzaXRlVVJMKSB7CisJCWlmICghc2l0ZXMuY29udGFpbnNLZXkoc2l0ZVVSTC50b0V4dGVybmFsRm9ybSgpKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJCQorCQlMb25nIHRpbWVzdGFtcCA9IChMb25nKXNpdGVUaW1lc3RhbXBzLmdldChzaXRlVVJMKTsKKwkJaWYgKHRpbWVzdGFtcCA9PSBudWxsKQorCQkJcmV0dXJuIGZhbHNlOworCQlsb25nIGxvY2FsTGFzdE1vZGlmaWVkID0gdGltZXN0YW1wLmxvbmdWYWx1ZSgpOworCQkKKwkJcmV0dXJuIFVwZGF0ZU1hbmFnZXJVdGlscy5pc1NhbWVUaW1lc3RhbXAoc2l0ZVVSTCwgbG9jYWxMYXN0TW9kaWZpZWQpOworCX0KKworCS8qCisJICogQHNlZSBJTG9jYWxTaXRlI2dldFNpdGUoVVJMKQorCSAqLworCXB1YmxpYyBzdGF0aWMgSVNpdGUgZ2V0U2l0ZShVUkwgc2l0ZVVSTCwgYm9vbGVhbiB1c2VDYWNoZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCUlTaXRlIHNpdGUgPSBudWxsOworCQlpZiAobW9uaXRvcj09bnVsbCkgbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7CisKKwkJaWYgKHNpdGVVUkwgPT0gbnVsbCkKKwkJCXJldHVybiBudWxsOworCisJCS8vIHVzZSBjYWNoZSBpZiBzZXQgdXAgZ2xvYmFsbHkgKGdsb2JhbFVzZUNhY2hlPXRydWUpCisJCS8vIGFuZCBwYXNzZWQgYXMgcGFyYW1ldGVyICh1c2VDYWNoZT10cnVlKQorCQlpZiAoaHR0cFNpdGVzVXBkYXRlZFVybHMuY29udGFpbnNLZXkoc2l0ZVVSTC50b0V4dGVybmFsRm9ybSgpKSkgeworCQkJc2l0ZVVSTCA9IChVUkwpaHR0cFNpdGVzVXBkYXRlZFVybHMuZ2V0KHNpdGVVUkwudG9FeHRlcm5hbEZvcm0oKSk7CisJCX0KKwkJU3RyaW5nIHNpdGVVUkxTdHJpbmcgPSBzaXRlVVJMLnRvRXh0ZXJuYWxGb3JtKCk7CisJCWlmICgodXNlQ2FjaGUgJiYgZ2xvYmFsVXNlQ2FjaGUpICYmIGlzVmFsaWRDYWNoZWRTaXRlKHNpdGVVUkwpKSB7CisJCQlzaXRlID0gKElTaXRlKSBzaXRlcy5nZXQoc2l0ZVVSTFN0cmluZyk7CisJCQlVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldFVwZGF0ZVNlc3Npb24oKS5tYXJrVmlzaXRlZChzaXRlLmdldFVSTCgpKTsKKwkJCXJldHVybiBzaXRlOworCQl9CisJCQorCQkvLyB0cnkgYWRkaW5nICJlY2xpcHNlIiB0byB0aGUgc2l0ZSB1cmwsIGluIGNhc2UgdGhpcyBpcyBhbiBleHRlbnNpb24gc2l0ZQorCQlpZiAoImZpbGUiLmVxdWFscyhzaXRlVVJMLmdldFByb3RvY29sKCkpICkgeyAvLyROT04tTkxTLTEkCisJCQlGaWxlIGYgPSBuZXcgRmlsZShzaXRlVVJMLmdldEZpbGUoKSk7CisJCQlpZiAoZi5pc0RpcmVjdG9yeSgpICYmICEiZWNsaXBzZSIuZXF1YWxzKGYuZ2V0TmFtZSgpKSkgeyAvLyROT04tTkxTLTEkCisJCQkJZiA9IG5ldyBGaWxlKGYsICJlY2xpcHNlIik7IC8vJE5PTi1OTFMtMSQKKwkJCQl0cnkgeworCQkJCQlpZiAoKHVzZUNhY2hlICYmIGdsb2JhbFVzZUNhY2hlKSAmJiBpc1ZhbGlkQ2FjaGVkU2l0ZShmLnRvVVJMKCkpKSB7CisJCQkJCQlzaXRlID0gKElTaXRlKSBzaXRlcy5nZXQoZi50b1VSTCgpLnRvRXh0ZXJuYWxGb3JtKCkpOworCQkJCQkJcmV0dXJuIHNpdGU7CisJCQkJCX0KKwkJCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworCQkJCX0JCisJCQl9CisJCX0KKworCQkvLyBjb25zaWRlciBmaWxlIHByb3RvY29sIGFsc28gaWYgdGhlIFVSTCBwb2ludHMgdG8gYSBkaXJlY3RvcnkKKwkJLy8gYW5kIG5vIHNpdGUueG1sIGV4aXN0CisJCS8vIGlmIHRoZSB1c2VyIHBvaW50cyB0byBhIGZpbGUsIGNvbnNpZGVyIERFRkFVTFRfU0lURV9UWVBFCisJCS8vIHNpdGUueG1sIHdpbGwgaGF2ZSB0byBzcGVjaWZ5IHRoZSB0eXBlCisJCWJvb2xlYW4gZmlsZVByb3RvY29sID0gImZpbGUiLmVxdWFsc0lnbm9yZUNhc2Uoc2l0ZVVSTC5nZXRQcm90b2NvbCgpKTsgLy8kTk9OLU5MUy0xJAorCQlib29sZWFuIGRpcmVjdG9yeUV4aXN0cyA9IGZhbHNlOworCQlpZiAoZmlsZVByb3RvY29sKSB7CisJCQlGaWxlIGRpcjsKKwkJCWRpciA9IG5ldyBGaWxlKHNpdGVVUkwuZ2V0RmlsZSgpKTsKKwkJCWlmIChkaXIgIT0gbnVsbCAmJiBkaXIuaXNEaXJlY3RvcnkoKSkgeworCQkJCWlmICghKG5ldyBGaWxlKGRpciwgU2l0ZS5TSVRFX1hNTCkuZXhpc3RzKCkpKQorCQkJCQlkaXJlY3RvcnlFeGlzdHMgPSB0cnVlOworCQkJfQorCQl9CisKKwkJLy9QRVJGOiBpZiBmaWxlOiA8cGF0aD4vIGFuZCBkaXJlY3RvcnkgZXhpc3RzIHRoZW4gY29uc2lkZXIgZXhlY3V0YWJsZQorCQltb25pdG9yLmJlZ2luVGFzayhNZXNzYWdlcy5JbnRlcm5hbFNpdGVNYW5hZ2VyX0Nvbm5lY3RpbmdUb1NpdGUsIDgpOyAKKwkJaWYgKGZpbGVQcm90b2NvbCAmJiBkaXJlY3RvcnlFeGlzdHMpIHsKKwkJCXNpdGUgPSBhdHRlbXB0Q3JlYXRlU2l0ZShERUZBVUxUX0VYRUNVVEFCTEVfU0lURV9UWVBFLCBzaXRlVVJMLCBtb25pdG9yKTsKKwkJCW1vbml0b3Iud29ya2VkKDQpOyAvLyBvbmx5IG9uZSBhdHRlbXB0CisJCX0gZWxzZSB7CisJCQl0cnkgeworCQkJCW1vbml0b3Iud29ya2VkKDMpOworCQkJCXNpdGUgPSBhdHRlbXB0Q3JlYXRlU2l0ZShERUZBVUxUX1NJVEVfVFlQRSwgc2l0ZVVSTCwgbW9uaXRvcik7CisJCQkJbW9uaXRvci53b3JrZWQoMSk7CisJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIHByZXNlcnZlZEV4Y2VwdGlvbikgeworCQkJCWlmICghbW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKKwkJCQkJLy8gYXR0ZW1wdCBhIHJldHJ5IGlzIHRoZSBwcm90b2NvbCBpcyBmaWxlLCB3aXRoIGV4ZWN1dGJhbGUgdHlwZQorCQkJCQlpZiAoIWZpbGVQcm90b2NvbCkKKwkJCQkJCXRocm93IHByZXNlcnZlZEV4Y2VwdGlvbjsKKworCQkJCQl0cnkgeworCQkJCQkJc2l0ZSA9IGF0dGVtcHRDcmVhdGVTaXRlKERFRkFVTFRfRVhFQ1VUQUJMRV9TSVRFX1RZUEUsIHNpdGVVUkwsIG1vbml0b3IpOworCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIHJldHJ5RXhjZXB0aW9uKSB7CisJCQkJCQlJU3RhdHVzIGZpcnN0U3RhdHVzID0gcHJlc2VydmVkRXhjZXB0aW9uLmdldFN0YXR1cygpOworCQkJCQkJTXVsdGlTdGF0dXMgbXVsdGkgPSBuZXcgTXVsdGlTdGF0dXMoZmlyc3RTdGF0dXMuZ2V0UGx1Z2luKCksIElTdGF0dXMuT0ssIE1lc3NhZ2VzLkludGVybmFsU2l0ZU1hbmFnZXJfRmFpbGVkUmV0cnlBY2Nlc3NpbmdTaXRlLCByZXRyeUV4Y2VwdGlvbik7IAorCQkJCQkJbXVsdGkuYWRkQWxsKGZpcnN0U3RhdHVzKTsKKwkJCQkJCXRocm93IHByZXNlcnZlZEV4Y2VwdGlvbjsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmIChzaXRlICE9IG51bGwpIHsKKwkJCXNpdGVzLnB1dChzaXRlLmdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCksIHNpdGUpOworCQkJVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXRVcGRhdGVTZXNzaW9uKCkubWFya1Zpc2l0ZWQoc2l0ZS5nZXRVUkwoKSk7CisJCQlpZiAoc2l0ZSBpbnN0YW5jZW9mIElUaW1lc3RhbXApIHsKKwkJCQlzaXRlVGltZXN0YW1wcy5wdXQoc2l0ZS5nZXRVUkwoKSwgbmV3IExvbmcoKChJVGltZXN0YW1wKXNpdGUpLmdldFRpbWVzdGFtcCgpLmdldFRpbWUoKSkpOworCQkJfSBlbHNlIHsKKwkJCQl0cnkgeworCQkJCQlJUmVzcG9uc2UgcmVzcG9uc2UgPSBDb25uZWN0aW9uRmFjdG9yeS5nZXQoVVJMRW5jb2Rlci5lbmNvZGUoc2l0ZVVSTCkpOworCQkJCQlzaXRlVGltZXN0YW1wcy5wdXQoc2l0ZVVSTCwgbmV3IExvbmcocmVzcG9uc2UuZ2V0TGFzdE1vZGlmaWVkKCkpKTsKKwkJCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQl9CisJCQl9CisJCX0KKworCQkvL2ZsdXNoIHRoZSBKYXJGaWxlIHdlIG1heSBob2xkIG9uIHRvCisJCS8vIHdlIGtlZXAgdGhlIHRlbXAgbm90IHRvIGNyZWF0ZSB0aGVtIGFnYWluCisJCUphckNvbnRlbnRSZWZlcmVuY2Uuc2h1dGRvd24oKTsgLy8gbWFrZSBzdXJlIHdlIGFyZSBub3QgbGVhdmluZyBqYXJzIG9wZW4gZm9yIHRoaXMgc2l0ZQorCisJCS8vZmx1c2ggbWFwcGluZyBvZiBkb3dubG9hZGVkIEpBUiBmaWxlcworCQkvLyBGSVhNRSA6IHByb3ZpZGUgYmV0dGVyIGNhY2hlIGZsdXNoaW5nIGFmdGVyIDIuMQorCQkvLyBGSVhFRDogZXZlcnl0aGluZyBkb3dubG9hZGVkIGlzIGNhY2hlZCBhbmQgdGltZXN0YW1wZWQuCisJCS8vICAgICAgICBUaW1lc3RhbXBzIGFyZSBjb21wYXJlZCB0byBsYXN0TW9kaWZlZCBvbiB0aGUgc2VydmVyCisJCS8vICAgICAgICBhbmQgd2UgZG93bmxvYWQgb25seSB3aGVuIHRoZXJlIGlzIGEgZGlmZmVyZW5jCisJCS8vIFV0aWxpdGllcy5mbHVzaExvY2FsRmlsZSgpOworCisJCXJldHVybiBzaXRlOworCX0KKworCS8qCisJICogQXR0ZW1wdCB0byBjcmVhdGUgYSBzaXRlCisJICogaWYgdGhlIHNpdGUgZ3Vlc3NlZCBpcyBub3QgdGhlIHR5cGUgZm91bmQsCisJICogYXR0ZW1wdCB0byBjcmVhdGUgYSB0eXBlIHdpdGggdGhlIHR5cGUgZm91bmQgaW4gdGhlIHNpdGUueG1sCisJICovCisJcHJpdmF0ZSBzdGF0aWMgSVNpdGUgYXR0ZW1wdENyZWF0ZVNpdGUoU3RyaW5nIGd1ZXNzZWRUeXBlU2l0ZSwgVVJMIHNpdGVVUkwsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlpZiAobW9uaXRvciA9PSBudWxsKSBtb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKKwkJSVNpdGUgc2l0ZSA9IG51bGw7CisKKwkJdHJ5IHsKKwkJCW1vbml0b3Iud29ya2VkKDEpOworCQkJc2l0ZSA9IGNyZWF0ZVNpdGUoZ3Vlc3NlZFR5cGVTaXRlLCBzaXRlVVJMLCBtb25pdG9yKTsKKwkJCW1vbml0b3Iud29ya2VkKDEpOyAvLyBpZiBubyBlcnJvciwgb2NjdXJzIHRoZSByZXRyeSBicmFuY2ggZG9lc24ndCBuZWVkIHRvIGJlIGV4ZWN1dGVkCisJCX0gY2F0Y2ggKEludmFsaWRTaXRlVHlwZUV4Y2VwdGlvbiBlKSB7CisJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHJldHVybiBudWxsOworCisJCQkvLyB0aGUgdHlwZSBpbiB0aGUgc2l0ZS54bWwgaXMgbm90IHRoZSBvbmUgZXhwZWN0ZWQJCisJCQkvLyBhdHRlbXB0IHRvIHVzZSB0aGlzIHR5cGUgaW5zdGVhZAkKKwkJCS8vREVCVUc6CisJCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfVFlQRSkgeworCQkJCVVwZGF0ZUNvcmUuZGVidWcoIlRoZSBTaXRlIDoiICsgc2l0ZVVSTC50b0V4dGVybmFsRm9ybSgpICsgIiBpcyBhIGRpZmZlcmVudCB0eXBlIHRoYW4gdGhlIGd1ZXNzZWQgdHlwZSBiYXNlZCBvbiB0aGUgcHJvdG9jb2wuIG5ldyBUeXBlOiIgKyBlLmdldE5ld1R5cGUoKSk7CS8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAKKwkJCX0KKworCQkJdHJ5IHsKKwkJCQlpZiAoZS5nZXROZXdUeXBlKCkgPT0gbnVsbCkKKwkJCQkJdGhyb3cgZTsKKwkJCQlzaXRlID0gY3JlYXRlU2l0ZShlLmdldE5ld1R5cGUoKSwgc2l0ZVVSTCwgbW9uaXRvcik7CisJCQl9IGNhdGNoIChJbnZhbGlkU2l0ZVR5cGVFeGNlcHRpb24gZTEpIHsKKwkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5JbnRlcm5hbFNpdGVNYW5hZ2VyX1VuYWJsZVRvQ3JlYXRlU2l0ZVdpdGhUeXBlLCAobmV3IFN0cmluZ1tdIHsgZS5nZXROZXdUeXBlKCksIHNpdGVVUkwudG9FeHRlcm5hbEZvcm0oKSB9KSksIGUxKTsgCisJCQl9CisJCX0KKworCQlyZXR1cm4gc2l0ZTsKKwl9CisKKwkvKgorCSAqIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiBhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyBJU2l0ZQorCSAqIAorCSAqIHRoZSBVUkwgY2FuIGJlIG9mIHRoZSBmb2xsb3dpbmcgZm9ybQorCSAqIDEgcHJvdG9jb2w6Ly8uLi4uLi8KKwkgKiAyIHByb3RvY29sOi8vLi4uLi4KKwkgKiAzIHByb3RvY29sOi8vLi4uLi9zaXRlLnhtbAorCSAqIDQgcHJvdG9jb2w6Ly8uLi4jLi4uCisJICogCisJICogMSBJZiB0aGUgZmlsZSBvZiB0aGUgZmlsZSBvZiB0ZWggdXJsIGVuZHMgd2l0aCAnLycsIGF0dGVtcHQgdG8gb3BlbiB0aGUgc3RyZWFtLgorCSAqIGlmIGl0IGZhaWxzLCBhZGQgc2l0ZS54bWwgYW5kIGF0dGVtcHQgdG8gb3BlbiB0aGUgc3RyZWFtCisJICogCisJICogMiBhdHRlbXB0IHRvIG9wZW4gdGhlIHN0cmVhbQorCSAqIAlmYWlsCisJICogCQlhZGQgJy9zaXRlLnhtbCcgYW5kIGF0dGVtcHQgdG8gb3BlbiB0aGUgc3RyZWFtCisJICogCXN1Y2VzcworCSAqIAkJYXR0ZW1wdCB0byBwYXJzZSwgaWYgaXQgZmFpbHMsIGFkZCAnL3NpdGUueG1sJyBhbmQgYXR0ZW1wdCB0byBvcGVuIHRoZSBzdHJlYW0KKwkgKiAKKwkgKiAzIG9wZW4gdGhlIHN0cmVhbQorCSAqIAorCSAqIDQgb3BlbiB0aGUgc3RyZWFtCQorCSAqLworCXByaXZhdGUgc3RhdGljIElTaXRlIGNyZWF0ZVNpdGUoU3RyaW5nIHNpdGVUeXBlLCBVUkwgdXJsLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJbnZhbGlkU2l0ZVR5cGVFeGNlcHRpb24geworCQkKKwkJaWYgKG1vbml0b3IgPT0gbnVsbCkgbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7CisJCS8vSVNpdGUgc2l0ZSA9IG51bGw7CisJCUlTaXRlRmFjdG9yeSBmYWN0b3J5ID0gU2l0ZVR5cGVGYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0RmFjdG9yeShzaXRlVHlwZSk7CisJCVVSTCBmaXhlZFVybDsKKwkJCisJCS8vIHNlZSBpZiB3ZSBuZWVkIHRvIChhbmQgY2FuKSBmaXggdXJsIGJ5IGFkZGluZyBzaXRlLnhtbCB0byBpdAorCQl0cnkgeworCQkJaWYgKCAodXJsLmdldFJlZigpICE9IG51bGwpIHx8ICh1cmwuZ2V0RmlsZSgpLmVuZHNXaXRoKFNpdGUuU0lURV9YTUwpIHx8ICh1cmwuZ2V0UHJvdG9jb2woKS5lcXVhbHNJZ25vcmVDYXNlKCJmaWxlIikpKSkgeyAvLyROT04tTkxTLTEkCisJCQkgCWZpeGVkVXJsID0gdXJsOworCQkJfSBlbHNlIGlmICh1cmwuZ2V0RmlsZSgpLmVuZHNXaXRoKCIvIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCWZpeGVkVXJsID0gbmV3IFVSTCh1cmwsIFNpdGUuU0lURV9YTUwpOworCQkJfSBlbHNlIHsKKwkJCQlmaXhlZFVybCA9IG5ldyBVUkwodXJsLmdldFByb3RvY29sKCksIHVybC5nZXRIb3N0KCksIHVybC5nZXRQb3J0KCksIHVybC5nZXRGaWxlKCkgKyAiLyIgKyBTaXRlLlNJVEVfWE1MKTsJLy8kTk9OLU5MUy0xJAorCQkJfQorCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbXVlKSB7CisJCQlmaXhlZFVybCA9IHVybDsKKwkJfQorCQkKKwkJdHJ5IHsKKwkJCXRyeSB7IAorCQkJCW1vbml0b3Iud29ya2VkKDEpOworCQkJCXJldHVybiBjcmVhdGVTaXRlKCBmYWN0b3J5LCBmaXhlZFVybCwgdXJsLCBtb25pdG9yKTsKKwkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKKwkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIAorCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQorCQkJCWlmICghZml4ZWRVcmwuZXF1YWxzKHVybCkpIHsKKwkJCQkJLy8gdHJ5IHdpdGggb3JpZ2luYWwgdXJsCisJCQkJCSByZXR1cm4gY3JlYXRlU2l0ZSggZmFjdG9yeSwgdXJsLCB1cmwsIG1vbml0b3IpOworCQkJCX0gZWxzZSBpZiAodXJsLmdldFByb3RvY29sKCkuZXF1YWxzSWdub3JlQ2FzZSgiZmlsZSIpICYmICEgdXJsLmdldEZpbGUoKS5lbmRzV2l0aChTaXRlLlNJVEVfWE1MKSl7IC8vJE5PTi1OTFMtMSQKKwkJCQkJdHJ5IHsKKwkJCQkJCWlmICh1cmwuZ2V0RmlsZSgpLmVuZHNXaXRoKCIvIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCXJldHVybiBjcmVhdGVTaXRlKGZhY3RvcnksIG5ldyBVUkwodXJsLAorCQkJCQkJCQkJU2l0ZS5TSVRFX1hNTCksIHVybCwgbW9uaXRvcik7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCXJldHVybiBjcmVhdGVTaXRlKGZhY3RvcnksIG5ldyBVUkwodXJsCisJCQkJCQkJCQkuZ2V0UHJvdG9jb2woKSwgdXJsLmdldEhvc3QoKSwgdXJsCisJCQkJCQkJCQkuZ2V0UG9ydCgpLCB1cmwuZ2V0RmlsZSgpCisJCQkJCQkJCQkrICIvIiArIFNpdGUuU0lURV9YTUwpLCB1cmwsIG1vbml0b3IpOyAvLyROT04tTkxTLTEkCQkJCQkJCQorCQkJCQkJfQorCQkJCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbXVlKSB7CisJCQkJCQl0aHJvdyBjZTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCXRocm93IGNlOworCQkJCX0KKwkJCX0KKwkJfSBjYXRjaChDb3JlRXhjZXB0aW9uIGNlKSB7CisJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5JbnRlcm5hbFNpdGVNYW5hZ2VyX1VuYWJsZVRvQWNjZXNzVVJMLCAobmV3IFN0cmluZ1tdIHsgdXJsLnRvRXh0ZXJuYWxGb3JtKCkgfSkpLCBjZSk7CisJCX0KKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgSVNpdGUgY3JlYXRlU2l0ZShJU2l0ZUZhY3RvcnkgZmFjdG9yeSwgVVJMIHVybCwgVVJMIG9yaWdpbmFsVXJsLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJbnZhbGlkU2l0ZVR5cGVFeGNlcHRpb24geworCQkKKwkJSVNpdGUgc2l0ZTsKKwkJCQorCQlzaXRlID0gY3JlYXRlU2l0ZShmYWN0b3J5LCB1cmwsIG1vbml0b3IpOworCQlodHRwU2l0ZXNVcGRhdGVkVXJscy5wdXQob3JpZ2luYWxVcmwudG9FeHRlcm5hbEZvcm0oKSwgdXJsKTsJCisJCQorCQlyZXR1cm4gc2l0ZTsKKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgSVNpdGUgY3JlYXRlU2l0ZShJU2l0ZUZhY3RvcnkgZmFjdG9yeSwgVVJMIHVybCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSW52YWxpZFNpdGVUeXBlRXhjZXB0aW9uIHsKKwkJaWYgKGZhY3RvcnkgaW5zdGFuY2VvZiBJU2l0ZUZhY3RvcnlFeHRlbnNpb24pCisJCQlyZXR1cm4gKChJU2l0ZUZhY3RvcnlFeHRlbnNpb24pZmFjdG9yeSkuY3JlYXRlU2l0ZSh1cmwsIG1vbml0b3IpOworCQllbHNlCisJCQlyZXR1cm4gZmFjdG9yeS5jcmVhdGVTaXRlKHVybCk7CisJfQorCisJLyoKKwkgKiBDcmVhdGVzIGEgbmV3IHNpdGUgb24gdGhlIGZpbGUgc3lzdGVtCisJICogVGhpcyBpcyB0aGUgb25seSBTaXRlIHdlIGNhbiBjcmVhdGUuCisJICogCisJICogQHBhcmFtIHNpdGVMb2NhdGlvbgorCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgSVNpdGUgY3JlYXRlU2l0ZShGaWxlIHNpdGVMb2NhdGlvbikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlJU2l0ZSBzaXRlID0gbnVsbDsKKwkJaWYgKHNpdGVMb2NhdGlvbiAhPSBudWxsKSB7CisJCQl0cnkgeworCQkJCVVSTCBzaXRlVVJMID0gc2l0ZUxvY2F0aW9uLnRvVVJMKCk7CisJCQkJc2l0ZSA9IGdldFNpdGUoc2l0ZVVSTCwgZmFsc2UsIG51bGwpOworCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKwkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5JbnRlcm5hbFNpdGVNYW5hZ2VyX1VuYWJsZVRvQ3JlYXRlVVJMLCAobmV3IFN0cmluZ1tdIHsgc2l0ZUxvY2F0aW9uLmdldEFic29sdXRlUGF0aCgpIH0pKSwgZSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHNpdGU7CisJfQorCisKKwkvKioKKwkgKiBNZXRob2QgZG93bmxvYWRlZC4KKwkgKiBAcGFyYW0gZG93bmxvYWRTaXplIHNpemUgZG93bmxvYWRlZCBpbiBieXRlcworCSAqIEBwYXJhbSB0aW1lIHRpbWUgaW4gc2Vjb25kcworCSAqIEBwYXJhbSB1cmwKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgZG93bmxvYWRlZChsb25nIGRvd25sb2FkU2l6ZSwgbG9uZyB0aW1lLCBVUkwgdXJsKSB7CisJCWlmIChkb3dubG9hZFNpemUgPD0gMCB8fCB0aW1lIDwgMCkKKwkJCXJldHVybjsKKwkJU3RyaW5nIGhvc3QgPSB1cmwuZ2V0SG9zdCgpOworCQlsb25nIHNpemVCeVRpbWUgPSAodGltZSA9PSAwKSA/IDAgOiBkb3dubG9hZFNpemUgLyB0aW1lOworCQlMb25nIHZhbHVlID0gbmV3IExvbmcoc2l6ZUJ5VGltZSk7CisJCWlmIChlc3RpbWF0ZXMgPT0gbnVsbCkgeworCQkJZXN0aW1hdGVzID0gbmV3IEhhc2hNYXAoKTsKKwkJfSBlbHNlIHsKKwkJCUxvbmcgcHJldmlvdXMgPSAoTG9uZykgZXN0aW1hdGVzLmdldChob3N0KTsKKwkJCWlmIChwcmV2aW91cyAhPSBudWxsKSB7CisJCQkJdmFsdWUgPSBuZXcgTG9uZygocHJldmlvdXMubG9uZ1ZhbHVlKCkgKyBzaXplQnlUaW1lKSAvIDIpOworCQkJfQorCQl9CisJCWVzdGltYXRlcy5wdXQoaG9zdCwgdmFsdWUpOworCX0KKwkvKioKKwkgKiBNZXRob2QgZ2V0RXN0aW1hdGVkVHJhbnNmZXJSYXRlIHJhdGUgYnl0ZXMvc2Vjb25kcy4KKwkgKiBAcGFyYW0gaG9zdAorCSAqIEByZXR1cm4gbG9uZworCSAqLworCXB1YmxpYyBzdGF0aWMgbG9uZyBnZXRFc3RpbWF0ZWRUcmFuc2ZlclJhdGUoU3RyaW5nIGhvc3QpIHsKKwkJaWYgKGVzdGltYXRlcyA9PSBudWxsKQorCQkJcmV0dXJuIDA7CisJCUxvbmcgdmFsdWUgPSAoTG9uZykgZXN0aW1hdGVzLmdldChob3N0KTsKKwkJaWYgKHZhbHVlID09IG51bGwpCisJCQlyZXR1cm4gMDsKKwkJcmV0dXJuIHZhbHVlLmxvbmdWYWx1ZSgpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9KYXJEZWx0YUluc3RhbGxIYW5kbGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0phckRlbHRhSW5zdGFsbEhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWE3ZTM0Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9KYXJEZWx0YUluc3RhbGxIYW5kbGVyLmphdmEKQEAgLTAsMCArMSwxNDEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLmphci5KYXJGaWxlOworaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7CitpbXBvcnQgamF2YS51dGlsLnppcC5aaXBFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZUNvbnRlbnRDb25zdW1lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JUGx1Z2luRW50cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuUGx1Z2luRW50cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuU2l0ZTsKKworcHVibGljIGNsYXNzIEphckRlbHRhSW5zdGFsbEhhbmRsZXIgZXh0ZW5kcyBEZWx0YUluc3RhbGxIYW5kbGVyIHsKKworCQorCXByb3RlY3RlZCB2b2lkIG92ZXJsYXlQbHVnaW4oCisJCQlJUGx1Z2luRW50cnkgb2xkUGx1Z2luLAorCQkJSVBsdWdpbkVudHJ5IG5ld1BsdWdpbiwKKwkJCUlGZWF0dXJlQ29udGVudENvbnN1bWVyIGNvbnN1bWVyKQorCQkJdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKwkJCisJCQlpZihuZXdQbHVnaW4gaW5zdGFuY2VvZiBQbHVnaW5FbnRyeSAmJiAoKFBsdWdpbkVudHJ5KW5ld1BsdWdpbikuaXNVbnBhY2soKSl7CisJCQkJLy8gcGFydGlhbCBwbHVnLWlucyAoaW4gcGF0Y2hlcykgbXVzdCBhbHdheXMgYmUgdW5wYWNrZWQKKwkJCQlzdXBlci5vdmVybGF5UGx1Z2luKG9sZFBsdWdpbiwgbmV3UGx1Z2luLCBjb25zdW1lcik7CisJCQl9CisJCQkKKwkJCVVSTCBvbGRVUkkgPSBudWxsOworCQkJdHJ5IHsKKwkJCQlvbGRVUkkgPSBuZXcgVVJMKGNvbnN1bWVyLmdldEZlYXR1cmUoKS5nZXRTaXRlKCkuZ2V0VVJMKCkuZ2V0UGF0aCgpICsgCisJCQkJCQkJCQkgU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRIICsgCisJCQkJCQkJCQkgb2xkUGx1Z2luLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKTsKKwkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisJCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKwkJCX0KKwkJCUZpbGUgb2xkSmFyRmlsZSA9IG5ldyBGaWxlKG9sZFVSSS50b0V4dGVybmFsRm9ybSgpKTsKKwkJCUphckZpbGUgb2xkSmFyID0gbmV3IEphckZpbGUob2xkSmFyRmlsZSk7CisJCQkKKwkJCVVSTCBuZXdVUkkgPSBudWxsOworCQkJdHJ5IHsKKwkJCQluZXdVUkkgPSBuZXcgVVJMKGNvbnN1bWVyLmdldEZlYXR1cmUoKS5nZXRTaXRlKCkuZ2V0VVJMKCkuZ2V0UGF0aCgpICsgCisJCQkJCQkJCSBTaXRlLkRFRkFVTFRfUExVR0lOX1BBVEggKyAKKwkJCQkJCQkJIG5ld1BsdWdpbi5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSk7CisJCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisJCQl9CisJCQlGaWxlIG5ld0phckZpbGUgPSBuZXcgRmlsZShuZXdVUkkudG9FeHRlcm5hbEZvcm0oKSk7CisJCQlKYXJGaWxlIG5ld0phciA9IG5ldyBKYXJGaWxlKG5ld0phckZpbGUpOworCisJCQlTdHJpbmcgdGVtcEZpbGVOYW1lID0gb2xkVVJJICsgIi0iICsgKG5ldyBEYXRlKCkpLmdldFRpbWUoKTsgLy8kTk9OLU5MUy0xJAorCQkJRmlsZSB0ZW1wRmlsZSA9IG5ldyBGaWxlKHRlbXBGaWxlTmFtZSk7CisJCQlGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRlbXBGaWxlKTsKKwkJCUphck91dHB1dFN0cmVhbSBqb3MgPSBuZXcgSmFyT3V0cHV0U3RyZWFtKCBmb3MpOworCQkJCisJCQlhZGRUb0phcihqb3MsIG5ld0phcik7CisJCQlhZGRUb0phcihqb3MsIG9sZEphcik7CisJCQkKKwkJCWpvcy5jbG9zZUVudHJ5KCk7CisJCQlqb3MuZmluaXNoKCk7CisJCQlmb3MuY2xvc2UoKTsKKwkJCW5ld0phci5jbG9zZSgpOworCQkJb2xkSmFyLmNsb3NlKCk7CisJCQkKKwkJCW5ld0phckZpbGUgPSBuZXcgRmlsZShuZXdVUkkudG9FeHRlcm5hbEZvcm0oKSk7CisJCQluZXdKYXJGaWxlLmRlbGV0ZSgpOworCQkJCisJCQluZXdKYXJGaWxlLmNyZWF0ZU5ld0ZpbGUoKTsKKworCQkJY29weUZpbGUodGVtcEZpbGUsIG5ld0phckZpbGUpOworCX0KKwkKKwlwdWJsaWMgc3RhdGljIHZvaWQgY29weUZpbGUoRmlsZSBzcmMsIEZpbGUgZHN0KSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlJbnB1dFN0cmVhbSBpbj1udWxsOworCQlPdXRwdXRTdHJlYW0gb3V0PW51bGw7CisJCXRyeSB7CisJCQlpbiA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0oc3JjKSk7CisJCQlvdXQgPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oZHN0KSk7CQkKKwkJCWJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVs0MDk2XTsKKwkJCWludCBsZW47CisJCQl3aGlsZSAoKGxlbj1pbi5yZWFkKGJ1ZmZlcikpICE9IC0xKSB7CisJCQkJb3V0LndyaXRlKGJ1ZmZlciwgMCwgbGVuKTsKKwkJCX0KKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChpbiAhPSBudWxsKQorCQkJCXRyeSB7CisJCQkJCWluLmNsb3NlKCk7CisJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCX0KKwkJCWlmIChvdXQgIT0gbnVsbCkKKwkJCQl0cnkgeworCQkJCQlvdXQuY2xvc2UoKTsKKwkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJfQorCQl9CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGFkZFRvSmFyKEphck91dHB1dFN0cmVhbSBqb3MsIEphckZpbGUgamYpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUVudW1lcmF0aW9uIGUgPSBqZi5lbnRyaWVzKCk7CisJCQorCQl3aGlsZShlLmhhc01vcmVFbGVtZW50cygpKSB7CisJCQkKKwkJCVppcEVudHJ5IGplID0gKFppcEVudHJ5KWUubmV4dEVsZW1lbnQoKTsKKwkJCUlucHV0U3RyZWFtIGlvID0gamYuZ2V0SW5wdXRTdHJlYW0oamUpOworCQkJCisJCQlieXRlIGJbXSA9IG5ldyBieXRlWzQwOTZdOworCQkJaW50IHJlYWQgPSAwOworCQkJdHJ5IHsKKwkJCQlqb3MucHV0TmV4dEVudHJ5KGplKTsKKwkJCQl3aGlsZSggKCByZWFkID0gaW8ucmVhZChiLCAwLCA0MDk2KSkgIT0gLTEpIHsKKwkJCQkJam9zLndyaXRlKGIsIDAsIHJlYWQpOworCQkJCX0KKwkJCX0gY2F0Y2ggKFppcEV4Y2VwdGlvbiB6ZSkgeworCQkJCS8vemUucHJpbnRTdGFja1RyYWNlKCk7CisJCQkJdGhyb3cgemU7CisJCQl9CQkKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvTGl0ZUZlYXR1cmUuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvTGl0ZUZlYXR1cmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWFjMDlmCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9MaXRlRmVhdHVyZS5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkZlYXR1cmU7CisKK3B1YmxpYyBjbGFzcyBMaXRlRmVhdHVyZSBleHRlbmRzIEZlYXR1cmUgeworCQorCXByaXZhdGUgYm9vbGVhbiBmdWxsRmVhdHVyZSA9IHRydWU7CisKKwlwdWJsaWMgYm9vbGVhbiBpc0Z1bGxGZWF0dXJlKCkgeworCQlyZXR1cm4gZnVsbEZlYXR1cmU7CisJfQorCisJcHVibGljIHZvaWQgc2V0RnVsbEZlYXR1cmUoYm9vbGVhbiBmdWxsRmVhdHVyZSkgeworCQl0aGlzLmZ1bGxGZWF0dXJlID0gZnVsbEZlYXR1cmU7CisJfQorCit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0xpdGVGZWF0dXJlRmFjdG9yeS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9MaXRlRmVhdHVyZUZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjBhOWVlCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9MaXRlRmVhdHVyZUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5CYXNlRmVhdHVyZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVNpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuRmVhdHVyZU1vZGVsOworCitwdWJsaWMgY2xhc3MgTGl0ZUZlYXR1cmVGYWN0b3J5IGV4dGVuZHMgQmFzZUZlYXR1cmVGYWN0b3J5IHsKKworCXB1YmxpYyBMaXRlRmVhdHVyZUZhY3RvcnkoKSB7CisJCXN1cGVyKCk7CisJfQorCisJcHVibGljIElGZWF0dXJlIGNyZWF0ZUZlYXR1cmUoVVJMIHVybCwgSVNpdGUgc2l0ZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQorCQkJdGhyb3dzIENvcmVFeGNlcHRpb24geworCQkKKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIEZlYXR1cmVNb2RlbCBjcmVhdGVGZWF0dXJlTW9kZWwoKSB7CisJCXJldHVybiBuZXcgTGl0ZUZlYXR1cmUoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0xvY2FsU2l0ZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9Mb2NhbFNpdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDE2OTdkCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9Mb2NhbFNpdGUuamF2YQpAQCAtMCwwICsxLDM3NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkxpc3RlbmVyTGlzdDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi5JQWN0aXZpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uSUluc3RhbGxDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLklMb2NhbFNpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uSUxvY2FsU2l0ZUNoYW5nZWRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi5JUHJvYmxlbUhhbmRsZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci5Db25maWd1cmF0b3JVdGlsczsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLklQbGF0Zm9ybUNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuVXRpbGl0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5tb2RlbC5JbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5tb2RlbC5TaXRlTG9jYWxNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwubW9kZWwuU2l0ZUxvY2FsUGFyc2VyOworCisvKioKKyAqIFRoaXMgY2xhc3MgbWFuYWdlcyB0aGUgY29uZmlndXJhdGlvbnMuCisgKi8KKworcHVibGljIGNsYXNzIExvY2FsU2l0ZSBleHRlbmRzIFNpdGVMb2NhbE1vZGVsIGltcGxlbWVudHMgSUxvY2FsU2l0ZXsKKworCXByaXZhdGUgTGlzdGVuZXJMaXN0IGxpc3RlbmVycyA9IG5ldyBMaXN0ZW5lckxpc3QoTGlzdGVuZXJMaXN0LklERU5USVRZKTsKKwlwcml2YXRlIFNpdGVTdGF0dXNBbmFseXplciBzaXRlU3RhdHVzQW5hbHl6ZXI7CisJcHJpdmF0ZSBib29sZWFuIGlzVHJhbnNpZW50ID0gZmFsc2U7CisKKwkvKgorCSAqIEhhdmUgbmV3IGZlYXR1cmVzIGJlZW4gZm91bmQgZHVyaW5nIHJlY29uY2lsaWF0aW9uCisJICovCisJcHVibGljIHN0YXRpYyBib29sZWFuIG5ld0ZlYXR1cmVzRm91bmQgPSBmYWxzZTsKKworCS8qCisJICogaW5pdGlhbGl6ZSB0aGUgY29uZmlndXJhdGlvbnMgZnJvbSB0aGUgcGVyc2lzdGVudCBtb2RlbC4KKwkgKiBTZXQgdGhlIHJlY29uY2lsaWF0aW9uIGFzIG5vbiBvcHRpbWlzdGljCisJICovCisJcHVibGljIHN0YXRpYyBJTG9jYWxTaXRlIGdldExvY2FsU2l0ZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGludGVybmFsR2V0TG9jYWxTaXRlKCk7CisJfQorCisJLyoKKwkgKkludGVybmFsIGNhbGwgaXMgcmVjb25jaWxpYXRpb24gbmVlZHMgdG8gYmUgb3B0aW1pc3RpYworCSAqLworCXB1YmxpYyBzdGF0aWMgSUxvY2FsU2l0ZSBpbnRlcm5hbEdldExvY2FsU2l0ZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkKKwkJTG9jYWxTaXRlIGxvY2FsU2l0ZSA9IG5ldyBMb2NhbFNpdGUoKTsKKwkKKwkJLy8gb2J0YWluIHBsYXRmb3JtIGNvbmZpZ3VyYXRpb24KKwkJSVBsYXRmb3JtQ29uZmlndXJhdGlvbiBjdXJyZW50UGxhdGZvcm1Db25maWd1cmF0aW9uID0gQ29uZmlndXJhdG9yVXRpbHMuZ2V0Q3VycmVudFBsYXRmb3JtQ29uZmlndXJhdGlvbigpOworCQlsb2NhbFNpdGUuaXNUcmFuc2llbnQoY3VycmVudFBsYXRmb3JtQ29uZmlndXJhdGlvbi5pc1RyYW5zaWVudCgpKTsKKwkKKwkJdHJ5IHsKKwkJCVVSTCBjb25maWdYTUwgPSBjdXJyZW50UGxhdGZvcm1Db25maWd1cmF0aW9uLmdldENvbmZpZ3VyYXRpb25Mb2NhdGlvbigpOworCQkJbG9jYWxTaXRlLnNldExvY2F0aW9uVVJMU3RyaW5nKGNvbmZpZ1hNTC50b0V4dGVybmFsRm9ybSgpKTsKKwkJCWxvY2FsU2l0ZS5yZXNvbHZlKGNvbmZpZ1hNTCwgbnVsbCk7CisJCisJCQkvLyBBdHRlbXB0IHRvIHJlYWQgcHJldmlvdXMgc3RhdGUKKwkJCXBhcnNlTG9jYWxTaXRlRmlsZShjdXJyZW50UGxhdGZvcm1Db25maWd1cmF0aW9uLCBsb2NhbFNpdGUpOworCisJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLlNpdGVMb2NhbF9VbmFibGVUb0NyZWF0ZVVSTEZvciwgKG5ldyBTdHJpbmdbXSB7IGxvY2FsU2l0ZS5nZXRMb2NhdGlvblVSTFN0cmluZygpICsgIiAmICIgKyBDT05GSUdfRklMRSB9KSksIGV4Y2VwdGlvbik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQorCQlyZXR1cm4gbG9jYWxTaXRlOworCX0KKworCS8qKgorCSAqIENyZWF0ZSB0aGUgbG9jYWxTaXRlIG9iamVjdAorCSAqLworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gcGFyc2VMb2NhbFNpdGVGaWxlKElQbGF0Zm9ybUNvbmZpZ3VyYXRpb24gcGxhdGZvcm1Db25maWcsIExvY2FsU2l0ZSBsb2NhbFNpdGUgKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKKworCQkvL2F0dGVtcHQgdG8gcGFyc2UgdGhlIExvY2FsU2l0ZS54bWwJCisvLwkJVVJMIHJlc29sdmVkVVJMID0gVVJMRW5jb2Rlci5lbmNvZGUoY29uZmlnWE1MKTsKKwkJdHJ5IHsKKy8vCQkJSW5wdXRTdHJlYW0gaW4gPSBVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldChyZXNvbHZlZFVSTCkuZ2V0SW5wdXRTdHJlYW0oKTsKKwkJCW5ldyBTaXRlTG9jYWxQYXJzZXIocGxhdGZvcm1Db25maWcsIGxvY2FsU2l0ZSk7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfQorCisJLyoqCisJICogCisJICovCisJcHJvdGVjdGVkIExvY2FsU2l0ZSgpIHsKKwl9CisKKwkvKioKKwkgKiBhZGRzIGEgbmV3IGNvbmZpZ3VyYXRpb24gdG8gdGhlIExvY2FsU2l0ZQorCSAqICB0aGUgbmV3bHkgYWRkZWQgY29uZmlndXJhdGlvbiBpcyB0ZWggY3VycmVudCBvbmUKKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRDb25maWd1cmF0aW9uKElJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcpIHsKKwkJaWYgKGNvbmZpZyAhPSBudWxsKSB7CisJCQlhZGRDb25maWd1cmF0aW9uTW9kZWwoKEluc3RhbGxDb25maWd1cmF0aW9uTW9kZWwpIGNvbmZpZyk7CisKKwkJCXRyaW1IaXN0b3J5VG9DYXBhY2l0eSgpOworCisJCQkvLyBzZXQgY29uZmlndXJhdGlvbiBhcyBjdXJyZW50CQkKKwkJCWlmIChnZXRDdXJyZW50Q29uZmlndXJhdGlvbk1vZGVsKCkgIT0gbnVsbCkKKwkJCQlnZXRDdXJyZW50Q29uZmlndXJhdGlvbk1vZGVsKCkuc2V0Q3VycmVudChmYWxzZSk7CisJCQlpZiAoY29uZmlnIGluc3RhbmNlb2YgSW5zdGFsbENvbmZpZ3VyYXRpb24pCisJCQkJICgoSW5zdGFsbENvbmZpZ3VyYXRpb24pIGNvbmZpZykuc2V0Q3VycmVudCh0cnVlKTsKKworCQkJc2V0Q3VycmVudENvbmZpZ3VyYXRpb25Nb2RlbCgoSW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbCkgY29uZmlnKTsKKwkJCSgoSW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbCkgY29uZmlnKS5tYXJrUmVhZE9ubHkoKTsKKworCQkJLy8gbm90aWZ5IGxpc3RlbmVycworCQkJT2JqZWN0W10gc2l0ZUxvY2FsTGlzdGVuZXJzID0gbGlzdGVuZXJzLmdldExpc3RlbmVycygpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXRlTG9jYWxMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKKwkJCQkoKElMb2NhbFNpdGVDaGFuZ2VkTGlzdGVuZXIpIHNpdGVMb2NhbExpc3RlbmVyc1tpXSkuY3VycmVudEluc3RhbGxDb25maWd1cmF0aW9uQ2hhbmdlZChjb25maWcpOworCQkJfQorCQl9CisKKwl9CisKKwkvKgorCSAqIAorCSAqLworCXByaXZhdGUgdm9pZCB0cmltSGlzdG9yeVRvQ2FwYWNpdHkoKSB7CisJCS8vIGNoZWNrIGlmIHdlIGhhdmUgdG8gcmVtb3ZlIGEgY29uZmlndXJhdGlvbgorCQkvLyB0aGUgZmlyc3QgYWRkZWQgaXMgIzAKKwkJd2hpbGUgKGdldENvbmZpZ3VyYXRpb25IaXN0b3J5KCkubGVuZ3RoID4gZ2V0TWF4aW11bUhpc3RvcnlDb3VudCgpICYmCisJCQkJZ2V0Q29uZmlndXJhdGlvbkhpc3RvcnkoKS5sZW5ndGggPiAxKSB7CisJCQkvLyBkbyBub3QgcmVtb3ZlIHRoZSBmaXJzdCBlbGVtZW50IGluIGhpc3RvcnksIHRoaXMgaXMgdGhlIG9yaWdpbmFsIGNvbmZpZworCQkJSW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbCByZW1vdmVkQ29uZmlnID0gZ2V0Q29uZmlndXJhdGlvbkhpc3RvcnlNb2RlbCgpWzFdOworCQkJaWYgKHJlbW92ZUNvbmZpZ3VyYXRpb25Nb2RlbChyZW1vdmVkQ29uZmlnKSkgeworCisJCQkJLy8gREVCVUc6CisJCQkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX0NPTkZJR1VSQVRJT04pIHsKKwkJCQkJVXBkYXRlQ29yZS5kZWJ1ZygiUmVtb3ZlZCBjb25maWd1cmF0aW9uIDoiICsgcmVtb3ZlZENvbmZpZy5nZXRMYWJlbCgpKTsgLy8kTk9OLU5MUy0xJAorCQkJCX0KKworCQkJCS8vIG5vdGlmeSBsaXN0ZW5lcnMKKwkJCQlPYmplY3RbXSBzaXRlTG9jYWxMaXN0ZW5lcnMgPSBsaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCk7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXRlTG9jYWxMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKKwkJCQkJKChJTG9jYWxTaXRlQ2hhbmdlZExpc3RlbmVyKSBzaXRlTG9jYWxMaXN0ZW5lcnNbaV0pLmluc3RhbGxDb25maWd1cmF0aW9uUmVtb3ZlZCgoSUluc3RhbGxDb25maWd1cmF0aW9uKSByZW1vdmVkQ29uZmlnKTsKKwkJCQl9CisKKwkJCQkvL3JlbW92ZSBmaWxlcworCQkJCVVSTCB1cmwgPSByZW1vdmVkQ29uZmlnLmdldFVSTCgpOworCQkJCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShuZXcgRmlsZSh1cmwuZ2V0RmlsZSgpKSk7CisJCQl9CisJCX0KKwl9CisJLyoKKwkgKiBAc2VlIElMb2NhbFNpdGUjYWRkTG9jYWxTaXRlQ2hhbmdlZExpc3RlbmVyKElMb2NhbFNpdGVDaGFuZ2VkTGlzdGVuZXIpCisJICovCisJcHVibGljIHZvaWQgYWRkTG9jYWxTaXRlQ2hhbmdlZExpc3RlbmVyKElMb2NhbFNpdGVDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7CisJfQorCisJLyoKKwkgKiBAc2VlIElMb2NhbFNpdGUjcmVtb3ZlTG9jYWxTaXRlQ2hhbmdlZExpc3RlbmVyKElMb2NhbFNpdGVDaGFuZ2VkTGlzdGVuZXIpCisJICovCisJcHVibGljIHZvaWQgcmVtb3ZlTG9jYWxTaXRlQ2hhbmdlZExpc3RlbmVyKElMb2NhbFNpdGVDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKKwkJbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7CisJfQorCisJLyoqCisJICogU2F2ZXMgdGhlIHNpdGUgaW50byB0aGUgY29uZmlnIGZpbGUuCisJICogQHJldHVybiB0cnVlIGlmIGNoYW5nZXMgcmVzdGFydCBpcyBuZWVkZWQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBzYXZlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCisJCS8vIFNhdmUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiBhcworCQkvLyB0aGUgb3RoZXIgYXJlIGFscmVhZHkgc2F2ZWQKKwkJLy8gYW5kIHNldCBydW50aW0gaW5mbyBmb3IgbmV4dCBzdGFydHVwCisJCXJldHVybiAoKEluc3RhbGxDb25maWd1cmF0aW9uKSBnZXRDdXJyZW50Q29uZmlndXJhdGlvbigpKS5zYXZlKCk7CisJfQorCQorLy8JLyoqCisvLwkgKiBNZXRob2QgY3JlYXRlTmV3SW5zdGFsbENvbmZpZ3VyYXRpb24uCisvLwkgKiBAcmV0dXJuIElJbnN0YWxsQ29uZmlndXJhdGlvbgorLy8JICovCisvLwlwcml2YXRlIElJbnN0YWxsQ29uZmlndXJhdGlvbiBjcmVhdGVOZXdJbnN0YWxsQ29uZmlndXJhdGlvbigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKy8vCQlJbnN0YWxsQ29uZmlndXJhdGlvbiBuZXdJbnN0YWxsQ29uZmlnID0gY3JlYXRlQ29uZmlndXJhdGlvblNpdGUobnVsbCk7CisvLwkJbmV3SW5zdGFsbENvbmZpZy5zZXRUaW1lbGluZShuZXdJbnN0YWxsQ29uZmlnLmdldENyZWF0aW9uRGF0ZSgpLmdldFRpbWUoKSk7CisvLwkJcmV0dXJuIG5ld0luc3RhbGxDb25maWc7CisvLwl9CisKKworCS8qKgorCSAqIEBzaW5jZSAyLjAKKwkgKiBAZGVwcmVjYXRlZCBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIHVzZWQuIFRoZSBjdXJyZW50IGluc3RhbGwgY29uZmlndXJhdGlvbiBpcyB0byBiZSB1c2VkLgorCSAqLworCXB1YmxpYyBJSW5zdGFsbENvbmZpZ3VyYXRpb24gY2xvbmVDdXJyZW50Q29uZmlndXJhdGlvbigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCXJldHVybiBuZXcgSW5zdGFsbENvbmZpZ3VyYXRpb24oZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKSk7CisJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihNZXNzYWdlcy5TaXRlTG9jYWxfY2xvbmVDb25maWcsIGUpOyAKKwkJfQorCX0KKworCS8qKgorCSAqIEBzaW5jZSAyLjAKKwkgKi8KKwlwdWJsaWMgdm9pZCByZXZlcnRUbyhJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJUHJvYmxlbUhhbmRsZXIgaGFuZGxlcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCisJCS8vIGNyZWF0ZSB0aGUgYWN0aXZpdHkgCisJCS8vU3RhcnQgVU9XID8KKwkJQ29uZmlndXJhdGlvbkFjdGl2aXR5IGFjdGl2aXR5ID0gbmV3IENvbmZpZ3VyYXRpb25BY3Rpdml0eShJQWN0aXZpdHkuQUNUSU9OX1JFVkVSVCk7CisJCWFjdGl2aXR5LnNldExhYmVsKGNvbmZpZ3VyYXRpb24uZ2V0TGFiZWwoKSk7CisJCWFjdGl2aXR5LnNldERhdGUobmV3IERhdGUoKSk7CisJCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBuZXdDb25maWd1cmF0aW9uID0gbnVsbDsKKworCQl0cnkgeworCQkJLy8gY3JlYXRlIGEgY29uZmlndXJhdGlvbgorCQkJbmV3Q29uZmlndXJhdGlvbiA9IGNsb25lQ3VycmVudENvbmZpZ3VyYXRpb24oKTsKKwkJCW5ld0NvbmZpZ3VyYXRpb24uc2V0TGFiZWwoY29uZmlndXJhdGlvbi5nZXRMYWJlbCgpKTsKKworCQkJLy8gYWRkIHRvIHRoZSBzdGFjayB3aGljaCB3aWxsIHNldCB1cCBhcyBjdXJyZW50CisJCQlhZGRDb25maWd1cmF0aW9uKG5ld0NvbmZpZ3VyYXRpb24pOworCisJCQkvLyBwcm9jZXNzIGRlbHRhCisJCQkvLyB0aGUgQ29uZmlndXJlZCBmZWF0dXJlc0NvbmZpZ3VyZWQgYXJlIHRoZSBzYW1lIGFzIHRoZSBvbGQgY29uZmlndXJhdGlvbgorCQkJLy8gdGhlIHVuY29uZmlndXJlZCBmZWF0dXJlc0NvbmZpZ3VyZWQgYXJlIHRoZSByZXN0Li4uCisJCQkgKChJbnN0YWxsQ29uZmlndXJhdGlvbikgbmV3Q29uZmlndXJhdGlvbikucmV2ZXJ0VG8oY29uZmlndXJhdGlvbiwgbW9uaXRvciwgaGFuZGxlcik7CisKKwkJCS8vIGV2ZXJ5dGhpbmcgZG9uZSBvaworCQkJYWN0aXZpdHkuc2V0U3RhdHVzKElBY3Rpdml0eS5TVEFUVVNfT0spOworCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCS8vIGVycm9yCisJCQlhY3Rpdml0eS5zZXRTdGF0dXMoSUFjdGl2aXR5LlNUQVRVU19OT0spOworCQkJdGhyb3cgZTsKKwkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworCQkJLy91c2VyIGRlY2lkZWQgbm90IHRvIHJldmVydCwgZG8gbm90aGluZworCQkJLy8gYmVjYXVzZSB3ZSBkaWRuJ3QgYWRkIHRoZSBjb25maWd1cmF0aW9uIHRvIHRoZSBoaXN0b3J5CisJCX0gZmluYWxseSB7CisJCQlpZiAobmV3Q29uZmlndXJhdGlvbiAhPSBudWxsKQorCQkJCSAoKEluc3RhbGxDb25maWd1cmF0aW9uKSBuZXdDb25maWd1cmF0aW9uKS5hZGRBY3Rpdml0eShhY3Rpdml0eSk7CisJCX0KKworCX0KKworCS8qKgorCSAqIEBzaW5jZSAyLjAKKwkgKiBAZGVwcmVjYXRlZAorCSAqLworCXB1YmxpYyBJSW5zdGFsbENvbmZpZ3VyYXRpb24gYWRkVG9QcmVzZXJ2ZWRDb25maWd1cmF0aW9ucyhJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKgorCSAqIEBzZWUgSUxvY2FsU2l0ZSNnZXRQcmVzZXJ2ZWRDb25maWd1cmF0aW9uRm9yKElJbnN0YWxsQ29uZmlndXJhdGlvbikKKwkgKi8KKwlwdWJsaWMgSUluc3RhbGxDb25maWd1cmF0aW9uIGZpbmRQcmVzZXJ2ZWRDb25maWd1cmF0aW9uRm9yKElJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7CisKKwkJLy8gYmFzZWQgb24gdGltZSBzdGFtcCBmb3Igbm93CisJCUluc3RhbGxDb25maWd1cmF0aW9uTW9kZWwgcHJlc2VydmVkQ29uZmlnID0gbnVsbDsKKwkJaWYgKGNvbmZpZ3VyYXRpb24gIT0gbnVsbCkgeworCQkJSW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbFtdIHByZXNlcnZlZENvbmZpZ3VyYXRpb25zID0gZ2V0UHJlc2VydmVkQ29uZmlndXJhdGlvbnNNb2RlbCgpOworCQkJaWYgKHByZXNlcnZlZENvbmZpZ3VyYXRpb25zICE9IG51bGwpIHsKKwkJCQlmb3IgKGludCBpbmRleFByZXNlcnZlZCA9IDA7IGluZGV4UHJlc2VydmVkIDwgcHJlc2VydmVkQ29uZmlndXJhdGlvbnMubGVuZ3RoOyBpbmRleFByZXNlcnZlZCsrKSB7CisJCQkJCWlmIChjb25maWd1cmF0aW9uLmdldENyZWF0aW9uRGF0ZSgpLmVxdWFscyhwcmVzZXJ2ZWRDb25maWd1cmF0aW9uc1tpbmRleFByZXNlcnZlZF0uZ2V0Q3JlYXRpb25EYXRlKCkpKSB7CisJCQkJCQlwcmVzZXJ2ZWRDb25maWcgPSBwcmVzZXJ2ZWRDb25maWd1cmF0aW9uc1tpbmRleFByZXNlcnZlZF07CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCisJCXJldHVybiAoSUluc3RhbGxDb25maWd1cmF0aW9uKSBwcmVzZXJ2ZWRDb25maWc7CisJfQorCisJLyoKKwkgKiBAc2VlIElMb2NhbFNpdGUjZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKQorCSAqIExvY2FsU2l0ZU1vZGVsI2dldEN1cnJlbnRDb25maWd1cmF0aW9uTW9kZWwoKSBtYXkgcmV0dXJuIG51bGwgaWYKKwkgKiB3ZSBqdXN0IHBhcnNlZCBMb2NhbFNpdGUueG1sCisJICovCisJcHVibGljIElJbnN0YWxsQ29uZmlndXJhdGlvbiBnZXRDdXJyZW50Q29uZmlndXJhdGlvbigpIHsKKwkJaWYgKGdldEN1cnJlbnRDb25maWd1cmF0aW9uTW9kZWwoKSA9PSBudWxsKSB7CisJCQlpbnQgaW5kZXggPSAwOworCQkJaWYgKChpbmRleCA9IGdldENvbmZpZ3VyYXRpb25IaXN0b3J5TW9kZWwoKS5sZW5ndGgpID09IDApIHsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0gZWxzZSB7CisJCQkJSW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbCBjb25maWcgPSBnZXRDb25maWd1cmF0aW9uSGlzdG9yeU1vZGVsKClbaW5kZXggLSAxXTsKKwkJCQljb25maWcuc2V0Q3VycmVudCh0cnVlKTsKKwkJCQlzZXRDdXJyZW50Q29uZmlndXJhdGlvbk1vZGVsKGNvbmZpZyk7CisJCQl9CisJCX0KKwkJcmV0dXJuIChJSW5zdGFsbENvbmZpZ3VyYXRpb24pIGdldEN1cnJlbnRDb25maWd1cmF0aW9uTW9kZWwoKTsKKwl9CisKKwkvKgorCSAqIEBzZWUgSUxvY2FsU2l0ZSNnZXRQcmVzZXJ2ZWRDb25maWd1cmF0aW9ucygpCisJICovCisJcHVibGljIElJbnN0YWxsQ29uZmlndXJhdGlvbltdIGdldFByZXNlcnZlZENvbmZpZ3VyYXRpb25zKCkgeworCQlpZiAoZ2V0UHJlc2VydmVkQ29uZmlndXJhdGlvbnNNb2RlbCgpLmxlbmd0aCA9PSAwKQorCQkJcmV0dXJuIG5ldyBJSW5zdGFsbENvbmZpZ3VyYXRpb25bMF07CisJCXJldHVybiAoSUluc3RhbGxDb25maWd1cmF0aW9uW10pIGdldFByZXNlcnZlZENvbmZpZ3VyYXRpb25zTW9kZWwoKTsKKwl9CisKKwkvKgorCSAqIEBzZWUgSUxvY2FsU2l0ZSNyZW1vdmVGcm9tUHJlc2VydmVkQ29uZmlndXJhdGlvbnMoSUluc3RhbGxDb25maWd1cmF0aW9uKQorCSAqLworCXB1YmxpYyB2b2lkIHJlbW92ZUZyb21QcmVzZXJ2ZWRDb25maWd1cmF0aW9ucyhJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgeworCQlpZiAocmVtb3ZlUHJlc2VydmVkQ29uZmlndXJhdGlvbk1vZGVsKChJbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsKSBjb25maWd1cmF0aW9uKSkKKwkJCSAoKEluc3RhbGxDb25maWd1cmF0aW9uKSBjb25maWd1cmF0aW9uKS5yZW1vdmUoKTsKKwl9CisKKwkvKgorCSAqIEBzZWUgSUxvY2FsU2l0ZSNnZXRDb25maWd1cmF0aW9uSGlzdG9yeSgpCisJICovCisJcHVibGljIElJbnN0YWxsQ29uZmlndXJhdGlvbltdIGdldENvbmZpZ3VyYXRpb25IaXN0b3J5KCkgeworCQlpZiAoZ2V0Q29uZmlndXJhdGlvbkhpc3RvcnlNb2RlbCgpLmxlbmd0aCA9PSAwKQorCQkJcmV0dXJuIG5ldyBJSW5zdGFsbENvbmZpZ3VyYXRpb25bMF07CisJCXJldHVybiAoSUluc3RhbGxDb25maWd1cmF0aW9uW10pIGdldENvbmZpZ3VyYXRpb25IaXN0b3J5TW9kZWwoKTsKKwl9CisKKworCS8qKgorCSAqIEdldHMgdGhlIGlzVHJhbnNpZW50LgorCSAqIEByZXR1cm4gUmV0dXJucyBhIGJvb2xlYW4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1RyYW5zaWVudCgpIHsKKwkJcmV0dXJuIGlzVHJhbnNpZW50OworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIGlzVHJhbnNpZW50LgorCSAqIEBwYXJhbSBpc1RyYW5zaWVudCBUaGUgaXNUcmFuc2llbnQgdG8gc2V0CisJICovCisJcHJpdmF0ZSB2b2lkIGlzVHJhbnNpZW50KGJvb2xlYW4gaXNUcmFuc2llbnQpIHsKKwkJdGhpcy5pc1RyYW5zaWVudCA9IGlzVHJhbnNpZW50OworCX0KKworCS8qCisJICogCisJICovCisJcHJpdmF0ZSBTaXRlU3RhdHVzQW5hbHl6ZXIgZ2V0U2l0ZVN0YXR1c0FuYWx5emVyKCkgeworCQlpZiAoc2l0ZVN0YXR1c0FuYWx5emVyID09IG51bGwpCisJCQlzaXRlU3RhdHVzQW5hbHl6ZXIgPSBuZXcgU2l0ZVN0YXR1c0FuYWx5emVyKHRoaXMpOworCQlyZXR1cm4gc2l0ZVN0YXR1c0FuYWx5emVyOworCX0KKworCS8qCisJICogIGNoZWNrIGlmIHRoZSBQbHVnaW5zIG9mIHRoZSBmZWF0dXJlIGFyZSBvbiB0aGUgcGx1Z2luIHBhdGgKKwkgKiAgSWYgYWxsIHRoZSBwbHVnaW5zIGFyZSBvbiB0aGUgcGx1Z2luIHBhdGgsIGFuZCB0aGUgdmVyc2lvbiBtYXRjaCBhbmQgdGhlcmUgaXMgbm8gb3RoZXIgdmVyc2lvbiAtPiBIQVBQWQorCSAqICBJZiBhbGwgdGhlIHBsdWdpbnMgYXJlIG9uIHRoZSBwbHVnaW4gcGF0aCwgYW5kIHRoZSB2ZXJzaW9uIG1hdGNoIGFuZCB0aGVyZSBpcyBvdGhlciB2ZXJzaW9uIC0+IEFNQklHVU9VUworCSAqICBJZiBzb21lIG9mIHRoZSBwbHVnaW5zIGFyZSBvbiB0aGUgcGx1Z2luIHBhdGgsIGJ1dCBub3QgYWxsIC0+IFVOSEFQUFkKKwkgKiAJQ2hlY2sgb24gYWxsIENvbmZpZ3VyZWRTaXRlcworCSAqLworCXB1YmxpYyBJU3RhdHVzIGdldEZlYXR1cmVTdGF0dXMoSUZlYXR1cmUgZmVhdHVyZSkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlyZXR1cm4gZ2V0U2l0ZVN0YXR1c0FuYWx5emVyKCkuZ2V0RmVhdHVyZVN0YXR1cyhmZWF0dXJlKTsKKwl9IAorCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm1vZGVsLlNpdGVMb2NhbE1vZGVsI3NldE1heGltdW1IaXN0b3J5Q291bnQoaW50KQorCSAqLworCXB1YmxpYyB2b2lkIHNldE1heGltdW1IaXN0b3J5Q291bnQoaW50IGhpc3RvcnkpIHsKKwkJc3VwZXIuc2V0TWF4aW11bUhpc3RvcnlDb3VudChoaXN0b3J5KTsKKwkJdHJpbUhpc3RvcnlUb0NhcGFjaXR5KCk7CisJfQorCit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0xvY2tNYW5hZ2VyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0xvY2tNYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFhYmU1ZAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvTG9ja01hbmFnZXIuamF2YQpAQCAtMCwwICsxLDM5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworCisvKioKKyAqIEBhdXRob3IgYW5pZWZlcgorICoKKyAqLworcHVibGljIGNsYXNzIExvY2tNYW5hZ2VyIHsKKwkvLyBsb2NrCisJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgT2JqZWN0IGxvY2sgPSBuZXcgT2JqZWN0KCk7CisKKwkvLyBoYXNodGFibGUgb2YgbG9ja3MKKwlwcml2YXRlIHN0YXRpYyBIYXNodGFibGUgbG9ja3MgPSBuZXcgSGFzaHRhYmxlKCk7CisJCisJcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0TG9jayhTdHJpbmcga2V5KSB7CisJCXN5bmNocm9uaXplZCAobG9jaykgeworCQkJaWYgKGxvY2tzLmdldChrZXkpID09IG51bGwpCisJCQkJbG9ja3MucHV0KGtleSwga2V5KTsKKwkJCXJldHVybiBsb2Nrcy5nZXQoa2V5KTsKKwkJfQorCX0KKwkKKwlwdWJsaWMgc3RhdGljIHZvaWQgcmV0dXJuTG9jayhTdHJpbmcga2V5KSB7CisJCXN5bmNocm9uaXplZCAobG9jaykgeworCQkJbG9ja3MucmVtb3ZlKGtleSk7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL01lc3NhZ2VzLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL01lc3NhZ2VzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVlMzI1YgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvTWVzc2FnZXMuamF2YQpAQCAtMCwwICsxLDI4OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKKworcHVibGljIGZpbmFsIGNsYXNzIE1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5tZXNzYWdlcyI7Ly8kTk9OLU5MUy0xJAorCisJcHJpdmF0ZSBNZXNzYWdlcygpIHsKKwkJLy8gRG8gbm90IGluc3RhbnRpYXRlCisJfQorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgQmFzZVNpdGVGYWN0b3J5X0Nhbm5vdFJldHJpdmVQYXJlbnREaXJlY3Rvcnk7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQ29udGVudFJlZmVyZW5jZV9VbmFibGVUb0NyZWF0ZUlucHV0U3RyZWFtOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbnRlbnRSZWZlcmVuY2VfVW5hYmxlVG9SZXR1cm5SZWZlcmVuY2VBc0ZpbGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQ29udGVudFJlZmVyZW5jZV9VbmFibGVUb1JldHVyblJlZmVyZW5jZUFzVVJMOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbnRlbnRSZWZlcmVuY2VfSHR0cE5vazsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDb250ZW50UmVmZXJlbmNlX0ZpbGVEb2VzTm90RXhpc3Q7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRmVhdHVyZV9TaXRlQWxyZWFkeVNldDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBGZWF0dXJlX1Rhc2tJbnN0YWxsRmVhdHVyZUZpbGVzOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZlYXR1cmVfVGFza0luc3RhbGxQbHVnaW5GaWxlczsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBGZWF0dXJlX05vQ29udGVudFByb3ZpZGVyOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZlYXR1cmVfTm9GZWF0dXJlQ29udGVudENvbnN1bWVyOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZlYXR1cmVfTm9VUkw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRmVhdHVyZV9GZWF0dXJlVmVyc2lvblRvU3RyaW5nOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZlYXR1cmVfSW5zdGFsbGF0aW9uQ2FuY2VsbGVkOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZlYXR1cmVfVW5hYmxlVG9Jbml0aWFsaXplRmVhdHVyZVJlZmVyZW5jZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBGZWF0dXJlQ29udGVudFByb3ZpZGVyX0Rvd25sb2FkaW5nOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZlYXR1cmVDb250ZW50UHJvdmlkZXJfVW5hYmxlVG9SZXRyaWV2ZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBGZWF0dXJlQ29udGVudFByb3ZpZGVyX1VuYWJsZVRvQ3JlYXRlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZlYXR1cmVDb250ZW50UHJvdmlkZXJfRXhjZXB0aW9uRG93bmxvYWRpbmc7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zdGFsbEhhbmRsZXJfdW5hYmxlVG9DcmVhdGVIYW5kbGVyOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbGxIYW5kbGVyX25vdEZvdW5kOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbGxIYW5kbGVyX2ludmFsaWRIYW5kbGVyOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbGxIYW5kbGVyX2NhbGxFeGNlcHRpb247CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zdGFsbEhhbmRsZXJfZXJyb3I7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zdGFsbE1vbml0b3JfRG93bmxvYWRTaXplOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbGxNb25pdG9yX0Rvd25sb2FkU2l6ZUxvbmc7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvZHVjdFByb3ZpZGVyOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEphckNvbnRlbnRSZWZlcmVuY2VfVW5wYWNraW5nOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNpdGVfQ2Fubm90RmluZENhdGVnb3J5OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNpdGVfTm9DYXRlZ29yaWVzOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNpdGVfTm9Db250ZW50UHJvdmlkZXI7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgVmVyc2lvbmVkSWRlbnRpZmllcl9JZE9yVmVyc2lvbk51bGw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2l0ZUZpbGVfQ2Fubm90UmVtb3ZlUGx1Z2luOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNpdGVGaWxlX0Nhbm5vdFJlbW92ZUZlYXR1cmU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2l0ZUZpbGVfVW5hYmxlVG9DcmVhdGVVUkw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2l0ZUZpbGVfUmVtb3Zpbmc7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2l0ZUZpbGVGYWN0b3J5X1VuYWJsZVRvQ3JlYXRlVVJMOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNpdGVGaWxlRmFjdG9yeV9VbmFibGVUb0FjY2Vzc1NpdGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2l0ZUZpbGVGYWN0b3J5X0RpcmVjdG9yeURvZXNOb3RFeGlzdDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0RmVhdHVyZVBhcnNlcl9sb2NhdGlvbjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0RmVhdHVyZVBhcnNlcl9Ob0ZlYXR1cmVUYWc7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdEZlYXR1cmVQYXJzZXJfV3JvbmdQYXJzaW5nU3RhY2s7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdEZlYXR1cmVQYXJzZXJfVW5rbm93bkVsZW1lbnQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdEZlYXR1cmVQYXJzZXJfVG9vTWFueVVSTHRhZzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0RmVhdHVyZVBhcnNlcl9Vbmtub3duU3RhcnRTdGF0ZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0RmVhdHVyZVBhcnNlcl9JZE9yVmVyc2lvbkludmFsaWQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdEZlYXR1cmVQYXJzZXJfTWlzc2luZ0lkOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRGZWF0dXJlUGFyc2VyX1BhcnNpbmdTdGFja0JhY2tUb0luaXRpYWxTdGF0ZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0RmVhdHVyZVBhcnNlcl9FbGVtZW50QWxyZWFkeVNldDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0RmVhdHVyZVBhcnNlcl9TdGF0ZUluY2x1ZGVXcm9uZ0VsZW1lbnQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdEZlYXR1cmVQYXJzZXJfUmVxdWlyZVN0YXRlV2l0aG91dEltcG9ydEVsZW1lbnQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdEZlYXR1cmVQYXJzZXJfTWlzc2luZ1BhdGNoVmVyc2lvbjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0RmVhdHVyZVBhcnNlcl93cm9uZ01hdGNoRm9yUGF0Y2g7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdEZlYXR1cmVQYXJzZXJfcGF0Y2hXaXRoUGx1Z2luOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRGZWF0dXJlUGFyc2VyX011bHRpcGxlUGF0Y2hJbXBvcnRzOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRGZWF0dXJlUGFyc2VyX1Vua25vd25FbmRTdGF0ZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0RmVhdHVyZVBhcnNlcl9FcnJvclBhcnNpbmc7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdEZlYXR1cmVQYXJzZXJfRXJyb3JsaW5lQ29sdW1uTWVzc2FnZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0RmVhdHVyZVBhcnNlcl9FcnJvclBhcnNpbmdGZWF0dXJlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRGZWF0dXJlUGFyc2VyX1Vua25vd25TdGF0ZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0RmVhdHVyZVBhcnNlcl9Ob0xpY2Vuc2VUZXh0OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRGZWF0dXJlUGFyc2VyX1BsdWdpbkFuZEZlYXR1cmVJZDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTaXRlQ29udGVudFByb3ZpZGVyX0Vycm9yQ3JlYXRpbmdVUkxGb3JBcmNoaXZlSUQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdFNpdGVQYXJzZXJfTm9TaXRlVGFnOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRTaXRlUGFyc2VyX1dyb25nUGFyc2luZ1N0YWNrOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRTaXRlUGFyc2VyX1Vua25vd25FbGVtZW50OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRTaXRlUGFyc2VyX1Vua25vd25TdGFydFN0YXRlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRTaXRlUGFyc2VyX01pc3Npbmc7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdFNpdGVQYXJzZXJfUGFyc2luZ1N0YWNrQmFja1RvSW5pdGlhbFN0YXRlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRTaXRlUGFyc2VyX0VsZW1lbnRBbHJlYWR5U2V0OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRTaXRlUGFyc2VyX1Vua25vd25FbmRTdGF0ZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0U2l0ZVBhcnNlcl9FcnJvclBhcnNpbmc7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdFNpdGVQYXJzZXJfRXJyb3JsaW5lQ29sdW1uTWVzc2FnZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0U2l0ZVBhcnNlcl9FcnJvclBhcnNpbmdTaXRlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRTaXRlUGFyc2VyX1Vua25vd25TdGF0ZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0U2l0ZVBhcnNlcl9JbnZhbGlkWE1MU3RyZWFtOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1vZGVsT2JqZWN0X01vZGVsUmVhZE9ubHk7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2l0ZU1vZGVsT2JqZWN0X0Vycm9yUGFyc2luZ1NpdGVTdHJlYW07CisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2l0ZU1vZGVsT2JqZWN0X0Vycm9yQWNjZXNzaW5nU2l0ZVN0cmVhbTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnN0YWxsQ29uZmlndXJhdGlvbl9FcnJvckR1cmluZ0ZpbGVBY2Nlc3M7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zdGFsbENvbmZpZ3VyYXRpb25QYXJzZXJfRmVhdHVyZVJlZmVyZW5jZU5vVVJMOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZlYXR1cmVFeGVjdXRhYmxlQ29udGVudFByb3ZpZGVyX0ZpbGVEb2VzTm90RXhpc3Q7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRmVhdHVyZUV4ZWN1dGFibGVDb250ZW50UHJvdmlkZXJfSW52YWxpZERpcmVjdG9yeTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBGZWF0dXJlRXhlY3V0YWJsZUNvbnRlbnRQcm92aWRlcl9VbmFibGVUb0NyZWF0ZVVSTEZvcjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBGZWF0dXJlRXhlY3V0YWJsZUNvbnRlbnRQcm92aWRlcl9VbmFibGVUb1JldHJpZXZlTm9uUGx1Z2luRW50cnk7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRmVhdHVyZUV4ZWN1dGFibGVDb250ZW50UHJvdmlkZXJfVW5hYmxlVG9SZXRyaWV2ZUZlYXR1cmVFbnRyeTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBGZWF0dXJlRXhlY3V0YWJsZUNvbnRlbnRQcm92aWRlcl9VbmFibGVUb1JldHJpZXZlUGx1Z2luRW50cnk7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJlZFNpdGVfTm9uSW5zdGFsbGFibGVTaXRlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyZWRTaXRlX051bGxGZWF0dXJlVG9JbnN0YWxsOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyZWRTaXRlX05vblVuaW5zdGFsbGFibGVTaXRlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyZWRTaXRlX05vU2l0ZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmVkU2l0ZV9DYW5ub3RGaW5kRmVhdHVyZVRvVW5jb25maWd1cmU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJlZFNpdGVfQ2Fubm90RmluZEZlYXR1cmVUb0NvbmZpZ3VyZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmVkU2l0ZV9DYW5ub3RGaW5kUGx1Z2luRW50cnk7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJlZFNpdGVfTWlzc2luZ1BsdWdpbnNCcm9rZW5GZWF0dXJlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyZWRTaXRlX1VuYWJsZVRvUmVtb3ZlQ29uZmlndXJlZEZlYXR1cmU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJlZFNpdGVfVW5hYmxlVG9GaW5kRmVhdHVyZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmVkU2l0ZV9TaXRlVVJMTnVsbDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmVkU2l0ZV9Ob25Mb2NhbFNpdGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJlZFNpdGVfTm90U2FtZVByb2R1Y3RJZDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmVkU2l0ZV9Db250YWluZWRJbkFub3RoZXJTaXRlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyZWRTaXRlX1JlYWRPbmx5U2l0ZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmVkU2l0ZV9VbmFibGVSZXNvbHZlVVJMOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyZWRTaXRlX1VuYWJsZVRvQWNjZXNzU2l0ZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBGZWF0dXJlRmFjdG9yeV9DcmVhdGluZ0Vycm9yOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZlYXR1cmVNb2RlbEZhY3RvcnlfRXJyb3JBY2Nlc2luZ0ZlYXR1cmVTdHJlYW07CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRmVhdHVyZUV4ZWN1dGFibGVGYWN0b3J5X051bGxVUkw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRmVhdHVyZUV4ZWN1dGFibGVGYWN0b3J5X0Nhbm5vdENyZWF0ZVVSTDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBGZWF0dXJlUGFja2FnZWRDb250ZW50UHJvdmlkZXJfTm9NYW5pZmVzdEZpbGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRmVhdHVyZVBhY2thZ2VkQ29udGVudFByb3ZpZGVyX0ludmFsaWREaXJlY3Rvcnk7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRmVhdHVyZVBhY2thZ2VkQ29udGVudFByb3ZpZGVyX0Vycm9yUmV0cmlldmluZzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBGZWF0dXJlUmVmZXJlbmNlX1VuYWJsZVRvUmVzb2x2ZVVSTDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBGZWF0dXJlVHlwZUZhY3RvcnlfVW5hYmxlVG9GaW5kRmVhdHVyZUZhY3Rvcnk7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zdGFsbENvbmZpZ3VyYXRpb25fVW5hYmxlVG9DcmVhdGVVUkw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zdGFsbENvbmZpZ3VyYXRpb25fVW5hYmxlVG9DYXN0OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbGxDb25maWd1cmF0aW9uX1VuYWJsZVRvU2F2ZVBsYXRmb3JtQ29uZmlndXJhdGlvbjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnN0YWxsQ29uZmlndXJhdGlvbl9BbHJlYWR5TmF0aXZlbHlMaW5rZWQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zdGFsbENvbmZpZ3VyYXRpb25fQWxyZWFkeVByb2R1Y3RTaXRlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbGxDb25maWd1cmF0aW9uX3VuYWJsZVRvRmluZFNpdGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSW50ZXJuYWxTaXRlTWFuYWdlcl9VbmFibGVUb0NyZWF0ZVNpdGVXaXRoVHlwZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnRlcm5hbFNpdGVNYW5hZ2VyX1VuYWJsZVRvQWNjZXNzVVJMOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEludGVybmFsU2l0ZU1hbmFnZXJfVW5hYmxlVG9DcmVhdGVVUkw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSW50ZXJuYWxTaXRlTWFuYWdlcl9GYWlsZWRSZXRyeUFjY2Vzc2luZ1NpdGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSW50ZXJuYWxTaXRlTWFuYWdlcl9Db25uZWN0aW5nVG9TaXRlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdsb2JhbENvbnN1bWVyX0Vycm9yQ3JlYXRpbmdGaWxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNpdGVGaWxlQ29udGVudENvbnN1bWVyX1VuYWJsZVRvQ3JlYXRlVVJMOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNpdGVGaWxlQ29udGVudENvbnN1bWVyX1VuYWJsZVRvQ3JlYXRlVVJMRm9yRmlsZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTaXRlRmlsZUNvbnRlbnRDb25zdW1lcl91bmFibGVUb0RlbGV0ZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDb250ZW50Q29uc3VtZXJfVW5hYmxlVG9SZW5hbWU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2l0ZUZpbGVGYWN0b3J5X1VuYWJsZVRvT2J0YWluUGFyZW50RGlyZWN0b3J5OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNpdGVGaWxlRmFjdG9yeV9GaWxlRG9lc05vdEV4aXN0OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNpdGVGaWxlRmFjdG9yeV9VbmFibGVUb0NyZWF0ZVVSTEZvckZpbGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2l0ZUZpbGVGYWN0b3J5X0Vycm9yUGFyc2luZ0ZpbGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2l0ZUZpbGVGYWN0b3J5X0Vycm9yQWNjZXNzaW5nOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNpdGVUeXBlRmFjdG9yeV9VbmFibGVUb0ZpbmRTaXRlRmFjdG9yeTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBVcGRhdGVNYW5hZ2VyVXRpbHNfVW5hYmxlVG9SZW1vdmVGaWxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVwZGF0ZU1hbmFnZXJVdGlsc19GaWxlQWxyZWFkeUV4aXN0czsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTaXRlTG9jYWxfVW5hYmxlVG9DcmVhdGVVUkxGb3I7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2l0ZUxvY2FsX1VuYWJsZVRvRGV0ZXJtaW5lRmVhdHVyZVN0YXR1c1NpdGVOdWxsOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNpdGVMb2NhbF9Ud29WZXJzaW9uU2FtZVBsdWdpbjE7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2l0ZUxvY2FsX1R3b1ZlcnNpb25TYW1lUGx1Z2luMjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTaXRlTG9jYWxfRmVhdHVyZVVuSGFwcHk7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2l0ZUxvY2FsX0ZlYXR1cmVIYXBweTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTaXRlTG9jYWxfRmVhdHVyZUFtYmlndW91czsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTaXRlTG9jYWxfTmVzdGVkRmVhdHVyZVVuSGFwcHk7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2l0ZUxvY2FsX05lc3RlZEZlYXR1cmVVbmF2YWlsYWJsZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTaXRlTG9jYWxfTm9QbHVnaW5WZXJzaW9uOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNpdGVMb2NhbF9VbmFibGVUb0RldGVybWluZUZlYXR1cmVTdGF0dXNDb25maWd1cmVkU2l0ZU51bGw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2l0ZUxvY2FsX0ZlYXR1cmVEaXNhYmxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNpdGVMb2NhbF9GZWF0dXJlU3RhdHVzVW5rbm93bjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTaXRlTG9jYWxfTmVzdGVkRmVhdHVyZURpc2FibGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2l0ZVVSTEZhY3RvcnlfVW5hYmxlVG9DcmVhdGVVUkw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2l0ZVVSTEZhY3RvcnlfVW5hYmxlVG9BY2Nlc3NTaXRlU3RyZWFtOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEphclZlcmlmaWVyX1ZlcmlmeTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBKYXJWZXJpZmllcl9VbmFibGVUb0ZpbmRFbmNyeXB0aW9uOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEphclZlcmlmaWVyX1VuYWJsZVRvTG9hZENlcnRpZmljYXRlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEphclZlcmlmaWVyX1VuYWJsZVRvRmluZFByb3ZpZGVyRm9yS2V5c3RvcmU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSmFyVmVyaWZpZXJfS2V5U3RvcmVOb3RMb2FkZWQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSmFyVmVyaWZpZXJfVW5hYmxlVG9BY2Nlc3NKYXI7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSmFyVmVyaWZpZXJfSW52YWxpZEZpbGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSmFyVmVyaWZpZXJfSW52YWxpZEphcjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBKYXJWZXJpZmljYXRpb25SZXN1bHRfVmFsaWRCZXR3ZWVuOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEphclZlcmlmaWNhdGlvblJlc3VsdF9FeHBpcmVkQ2VydGlmaWNhdGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSmFyVmVyaWZpY2F0aW9uUmVzdWx0X0NlcnRpZmljYXRlTm90WWV0VmFsaWQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSmFyVmVyaWZpY2F0aW9uUmVzdWx0X0NlcnRpZmljYXRlVmFsaWQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSmFyVmVyaWZpY2F0aW9uU2VydmljZV9VbnN1Y2Vzc2Z1bFZlcmlmaWNhdGlvbjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBKYXJWZXJpZmljYXRpb25TZXJ2aWNlX0NhbmNlbEluc3RhbGw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgVXBkYXRlTWFuYWdlclV0aWxzX1VuYWJsZVRvTG9nOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbm5lY3Rpb25UaHJlYWRNYW5hZ2VyX3Rvb01hbnlDb25uZWN0aW9uczsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25uZWN0aW9uVGhyZWFkTWFuYWdlcl91bnJlc3BvbnNpdmVVUkw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlX2ZlYXR1cmVVbmluc3RhbGxlZDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eUNvbnN0cmFpbnRzX3dhcm5pbmc7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlDb25zdHJhaW50c19yb290TWVzc2FnZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eUNvbnN0cmFpbnRzX3Jvb3RNZXNzYWdlSW5pdGlhbDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eUNvbnN0cmFpbnRzX2JlZm9yZU1lc3NhZ2U7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlDb25zdHJhaW50c19hZnRlck1lc3NhZ2U7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlDb25zdHJhaW50c19wbGF0Zm9ybTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eUNvbnN0cmFpbnRzX3ByaW1hcnk7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlDb25zdGFpbnRzX3ByZXJlcV9wbHVnaW47CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlDb25zdGFpbnRzX3ByZXJlcV9mZWF0dXJlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5Q29uc3RyYWludHNfcHJlcmVxOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5Q29uc3RyYWludHNfcHJlcmVxUGVyZmVjdDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eUNvbnN0cmFpbnRzX3ByZXJlcUVxdWl2YWxlbnQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlDb25zdHJhaW50c19wcmVyZXFDb21wYXRpYmxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5Q29uc3RyYWludHNfcHJlcmVxR3JlYXRlck9yRXF1YWw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlDb25zdHJhaW50c19vczsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eUNvbnN0cmFpbnRzX3dzOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5Q29uc3RyYWludHNfYXJjaDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eUNvbnN0cmFpbnRzX2N5Y2xlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5Q29uc3RyYWludHNfY2hpbGRNZXNzYWdlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5Q29uc3RyYWludHNfb3B0aW9uYWxDaGlsZDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eUNvbnN0cmFpbnRzX2V4Y2x1c2l2ZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eUNvbnN0cmFpbnRzX25vTGljZW5zZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eUNvbnN0cmFpbnRzX3JlYWRPbmx5OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5Q29uc3RyYWludHNfcGxhdGZvcm1Nb2RpZmllZDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBEdXBsaWNhdGVDb25mbGljdHNEaWFsb2dfY29uZmxpY3Q7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgT3BlcmF0aW9uc01hbmFnZXJfZXJyb3Jfb2xkOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wZXJhdGlvbnNNYW5hZ2VyX2luc3RhbGxpbmc7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgT3BlcmF0aW9uc01hbmFnZXJfZXJyb3JfdW5pbnN0YWxsOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlYXJjaF9uZXR3b3JrUHJvYmxlbXM7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zdGFsbENvbmZpZ3VyYXRpb25fbG9jYXRpb25fZXhpc3RzOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbGxMb2dQYXJzZXJfZXJyb3JzOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNpdGVMb2NhbF9jbG9uZUNvbmZpZzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBVcGRhdGVNYW5hZ2VyVXRpbHNfaW5wdXRTdHJlYW1FbmRlZDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBVcGRhdGVTZWFyY2hSZXF1ZXN0X2xvYWRpbmdQb2xpY3k7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgVXBkYXRlTWFuYWdlclV0aWxzX2NvcHk7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgVXBkYXRlUG9saWN5X3BhcnNlUG9saWN5OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVwZGF0ZVBvbGljeV9wb2xpY3lFeHBlY3RlZDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBVcGRhdGVTZWFyY2hSZXF1ZXN0X3NlYXJjaGluZzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBVcGRhdGVTZWFyY2hSZXF1ZXN0X2NvbnRhY3Rpbmc7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgVXBkYXRlU2VhcmNoUmVxdWVzdF9jaGVja2luZzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBVcGRhdGVQb2xpY3lfaW52YWxpZFVSTDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBVcGRhdGVQb2xpY3lfbmFtZU5vTnVsbDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBVcGRhdGVQb2xpY3lfVXBkYXRlUG9saWN5OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNpdGVGaWxlX2ZlYXR1cmVOb3RSZW1vdmVkOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNpdGVGaWxlX3BsdWdpbk5vdFJlbW92ZWQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRXJyb3JSZWNvdmVyeUxvZ19ub0ZpbGV0b1JlbW92ZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBVcGRhdGVzU2VhcmNoQ2F0ZWdvcnlfZXJyb3JTZWFyY2hpbmdGb3JVcGRhdGVzOworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFVuaW5zdGFsbENvbW1hbmRfZmVhdHVyZU5vdEluc3RhbGxlZEJ5VU07CisJcHVibGljIHN0YXRpYyBTdHJpbmcgU3RhbmRhbG9uZV9zaXRlQ29uZmlndXJlZDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTdGFuZGFsb25lX25vU2l0ZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTdGFuZGFsb25lX25vU2l0ZTM7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgU3RhbmRhbG9uZV9ub0NvbmZpZ3VyZWRTaXRlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0YW5kYWxvbmVfaW5zdGFsbGluZzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTdGFuZGFsb25lX25vdEZvdW5kT3JOZXdlcjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTdGFuZGFsb25lX2R1cGxpY2F0ZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTdGFuZGFsb25lX2luc3RhbGxlZDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTdGFuZGFsb25lX2Nhbm5vdEluc3RhbGw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgU3RhbmRhbG9uZV9ub0ZlYXR1cmVzMTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTdGFuZGFsb25lX25vRmVhdHVyZXMyOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0YW5kYWxvbmVfbm9GZWF0dXJlczM7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgU3RhbmRhbG9uZV9ub0ZlYXR1cmVzNDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTdGFuZGFsb25lX25vQ29uZmlnU2l0ZUZvckZlYXR1cmU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgU3RhbmRhbG9uZV9pbnZhbGlkQ21kOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0YW5kYWxvbmVfY29ubmVjdGlvbjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTdGFuZGFsb25lX3NlYXJjaGluZzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTdGFuZGFsb25lX2NtZEZhaWxlZDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTdGFuZGFsb25lX2NtZEZhaWxlZE5vTG9nOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0YW5kYWxvbmVfY21kQ29tcGxldGVXaXRoRXJyb3JzOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0YW5kYWxvbmVfY21kT0s7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgU3RhbmRhbG9uZV91cGRhdGluZzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTdGFuZGFsb25lX25vVXBkYXRlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0YW5kYWxvbmVfdXBkYXRlZDsKKwkKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTaXRlRmlsZVBsdWdpbkNvbnRlbnRDb25zdW1lcl91bmFibGVUb0RlbGV0ZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTaXRlRmlsZVBhY2tlZFBsdWdpbkNvbnRlbnRDb25zdW1lcl91bmFibGVUb0RlbGV0ZTsJCisJCisJcHVibGljIHN0YXRpYyBTdHJpbmcgSHR0cFJlc3BvbnNlX3JhbmdlRXhwZWN0ZWQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSHR0cFJlc3BvbnNlX3dyb25nUmFuZ2U7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdFNpdGVQYXJzZXJfbWlycm9yczsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBGZWF0dXJlRXhlY3V0YWJsZUNvbnRlbnRQcm92aWRlcl9VbmFibGVUb1JldHJpdmVBcmNoaXZlQ29udGVudFJlZjsKKwkKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBKYXJQcm9jZXNzb3JfdW5wYWNrTm90Rm91bmQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSmFyUHJvY2Vzc29yX25vUGFja1VucGFjazsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBKYXJQcm9jZXNzb3JfcGFja05vdEZvdW5kOworCQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNpdGVPcHRpbWl6ZXJfaW5wdXROb3RTcGVjaWZpZWQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2l0ZU9wdGltaXplcl9pbnB1dEZpbGVOb3RGb3VuZDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTaXRlQ2F0ZWdvcnlfb3RoZXJfbGFiZWw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2l0ZUNhdGVnb3J5X290aGVyX2Rlc2NyaXB0aW9uOworCisJc3RhdGljIHsKKwkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgTWVzc2FnZXMuY2xhc3MpOworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbGxDb21tYW5kX3NpdGU7Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL05vblBsdWdpbkVudHJ5Q29udGVudENvbnN1bWVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL05vblBsdWdpbkVudHJ5Q29udGVudENvbnN1bWVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA0MDE4OAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvTm9uUGx1Z2luRW50cnlDb250ZW50Q29uc3VtZXIuamF2YQpAQCAtMCwwICsxLDU1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKKworLyoqCisgKiBDb250ZW50Q29uc3VtZXIgZm9yIGEgbm9uIHBsdWdpbiBlbnRyeSBvZiBhIGZlYXR1cmUKKyAqLworCitwdWJsaWMgY2xhc3MgTm9uUGx1Z2luRW50cnlDb250ZW50Q29uc3VtZXIgZXh0ZW5kcyBDb250ZW50Q29uc3VtZXIgeworCisJcHJpdmF0ZSBib29sZWFuIGNsb3NlZCA9IGZhbHNlOworCisJcHJpdmF0ZSBJQ29udGVudENvbnN1bWVyIGNvbnRlbnRDb25zdW1lcjsKKwkJCisJLyoKKwkgKiBDb25zdHJ1Y3RvcgorCSAqLworCXB1YmxpYyBOb25QbHVnaW5FbnRyeUNvbnRlbnRDb25zdW1lcihJQ29udGVudENvbnN1bWVyIGNvbnRlbnRDb25zdW1lcil7CisJCXRoaXMuY29udGVudENvbnN1bWVyID0gY29udGVudENvbnN1bWVyOworCX0KKworCS8qCisJICogQHNlZSBDb250ZW50Q29uc3VtZXIjc3RvcmUoQ29udGVudFJlZmVyZW5jZSwgSVByb2dyZXNzTW9uaXRvcikKKwkgKi8KKwlwdWJsaWMgdm9pZCBzdG9yZShDb250ZW50UmVmZXJlbmNlIGNvbnRlbnRSZWZlcmVuY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlpZiAoIWNsb3NlZCl7CisJCQljb250ZW50Q29uc3VtZXIuc3RvcmUoIGNvbnRlbnRSZWZlcmVuY2UsbW9uaXRvcik7CisJCX0gZWxzZSB7CisJCQlVcGRhdGVDb3JlLndhcm4oIkF0dGVtcHQgdG8gc3RvcmUgaW4gYSBjbG9zZWQgTm9uUGx1Z2luRW50cnlDb250ZW50Q29uc3VtZXIiLG5ldyBFeGNlcHRpb24oKSk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCX0KKworCS8qCisJICogQHNlZSBDb250ZW50Q29uc3VtZXIjY2xvc2UoKQorCSAqLworCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gIHsKKwkJaWYgKCFjbG9zZWQpeworCQkJY2xvc2VkID0gdHJ1ZTsKKwkJCWNvbnRlbnRDb25zdW1lci5jbG9zZSgpOworCQl9IGVsc2UgeworCQkJVXBkYXRlQ29yZS53YXJuKCJBdHRlbXB0IHRvIGNsb3NlIGEgY2xvc2VkIE5vblBsdWdpbkVudHJ5Q29udGVudENvbnN1bWVyIixuZXcgRXhjZXB0aW9uKCkpOyAvLyROT04tTkxTLTEkCisJCX0KKwl9CisKK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvTnVsbENvbnRlbnRSZWZlcmVuY2UuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvTnVsbENvbnRlbnRSZWZlcmVuY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjNmYTFkCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9OdWxsQ29udGVudFJlZmVyZW5jZS5qYXZhCkBAIC0wLDAgKzEsOTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuVVJMOworCitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuQ29udGVudFJlZmVyZW5jZTsKKworLyoqCisgKiBOdWxsQ29udGVudFJlZmVyZW5jZSBpbXBsZW1lbnRzIGEgZ2VuZXJhbCBhY2Nlc3Mgd3JhcHBlciAKKyAqIHRvIGZlYXR1cmUgYW5kIHNpdGUgY29udGVudCAtLSBidXQsIGZvciB3aGljaCwgdGhlcmUgaXMgbm8gCisgKiBjb250ZW50IGFjdHVhbGx5IGZvdW5kLiBUaGlzIHdheSwgaXQgY2FuICJrZWVwIiB0aGUgSUQgdGhhdCB3YXMgCisgKiByZXF1ZXN0ZWQsIGFuZCBzdGlsbCBob2xkIGEgcGxhY2UgaW4gbGlzdHMgYW5kIGFycmF5cywgd2l0aG91dCBhIAorICogY2hhbmdlIHRvIG90aGVyIHByb2dyYW0gbG9naWMuIEl0IGRvZXMsIGhvdyBldmVyIHJlcXVpcmUgdGhlIGludGVybmFsCisgKiBhbGdvcml0aG1zIHRvIGJlIG1vcmUgY2FyZWZ1bCBhYm91dCBhc3N1bXB0aW9ucyBtYWRlIC4uLiBmb3IgZXhhbXBsZSwgCisgKiBqdXN0IGJlY2F1c2UgYXNGaWxlIGlzIG51bGwsIGl0IGRvZXMgbm90IGZvbGxvdyB0aGF0IGFzVVJMIHdpbGwgbm90IGJlIG51bGwuIAorICogPHA+CisgKiBUaGlzIGNsYXNzIG1heSBub3QgYmUgaW5zdGFudGlhdGVkIG9yIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4gCisgKiA8L3A+CisgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkNvbnRlbnRSZWZlcmVuY2UKKyAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSmFyQ29udGVudFJlZmVyZW5jZQorICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5KYXJFbnRyeUNvbnRlbnRSZWZlcmVuY2UKKyAqLworcHVibGljIGNsYXNzIE51bGxDb250ZW50UmVmZXJlbmNlIGV4dGVuZHMgQ29udGVudFJlZmVyZW5jZSB7CisKKworCS8qKgorCSAqIENvbnRydWN0b3IgZm9yIHRoZSAibWlzc2luZyBqYXIiIGNhc2UuIAorCSAqIAorCSAqIEBwYXJhbSBpZAorCSAqLworCXB1YmxpYyBOdWxsQ29udGVudFJlZmVyZW5jZShTdHJpbmcgaWQpIHsKKwkJc3VwZXIoaWQsIChGaWxlKSBudWxsKTsKKwl9CisJLyoqCisJICogQSBmYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYSBjb250ZW50IHJlZmVyZW5jZSBvZgorCSAqIHRoZSBzYW1lIHR5cGUuCisJICogCisJICogQHBhcmFtIGlkICJzeW1ib2xpYyIgcGF0aCBpZGVudGlmaWVyCisJICovCisJcHVibGljIENvbnRlbnRSZWZlcmVuY2UgY3JlYXRlQ29udGVudFJlZmVyZW5jZShTdHJpbmcgaWQsIEZpbGUgZmlsZSkgeworCQlyZXR1cm4gbmV3IE51bGxDb250ZW50UmVmZXJlbmNlKGlkKTsKKwl9CisKKwkvKioKKwkgKiBPdmVycmlkZXMgc3VwZXIgY2xhc3MgaW1wbGVtZW50YXRpb24gdG8gYXZvaWQgdGhyb3dpbmcgYSBGaWxlTm90Rm91bmQgZXhjZXB0aW9uLgorCSAqIAorCSAqIEByZXR1cm4gbnVsbAorCSAqLworCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXJldHVybiBudWxsOworCX0KKwkvKioKKwkgKiBPdmVycmlkZXMgc3VwZXIgY2xhc3MgaW1wbGVtZW50YXRpb24gdG8gYXZvaWQgdGhyb3dpbmcgYSBGaWxlTm90Rm91bmQgZXhjZXB0aW9uLgorCSAqIAorCSAqIEByZXR1cm4gbnVsbAorCSAqLworCXB1YmxpYyBGaWxlIGFzRmlsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXJldHVybiBudWxsOyAKKwl9CisKKwkvKioKKwkgKiBPdmVycmlkZXMgc3VwZXIgY2xhc3MgaW1wbGVtZW50YXRpb24gdG8gYXZvaWQgdGhyb3dpbmcgVVJMIGV4Y2VwdGlvbnMuCisJICogCisJICogQHJldHVybiBudWxsCisJICovCisJcHVibGljIFVSTCBhc1VSTCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybiBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyByZWZlcmVuY2UuCisJICogCisJICogQHJldHVybiBzdHJpbmcgcmVwcmVzZW50YXRpb24KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQkJcmV0dXJuICJNaXNzaW5nIGFyY2hpdmUgZmlsZTogIiArICcoJyArIGdldElkZW50aWZpZXIoKSArICcpJzsgLy8kTk9OLU5MUy0xJAorCX0KK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvUGF0Y2hlZEZlYXR1cmUuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvUGF0Y2hlZEZlYXR1cmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzlkYWU5Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9QYXRjaGVkRmVhdHVyZS5qYXZhCkBAIC0wLDAgKzEsMTA2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKKy8qKgorICogRmVhdHVyZSBhbmQgY29ycmVzcG9uZGluZyBwYXRjaCBmZWF0dXJlcworICovCitwdWJsaWMgY2xhc3MgUGF0Y2hlZEZlYXR1cmUgeworCXByaXZhdGUgSUZlYXR1cmVSZWZlcmVuY2UgZmVhdHVyZTsKKwlwcml2YXRlIENvbGxlY3Rpb24gcGF0Y2hlcyA9IG5ldyBIYXNoU2V0KCk7CisJLyoqCisJICogIAorCSAqLworCXB1YmxpYyBQYXRjaGVkRmVhdHVyZShJRmVhdHVyZVJlZmVyZW5jZSBmZWF0dXJlKSB7CisJCXN1cGVyKCk7CisJCXRoaXMuZmVhdHVyZSA9IGZlYXR1cmU7CisJfQorCXB1YmxpYyB2b2lkIGFkZFBhdGNoKElGZWF0dXJlUmVmZXJlbmNlIHBhdGNoKSB7CisJCXBhdGNoZXMuYWRkKHBhdGNoKTsKKwl9CisJLyoqCisJICogQHJldHVybiBSZXR1cm5zIHRoZSBmZWF0dXJlLgorCSAqLworCXB1YmxpYyBJRmVhdHVyZVJlZmVyZW5jZSBnZXRGZWF0dXJlKCkgeworCQlyZXR1cm4gZmVhdHVyZTsKKwl9CisJLyoqCisJICogQHJldHVybiBSZXR1cm5zIHRoZSBwYXRjaGVzLgorCSAqLworCXB1YmxpYyBJRmVhdHVyZVJlZmVyZW5jZVtdIGdldFBhdGNoZXMoKSB7CisJCXJldHVybiAoSUZlYXR1cmVSZWZlcmVuY2VbXSkgcGF0Y2hlcy50b0FycmF5KG5ldyBJRmVhdHVyZVJlZmVyZW5jZVtwYXRjaGVzLnNpemUoKV0pOworCX0KKwkvKioKKwkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZlYXR1cmUgYW5kIHRoZSBwYXRjaGVzLgorCSAqLworCXB1YmxpYyBJRmVhdHVyZVJlZmVyZW5jZVtdIGdldEZlYXR1cmVBbmRQYXRjaGVzKCkgeworCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGZlYXR1cmVzID0gbmV3IElGZWF0dXJlUmVmZXJlbmNlW3BhdGNoZXMuc2l6ZSgpICsgMV07CisJCWZlYXR1cmVzWzBdID0gZmVhdHVyZTsKKwkJU3lzdGVtLmFycmF5Y29weShnZXRQYXRjaGVzKCksIDAsIGZlYXR1cmVzLCAxLCBwYXRjaGVzLnNpemUoKSk7CisJCXJldHVybiBmZWF0dXJlczsKKwl9CisJLyoqCisJICogT2J0YWlucyBhbGwgcGx1Z2lucyBmcm9tIHRoZSBmZWF0dXJlIGFuZCBpdHMgcGF0Y2hlcy4gRWFjaCBwbHVnaW4gd2lsbAorCSAqIGhhdmUgdW5pcXVlIElELgorCSAqIElmIHRoZXJlIGFyZSBtdWx0aXBsZSB2ZXJzaW9uIG9mIHBsdWdpbiB3aXRoIHNhbWUgSUQgYW1vbmcgdGhlIGZlYXR1cmUKKwkgKiBhbmQgaXRzIHBhdGNoZXMsIGhpZ2hlc3QgdmVyc2lvbiBwbHVnaW5zIGFyZSBjaG9zZW4uCisJICogCisJICogQHJldHVybiBGZWF0dXJlUGx1Z2luW10KKwkgKi8KKwlwdWJsaWMgRmVhdHVyZVBsdWdpbltdIGdldFBsdWdpbnMoKSB7CisJCS8vIFVzZSBhIG1hcCBvZiBQYXRjaGVkUGx1aWducyBieSBwbHVnaW4gSUQKKwkJLy8gdG8gY29sbGVjdCBvbmUgdmVyc2lvbiBvZiBlYWNoIHBsdWdpbgorCQlNYXAgcGx1Z2lucyA9IG5ldyBIYXNoTWFwKCk7CisJCUlGZWF0dXJlUmVmZXJlbmNlW10gZmVhdHVyZVJlZnMgPSBnZXRGZWF0dXJlQW5kUGF0Y2hlcygpOworCQkvLyBmb3IgZWFjaCAoZmVhdHVyZSBvciBhbnkgcGF0Y2gpCisJCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZVJlZnMubGVuZ3RoOyBpKyspIHsKKwkJCXRyeSB7CisJCQkJSUZlYXR1cmUgZmVhdHVyZSA9IGZlYXR1cmVSZWZzW2ldLmdldEZlYXR1cmUobnVsbCk7CisJCQkJaWYgKGZlYXR1cmUgPT0gbnVsbCkgeworCQkJCQlVcGRhdGVDb3JlLndhcm4oIk51bGwgRmVhdHVyZSIsIG5ldyBFeGNlcHRpb24oKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCS8vIGdldCBwbHVnaW4gZW50cmllcworCQkJCUlQbHVnaW5FbnRyeVtdIGVudHJpZXMgPSBmZWF0dXJlLmdldFBsdWdpbkVudHJpZXMoKTsKKwkJCQlmb3IgKGludCBlbnRyID0gMDsgZW50ciA8IGVudHJpZXMubGVuZ3RoOyBlbnRyKyspIHsKKwkJCQkJU3RyaW5nIHBsdWdpbklkID0gZW50cmllc1tlbnRyXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0SWRlbnRpZmllcigpOworCQkJCQlQbHVnaW5WZXJzaW9uSWRlbnRpZmllciBwbHVnaW5WZXJzaW9uID0gZW50cmllc1tlbnRyXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0VmVyc2lvbigpOworCQkJCQkvLyBjaGVjayBpZiBtYXAgY29udGFpbnMgPj0gdmVyc2lvbiBvZiBzYW1lIHBsdWdpbgorCQkJCQlGZWF0dXJlUGx1Z2luIGV4aXN0aW5nUGx1Z2luID0gKEZlYXR1cmVQbHVnaW4pIHBsdWdpbnMuZ2V0KHBsdWdpbklkKTsKKwkJCQkJaWYgKGV4aXN0aW5nUGx1Z2luICE9IG51bGwgJiYgZXhpc3RpbmdQbHVnaW4uZ2V0RW50cnkoKS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0VmVyc2lvbigpLmlzR3JlYXRlck9yRXF1YWxUbyhwbHVnaW5WZXJzaW9uKSkgeworCQkJCQkJLy8gc2FtZSBvciBuZXdlciBwbHVnaW4gYWxyZWFkeSBjb2xsZWN0ZWQKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9IGVsc2UgeworCQkJCQkJcGx1Z2lucy5wdXQocGx1Z2luSWQsIG5ldyBGZWF0dXJlUGx1Z2luKGVudHJpZXNbZW50cl0sIGZlYXR1cmUpKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJCVVwZGF0ZUNvcmUud2FybihudWxsLCBlKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gKEZlYXR1cmVQbHVnaW5bXSkgcGx1Z2lucy52YWx1ZXMoKS50b0FycmF5KG5ldyBGZWF0dXJlUGx1Z2luW3BsdWdpbnMuc2l6ZSgpXSk7CisJfQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCVN0cmluZ0J1ZmZlciBzdHIgPSBuZXcgU3RyaW5nQnVmZmVyKGZlYXR1cmUudG9TdHJpbmcoKSk7CisJCUlGZWF0dXJlUmVmZXJlbmNlW10gcGF0Y2hlcyA9IGdldEZlYXR1cmVBbmRQYXRjaGVzKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgcGF0Y2hlcy5sZW5ndGg7IGkrKykgeworCQkJc3RyLmFwcGVuZCgiICtwYXRjaD0iICsgcGF0Y2hlc1tpXS50b1N0cmluZygpICsgIiAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCX0KKwkJcmV0dXJuIHN0ci50b1N0cmluZygpOworCX0KK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvUGx1Z2luRW50cnlDb250ZW50Q29uc3VtZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvUGx1Z2luRW50cnlDb250ZW50Q29uc3VtZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTQ5ZWU1Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9QbHVnaW5FbnRyeUNvbnRlbnRDb25zdW1lci5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOworCisvKioKKyAqIENvbnRlbnRDb25zdW1lciBmb3IgYSBwbHVnaW4gZW50cnkgb2YgYSBmZWF0dXJlCisgKi8KKworcHVibGljIGNsYXNzIFBsdWdpbkVudHJ5Q29udGVudENvbnN1bWVyIGV4dGVuZHMgQ29udGVudENvbnN1bWVyIHsKKworCXByaXZhdGUgYm9vbGVhbiBjbG9zZWQgPSBmYWxzZTsKKworCXByaXZhdGUgSUNvbnRlbnRDb25zdW1lciBjb250ZW50Q29uc3VtZXI7CisJCQorCS8qCisJICogQ29uc3RydWN0b3IKKwkgKi8KKwlwdWJsaWMgUGx1Z2luRW50cnlDb250ZW50Q29uc3VtZXIoSUNvbnRlbnRDb25zdW1lciBjb250ZW50Q29uc3VtZXIpeworCQl0aGlzLmNvbnRlbnRDb25zdW1lciA9IGNvbnRlbnRDb25zdW1lcjsKKwl9CisKKwkvKgorCSAqIEBzZWUgQ29udGVudENvbnN1bWVyI3N0b3JlKENvbnRlbnRSZWZlcmVuY2UsIElQcm9ncmVzc01vbml0b3IpCisJICovCisJcHVibGljIHZvaWQgc3RvcmUoQ29udGVudFJlZmVyZW5jZSBjb250ZW50UmVmZXJlbmNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJaWYgKCFjbG9zZWQpeworCQkJY29udGVudENvbnN1bWVyLnN0b3JlKGNvbnRlbnRSZWZlcmVuY2UsbW9uaXRvcik7CisJCX0gZWxzZSB7CisJCQlVcGRhdGVDb3JlLndhcm4oIkF0dGVtcHQgdG8gc3RvcmUgaW4gYSBjbG9zZWQgUGx1Z2luRW50cnlDb250ZW50Q29uc3VtZXIiLG5ldyBFeGNlcHRpb24oKSk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCX0KKworCS8qCisJICogQHNlZSBDb250ZW50Q29uc3VtZXIjY2xvc2UoKQorCSAqLworCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlpZiAoIWNsb3NlZCl7CisJCQljbG9zZWQgPSB0cnVlOworCQkJY29udGVudENvbnN1bWVyLmNsb3NlKCk7CisJCX0gZWxzZSB7CisJCQlVcGRhdGVDb3JlLndhcm4oIkF0dGVtcHQgdG8gY2xvc2UgYSBjbG9zZWQgUGx1Z2luRW50cnlDb250ZW50Q29uc3VtZXIiLG5ldyBFeGNlcHRpb24oKSk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCX0KKworfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9Qcm9kdWN0UHJvdmlkZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvUHJvZHVjdFByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE4NGQ4MAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvUHJvZHVjdFByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29uZmlndXJhdG9yLkZlYXR1cmVFbnRyeTsKKworLyoqCisgKiBNYXBzIHByaW1hcnkgZmVhdHVyZXMgdG8gSVByb2R1Y3QKKyAqLworcHVibGljIGNsYXNzIFByb2R1Y3RQcm92aWRlciBpbXBsZW1lbnRzIElQcm9kdWN0UHJvdmlkZXIgeworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZHVjdFByb3ZpZGVyI2dldFByb2R1Y3RzKCkKKwkgKi8KKwlwdWJsaWMgSVByb2R1Y3RbXSBnZXRQcm9kdWN0cygpIHsKKwkJSVBsYXRmb3JtQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gQ29uZmlndXJhdG9yVXRpbHMuZ2V0Q3VycmVudFBsYXRmb3JtQ29uZmlndXJhdGlvbigpOworCQlpZiAoY29uZmlndXJhdGlvbiA9PSBudWxsKQorCQkJcmV0dXJuIG5ldyBJUHJvZHVjdFswXTsKKwkJSVBsYXRmb3JtQ29uZmlndXJhdGlvbi5JRmVhdHVyZUVudHJ5W10gZmVhdHVyZXMgPSBjb25maWd1cmF0aW9uLmdldENvbmZpZ3VyZWRGZWF0dXJlRW50cmllcygpOworCQlBcnJheUxpc3QgcHJpbWFyeUZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOworCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKQorCQkJaWYgKGZlYXR1cmVzW2ldLmNhbkJlUHJpbWFyeSgpICYmIChmZWF0dXJlc1tpXSBpbnN0YW5jZW9mIEZlYXR1cmVFbnRyeSkpCisJCQkJcHJpbWFyeUZlYXR1cmVzLmFkZChuZXcgRmVhdHVyZUVudHJ5V3JhcHBlcigoRmVhdHVyZUVudHJ5KSBmZWF0dXJlc1tpXSkpOworCQkvLyBUT0RPIGhhbmRsZSB1bm1hbmFnZWQgcGx1Z2lucyBsYXRlcgorCQlyZXR1cm4gKElQcm9kdWN0W10pIHByaW1hcnlGZWF0dXJlcy50b0FycmF5KG5ldyBJUHJvZHVjdFtwcmltYXJ5RmVhdHVyZXMuc2l6ZSgpXSk7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9kdWN0UHJvdmlkZXIjZ2V0TmFtZSgpCisJICovCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gTWVzc2FnZXMuUHJvZHVjdFByb3ZpZGVyOworCX0KK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvU2l0ZUNvbnRlbnRDb25zdW1lci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9TaXRlQ29udGVudENvbnN1bWVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MxMjFjZAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvU2l0ZUNvbnRlbnRDb25zdW1lci5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsKKworCitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKKworLyoqCisgKiBBIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZm9yIElGZWF0dXJlQ29udGVudENvbnN1bWVyCisgKiA8L3A+CisgKiBAc2luY2UgMi4wCisgKi8KKworcHVibGljIGFic3RyYWN0IGNsYXNzIFNpdGVDb250ZW50Q29uc3VtZXIgaW1wbGVtZW50cyBJU2l0ZUNvbnRlbnRDb25zdW1lciB7CisJCisJcHJpdmF0ZSBJU2l0ZSBzaXRlOworCQorCS8qCisJICogQHNlZSBJU2l0ZUNvbnRlbnRDb25zdW1lciNzZXRTaXRlKElTaXRlKQorCSAqLworCS8qKgorCSAqIFNldHMgdGhlIHNpdGUuCisJICogQHBhcmFtIHNpdGUgVGhlIHNpdGUgdG8gc2V0CisJICovCisJcHVibGljIHZvaWQgc2V0U2l0ZShJU2l0ZSBzaXRlKSB7CisJCXRoaXMuc2l0ZSA9IHNpdGU7CisJfQorCisJLyoqCisJICogR2V0cyB0aGUgc2l0ZS4KKwkgKiBAcmV0dXJuIFJldHVybnMgYSBJU2l0ZQorCSAqLworCXB1YmxpYyBJU2l0ZSBnZXRTaXRlKCkgeworCQlyZXR1cm4gc2l0ZTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvU2l0ZUZpbGUuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvU2l0ZUZpbGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWM2ZjMxCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9TaXRlRmlsZS5qYXZhCkBAIC0wLDAgKzEsNDI0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiAgQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkNvbnRlbnRSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmVDb250ZW50Q29uc3VtZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmVGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklJbnN0YWxsSGFuZGxlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JTm9uUGx1Z2luRW50cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVBsdWdpbkVudHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklTaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklTaXRlRmVhdHVyZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JVmVyaWZpY2F0aW9uTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVZlcmlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkluc3RhbGxNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlNpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuVXRpbGl0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLkNvbnRlbnRFbnRyeU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLkZlYXR1cmVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC5GZWF0dXJlUmVmZXJlbmNlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuSW5zdGFsbEFib3J0ZWRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm9wZXJhdGlvbnMuVXBkYXRlVXRpbHM7CisKKworLyoqCisgKiBTaXRlIG9uIHRoZSBGaWxlIFN5c3RlbQorICovCitwdWJsaWMgY2xhc3MgU2l0ZUZpbGUgZXh0ZW5kcyBTaXRlIHsKKworCS8qKgorCSAqIHBsdWdpbiBlbnRyaWVzIAorCSAqLworCXByaXZhdGUgTGlzdCBwbHVnaW5FbnRyaWVzID0gbmV3IEFycmF5TGlzdCgwKTsKKworCS8qKgorCSAqIAorCSAqLworCXB1YmxpYyBJU2l0ZUNvbnRlbnRDb25zdW1lciBjcmVhdGVTaXRlQ29udGVudENvbnN1bWVyKElGZWF0dXJlIHRhcmdldEZlYXR1cmUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJU2l0ZUZpbGVDb250ZW50Q29uc3VtZXIgY29uc3VtZXIgPSBuZXcgU2l0ZUZpbGVDb250ZW50Q29uc3VtZXIodGFyZ2V0RmVhdHVyZSk7CisJCWNvbnN1bWVyLnNldFNpdGUodGhpcyk7CisJCXJldHVybiBjb25zdW1lcjsKKwl9CisKKwkvKioKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRQYWNrYWdlZEZlYXR1cmVUeXBlKCkgeworCQlyZXR1cm4gREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9UWVBFOworCX0KKworCS8qCisJICogQHNlZSBJU2l0ZSNpbnN0YWxsKElGZWF0dXJlLCBJVmVyaWZpZXIsIElQcm9ncmVzc01vbml0b3IpCisJICovCisJcHVibGljIElGZWF0dXJlUmVmZXJlbmNlIGluc3RhbGwoSUZlYXR1cmUgc291cmNlRmVhdHVyZSwgSVZlcmlmaWNhdGlvbkxpc3RlbmVyIHZlcmlmaWNhdGlvbkxpc3RlbmVyLCBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCXJldHVybiBpbnN0YWxsKHNvdXJjZUZlYXR1cmUsbnVsbCx2ZXJpZmljYXRpb25MaXN0ZW5lcixwcm9ncmVzcyk7CisJfQorCisJLyoKKwkgKiBAc2VlIElTaXRlI2luc3RhbGwoSUZlYXR1cmUsIElWZXJpZmllciwgSVByb2dyZXNzTW9uaXRvcikKKwkgKi8KKwlwdWJsaWMgSUZlYXR1cmVSZWZlcmVuY2UgaW5zdGFsbChJRmVhdHVyZSBzb3VyY2VGZWF0dXJlLCBJRmVhdHVyZVJlZmVyZW5jZVtdIG9wdGlvbmFsZmVhdHVyZXMsIElWZXJpZmljYXRpb25MaXN0ZW5lciB2ZXJpZmljYXRpb25MaXN0ZW5lciwgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzcykgdGhyb3dzIENvcmVFeGNlcHRpb24geworCisJCWlmIChzb3VyY2VGZWF0dXJlID09IG51bGwpCisJCQlyZXR1cm4gbnVsbDsKKworCQkvLyBtYWtlIHN1cmUgd2UgaGF2ZSBhbiBJbnN0YWxsTW9uaXRvcgkJCisJCUluc3RhbGxNb25pdG9yIG1vbml0b3I7CisJCWlmIChwcm9ncmVzcyA9PSBudWxsKQorCQkJbW9uaXRvciA9IG51bGw7CisJCWVsc2UgaWYgKHByb2dyZXNzIGluc3RhbmNlb2YgSW5zdGFsbE1vbml0b3IpCisJCQltb25pdG9yID0gKEluc3RhbGxNb25pdG9yKSBwcm9ncmVzczsKKwkJZWxzZQorCQkJbW9uaXRvciA9IG5ldyBJbnN0YWxsTW9uaXRvcihwcm9ncmVzcyk7CisKKwkJLy8gY3JlYXRlIG5ldyBleGVjdXRhYmxlIGZlYXR1cmUgYW5kIGluc3RhbGwgc291cmNlIGNvbnRlbnQgaW50byBpdAorCQlJRmVhdHVyZSBsb2NhbEZlYXR1cmUgPSBjcmVhdGVFeGVjdXRhYmxlRmVhdHVyZShzb3VyY2VGZWF0dXJlKTsKKworCQlJRmVhdHVyZVJlZmVyZW5jZSBsb2NhbEZlYXR1cmVSZWZlcmVuY2UgPSBudWxsOworCQlsb2NhbEZlYXR1cmVSZWZlcmVuY2UgPSBzb3VyY2VGZWF0dXJlLmluc3RhbGwobG9jYWxGZWF0dXJlLCBvcHRpb25hbGZlYXR1cmVzLCB2ZXJpZmljYXRpb25MaXN0ZW5lciwgbW9uaXRvcik7CisKKwkJcmV0dXJuIGxvY2FsRmVhdHVyZVJlZmVyZW5jZTsKKwl9CisKKwkvKgorCSAqIEBzZWUgSVNpdGUjaW5zdGFsbChJRmVhdHVyZSxJRmVhdHVyZUNvbnRlbnRDb25zdW1lciwgSVZlcmlmaWVyLElWZXJpZmljYXRpb25MSXN0ZW5lciwgSVByb2dyZXNzTW9uaXRvcikKKwkgKi8KKwlwdWJsaWMgSUZlYXR1cmVSZWZlcmVuY2UgaW5zdGFsbChJRmVhdHVyZSBzb3VyY2VGZWF0dXJlLCBJRmVhdHVyZVJlZmVyZW5jZVtdIG9wdGlvbmFsZmVhdHVyZXMsIElGZWF0dXJlQ29udGVudENvbnN1bWVyIHBhcmVudENvbnRlbnRDb25zdW1lciwgSVZlcmlmaWVyIHBhcmVudFZlcmlmaWVyLCBJVmVyaWZpY2F0aW9uTGlzdGVuZXIgdmVyaWZpY2F0aW9uTGlzdGVuZXIsIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3MpCisJCXRocm93cyBJbnN0YWxsQWJvcnRlZEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7CisKKwkJaWYgKHNvdXJjZUZlYXR1cmUgPT0gbnVsbCkKKwkJCXJldHVybiBudWxsOworCisJCS8vIG1ha2Ugc3VyZSB3ZSBoYXZlIGFuIEluc3RhbGxNb25pdG9yCQkKKwkJSW5zdGFsbE1vbml0b3IgbW9uaXRvcjsKKwkJaWYgKHByb2dyZXNzID09IG51bGwpCisJCQltb25pdG9yID0gbnVsbDsKKwkJZWxzZSBpZiAocHJvZ3Jlc3MgaW5zdGFuY2VvZiBJbnN0YWxsTW9uaXRvcikKKwkJCW1vbml0b3IgPSAoSW5zdGFsbE1vbml0b3IpIHByb2dyZXNzOworCQllbHNlCisJCQltb25pdG9yID0gbmV3IEluc3RhbGxNb25pdG9yKHByb2dyZXNzKTsKKworCQkvLyBjcmVhdGUgbmV3IGV4ZWN1dGFibGUgZmVhdHVyZSBhbmQgaW5zdGFsbCBzb3VyY2UgY29udGVudCBpbnRvIGl0CisJCUlGZWF0dXJlIGxvY2FsRmVhdHVyZSA9IGNyZWF0ZUV4ZWN1dGFibGVGZWF0dXJlKHNvdXJjZUZlYXR1cmUpOworCQlwYXJlbnRDb250ZW50Q29uc3VtZXIuYWRkQ2hpbGQobG9jYWxGZWF0dXJlKTsKKworCQkvLyBzZXQgdGhlIHZlcmlmaWVyCisJCUlWZXJpZmllciB2ciA9IHNvdXJjZUZlYXR1cmUuZ2V0RmVhdHVyZUNvbnRlbnRQcm92aWRlcigpLmdldFZlcmlmaWVyKCk7CisJCWlmICh2ciAhPSBudWxsKQorCQkJdnIuc2V0UGFyZW50KHBhcmVudFZlcmlmaWVyKTsKKworCQlJRmVhdHVyZVJlZmVyZW5jZSBsb2NhbEZlYXR1cmVSZWZlcmVuY2UgPSBudWxsOworCQlsb2NhbEZlYXR1cmVSZWZlcmVuY2UgPSBzb3VyY2VGZWF0dXJlLmluc3RhbGwobG9jYWxGZWF0dXJlLCBvcHRpb25hbGZlYXR1cmVzLCB2ZXJpZmljYXRpb25MaXN0ZW5lciwgbW9uaXRvcik7CisKKwkJcmV0dXJuIGxvY2FsRmVhdHVyZVJlZmVyZW5jZTsKKwl9CisKKwkvKgorCSAqIEBzZWUgSVNpdGUjcmVtb3ZlKElGZWF0dXJlLCBJUHJvZ3Jlc3NNb25pdG9yKQorCSAqLworCXB1YmxpYyB2b2lkIHJlbW92ZShJRmVhdHVyZSBmZWF0dXJlLCBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisKKwkJaWYgKGZlYXR1cmUgPT0gbnVsbCkgeworCQkJVXBkYXRlQ29yZS53YXJuKCJGZWF0dXJlIHRvIHJlbW92ZSBpcyBudWxsIik7IC8vJE5PTi1OTFMtMSQKKwkJCXJldHVybjsKKwkJfQorCQkKKwkJRXJyb3JSZWNvdmVyeUxvZyByZWNvdmVyeUxvZyA9IEVycm9yUmVjb3ZlcnlMb2cuZ2V0TG9nKCk7CisKKwkJLy8gbWFrZSBzdXJlIHdlIGhhdmUgYW4gSW5zdGFsbE1vbml0b3IJCQorCQlJbnN0YWxsTW9uaXRvciBtb25pdG9yOworCQlpZiAocHJvZ3Jlc3MgPT0gbnVsbCkKKwkJCW1vbml0b3IgPSBudWxsOworCQllbHNlIGlmIChwcm9ncmVzcyBpbnN0YW5jZW9mIEluc3RhbGxNb25pdG9yKQorCQkJbW9uaXRvciA9IChJbnN0YWxsTW9uaXRvcikgcHJvZ3Jlc3M7CisJCWVsc2UKKwkJCW1vbml0b3IgPSBuZXcgSW5zdGFsbE1vbml0b3IocHJvZ3Jlc3MpOworCisJCS8vIFNldHVwIG9wdGlvbmFsIGluc3RhbGwgaGFuZGxlcgorCQlJbnN0YWxsSGFuZGxlclByb3h5IGhhbmRsZXIgPSBuZXcgSW5zdGFsbEhhbmRsZXJQcm94eShJSW5zdGFsbEhhbmRsZXIuSEFORExFUl9BQ1RJT05fVU5JTlNUQUxMLCBmZWF0dXJlLCBmZWF0dXJlLmdldEluc3RhbGxIYW5kbGVyRW50cnkoKSwgbW9uaXRvcik7CisJCWJvb2xlYW4gc3VjY2VzcyA9IGZhbHNlOworCQlUaHJvd2FibGUgb3JpZ2luYWxFeGNlcHRpb24gPSBudWxsOworCisJCXRyeSB7CisKKwkJCS8vIHN0YXJ0IGxvZworCQkJcmVjb3ZlcnlMb2cub3BlbihFcnJvclJlY292ZXJ5TG9nLlNUQVJUX1JFTU9WRV9MT0cpOworCisJCQkvLyBsb2cgZmlsZXMgaGF2ZSBiZWVuIGRvd25sb2FkZWQKKwkJCXJlY292ZXJ5TG9nLmFwcGVuZChFcnJvclJlY292ZXJ5TG9nLkVORF9BQk9VVF9SRU1PVkUpOworCisJCQloYW5kbGVyLnVuaW5zdGFsbEluaXRpYXRlZCgpOworCisJCQkvLyByZW1vdmUgdGhlIGZlYXR1cmUgYW5kIHRoZSBwbHVnaW5zIGlmIHRoZXkgYXJlIG5vdCB1c2VkIGFuZCBub3QgYWN0aXZhdGVkCisJCQkvLyBnZXQgdGhlIHBsdWdpbnMgZnJvbSB0aGUgZmVhdHVyZQorCQkJSVBsdWdpbkVudHJ5W10gcGx1Z2luc1RvUmVtb3ZlID0gZ2V0UGx1Z2luRW50cmllc09ubHlSZWZlcmVuY2VkQnkoZmVhdHVyZSk7CisKKwkJCWlmIChtb25pdG9yICE9IG51bGwpIHsKKwkJCQltb25pdG9yLmJlZ2luVGFzayhNZXNzYWdlcy5TaXRlRmlsZV9SZW1vdmluZyArIGZlYXR1cmUuZ2V0TGFiZWwoKSwgcGx1Z2luc1RvUmVtb3ZlLmxlbmd0aCArIDEpOwkKKwkJCX0KKworCQkJLy8gcmVtb3ZlIGZlYXR1cmUgcmVmZXJlbmNlIGZyb20gdGhlIHNpdGUKKwkJCUlTaXRlRmVhdHVyZVJlZmVyZW5jZVtdIGZlYXR1cmVSZWZlcmVuY2VzID0gZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsKKwkJCWlmIChmZWF0dXJlUmVmZXJlbmNlcyAhPSBudWxsKSB7CisJCQkJZm9yIChpbnQgaW5kZXhSZWYgPSAwOyBpbmRleFJlZiA8IGZlYXR1cmVSZWZlcmVuY2VzLmxlbmd0aDsgaW5kZXhSZWYrKykgeworCQkJCQlJRmVhdHVyZVJlZmVyZW5jZSBlbGVtZW50ID0gZmVhdHVyZVJlZmVyZW5jZXNbaW5kZXhSZWZdOworCQkJCQlpZiAoZWxlbWVudC5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZXF1YWxzKGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpKSkgeworCQkJCQkJcmVtb3ZlRmVhdHVyZVJlZmVyZW5jZU1vZGVsKChGZWF0dXJlUmVmZXJlbmNlTW9kZWwpIGVsZW1lbnQpOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCWlmIChJbnN0YWxsUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXQoImZlYXR1cmVfIitmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSkgPT0gbnVsbCkgeyAvLyROT04tTkxTLTEkCisJCQkJVXBkYXRlQ29yZS5sb2coTkxTLmJpbmQoTWVzc2FnZXMuU2l0ZUZpbGVfZmVhdHVyZU5vdFJlbW92ZWQsIChuZXcgU3RyaW5nW10geyBmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpIH0pKSwgbnVsbCk7CisJCQl9IGVsc2UgeworCQkJCS8vIHJlbW92ZSB0aGUgZmVhdHVyZSBjb250ZW50CisJCQkJQ29udGVudFJlZmVyZW5jZVtdIHJlZmVyZW5jZXMgPSBmZWF0dXJlLmdldEZlYXR1cmVDb250ZW50UHJvdmlkZXIoKS5nZXRGZWF0dXJlRW50cnlBcmNoaXZlUmVmZXJlbmNlcyhtb25pdG9yKTsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsKKwkJCQkJdHJ5IHsKKwkJCQkJCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShyZWZlcmVuY2VzW2ldLmFzRmlsZSgpKTsKKwkJCQkJCWlmIChtb25pdG9yICE9IG51bGwpCisJCQkJCQkJbW9uaXRvci53b3JrZWQoMSk7CisJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLlNpdGVGaWxlX0Nhbm5vdFJlbW92ZUZlYXR1cmUsIChuZXcgU3RyaW5nW10geyBmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRJZGVudGlmaWVyKCksIGdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkgfSkpLCBlKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlJbnN0YWxsUmVnaXN0cnkudW5yZWdpc3RlckZlYXR1cmUoZmVhdHVyZSk7CisJCQl9CisKKwkJCS8vZmluZHMgdGhlIGNvbnRlbnRSZWZlcmVuY2VzIGZvciBhbiBJUGx1Z2luRW50cnkKKwkJCS8vIGFuZCByZW1vdmUgaXQKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGx1Z2luc1RvUmVtb3ZlLmxlbmd0aDsgaSsrKSB7CisJCQkJcmVtb3ZlKGZlYXR1cmUsIHBsdWdpbnNUb1JlbW92ZVtpXSwgbW9uaXRvcik7CisJCQl9CisKKwkJCS8vIHJlbW92ZSBhbnkgY2hpbGRyZW4gZmVhdHVyZQorCQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBjaGlsZHJlblJlZiA9IGZlYXR1cmUuZ2V0SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlblJlZi5sZW5ndGg7IGkrKykgeworCQkJCUlGZWF0dXJlIGNoaWxkRmVhdHVyZSA9IG51bGw7CisJCQkJdHJ5IHsKKwkJCQkJY2hpbGRGZWF0dXJlID0gY2hpbGRyZW5SZWZbaV0uZ2V0RmVhdHVyZShudWxsKTsKKwkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCQkJVXBkYXRlQ29yZS53YXJuKCJVbmFibGUgdG8gcmV0cmlldmUgZmVhdHVyZSB0byByZW1vdmUgZm9yOiIgKyBjaGlsZHJlblJlZltpXSk7IC8vJE5PTi1OTFMtMSQKKwkJCQl9CisgICAgICAgICAgICAgICAgLy8gZG8gbm90IHJlbW92ZSBuZXN0ZWQgZmVhdHVyZSBpZiBjb25maWd1cmVkIChpLmUuIHVzZWQgYnkgYW5vdGhlciBjb25maWd1cmVkIGZlYXR1cmUpCisJCQkJaWYgKGNoaWxkRmVhdHVyZSAhPSBudWxsICYmICFnZXRDdXJyZW50Q29uZmlndXJlZFNpdGUoKS5pc0NvbmZpZ3VyZWQoY2hpbGRGZWF0dXJlKSkKKwkJCQkJcmVtb3ZlKGNoaWxkcmVuUmVmW2ldLmdldEZlYXR1cmUobnVsbCksIG1vbml0b3IpOworCQkJfQorCisJCQkvLyByZW1vdmUgdGhlIGZlYXR1cmUgZnJvbSB0aGUgc2l0ZSBjYWNoZQorCQkJcmVtb3ZlRmVhdHVyZUZyb21DYWNoZShmZWF0dXJlLmdldFVSTCgpKTsKKwkJCQorCQkJaGFuZGxlci5jb21wbGV0ZVVuaW5zdGFsbCgpOworCisJCQlzdWNjZXNzID0gdHJ1ZTsKKwkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKwkJCW9yaWdpbmFsRXhjZXB0aW9uID0gdDsKKwkJfSBmaW5hbGx5IHsKKwkJCVRocm93YWJsZSBuZXdFeGNlcHRpb24gPSBudWxsOworCQkJdHJ5IHsKKwkJCQlpZiAoc3VjY2VzcykgeworCQkJCQkvLyBjbG9zZSB0aGUgbG9nCisJCQkJCXJlY292ZXJ5TG9nLmNsb3NlKEVycm9yUmVjb3ZlcnlMb2cuRU5EX1JFTU9WRV9MT0cpOworCQkJCQlyZWNvdmVyeUxvZy5kZWxldGUoKTsKKwkJCQl9IGVsc2UgeworCQkJCQlyZWNvdmVyeUxvZy5jbG9zZShFcnJvclJlY292ZXJ5TG9nLkVORF9SRU1PVkVfTE9HKTsKKwkJCQl9CisJCQkJaGFuZGxlci51bmluc3RhbGxDb21wbGV0ZWQoc3VjY2Vzcyk7CisJCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgeworCQkJCW5ld0V4Y2VwdGlvbiA9IHQ7CisJCQl9CisJCQlpZiAob3JpZ2luYWxFeGNlcHRpb24gIT0gbnVsbCkgLy8gb3JpZ2luYWwgZXhjZXB0aW9uIHdpbnMKKwkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5JbnN0YWxsSGFuZGxlcl9lcnJvciwgKG5ldyBTdHJpbmdbXSB7IGZlYXR1cmUuZ2V0TGFiZWwoKSB9KSksIG9yaWdpbmFsRXhjZXB0aW9uKTsKKwkJCWlmIChuZXdFeGNlcHRpb24gIT0gbnVsbCkKKwkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5JbnN0YWxsSGFuZGxlcl9lcnJvciwgKG5ldyBTdHJpbmdbXSB7IGZlYXR1cmUuZ2V0TGFiZWwoKSB9KSksIG5ld0V4Y2VwdGlvbik7CisJCX0KKwl9CisKKwkvKioKKwkgKiByZXR1cm5zIHRoZSBkb3dubG9hZCBzaXplCisJICogb2YgdGhlIGZlYXR1cmUgdG8gYmUgaW5zdGFsbGVkIG9uIHRoZSBzaXRlLgorCSAqIElmIHRoZSBzaXRlIGlzIDxjb2RlPm51bGw8L2NvZGU+IHJldHVybnMgdGhlIG1heGltdW0gc2l6ZQorCSAqIAorCSAqIElmIG9uZSBwbHVnLWluIGVudHJ5IGhhcyBhbiB1bmtub3duIHNpemUuCisJICogdGhlbiB0aGUgZG93bmxvYWQgc2l6ZSBpcyB1bmtub3duLgorCSAqIAorCSAqLworCXB1YmxpYyBsb25nIGdldERvd25sb2FkU2l6ZUZvcihJRmVhdHVyZSBmZWF0dXJlKSB7CisJCWxvbmcgcmVzdWx0ID0gMDsKKwkJLy9bMTMyMDI5XQorCQkvL0lQbHVnaW5FbnRyeVtdIGVudHJpZXNUb0luc3RhbGwgPSBmZWF0dXJlLmdldFBsdWdpbkVudHJpZXMoKTsKKwkJLy9JUGx1Z2luRW50cnlbXSBzaXRlRW50cmllcyA9IHRoaXMuZ2V0UGx1Z2luRW50cmllcygpOworCQkvL2VudHJpZXNUb0luc3RhbGwgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZGlmZihlbnRyaWVzVG9JbnN0YWxsLCBzaXRlRW50cmllcyk7CisJCS8vWzE4MzU1XQorCQkvL0lOb25QbHVnaW5FbnRyeVtdIG5vblBsdWdpbkVudHJpZXNUb0luc3RhbGwgPSBmZWF0dXJlLmdldE5vblBsdWdpbkVudHJpZXMoKTsKKworCQl0cnkgeworCQkJLy9bMTMyMDI5XQorCQkJLy9yZXN1bHQgPSBmZWF0dXJlLmdldEZlYXR1cmVDb250ZW50UHJvdmlkZXIoKS5nZXREb3dubG9hZFNpemVGb3IoZW50cmllc1RvSW5zdGFsbCwgbm9uUGx1Z2luRW50cmllc1RvSW5zdGFsbCk7CisJCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGNoaWxkcmVuID0gZmVhdHVyZS5nZXRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCk7CisJCQlJRmVhdHVyZSBjdXJyZW50RmVhdHVyZSA9IG51bGw7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CisJCQkJY3VycmVudEZlYXR1cmUgPSBVcGRhdGVVdGlscy5nZXRJbmNsdWRlZEZlYXR1cmUoZmVhdHVyZSwgY2hpbGRyZW5baV0pOworCQkJCWlmIChjdXJyZW50RmVhdHVyZSAhPSBudWxsKSB7CisJCQkJCXJlc3VsdCArPSBnZXREb3dubG9hZFNpemVGb3IoY3VycmVudEZlYXR1cmUpOworCQkJCQlpZihyZXN1bHQgPT0gQ29udGVudEVudHJ5TW9kZWwuVU5LTk9XTl9TSVpFKQorCQkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCQl9CisJCQl9CisKKwkJCUlQbHVnaW5FbnRyeVtdIGVudHJpZXNUb0luc3RhbGwgPSBmZWF0dXJlLmdldFBsdWdpbkVudHJpZXMoKTsKKwkJCUlQbHVnaW5FbnRyeVtdIHNpdGVFbnRyaWVzID0gdGhpcy5nZXRQbHVnaW5FbnRyaWVzKCk7CisJCQllbnRyaWVzVG9JbnN0YWxsID0gVXBkYXRlTWFuYWdlclV0aWxzLmRpZmYoZW50cmllc1RvSW5zdGFsbCwgc2l0ZUVudHJpZXMpOworCQkJLy9bMTgzNTVdCisJCQkgICBJTm9uUGx1Z2luRW50cnlbXSBub25QbHVnaW5FbnRyaWVzVG9JbnN0YWxsID0gZmVhdHVyZS5nZXROb25QbHVnaW5FbnRyaWVzKCk7CisKKwkJCSByZXN1bHQgKz0gZmVhdHVyZS5nZXRGZWF0dXJlQ29udGVudFByb3ZpZGVyKCkuZ2V0RG93bmxvYWRTaXplRm9yKGVudHJpZXNUb0luc3RhbGwsIG5vblBsdWdpbkVudHJpZXNUb0luc3RhbGwpOworCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCVVwZGF0ZUNvcmUud2FybihudWxsLCBlKTsKKwkJCXJlc3VsdCA9IENvbnRlbnRFbnRyeU1vZGVsLlVOS05PV05fU0laRTsKKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIHJldHVybnMgdGhlIGRvd25sb2FkIHNpemUKKwkgKiBvZiB0aGUgZmVhdHVyZSB0byBiZSBpbnN0YWxsZWQgb24gdGhlIHNpdGUuCisJICogSWYgdGhlIHNpdGUgaXMgPGNvZGU+bnVsbDwvY29kZT4gcmV0dXJucyB0aGUgbWF4aW11bSBzaXplCisJICogCisJICogSWYgb25lIHBsdWctaW4gZW50cnkgaGFzIGFuIHVua25vd24gc2l6ZS4KKwkgKiB0aGVuIHRoZSBkb3dubG9hZCBzaXplIGlzIHVua25vd24uCisJICogCisJICogQHNlZSBJU2l0ZSNnZXREb3dubG9hZFNpemVGb3IoSUZlYXR1cmUpCisJICogCisJICovCisJcHVibGljIGxvbmcgZ2V0SW5zdGFsbFNpemVGb3IoSUZlYXR1cmUgZmVhdHVyZSkgeworCQlsb25nIHJlc3VsdCA9IDA7CisKKwkJdHJ5IHsKKwkJCUxpc3QgcGx1Z2luc1RvSW5zdGFsbCA9IG5ldyBBcnJheUxpc3QoKTsKKworCQkJLy8gZ2V0IGFsbCB0aGUgcGx1Z2lucyBbMTczMDRdCisJCQlwbHVnaW5zVG9JbnN0YWxsLmFkZEFsbChBcnJheXMuYXNMaXN0KGZlYXR1cmUuZ2V0UGx1Z2luRW50cmllcygpKSk7CisJCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGNoaWxkcmVuID0gZmVhdHVyZS5nZXRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCk7CisJCQlJRmVhdHVyZSBjdXJyZW50RmVhdHVyZSA9IG51bGw7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CisJCQkJY3VycmVudEZlYXR1cmUgPSBVcGRhdGVVdGlscy5nZXRJbmNsdWRlZEZlYXR1cmUoZmVhdHVyZSwgY2hpbGRyZW5baV0pOworCQkJCWlmIChjdXJyZW50RmVhdHVyZSAhPSBudWxsKSB7CisJCQkJCS8vWzEzMjAyOV0KKwkJCQkJLy9wbHVnaW5zVG9JbnN0YWxsLmFkZEFsbChBcnJheXMuYXNMaXN0KGN1cnJlbnRGZWF0dXJlLmdldFBsdWdpbkVudHJpZXMoKSkpOworCQkJCQlyZXN1bHQgKz0gZ2V0SW5zdGFsbFNpemVGb3IoY3VycmVudEZlYXR1cmUpOworCQkJCQlpZiAocmVzdWx0ID09IENvbnRlbnRFbnRyeU1vZGVsLlVOS05PV05fU0laRSkKKwkJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJfQorCQkJfQorCisJCQlJUGx1Z2luRW50cnlbXSBlbnRyaWVzVG9JbnN0YWxsID0gbmV3IElQbHVnaW5FbnRyeVswXTsKKwkJCWlmIChwbHVnaW5zVG9JbnN0YWxsLnNpemUoKSA+IDApIHsKKwkJCQllbnRyaWVzVG9JbnN0YWxsID0gbmV3IElQbHVnaW5FbnRyeVtwbHVnaW5zVG9JbnN0YWxsLnNpemUoKV07CisJCQkJcGx1Z2luc1RvSW5zdGFsbC50b0FycmF5KGVudHJpZXNUb0luc3RhbGwpOworCQkJfQorCisJCQlJUGx1Z2luRW50cnlbXSBzaXRlRW50cmllcyA9IHRoaXMuZ2V0UGx1Z2luRW50cmllcygpOworCQkJZW50cmllc1RvSW5zdGFsbCA9IFVwZGF0ZU1hbmFnZXJVdGlscy5kaWZmKGVudHJpZXNUb0luc3RhbGwsIHNpdGVFbnRyaWVzKTsKKworCQkJLy9bMTgzNTVdCisJCQlJTm9uUGx1Z2luRW50cnlbXSBub25QbHVnaW5FbnRyaWVzVG9JbnN0YWxsID0gZmVhdHVyZS5nZXROb25QbHVnaW5FbnRyaWVzKCk7CisJCQkKKwkJCS8vWzEzMjAyOV0KKwkJCS8vcmVzdWx0ID0gZmVhdHVyZS5nZXRGZWF0dXJlQ29udGVudFByb3ZpZGVyKCkuZ2V0SW5zdGFsbFNpemVGb3IoZW50cmllc1RvSW5zdGFsbCwgbm9uUGx1Z2luRW50cmllc1RvSW5zdGFsbCk7CisJCQlyZXN1bHQgKz0gZmVhdHVyZS5nZXRGZWF0dXJlQ29udGVudFByb3ZpZGVyKCkuZ2V0SW5zdGFsbFNpemVGb3IoZW50cmllc1RvSW5zdGFsbCwgbm9uUGx1Z2luRW50cmllc1RvSW5zdGFsbCk7CisJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJVXBkYXRlQ29yZS53YXJuKG51bGwsIGUpOworCQkJcmVzdWx0ID0gQ29udGVudEVudHJ5TW9kZWwuVU5LTk9XTl9TSVpFOworCQl9CisKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiBBZGRzIGEgcGx1Z2luIGVudHJ5IAorCSAqIEVpdGhlciBmcm9tIHBhcnNpbmcgdGhlIGZpbGUgc3lzdGVtIG9yIAorCSAqIGluc3RhbGxpbmcgYSBmZWF0dXJlCisJICogCisJICogV2UgY2Fubm90IGZpZ3VyZSBvdXQgdGhlIGxpc3Qgb2YgcGx1Z2lucyBieSByZWFkaW5nIHRoZSBTaXRlLnhtbCBhcworCSAqIHRoZSBhcmNoaXZlcyB0YWcgYXJlIG9wdGlvbmFscworCSAqLworCXB1YmxpYyB2b2lkIGFkZFBsdWdpbkVudHJ5KElQbHVnaW5FbnRyeSBwbHVnaW5FbnRyeSkgeworCQlwbHVnaW5FbnRyaWVzLmFkZChwbHVnaW5FbnRyeSk7CisJfQorCisJcHVibGljIElQbHVnaW5FbnRyeVtdIGdldFBsdWdpbkVudHJpZXMoKSB7CisJCUlQbHVnaW5FbnRyeVtdIHJlc3VsdCA9IG5ldyBJUGx1Z2luRW50cnlbMF07CisJCWlmICghKHBsdWdpbkVudHJpZXMgPT0gbnVsbCB8fCBwbHVnaW5FbnRyaWVzLmlzRW1wdHkoKSkpIHsKKwkJCXJlc3VsdCA9IG5ldyBJUGx1Z2luRW50cnlbcGx1Z2luRW50cmllcy5zaXplKCldOworCQkJcGx1Z2luRW50cmllcy50b0FycmF5KHJlc3VsdCk7CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKworCXB1YmxpYyBpbnQgZ2V0UGx1Z2luRW50cnlDb3VudCgpIHsKKwkJcmV0dXJuIGdldFBsdWdpbkVudHJpZXMoKS5sZW5ndGg7CisJfQorCisJLyoqCisJICogCisJICovCisJcHJpdmF0ZSBJRmVhdHVyZSBjcmVhdGVFeGVjdXRhYmxlRmVhdHVyZShJRmVhdHVyZSBzb3VyY2VGZWF0dXJlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCUlGZWF0dXJlIHJlc3VsdCA9IG51bGw7CisJCUlGZWF0dXJlRmFjdG9yeSBmYWN0b3J5ID0gRmVhdHVyZVR5cGVGYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0RmFjdG9yeShERUZBVUxUX0lOU1RBTExFRF9GRUFUVVJFX1RZUEUpOworCQlyZXN1bHQgPSBmYWN0b3J5LmNyZWF0ZUZlYXR1cmUoLypVUkwqL251bGwsIHRoaXMsIG51bGwpOworCisJCS8vIGF0IGxlYXN0IHNldCB0aGUgdmVyc2lvbiBpZGVudGlmaWVyIHRvIGJlIHRoZSBzYW1lCisJCSAoKEZlYXR1cmVNb2RlbCkgcmVzdWx0KS5zZXRGZWF0dXJlSWRlbnRpZmllcihzb3VyY2VGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRJZGVudGlmaWVyKCkpOworCQkoKEZlYXR1cmVNb2RlbCkgcmVzdWx0KS5zZXRGZWF0dXJlVmVyc2lvbihzb3VyY2VGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRWZXJzaW9uKCkudG9TdHJpbmcoKSk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoqCisJICogCisJICovCisJcHJpdmF0ZSB2b2lkIHJlbW92ZShJRmVhdHVyZSBmZWF0dXJlLCBJUGx1Z2luRW50cnkgcGx1Z2luRW50cnksIEluc3RhbGxNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKworCQlpZiAocGx1Z2luRW50cnkgPT0gbnVsbCkKKwkJCXJldHVybjsKKwkJCQorCQlpZiAoSW5zdGFsbFJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0KCJwbHVnaW5fIitwbHVnaW5FbnRyeS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkpID09IG51bGwpIHsgLy8kTk9OLU5MUy0xJAorCQkJVXBkYXRlQ29yZS5sb2coTkxTLmJpbmQoTWVzc2FnZXMuU2l0ZUZpbGVfcGx1Z2luTm90UmVtb3ZlZCwgKG5ldyBTdHJpbmdbXSB7IHBsdWdpbkVudHJ5LmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpIH0pKSwgbnVsbCk7CisJCQlyZXR1cm47IAorCQl9CisKKwkJQ29udGVudFJlZmVyZW5jZVtdIHJlZmVyZW5jZXMgPSBmZWF0dXJlLmdldEZlYXR1cmVDb250ZW50UHJvdmlkZXIoKS5nZXRQbHVnaW5FbnRyeUFyY2hpdmVSZWZlcmVuY2VzKHBsdWdpbkVudHJ5LCBtb25pdG9yKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZlcmVuY2VzLmxlbmd0aDsgaSsrKSB7CisJCQl0cnkgeworCQkJCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShyZWZlcmVuY2VzW2ldLmFzRmlsZSgpKTsKKwkJCQlpZiAobW9uaXRvciAhPSBudWxsKQorCQkJCQltb25pdG9yLndvcmtlZCgxKTsKKwkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5TaXRlRmlsZV9DYW5ub3RSZW1vdmVQbHVnaW4sIChuZXcgU3RyaW5nW10geyBwbHVnaW5FbnRyeS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSwgZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKSB9KSksIGUpOworCQkJfQorCQl9CisJCXBsdWdpbkVudHJpZXMucmVtb3ZlKHBsdWdpbkVudHJ5KTsKKwkJSW5zdGFsbFJlZ2lzdHJ5LnVucmVnaXN0ZXJQbHVnaW4ocGx1Z2luRW50cnkpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9TaXRlRmlsZUNvbnRlbnRDb25zdW1lci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9TaXRlRmlsZUNvbnRlbnRDb25zdW1lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxZTQxMzkKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1NpdGVGaWxlQ29udGVudENvbnN1bWVyLmphdmEKQEAgLTAsMCArMSwzMTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkZlYXR1cmVDb250ZW50UHJvdmlkZXI7CisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS5uZXQuKjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC4qOworCisvKioKKyAqIENvbnRlbnRDb25zdW1tZXIgZm9yIGEgU2l0ZUZpbGUKKyAqLworcHVibGljIGNsYXNzIFNpdGVGaWxlQ29udGVudENvbnN1bWVyIGV4dGVuZHMgU2l0ZUNvbnRlbnRDb25zdW1lciB7CisKKwlwcml2YXRlIElGZWF0dXJlIGZlYXR1cmU7CisJcHJpdmF0ZSBib29sZWFuIGNsb3NlZCA9IGZhbHNlOworCisJLy8gcmVjb3ZlcnkKKwlwcml2YXRlIFN0cmluZyBvbGRQYXRoOworCXByaXZhdGUgU3RyaW5nIG5ld1BhdGg7CisKKwkvLyAgZm9yIGFib3J0CisJcHJpdmF0ZSBMaXN0IC8qIG9mIFNpdGVGaWxlUGx1Z2luQ29udGVudENvbnN1bWVyICovCisJY29udGVudENvbnN1bWVyczsKKwlwcml2YXRlIExpc3QgLypvZiBwYXRoIGFzIFN0cmluZyAqLworCWluc3RhbGxlZEZpbGVzOworCQorCS8vIFBFUkY6IG5ldyBpbnN0YW5jZSB2YXJpYWJsZQorCXByaXZhdGUgU2l0ZUZpbGVGYWN0b3J5IGFyY2hpdmVGYWN0b3J5ID0gbmV3IFNpdGVGaWxlRmFjdG9yeSgpOworCisJLyoKKwkgKiBDb25zdHJ1Y3RvciAKKwkgKi8KKwlwdWJsaWMgU2l0ZUZpbGVDb250ZW50Q29uc3VtZXIoSUZlYXR1cmUgZmVhdHVyZSkgeworCQl0aGlzLmZlYXR1cmUgPSBmZWF0dXJlOworCQlpbnN0YWxsZWRGaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKKwl9CisKKwkvKgorCSAqIFJldHVybnMgdGhlIHBhdGggaW4gd2hpY2ggdGhlIEZlYXR1cmUgd2lsbCBiZSBpbnN0YWxsZWQKKwkgKi8KKwlwcml2YXRlIFN0cmluZyBnZXRGZWF0dXJlUGF0aCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGZlYXR1cmVQYXRoID0gbnVsbDsKKwkJdHJ5IHsKKwkJCVZlcnNpb25lZElkZW50aWZpZXIgZmVhdHVyZUlkZW50aWZpZXIgPSBmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKTsKKwkJCVN0cmluZyBwYXRoID0gU2l0ZS5ERUZBVUxUX0lOU1RBTExFRF9GRUFUVVJFX1BBVEggKyBmZWF0dXJlSWRlbnRpZmllci50b1N0cmluZygpICsgRmlsZS5zZXBhcmF0b3I7CisJCQlVUkwgbmV3VVJMID0gbmV3IFVSTChnZXRTaXRlKCkuZ2V0VVJMKCksIHBhdGgpOworCQkJZmVhdHVyZVBhdGggPSBuZXdVUkwuZ2V0RmlsZSgpOworCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oTWVzc2FnZXMuU2l0ZUZpbGVDb250ZW50Q29uc3VtZXJfVW5hYmxlVG9DcmVhdGVVUkwgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CQorCQl9CisJCXJldHVybiBmZWF0dXJlUGF0aDsKKwl9CisKKwkvKgorCSAqIEBzZWUgSVNpdGVDb250ZW50Q29uc3VtZXIjb3BlbihJTm9uUGx1Z2luRW50cnkpCisJICovCisJcHVibGljIElDb250ZW50Q29uc3VtZXIgb3BlbihJTm9uUGx1Z2luRW50cnkgbm9uUGx1Z2luRW50cnkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJcmV0dXJuIG5ldyBTaXRlRmlsZU5vblBsdWdpbkNvbnRlbnRDb25zdW1lcihnZXRGZWF0dXJlUGF0aCgpKTsKKwl9CisKKwkvKgorCSAqIEBzZWUgSVNpdGVDb250ZW50Q29uc3VtZXIjb3BlbihJUGx1Z2luRW50cnkpCisJICovCisJcHVibGljIElDb250ZW50Q29uc3VtZXIgb3BlbihJUGx1Z2luRW50cnkgcGx1Z2luRW50cnkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJQ29udGVudENvbnN1bWVyIGNvbnM7CisJCWlmKHBsdWdpbkVudHJ5IGluc3RhbmNlb2YgUGx1Z2luRW50cnlNb2RlbCAmJiAhKChQbHVnaW5FbnRyeU1vZGVsKXBsdWdpbkVudHJ5KS5pc1VucGFjaygpKXsKKwkJCS8vIHBsdWdpbiBjYW4gcnVuIGZyb20gYSBqYXIKKwkJCSBjb25zID0gbmV3IFNpdGVGaWxlUGFja2VkUGx1Z2luQ29udGVudENvbnN1bWVyKHBsdWdpbkVudHJ5LCBnZXRTaXRlKCkpOworCQl9IGVsc2V7CisJCQkvLyBwbHVnaW4gbXVzdCBiZSB1bnBhY2tlZAorCQkJY29ucyA9IG5ldyBTaXRlRmlsZVBsdWdpbkNvbnRlbnRDb25zdW1lcihwbHVnaW5FbnRyeSwgZ2V0U2l0ZSgpKTsKKwkJfQorCQlhZGRDb250ZW50Q29uc3VtZXJzKGNvbnMpOworCQlyZXR1cm4gY29uczsKKwl9CisKKwkvKgorCSAqIEBzZWUgSVNpdGVDb250ZW50Q29uc3VtZXIjc3RvcmUoQ29udGVudFJlZmVyZW5jZSwgSVByb2dyZXNzTW9uaXRvcikKKwkgKi8KKwlwdWJsaWMgdm9pZCBzdG9yZShDb250ZW50UmVmZXJlbmNlIGNvbnRlbnRSZWZlcmVuY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCisJCWlmIChjbG9zZWQpIHsKKwkJCVVwZGF0ZUNvcmUud2FybigiQXR0ZW1wdCB0byBzdG9yZSBpbiBhIGNsb3NlZCBTaXRlRmlsZUNvbnRlbnRDb25zdW1lciIsIG5ldyBFeGNlcHRpb24oKSk7IC8vJE5PTi1OTFMtMSQKKwkJCXJldHVybjsKKwkJfQorCisJCUlucHV0U3RyZWFtIGluU3RyZWFtID0gbnVsbDsKKwkJU3RyaW5nIGZlYXR1cmVQYXRoID0gZ2V0RmVhdHVyZVBhdGgoKTsKKwkJU3RyaW5nIGNvbnRlbnRLZXkgPSBjb250ZW50UmVmZXJlbmNlLmdldElkZW50aWZpZXIoKTsKKwkJZmVhdHVyZVBhdGggKz0gY29udGVudEtleTsKKworCQkvLyBlcnJvciByZWNvdmVyeQorCQlpZiAoZmVhdHVyZVBhdGguZW5kc1dpdGgoIlxcIitGZWF0dXJlLkZFQVRVUkVfWE1MKSB8fCBmZWF0dXJlUGF0aC5lbmRzV2l0aCgiLyIrRmVhdHVyZS5GRUFUVVJFX1hNTCkpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQlvbGRQYXRoID0gZmVhdHVyZVBhdGgucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJyk7CisJCQlGaWxlIGxvY2FsRmlsZSA9IG5ldyBGaWxlKG9sZFBhdGgpOworCQkJaWYgKGxvY2FsRmlsZS5leGlzdHMoKSkgeworCQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLlVwZGF0ZU1hbmFnZXJVdGlsc19GaWxlQWxyZWFkeUV4aXN0cywgKG5ldyBPYmplY3RbXSB7IGxvY2FsRmlsZSB9KSksIG51bGwpOworCQkJfQorCQkJZmVhdHVyZVBhdGggPSBFcnJvclJlY292ZXJ5TG9nLmdldExvY2FsUmFuZG9tSWRlbnRpZmllcihmZWF0dXJlUGF0aCk7CisJCQluZXdQYXRoID0gZmVhdHVyZVBhdGg7CisJCQlFcnJvclJlY292ZXJ5TG9nLmdldExvZygpLmFwcGVuZFBhdGgoRXJyb3JSZWNvdmVyeUxvZy5GRUFUVVJFX0VOVFJZLCBmZWF0dXJlUGF0aCk7CisJCX0KKworCQl0cnkgeworCQkJaW5TdHJlYW0gPSBjb250ZW50UmVmZXJlbmNlLmdldElucHV0U3RyZWFtKCk7CisJCQlVcGRhdGVNYW5hZ2VyVXRpbHMuY29weVRvTG9jYWwoaW5TdHJlYW0sIGZlYXR1cmVQYXRoLCBudWxsKTsKKwkJCVVwZGF0ZU1hbmFnZXJVdGlscy5jaGVja1Blcm1pc3Npb25zKGNvbnRlbnRSZWZlcmVuY2UsIGZlYXR1cmVQYXRoKTsgLy8gMjAzMDUKKwkJCWluc3RhbGxlZEZpbGVzLmFkZChmZWF0dXJlUGF0aCk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLkdsb2JhbENvbnN1bWVyX0Vycm9yQ3JlYXRpbmdGaWxlLCAobmV3IFN0cmluZ1tdIHsgZmVhdHVyZVBhdGggfSkpLCBlKTsKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChpblN0cmVhbSAhPSBudWxsKSB7CisJCQkJdHJ5IHsKKwkJCQkJLy8gY2xvc2Ugc3RyZWFtCisJCQkJCWluU3RyZWFtLmNsb3NlKCk7CisJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCX0KKwkJCX0KKwkJfQorCisJfQorCisJLyoKKwkgKiBAc2VlIElTaXRlQ29udGVudENvbnN1bWVyI2Nsb3NlKCkKKwkgKi8KKwlwdWJsaWMgSUZlYXR1cmVSZWZlcmVuY2UgY2xvc2UoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisKKwkJaWYgKGNsb3NlZCkKKwkJCVVwZGF0ZUNvcmUud2FybigiQXR0ZW1wdCB0byBjbG9zZSBhIGNsb3NlZCBTaXRlRmlsZUNvbnRlbnRDb25zdW1lciIsIG5ldyBFeGNlcHRpb24oKSk7IC8vJE5PTi1OTFMtMSQKKworCQkvLyBjcmVhdGUgYSBuZXcgRmVhdHVyZSByZWZlcmVuY2UgdG8gYmUgYWRkZWQgdG8gdGhlIHNpdGUKKwkJU2l0ZUZlYXR1cmVSZWZlcmVuY2UgcmVmID0gbmV3IFNpdGVGZWF0dXJlUmVmZXJlbmNlKCk7CisJCXJlZi5zZXRTaXRlKGdldFNpdGUoKSk7CisJCUZpbGUgZmlsZSA9IG51bGw7CisKKwkJdHJ5IHsKKwkJCWZpbGUgPSBuZXcgRmlsZShnZXRGZWF0dXJlUGF0aCgpKTsKKwkJCXJlZi5zZXRVUkwoZmlsZS50b1VSTCgpKTsKKwkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLlNpdGVGaWxlQ29udGVudENvbnN1bWVyX1VuYWJsZVRvQ3JlYXRlVVJMRm9yRmlsZSwgKG5ldyBTdHJpbmdbXSB7IGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkgfSkpLCBlKTsKKwkJfQorCisJCS8vcmVuYW1lIGZpbGUgYmFjayAKKwkJaWYgKG5ld1BhdGggIT0gbnVsbCkgeworCQkJRXJyb3JSZWNvdmVyeUxvZy5nZXRMb2coKS5hcHBlbmRQYXRoKEVycm9yUmVjb3ZlcnlMb2cuUkVOQU1FX0VOVFJZLCBuZXdQYXRoKTsKKwkJCWJvb2xlYW4gc3VjZXNzID0gZmFsc2U7CisJCQlGaWxlIGZpbGVUb1JlbmFtZSA9IG5ldyBGaWxlKG5ld1BhdGgpOworCQkJaWYgKGZpbGVUb1JlbmFtZS5leGlzdHMoKSkgeworCQkJCUZpbGUgcmVuYW1lZEZpbGUgPSBuZXcgRmlsZShvbGRQYXRoKTsKKwkJCQlpZiAocmVuYW1lZEZpbGUuZXhpc3RzKCkpIHsKKwkJCQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKHJlbmFtZWRGaWxlKTsKKwkJCQkJVXBkYXRlQ29yZS53YXJuKCJSZW1vdmluZyBhbHJlYWR5IGV4aXN0aW5nIGZpbGU6IiArIG9sZFBhdGgpOyAvLyROT04tTkxTLTEkCisJCQkJfQorCQkJCXN1Y2VzcyA9IGZpbGVUb1JlbmFtZS5yZW5hbWVUbyhyZW5hbWVkRmlsZSk7CisJCQl9CisJCQlpZiAoIXN1Y2VzcykgeworCQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChNZXNzYWdlcy5Db250ZW50Q29uc3VtZXJfVW5hYmxlVG9SZW5hbWUsIChuZXcgU3RyaW5nW10geyBuZXdQYXRoLCBvbGRQYXRoIH0pKTsKKwkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihtc2csIG5ldyBFeGNlcHRpb24obXNnKSk7CisJCQl9CisJCX0KKworCQkvLyBjbG9zZSBwbHVnaW4gYW5kIG5vbiBwbHVnaW4gY29udGVudCBjb25zdW1lcgorCQlpZiAoY29udGVudENvbnN1bWVycyAhPSBudWxsKSB7CisJCQlJdGVyYXRvciBpdGVyID0gY29udGVudENvbnN1bWVycy5pdGVyYXRvcigpOworCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisJCQkJQ29udGVudENvbnN1bWVyIGVsZW1lbnQgPSAoQ29udGVudENvbnN1bWVyKSBpdGVyLm5leHQoKTsKKwkJCQllbGVtZW50LmNsb3NlKCk7CisJCQl9CisJCX0KKwkJY29udGVudENvbnN1bWVycyA9IG51bGw7CisKKwkJaWYgKHJlZiAhPSBudWxsKSB7CisJCQkvLyB0aGUgZmVhdHVyZSBNVVNUIGhhdmUgcmVuYW1lZCB0aGUgcGx1Z2lucyBhdCB0aGF0IHBvaW50CisJCQkvLyAoYnkgY2xvc2luZyB0aGUgUGx1Z2luQ29udGVudENvbnN1bWVyKQorCQkJY29tbWl0UGx1Z2lucyhyZWYpOworCQkJcmVmLm1hcmtSZWFkT25seSgpOworCQl9CisKKwkJY2xvc2VkID0gdHJ1ZTsKKwkJcmV0dXJuIHJlZjsKKwl9CisKKwkvKgorCSAqIEBzZWUgSVNpdGVDb250ZW50Q29uc3VtZXIjYWJvcnQoKQorCSAqLworCXB1YmxpYyB2b2lkIGFib3J0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCisJCWlmIChjbG9zZWQpIHsKKwkJCVVwZGF0ZUNvcmUud2FybigiQXR0ZW1wdCB0byBhYm9ydCBhIGNsb3NlZCBTaXRlRmlsZUNvbnRlbnRDb25zdW1lciIsIG5ldyBFeGNlcHRpb24oKSk7IC8vJE5PTi1OTFMtMSQKKwkJCXJldHVybjsKKwkJfQorCisJCS8vYWJvcnQgYWxsIHBsdWdpbnMgY29udGVudCBjb25zdW1lciBvcGVuZWQKKwkJaWYgKGNvbnRlbnRDb25zdW1lcnMgIT0gbnVsbCkgeworCQkJSXRlcmF0b3IgaXRlciA9IGNvbnRlbnRDb25zdW1lcnMuaXRlcmF0b3IoKTsKKwkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgeworCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7CisJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiAgU2l0ZUZpbGVQbHVnaW5Db250ZW50Q29uc3VtZXIpIHsKKwkJCQkJKChTaXRlRmlsZVBsdWdpbkNvbnRlbnRDb25zdW1lcillbGVtZW50KS5hYm9ydCgpOworCQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mICBTaXRlRmlsZVBhY2tlZFBsdWdpbkNvbnRlbnRDb25zdW1lcil7CisJCQkJCSgoU2l0ZUZpbGVQYWNrZWRQbHVnaW5Db250ZW50Q29uc3VtZXIpZWxlbWVudCkuYWJvcnQoKTsKKwkJCQl9CisJCQkJCisJCQl9CisJCX0KKwkJY29udGVudENvbnN1bWVycyA9IG51bGw7CisJCWJvb2xlYW4gc3VjZXNzID0gdHJ1ZTsKKworCQkvL1JlbW92ZSBmZWF0dXJlLnhtbCBmaXJzdCBpZiBpdCBleGlzdHMKKwkJaWYgKG9sZFBhdGggIT0gbnVsbCkgeworCQkJRXJyb3JSZWNvdmVyeUxvZy5nZXRMb2coKS5hcHBlbmRQYXRoKEVycm9yUmVjb3ZlcnlMb2cuREVMRVRFX0VOVFJZLCBvbGRQYXRoKTsKKwkJCUZpbGUgZmlsZVRvRGVsZXRlID0gbmV3IEZpbGUob2xkUGF0aCk7CisJCQlpZiAoZmlsZVRvRGVsZXRlLmV4aXN0cygpKSB7CisJCQkJc3VjZXNzID0gZmlsZVRvRGVsZXRlLmRlbGV0ZSgpOworCQkJfQorCQl9CisKKwkJaWYgKCFzdWNlc3MpIHsKKwkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChNZXNzYWdlcy5TaXRlRmlsZUNvbnRlbnRDb25zdW1lcl91bmFibGVUb0RlbGV0ZSwgKG5ldyBTdHJpbmdbXSB7IG9sZFBhdGggfSkpOyAKKwkJCVVwZGF0ZUNvcmUubG9nKG1zZywgbnVsbCk7CisJCX0gZWxzZSB7CisJCQkvLyByZW1vdmUgdGhlIGZlYXR1cmUgZmlsZXM7CisJCQlJdGVyYXRvciBpdGVyID0gaW5zdGFsbGVkRmlsZXMuaXRlcmF0b3IoKTsKKwkJCUZpbGUgZmVhdHVyZUZpbGUgPSBudWxsOworCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisJCQkJU3RyaW5nIHBhdGggPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKKwkJCQlmZWF0dXJlRmlsZSA9IG5ldyBGaWxlKHBhdGgpOworCQkJCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShmZWF0dXJlRmlsZSk7CisJCQl9CisKKwkJCS8vIHJlbW92ZSB0aGUgZmVhdHVyZSBkaXJlY3RvcnkgaWYgZW1wdHkKKwkJCVN0cmluZyBmZWF0dXJlUGF0aCA9IGdldEZlYXR1cmVQYXRoKCk7CisJCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRW1wdHlEaXJlY3Rvcmllc0Zyb21GaWxlU3lzdGVtKG5ldyBGaWxlKGZlYXR1cmVQYXRoKSk7CisJCX0KKwkJY2xvc2VkID0gdHJ1ZTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogY29tbWl0IHRoZSBwbHVnaW5zIGluc3RhbGxlZCBhcyBhcmNoaXZlIG9uIHRoZSBzaXRlCisJICogKGNyZWF0ZXMgdGhlIG1hcCBiZXR3ZWVuIHRoZSBwbHVnaW4gaWQgYW5kIHRoZSBsb2NhdGlvbiBvZiB0aGUgcGx1Z2luKQorCSAqLworCXByaXZhdGUgdm9pZCBjb21taXRQbHVnaW5zKElGZWF0dXJlUmVmZXJlbmNlIGxvY2FsRmVhdHVyZVJlZmVyZW5jZSkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQorCQkvLyBnZXQgdGhlIGZlYXR1cmUKKwkJICgoU2l0ZUZpbGUpIGdldFNpdGUoKSkuYWRkRmVhdHVyZVJlZmVyZW5jZU1vZGVsKChTaXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsKSBsb2NhbEZlYXR1cmVSZWZlcmVuY2UpOworCQlJRmVhdHVyZSBsb2NhbEZlYXR1cmUgPSBudWxsOworCQl0cnkgeworCQkJbG9jYWxGZWF0dXJlID0gbG9jYWxGZWF0dXJlUmVmZXJlbmNlLmdldEZlYXR1cmUobnVsbCk7CisJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJVXBkYXRlQ29yZS53YXJuKG51bGwsIGUpOworCQkJcmV0dXJuOworCQl9CisJCisJCWlmIChsb2NhbEZlYXR1cmUgPT0gbnVsbCkKKwkJCXJldHVybjsKKwkKKwkJLy8gYWRkIHRoZSBpbnN0YWxsZWQgcGx1Z2lucyBkaXJlY3RvcmllcyBhcyBhcmNoaXZlcyBlbnRyeQorCQlBcmNoaXZlUmVmZXJlbmNlTW9kZWwgYXJjaGl2ZSA9IG51bGw7CisJCUlQbHVnaW5FbnRyeVtdIHBsdWdpbkVudHJpZXMgPSBsb2NhbEZlYXR1cmUuZ2V0UGx1Z2luRW50cmllcygpOworCQlmb3IgKGludCBpID0gMDsgaSA8IHBsdWdpbkVudHJpZXMubGVuZ3RoOyBpKyspIHsKKwkJCVN0cmluZyB2ZXJzaW9uSWQgPSBwbHVnaW5FbnRyaWVzW2ldLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpOworCQkJU3RyaW5nIHBsdWdpbklEID0gU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRIICsgdmVyc2lvbklkICsgRmVhdHVyZUNvbnRlbnRQcm92aWRlci5KQVJfRVhURU5TSU9OOworCQkJYXJjaGl2ZSA9IGFyY2hpdmVGYWN0b3J5LmNyZWF0ZUFyY2hpdmVSZWZlcmVuY2VNb2RlbCgpOworCQkJYXJjaGl2ZS5zZXRQYXRoKHBsdWdpbklEKTsKKwkJCXRyeSB7CisJCQkJVVJMIHVybCA9IG51bGw7CisJCQkJaWYgKHBsdWdpbkVudHJpZXNbaV0gaW5zdGFuY2VvZiBQbHVnaW5FbnRyeU1vZGVsCisJCQkJCQkmJiAhKChQbHVnaW5FbnRyeU1vZGVsKSBwbHVnaW5FbnRyaWVzW2ldKS5pc1VucGFjaygpKSB7CisJCQkJCXVybCA9IG5ldyBVUkwoZ2V0U2l0ZSgpLmdldFVSTCgpLCBTaXRlLkRFRkFVTFRfUExVR0lOX1BBVEgJKyB2ZXJzaW9uSWQgKyAiLmphciIpOyAvLyROT04tTkxTLTEkCisJCQkJfSBlbHNlIHsKKwkJCQkJdXJsID0gbmV3IFVSTChnZXRTaXRlKCkuZ2V0VVJMKCksIFNpdGUuREVGQVVMVF9QTFVHSU5fUEFUSAkrIHZlcnNpb25JZCArIEZpbGUuc2VwYXJhdG9yKTsKKwkJCQl9CisJCQkJYXJjaGl2ZS5zZXRVUkxTdHJpbmcodXJsLnRvRXh0ZXJuYWxGb3JtKCkpOworCQkJCWFyY2hpdmUucmVzb2x2ZSh1cmwsIG51bGwpOworCQkJCSgoU2l0ZUZpbGUpIGdldFNpdGUoKSkuYWRkQXJjaGl2ZVJlZmVyZW5jZU1vZGVsKGFyY2hpdmUpOworCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKwkKKwkJCQlTdHJpbmcgdXJsU3RyaW5nID0gKGdldFNpdGUoKS5nZXRVUkwoKSAhPSBudWxsKSA/IGdldFNpdGUoKS5nZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpIDogIiI7CS8vJE5PTi1OTFMtMSQKKwkJCQl1cmxTdHJpbmcgKz0gU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRIICsgcGx1Z2luRW50cmllc1tpXS50b1N0cmluZygpOworCQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLlNpdGVGaWxlX1VuYWJsZVRvQ3JlYXRlVVJMLCAobmV3IFN0cmluZ1tdIHsgdXJsU3RyaW5nIH0pKSwgZSk7CisJCQl9CisJCX0KKwkJcmV0dXJuOworCX0KKworCS8qCisJICogQWRkcyBhIFNpdGVGaWxlUGx1Z2luQ29udGVudENvbnN1bWVyIHRvIHRoZSBsaXN0CisJICovCisJcHJpdmF0ZSB2b2lkIGFkZENvbnRlbnRDb25zdW1lcnMoQ29udGVudENvbnN1bWVyIGNvbnMpIHsKKwkJaWYgKGNvbnRlbnRDb25zdW1lcnMgPT0gbnVsbCkKKwkJCWNvbnRlbnRDb25zdW1lcnMgPSBuZXcgQXJyYXlMaXN0KCk7CisJCWNvbnRlbnRDb25zdW1lcnMuYWRkKGNvbnMpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9TaXRlRmlsZUNvbnRlbnRQcm92aWRlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9TaXRlRmlsZUNvbnRlbnRQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5Y2U4YzIKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1NpdGVGaWxlQ29udGVudFByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwzMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOworCitpbXBvcnQgamF2YS5uZXQuVVJMOworCitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuU2l0ZUNvbnRlbnRQcm92aWRlcjsKKworLyoqCisgKiBTaXRlIG9uIHRoZSBGaWxlIFN5c3RlbQorICovCitwdWJsaWMgY2xhc3MgU2l0ZUZpbGVDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBTaXRlQ29udGVudFByb3ZpZGVyIHsKKwkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSVRFX1RZUEUgPSAib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmlsZSI7CSAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBDb25zdHJ1Y3RvciBmb3IgRmlsZVNpdGUKKwkgKi8KKwlwdWJsaWMgU2l0ZUZpbGVDb250ZW50UHJvdmlkZXIoVVJMIHVybCkgeworCQlzdXBlcih1cmwpOworCX0KK30KKworCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1NpdGVGaWxlRmFjdG9yeS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9TaXRlRmlsZUZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGRjNWNhCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9TaXRlRmlsZUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDQ0NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOworCitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuRmVhdHVyZUNvbnRlbnRQcm92aWRlcjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVGaWx0ZXI7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuQmFzZVNpdGVGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkNvbnRlbnRSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JU2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5KYXJDb250ZW50UmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlBsdWdpbkVudHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlNpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuU2l0ZUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5TaXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlV0aWxpdGllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC5BcmNoaXZlUmVmZXJlbmNlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuSW52YWxpZFNpdGVUeXBlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLlNpdGVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC5TaXRlTW9kZWxGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5tb2RlbC5CdW5kbGVNYW5pZmVzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwubW9kZWwuRGVmYXVsdFBsdWdpblBhcnNlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CisKK3B1YmxpYyBjbGFzcyBTaXRlRmlsZUZhY3RvcnkgZXh0ZW5kcyBCYXNlU2l0ZUZhY3RvcnkgeworCisJLy8gcHJpdmF0ZSB3aGVuIHBhcnNpbmcgZmlsZSBzeXN0ZW0KKwlwcml2YXRlIFNpdGVGaWxlIHNpdGU7CisKKwkvKgorCSAqIEBzZWUgSVNpdGVGYWN0b3J5I2NyZWF0ZVNpdGUoVVJMLGJvb2xlYW4pCisJICovCisJcHVibGljIElTaXRlIGNyZWF0ZVNpdGUoVVJMIHVybCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIEludmFsaWRTaXRlVHlwZUV4Y2VwdGlvbiB7CisKKwkJU2l0ZSBzaXRlID0gbnVsbDsKKwkJSW5wdXRTdHJlYW0gc2l0ZVN0cmVhbSA9IG51bGw7CisJCVNpdGVNb2RlbEZhY3RvcnkgZmFjdG9yeSA9IHRoaXM7CisKKwkJdHJ5IHsKKwkJCS8vIGlmIHVybCBwb2ludHMgdG8gYSBkaXJlY3RvcnkKKwkJCS8vIGF0dGVtcHQgdG8gcGFyc2Ugc2l0ZS54bWwKKwkJCVN0cmluZyBwYXRoID0gdXJsLmdldEZpbGUoKTsKKwkJCUZpbGUgc2l0ZUxvY2F0aW9uID0gbmV3IEZpbGUocGF0aCk7CisJCQlpZiAoc2l0ZUxvY2F0aW9uLmlzRGlyZWN0b3J5KCkpIHsKKwkJCQl1cmwgPSBzaXRlTG9jYXRpb24udG9VUkwoKTsKKwkJCQlGaWxlIHNpdGVYTUxGaWxlID0gbmV3IEZpbGUoc2l0ZUxvY2F0aW9uLCBTaXRlLlNJVEVfWE1MKTsKKwkJCQlpZiAoc2l0ZVhNTEZpbGUuZXhpc3RzKCkpIHsKKwkJCQkJc2l0ZVN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oc2l0ZVhNTEZpbGUpOworCQkJCQlzaXRlID0gKFNpdGUpIGZhY3RvcnkucGFyc2VTaXRlKHNpdGVTdHJlYW0pOworCQkJCX0gZWxzZSB7CisJCQkJCS8vIHBhcnNlIHNpdGVMb2NhdGlvbgorCQkJCQlzaXRlID0gcGFyc2VTaXRlKHNpdGVMb2NhdGlvbik7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQkvLyB3ZSBhcmUgbm90IHBvaW50aW5nIHRvIGEgZGlyZWN0b3J5CisJCQkJLy8gYXR0ZW1wdCB0byBwYXJzZSB0aGUgZmlsZQorCQkJCXRyeSB7CisJCQkJCVVSTCByZXNvbHZlZFVSTCA9IFVSTEVuY29kZXIuZW5jb2RlKHVybCk7CisJCQkJCXNpdGVTdHJlYW0gPSBvcGVuU3RyZWFtKHJlc29sdmVkVVJMKTsKKwkJCQkJc2l0ZSA9IChTaXRlKSBmYWN0b3J5LnBhcnNlU2l0ZShzaXRlU3RyZWFtKTsKKwkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisKKwkJCQkJLy8gYXR0ZW1wdCB0byBwYXJzZSBwYXJlbnQgZGlyZWN0b3J5CisJCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHVybC5nZXRGaWxlKCkpOworCQkJCQlGaWxlIHBhcmVudERpcmVjdG9yeSA9IGZpbGUuZ2V0UGFyZW50RmlsZSgpOworCisJCQkJCS8vIGRvIG5vdCBjcmVhdGUgZGlyZWN0b3J5IGlmIGl0IGRvZXNuJ3QgZXhpc3QJWzE4MzE4XQorCQkJCQkvLyBpbnN0ZWFkIGhyb3cgZXJyb3IJCQkJCQorCQkJCQlpZiAocGFyZW50RGlyZWN0b3J5ICE9IG51bGwgJiYgIXBhcmVudERpcmVjdG9yeS5leGlzdHMoKSkKKwkJCQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLlNpdGVGaWxlRmFjdG9yeV9EaXJlY3RvcnlEb2VzTm90RXhpc3QsIChuZXcgU3RyaW5nW10ge2ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCl9KSksIG51bGwpOworCisJCQkJCWlmIChwYXJlbnREaXJlY3RvcnkgPT0gbnVsbCB8fCAhcGFyZW50RGlyZWN0b3J5LmlzRGlyZWN0b3J5KCkpCisJCQkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5TaXRlRmlsZUZhY3RvcnlfVW5hYmxlVG9PYnRhaW5QYXJlbnREaXJlY3RvcnksIChuZXcgU3RyaW5nW10ge2ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCl9KSksIG51bGwpOworCisJCQkJCXNpdGUgPSBwYXJzZVNpdGUocGFyZW50RGlyZWN0b3J5KTsKKworCQkJCX0KKwkJCX0KKworCQkJU2l0ZUNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBuZXcgU2l0ZUZpbGVDb250ZW50UHJvdmlkZXIodXJsKTsKKwkJCXNpdGUuc2V0U2l0ZUNvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOworCQkJY29udGVudFByb3ZpZGVyLnNldFNpdGUoc2l0ZSk7CisJCQlzaXRlLnJlc29sdmUodXJsLCB1cmwpOworCisJCQkvLyBEbyBub3Qgc2V0IHJlYWQgb25seSBhcyBtYXkgaW5zdGFsbCBpbiBpdAorCQkJLy9zaXRlLm1hcmtSZWFkT25seSgpOworCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oTkxTLmJpbmQoTWVzc2FnZXMuU2l0ZUZpbGVGYWN0b3J5X1VuYWJsZVRvQ3JlYXRlVVJMLCAobmV3IFN0cmluZ1tdIHt1cmwgPT0gbnVsbCA/ICIiIDogdXJsLnRvRXh0ZXJuYWxGb3JtKCl9KSksIGUpOyAvLyROT04tTkxTLTEkCisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKE1lc3NhZ2VzLlNpdGVGaWxlRmFjdG9yeV9VbmFibGVUb0FjY2Vzc1NpdGUsIElTaXRlLlNJVEVfQUNDRVNTX0VYQ0VQVElPTiwgZSk7CisJCX0gZmluYWxseSB7CisJCQl0cnkgeworCQkJCWlmIChzaXRlU3RyZWFtICE9IG51bGwpCisJCQkJCXNpdGVTdHJlYW0uY2xvc2UoKTsKKwkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCX0KKwkJfQorCQlyZXR1cm4gc2l0ZTsKKwl9CisKKwkvKioKKwkgKiBNZXRob2QgcGFyc2VTaXRlLgorCSAqLworCXByaXZhdGUgU2l0ZSBwYXJzZVNpdGUoRmlsZSBkaXJlY3RvcnkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKworCQl0aGlzLnNpdGUgPSAoU2l0ZUZpbGUpIGNyZWF0ZVNpdGVNYXBNb2RlbCgpOworCisJCWlmICghZGlyZWN0b3J5LmV4aXN0cygpKQorCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oTkxTLmJpbmQoTWVzc2FnZXMuU2l0ZUZpbGVGYWN0b3J5X0ZpbGVEb2VzTm90RXhpc3QsIChuZXcgU3RyaW5nW10ge2RpcmVjdG9yeS5nZXRBYnNvbHV0ZVBhdGgoKX0pKSwgbnVsbCk7CisKKwkJRmlsZSBwbHVnaW5QYXRoID0gbmV3IEZpbGUoZGlyZWN0b3J5LCBTaXRlLkRFRkFVTFRfUExVR0lOX1BBVEgpOworCisJCS8vUEFDS0FHRUQKKwkJdHJ5IHsKKwkJCXBhcnNlUGFja2FnZWRGZWF0dXJlKGRpcmVjdG9yeSk7IC8vIGluIGNhc2UgaXQgY29udGFpbnMgSkFSIGZpbGVzCisJCX0gY2F0Y2ggKEVtcHR5RGlyZWN0b3J5RXhjZXB0aW9uIGVkZSkgeworCQkJVXBkYXRlQ29yZS5sb2coZWRlLmdldFN0YXR1cygpKTsKKwkJfQorCisJCXRyeSB7CisJCQlwYXJzZVBhY2thZ2VkUGx1Z2lucyhwbHVnaW5QYXRoKTsKKwkJfSBjYXRjaCAoRW1wdHlEaXJlY3RvcnlFeGNlcHRpb24gZWRlKSB7CisJCQlVcGRhdGVDb3JlLmxvZyhlZGUuZ2V0U3RhdHVzKCkpOworCQl9CisKKwkJLy8gSU5TVEFMTEVECisJCXRyeSB7CisJCQlwYXJzZUluc3RhbGxlZEZlYXR1cmUoZGlyZWN0b3J5KTsKKwkJfSBjYXRjaCAoRW1wdHlEaXJlY3RvcnlFeGNlcHRpb24gZWRlKSB7CisJCQlVcGRhdGVDb3JlLmxvZyhlZGUuZ2V0U3RhdHVzKCkpOworCQl9CisKKwkJdHJ5IHsKKwkJCXBhcnNlSW5zdGFsbGVkUGx1Z2lucyhwbHVnaW5QYXRoKTsKKwkJfSBjYXRjaCAoRW1wdHlEaXJlY3RvcnlFeGNlcHRpb24gZWRlKSB7CisJCQlVcGRhdGVDb3JlLmxvZyhlZGUuZ2V0U3RhdHVzKCkpOworCQl9CisKKwkJcmV0dXJuIHNpdGU7CisKKwl9CisKKwkvKioKKwkgKiBNZXRob2QgcGFyc2VGZWF0dXJlLgorCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgorCSAqLworCXByaXZhdGUgdm9pZCBwYXJzZUluc3RhbGxlZEZlYXR1cmUoRmlsZSBkaXJlY3RvcnkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKworCQlGaWxlIGZlYXR1cmVEaXIgPSBuZXcgRmlsZShkaXJlY3RvcnksIFNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRIKTsKKwkJaWYgKGZlYXR1cmVEaXIuZXhpc3RzKCkpIHsKKwkJCVN0cmluZ1tdIGRpcjsKKwkJCVNpdGVGZWF0dXJlUmVmZXJlbmNlTW9kZWwgZmVhdHVyZVJlZjsKKwkJCVVSTCBmZWF0dXJlVVJMOworCQkJRmlsZSBjdXJyZW50RmVhdHVyZURpcjsKKwkJCVN0cmluZyBuZXdGaWxlUGF0aCA9IG51bGw7CisKKwkJCXRyeSB7CisJCQkJLy8gaGFuZGxlIHRoZSBpbnN0YWxsZWQgZmVhdHVyZXNDb25maWd1cmVkIHVuZGVyIGZlYXR1cmVzQ29uZmlndXJlZCBzdWJkaXJlY3RvcnkKKwkJCQlkaXIgPSBmZWF0dXJlRGlyLmxpc3QoKTsKKwkJCQlpZiAoZGlyID09IG51bGwpIHsKKwkJCQkJdGhyb3cgbmV3IEVtcHR5RGlyZWN0b3J5RXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCBJU3RhdHVzLk9LLCBkaXJlY3RvcnkuZ2V0TmFtZSgpICsgRmlsZS5zZXBhcmF0b3IgKyBkaXJlY3RvcnkuZ2V0TmFtZSgpICsgImRpcmVjdG9yeSBpcyBlbXB0eSIsIG51bGwpKTsgLy8kTk9OLU5MUy0xJAorCQkJCX0KKwkJCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgZGlyLmxlbmd0aDsgaW5kZXgrKykgeworCisJCQkJCS8vIHRoZSBVUkwgbXVzdCBlbmRzIHdpdGggJy8nIGZvciB0aGUgYnVuZGxlIHRvIGJlIHJlc29sdmVkCisJCQkJCW5ld0ZpbGVQYXRoID0gZGlyW2luZGV4XSArIChkaXJbaW5kZXhdLmVuZHNXaXRoKCIvIikgPyAiLyIgOiAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJCWN1cnJlbnRGZWF0dXJlRGlyID0gbmV3IEZpbGUoZmVhdHVyZURpciwgbmV3RmlsZVBhdGgpOworCQkJCQkvLyBjaGVjayBpZiBmZWF0dXJlLnhtbCBleGlzdHMKKwkJCQkJRmlsZSBmZWF0dXJlWE1MRmlsZSA9IG5ldyBGaWxlKGN1cnJlbnRGZWF0dXJlRGlyLCBGZWF0dXJlLkZFQVRVUkVfWE1MKTsKKwkJCQkJaWYgKCFmZWF0dXJlWE1MRmlsZS5leGlzdHMoKSkgeworCQkJCQkJVXBkYXRlQ29yZS53YXJuKCJVbmFibGUgdG8gZmluZCBmZWF0dXJlLnhtbCBpbiBkaXJlY3Rvcnk6IiArIGN1cnJlbnRGZWF0dXJlRGlyKTsgLy8kTk9OLU5MUy0xJAorCQkJCQl9IGVsc2UgeworCQkJCQkJLy8gUEVSRjogcmVtb3ZlIGNvZGUKKwkJCQkJCS8vU2l0ZUZpbGVGYWN0b3J5IGFyY2hpdmVGYWN0b3J5ID0gbmV3IFNpdGVGaWxlRmFjdG9yeSgpOworCQkJCQkJZmVhdHVyZVVSTCA9IGN1cnJlbnRGZWF0dXJlRGlyLnRvVVJMKCk7CisJCQkJCQlmZWF0dXJlUmVmID0gY3JlYXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsKCk7CisJCQkJCQlmZWF0dXJlUmVmLnNldFNpdGVNb2RlbChzaXRlKTsKKwkJCQkJCWZlYXR1cmVSZWYuc2V0VVJMU3RyaW5nKGZlYXR1cmVVUkwudG9FeHRlcm5hbEZvcm0oKSk7CisJCQkJCQlmZWF0dXJlUmVmLnNldFR5cGUoSVNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9UWVBFKTsKKwkJCQkJCSgoU2l0ZSkgc2l0ZSkuYWRkRmVhdHVyZVJlZmVyZW5jZU1vZGVsKGZlYXR1cmVSZWYpOworCQkJCQl9CisJCQkJfQorCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKwkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5TaXRlRmlsZUZhY3RvcnlfVW5hYmxlVG9DcmVhdGVVUkxGb3JGaWxlLCAobmV3IFN0cmluZ1tdIHtuZXdGaWxlUGF0aH0pKSwgZSk7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkqIE1ldGhvZCBwYXJzZUZlYXR1cmUuCisJKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KKwkqLworCXByaXZhdGUgdm9pZCBwYXJzZVBhY2thZ2VkRmVhdHVyZShGaWxlIGRpcmVjdG9yeSkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCisJCS8vIEZFQVRVUkVTCisJCUZpbGUgZmVhdHVyZURpciA9IG5ldyBGaWxlKGRpcmVjdG9yeSwgU2l0ZS5ERUZBVUxUX0ZFQVRVUkVfUEFUSCk7CisJCWlmIChmZWF0dXJlRGlyLmV4aXN0cygpKSB7CisJCQlTdHJpbmdbXSBkaXI7CisJCQlTaXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsIGZlYXR1cmVSZWY7CisJCQlVUkwgZmVhdHVyZVVSTDsKKwkJCUZpbGUgY3VycmVudEZlYXR1cmVGaWxlOworCQkJU3RyaW5nIG5ld0ZpbGVQYXRoID0gbnVsbDsKKworCQkJdHJ5IHsKKwkJCQkvLyBvbmx5IGxpc3QgSkFSIGZpbGVzCisJCQkJZGlyID0gZmVhdHVyZURpci5saXN0KEZlYXR1cmVQYWNrYWdlZENvbnRlbnRQcm92aWRlci5maWx0ZXIpOworCQkJCWlmIChkaXIgPT0gbnVsbCkgeworCQkJCQl0aHJvdyBuZXcgRW1wdHlEaXJlY3RvcnlFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIElTdGF0dXMuT0ssIGRpcmVjdG9yeS5nZXROYW1lKCkgKyBGaWxlLnNlcGFyYXRvciArIGRpcmVjdG9yeS5nZXROYW1lKCkgKyAiZGlyZWN0b3J5IGlzIGVtcHR5IiwgbnVsbCkpOyAvLyROT04tTkxTLTEkCisJCQkJfQorCisJCQkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IGRpci5sZW5ndGg7IGluZGV4KyspIHsKKworCQkJCQkvLyBjaGVjayBpZiB0aGUgSkFSIGZpbGUgY29udGFpbnMgYSBmZWF0dXJlLnhtbAorCQkJCQljdXJyZW50RmVhdHVyZUZpbGUgPSBuZXcgRmlsZShmZWF0dXJlRGlyLCBkaXJbaW5kZXhdKTsKKwkJCQkJSmFyQ29udGVudFJlZmVyZW5jZSByZWYgPSBuZXcgSmFyQ29udGVudFJlZmVyZW5jZSgiIiwgY3VycmVudEZlYXR1cmVGaWxlKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlDb250ZW50UmVmZXJlbmNlIHJlc3VsdCA9IG51bGw7CisJCQkJCXRyeSB7CisJCQkJCQlyZXN1bHQgPSByZWYucGVlayhGZWF0dXJlLkZFQVRVUkVfWE1MLCBudWxsLCBudWxsKTsKKwkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCQkJVXBkYXRlQ29yZS53YXJuKCJFeGNlcHRpb24gcmV0cmlldmluZyBmZWF0dXJlLnhtbCBpbiBmaWxlOiIgKyBjdXJyZW50RmVhdHVyZUZpbGUsIGUpOyAvLyROT04tTkxTLTEkCisJCQkJCX0KKwkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7CisJCQkJCQlVcGRhdGVDb3JlLndhcm4oIlVuYWJsZSB0byBmaW5kIGZlYXR1cmUueG1sIGluIGZpbGU6IiArIGN1cnJlbnRGZWF0dXJlRmlsZSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWZlYXR1cmVVUkwgPSBjdXJyZW50RmVhdHVyZUZpbGUudG9VUkwoKTsKKwkJCQkJCS8vIFBFUkY6IHJlbW92ZSBjb2RlCisJCQkJCQkvL1NpdGVGaWxlRmFjdG9yeSBhcmNoaXZlRmFjdG9yeSA9IG5ldyBTaXRlRmlsZUZhY3RvcnkoKTsKKwkJCQkJCWZlYXR1cmVSZWYgPSBjcmVhdGVGZWF0dXJlUmVmZXJlbmNlTW9kZWwoKTsKKwkJCQkJCWZlYXR1cmVSZWYuc2V0U2l0ZU1vZGVsKHNpdGUpOworCQkJCQkJZmVhdHVyZVJlZi5zZXRVUkxTdHJpbmcoZmVhdHVyZVVSTC50b0V4dGVybmFsRm9ybSgpKTsKKwkJCQkJCWZlYXR1cmVSZWYuc2V0VHlwZShJU2l0ZS5ERUZBVUxUX1BBQ0tBR0VEX0ZFQVRVUkVfVFlQRSk7CisJCQkJCQlzaXRlLmFkZEZlYXR1cmVSZWZlcmVuY2VNb2RlbChmZWF0dXJlUmVmKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisJCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oTkxTLmJpbmQoTWVzc2FnZXMuU2l0ZUZpbGVGYWN0b3J5X1VuYWJsZVRvQ3JlYXRlVVJMRm9yRmlsZSwgKG5ldyBTdHJpbmdbXSB7bmV3RmlsZVBhdGh9KSksIGUpOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogTWV0aG9kIHBhcnNlUGx1Z2lucy4KKwkgKiAKKwkgKiBsb29rIGludG8gZWFjaCBwbHVnaW4vZnJhZ21lbnQgZGlyZWN0b3J5LCBjcmFjayB0aGUgcGx1Z2luLnhtbCBvcGVuIChvcgorCSAqIGZyYWdtZW50LnhtbCA/Pz8pIGdldCBpZCBhbmQgdmVyc2lvbiwgY2FsY3VsYXRlIFVSTC4uLgorCSAqIAorCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgorCSAqLworCXByaXZhdGUgdm9pZCBwYXJzZUluc3RhbGxlZFBsdWdpbnMoRmlsZSBwbHVnaW5zRGlyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCWlmICghcGx1Z2luc0Rpci5leGlzdHMoKSB8fCAhcGx1Z2luc0Rpci5pc0RpcmVjdG9yeSgpKSB7CisJCQlyZXR1cm47CisJCX0KKwkJRmlsZVtdIGRpcnMgPSBwbHVnaW5zRGlyLmxpc3RGaWxlcyhuZXcgRmlsZUZpbHRlcigpIHsKKwkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGYpIHsKKwkJCQlyZXR1cm4gZi5pc0RpcmVjdG9yeSgpOworCQkJfQorCQl9KTsKKwkJRGVmYXVsdFBsdWdpblBhcnNlciBwYXJzZXIgPSBuZXcgRGVmYXVsdFBsdWdpblBhcnNlcigpOworCisJCWlmIChkaXJzID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBFbXB0eURpcmVjdG9yeUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgSVN0YXR1cy5PSywgcGx1Z2luc0Rpci5nZXROYW1lKCkgKyBGaWxlLnNlcGFyYXRvciArIHBsdWdpbnNEaXIuZ2V0TmFtZSgpICsgImRpcmVjdG9yeSBpcyBlbXB0eSIsIG51bGwpKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCWZvciAoaW50IGkgPSAwOyBpIDwgZGlycy5sZW5ndGg7IGkrKykgeworCQkJRmlsZSBwbHVnaW5GaWxlID0gbmV3IEZpbGUoZGlyc1tpXSwgIk1FVEEtSU5GL01BTklGRVNULk1GIik7IC8vJE5PTi1OTFMtMSQKKwkJCUlucHV0U3RyZWFtIGluID0gbnVsbDsKKwkJCXRyeSB7CisJCQkJQnVuZGxlTWFuaWZlc3QgYnVuZGxlTWFuaWZlc3QgPSBuZXcgQnVuZGxlTWFuaWZlc3QocGx1Z2luRmlsZSk7CisJCQkJaWYgKGJ1bmRsZU1hbmlmZXN0LmV4aXN0cygpKSB7CisJCQkJCVBsdWdpbkVudHJ5IGVudHJ5ID0gYnVuZGxlTWFuaWZlc3QuZ2V0UGx1Z2luRW50cnkoKTsKKwkJCQkJYWRkUGFyc2VkUGx1Z2luKGVudHJ5LCBkaXJzW2ldKTsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoIShwbHVnaW5GaWxlID0gbmV3IEZpbGUoZGlyc1tpXSwgInBsdWdpbi54bWwiKSkgLy8kTk9OLU5MUy0xJAorCQkJCQkJCS5leGlzdHMoKSkgeworCQkJCQkJcGx1Z2luRmlsZSA9IG5ldyBGaWxlKGRpcnNbaV0sICJmcmFnbWVudC54bWwiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQl9CisJCQkJCWlmIChwbHVnaW5GaWxlICE9IG51bGwgJiYgcGx1Z2luRmlsZS5leGlzdHMoKSAmJiAhcGx1Z2luRmlsZS5pc0RpcmVjdG9yeSgpKSB7CisJCQkJCQlpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ocGx1Z2luRmlsZSk7CisJCQkJCQlQbHVnaW5FbnRyeSBlbnRyeSA9IHBhcnNlci5wYXJzZShpbik7CisJCQkJCQlhZGRQYXJzZWRQbHVnaW4oZW50cnksIGRpcnNbaV0pOworCQkJCQl9CisJCQkJfQorCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCVN0cmluZyBwbHVnaW5GaWxlU3RyaW5nID0gKHBsdWdpbkZpbGUgPT0gbnVsbCkgPyBudWxsIDogcGx1Z2luRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKKwkJCQlVcGRhdGVDb3JlLmxvZyhVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5TaXRlRmlsZUZhY3RvcnlfRXJyb3JBY2Nlc3NpbmcsIChuZXcgU3RyaW5nW10ge3BsdWdpbkZpbGVTdHJpbmd9KSksIGUpKTsKKwkJCX0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7CisJCQkJU3RyaW5nIHBsdWdpbkZpbGVTdHJpbmcgPSAocGx1Z2luRmlsZSA9PSBudWxsKSA/IG51bGwgOiBwbHVnaW5GaWxlLmdldEFic29sdXRlUGF0aCgpOworCQkJCVVwZGF0ZUNvcmUubG9nKFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLlNpdGVGaWxlRmFjdG9yeV9FcnJvclBhcnNpbmdGaWxlLCAobmV3IFN0cmluZ1tdIHtwbHVnaW5GaWxlU3RyaW5nfSkpLCBlKSk7CisJCQl9IGZpbmFsbHkgeworCQkJCWlmIChpbiAhPSBudWxsKSB7CisJCQkJCXRyeSB7CisJCQkJCQlpbi5jbG9zZSgpOworCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiB0cmFuc2Zvcm0gZWFjaCBQbHVnaW4gYW5kIEZyYWdtZW50IGludG8gYW4gQXJjaGl2ZVJlZmVyZW5jZU1vZGVsCisJICogYW5kIGEgUGx1Z2luRW50cnkgZm9yIHRoZSBTaXRlCSAKKwkgKi8KKwkvLyBQRVJGOiByZW1vdmVkIGludGVybWVkaWF0ZSBQbHVnaW4gb2JqZWN0CisJcHJpdmF0ZSB2b2lkIGFkZFBhcnNlZFBsdWdpbihQbHVnaW5FbnRyeSBlbnRyeSwgRmlsZSBmaWxlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisKKwkJU3RyaW5nIGxvY2F0aW9uID0gbnVsbDsKKwkJdHJ5IHsKKwkJCWlmIChlbnRyeSAhPSBudWxsKSB7CisKKwkJCQkvLyBjcmVhdGUgdGhlIHBsdWdpbiBFbnRyeQorCQkJCSgoU2l0ZSkgc2l0ZSkuYWRkUGx1Z2luRW50cnkoZW50cnkpOworCisJCQkJLy8gQ3JlYXRlIHRoZSBTaXRlIG1hcHBpbmcgQXJjaGl2ZVJlZi0+UGx1Z2luRW50cnkKKwkJCQkvLyB0aGUgaWQgb2YgdGhlIGFyY2hpdmVSZWYgaXMgcGx1Z2luc1w8cGx1Z2luaWQ+Xzx2ZXI+LmphciBhcyBwZXIgdGhlIHNwZWNzCisJCQkJLy8gUEVSRjogcmVtb3ZlIGNvZGUKKwkJCQkvL1NpdGVGaWxlRmFjdG9yeSBhcmNoaXZlRmFjdG9yeSA9IG5ldyBTaXRlRmlsZUZhY3RvcnkoKTsJCQkJCisJCQkJQXJjaGl2ZVJlZmVyZW5jZU1vZGVsIGFyY2hpdmUgPSBjcmVhdGVBcmNoaXZlUmVmZXJlbmNlTW9kZWwoKTsKKwkJCQlTdHJpbmcgaWQgPSAoZW50cnkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpOworCQkJCVN0cmluZyBwbHVnaW5JRCA9IFNpdGUuREVGQVVMVF9QTFVHSU5fUEFUSCArIGlkICsgRmVhdHVyZUNvbnRlbnRQcm92aWRlci5KQVJfRVhURU5TSU9OOworCQkJCWFyY2hpdmUuc2V0UGF0aChwbHVnaW5JRCk7CisJCQkJbG9jYXRpb24gPSBmaWxlLnRvVVJMKCkudG9FeHRlcm5hbEZvcm0oKTsKKwkJCQlhcmNoaXZlLnNldFVSTFN0cmluZyhsb2NhdGlvbik7CisJCQkJKChTaXRlKSBzaXRlKS5hZGRBcmNoaXZlUmVmZXJlbmNlTW9kZWwoYXJjaGl2ZSk7CisKKwkJCQkvLyBUUkFDRQkJCQkKKwkJCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfUEFSU0lORykgeworCQkJCQlVcGRhdGVDb3JlLmRlYnVnKCJBZGRlZCBhcmNoaXZlIHRvIHNpdGU6IiArIHBsdWdpbklEICsgIiBwb2ludGluZyB0bzogIiArIGxvY2F0aW9uKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJfQorCQkJfQorCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oTkxTLmJpbmQoTWVzc2FnZXMuU2l0ZUZpbGVGYWN0b3J5X1VuYWJsZVRvQ3JlYXRlVVJMRm9yRmlsZSwgKG5ldyBTdHJpbmdbXSB7bG9jYXRpb259KSksIGUpOworCQl9CisJfQorCisJLyoqCisJICogIAorCSAqLworCXByaXZhdGUgdm9pZCBwYXJzZVBhY2thZ2VkUGx1Z2lucyhGaWxlIHBsdWdpbkRpcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlpZiAoIXBsdWdpbkRpci5leGlzdHMoKSkgeworCQkJcmV0dXJuOworCQl9CisJCVN0cmluZ1tdIGRpciA9IHBsdWdpbkRpci5saXN0KEZlYXR1cmVQYWNrYWdlZENvbnRlbnRQcm92aWRlci5maWx0ZXIpOworCisJCWlmIChkaXIgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IEVtcHR5RGlyZWN0b3J5RXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCBJU3RhdHVzLk9LLCBwbHVnaW5EaXIuZ2V0TmFtZSgpICsgRmlsZS5zZXBhcmF0b3IgKyBwbHVnaW5EaXIuZ2V0TmFtZSgpICsgImRpcmVjdG9yeSBpcyBlbXB0eSIsIG51bGwpKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCWZvciAoaW50IGkgPSAwOyBpIDwgZGlyLmxlbmd0aDsgaSsrKSB7CisJCQlDb250ZW50UmVmZXJlbmNlIHJlZiA9IG51bGw7CisJCQlTdHJpbmcgcmVmU3RyaW5nID0gbnVsbDsKKwkJCUlucHV0U3RyZWFtIGluID0gbnVsbDsKKwkJCUphckNvbnRlbnRSZWZlcmVuY2UgamFyUmVmZXJlbmNlID0gbnVsbDsKKwkJCXRyeSB7CisJCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUocGx1Z2luRGlyLCBkaXJbaV0pOworCQkJCWphclJlZmVyZW5jZSA9IG5ldyBKYXJDb250ZW50UmVmZXJlbmNlKG51bGwsIGZpbGUpOworCQkJCXJlZiA9IGphclJlZmVyZW5jZS5wZWVrKCJNRVRBLUlORi9NQU5JRkVTVC5NRiIsIG51bGwsIG51bGwpOyAvLyROT04tTkxTLTEkCisJCQkJaWYgKHJlZiAhPSBudWxsKSB7CisJCQkJCWluID0gcmVmLmdldElucHV0U3RyZWFtKCk7CisJCQkJCUJ1bmRsZU1hbmlmZXN0IG1hbmlmZXN0ID0gbmV3IEJ1bmRsZU1hbmlmZXN0KGluKTsKKwkJCQkJaWYgKG1hbmlmZXN0LmV4aXN0cygpKSB7CisKKwkJCQkJCWFkZFBhcnNlZFBsdWdpbihtYW5pZmVzdC5nZXRQbHVnaW5FbnRyeSgpLCBmaWxlKTsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisJCQkJfQorCQkJCXJlZiA9IGphclJlZmVyZW5jZS5wZWVrKCJwbHVnaW4ueG1sIiwgbnVsbCwgbnVsbCk7Ly8kTk9OLU5MUy0xJAorCQkJCWlmIChyZWYgPT0gbnVsbCkgeworCQkJCQlyZWYgPSBqYXJSZWZlcmVuY2UucGVlaygiZnJhZ21lbnQueG1sIiwgbnVsbCwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKKwkJCQl9CisJCQkJaWYgKHJlZiAhPSBudWxsKSB7CisJCQkJCWluID0gcmVmLmdldElucHV0U3RyZWFtKCk7CisJCQkJCVBsdWdpbkVudHJ5IGVudHJ5ID0gbmV3IERlZmF1bHRQbHVnaW5QYXJzZXIoKS5wYXJzZShpbik7CisJCQkJCWFkZFBhcnNlZFBsdWdpbihlbnRyeSwgZmlsZSk7CisJCQkJfQorCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQl0cnkgeworCQkJCQlyZWZTdHJpbmcgPSAocmVmID09IG51bGwpID8gbnVsbCA6IHJlZi5hc1VSTCgpLnRvRXh0ZXJuYWxGb3JtKCk7CisJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisJCQkJfQorCisJCQkJU3RyaW5nIG1lc3NhZ2U7CisKKwkJCQlpZiAoZSBpbnN0YW5jZW9mIElPRXhjZXB0aW9uKSB7CisJCQkJCW1lc3NhZ2UgPSBOTFMuYmluZChNZXNzYWdlcy5TaXRlRmlsZUZhY3RvcnlfRXJyb3JBY2Nlc3NpbmcsIChuZXcgU3RyaW5nW10ge3JlZlN0cmluZ30pKTsKKwkJCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBTQVhFeGNlcHRpb24pIHsKKwkJCQkJbWVzc2FnZSA9IE5MUy5iaW5kKE1lc3NhZ2VzLlNpdGVGaWxlRmFjdG9yeV9FcnJvclBhcnNpbmdGaWxlLCAobmV3IFN0cmluZ1tdIHtyZWZTdHJpbmd9KSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJbWVzc2FnZSA9IE5MUy5iaW5kKE1lc3NhZ2VzLlNpdGVGaWxlRmFjdG9yeV9FcnJvckFjY2Vzc2luZywgKG5ldyBTdHJpbmdbXSB7cmVmU3RyaW5nfSkpOworCQkJCX0vLyBlbmQgaWYKKworCQkJCS8vIExvZyBleGNlcHRpb24sIGJ1dCBkbyBub3QgdGhyb3cgdG8gY2FsbGVyLgorCQkJCS8vIENvbnRpbnVlIHdpdGggcHJvY2Vzc2luZyByZW1haW5pbmcgcGx1Zy1pbnMKKwkJCQlVcGRhdGVDb3JlLmxvZyhtZXNzYWdlLCBlKTsKKwkJCX0gZmluYWxseSB7CisJCQkJaWYgKGluICE9IG51bGwpIHsKKwkJCQkJdHJ5IHsKKwkJCQkJCWluLmNsb3NlKCk7CisJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGNlKSB7CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKGphclJlZmVyZW5jZSAhPSBudWxsKSB7CisJCQkJCXRyeSB7CisJCQkJCQlqYXJSZWZlcmVuY2UuY2xvc2VBcmNoaXZlKCk7CisJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKKwkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwkvKgorCSAqIEBzZWUgU2l0ZU1vZGVsRmFjdG9yeSNjcmVhdGVTaXRlTWFwTW9kZWwoKQorCSAqLworCXB1YmxpYyBTaXRlTW9kZWwgY3JlYXRlU2l0ZU1hcE1vZGVsKCkgeworCQlyZXR1cm4gbmV3IFNpdGVGaWxlKCk7CisJfQorCisJLyoKKwkgKiBAc2VlIFNpdGVNb2RlbEZhY3RvcnkjY2FuUGFyc2VTaXRlVHlwZShTdHJpbmcpCisJICovCisJcHVibGljIGJvb2xlYW4gY2FuUGFyc2VTaXRlVHlwZShTdHJpbmcgdHlwZSkgeworCQlyZXR1cm4gKHN1cGVyLmNhblBhcnNlU2l0ZVR5cGUodHlwZSkgfHwgU2l0ZUZpbGVDb250ZW50UHJvdmlkZXIuU0lURV9UWVBFLmVxdWFsc0lnbm9yZUNhc2UodHlwZSkpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9TaXRlRmlsZU5vblBsdWdpbkNvbnRlbnRDb25zdW1lci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9TaXRlRmlsZU5vblBsdWdpbkNvbnRlbnRDb25zdW1lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkYmZkNTgKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1NpdGVGaWxlTm9uUGx1Z2luQ29udGVudENvbnN1bWVyLmphdmEKQEAgLTAsMCArMSw3NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOworaW1wb3J0IGphdmEuaW8uKjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKKworLyoqCisgKiBQbHVnaW4gQ29udGVudCBDb25zdW1lciBvbiBhIFNpdGUKKyAqLworcHVibGljIGNsYXNzIFNpdGVGaWxlTm9uUGx1Z2luQ29udGVudENvbnN1bWVyIGV4dGVuZHMgQ29udGVudENvbnN1bWVyIHsKKworCXByaXZhdGUgU3RyaW5nIHBhdGg7CisJcHJpdmF0ZSBib29sZWFuIGNsb3NlZCA9IGZhbHNlOworCisJLyoKKwkgKiBDb25zdHJ1Y3RvciAKKwkgKi8KKwlwdWJsaWMgU2l0ZUZpbGVOb25QbHVnaW5Db250ZW50Q29uc3VtZXIoU3RyaW5nIGZlYXR1cmVQYXRoKSB7CisJCXRoaXMucGF0aCA9IGZlYXR1cmVQYXRoOworCX0KKworCS8qCisJICogQHNlZSBJU2l0ZUNvbnRlbnRDb25zdW1lciNzdG9yZShDb250ZW50UmVmZXJlbmNlLCBJUHJvZ3Jlc3NNb25pdG9yKQorCSAqLworCXB1YmxpYyB2b2lkIHN0b3JlKENvbnRlbnRSZWZlcmVuY2UgY29udGVudFJlZmVyZW5jZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisKKwkJaWYgKGNsb3NlZCkgeworCQkJVXBkYXRlQ29yZS53YXJuKCJBdHRlbXB0IHRvIHN0b3JlIGluIGEgY2xvc2VkIFNpdGVGaWxlTm9uUGx1Z2luQ29udGVudENvbnN1bWVyIiwgbmV3IEV4Y2VwdGlvbigpKTsgLy8kTk9OLU5MUy0xJAorCQkJcmV0dXJuOworCQl9CisKKwkJSW5wdXRTdHJlYW0gaW5TdHJlYW0gPSBudWxsOworCQlTdHJpbmcgZmVhdHVyZVBhdGggPSBwYXRoOworCQlTdHJpbmcgY29udGVudEtleSA9IGNvbnRlbnRSZWZlcmVuY2UuZ2V0SWRlbnRpZmllcigpOworCQlmZWF0dXJlUGF0aCArPSBjb250ZW50S2V5OworCQl0cnkgeworCQkJaW5TdHJlYW0gPSBjb250ZW50UmVmZXJlbmNlLmdldElucHV0U3RyZWFtKCk7CisJCQlVcGRhdGVNYW5hZ2VyVXRpbHMuY29weVRvTG9jYWwoaW5TdHJlYW0sIGZlYXR1cmVQYXRoLCBudWxsKTsKKwkJCVVwZGF0ZU1hbmFnZXJVdGlscy5jaGVja1Blcm1pc3Npb25zKGNvbnRlbnRSZWZlcmVuY2UsIGZlYXR1cmVQYXRoKTsgLy8gMjAzMDUKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oTkxTLmJpbmQoTWVzc2FnZXMuR2xvYmFsQ29uc3VtZXJfRXJyb3JDcmVhdGluZ0ZpbGUsIChuZXcgU3RyaW5nW10geyBmZWF0dXJlUGF0aCB9KSksIGUpOworCQl9IGZpbmFsbHkgeworCQkJaWYgKGluU3RyZWFtICE9IG51bGwpIHsKKwkJCQl0cnkgeworCQkJCQkvLyBjbG9zZSBzdHJlYW0KKwkJCQkJaW5TdHJlYW0uY2xvc2UoKTsKKwkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJfQorCQkJfQorCQl9CisKKwl9CisKKwkvKgorCSAqIEBzZWUgSVNpdGVDb250ZW50Q29uc3VtZXIjY2xvc2UoKQorCSAqLworCXB1YmxpYyB2b2lkIGNsb3NlKCkgeworCQlpZiAoY2xvc2VkKSB7CisJCQlVcGRhdGVDb3JlLndhcm4oIkF0dGVtcHQgdG8gY2xvc2UgYSBjbG9zZWQgU2l0ZUZpbGVOb25QbHVnaW5Db250ZW50Q29uc3VtZXIiLCBuZXcgRXhjZXB0aW9uKCkpOyAvLyROT04tTkxTLTEkCisJCQlyZXR1cm47CisJCX0KKwkJY2xvc2VkID0gdHJ1ZTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvU2l0ZUZpbGVQYWNrZWRQbHVnaW5Db250ZW50Q29uc3VtZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvU2l0ZUZpbGVQYWNrZWRQbHVnaW5Db250ZW50Q29uc3VtZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjY1MjI1Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9TaXRlRmlsZVBhY2tlZFBsdWdpbkNvbnRlbnRDb25zdW1lci5qYXZhCkBAIC0wLDAgKzEsMTM1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7CitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEubmV0Lio7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7CisKKy8qKgorICogUGx1Z2luIENvbnRlbnQgQ29uc3VtZXIgb24gYSBTaXRlCisgKiBmb3IgYSBwbHVnaW4gdGhhdCB3aWxsIHJ1biBmcm9tIGEgamFyCisgKi8KK3B1YmxpYyBjbGFzcyBTaXRlRmlsZVBhY2tlZFBsdWdpbkNvbnRlbnRDb25zdW1lciBleHRlbmRzIENvbnRlbnRDb25zdW1lciB7CisKKwlwcml2YXRlIElQbHVnaW5FbnRyeSBwbHVnaW5FbnRyeTsKKwlwcml2YXRlIElTaXRlIHNpdGU7CisJcHJpdmF0ZSBib29sZWFuIGNsb3NlZCA9IGZhbHNlOworCXByaXZhdGUgU3RyaW5nIGphclBhdGg7CisJcHJpdmF0ZSBTdHJpbmcgdGVtcFBhdGg7CisKKwkvKgorCSAqIENvbnN0cnVjdG9yCisJICovCisJcHVibGljIFNpdGVGaWxlUGFja2VkUGx1Z2luQ29udGVudENvbnN1bWVyKElQbHVnaW5FbnRyeSBwbHVnaW5FbnRyeSwgSVNpdGUgc2l0ZSkgeworCQl0aGlzLnBsdWdpbkVudHJ5ID0gcGx1Z2luRW50cnk7CisJCXRoaXMuc2l0ZSA9IHNpdGU7CisJfQorCisJLyoKKwkgKiBAc2VlIElTaXRlQ29udGVudENvbnN1bWVyI3N0b3JlKENvbnRlbnRSZWZlcmVuY2UsIElQcm9ncmVzc01vbml0b3IpCisJICovCisJcHVibGljIHZvaWQgc3RvcmUoQ29udGVudFJlZmVyZW5jZSBjb250ZW50UmVmZXJlbmNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJSW5wdXRTdHJlYW0gaW5TdHJlYW0gPSBudWxsOworCisJCWlmIChjbG9zZWQpIHsKKwkJCVVwZGF0ZUNvcmUud2FybigiQXR0ZW1wdCB0byBzdG9yZSBpbiBhIGNsb3NlZCBTaXRlRmlsZVBsdWdpbkNvbnRlbnRDb25zdW1lciIsIG5ldyBFeGNlcHRpb24oKSk7IC8vJE5PTi1OTFMtMSQKKwkJCXJldHVybjsKKwkJfQorCisJCXRyeSB7CisJCQlVUkwgbmV3VVJMID0gbmV3IFVSTChzaXRlLmdldFVSTCgpLCBTaXRlLkRFRkFVTFRfUExVR0lOX1BBVEggKyBwbHVnaW5FbnRyeS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSArICIuamFyIik7IC8vJE5PTi1OTFMtMSQKKwkJCWluU3RyZWFtID0gY29udGVudFJlZmVyZW5jZS5nZXRJbnB1dFN0cmVhbSgpOworCQkJamFyUGF0aCA9IG5ld1VSTC5nZXRGaWxlKCkucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJyk7CisJCQlGaWxlIGphckZpbGUgPSBuZXcgRmlsZShqYXJQYXRoKTsKKwkJCWlmIChqYXJGaWxlLmV4aXN0cygpKSB7CisJCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oTkxTLmJpbmQoTWVzc2FnZXMuVXBkYXRlTWFuYWdlclV0aWxzX0ZpbGVBbHJlYWR5RXhpc3RzLCAobmV3IE9iamVjdFtdIHsgamFyRmlsZSB9KSksIG51bGwpOworCQkJfQorCQkJLy8gZXJyb3IgcmVjb3ZlcnkKKwkJCXRlbXBQYXRoPSBFcnJvclJlY292ZXJ5TG9nLmdldExvY2FsUmFuZG9tSWRlbnRpZmllcihqYXJQYXRoKyIudG1wIik7IC8vJE5PTi1OTFMtMSQKKwkJCQlFcnJvclJlY292ZXJ5TG9nLmdldExvZygpLmFwcGVuZFBhdGgoRXJyb3JSZWNvdmVyeUxvZy5CVU5ETEVfSkFSX0VOVFJZLCB0ZW1wUGF0aCk7CisJCQkvLworCQkJVXBkYXRlTWFuYWdlclV0aWxzLmNvcHlUb0xvY2FsKGluU3RyZWFtLCB0ZW1wUGF0aCwgbnVsbCk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLkdsb2JhbENvbnN1bWVyX0Vycm9yQ3JlYXRpbmdGaWxlLCAobmV3IFN0cmluZ1tdIHsgdGVtcFBhdGggfSkpLCBlKTsKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChpblN0cmVhbSAhPSBudWxsKSB7CisJCQkJdHJ5IHsKKwkJCQkJLy8gY2xvc2Ugc3RyZWFtCisJCQkJCWluU3RyZWFtLmNsb3NlKCk7CisJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCS8qCisJICogQHNlZSBJU2l0ZUNvbnRlbnRDb25zdW1lciNjbG9zZSgpIAorCSAqLworCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCisJCWlmIChjbG9zZWQpIHsKKwkJCVVwZGF0ZUNvcmUud2FybigiQXR0ZW1wdCB0byBjbG9zZSBhIGNsb3NlZCBTaXRlRmlsZVBsdWdpbkNvbnRlbnRDb25zdW1lciIsIG5ldyBFeGNlcHRpb24oKSk7IC8vJE5PTi1OTFMtMSQKKwkJCXJldHVybjsKKwkJfQorCisJCWlmICh0ZW1wUGF0aCAhPSBudWxsKSB7CisJCQkvLyByZW5hbWUgZmlsZSAKKwkJCUVycm9yUmVjb3ZlcnlMb2cuZ2V0TG9nKCkuYXBwZW5kUGF0aChFcnJvclJlY292ZXJ5TG9nLlJFTkFNRV9FTlRSWSwgdGVtcFBhdGgpOworCQkJRmlsZSBmaWxlVG9SZW5hbWUgPSBuZXcgRmlsZSh0ZW1wUGF0aCk7CisJCQlib29sZWFuIHN1Y2VzcyA9IGZhbHNlOworCQkJaWYgKGZpbGVUb1JlbmFtZS5leGlzdHMoKSkgeworCQkJCUZpbGUgcmVuYW1lZEZpbGUgPSBuZXcgRmlsZShqYXJQYXRoKTsKKwkJCQlzdWNlc3MgPSBmaWxlVG9SZW5hbWUucmVuYW1lVG8ocmVuYW1lZEZpbGUpOworCQkJfQorCQkJaWYgKCFzdWNlc3MpIHsKKwkJCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoTWVzc2FnZXMuQ29udGVudENvbnN1bWVyX1VuYWJsZVRvUmVuYW1lLCAobmV3IFN0cmluZ1tdIHsgdGVtcFBhdGgsIGphclBhdGggfSkpOworCQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKG1zZywgbmV3IEV4Y2VwdGlvbihtc2cpKTsKKwkJCX0KKwkJfQorCisJCWlmIChzaXRlIGluc3RhbmNlb2YgU2l0ZUZpbGUpCisJCQkgKChTaXRlRmlsZSkgc2l0ZSkuYWRkUGx1Z2luRW50cnkocGx1Z2luRW50cnkpOworCQljbG9zZWQgPSB0cnVlOworCX0KKworCS8qCisJICogCisJICovCisJcHVibGljIHZvaWQgYWJvcnQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisKKwkJaWYgKGNsb3NlZCkgeworCQkJVXBkYXRlQ29yZS53YXJuKCJBdHRlbXB0IHRvIGFib3J0IGEgY2xvc2VkIFNpdGVGaWxlUGx1Z2luQ29udGVudENvbnN1bWVyIiwgbmV3IEV4Y2VwdGlvbigpKTsgLy8kTk9OLU5MUy0xJAorCQkJcmV0dXJuOworCQl9CisKKwkJYm9vbGVhbiBzdWNlc3MgPSB0cnVlOworCisJCS8vIGRlbGV0ZSBwbHVnaW4uamFyCisJCWlmIChqYXJQYXRoICE9IG51bGwpIHsKKwkJCUVycm9yUmVjb3ZlcnlMb2cuZ2V0TG9nKCkuYXBwZW5kUGF0aChFcnJvclJlY292ZXJ5TG9nLkRFTEVURV9FTlRSWSwgamFyUGF0aCk7CisJCQlGaWxlIGZpbGVUb1JlbW92ZSA9IG5ldyBGaWxlKGphclBhdGgpOworCisJCQlpZiAoZmlsZVRvUmVtb3ZlLmV4aXN0cygpKSB7CisJCQkJc3VjZXNzID0gZmlsZVRvUmVtb3ZlLmRlbGV0ZSgpOworCQkJfQorCQl9CisKKwkJaWYgKCFzdWNlc3MpIHsKKwkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChNZXNzYWdlcy5TaXRlRmlsZVBhY2tlZFBsdWdpbkNvbnRlbnRDb25zdW1lcl91bmFibGVUb0RlbGV0ZSwgKG5ldyBTdHJpbmdbXSB7IGphclBhdGggfSkpOyAKKwkJCVVwZGF0ZUNvcmUubG9nKG1zZywgbnVsbCk7CisJCX0KKwkJY2xvc2VkID0gdHJ1ZTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvU2l0ZUZpbGVQbHVnaW5Db250ZW50Q29uc3VtZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvU2l0ZUZpbGVQbHVnaW5Db250ZW50Q29uc3VtZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjNkMDQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9TaXRlRmlsZVBsdWdpbkNvbnRlbnRDb25zdW1lci5qYXZhCkBAIC0wLDAgKzEsMTg5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7CisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS5uZXQuKjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOworCisvKioKKyAqIFBsdWdpbiBDb250ZW50IENvbnN1bWVyIG9uIGEgU2l0ZQorICovCitwdWJsaWMgY2xhc3MgU2l0ZUZpbGVQbHVnaW5Db250ZW50Q29uc3VtZXIgZXh0ZW5kcyBDb250ZW50Q29uc3VtZXIgeworCisJcHJpdmF0ZSBJUGx1Z2luRW50cnkgcGx1Z2luRW50cnk7CisJcHJpdmF0ZSBJU2l0ZSBzaXRlOworCXByaXZhdGUgYm9vbGVhbiBjbG9zZWQgPSBmYWxzZTsKKworCS8vIHJlY292ZXJ5CisJLy8gdGVtcG9yYXJ5IG5hbWUgdG8gb3JpZ2luYWwgbmFtZSBtYXAKKwlwcml2YXRlIE1hcCByZW5hbWVzID0gbmV3IEhhc2hNYXAoMik7CisKKwkvLyBmb3IgYWJvcnQKKwlwcml2YXRlIExpc3QgLypvZiBwYXRoIGFzIFN0cmluZyAqLworCWluc3RhbGxlZEZpbGVzOworCisJLyoKKwkgKiBDb25zdHJ1Y3RvcgorCSAqLworCXB1YmxpYyBTaXRlRmlsZVBsdWdpbkNvbnRlbnRDb25zdW1lcihJUGx1Z2luRW50cnkgcGx1Z2luRW50cnksIElTaXRlIHNpdGUpIHsKKwkJdGhpcy5wbHVnaW5FbnRyeSA9IHBsdWdpbkVudHJ5OworCQl0aGlzLnNpdGUgPSBzaXRlOworCQlpbnN0YWxsZWRGaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKKwl9CisKKwkvKgorCSAqIEBzZWUgSVNpdGVDb250ZW50Q29uc3VtZXIjc3RvcmUoQ29udGVudFJlZmVyZW5jZSwgSVByb2dyZXNzTW9uaXRvcikKKwkgKi8KKwlwdWJsaWMgdm9pZCBzdG9yZShDb250ZW50UmVmZXJlbmNlIGNvbnRlbnRSZWZlcmVuY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlJbnB1dFN0cmVhbSBpblN0cmVhbSA9IG51bGw7CisJCVN0cmluZyBwbHVnaW5QYXRoID0gbnVsbDsKKworCQlpZiAoY2xvc2VkKSB7CisJCQlVcGRhdGVDb3JlLndhcm4oIkF0dGVtcHQgdG8gc3RvcmUgaW4gYSBjbG9zZWQgU2l0ZUZpbGVQbHVnaW5Db250ZW50Q29uc3VtZXIiLCBuZXcgRXhjZXB0aW9uKCkpOyAvLyROT04tTkxTLTEkCisJCQlyZXR1cm47CisJCX0KKworCQl0cnkgeworCQkJVVJMIG5ld1VSTCA9IG5ldyBVUkwoc2l0ZS5nZXRVUkwoKSwgU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRIICsgcGx1Z2luRW50cnkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpOworCQkJcGx1Z2luUGF0aCA9IG5ld1VSTC5nZXRGaWxlKCk7IAorCQkJU3RyaW5nIGNvbnRlbnRLZXkgPSBjb250ZW50UmVmZXJlbmNlLmdldElkZW50aWZpZXIoKTsKKwkJCWluU3RyZWFtID0gY29udGVudFJlZmVyZW5jZS5nZXRJbnB1dFN0cmVhbSgpOworCQkJcGx1Z2luUGF0aCArPSBwbHVnaW5QYXRoLmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSA/IGNvbnRlbnRLZXkgOiBGaWxlLnNlcGFyYXRvciArIGNvbnRlbnRLZXk7CisKKwkJCS8vIGVycm9yIHJlY292ZXJ5CisJCQlTdHJpbmcgbG9nRW50cnk9bnVsbDsKKwkJCWlmICgicGx1Z2luLnhtbCIuZXF1YWxzKGNvbnRlbnRLZXkpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlsb2dFbnRyeT1FcnJvclJlY292ZXJ5TG9nLlBMVUdJTl9FTlRSWTsKKwkJCX0gZWxzZSBpZiAoImZyYWdtZW50LnhtbCIuZXF1YWxzKGNvbnRlbnRLZXkpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlsb2dFbnRyeT1FcnJvclJlY292ZXJ5TG9nLkZSQUdNRU5UX0VOVFJZOworCQkJfSBlbHNlIGlmICgiTUVUQS1JTkYvTUFOSUZFU1QuTUYiLmVxdWFscyhjb250ZW50S2V5KSkgeyAvLyROT04tTkxTLTEkCisJCQkJbG9nRW50cnk9RXJyb3JSZWNvdmVyeUxvZy5CVU5ETEVfTUFOSUZFU1RfRU5UUlk7CisJCQl9CisJCQlpZiAobG9nRW50cnkhPW51bGwpIHsKKwkJCQlTdHJpbmcgb3JpZ2luYWxOYW1lID0gcGx1Z2luUGF0aC5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKTsKKwkJCQlGaWxlIGxvY2FsRmlsZSA9IG5ldyBGaWxlKG9yaWdpbmFsTmFtZSk7CisJCQkJaWYgKGxvY2FsRmlsZS5leGlzdHMoKSkgeworCQkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5VcGRhdGVNYW5hZ2VyVXRpbHNfRmlsZUFscmVhZHlFeGlzdHMsIChuZXcgT2JqZWN0W10geyBsb2NhbEZpbGUgfSkpLCBudWxsKTsKKwkJCQl9CisJCQkJcGx1Z2luUGF0aCA9IEVycm9yUmVjb3ZlcnlMb2cuZ2V0TG9jYWxSYW5kb21JZGVudGlmaWVyKHBsdWdpblBhdGgpOworCQkJCXJlbmFtZXMucHV0KHBsdWdpblBhdGgsIG9yaWdpbmFsTmFtZSk7CisJCQkJRXJyb3JSZWNvdmVyeUxvZy5nZXRMb2coKS5hcHBlbmRQYXRoKGxvZ0VudHJ5LCBwbHVnaW5QYXRoKTsKKwkJCX0KKwkJCS8vCisJCQlVcGRhdGVNYW5hZ2VyVXRpbHMuY29weVRvTG9jYWwoaW5TdHJlYW0sIHBsdWdpblBhdGgsIG51bGwpOworCQkJVXBkYXRlTWFuYWdlclV0aWxzLmNoZWNrUGVybWlzc2lvbnMoY29udGVudFJlZmVyZW5jZSwgcGx1Z2luUGF0aCk7IC8vIDIwMzA1CisJCQlpbnN0YWxsZWRGaWxlcy5hZGQocGx1Z2luUGF0aCk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLkdsb2JhbENvbnN1bWVyX0Vycm9yQ3JlYXRpbmdGaWxlLCAobmV3IFN0cmluZ1tdIHsgcGx1Z2luUGF0aCB9KSksIGUpOworCQl9IGZpbmFsbHkgeworCQkJaWYgKGluU3RyZWFtICE9IG51bGwpIHsKKwkJCQl0cnkgeworCQkJCQkvLyBjbG9zZSBzdHJlYW0KKwkJCQkJaW5TdHJlYW0uY2xvc2UoKTsKKwkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJLyoKKwkgKiBAc2VlIElTaXRlQ29udGVudENvbnN1bWVyI2Nsb3NlKCkgCisJICovCisJcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisKKwkJaWYgKGNsb3NlZCkgeworCQkJVXBkYXRlQ29yZS53YXJuKCJBdHRlbXB0IHRvIGNsb3NlIGEgY2xvc2VkIFNpdGVGaWxlUGx1Z2luQ29udGVudENvbnN1bWVyIiwgbmV3IEV4Y2VwdGlvbigpKTsgLy8kTk9OLU5MUy0xJAorCQkJcmV0dXJuOworCQl9CisKKwkJZm9yKEl0ZXJhdG9yIGl0ID0gcmVuYW1lcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspeworCQkJLy8gcmVuYW1lIGZpbGUgCisJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KWl0Lm5leHQoKTsKKwkJCVN0cmluZyB0ZW1wb3JhcnkgPSAoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKTsKKwkJCVN0cmluZyBvcmlnaW5hbCA9IChTdHJpbmcpIGVudHJ5LmdldFZhbHVlKCk7CisJCQlFcnJvclJlY292ZXJ5TG9nLmdldExvZygpLmFwcGVuZFBhdGgoRXJyb3JSZWNvdmVyeUxvZy5SRU5BTUVfRU5UUlksIHRlbXBvcmFyeSk7CisJCQlGaWxlIGZpbGVUb1JlbmFtZSA9IG5ldyBGaWxlKHRlbXBvcmFyeSk7CisJCQlib29sZWFuIHN1Y2VzcyA9IGZhbHNlOworCQkJaWYgKGZpbGVUb1JlbmFtZS5leGlzdHMoKSkgeworCQkJCUZpbGUgcmVuYW1lZEZpbGUgPSBuZXcgRmlsZShvcmlnaW5hbCk7CisJCQkJc3VjZXNzID0gZmlsZVRvUmVuYW1lLnJlbmFtZVRvKHJlbmFtZWRGaWxlKTsKKwkJCX0KKwkJCWlmICghc3VjZXNzKSB7CisJCQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKE1lc3NhZ2VzLkNvbnRlbnRDb25zdW1lcl9VbmFibGVUb1JlbmFtZSwgKG5ldyBTdHJpbmdbXSB7IHRlbXBvcmFyeSwgb3JpZ2luYWwgfSkpOworCQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKG1zZywgbmV3IEV4Y2VwdGlvbihtc2cpKTsKKwkJCX0KKwkJfQorCisJCWlmIChzaXRlIGluc3RhbmNlb2YgU2l0ZUZpbGUpCisJCQkgKChTaXRlRmlsZSkgc2l0ZSkuYWRkUGx1Z2luRW50cnkocGx1Z2luRW50cnkpOworCQljbG9zZWQgPSB0cnVlOworCX0KKworCS8qCisJICogCisJICovCisJcHVibGljIHZvaWQgYWJvcnQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisKKwkJaWYgKGNsb3NlZCkgeworCQkJVXBkYXRlQ29yZS53YXJuKCJBdHRlbXB0IHRvIGFib3J0IGEgY2xvc2VkIFNpdGVGaWxlUGx1Z2luQ29udGVudENvbnN1bWVyIiwgbmV3IEV4Y2VwdGlvbigpKTsgLy8kTk9OLU5MUy0xJAorCQkJcmV0dXJuOworCQl9CisKKwkJYm9vbGVhbiBzdWNjZXNzID0gdHJ1ZTsKKwkJSW5zdGFsbFJlZ2lzdHJ5LnVucmVnaXN0ZXJQbHVnaW4ocGx1Z2luRW50cnkpOworCisJCS8vIGRlbGV0ZSBwbHVnaW4gbWFuaWZlc3RzIGZpcnN0CisJCWZvcihJdGVyYXRvciBpdCA9IHJlbmFtZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyl7CisJCQlTdHJpbmcgb3JpZ2luYWxOYW1lID0gKFN0cmluZykgaXQubmV4dCgpOworCisJCQlFcnJvclJlY292ZXJ5TG9nLmdldExvZygpLmFwcGVuZFBhdGgoRXJyb3JSZWNvdmVyeUxvZy5ERUxFVEVfRU5UUlksIG9yaWdpbmFsTmFtZSk7CisJCQlGaWxlIGZpbGVUb1JlbW92ZSA9IG5ldyBGaWxlKG9yaWdpbmFsTmFtZSk7CisJCQlpZiAoZmlsZVRvUmVtb3ZlLmV4aXN0cygpKSB7CisJCQkJaWYoIWZpbGVUb1JlbW92ZS5kZWxldGUoKSl7CisJCQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChNZXNzYWdlcy5TaXRlRmlsZVBsdWdpbkNvbnRlbnRDb25zdW1lcl91bmFibGVUb0RlbGV0ZSwgKG5ldyBTdHJpbmdbXSB7IG9yaWdpbmFsTmFtZSB9KSk7IAorCQkJCQlVcGRhdGVDb3JlLmxvZyhtc2csIG51bGwpOwkKKwkJCQkJc3VjY2VzcyA9IGZhbHNlOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmIChzdWNjZXNzKSB7CisJCQkvLyByZW1vdmUgdGhlIHBsdWdpbiBmaWxlczsKKwkJCUl0ZXJhdG9yIGl0ZXIgPSBpbnN0YWxsZWRGaWxlcy5pdGVyYXRvcigpOworCQkJRmlsZSBmZWF0dXJlRmlsZSA9IG51bGw7CisJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKwkJCQlTdHJpbmcgcGF0aCA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOworCQkJCWZlYXR1cmVGaWxlID0gbmV3IEZpbGUocGF0aCk7CisJCQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGZlYXR1cmVGaWxlKTsKKwkJCX0KKworCQkJLy8gcmVtb3ZlIHRoZSBwbHVnaW4gZGlyZWN0b3J5IGlmIGVtcHR5CisJCQl0cnkgeworCQkJCVVSTCBuZXdVUkwgPSBuZXcgVVJMKHNpdGUuZ2V0VVJMKCksIFNpdGUuREVGQVVMVF9QTFVHSU5fUEFUSCArIHBsdWdpbkVudHJ5LmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKTsKKwkJCQlTdHJpbmcgcGx1Z2luUGF0aCA9IG5ld1VSTC5nZXRGaWxlKCk7CisJCQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUVtcHR5RGlyZWN0b3JpZXNGcm9tRmlsZVN5c3RlbShuZXcgRmlsZShwbHVnaW5QYXRoKSk7CisJCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworCQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJCX0KKwkJfQorCQljbG9zZWQgPSB0cnVlOworCX0KKworfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9TaXRlUmVjb25jaWxlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9TaXRlUmVjb25jaWxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmZGI3ZmYKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1NpdGVSZWNvbmNpbGVyLmphdmEKQEAgLTAsMCArMSwzNDcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsKKworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLklDb25maWd1cmVkU2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLk1vZGVsT2JqZWN0OworCisvKioKKyAqIFRoaXMgY2xhc3MgbWFuYWdlcyB0aGUgcmVjb25jaWxpYXRpb24uCisgKi8KKworcHVibGljIGNsYXNzIFNpdGVSZWNvbmNpbGVyIGV4dGVuZHMgTW9kZWxPYmplY3QgeworCisJcHJpdmF0ZSBTaXRlUmVjb25jaWxlcihMb2NhbFNpdGUgc2l0ZUxvY2FsKSB7CisJCS8vbmV2ZXIgaW5zdGFudGlhdGVkCisJfQorCisJLyoqCisJICogVmFsaWRhdGUgdGhlIGxpc3Qgb2YgY29uZmlndXJlZCBmZWF0dXJlcyBlbGltaW5hdGluZyBleHRyYQorCSAqIGVudHJpZXMgKGlmIHBvc3NpYmxlKS4gTWFrZSBzdXJlIHdlIGRvIG5vdCBsZWF2ZSBjb25maWd1cmVkCisJICogbmVzdGVkIGZlYXR1cmVzIHdpdGggImhvbGVzIiAoaWUuIHVuY29uZmlndXJlZCBjaGlsZHJlbikKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgY2hlY2tDb25maWd1cmVkRmVhdHVyZXMoSUNvbmZpZ3VyZWRTaXRlIGNvbmZpZ3VyZWRTaXRlKSB7CisKKwkJLy8gTm90ZTogaWYgd2UgaGl0IGVycm9ycyBpbiB0aGUgdmFyaW91cyBjb21wdXRhdGlvbgorCQkvLyBtZXRob2RzIGFuZCB0aHJvdyBhIENvcmVFeGNlcHRpb24sIHdlIHdpbGwgbm90IGNhdGNoIGl0CisJCS8vIGluIHRoaXMgbWV0aG9kLiBDb25zZXF1ZW50bHkgd2Ugd2lsbCBub3QgYXR0ZW1wdCB0bworCQkvLyB1bmNvbmZpZ3VyZSBhbnkgImV4dHJhIiBmZWF0dXJlcyBiZWNhdXNlIHdlIHdvdWxkIAorCQkvLyBsaWtlbHkgZ2V0IGl0IHdyb25nLiBUaGUgcGxhdGZvcm0gd2lsbCBydW4gd2l0aCBleHRyYSBmZWF0dXJlcworCQkvLyBjb25maWd1cmVkLiBUaGUgcnVudGltZSB3aWxsIGVsaW1pbmF0ZSBleHRyYSBwbHVnaW5zIGJhc2VkCisJCS8vIG9uIHJ1bnRpbWUgYmluZGluZyBydWxlcy4KKworCQkvLyBkZXRlcm1pbmUgInByb3Bvc2VkIiBsaXN0IG9mIGNvbmZpZ3VyZWQgZmVhdHVyZXMKKwkJQ29uZmlndXJlZFNpdGUgY1NpdGUgPSAoQ29uZmlndXJlZFNpdGUpIGNvbmZpZ3VyZWRTaXRlOworCQkvLyBkZWJ1ZworCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfUkVDT05DSUxFUikgeworCQkJVXBkYXRlQ29yZS5kZWJ1ZygiVmFsaWRhdGUgY29uZmlndXJhdGlvbiBvZiBzaXRlICIgKyBjU2l0ZS5nZXRTaXRlKCkuZ2V0VVJMKCkpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJSUZlYXR1cmVSZWZlcmVuY2VbXSBjb25maWd1cmVkUmVmcyA9IGNTaXRlLmdldENvbmZpZ3VyZWRGZWF0dXJlcygpOworCQlBcnJheUxpc3QgYWxsUG9zc2libGVDb25maWd1cmVkRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlndXJlZFJlZnMubGVuZ3RoOyBpKyspIHsKKwkJCXRyeSB7CisJCQkJSUZlYXR1cmUgZmVhdHVyZSA9IGNvbmZpZ3VyZWRSZWZzW2ldLmdldEZlYXR1cmUobnVsbCk7CisJCQkJYWxsUG9zc2libGVDb25maWd1cmVkRmVhdHVyZXMuYWRkKGZlYXR1cmUpOworCQkJCS8vIGRlYnVnCisJCQkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX1JFQ09OQ0lMRVIpIHsKKwkJCQkJVXBkYXRlQ29yZS5kZWJ1ZygiICAgY29uZmlndXJlZCBmZWF0dXJlICIgKyBmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAorCQkJCX0KKwkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJCVVwZGF0ZUNvcmUud2FybigiIiwgZSk7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJfQorCisJCS8vIGZpbmQgdG9wIGxldmVsIGZlYXR1cmVzCisJCUFycmF5TGlzdCB0b3BGZWF0dXJlcyA9IGNvbXB1dGVUb3BGZWF0dXJlcyhhbGxQb3NzaWJsZUNvbmZpZ3VyZWRGZWF0dXJlcyk7CisKKwkJLy8gZmluZCBub24gZWZpeCB0b3AgbGV2ZWwgZmVhdHVyZXMKKwkJQXJyYXlMaXN0IHRvcE5vbkVmaXhGZWF0dXJlcyA9IGdldE5vbkVmaXhGZWF0dXJlcyh0b3BGZWF0dXJlcyk7CisKKwkJLy8gZXhwYW5kIG5vbiBlZml4IHRvcCBsZXZlbCBmZWF0dXJlcyAoY29tcHV0ZSBmdWxsIG5lc3Rpbmcgc3RydWN0dXJlcykuCisJCUFycmF5TGlzdCBjb25maWd1cmVkRmVhdHVyZXMgPSBleHBhbmRGZWF0dXJlcyh0b3BOb25FZml4RmVhdHVyZXMsIGNvbmZpZ3VyZWRTaXRlKTsKKworCQkvLyByZXRyaWV2ZSBlZml4ZXMgdGhhdCBwYXRjaCBlbmFibGUgZmVhdHVyZQorCQkvLyB0aGV5IG11c3QgYmUga2VwdCBlbmFibGVkCisJCWlmICh0b3BGZWF0dXJlcy5zaXplKCkgIT0gdG9wTm9uRWZpeEZlYXR1cmVzLnNpemUoKSkgeworCQkJTWFwIHBhdGNoZXMgPSBnZXRQYXRjaGVzQXNGZWF0dXJlKGFsbFBvc3NpYmxlQ29uZmlndXJlZEZlYXR1cmVzKTsKKwkJCWlmICghcGF0Y2hlcy5pc0VtcHR5KCkpIHsKKwkJCQkvLyBjYWxjdWxhdGUgZWZpeGVzIHRvIGVuYWJsZQorCQkJCUxpc3QgZWZpeGVzVG9FbmFibGUgPSBnZXRQYXRjaGVzVG9FbmFibGUocGF0Y2hlcywgY29uZmlndXJlZEZlYXR1cmVzKTsKKwkJCQkvLyBhZGQgZWZpZXMgdG8ga2VlcCBlbmFibGUKKwkJCQkvL2FkZCB0aGVtIHRvIHRoZSBlbmFibGUgbGlzdAorCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGVmaXhlc1RvRW5hYmxlLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworCQkJCQlJRmVhdHVyZSBlbGVtZW50ID0gKElGZWF0dXJlKSBpdGVyLm5leHQoKTsKKwkJCQkJQXJyYXlMaXN0IGV4cGFuZGVkRWZpeCA9IG5ldyBBcnJheUxpc3QoKTsKKwkJCQkJZXhwYW5kRWZpeEZlYXR1cmUoZWxlbWVudCwgZXhwYW5kZWRFZml4LCBjb25maWd1cmVkU2l0ZSk7CisJCQkJCWNvbmZpZ3VyZWRGZWF0dXJlcy5hZGRBbGwoZXhwYW5kZWRFZml4KTsKKwkJCQl9CisJCQl9CisJCX0KKworCQkvLyBjb21wdXRlIGV4dHJhIGZlYXR1cmVzCisJCUFycmF5TGlzdCBleHRyYXMgPSBkaWZmKGFsbFBvc3NpYmxlQ29uZmlndXJlZEZlYXR1cmVzLCBjb25maWd1cmVkRmVhdHVyZXMpOworCisJCS8vIHVuY29uZmlndXJlIGV4dHJhIGZlYXR1cmVzCisJCUNvbmZpZ3VyYXRpb25Qb2xpY3kgY1BvbGljeSA9IGNTaXRlLmdldENvbmZpZ3VyYXRpb25Qb2xpY3koKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRyYXMuc2l6ZSgpOyBpKyspIHsKKwkJCUlGZWF0dXJlIGZlYXR1cmUgPSAoSUZlYXR1cmUpIGV4dHJhcy5nZXQoaSk7CisJCQlJRmVhdHVyZVJlZmVyZW5jZSByZWYgPSBjU2l0ZS5nZXRTaXRlKCkuZ2V0RmVhdHVyZVJlZmVyZW5jZShmZWF0dXJlKTsKKwkJCXRyeSB7CisJCQkJY1BvbGljeS51bmNvbmZpZ3VyZShyZWYsIHRydWUsIGZhbHNlKTsKKwkJCQkvLyBkZWJ1ZworCQkJCWlmIChVcGRhdGVDb3JlLkRFQlVHICYmIFVwZGF0ZUNvcmUuREVCVUdfU0hPV19SRUNPTkNJTEVSKSB7CisJCQkJCVVwZGF0ZUNvcmUuZGVidWcoIlVuY29uZmlndXJpbmcgXCJleHRyYVwiIGZlYXR1cmUgIiArIGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCisJCQkJfQorCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkJVXBkYXRlQ29yZS53YXJuKCIiLCBlKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQl9CisJfQorCisJLyoKKwkgKiAgCisJICovCisJcHJpdmF0ZSBzdGF0aWMgQXJyYXlMaXN0IGNvbXB1dGVUb3BGZWF0dXJlcyhBcnJheUxpc3QgZmVhdHVyZXMpIHsKKwkJLyogbWFwIG9mIEZlYXR1cmUgYnkgVmVyc2lvbmVkSWRlbnRpZmllciAqLworCQlNYXAgdG9wRmVhdHVyZXMgPSBuZXcgSGFzaE1hcChmZWF0dXJlcy5zaXplKCkpOworCQkvLyBzdGFydCB3aXRoIHRoZSBmZWF0dXJlcyBwYXNzZWQgaW4KKwkJZm9yIChJdGVyYXRvciBpdCA9IGZlYXR1cmVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKKwkJCUlGZWF0dXJlIGYgPSAoKElGZWF0dXJlKSBpdC5uZXh0KCkpOworCQkJdG9wRmVhdHVyZXMucHV0KGYuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLCBmKTsKKwkJfQorCQkvLyByZW1vdmUgYWxsIGZlYXR1cmVzIHRoYXQgbmVzdCBpbiBzb21lIG90aGVyIGZlYXR1cmUKKwkJZm9yIChJdGVyYXRvciBpdCA9IGZlYXR1cmVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKKwkJCXRyeSB7CisJCQkJSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZVtdIGNoaWxkcmVuID0gKChJRmVhdHVyZSkgaXQubmV4dCgpKS5nZXRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCk7CisJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjaGlsZHJlbi5sZW5ndGg7IGorKykgeworCQkJCQl0cnkgeworCQkJCQkJdG9wRmVhdHVyZXMucmVtb3ZlKGNoaWxkcmVuW2pdLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSk7CisJCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZTEpIHsKKwkJCQkJCWlmIChVcGRhdGVDb3JlLkRFQlVHICYmIFVwZGF0ZUNvcmUuREVCVUdfU0hPV19XQVJOSU5HUykKKwkJCQkJCQlVcGRhdGVDb3JlLndhcm4oIiIsIGUxKTsgLy8kTk9OLU5MUy0xJAorCQkJCQl9CisJCQkJfQorCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkJVXBkYXRlQ29yZS53YXJuKCIiLCBlKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQl9CisJCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOworCQlsaXN0LmFkZEFsbCh0b3BGZWF0dXJlcy52YWx1ZXMoKSk7CisJCS8vIGRlYnVnCisJCWlmIChVcGRhdGVDb3JlLkRFQlVHICYmIFVwZGF0ZUNvcmUuREVCVUdfU0hPV19SRUNPTkNJTEVSKSB7CisJCQlVcGRhdGVDb3JlLmRlYnVnKCJDb21wdXRlZCB0b3AtbGV2ZWwgZmVhdHVyZXMiKTsgLy8kTk9OLU5MUy0xJAorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b3BGZWF0dXJlcy5zaXplKCk7IGkrKykgeworCQkJCVVwZGF0ZUNvcmUuZGVidWcoIiAgICIgKyAoKElGZWF0dXJlKSBsaXN0LmdldChpKSkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCX0KKwkJcmV0dXJuIGxpc3Q7CisJfQorCisJLyoKKwkgKiAKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBBcnJheUxpc3QgZXhwYW5kRmVhdHVyZXMoQXJyYXlMaXN0IGZlYXR1cmVzLCBJQ29uZmlndXJlZFNpdGUgY29uZmlndXJlZFNpdGUpIHsKKwkJQXJyYXlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKKworCQkvLyBleHBhbmQgYWxsIHRvcCBsZXZlbCBmZWF0dXJlcworCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLnNpemUoKTsgaSsrKSB7CisJCQlleHBhbmRGZWF0dXJlKChJRmVhdHVyZSkgZmVhdHVyZXMuZ2V0KGkpLCByZXN1bHQsIGNvbmZpZ3VyZWRTaXRlKTsKKwkJfQorCisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoKKwkgKiAKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyB2b2lkIGV4cGFuZEZlYXR1cmUoSUZlYXR1cmUgZmVhdHVyZSwgQXJyYXlMaXN0IGZlYXR1cmVzLCBJQ29uZmlndXJlZFNpdGUgY29uZmlndXJlZFNpdGUpIHsKKworCQkvLyBhZGQgZmVhdHVyZQorCQlpZiAoIWZlYXR1cmVzLmNvbnRhaW5zKGZlYXR1cmUpKSB7CisJCQlmZWF0dXJlcy5hZGQoZmVhdHVyZSk7CisJCQkvLyBkZWJ1ZworCQkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX1JFQ09OQ0lMRVIpIHsKKwkJCQlVcGRhdGVDb3JlLmRlYnVnKCJSZXRhaW5pbmcgY29uZmlndXJlZCBmZWF0dXJlICIgKyBmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQl9CisKKwkJLy8gYWRkIG5lc3RlZCBjaGlsZHJlbiB0byB0aGUgbGlzdAorCQlJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlW10gY2hpbGRyZW4gPSBudWxsOworCQl0cnkgeworCQkJY2hpbGRyZW4gPSBmZWF0dXJlLmdldEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKTsKKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQlVcGRhdGVDb3JlLndhcm4oIiIsIGUpOyAvLyROT04tTkxTLTEkCisJCQlyZXR1cm47CisJCX0KKworCQlmb3IgKGludCBqID0gMDsgaiA8IGNoaWxkcmVuLmxlbmd0aDsgaisrKSB7CisJCQlJRmVhdHVyZSBjaGlsZCA9IG51bGw7CisJCQl0cnkgeworCQkJCWNoaWxkID0gY2hpbGRyZW5bal0uZ2V0RmVhdHVyZShudWxsKTsKKwkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJCWlmICghVXBkYXRlTWFuYWdlclV0aWxzLmlzT3B0aW9uYWwoY2hpbGRyZW5bal0pKQorCQkJCQlVcGRhdGVDb3JlLndhcm4oIiIsIGUpOyAvLyROT04tTkxTLTEkCisJCQkJLy8gMjUyMDIgZG8gbm90IHJldHVybiByaWdodCBub3csIHRoZSBwZWVyIGNoaWxkcmVuIG1heSBiZSBvaworCQkJfQorCQkJaWYgKGNoaWxkICE9IG51bGwpCisJCQkJZXhwYW5kRmVhdHVyZShjaGlsZCwgZmVhdHVyZXMsIGNvbmZpZ3VyZWRTaXRlKTsKKwkJfQorCX0KKworCS8qCisJICogCisJICovCisJcHJpdmF0ZSBzdGF0aWMgQXJyYXlMaXN0IGRpZmYoQXJyYXlMaXN0IGxlZnQsIEFycmF5TGlzdCByaWdodCkgeworCQlBcnJheUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOworCisJCS8vIGRldGVybWluZSBkaWZmZXJlbmNlIChsZWZ0ICJtaW51cyIgcmlnaHQpCisJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVmdC5zaXplKCk7IGkrKykgeworCQkJSUZlYXR1cmUgZmVhdHVyZSA9IChJRmVhdHVyZSkgbGVmdC5nZXQoaSk7CisJCQlpZiAoIXJpZ2h0LmNvbnRhaW5zKGZlYXR1cmUpKQorCQkJCXJlc3VsdC5hZGQoZmVhdHVyZSk7CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKgorCSAqIGdldCB0aGUgbGlzdCBvZiBlbmFibGVkIHBhdGNoZXMKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBNYXAgZ2V0UGF0Y2hlc0FzRmVhdHVyZShBcnJheUxpc3QgYWxsQ29uZmlndXJlZEZlYXR1cmVzKSB7CisJCS8vIGdldCBhbGwgZWZpeGVzIGFuZCB0aGUgYXNzb2NpYXRlZCBwYXRjaGVkIGZlYXR1cmVzCisJCU1hcCBwYXRjaGVzID0gbmV3IEhhc2hNYXAoKTsKKwkJaWYgKGFsbENvbmZpZ3VyZWRGZWF0dXJlcyAhPSBudWxsKSB7CisJCQlJdGVyYXRvciBpdGVyID0gYWxsQ29uZmlndXJlZEZlYXR1cmVzLml0ZXJhdG9yKCk7CisJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKwkJCQlMaXN0IHBhdGNoZWRGZWF0dXJlc0lEID0gbmV3IEFycmF5TGlzdCgpOworCQkJCUlGZWF0dXJlIGVsZW1lbnQgPSAoSUZlYXR1cmUpIGl0ZXIubmV4dCgpOworCQkJCS8vIGFkZCB0aGUgcGF0Y2hlZCBmZWF0dXJlIGlkZW50aWZpZXJzCisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50LmdldEltcG9ydHMoKS5sZW5ndGg7IGkrKykgeworCQkJCQlpZiAoZWxlbWVudC5nZXRJbXBvcnRzKClbaV0uaXNQYXRjaCgpKSB7CisJCQkJCQlWZXJzaW9uZWRJZGVudGlmaWVyIGlkID0gZWxlbWVudC5nZXRJbXBvcnRzKClbaV0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOworCQkJCQkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX1JFQ09OQ0lMRVIpCisJCQkJCQkJVXBkYXRlQ29yZS5kZWJ1ZygiRm91bmQgcGF0Y2ggIiArIGVsZW1lbnQgKyAiIGZvciBmZWF0dXJlIGlkZW50aWZpZXIgIiArIGlkKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJCQlwYXRjaGVkRmVhdHVyZXNJRC5hZGQoaWQpOworCQkJCQl9CisJCQkJfQorCisJCQkJaWYgKCFwYXRjaGVkRmVhdHVyZXNJRC5pc0VtcHR5KCkpIHsKKwkJCQkJcGF0Y2hlcy5wdXQoZWxlbWVudCwgcGF0Y2hlZEZlYXR1cmVzSUQpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCXJldHVybiBwYXRjaGVzOworCX0KKworCS8qCisJICogcmV0cnVucyB0aGUgbGlzdCBvZiBwYXRoZXMtZmVhdHVyZSB3aG8gcGF0Y2ggZW5hYmxlZCBmZWF0dXJlcworCSAqLworCXByaXZhdGUgc3RhdGljIExpc3QgZ2V0UGF0Y2hlc1RvRW5hYmxlKE1hcCBlZml4ZXMsIEFycmF5TGlzdCBjb25maWd1cmVkRmVhdHVyZXMpIHsKKworCQlBcnJheUxpc3QgZW5hYmxlZFZlcnNpb25lZElkZW50aWZpZXIgPSBuZXcgQXJyYXlMaXN0KCk7CisJCUl0ZXJhdG9yIGl0ZXIgPSBjb25maWd1cmVkRmVhdHVyZXMuaXRlcmF0b3IoKTsKKwkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisJCQlJRmVhdHVyZSBlbGVtZW50ID0gKElGZWF0dXJlKSBpdGVyLm5leHQoKTsKKwkJCWVuYWJsZWRWZXJzaW9uZWRJZGVudGlmaWVyLmFkZChlbGVtZW50LmdldFZlcnNpb25lZElkZW50aWZpZXIoKSk7CisJCX0KKworCQkvLyBsb29wIHRocm91Z2ggdGhlIHBhdGNoZXMKKwkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7CisJCWl0ZXIgPSBlZml4ZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsKKwkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisJCQlib29sZWFuIHRvRW5hYmxlID0gZmFsc2U7CisJCQlJRmVhdHVyZSBlZml4RmVhdHVyZSA9IChJRmVhdHVyZSkgaXRlci5uZXh0KCk7CisJCQlMaXN0IHBhdGNoZWRGZWF0dXJlcyA9IChMaXN0KSBlZml4ZXMuZ2V0KGVmaXhGZWF0dXJlKTsKKwkJCS8vIGxvb3AgdGhyb3VnaCB0aGUgJ3BhdGNoZWQgZmVhdHVyZXMgaWRlbnRpZmllcicgdGhlIGZvciB0aGlzIHBhdGNoCisJCQkvLyBzZWUgaWYgaXQgdGhlIHBhdGNoIHBhdGNoZXMgYXQgbGVhc3Qgb25lIGVuYWJsZSBmZWF0dXJlCisJCQlJdGVyYXRvciBwYXRjaGVkRmVhdHVyZXNJdGVyID0gcGF0Y2hlZEZlYXR1cmVzLml0ZXJhdG9yKCk7CisJCQl3aGlsZSAocGF0Y2hlZEZlYXR1cmVzSXRlci5oYXNOZXh0KCkgJiYgIXRvRW5hYmxlKSB7CisJCQkJVmVyc2lvbmVkSWRlbnRpZmllciBwYXRjaGVkRmVhdHVyZUlEID0gKFZlcnNpb25lZElkZW50aWZpZXIpIHBhdGNoZWRGZWF0dXJlc0l0ZXIubmV4dCgpOworCQkJCWlmIChlbmFibGVkVmVyc2lvbmVkSWRlbnRpZmllci5jb250YWlucyhwYXRjaGVkRmVhdHVyZUlEKSkgeworCQkJCQl0b0VuYWJsZSA9IHRydWU7CisJCQkJfQorCQkJfQorCisJCQlpZiAoIXRvRW5hYmxlKSB7CisJCQkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX1JFQ09OQ0lMRVIpCisJCQkJCVVwZGF0ZUNvcmUuZGVidWcoIlRoZSBQYXRjaCAiICsgZWZpeEZlYXR1cmUgKyAiIGRvZXMgbm90IHBhdGNoIGFueSBlbmFibGVkIGZlYXR1cmVzOiBpdCB3aWxsIGJlIGRpc2FibGVkIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJfSBlbHNlIHsKKwkJCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfUkVDT05DSUxFUikKKwkJCQkJVXBkYXRlQ29yZS5kZWJ1ZygiVGhlIHBhdGNoICIgKyBlZml4RmVhdHVyZSArICIgd2lsbCBiZSBlbmFibGVkLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQlyZXN1bHQuYWRkKGVmaXhGZWF0dXJlKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qCisJICogcmV0dXJucyB0aGUgZmVhdHVyZSB0aGF0IGFyZSBub3QgcGF0Y2hlcworCSAqLworCXByaXZhdGUgc3RhdGljIEFycmF5TGlzdCBnZXROb25FZml4RmVhdHVyZXMoQXJyYXlMaXN0IHRvcEZlYXR1cmVzKSB7CisJCU1hcCBlZml4RmVhdHVyZXMgPSBnZXRQYXRjaGVzQXNGZWF0dXJlKHRvcEZlYXR1cmVzKTsKKwkJU2V0IGtleVNldCA9IGVmaXhGZWF0dXJlcy5rZXlTZXQoKTsKKwkJaWYgKGtleVNldCA9PSBudWxsIHx8IGtleVNldC5pc0VtcHR5KCkpCisJCQlyZXR1cm4gdG9wRmVhdHVyZXM7CisKKwkJSXRlcmF0b3IgaXRlciA9IHRvcEZlYXR1cmVzLml0ZXJhdG9yKCk7CisJCUFycmF5TGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7CisJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgeworCQkJSUZlYXR1cmUgZWxlbWVudCA9IChJRmVhdHVyZSkgaXRlci5uZXh0KCk7CisJCQlpZiAoIWtleVNldC5jb250YWlucyhlbGVtZW50KSkgeworCQkJCXJlc3VsdC5hZGQoZWxlbWVudCk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKgorCSAqIG9ubHkgZW5hYmxlIG5vbi1lZml4IGNoaWxkcmVuIHJlY3Vyc2l2ZWx5CisJICovCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBleHBhbmRFZml4RmVhdHVyZShJRmVhdHVyZSBmZWF0dXJlLCBBcnJheUxpc3QgZmVhdHVyZXMsIElDb25maWd1cmVkU2l0ZSBjb25maWd1cmVkU2l0ZSkgeworCisJCS8vIGFkZCBmZWF0dXJlCisJCWlmICghZmVhdHVyZXMuY29udGFpbnMoZmVhdHVyZSkpIHsKKwkJCWZlYXR1cmVzLmFkZChmZWF0dXJlKTsKKwkJCS8vIGRlYnVnCisJCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfUkVDT05DSUxFUikgeworCQkJCVVwZGF0ZUNvcmUuZGVidWcoIlJldGFpbmluZyBjb25maWd1cmVkIGZlYXR1cmUgIiArIGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCX0KKworCQkvLyBhZGQgbmVzdGVkIGNoaWxkcmVuIHRvIHRoZSBsaXN0CisJCUlJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VbXSBjaGlsZHJlbiA9IG51bGw7CisJCXRyeSB7CisJCQljaGlsZHJlbiA9IGZlYXR1cmUuZ2V0SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpOworCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCVVwZGF0ZUNvcmUud2FybigiIiwgZSk7IC8vJE5PTi1OTFMtMSQKKwkJCXJldHVybjsKKwkJfQorCisJCWZvciAoaW50IGogPSAwOyBqIDwgY2hpbGRyZW4ubGVuZ3RoOyBqKyspIHsKKwkJCUlGZWF0dXJlIGNoaWxkID0gbnVsbDsKKwkJCXRyeSB7CisJCQkJY2hpbGQgPSBjaGlsZHJlbltqXS5nZXRGZWF0dXJlKG51bGwpOworCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkJaWYgKCFjaGlsZHJlbltqXS5pc09wdGlvbmFsKCkpCisJCQkJCVVwZGF0ZUNvcmUud2FybigiIiwgZSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkvLyAyNTIwMiBkbyBub3QgcmV0dXJuIHJpZ2h0IG5vdywgdGhlIHBlZXIgY2hpbGRyZW4gbWF5IGJlIG9rCisJCQl9CisJCQlpZiAoY2hpbGQgIT0gbnVsbCkgeworCQkJCWlmICghVXBkYXRlQ29yZS5pc1BhdGNoKGNoaWxkKSkKKwkJCQkJZXhwYW5kRWZpeEZlYXR1cmUoY2hpbGQsIGZlYXR1cmVzLCBjb25maWd1cmVkU2l0ZSk7CisJCQl9CisJCX0KKwl9CisKK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvU2l0ZVN0YXR1c0FuYWx5emVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1NpdGVTdGF0dXNBbmFseXplci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjZGJiMWQKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1NpdGVTdGF0dXNBbmFseXplci5qYXZhCkBAIC0wLDAgKzEsNDYzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC4qOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTXVsdGlTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLklDb25maWd1cmVkU2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLkNvbmZpZ3VyYXRvclV0aWxzOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IuSVBsYXRmb3JtQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JSW1wb3J0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklQbHVnaW5FbnRyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JU2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5WZXJzaW9uZWRJZGVudGlmaWVyOworaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7CitpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkNvbnN0YW50czsKK2ltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLnBhY2thZ2VhZG1pbi5QYWNrYWdlQWRtaW47CisKKy8qKgorICogVGhpcyBjbGFzcyBtYW5hZ2VzIHRoZSBjb25maWd1cmF0aW9ucy4KKyAqLworCitwdWJsaWMgY2xhc3MgU2l0ZVN0YXR1c0FuYWx5emVyIHsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTT1VSQ0VfQlVORExFU19QQVRIID0gIm9yZy5lY2xpcHNlLmVxdWlub3guc291cmNlL3NvdXJjZS5pbmZvIjsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS51cGRhdGUuY29yZSI7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIHN0YXRpYyBMaXN0IGFsbENvbmZpZ3VyZWRGZWF0dXJlczsgLypWZXJzaW9uZWRJZGVudGlmaWVyICovCisJcHJpdmF0ZSBMb2NhbFNpdGUgc2l0ZUxvY2FsOworCisJLy8gQSBsaXN0IG9mIHZlcnNpb25lZElkZW50aWZpZXJzIGZvciBzb3VyY2UgYnVuZGxlczsgaW5pdGlhbGl6ZWQgb24gZGVtYW5kLgorCXByaXZhdGUgTGlzdCBzb3VyY2VCdW5kbGVzID0gbnVsbDsKKworCS8qKgorCSAqIAorCSAqLworCXB1YmxpYyBTaXRlU3RhdHVzQW5hbHl6ZXIoTG9jYWxTaXRlIHNpdGVMb2NhbCkgeworCQl0aGlzLnNpdGVMb2NhbCA9IHNpdGVMb2NhbDsKKwl9CisKKwkvKgorCSAqICBjaGVjayBpZiB0aGUgUGx1Z2lucyBvZiB0aGUgZmVhdHVyZSBhcmUgb24gdGhlIHBsdWdpbiBwYXRoCisJICogIElmIGFsbCB0aGUgcGx1Z2lucyBhcmUgb24gdGhlIHBsdWdpbiBwYXRoLCBhbmQgdGhlIHZlcnNpb24gbWF0Y2ggYW5kIHRoZXJlIGlzIG5vIG90aGVyIHZlcnNpb24gLT4gSEFQUFkKKwkgKiAgSWYgYWxsIHRoZSBwbHVnaW5zIGFyZSBvbiB0aGUgcGx1Z2luIHBhdGgsIGFuZCB0aGUgdmVyc2lvbiBtYXRjaCBhbmQgdGhlcmUgaXMgb3RoZXIgdmVyc2lvbiAtPiBBTUJJR1VPVVMKKwkgKiAgSWYgc29tZSBvZiB0aGUgcGx1Z2lucyBhcmUgb24gdGhlIHBsdWdpbiBwYXRoLCBidXQgbm90IGFsbCAtPiBVTkhBUFBZCisJICogCUNoZWNrIG9uIGFsbCBDb25maWd1cmVkU2l0ZXMKKwkgKi8KKwlwcml2YXRlIElTdGF0dXMgZ2V0U3RhdHVzKElGZWF0dXJlIGZlYXR1cmUpIHsKKworCQkvLyB2YWxpZGF0ZSBzaXRlCisJCUlTaXRlIGZlYXR1cmVTaXRlID0gZmVhdHVyZS5nZXRTaXRlKCk7CisJCWlmIChmZWF0dXJlU2l0ZSA9PSBudWxsKSB7CisJCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfQ09ORklHVVJBVElPTikKKwkJCQlVcGRhdGVDb3JlLmRlYnVnKCJDYW5ub3QgZGV0ZXJtaW5lIHN0YXR1cyBvZiBmZWF0dXJlOiIgKyBmZWF0dXJlLmdldExhYmVsKCkgKyAiLiBTaXRlIGlzIE5VTEwuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKE1lc3NhZ2VzLlNpdGVMb2NhbF9VbmFibGVUb0RldGVybWluZUZlYXR1cmVTdGF0dXNTaXRlTnVsbCwgKG5ldyBPYmplY3RbXSB7ZmVhdHVyZS5nZXRVUkwoKX0pKTsKKwkJCXJldHVybiBjcmVhdGVTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSUZlYXR1cmUuU1RBVFVTX0FNQklHVU9VUywgbXNnLCBudWxsKTsKKwkJfQorCisJCS8vIHZhbGlkYXRlIGNvbmZpZ3VyZWQgc2l0ZQkJCisJCUNvbmZpZ3VyZWRTaXRlIGNTaXRlID0gKENvbmZpZ3VyZWRTaXRlKSBmZWF0dXJlU2l0ZS5nZXRDdXJyZW50Q29uZmlndXJlZFNpdGUoKTsKKwkJaWYgKGNTaXRlID09IG51bGwpIHsKKwkJCWlmIChVcGRhdGVDb3JlLkRFQlVHICYmIFVwZGF0ZUNvcmUuREVCVUdfU0hPV19DT05GSUdVUkFUSU9OKQorCQkJCVVwZGF0ZUNvcmUud2FybigiQ2Fubm90IGRldGVybWluZSBzdGF0dXMgb2YgZmVhdHVyZTogIiArIGZlYXR1cmUuZ2V0TGFiZWwoKSArICIuIENvbmZpZ3VyZWQgU2l0ZSBpcyBOVUxMLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChNZXNzYWdlcy5TaXRlTG9jYWxfVW5hYmxlVG9EZXRlcm1pbmVGZWF0dXJlU3RhdHVzQ29uZmlndXJlZFNpdGVOdWxsLCAobmV3IE9iamVjdFtdIHtmZWF0dXJlLmdldFVSTCgpfSkpOworCQkJcmV0dXJuIGNyZWF0ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLCBJRmVhdHVyZS5TVEFUVVNfQU1CSUdVT1VTLCBtc2csIG51bGwpOworCQl9CisKKwkJLy8gY2hlY2sgaWYgZGlzYWJsZSwgaWYgc28gcmV0dXJuCisJCUlGZWF0dXJlUmVmZXJlbmNlIHJlZiA9IGNTaXRlLmdldFNpdGUoKS5nZXRGZWF0dXJlUmVmZXJlbmNlKGZlYXR1cmUpOworCQlpZiAocmVmICE9IG51bGwpIHsKKwkJCWlmICghY1NpdGUuZ2V0Q29uZmlndXJhdGlvblBvbGljeSgpLmlzQ29uZmlndXJlZChyZWYpKQorCQkJCXJldHVybiBjcmVhdGVTdGF0dXMoSVN0YXR1cy5PSywgSUZlYXR1cmUuU1RBVFVTX0RJU0FCTEVELCAiIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKKwkJfSBlbHNlIHsKKwkJCWlmIChVcGRhdGVDb3JlLkRFQlVHICYmIFVwZGF0ZUNvcmUuREVCVUdfU0hPV19DT05GSUdVUkFUSU9OKQorCQkJCVVwZGF0ZUNvcmUud2FybigiVW5hYmxlIHRvIGZpbmQgcmVmZXJlbmNlIGZvciBmZWF0dXJlICIgKyBmZWF0dXJlICsgIiBpbiBzaXRlICIgKyBjU2l0ZS5nZXRTaXRlKCkuZ2V0VVJMKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJfQorCisJCS8vIGNoZWNrIGlmIGJyb2tlbgorCQlJU3RhdHVzIHN0YXR1cyA9IGNTaXRlLmdldEJyb2tlblN0YXR1cyhmZWF0dXJlKTsKKwkJaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpICE9IElTdGF0dXMuT0spIHsKKwkJCWlmIChVcGRhdGVDb3JlLkRFQlVHICYmIFVwZGF0ZUNvcmUuREVCVUdfU0hPV19DT05GSUdVUkFUSU9OKQorCQkJCVVwZGF0ZUNvcmUuZGVidWcoIkZlYXR1cmUgYnJva2VuOiIgKyBmZWF0dXJlLmdldExhYmVsKCkgKyAiLlNpdGU6IiArIGNTaXRlLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCXJldHVybiBzdGF0dXM7CisJCX0KKworCQkvLyBjaGVjayBhbWJpZ3VvdXMgYWdhaW5zdCByZWdpc3RyeSBbMTcwMTVdCisJCUlQbHVnaW5FbnRyeVtdIGZlYXR1cmVzRW50cmllcyA9IGZlYXR1cmUuZ2V0UGx1Z2luRW50cmllcygpOworCQlyZXR1cm4gc3RhdHVzKGZlYXR1cmUsIGZlYXR1cmVzRW50cmllcyk7CisJfQorCisJLyoKKwkgKiAgY2hlY2sgaWYgdGhlIFBsdWdpbnMgb2YgdGhlIGZlYXR1cmUgYXJlIG9uIHRoZSBwbHVnaW4gcGF0aAorCSAqICBJZiBhbGwgdGhlIHBsdWdpbnMgYXJlIG9uIHRoZSBwbHVnaW4gcGF0aCwgYW5kIHRoZSB2ZXJzaW9uIG1hdGNoIGFuZCB0aGVyZSBpcyBubyBvdGhlciB2ZXJzaW9uIC0+IEhBUFBZCisJICogIElmIGFsbCB0aGUgcGx1Z2lucyBhcmUgb24gdGhlIHBsdWdpbiBwYXRoLCBhbmQgdGhlIHZlcnNpb24gbWF0Y2ggYW5kIHRoZXJlIGlzIG90aGVyIHZlcnNpb24gLT4gQU1CSUdVT1VTCisJICogIElmIHNvbWUgb2YgdGhlIHBsdWdpbnMgYXJlIG9uIHRoZSBwbHVnaW4gcGF0aCwgYnV0IG5vdCBhbGwgLT4gVU5IQVBQWQorCSAqIAlDaGVjayBvbiBhbGwgQ29uZmlndXJlZFNpdGVzCisJICovCisJcHVibGljIElTdGF0dXMgZ2V0RmVhdHVyZVN0YXR1cyhJRmVhdHVyZSBmZWF0dXJlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisKKwkJSUZlYXR1cmUgY2hpbGRGZWF0dXJlID0gbnVsbDsKKwkJSVN0YXR1cyBjaGlsZFN0YXR1czsKKworCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGNoaWxkcmVuID0gZmVhdHVyZS5nZXRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCk7CisKKwkJLy8gY29uc2lkZXIgZGlzYWJsZQorCQkvLyBjaGVjayB0aGUgY3VycmVudCBmZWF0dXJlCisJCVN0cmluZyBtc2cgPSBNZXNzYWdlcy5TaXRlTG9jYWxfRmVhdHVyZURpc2FibGU7CisJCWludCBjb2RlID0gSUZlYXR1cmUuU1RBVFVTX0RJU0FCTEVEOworCQlJU3RhdHVzIGZlYXR1cmVTdGF0dXMgPSBnZXRTdGF0dXMoZmVhdHVyZSk7CisJCU11bHRpU3RhdHVzIG11bHRpVGVtcCA9IG5ldyBNdWx0aVN0YXR1cyhmZWF0dXJlU3RhdHVzLmdldFBsdWdpbigpLCBjb2RlLCBtc2csIG51bGwpOworCQlpZiAoZmVhdHVyZVN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpIHsKKwkJCWlmIChmZWF0dXJlU3RhdHVzLmlzTXVsdGlTdGF0dXMoKSkgeworCQkJCW11bHRpVGVtcC5hZGRBbGwoZmVhdHVyZVN0YXR1cyk7CisJCQl9IGVsc2UgeworCQkJCW11bHRpVGVtcC5hZGQoZmVhdHVyZVN0YXR1cyk7CisJCQl9CisJCX0KKwkJLy8gcHJlc2VydmUgdGhlIHdvcnNlIGNvZGUgdGhyb3VnaCB0aGUgbWV0aG9kIChzZWxmIGFzc2VzbWVudCArIGNoaWxkcmVuIGFzc2Vzc21lbnQpCisJCWlmIChmZWF0dXJlU3RhdHVzLmdldENvZGUoKSA+IGNvZGUpCisJCQljb2RlID0gZmVhdHVyZVN0YXR1cy5nZXRDb2RlKCk7CisKKwkJLy8gZG8gbm90IGNoZWNrIGNoaWxkcmVuIGlmIGZlYXR1cmUgaXMgZGlzYWJsZQorCQlpZiAoIShjb2RlID09IElGZWF0dXJlLlNUQVRVU19ESVNBQkxFRCkpIHsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKKwkJCQlpZiAoIVVwZGF0ZU1hbmFnZXJVdGlscy5pc09wdGlvbmFsKGNoaWxkcmVuW2ldKSkgeworCQkJCQl0cnkgeworCQkJCQkJY2hpbGRGZWF0dXJlID0gY2hpbGRyZW5baV0uZ2V0RmVhdHVyZShudWxsKTsKKwkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkJCQljaGlsZEZlYXR1cmUgPSBudWxsOworCQkJCQkJaWYgKCFVcGRhdGVNYW5hZ2VyVXRpbHMuaXNPcHRpb25hbChjaGlsZHJlbltpXSkpCisJCQkJCQkJVXBkYXRlQ29yZS53YXJuKCJFcnJvciByZXRyaWV2aW5nIGZlYXR1cmU6IiArIGNoaWxkcmVuW2ldKTsgLy8kTk9OLU5MUy0xJAorCQkJCQl9CisKKwkJCQkJaWYgKGNoaWxkRmVhdHVyZSA9PSBudWxsKSB7CisJCQkJCQlVcGRhdGVDb3JlLndhcm4oImdldEZlYXR1cmVTdGF0dXM6IEZlYXR1cmUgaXMgbnVsbCBmb3I6IiArIGNoaWxkcmVuW2ldKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJLy8gVW5hYmxlIHRvIGZpbmQgY2hpbGRyZW4gZmVhdHVyZSwgYnJva2VuCisJCQkJCQlPYmplY3QgZmVhdHVyZUFzUHJpbnRhYmxlT2JqZWN0ID0gY2hpbGRyZW5baV0uZ2V0VVJMKCk7CisJCQkJCQlmZWF0dXJlQXNQcmludGFibGVPYmplY3QgPSBjaGlsZHJlbltpXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7CisJCQkJCQlTdHJpbmcgbXNnMSA9IE5MUy5iaW5kKE1lc3NhZ2VzLlNpdGVMb2NhbF9OZXN0ZWRGZWF0dXJlVW5hdmFpbGFibGUsIChuZXcgT2JqZWN0W10ge2ZlYXR1cmVBc1ByaW50YWJsZU9iamVjdH0pKTsKKwkJCQkJCW11bHRpVGVtcC5hZGQoY3JlYXRlU3RhdHVzKElTdGF0dXMuRVJST1IsIElGZWF0dXJlLlNUQVRVU19VTkhBUFBZLCBtc2cxLCBudWxsKSk7CisJCQkJCQlpZiAoSUZlYXR1cmUuU1RBVFVTX1VOSEFQUFkgPiBjb2RlKQorCQkJCQkJCWNvZGUgPSBJRmVhdHVyZS5TVEFUVVNfVU5IQVBQWTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWNoaWxkU3RhdHVzID0gZ2V0RmVhdHVyZVN0YXR1cyhjaGlsZEZlYXR1cmUpOworCQkJCQkJLy8gZG8gbm90IGFkZCB0aGUgc3RhdHVzLCBhZGQgdGhlIGNoaWxkcmVuIHN0YXR1cyBhcyBnZXRGZWF0dXJlU3RhdHVzCisJCQkJCQkvLyByZXR1cm5zIGEgbXVsdGlTdGF0dXMgCisJCQkJCQlpZiAoY2hpbGRTdGF0dXMuZ2V0Q29kZSgpID09IElGZWF0dXJlLlNUQVRVU19ESVNBQkxFRCkgeworCQkJCQkJCVZlcnNpb25lZElkZW50aWZpZXIgdmVyc2lvbklEID0gY2hpbGRGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKTsKKwkJCQkJCQlTdHJpbmcgZmVhdHVyZVZlciA9ICh2ZXJzaW9uSUQgPT0gbnVsbCkgPyAiIiA6IHZlcnNpb25JRC5nZXRWZXJzaW9uKCkudG9TdHJpbmcoKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCVN0cmluZyBtc2cxID0gTkxTLmJpbmQoTWVzc2FnZXMuU2l0ZUxvY2FsX05lc3RlZEZlYXR1cmVEaXNhYmxlLCAobmV3IFN0cmluZ1tdIHtjaGlsZEZlYXR1cmUuZ2V0TGFiZWwoKSwgZmVhdHVyZVZlcn0pKTsKKwkJCQkJCQltdWx0aVRlbXAuYWRkKGNyZWF0ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLCBjaGlsZFN0YXR1cy5nZXRDb2RlKCksIG1zZzEsIG51bGwpKTsKKwkJCQkJCQlpZiAoSUZlYXR1cmUuU1RBVFVTX1VOSEFQUFkgPiBjb2RlKQorCQkJCQkJCQljb2RlID0gSUZlYXR1cmUuU1RBVFVTX1VOSEFQUFk7CisJCQkJCQl9CisJCQkJCQlpZiAoY2hpbGRTdGF0dXMuZ2V0U2V2ZXJpdHkoKSAhPSBJU3RhdHVzLk9LKSB7CisJCQkJCQkJVmVyc2lvbmVkSWRlbnRpZmllciB2ZXJzaW9uSUQgPSBjaGlsZEZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOworCQkJCQkJCVN0cmluZyBmZWF0dXJlVmVyID0gKHZlcnNpb25JRCA9PSBudWxsKSA/ICIiIDogdmVyc2lvbklELmdldFZlcnNpb24oKS50b1N0cmluZygpOyAvLyROT04tTkxTLTEkCisJCQkJCQkJU3RyaW5nIG1zZzEgPSBOTFMuYmluZChNZXNzYWdlcy5TaXRlTG9jYWxfTmVzdGVkRmVhdHVyZVVuSGFwcHksIChuZXcgU3RyaW5nW10ge2NoaWxkRmVhdHVyZS5nZXRMYWJlbCgpLCBmZWF0dXJlVmVyfSkpOworCQkJCQkJCW11bHRpVGVtcC5hZGQoY3JlYXRlU3RhdHVzKElTdGF0dXMuRVJST1IsIGNoaWxkU3RhdHVzLmdldENvZGUoKSwgbXNnMSwgbnVsbCkpOworCQkJCQkJCWlmIChjaGlsZFN0YXR1cy5nZXRDb2RlKCkgPiBjb2RlKQorCQkJCQkJCQljb2RlID0gY2hpbGRTdGF0dXMuZ2V0Q29kZSgpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisKKwkJLy8gc2V0IG1lc3NhZ2UKKwkJc3dpdGNoIChjb2RlKSB7CisJCQljYXNlIElGZWF0dXJlLlNUQVRVU19IQVBQWSA6CisJCQkJbXNnID0gTWVzc2FnZXMuU2l0ZUxvY2FsX0ZlYXR1cmVIYXBweTsKKwkJCQlicmVhazsKKwkJCWNhc2UgSUZlYXR1cmUuU1RBVFVTX1VOSEFQUFkgOgorCQkJCW1zZyA9IE1lc3NhZ2VzLlNpdGVMb2NhbF9GZWF0dXJlVW5IYXBweTsKKwkJCQlicmVhazsKKwkJCWNhc2UgSUZlYXR1cmUuU1RBVFVTX0FNQklHVU9VUyA6CisJCQkJbXNnID0gTWVzc2FnZXMuU2l0ZUxvY2FsX0ZlYXR1cmVBbWJpZ3VvdXM7CisJCQkJYnJlYWs7CisJCQljYXNlIElGZWF0dXJlLlNUQVRVU19ESVNBQkxFRCA6CisJCQkJbXNnID0gTWVzc2FnZXMuU2l0ZUxvY2FsX0ZlYXR1cmVEaXNhYmxlOworCQkJCWJyZWFrOworCQkJZGVmYXVsdCA6CisJCQkJbXNnID0gTWVzc2FnZXMuU2l0ZUxvY2FsX0ZlYXR1cmVTdGF0dXNVbmtub3duOworCQkJCWJyZWFrOworCQl9CisJCU11bHRpU3RhdHVzIG11bHRpID0gbmV3IE11bHRpU3RhdHVzKGZlYXR1cmVTdGF0dXMuZ2V0UGx1Z2luKCksIGNvZGUsIG1zZywgbnVsbCk7CisJCW11bHRpLmFkZEFsbChtdWx0aVRlbXApOworCQlyZXR1cm4gbXVsdGk7CisJfQorCisJLyoKKwkgKiBjb21wdXRlIHRoZSBzdGF0dXMgYmFzZWQgb24gZ2V0U3RhdHVzKCkgcnVsZXMgCisJICovCisJcHJpdmF0ZSBJU3RhdHVzIHN0YXR1cyhJRmVhdHVyZSBwbHVnaW5zT3JpZ2luYXRvckZlYXR1cmUsIElQbHVnaW5FbnRyeVtdIGZlYXR1cmVQbHVnaW5zKSB7CisJCVZlcnNpb25lZElkZW50aWZpZXIgZmVhdHVyZVBsdWdpbklEOworCisJCVN0cmluZyBoYXBweU1TRyA9IE1lc3NhZ2VzLlNpdGVMb2NhbF9GZWF0dXJlSGFwcHk7CisJCVN0cmluZyBhbWJpZ3VvdXNNU0cgPSBNZXNzYWdlcy5TaXRlTG9jYWxfRmVhdHVyZUFtYmlndW91czsKKwkJSVN0YXR1cyBmZWF0dXJlU3RhdHVzID0gY3JlYXRlU3RhdHVzKElTdGF0dXMuT0ssIElGZWF0dXJlLlNUQVRVU19IQVBQWSwgIiIsIG51bGwpOyAvLyROT04tTkxTLTEkCisJCU11bHRpU3RhdHVzIG11bHRpID0gbmV3IE11bHRpU3RhdHVzKGZlYXR1cmVTdGF0dXMuZ2V0UGx1Z2luKCksIElGZWF0dXJlLlNUQVRVU19BTUJJR1VPVVMsIGFtYmlndW91c01TRywgbnVsbCk7CisJCVBhY2thZ2VBZG1pbiBwa2dBZG1pbiA9IFVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0UGFja2FnZUFkbWluKCk7CisKKwkJLy8gaXMgQW1iaWdvdXMgaWYgd2UgZmluZCBhIHBsdWdpbiBmcm9tIHRoZSBmZWF0dXJlCisJCS8vIHdpdGggYSBkaWZmZXJlbnQgdmVyc2lvbiBhbmQgbm90IHRoZSBvbmUgd2UgYXJlIGxvb2tpbmcKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlUGx1Z2lucy5sZW5ndGg7IGkrKykgeworCQkJTXVsdGlTdGF0dXMgdGVtcG11bHRpID0gbmV3IE11bHRpU3RhdHVzKGZlYXR1cmVTdGF0dXMuZ2V0UGx1Z2luKCksIElGZWF0dXJlLlNUQVRVU19BTUJJR1VPVVMsIGFtYmlndW91c01TRywgbnVsbCk7CisJCQlmZWF0dXJlUGx1Z2luSUQgPSBmZWF0dXJlUGx1Z2luc1tpXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7CisJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7CisKKwkJCVN0cmluZyBzaW5nbGVWZXJzaW9uUmFuZ2UgPSAnWycgKyBmZWF0dXJlUGx1Z2luSUQuZ2V0VmVyc2lvbigpLnRvU3RyaW5nKCkgKyAnLCcgKyBmZWF0dXJlUGx1Z2luSUQuZ2V0VmVyc2lvbigpLnRvU3RyaW5nKCkgKyAnXSc7CisJCQlCdW5kbGVbXSBidW5kbGVzID0gcGtnQWRtaW4uZ2V0QnVuZGxlcyhmZWF0dXJlUGx1Z2luSUQuZ2V0SWRlbnRpZmllcigpLCBzaW5nbGVWZXJzaW9uUmFuZ2UpOworCQkJaWYgKGJ1bmRsZXMgIT0gbnVsbCAmJiBidW5kbGVzLmxlbmd0aCA9PSAxKSB7CisJCQkJZm91bmQgPSB0cnVlOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQkvLyBDaGVjayBpZiB0aGVyZSBpcyBhbm90aGVyIGZlYXR1cmUgd2l0aCB0aGlzIHBsdWdpbiAoYnV0IGRpZmZlcmVudCB2ZXJzaW9uKQorCQkJLy8gbG9nIGl0CisJCQlidW5kbGVzID0gcGtnQWRtaW4uZ2V0QnVuZGxlcyhmZWF0dXJlUGx1Z2luSUQuZ2V0SWRlbnRpZmllcigpLCBudWxsKTsKKwkJCWZvciAoaW50IGogPSAwOyBidW5kbGVzICE9IG51bGwgJiYgaiA8IGJ1bmRsZXMubGVuZ3RoICYmICFmb3VuZDsgaisrKSB7CisJCQkJU3RyaW5nIGJ1bmRsZVZlcnNpb24gPSAoU3RyaW5nKSBidW5kbGVzW2pdLmdldEhlYWRlcnMoKS5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKTsKKwkJCQlJRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZUZvcklkKG5ldyBWZXJzaW9uZWRJZGVudGlmaWVyKGJ1bmRsZXNbal0uZ2V0U3ltYm9saWNOYW1lKCksIGJ1bmRsZVZlcnNpb24pKTsKKwkJCQlpZiAoKGZlYXR1cmUgIT0gbnVsbCkgJiYgKCFpc0ZlYXR1cmVQYXRjaE9mVGhpc0ZlYXR1cmUocGx1Z2luc09yaWdpbmF0b3JGZWF0dXJlLCBmZWF0dXJlKSkpIHsKKwkJCQkJU3RyaW5nIG1zZyA9IG51bGw7CisJCQkJCVN0cmluZyBsYWJlbCA9IGZlYXR1cmUuZ2V0TGFiZWwoKTsKKwkJCQkJU3RyaW5nIGZlYXR1cmVWZXJzaW9uID0gZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0VmVyc2lvbigpLnRvU3RyaW5nKCk7CisJCQkJCU9iamVjdFtdIHZhbHVlcyA9IG5ldyBPYmplY3RbXSB7YnVuZGxlc1tqXS5nZXRTeW1ib2xpY05hbWUoKSwgZmVhdHVyZVBsdWdpbklELmdldFZlcnNpb24oKSwgYnVuZGxlVmVyc2lvbiwgbGFiZWwsIGZlYXR1cmVWZXJzaW9ufTsKKwkJCQkJbXNnID0gTkxTLmJpbmQoTWVzc2FnZXMuU2l0ZUxvY2FsX1R3b1ZlcnNpb25TYW1lUGx1Z2luMiwgdmFsdWVzKTsKKwkJCQkJVXBkYXRlQ29yZS53YXJuKCJGb3VuZCBhbm90aGVyIHZlcnNpb24gb2YgdGhlIHNhbWUgcGx1Z2luIG9uIHRoZSBwYXRoOiIgKyBidW5kbGVzW2pdLmdldFN5bWJvbGljTmFtZSgpICsgIiAiICsgYnVuZGxlVmVyc2lvbik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCQl0ZW1wbXVsdGkuYWRkKGNyZWF0ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLCBJRmVhdHVyZS5TVEFUVVNfQU1CSUdVT1VTLCBtc2csIG51bGwpKTsKKwkJCQl9IGVsc2UgeworCQkJCQlmb3VuZCA9IHRydWU7CisJCQkJfQorCisJCQl9CisKKwkJCS8vIGNoZWNrIHdoZXRoZXIgdGhlIHBsdWdpbiBpcyBhIHNvdXJjZSBidW5kbGUKKwkJCS8vIHRoYXQgaGFzIG5vdCBiZWVuIGNvbmZpZ3VyZWQgaW50byB0aGUgcnVudGltZQorCQkJaWYgKCFmb3VuZCkgeworCQkJCWxvYWRTb3VyY2VCdW5kbGVzTGlzdCgpOworCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHNvdXJjZUJ1bmRsZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisJCQkJCVZlcnNpb25lZElkZW50aWZpZXIgbmV4dElkID0gKFZlcnNpb25lZElkZW50aWZpZXIpIGl0ZXIubmV4dCgpOworCQkJCQlpZiAoZmVhdHVyZVBsdWdpbklELmVxdWFscyhuZXh0SWQpKSB7CisJCQkJCQlmb3VuZCA9IHRydWU7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJLy8gaWYgd2UgaGF2ZW4ndCBmb3VuZCB0aGUgZXhhY3QgcGx1Z2luLCBhZGQgdGhlIGNoaWxkcmVuCisJCQkvLyBvZiB0ZW1wTXVsdGkgKGksZSB0aGUgb3RoZXIgd2UgZm91bmQpIAorCQkJLy8gaWYgd2UgaGF2ZSBubyBjaGlsZHJlbiwgd2UgaGF2ZSBhIHByb2JsZW0gYXMgYSByZXF1aXJlZCBwbHVnaW4gaXMgbm90IHRoZXJlIGF0IGFsbAorCQkJaWYgKCFmb3VuZCkgeworCQkJCWlmICh0ZW1wbXVsdGkuZ2V0Q2hpbGRyZW4oKS5sZW5ndGggPiAwKSB7CisJCQkJCW11bHRpLmFkZEFsbCh0ZW1wbXVsdGkpOworCQkJCX0gZWxzZSB7CisJCQkJCWlmIChtdWx0aS5nZXRDb2RlKCkgIT0gSUZlYXR1cmUuU1RBVFVTX1VOSEFQUFkpIHsKKwkJCQkJCVN0cmluZyB1bmhhcHB5TVNHID0gTWVzc2FnZXMuU2l0ZUxvY2FsX0ZlYXR1cmVVbkhhcHB5OworCQkJCQkJTXVsdGlTdGF0dXMgbmV3TXVsdGkgPSBuZXcgTXVsdGlTdGF0dXMoZmVhdHVyZVN0YXR1cy5nZXRQbHVnaW4oKSwgSUZlYXR1cmUuU1RBVFVTX1VOSEFQUFksIHVuaGFwcHlNU0csIG51bGwpOworCQkJCQkJbmV3TXVsdGkuYWRkQWxsKG11bHRpKTsKKwkJCQkJCW11bHRpID0gbmV3TXVsdGk7CisJCQkJCX0KKwkJCQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKE1lc3NhZ2VzLlNpdGVMb2NhbF9Ob1BsdWdpblZlcnNpb24sIChuZXcgU3RyaW5nW10ge2ZlYXR1cmVQbHVnaW5JRC5nZXRJZGVudGlmaWVyKCl9KSk7CisJCQkJCW11bHRpLmFkZChjcmVhdGVTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSUZlYXR1cmUuU1RBVFVTX1VOSEFQUFksIG1zZywgbnVsbCkpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmICghbXVsdGkuaXNPSygpKQorCQkJcmV0dXJuIG11bHRpOworCisJCS8vIHdlIHJldHVybiBoYXBweSBhcyB3ZSBjb25zaWRlciB0aGUgaXNCcm9rZW4gdmVyaWZpY2F0aW9uIGhhcyBiZWVuIGRvbmUKKwkJcmV0dXJuIGNyZWF0ZVN0YXR1cyhJU3RhdHVzLk9LLCBJRmVhdHVyZS5TVEFUVVNfSEFQUFksIGhhcHB5TVNHLCBudWxsKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIEZpbGUgdG9GaWxlKFVSTCB1cmwpIHsKKwkJdHJ5IHsKKwkJCWlmICghImZpbGUiLmVxdWFsc0lnbm9yZUNhc2UodXJsLmdldFByb3RvY29sKCkpKSAvLyROT04tTkxTLTEkCisJCQkJcmV0dXJuIG51bGw7CisJCQkvL2Fzc3VtZSBhbGwgaWxsZWdhbCBjaGFyYWN0ZXJzIGhhdmUgYmVlbiBwcm9wZXJseSBlbmNvZGVkLCBzbyB1c2UgVVJJIGNsYXNzIHRvIHVuZW5jb2RlCisJCQlyZXR1cm4gbmV3IEZpbGUobmV3IFVSSSh1cmwudG9FeHRlcm5hbEZvcm0oKSkpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJLy9VUkwgY29udGFpbnMgdW5lbmNvZGVkIGNoYXJhY3RlcnMKKwkJCXJldHVybiBuZXcgRmlsZSh1cmwuZ2V0RmlsZSgpKTsKKwkJfQorCX0KKworCS8qKgorCSAqIAlHZXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBzb3VyY2UgYnVuZGxlcyB0ZXh0IGZpbGUuCisJICovCisJcHJpdmF0ZSB2b2lkIGxvYWRTb3VyY2VCdW5kbGVzTGlzdCgpIHsKKwkJaWYgKHNvdXJjZUJ1bmRsZXMgIT0gbnVsbCkKKwkJCXJldHVybjsKKworCQlzb3VyY2VCdW5kbGVzID0gbmV3IEFycmF5TGlzdCgzMik7CisJCUlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24gY29uZmlnID0gQ29uZmlndXJhdG9yVXRpbHMuZ2V0Q3VycmVudFBsYXRmb3JtQ29uZmlndXJhdGlvbigpOworCQlVUkwgY29uZmlnTG9jYXRpb24gPSBjb25maWcuZ2V0Q29uZmlndXJhdGlvbkxvY2F0aW9uKCk7CisJCWlmIChjb25maWdMb2NhdGlvbiA9PSBudWxsKQorCQkJcmV0dXJuOworCQkvLyBEcm9wIG9mZiAvb3JnLmVjbGlwc2UudXBkYXRlL3BsYXRmb3JtLnhtbAorCQlGaWxlIGNvbmZpZ0RpciA9IHRvRmlsZShjb25maWdMb2NhdGlvbik7CisJCWNvbmZpZ0RpciA9IGNvbmZpZ0Rpci5nZXRQYXJlbnRGaWxlKCk7CisJCWlmIChjb25maWdEaXIgPT0gbnVsbCkKKwkJCXJldHVybjsKKwkJY29uZmlnRGlyID0gY29uZmlnRGlyLmdldFBhcmVudEZpbGUoKTsKKwkJaWYgKGNvbmZpZ0RpciA9PSBudWxsKQorCQkJcmV0dXJuOworCQlGaWxlIHNvdXJjZUJ1bmRsZXNGaWxlID0gbmV3IEZpbGUoY29uZmlnRGlyLCBTT1VSQ0VfQlVORExFU19QQVRIKTsKKworCQl0cnkgeworCQkJQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKHNvdXJjZUJ1bmRsZXNGaWxlKSk7CisJCQlTdHJpbmcgbGluZTsKKwkJCXRyeSB7CisJCQkJd2hpbGUgKChsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKKwkJCQkJaWYgKGxpbmUuc3RhcnRzV2l0aCgiIyIpKQorCQkJCQkJY29udGludWU7CisJCQkJCWxpbmUgPSBsaW5lLnRyaW0oKTsvLyBzeW1ib2xpY05hbWUsdmVyc2lvbixvdGhlciBpZ25vcmVkIHN0dWZmCisJCQkJCWlmIChsaW5lLmxlbmd0aCgpID09IDApCisJCQkJCQljb250aW51ZTsKKworCQkJCQlTdHJpbmdUb2tlbml6ZXIgdG9rID0gbmV3IFN0cmluZ1Rva2VuaXplcihsaW5lLCAiLCIsIHRydWUpOworCQkJCQlTdHJpbmcgc3ltYm9saWNOYW1lID0gdG9rLm5leHRUb2tlbigpOworCQkJCQlpZiAoc3ltYm9saWNOYW1lLmVxdWFscygiLCIpKQorCQkJCQkJY29udGludWU7CisJCQkJCWVsc2UKKwkJCQkJCXRvay5uZXh0VG9rZW4oKTsgLy8gLAorCisJCQkJCVN0cmluZyB2ZXJzaW9uID0gdG9rLm5leHRUb2tlbigpOworCQkJCQlpZiAodmVyc2lvbi5lcXVhbHMoIiwiKSkKKwkJCQkJCWNvbnRpbnVlOworCQkJCQllbHNlCisJCQkJCQl0b2submV4dFRva2VuKCk7IC8vICwKKworCQkJCQlWZXJzaW9uZWRJZGVudGlmaWVyIHNvdXJjZUlkID0gbmV3IFZlcnNpb25lZElkZW50aWZpZXIoc3ltYm9saWNOYW1lLCB2ZXJzaW9uKTsKKwkJCQkJc291cmNlQnVuZGxlcy5hZGQoc291cmNlSWQpOworCQkJCX0KKwkJCX0gZmluYWxseSB7CisJCQkJdHJ5IHsKKwkJCQkJcmVhZGVyLmNsb3NlKCk7CisJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKwkJCQkJLy8gaWdub3JlCisJCQkJfQorCQkJfQorCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworCQkJVXBkYXRlQ29yZS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBJRCwgIkVycm9yIG9jY3VycmVkIHdoaWxlIHJlYWRpbmcgc291cmNlIGJ1bmRsZSBsaXN0LiIsIGUpKTsgLy8kTk9OLU5MUy0xJAorCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQlVcGRhdGVDb3JlLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIElELCAiRXJyb3Igb2NjdXJyZWQgd2hpbGUgcmVhZGluZyBzb3VyY2UgYnVuZGxlIGxpc3QuIiwgZSkpOyAvLyROT04tTkxTLTEkCisJCX0KKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gaXNGZWF0dXJlUGF0Y2hPZlRoaXNGZWF0dXJlKElGZWF0dXJlIHBsdWdpbnNPcmlnaW5hdG9yRmVhdHVyZSwgSUZlYXR1cmUgZmVhdHVyZSkgeworCisJCWlmICghZmVhdHVyZS5pc1BhdGNoKCkpCisJCQlyZXR1cm4gZmFsc2U7CisKKwkJSUltcG9ydFtdIGZlYXR1cmVJbXBvcnRzID0gZmVhdHVyZS5nZXRJbXBvcnRzKCk7CisKKwkJaWYgKGZlYXR1cmVJbXBvcnRzID09IG51bGwpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZUltcG9ydHMubGVuZ3RoOyBpKyspIHsKKwkJCWlmIChmZWF0dXJlSW1wb3J0c1tpXS5pc1BhdGNoKCkgJiYgZmVhdHVyZUltcG9ydHNbaV0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmVxdWFscyhwbHVnaW5zT3JpZ2luYXRvckZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpKSkgeworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKgorCSAqIGNyZWF0ZXMgYSBTdGF0dXMKKwkgKi8KKwlwcml2YXRlIElTdGF0dXMgY3JlYXRlU3RhdHVzKGludCBzdGF0dXNTZXZlcml0eSwgaW50IHN0YXR1c0NvZGUsIFN0cmluZyBtc2csIEV4Y2VwdGlvbiBlKSB7CisJCVN0cmluZyBpZCA9IFVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCk7CisKKwkJU3RyaW5nQnVmZmVyIGNvbXBsZXRlU3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigiIik7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKG1zZyAhPSBudWxsKQorCQkJY29tcGxldGVTdHJpbmcuYXBwZW5kKG1zZyk7CisJCWlmIChlICE9IG51bGwpIHsKKwkJCWNvbXBsZXRlU3RyaW5nLmFwcGVuZCgiXHJcblsiKTsgLy8kTk9OLU5MUy0xJAorCQkJY29tcGxldGVTdHJpbmcuYXBwZW5kKGUudG9TdHJpbmcoKSk7CisJCQljb21wbGV0ZVN0cmluZy5hcHBlbmQoIl1cclxuIik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlyZXR1cm4gbmV3IFN0YXR1cyhzdGF0dXNTZXZlcml0eSwgaWQsIHN0YXR1c0NvZGUsIGNvbXBsZXRlU3RyaW5nLnRvU3RyaW5nKCksIGUpOworCX0KKworCS8qCisJICogcmV0dXJucyBhbGwgdGhlIGNvbmZpZ3VyZWQgZmV0YXVyZXMKKwkgKi8KKwlwcml2YXRlIElGZWF0dXJlW10gZ2V0QWxsQ29uZmlndXJlZEZlYXR1cmVzKCkgeworCQlpZiAoYWxsQ29uZmlndXJlZEZlYXR1cmVzID09IG51bGwpIHsKKworCQkJYWxsQ29uZmlndXJlZEZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOworCQkJSUNvbmZpZ3VyZWRTaXRlW10gYWxsQ29uZmlndXJlZFNpdGVzID0gc2l0ZUxvY2FsLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkuZ2V0Q29uZmlndXJlZFNpdGVzKCk7CisKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWxsQ29uZmlndXJlZFNpdGVzLmxlbmd0aDsgaSsrKSB7CisJCQkJSUZlYXR1cmVSZWZlcmVuY2VbXSByZWZzID0gYWxsQ29uZmlndXJlZFNpdGVzW2ldLmdldENvbmZpZ3VyZWRGZWF0dXJlcygpOworCQkJCUlGZWF0dXJlIGZlYXR1cmUgPSBudWxsOworCQkJCWZvciAoaW50IGogPSAwOyBqIDwgcmVmcy5sZW5ndGg7IGorKykgeworCQkJCQlmZWF0dXJlID0gbnVsbDsKKwkJCQkJdHJ5IHsKKwkJCQkJCWZlYXR1cmUgPSByZWZzW2pdLmdldEZlYXR1cmUobnVsbCk7CisJCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJCQl9CisJCQkJCWlmIChmZWF0dXJlICE9IG51bGwpIHsKKwkJCQkJCWFsbENvbmZpZ3VyZWRGZWF0dXJlcy5hZGQoZmVhdHVyZSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKworCQlJRmVhdHVyZVtdIGZlYXR1cmVzID0gbmV3IElGZWF0dXJlW2FsbENvbmZpZ3VyZWRGZWF0dXJlcy5zaXplKCldOworCQlpZiAoYWxsQ29uZmlndXJlZEZlYXR1cmVzLnNpemUoKSA+IDApIHsKKwkJCWFsbENvbmZpZ3VyZWRGZWF0dXJlcy50b0FycmF5KGZlYXR1cmVzKTsKKwkJfQorCQlyZXR1cm4gZmVhdHVyZXM7CisJfQorCisJLyoKKwkgKiByZXR1cm5zIHRoZSBGZWF0dXJlIHRoYXQgZGVjbGFyZXMgdGhpcyB2ZXJzaW9uZWRJZGVudGlmaWVyIG9yIG51bGwgaWYgbm9uZSBmb3VuZAorCSAqLworCXByaXZhdGUgSUZlYXR1cmUgZ2V0RmVhdHVyZUZvcklkKFZlcnNpb25lZElkZW50aWZpZXIgaWQpIHsKKworCQlpZiAoaWQgPT0gbnVsbCkKKwkJCXJldHVybiBudWxsOworCisJCUlGZWF0dXJlW10gYWxsRmVhdHVyZXMgPSBnZXRBbGxDb25maWd1cmVkRmVhdHVyZXMoKTsKKwkJSUZlYXR1cmUgY3VycmVudEZlYXR1cmUgPSBudWxsOworCQlJUGx1Z2luRW50cnlbXSBhbGxQbHVnaW5zID0gbnVsbDsKKwkJSVBsdWdpbkVudHJ5IGN1cnJlbnRQbHVnaW4gPSBudWxsOworCQlmb3IgKGludCBpID0gMDsgaSA8IGFsbEZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7CisJCQljdXJyZW50RmVhdHVyZSA9IGFsbEZlYXR1cmVzW2ldOworCQkJYWxsUGx1Z2lucyA9IGN1cnJlbnRGZWF0dXJlLmdldFBsdWdpbkVudHJpZXMoKTsKKwkJCWZvciAoaW50IGogPSAwOyBqIDwgYWxsUGx1Z2lucy5sZW5ndGg7IGorKykgeworCQkJCWN1cnJlbnRQbHVnaW4gPSBhbGxQbHVnaW5zW2pdOworCQkJCWlmIChpZC5lcXVhbHMoY3VycmVudFBsdWdpbi5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkpKQorCQkJCQlyZXR1cm4gY3VycmVudEZlYXR1cmU7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9TaXRlVHlwZUZhY3RvcnkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvU2l0ZVR5cGVGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUyNmY3NgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvU2l0ZVR5cGVGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw5MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKKworLyoqCisgKiAKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFNpdGVUeXBlRmFjdG9yeSB7CisJCisKKwkvKioKKwkgKiBleHRlbnNpb24gcG9pbnQgSUQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSU1QTEVfRVhURU5TSU9OX0lEID0gInNpdGVUeXBlcyI7CSAvLyROT04tTkxTLTEkCisJCisKKwlwcml2YXRlIHN0YXRpYyBTaXRlVHlwZUZhY3RvcnkgaW5zdDsKKwkKKwlwcml2YXRlIE1hcCBmYWN0b3JpZXM7CisKKwkvKioKKwkgKiBoaWRlIGN0ciAKKwkgKi8KKwlwcml2YXRlIFNpdGVUeXBlRmFjdG9yeSgpIHsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFNpdGVUeXBlRmFjdG9yeSBnZXRJbnN0YW5jZSgpIHsKKwkJaWYgKGluc3QgPT0gbnVsbCkKKwkJCWluc3QgPSBuZXcgU2l0ZVR5cGVGYWN0b3J5KCk7CisJCXJldHVybiBpbnN0OworCX0KKworCisJLyoqCisJICogcmV0dXJuIHRoZSBmYWN0b3J5IGZvciB0aGUgdHlwZQorCSAqLworCXB1YmxpYyBJU2l0ZUZhY3RvcnkgZ2V0RmFjdG9yeShTdHJpbmcgdHlwZSkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQkJLy8KKwkJCU9iamVjdCBpbnN0YW5jZSA9IGdldEZhY3RvcmllcygpLmdldCh0eXBlKTsKKwkJCWlmIChpbnN0YW5jZT09bnVsbCkgeworCQkJCWluc3RhbmNlID0gY3JlYXRlRmFjdG9yeUZvcih0eXBlKTsKKwkJCQlnZXRGYWN0b3JpZXMoKS5wdXQodHlwZSxpbnN0YW5jZSk7CisJCQl9CisJCQlyZXR1cm4gKElTaXRlRmFjdG9yeSkgaW5zdGFuY2U7CisJfQorCisJLyoqCisJICogCisJICovCisJcHJpdmF0ZSBJU2l0ZUZhY3RvcnkgY3JlYXRlRmFjdG9yeUZvcihTdHJpbmcgdHlwZSkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlJU2l0ZUZhY3RvcnkgcmVzdWx0ID0gbnVsbDsKKwkJCisJCVN0cmluZyBwbHVnaW5JRCA9IFVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCk7CisJCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7CisJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gcmVnaXN0cnkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKHBsdWdpbklELFNJTVBMRV9FWFRFTlNJT05fSUQsdHlwZSk7CisJCWlmIChlbGVtZW50cz09bnVsbCB8fCBlbGVtZW50cy5sZW5ndGg9PTApeworCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oTkxTLmJpbmQoTWVzc2FnZXMuU2l0ZVR5cGVGYWN0b3J5X1VuYWJsZVRvRmluZFNpdGVGYWN0b3J5LCAobmV3IFN0cmluZ1tdIHsgdHlwZSB9KSksbnVsbCk7CisJCX0gZWxzZSB7CisJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCA9IGVsZW1lbnRzWzBdOworCQkJcmVzdWx0ID0gKElTaXRlRmFjdG9yeSllbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIEdldHMgdGhlIGFjdG9yaWVzLgorCSAqIEByZXR1cm4gUmV0dXJucyBhIE1hcAorCSAqLworCXByaXZhdGUgTWFwIGdldEZhY3RvcmllcygpIHsKKwkJaWYgKGZhY3Rvcmllcz09bnVsbCkgZmFjdG9yaWVzID0gbmV3IEhhc2hNYXAoKTsKKwkJCXJldHVybiBmYWN0b3JpZXM7CisJfQorCisKK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvU2l0ZVVSTENvbnRlbnRQcm92aWRlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9TaXRlVVJMQ29udGVudFByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYwNzBjOQotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvU2l0ZVVSTENvbnRlbnRQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsKKworaW1wb3J0IGphdmEubmV0LlVSTDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlNpdGVDb250ZW50UHJvdmlkZXI7CisKKy8qKgorICogCisgKi8KK3B1YmxpYyBjbGFzcyBTaXRlVVJMQ29udGVudFByb3ZpZGVyIGV4dGVuZHMgU2l0ZUNvbnRlbnRQcm92aWRlciB7CisJCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lURV9UWVBFID0gIm9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmh0dHAiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBDb25zdHJ1Y3RvciBmb3IgSFRUUFNpdGUKKwkgKi8KKwlwdWJsaWMgU2l0ZVVSTENvbnRlbnRQcm92aWRlcihVUkwgdXJsKSB7CisJCXN1cGVyKHVybCk7CisJfQorfQorCisKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvU2l0ZVVSTEZhY3RvcnkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvU2l0ZVVSTEZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTQwYTg1Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9TaXRlVVJMRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMTE4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuQmFzZVNpdGVGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklTaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklTaXRlRmFjdG9yeUV4dGVuc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5TaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlNpdGVGZWF0dXJlUmVmZXJlbmNlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuVXRpbGl0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLkludmFsaWRTaXRlVHlwZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC5TaXRlTW9kZWxGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLmNvbm5lY3Rpb24uQ29ubmVjdGlvbkZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuY29ubmVjdGlvbi5JUmVzcG9uc2U7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm1vZGVsLlNpdGVXaXRoVGltZXN0YW1wOworCisvKioKKyAqIEFuIHVwZGF0ZSBzaXRlIGZhY3RvcnkuCisgKgorICovCitwdWJsaWMgY2xhc3MgU2l0ZVVSTEZhY3RvcnkgZXh0ZW5kcyBCYXNlU2l0ZUZhY3RvcnkgaW1wbGVtZW50cyBJU2l0ZUZhY3RvcnlFeHRlbnNpb24geworCQorCS8qCisJICogRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCisJICovCisJcHVibGljIElTaXRlIGNyZWF0ZVNpdGUoVVJMIHVybCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIEludmFsaWRTaXRlVHlwZUV4Y2VwdGlvbiB7CisJCXJldHVybiBjcmVhdGVTaXRlKHVybCwgbnVsbCk7CisJfQorCS8qCisJICogQHNlZSBJU2l0ZUZhY3RvcnkjY3JlYXRlU2l0ZShVUkwsIGJvb2xlYW4pCisJICogCisJICogdGhlIFVSTCBjYW4gYmUgb2YgdGhlIGZvbGxvd2luZyBmb3JtCisJICogMSBwcm90b2NvbDovLy4uLi4uLworCSAqIDIgcHJvdG9jb2w6Ly8uLi4uLgorCSAqIDMgcHJvdG9jb2w6Ly8uLi4uL3NpdGUueG1sCisJICogCisJICogMSBJZiB0aGUgZmlsZSBvZiB0aGUgZmlsZSBvZiB0ZWggdXJsIGVuZHMgd2l0aCAnLycsIGF0dGVtcHQgdG8gb3BlbiB0aGUgc3RyZWFtLgorCSAqIGlmIGl0IGZhaWxzLCBhZGQgc2l0ZS54bWwgYW5kIGF0dGVtcHQgdG8gb3BlbiB0aGUgc3RyZWFtCisJICogCisJICogMiBhdHRlbXB0IHRvIG9wZW4gdGhlIHN0cmVhbQorCSAqIAlmYWlsCisJICogCQlhZGQgJy9zaXRlLnhtbCcgYW5kIGF0dGVtcHQgdG8gb3BlbiB0aGUgc3RyZWFtCisJICogCXN1Y2VzcworCSAqIAkJYXR0ZW1wdCB0byBwYXJzZSwgaWYgaXQgZmFpbHMsIGFkZCAnL3NpdGUueG1sJyBhbmQgYXR0ZW1wdCB0byBvcGVuIHRlaCBzdHJlYW0KKwkgKiAKKwkgKiAzIG9wZW4gdGhlIHN0cmVhbQkgCisJICovCisJcHVibGljIElTaXRlIGNyZWF0ZVNpdGUoVVJMIHVybCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSW52YWxpZFNpdGVUeXBlRXhjZXB0aW9uIHsKKwkJU2l0ZSBzaXRlID0gbnVsbDsKKwkJSW5wdXRTdHJlYW0gc2l0ZVN0cmVhbSA9IG51bGw7CisJCisJCXRyeSB7CisJCQlTaXRlVVJMQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciA9IG5ldyBTaXRlVVJMQ29udGVudFByb3ZpZGVyKHVybCk7CisJCisJCQlVUkwgcmVzb2x2ZWRVUkwgPSBVUkxFbmNvZGVyLmVuY29kZSh1cmwpOworCQkJSVJlc3BvbnNlIHJlc3BvbnNlID0gQ29ubmVjdGlvbkZhY3RvcnkuZ2V0KHJlc29sdmVkVVJMKTsKKwkJCVVwZGF0ZU1hbmFnZXJVdGlscy5jaGVja0Nvbm5lY3Rpb25SZXN1bHQocmVzcG9uc2UsIHJlc29sdmVkVVJMKTsKKwkJCXNpdGVTdHJlYW0gPSByZXNwb25zZS5nZXRJbnB1dFN0cmVhbShtb25pdG9yKTsKKwkJCS8vIHRoZSBzdHJlYW0gY2FuIGJlIG51bGwgaWYgdGhlIHVzZXIgY2FuY2VscyB0aGUgY29ubmVjdGlvbgorCQkJaWYgKHNpdGVTdHJlYW09PW51bGwpIHJldHVybiBudWxsOworCisJCQlTaXRlTW9kZWxGYWN0b3J5IGZhY3RvcnkgPSB0aGlzOworCQkJc2l0ZSA9IChTaXRlKSBmYWN0b3J5LnBhcnNlU2l0ZShzaXRlU3RyZWFtKTsKKwkJCS8vU3lzdGVtLm91dC5wcmludGxuKHNpdGUuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkpOworCQkJc2l0ZS5zZXRTaXRlQ29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7CisJCQljb250ZW50UHJvdmlkZXIuc2V0U2l0ZShzaXRlKTsKKwkJCXNpdGUucmVzb2x2ZSh1cmwsIHVybCk7CisJCQlzaXRlLm1hcmtSZWFkT25seSgpOworCQkJLypTaXRlV2l0aFRpbWVzdGFtcCBzaXRlV2l0aFRpbWVzdGFtcCA9IG5ldyBTaXRlV2l0aFRpbWVzdGFtcChzaXRlKTsKKwkJCXNpdGVXaXRoVGltZXN0YW1wLnNldFRpbWVzdGFtcCggbmV3IERhdGUocmVzcG9uc2UuZ2V0TGFzdE1vZGlmaWVkKCkpKTsKKwkJCXNpdGUgPSBzaXRlV2l0aFRpbWVzdGFtcDsqLworCQkJKChTaXRlV2l0aFRpbWVzdGFtcClzaXRlKS5zZXRUaW1lc3RhbXAoIG5ldyBEYXRlKHJlc3BvbnNlLmdldExhc3RNb2RpZmllZCgpKSk7CisJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5TaXRlVVJMRmFjdG9yeV9VbmFibGVUb0NyZWF0ZVVSTCwgKG5ldyBTdHJpbmdbXSB7IHVybCA9PSBudWxsID8gIiIgOiB1cmwudG9FeHRlcm5hbEZvcm0oKSB9KSksIGUpOyAvLyROT04tTkxTLTEkCisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLlNpdGVVUkxGYWN0b3J5X1VuYWJsZVRvQWNjZXNzU2l0ZVN0cmVhbSwgKG5ldyBTdHJpbmdbXSB7IHVybCA9PSBudWxsID8gIiIgOiB1cmwudG9FeHRlcm5hbEZvcm0oKSB9KSksIElTaXRlLlNJVEVfQUNDRVNTX0VYQ0VQVElPTiwgZSk7CS8vJE5PTi1OTFMtMSQKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChzaXRlU3RyZWFtICE9IG51bGwpIHsKKwkJCQl0cnkgeworCQkJCQlzaXRlU3RyZWFtLmNsb3NlKCk7CisJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gc2l0ZTsKKwl9CisKKwkvKgorCSAqIEBzZWUgU2l0ZU1vZGVsRmFjdG9yeSNjYW5QYXJzZVNpdGVUeXBlKFN0cmluZykKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBjYW5QYXJzZVNpdGVUeXBlKFN0cmluZyB0eXBlKSB7CisJCXJldHVybiAoc3VwZXIuY2FuUGFyc2VTaXRlVHlwZSh0eXBlKSB8fCBTaXRlVVJMQ29udGVudFByb3ZpZGVyLlNJVEVfVFlQRS5lcXVhbHNJZ25vcmVDYXNlKHR5cGUpKTsKKwl9CisgICAgLyogKG5vbi1KYXZhZG9jKQorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuQmFzZVNpdGVGYWN0b3J5I2NyZWF0ZUZlYXR1cmVSZWZlcmVuY2VNb2RlbCgpCisgICAgICovCisgICAgcHVibGljIFNpdGVGZWF0dXJlUmVmZXJlbmNlTW9kZWwgY3JlYXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsKCkgeworICAgICAgICByZXR1cm4gbmV3IFVwZGF0ZVNpdGVGZWF0dXJlUmVmZXJlbmNlKCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1RhcmdldEZlYXR1cmUuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvVGFyZ2V0RmVhdHVyZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNzg5ZjEKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1RhcmdldEZlYXR1cmUuamF2YQpAQCAtMCwwICsxLDU2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmVDb250ZW50Q29uc3VtZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuVXRpbGl0aWVzOworCisvKioKKyAqIAorICovCitwdWJsaWMgY2xhc3MgVGFyZ2V0RmVhdHVyZSBleHRlbmRzIEZlYXR1cmUgeworCisKKwkvKioKKwkgKiBUaGUgY29udGVudCBjb25zdW1lciBvZiB0aGUgRGVmYXVsdEZlYXR1cmUKKwkgKi8KKwlwcml2YXRlIElGZWF0dXJlQ29udGVudENvbnN1bWVyIGNvbnRlbnRDb25zdW1lcjsKKwkKKworCS8qKgorCSAqIENvbnN0cnVjdG9yIGZvciBUYXJnZXRGZWF0dXJlLgorCSAqLworCXB1YmxpYyBUYXJnZXRGZWF0dXJlKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIGNvbnRlbnQgQ29uc3VtZXIKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRDb250ZW50Q29uc3VtZXIoSUZlYXR1cmVDb250ZW50Q29uc3VtZXIgY29udGVudENvbnN1bWVyKSB7CisJCXRoaXMuY29udGVudENvbnN1bWVyID0gY29udGVudENvbnN1bWVyOworCQljb250ZW50Q29uc3VtZXIuc2V0RmVhdHVyZSh0aGlzKTsKKwl9CisKKwkvKgorCSAqIEBzZWUgSUZlYXR1cmUjZ2V0RmVhdHVyZUNvbnRlbnRDb25zdW1lcigpCisJICovCisJcHVibGljIElGZWF0dXJlQ29udGVudENvbnN1bWVyIGdldEZlYXR1cmVDb250ZW50Q29uc3VtZXIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCWlmICh0aGlzLmNvbnRlbnRDb25zdW1lciA9PSBudWxsKSB7CisJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbiggTkxTLmJpbmQoTWVzc2FnZXMuRmVhdHVyZV9Ob0ZlYXR1cmVDb250ZW50Q29uc3VtZXIsIChuZXcgU3RyaW5nW10geyBnZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpIH0pKSwgbnVsbCk7CisJCX0KKwkJcmV0dXJuIGNvbnRlbnRDb25zdW1lcjsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvVVJMRW5jb2Rlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9VUkxFbmNvZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzIwMGE5ZgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvVVJMRW5jb2Rlci5qYXZhCkBAIC0wLDAgKzEsMTUyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAgICAgSmFtZXMgRCBNaWxlcyAoSUJNIENvcnAuKSAtIGJ1ZyAxOTEzNjgsIFBvbGljeSBVUkwgZG9lc24ndCBzdXBwb3J0IFVURi04IGNoYXJhY3RlcnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsKKworCitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS5uZXQuVVJMRGVjb2RlcjsKK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKKy8qKgorICogRW5jb2RlcyBhIDxjb2RlPlVSTDwvY29kZT4gaW50byBhbiA8Y29kZT5BU0NJSTwvY29kZT4gcmVhZGFibGUKKyAqIDxjb2RlPlVSTDwvY29kZT4gdGhhdCBpcyBzYWZlIGZvciB0cmFuc3BvcnQuIEVuY29kZWQKKyAqIDxjb2RlPlVSTDwvY29kZT5zIGNhbiBiZSBkZWNvZGVkIHVzaW5nIHRoZSA8Y29kZT5VUkxEZWNvZGVyPC9jb2RlPi4KKyAqCisgKiBAc2VlIFVSTERlY29kZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFVSTEVuY29kZXIgeworCS8qKgorCSAqIFByZXZlbnRzIGluc3RhbmNlcyBmcm9tIGJlaW5nIGNyZWF0ZWQuCisJICovCisJcHJpdmF0ZSBVUkxFbmNvZGVyKCkgeworCX0KKwkvKioKKwkgKiBFbmNvZGVzIHRoZSBnaXZlbiBmaWxlIGFuZCByZWZlcmVuY2UgcGFydHMgb2YgYSA8Y29kZT5VUkw8L2NvZGU+IGludG8KKwkgKiBhbiA8Y29kZT5BU0NJSTwvY29kZT4gcmVhZGFibGUgPGNvZGU+U3RyaW5nPC9jb2RlPiB0aGF0IGlzIHNhZmUgZm9yCisJICogdHJhbnNwb3J0LiBSZXR1cm5zIHRoZSByZXN1bHQuCisJICoKKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgZW5jb2RpbmcgdGhlIGdpdmVuIGZpbGUgYW5kIHJlZmVyZW5jZSBwYXJ0cyBvZgorCSAqICAgICAgICAgYSA8Y29kZT5VUkw8L2NvZGU+IGludG8gYW4gPGNvZGU+QVNDSUk8L2NvZGU+IHJlYWRhYmxlCisJICogICAgICAgICA8Y29kZT5TdHJpbmc8L2NvZGU+IHRoYXQgaXMgc2FmZSBmb3IgdHJhbnNwb3J0CisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZW5jb2RlKFN0cmluZyBmaWxlLCBTdHJpbmcgcXVlcnksIFN0cmluZyByZWYpIHsKKwkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoZmlsZSwgIi8iLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAorCisJCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7CisJCQlTdHJpbmcgdG9rZW4gPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7CisJCQlpZiAodG9rZW4uZXF1YWxzKCIvIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCWJ1Zi5hcHBlbmQodG9rZW4pOworCQkJfSBlbHNlIHsKKwkJCQlidWYuYXBwZW5kKGVuY29kZVNlZ21lbnQodG9rZW4pKTsKKwkJCX0KKwkJfQorCisJCWlmIChxdWVyeSAhPSBudWxsKXsKKwkJCWJ1Zi5hcHBlbmQoJz8nKTsKKwkJCWJ1Zi5hcHBlbmQocXVlcnkpOworCQl9CisKKwkJaWYgKHJlZiAhPSBudWxsKSB7CisJCQlidWYuYXBwZW5kKCcjJyk7CisJCQlidWYuYXBwZW5kKGVuY29kZVNlZ21lbnQocmVmKSk7CisJCX0KKworCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisJfQorCS8qKgorCSAqIEVuY29kZXMgdGhlIGdpdmVuIDxjb2RlPlVSTDwvY29kZT4gaW50byBhbiA8Y29kZT5BU0NJSTwvY29kZT4KKwkgKiByZWFkYWJsZSA8Y29kZT5VUkw8L2NvZGU+IHRoYXQgaXMgc2FmZSBmb3IgdHJhbnNwb3J0LiBSZXR1cm5zIHRoZQorCSAqIHJlc3VsdC4KKwkgKgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBlbmNvZGluZyB0aGUgZ2l2ZW4gPGNvZGU+VVJMPC9jb2RlPiBpbnRvIGFuCisJICogICAgICAgICA8Y29kZT5BU0NJSTwvY29kZT4gcmVhZGFibGUgPGNvZGU+VVJMPC9jb2RlPiB0aGF0IGlzIHNhZmUgZm9yCisJICogICAgICAgICB0cmFuc3BvcnQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFVSTCBlbmNvZGUoVVJMIHVybCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7CisJCS8vIGVuY29kZSB0aGUgcGF0aCBub3QgdGhlIGZpbGUgYXMgdGhlIFVSTCBtYXkgY29udGFpbiBhIHF1ZXJ5CisJCVN0cmluZyBmaWxlID0gdXJsLmdldFBhdGgoKTsKKwkJU3RyaW5nIHF1ZXJ5ID0gdXJsLmdldFF1ZXJ5KCk7CisJCVN0cmluZyByZWYgPSB1cmwuZ2V0UmVmKCk7CisJCVN0cmluZyBhdXRoID0gdXJsLmdldEF1dGhvcml0eSgpOworCQlTdHJpbmcgaG9zdCA9IHVybC5nZXRIb3N0KCk7CisJCWludCBwb3J0ID0gdXJsLmdldFBvcnQoKTsKKwkJU3RyaW5nIHVzZXJpbmZvID0gdXJsLmdldFVzZXJJbmZvKCk7CisKKwkJLy8gZG8gbm90IGVuY29kZSBpZiB0aGVyZSBpcyBhbiBhdXRob3JpdHksIHN1Y2ggYXMgaW4KKwkJLy8gZnRwOi8vdXNlcjpwYXNzd29yZEBob3N0OnBvcnQvcGF0aCAKKwkJLy8gYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIGRvZXMgbm90IGFsbG93IGl0CisJCVVSTCByZXN1bHQgPSB1cmw7CisJCWlmIChhdXRoID09IG51bGwgfHwgYXV0aC5lcXVhbHMoIiIpIHx8IHVzZXJpbmZvID09IG51bGwpIC8vICROT04tTkxTLTEkICROT04tTkxTLTIkICAvLyROT04tTkxTLTEkCisJCQlyZXN1bHQgPSAgbmV3IFVSTCh1cmwuZ2V0UHJvdG9jb2woKSwgaG9zdCwgcG9ydCwgZW5jb2RlKGZpbGUsIHF1ZXJ5LCByZWYpKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGVuY29kZVNlZ21lbnQoU3RyaW5nIHNlZ21lbnQpIHsKKwkJCisJCS8vIGlmIHdlIGZpbmQgYSAnJScgaW4gdGhlIHN0cmluZywgY29uc2lkZXIgdGhlIFVSTCB0byBiZSBhbHJlYWR5IGVuY29kZWQKKwkJaWYgKHNlZ21lbnQuaW5kZXhPZignJScpIT0tMSkgcmV0dXJuIHNlZ21lbnQ7CisJCQorCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzZWdtZW50Lmxlbmd0aCgpKTsKKworCQlmb3IgKGludCBpID0gMDsgaSA8IHNlZ21lbnQubGVuZ3RoKCk7ICsraSkgeworCQkJY2hhciBjID0gc2VnbWVudC5jaGFyQXQoaSk7CisJCQlpZiAobXVzdEVuY29kZShjKSkgeworCQkJCWJ5dGVbXSBieXRlcyA9IG51bGw7CisJCQkJdHJ5IHsKKwkJCQkJYnl0ZXMgPSBuZXcgQ2hhcmFjdGVyKGMpLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoIlVURjgiKTsgLy8kTk9OLU5MUy0xJAorCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgeworCQkJCQlBc3NlcnQuaXNUcnVlKGZhbHNlLCBlLmdldE1lc3NhZ2UoKSk7CisJCQkJfQorCQkJCWZvciAoaW50IGogPSAwOyBqIDwgYnl0ZXMubGVuZ3RoOyArK2opIHsKKwkJCQkJcmVzdWx0LmFwcGVuZCgnJScpOworCQkJCQlyZXN1bHQuYXBwZW5kKEludGVnZXIudG9IZXhTdHJpbmcoKGJ5dGVzW2pdID4+IDQpICYgMHgwRikpOworCQkJCQlyZXN1bHQuYXBwZW5kKEludGVnZXIudG9IZXhTdHJpbmcoYnl0ZXNbal0gJiAweDBGKSk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlyZXN1bHQuYXBwZW5kKGMpOworCQkJfQorCQl9CisKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKwkKKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIG11c3RFbmNvZGUoY2hhciBjKSB7CisJCWlmIChjID49ICdhJyAmJiBjIDw9ICd6JykgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ1onKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCWlmIChjID49ICdcJycgJiYgYyA8PSAnLicpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCWlmIChjID09ICchJyB8fCBjID09ICckJyB8fCBjID09ICdfJyB8fCBjID09ICdbJyB8fCBjID09ICddJykgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJLy8gbmVlZGVkIG90aGVyd2lzZSBmaWxlOi8vL2M6L2ZpbGUvIGJlY29tZXMgZmlsZTovLy9DJTNhL2ZpbGUvCisJCWlmIChjID09JzonKXsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1VSTEtleS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9VUkxLZXkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWM3NmFkCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9VUkxLZXkuamF2YQpAQCAtMCwwICsxLDc2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7CisgCitpbXBvcnQgamF2YS5uZXQuKjsKKworCisKKy8qKgorICogCisgKiAKKyAqLworcHVibGljIGNsYXNzIFVSTEtleSB7CisKKwlwcml2YXRlIFVSTCB1cmw7CisJCisJLyoqCisJICogQ29uc3RydWN0b3IgZm9yIFVSTEtleS4KKwkgKi8KKwlwdWJsaWMgVVJMS2V5KFVSTCB1cmwpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy51cmwgPSB1cmw7CisJfQorCisJLyoqCisJICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2VxdWFscyhPYmplY3QpCisJICovCisJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKwkJCWlmIChvYmogPT0gbnVsbCkgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKworCQkJaWYgKHRoaXMgPT0gb2JqKSB7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisKKwkJCWlmIChvYmogaW5zdGFuY2VvZiBVUkxLZXkpIHsKKwkJCQlyZXR1cm4gZXF1YWxzKCgoVVJMS2V5KSBvYmopLmdldFVSTCgpKTsKKwkJCX0KKworCQkJaWYgKCEob2JqIGluc3RhbmNlb2YgVVJMKSkgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKworCQkJVVJMIHVybDIgPSAoVVJMKW9iajsKKwkJCWlmICh1cmwgPT0gdXJsMikgeworCQkJCXJldHVybiB0cnVlOworCQkJfQorCisJCQlyZXR1cm4gVXBkYXRlTWFuYWdlclV0aWxzLnNhbWVVUkwodXJsLHVybDIpOworCX0KKworCS8qKgorCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNoYXNoQ29kZSgpCisJICovCisJcHVibGljIGludCBoYXNoQ29kZSgpIHsKKwkJcmV0dXJuIHVybC5oYXNoQ29kZSgpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHVybC4KKwkgKiBAcmV0dXJuIFVSTAorCSAqLworCXB1YmxpYyBVUkwgZ2V0VVJMKCkgeworCQlyZXR1cm4gdXJsOworCX0KKworfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9VcGRhdGVDb3JlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1VwZGF0ZUNvcmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzA3OTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9VcGRhdGVDb3JlLmphdmEKQEAgLTAsMCArMSwzMjAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLm5ldC5wcm94eS5JUHJveHlTZXJ2aWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2lnbmVkY29udGVudC5TaWduZWRDb250ZW50RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi5JSW5zdGFsbENvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci5Db25maWd1cmF0b3JVdGlsczsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLklQbGF0Zm9ybUNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5jb25uZWN0aW9uLkNvbm5lY3Rpb25UaHJlYWRNYW5hZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKK2ltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLnBhY2thZ2VhZG1pbi5QYWNrYWdlQWRtaW47CitpbXBvcnQgb3JnLm9zZ2kudXRpbC50cmFja2VyLlNlcnZpY2VUcmFja2VyOworCisvKioKKyAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgorICovCitwdWJsaWMgY2xhc3MgVXBkYXRlQ29yZSBleHRlbmRzIFBsdWdpbiB7CisKKwkvLyBkZWJ1ZyBvcHRpb25zCisJcHVibGljIHN0YXRpYyBib29sZWFuIERFQlVHOworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBERUJVR19TSE9XX0lOU1RBTEw7CisJcHVibGljIHN0YXRpYyBib29sZWFuIERFQlVHX1NIT1dfUEFSU0lORzsKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gREVCVUdfU0hPV19XQVJOSU5HUzsKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gREVCVUdfU0hPV19DT05GSUdVUkFUSU9OOworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBERUJVR19TSE9XX1RZUEU7CisJcHVibGljIHN0YXRpYyBib29sZWFuIERFQlVHX1NIT1dfV0VCOworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBERUJVR19TSE9XX0lIQU5ETEVSOworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBERUJVR19TSE9XX1JFQ09OQ0lMRVI7CisJCQorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVggPSAib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUF9ISVNUT1JZX1NJWkUgPSBQUkVGSVggKyAiLmhpc3RvcnlTaXplIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBfQ0hFQ0tfU0lHTkFUVVJFID0gUFJFRklYICsgIi5jaGVja1NpZ25hdHVyZSI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX0FVVE9NQVRJQ0FMTFlfQ0hPT1NFX01JUlJPUiA9ICBQUkVGSVggKyAiLmF1dG9tYXRpY2FsbHlDaG9vc2VNaXJyb3IiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUF9VUERBVEVfVkVSU0lPTlMgPSBQUkVGSVggKyAiLnVwZGF0ZVZlcnNpb25zIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVRVUlWQUxFTlRfVkFMVUUgPSAiZXF1aXZhbGVudCI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QQVRJQkxFX1ZBTFVFID0gImNvbXBhdGlibGUiOyAvLyROT04tTkxTLTEkCisJCisJcHVibGljIHN0YXRpYyBpbnQgREVGQVVMVF9ISVNUT1JZID0gMTAwOy8vSW50ZWdlci5NQVhfVkFMVUU7CisJCisJLy9UaGUgc2hhcmVkIGluc3RhbmNlLgorCXByaXZhdGUgc3RhdGljIFVwZGF0ZUNvcmUgcGx1Z2luOworCisJLy9sb2cKKwlwcml2YXRlIHN0YXRpYyBVcGRhdGVNYW5hZ2VyTG9nV3JpdGVyIGxvZzsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX0ZJTEU9Imluc3RhbGwubG9nIjsgLy8kTk9OLU5MUy0xJAorCisJLy8gYnVuZGxlIGRhdGEKKwlwcml2YXRlIEJ1bmRsZUNvbnRleHQgY29udGV4dDsKKwlwcml2YXRlIFNlcnZpY2VUcmFja2VyIHBrZ0FkbWluVHJhY2tlcjsKKwlwcml2YXRlIFNlcnZpY2VUcmFja2VyIHZlcmlmaWVyRmFjdG9yeVRyYWNrZXI7CisJcHJpdmF0ZSBTZXJ2aWNlVHJhY2tlciBwcm94eVRyYWNrZXI7CisJCisJLy8gU2Vzc2lvbgorCXByaXZhdGUgVXBkYXRlU2Vzc2lvbiB1cGRhdGVTZXNzaW9uID0gbnVsbDsKKwkvKioKKwkgKiBIVFRQIHJlc3BvbnNlIGNvZGUgaW5kaWNhdGluZyBzdWNjZXNzLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhUVFBfT0sgPSAyMDA7CisJCisJLyoqCisJICogVGhlIGNvbnN0cnVjdG9yLgorCSAqLworCXB1YmxpYyBVcGRhdGVDb3JlKCkgeworCQlwbHVnaW4gPSB0aGlzOworCX0KKwkKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFVwZGF0ZUNvcmUgZ2V0UGx1Z2luKCkgeworCQlyZXR1cm4gcGx1Z2luOworCX0KKwkKKworCXByaXZhdGUgYm9vbGVhbiBnZXRCb29sZWFuRGVidWdPcHRpb24oU3RyaW5nIGZsYWcsIGJvb2xlYW4gZGZsdCkgeworCQlTdHJpbmcgcmVzdWx0ID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oZmxhZyk7CisJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCXJldHVybiBkZmx0OworCQllbHNlCisJCQlyZXR1cm4gcmVzdWx0LnRyaW0oKS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwkvKioKKwkgKiBkdW1wcyBhIFN0cmluZyBpbiB0aGUgdHJhY2UKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgZGVidWcoU3RyaW5nIHMpIHsKKwkJU3RyaW5nQnVmZmVyIG1zZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJbXNnLmFwcGVuZChnZXRQbHVnaW4oKS50b1N0cmluZygpKTsKKwkJbXNnLmFwcGVuZCgiXiIpOyAvLyROT04tTkxTLTEkCisJCW1zZy5hcHBlbmQoSW50ZWdlci50b0hleFN0cmluZyhUaHJlYWQuY3VycmVudFRocmVhZCgpLmhhc2hDb2RlKCkpKTsKKwkJbXNnLmFwcGVuZCgiICIpOyAvLyROT04tTkxTLTEkCisJCW1zZy5hcHBlbmQocyk7CisJCVN5c3RlbS5vdXQucHJpbnRsbihtc2cudG9TdHJpbmcoKSk7CisJfQorCQorCS8qKgorCSAqIER1bXBzIGEgU3RyaW5nIGluIHRoZSBsb2cgaWYgV0FSTklORyBpcyBzZXQgdG8gdHJ1ZQorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCB3YXJuKFN0cmluZyBzKSB7CisJCWlmIChERUJVRyAmJiBERUJVR19TSE9XX1dBUk5JTkdTKSB7CisJCQlpZiAocyE9bnVsbCl7CisJCQkJcz0iV0FSTklORzogIitzOyAvLyROT04tTkxTLTEkCisJCQl9CisJCQlsb2cocywgbnVsbCk7IAorCQl9CisJfQorCisJLyoqCisJICogRHVtcHMgYW4gZXhjZXB0aW9uIGluIHRoZSBsb2cgaWYgV0FSTklORyBpcyBzZXQgdG8gdHJ1ZQorCSAqIAorCSAqIEBwYXJhbSBzIGxvZyBzdHJpbmcKKwkgKiBAcGFyYW0gZSBleGNlcHRpb24gdG8gYmUgbG9nZ2VkCisJICogQHNpbmNlIDIuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCB3YXJuKFN0cmluZyBzLCBUaHJvd2FibGUgZSkgeworCQlpZiAoREVCVUcgJiYgREVCVUdfU0hPV19XQVJOSU5HUyl7CisJCQlpZiAocyE9bnVsbCl7CisJCQkJcz0iVVBEQVRFIE1BTkFHRVIgSU5GTzogIitzOyAvLyROT04tTkxTLTEkCisJCQl9CisJCQlsb2cocyxlKTsKKwkJfQorCX0KKwkJCQorCS8qKgorCSAqIExvZ3MgYSBzdGF0dXMKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKElTdGF0dXMgc3RhdHVzKXsKKwkJVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXRMb2coKS5sb2coc3RhdHVzKTsJCQorCX0KKwkKKwkvKioKKwkgKiBMb2dzIGFuIGVycm9yCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIGxvZyhUaHJvd2FibGUgZSl7CQkKKwkJbG9nKCIiLGUpOyAvLyROT04tTkxTLTEkCisJfQkKKwkKKwkvKioKKwkgKiBMb2dzIGEgc3RyaW5nIGFuZCBhbiAgZXJyb3IKKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFN0cmluZyBtc2csIFRocm93YWJsZSBlKXsKKwkJSVN0YXR1cyBzdGF0dXMgPSBudWxsOworCQlpZiAoZSBpbnN0YW5jZW9mIENvcmVFeGNlcHRpb24pIAorCQkJc3RhdHVzID0gKChDb3JlRXhjZXB0aW9uKWUpLmdldFN0YXR1cygpOworCQllbHNlIAorCQkJc3RhdHVzID0gVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24obXNnLGUpLmdldFN0YXR1cygpOwkJCisJCWlmIChzdGF0dXMhPW51bGwpCisJCQlsb2coc3RhdHVzKTsKKwl9CQkKKwkvKgorCSAqIE1ldGhvZCBsb2cuCisJICogQHBhcmFtIG5ld0NvbmZpZ3VyYXRpb24KKwkgKi8KKwlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKElJbnN0YWxsQ29uZmlndXJhdGlvbiBuZXdDb25maWd1cmF0aW9uKSB7CisJCWlmIChsb2chPW51bGwpCisJCQlsb2cubG9nKG5ld0NvbmZpZ3VyYXRpb24pOworCX0KKworCS8qCisJICogR2V0IHVwZGF0ZSBsb2cgbG9jYXRpb24gcmVsYXRpdmUgdG8gcGxhdGZvcm0gY29uZmlndXJhdGlvbgorCSAqLworCXByaXZhdGUgc3RhdGljIEZpbGUgZ2V0SW5zdGFsbExvZ0ZpbGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQkKKwkJSVBsYXRmb3JtQ29uZmlndXJhdGlvbiBjb25maWcgPSBDb25maWd1cmF0b3JVdGlscy5nZXRDdXJyZW50UGxhdGZvcm1Db25maWd1cmF0aW9uKCk7CQkKKwkJVVJMIGNvbmZpZ3VyYXRpb25Mb2NhdGlvbiA9IGNvbmZpZy5nZXRDb25maWd1cmF0aW9uTG9jYXRpb24oKTsKKwkJaWYgKGNvbmZpZ3VyYXRpb25Mb2NhdGlvbj09bnVsbCl7CisJCQl3YXJuKCJVbmFibGUgdG8gcmV0cmlldmUgbG9jYXRpb24gZm9yIHVwZGF0ZSBtYW5hZ2VyIGxvZyBmaWxlIik7IC8vJE5PTi1OTFMtMSQKKwkJCXJldHVybiBudWxsOworCQl9CisvLwkJVVJMIGNvbmZpZ0xvY2F0aW9uID0gUGxhdGZvcm0ucmVzb2x2ZShjb25maWd1cmF0aW9uTG9jYXRpb24pOworCQlGaWxlIHVwZGF0ZVN0YXRlTG9jYXRpb24gPSBudWxsOworCisJCWlmICgiZmlsZSIuZXF1YWxzSWdub3JlQ2FzZShjb25maWd1cmF0aW9uTG9jYXRpb24uZ2V0UHJvdG9jb2woKSkpIHsgLy8kTk9OLU5MUy0xJAorCQkJRmlsZSBwYXRoID0gbmV3IEZpbGUoY29uZmlndXJhdGlvbkxvY2F0aW9uLmdldEZpbGUoKSk7CisJCQl1cGRhdGVTdGF0ZUxvY2F0aW9uID0gbmV3IEZpbGUocGF0aC5nZXRQYXJlbnRGaWxlKCksIExPR19GSUxFKTsKKwkJfQorCQlyZXR1cm4gdXBkYXRlU3RhdGVMb2NhdGlvbjsKKwl9CisKKwkvKioKKwkgKiBTZW5kcyB0aGUgR0VUIHJlcXVlc3QgdG8gdGhlIHNlcnZlciBhbmQgcmV0dXJucyB0aGUgc2VydmVyJ3MKKwkgKiByZXNwb25zZS4KKwkgKgorCSAqIEBwYXJhbSB1cmwgdGhlIFVSTCB0byBvcGVuIG9uIHRoZSBzZXJ2ZXIKKwkgKiBAcmV0dXJuIHRoZSBzZXJ2ZXIncyByZXNwb25zZQorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gSS9PIGVycm9yIG9jY3Vycy4gUmVhc29ucyBpbmNsdWRlOgorCSAqIDx1bD4KKwkgKiA8bGk+VGhlIGNsaWVudCBpcyBjbG9zZWQuCisJICogPGxpPlRoZSBjbGllbnQgY291bGQgbm90IGNvbm5lY3QgdG8gdGhlIHNlcnZlcgorCSAqIDxsaT5BbiBJL08gZXJyb3Igb2NjdXJzIHdoaWxlIGNvbW11bmljYXRpbmcgd2l0aCB0aGUgc2VydmVyCisJICogPHVsPgorCSAqLworCisJCisJLyoKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGZlYXR1cmUgaXMgYSBwYXRjaAorCSAqLworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1BhdGNoKElGZWF0dXJlIGNhbmRpZGF0ZSkgeworCQlJSW1wb3J0W10gaW1wb3J0cyA9IGNhbmRpZGF0ZS5nZXRJbXBvcnRzKCk7CisKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbXBvcnRzLmxlbmd0aDsgaSsrKSB7CisJCQlJSW1wb3J0IGlpbXBvcnQgPSBpbXBvcnRzW2ldOworCQkJaWYgKGlpbXBvcnQuaXNQYXRjaCgpKQorCQkJCXJldHVybiB0cnVlOworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisJCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvciNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24geworCQlzdXBlci5zdGFydChjb250ZXh0KTsKKwkJdGhpcy5jb250ZXh0ID0gY29udGV4dDsKKworICAgICAgICBERUJVRyA9IGdldEJvb2xlYW5EZWJ1Z09wdGlvbigib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvZGVidWciLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKKworCQlpZiAoREVCVUcpIHsKKwkJCURFQlVHX1NIT1dfV0FSTklOR1MgPSBnZXRCb29sZWFuRGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2RlYnVnL3dhcm5pbmciLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKKwkJCURFQlVHX1NIT1dfUEFSU0lORyA9IGdldEJvb2xlYW5EZWJ1Z09wdGlvbigib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvZGVidWcvcGFyc2luZyIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAorCQkJREVCVUdfU0hPV19JTlNUQUxMID0gZ2V0Qm9vbGVhbkRlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS9kZWJ1Zy9pbnN0YWxsIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkCisJCQlERUJVR19TSE9XX0NPTkZJR1VSQVRJT04gPSBnZXRCb29sZWFuRGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2RlYnVnL2NvbmZpZ3VyYXRpb24iLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKKwkJCURFQlVHX1NIT1dfVFlQRSA9IGdldEJvb2xlYW5EZWJ1Z09wdGlvbigib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvZGVidWcvdHlwZSIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAorCQkJREVCVUdfU0hPV19XRUIgPSBnZXRCb29sZWFuRGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2RlYnVnL3dlYiIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAorCQkJREVCVUdfU0hPV19JSEFORExFUiA9IGdldEJvb2xlYW5EZWJ1Z09wdGlvbigib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvZGVidWcvaW5zdGFsbGhhbmRsZXIiLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKKwkJCURFQlVHX1NIT1dfUkVDT05DSUxFUiA9IGdldEJvb2xlYW5EZWJ1Z09wdGlvbigib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvZGVidWcvcmVjb25jaWxlciIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJCQorCQkvLworCQl0cnkgeworCQkJRmlsZSBsb2dGaWxlID0gZ2V0SW5zdGFsbExvZ0ZpbGUoKTsKKwkJCWlmIChsb2dGaWxlIT1udWxsKQorCQkJCWxvZyA9IG5ldyBVcGRhdGVNYW5hZ2VyTG9nV3JpdGVyKGxvZ0ZpbGUpOworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKXsKKwkJCXdhcm4oIiIsZSk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCX0KKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQWN0aXZhdG9yI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCisJICovCisJcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24geworCQlzdXBlci5zdG9wKGNvbnRleHQpOworCQkKKwkJSmFyQ29udGVudFJlZmVyZW5jZS5zaHV0ZG93bigpOyAvLyBtYWtlIHN1cmUgd2UgYXJlIG5vdCBsZWF2aW5nIGphcnMgb3BlbgorCQlVdGlsaXRpZXMuc2h1dGRvd24oKTsgLy8gY2xlYW51cCB0ZW1wIGFyZWEKKwkJaWYgKGxvZyE9bnVsbCkKKwkJCWxvZy5zaHV0ZG93bigpOworCQkKKwkJQ29ubmVjdGlvblRocmVhZE1hbmFnZXJGYWN0b3J5LmdldENvbm5lY3Rpb25NYW5hZ2VyKCkuc2h1dGRvd24oKTsKKworCQkKKwkJdGhpcy5jb250ZXh0ID0gbnVsbDsKKwkJaWYgKHBrZ0FkbWluVHJhY2tlciAhPSBudWxsKSB7CisJCQlwa2dBZG1pblRyYWNrZXIuY2xvc2UoKTsKKwkJCXBrZ0FkbWluVHJhY2tlciA9IG51bGw7CisJCX0KKwkJaWYgKHZlcmlmaWVyRmFjdG9yeVRyYWNrZXIgIT0gbnVsbCkgeworCQkJdmVyaWZpZXJGYWN0b3J5VHJhY2tlci5jbG9zZSgpOworCQkJdmVyaWZpZXJGYWN0b3J5VHJhY2tlciA9IG51bGw7CisJCX0KKwkJaWYgKHByb3h5VHJhY2tlciAhPSBudWxsKSB7CisJCQlwcm94eVRyYWNrZXIuY2xvc2UoKTsKKwkJCXByb3h5VHJhY2tlciA9IG51bGw7CisJCX0KKwl9CisJCisJcHVibGljIEJ1bmRsZUNvbnRleHQgZ2V0QnVuZGxlQ29udGV4dCgpIHsKKwkJcmV0dXJuIGNvbnRleHQ7CisJfQorCQorCVBhY2thZ2VBZG1pbiBnZXRQYWNrYWdlQWRtaW4oKSB7CisJCWlmIChwa2dBZG1pblRyYWNrZXIgPT0gbnVsbCkgeworCQkJcGtnQWRtaW5UcmFja2VyID0gbmV3IFNlcnZpY2VUcmFja2VyKGNvbnRleHQsIFBhY2thZ2VBZG1pbi5jbGFzcy5nZXROYW1lKCksIG51bGwpOworCQkJcGtnQWRtaW5UcmFja2VyLm9wZW4oKTsKKwkJfQorCQlyZXR1cm4gKFBhY2thZ2VBZG1pbilwa2dBZG1pblRyYWNrZXIuZ2V0U2VydmljZSgpOworCX0KKwkKKwlwdWJsaWMgSVByb3h5U2VydmljZSBnZXRQcm94eVNlcnZpY2UoKSB7CisJCWlmIChwcm94eVRyYWNrZXIgPT0gbnVsbCkgeworCQkgICAgcHJveHlUcmFja2VyPW5ldyBTZXJ2aWNlVHJhY2tlcihnZXRCdW5kbGUoKS5nZXRCdW5kbGVDb250ZXh0KCksCisJCSAgICAgICAgICAgIElQcm94eVNlcnZpY2UuY2xhc3MuZ2V0TmFtZSgpLCBudWxsKTsKKwkJICAgIHByb3h5VHJhY2tlci5vcGVuKCk7CisJCX0KKwkJcmV0dXJuIChJUHJveHlTZXJ2aWNlKXByb3h5VHJhY2tlci5nZXRTZXJ2aWNlKCk7CisJfQorCisKKwlwdWJsaWMgU2lnbmVkQ29udGVudEZhY3RvcnkgZ2V0U2lnbmVkQ29udGVudEZhY3RvcnkoKSB7CisJCWlmICh2ZXJpZmllckZhY3RvcnlUcmFja2VyID09IG51bGwpIHsKKwkJCXZlcmlmaWVyRmFjdG9yeVRyYWNrZXIgPSBuZXcgU2VydmljZVRyYWNrZXIoY29udGV4dCwgU2lnbmVkQ29udGVudEZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpLCBudWxsKTsKKwkJCXZlcmlmaWVyRmFjdG9yeVRyYWNrZXIub3BlbigpOworCQl9CisJCXJldHVybiAoU2lnbmVkQ29udGVudEZhY3RvcnkpdmVyaWZpZXJGYWN0b3J5VHJhY2tlci5nZXRTZXJ2aWNlKCk7CisJfQorCQorCXB1YmxpYyBVcGRhdGVTZXNzaW9uIGdldFVwZGF0ZVNlc3Npb24oKSB7CisJCXN5bmNocm9uaXplZChVcGRhdGVTZXNzaW9uLmNsYXNzKSB7CisJCQlpZiAodXBkYXRlU2Vzc2lvbiA9PSBudWxsKSB7CisJCQkJdXBkYXRlU2Vzc2lvbiA9IG5ldyBVcGRhdGVTZXNzaW9uKCk7CisJCQl9CisJCX0JCQorCQlyZXR1cm4gdXBkYXRlU2Vzc2lvbjsKKwl9Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1VwZGF0ZU1hbmFnZXJMb2dXcml0ZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvVXBkYXRlTWFuYWdlckxvZ1dyaXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkYWYwY2EKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1VwZGF0ZU1hbmFnZXJMb2dXcml0ZXIuamF2YQpAQCAtMCwwICsxLDMwMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7CitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uV3JpdGVyOworaW1wb3J0IGphdmEudGV4dC5EYXRlRm9ybWF0OworaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5EYXRlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLklBY3Rpdml0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi5JSW5zdGFsbENvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci5Db25maWd1cmF0b3JVdGlsczsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLklQbGF0Zm9ybUNvbmZpZ3VyYXRpb247CisKKworLyoqCisgKiBBIGxvZyB3cml0ZXIgdGhhdCB3cml0ZXMgdXBkYXRlIG1hbmFnZXIgbG9nIGVudHJpZXMuICAKKyAqLworcHVibGljIGNsYXNzIFVwZGF0ZU1hbmFnZXJMb2dXcml0ZXIgeworCXByaXZhdGUgRmlsZSBsb2dGaWxlID0gbnVsbDsKKwlwcml2YXRlIFdyaXRlciBsb2cgPSBudWxsOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR1VSQVRJT04gPSAiIUNPTkZJR1VSQVRJT04iOyAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElWSVRZID0gIiFBQ1RJVklUWSI7IC8vJE5PTi1OTFMtMSQKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVUNDRVNTID0gInN1Y2Nlc3MiOyAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZBSUxVUkUgPSAiZmFpbHVyZSI7IC8vJE5PTi1OTFMtMSQKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGRUFUVVJFX0lOU1RBTEwgPSAiZmVhdHVyZS1pbnN0YWxsIjsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGRUFUVVJFX1JFTU9WRSA9ICJmZWF0dXJlLXJlbW92ZSI7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lURV9JTlNUQUxMID0gInNpdGUtaW5zdGFsbCI7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lURV9SRU1PVkUgPSAic2l0ZS1yZW1vdmUiOyAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVOQ09ORklHVVJFID0gImZlYXR1cmUtZGlzYWJsZSI7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHVVJFID0gImZlYXR1cmUtZW5hYmxlIjsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVZFUlQgPSAicmV2ZXJ0IjsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRUNPTkNJTElBVElPTiA9ICJyZWNvbmNpbGlhdGlvbiI7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFU0VSVkVEID0gInByZXNlcnZlLWNvbmZpZ3VyYXRpb24iOyAvLyROT04tTkxTLTEkCQorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVTktOT1dOID0gInVua25vd24iOyAvLyROT04tTkxTLTEkCQorCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExJTkVfU0VQQVJBVE9SOworCisJc3RhdGljIHsKKwkJU3RyaW5nIHMgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7IC8vJE5PTi1OTFMtMSQKKwkJTElORV9TRVBBUkFUT1IgPSBzID09IG51bGwgPyAiXG4iIDogczsgLy8kTk9OLU5MUy0xJAorCX0KKworCS8qCisJICogCisJICovCisJcHVibGljIFVwZGF0ZU1hbmFnZXJMb2dXcml0ZXIoRmlsZSBmaWxlKSB7CisJCXRoaXMubG9nRmlsZSA9IGZpbGU7CisJCVVwZGF0ZUNvcmUud2FybigiVVBEQVRFIE1BTkFHRVIgTE9HIExvY2F0aW9uOiAiK2ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOyAvLyROT04tTkxTLTEkCisKKwkJLy8gSWYgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QsIHByaW1lIGl0IHdpdGggdGhlIHNpdGVzIGluIHRoZSBleGlzaXRpbmcgY29uZmlnCisJCWlmICghZmlsZS5leGlzdHMoKSkKKwkJCWluaXRMb2coKTsKKwl9CisJCisJLyoKKwkgKiBJbml0aWFsaXplcyB0aGUgbG9nIHdpdGggdGhlIG9yaWdpbmFsIGNvbmZpZ3VyYXRpb24KKwkgKi8KKwlwcml2YXRlIHZvaWQgaW5pdExvZygpIHsKKwkJdHJ5IHsKKwkJCUlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24gcnVudGltZUNvbmZpZyA9IENvbmZpZ3VyYXRvclV0aWxzLmdldEN1cnJlbnRQbGF0Zm9ybUNvbmZpZ3VyYXRpb24oKTsKKwkJCUlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24uSVNpdGVFbnRyeVtdIHNpdGVzID0gcnVudGltZUNvbmZpZy5nZXRDb25maWd1cmVkU2l0ZXMoKTsKKwkJCUNvbmZpZ3VyYXRpb25BY3Rpdml0eVtdIGFjdGl2aXRpZXMgPSBuZXcgQ29uZmlndXJhdGlvbkFjdGl2aXR5W3NpdGVzLmxlbmd0aF07CisJCQlmb3IgKGludCBpPTA7IGk8c2l0ZXMubGVuZ3RoOyBpKyspIHsKKwkJCQlhY3Rpdml0aWVzW2ldID0gbmV3IENvbmZpZ3VyYXRpb25BY3Rpdml0eShJQWN0aXZpdHkuQUNUSU9OX1NJVEVfSU5TVEFMTCk7CisJCQkJYWN0aXZpdGllc1tpXS5zZXRMYWJlbChGaWxlTG9jYXRvci50b0ZpbGVVUkwoc2l0ZXNbaV0uZ2V0VVJMKCkpLnRvRXh0ZXJuYWxGb3JtKCkpOworCQkJCWFjdGl2aXRpZXNbaV0uc2V0RGF0ZShuZXcgRGF0ZSgpKTsKKwkJCQlhY3Rpdml0aWVzW2ldLnNldFN0YXR1cyhJQWN0aXZpdHkuU1RBVFVTX09LKTsKKwkJCX0KKwkJCURhdGUgZGF0ZSA9IG5ldyBEYXRlKHJ1bnRpbWVDb25maWcuZ2V0Q2hhbmdlU3RhbXAoKSk7CisJCQlzYWZlV3JpdGVDb25maWd1cmF0aW9uKGRhdGUsIGFjdGl2aXRpZXMpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJLy8gc2lsZW50bHkgaWdub3JlIGVycm9ycworCQl9CisJfQorCisJLyoKKwkgKiAKKwkgKi8KKwlwcml2YXRlIHZvaWQgY2xvc2VMb2dGaWxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCWlmIChsb2cgIT0gbnVsbCkgeworCQkJCWxvZy5mbHVzaCgpOworCQkJCWxvZy5jbG9zZSgpOworCQkJfQorCQl9IGZpbmFsbHkgeworCQkJbG9nID0gbnVsbDsKKwkJfQorCX0KKwkKKwkvKgorCSAqIAorCSAqLworCXB1YmxpYyB2b2lkIGxvZyhJSW5zdGFsbENvbmZpZ3VyYXRpb24gaW5zdGFsbENvbmZpZykgeworCQlzYWZlV3JpdGVDb25maWd1cmF0aW9uKGluc3RhbGxDb25maWcuZ2V0Q3JlYXRpb25EYXRlKCksIGluc3RhbGxDb25maWcuZ2V0QWN0aXZpdGllcygpKTsKKwl9CisJCisJCisJLyoKKwkgKiAKKwkgKi8KKwlwcml2YXRlIHZvaWQgb3BlbkxvZ0ZpbGUoKSB7CisJCXRyeSB7CisJCQlsb2cgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihuZXcgRmlsZU91dHB1dFN0cmVhbShsb2dGaWxlLmdldEFic29sdXRlUGF0aCgpLCB0cnVlKSwgIlVURi04IikpOyAvLyROT04tTkxTLTEkCisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCS8vIHRoZXJlIHdhcyBhIHByb2JsZW0gb3BlbmluZyB0aGUgbG9nIGZpbGUgc28gbG9nIHRvIHRoZSBjb25zb2xlCisJCQlsb2cgPSBsb2dGb3JTdHJlYW0oU3lzdGVtLmVycik7CisJCX0KKwl9CisJCisgICAgLyoKKyAgICAgKiAKKyAgICAgKi8KKwlwcml2YXRlIFN0cmluZyBnZXRGb3JtYXR0ZWREYXRlKERhdGUgZGF0ZSkgeworCQl0cnkgeworCQkJRGF0ZUZvcm1hdCBmb3JtYXR0ZXIgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgiTU1NIGRkLCB5eXl5IGtrOm1tOnNzLlNTIik7IC8vJE5PTi1OTFMtMSQKKwkJCXJldHVybiBmb3JtYXR0ZXIuZm9ybWF0KGRhdGUpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJLy8gSWYgdGhlcmUgd2VyZSBwcm9ibGVtcyB3cml0aW5nIG91dCB0aGUgZGF0ZSwgaWdub3JlIGFuZAorCQkJLy8gY29udGludWUgc2luY2UgdGhhdCBzaG91bGRuJ3Qgc3RvcCB1cyBmcm9tIGxvc2luZyB0aGUgcmVzdAorCQkJLy8gb2YgdGhlIGluZm9ybWF0aW9uCisJCX0KKwkJcmV0dXJuIExvbmcudG9TdHJpbmcoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworCX0KKwkKKwkvKgorCSAqIAorCSAqLworCXByaXZhdGUgV3JpdGVyIGxvZ0ZvclN0cmVhbShPdXRwdXRTdHJlYW0gb3V0cHV0KSB7CisJCXRyeSB7CisJCQlyZXR1cm4gbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0cHV0LCAiVVRGLTgiKSk7IC8vJE5PTi1OTFMtMSQKKwkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm4gbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0cHV0KSk7CisJCX0KKwl9CisJCisJCisJLyoKKwkgKiBTaHV0cyBkb3duIHRoZSB1cGRhdGUgbWFuYWdlciBsb2cuCisJICovCisJcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNodXRkb3duKCkgeworCQl0cnkgeworCQkJaWYgKGxvZ0ZpbGUgIT0gbnVsbCkgeworCQkJCWNsb3NlTG9nRmlsZSgpOworCQkJCWxvZ0ZpbGUgPSBudWxsOworCQkJfSBlbHNlIHsKKwkJCQlpZiAobG9nICE9IG51bGwpIHsKKwkJCQkJV3JpdGVyIG9sZCA9IGxvZzsKKwkJCQkJbG9nID0gbnVsbDsKKwkJCQkJb2xkLmZsdXNoKCk7CisJCQkJCW9sZC5jbG9zZSgpOworCQkJCX0KKwkJCX0KKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJLy93ZSd2ZSBzaHV0ZG93biB0aGUgbG9nLCBzbyBub3QgbXVjaCBlbHNlIHdlIGNhbiBkbyEKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCX0KKwl9CisKKwkvKgorCSAqIAorCSAqLworCXByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgc2FmZVdyaXRlQ29uZmlndXJhdGlvbihEYXRlIGRhdGUsIElBY3Rpdml0eVtdIGFjdGl2aXRpZXMpIHsKKwkJLy8gdGhyZWFkIHNhZmV0eTogKENvbmN1cnJlbmN5MDAzKQorCQlpZiAobG9nRmlsZSAhPSBudWxsKQorCQkJb3BlbkxvZ0ZpbGUoKTsKKwkJaWYgKGxvZyA9PSBudWxsKQorCQkJbG9nID0gbG9nRm9yU3RyZWFtKFN5c3RlbS5lcnIpOworCQl0cnkgeworCQkJdHJ5IHsKKwkJCQl3cml0ZShkYXRlLCBhY3Rpdml0aWVzKTsKKwkJCX0gZmluYWxseSB7CisJCQkJaWYgKGxvZ0ZpbGUgIT0gbnVsbCkKKwkJCQkJY2xvc2VMb2dGaWxlKCk7CisJCQkJZWxzZQorCQkJCQlsb2cuZmx1c2goKTsKKwkJCX0KKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCVN5c3RlbS5lcnIucHJpbnRsbigiQW4gZXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIHdyaXRpbmcgdG8gdGhlIHVwZGF0ZSBtYW5hZ2VyIGxvZzoiKTsgLy8kTk9OLU5MUy0xJAorCQkJZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLmVycik7CisJCQlTeXN0ZW0uZXJyLnByaW50bG4oIkxvZ2dpbmcgdG8gdGhlIGNvbnNvbGUgaW5zdGVhZC4iKTsgLy8kTk9OLU5MUy0xJAorCQkJLy93ZSBmYWlsZWQgdG8gd3JpdGUsIHNvIGR1bXAgbG9nIGVudHJ5IHRvIGNvbnNvbGUgaW5zdGVhZAorCQkJdHJ5IHsKKwkJCQlsb2cgPSBsb2dGb3JTdHJlYW0oU3lzdGVtLmVycik7CisJCQkJd3JpdGUoZGF0ZSwgYWN0aXZpdGllcyk7CisJCQkJbG9nLmZsdXNoKCk7CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZTIpIHsKKwkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIkFuIGV4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSBsb2dnaW5nIHRvIHRoZSBjb25zb2xlOiIpOyAvLyROT04tTkxTLTEkCisJCQkJZTIucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5lcnIpOworCQkJfQorCQl9IGZpbmFsbHkgeworCQkJbG9nID0gbnVsbDsKKwkJfQorCX0KKwkKKworCS8qCisJICogIUNPTkZJR1VSQVRJT04gPGxhYmVsPgorCSAqLworCXByaXZhdGUgdm9pZCB3cml0ZShEYXRlIGRhdGUsIElBY3Rpdml0eVtdIGFjdGl2aXRpZXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXdyaXRlbG4oKTsKKwkJd3JpdGUoQ09ORklHVVJBVElPTik7CisJCXdyaXRlU3BhY2UoKTsJCisJCXdyaXRlKFN0cmluZy52YWx1ZU9mKGRhdGUuZ2V0VGltZSgpKSk7CisJCXdyaXRlU3BhY2UoKTsKKwkJd3JpdGUoZGF0ZS50b1N0cmluZygpKTsKKwkJd3JpdGVsbigpOworCQlmb3IgKGludCBpID0gMDsgaSA8IGFjdGl2aXRpZXMubGVuZ3RoOyBpKyspIHsKKwkJCXdyaXRlKGFjdGl2aXRpZXNbaV0pOworCQl9CQkJCQorCX0KKworCS8qCisJICogIUFDVElWSVRZIDxkYXRlPiA8dGFyZ2V0PiA8YWN0aW9uPiA8c3RhdHVzPgorCSAqLworCXByaXZhdGUgdm9pZCB3cml0ZShJQWN0aXZpdHkgYWN0aXZpdHkpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXdyaXRlKEFDVElWSVRZKTsKKwkJd3JpdGVTcGFjZSgpOwkKKwkJd3JpdGUoU3RyaW5nLnZhbHVlT2YoYWN0aXZpdHkuZ2V0RGF0ZSgpLmdldFRpbWUoKSkpOworCQl3cml0ZVNwYWNlKCk7CisJCXdyaXRlKGdldEZvcm1hdHRlZERhdGUoYWN0aXZpdHkuZ2V0RGF0ZSgpKSk7CisJCXdyaXRlU3BhY2UoKTsKKwkJd3JpdGUoYWN0aXZpdHkuZ2V0TGFiZWwoKSk7CisJCXdyaXRlU3BhY2UoKTsKKwkJd3JpdGUoZ2V0QWN0aW9uKGFjdGl2aXR5LmdldEFjdGlvbigpKSk7CisJCXdyaXRlU3BhY2UoKTsKKwkJd3JpdGUoKGFjdGl2aXR5LmdldFN0YXR1cygpPT1JQWN0aXZpdHkuU1RBVFVTX09LKT9TVUNDRVNTOkZBSUxVUkUpOworCQl3cml0ZWxuKCk7CQkKKwl9CisKKwkvKgorCSAqIAorCSAqLworCXByaXZhdGUgU3RyaW5nIGdldEFjdGlvbihpbnQgaSkgeworCQlzd2l0Y2ggKGkpIHsKKwkJCWNhc2UgSUFjdGl2aXR5LkFDVElPTl9GRUFUVVJFX0lOU1RBTEwgOgorCQkJCXJldHVybiBGRUFUVVJFX0lOU1RBTEw7CisJCQljYXNlIElBY3Rpdml0eS5BQ1RJT05fRkVBVFVSRV9SRU1PVkUgOgorCQkJCXJldHVybiBGRUFUVVJFX1JFTU9WRTsKKwkJCWNhc2UgSUFjdGl2aXR5LkFDVElPTl9TSVRFX0lOU1RBTEwgOgorCQkJCXJldHVybiBTSVRFX0lOU1RBTEw7CisJCQljYXNlIElBY3Rpdml0eS5BQ1RJT05fU0lURV9SRU1PVkUgOgorCQkJCXJldHVybiBTSVRFX1JFTU9WRTsKKwkJCWNhc2UgSUFjdGl2aXR5LkFDVElPTl9VTkNPTkZJR1VSRSA6CisJCQkJcmV0dXJuIFVOQ09ORklHVVJFOworCQkJY2FzZSBJQWN0aXZpdHkuQUNUSU9OX0NPTkZJR1VSRSA6CisJCQkJcmV0dXJuIENPTkZJR1VSRTsKKwkJCWNhc2UgSUFjdGl2aXR5LkFDVElPTl9SRVZFUlQgOgorCQkJCXJldHVybiBSRVZFUlQ7CisJCQljYXNlIElBY3Rpdml0eS5BQ1RJT05fUkVDT05DSUxJQVRJT04gOgorCQkJCXJldHVybiBSRUNPTkNJTElBVElPTjsKKwkJCWNhc2UgSUFjdGl2aXR5LkFDVElPTl9BRERfUFJFU0VSVkVEIDoKKwkJCQlyZXR1cm4gUFJFU0VSVkVEOworCQkJCQkJCQorCQkJZGVmYXVsdCA6CisJCQkJcmV0dXJuIFVOS05PV04rIiBbIitpKyJdIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCX0KKwl9CisKKworCS8qCisJICogCisJICovCisJcHJpdmF0ZSB2b2lkIHdyaXRlbG4oKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQl3cml0ZShMSU5FX1NFUEFSQVRPUik7CisJfQorCQorCS8qCisJICogCisJICovCisJcHJpdmF0ZSB2b2lkIHdyaXRlKFN0cmluZyBtZXNzYWdlKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlpZiAobWVzc2FnZSAhPSBudWxsKQorCQkJbG9nLndyaXRlKG1lc3NhZ2UpOworCX0KKwkKKwkvKgorCSAqIAorCSAqLworCXByaXZhdGUgdm9pZCB3cml0ZVNwYWNlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJd3JpdGUoIiAiKTsgLy8kTk9OLU5MUy0xJAorCX0KK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvVXBkYXRlTWFuYWdlclV0aWxzLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1VwZGF0ZU1hbmFnZXJVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxZTcxM2EKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1VwZGF0ZU1hbmFnZXJVdGlscy5qYXZhCkBAIC0wLDAgKzEsOTY0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAgICAgQ2hyaXMgQW5pc3pjenlrIChJQk0gQ29ycC4pIC0gRml4ZWQgTlBFCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JVXBkYXRlQ29uc3RhbnRzOworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC5JbnN0YWxsQWJvcnRlZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5jb25uZWN0aW9uLkNvbm5lY3Rpb25GYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLmNvbm5lY3Rpb24uSVJlc3BvbnNlOworaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7CitpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkNvbnN0YW50czsKK2ltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLnBhY2thZ2VhZG1pbi5QYWNrYWdlQWRtaW47CisKKy8qKgorICogCisgKi8KK3B1YmxpYyBjbGFzcyBVcGRhdGVNYW5hZ2VyVXRpbHMgeworCisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBPU19VTklYID0gb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLmVudmlyb25tZW50LkNvbnN0YW50cy5PU19IUFVYCisJCQkuZXF1YWxzKFBsYXRmb3JtLmdldE9TKCkpCisJCQl8fCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UuZW52aXJvbm1lbnQuQ29uc3RhbnRzLk9TX0FJWAorCQkJCQkuZXF1YWxzKFBsYXRmb3JtLmdldE9TKCkpCisJCQl8fCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UuZW52aXJvbm1lbnQuQ29uc3RhbnRzLk9TX0xJTlVYCisJCQkJCS5lcXVhbHMoUGxhdGZvcm0uZ2V0T1MoKSkKKwkJCXx8IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5lbnZpcm9ubWVudC5Db25zdGFudHMuT1NfU09MQVJJUworCQkJCQkuZXF1YWxzKFBsYXRmb3JtLmdldE9TKCkpCisJCQl8fCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UuZW52aXJvbm1lbnQuQ29uc3RhbnRzLk9TX01BQ09TWAorCQkJCQkuZXF1YWxzKFBsYXRmb3JtLmdldE9TKCkpOworCXByaXZhdGUgc3RhdGljIEZyYWdtZW50RW50cnlbXSBub0ZyYWdtZW50cyA9IG5ldyBGcmFnbWVudEVudHJ5WzBdOworCXByaXZhdGUgc3RhdGljIE1hcCB0YWJsZTsKKworCXN0YXRpYyB7CisJCXRhYmxlID0gbmV3IEhhc2hNYXAoKTsKKwkJdGFibGUucHV0KCJjb21wYXRpYmxlIiwgbmV3IEludGVnZXIoSVVwZGF0ZUNvbnN0YW50cy5SVUxFX0NPTVBBVElCTEUpKTsgLy8kTk9OLU5MUy0xJAorCQl0YWJsZS5wdXQoInBlcmZlY3QiLCBuZXcgSW50ZWdlcihJVXBkYXRlQ29uc3RhbnRzLlJVTEVfUEVSRkVDVCkpOyAvLyROT04tTkxTLTEkCisJCXRhYmxlLnB1dCgiZXF1aXZhbGVudCIsIG5ldyBJbnRlZ2VyKElVcGRhdGVDb25zdGFudHMuUlVMRV9FUVVJVkFMRU5UKSk7IC8vJE5PTi1OTFMtMSQKKwkJdGFibGUucHV0KCJncmVhdGVyT3JFcXVhbCIsIG5ldyBJbnRlZ2VyKElVcGRhdGVDb25zdGFudHMuUlVMRV9HUkVBVEVSX09SX0VRVUFMKSk7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwkvLyBtYW5hZ2UgVVJMIHRvIEZpbGUKKwlwcml2YXRlIHN0YXRpYyBNYXAgdXJsRmlsZU1hcDsKKworCXByaXZhdGUgc3RhdGljIE1hcCBsb2NhbEZpbGVGcmFnbWVudE1hcDsKKwlwcml2YXRlIHN0YXRpYyBTdGFjayBidWZmZXJQb29sOworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCVUZGRVJfU0laRSA9IDQwOTY7IC8vIDRrYnl0ZXMKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5DUkVNRU5UX1NJWkUgPSAxMDI0MDsgLy8gMTBrYnl0ZXMKKwkvKioKKwkgKiByZXR1cm4gdGhlIHVybFN0cmluZyBpZiBpdCBpcyBhIGFic29sdXRlIFVSTAorCSAqIG90aGVyd2lzZSwgcmV0dXJuIHRoZSBkZWZhdWx0IFVSTCBpZiB0aGUgdXJsU3RyaW5nIGlzIG51bGwKKwkgKiBUaGUgZGVmYXVsdFVSTCBtYXkgcG9pbnQgb3QgYSBmaWxlLCBjcmVhdGUgYSBmaWxlIFVSTCB0aGVuCisJICogaWYgdGhlIHVybFN0cmluZyBvciB0aGUgZGVmYXVsdCBVUkwgYXJlIHJlbGF0aXZlcywgcHJlcGVuZCB0aGUgcm9vdFVSTCB0byBpdAorCSAqLworCXB1YmxpYyBzdGF0aWMgVVJMIGdldFVSTChVUkwgcm9vdFVSTCwgU3RyaW5nIHVybFN0cmluZywgU3RyaW5nIGRlZmF1bHRVUkwpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24geworCQlVUkwgdXJsID0gbnVsbDsKKworCQkvLyBpZiBubyBVUkwgLCBwcm92aWRlIERlZmF1bHQKKwkJaWYgKHVybFN0cmluZyA9PSBudWxsIHx8IHVybFN0cmluZy50cmltKCkuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCisKKwkJCS8vIG5vIFVSTCwgbm8gZGVmYXVsdCwgcmV0dXJuIHJpZ2h0IG5vdy4uLgorCQkJaWYgKGRlZmF1bHRVUkwgPT0gbnVsbCB8fCBkZWZhdWx0VVJMLnRyaW0oKS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCisJCQkJcmV0dXJuIG51bGw7CisJCQllbHNlCisJCQkJdXJsU3RyaW5nID0gZGVmYXVsdFVSTDsKKwkJfQorCisJCS8vIFVSTCBjYW4gYmUgcmVsYXRpdmUgb3IgYWJzb2x1dGUJCisJCWlmICh1cmxTdHJpbmcuc3RhcnRzV2l0aCgiLyIpICYmIHVybFN0cmluZy5sZW5ndGgoKSA+IDEpIC8vJE5PTi1OTFMtMSQKKwkJCXVybFN0cmluZyA9IHVybFN0cmluZy5zdWJzdHJpbmcoMSk7CisJCXRyeSB7CisJCQl1cmwgPSBuZXcgVVJMKHVybFN0cmluZyk7CisJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisJCQkvLyB0aGUgdXJsIGlzIG5vdCBhbiBhYnNvbHV0ZSBVUkwKKwkJCS8vIHRyeSByZWxhdGl2ZQorCQkJdXJsID0gbmV3IFVSTChyb290VVJMLCB1cmxTdHJpbmcpOworCQl9CisKKwkJcmV0dXJuIHVybDsKKwl9CisKKwkvKioKKwkgKiByZXR1cm4gYSByZWxhdGl2ZSBTdHJpbmcgdG8gcm9vdFVSTCAKKwkgKiBpZiB1cmwgY29udGFpbnMgcm9vdFVSTCBzbworCSAqIG5ldyBVUkwocm9vdFVSTCwgcmVzdWx0U3RyaW5nKSA9PSB1cmwKKwkgKiAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRVUkxBc1N0cmluZyhVUkwgcm9vdFVSTCwgVVJMIHVybCkgeworCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKKworCQlpZiAocm9vdFVSTCA9PSBudWxsKSB7CisJCQlyZXR1cm4gKHVybCA9PSBudWxsKSA/IG51bGwgOiB1cmwudG9TdHJpbmcoKTsKKwkJfQorCisJCS8vIGlmIG5vIFVSTCAsIHJldHVybiBudWxsCisJCWlmICh1cmwgIT0gbnVsbCkgeworCisJCQlyZXN1bHQgPSB1cmwudG9FeHRlcm5hbEZvcm0oKTsKKworCQkJaWYgKHJvb3RVUkwuZ2V0SG9zdCgpICE9IG51bGwgJiYgIXJvb3RVUkwuZ2V0SG9zdCgpLmVxdWFscyh1cmwuZ2V0SG9zdCgpKSkKKwkJCQlyZXR1cm4gcmVzdWx0OworCisJCQlpZiAocm9vdFVSTC5nZXRQcm90b2NvbCgpICE9IG51bGwgJiYgIXJvb3RVUkwuZ2V0UHJvdG9jb2woKS5lcXVhbHModXJsLmdldFByb3RvY29sKCkpKQorCQkJCXJldHVybiByZXN1bHQ7CisKKwkJCWlmIChyb290VVJMLmdldFBvcnQoKSAhPSB1cmwuZ2V0UG9ydCgpKQorCQkJCXJldHVybiByZXN1bHQ7CisKKwkJCVN0cmluZyByb290VVJMRmlsZVN0cmluZyA9IHJvb3RVUkwuZ2V0RmlsZSgpOworCQkJcm9vdFVSTEZpbGVTdHJpbmcgPSByb290VVJMRmlsZVN0cmluZy5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKTsKKwkJCWlmICghcm9vdFVSTEZpbGVTdHJpbmcuZW5kc1dpdGgoIi8iKSkgeyAvLyROT04tTkxTLTEkCisJCQkJaW50IGluZGV4ID0gcm9vdFVSTEZpbGVTdHJpbmcubGFzdEluZGV4T2YoJy8nKTsKKwkJCQlpZiAoaW5kZXggIT0gLTEpIHsKKwkJCQkJcm9vdFVSTEZpbGVTdHJpbmcgPSByb290VVJMRmlsZVN0cmluZy5zdWJzdHJpbmcoMCwgaW5kZXgpOworCQkJCX0KKwkJCX0KKwkJCVN0cmluZyB1cmxGaWxlU3RyaW5nID0gdXJsLmdldEZpbGUoKTsKKworCQkJaWYgKHVybEZpbGVTdHJpbmcuc3RhcnRzV2l0aChyb290VVJMRmlsZVN0cmluZykpIHsKKwkJCQlyZXN1bHQgPSB1cmxGaWxlU3RyaW5nLnN1YnN0cmluZyhyb290VVJMRmlsZVN0cmluZy5sZW5ndGgoKSk7CisJCQkJcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpOworCQkJfSBlbHNlIHsKKwkJCQkvLyB3ZSBuZWVkIHRvIGNoZWNrIHRoZSBmb2xsb3dpbmcKKwkJCQkvLyBmaWxlOi9DOi8gYW5kIGZpbGU6QzovCisJCQkJaWYgKCJmaWxlIi5lcXVhbHNJZ25vcmVDYXNlKHVybC5nZXRQcm90b2NvbCgpKSkgeyAvLyROT04tTkxTLTEkCisJCQkJCUZpbGUgcm9vdEZpbGUgPSBuZXcgRmlsZShyb290VVJMRmlsZVN0cmluZyk7CisJCQkJCUZpbGUgdXJsRmlsZSA9IG5ldyBGaWxlKHVybEZpbGVTdHJpbmcpOworCisJCQkJCUZpbGUgcmVsYXRpdmVQYXRoID0gdXJsRmlsZTsKKwkJCQkJd2hpbGUgKHJlbGF0aXZlUGF0aCAhPSBudWxsICYmICFyb290RmlsZS5lcXVhbHMocmVsYXRpdmVQYXRoLmdldFBhcmVudEZpbGUoKSkpIHsKKwkJCQkJCXJlbGF0aXZlUGF0aCA9IHJlbGF0aXZlUGF0aC5nZXRQYXJlbnRGaWxlKCk7CisJCQkJCX0KKworCQkJCQlpZiAocmVsYXRpdmVQYXRoID09IG51bGwpIHsKKwkJCQkJCVVwZGF0ZUNvcmUud2FybigiQ2Fubm90IGNhbGN1bGF0ZSByZWxhdGl2ZSBwYXRoIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCXJldHVybiB1cmwudG9TdHJpbmcoKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCVN0cmluZyByZWxhdGl2ZVJvb3RTdHJpbmcgPSByZWxhdGl2ZVBhdGguZ2V0UGFyZW50RmlsZSgpLmdldEFic29sdXRlUGF0aCgpOworCQkJCQkJU3RyaW5nIGZ1bGxTdHJpbmcgPSB1cmxGaWxlLmdldEFic29sdXRlUGF0aCgpOworCQkJCQkJaWYgKCFmdWxsU3RyaW5nLnN0YXJ0c1dpdGgocmVsYXRpdmVSb290U3RyaW5nKSkgeworCQkJCQkJCVVwZGF0ZUNvcmUud2FybigiRnVsbCBwYXRoOiIgKyBmdWxsU3RyaW5nICsgIiBkb2VzIG5vdCBzdGFydCB3aXRoICIgKyByZWxhdGl2ZVJvb3RTdHJpbmcpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkJCQlyZXR1cm4gdXJsLnRvU3RyaW5nKCk7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCVN0cmluZyByZXR1cm5TdHJpbmcgPSBmdWxsU3RyaW5nLnN1YnN0cmluZyhyZWxhdGl2ZVJvb3RTdHJpbmcubGVuZ3RoKCkgKyAxKTsKKwkJCQkJCQlpZiAodXJsRmlsZS5pc0RpcmVjdG9yeSgpKQorCQkJCQkJCQlyZXR1cm5TdHJpbmcgKz0gRmlsZS5zZXBhcmF0b3I7CisJCQkJCQkJLy8gd2UgbG9zdCB0aGUgbGFzdCBzbGFzaCB3aGVuIHRyYW5mb3JtaW5nIGluIEZpbGUKKwkJCQkJCQlyZXR1cm5TdHJpbmcgPSByZXR1cm5TdHJpbmcucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJyk7CisJCQkJCQkJcmV0dXJuIHJldHVyblN0cmluZzsKKwkJCQkJCX0KKworCQkJCQl9CisKKwkJCQl9IGVsc2UgeworCQkJCQlyZXN1bHQgPSB1cmwudG9TdHJpbmcoKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIHJldHVybnMgYSB0cmFuc2xhdGVkIFN0cmluZworCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBpbmZvVVJMLCBSZXNvdXJjZUJ1bmRsZSBidW5kbGUpIHsKKwkJU3RyaW5nIHJlc3VsdCA9IG51bGw7CisJCWlmIChpbmZvVVJMICE9IG51bGwpIHsKKwkJCXJlc3VsdCA9IFBsYXRmb3JtLmdldFJlc291cmNlU3RyaW5nKFVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCksIGluZm9VUkwsIGJ1bmRsZSk7CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFVSTCBjb3B5VG9Mb2NhbChJbnB1dFN0cmVhbSBzb3VyY2VDb250ZW50UmVmZXJlbmNlU3RyZWFtLCBTdHJpbmcgbG9jYWxOYW1lLCBJbnN0YWxsTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgSW5zdGFsbEFib3J0ZWRFeGNlcHRpb24geworCQlVUkwgcmVzdWx0ID0gbnVsbDsKKwkJLy8gY3JlYXRlIHRoZSBEaXIgaWYgdGhleSBkbyBub3QgZXhpc3QKKwkJLy8gZ2V0IHRoZSBwYXRoIGZyb20gdGhlIEZpbGUgdG8gcmVzb2x2ZSBGaWxlLnNlcGFyYXRvci4uCisJCS8vIGRvIG5vdCB1c2UgdGhlIFN0cmluZyBhcyBpdCBtYXkgY29udGFpbiBVUkwgbGlrZSBzZXBhcmF0b3IKKwkJRmlsZSBsb2NhbEZpbGUgPSBuZXcgRmlsZShsb2NhbE5hbWUpOworCQlpbnQgaW5kZXggPSBsb2NhbEZpbGUuZ2V0UGF0aCgpLmxhc3RJbmRleE9mKEZpbGUuc2VwYXJhdG9yKTsKKwkJaWYgKGluZGV4ICE9IC0xKSB7CisJCQlGaWxlIGRpciA9IG5ldyBGaWxlKGxvY2FsRmlsZS5nZXRQYXRoKCkuc3Vic3RyaW5nKDAsIGluZGV4KSk7CisJCQlpZiAoIWRpci5leGlzdHMoKSkKKwkJCQlkaXIubWtkaXJzKCk7CisJCX0KKworCQkvLyB0cmFuc2ZlciB0aGUgY29udGVudCBvZiB0aGUgRmlsZQorCQlpZiAoIWxvY2FsRmlsZS5pc0RpcmVjdG9yeSgpKSB7CisJCQlPdXRwdXRTdHJlYW0gbG9jYWxDb250ZW50UmVmZXJlbmNlU3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0obG9jYWxGaWxlKTsKKwkJCXRyeSB7CisJCQkJVXRpbGl0aWVzLmNvcHkoc291cmNlQ29udGVudFJlZmVyZW5jZVN0cmVhbSwgbG9jYWxDb250ZW50UmVmZXJlbmNlU3RyZWFtLCBtb25pdG9yKTsKKwkJCX0gZmluYWxseSB7CisJCQkJdHJ5IHsKKwkJCQkJbG9jYWxDb250ZW50UmVmZXJlbmNlU3RyZWFtLmNsb3NlKCk7CisJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSl7fQorCQkJfQorCQl9CisJCXJlc3VsdCA9IGxvY2FsRmlsZS50b1VSTCgpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qCisJICogWzIwMzA1XSBuZWVkIHRvIHNsYW0gcGVybWlzc2lvbnMgZm9yIGV4ZWN1dGFibGUgbGlicyBvbiBzb21lCisJICogcGxhdGZvcm1zLiBUaGlzIGlzIGEgdGVtcG9yYXJ5IGZpeAorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBjaGVja1Blcm1pc3Npb25zKENvbnRlbnRSZWZlcmVuY2UgcmVmLCBTdHJpbmcgZmlsZVBhdGgpIHsKKworCQlpZiAocmVmLmdldFBlcm1pc3Npb24oKSAhPSAwKSB7CisJCQlVcGRhdGVDb3JlLndhcm4oIkNoYW5nZSBwZXJtaXNzaW9uIGZvciAiICsgZmlsZVBhdGggKyAiIHRvICIgKyByZWYuZ2V0UGVybWlzc2lvbigpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkvLyBGSVhNRTogY2hhbmdlIHRoZSBjb2RlIHRvIHVzZSBKTkkKKwkJfQorCisJCWlmIChmaWxlUGF0aCAhPSBudWxsICYmIE9TX1VOSVggJiYgcmVmLmdldFBlcm1pc3Npb24oKSAhPSAwKSB7CisJCQkvLyBhZGQgZXhlY3V0ZSBwZXJtaXNzaW9uIG9uIHNoYXJlZCBsaWJyYXJpZXMgMjAzMDUKKwkJCS8vIGRvIG5vdCByZW1vdmUgd3JpdGUgcGVybWlzc2lvbiAyMDg5NgorCQkJLy8gY2htb2QgYSt4ICouc2wKKwkJCXRyeSB7CisJCQkJUHJvY2VzcyBwciA9IFJ1bnRpbWUuZ2V0UnVudGltZSgpLmV4ZWMobmV3IFN0cmluZ1tdIHsgImNobW9kIiwgImEreCIsIGZpbGVQYXRoIH0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQlUaHJlYWQgY2htb2RPdXRwdXQgPSBuZXcgU3RyZWFtQ29uc3VtZXIocHIuZ2V0SW5wdXRTdHJlYW0oKSk7CisJCQkJY2htb2RPdXRwdXQuc2V0TmFtZSgiY2htb2Qgb3V0cHV0IHJlYWRlciIpOyAvLyROT04tTkxTLTEkCisJCQkJY2htb2RPdXRwdXQuc3RhcnQoKTsKKwkJCQlUaHJlYWQgY2htb2RFcnJvciA9IG5ldyBTdHJlYW1Db25zdW1lcihwci5nZXRFcnJvclN0cmVhbSgpKTsKKwkJCQljaG1vZEVycm9yLnNldE5hbWUoImNobW9kIGVycm9yIHJlYWRlciIpOyAvLyROT04tTkxTLTEkCisJCQkJY2htb2RFcnJvci5zdGFydCgpOworCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisJCQl9CisKKwkJfQorCX0KKworCS8qKgorCSAqIFJldHVybnMgYSByYW5kb20gZmlsZSBuYW1lIGZvciB0aGUgbG9jYWwgc3lzdGVtCisJICogYXR0ZW1wdCB0byBjb25zZXJ2ZSB0aGUgZXh0ZW5zaW9uIGlmIHRoZXJlIGlzIGEgJy4nIGluIHRoZSBwYXRoCisJICogYW5kIG5vIEZpbGUuU2VwZXJhdG9yIGFmdGVyIHRoZSAnLicKKwkgKiAKKwkgKiBcYVxiXGMudHh0IC0+IGM5ODc2NTkzODUudHh0CisJICogYy50eHQgLT4gYzM4NTQ3NjMudHh0CisJICogYwktPiBjOTUzODY3NTQ5CisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TG9jYWxSYW5kb21JZGVudGlmaWVyKFN0cmluZyByZW1vdGVQYXRoLCBEYXRlIGRhdGUpIHsKKwkJaW50IGRvdEluZGV4ID0gcmVtb3RlUGF0aC5sYXN0SW5kZXhPZigiLiIpOwkvLyROT04tTkxTLTEkCisJCWludCBmaWxlSW5kZXggPSByZW1vdGVQYXRoLmxhc3RJbmRleE9mKEZpbGUuc2VwYXJhdG9yKTsKKwkJLy8gaWYgdGhlcmUgaXMgYSBzZXBhcmF0b3IgYWZ0ZXIgdGhlIGRvdAorCQkvLyBkbyBub3QgY29uc2lkZXIgaXQgYXMgYW4gZXh0ZW5zaW9uCisJCVN0cmluZyBleHQgPSAoZG90SW5kZXggIT0gLTEgJiYgZmlsZUluZGV4IDwgZG90SW5kZXgpID8gcmVtb3RlUGF0aC5zdWJzdHJpbmcoZG90SW5kZXgpIDogIiI7IC8vJE5PTi1OTFMtMSQKKwkJLy8gdGhlIG5hbWUgaXMgdGhlIHN0cmluZyBiZXR3ZWVuIHRoZSBzZXBhcmF0b3IgYW5kIHRoZSBkb3QKKwkJLy8gaWYgdGhlcmUgaXMgbm8gc2VwYXJhdG9yLCBpdCBpcyB0aGUgc3RyaW5nIHVwIHRvIHRoZSBkb3QJCQorCQkvLyBpZiB0aGVyZSBpcyBubyBkb3QsIGdvIHRvIHRoZSBlbmQgb2YgdGhlIHN0cmluZyAKKwkJaWYgKGZpbGVJbmRleCA9PSAtMSkKKwkJCWZpbGVJbmRleCA9IDA7CisJCWlmIChkb3RJbmRleCA9PSAtMSkKKwkJCWRvdEluZGV4ID0gcmVtb3RlUGF0aC5sZW5ndGgoKTsKKwkJLy8gaWYgSSBoYXZlIGEgc2VwYXJhdG9yIGFuZCBubyBkb3Q6IC9hL2IvYyAtPiBjCisJCS8vIGlmIG15IHNlcGFyYXRvciBpcyB0aGUgbGFzdCAvYS9iL2MvLCBmaWxlSW5kZXggYW5kIGRvdEluZGV4IGFyZSB0aGUgc2FtZSwgc28gaXQgd2lsbCByZXR1cm4gdGhlIGRlZmF1bHQgdGVtcCBuYW1lCisJCVN0cmluZyBuYW1lID0gKGZpbGVJbmRleCA8IGRvdEluZGV4KSA/IHJlbW90ZVBhdGguc3Vic3RyaW5nKGZpbGVJbmRleCwgZG90SW5kZXgpIDogIkVjbGlwc2VfVXBkYXRlX1RNUF8iOyAvLyROT04tTkxTLTEkCisJCVN0cmluZyByZXN1bHQgPSBuYW1lICsgZGF0ZS5nZXRUaW1lKCkgKyBleHQ7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoqCisJICogcmVtb3ZlIGEgZmlsZSBvciBkaXJlY3RvcnkgZnJvbSB0aGUgZmlsZSBzeXN0ZW0uCisJICogdXNlZCB0byBjbGVhbiB1cCBpbnN0YWxsCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUZyb21GaWxlU3lzdGVtKEZpbGUgZmlsZSkgeworCQlpZiAoIWZpbGUuZXhpc3RzKCkgfHwgIWZpbGUuY2FuV3JpdGUoKSkKKwkJCXJldHVybjsKKworCQlpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKSB7CisJCQlTdHJpbmdbXSBmaWxlcyA9IGZpbGUubGlzdCgpOworCQkJaWYgKGZpbGVzICE9IG51bGwpIC8vIGJlIGNhcmVmdWwgc2luY2UgZmlsZS5saXN0KCkgY2FuIHJldHVybiBudWxsCisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7ICsraSkKKwkJCQkJcmVtb3ZlRnJvbUZpbGVTeXN0ZW0obmV3IEZpbGUoZmlsZSwgZmlsZXNbaV0pKTsKKwkJfQorCisJCWlmICghZmlsZS5kZWxldGUoKSkgeworCQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKE1lc3NhZ2VzLlVwZGF0ZU1hbmFnZXJVdGlsc19VbmFibGVUb1JlbW92ZUZpbGUsIChuZXcgU3RyaW5nW10geyBmaWxlLmdldEFic29sdXRlUGF0aCgpIH0pKTsKKwkJCVVwZGF0ZUNvcmUubG9nKG1zZywgbmV3IEV4Y2VwdGlvbigpKTsKKwkJfQorCX0KKworCS8qKgorCSAqIHJlbW92ZSBhbGwgdGhlIGVtcHR5IGRpcmVjdG9yaWVzIHJlY3Vyc2l2ZWx5CisJICogdXNlZCB0byBjbGVhbiB1cCBpbnN0YWxsCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUVtcHR5RGlyZWN0b3JpZXNGcm9tRmlsZVN5c3RlbShGaWxlIGZpbGUpIHsKKwkJaWYgKCFmaWxlLmlzRGlyZWN0b3J5KCkpCisJCQlyZXR1cm47CisKKwkJU3RyaW5nW10gZmlsZXMgPSBmaWxlLmxpc3QoKTsKKwkJaWYgKGZpbGVzICE9IG51bGwpIHsgLy8gYmUgY2FyZWZ1bCBzaW5jZSBmaWxlLmxpc3QoKSBjYW4gcmV0dXJuIG51bGwKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyArK2kpIHsKKwkJCQlyZW1vdmVFbXB0eURpcmVjdG9yaWVzRnJvbUZpbGVTeXN0ZW0obmV3IEZpbGUoZmlsZSwgZmlsZXNbaV0pKTsKKwkJCX0KKwkJfQorCQlpZiAoIWZpbGUuZGVsZXRlKCkpIHsKKwkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChNZXNzYWdlcy5VcGRhdGVNYW5hZ2VyVXRpbHNfVW5hYmxlVG9SZW1vdmVGaWxlLCAobmV3IFN0cmluZ1tdIHsgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSB9KSk7CisJCQlVcGRhdGVDb3JlLmxvZyhtc2csIG5ldyBFeGNlcHRpb24oKSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBwbHVnaW4gZW50cmllcyB0aGF0IGFyZSBpbiBzb3VyY2UgYXJyYXkgYW5kCisJICogbm90IGluIHRhcmdldCBhcnJheQorCSAqLworCXB1YmxpYyBzdGF0aWMgSVBsdWdpbkVudHJ5W10gZGlmZihJUGx1Z2luRW50cnlbXSBzb3VyY2VBcnJheSwgSVBsdWdpbkVudHJ5W10gdGFyZ2V0QXJyYXkpIHsgLy8gTm8gcGx1Z2luRW50cnkgdG8gSW5zdGFsbCwgcmV0dXJuIE5vdGhpbmcgdG8gaW5zdGFsCisJCWlmIChzb3VyY2VBcnJheSA9PSBudWxsIHx8IHNvdXJjZUFycmF5Lmxlbmd0aCA9PSAwKSB7CisJCQlyZXR1cm4gbmV3IElQbHVnaW5FbnRyeVswXTsKKwkJfSAvLyBObyBwbHVnaW5FbnRyeSBpbnN0YWxsZWQsIEluc3RhbGwgdGhlbSBhbGwKKwkJaWYgKHRhcmdldEFycmF5ID09IG51bGwgfHwgdGFyZ2V0QXJyYXkubGVuZ3RoID09IDApIHsKKwkJCXJldHVybiBzb3VyY2VBcnJheTsKKwkJfSAvLyBpZiBhIElQbHVnaW5FbnRyeSBmcm9tIHNvdXJjZUFycmF5IGlzIE5PVCBpbgorCQkvLyB0YXJnZXRBcnJheSwgYWRkIGl0IHRvIHRoZSBsaXN0CisJCUxpc3QgbGlzdDEgPSBBcnJheXMuYXNMaXN0KHRhcmdldEFycmF5KTsKKwkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KDApOworCQlmb3IgKGludCBpID0gMDsgaSA8IHNvdXJjZUFycmF5Lmxlbmd0aDsgaSsrKSB7CisJCQlpZiAoIWxpc3QxLmNvbnRhaW5zKHNvdXJjZUFycmF5W2ldKSkKKwkJCQlyZXN1bHQuYWRkKHNvdXJjZUFycmF5W2ldKTsKKwkJfQorCisJCUlQbHVnaW5FbnRyeVtdIHJlc3VsdEVudHJ5ID0gbmV3IElQbHVnaW5FbnRyeVtyZXN1bHQuc2l6ZSgpXTsKKwkJaWYgKHJlc3VsdC5zaXplKCkgPiAwKQorCQkJcmVzdWx0LnRvQXJyYXkocmVzdWx0RW50cnkpOworCQlyZXR1cm4gcmVzdWx0RW50cnk7CisJfQorCisJLyoqCisJICogCisJICovCisJcHVibGljIHN0YXRpYyBVUkwgYXNEaXJlY3RvcnlVUkwoVVJMIHVybCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7CisJCS8vdXJsID0gVVJMRW5jb2Rlci5lbmNvZGUodXJsKTsKKwkJU3RyaW5nIHBhdGggPSB1cmwuZ2V0RmlsZSgpOworCQlpZiAoIXBhdGguZW5kc1dpdGgoIi8iKSkgeyAvLyROT04tTkxTLTEkCisJCQlpbnQgaW5kZXggPSBwYXRoLmxhc3RJbmRleE9mKCcvJyk7CisJCQlpZiAoaW5kZXggIT0gLTEpCisJCQkJcGF0aCA9IHBhdGguc3Vic3RyaW5nKDAsIGluZGV4ICsgMSk7CisJCQkvLyBpZ25vcmUgYW55IHJlZiBpbiBvcmlnaW5hbCBVUkwKKwkJCXVybCA9IG5ldyBVUkwodXJsLmdldFByb3RvY29sKCksIHVybC5nZXRIb3N0KCksIHVybC5nZXRQb3J0KCksIHBhdGgpOworCQl9CisJCXJldHVybiB1cmw7CisJfQorCisJLyoKKwkgKiBDb21wYXJlcyB0d28gVVJMIGZvciBlcXVhbGl0eQorCSAqIFJldHVybiBmYWxzZSBpZiBvbmUgb2YgdGhlbSBpcyBudWxsCisJICovCisJcHVibGljIHN0YXRpYyBib29sZWFuIHNhbWVVUkwoVVJMIHVybDEsIFVSTCB1cmwyKSB7CisKKwkJaWYgKHVybDEgPT0gbnVsbCB8fCB1cmwyID09IG51bGwpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmICh1cmwxID09IHVybDIpCisJCQlyZXR1cm4gdHJ1ZTsKKwkJaWYgKHVybDEuZXF1YWxzKHVybDIpKQorCQkJcmV0dXJuIHRydWU7CisKKwkJLy8gY2hlY2sgaWYgVVJMIGFyZSBmaWxlOiBVUkwgYXMgd2UgbWF5CisJCS8vIGhhdmUgMiBVUkwgcG9pbnRpbmcgdG8gdGhlIHNhbWUgZmVhdHVyZVJlZmVyZW5jZQorCQkvLyBidXQgd2l0aCBkaWZmZXJlbnQgcmVwcmVzZW50YXRpb24KKwkJLy8gKGkuZS4gZmlsZTovQzsvIGFuZCBmaWxlOkM6LykKKwkJaWYgKCEiZmlsZSIuZXF1YWxzSWdub3JlQ2FzZSh1cmwxLmdldFByb3RvY29sKCkpKSAvLyROT04tTkxTLTEkCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmICghImZpbGUiLmVxdWFsc0lnbm9yZUNhc2UodXJsMi5nZXRQcm90b2NvbCgpKSkgLy8kTk9OLU5MUy0xJAorCQkJcmV0dXJuIGZhbHNlOworCisJCUZpbGUgZmlsZTEgPSBnZXRGaWxlRm9yKHVybDEpOy8vbmV3IEZpbGUodXJsMS5nZXRGaWxlKCkpOworCQlGaWxlIGZpbGUyID0gZ2V0RmlsZUZvcih1cmwyKTsKKworCQlpZiAoZmlsZTEgPT0gbnVsbCkKKwkJCXJldHVybiBmYWxzZTsKKworCQlyZXR1cm4gKGZpbGUxLmVxdWFscyhmaWxlMikpOworCX0KKwkKKwkvKgorCSAqIE1ldGhvZCBnZXRGaWxlRm9yLgorCSAqIEBwYXJhbSB1cmwxCisJICogQHJldHVybiBGaWxlCisJICovCisJcHJpdmF0ZSBzdGF0aWMgRmlsZSBnZXRGaWxlRm9yKFVSTCB1cmwxKSB7CisJCWlmICh1cmxGaWxlTWFwID09IG51bGwpIHVybEZpbGVNYXAgPSBuZXcgSGFzaE1hcCgpOworCQlpZiAodXJsRmlsZU1hcC5nZXQodXJsMSkhPW51bGwpIHJldHVybiAoRmlsZSl1cmxGaWxlTWFwLmdldCh1cmwxKTsKKwkJRmlsZSBuZXdGaWxlID0gbmV3IEZpbGUodXJsMS5nZXRGaWxlKCkpOworCQl1cmxGaWxlTWFwLnB1dCh1cmwxLG5ld0ZpbGUpOworCQlyZXR1cm4gbmV3RmlsZTsgCisJfQorCisJLyoKKwkgKiByZXR1cm5zIHRoZSBsaXN0IG9mIEZlYXR1cmVSZWZlcmVuY2UgdGhhdCBhcmUgcGFyZW50IG9mIAorCSAqIHRoZSBGZWF0dXJlIG9yIGFuIGVtcHR5IGFycmF5IGlmIG5vIHBhcmVudCBmb3VuZC4KKwkgKiBAcGFyYW0gb25seU9wdGlvbmFsIGlmIHNldCB0byA8Y29kZT50cnVlPC9jb2RlPiBvbmx5IHJldHVybiBwYXJlbnRzIHRoYXQgY29uc2lkZXIgdGhlIGZlYXR1cmUgb3B0aW9uYWwKKwkgKiBAcGFyYW0gY2hpbGQKKwkgKiBAcGFyYW0gcG9zc2libGVzUGFyZW50CisJICovCisJcHVibGljIHN0YXRpYyBJRmVhdHVyZVJlZmVyZW5jZVtdIGdldFBhcmVudEZlYXR1cmVzKElGZWF0dXJlIGNoaWxkRmVhdHVyZSwgSUZlYXR1cmVSZWZlcmVuY2VbXSBwb3NzaWJsZXNQYXJlbnQsIGJvb2xlYW4gb25seU9wdGlvbmFsKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisKKwkJaWYgKGNoaWxkRmVhdHVyZSA9PSBudWxsKQorCQkJcmV0dXJuIG5ldyBJRmVhdHVyZVJlZmVyZW5jZVswXTsKKworCQlMaXN0IHBhcmVudExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisJCUlJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VbXSBjaGlsZHJlbiA9IG51bGw7CisJCUlGZWF0dXJlIGNvbXBhcmVGZWF0dXJlID0gbnVsbDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBwb3NzaWJsZXNQYXJlbnQubGVuZ3RoOyBpKyspIHsKKwkJCXRyeSB7CisJCQkJSUZlYXR1cmUgcG9zc2libGVQYXJlbnRGZWF0dXJlID0gcG9zc2libGVzUGFyZW50W2ldLmdldEZlYXR1cmUobnVsbCk7CisJCQkJaWYgKHBvc3NpYmxlUGFyZW50RmVhdHVyZSAhPSBudWxsKSB7CisJCQkJCWNoaWxkcmVuID0gcG9zc2libGVQYXJlbnRGZWF0dXJlLmdldEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKTsKKwkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjaGlsZHJlbi5sZW5ndGg7IGorKykgeworCQkJCQkJdHJ5IHsKKwkJCQkJCQljb21wYXJlRmVhdHVyZSA9IGNoaWxkcmVuW2pdLmdldEZlYXR1cmUobnVsbCk7CisJCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCQkJCQlVcGRhdGVDb3JlLndhcm4oIiIsIGUpOyAvLyROT04tTkxTLTEkCisJCQkJCQl9CisJCQkJCQlpZiAoY2hpbGRGZWF0dXJlLmVxdWFscyhjb21wYXJlRmVhdHVyZSkpIHsKKwkJCQkJCQlpZiAob25seU9wdGlvbmFsKSB7CisJCQkJCQkJCWlmIChVcGRhdGVNYW5hZ2VyVXRpbHMuaXNPcHRpb25hbChjaGlsZHJlbltqXSkpIHsKKwkJCQkJCQkJCXBhcmVudExpc3QuYWRkKHBvc3NpYmxlc1BhcmVudFtpXSk7CisJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQlVcGRhdGVDb3JlLndhcm4oIkZlYXR1cmUgOiIgKyBjaGlsZHJlbltqXSArICIgbm90IG9wdGlvbmFsLiBOb3QgaW5jbHVkZWQgaW4gcGFyZW50cyBsaXN0LiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkJCQkJfQorCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCXBhcmVudExpc3QuYWRkKHBvc3NpYmxlc1BhcmVudFtpXSk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkJVXBkYXRlQ29yZS53YXJuKCIiLCBlKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQl9CisKKwkJSUZlYXR1cmVSZWZlcmVuY2VbXSBwYXJlbnRzID0gbmV3IElGZWF0dXJlUmVmZXJlbmNlWzBdOworCQlpZiAocGFyZW50TGlzdC5zaXplKCkgPiAwKSB7CisJCQlwYXJlbnRzID0gbmV3IElGZWF0dXJlUmVmZXJlbmNlW3BhcmVudExpc3Quc2l6ZSgpXTsKKwkJCXBhcmVudExpc3QudG9BcnJheShwYXJlbnRzKTsKKwkJfQorCQlyZXR1cm4gcGFyZW50czsKKwl9CisKKwkvKgorCSAqIElmIHRoZSByZXR1cm4gY29kZSBvZiB0aGUgSFRUUCBjb25uZWN0aW9uIGlzIG5vdCAyMDAgKE9LKQorCSAqIHRob3cgYW4gSU8gZXhjZXB0aW9uCisJICogCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIGNoZWNrQ29ubmVjdGlvblJlc3VsdChJUmVzcG9uc2UgcmVzcG9uc2UsVVJMIHVybCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJLy8gZGlkIHRoZSBzZXJ2ZXIgcmV0dXJuIGFuIGVycm9yIGNvZGUgPworCQlpbnQgcmVzdWx0ID0gcmVzcG9uc2UuZ2V0U3RhdHVzQ29kZSgpOworCisJCWlmIChyZXN1bHQgIT0gVXBkYXRlQ29yZS5IVFRQX09LKSB7IAorCQkJU3RyaW5nIHNlcnZlck1zZyA9IHJlc3BvbnNlLmdldFN0YXR1c01lc3NhZ2UoKTsKKwkJCXJlc3BvbnNlLmNsb3NlKCk7CisJCQl0aHJvdyBuZXcgRmF0YWxJT0V4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5Db250ZW50UmVmZXJlbmNlX0h0dHBOb2ssIChuZXcgT2JqZWN0W10geyBuZXcgSW50ZWdlcihyZXN1bHQpLCBzZXJ2ZXJNc2csIHVybCB9KSkpOwkJCQkJCQorCQl9CisJfQorCisJcHVibGljIHN0YXRpYyBjbGFzcyBTdHJlYW1Db25zdW1lciBleHRlbmRzIFRocmVhZCB7CisJCUlucHV0U3RyZWFtIGlzOworCQlieXRlW10gYnVmOworCQlwdWJsaWMgU3RyZWFtQ29uc3VtZXIoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHsKKwkJCXN1cGVyKCk7CisJCQl0aGlzLnNldERhZW1vbih0cnVlKTsKKwkJCXRoaXMuaXMgPSBpbnB1dFN0cmVhbTsKKwkJCWJ1ZiA9IG5ldyBieXRlWzUxMl07CisJCX0KKwkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJdHJ5IHsKKwkJCQlpbnQgbiA9IDA7CisJCQkJd2hpbGUgKG4gPj0gMCkKKwkJCQkJbiA9IGlzLnJlYWQoYnVmKTsKKwkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogUmV0dXJuIHRoZSBvcHRpb25hbCBjaGlsZHJlbiB0byBpbnN0YWxsCisJICogVGhlIG9wdGlvbmFsIGZlYXR1cmVzIHRvIGluc3RhbGwgbWF5IG5vdCBhbGwgYmUgZGlyZWN0IGNoaWxkcmVuIAorCSAqIG9mIHRoZSBmZWF0dXJlLgorCSAqIEFsc28gaW5jbHVkZSBub24tb3B0aW9uYWwgZmVhdHVyZXMKKwkgKiAKKwkgKiBAcGFyYW0gY2hpbGRyZW4gYWxsIHRoZSBuZXN0ZWQgZmVhdHVyZXMKKwkgKiBAcGFyYW0gb3B0aW9uYWxmZWF0dXJlcyBvcHRpb25hbCBmZWF0dXJlcyB0byBpbnN0YWxsCisJICogQHJldHVybiBJRmVhdHVyZVJlZmVyZW5jZVtdCisJICovCisJcHVibGljIHN0YXRpYyBJRmVhdHVyZVJlZmVyZW5jZVtdIG9wdGlvbmFsQ2hpbGRyZW5Ub0luc3RhbGwoSUZlYXR1cmVSZWZlcmVuY2VbXSBjaGlsZHJlbiwgSUZlYXR1cmVSZWZlcmVuY2VbXSBvcHRpb25hbGZlYXR1cmVzKSB7CisKKwkJTGlzdCBvcHRpb25hbENoaWxkcmVuVG9JbnN0YWxsID0gbmV3IEFycmF5TGlzdCgpOworCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CisJCQlJRmVhdHVyZVJlZmVyZW5jZSBvcHRpb25hbEZlYXR1cmUgPSBjaGlsZHJlbltpXTsKKwkJCWlmICghVXBkYXRlTWFuYWdlclV0aWxzLmlzT3B0aW9uYWwob3B0aW9uYWxGZWF0dXJlKSkgeworCQkJCW9wdGlvbmFsQ2hpbGRyZW5Ub0luc3RhbGwuYWRkKG9wdGlvbmFsRmVhdHVyZSk7CisJCQl9IGVsc2UgeworCQkJCWZvciAoaW50IGogPSAwOyBqIDwgb3B0aW9uYWxmZWF0dXJlcy5sZW5ndGg7IGorKykgeworCQkJCQlpZiAob3B0aW9uYWxGZWF0dXJlLmVxdWFscyhvcHRpb25hbGZlYXR1cmVzW2pdKSkgeworCQkJCQkJb3B0aW9uYWxDaGlsZHJlblRvSW5zdGFsbC5hZGQob3B0aW9uYWxGZWF0dXJlKTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisKKwkJSUZlYXR1cmVSZWZlcmVuY2VbXSByZXN1bHQgPSBuZXcgSUZlYXR1cmVSZWZlcmVuY2Vbb3B0aW9uYWxDaGlsZHJlblRvSW5zdGFsbC5zaXplKCldOworCQlpZiAob3B0aW9uYWxDaGlsZHJlblRvSW5zdGFsbC5zaXplKCkgPiAwKSB7CisJCQlvcHRpb25hbENoaWxkcmVuVG9JbnN0YWxsLnRvQXJyYXkocmVzdWx0KTsKKwkJfQorCisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoqCisJICogcmV0dXJucyB0aGUgbWFwcGluZyBvZiBtYXRjaGluZyBydWxlcworCSAqIHRoZSBkZWZhdWx0IHJldHVybnMgcGVyZmVjdAorCSAqIAorCSAqIEBzaW5jZSAyLjAuMgorCSAqLworCXB1YmxpYyBzdGF0aWMgaW50IGdldE1hdGNoaW5nUnVsZShTdHJpbmcgcnVsZSkgeworCQlpZiAocnVsZSA9PSBudWxsKQorCQkJcmV0dXJuIElVcGRhdGVDb25zdGFudHMuUlVMRV9DT01QQVRJQkxFOworCQlmaW5hbCBJbnRlZ2VyIGludGVnZXIgPSAoSW50ZWdlcikgdGFibGUuZ2V0KHJ1bGUpOworCQlpZiAoaW50ZWdlciA9PSBudWxsKQorCQkJcmV0dXJuIElVcGRhdGVDb25zdGFudHMuUlVMRV9QRVJGRUNUOworCQlpbnQgcnVsZUludCA9IGludGVnZXIuaW50VmFsdWUoKTsKKwkJaWYgKHJ1bGVJbnQgPT0gSVVwZGF0ZUNvbnN0YW50cy5SVUxFX05PTkUpCisJCQlyZXR1cm4gSVVwZGF0ZUNvbnN0YW50cy5SVUxFX1BFUkZFQ1Q7CisJCXJldHVybiBydWxlSW50OworCX0KKwkKKwkvKioKKwkgKiByZXR1cm5zIHRoZSBtYXBwaW5nIG9mIG1hdGNoaW5nIGlkIHJ1bGVzCisJICogdGhlIGRlZmF1bHQgcmV0dXJucyBwZXJmZWN0CisJICogCisJICogQHNpbmNlIDIuMC4yCisJICovCisJcHVibGljIHN0YXRpYyBpbnQgZ2V0TWF0Y2hpbmdJZFJ1bGUoU3RyaW5nIHJ1bGUpIHsKKwkJCisJCWlmIChydWxlID09IG51bGwpCisJCQlyZXR1cm4gSVVwZGF0ZUNvbnN0YW50cy5SVUxFX0NPTVBBVElCTEU7CisJCWlmIChydWxlIT1udWxsICYmIHJ1bGUuZXF1YWxzSWdub3JlQ2FzZSgicHJlZml4IikpIC8vJE5PTi1OTFMtMSQKKwkJCXJldHVybiBJVXBkYXRlQ29uc3RhbnRzLlJVTEVfUFJFRklYOworCQlyZXR1cm4gSVVwZGF0ZUNvbnN0YW50cy5SVUxFX1BFUkZFQ1Q7CisJfQorCQorCS8qKgorCSAqIE1ldGhvZCBpc09wdGlvbmFsLgorCSAqIEBwYXJhbSBmZWF0dXJlUmVmZXJlbmNlCisJICogQHJldHVybiBib29sZWFuCisJICovCisJcHVibGljIHN0YXRpYyBib29sZWFuIGlzT3B0aW9uYWwoSUZlYXR1cmVSZWZlcmVuY2UgZmVhdHVyZVJlZmVyZW5jZSkgeworCQlpZiAoZmVhdHVyZVJlZmVyZW5jZT09bnVsbCkgcmV0dXJuIGZhbHNlOworCQlpZiAoZmVhdHVyZVJlZmVyZW5jZSBpbnN0YW5jZW9mIElJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UpeworCQkJcmV0dXJuICgoSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZSlmZWF0dXJlUmVmZXJlbmNlKS5pc09wdGlvbmFsKCk7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qKgorCSAqIAorCSAqLworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkRW52aXJvbm1lbnQoSVBsYXRmb3JtRW52aXJvbm1lbnQgY2FuZGlkYXRlKSB7CisJCWlmIChjYW5kaWRhdGU9PW51bGwpIHJldHVybiBmYWxzZTsKKwkJU3RyaW5nIG9zID0gY2FuZGlkYXRlLmdldE9TKCk7CisJCVN0cmluZyB3cyA9IGNhbmRpZGF0ZS5nZXRXUygpOworCQlTdHJpbmcgYXJjaCA9IGNhbmRpZGF0ZS5nZXRPU0FyY2goKTsKKwkJU3RyaW5nIG5sID0gY2FuZGlkYXRlLmdldE5MKCk7CisJCWlmIChvcyE9bnVsbCAmJiAhaXNNYXRjaGluZyhvcywgU2l0ZU1hbmFnZXIuZ2V0T1MoKSkpIHJldHVybiBmYWxzZTsKKwkJaWYgKHdzIT1udWxsICYmICFpc01hdGNoaW5nKHdzLCBTaXRlTWFuYWdlci5nZXRXUygpKSkgcmV0dXJuIGZhbHNlOworCQlpZiAoYXJjaCE9bnVsbCAmJiAhaXNNYXRjaGluZyhhcmNoLCBTaXRlTWFuYWdlci5nZXRPU0FyY2goKSkpIHJldHVybiBmYWxzZTsKKwkJaWYgKG5sIT1udWxsICYmICFpc01hdGNoaW5nTG9jYWxlKG5sLCBTaXRlTWFuYWdlci5nZXROTCgpKSkgcmV0dXJuIGZhbHNlOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKiBPcmlnaW5hbCBjb2RlIC0gY29tbWVudGVkIG91dCB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgYXMgcGVyIGJ1ZyA5ODM4NworCQorCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNNYXRjaGluZyhTdHJpbmcgY2FuZGlkYXRlVmFsdWVzLCBTdHJpbmcgc2l0ZVZhbHVlcykgeworCQlpZiAoc2l0ZVZhbHVlcz09bnVsbCkgcmV0dXJuIGZhbHNlOworCQlpZiAoIioiLmVxdWFscyhjYW5kaWRhdGVWYWx1ZXMpKSByZXR1cm4gdHJ1ZTsgLy8kTk9OLU5MUy0xJAorCQlpZiAoIiIuZXF1YWxzKGNhbmRpZGF0ZVZhbHVlcykpIHJldHVybiB0cnVlOyAvLyROT04tTkxTLTEkCisJCXNpdGVWYWx1ZXMgPSBzaXRlVmFsdWVzLnRvVXBwZXJDYXNlKCk7CQkKKwkJU3RyaW5nVG9rZW5pemVyIHN0b2sgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGNhbmRpZGF0ZVZhbHVlcywgIiwiKTsgLy8kTk9OLU5MUy0xJAorCQl3aGlsZSAoc3Rvay5oYXNNb3JlVG9rZW5zKCkpIHsKKwkJCVN0cmluZyB0b2tlbiA9IHN0b2submV4dFRva2VuKCkudG9VcHBlckNhc2UoKTsKKwkJCWlmIChzaXRlVmFsdWVzLmluZGV4T2YodG9rZW4pIT0tMSkgcmV0dXJuIHRydWU7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKwkqLworCQorCS8qCisJICogRml4ZWQgYnVnIDk4Mzg3CisJICovCisJCisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc01hdGNoaW5nKFN0cmluZyBjYW5kaWRhdGVWYWx1ZXMsIFN0cmluZyBzaXRlVmFsdWVzKSB7CisJCWlmIChzaXRlVmFsdWVzPT1udWxsKSByZXR1cm4gZmFsc2U7CisJCWlmICgiKiIuZXF1YWxzKGNhbmRpZGF0ZVZhbHVlcykpIHJldHVybiB0cnVlOyAvLyROT04tTkxTLTEkCisJCWlmICgiIi5lcXVhbHMoY2FuZGlkYXRlVmFsdWVzKSkgcmV0dXJuIHRydWU7IC8vJE5PTi1OTFMtMSQKKwkJU3RyaW5nVG9rZW5pemVyIHNpdGVUb2tlbnMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHNpdGVWYWx1ZXMsICIsIik7ICAvLyROT04tTkxTLTEkCisJCS8vJE5PTi1OTFMtMSQJCisJCXdoaWxlKHNpdGVUb2tlbnMuaGFzTW9yZVRva2VucygpKSB7CisJCSAgICBTdHJpbmdUb2tlbml6ZXIgY2FuZGlkYXRlVG9rZW5zID0gbmV3IFN0cmluZ1Rva2VuaXplcgorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjYW5kaWRhdGVWYWx1ZXMsICIsIik7IC8vJE5PTi1OTFMtMSQKKwkJCVN0cmluZyBzaXRlVmFsdWUgPSBzaXRlVG9rZW5zLm5leHRUb2tlbigpOworCQkJd2hpbGUgKGNhbmRpZGF0ZVRva2Vucy5oYXNNb3JlVG9rZW5zKCkpIHsKKwkJCQlpZiAoc2l0ZVZhbHVlLmVxdWFsc0lnbm9yZUNhc2UKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjYW5kaWRhdGVUb2tlbnMubmV4dFRva2VuKCkpKSByZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJCisJLyoqCisJICogCisJICovCQorCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNNYXRjaGluZ0xvY2FsZShTdHJpbmcgY2FuZGlkYXRlVmFsdWVzLCBTdHJpbmcgbG9jYWxlKSB7CisJCWlmIChsb2NhbGU9PW51bGwpIHJldHVybiBmYWxzZTsKKwkJaWYgKCIqIi5lcXVhbHMoY2FuZGlkYXRlVmFsdWVzKSkgcmV0dXJuIHRydWU7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKCIiLmVxdWFscyhjYW5kaWRhdGVWYWx1ZXMpKSByZXR1cm4gdHJ1ZTsgLy8kTk9OLU5MUy0xJAorCQkKKwkJbG9jYWxlID0gbG9jYWxlLnRvVXBwZXJDYXNlKCk7CisJCWNhbmRpZGF0ZVZhbHVlcyA9IGNhbmRpZGF0ZVZhbHVlcy50b1VwcGVyQ2FzZSgpOwkKKwkJU3RyaW5nVG9rZW5pemVyIHN0b2sgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGNhbmRpZGF0ZVZhbHVlcywgIiwiKTsgLy8kTk9OLU5MUy0xJAorCQl3aGlsZSAoc3Rvay5oYXNNb3JlVG9rZW5zKCkpIHsKKwkJCVN0cmluZyBjYW5kaWRhdGUgPSBzdG9rLm5leHRUb2tlbigpOworCQkJaWYgKGxvY2FsZS5pbmRleE9mKGNhbmRpZGF0ZSkgPT0gMCkKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCWlmIChjYW5kaWRhdGUuaW5kZXhPZihsb2NhbGUpID09IDApCisJCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCQorCS8qCisJICogCisJICovCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBhcHBlbmRFc2NhcGVkQ2hhcihTdHJpbmdCdWZmZXIgYnVmZmVyLCBjaGFyIGMpIHsKKwkJU3RyaW5nIHJlcGxhY2VtZW50ID0gZ2V0UmVwbGFjZW1lbnQoYyk7CisJCWlmIChyZXBsYWNlbWVudCAhPSBudWxsKSB7CisJCQlidWZmZXIuYXBwZW5kKCcmJyk7CisJCQlidWZmZXIuYXBwZW5kKHJlcGxhY2VtZW50KTsKKwkJCWJ1ZmZlci5hcHBlbmQoJzsnKTsKKwkJfSBlbHNlIHsKKwkJCWlmICgoYyA+PSAnICcgJiYgYyA8PSAweDdFKSB8fCBjID09ICdcbicgfHwgYyA9PSAnXHInIHx8IGMgPT0gJ1x0JykgeworCQkJCWJ1ZmZlci5hcHBlbmQoYyk7CisJCQl9IGVsc2UgeworCQkJCWJ1ZmZlci5hcHBlbmQoIiYjIik7IC8vJE5PTi1OTFMtMSQKKwkJCQlidWZmZXIuYXBwZW5kKEludGVnZXIudG9TdHJpbmcoYykpOworCQkJCWJ1ZmZlci5hcHBlbmQoJzsnKTsKKwkJCX0KKwkJfQorCX0KKworCS8qCisJICogCisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgeG1sU2FmZShTdHJpbmcgcykgeworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzLmxlbmd0aCgpICsgMTApOworCQlmb3IgKGludCBpID0gMDsgaSA8IHMubGVuZ3RoKCk7ICsraSkKKwkJCWFwcGVuZEVzY2FwZWRDaGFyKHJlc3VsdCwgcy5jaGFyQXQoaSkpOworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCQorCS8qCisJICogCisJICovCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFJlcGxhY2VtZW50KGNoYXIgYykgeworCQkvLyBFbmNvZGUgc3BlY2lhbCBYTUwgY2hhcmFjdGVycyBpbnRvIHRoZSBlcXVpdmFsZW50IGNoYXJhY3RlciByZWZlcmVuY2VzLgorCQkvLyBUaGVzZSBmaXZlIGFyZSBkZWZpbmVkIGJ5IGRlZmF1bHQgZm9yIGFsbCBYTUwgZG9jdW1lbnRzLgorCQlzd2l0Y2ggKGMpIHsKKwkJCWNhc2UgJzwnIDoKKwkJCQlyZXR1cm4gImx0IjsgLy8kTk9OLU5MUy0xJAorCQkJY2FzZSAnPicgOgorCQkJCXJldHVybiAiZ3QiOyAvLyROT04tTkxTLTEkCisJCQljYXNlICciJyA6CisJCQkJcmV0dXJuICJxdW90IjsgLy8kTk9OLU5MUy0xJAorCQkJY2FzZSAnXCcnIDoKKwkJCQlyZXR1cm4gImFwb3MiOyAvLyROT04tTkxTLTEkCisJCQljYXNlICcmJyA6CisJCQkJcmV0dXJuICJhbXAiOyAvLyROT04tTkxTLTEkCisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1NhbWVUaW1lc3RhbXAoVVJMIHVybCwgbG9uZyB0aW1lc3RhbXApIHsJCisJCXRyeSB7CisJCQlpZiAoVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXRVcGRhdGVTZXNzaW9uKCkuaXNWaXNpdGVkKHVybCkpIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJCVVSTCByZXNvbHZlZFVSTCA9IFVSTEVuY29kZXIuZW5jb2RlKHVybCk7CisJCQlJUmVzcG9uc2UgcmVzcG9uc2UgPSBDb25uZWN0aW9uRmFjdG9yeS5nZXQocmVzb2x2ZWRVUkwpOworCQkJbG9uZyByZW1vdGVMYXN0TW9kaWZpZWQgPSByZXNwb25zZS5nZXRMYXN0TW9kaWZpZWQoKTsKKwkJCS8vIDIgc2Vjb25kcyB0b2xlcmFuY2UsIGFzIHNvbWUgT1MncyBtYXkgcm91bmQgdXAgdGhlIHRpbWUgc3RhbXAKKwkJCS8vIHRvIHRoZSBjbG9zZXN0IHNlY29uZC4gRm9yIHNhZmV0eSwgd2UgbWFrZSBpdCAyIHNlY29uZHMuCisJCQlyZXR1cm4gTWF0aC5hYnMocmVtb3RlTGFzdE1vZGlmaWVkIC0gdGltZXN0YW1wKS8xMDAwIDw9IDI7CisJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0KKwkvKioKKwkgKiBUaGUgZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGggYSBsb29rdXAga2V5LgorCSAqIEBwYXJhbSBrZXkgb3B0aW9uYWwgbG9va3VwIGtleSwgb3IgPGNvZGU+bnVsbDwvY29kZT4uCisJICogQHBhcmFtIHRlbXAgdGhlIGxvY2FsIHdvcmtpbmcgZmlsZQorCSAqLworCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIHZvaWQgbWFwTG9jYWxGaWxlRnJhZ21lbnQoU3RyaW5nIGtleSwgRmlsZUZyYWdtZW50IHRlbXApIHsKKwkJLy8gY3JlYXRlIGZpbGUgYXNzb2NpYXRpb24gCisJCWlmIChrZXkgIT0gbnVsbCkgeworCQkJaWYgKGxvY2FsRmlsZUZyYWdtZW50TWFwID09IG51bGwpCisJCQkJbG9jYWxGaWxlRnJhZ21lbnRNYXAgPSBuZXcgSGFzaE1hcCgpOworCQkJbG9jYWxGaWxlRnJhZ21lbnRNYXAucHV0KGtleSwgdGVtcCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGUgZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGggYSBsb29rdXAga2V5LgorCSAqIEBwYXJhbSBrZXkgb3B0aW9uYWwgbG9va3VwIGtleSwgb3IgPGNvZGU+bnVsbDwvY29kZT4uCisJICovCisJcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgdm9pZCB1bk1hcExvY2FsRmlsZUZyYWdtZW50KFN0cmluZyBrZXkpIHsKKwkJLy8gcmVtb3ZlIGZpbGUgYXNzb2NpYXRpb24gCisJCWlmIChrZXkgIT0gbnVsbCAmJiBsb2NhbEZpbGVGcmFnbWVudE1hcCAhPW51bGwpIHsKKwkJCWxvY2FsRmlsZUZyYWdtZW50TWFwLnJlbW92ZShrZXkpOworCQl9CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgYSBwcmV2aW91c2x5IGNhY2hlZCBsb2NhbCBmaWxlIChpbiB0ZW1wb3JhcnkgYXJlYSkgbWF0Y2hpbmcgdGhlCisJICogc3BlY2lmaWVkIGtleS4gCisJICogCisJICogQHBhcmFtIGtleSBsb29rdXAga2V5CisJICogQHJldHVybiBjYWNoZWQgZmlsZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4uCisJICovCisJcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgRmlsZUZyYWdtZW50IGxvb2t1cExvY2FsRmlsZUZyYWdtZW50KFN0cmluZyBrZXkpIHsKKwkJaWYgKGxvY2FsRmlsZUZyYWdtZW50TWFwID09IG51bGwpCisJCQlyZXR1cm4gbnVsbDsKKwkJcmV0dXJuIChGaWxlRnJhZ21lbnQpIGxvY2FsRmlsZUZyYWdtZW50TWFwLmdldChrZXkpOworCX0KKwkKKwkvKioKKwkgKiBDb3BpZXMgc3BlY2lmaWVkIGlucHV0IHN0cmVhbSB0byB0aGUgb3V0cHV0IHN0cmVhbS4gTmVpdGhlciBzdHJlYW0KKwkgKiBpcyBjbG9zZWQgYXMgcGFydCBvZiB0aGlzIG9wZXJhdGlvbi4KKwkgKiAKKwkgKiBAcGFyYW0gaXMgaW5wdXQgc3RyZWFtCisJICogQHBhcmFtIG9zIG91dHB1dCBzdHJlYW0KKwkgKiBAcGFyYW0gbW9uaXRvciBwcm9ncmVzcyBtb25pdG9yCisgICAgICogQHBhcmFtIGV4cGVjdGVkTGVuZ3RoIC0gaWYgPiAwLCB0aGUgbnVtYmVyIG9mIGJ5dGVzIGZyb20gSW5wdXRTdHJlYW0gd2lsbCBiZSB2ZXJpZmllZAorCSAqIEBAcmV0dXJuIHRoZSBvZmZzZXQgaW4gdGhlIGlucHV0IHN0cmVhbSB3aGVyZSBjb3B5aW5nIHN0b3BwZWQuIFJldHVybnMgLTEgaWYgZW5kIG9mIGlucHV0IHN0cmVhbSBpcyByZWFjaGVkLgorCSAqIEBzaW5jZSAyLjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGxvbmcgY29weShJbnB1dFN0cmVhbSBpcywgT3V0cHV0U3RyZWFtIG9zLCBJbnN0YWxsTW9uaXRvciBtb25pdG9yLCBsb25nIGV4cGVjdGVkTGVuZ3RoKSB7CisJCWJ5dGVbXSBidWYgPSBnZXRCdWZmZXIoKTsKKwkJbG9uZyBvZmZzZXQ9MDsKKwkJdHJ5IHsKKwkJCWludCBsZW4gPSBpcy5yZWFkKGJ1Zik7CisJCQlpbnQgbmV4dEluY3JlbWVudCA9IDA7CisJCQl3aGlsZSAobGVuICE9IC0xKSB7CisJCQkJb3Mud3JpdGUoYnVmLCAwLCBsZW4pOworCQkJCQlvZmZzZXQgKz0gbGVuOworCQkJCWlmIChtb25pdG9yICE9IG51bGwpIHsKKwkJCQkJbmV4dEluY3JlbWVudCArPSBsZW47CisJCQkJCS8vIHVwZGF0ZSBtb25pdG9yIHBlcmlvZGljYWxseQorCQkJCQlpZiAobmV4dEluY3JlbWVudCA+PSBJTkNSRU1FTlRfU0laRSl7IAkKKwkJCQkJCW1vbml0b3IuaW5jcmVtZW50Q291bnQobmV4dEluY3JlbWVudCk7CisJCQkJCQluZXh0SW5jcmVtZW50ID0gMDsKKwkJCQkJfQorCQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKKwkJCQkJCXJldHVybiBvZmZzZXQ7CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKGV4cGVjdGVkTGVuZ3RoID4gMCAmJiBvZmZzZXQgPT0gZXhwZWN0ZWRMZW5ndGgpIHsKKwkJCQkJLy8gZXZlcnl0aGluZyByZWFkIGRvIG5vdCByZXR1cm4gb2Zmc2V0LCBvdGhlcndpc2UgdHJ5aW5nCisJCQkJCS8vIHRvIHJlYWQgYWdhaW4gZnJvbSB0aGlzIG9mZnNldCB3aWxsIHJlc3VsdCBpbiBIVFRQIDQxNgorCQkJCQlicmVhazsKKwkJCQl9CisJCQkJCisJCQkJbGVuID0gaXMucmVhZChidWYpOworCQkJfQorCQkJaWYgKG5leHRJbmNyZW1lbnQgPiAwICYmIG1vbml0b3IgIT0gbnVsbCkKKwkJCQltb25pdG9yLmluY3JlbWVudENvdW50KG5leHRJbmNyZW1lbnQpOworCQkJaWYoZXhwZWN0ZWRMZW5ndGg+MCAmJiBvZmZzZXQhPWV4cGVjdGVkTGVuZ3RoKQorCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5VcGRhdGVNYW5hZ2VyVXRpbHNfaW5wdXRTdHJlYW1FbmRlZCwgKG5ldyBTdHJpbmdbXSB7IFN0cmluZy52YWx1ZU9mKG9mZnNldCksIFN0cmluZy52YWx1ZU9mKGV4cGVjdGVkTGVuZ3RoKSB9KSkpOworCQkJcmV0dXJuIC0xOworCQl9IGNhdGNoKElPRXhjZXB0aW9uIGUpeworCQkJLy8gTG9nIHRoZSBhY3R1YWwgZXJyb3IsIGFzIHRoaXMgaXMgbm8gbG9uZ2VyCisJCQkvLyBwYXNzZWQgdXAgdGhlIGNhbGxpbmcgc3RhY2sKKwkJCVVwZGF0ZUNvcmUubG9nKE1lc3NhZ2VzLlVwZGF0ZU1hbmFnZXJVdGlsc19jb3B5ICsgb2Zmc2V0LCBlKTsgCisJCQlyZXR1cm4gb2Zmc2V0OworCQl9IGZpbmFsbHkgeworCQkJZnJlZUJ1ZmZlcihidWYpOworCQl9CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIGJ5dGVbXSBnZXRCdWZmZXIoKSB7CisJCWlmIChidWZmZXJQb29sID09IG51bGwpIHsKKwkJCXJldHVybiBuZXcgYnl0ZVtCVUZGRVJfU0laRV07CisJCX0KKworCQl0cnkgeworCQkJcmV0dXJuIChieXRlW10pIGJ1ZmZlclBvb2wucG9wKCk7CisJCX0gY2F0Y2ggKEVtcHR5U3RhY2tFeGNlcHRpb24gZSkgeworCQkJcmV0dXJuIG5ldyBieXRlW0JVRkZFUl9TSVpFXTsKKwkJfQorCX0KKworCXByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIGZyZWVCdWZmZXIoYnl0ZVtdIGJ1ZikgeworCQlpZiAoYnVmZmVyUG9vbCA9PSBudWxsKQorCQkJYnVmZmVyUG9vbCA9IG5ldyBTdGFjaygpOworCQlidWZmZXJQb29sLnB1c2goYnVmKTsKKwl9CisJCisJCisJLyoqCisJICogUmV0dXJucyBhIGxpc3Qgb2YgZnJhZ21lbnRzLiBaZXJvIGxlbmd0aCBpZiBubyBmcmFnbWVudHMuCisJICogQHBhcmFtIGJ1bmRsZSB0aGUgYnVuZGxlIHRvIGdldCBmcmFnbWVudHMgZm9yCisJICovCisJcHVibGljIHN0YXRpYyBGcmFnbWVudEVudHJ5W10gZ2V0RnJhZ21lbnRzKEJ1bmRsZSBidW5kbGUpIHsKKwkJUGFja2FnZUFkbWluIHBrZ0FkbWluID0gVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXRQYWNrYWdlQWRtaW4oKTsKKwkJQnVuZGxlW10gZnJhZ21lbnRCdW5kbGVzID0gcGtnQWRtaW4uZ2V0RnJhZ21lbnRzKGJ1bmRsZSk7CisJCWlmIChmcmFnbWVudEJ1bmRsZXMgPT0gbnVsbCkgCisJCQlyZXR1cm4gbm9GcmFnbWVudHM7CisJCQorCQlGcmFnbWVudEVudHJ5W10gZnJhZ21lbnRzID0gbmV3IEZyYWdtZW50RW50cnlbZnJhZ21lbnRCdW5kbGVzLmxlbmd0aF07CisJCWZvciAoaW50IGkgPSAwOyBpIDwgZnJhZ21lbnRzLmxlbmd0aDsgaSsrKSB7CisJCQlmcmFnbWVudHNbaV0gPSBuZXcgRnJhZ21lbnRFbnRyeSgoU3RyaW5nKSBmcmFnbWVudEJ1bmRsZXNbaV0KKwkJCQkJLmdldEhlYWRlcnMoKS5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpLAorCQkJCQkoU3RyaW5nKSBmcmFnbWVudEJ1bmRsZXNbaV0uZ2V0SGVhZGVycygpLmdldCgKKwkJCQkJCQlDb25zdGFudHMuQlVORExFX1ZFUlNJT04pLCBQbGF0Zm9ybQorCQkJCQkJCS5nZXRSZXNvdXJjZVN0cmluZyhmcmFnbWVudEJ1bmRsZXNbaV0sCisJCQkJCQkJCQkoU3RyaW5nKSBmcmFnbWVudEJ1bmRsZXNbaV0uZ2V0SGVhZGVycygpCisJCQkJCQkJCQkJCS5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSksCisJCQkJCWZyYWdtZW50QnVuZGxlc1tpXS5nZXRMb2NhdGlvbigpKTsKKwkJfQorCQlyZXR1cm4gZnJhZ21lbnRzOwkKKwl9CisJCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0V3JpdGFibGVYTUxTdHJpbmcoU3RyaW5nIHZhbHVlKSB7CisJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJCWlmKHZhbHVlID09IG51bGwpCisJCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoKCk7IGkrKykgeworCQkJY2hhciBjID0gdmFsdWUuY2hhckF0KGkpOworCQkJc3dpdGNoIChjKSB7CisJCQkJY2FzZSAnJicgOgorCQkJCQlidWYuYXBwZW5kKCImYW1wOyIpOyAvLyROT04tTkxTLTEkCisJCQkJCWJyZWFrOworCQkJCWNhc2UgJzwnIDoKKwkJCQkJYnVmLmFwcGVuZCgiJmx0OyIpOyAvLyROT04tTkxTLTEkCisJCQkJCWJyZWFrOworCQkJCWNhc2UgJz4nIDoKKwkJCQkJYnVmLmFwcGVuZCgiJmd0OyIpOyAvLyROT04tTkxTLTEkCisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ1wnJyA6CisJCQkJCWJ1Zi5hcHBlbmQoIiZhcG9zOyIpOyAvLyROT04tTkxTLTEkCisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ1wiJyA6CisJCQkJCWJ1Zi5hcHBlbmQoIiZxdW90OyIpOyAvLyROT04tTkxTLTEkCisJCQkJCWJyZWFrOworCQkJCWNhc2UgMHgwMCA6CisJCQkJCWJ1Zi5hcHBlbmQoIiAiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlicmVhazsJCQkJCQkKKwkJCQlkZWZhdWx0IDoKKwkJCQkJYnVmLmFwcGVuZChjKTsKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOworCX0KKwkKKwlwdWJsaWMgc3RhdGljIExpdGVGZWF0dXJlW10gZ2V0TGlnaHRGZWF0dXJlcyhFeHRlbmRlZFNpdGUgc2l0ZSkgeworCQkKKwkJVVJMIGZ1bGxEaWdlc3RVUkw7CisJCXRyeSB7CisJCQlmdWxsRGlnZXN0VVJMID0gZ2V0RnVsbERpZ2VzdFVSTCggc2l0ZSwgTG9jYWxlLmdldERlZmF1bHQoKS5nZXRDb3VudHJ5KCksIExvY2FsZS5nZXREZWZhdWx0KCkuZ2V0TGFuZ3VhZ2UoKSk7CisJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisJCQlVcGRhdGVDb3JlLmxvZygiQ291bGQgbm90IGFjY2VzcyBkaWdlc3Qgb24gdGhlIHNpdGU6ICIgKyBlLmdldE1lc3NhZ2UoKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKKwkJCXJldHVybiBudWxsOworCQl9CisJCQorCQlEaWdlc3QgZGlnZXN0ID0gbmV3IERpZ2VzdCggZnVsbERpZ2VzdFVSTCk7CisJCXRyeSB7CisJCQlMaXRlRmVhdHVyZVtdIGZlYXR1cmVzID0gIChMaXRlRmVhdHVyZVtdKWRpZ2VzdC5wYXJzZURpZ2VzdCgpOworCQkJZm9yKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7CisJCQkJZmVhdHVyZXNbaV0uc2V0U2l0ZShzaXRlKTsKKwkJCX0KKwkJCXJldHVybiBmZWF0dXJlczsKKwkJfSBjYXRjaChFeGNlcHRpb24gZSl7IAorCQkJVXBkYXRlQ29yZS5sb2coIkRpZ2VzdCBjb3VsZCBub3QgYmUgcGFyc2VkOiIgKyBlLmdldE1lc3NhZ2UoKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKKwkJCXJldHVybiBudWxsOworCQl9CisJfQorCQorCXByaXZhdGUgc3RhdGljIFVSTCBnZXRGdWxsRGlnZXN0VVJMKEV4dGVuZGVkU2l0ZSBzaXRlLCBTdHJpbmcgY291bnRyeSwgU3RyaW5nIGxhbmd1YWdlKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKKwkJCisJCVN0cmluZyBkaWdlc3RVUkwgPSAoc2l0ZS5nZXREaWdlc3RVUkwoKS5lbmRzV2l0aCgiLyIpPyBzaXRlLmdldERpZ2VzdFVSTCgpOiBzaXRlLmdldERpZ2VzdFVSTCgpICsgIi8iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIAorCQkKKwkJaWYgKGRpZ2VzdFVSTC5pbmRleE9mKCI6Ly8iKSA9PSAtMSkgeyAvLyROT04tTkxTLTEkCisJCQlTdHJpbmcgc2l0ZVVSTCA9IHNpdGUuZ2V0TG9jYXRpb25VUkwoKS50b0V4dGVybmFsRm9ybSgpOworCQkJaWYgKHNpdGVVUkwuZW5kc1dpdGgoU2l0ZS5TSVRFX1hNTCkpIHsKKwkJCQlzaXRlVVJMID0gc2l0ZVVSTC5zdWJzdHJpbmcoMCwgc2l0ZVVSTC5sZW5ndGgoKSAtIFNpdGUuU0lURV9YTUwubGVuZ3RoKCkpOworCQkJfSAKKwkJCWlmIChkaWdlc3RVUkwuZXF1YWxzKCIvIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCWRpZ2VzdFVSTCA9IHNpdGVVUkw7CisJCQl9IGVsc2UgeworCQkJCWlmIChkaWdlc3RVUkwuc3RhcnRzV2l0aCgiLyIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQkJZGlnZXN0VVJMID0gZGlnZXN0VVJMLnN1YnN0cmluZygxLCBkaWdlc3RVUkwubGVuZ3RoKCkpOworCQkJCX0KKwkJCQlkaWdlc3RVUkwgPSBzaXRlVVJMICsgZGlnZXN0VVJMOworCQkJfQorCQl9CisJCQorCQlkaWdlc3RVUkwgKz0gImRpZ2VzdCI7ICAvLyROT04tTkxTLTEkCisJCQorCQlpZiAoIGlzTG9jYWxTdXBwb3J0ZWQoc2l0ZSwgY291bnRyeSwgbGFuZ3VhZ2UpKSB7CisJCQlyZXR1cm4gbmV3IFVSTChkaWdlc3RVUkwgKyAiXyIgKyBsYW5ndWFnZSArICJfIiArIGNvdW50cnkgKyAiLnppcCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQl9CisJCWlmICggaXNMYW5nYXVnZVN1cHBvcnRlZChzaXRlLCBsYW5ndWFnZSkpIHsKKwkJCXJldHVybiBuZXcgVVJMKGRpZ2VzdFVSTCArICJfIiArIGxhbmd1YWdlICsgIi56aXAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCX0KKwkJcmV0dXJuIG5ldyBVUkwoZGlnZXN0VVJMICsgIi56aXAiKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNMYW5nYXVnZVN1cHBvcnRlZChFeHRlbmRlZFNpdGUgc2l0ZSwgU3RyaW5nIGxhbmd1YWdlKSB7CisJCVN0cmluZ1tdIGF2YWlsYWJsZUxhbmd1YWdlcyA9ICBzaXRlLmdldEF2YWlsYWJsZUxvY2FscygpOworCQlpZiAoKGF2YWlsYWJsZUxhbmd1YWdlcyA9PSBudWxsKSB8fCAoYXZhaWxhYmxlTGFuZ3VhZ2VzLmxlbmd0aCA9PSAwKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWZvcihpbnQgaSA9IDA7IGkgPCBhdmFpbGFibGVMYW5ndWFnZXMubGVuZ3RoOyBpKyspIHsKKwkJCWlmIChhdmFpbGFibGVMYW5ndWFnZXNbaV0uZXF1YWxzKGxhbmd1YWdlKSkgeworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTG9jYWxTdXBwb3J0ZWQoRXh0ZW5kZWRTaXRlIHNpdGUsIFN0cmluZyBjb3VudHJ5LCBTdHJpbmcgbGFuZ3VhZ2UpIHsKKwkJU3RyaW5nIGxvY2FsZUNvZGUgPSBsYW5ndWFnZSArICJfIiArIGNvdW50cnk7IC8vJE5PTi1OTFMtMSQKKwkJU3RyaW5nW10gYXZhaWxhYmxlTG9jYWxzID0gIHNpdGUuZ2V0QXZhaWxhYmxlTG9jYWxzKCk7CisJCWlmICgoYXZhaWxhYmxlTG9jYWxzID09IG51bGwpIHx8IChhdmFpbGFibGVMb2NhbHMubGVuZ3RoID09IDApKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJZm9yKGludCBpID0gMDsgaSA8IGF2YWlsYWJsZUxvY2Fscy5sZW5ndGg7IGkrKykgeworCQkJaWYgKGF2YWlsYWJsZUxvY2Fsc1tpXS5lcXVhbHMobG9jYWxlQ29kZSkpIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9VcGRhdGVQcmVmZXJlbmNlc0luaXRpYWxpemVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1VwZGF0ZVByZWZlcmVuY2VzSW5pdGlhbGl6ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDVhNWRiCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9VcGRhdGVQcmVmZXJlbmNlc0luaXRpYWxpemVyLmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXI7CisKKy8qKgorICogQ2xhc3MgdG8gaW5pdGlhbGl6ZSB0aGUgcHJlZmVyZW5jZXMgZm9yIHRoZSBVcGRhdGUgY29yZSBwbHVnaW4uCisgKi8KK3B1YmxpYyBjbGFzcyBVcGRhdGVQcmVmZXJlbmNlc0luaXRpYWxpemVyIGV4dGVuZHMgQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgeworCisJLyoqCisJICogRGVmYXVsdCBjb25zdHJ1Y3RvcgorCSAqLworCXB1YmxpYyBVcGRhdGVQcmVmZXJlbmNlc0luaXRpYWxpemVyKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIEluaXRpYWxpemVzIHRoZSBkZWZhdWx0IHByZWZlcmVuY2VzIHNldHRpbmdzIGZvciB0aGlzIHBsdWctaW4uCisJICogPHA+CisJICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHNvbWV0aW1lIGFmdGVyIHRoZSBwcmVmZXJlbmNlIHN0b3JlIGZvciB0aGlzCisJICogcGx1Zy1pbiBpcyBjcmVhdGVkLiBEZWZhdWx0IHZhbHVlcyBhcmUgbmV2ZXIgc3RvcmVkIGluIHByZWZlcmVuY2UKKwkgKiBzdG9yZXM7IHRoZXkgbXVzdCBiZSBmaWxsZWQgaW4gZWFjaCB0aW1lLiBUaGlzIG1ldGhvZCBwcm92aWRlcyB0aGUKKwkgKiBvcHBvcnR1bml0eSB0byBpbml0aWFsaXplIHRoZSBkZWZhdWx0IHZhbHVlcy4KKwkgKiA8L3A+CisJICogPHA+CisJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgZG9lcyBub3RoaW5nLiBBIHN1YmNsYXNzIHRoYXQgbmVlZHMKKwkgKiB0byBzZXQgZGVmYXVsdCB2YWx1ZXMgZm9yIGl0cyBwcmVmZXJlbmNlcyBtdXN0IHJlaW1wbGVtZW50IHRoaXMgbWV0aG9kLgorCSAqIERlZmF1bHQgdmFsdWVzIHNldCBhdCBhIGxhdGVyIHBvaW50IHdpbGwgb3ZlcnJpZGUgYW55IGRlZmF1bHQgb3ZlcnJpZGUKKwkgKiBzZXR0aW5ncyBzdXBwbGllZCBmcm9tIG91dHNpZGUgdGhlIHBsdWctaW4gKHByb2R1Y3QgY29uZmlndXJhdGlvbiBvcgorCSAqIHBsYXRmb3JtIHN0YXJ0IHVwKS4KKwkgKiA8L3A+CisJICovCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpIHsKKwkJUGx1Z2luIHBsdWdpbiA9IFVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCk7CisJCXBsdWdpbi5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLnNldERlZmF1bHQoVXBkYXRlQ29yZS5QX0NIRUNLX1NJR05BVFVSRSwgdHJ1ZSk7CisJCXBsdWdpbi5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLnNldERlZmF1bHQoVXBkYXRlQ29yZS5QX0FVVE9NQVRJQ0FMTFlfQ0hPT1NFX01JUlJPUiwgZmFsc2UpOworCQlwbHVnaW4uZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5zZXREZWZhdWx0KFVwZGF0ZUNvcmUuUF9ISVNUT1JZX1NJWkUsIFVwZGF0ZUNvcmUuREVGQVVMVF9ISVNUT1JZKTsKKwkJcGx1Z2luLmdldFBsdWdpblByZWZlcmVuY2VzKCkuc2V0RGVmYXVsdChVcGRhdGVDb3JlLlBfVVBEQVRFX1ZFUlNJT05TLCBVcGRhdGVDb3JlLkVRVUlWQUxFTlRfVkFMVUUpOworCX0KK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvVXBkYXRlU2Vzc2lvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9VcGRhdGVTZXNzaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWIyY2I2NAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvVXBkYXRlU2Vzc2lvbi5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAgICAgSmFtZXMgRCBNaWxlcyAoSUJNIENvcnAuKSAtIGJ1ZyAxOTE3ODMsIE51bGxQb2ludGVyRXhjZXB0aW9uIGluIEZlYXR1cmVEb3dubG9hZGVyCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsKKworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworcHVibGljIGNsYXNzIFVwZGF0ZVNlc3Npb24geworCQorCXByaXZhdGUgYm9vbGVhbiBlbmFibGVkID0gZmFsc2U7CisJcHJpdmF0ZSBTZXQgdmlzaXRlZFVSTHMgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRTZXQobmV3IEhhc2hTZXQoKSk7CisJCisJVXBkYXRlU2Vzc2lvbigpIHsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gaXNWaXNpdGVkKFVSTCB1cmwpIHsKKwkJaWYgKCFlbmFibGVkKQorCQkJcmV0dXJuIGZhbHNlOworCQlyZXR1cm4gdmlzaXRlZFVSTHMuY29udGFpbnModXJsLnRvRXh0ZXJuYWxGb3JtKCkpOworCX0KKworCXB1YmxpYyB2b2lkIG1hcmtWaXNpdGVkKFVSTCB1cmwpIHsKKwkJaWYgKCFlbmFibGVkKQorCQkJcmV0dXJuIDsKKwkJdmlzaXRlZFVSTHMuYWRkKHVybC50b0V4dGVybmFsRm9ybSgpKTsKKwl9CisJCisJLyoKKwkgKiBTZXNzaW9uIHdpbGwgbm90IHN0YXJ0IGNhY2hpbmcgVVJMcyBwcmlvciB0byBjYWxsaW5nIHRoaXMKKwkgKiBtZXRob2QuIElmIHlvdSB3YW50IHRvIHVzZSB1cGRhdGUgc2Vzc2lvbiBmYWNpbGl0eSBtYWtlIHN1cmUKKwkgKiB5b3UgY2FsbCB0aGlzIG1ldGhvZCBmaXJzdAorCSAqLworCXB1YmxpYyB2b2lkIHJlc2V0KCkgeworCQl0aGlzLmVuYWJsZWQgPSB0cnVlOworCQl2aXNpdGVkVVJMcy5jbGVhcigpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9VcGRhdGVTaXRlRmVhdHVyZVJlZmVyZW5jZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9VcGRhdGVTaXRlRmVhdHVyZVJlZmVyZW5jZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhOTA2YTUKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1VwZGF0ZVNpdGVGZWF0dXJlUmVmZXJlbmNlLmphdmEKQEAgLTAsMCArMSwxMzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7CisKKy8qKgorICogRmVhdHVyZSByZWZlcmVuY2Ugb24gYW4gdXBkYXRlIHNpdGUuCisgKiBAc2luY2UgMy4xCisgKi8KK3B1YmxpYyBjbGFzcyBVcGRhdGVTaXRlRmVhdHVyZVJlZmVyZW5jZSBleHRlbmRzIFNpdGVGZWF0dXJlUmVmZXJlbmNlIHsKKyAgICBwcml2YXRlIFN0cmluZyBvczsKKyAgICBwcml2YXRlIFN0cmluZyB3czsKKyAgICBwcml2YXRlIFN0cmluZyBubDsKKyAgICBwcml2YXRlIFN0cmluZyBhcmNoOworICAgIHByaXZhdGUgU3RyaW5nIHBhdGNoOyAgCisKKyAgICAvKioKKyAgICAgKiBHZXQgb3B0aW9uYWwgb3BlcmF0aW5nIHN5c3RlbSBzcGVjaWZpY2F0aW9uIGFzIGEgY29tbWEtc2VwYXJhdGVkIHN0cmluZy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG9wZXJhdGluZyBzeXN0ZW0gc3BlY2lmaWNhdGlvbiBzdHJpbmcsIG9yIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBzaW5jZSAzLjEKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE9TKCkgeworICAgICAgICByZXR1cm4gb3M7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHZXQgb3B0aW9uYWwgd2luZG93aW5nIHN5c3RlbSBzcGVjaWZpY2F0aW9uIGFzIGEgY29tbWEtc2VwYXJhdGVkIHN0cmluZy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHdpbmRvd2luZyBzeXN0ZW0gc3BlY2lmaWNhdGlvbiBzdHJpbmcsIG9yIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBzaW5jZSAzLjEKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFdTKCkgeworICAgICAgICByZXR1cm4gd3M7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHZXQgb3B0aW9uYWwgc3lzdGVtIGFyY2hpdGVjdHVyZSBzcGVjaWZpY2F0aW9uIGFzIGEgY29tbWEtc2VwYXJhdGVkIHN0cmluZy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHN5c3RlbSBhcmNoaXRlY3R1cmUgc3BlY2lmaWNhdGlvbiBzdHJpbmcsIG9yIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBzaW5jZSAzLjEKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE9TQXJjaCgpIHsKKyAgICAgICAgcmV0dXJuIGFyY2g7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHZXQgb3B0aW9uYWwgbG9jYWxlIHNwZWNpZmljYXRpb24gYXMgYSBjb21tYS1zZXBhcmF0ZWQgc3RyaW5nLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbG9jYWxlIHNwZWNpZmljYXRpb24gc3RyaW5nLCBvciA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAc2luY2UgMy4xCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXROTCgpIHsKKyAgICAgICAgcmV0dXJuIG5sOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG9wZXJhdGluZyBzeXN0ZW0gc3BlY2lmaWNhdGlvbi4KKyAgICAgKiBUaHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCBpcyBtYXJrZWQgcmVhZC1vbmx5LgorICAgICAqCisgICAgICogQHBhcmFtIG9zIG9wZXJhdGluZyBzeXN0ZW0gc3BlY2lmaWNhdGlvbiBhcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0CisgICAgICogQHNpbmNlIDMuMQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE9TKFN0cmluZyBvcykgeworICAgICAgICBhc3NlcnRJc1dyaXRlYWJsZSgpOworICAgICAgICB0aGlzLm9zID0gb3M7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB3aW5kb3dpbmcgc3lzdGVtIHNwZWNpZmljYXRpb24uCisgICAgICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3cyB3aW5kb3dpbmcgc3lzdGVtIHNwZWNpZmljYXRpb24gYXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdAorICAgICAqIEBzaW5jZSAzLjEKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRXUyhTdHJpbmcgd3MpIHsKKyAgICAgICAgYXNzZXJ0SXNXcml0ZWFibGUoKTsKKyAgICAgICAgdGhpcy53cyA9IHdzOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbG9jYWxlIHNwZWNpZmljYXRpb24uCisgICAgICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBubCBsb2NhbGUgc3BlY2lmaWNhdGlvbiBhcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0CisgICAgICogQHNpbmNlIDMuMQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5MKFN0cmluZyBubCkgeworICAgICAgICBhc3NlcnRJc1dyaXRlYWJsZSgpOworICAgICAgICB0aGlzLm5sID0gbmw7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBzeXN0ZW0gYXJjaGl0ZWN0dXJlIHNwZWNpZmljYXRpb24uCisgICAgICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhcmNoIHN5c3RlbSBhcmNoaXRlY3R1cmUgc3BlY2lmaWNhdGlvbiBhcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0CisgICAgICogQHNpbmNlIDMuMQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFyY2goU3RyaW5nIGFyY2gpIHsKKyAgICAgICAgYXNzZXJ0SXNXcml0ZWFibGUoKTsKKyAgICAgICAgdGhpcy5hcmNoID0gYXJjaDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBwYXRjaCBtb2RlLgorICAgICAqIEBzaW5jZSAzLjEKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhdGNoKCkgeworICAgICAgICByZXR1cm4gcGF0Y2g7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBwYXRjaCBtb2RlLgorICAgICAqIEBzaW5jZSAzLjEKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXRjaChTdHJpbmcgcGF0Y2gpIHsKKyAgICAgICAgdGhpcy5wYXRjaCA9IHBhdGNoOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9VcGRhdGVTaXRlSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1VwZGF0ZVNpdGVJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzJkNzRmCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9VcGRhdGVTaXRlSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlLmphdmEKQEAgLTAsMCArMSwxNDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7CisKKy8qKgorICogRmVhdHVyZSByZWZlcmVuY2Ugb24gYW4gdXBkYXRlIHNpdGUuCisgKiBAc2luY2UgMy4xCisgKi8KK3B1YmxpYyBjbGFzcyBVcGRhdGVTaXRlSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlIGV4dGVuZHMgSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNleworICAgIHByaXZhdGUgU3RyaW5nIG9zOworICAgIHByaXZhdGUgU3RyaW5nIHdzOworICAgIHByaXZhdGUgU3RyaW5nIG5sOworICAgIHByaXZhdGUgU3RyaW5nIGFyY2g7CisgICAgcHJpdmF0ZSBTdHJpbmcgcGF0Y2g7CisgCisgcHVibGljIFVwZGF0ZVNpdGVJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UoKSB7CisgIHN1cGVyKCk7CisgfQorCisgICAgcHVibGljIFVwZGF0ZVNpdGVJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UoSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZSBpbmNsdWRlKSB7CisgIHN1cGVyKGluY2x1ZGUpOworIH0KKworCisgLyoqCisgICAgICogR2V0IG9wdGlvbmFsIG9wZXJhdGluZyBzeXN0ZW0gc3BlY2lmaWNhdGlvbiBhcyBhIGNvbW1hLXNlcGFyYXRlZCBzdHJpbmcuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBvcGVyYXRpbmcgc3lzdGVtIHNwZWNpZmljYXRpb24gc3RyaW5nLCBvciA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAc2luY2UgMy4xCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRPUygpIHsKKyAgICAgICAgcmV0dXJuIG9zOworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0IG9wdGlvbmFsIHdpbmRvd2luZyBzeXN0ZW0gc3BlY2lmaWNhdGlvbiBhcyBhIGNvbW1hLXNlcGFyYXRlZCBzdHJpbmcuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSB3aW5kb3dpbmcgc3lzdGVtIHNwZWNpZmljYXRpb24gc3RyaW5nLCBvciA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAc2luY2UgMy4xCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRXUygpIHsKKyAgICAgICAgcmV0dXJuIHdzOworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0IG9wdGlvbmFsIHN5c3RlbSBhcmNoaXRlY3R1cmUgc3BlY2lmaWNhdGlvbiBhcyBhIGNvbW1hLXNlcGFyYXRlZCBzdHJpbmcuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBzeXN0ZW0gYXJjaGl0ZWN0dXJlIHNwZWNpZmljYXRpb24gc3RyaW5nLCBvciA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAc2luY2UgMy4xCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRPU0FyY2goKSB7CisgICAgICAgIHJldHVybiBhcmNoOworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0IG9wdGlvbmFsIGxvY2FsZSBzcGVjaWZpY2F0aW9uIGFzIGEgY29tbWEtc2VwYXJhdGVkIHN0cmluZy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGxvY2FsZSBzcGVjaWZpY2F0aW9uIHN0cmluZywgb3IgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHNpbmNlIDMuMQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TkwoKSB7CisgICAgICAgIHJldHVybiBubDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBvcGVyYXRpbmcgc3lzdGVtIHNwZWNpZmljYXRpb24uCisgICAgICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvcyBvcGVyYXRpbmcgc3lzdGVtIHNwZWNpZmljYXRpb24gYXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdAorICAgICAqIEBzaW5jZSAzLjEKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPUyhTdHJpbmcgb3MpIHsKKyAgICAgICAgYXNzZXJ0SXNXcml0ZWFibGUoKTsKKyAgICAgICAgdGhpcy5vcyA9IG9zOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgd2luZG93aW5nIHN5c3RlbSBzcGVjaWZpY2F0aW9uLgorICAgICAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gd3Mgd2luZG93aW5nIHN5c3RlbSBzcGVjaWZpY2F0aW9uIGFzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3QKKyAgICAgKiBAc2luY2UgMy4xCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0V1MoU3RyaW5nIHdzKSB7CisgICAgICAgIGFzc2VydElzV3JpdGVhYmxlKCk7CisgICAgICAgIHRoaXMud3MgPSB3czsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGxvY2FsZSBzcGVjaWZpY2F0aW9uLgorICAgICAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmwgbG9jYWxlIHNwZWNpZmljYXRpb24gYXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdAorICAgICAqIEBzaW5jZSAzLjEKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXROTChTdHJpbmcgbmwpIHsKKyAgICAgICAgYXNzZXJ0SXNXcml0ZWFibGUoKTsKKyAgICAgICAgdGhpcy5ubCA9IG5sOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgc3lzdGVtIGFyY2hpdGVjdHVyZSBzcGVjaWZpY2F0aW9uLgorICAgICAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXJjaCBzeXN0ZW0gYXJjaGl0ZWN0dXJlIHNwZWNpZmljYXRpb24gYXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdAorICAgICAqIEBzaW5jZSAzLjEKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBcmNoKFN0cmluZyBhcmNoKSB7CisgICAgICAgIGFzc2VydElzV3JpdGVhYmxlKCk7CisgICAgICAgIHRoaXMuYXJjaCA9IGFyY2g7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgcGF0Y2ggbW9kZS4KKyAgICAgKiBAc2luY2UgMy4xCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRQYXRjaCgpIHsKKyAgICAgICAgcmV0dXJuIHBhdGNoOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgcGF0Y2ggbW9kZS4KKyAgICAgKiBAc2luY2UgMy4xCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGF0Y2goU3RyaW5nIHBhdGNoKSB7CisgICAgICAgIHRoaXMucGF0Y2ggPSBwYXRjaDsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvVm9sdW1lLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1ZvbHVtZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiZDY2ZGUKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1ZvbHVtZS5qYXZhCkBAIC0wLDAgKzEsNzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLklWb2x1bWU7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuTW9kZWxPYmplY3Q7CisKKy8qKgorICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBhIElWb2x1bWUKKyAqLworcHVibGljIGNsYXNzIFZvbHVtZSBleHRlbmRzIE1vZGVsT2JqZWN0IGltcGxlbWVudHMgSVZvbHVtZSB7CisKKwlwcml2YXRlIGxvbmcgc2l6ZTsKKwlwcml2YXRlIGludCB0eXBlOworCXByaXZhdGUgU3RyaW5nIGxhYmVsOworCXByaXZhdGUgRmlsZSByb290OworCisJLyoqCisJICogQ29uc3RydWN0b3IgZm9yIFZvbHVtZS4KKwkgKi8KKwlwdWJsaWMgVm9sdW1lKEZpbGUgcm9vdCxTdHJpbmcgbGFiZWwsaW50IHR5cGUsbG9uZyBzaXplKSB7CisJCXN1cGVyKCk7CisJCXRoaXMucm9vdCA9IHJvb3Q7CisJCXRoaXMubGFiZWwgPSBsYWJlbDsKKwkJdGhpcy50eXBlID0gdHlwZTsKKwkJdGhpcy5zaXplID0gc2l6ZTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElWb2x1bWUjZ2V0RnJlZVNwYWNlKCkKKwkgKi8KKwlwdWJsaWMgbG9uZyBnZXRGcmVlU3BhY2UoKSB7CisJCXJldHVybiBzaXplOworCX0KKworCS8qKgorCSAqIEBzZWUgSVZvbHVtZSNnZXRMYWJlbCgpCisJICovCisJcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKKwkJcmV0dXJuIGxhYmVsOworCX0KKworCS8qKgorCSAqIEBzZWUgSVZvbHVtZSNnZXRUeXBlKCkKKwkgKi8KKwlwdWJsaWMgaW50IGdldFR5cGUoKSB7CisJCXJldHVybiB0eXBlOworCX0KKworCS8qKgorCSAqIEBzZWUgSVZvbHVtZSNnZXRGaWxlKCkKKwkgKi8KKwlwdWJsaWMgRmlsZSBnZXRGaWxlKCkgeworCQlyZXR1cm4gcm9vdDsKKwl9CisKKwlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYXJnMCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvY29ubmVjdGlvbi9BYnN0cmFjdFJlc3BvbnNlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL2Nvbm5lY3Rpb24vQWJzdHJhY3RSZXNwb25zZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4MmJiMzIKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL2Nvbm5lY3Rpb24vQWJzdHJhY3RSZXNwb25zZS5qYXZhCkBAIC0wLDAgKzEsNjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLmNvbm5lY3Rpb247CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuVVJMQ29ubmVjdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuVXBkYXRlQ29yZTsKKworLyoqCisgKiBAYXV0aG9yIGJ0cmlwa292CisgKgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RSZXNwb25zZSBpbXBsZW1lbnRzIElSZXNwb25zZSB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFBPTExJTkdfSU5URVJWQUwgPSAyMDA7CisJcHJvdGVjdGVkIFVSTENvbm5lY3Rpb24gY29ubmVjdGlvbjsKKworCXByb3RlY3RlZCBJbnB1dFN0cmVhbSBvcGVuU3RyZWFtV2l0aENhbmNlbChVUkxDb25uZWN0aW9uIHVybENvbm5lY3Rpb24sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uLCBUb29NYW55T3BlbkNvbm5lY3Rpb25zRXhjZXB0aW9uIHsKKwkKKwkJQ29ubmVjdGlvblRocmVhZE1hbmFnZXIuU3RyZWFtUnVubmFibGUgcnVubmFibGUgPQorCQkJbmV3IENvbm5lY3Rpb25UaHJlYWRNYW5hZ2VyLlN0cmVhbVJ1bm5hYmxlKHVybENvbm5lY3Rpb24pOworCQlUaHJlYWQgdCA9IENvbm5lY3Rpb25UaHJlYWRNYW5hZ2VyRmFjdG9yeS5nZXRDb25uZWN0aW9uTWFuYWdlcigpLmdldENvbm5lY3Rpb25UaHJlYWQoCisJCQkJcnVubmFibGUpOworCQl0LnN0YXJ0KCk7CisJCUlucHV0U3RyZWFtIGlzID0gbnVsbDsKKwkJdHJ5IHsKKwkJCWZvciAoOzspIHsKKwkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKKwkJCQkJcnVubmFibGUuZGlzY29ubmVjdCgpOworCSAgICAgICAgICAgICAgICBjb25uZWN0aW9uID0gbnVsbDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWlmIChydW5uYWJsZS5nZXRJbnB1dFN0cmVhbSgpICE9IG51bGwgfHwgIXQuaXNBbGl2ZSgpKSB7CisJCQkJCWlzID0gcnVubmFibGUuZ2V0SW5wdXRTdHJlYW0oKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWlmIChydW5uYWJsZS5nZXRJT0V4Y2VwdGlvbigpICE9IG51bGwpIAorCQkJCQl0aHJvdyBydW5uYWJsZS5nZXRJT0V4Y2VwdGlvbigpOworCQkJCWlmIChydW5uYWJsZS5nZXRFeGNlcHRpb24oKSAhPSBudWxsKSAKKwkJCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwKKwkJCQkJCQkJCQkJCQkJCVVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIAorCQkJCQkJCQkJCQkJCQkJSVN0YXR1cy5PSywKKwkJCQkJCQkJCQkJCQkJCXJ1bm5hYmxlLmdldEV4Y2VwdGlvbigpLmdldE1lc3NhZ2UoKSwgCisJCQkJCQkJCQkJCQkJCQlydW5uYWJsZS5nZXRFeGNlcHRpb24oKSkpOworCQkJCXQuam9pbihQT0xMSU5HX0lOVEVSVkFMKTsKKwkJCQl9CisJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKwkJfQorCQlyZXR1cm4gaXM7CisJfQorCisJCisJCit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL2Nvbm5lY3Rpb24vQ29ubmVjdGlvbkZhY3RvcnkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvY29ubmVjdGlvbi9Db25uZWN0aW9uRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjMmUzZTAKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL2Nvbm5lY3Rpb24vQ29ubmVjdGlvbkZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDM0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5jb25uZWN0aW9uOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CisKK3B1YmxpYyBjbGFzcyBDb25uZWN0aW9uRmFjdG9yeSB7CisKKwkKKwlwdWJsaWMgc3RhdGljIElSZXNwb25zZSBnZXQoVVJMIHVybCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJLy9SZXF1ZXN0IHJlcXVlc3QgPSBudWxsOworCQlJUmVzcG9uc2UgcmVzcG9uc2UgPSBudWxsOworCQkKKwkJaWYgKCJmaWxlIi5lcXVhbHModXJsLmdldFByb3RvY29sKCkpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCXJlc3BvbnNlID0gbmV3IEZpbGVSZXNwb25zZSh1cmwpOworCQl9IGVsc2UgaWYgKHVybCAhPSBudWxsICYmIHVybC5nZXRQcm90b2NvbCgpLnN0YXJ0c1dpdGgoImh0dHAiKSkgeyAvLyROT04tTkxTLTEkCisJCQlyZXNwb25zZSA9IG5ldyBIdHRwUmVzcG9uc2UodXJsKTsKKwkJfSBlbHNlIHsKKwkJCXJlc3BvbnNlID0gbmV3IE90aGVyUmVzcG9uc2UodXJsKTsKKwkJfQorCisJCXJldHVybiByZXNwb25zZTsKKwl9Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL2Nvbm5lY3Rpb24vQ29ubmVjdGlvblRocmVhZE1hbmFnZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvY29ubmVjdGlvbi9Db25uZWN0aW9uVGhyZWFkTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3NDdjYWMKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL2Nvbm5lY3Rpb24vQ29ubmVjdGlvblRocmVhZE1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDIzMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLmNvbm5lY3Rpb247CisKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5ldC5IdHRwVVJMQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS5uZXQuVVJMQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk11bHRpU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5NZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5VcGRhdGVDb3JlOworCisvKioKKyAqIFRoaXMgY2xhc3MgbWFuYWdlcyB0aHJlYWRzIHRoYXQgYXJlIGRpc3BhdGNoZWQgdG8gCisgKiBvYnRhaW5lZCBhIHZhbGlkIGlucHV0IHN0cmVhbSBmcm9tIGFuIEhUVFAgY29ubmVjdGlvbi4KKyAqIFNpbmNlIG9idGFpbmluZyBhbiBpbnB1dCBzdHJlYW0gaXMgYW4gSS9PIG9wZXJhdGlvbgorICogdGhhdCBtYXkgYmxvY2sgZm9yIGEgbG9uZyB0aW1lLCBpdCBpcyBwZXJmb3JtZWQKKyAqIG9uIGEgc2VwYXJhdGUgdGhyZWFkIHRvIGtlZXAgdGhlIFVJIHJlc3BvbnNpdmUuCisgKiA8cD4KKyAqIEluIGNhc2UgdGhhdCBhIGNvbm5lY3Rpb24gYmxvY2tzIGFuZCBkb2VzIG5vdAorICogdGVybWluYXRlIHdpdGggYW4gSU9FeGNlcHRpb24gYWZ0ZXIgYSB0aW1lb3V0LCAKKyAqIGFjdGl2ZSB0aHJlYWRzIG1heSBhY2N1bXVsYXRlLiBUaGUgbWFuYWdlciB3aWxsCisgKiByZWZ1c2UgdG8gY3JlYXRlIG1vcmUgdGhhbiBNQVhfQ09VTlQgdGhyZWFkcyBhbmQKKyAqIGluc3RlYWQgd2lsbCB0aHJvdyBhIENvcmVFeGNlcHRpb24gd2l0aCBhIGNoaWxkCisgKiBzdGF0dXMgb2JqZWN0IGZvciBlYWNoIGNvbm5lY3Rpb24gdGhhdCBpcyBzdGlsbCBwZW5kaW5nLgorICogPHA+CisgKiBJZiB0aGUgY29ubmVjdGlvbiBpcyByZXNwb25zaXZlIGJ1dCBzbG93LCB0aGUgdXNlcgorICogbWF5IGNhbmNlbCBpdC4gSW4gdGhhdCBjYXNlLCB0aGUgbWFuYWdlciB3aWxsCisgKiBjbG9zZSB0aGUgc3RyZWFtIHRvIGF2b2lkIHJlc291cmNlIGxlYWsuCisgKi8KK3B1YmxpYyBjbGFzcyBDb25uZWN0aW9uVGhyZWFkTWFuYWdlciB7CisJCisJLy8gc2V0IGNvbm5lY3Rpb24gdGltZW91dCB0byAxIG1pbnV0ZQorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05ORUNUX1RJTUVPVVQgPSAiNjAwMDAiOyAvLyROT04tTkxTLTEkCisJLy8gc2V0IHJlYWQgdGltZW91dCB0byAxIG1pbnV0ZQorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRUFEX1RJTUVPVVQgPSAiNjAwMDAiOyAvLyROT04tTkxTLTEkCisJLy8gbWF4IG51bWJlciBvZiBhY3RpdmUgdGhyZWFkcworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfQ09VTlQgPSA5OworCXByaXZhdGUgTGlzdCB0aHJlYWRzID0gbmV3IEFycmF5TGlzdChNQVhfQ09VTlQpOworCQorCQorCisJcHVibGljIHN0YXRpYyBjbGFzcyBTdHJlYW1SdW5uYWJsZSBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKKwkJCisJCXByaXZhdGUgVVJMQ29ubmVjdGlvbiB1cmxDb25uZWN0aW9uOworCQlwcml2YXRlIElPRXhjZXB0aW9uIGlvRXhjZXB0aW9uOworCQlwcml2YXRlIEV4Y2VwdGlvbiBleGNlcHRpb247CisJCXByaXZhdGUgSW5wdXRTdHJlYW0gaXM7CisJCXByaXZhdGUgYm9vbGVhbiBkaXNjb25uZWN0ZWQ7CisKKwkJcHVibGljIFN0cmVhbVJ1bm5hYmxlKFVSTENvbm5lY3Rpb24gdXJsQ29ubmVjdGlvbikgeworCQkJdGhpcy51cmxDb25uZWN0aW9uID0gdXJsQ29ubmVjdGlvbjsKKwkJfQorCisJCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHsKKwkJCXJldHVybiBpczsKKwkJfQorCisJCXB1YmxpYyBVUkwgZ2V0VVJMKCkgeworCQkJcmV0dXJuIHVybENvbm5lY3Rpb24uZ2V0VVJMKCk7CisJCX0KKworCQlwdWJsaWMgSU9FeGNlcHRpb24gZ2V0SU9FeGNlcHRpb24oKSB7CisJCQlyZXR1cm4gaW9FeGNlcHRpb247CisJCX0KKwkJCisJCXB1YmxpYyBFeGNlcHRpb24gZ2V0RXhjZXB0aW9uKCkgeworCQkJcmV0dXJuIGV4Y2VwdGlvbjsKKwkJfQorCisJCXB1YmxpYyB2b2lkIGRpc2Nvbm5lY3QoKSB7CisJCQlpZiAodXJsQ29ubmVjdGlvbiBpbnN0YW5jZW9mIEh0dHBVUkxDb25uZWN0aW9uKQorCQkJCSgoSHR0cFVSTENvbm5lY3Rpb24pdXJsQ29ubmVjdGlvbikuZGlzY29ubmVjdCgpOworCQkJZGlzY29ubmVjdGVkID0gdHJ1ZTsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCXRyeSB7CisJCQkJaXMgPSB1cmxDb25uZWN0aW9uLmdldElucHV0U3RyZWFtKCk7CisJCQkJaWYgKGRpc2Nvbm5lY3RlZCkgeworCQkJCQkvLyBUaGUgY29ubmVjdGlvbiB3YXMgc2xvdywgYnV0IHJldHVybmVkCisJCQkJCS8vIGEgdmFsaWQgaW5wdXQgc3RyZWFtLiBIb3dldmVyLAorCQkJCQkvLyB0aGUgdXNlciBjYW5jZWxlZCB0aGUgY29ubmVjdGlvbgorCQkJCQkvLyBzbyB3ZSBtdXN0IGNsb3NlIHRvIGF2b2lkIAorCQkJCQkvLyByZXNvdXJjZSBsZWFrLgorCQkJCQlpZiAoaXMgIT0gbnVsbCkgeworCQkJCQkJdHJ5IHsKKwkJCQkJCQlpcy5jbG9zZSgpOworCQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKwkJCQkJCQkvLyBhdCB0aGlzIHBvaW50LCB3ZSBkb24ndCBjYXJlCisJCQkJCQl9IGZpbmFsbHkgeworCQkJCQkJCWlzID0gbnVsbDsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQlpb0V4Y2VwdGlvbiA9IGU7CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCWV4Y2VwdGlvbiA9IGU7CisJCQl9IGZpbmFsbHkgeworCQkJCS8vdGhyZWFkcy4KKwkJCX0KKwkJfQorCX0KKworCQorCWNsYXNzIENvbm5lY3Rpb25UaHJlYWQgZXh0ZW5kcyBUaHJlYWQgeworCQkKKwkJcHJpdmF0ZSBTdHJlYW1SdW5uYWJsZSBydW5uYWJsZTsKKwkJCisJCXB1YmxpYyBDb25uZWN0aW9uVGhyZWFkKFN0cmVhbVJ1bm5hYmxlIHJ1bm5hYmxlKSB7CisJCQlzdXBlcihydW5uYWJsZSwgInVwZGF0ZS1jb25uZWN0aW9uIik7IC8vJE5PTi1OTFMtMSQKKwkJCXRoaXMucnVubmFibGUgPSBydW5uYWJsZTsKKwkJfQorCisJCXB1YmxpYyBTdHJlYW1SdW5uYWJsZSBnZXRSdW5uYWJsZSgpIHsKKwkJCXJldHVybiBydW5uYWJsZTsKKwkJfQorCX0KKworCXB1YmxpYyBDb25uZWN0aW9uVGhyZWFkTWFuYWdlcigpIHsKKwkJLy8gSW4gY2FzZSB3ZSBhcmUgcnVubmluZyBTdW4ncyBjb2RlLgorCQlzZXRJZk5vdERlZmF1bHRQcm9wZXJ0eSgic3VuLm5ldC5jbGllbnQuZGVmYXVsdENvbm5lY3RUaW1lb3V0IiwgQ09OTkVDVF9USU1FT1VUKTsgLy8kTk9OLU5MUy0xJAorCQlzZXRJZk5vdERlZmF1bHRQcm9wZXJ0eSgic3VuLm5ldC5jbGllbnQuZGVmYXVsdFJlYWRUaW1lb3V0IiwgUkVBRF9USU1FT1VUKTsgIC8vJE5PTi1OTFMtMSQKKwl9CisJCisJcHJpdmF0ZSB2b2lkIHNldElmTm90RGVmYXVsdFByb3BlcnR5KFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgeworCQlTdHJpbmcgb2xkVmFsdWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoa2V5KTsKKwkJaWYgKG9sZFZhbHVlPT1udWxsIHx8IG9sZFZhbHVlLmVxdWFscygiLTEiKSkgLy8kTk9OLU5MUy0xJAorCQkJU3lzdGVtLnNldFByb3BlcnR5KGtleSwgdmFsdWUpOworCX0KKworCXB1YmxpYyBUaHJlYWQgZ2V0Q29ubmVjdGlvblRocmVhZChTdHJlYW1SdW5uYWJsZSBydW5uYWJsZSkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQkKKwkJdmFsaWRhdGVFeGlzdGluZ1RocmVhZHMoKTsKKwkKKwkJLy9pZiAodGhyZWFkcyA9PSBudWxsKQorCQkvLwl0aHJlYWRzID0gbmV3IFZlY3RvcigpOworCQlUaHJlYWQgdCA9IG5ldyBUaHJlYWQocnVubmFibGUpOworCQl0LnNldERhZW1vbih0cnVlKTsKKwkJdGhyZWFkcy5hZGQodCk7CisJCXJldHVybiB0OworCX0KKworCS8qCisJICogUmVtb3ZlcyB0aHJlYWRzIHRoYXQgYXJlIG5vdCBhbGl2ZSBhbnkgbW9yZSBmcm9tIHRoZSAKKwkgKiBsaXN0IGFuZCBlbnN1cmVzIHRoYXQgdGhlcmUgYXJlIGF0IG1vc3QgTUFYX0NPVU5UIHRocmVhZHMKKwkgKiBzdGlsbCB3b3JraW5nLgorCSAqLworCXByaXZhdGUgdm9pZCB2YWxpZGF0ZUV4aXN0aW5nVGhyZWFkcygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJCisJCWlmICgodGhyZWFkcyA9PSBudWxsKSB8fCAodGhyZWFkcy5zaXplKCkgPT0gMCkpCisJCQlyZXR1cm47CisJCQorCQlpbnQgYWxpdmVDb3VudCA9IHB1cmdlVGVybWluYXRlZFRocmVhZHMoKTsKKworCQlpZiAoYWxpdmVDb3VudCA+IE1BWF9DT1VOVCkgeworCQkJQXJyYXlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOworCQkJU3RyaW5nIHBsdWdpbklkID0KKwkJCQlVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aHJlYWRzLnNpemUoKTsgaSsrKSB7CisJCQkJQ29ubmVjdGlvblRocmVhZCB0ID0gKENvbm5lY3Rpb25UaHJlYWQpIHRocmVhZHMuZ2V0KGkpOworCQkJCVN0cmluZyB1cmwgPSB0LmdldFJ1bm5hYmxlKCkuZ2V0VVJMKCkudG9TdHJpbmcoKTsKKwkJCQlJU3RhdHVzIHN0YXR1cyA9CisJCQkJCW5ldyBTdGF0dXMoCisJCQkJCQlJU3RhdHVzLkVSUk9SLAorCQkJCQkJcGx1Z2luSWQsCisJCQkJCQlJU3RhdHVzLk9LLAorCQkJCQkJTkxTLmJpbmQoTWVzc2FnZXMuQ29ubmVjdGlvblRocmVhZE1hbmFnZXJfdW5yZXNwb25zaXZlVVJMLCAobmV3IFN0cmluZ1tdIHsgdXJsIH0pKSwKKwkJCQkJCW51bGwpOworCQkJCWNoaWxkcmVuLmFkZChzdGF0dXMpOworCQkJfQorCQkJTXVsdGlTdGF0dXMgcGFyZW50U3RhdHVzID0KKwkJCQluZXcgTXVsdGlTdGF0dXMoCisJCQkJCXBsdWdpbklkLAorCQkJCQlJU3RhdHVzLk9LLAorCQkJCQkoSVN0YXR1c1tdKSBjaGlsZHJlbi50b0FycmF5KG5ldyBJU3RhdHVzW2NoaWxkcmVuLnNpemUoKV0pLAorCQkJCQlNZXNzYWdlcy5Db25uZWN0aW9uVGhyZWFkTWFuYWdlcl90b29NYW55Q29ubmVjdGlvbnMsIAorCQkJCQludWxsKTsKKwkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHBhcmVudFN0YXR1cyk7CisJCX0KKwl9CisJCisJLyoKKwkgKiBSZW1vdmVzIHRlcm1pbmF0ZWQgdGhyZWFkcyBmcm9tIHRoZSBsaXN0IGFuZCByZXR1cm5zCisJICogdGhlIG51bWJlciBvZiB0aG9zZSBzdGlsbCBhY3RpdmUuCisJICovCisJCisJcHJpdmF0ZSBpbnQgcHVyZ2VUZXJtaW5hdGVkVGhyZWFkcygpIHsKKwkJCisJCWlmICh0aHJlYWRzLnNpemUoKSA9PSAwKSB7CisJCQlyZXR1cm4gMDsKKwkJfQorCQkKKwkJaW50IGFsaXZlQ291bnQgPSAwOworCisJCU9iamVjdFtdIGFycmF5ID0gdGhyZWFkcy50b0FycmF5KCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHsKKwkJCVRocmVhZCB0ID0gKFRocmVhZCkgYXJyYXlbaV07CisJCQlpZiAoIXQuaXNBbGl2ZSgpKQorCQkJCXRocmVhZHMucmVtb3ZlKHQpOworCQkJZWxzZQorCQkJCWFsaXZlQ291bnQrKzsKKwkJfQorCQlyZXR1cm4gYWxpdmVDb3VudDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzaHV0ZG93bigpIHsKKwkJLy8gV2UgbWlnaHQgd2FudCB0byBraWxsIHRoZSBhY3RpdmUgdGhyZWFkcyBidXQKKwkJLy8gdGhpcyBpcyBub3QgcmVhbGx5IG5lY2Vzc2FyeSBzaW5jZSB0aGV5IGFyZSBhbGwKKwkJLy8gZGFlbW9ucyBhbmQgd2lsbCBub3QgcHJldmVudCBKVk0gdG8gdGVybWluYXRlLgorCQl0aHJlYWRzLmNsZWFyKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9jb25uZWN0aW9uL0Nvbm5lY3Rpb25UaHJlYWRNYW5hZ2VyRmFjdG9yeS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9jb25uZWN0aW9uL0Nvbm5lY3Rpb25UaHJlYWRNYW5hZ2VyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyNTdlYWQKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL2Nvbm5lY3Rpb24vQ29ubmVjdGlvblRocmVhZE1hbmFnZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwyOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuY29ubmVjdGlvbjsKKworcHVibGljIGNsYXNzIENvbm5lY3Rpb25UaHJlYWRNYW5hZ2VyRmFjdG9yeSB7CisKKwkKKwkvL0Nvbm5lY3Rpb24gbWFuYWdlcgorCXByaXZhdGUgc3RhdGljIENvbm5lY3Rpb25UaHJlYWRNYW5hZ2VyIGNvbm5lY3Rpb25NYW5hZ2VyOworCQorCS8qKgorCSAqIFJldHVybnMgdGhlIG1hbmFnZXIgdGhhdCBtYW5hZ2VzIFVSTCBjb25uZWN0aW9uIHRocmVhZHMuCisJICovCisJcHVibGljIHN0YXRpYyBDb25uZWN0aW9uVGhyZWFkTWFuYWdlciBnZXRDb25uZWN0aW9uTWFuYWdlcigpIHsKKwkJCisJCWlmIChjb25uZWN0aW9uTWFuYWdlciA9PSBudWxsKQorCQkJY29ubmVjdGlvbk1hbmFnZXIgPSBuZXcgQ29ubmVjdGlvblRocmVhZE1hbmFnZXIoKTsKKwkJcmV0dXJuIGNvbm5lY3Rpb25NYW5hZ2VyOworCX0KK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvY29ubmVjdGlvbi9GaWxlUmVzcG9uc2UuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvY29ubmVjdGlvbi9GaWxlUmVzcG9uc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmFjZDg2Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9jb25uZWN0aW9uL0ZpbGVSZXNwb25zZS5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5jb25uZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLlVwZGF0ZUNvcmU7CisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS5uZXQuKjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOworCitwdWJsaWMgY2xhc3MgRmlsZVJlc3BvbnNlIGltcGxlbWVudHMgSVJlc3BvbnNlIHsKKworCXByb3RlY3RlZCBVUkwgdXJsOworCXByb3RlY3RlZCBsb25nIGxhc3RNb2RpZmllZDsKKworCXByb3RlY3RlZCBGaWxlUmVzcG9uc2UoVVJMIHVybCkgeworCQl0aGlzLnVybCA9IHVybDsKKwl9CisKKwlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlyZXR1cm4gdXJsLm9wZW5TdHJlYW0oKTsKKwl9CisKKwlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQorCQl0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24geworCQlyZXR1cm4gZ2V0SW5wdXRTdHJlYW0oKTsKKwl9CisKKwlwdWJsaWMgbG9uZyBnZXRDb250ZW50TGVuZ3RoKCkgeworCQlyZXR1cm4gMDsKKwl9CisKKwlwdWJsaWMgaW50IGdldFN0YXR1c0NvZGUoKSB7CisJCXJldHVybiBVcGRhdGVDb3JlLkhUVFBfT0s7CisJfQorCQorCXB1YmxpYyB2b2lkIGNsb3NlKCkgeworCQkvLyBub3RoaW5nIHRvIGNsb3NlCisJfQorCisJcHVibGljIFN0cmluZyBnZXRTdGF0dXNNZXNzYWdlKCkgeworCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwlwdWJsaWMgbG9uZyBnZXRMYXN0TW9kaWZpZWQoKSB7CisJCWlmIChsYXN0TW9kaWZpZWQgPT0gMCkgeworCQkJRmlsZSBmID0gbmV3IEZpbGUodXJsLmdldEZpbGUoKSk7CisJCQlpZiAoZi5pc0RpcmVjdG9yeSgpKQorCQkJCWYgPSBuZXcgRmlsZShmLCAic2l0ZS54bWwiKTsgLy8kTk9OLU5MUy0xJAorCQkJbGFzdE1vZGlmaWVkID0gZi5sYXN0TW9kaWZpZWQoKTsKKwkJfQorCQlyZXR1cm4gbGFzdE1vZGlmaWVkOworCX0KK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvY29ubmVjdGlvbi9IdHRwUmVzcG9uc2UuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvY29ubmVjdGlvbi9IdHRwUmVzcG9uc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2NmYTNhCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9jb25uZWN0aW9uL0h0dHBSZXNwb25zZS5qYXZhCkBAIC0wLDAgKzEsMjUxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuY29ubmVjdGlvbjsKKworaW1wb3J0IGphdmEuaW8uRmlsdGVySW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEubmV0Lkh0dHBVUkxDb25uZWN0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLm5ldC5VUkxDb25uZWN0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuVXBkYXRlQ29yZTsKKworcHVibGljIGNsYXNzIEh0dHBSZXNwb25zZSBleHRlbmRzIEFic3RyYWN0UmVzcG9uc2UgeworCS8qKgorCSAqIE1vbml0b3JlZCBJbnB1dFN0cmVhbS4gIFVwb24gSU9FeGNlcHRpb24sIGRpc2NhcmRzCisJICogY29ubmVjdGlvbiBzbyBpdCBpcyBub3QgcmV1c2VkLgorCSAqCisJICovCisJcHJpdmF0ZSBjbGFzcyBNb25pdG9yaW5nSW5wdXRTdHJlYW0gZXh0ZW5kcyBGaWx0ZXJJbnB1dFN0cmVhbSB7CisJCXByaXZhdGUgVVJMQ29ubmVjdGlvbiBjb25uZWN0aW9uOworCisJCXB1YmxpYyBNb25pdG9yaW5nSW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW4sIFVSTENvbm5lY3Rpb24gY29ubmVjdGlvbikgeworCQkJc3VwZXIoaW4pOworCQkJdGhpcy5jb25uZWN0aW9uID0gY29ubmVjdGlvbjsKKwkJfQorCisJCXB1YmxpYyBpbnQgYXZhaWxhYmxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJCXRyeSB7CisJCQkJcmV0dXJuIGluIT1udWxsP3N1cGVyLmF2YWlsYWJsZSgpOjA7CisJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKwkJCQljb25uZWN0aW9uID0gbnVsbDsKKwkJCQl0aHJvdyBpb2U7CisJCQl9CisJCX0KKworCQlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCQl0cnkgeworCQkJCWlmIChpbiE9bnVsbCkKKwkJCQkJc3VwZXIuY2xvc2UoKTsKKwkJCQlpZiAoY29ubmVjdGlvbiBpbnN0YW5jZW9mIEh0dHBVUkxDb25uZWN0aW9uKSB7CisJCQkJCSgoSHR0cFVSTENvbm5lY3Rpb24pY29ubmVjdGlvbikuZGlzY29ubmVjdCgpOworCQkJCX0KKwkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworCQkJCWNvbm5lY3Rpb24gPSBudWxsOworCQkJCXRocm93IGlvZTsKKwkJCX0KKwkJfQorCisJCXB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCQl0cnkgeworCQkJCXJldHVybiBpbiE9bnVsbD9zdXBlci5yZWFkKCk6LTE7CisJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKwkJCQljb25uZWN0aW9uID0gbnVsbDsKKwkJCQl0aHJvdyBpb2U7CisJCQl9CisJCX0KKworCQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVzZXQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQkJdHJ5IHsKKwkJCQlpZiAoaW4hPW51bGwpCisJCQkJCXN1cGVyLnJlc2V0KCk7CisJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKwkJCQljb25uZWN0aW9uID0gbnVsbDsKKwkJCQl0aHJvdyBpb2U7CisJCQl9CisJCX0KKworCQlwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCQl0cnkgeworCQkJCXJldHVybiBpbiE9bnVsbD9zdXBlci5yZWFkKGIpOi0xOworCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisJCQkJY29ubmVjdGlvbiA9IG51bGw7CisJCQkJdGhyb3cgaW9lOworCQkJfQorCQl9CisKKwkJcHVibGljIGludCByZWFkKGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQkJdHJ5IHsKKwkJCQlyZXR1cm4gaW4hPW51bGw/c3VwZXIucmVhZChiLCBvZmYsIGxlbik6LTE7CisJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKwkJCQljb25uZWN0aW9uID0gbnVsbDsKKwkJCQl0aHJvdyBpb2U7CisJCQl9CisJCX0KKworCQlwdWJsaWMgbG9uZyBza2lwKGxvbmcgbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJCXRyeSB7CisJCQkJcmV0dXJuIGluIT1udWxsP3N1cGVyLnNraXAobik6MDsKKwkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworCQkJCWNvbm5lY3Rpb24gPSBudWxsOworCQkJCXRocm93IGlvZTsKKwkJCX0KKwkJfQorCisJfQorCQorCXByb3RlY3RlZCBVUkwgdXJsOworCXByb3RlY3RlZCBJbnB1dFN0cmVhbSBpbjsKKwlwcm90ZWN0ZWQgbG9uZyBsYXN0TW9kaWZpZWQ7CisJcHJvdGVjdGVkIGxvbmcgb2Zmc2V0OworCisJcHJvdGVjdGVkIEh0dHBSZXNwb25zZShVUkwgdXJsKSB7CisJCQorICAgICAgICB0aGlzLnVybCA9IHVybDsKKwl9CisKKwlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlpZiAoaW4gPT0gbnVsbCAmJiB1cmwgIT0gbnVsbCkgeworCQkJaWYgKGNvbm5lY3Rpb24gPT0gbnVsbCB8fCBvZmZzZXQgPiAwKQorCQkJCWNvbm5lY3Rpb24gPSB1cmwub3BlbkNvbm5lY3Rpb24oKTsKKwkJCWlmIChvZmZzZXQgPiAwKQorCQkJCWNvbm5lY3Rpb24uc2V0UmVxdWVzdFByb3BlcnR5KCJSYW5nZSIsICJieXRlcz0iICsgb2Zmc2V0ICsgIi0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCXRyeSB7CisJCQkJaW4gPSBuZXcgTW9uaXRvcmluZ0lucHV0U3RyZWFtKGNvbm5lY3Rpb24uZ2V0SW5wdXRTdHJlYW0oKSwgY29ubmVjdGlvbik7CisJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKwkJCQljb25uZWN0aW9uID0gbnVsbDsKKwkJCQl0aHJvdyBpb2U7CisJCQl9CisJCQljaGVja09mZnNldCgpOworCQl9CisJCXJldHVybiBpbjsKKwl9CisJCisJcHVibGljIHZvaWQgY2xvc2UoKSB7CisgICAgICAgIGlmKCBudWxsICE9IGluICkgeworICAgICAgICAgICAgICAgIHRyeSB7CisJCQkJCWluLmNsb3NlKCk7CisJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCX0KKyAgICAgICAgICAgICAgICBpbiA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvbm5lY3Rpb24hPW51bGwpIHsKKyAgICAgICAgCSgoSHR0cFVSTENvbm5lY3Rpb24pY29ubmVjdGlvbikuZGlzY29ubmVjdCgpOworICAgICAgICAJY29ubmVjdGlvbiA9IG51bGw7CisgICAgICAgIH0KKwl9CisJCisJLyoqCisJICogQHNlZSBJUmVzcG9uc2UjZ2V0SW5wdXRTdHJlYW0oSVByb2dyZXNzTW9uaXRvcikKKwkgKi8KKwlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQorCQl0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24sIFRvb01hbnlPcGVuQ29ubmVjdGlvbnNFeGNlcHRpb24geworCQlpZiAoaW4gPT0gbnVsbCAmJiB1cmwgIT0gbnVsbCkgeworCQkJaWYgKGNvbm5lY3Rpb24gPT0gbnVsbCB8fCBvZmZzZXQgPiAwKQorCQkJCWNvbm5lY3Rpb24gPSB1cmwub3BlbkNvbm5lY3Rpb24oKTsKKwkJCWlmIChvZmZzZXQgPiAwKQorCQkJCWNvbm5lY3Rpb24uc2V0UmVxdWVzdFByb3BlcnR5KCJSYW5nZSIsICJieXRlcz0iICsgb2Zmc2V0ICsgIi0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKworCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgeworCQkJCXRyeSB7CisJCQkJCXRoaXMuaW4gPSBuZXcgTW9uaXRvcmluZ0lucHV0U3RyZWFtKG9wZW5TdHJlYW1XaXRoQ2FuY2VsKAorCQkJCQkJCWNvbm5lY3Rpb24sIG1vbml0b3IpLCBjb25uZWN0aW9uKTsKKwkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKwkJCQkJY29ubmVjdGlvbiA9IG51bGw7CisJCQkJCXRocm93IGlvZTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXRyeSB7CisJCQkJCXRoaXMuaW4gPSBuZXcgTW9uaXRvcmluZ0lucHV0U3RyZWFtKGNvbm5lY3Rpb24KKwkJCQkJCQkuZ2V0SW5wdXRTdHJlYW0oKSwgY29ubmVjdGlvbik7CisJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisJCQkJCWNvbm5lY3Rpb24gPSBudWxsOworCQkJCQl0aHJvdyBpb2U7CisJCQkJfQorCQkJfQorCQkJLy8gdGhpcyBjYW4gYWxzbyBiZSBydW4gaW5zaWRlIGEgbW9uaXRvcmluZyB0aHJlYWQsIGJ1dCBpdCBpcyBzYWZlCisJCQkvLyB0bworCQkJLy8ganVzdCBjYWxsIGl0IG5vdywgaWYgdGhlIGlucHV0IHN0cmVhbSBoYXMgYWxyZWFkeSBiZWVuIG9idGFpbmVkCisJCQljaGVja09mZnNldCgpOworCQkJaWYgKGNvbm5lY3Rpb24gIT0gbnVsbCkgeworCQkJCXRoaXMubGFzdE1vZGlmaWVkID0gY29ubmVjdGlvbi5nZXRMYXN0TW9kaWZpZWQoKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gaW47CisJfQorCisJcHVibGljIGxvbmcgZ2V0Q29udGVudExlbmd0aCgpIHsKKwkJaWYgKGNvbm5lY3Rpb24gIT0gbnVsbCkKKwkJCXJldHVybiBjb25uZWN0aW9uLmdldENvbnRlbnRMZW5ndGgoKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcHVibGljIGludCBnZXRTdGF0dXNDb2RlKCkgeworCQlpZiAoY29ubmVjdGlvbiA9PSBudWxsKQorCQkJdHJ5IHsKKwkJCQljb25uZWN0aW9uID0gdXJsLm9wZW5Db25uZWN0aW9uKCk7CisJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQl9CisJCWlmIChjb25uZWN0aW9uICE9IG51bGwpIHsKKwkJCXRyeSB7CisJCQkJcmV0dXJuICgoSHR0cFVSTENvbm5lY3Rpb24pIGNvbm5lY3Rpb24pLmdldFJlc3BvbnNlQ29kZSgpOworCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCVVwZGF0ZUNvcmUud2FybigiIiwgZSk7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJfQorCQlyZXR1cm4gVXBkYXRlQ29yZS5IVFRQX09LOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0U3RhdHVzTWVzc2FnZSgpIHsKKwkJaWYgKGNvbm5lY3Rpb24gIT0gbnVsbCkgeworCQkJdHJ5IHsKKwkJCQlyZXR1cm4gKChIdHRwVVJMQ29ubmVjdGlvbikgY29ubmVjdGlvbikuZ2V0UmVzcG9uc2VNZXNzYWdlKCk7CisJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJVXBkYXRlQ29yZS53YXJuKCIiLCBlKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQl9CisJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAorCX0KKworCXB1YmxpYyBsb25nIGdldExhc3RNb2RpZmllZCgpIHsKKwkJaWYgKGxhc3RNb2RpZmllZCA9PSAwKSB7CisJCQlpZiAoY29ubmVjdGlvbiA9PSBudWxsKQorCQkJCXRyeSB7CisJCQkJCWNvbm5lY3Rpb24gPSB1cmwub3BlbkNvbm5lY3Rpb24oKTsKKwkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJfQorCQkJaWYgKGNvbm5lY3Rpb24gIT0gbnVsbCkKKwkJCQlsYXN0TW9kaWZpZWQgPSBjb25uZWN0aW9uLmdldExhc3RNb2RpZmllZCgpOworCQl9CisJCXJldHVybiBsYXN0TW9kaWZpZWQ7CisJfQorCisJcHVibGljIHZvaWQgc2V0T2Zmc2V0KGxvbmcgb2Zmc2V0KSB7CisJCXRoaXMub2Zmc2V0ID0gb2Zmc2V0OworCX0KKwlwcml2YXRlIHZvaWQgY2hlY2tPZmZzZXQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlpZiAob2Zmc2V0ID09IDApCisJCQlyZXR1cm47CisJCVN0cmluZyByYW5nZSA9IGNvbm5lY3Rpb24uZ2V0SGVhZGVyRmllbGQoIkNvbnRlbnQtUmFuZ2UiKTsgLy8kTk9OLU5MUy0xJAorCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiQ29udGVudC1SYW5nZT0iICsgcmFuZ2UpOworCQlpZiAocmFuZ2UgPT0gbnVsbCkgeworCQkJLy9TeXN0ZW0uZXJyLnByaW50bG4oIlNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IHJhbmdlcyIpOworCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKE1lc3NhZ2VzLkh0dHBSZXNwb25zZV9yYW5nZUV4cGVjdGVkKTsgCisJCX0gZWxzZSBpZiAoIXJhbmdlLnN0YXJ0c1dpdGgoImJ5dGVzICIgKyBvZmZzZXQgKyAiLSIpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJLy9TeXN0ZW0uZXJyLnByaW50bG4oIlNlcnZlciByZXR1cm5lZCB3cm9uZyByYW5nZSIpOworCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKE1lc3NhZ2VzLkh0dHBSZXNwb25zZV93cm9uZ1JhbmdlKTsgCisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL2Nvbm5lY3Rpb24vSVJlc3BvbnNlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL2Nvbm5lY3Rpb24vSVJlc3BvbnNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM3YjgxOQotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvY29ubmVjdGlvbi9JUmVzcG9uc2UuamF2YQpAQCAtMCwwICsxLDc2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuY29ubmVjdGlvbjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworCitwdWJsaWMgaW50ZXJmYWNlIElSZXNwb25zZSB7CisKKwkvKioKKwkgKiBNZXRob2QgZ2V0SW5wdXRTdHJlYW0uCisJICogCisJICogQHJldHVybiBJbnB1dFN0cmVhbQorCSAqLworCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworCS8qKgorCSAqIEEgc3BlY2lhbCB2ZXJzaW9uIG9mICdnZXRJbnB1dFN0cmVhbScgdGhhdCBjYW4gYmUgY2FuY2VsZWQuCisJICogQSBtb25pdG9yIHRocmVhZCBjaGVja3MgdGhlIHN0YXRlIG9mIHRoZSBtb25pdG9yCisJICogYW5kIGRpc2Nvbm5lY3RzIHRoZSBjb25uZWN0aW9uIGlmICdpc0NhbmNlbGVkKCknIGlzIGRldGVjdGVkLgorCSAqIAorCSAqIEBwYXJhbSBtb25pdG9yCisJICogICAgICAgICAgICB0aGUgcHJvZ3Jlc3MgbW9uaXRvcgorCSAqIEByZXR1cm4gSW5wdXRTdHJlYW0gYW4gb3BlbmVkIHN0cmVhbSBvciBudWxsIGlmIGZhaWxlZC4KKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisJICogICAgICAgICAgICAgaWYgdGhlcmUgYXJlIHByb2JsZW1zCisJICogQHRocm93cyBDb3JlRXhjZXB0aW9uCisJICogICAgICAgICAgICAgaWYgbm8gbW9yZSBjb25uZWN0aW9uIHRocmVhZHMgYXJlIGF2YWlsYWJsZQorCSAqLworCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCisJCXRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiwgVG9vTWFueU9wZW5Db25uZWN0aW9uc0V4Y2VwdGlvbjsKKworCS8qKgorCSAqIE1ldGhvZCBnZXRDb250ZW50TGVuZ3RoLgorCSAqIAorCSAqIEByZXR1cm4gbG9uZworCSAqLworCXB1YmxpYyBsb25nIGdldENvbnRlbnRMZW5ndGgoKTsKKworCS8qKgorCSAqIE1ldGhvZCBnZXRTdGF0dXNDb2RlLgorCSAqIAorCSAqIEByZXR1cm4gaW50CisJICovCisJcHVibGljIGludCBnZXRTdGF0dXNDb2RlKCk7CisKKwkvKioKKwkgKiBNZXRob2QgZ2V0U3RhdHVzTWVzc2FnZS4KKwkgKiAKKwkgKiBAcmV0dXJuIFN0cmluZworCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0U3RhdHVzTWVzc2FnZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdGltZXN0YW1wIG9mIGxhc3QgbW9kaWZpY2F0aW9uIHRvIHRoZSByZXNvdXJjZQorCSAqIAorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgbG9uZyBnZXRMYXN0TW9kaWZpZWQoKTsKKwkKKwkvKioKKwkgKiBDbG9zZSB0aGUgY29ubmVjdGlvbiBpZiBvcGVuLgorCSAqLworCXB1YmxpYyB2b2lkIGNsb3NlKCk7Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL2Nvbm5lY3Rpb24vT3RoZXJSZXNwb25zZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9jb25uZWN0aW9uL090aGVyUmVzcG9uc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTlkODJlCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9jb25uZWN0aW9uL090aGVyUmVzcG9uc2UuamF2YQpAQCAtMCwwICsxLDk2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuY29ubmVjdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLlVwZGF0ZUNvcmU7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuVVJMOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CisKK3B1YmxpYyBjbGFzcyBPdGhlclJlc3BvbnNlIGV4dGVuZHMgQWJzdHJhY3RSZXNwb25zZSB7CisKKwlwcm90ZWN0ZWQgVVJMIHVybDsKKwlwcm90ZWN0ZWQgSW5wdXRTdHJlYW0gaW47CisJcHJvdGVjdGVkIGxvbmcgbGFzdE1vZGlmaWVkOworCisJcHJvdGVjdGVkIE90aGVyUmVzcG9uc2UoVVJMIHVybCkgeworCQl0aGlzLnVybCA9IHVybDsKKwl9CisKKwlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlpZiAoaW4gPT0gbnVsbCAmJiB1cmwgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGNvbm5lY3Rpb24gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBjb25uZWN0aW9uID0gdXJsLm9wZW5Db25uZWN0aW9uKCk7CisJCQlpbiA9IGNvbm5lY3Rpb24uZ2V0SW5wdXRTdHJlYW0oKTsKKwkJCXRoaXMubGFzdE1vZGlmaWVkID0gY29ubmVjdGlvbi5nZXRMYXN0TW9kaWZpZWQoKTsKKwkJfQorCQlyZXR1cm4gaW47CisJfQorCQorCXB1YmxpYyB2b2lkIGNsb3NlKCkgeworICAgICAgICBpZiggbnVsbCAhPSBpbiApIHsKKyAgICAgICAgICAgICAgICB0cnkgeworCQkJCQlpbi5jbG9zZSgpOworCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQl9CisgICAgICAgICAgICAgICAgaW4gPSBudWxsOworICAgICAgICB9CisJfQkKKwkKKwkvKioKKwkgKiBAc2VlIElSZXNwb25zZSNnZXRJbnB1dFN0cmVhbShJUHJvZ3Jlc3NNb25pdG9yKQorCSAqLworCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCisJCXRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7CisJCWlmIChpbiA9PSBudWxsICYmIHVybCAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoY29ubmVjdGlvbiA9PSBudWxsKQorICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24gPSB1cmwub3BlbkNvbm5lY3Rpb24oKTsKKworCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgeworCQkJCXRoaXMuaW4gPQorCQkJCQlvcGVuU3RyZWFtV2l0aENhbmNlbChjb25uZWN0aW9uLCBtb25pdG9yKTsKKwkJCX0gZWxzZSB7CisJCQkJdGhpcy5pbiA9IGNvbm5lY3Rpb24uZ2V0SW5wdXRTdHJlYW0oKTsKKwkJCX0KKwkJCWlmIChpbiAhPSBudWxsKSB7CisJCQkJdGhpcy5sYXN0TW9kaWZpZWQgPSBjb25uZWN0aW9uLmdldExhc3RNb2RpZmllZCgpOworCQkJfQorCQl9CisJCXJldHVybiBpbjsKKwl9CisKKwlwdWJsaWMgbG9uZyBnZXRDb250ZW50TGVuZ3RoKCkgeworCQlpZiAoY29ubmVjdGlvbiAhPSBudWxsKQorCQkJcmV0dXJuIGNvbm5lY3Rpb24uZ2V0Q29udGVudExlbmd0aCgpOworCQlyZXR1cm4gMDsKKwl9CisKKwlwdWJsaWMgaW50IGdldFN0YXR1c0NvZGUoKSB7CisJCXJldHVybiBVcGRhdGVDb3JlLkhUVFBfT0s7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRTdGF0dXNNZXNzYWdlKCkgeworCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwlwdWJsaWMgbG9uZyBnZXRMYXN0TW9kaWZpZWQoKSB7CisJCWlmIChsYXN0TW9kaWZpZWQgPT0gMCAmJiBjb25uZWN0aW9uICE9IG51bGwpIHsKKwkJCWxhc3RNb2RpZmllZCA9IGNvbm5lY3Rpb24uZ2V0TGFzdE1vZGlmaWVkKCk7CisJCX0KKwkJcmV0dXJuIGxhc3RNb2RpZmllZDsKKwl9CisJCisKK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvY29ubmVjdGlvbi9Ub29NYW55T3BlbkNvbm5lY3Rpb25zRXhjZXB0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL2Nvbm5lY3Rpb24vVG9vTWFueU9wZW5Db25uZWN0aW9uc0V4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4Zjg0NmUKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL2Nvbm5lY3Rpb24vVG9vTWFueU9wZW5Db25uZWN0aW9uc0V4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLmNvbm5lY3Rpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKKworCitwdWJsaWMgY2xhc3MgVG9vTWFueU9wZW5Db25uZWN0aW9uc0V4Y2VwdGlvbiBleHRlbmRzIENvcmVFeGNlcHRpb24geworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisJCisJcHVibGljIFRvb01hbnlPcGVuQ29ubmVjdGlvbnNFeGNlcHRpb24oSVN0YXR1cyBzdGF0dXMpIHsKKwkJc3VwZXIoc3RhdHVzKTsKKwl9Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL21lc3NhZ2VzLnByb3BlcnRpZXMgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL21lc3NhZ2VzLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgwMjBjYgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvbWVzc2FnZXMucHJvcGVydGllcwpAQCAtMCwwICsxLDI3OSBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisjIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjCisjIENvbnRyaWJ1dG9yczoKKyMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBJbnN0YWxsIFVwZGF0ZSBDb3JlIFByb3BlcnRpZXMgRmlsZQorIworCitQcm9kdWN0UHJvdmlkZXI9VXBkYXRlIE1hbmFnZXIKK0Jhc2VTaXRlRmFjdG9yeV9DYW5ub3RSZXRyaXZlUGFyZW50RGlyZWN0b3J5PVVuYWJsZSB0byByZXRyaWV2ZSBwYXJlbnQgZGlyZWN0b3J5IGZvciBVUkwgXCJ7MH1cIi4KK0NvbnRlbnRSZWZlcmVuY2VfVW5hYmxlVG9DcmVhdGVJbnB1dFN0cmVhbT0gVW5hYmxlIHRvIGNyZWF0ZSBhbiBpbnB1dCBzdHJlYW0gZm9yIHRoZSByZWZlcmVuY2UgXCJ7MH1cIi4KK0NvbnRlbnRSZWZlcmVuY2VfVW5hYmxlVG9SZXR1cm5SZWZlcmVuY2VBc0ZpbGU9IFVuYWJsZSB0byByZXR1cm4gcmVmZXJlbmNlIFwiezB9XCIgYXMgRmlsZS4KK0NvbnRlbnRSZWZlcmVuY2VfVW5hYmxlVG9SZXR1cm5SZWZlcmVuY2VBc1VSTD0gVW5hYmxlIHRvIHJldHVybiByZWZlcmVuY2UgXCJ7MH1cIiBhcyBVUkwuCitDb250ZW50UmVmZXJlbmNlX0h0dHBOb2s9IFNlcnZlciByZXR1cm5lZCBIVFRQIHJlc3BvbnNlIGNvZGU6IFwiezB9IHsxfVwiIGZvciBVUkw6IHsyfS4KK0NvbnRlbnRSZWZlcmVuY2VfRmlsZURvZXNOb3RFeGlzdD1UaGUgZmlsZSBcInswfVwiIGRvZXMgbm90IGV4aXN0IG9uIHRoZSBmaWxlIHN5c3RlbS4KK0ZlYXR1cmVfU2l0ZUFscmVhZHlTZXQ9IEludGVybmFsIEVycm9yOiBTaXRlIGFscmVhZHkgc2V0IGZvciB0aGUgZmVhdHVyZSBcInswfVwiLgorRmVhdHVyZV9UYXNrSW5zdGFsbEZlYXR1cmVGaWxlcz0gSW5zdGFsbGluZyBmZWF0dXJlIGZpbGVzOgorRmVhdHVyZV9UYXNrSW5zdGFsbFBsdWdpbkZpbGVzPSBJbnN0YWxsaW5nIHBsdWctaW4gXCJ7MH1cIiBmaWxlczoKK0ZlYXR1cmVfTm9Db250ZW50UHJvdmlkZXI9IEludGVybmFsIEVycm9yLiBUaGUgZmVhdHVyZSBcInswfVwiIGRvZXMgbm90IGhhdmUgYSBjb250ZW50IHByb3ZpZGVyLgorRmVhdHVyZV9Ob0ZlYXR1cmVDb250ZW50Q29uc3VtZXI9IEludGVybmFsIEVycm9yLiBUaGUgRmVhdHVyZSBcInswfVwiIGRvZXMgbm90IGhhdmUgYSBjb250ZW50IGNvbnN1bWVyLgorRmVhdHVyZV9Ob1VSTD0gVW5rbm93biBVUkwuCitGZWF0dXJlX0ZlYXR1cmVWZXJzaW9uVG9TdHJpbmc9IEZlYXR1cmU6IFwiezB9XCIgVmVyc2lvbjogXCJ7MX1cIi4KK0ZlYXR1cmVfSW5zdGFsbGF0aW9uQ2FuY2VsbGVkPSBJbnN0YWxsYXRpb24gaGFzIGJlZW4gY2FuY2VsbGVkIGJ5IHRoZSBVc2VyLgorRmVhdHVyZV9VbmFibGVUb0luaXRpYWxpemVGZWF0dXJlUmVmZXJlbmNlPSBVbmFibGUgdG8gaW5pdGlhbGl6ZSBmZWF0dXJlIHJlZmVyZW5jZSBmb3IgdmVyc2lvbmVkIGlkZW50aWZpZXIgXCJ7MH1cIi4KK0ZlYXR1cmVDb250ZW50UHJvdmlkZXJfRG93bmxvYWRpbmc9IERvd25sb2FkaW5nOgorRmVhdHVyZUNvbnRlbnRQcm92aWRlcl9VbmFibGVUb1JldHJpZXZlPSBVbmFibGUgdG8gcmV0cmlldmUgcmVtb3RlIHJlZmVyZW5jZSBcInswfVwiLgorRmVhdHVyZUNvbnRlbnRQcm92aWRlcl9VbmFibGVUb0NyZWF0ZT0gVW5hYmxlIHRvIGNyZWF0ZSBsb2NhbCBmaWxlIFwiezB9XCIuCitGZWF0dXJlQ29udGVudFByb3ZpZGVyX0V4Y2VwdGlvbkRvd25sb2FkaW5nID0gQW4gZXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIGRvd25sb2FkaW5nIGZlYXR1cmUgZnJvbSBcInswfVwiLgorSW5zdGFsbEhhbmRsZXJfdW5hYmxlVG9DcmVhdGVIYW5kbGVyID0gVW5hYmxlIHRvIGNyZWF0ZSBjdXN0b20gaW5zdGFsbCBoYW5kbGVyIGZvciBmZWF0dXJlIFwiezB9XCIuCitJbnN0YWxsSGFuZGxlcl9ub3RGb3VuZCA9IEN1c3RvbSBpbnN0YWxsIGhhbmRsZXIgcmVxdWlyZWQgYnkgZmVhdHVyZSBcInswfVwiIHdhcyBub3QgZm91bmQuCitJbnN0YWxsSGFuZGxlcl9pbnZhbGlkSGFuZGxlciA9IEZlYXR1cmUgXCJ7MH1cIiBjb250YWlucyBpbnZhbGlkIGN1c3RvbSBpbnN0YWxsIGhhbmRsZXIuCitJbnN0YWxsSGFuZGxlcl9jYWxsRXhjZXB0aW9uID0gRXJyb3IgcmVwb3J0ZWQgYnkgY3VzdG9tIGluc3RhbGwgaGFuZGxlciBmb3IgZmVhdHVyZSBcInswfVwiLgorSW5zdGFsbEhhbmRsZXJfZXJyb3IgPSBVbmFibGUgdG8gY29tcGxldGUgYWN0aW9uIGZvciBmZWF0dXJlIFwiezB9XCIgZHVlIHRvIGVycm9ycy4KK0luc3RhbGxDb21tYW5kX3NpdGU9c2l0ZSB7MH0KK0luc3RhbGxNb25pdG9yX0Rvd25sb2FkU2l6ZSA9ICh7MH1LIGJ5dGVzKQorSW5zdGFsbE1vbml0b3JfRG93bmxvYWRTaXplTG9uZyA9ICh7MH1LIG9mIHsxfUsgYnl0ZXMpCitKYXJDb250ZW50UmVmZXJlbmNlX1VucGFja2luZz0gVW5wYWNraW5nOgorU2l0ZV9DYW5ub3RGaW5kQ2F0ZWdvcnk9IFVuYWJsZSB0byBmaW5kIGNhdGVnb3J5OiBcInswfVwiIGluIFNpdGU6IFwiezF9XCIuCitTaXRlX05vQ2F0ZWdvcmllcz0gVGhlIFNpdGUgZG9lcyBub3QgY29udGFpbiBhbnkgY2F0ZWdvcmllcy4KK1NpdGVfTm9Db250ZW50UHJvdmlkZXI9IEludGVybmFsIEVycm9yLiBDb250ZW50IFByb3ZpZGVyIG5vdCBzZXQgZm9yIFNpdGU6IFwiezB9XCIuCitWZXJzaW9uZWRJZGVudGlmaWVyX0lkT3JWZXJzaW9uTnVsbD0gSW50ZXJuYWwgRXJyb3IuIFVuYWJsZSB0byBjcmVhdGUgYW4gSWRlbnRpZmllci4gVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9yIHRoZSB2ZXJzaW9uIGlzIG51bGwgb3IgZW1wdHk6IHVuaXF1ZSBpZGVudGlmaWVyPVwiezB9XCIgdmVyc2lvbj1cInsxfVwiLgorU2l0ZUZpbGVfQ2Fubm90UmVtb3ZlUGx1Z2luPSBVbmFibGUgdG8gcmVtb3ZlIHBsdWctaW46IFwiezB9XCIgZnJvbSBTaXRlOiBcInsxfVwiLgorU2l0ZUZpbGVfQ2Fubm90UmVtb3ZlRmVhdHVyZT0gVW5hYmxlIHRvIHJlbW92ZSBmZWF0dXJlOiBcInswfVwiIGZyb20gU2l0ZTogXCJ7MX1cIi4KK1NpdGVGaWxlX1VuYWJsZVRvQ3JlYXRlVVJMPSBVbmFibGUgdG8gY3JlYXRlIFVSTCBmb3IgbG9jYXRpb24gXCJ7MH1cIi4KK1NpdGVGaWxlX1JlbW92aW5nPSBSZW1vdmluZzoKK1NpdGVGaWxlRmFjdG9yeV9VbmFibGVUb0NyZWF0ZVVSTD0gSW50ZXJuYWwgRXJyb3IuIFVuYWJsZSB0byBjcmVhdGUgVVJMIGZyb20gXCJ7MH1cIi4KK1NpdGVGaWxlRmFjdG9yeV9VbmFibGVUb0FjY2Vzc1NpdGU9IFVuYWJsZSB0byBhY2Nlc3Mgc2l0ZQorU2l0ZUZpbGVGYWN0b3J5X0RpcmVjdG9yeURvZXNOb3RFeGlzdD1UaGUgZGlyZWN0b3J5IFwiezB9XCIgZG9lcyBub3QgZXhpc3Qgb24gdGhlIGZpbGUgc3lzdGVtLgorRGVmYXVsdEZlYXR1cmVQYXJzZXJfbG9jYXRpb249IEZlYXR1cmUgbG9jYXRpb246IHswfQorRGVmYXVsdEZlYXR1cmVQYXJzZXJfTm9GZWF0dXJlVGFnPSBFcnJvciBwYXJzaW5nIGZlYXR1cmUgc3RyZWFtLiBVbmFibGUgdG8gZmluZCByb290IGVsZW1lbnQgXCJmZWF0dXJlXCIgaW4gdGhlIHN0cmVhbS4KK0RlZmF1bHRGZWF0dXJlUGFyc2VyX1dyb25nUGFyc2luZ1N0YWNrPSBJbnRlcm5hbCBFcnJvciBwYXJzaW5nIGZlYXR1cmUgc3RyZWFtLiBVbmV4cGVjdGVkIFBhcnNpbmcgU3RhY2s6IFwiezB9XCIKK0RlZmF1bHRGZWF0dXJlUGFyc2VyX1Vua25vd25FbGVtZW50PSBFcnJvciBwYXJzaW5nIGZlYXR1cmUgc3RyZWFtLiBVbmtub3duIGVsZW1lbnQgXCJ7MH1cIiBpbiBwYXJzaW5nIHN0YXRlIFwiezF9XCIuIENoZWNrIHRoZSB2YWxpZGl0eSBvZiB0aGUgWE1MIGZpbGUuCitEZWZhdWx0RmVhdHVyZVBhcnNlcl9Ub29NYW55VVJMdGFnPSBFcnJvciBwYXJzaW5nIGZlYXR1cmUgc3RyZWFtLiBUaGVyZSBpcyBtb3JlIHRoYW4gb25lIFwiVVJMXCIgZWxlbWVudCBpbiB0aGUgWE1MIHN0cmVhbS4gVGhlcmUgc2hvdWxkIGJlIG9ubHkgb25lLgorRGVmYXVsdEZlYXR1cmVQYXJzZXJfVW5rbm93blN0YXJ0U3RhdGU9IEludGVybmFsIEVycm9yIHBhcnNpbmcgZmVhdHVyZSBzdHJlYW0uIFVua25vd24gc3RhcnQgc3RhdGUgXCJ7MH1cIi4KK0RlZmF1bHRGZWF0dXJlUGFyc2VyX0lkT3JWZXJzaW9uSW52YWxpZD0gRXJyb3IgcGFyc2luZyBmZWF0dXJlIHN0cmVhbS4gVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9yIHRoZSB2ZXJzaW9uIGlzIG51bGwgb3IgZW1wdHkgZm9yIHRoZSBTdGF0ZTogXCJ7Mn1cIjogdW5pcXVlIGlkZW50aWZpZXI9XCJ7MH1cIiB2ZXJzaW9uPVwiezF9XCIuCitEZWZhdWx0RmVhdHVyZVBhcnNlcl9NaXNzaW5nSWQ9IEVycm9yIHBhcnNpbmcgZmVhdHVyZSBzdHJlYW0uIFRoZSBcImlkXCIgdGFnIG9mIHRoZSBlbGVtZW50IFwiezB9XCIgaXMgbnVsbCBvciBlbXB0eS4gVmFsdWUgaXMgcmVxdWlyZWQuCitEZWZhdWx0RmVhdHVyZVBhcnNlcl9QYXJzaW5nU3RhY2tCYWNrVG9Jbml0aWFsU3RhdGU9IEludGVybmFsIEVycm9yIHBhcnNpbmcgZmVhdHVyZSBzdHJlYW0uIFBhcnNpbmcgc3RhY2sgYmFjayB0byBJbml0aWFsIFN0YXRlLgorRGVmYXVsdEZlYXR1cmVQYXJzZXJfRWxlbWVudEFscmVhZHlTZXQ9IEVycm9yIHBhcnNpbmcgZmVhdHVyZSBzdHJlYW0uIEVsZW1lbnQ6IFwiezB9XCIgYWxyZWFkeSBzZXQgZm9yIHRoZSBmZWF0dXJlLgorRGVmYXVsdEZlYXR1cmVQYXJzZXJfU3RhdGVJbmNsdWRlV3JvbmdFbGVtZW50PSBFcnJvciBwYXJzaW5nIGZlYXR1cmUgc3RyZWFtLiBTdGF0ZTogXCJ7MH1cIiBzaG91bGQgbm90IGluY2x1ZGUgRWxlbWVudCBcInsxfVwiLgorRGVmYXVsdEZlYXR1cmVQYXJzZXJfUmVxdWlyZVN0YXRlV2l0aG91dEltcG9ydEVsZW1lbnQ9RXJyb3IgcGFyc2luZyBmZWF0dXJlIHN0cmVhbS4gU3RhdGU6IFwicmVxdWlyZVwiIG11c3QgaW5jbHVkZSBhdCBsZWFzdCBhbiBcImltcG9ydFwiIGVsZW1lbnQuCitEZWZhdWx0RmVhdHVyZVBhcnNlcl9NaXNzaW5nUGF0Y2hWZXJzaW9uPUVycm9yIHBhcnNpbmcgZmVhdHVyZSBzdHJlYW0uIEF0dHJpYnV0ZSAidmVyc2lvbiIgb2YgdGhlIGVsZW1lbnQgImltcG9ydCIgbXVzdCBiZSBzZXQgd2hlbiAicGF0Y2giIGlzIHNldCB0byAidHJ1ZSIuCitEZWZhdWx0RmVhdHVyZVBhcnNlcl93cm9uZ01hdGNoRm9yUGF0Y2g9RXJyb3IgcGFyc2luZyBmZWF0dXJlIHN0cmVhbS4gV2hlbiBhdHRyaWJ1dGUgInBhdGNoIiBvZiB0aGUgZWxlbWVudCAiaW1wb3J0IiBpcyBzZXQgdG8gInRydWUiLCB0aGUgb25seSB2YWxpZCB2YWx1ZSBmb3IgdGhlICJtYXRjaCIgYXR0cmlidXRlIGlzICJwZXJmZWN0Ii4KK0RlZmF1bHRGZWF0dXJlUGFyc2VyX3BhdGNoV2l0aFBsdWdpbj1FcnJvciBwYXJzaW5nIGZlYXR1cmUgc3RyZWFtLiBBdHRyaWJ1dGUgInBhdGNoIiBjYW4gb25seSBiZSB1c2VkIGZvciBmZWF0dXJlcy4KK0RlZmF1bHRGZWF0dXJlUGFyc2VyX011bHRpcGxlUGF0Y2hJbXBvcnRzPUVycm9yIHBhcnNpbmcgZmVhdHVyZSBzdHJlYW0uIFN0YXRlOiAicmVxdWlyZSIgbXVzdCBub3QgY29udGFpbiBtb3JlIHRoYW4gb25lICJpbXBvcnQiIGVsZW1lbnQgd2l0aCB0aGUgYXR0cmlidXRlICJwYXRjaCIgc2V0IHRvICJ0cnVlIi4KK0RlZmF1bHRGZWF0dXJlUGFyc2VyX1Vua25vd25FbmRTdGF0ZT0gSW50ZXJuYWwgRXJyb3IgcGFyc2luZyBmZWF0dXJlIHN0cmVhbS4gVW5rbm93biBlbmQgc3RhdGUgXCJ7MH1cIi4KK0RlZmF1bHRGZWF0dXJlUGFyc2VyX0Vycm9yUGFyc2luZz0gRXJyb3IgUGFyc2luZyBmZWF0dXJlIHN0cmVhbS4gRXJyb3I6IFwiezB9XCIKK0RlZmF1bHRGZWF0dXJlUGFyc2VyX0Vycm9ybGluZUNvbHVtbk1lc3NhZ2U9IEVycm9yIFBhcnNpbmcgZmVhdHVyZSBzdHJlYW0uIEVsZW1lbnQgXCJ7MH1cIiBsaW5lOiBcInsxfVwiIGNvbHVtbjpcInsyfVwiLiBFcnJvcjogXCJ7M31cIi4KK0RlZmF1bHRGZWF0dXJlUGFyc2VyX0Vycm9yUGFyc2luZ0ZlYXR1cmU9IEVycm9yIFBhcnNpbmcgZmVhdHVyZSBzdHJlYW0uCitEZWZhdWx0RmVhdHVyZVBhcnNlcl9Vbmtub3duU3RhdGU9IFVua25vd24gU3RhdGUgXCJ7MH1cIi4KK0RlZmF1bHRGZWF0dXJlUGFyc2VyX05vTGljZW5zZVRleHQ9IEVycm9yIHBhcnNpbmcgZmVhdHVyZSBzdHJlYW0uIFN0YXRlOiBcImxpY2Vuc2VcIiBtdXN0IGluY2x1ZGUgc29tZSB0ZXh0LgorRGVmYXVsdEZlYXR1cmVQYXJzZXJfUGx1Z2luQW5kRmVhdHVyZUlkPU9uZSBJbXBvcnQgc3RhdGVtZW50IGlzIGluY29ycmVjdDogQm90aCBmZWF0dXJlIGFuZCBwbHVnLWluIElEIGFyZSBlaXRoZXIgbnVsbCBvciBzcGVjaWZpZWQuCitTaXRlQ29udGVudFByb3ZpZGVyX0Vycm9yQ3JlYXRpbmdVUkxGb3JBcmNoaXZlSUQ9IEludGVybmFsIEVycm9yLiBVbmFibGUgdG8gY3JlYXRlIFVSTCBmb3IgQXJjaGl2ZSBJZGVudGlmaWVyIFwiezB9XCIgb24gU2l0ZSBcInsxfVwiLgorRGVmYXVsdFNpdGVQYXJzZXJfTm9TaXRlVGFnPSBFcnJvciBwYXJzaW5nIHNpdGUgc3RyZWFtLiBVbmFibGUgdG8gZmluZCByb290IGVsZW1lbnQgXCJzaXRlXCIgaW4gdGhlIHN0cmVhbS4KK0RlZmF1bHRTaXRlUGFyc2VyX1dyb25nUGFyc2luZ1N0YWNrPSBJbnRlcm5hbCBFcnJvciBwYXJzaW5nIHNpdGUgc3RyZWFtLiBVbmV4cGVjdGVkIFBhcnNpbmcgU3RhY2s6IFwiezB9XCIKK0RlZmF1bHRTaXRlUGFyc2VyX1Vua25vd25FbGVtZW50PSBFcnJvciBwYXJzaW5nIHNpdGUgc3RyZWFtLiBVbmtub3duIGVsZW1lbnQgXCJ7MH1cIiBpbiBwYXJzaW5nIHN0YXRlIFwiezF9XCIuIENoZWNrIHRoZSB2YWxpZGl0eSBvZiB0aGUgWE1MIGZpbGUuCitEZWZhdWx0U2l0ZVBhcnNlcl9Vbmtub3duU3RhcnRTdGF0ZT0gSW50ZXJuYWwgRXJyb3IgcGFyc2luZyBzaXRlIHN0cmVhbS4gVW5rbm93biBzdGFydCBzdGF0ZSBcInswfVwiLgorRGVmYXVsdFNpdGVQYXJzZXJfTWlzc2luZz0gRXJyb3IgcGFyc2luZyBzaXRlIHN0cmVhbS4gVGhlIFwiezB9XCIgdGFnIG9mIHRoZSBlbGVtZW50IFwiezF9XCIgaXMgbnVsbCBvciBlbXB0eS4gVmFsdWUgaXMgcmVxdWlyZWQuCitEZWZhdWx0U2l0ZVBhcnNlcl9QYXJzaW5nU3RhY2tCYWNrVG9Jbml0aWFsU3RhdGU9IEludGVybmFsIEVycm9yIHBhcnNpbmcgc2l0ZSBzdHJlYW0uIFBhcnNpbmcgc3RhY2sgYmFjayB0byBJbml0aWFsIFN0YXRlLgorRGVmYXVsdFNpdGVQYXJzZXJfRWxlbWVudEFscmVhZHlTZXQ9IEVycm9yIHBhcnNpbmcgc2l0ZSBzdHJlYW0uIEVsZW1lbnQ6IFwiezB9XCIgYWxyZWFkeSBzZXQgZm9yIHRoZSBTaXRlLgorRGVmYXVsdFNpdGVQYXJzZXJfVW5rbm93bkVuZFN0YXRlPSBJbnRlcm5hbCBFcnJvciBwYXJzaW5nIHNpdGUgc3RyZWFtLiBVbmtub3duIGVuZCBzdGF0ZSBcInswfVwiLgorRGVmYXVsdFNpdGVQYXJzZXJfRXJyb3JQYXJzaW5nPSBFcnJvciBQYXJzaW5nIHNpdGUgc3RyZWFtLiBFcnJvcjogXCJ7MH1cIgorRGVmYXVsdFNpdGVQYXJzZXJfRXJyb3JsaW5lQ29sdW1uTWVzc2FnZT0gRXJyb3IgUGFyc2luZyBzaXRlIHN0cmVhbS4gRWxlbWVudCBcInswfVwiIGxpbmU6IFwiezF9XCIgY29sdW1uOlwiezJ9XCIuIEVycm9yOiBcInszfVwiLgorRGVmYXVsdFNpdGVQYXJzZXJfRXJyb3JQYXJzaW5nU2l0ZT0gRXJyb3IgUGFyc2luZyBzaXRlIHN0cmVhbS4KK0RlZmF1bHRTaXRlUGFyc2VyX1Vua25vd25TdGF0ZT0gVW5rbm93biBTdGF0ZSBcInswfVwiLgorRGVmYXVsdFNpdGVQYXJzZXJfSW52YWxpZFhNTFN0cmVhbT0gVGhlIFhNTCBzdHJlYW0gaXMgbm90IGEgdmFsaWQgZGVmYXVsdCBcInNpdGUueG1sXCIgZmlsZS4gVGhlIHJvb3QgdGFnIGlzIG5vdCBzaXRlLgorTW9kZWxPYmplY3RfTW9kZWxSZWFkT25seT0gSW50ZXJuYWwgRXJyb3IuIFRoZSBNb2RlbCBPYmplY3QgaXMgcmVhZC1vbmx5LgorU2l0ZU1vZGVsT2JqZWN0X0Vycm9yUGFyc2luZ1NpdGVTdHJlYW09IEVycm9yIHBhcnNpbmcgc2l0ZSBzdHJlYW0uCitTaXRlTW9kZWxPYmplY3RfRXJyb3JBY2Nlc3NpbmdTaXRlU3RyZWFtPSBFcnJvciBhY2Nlc3Npbmcgc2l0ZSBzdHJlYW0uCitJbnN0YWxsQ29uZmlndXJhdGlvbl9FcnJvckR1cmluZ0ZpbGVBY2Nlc3M9IEVycm9yIGFjY2Vzc2luZyBmaWxlOiBcInswfVwiLgorSW5zdGFsbENvbmZpZ3VyYXRpb25QYXJzZXJfRmVhdHVyZVJlZmVyZW5jZU5vVVJMPSBFcnJvciBQYXJzaW5nIFN0cmVhbS4gQSBmZWF0dXJlIHJlZmVyZW5jZSBlbGVtZW50IGRvZXMgbm90IGhhdmUgYSBVUkwgdGFnLiBWYWx1ZSBpcyByZXF1aXJlZC4KK0ZlYXR1cmVFeGVjdXRhYmxlQ29udGVudFByb3ZpZGVyX0ZpbGVEb2VzTm90RXhpc3Q9IFRoZSBmaWxlIFwiezB9XCIgZG9lcyBub3QgZXhpc3QuCitGZWF0dXJlRXhlY3V0YWJsZUNvbnRlbnRQcm92aWRlcl9JbnZhbGlkRGlyZWN0b3J5PSBUaGUgcGF0aCBcInswfVwiIGlzIG5vdCBhIHZhbGlkIGRpcmVjdG9yeS4KK0ZlYXR1cmVFeGVjdXRhYmxlQ29udGVudFByb3ZpZGVyX1VuYWJsZVRvQ3JlYXRlVVJMRm9yPVVuYWJsZSB0byBjcmVhdGUgYSBVUkwgZm9yIFwiezB9XCIuCitGZWF0dXJlRXhlY3V0YWJsZUNvbnRlbnRQcm92aWRlcl9VbmFibGVUb1JldHJpZXZlTm9uUGx1Z2luRW50cnk9RXJyb3IgcmV0cmlldmluZyB0aGUgbm9uLXBsdWctaW4gZW50cnk6IFwiezB9XCIuCitGZWF0dXJlRXhlY3V0YWJsZUNvbnRlbnRQcm92aWRlcl9VbmFibGVUb1JldHJpZXZlRmVhdHVyZUVudHJ5PUVycm9yIHJldHJpZXZpbmcgZmVhdHVyZSBlbnRyeSBjb250ZW50IHJlZmVyZW5jZTogXCJ7MH1cIi4KK0ZlYXR1cmVFeGVjdXRhYmxlQ29udGVudFByb3ZpZGVyX1VuYWJsZVRvUmV0cmlldmVQbHVnaW5FbnRyeSA9RXJyb3IgcmV0cmlldmluZyB0aGUgcGx1Zy1pbiBlbnRyeTogXCJ7MH1cIi4KK0NvbmZpZ3VyZWRTaXRlX05vbkluc3RhbGxhYmxlU2l0ZT0gWW91IGNhbm5vdCBpbnN0YWxsIGluIHRoZSBzaXRlIFwiezB9XCIuIEl0IGlzIGNvbnNpZGVyZWQgbm9uIHVwZGF0ZWFibGUuCitDb25maWd1cmVkU2l0ZV9OdWxsRmVhdHVyZVRvSW5zdGFsbD0gSW50ZXJuYWwgRXJyb3IuIFRoZSBmZWF0dXJlIHRvIGJlIGluc3RhbGxlZCBpcyBudWxsLgorQ29uZmlndXJlZFNpdGVfTm9uVW5pbnN0YWxsYWJsZVNpdGU9IFlvdSBjYW5ub3QgdW5pbnN0YWxsIGZyb20gdGhlIHNpdGUgXCJ7MH1cIi4gSXQgaXMgY29uc2lkZXJlZCBub24gdXBkYXRlYWJsZS4KK0NvbmZpZ3VyZWRTaXRlX05vU2l0ZT0gTm8gU2l0ZQorQ29uZmlndXJlZFNpdGVfQ2Fubm90RmluZEZlYXR1cmVUb1VuY29uZmlndXJlPSBJbnRlcm5hbCBFcnJvci4gVW5hYmxlIHRvIGRpc2FibGUgZmVhdHVyZSBcInswfVwiIG9uIHNpdGUgXCJ7MX1cIi4gQ2Fubm90IGZpbmQgZmVhdHVyZS4KK0NvbmZpZ3VyZWRTaXRlX0Nhbm5vdEZpbmRGZWF0dXJlVG9Db25maWd1cmU9IEludGVybmFsIEVycm9yLiBVbmFibGUgdG8gZW5hYmxlIGZlYXR1cmUgXCJ7MH1cIi4gQ2Fubm90IGZpbmQgZmVhdHVyZS4KK0NvbmZpZ3VyZWRTaXRlX0Nhbm5vdEZpbmRQbHVnaW5FbnRyeT0gVW5hYmxlIHRvIHJldHJpZXZlIFBsdWctaW4gRW50cnkgXCJ7MH1cIiBvbiBzaXRlIFwiezF9XCIuIENhbm5vdCBmaW5kIHBsdWctaW4gZW50cnkuIERvIHlvdSB3YW50IHRvIENvbnRpbnVlID8KK0NvbmZpZ3VyZWRTaXRlX01pc3NpbmdQbHVnaW5zQnJva2VuRmVhdHVyZT0gUGx1Zy1pbiBcInswfVwiIHZlcnNpb24gXCJ7MX1cIiByZWZlcmVuY2VkIGJ5IHRoaXMgZmVhdHVyZSBpcyBtaXNzaW5nLgorQ29uZmlndXJlZFNpdGVfVW5hYmxlVG9SZW1vdmVDb25maWd1cmVkRmVhdHVyZT0gVW5hYmxlIHRvIHJlbW92ZSBhIGVuYWJsZWQgZmVhdHVyZTogXCJ7MH1cIiBZb3UgbXVzdCBkaXNhYmxlIHRoZSBmZWF0dXJlIGZpcnN0LgorQ29uZmlndXJlZFNpdGVfVW5hYmxlVG9GaW5kRmVhdHVyZT0gVW5hYmxlIHRvIEZpbmQgdGhlIGZlYXR1cmUgXCJ7MH1cIiBvbiB0aGlzIHNpdGUuCitDb25maWd1cmVkU2l0ZV9TaXRlVVJMTnVsbD1UaGUgU2l0ZSBVUkwgaXMgbnVsbC4KK0NvbmZpZ3VyZWRTaXRlX05vbkxvY2FsU2l0ZT1UaGUgU2l0ZSBpcyBub3Qgb24gdGhlIGxvY2FsIGZpbGUgc3lzdGVtLiBDYW5ub3QgdmFsaWRhdGUuCitDb25maWd1cmVkU2l0ZV9Ob3RTYW1lUHJvZHVjdElkPVRoZSBzaXRlIGNhbm5vdCBiZSBtb2RpZmllZCBieSB0aGlzIHByb2R1Y3QuIEl0IGlzIGFscmVhZHkgYXNzb2NpYXRlZCB3aXRoIHByb2R1Y3Q6IFwiezB9XCIuCitDb25maWd1cmVkU2l0ZV9Db250YWluZWRJbkFub3RoZXJTaXRlPVRoaXMgc2l0ZSBpcyBjb250YWluZWQgaW4gYW5vdGhlciBzaXRlOiBcInswfVwiLgorQ29uZmlndXJlZFNpdGVfUmVhZE9ubHlTaXRlPVRoZSBzaXRlIGlzIG1hcmtlZCBhcyByZWFkIG9ubHkuCitDb25maWd1cmVkU2l0ZV9VbmFibGVSZXNvbHZlVVJMPSBJbnRlcm5hbCBFcnJvci4gVW5hYmxlIHRvIHJlc29sdmUgVVJMIFwiezB9XCIuCitDb25maWd1cmVkU2l0ZV9VbmFibGVUb0FjY2Vzc1NpdGU9IEludGVybmFsIEVycm9yLiBVbmFibGUgdG8gYWNjZXNzIHBsYXRmb3JtIHNpdGUgXCJ7MH1cIi4KK0ZlYXR1cmVGYWN0b3J5X0NyZWF0aW5nRXJyb3I9IEVycm9yIGNyZWF0aW5nIGZlYXR1cmUgXCJ7MH1cIi4KK0ZlYXR1cmVNb2RlbEZhY3RvcnlfRXJyb3JBY2Nlc2luZ0ZlYXR1cmVTdHJlYW09IEVycm9yIGFjY2Vzc2luZyBmZWF0dXJlIHN0cmVhbS4KK0ZlYXR1cmVFeGVjdXRhYmxlRmFjdG9yeV9OdWxsVVJMPSBFcnJvciBjcmVhdGluZyBmZWF0dXJlLiBUaGUgVVJMIHVzZWQgdG8gY3JlYXRlIHRoZSBmZWF0dXJlIGlzIG51bGwuCitGZWF0dXJlRXhlY3V0YWJsZUZhY3RvcnlfQ2Fubm90Q3JlYXRlVVJMPSBFcnJvciBjcmVhdGluZyBmZWF0dXJlLiBVbmFibGUgdG8gY3JlYXRlIFVSTCBmb3IgXCJ7MH1cIi4KK0ZlYXR1cmVQYWNrYWdlZENvbnRlbnRQcm92aWRlcl9Ob01hbmlmZXN0RmlsZT0gVW5hYmxlIHRvIHJldHJpZXZlIFwiezB9XCIgaW4gZmVhdHVyZSBsb2NhdGVkIGF0IFwiezF9XCIuCitGZWF0dXJlUGFja2FnZWRDb250ZW50UHJvdmlkZXJfSW52YWxpZERpcmVjdG9yeT0gVGhlIGRpcmVjdG9yeSBcInswfVwiIGlzIG5vdCBhIHZhbGlkIGRpcmVjdG9yeS4KK0ZlYXR1cmVQYWNrYWdlZENvbnRlbnRQcm92aWRlcl9FcnJvclJldHJpZXZpbmc9IEVycm9yIHJldHJpZXZpbmcgXCJ7MH1cIi4KK0ZlYXR1cmVSZWZlcmVuY2VfVW5hYmxlVG9SZXNvbHZlVVJMPSBJbnRlcm5hbCBFcnJvcjogVW5hYmxlIHRvIHJlc29sdmUgbW9kZWwgdXNpbmcgVVJMOiBcInswfVwiLgorRmVhdHVyZVR5cGVGYWN0b3J5X1VuYWJsZVRvRmluZEZlYXR1cmVGYWN0b3J5PSBVbmFibGUgdG8gZmluZCBhIGZlYXR1cmUgZmFjdG9yeSBmb3IgdGhlIGV4dGVuc2lvbiBpZCBcInswfVwiLgorSW5zdGFsbENvbmZpZ3VyYXRpb25fVW5hYmxlVG9DcmVhdGVVUkw9IFVuYWJsZSB0byBjcmVhdGUgVVJMIGZyb20gXCJ7MH1cIi4KK0luc3RhbGxDb25maWd1cmF0aW9uX1VuYWJsZVRvQ2FzdD0gSW50ZXJuYWwgRXJyb3IuIFRoZSBDb25maWd1cmF0aW9uIFNpdGUgb2JqZWN0IGlzIG5vdCBhIHN1YmNsYXNzIG9mIENvbmZpZ3VyZWRTaXRlTW9kZWwKK0luc3RhbGxDb25maWd1cmF0aW9uX1VuYWJsZVRvU2F2ZVBsYXRmb3JtQ29uZmlndXJhdGlvbj1VbmFibGUgdG8gc2F2ZSBwbGF0Zm9ybSBjb25maWd1cmF0aW9uIGluIFwiezB9XCIuCitJbnN0YWxsQ29uZmlndXJhdGlvbl9BbHJlYWR5TmF0aXZlbHlMaW5rZWQ9VGhlIHNpdGUgaXMgYWxyZWFkeSBsaW5rZWQuCitJbnN0YWxsQ29uZmlndXJhdGlvbl9BbHJlYWR5UHJvZHVjdFNpdGU9VGhlIGxvY2F0aW9uIGlzIGFscmVhZHkgYSBwcm9kdWN0IHNpdGUuCitJbnN0YWxsQ29uZmlndXJhdGlvbl91bmFibGVUb0ZpbmRTaXRlPVVuYWJsZSB0byBmaW5kIHNpdGUgezB9IGluIHBsYXRmb3JtIGNvbmZpZ3VyYXRpb24gezF9LgorSW50ZXJuYWxTaXRlTWFuYWdlcl9VbmFibGVUb0NyZWF0ZVNpdGVXaXRoVHlwZT0gRXh0ZW5zaW9uIEVycm9yLiBUaGUgU2l0ZSBGYWN0b3J5IG9mIHR5cGUgXCJ7MH1cIiBjYW5ub3QgYWNjZXNzIHRoZSBTaXRlIFwiezF9XCIuCitJbnRlcm5hbFNpdGVNYW5hZ2VyX1VuYWJsZVRvQWNjZXNzVVJMPSBVbmFibGUgdG8gYWNjZXNzIFwiezB9XCIuCitJbnRlcm5hbFNpdGVNYW5hZ2VyX1VuYWJsZVRvQ3JlYXRlVVJMPSBVbmFibGUgdG8gY3JlYXRlIFVSTCBmcm9tIFwiezB9XCIuCitJbnRlcm5hbFNpdGVNYW5hZ2VyX0ZhaWxlZFJldHJ5QWNjZXNzaW5nU2l0ZT0gRmFpbGVkIHJldHJ5IGFjY2Vzc2luZyBzaXRlIHVzaW5nIGRlZmF1bHQgaW5zdGFsbGVkIGZvcm1hdCBpbnN0ZWFkIG9mIGRlZmF1bHQgcGFja2FnZWQgZm9ybWF0LgorSW50ZXJuYWxTaXRlTWFuYWdlcl9Db25uZWN0aW5nVG9TaXRlID0gQ29ubmVjdGluZyBUbyBTaXRlLi4uCitHbG9iYWxDb25zdW1lcl9FcnJvckNyZWF0aW5nRmlsZT0gVW5hYmxlIHRvIGNyZWF0ZSBmaWxlIFwiezB9XCIuCitTaXRlRmlsZUNvbnRlbnRDb25zdW1lcl9VbmFibGVUb0NyZWF0ZVVSTD0gVW5hYmxlIHRvIGNyZWF0ZSBVUkwgZnJvbSBcInswfVwiLgorU2l0ZUZpbGVDb250ZW50Q29uc3VtZXJfVW5hYmxlVG9DcmVhdGVVUkxGb3JGaWxlPSBVbmFibGUgdG8gY3JlYXRlIFVSTCBmb3IgdGhlIGZpbGUgXCJ7MH1cIi4KK1NpdGVGaWxlQ29udGVudENvbnN1bWVyX3VuYWJsZVRvRGVsZXRlPVVuYWJsZSB0byBkZWxldGUgezB9CitDb250ZW50Q29uc3VtZXJfVW5hYmxlVG9SZW5hbWUgPSBJbnRlcm5hbCBFcnJvci4gVW5hYmxlIHRvIHJlbmFtZSBcInswfVwiIHRvIFwiezF9XCIuCitTaXRlRmlsZUZhY3RvcnlfVW5hYmxlVG9PYnRhaW5QYXJlbnREaXJlY3Rvcnk9IFVuYWJsZSBvYnRhaW4gdGhlIHBhcmVudCBkaXJlY3RvcnkgZnJvbSB0aGUgZmlsZSBcInswfVwiLgorU2l0ZUZpbGVGYWN0b3J5X0ZpbGVEb2VzTm90RXhpc3Q9IFVuYWJsZSB0byBhY2Nlc3Mgc2l0ZSBcInswfVwiLiBUaGUgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0LgorU2l0ZUZpbGVGYWN0b3J5X1VuYWJsZVRvQ3JlYXRlVVJMRm9yRmlsZT0gVW5hYmxlIHRvIGNyZWF0ZSBVUkwgZnJvbSBcInswfVwiLgorU2l0ZUZpbGVGYWN0b3J5X0Vycm9yUGFyc2luZ0ZpbGU9IFVuYWJsZSB0byBwYXJzZSBmaWxlIFwiezB9XCIuCitTaXRlRmlsZUZhY3RvcnlfRXJyb3JBY2Nlc3Npbmc9IFVuYWJsZSB0byBhY2Nlc3MgZmlsZSBcInswfVwiLgorU2l0ZVR5cGVGYWN0b3J5X1VuYWJsZVRvRmluZFNpdGVGYWN0b3J5PSBVbmFibGUgdG8gZmluZCBhIHNpdGUgZmFjdG9yeSBmb3IgdGhlIGV4dGVuc2lvbiBpZCBcInswfVwiLgorVXBkYXRlTWFuYWdlclV0aWxzX1VuYWJsZVRvUmVtb3ZlRmlsZT0gVW5hYmxlIHRvIHJlbW92ZSBcInswfVwiIGZyb20gdGhlIGZpbGUgc3lzdGVtLgorVXBkYXRlTWFuYWdlclV0aWxzX0ZpbGVBbHJlYWR5RXhpc3RzPSBVbmFibGUgdG8gY3JlYXRlIFwiezB9XCIgb24gdGhlIGZpbGUgc3lzdGVtLiBGaWxlIGFscmVhZHkgZXhpc3RzLgorU2l0ZUxvY2FsX1VuYWJsZVRvQ3JlYXRlVVJMRm9yPSBVbmFibGUgdG8gY3JlYXRlIFVSTCBmcm9tIFwiezB9XCIuCitTaXRlTG9jYWxfVW5hYmxlVG9EZXRlcm1pbmVGZWF0dXJlU3RhdHVzU2l0ZU51bGw9VW5hYmxlIHRvIGRldGVybWluZSBzdGF0dXMgb2YgZmVhdHVyZVwiezB9XCIgVGhlIHNpdGUgaXMgTlVMTC4KK1NpdGVMb2NhbF9Ud29WZXJzaW9uU2FtZVBsdWdpbjE9UGx1Zy1pbjogXCJ7MH1cIiB2ZXJzaW9uOiBcInsxfVwiIHJlZmVyZW5jZWQgYnkgdGhpcyBmZWF0dXJlIGlzIG5vdCBpbmNsdWRlZCBhdCBydW50aW1lLiBSdW50aW1lIGluY2x1ZGVzIHBsdWctaW4gdmVyc2lvbiBcInsyfVwiLgorU2l0ZUxvY2FsX1R3b1ZlcnNpb25TYW1lUGx1Z2luMj1QbHVnLWluOiBcInswfVwiIHZlcnNpb246IFwiezF9XCIgcmVmZXJlbmNlZCBieSB0aGlzIGZlYXR1cmUgaXMgbm90IGluY2x1ZGVkIGF0IHJ1bnRpbWUuIFJ1bnRpbWUgaW5jbHVkZXMgcGx1Zy1pbiB2ZXJzaW9uIFwiezJ9XCIgc3VwcGxpZWQgYnkgZmVhdHVyZSBcInszfVwiIHZlcnNpb24gXCJ7NH1cIi4KK1NpdGVMb2NhbF9GZWF0dXJlVW5IYXBweT1UaGUgZmVhdHVyZSBpcyBub3QgY29uZmlndXJlZCBwcm9wZXJseS4KK1NpdGVMb2NhbF9GZWF0dXJlSGFwcHk9VGhlIGZlYXR1cmUgaXMgY29uZmlndXJlZCBwcm9wZXJseS4KK1NpdGVMb2NhbF9GZWF0dXJlQW1iaWd1b3VzPVRoZSBmZWF0dXJlIG1heSBub3QgYmUgY29uZmlndXJlZCBwcm9wZXJseS4KK1NpdGVMb2NhbF9OZXN0ZWRGZWF0dXJlVW5IYXBweT1JbmNsdWRlZCBmZWF0dXJlIFwiezB9XCIgdmVyc2lvbiBcInsxfVwiIGNvbnRhaW5zIHByb2JsZW1zLgorU2l0ZUxvY2FsX05lc3RlZEZlYXR1cmVVbmF2YWlsYWJsZT1JbmNsdWRlZCBmZWF0dXJlIFwiezB9XCIgaXMgbWlzc2luZy4KK1NpdGVMb2NhbF9Ob1BsdWdpblZlcnNpb249Tm8gcGx1Zy1pbjogXCJ7MH1cIiBpbmNsdWRlZCBhdCBydW50aW1lLgorU2l0ZUxvY2FsX1VuYWJsZVRvRGV0ZXJtaW5lRmVhdHVyZVN0YXR1c0NvbmZpZ3VyZWRTaXRlTnVsbD1VbmFibGUgdG8gZGV0ZXJtaW5lIHN0YXR1cyBvZiBmZWF0dXJlXCJ7MH1cIiBUaGUgQ29uZmlndXJlZCBTaXRlIGlzIE5VTEwuCitTaXRlTG9jYWxfRmVhdHVyZURpc2FibGU9VGhlIGZlYXR1cmUgaXMgZGlzYWJsZWQuCitTaXRlTG9jYWxfRmVhdHVyZVN0YXR1c1Vua25vd249VW5rbm93biBzdGF0ZS4KK1NpdGVMb2NhbF9OZXN0ZWRGZWF0dXJlRGlzYWJsZT1JbmNsdWRlZCBmZWF0dXJlIFwiezB9XCIgdmVyc2lvbiBcInsxfVwiIGlzIGRpc2FibGVkLgorU2l0ZVVSTEZhY3RvcnlfVW5hYmxlVG9DcmVhdGVVUkw9IEludGVybmFsIEVycm9yLiBVbmFibGUgdG8gY3JlYXRlIGEgVVJMIGZyb20gXCJ7MH1cIi4KK1NpdGVVUkxGYWN0b3J5X1VuYWJsZVRvQWNjZXNzU2l0ZVN0cmVhbT0gVW5hYmxlIHRvIGFjY2VzcyBzaXRlOiBcInswfVwiCitKYXJWZXJpZmllcl9WZXJpZnk9IFZlcmlmeWluZzogXCJ7MH1cIgorSmFyVmVyaWZpZXJfVW5hYmxlVG9GaW5kRW5jcnlwdGlvbj0gVW5hYmxlIHRvIGZpbmQgYWxnb3JpdGhtIHRvIHZlcmlmeSBpbnRlZ3JpdHkgb2YgS2V5U3RvcmUgXCJ7MH1cIi4KK0phclZlcmlmaWVyX1VuYWJsZVRvTG9hZENlcnRpZmljYXRlPSBVbmFibGUgdG8gbG9hZCBvbmUgb3IgbXVsdGlwbGVzIGNlcnRpZmljYXRlcyBpbiB0aGUgS2V5U3RvcmUgXCJ7MH1cIi4KK0phclZlcmlmaWVyX1VuYWJsZVRvRmluZFByb3ZpZGVyRm9yS2V5c3RvcmU9IFVuYWJsZSB0byBmaW5kIHByb3ZpZGVyIGZvciB0aGUgS2V5U3RvcmUgdHlwZSBcInswfVwiLgorSmFyVmVyaWZpZXJfS2V5U3RvcmVOb3RMb2FkZWQ9IEludGVybmFsIEVycm9yLiBLZXlTdG9yZSBub3QgSW5pdGlhbGl6ZWQvTG9hZGVkLgorSmFyVmVyaWZpZXJfVW5hYmxlVG9BY2Nlc3NKYXI9IFVuYWJsZSB0byBhY2Nlc3MgSkFSIGZpbGUgXCJ7MH1cIi4KK0phclZlcmlmaWVyX0ludmFsaWRGaWxlPSBUaGUgRmlsZSBcInswfVwiIGlzIG5vdCBhIHZhbGlkIEpBUiBmaWxlLiBJdCBkb2VzIG5vdCBjb250YWluIGEgTWFuaWZlc3QuCitKYXJWZXJpZmllcl9JbnZhbGlkSmFyPSBUaGUgRmlsZSBcInswfVwiIGlzIG5vdCBhIHZhbGlkIEpBUiBmaWxlLgorSmFyVmVyaWZpY2F0aW9uUmVzdWx0X1ZhbGlkQmV0d2Vlbj0gVmFsaWQgYmV0d2VlbiBcInswfVwiIGFuZCBcInsxfVwiLgorSmFyVmVyaWZpY2F0aW9uUmVzdWx0X0V4cGlyZWRDZXJ0aWZpY2F0ZT0gKiBFWFBJUkVEIENFUlRJRklDQVRFICoKK0phclZlcmlmaWNhdGlvblJlc3VsdF9DZXJ0aWZpY2F0ZU5vdFlldFZhbGlkPSAqIENFUlRJRklDQVRFIE5PVCBZRVQgVkFMSUQgKgorSmFyVmVyaWZpY2F0aW9uUmVzdWx0X0NlcnRpZmljYXRlVmFsaWQ9IFZhbGlkIGNlcnRpZmljYXRlLgorSmFyVmVyaWZpY2F0aW9uU2VydmljZV9VbnN1Y2Vzc2Z1bFZlcmlmaWNhdGlvbj1WZXJpZmljYXRpb24gb2YgZmVhdHVyZSB1bnN1Y2Nlc3NmdWwuIEluc3RhbGxhdGlvbiBjYW5jZWxsZWQuCitKYXJWZXJpZmljYXRpb25TZXJ2aWNlX0NhbmNlbEluc3RhbGw9SW5zdGFsbGF0aW9uIGNhbmNlbGxlZC4KK1VwZGF0ZU1hbmFnZXJVdGlsc19VbmFibGVUb0xvZz1VbmFibGUgdG8gYWNjZXNzIGVycm9yIHJlY292ZXJ5IGxvZyBmaWxlOiBcInswfVwiLgorQ29ubmVjdGlvblRocmVhZE1hbmFnZXJfdG9vTWFueUNvbm5lY3Rpb25zID0gVGhlcmUgYXJlIHRvbyBtYW55IG5ldHdvcmsgY29ubmVjdGlvbnMgc3RpbGwgYWN0aXZlLiBcCitJZiB5b3UgYXJlIGV4cGVyaWVuY2luZyBuZXR3b3JrIHByb2JsZW1zLCB0cnkgYWdhaW4gbGF0ZXIuIElmIHRoZSBlcnJvciBwZXJzaXN0cywgcmVzdGFydCB0aGUgXAorYXBwbGljYXRpb24uCitDb25uZWN0aW9uVGhyZWFkTWFuYWdlcl91bnJlc3BvbnNpdmVVUkwgPSBTdGlsbCB3YWl0aW5nIGZvciByZXNwb25zZTogezB9CitJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VfZmVhdHVyZVVuaW5zdGFsbGVkPSBGZWF0dXJlIHswfSBpcyB1bmluc3RhbGxlZC4KKworIyBQcm9wZXJ0aWVzIG1vdmVkIG1vc3RseSBmcm9tIHRoZSB1aSBwbHVnaW4KKworQWN0aXZpdHlDb25zdHJhaW50c193YXJuaW5nPVRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gY29udGFpbnMgZXJyb3JzIGFuZCB0aGlzIG9wZXJhdGlvbiBjYW4gaGF2ZSB1bnByZWRpY3RhYmxlIHJlc3VsdHMuCitBY3Rpdml0eUNvbnN0cmFpbnRzX3Jvb3RNZXNzYWdlID0gUmVxdWVzdGVkIG9wZXJhdGlvbiBjYW5ub3QgYmUgcGVyZm9ybWVkIGJlY2F1c2UgaXQgd291bGQgaW52YWxpZGF0ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLiBTZWUgZGV0YWlscyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KK0FjdGl2aXR5Q29uc3RyYWludHNfcm9vdE1lc3NhZ2VJbml0aWFsID0gQ3VycmVudCBjb25maWd1cmF0aW9uIGNvbnRhaW5zIGVycm9ycyB0aGF0IGFyZSBub3QgY29ycmVjdGVkIGJ5IHRoZSByZXF1ZXN0ZWQgb3BlcmF0aW9uIGFuZCBtb3JlIGVycm9ycyB3b3VsZCBiZSBpbnRyb2R1Y2VkLiBTZWUgZGV0YWlscyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KK0FjdGl2aXR5Q29uc3RyYWludHNfYmVmb3JlTWVzc2FnZSA9IC0tLS0tIEN1cnJlbnQgY29uZmlndXJhdGlvbiBwcm9ibGVtcyAtLS0tLQorQWN0aXZpdHlDb25zdHJhaW50c19hZnRlck1lc3NhZ2UgPSAtLS0tLSBDb25maWd1cmF0aW9uIHByb2JsZW1zIGFmdGVyIHRoZSBvcGVyYXRpb24gLS0tLS0KK0FjdGl2aXR5Q29uc3RyYWludHNfcGxhdGZvcm0gPSBSZXN1bHRpbmcgY29uZmlndXJhdGlvbiBkb2VzIG5vdCBjb250YWluIHRoZSBwbGF0Zm9ybS4KK0FjdGl2aXR5Q29uc3RyYWludHNfcHJpbWFyeSA9IFJlc3VsdGluZyBjb25maWd1cmF0aW9uIGRvZXMgbm90IGNvbnRhaW4gdGhlIHByaW1hcnkgZmVhdHVyZS4KK0FjdGl2aXR5Q29uc3RhaW50c19wcmVyZXFfcGx1Z2luID0gcGx1Zy1pbgorQWN0aXZpdHlDb25zdGFpbnRzX3ByZXJlcV9mZWF0dXJlID0gZmVhdHVyZQorQWN0aXZpdHlDb25zdHJhaW50c19wcmVyZXEgPSByZXF1aXJlcyB7MH0gInsxfSIuCitBY3Rpdml0eUNvbnN0cmFpbnRzX3ByZXJlcVBlcmZlY3QgPSByZXF1aXJlcyB7MH0gInsxfSAoezJ9KSIuCitBY3Rpdml0eUNvbnN0cmFpbnRzX3ByZXJlcUVxdWl2YWxlbnQgPSByZXF1aXJlcyB7MH0gInsxfSAoezJ9KSIsIG9yIGVxdWl2YWxlbnQuCitBY3Rpdml0eUNvbnN0cmFpbnRzX3ByZXJlcUNvbXBhdGlibGUgPSByZXF1aXJlcyB7MH0gInsxfSAoezJ9KSIsIG9yIGNvbXBhdGlibGUuCitBY3Rpdml0eUNvbnN0cmFpbnRzX3ByZXJlcUdyZWF0ZXJPckVxdWFsID0gcmVxdWlyZXMgezB9ICJ7MX0gKHsyfSkiLCBvciBsYXRlciB2ZXJzaW9uLgorQWN0aXZpdHlDb25zdHJhaW50c19vcyA9IG9wZXJhdGluZyBzeXN0ZW0gZG9lcyBub3QgbWF0Y2ggY3VycmVudCBlbnZpcm9ubWVudC4KK0FjdGl2aXR5Q29uc3RyYWludHNfd3MgPSB3aW5kb3dpbmcgc3lzdGVtIGRvZXMgbm90IG1hdGNoIGN1cnJlbnQgZW52aXJvbm1lbnQuCitBY3Rpdml0eUNvbnN0cmFpbnRzX2FyY2ggPSBwbGF0Zm9ybSBhcmNoaXRlY3R1cmUgZG9lcyBub3QgbWF0Y2ggY3VycmVudCBlbnZpcm9ubWVudC4KK0FjdGl2aXR5Q29uc3RyYWludHNfY3ljbGUgPSBkZWZpbml0aW9uIGNvbnRhaW5zIGEgbmVzdGVkIGZlYXR1cmVzIGN5Y2xlOiB7MH1fezF9cHJlcmVxCitBY3Rpdml0eUNvbnN0cmFpbnRzX2NoaWxkTWVzc2FnZSA9IHswfSAoezF9KSB7Mn0KK0FjdGl2aXR5Q29uc3RyYWludHNfb3B0aW9uYWxDaGlsZCA9IEZlYXR1cmUgaW5jbHVkZWQgaW4gYW5vdGhlciBmZWF0dXJlIGNhbm5vdCBiZSBlbmFibGVkIGlmIHRoZSBwYXJlbnQgaXMgZGlzYWJsZWQuIEVuYWJsZSB0aGUgcGFyZW50IGZpcnN0LgorQWN0aXZpdHlDb25zdHJhaW50c19leGNsdXNpdmUgPSBtdXN0IGJlIHByb2Nlc3NlZCBzZXBhcmF0ZWx5IGZyb20gb3RoZXIgZmVhdHVyZXMuCitBY3Rpdml0eUNvbnN0cmFpbnRzX25vTGljZW5zZSA9IGRvZXMgbm90IGhhdmUgYSB2YWxpZCBsaWNlbnNlIGFncmVlbWVudC4KK0FjdGl2aXR5Q29uc3RyYWludHNfcmVhZE9ubHkgPSBUaGUgc2l0ZSBpcyBub3QgdXBkYXRlYWJsZTogezB9LgorQWN0aXZpdHlDb25zdHJhaW50c19wbGF0Zm9ybU1vZGlmaWVkID0gUGxhdGZvcm0gY29uZmlndXJhdGlvbiBoYXMgYmVlbiBtb2RpZmllZCBvdXRzaWRlIHRoaXMgcHJvZ3JhbS4gQSByZXN0YXJ0IGlzIHJlY29tbWVuZGVkLgorRHVwbGljYXRlQ29uZmxpY3RzRGlhbG9nX2NvbmZsaWN0ID0gVmVyc2lvbiB7MH0gaW4gezF9CitPcGVyYXRpb25zTWFuYWdlcl9lcnJvcl9vbGQ9IHswfTogRXJyb3Igd2hpbGUgdXBkYXRpbmcgdGhlIG9sZCBmZWF0dXJlIHZlcnNpb24KK09wZXJhdGlvbnNNYW5hZ2VyX2luc3RhbGxpbmc9SW5pdGlhbGl6aW5nLi4uCitPcGVyYXRpb25zTWFuYWdlcl9lcnJvcl91bmluc3RhbGw9IHswfSA6IEVycm9yIHdoaWxlIHVuaW5zdGFsbGluZyBmZWF0dXJlCitTZWFyY2hfbmV0d29ya1Byb2JsZW1zPU5ldHdvcmsgY29ubmVjdGlvbiBwcm9ibGVtcyBlbmNvdW50ZXJlZCBkdXJpbmcgc2VhcmNoLgorSW5zdGFsbENvbmZpZ3VyYXRpb25fbG9jYXRpb25fZXhpc3RzID0gU2l0ZSBhbHJlYWR5IGV4aXN0cy4KK0luc3RhbGxMb2dQYXJzZXJfZXJyb3JzID0gRXJyb3JzIGdlbmVyYXRlZCB3aGlsZSBwYXJzaW5nIGluc3RhbGxhdGlvbiBoaXN0b3J5IGZpbGUuCitTaXRlTG9jYWxfY2xvbmVDb25maWc9RXJyb3IgY2xvbm5pbmcgY3VycmVudCBjb25maWd1cmF0aW9uLgorCitVbmluc3RhbGxDb21tYW5kX2ZlYXR1cmVOb3RJbnN0YWxsZWRCeVVNPUZlYXR1cmUgbm90IGluc3RhbGxlZCBieSBVcGRhdGUgTWFuYWdlcjogezB9CisKK1VwZGF0ZU1hbmFnZXJVdGlsc19pbnB1dFN0cmVhbUVuZGVkPUlucHV0U3RyZWFtIGVuZGVkIGFmdGVyIHswfSBieXRlcyAoZXhwZWN0ZWQgezF9ICkKK1VwZGF0ZVNlYXJjaFJlcXVlc3RfbG9hZGluZ1BvbGljeT1Mb2FkaW5nIHVwZGF0ZSBwb2xpY3kgLi4uCitVcGRhdGVNYW5hZ2VyVXRpbHNfY29weT1VcGRhdGVNYW5hZ2VyVXRpbHMgY29weSgpIGF0IG9mZnNldDoKK1VwZGF0ZVBvbGljeV9wYXJzZVBvbGljeT1FcnJvcnMgd2hpbGUgcGFyc2luZyB1cGRhdGUgcG9saWN5CitVcGRhdGVQb2xpY3lfcG9saWN5RXhwZWN0ZWQ9JyBpcyBleHBlY3RlZC4KK1VwZGF0ZVNlYXJjaFJlcXVlc3Rfc2VhcmNoaW5nPVNlYXJjaGluZy4uLgorVXBkYXRlU2VhcmNoUmVxdWVzdF9jb250YWN0aW5nPUNvbnRhY3RpbmcgezB9IC4uLgorVXBkYXRlU2VhcmNoUmVxdWVzdF9jaGVja2luZz1DaGVja2luZyB7MH0gLi4uCitVcGRhdGVQb2xpY3lfaW52YWxpZFVSTD1pbnZhbGlkIFVSTCAtCitVcGRhdGVQb2xpY3lfbmFtZU5vTnVsbD0gY2Fubm90IGJlIG51bGwuCitVcGRhdGVQb2xpY3lfVXBkYXRlUG9saWN5PVVwZGF0ZSBQb2xpY3k6CitTaXRlRmlsZV9mZWF0dXJlTm90UmVtb3ZlZD1GZWF0dXJlIHswfSB3YXMgbm90IHJlbW92ZWQKK1NpdGVGaWxlX3BsdWdpbk5vdFJlbW92ZWQ9UGx1Z2luIHswfSB3YXMgbm90IHJlbW92ZWQKK0Vycm9yUmVjb3ZlcnlMb2dfbm9GaWxldG9SZW1vdmU9VW5hYmxlIHRvIGZpbmQgZmlsZSB0byByZW1vdmU6CitVcGRhdGVzU2VhcmNoQ2F0ZWdvcnlfZXJyb3JTZWFyY2hpbmdGb3JVcGRhdGVzPUVycm9yIHdoaWxlIGluaXRpYWxpemluZyB0aGUgc2VhcmNoIGZvciBuZXcgdXBkYXRlcworU3RhbmRhbG9uZV9zaXRlQ29uZmlndXJlZD1TaXRlIGlzIGFscmVhZHkgY29uZmlndXJlZDoKK1N0YW5kYWxvbmVfbm9TaXRlPUNhbm5vdCBmaW5kIHNpdGU6CitTdGFuZGFsb25lX25vU2l0ZTM9Tm8gc2l0ZSBzcGVjaWZpZWQKK1N0YW5kYWxvbmVfbm9Db25maWd1cmVkU2l0ZT1DYW5ub3QgZmluZCBjb25maWd1cmVkIHNpdGU6CitTdGFuZGFsb25lX2luc3RhbGxpbmc9SW5zdGFsbGluZyBmZWF0dXJlCitTdGFuZGFsb25lX25vdEZvdW5kT3JOZXdlcj1GZWF0dXJlIHswfSBjYW5ub3QgYmUgZm91bmQgb24gezF9IFxub3IgYSBuZXdlciB2ZXJzaW9uIGlzIGFscmVhZHkgaW5zdGFsbGVkLgorU3RhbmRhbG9uZV9kdXBsaWNhdGU9RHVwbGljYXRlIGNvbmZsaWN0cworU3RhbmRhbG9uZV9pbnN0YWxsZWQ9IEZlYXR1cmUgezB9IGhhcyBzdWNjZXNzZnVsbHkgYmVlbiBpbnN0YWxsZWQKK1N0YW5kYWxvbmVfY2Fubm90SW5zdGFsbD1DYW5ub3QgaW5zdGFsbCBmZWF0dXJlCitTdGFuZGFsb25lX25vRmVhdHVyZXMxPVRoZXJlIGFyZSBubyB1bmNvbmZpZ3VyZWQgZmVhdHVyZXMgd2l0aCBpZCB7MH0KK1N0YW5kYWxvbmVfbm9GZWF0dXJlczI9Q2Fubm90IGZpbmQgdW5jb25maWd1cmVkIGZlYXR1cmUgIHswfSB3aXRoIHZlcnNpb24gezF9CitTdGFuZGFsb25lX25vRmVhdHVyZXMzPVRoZXJlIGFyZSBubyBjb25maWd1cmVkIGZlYXR1cmVzIHdpdGggaWQgezB9CitTdGFuZGFsb25lX25vRmVhdHVyZXM0PUNhbm5vdCBmaW5kIGNvbmZpZ3VyZWQgZmVhdHVyZSAgezB9IHdpdGggdmVyc2lvbiB7MX0KK1N0YW5kYWxvbmVfbm9Db25maWdTaXRlRm9yRmVhdHVyZT1UaGVyZSBhcmUgbm8gY29uZmlndXJlZCBzaXRlcyBmb3IgZmVhdHVyZSB7MH0KK1N0YW5kYWxvbmVfaW52YWxpZENtZD1JbnZhbGlkIGNvbW1hbmQ6CitTdGFuZGFsb25lX2Nvbm5lY3Rpb24gPSBDb25uZWN0aW9uIGVycm9yCitTdGFuZGFsb25lX3NlYXJjaGluZyA9IFNlYXJjaGluZyBvbjoKK1N0YW5kYWxvbmVfY21kRmFpbGVkID0gQ29tbWFuZCBmYWlsZWQuIFBsZWFzZSBjaGVjayBsb2cgZmlsZSB7MH0gZm9yIGRldGFpbHMuCitTdGFuZGFsb25lX2NtZEZhaWxlZE5vTG9nID0gQ29tbWFuZCBmYWlsZWQuCitTdGFuZGFsb25lX2NtZENvbXBsZXRlV2l0aEVycm9ycyA9IENvbW1hbmQgY29tcGxldGVkIHdpdGggZXJyb3JzLiBQbGVhc2UgY2hlY2sgbG9nIGZpbGUgezB9IGZvciBkZXRhaWxzLgorU3RhbmRhbG9uZV9jbWRPSyA9IENvbW1hbmQgY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4KK1N0YW5kYWxvbmVfdXBkYXRpbmcgPSBCZWdpbiB1cGRhdGluZworU3RhbmRhbG9uZV9ub1VwZGF0ZSA9IEZlYXR1cmUgezB9IGNhbm5vdCBiZSB1cGRhdGVkLgorU3RhbmRhbG9uZV91cGRhdGVkPSBGZWF0dXJlIHswfSBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gdXBkYXRlZC4KK1NpdGVGaWxlUGx1Z2luQ29udGVudENvbnN1bWVyX3VuYWJsZVRvRGVsZXRlPVVuYWJsZSB0byBkZWxldGUgezB9CitTaXRlRmlsZVBhY2tlZFBsdWdpbkNvbnRlbnRDb25zdW1lcl91bmFibGVUb0RlbGV0ZT1VbmFibGUgdG8gZGVsZXRlIHswfQorCitKYXJQcm9jZXNzb3JfdW5wYWNrTm90Rm91bmQgPSBUaGUgdW5wYWNrMjAwIGNvbW1hbmQgY2Fubm90IGJlIGZvdW5kLgorSmFyUHJvY2Vzc29yX25vUGFja1VucGFjayA9IFBhY2ssIHJlcGFjayBvciBzaWduIGNhbm5vdCBiZSBzcGVjaWZpZWQgd2l0aCB1bnBhY2suCitKYXJQcm9jZXNzb3JfcGFja05vdEZvdW5kID0gVGhlIHBhY2syMDAgY29tbWFuZCBjYW5ub3QgYmUgZm91bmQuCitTaXRlT3B0aW1pemVyX2lucHV0Tm90U3BlY2lmaWVkID0gTm8gaW5wdXQgZmlsZSB3YXMgc3BlY2lmaWVkOworU2l0ZU9wdGltaXplcl9pbnB1dEZpbGVOb3RGb3VuZCA9IFRoZSBpbnB1dCBmaWxlIFwiezB9XCIgd2FzIG5vdCBmb3VuZC4KKworSHR0cFJlc3BvbnNlX3JhbmdlRXhwZWN0ZWQgPSBTZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCByYW5nZXMuCitIdHRwUmVzcG9uc2Vfd3JvbmdSYW5nZSA9IFNlcnZlciByZXR1cm5lZCB3cm9uZyByYW5nZS4KK0RlZmF1bHRTaXRlUGFyc2VyX21pcnJvcnMgPSBFcnJvciBwcm9jZXNzaW5nIHVwZGF0ZSBzaXRlIG1pcnJvci4KK0ZlYXR1cmVFeGVjdXRhYmxlQ29udGVudFByb3ZpZGVyX1VuYWJsZVRvUmV0cml2ZUFyY2hpdmVDb250ZW50UmVmID0gVW5hYmxlIHRvIHJldHJpZXZlIGFyY2hpdmUgY29udGVudCByZWZlcmVuY2UKK1NpdGVDYXRlZ29yeV9vdGhlcl9sYWJlbCA9IE90aGVyCitTaXRlQ2F0ZWdvcnlfb3RoZXJfZGVzY3JpcHRpb24gPSBGZWF0dXJlcyBmb3VuZCB1bmRlciB0aGlzIGNhdGVnb3J5IGFyZSBlaXRoZXIgbm90IGNhdGVnb3JpemVkIG9yIHRoZWlyIGNhdGVnb3JpZXMgY291bGQgbm90IGJlIGZvdW5kIG9uIHNlcnZlci4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL21pcnJvci9NaXJyb3JDb21tYW5kLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9taXJyb3IvTWlycm9yQ29tbWFuZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliMDM5YzcKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9taXJyb3IvTWlycm9yQ29tbWFuZC5qYXZhCkBAIC0wLDAgKzEsMjQ2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm1pcnJvcjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luVmVyc2lvbklkZW50aWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVNpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVNpdGVGZWF0dXJlUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkphckNvbnRlbnRSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuU2l0ZUZlYXR1cmVSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuU2l0ZUZlYXR1cmVSZWZlcmVuY2VNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5TaXRlTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5VdGlsaXRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuVmVyc2lvbmVkSWRlbnRpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC5JbnZhbGlkU2l0ZVR5cGVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuVXBkYXRlQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuc3RhbmRhbG9uZS5TY3JpcHRlZENvbW1hbmQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnN0YW5kYWxvbmUuU3RhbmRhbG9uZVVwZGF0ZUFwcGxpY2F0aW9uOworCisvKioKKyAqIE1pcnJvcnMgYSByZW1vdGUgc2l0ZSBsb2NhbGx5LgorICovCitwdWJsaWMgY2xhc3MgTWlycm9yQ29tbWFuZCBleHRlbmRzIFNjcmlwdGVkQ29tbWFuZCB7CisKKwlwcml2YXRlIFN0cmluZyBmZWF0dXJlSWQ7CisJcHJpdmF0ZSBTdHJpbmcgZmVhdHVyZVZlcnNpb247CisJcHJpdmF0ZSBTdHJpbmcgZnJvbVNpdGVVcmw7CisJcHJpdmF0ZSBTdHJpbmcgdG9TaXRlRGlyOworCXByaXZhdGUgU3RyaW5nIG1pcnJvclVSTDsKKwlwcml2YXRlIGJvb2xlYW4gaWdub3JlTm9uUHJlc2VudFBsdWdpbnMgPSBmYWxzZTsKKwlwcml2YXRlIE1pcnJvclNpdGUgbWlycm9yU2l0ZTsKKworCXB1YmxpYyBNaXJyb3JDb21tYW5kKAorCQlTdHJpbmcgZmVhdHVyZUlkLAorCQlTdHJpbmcgZmVhdHVyZVZlcnNpb24sCisJCVN0cmluZyBmcm9tU2l0ZVVybCwKKwkJU3RyaW5nIHRvU2l0ZURpciwKKwkJU3RyaW5nIG1pcnJvclVybCwgCisJCVN0cmluZyBpZ25vcmVOb25QcmVzZW50UGx1Z2lucykgeworCQl0aGlzLmZlYXR1cmVJZCA9IGZlYXR1cmVJZDsKKwkJdGhpcy5mZWF0dXJlVmVyc2lvbiA9IGZlYXR1cmVWZXJzaW9uOworCQl0aGlzLmZyb21TaXRlVXJsID0gZnJvbVNpdGVVcmw7CisJCXRoaXMudG9TaXRlRGlyID0gdG9TaXRlRGlyOworCQl0aGlzLm1pcnJvclVSTCA9IG1pcnJvclVybDsKKwkJdGhpcy5pZ25vcmVOb25QcmVzZW50UGx1Z2lucyA9IChpZ25vcmVOb25QcmVzZW50UGx1Z2lucyAhPSBudWxsKSAmJiAoaWdub3JlTm9uUHJlc2VudFBsdWdpbnMuZXF1YWxzKCJ0cnVlIikpOyAvLyROT04tTkxTLTEkCisJfQorCisJLyoqCisJICogdHJ1ZSBpZiBzdWNjZXNzCisJICovCisJcHVibGljIGJvb2xlYW4gcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgeworCQlpZiAoIXZhbGlkYXRlUGFyYW1ldGVycygpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQl0cnkgeworCQkJaWYgKGdldE1pcnJvclNpdGUoKSA9PSBudWxsKQorCQkJCXJldHVybiBmYWxzZTsKKworCQkJVVJMIHJlbW90ZVNpdGVVcmwgPSBuZXcgVVJMKGZyb21TaXRlVXJsKTsKKwkJCUlTaXRlIHJlbW90ZVNpdGUgPQorCQkJCVNpdGVNYW5hZ2VyLmdldFNpdGUocmVtb3RlU2l0ZVVybCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7CisKKwkJCUlTaXRlRmVhdHVyZVJlZmVyZW5jZSBmZWF0dXJlUmVmZXJlbmNlc1RvTWlycm9yW10gPQorCQkJCWZpbmRGZWF0dXJlc1RvTWlycm9yKHJlbW90ZVNpdGUpOworCQkJaWYgKGZlYXR1cmVSZWZlcmVuY2VzVG9NaXJyb3IubGVuZ3RoID09IDApIHsKKwkJCQlTdGFuZGFsb25lVXBkYXRlQXBwbGljYXRpb24uZXhjZXB0aW9uTG9nZ2VkKCk7CisJCQkJVXBkYXRlQ29yZS5sb2coCisJCQkJCVV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKAorCQkJCQkJIk5vIG1hdGNoaW5nIGZlYXR1cmVzIGZvdW5kIG9uICIgKyByZW1vdGVTaXRlVXJsICsgIi4iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkJCW51bGwpKTsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisKKwkJCW1pcnJvclNpdGUubWlycm9yQW5kRXhwb3NlKAorCQkJCXJlbW90ZVNpdGUsCisJCQkJZmVhdHVyZVJlZmVyZW5jZXNUb01pcnJvciwKKwkJCQludWxsLAorCQkJCW1pcnJvclVSTCk7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKwkJCVN0YW5kYWxvbmVVcGRhdGVBcHBsaWNhdGlvbi5leGNlcHRpb25Mb2dnZWQoKTsKKwkJCVVwZGF0ZUNvcmUubG9nKGUpOworCQkJcmV0dXJuIGZhbHNlOworCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7CisJCQlTdGFuZGFsb25lVXBkYXRlQXBwbGljYXRpb24uZXhjZXB0aW9uTG9nZ2VkKCk7CisJCQlVcGRhdGVDb3JlLmxvZyhjZSk7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0gZmluYWxseSB7CisJCQlKYXJDb250ZW50UmVmZXJlbmNlLnNodXRkb3duKCk7CisJCX0KKwl9CisJcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRlUGFyYW1ldGVycygpIHsKKwkJaWYgKGZyb21TaXRlVXJsID09IG51bGwgfHwgZnJvbVNpdGVVcmwubGVuZ3RoKCkgPD0gMCkgeworCQkJU3RhbmRhbG9uZVVwZGF0ZUFwcGxpY2F0aW9uLmV4Y2VwdGlvbkxvZ2dlZCgpOworCQkJVXBkYXRlQ29yZS5sb2coCisJCQkJVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oImZyb20gcGFyYW1ldGVyIGlzIG1pc3NpbmcuIiwgbnVsbCkpOyAvLyROT04tTkxTLTEkCisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJdHJ5IHsKKwkJCW5ldyBVUkwoZnJvbVNpdGVVcmwpOworCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbXVlKSB7CisJCQlTdGFuZGFsb25lVXBkYXRlQXBwbGljYXRpb24uZXhjZXB0aW9uTG9nZ2VkKCk7CisJCQlVcGRhdGVDb3JlLmxvZygKKwkJCQlVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbigiZnJvbSBtdXN0IGJlIGEgdmFsaWQgVVJMIiwgbnVsbCkpOyAvLyROT04tTkxTLTEkCisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJaWYgKHRvU2l0ZURpciA9PSBudWxsIHx8IHRvU2l0ZURpci5sZW5ndGgoKSA8PSAwKSB7CisJCQlTdGFuZGFsb25lVXBkYXRlQXBwbGljYXRpb24uZXhjZXB0aW9uTG9nZ2VkKCk7CisJCQlVcGRhdGVDb3JlLmxvZygKKwkJCQlVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbigidG8gcGFyYW1ldGVyIGlzIG1pc3NpbmcuIiwgbnVsbCkpOyAvLyROT04tTkxTLTEkCisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCXByaXZhdGUgTWlycm9yU2l0ZSBnZXRNaXJyb3JTaXRlKCkKKwkJdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7CisJCS8vIENyZWF0ZSBtaXJyb3Igc2l0ZQorCQlpZiAobWlycm9yU2l0ZSA9PSBudWxsKSB7CisJCQlpZiAodG9TaXRlRGlyICE9IG51bGwpIHsKKwkJCQlNaXJyb3JTaXRlRmFjdG9yeSBmYWN0b3J5ID0gbmV3IE1pcnJvclNpdGVGYWN0b3J5KCk7CisJCQkJU3lzdGVtLm91dC5wcmludCgiQW5hbHl6aW5nIGZlYXR1cmVzIGFscmVhZHkgbWlycm9yZWQgLi4uIik7IC8vJE5PTi1OTFMtMSQKKwkJCQl0cnkgeworCQkJCQltaXJyb3JTaXRlID0KKwkJCQkJCShNaXJyb3JTaXRlKSBmYWN0b3J5LmNyZWF0ZVNpdGUobmV3IEZpbGUodG9TaXRlRGlyKSk7CisJCQkJCW1pcnJvclNpdGUuc2V0SWdub3JlTm9uUHJlc2VudFBsdWdpbnMoaWdub3JlTm9uUHJlc2VudFBsdWdpbnMpOworCQkJCX0gY2F0Y2ggKEludmFsaWRTaXRlVHlwZUV4Y2VwdGlvbiBpc3RlKSB7CisJCQkJfQorCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICBEb25lLiIpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCQlpZiAobWlycm9yU2l0ZSA9PSBudWxsKSB7CisJCQkJU3RhbmRhbG9uZVVwZGF0ZUFwcGxpY2F0aW9uLmV4Y2VwdGlvbkxvZ2dlZCgpOworCQkJCVVwZGF0ZUNvcmUubG9nKAorCQkJCQlVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbigKKwkJCQkJCSJNaXJyb3Igc2l0ZSBhdCAiICsgdG9TaXRlRGlyICsgIiBjYW5ub3QgYmUgYWNjZXNzZWQuIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJCQludWxsKSk7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCX0KKwkJcmV0dXJuIG1pcnJvclNpdGU7CisKKwl9CisJLyoqCisJICogUmV0dXJucyBzdWJzZXQgb2YgZmVhdHVyZSByZWZlcmVuY2VzIG9uIHJlbW90ZSBzaXRlCisJICogYXMgc3BlY2lmaWVkIGJ5IG9wdGlvbmFsIGZlYXR1cmVJZCBhbmQgZmVhdHVyZVZlcnNpb24KKwkgKiBwYXJhbWV0ZXJzCisJICogQHBhcmFtIHJlbW90ZVNpdGUKKwkgKiBAcmV0dXJuIElTaXRlRmVhdHVyZVJlZmVyZW5jZVtdCisJICogQHRocm93cyBDb3JlRXhjZXB0aW9uCisJICovCisJcHJpdmF0ZSBJU2l0ZUZlYXR1cmVSZWZlcmVuY2VbXSBmaW5kRmVhdHVyZXNUb01pcnJvcihJU2l0ZSByZW1vdGVTaXRlKQorCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCUlTaXRlRmVhdHVyZVJlZmVyZW5jZSByZW1vdGVTaXRlRmVhdHVyZVJlZmVyZW5jZXNbXSA9CisJCQlyZW1vdGVTaXRlLmdldFJhd0ZlYXR1cmVSZWZlcmVuY2VzKCk7CisJCVNpdGVGZWF0dXJlUmVmZXJlbmNlTW9kZWwgZXhpc3RpbmdGZWF0dXJlTW9kZWxzW10gPQorCQkJbWlycm9yU2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlTW9kZWxzKCk7CisJCUNvbGxlY3Rpb24gZmVhdHVyZVJlZmVyZW5jZXNUb01pcnJvciA9IG5ldyBBcnJheUxpc3QoKTsKKworCQlQbHVnaW5WZXJzaW9uSWRlbnRpZmllciBmZWF0dXJlVmVyc2lvbklkZW50aWZpZXIgPSBudWxsOworCisJCWlmIChmZWF0dXJlSWQgPT0gbnVsbCkgeworCQkJU3lzdGVtLm91dC5wcmludGxuKAorCQkJCSJQYXJhbWV0ZXIgZmVhdHVyZSBub3Qgc3BlY2lmaWVkLiAgQWxsIGZlYXR1cmVzIG9uIHRoZSByZW1vdGUgc2l0ZSB3aWxsIGJlIG1pcnJvcmVkLiIpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJaWYgKGZlYXR1cmVWZXJzaW9uID09IG51bGwpIHsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigKKwkJCQkiUGFyYW1ldGVyIHZlcnNpb24gbm90IHNwZWNpZmllZC4gIEFsbCB2ZXJzaW9ucyBvZiBmZWF0dXJlcyBvbiB0aGUgcmVtb3RlIHNpdGUgd2lsbCBiZSBtaXJyb3JlZC4iKTsgLy8kTk9OLU5MUy0xJAorCQl9IGVsc2UgeworCQkJZmVhdHVyZVZlcnNpb25JZGVudGlmaWVyID0KKwkJCQluZXcgUGx1Z2luVmVyc2lvbklkZW50aWZpZXIoZmVhdHVyZVZlcnNpb24pOworCQl9CisJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVtb3RlU2l0ZUZlYXR1cmVSZWZlcmVuY2VzLmxlbmd0aDsgaSsrKSB7CisJCQlWZXJzaW9uZWRJZGVudGlmaWVyIHJlbW90ZUZlYXR1cmVWZXJzaW9uZWRJZGVudGlmaWVyID0KKwkJCQlyZW1vdGVTaXRlRmVhdHVyZVJlZmVyZW5jZXNbaV0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOworCisJCQlpZiAoZmVhdHVyZUlkICE9IG51bGwKKwkJCQkmJiAhZmVhdHVyZUlkLmVxdWFscygKKwkJCQkJcmVtb3RlRmVhdHVyZVZlcnNpb25lZElkZW50aWZpZXIuZ2V0SWRlbnRpZmllcigpKSkgeworCQkJCS8vIGlkIGRvZXMgbm90IG1hdGNoCisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoZmVhdHVyZVZlcnNpb25JZGVudGlmaWVyICE9IG51bGwKKwkJCQkmJiAhZmVhdHVyZVZlcnNpb25JZGVudGlmaWVyLmlzUGVyZmVjdCgKKwkJCQkJcmVtb3RlRmVhdHVyZVZlcnNpb25lZElkZW50aWZpZXIuZ2V0VmVyc2lvbigpKSkgeworCQkJCS8vIHZlcnNpb24gZG9lcyBub3QgbWF0Y2gKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJZm9yIChpbnQgZSA9IDA7IGUgPCBleGlzdGluZ0ZlYXR1cmVNb2RlbHMubGVuZ3RoOyBlKyspIHsKKwkJCQlpZiAoZXhpc3RpbmdGZWF0dXJlTW9kZWxzW2VdCisJCQkJCS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkKKwkJCQkJLmVxdWFscyhyZW1vdGVGZWF0dXJlVmVyc2lvbmVkSWRlbnRpZmllcikpIHsKKwkJCQkJU3lzdGVtLm91dC5wcmludGxuKAorCQkJCQkJIkZlYXR1cmUgIiAvLyROT04tTkxTLTEkCisJCQkJCQkJKyByZW1vdGVGZWF0dXJlVmVyc2lvbmVkSWRlbnRpZmllcgorCQkJCQkJCSsgIiBhbHJlYWR5IG1pcnJvcmVkIGFuZCBleHBvc2VkLiIpOyAvLyROT04tTkxTLTEkCisJCQkJCS8vIGZlYXR1cmUgYWxyZWFkeSBtaXJyb3JlZCBhbmQgZXhwb3NlZCBpbiBzaXRlLnhtbAorCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQl9CisKKwkJCS8vIENoZWNrIGZlYXR1cmUgdHlwZQorCQkJU3RyaW5nIHR5cGUgPQorCQkJCSgoU2l0ZUZlYXR1cmVSZWZlcmVuY2UpIHJlbW90ZVNpdGVGZWF0dXJlUmVmZXJlbmNlc1tpXSkKKwkJCQkJLmdldFR5cGUoKTsKKwkJCWlmICh0eXBlICE9IG51bGwKKwkJCQkmJiAhSVNpdGUuREVGQVVMVF9QQUNLQUdFRF9GRUFUVVJFX1RZUEUuZXF1YWxzKHR5cGUpKSB7CisJCQkJLy8gdW5zdXBwb3J0ZWQKKwkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbigKKwkJCQkJIkZlYXR1cmUgIiAvLyROT04tTkxTLTEkCisJCQkJCQkrIHJlbW90ZUZlYXR1cmVWZXJzaW9uZWRJZGVudGlmaWVyCisJCQkJCQkrICIgaXMgb2YgdHlwZSAiIC8vJE5PTi1OTFMtMSQKKwkJCQkJCSsgdHlwZQorCQkJCQkJKyAiLiAgT25seSBmZWF0dXJlcyBvZiB0eXBlICIgLy8kTk9OLU5MUy0xJAorCQkJCQkJKyBJU2l0ZS5ERUZBVUxUX1BBQ0tBR0VEX0ZFQVRVUkVfVFlQRQorCQkJCQkJKyAiIGFyZSBzdXBwb3J0ZWQuIiwgLy8kTk9OLU5MUy0xJAorCQkJCQludWxsKTsKKwkJCX0KKworCQkJZmVhdHVyZVJlZmVyZW5jZXNUb01pcnJvci5hZGQocmVtb3RlU2l0ZUZlYXR1cmVSZWZlcmVuY2VzW2ldKTsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigKKwkJCQkiRmVhdHVyZSAiIC8vJE5PTi1OTFMtMSQKKwkJCQkJKyByZW1vdGVTaXRlRmVhdHVyZVJlZmVyZW5jZXNbaV0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpCisJCQkJCSsgIiB3aWxsIGJlIG1pcnJvcmVkLiIpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJcmV0dXJuIChJU2l0ZUZlYXR1cmVSZWZlcmVuY2VbXSkgZmVhdHVyZVJlZmVyZW5jZXNUb01pcnJvci50b0FycmF5KAorCQkJbmV3IElTaXRlRmVhdHVyZVJlZmVyZW5jZVtmZWF0dXJlUmVmZXJlbmNlc1RvTWlycm9yLnNpemUoKV0pOworCX0KKworfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvbWlycm9yL01pcnJvclNpdGUuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL21pcnJvci9NaXJyb3JTaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M0MGZlMwotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL21pcnJvci9NaXJyb3JTaXRlLmphdmEKQEAgLTAsMCArMSw4MjIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwubWlycm9yOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkNvbnRlbnRSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUNhdGVnb3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklOb25QbHVnaW5FbnRyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JUGx1Z2luRW50cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVNpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVNpdGVGZWF0dXJlUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklVUkxFbnRyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JVmVyaWZpY2F0aW9uTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuU2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5TaXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlV0aWxpdGllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5WZXJzaW9uZWRJZGVudGlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLkNhdGVnb3J5TW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuU2l0ZU1vZGVsRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC5VUkxFbnRyeU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLkNvcmVFeGNlcHRpb25XaXRoUm9vdENhdXNlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLkZhdGFsSU9FeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuRmVhdHVyZVBhY2thZ2VkQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLklTaXRlQ29udGVudENvbnN1bWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLlVwZGF0ZUNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuVXBkYXRlTWFuYWdlclV0aWxzOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5zdGFuZGFsb25lLlN0YW5kYWxvbmVVcGRhdGVBcHBsaWNhdGlvbjsKKworLyoqCisgKiBMb2NhbCBtaXJyb3Igc2l0ZS4gIFJlYWQvV3JpdGUKKyAqLworcHVibGljIGNsYXNzIE1pcnJvclNpdGUgZXh0ZW5kcyBTaXRlIHsKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU5ERU5UID0gIiAgICI7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIFNpdGVNb2RlbEZhY3RvcnkgZmFjdG9yeTsKKwkvKioKKwkgKiBwbHVnaW4gZW50cmllcyAKKwkgKi8KKwlwcml2YXRlIENvbGxlY3Rpb24gZG93bmxvYWRlZFBsdWdpbkVudHJpZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisJcHJpdmF0ZSBDb2xsZWN0aW9uIGRvd25sb2FkZWRGZWF0dXJlUmVmZXJlbmNlTW9kZWxzID0gbmV3IEFycmF5TGlzdCgpOworCXByaXZhdGUgYm9vbGVhbiBpZ25vcmVOb25QcmVzZW50UGx1Z2luczsKKwlwdWJsaWMgTWlycm9yU2l0ZShTaXRlTW9kZWxGYWN0b3J5IGZhY3RvcnkpIHsKKwkJdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTsKKwl9CisKKwkvKioKKwkgKiBNaXJyb3JzIHRoZSBzcGVjaWZpZWQgZmVhdHVyZXMgYW5kIGxpc3RlZCBvcHRpb25hbCBmZWF0dXJlcyBvbiB0aGlzIHNpdGUuCisJICogQHNlZSBJU2l0ZSNpbnN0YWxsKElGZWF0dXJlLCBJVmVyaWZpY2F0aW9uTGlzdGVuZXIsIElQcm9ncmVzc01vbml0b3IpCisJICogQHBhcmFtIG1pcnJvclNpdGVVcmwgZXh0ZXJuYWwgVVJMIG9mIHRoZSBtaXJyb3Igc2l0ZSBvciBudWxsOworCSAqIGlmIHBhcmFtZXRlciBpcyBwcm92aWRlZCBwb2xpY3kgZnJhZ21lbnQgd2lsbCBiZSBnZW5lcmF0ZWQKKwkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgdm9pZCBtaXJyb3JBbmRFeHBvc2UoCisJCUlTaXRlIHJlbW90ZVNpdGUsCisJCUlTaXRlRmVhdHVyZVJlZmVyZW5jZVtdIHNvdXJjZUZlYXR1cmVSZWZzLAorCQlJRmVhdHVyZVJlZmVyZW5jZVtdIG9wdGlvbmFsZmVhdHVyZXMsCisJCVN0cmluZyBtaXJyb3JTaXRlVXJsKQorCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisKKwkJbWlycm9yQW5kRXhwb3NlRmVhdHVyZXMoCisJCQlyZW1vdGVTaXRlLAorCQkJc291cmNlRmVhdHVyZVJlZnMsCisJCQlvcHRpb25hbGZlYXR1cmVzKTsKKworCQlTeXN0ZW0ub3V0LnByaW50bG4oCisJCQkiSW5zdGFsbGluZyBmZWF0dXJlcyBmaW5pc2hlZC4gVXBkYXRpbmcgY2F0ZWdvcmllcyAuLi4iKTsgLy8kTk9OLU5MUy0xJAorCQl1cGRhdGVDYXRlZ29yaWVzKHJlbW90ZVNpdGUpOworCQlTeXN0ZW0ub3V0LnByaW50bG4oCisJCQkiVXBkYXRpbmcgY2F0ZWdvcmllcyBmaW5pc2hlZC4gVXBkYXRpbmcgc2l0ZSBkZXNjcmlwdGlvbiAuLi4iKTsgLy8kTk9OLU5MUy0xJAorCQl1cGRhdGVEZXNjcmlwdGlvbihyZW1vdGVTaXRlKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKAorCQkJIlVwZGF0aW5nIHNpdGUgZGVzY3JpcHRpb24gZmluaXNoZWQuIFNhdmluZyBzaXRlLnhtbCAuLi4iKTsgLy8kTk9OLU5MUy0xJAorCQlzYXZlKCk7CisJCWlmIChtaXJyb3JTaXRlVXJsICE9IG51bGwpIHsKKwkJCWdlbmVyYXRlVXBkYXRlUG9saWN5KG1pcnJvclNpdGVVcmwpOworCQl9CisJfQorCXByaXZhdGUgdm9pZCBtaXJyb3JBbmRFeHBvc2VGZWF0dXJlcygKKwkJSVNpdGUgcmVtb3RlU2l0ZSwKKwkJSVNpdGVGZWF0dXJlUmVmZXJlbmNlW10gc291cmNlRmVhdHVyZVJlZnMsCisJCUlGZWF0dXJlUmVmZXJlbmNlW10gb3B0aW9uYWxmZWF0dXJlcykKKwkJdGhyb3dzIENvcmVFeGNlcHRpb24geworCisJCS8vIEZlYXR1cmVzIHRoYXQgZmFpbGVkIHdpbGwgYmUgcmV0cmllZCBvbmNlIGFnYWluCisJCUNvbGxlY3Rpb24gZmFpbGVkRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgc291cmNlRmVhdHVyZVJlZnMubGVuZ3RoOyBpKyspIHsKKwkJCXRyeSB7CisJCQkJSUZlYXR1cmUgc291cmNlRmVhdHVyZSA9CisJCQkJCXNvdXJjZUZlYXR1cmVSZWZzW2ldLmdldEZlYXR1cmUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7CisJCQkJU2l0ZUZlYXR1cmVSZWZlcmVuY2VNb2RlbCBmZWF0dXJlUmVmID0KKwkJCQkJbWlycm9yRmVhdHVyZSgKKwkJCQkJCXJlbW90ZVNpdGUsCisJCQkJCQlzb3VyY2VGZWF0dXJlLAorCQkJCQkJb3B0aW9uYWxmZWF0dXJlcywKKwkJCQkJCTEpOworCQkJCS8vIFNldCBjYXRlZ29yaWVzIG9mIHRoZSBuZXcgZmVhdHVyZQorCQkJCUlDYXRlZ29yeSByZW1vdGVDYXRlZ29yaWVzW10gPQorCQkJCQlzb3VyY2VGZWF0dXJlUmVmc1tpXS5nZXRDYXRlZ29yaWVzKCk7CisJCQkJZm9yIChpbnQgaiA9IDA7IGogPCByZW1vdGVDYXRlZ29yaWVzLmxlbmd0aDsgaisrKSB7CisJCQkJCWZlYXR1cmVSZWYuYWRkQ2F0ZWdvcnlOYW1lKHJlbW90ZUNhdGVnb3JpZXNbal0uZ2V0TmFtZSgpKTsKKwkJCQl9CisKKwkJCQlhZGRGZWF0dXJlUmVmZXJlbmNlTW9kZWwocmVtb3RlU2l0ZSwgZmVhdHVyZVJlZik7CisJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7CisJCQkJZmFpbGVkRmVhdHVyZXMuYWRkKHNvdXJjZUZlYXR1cmVSZWZzW2ldKTsKKwkJCX0KKwkJfQorCisJCS8vIGRvIHdlIG5lZWQgdG8gcmV0cnk/CisJCWlmIChmYWlsZWRGZWF0dXJlcy5zaXplKCkgPiAwKSB7CisJCQlzb3VyY2VGZWF0dXJlUmVmcyA9CisJCQkJKElTaXRlRmVhdHVyZVJlZmVyZW5jZVtdKSBmYWlsZWRGZWF0dXJlcy50b0FycmF5KAorCQkJCQluZXcgSVNpdGVGZWF0dXJlUmVmZXJlbmNlW2ZhaWxlZEZlYXR1cmVzLnNpemUoKV0pOworCQl9IGVsc2UgeworCQkJcmV0dXJuOworCQl9CisKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBzb3VyY2VGZWF0dXJlUmVmcy5sZW5ndGg7IGkrKykgeworCQkJSUZlYXR1cmUgc291cmNlRmVhdHVyZSA9CisJCQkJc291cmNlRmVhdHVyZVJlZnNbaV0uZ2V0RmVhdHVyZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKKwkJCVNpdGVGZWF0dXJlUmVmZXJlbmNlTW9kZWwgZmVhdHVyZVJlZiA9CisJCQkJbWlycm9yRmVhdHVyZShyZW1vdGVTaXRlLCBzb3VyY2VGZWF0dXJlLCBvcHRpb25hbGZlYXR1cmVzLCAxKTsKKwkJCS8vIFNldCBjYXRlZ29yaWVzIG9mIHRoZSBuZXcgZmVhdHVyZQorCQkJSUNhdGVnb3J5IHJlbW90ZUNhdGVnb3JpZXNbXSA9IHNvdXJjZUZlYXR1cmVSZWZzW2ldLmdldENhdGVnb3JpZXMoKTsKKwkJCWZvciAoaW50IGogPSAwOyBqIDwgcmVtb3RlQ2F0ZWdvcmllcy5sZW5ndGg7IGorKykgeworCQkJCWZlYXR1cmVSZWYuYWRkQ2F0ZWdvcnlOYW1lKHJlbW90ZUNhdGVnb3JpZXNbal0uZ2V0TmFtZSgpKTsKKwkJCX0KKworCQkJYWRkRmVhdHVyZVJlZmVyZW5jZU1vZGVsKHJlbW90ZVNpdGUsIGZlYXR1cmVSZWYpOworCQl9CisJfQorCisJLyoqCisJICogSW5zdGFsbCB0aGUgc3BlY2lmaWVkIGZlYXR1cmUgYW5kIGxpc3RlZCBvcHRpb25hbCBmZWF0dXJlcyBvbiB0aGlzIHNpdGUuCisJICogQHNlZSBJU2l0ZSNpbnN0YWxsKElGZWF0dXJlLCBJVmVyaWZpY2F0aW9uTGlzdGVuZXIsIElQcm9ncmVzc01vbml0b3IpCisJICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uCisJICovCisJcHJpdmF0ZSBTaXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsIG1pcnJvckZlYXR1cmUoCisJCUlTaXRlIHJlbW90ZVNpdGUsCisJCUlGZWF0dXJlIHNvdXJjZUZlYXR1cmUsCisJCUlGZWF0dXJlUmVmZXJlbmNlW10gb3B0aW9uYWxmZWF0dXJlcywKKwkJaW50IGluZGVudCkKKwkJdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlTdHJpbmcgdGFiID0gIiI7IC8vJE5PTi1OTFMtMSQKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRlbnQ7IGkrKykKKwkJCXRhYiArPSAiICI7IC8vJE5PTi1OTFMtMSQKKwkJU3lzdGVtLm91dC5wcmludGxuKAorCQkJdGFiCisJCQkJKyAiTWlycm9yaW5nIGZlYXR1cmUgIiAvLyROT04tTkxTLTEkCisJCQkJKyBzb3VyY2VGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKQorCQkJCSsgIiAuLi4iKTsgLy8kTk9OLU5MUy0xJAorCQlTaXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsIGV4aXN0aW5nRmVhdHVyZXNbXSA9CisJCQlnZXREb3dubG9hZGVkRmVhdHVyZVJlZmVyZW5jZU1vZGVscygpOworCQlmb3IgKGludCBlID0gMDsgZSA8IGV4aXN0aW5nRmVhdHVyZXMubGVuZ3RoOyBlKyspIHsKKwkJCWlmIChleGlzdGluZ0ZlYXR1cmVzW2VdCisJCQkJLmdldFZlcnNpb25lZElkZW50aWZpZXIoKQorCQkJCS5lcXVhbHMoc291cmNlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkpKSB7CisJCQkJU3lzdGVtLm91dC5wcmludGxuKAorCQkJCQl0YWIKKwkJCQkJCSsgIkZlYXR1cmUgIiAvLyROT04tTkxTLTEkCisJCQkJCQkrIHNvdXJjZUZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpCisJCQkJCQkrICIgYWxyZWFkeSBleGlzdHMuICBTa2lwcGluZyBkb3dubG9hZGluZy4iKTsgLy8kTk9OLU5MUy0xJAorCQkJCXJldHVybiBleGlzdGluZ0ZlYXR1cmVzW2VdOworCQkJfQorCQl9CisKKwkJZmluYWwgSUZlYXR1cmVDb250ZW50UHJvdmlkZXIgcHJvdmlkZXIgPQorCQkJc291cmNlRmVhdHVyZS5nZXRGZWF0dXJlQ29udGVudFByb3ZpZGVyKCk7CisJCQorCQkvLyBUT0RPOiBwYXNzaW5nIGNvbW1hbmQgb3B0aW9ucyBjb3VsZCBiZSBtYWRlIG1vcmUgZ2VuZXJhbCBpbiBmdXR1cmUsIHNvIHRoaXMgCisJCS8vIGNhc3QgaXMgbm90IG5lZWRlZC4gCisJCWlmIChwcm92aWRlciBpbnN0YW5jZW9mIEZlYXR1cmVQYWNrYWdlZENvbnRlbnRQcm92aWRlcikgeworCQkJKChGZWF0dXJlUGFja2FnZWRDb250ZW50UHJvdmlkZXIpIHByb3ZpZGVyKS5zZXRDb250aW51ZU9uRXJyb3IoaWdub3JlTm9uUHJlc2VudFBsdWdpbnMpOworCQl9CisJCQorCQlTeXN0ZW0ub3V0LnByaW50bG4oCisJCQl0YWIKKwkJCQkrICJHZXR0aW5nIHBsdWdpbiBlbnRyaWVzIGZvciAiIC8vJE5PTi1OTFMtMSQKKwkJCQkrIHNvdXJjZUZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpCisJCQkJKyAiIC4uLiIpOyAvLyROT04tTkxTLTEkCisJCWZpbmFsIElQbHVnaW5FbnRyeVtdIHNvdXJjZUZlYXR1cmVQbHVnaW5FbnRyaWVzID0KKwkJCXNvdXJjZUZlYXR1cmUuZ2V0UmF3UGx1Z2luRW50cmllcygpOworCisJCS8vIGRldGVybWluZSBsaXN0IG9mIHBsdWdpbnMgdG8gaW5zdGFsbAorCQkvLyBmaW5kIHRoZSBpbnRlcnNlY3Rpb24gYmV0d2VlbiB0aGUgcGx1Z2luIGVudHJpZXMgYWxyZWFkeSBjb250YWluZWQKKwkJLy8gb24gdGhlIHRhcmdldCBzaXRlLCBhbmQgcGx1Z2luIGVudHJpZXMgcGFja2FnZWQgaW4gc291cmNlIGZlYXR1cmUKKworCQlJUGx1Z2luRW50cnlbXSBwbHVnaW5zVG9JbnN0YWxsID0KKwkJCVVwZGF0ZU1hbmFnZXJVdGlscy5kaWZmKAorCQkJCXNvdXJjZUZlYXR1cmVQbHVnaW5FbnRyaWVzLAorCQkJCWdldERvd25sb2FkZWRQbHVnaW5FbnRyaWVzKCkpOworCisJCVN5c3RlbS5vdXQucHJpbnRsbigKKwkJCXRhYgorCQkJCSsgIkdldHRpbmcgbm9uIHBsdWdpbiBlbnRyaWVzIGZvciAiIC8vJE5PTi1OTFMtMSQKKwkJCQkrIHNvdXJjZUZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpCisJCQkJKyAiIC4uLiIpOyAvLyROT04tTkxTLTEkCisJCWZpbmFsIElOb25QbHVnaW5FbnRyeVtdIG5vblBsdWdpbnNUb0luc3RhbGwgPQorCQkJc291cmNlRmVhdHVyZS5nZXRSYXdOb25QbHVnaW5FbnRyaWVzKCk7CisKKwkJU3lzdGVtLm91dC5wcmludGxuKAorCQkJdGFiCisJCQkJKyAiR2V0dGluZyBpbmNsdWRlZCBmZWF0dXJlcyBmb3IgIiAvLyROT04tTkxTLTEkCisJCQkJKyBzb3VyY2VGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKQorCQkJCSsgIiAuLi4iKTsgLy8kTk9OLU5MUy0xJAorCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGNoaWxkcmVuID0KKwkJCXNvdXJjZUZlYXR1cmUuZ2V0UmF3SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpOworCQlpZiAob3B0aW9uYWxmZWF0dXJlcyAhPSBudWxsKSB7CisJCQljaGlsZHJlbiA9CisJCQkJVXBkYXRlTWFuYWdlclV0aWxzLm9wdGlvbmFsQ2hpbGRyZW5Ub0luc3RhbGwoCisJCQkJCWNoaWxkcmVuLAorCQkJCQlvcHRpb25hbGZlYXR1cmVzKTsKKwkJfQorCisJCVN5c3RlbS5vdXQucHJpbnRsbigKKwkJCXRhYgorCQkJCSsgIkRvd25sb2FkaW5nIGZlYXR1cmUgYXJjaGl2ZXMgZm9yICIgLy8kTk9OLU5MUy0xJAorCQkJCSsgc291cmNlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkKKwkJCQkrICIgLi4uIik7IC8vJE5PTi1OTFMtMSQKKwkJLy8gZG93bmxvYWQgZmVhdHVyZSBhcmNoaXZlcworCQlwcm92aWRlci5nZXRGZWF0dXJlRW50cnlBcmNoaXZlUmVmZXJlbmNlcyhudWxsKTsKKworCQlTeXN0ZW0ub3V0LnByaW50bG4oCisJCQl0YWIKKwkJCQkrICJEb3dubG9hZGluZyBwbHVnLWluIGFyY2hpdmVzIGZvciAiIC8vJE5PTi1OTFMtMSQKKwkJCQkrIHNvdXJjZUZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpCisJCQkJKyAiIC4uLiIpOyAvLyROT04tTkxTLTEkCisJCS8vIGRvd25sb2FkIHBsdWdpbiBhcmNoaXZlcworCQlmb3IgKGludCBpID0gMDsgaSA8IHBsdWdpbnNUb0luc3RhbGwubGVuZ3RoOyBpKyspIHsKKwkJCXRyeSB7CisJCQkJcHJvdmlkZXIuZ2V0UGx1Z2luRW50cnlBcmNoaXZlUmVmZXJlbmNlcyhwbHVnaW5zVG9JbnN0YWxsW2ldLCBudWxsKTsKKwkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKKwkJCQlpZiAoIGlnbm9yZU5vblByZXNlbnRQbHVnaW5zICYmIAorCQkJCQkJKGNlIGluc3RhbmNlb2YgQ29yZUV4Y2VwdGlvbldpdGhSb290Q2F1c2UpICYmCisJCQkJCQkoKChDb3JlRXhjZXB0aW9uV2l0aFJvb3RDYXVzZSljZSkuZ2V0Um9vdEV4Y2VwdGlvbigpICE9IG51bGwpICYmIAorCQkJCQkJKCgoQ29yZUV4Y2VwdGlvbldpdGhSb290Q2F1c2UpY2UpLmdldFJvb3RFeGNlcHRpb24oKSBpbnN0YW5jZW9mIEZhdGFsSU9FeGNlcHRpb24pICkgeworCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNvdWxkIG5vdCBtaXJyb3IgcGx1Zy1pbiAiICsgcGx1Z2luc1RvSW5zdGFsbFtpXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSArICIuIEl0IGRvZXMgbm90IGV4aXN0IG9uIHRoZSBnaXZlbiBzaXRlIik7ICAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAorCQkJCX0gZWxzZSB7CisJCQkJCXRocm93IGNlOworCQkJCX0KKwkJCX0KKwkJfQorCisJCVN5c3RlbS5vdXQucHJpbnRsbigKKwkJCXRhYgorCQkJCSsgIkRvd25sb2FkaW5nIG5vbiBwbHVnLWluIGFyY2hpdmVzIGZvciAiIC8vJE5PTi1OTFMtMSQKKwkJCQkrIHNvdXJjZUZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpCisJCQkJKyAiIC4uLiIpOyAvLyROT04tTkxTLTEkCisJCS8vIGRvd25sb2FkIG5vbi1wbHVnaW4gYXJjaGl2ZXMKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBub25QbHVnaW5zVG9JbnN0YWxsLmxlbmd0aDsgaSsrKSB7CisJCQlwcm92aWRlci5nZXROb25QbHVnaW5FbnRyeUFyY2hpdmVSZWZlcmVuY2VzKAorCQkJCW5vblBsdWdpbnNUb0luc3RhbGxbaV0sCisJCQkJbnVsbCk7CisJCX0KKworCQlTeXN0ZW0ub3V0LnByaW50bG4oCisJCQl0YWIKKwkJCQkrICJJbnN0YWxsaW5nIGNoaWxkIGZlYXR1cmVzIGZvciAiIC8vJE5PTi1OTFMtMSQKKwkJCQkrIHNvdXJjZUZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpCisJCQkJKyAiIC4uLiIpOyAvLyROT04tTkxTLTEkCisJCS8vIGluc3RhbGwgY2hpbGQgZmVhdHVyZXMgZmlyc3QKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgeworCQkJSUZlYXR1cmUgY2hpbGRGZWF0dXJlID0gY2hpbGRyZW5baV0uZ2V0RmVhdHVyZShudWxsKTsKKwkJCW1pcnJvckZlYXR1cmUoCisJCQkJcmVtb3RlU2l0ZSwKKwkJCQljaGlsZEZlYXR1cmUsCisJCQkJb3B0aW9uYWxmZWF0dXJlcywKKwkJCQlpbmRlbnQgKyAxKTsKKwkJfQorCisJCVN5c3RlbS5vdXQucHJpbnRsbigKKwkJCXRhYgorCQkJCSsgIlN0b3JpbmcgcGx1Zy1pbiBhcmNoaXZlcyBmb3IgIiAvLyROT04tTkxTLTEkCisJCQkJKyBzb3VyY2VGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKQorCQkJCSsgIiAuLi4iKTsgLy8kTk9OLU5MUy0xJAorCQkvLyBzdG9yZSBwbHVnaW5zJyBhcmNoaXZlcworCQlmb3IgKGludCBpID0gMDsgaSA8IHBsdWdpbnNUb0luc3RhbGwubGVuZ3RoOyBpKyspIHsKKwkJCXRyeSB7CisJCQkJQ29udGVudFJlZmVyZW5jZVtdIHJlZmVyZW5jZXMgPSBwcm92aWRlci5nZXRQbHVnaW5FbnRyeUFyY2hpdmVSZWZlcmVuY2VzKCBwbHVnaW5zVG9JbnN0YWxsW2ldLCBudWxsKTsKKwkJCQlzdG9yZVBsdWdpbkFyY2hpdmUocmVmZXJlbmNlc1swXSk7CisJCQkJYWRkRG93bmxvYWRlZFBsdWdpbkVudHJ5KHBsdWdpbnNUb0luc3RhbGxbaV0pOworCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgeworCQkJCWlmICggaWdub3JlTm9uUHJlc2VudFBsdWdpbnMgJiYgCisJCQkJCQkoY2UgaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uV2l0aFJvb3RDYXVzZSkgJiYKKwkJCQkJCSgoKENvcmVFeGNlcHRpb25XaXRoUm9vdENhdXNlKWNlKS5nZXRSb290RXhjZXB0aW9uKCkgIT0gbnVsbCkgJiYgCisJCQkJCQkoKChDb3JlRXhjZXB0aW9uV2l0aFJvb3RDYXVzZSljZSkuZ2V0Um9vdEV4Y2VwdGlvbigpIGluc3RhbmNlb2YgRmF0YWxJT0V4Y2VwdGlvbikgKSB7CisJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ291bGQgbm90IHdyaXRlIHBsdWctaW4gIiArIHBsdWdpbnNUb0luc3RhbGxbaV0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkgKyAiLiBJdCBkb2VzIG5vdCBleGlzdCBvbiB0aGUgZ2l2ZW4gc2l0ZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQl9IGVsc2UgeworCQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiaWdub3JlTm9uUHJlc2VudFBsdWdpbnM6IitpZ25vcmVOb25QcmVzZW50UGx1Z2lucyk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJdGhyb3cgY2U7CisJCQkJfQorCQkJfQorCQl9CisKKwkJU3lzdGVtLm91dC5wcmludGxuKAorCQkJdGFiCisJCQkJKyAiU3RvcmluZyBub24gcGx1Zy1pbiBhcmNoaXZlcyBmb3IgIiAvLyROT04tTkxTLTEkCisJCQkJKyBzb3VyY2VGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKQorCQkJCSsgIiAuLi4iKTsgLy8kTk9OLU5MUy0xJAorCQkvLyBzdG9yZSBub24gcGx1Z2lucycgYXJjaGl2ZXMKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBub25QbHVnaW5zVG9JbnN0YWxsLmxlbmd0aDsgaSsrKSB7CisJCQlDb250ZW50UmVmZXJlbmNlW10gcmVmZXJlbmNlcyA9CisJCQkJcHJvdmlkZXIuZ2V0Tm9uUGx1Z2luRW50cnlBcmNoaXZlUmVmZXJlbmNlcygKKwkJCQkJbm9uUGx1Z2luc1RvSW5zdGFsbFtpXSwKKwkJCQkJbnVsbCk7CisJCQlmb3IgKGludCByID0gMDsgciA8IHJlZmVyZW5jZXMubGVuZ3RoOyByKyspIHsKKwkJCQlzdG9yZU5vblBsdWdpbkFyY2hpdmUoCisJCQkJCXNvdXJjZUZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLAorCQkJCQlyZWZlcmVuY2VzW3JdKTsKKwkJCX0KKwkJfQorCisJCVN5c3RlbS5vdXQucHJpbnRsbigKKwkJCXRhYgorCQkJCSsgIlN0b3JpbmcgZmVhdHVyZSBhcmNoaXZlcyBmb3IgIiAvLyROT04tTkxTLTEkCisJCQkJKyBzb3VyY2VGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKQorCQkJCSsgIiAuLi4iKTsgLy8kTk9OLU5MUy0xJAorCQkvLyBzdG9yZSBmZWF0dXJlIGFyY2hpdmUKKwkJQ29udGVudFJlZmVyZW5jZVtdIHJlZmVyZW5jZXMgPQorCQkJcHJvdmlkZXIuZ2V0RmVhdHVyZUVudHJ5QXJjaGl2ZVJlZmVyZW5jZXMobnVsbCk7CisJCXN0b3JlRmVhdHVyZUFyY2hpdmUocmVmZXJlbmNlc1swXSk7CisKKwkJU3lzdGVtLm91dC5wcmludGxuKAorCQkJdGFiCisJCQkJKyAiQWRkaW5nIGZlYXR1cmUgIiAvLyROT04tTkxTLTEkCisJCQkJKyBzb3VyY2VGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKQorCQkJCSsgIiB0byBtb2RlbCAuLi4iKTsgLy8kTk9OLU5MUy0xJAorCisJCS8vIGFkZCBmZWF0dXJlIG1vZGVsIHRvIHNpdGUgbW9kZWwKKwkJU2l0ZUZlYXR1cmVSZWZlcmVuY2VNb2RlbCBmZWF0dXJlUmVmID0KKwkJCWZhY3RvcnkuY3JlYXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsKCk7CisJCWZlYXR1cmVSZWYuc2V0U2l0ZU1vZGVsKHRoaXMpOworCQkvL2ZlYXR1cmVSZWYuc2V0VVJMU3RyaW5nKGZlYXR1cmVVUkwudG9FeHRlcm5hbEZvcm0oKSk7CisJCWZlYXR1cmVSZWYuc2V0VHlwZShJU2l0ZS5ERUZBVUxUX1BBQ0tBR0VEX0ZFQVRVUkVfVFlQRSk7CisJCWZlYXR1cmVSZWYuc2V0RmVhdHVyZUlkZW50aWZpZXIoCisJCQlzb3VyY2VGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRJZGVudGlmaWVyKCkpOworCQlmZWF0dXJlUmVmLnNldEZlYXR1cmVWZXJzaW9uKAorCQkJc291cmNlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0VmVyc2lvbigpLnRvU3RyaW5nKCkpOworCQlhZGREb3dubG9hZGVkRmVhdHVyZVJlZmVyZW5jZU1vZGVsKGZlYXR1cmVSZWYpOworCisJCVN5c3RlbS5vdXQucHJpbnRsbigKKwkJCXRhYgorCQkJCSsgIk1pcnJvcmluZyBmZWF0dXJlICIgLy8kTk9OLU5MUy0xJAorCQkJCSsgc291cmNlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkKKwkJCQkrICIgZmluaXNoZWQuIik7IC8vJE5PTi1OTFMtMSQKKwkJcmV0dXJuIGZlYXR1cmVSZWY7CisKKwl9CisJLyoqCisJICogQWRkcyBhIGZlYXR1cmUgcmVmZXJlbmNlIG1vZGVsIHRvIHRoaXMgc2l0ZSwKKwkgKiBhbmQgZXhwb3NlcyBpbiBzaXRlLnhtbCBpZiByZW1vdGUgc2l0ZSBleHBvc2VzIGdpdmVuIGZlYXR1cmUuCisJICovCisJcHVibGljIHZvaWQgYWRkRmVhdHVyZVJlZmVyZW5jZU1vZGVsKAorCQlJU2l0ZSByZW1vdGVTaXRlLAorCQlTaXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsIGZlYXR1cmVSZWZlcmVuY2UpIHsKKwkJLy8gY2hlY2sgaWYgcmVtb3RlIHNpdGUgZXhwb3NlcyB0aGlzIGZlYXR1cmUKKwkJSVNpdGVGZWF0dXJlUmVmZXJlbmNlIHJlbW90ZUZlYXR1cmVzW10gPQorCQkJcmVtb3RlU2l0ZS5nZXRSYXdGZWF0dXJlUmVmZXJlbmNlcygpOworCQlmb3IgKGludCBpID0gMDsgaSA8IHJlbW90ZUZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7CisJCQlJU2l0ZUZlYXR1cmVSZWZlcmVuY2UgcmVtb3RlRmVhdHVyZVJlZiA9IHJlbW90ZUZlYXR1cmVzW2ldOworCQkJdHJ5IHsKKwkJCQlpZiAocmVtb3RlRmVhdHVyZVJlZgorCQkJCQkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpCisJCQkJCS5lcXVhbHMoZmVhdHVyZVJlZmVyZW5jZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkpKSB7CisJCQkJCWFkZEZlYXR1cmVSZWZlcmVuY2VNb2RlbChmZWF0dXJlUmVmZXJlbmNlKTsKKwkJCQl9CisJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7CisJCQkJU3RhbmRhbG9uZVVwZGF0ZUFwcGxpY2F0aW9uLmV4Y2VwdGlvbkxvZ2dlZCgpOworCQkJCVVwZGF0ZUNvcmUubG9nKGNlKTsKKwkJCX0KKwkJfQorCQlzYXZlKCk7CisJCVN5c3RlbS5vdXQucHJpbnRsbigKKwkJCSJGZWF0dXJlICIgLy8kTk9OLU5MUy0xJAorCQkJCSsgZmVhdHVyZVJlZmVyZW5jZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkKKwkJCQkrICIgYWRkZWQgdG8gc2l0ZS54bWwuIik7IC8vJE5PTi1OTFMtMSQKKwl9CisJLyoqCisJICogQWRkcyBmZWF0dXJlIG1vZGVsIHRvIHNpdGUgbW9kZWwsIHJlbW92aW5nIG9sZCBmZWF0dXJlCisJICovCisJcHVibGljIHZvaWQgYWRkRmVhdHVyZVJlZmVyZW5jZU1vZGVsKFNpdGVGZWF0dXJlUmVmZXJlbmNlTW9kZWwgZmVhdHVyZVJlZmVyZW5jZSkgeworCQlTaXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsW10gZXhpc3RpbmdNb2RlbHMgPQorCQkJZ2V0RmVhdHVyZVJlZmVyZW5jZU1vZGVscygpOworCQlmb3IgKGludCBqID0gMDsgaiA8IGV4aXN0aW5nTW9kZWxzLmxlbmd0aDsgaisrKSB7CisJCQlpZiAoZXhpc3RpbmdNb2RlbHNbal0KKwkJCQkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpCisJCQkJLmVxdWFscyhmZWF0dXJlUmVmZXJlbmNlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSkpIHsKKwkJCQlzdXBlci5yZW1vdmVGZWF0dXJlUmVmZXJlbmNlTW9kZWwoZXhpc3RpbmdNb2RlbHNbal0pOworCQkJfQorCQl9CisJCXN1cGVyLmFkZEZlYXR1cmVSZWZlcmVuY2VNb2RlbChmZWF0dXJlUmVmZXJlbmNlKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElTaXRlQ29udGVudENvbnN1bWVyI3N0b3JlKENvbnRlbnRSZWZlcmVuY2UsIElQcm9ncmVzc01vbml0b3IpCisJICovCisJcHJpdmF0ZSB2b2lkIHN0b3JlRmVhdHVyZUFyY2hpdmUoQ29udGVudFJlZmVyZW5jZSBjb250ZW50UmVmZXJlbmNlKQorCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCUlucHV0U3RyZWFtIGluU3RyZWFtID0gbnVsbDsKKwkJU3RyaW5nIGZlYXR1cmVQYXRoID0gbnVsbDsKKworCQl0cnkgeworCQkJVVJMIG5ld1VSTCA9CisJCQkJbmV3IFVSTCgKKwkJCQkJdGhpcy5nZXRVUkwoKSwKKwkJCQkJU2l0ZS5ERUZBVUxUX0lOU1RBTExFRF9GRUFUVVJFX1BBVEgKKwkJCQkJCSsgY29udGVudFJlZmVyZW5jZS5nZXRJZGVudGlmaWVyKCkKKwkJCQkJCSsgIi5qYXIiKTsgLy8kTk9OLU5MUy0xJAorCQkJZmVhdHVyZVBhdGggPSBuZXdVUkwuZ2V0RmlsZSgpOworCQkJaW5TdHJlYW0gPSBjb250ZW50UmVmZXJlbmNlLmdldElucHV0U3RyZWFtKCk7CisJCQlVcGRhdGVNYW5hZ2VyVXRpbHMuY29weVRvTG9jYWwoaW5TdHJlYW0sIGZlYXR1cmVQYXRoLCBudWxsKTsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oCisJCQkJIkVycm9yIG9jY3VycmVkIHdoaWxlIGNyZWF0aW5nICIrIGZlYXR1cmVQYXRoKyIgZmlsZS4iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQllKTsKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChpblN0cmVhbSAhPSBudWxsKSB7CisJCQkJdHJ5IHsKKwkJCQkJaW5TdHJlYW0uY2xvc2UoKTsKKwkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJfQorCQkJfQorCQl9CisKKwl9CisJLyoqCisJKiBAc2VlIElTaXRlQ29udGVudENvbnN1bWVyI3N0b3JlKENvbnRlbnRSZWZlcmVuY2UsIElQcm9ncmVzc01vbml0b3IpCisJKi8KKwlwcml2YXRlIHZvaWQgc3RvcmVQbHVnaW5BcmNoaXZlKENvbnRlbnRSZWZlcmVuY2UgY29udGVudFJlZmVyZW5jZSkKKwkJdGhyb3dzIENvcmVFeGNlcHRpb24geworCisJCUlucHV0U3RyZWFtIGluU3RyZWFtID0gbnVsbDsKKwkJU3RyaW5nIHBsdWdpblBhdGggPSBudWxsOworCQl0cnkgeworCQkJVVJMIG5ld1VSTCA9IG5ldyBVUkwoZ2V0VVJMKCksIGNvbnRlbnRSZWZlcmVuY2UuZ2V0SWRlbnRpZmllcigpKTsKKwkJCXBsdWdpblBhdGggPSBuZXdVUkwuZ2V0RmlsZSgpOworCQkJaW5TdHJlYW0gPSBjb250ZW50UmVmZXJlbmNlLmdldElucHV0U3RyZWFtKCk7CisJCQkvLyBhZGRlZCBudWxsIGNoZWNrIGhlcmUsICBzaW5jZSBjb250ZW50UmVmZXJlbmNlIGNhbiwgaW4gdGhlb3J5LCByZXR1cm4gbnVsbCBmb3IgaW5wdXQgc3RyZWFtLiAKKwkJCWlmIChpblN0cmVhbSAhPSBudWxsKSB7CisJCQkJVXBkYXRlTWFuYWdlclV0aWxzLmNvcHlUb0xvY2FsKGluU3RyZWFtLCBwbHVnaW5QYXRoLCBudWxsKTsKKwkJCX0KKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oCisJCQkiRXJyb3Igb2NjdXJyZWQgd2hpbGUgY3JlYXRpbmcgIisgcGx1Z2luUGF0aCsiIGZpbGUuIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJZSk7CisJCX0gZmluYWxseSB7CisJCQlpZiAoaW5TdHJlYW0gIT0gbnVsbCkgeworCQkJCXRyeSB7CisJCQkJCWluU3RyZWFtLmNsb3NlKCk7CisJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBzdG9yZU5vblBsdWdpbkFyY2hpdmUoCisJCVZlcnNpb25lZElkZW50aWZpZXIgZmVhdHVyZVZlcnNpb25lZElkZW50aWZpZXIsCisJCUNvbnRlbnRSZWZlcmVuY2UgY29udGVudFJlZmVyZW5jZSkKKwkJdGhyb3dzIENvcmVFeGNlcHRpb24geworCisJCUlucHV0U3RyZWFtIGluU3RyZWFtID0gbnVsbDsKKwkJRmlsZSBub25QbHVnaW5BcmNoaXZlUGF0aCA9IG51bGw7CisJCXRyeSB7CisJCQlVUkwgbmV3RGlyVVJMID0KKwkJCQluZXcgVVJMKAorCQkJCQlnZXRVUkwoKSwKKwkJCQkJU2l0ZS5ERUZBVUxUX0lOU1RBTExFRF9GRUFUVVJFX1BBVEgKKwkJCQkJCSsgIi8iIC8vJE5PTi1OTFMtMSQKKwkJCQkJCSsgZmVhdHVyZVZlcnNpb25lZElkZW50aWZpZXIpOworCQkJRmlsZSBkaXIgPSBuZXcgRmlsZShuZXdEaXJVUkwuZ2V0RmlsZSgpKTsKKwkJCWRpci5ta2RpcnMoKTsKKwkJCWluU3RyZWFtID0gY29udGVudFJlZmVyZW5jZS5nZXRJbnB1dFN0cmVhbSgpOworCQkJbm9uUGx1Z2luQXJjaGl2ZVBhdGggPQorCQkJCW5ldyBGaWxlKGRpciwgY29udGVudFJlZmVyZW5jZS5nZXRJZGVudGlmaWVyKCkpOworCQkJVXBkYXRlTWFuYWdlclV0aWxzLmNvcHlUb0xvY2FsKAorCQkJCWluU3RyZWFtLAorCQkJCW5vblBsdWdpbkFyY2hpdmVQYXRoLmdldEFic29sdXRlUGF0aCgpLAorCQkJCW51bGwpOworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbigKKwkJCSJFcnJvciBvY2N1cnJlZCB3aGlsZSBjcmVhdGluZyAiKyBub25QbHVnaW5BcmNoaXZlUGF0aC5nZXRBYnNvbHV0ZVBhdGgoKSsiIGZpbGUuIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQksZSk7CisJCX0gZmluYWxseSB7CisJCQlpZiAoaW5TdHJlYW0gIT0gbnVsbCkgeworCQkJCXRyeSB7CisJCQkJCWluU3RyZWFtLmNsb3NlKCk7CisJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBzYXZlKCkgeworCQlGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG51bGw7CisJCXRyeSB7CisJCQlVUkwgc2l0ZVVSTCA9IG5ldyBVUkwodGhpcy5nZXRVUkwoKSwgInNpdGUueG1sIik7IC8vJE5PTi1OTFMtMSQKKwkJCWZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKG5ldyBGaWxlKHNpdGVVUkwuZ2V0RmlsZSgpKSk7CisJCQlPdXRwdXRTdHJlYW1Xcml0ZXIgb3V0V3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihmb3MsICJVVEYtOCIpOyAvLyROT04tTkxTLTEkCisJCQlQcmludFdyaXRlciB3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIob3V0V3JpdGVyKTsKKwkJCXNhdmUod3JpdGVyKTsKKwkJCXdyaXRlci5mbHVzaCgpOworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKwkJCVN0YW5kYWxvbmVVcGRhdGVBcHBsaWNhdGlvbi5leGNlcHRpb25Mb2dnZWQoKTsKKwkJCVVwZGF0ZUNvcmUubG9nKAorCQkJCVV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKAorCQkJCQkiU2l0ZSBYTUwgY291bGQgbm90IGJlIHNhdmVkLiIsIC8vJE5PTi1OTFMtMSQKKwkJCQkJaW9lKSk7CisJCX0gZmluYWxseSB7CisJCQlpZiAoZm9zICE9IG51bGwpIHsKKwkJCQl0cnkgeworCQkJCQlmb3MuY2xvc2UoKTsKKwkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UyKSB7CisJCQkJfQorCQkJfQorCQl9CisJfQorCXByaXZhdGUgdm9pZCBzYXZlKFByaW50V3JpdGVyIHdyaXRlcikgeworCQl3cml0ZXIucHJpbnRsbigiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+Iik7IC8vJE5PTi1OTFMtMSQKKwkJLy93cml0ZXIucHJpbnRsbigiPCFET0NUWVBFIHNpdGUgU1lTVEVNIFwiZHRkL3NpdGUuZHRkXCI+Iik7CisJCXdyaXRlU2l0ZSgiIiwgd3JpdGVyKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCXByaXZhdGUgdm9pZCB3cml0ZVNpdGUoU3RyaW5nIGluZGVudCwgUHJpbnRXcml0ZXIgd3JpdGVyKSB7CisJCXdyaXRlci5wcmludChpbmRlbnQgKyAiPHNpdGUiKTsgLy8kTk9OLU5MUy0xJAorCQlTdHJpbmcgaW5kZW50MiA9IGluZGVudCArIElOREVOVDsKKwkJLy8gZGVmYXVsdCB0eXBlCisJCS8vd3JpdGVJZkRlZmluZWQoaW5kZW50YSwgd3JpdGVyLCAidHlwZSIsIGdldFR5cGUoKSk7CisJCS8vIHN0b3JlZCByZWxhdGl2ZSB0byBzaXRlLnhtbAorCQkvL3dyaXRlSWZEZWZpbmVkKGluZGVudGEsIHdyaXRlciwgInVybCIsIGdldFVSTCgpKTsKKwkJd3JpdGVyLnByaW50bG4oIj4iKTsgLy8kTk9OLU5MUy0xJAorCQlVUkxFbnRyeU1vZGVsIGRlc2NyaXB0aW9uID0gZ2V0RGVzY3JpcHRpb25Nb2RlbCgpOworCQlpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCkgeworCQkJd3JpdGVyLnByaW50bG4oKTsKKwkJCXdyaXRlRGVzY3JpcHRpb24oaW5kZW50Miwgd3JpdGVyLCBkZXNjcmlwdGlvbik7CisJCQl3cml0ZXIucHJpbnRsbigpOworCQl9CisJCXdyaXRlRmVhdHVyZXMoaW5kZW50Miwgd3JpdGVyKTsKKwkJd3JpdGVDYXRlZ29yaWVzKGluZGVudDIsIHdyaXRlcik7CisJCXdyaXRlci5wcmludGxuKGluZGVudCArICI8L3NpdGU+Iik7IC8vJE5PTi1OTFMtMSQKKwl9CisJcHJpdmF0ZSB2b2lkIHdyaXRlRmVhdHVyZXMoU3RyaW5nIGluZGVudCwgUHJpbnRXcml0ZXIgd3JpdGVyKSB7CisJCVNpdGVGZWF0dXJlUmVmZXJlbmNlTW9kZWxbXSBmZWF0dXJlUmVmZXJlbmNlTW9kZWxzID0KKwkJCWdldEZlYXR1cmVSZWZlcmVuY2VNb2RlbHMoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlUmVmZXJlbmNlTW9kZWxzLmxlbmd0aDsgaSsrKSB7CisJCQl3cml0ZXIucHJpbnQoaW5kZW50KTsKKwkJCXdyaXRlci5wcmludCgiPGZlYXR1cmUiKTsgLy8kTk9OLU5MUy0xJAorCQkJd3JpdGVyLnByaW50KAorCQkJCSIgdXJsPVwiZmVhdHVyZXMvIiAvLyROT04tTkxTLTEkCisJCQkJCSsgZmVhdHVyZVJlZmVyZW5jZU1vZGVsc1tpXS5nZXRGZWF0dXJlSWRlbnRpZmllcigpCisJCQkJCSsgIl8iIC8vJE5PTi1OTFMtMSQKKwkJCQkJKyBmZWF0dXJlUmVmZXJlbmNlTW9kZWxzW2ldLmdldEZlYXR1cmVWZXJzaW9uKCkKKwkJCQkJKyAiLmphclwiIik7IC8vJE5PTi1OTFMtMSQKKwkJCXdyaXRlci5wcmludCgKKwkJCQkiIGlkPVwiIiAvLyROT04tTkxTLTEkCisJCQkJCSsgZmVhdHVyZVJlZmVyZW5jZU1vZGVsc1tpXS5nZXRGZWF0dXJlSWRlbnRpZmllcigpCisJCQkJCSsgIlwiIik7IC8vJE5PTi1OTFMtMSQKKwkJCXdyaXRlci5wcmludCgKKwkJCQkiIHZlcnNpb249XCIiIC8vJE5PTi1OTFMtMSQKKwkJCQkJKyBmZWF0dXJlUmVmZXJlbmNlTW9kZWxzW2ldLmdldEZlYXR1cmVWZXJzaW9uKCkKKwkJCQkJKyAiXCIiKTsgLy8kTk9OLU5MUy0xJAorCQkJd3JpdGVyLnByaW50bG4oIj4iKTsgLy8kTk9OLU5MUy0xJAorCisJCQlTdHJpbmdbXSBjYXRlZ29yeU5hbWVzID0KKwkJCQlmZWF0dXJlUmVmZXJlbmNlTW9kZWxzW2ldLmdldENhdGVnb3J5TmFtZXMoKTsKKwkJCWZvciAoaW50IGNuID0gMDsgY24gPCBjYXRlZ29yeU5hbWVzLmxlbmd0aDsgY24rKykgeworCQkJCXdyaXRlci5wcmludChpbmRlbnQgKyBJTkRFTlQpOworCQkJCXdyaXRlci5wcmludGxuKAorCQkJCQkiPGNhdGVnb3J5IG5hbWU9XCIiICsgY2F0ZWdvcnlOYW1lc1tjbl0gKyAiXCIgLz4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisKKwkJCX0KKworCQkJd3JpdGVyLnByaW50KGluZGVudCk7CisJCQl3cml0ZXIucHJpbnRsbigiPC9mZWF0dXJlPiIpOyAvLyROT04tTkxTLTEkCisJCQl3cml0ZXIucHJpbnRsbigpOworCQl9CisJfQorCXByaXZhdGUgdm9pZCB3cml0ZUNhdGVnb3JpZXMoU3RyaW5nIGluZGVudCwgUHJpbnRXcml0ZXIgd3JpdGVyKSB7CisJCUNhdGVnb3J5TW9kZWxbXSBjYXRlZ29yeU1vZGVscyA9IGdldENhdGVnb3J5TW9kZWxzKCk7CisJCWlmIChjYXRlZ29yeU1vZGVscy5sZW5ndGggPD0gMCkgeworCQkJcmV0dXJuOworCQl9CisJCWZvciAoaW50IGkgPSAwOyBpIDwgY2F0ZWdvcnlNb2RlbHMubGVuZ3RoOyBpKyspIHsKKwkJCXdyaXRlci5wcmludChpbmRlbnQpOworCQkJd3JpdGVyLnByaW50KCI8Y2F0ZWdvcnktZGVmIik7IC8vJE5PTi1OTFMtMSQKKwkJCXdyaXRlci5wcmludCgKKwkJCQkiIG5hbWU9XCIiIC8vJE5PTi1OTFMtMSQKKwkJCQkJKyBjYXRlZ29yeU1vZGVsc1tpXS5nZXROYW1lKCkKKwkJCQkJKyAiXCIgbGFiZWw9XCIiIC8vJE5PTi1OTFMtMSQKKwkJCQkJKyBjYXRlZ29yeU1vZGVsc1tpXS5nZXRMYWJlbCgpCisJCQkJCSsgIlwiIik7IC8vJE5PTi1OTFMtMSQKKwkJCXdyaXRlci5wcmludGxuKCI+Iik7IC8vJE5PTi1OTFMtMSQKKwkJCWlmIChjYXRlZ29yeU1vZGVsc1tpXS5nZXREZXNjcmlwdGlvbk1vZGVsKCkgIT0gbnVsbCkgeworCQkJCXdyaXRlRGVzY3JpcHRpb24oCisJCQkJCQlpbmRlbnQgKyBJTkRFTlQsCisJCQkJCQl3cml0ZXIsCisJCQkJCQljYXRlZ29yeU1vZGVsc1tpXS5nZXREZXNjcmlwdGlvbk1vZGVsKCkpOworCQkJfQorCQkJd3JpdGVyLnByaW50KGluZGVudCk7CisJCQl3cml0ZXIucHJpbnRsbigiPC9jYXRlZ29yeS1kZWY+Iik7IC8vJE5PTi1OTFMtMSQKKwkJCXdyaXRlci5wcmludGxuKCk7CisJCX0KKwl9CisJcHJpdmF0ZSB2b2lkIHdyaXRlRGVzY3JpcHRpb24oCisJCVN0cmluZyBpbmRlbnQsCisJCVByaW50V3JpdGVyIHdyaXRlciwKKwkJVVJMRW50cnlNb2RlbCB1cmxFbnRyeU1vZGVsKSB7CisJCVN0cmluZyB1cmwgPSB1cmxFbnRyeU1vZGVsLmdldFVSTFN0cmluZygpOworCQlTdHJpbmcgdGV4dCA9IHVybEVudHJ5TW9kZWwuZ2V0QW5ub3RhdGlvbk5vbkxvY2FsaXplZCgpOworCQl3cml0ZXIucHJpbnQoaW5kZW50KTsKKwkJd3JpdGVyLnByaW50KCI8ZGVzY3JpcHRpb24iKTsgLy8kTk9OLU5MUy0xJAorCQlpZiAodXJsICE9IG51bGwpCisJCQl3cml0ZXIucHJpbnQoIiB1cmw9XCIiICsgdXJsICsgIlwiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPD0gMCkgeworCQkJd3JpdGVyLnByaW50bG4oIiAvPiIpOyAvLyROT04tTkxTLTEkCisJCX0gZWxzZSB7CisJCQl3cml0ZXIucHJpbnRsbigiPiIpOyAvLyROT04tTkxTLTEkCisJCQlpZiAodGV4dCAhPSBudWxsKSB7CisJCQkJd3JpdGVyLnByaW50bG4oCisJCQkJCWluZGVudCArIElOREVOVCArIFVwZGF0ZU1hbmFnZXJVdGlscy54bWxTYWZlKHRleHQpKTsKKwkJCX0KKwkJCXdyaXRlci5wcmludGxuKGluZGVudCArICI8L2Rlc2NyaXB0aW9uPiIpOyAvLyROT04tTkxTLTEkCisJCX0KKwl9CisJLyoqCisJICogQWRkcyBhIHBsdWdpbiBlbnRyeSAKKwkgKiBFaXRoZXIgZnJvbSBwYXJzaW5nIHRoZSBmaWxlIHN5c3RlbSBvciAKKwkgKiBpbnN0YWxsaW5nIGEgZmVhdHVyZQorCSAqIAorCSAqIFdlIGNhbm5vdCBmaWd1cmUgb3V0IHRoZSBsaXN0IG9mIHBsdWdpbnMgYnkgcmVhZGluZyB0aGUgU2l0ZS54bWwgYXMKKwkgKiB0aGUgYXJjaGl2ZXMgdGFnIGFyZSBvcHRpb25hbHMKKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGREb3dubG9hZGVkUGx1Z2luRW50cnkoSVBsdWdpbkVudHJ5IHBsdWdpbkVudHJ5KSB7CisJCWRvd25sb2FkZWRQbHVnaW5FbnRyaWVzLmFkZChwbHVnaW5FbnRyeSk7CisJfQorCisJcHJpdmF0ZSBJUGx1Z2luRW50cnlbXSBnZXREb3dubG9hZGVkUGx1Z2luRW50cmllcygpIHsKKwkJcmV0dXJuIChJUGx1Z2luRW50cnlbXSkgZG93bmxvYWRlZFBsdWdpbkVudHJpZXMudG9BcnJheSgKKwkJCW5ldyBJUGx1Z2luRW50cnlbZG93bmxvYWRlZFBsdWdpbkVudHJpZXMuc2l6ZSgpXSk7CisJfQorCS8qKgorCSAqIEFkZHMgYSBwbHVnaW4gZW50cnkgCisJICogRWl0aGVyIGZyb20gcGFyc2luZyB0aGUgZmlsZSBzeXN0ZW0gb3IgCisJICogaW5zdGFsbGluZyBhIGZlYXR1cmUKKwkgKiAKKwkgKiBXZSBjYW5ub3QgZmlndXJlIG91dCB0aGUgbGlzdCBvZiBwbHVnaW5zIGJ5IHJlYWRpbmcgdGhlIFNpdGUueG1sIGFzCisJICogdGhlIGFyY2hpdmVzIHRhZyBhcmUgb3B0aW9uYWxzCisJICovCisJcHVibGljIHZvaWQgYWRkRG93bmxvYWRlZEZlYXR1cmVSZWZlcmVuY2VNb2RlbChTaXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsIGZlYXR1cmVNb2RlbCkgeworCQlkb3dubG9hZGVkRmVhdHVyZVJlZmVyZW5jZU1vZGVscy5hZGQoZmVhdHVyZU1vZGVsKTsKKwl9CisKKwlwcml2YXRlIFNpdGVGZWF0dXJlUmVmZXJlbmNlTW9kZWxbXSBnZXREb3dubG9hZGVkRmVhdHVyZVJlZmVyZW5jZU1vZGVscygpIHsKKwkJcmV0dXJuICgKKwkJCVNpdGVGZWF0dXJlUmVmZXJlbmNlTW9kZWxbXSkgZG93bmxvYWRlZEZlYXR1cmVSZWZlcmVuY2VNb2RlbHMKKwkJCQkudG9BcnJheSgKKwkJCW5ldyBTaXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsW2Rvd25sb2FkZWRGZWF0dXJlUmVmZXJlbmNlTW9kZWxzCisJCQkJLnNpemUoKV0pOworCX0KKwkvKioKKwkgKiBDaGVja3MgaWYgbWlycm9yIHNpdGUgY29udGFpbnMgYSBmZWF0dXJlIHdpdGggZ2l2ZW4gSUQgYW5kIHZlcnNpb24KKwkgKiBAcGFyYW0gZmVhdHVyZVJlZk1vZGVsCisJICogQHJldHVybiB0cnVlIGlmIHN1Y2ggZmVhdHVyZSBleGlzdHMKKwkgKi8KKwkvKnByaXZhdGUgYm9vbGVhbiBjb250YWlucyhTaXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsIGZlYXR1cmVSZWZNb2RlbCkgeworCQlJU2l0ZUZlYXR1cmVSZWZlcmVuY2UgZmVhdHVyZVJlZnNbXSA9IGdldFJhd0ZlYXR1cmVSZWZlcmVuY2VzKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZVJlZnMubGVuZ3RoOyBpKyspIHsKKwkJCXRyeSB7CisJCQkJaWYgKGZlYXR1cmVSZWZzW2ldCisJCQkJCS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkKKwkJCQkJLmVxdWFscyhmZWF0dXJlUmVmTW9kZWwuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpKSkgeworCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQl9CisJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7CisJCQkJY2UucHJpbnRTdGFja1RyYWNlKCk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0qLworCisJLyoqCisJICogVXBkYXRlcyBkZXNjcmlwdGlvbiBvZiB0aGlzIHNpdGUKKwkgKiBmcm9tIGRlc2NyaXB0aW9uIG9mIHRoZSByZW1vdGUgc2l0ZS4KKwkgKi8KKwlwcml2YXRlIHZvaWQgdXBkYXRlRGVzY3JpcHRpb24oSVNpdGUgcmVtb3RlU2l0ZSkgeworCQlJVVJMRW50cnkgdXJsRW50cnkgPSByZW1vdGVTaXRlLmdldERlc2NyaXB0aW9uKCk7CisJCWlmICh1cmxFbnRyeSAhPSBudWxsKSB7CisJCQlVUkxFbnRyeU1vZGVsIG5ld1VybEVudHJ5TW9kZWwgPSBuZXcgVVJMRW50cnlNb2RlbCgpOworCQkJVVJMIHVybCA9IHVybEVudHJ5LmdldFVSTCgpOworCQkJbmV3VXJsRW50cnlNb2RlbC5zZXRBbm5vdGF0aW9uKHVybEVudHJ5LmdldEFubm90YXRpb24oKSk7CisJCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTM2MjQ5CisJCQkvLyBVUkwgaXMgbm90IHJlcXVpcmVkLCBzbyBtaWdodCBiZSBudWxsCisJCQkvLyBUaGUgbnVsbCBjYXNlIGlzIChhbHJlYWR5KSBoYW5kbGVkIGNvcnJlY3RseSBpbgorCQkJLy8gd3JpdGVEZXNjcmlwdGlvbgorCQkJaWYgKHVybCAhPSBudWxsKSB7CisJCQkJbmV3VXJsRW50cnlNb2RlbC5zZXRVUkxTdHJpbmcodXJsLnRvRXh0ZXJuYWxGb3JtKCkpOworCQkJfQorCQkJdGhpcy5zZXREZXNjcmlwdGlvbk1vZGVsKG5ld1VybEVudHJ5TW9kZWwpOworCQl9CisJfQorCS8qKgorCSAqIFVwZGF0ZXMgYWxsIGNhdGVnb3JpZXMgdXNlZCBieSBmZWF0dXJlcyBvbiB0aGlzIHNpdGUKKwkgKiBmcm9tIGNhdGVnb3JpZXMgZGVmaW5lZCBvbiByZW1vdGUgc2l0ZS4KKwkgKiBDYXRlZ29yaWVzIG5vdCBkZWZpbmVkIG9uIHJlbW90ZSBzaXRlIGFyZSB1bmNoYW5nZWQuCisJICovCisJcHJpdmF0ZSB2b2lkIHVwZGF0ZUNhdGVnb3JpZXMoSVNpdGUgcmVtb3RlU2l0ZSkgeworCQkvLyBjb2xsZWN0IG5hbWUgb2YgY2F0ZWdvcmllcyB1c2VkIG9uIHRoaXMgc2l0ZQorCQlTZXQgdXNlZENhdGVnb3J5TmFtZXMgPSBuZXcgSGFzaFNldCgpOworCQlTaXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsIGZlYXR1cmVSZWZNb2RlbHNbXSA9CisJCQlnZXRGZWF0dXJlUmVmZXJlbmNlTW9kZWxzKCk7CisJCWZvciAoaW50IGYgPSAwOyBmIDwgZmVhdHVyZVJlZk1vZGVscy5sZW5ndGg7IGYrKykgeworCQkJU3RyaW5nW10gZmVhdHVyZUNhdGVnb3J5TmFtZXMgPQorCQkJCWZlYXR1cmVSZWZNb2RlbHNbZl0uZ2V0Q2F0ZWdvcnlOYW1lcygpOworCisJCQlmb3IgKGludCBjID0gMDsgYyA8IGZlYXR1cmVDYXRlZ29yeU5hbWVzLmxlbmd0aDsgYysrKSB7CisJCQkJdXNlZENhdGVnb3J5TmFtZXMuYWRkKGZlYXR1cmVDYXRlZ29yeU5hbWVzW2NdKTsKKwkJCX0KKwkJfQorCisJCUNvbGxlY3Rpb24gbmV3Q2F0ZWdvcnlNb2RlbHMgPSBuZXcgQXJyYXlMaXN0KCk7CisJCWZvciAoSXRlcmF0b3IgaXQgPSB1c2VkQ2F0ZWdvcnlOYW1lcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7CisJCQlTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGl0Lm5leHQoKTsKKwkJCUlDYXRlZ29yeSByZW1vdGVDYXRlZ29yeSA9IHJlbW90ZVNpdGUuZ2V0Q2F0ZWdvcnkobmFtZSk7CisJCQlpZiAocmVtb3RlQ2F0ZWdvcnkgPT0gbnVsbCkgeworCQkJCS8vIHJlbW90ZSBzaXRlIGRvZXMgbm90IGRlZmluZSB0aGlzIGNhdGVnb3J5CisJCQkJQ2F0ZWdvcnlNb2RlbCBvbGRDYXRlZ29yeSA9IG51bGw7CisJCQkJdHJ5IHsKKwkJCQkJb2xkQ2F0ZWdvcnkgPSAoQ2F0ZWdvcnlNb2RlbCkgZ2V0Q2F0ZWdvcnkobmFtZSk7CisJCQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gbnBlKSB7CisJCQkJCS8vIGNhbm5vdCByZXByb2R1Y2UgbnBlIGFueW1vcmUKKwkJCQl9CisJCQkJaWYgKG9sZENhdGVnb3J5ICE9IG51bGwpIHsKKwkJCQkJbmV3Q2F0ZWdvcnlNb2RlbHMuYWRkKG9sZENhdGVnb3J5KTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCW5ld0NhdGVnb3J5TW9kZWxzLmFkZChyZW1vdGVDYXRlZ29yeSk7CisJCQl9CisKKwkJfQorCQlzZXRDYXRlZ29yeU1vZGVscygKKwkJCShDYXRlZ29yeU1vZGVsW10pIG5ld0NhdGVnb3J5TW9kZWxzLnRvQXJyYXkoCisJCQkJbmV3IENhdGVnb3J5TW9kZWxbbmV3Q2F0ZWdvcnlNb2RlbHMuc2l6ZSgpXSkpOworCisJfQorCXByaXZhdGUgdm9pZCBnZW5lcmF0ZVVwZGF0ZVBvbGljeShTdHJpbmcgdXJsKSB7CisJCUZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbnVsbDsKKwkJdHJ5IHsKKwkJCVVSTCBzaXRlVVJMID0gbmV3IFVSTCh0aGlzLmdldFVSTCgpLCAicG9saWN5LnhtbCIpOyAvLyROT04tTkxTLTEkCisJCQlmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShuZXcgRmlsZShzaXRlVVJMLmdldEZpbGUoKSkpOworCQkJT3V0cHV0U3RyZWFtV3JpdGVyIG91dFdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoZm9zLCAiVVRGLTgiKTsgLy8kTk9OLU5MUy0xJAorCQkJUHJpbnRXcml0ZXIgd3JpdGVyID0gbmV3IFByaW50V3JpdGVyKG91dFdyaXRlcik7CisKKwkJCXdyaXRlci5wcmludGxuKCI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz4iKTsgLy8kTk9OLU5MUy0xJAorCQkJd3JpdGVyLnByaW50bG4oIjx1cGRhdGUtcG9saWN5PiIpOyAvLyROT04tTkxTLTEkCisKKwkJCXdyaXRlci5wcmludGxuKAorCQkJCSI8IS0tIFlvdSBjYW4gcGFzdGUgdGhlIGZvbGxvd2luZyBmcmFnbWVudCwgY29udGFpbmluZyB1cmwtbWFwIGVsZW1lbnRzLCBpbnRvIGFub3RoZXIgcG9saWN5IGZpbGUuIC0tPiIpOyAvLyROT04tTkxTLTEkCisJCQl3cml0ZVVybE1hcHMod3JpdGVyLCB1cmwpOworCQkJd3JpdGVyLnByaW50bG4oIjwhLS0gRW5kIG9mIGZyYWdtZW50IHdpdGggdXJsLW1hcCBlbGVtZW50cy4gLS0+Iik7IC8vJE5PTi1OTFMtMSQKKworCQkJd3JpdGVyLnByaW50bG4oIjwvdXBkYXRlLXBvbGljeT4iKTsgLy8kTk9OLU5MUy0xJAorCisJCQl3cml0ZXIuZmx1c2goKTsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisJCQlTdGFuZGFsb25lVXBkYXRlQXBwbGljYXRpb24uZXhjZXB0aW9uTG9nZ2VkKCk7CisJCQlVcGRhdGVDb3JlLmxvZygKKwkJCQlVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbigKKwkJCQkJInBvbGljeS54bWwgY291bGQgbm90IGJlIHNhdmVkIiwgLy8kTk9OLU5MUy0xJAorCQkJCQlpb2UpKTsKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChmb3MgIT0gbnVsbCkgeworCQkJCXRyeSB7CisJCQkJCWZvcy5jbG9zZSgpOworCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZTIpIHsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJcHJpdmF0ZSB2b2lkIHdyaXRlVXJsTWFwcyhQcmludFdyaXRlciB3cml0ZXIsIFN0cmluZyB1cmwpIHsKKwkJU2l0ZUZlYXR1cmVSZWZlcmVuY2VNb2RlbFtdIGZlYXR1cmVSZWZlcmVuY2VNb2RlbHMgPQorCQkJZ2V0RmVhdHVyZVJlZmVyZW5jZU1vZGVscygpOworCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVSZWZlcmVuY2VNb2RlbHMubGVuZ3RoOyBpKyspIHsKKwkJCXdyaXRlci5wcmludCgiXHQiKTsgLy8kTk9OLU5MUy0xJAorCQkJd3JpdGVyLnByaW50KCI8dXJsLW1hcCIpOyAvLyROT04tTkxTLTEkCisJCQl3cml0ZXIucHJpbnQoCisJCQkJIiBwYXR0ZXJuPVwiIiAvLyROT04tTkxTLTEkCisJCQkJCSsgZmVhdHVyZVJlZmVyZW5jZU1vZGVsc1tpXS5nZXRGZWF0dXJlSWRlbnRpZmllcigpCisJCQkJCSsgIlwiIik7IC8vJE5PTi1OTFMtMSQKKwkJCXdyaXRlci5wcmludCgiIHVybD1cIiIgKyB1cmwgKyAiXCIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQl3cml0ZXIucHJpbnRsbigiIC8+Iik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCX0KKworCXB1YmxpYyB2b2lkIHNldElnbm9yZU5vblByZXNlbnRQbHVnaW5zKGJvb2xlYW4gaWdub3JlTm9uUHJlc2VudFBsdWdpbnMpIHsKKwkJdGhpcy5pZ25vcmVOb25QcmVzZW50UGx1Z2lucyA9IGlnbm9yZU5vblByZXNlbnRQbHVnaW5zOworCQkKKwl9Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9taXJyb3IvTWlycm9yU2l0ZUZhY3RvcnkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL21pcnJvci9NaXJyb3JTaXRlRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MmFiNjgKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9taXJyb3IvTWlycm9yU2l0ZUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDIzNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5taXJyb3I7CitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEubmV0Lio7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwubW9kZWwuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuc3RhbmRhbG9uZS4qOworaW1wb3J0IG9yZy54bWwuc2F4Lio7CisKK3B1YmxpYyBjbGFzcyBNaXJyb3JTaXRlRmFjdG9yeSBleHRlbmRzIEJhc2VTaXRlRmFjdG9yeSB7CisJLyoKKwkgKiBAc2VlIFNpdGVNb2RlbEZhY3RvcnkjY3JlYXRlU2l0ZU1hcE1vZGVsKCkKKwkgKi8KKwlwdWJsaWMgU2l0ZU1vZGVsIGNyZWF0ZVNpdGVNYXBNb2RlbCgpIHsKKwkJcmV0dXJuIG5ldyBNaXJyb3JTaXRlKHRoaXMpOworCX0KKwkvKgorCSAqIEBzZWUgSVNpdGVGYWN0b3J5I2NyZWF0ZVNpdGUoVVJMKQorCSAqLworCXB1YmxpYyBJU2l0ZSBjcmVhdGVTaXRlKFVSTCB1cmwpCisJCXRocm93cyBDb3JlRXhjZXB0aW9uLCBJbnZhbGlkU2l0ZVR5cGVFeGNlcHRpb24geworCQlyZXR1cm4gY3JlYXRlU2l0ZShuZXcgRmlsZSh1cmwuZ2V0RmlsZSgpKSk7CisJfQorCS8qCisJICogQHNlZSBJU2l0ZUZhY3RvcnkjY3JlYXRlU2l0ZShVUkwpCisJICovCisJcHVibGljIElTaXRlIGNyZWF0ZVNpdGUoRmlsZSBzaXRlTG9jYXRpb24pCisJCXRocm93cyBDb3JlRXhjZXB0aW9uLCBJbnZhbGlkU2l0ZVR5cGVFeGNlcHRpb24geworCisJCUlucHV0U3RyZWFtIHNpdGVTdHJlYW0gPSBudWxsOworCisJCWlmICghc2l0ZUxvY2F0aW9uLmV4aXN0cygpKSB7CisJCQlpZiAoIXNpdGVMb2NhdGlvbi5ta2RpcnMoKSkgeworCQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKAorCQkJCQkiRGlyZWN0b3J5ICIgLy8kTk9OLU5MUy0xJAorCQkJCQkJKyBzaXRlTG9jYXRpb24uZ2V0QWJzb2x1dGVQYXRoKCkKKwkJCQkJCSsgIiBjb3VsZCBub3QgYmUgY3JlYXRlZC4iLCAvLyROT04tTkxTLTEkCisJCQkJCW51bGwpOworCQkJfQorCQl9CisJCWlmICghc2l0ZUxvY2F0aW9uLmlzRGlyZWN0b3J5KCkgfHwgIXNpdGVMb2NhdGlvbi5jYW5Xcml0ZSgpKQorCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oCisJCQkJc2l0ZUxvY2F0aW9uLmdldEFic29sdXRlUGF0aCgpCisJCQkJCSsgIiBpcyBub3QgYSBkaXJlY3Rvcnkgb3IgaXMgbm90IHdyaXR0YWJsZS4iLCAvLyROT04tTkxTLTEkCisJCQkJbnVsbCk7CisKKwkJTWlycm9yU2l0ZSBzaXRlID0gbnVsbDsKKwkJLy8gcGFyc2UgcHVibGljIGZlYXR1cmVzCisJCWlmIChuZXcgRmlsZShzaXRlTG9jYXRpb24sIFNpdGUuU0lURV9YTUwpLmV4aXN0cygpKSB7CisJCQl0cnkgeworCQkJCXNpdGVTdHJlYW0gPQorCQkJCQluZXcgRmlsZUlucHV0U3RyZWFtKG5ldyBGaWxlKHNpdGVMb2NhdGlvbiwgU2l0ZS5TSVRFX1hNTCkpOworCQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGZuZmUpIHsKKwkJCX0KKwkJCXNpdGUgPSAoTWlycm9yU2l0ZSkgcGFyc2VTaXRlKHNpdGVTdHJlYW0pOworCQkJdHJ5IHsKKwkJCQlpZiAoc2l0ZVN0cmVhbSAhPSBudWxsKQorCQkJCQlzaXRlU3RyZWFtLmNsb3NlKCk7CisJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQl9CisJCX0KKwkJaWYgKHNpdGUgPT0gbnVsbCkgeworCQkJc2l0ZSA9IChNaXJyb3JTaXRlKSBjcmVhdGVTaXRlTWFwTW9kZWwoKTsKKwkJfQorCQkvLyBwYXJzZSBkb3dubG9hZGVkIHBsdWdpbnMgYW5kIGZyYWdtZW50cworCQlwYXJzZURvd25sb2FkZWRQbHVnaW5zQW5kRnJhZ21lbnRzKAorCQkJc2l0ZSwKKwkJCW5ldyBGaWxlKHNpdGVMb2NhdGlvbiwgU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRIKSk7CisJCS8vIHBhcnNlIGRvd25sb2FkZWQgZmVhdHVyZXMKKwkJcGFyc2VEb3dubG9hZGVkRmVhdHVyZXMoCisJCQlzaXRlLAorCQkJbmV3IEZpbGUoc2l0ZUxvY2F0aW9uLCBTaXRlLkRFRkFVTFRfRkVBVFVSRV9QQVRIKSk7CisKKwkJVVJMIHVybDsKKwkJdHJ5IHsKKwkJCXVybCA9IHNpdGVMb2NhdGlvbi50b1VSTCgpOworCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbXVlKSB7CisJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbigKKwkJCQkiQSBVUkwgZm9yIHNpdGUgIiAvLyROT04tTkxTLTEkCisJCQkJCSsgc2l0ZUxvY2F0aW9uLmdldEFic29sdXRlUGF0aCgpCisJCQkJCSsgIiBjb3VsZCBub3QgYmUgY3JlYXRlZC4iLCAvLyROT04tTkxTLTEkCisJCQkJbXVlKTsKKwkJfQorCQlTaXRlQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciA9IG51bGw7CisJCWNvbnRlbnRQcm92aWRlciA9IG5ldyBTaXRlRmlsZUNvbnRlbnRQcm92aWRlcih1cmwpOworCisJCXNpdGUuc2V0U2l0ZUNvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOworCQljb250ZW50UHJvdmlkZXIuc2V0U2l0ZShzaXRlKTsKKwkJdHJ5IHsKKwkJCXNpdGUucmVzb2x2ZSh1cmwsIHVybCk7CisJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtdWUpIHsKKwkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKAorCQkJCSJVbmFibGUgdG8gcmVzb2x2ZSBVUkwgIiAvLyROT04tTkxTLTEkCisJCQkJCSsgKHVybCA9PSBudWxsID8gIiIgOiB1cmwudG9FeHRlcm5hbEZvcm0oKSksIC8vJE5PTi1OTFMtMSQKKwkJCQltdWUpOworCQl9CisJCXJldHVybiBzaXRlOworCX0KKwkvKioKKwkgKiAgCisJICovCisJcHJpdmF0ZSB2b2lkIHBhcnNlRG93bmxvYWRlZFBsdWdpbnNBbmRGcmFnbWVudHMoTWlycm9yU2l0ZSBzaXRlLAorCQkJRmlsZSBwbHVnaW5EaXIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJaWYgKCFwbHVnaW5EaXIuZXhpc3RzKCkpIHsKKwkJCXJldHVybjsKKwkJfQorCQlTdHJpbmdbXSBkaXIgPSBwbHVnaW5EaXIubGlzdChGZWF0dXJlUGFja2FnZWRDb250ZW50UHJvdmlkZXIuZmlsdGVyKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBkaXIubGVuZ3RoOyBpKyspIHsKKwkJCUlucHV0U3RyZWFtIGluID0gbnVsbDsKKwkJCXRyeSB7CisJCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUocGx1Z2luRGlyLCBkaXJbaV0pOworCQkJCUphckNvbnRlbnRSZWZlcmVuY2UgamFyUmVmZXJlbmNlID0gbmV3IEphckNvbnRlbnRSZWZlcmVuY2UoCisJCQkJCQludWxsLCBmaWxlKTsKKwkJCQlDb250ZW50UmVmZXJlbmNlIHJlZiA9IGphclJlZmVyZW5jZS5wZWVrKCJNRVRBLUlORi9NQU5JRkVTVC5NRiIsIG51bGwsIG51bGwpOyAvLyROT04tTkxTLTEkCisJCQkJaWYgKHJlZiAhPSBudWxsKSB7CisJCQkJCXRyeSB7CisJCQkJCQlpbiA9IHJlZi5nZXRJbnB1dFN0cmVhbSgpOworCQkJCQl9CisJCQkJCWNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CisJCQkJCQkvLyBpbiBjYXNlIG9mIGFuIGludmFsaWQgc2lnbmF0dXJlIGluIGphciwgd2Ugd2lsbCBjYXRjaCAKKwkJCQkJCS8vIGFuZCByZS10aHJvdyBhIGxpdHRsZSBtb3JlIHNwZWNpZmljIG1lc3NhZ2UuIE90aGVyd2lzZSwgaXQncyAKKwkJCQkJCS8vIGltcG9zc2libGUgdG8gdGVsbCB3aGljaCBqYXIgaGFkIHRoZSBwcm9ibGVtLiAKKwkJCQkJCVN0cmluZyBmaWxlbmFtZSA9IGZpbGUuZ2V0TmFtZSgpOworCQkJCQkJQ29yZUV4Y2VwdGlvbiB1cGRhdGVFeGNlcHRpb24gPSBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihmaWxlbmFtZSxlKTsKKwkJCQkJCXRocm93IHVwZGF0ZUV4Y2VwdGlvbjsKKwkJCQkJfQorCQkJCQlCdW5kbGVNYW5pZmVzdCBtYW5pZmVzdCA9IG5ldyBCdW5kbGVNYW5pZmVzdChpbik7CisJCQkJCWlmIChtYW5pZmVzdC5leGlzdHMoKSkgeworCQkJCQkJc2l0ZQorCQkJCQkJCQkuYWRkRG93bmxvYWRlZFBsdWdpbkVudHJ5KG1hbmlmZXN0CisJCQkJCQkJCQkJLmdldFBsdWdpbkVudHJ5KCkpOworCQkJCQkJY29udGludWU7CisJCQkJCX0KKwkJCQl9CisJCQkJcmVmID0gamFyUmVmZXJlbmNlLnBlZWsoInBsdWdpbi54bWwiLCBudWxsLCBudWxsKTsgLy8kTk9OLU5MUy0xJAorCQkJCWlmIChyZWYgPT0gbnVsbCkgeworCQkJCQlyZWYgPSBqYXJSZWZlcmVuY2UucGVlaygiZnJhZ21lbnQueG1sIiwgbnVsbCwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKKwkJCQl9CisJCQkJaWYgKHJlZiAhPSBudWxsKSB7CisJCQkJCWluID0gcmVmLmdldElucHV0U3RyZWFtKCk7CisJCQkJCVBsdWdpbkVudHJ5IGVudHJ5ID0gbmV3IERlZmF1bHRQbHVnaW5QYXJzZXIoKS5wYXJzZShpbik7CisJCQkJCXNpdGUuYWRkRG93bmxvYWRlZFBsdWdpbkVudHJ5KGVudHJ5KTsKKwkJCQl9CisJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJU3RhbmRhbG9uZVVwZGF0ZUFwcGxpY2F0aW9uLmV4Y2VwdGlvbkxvZ2dlZCgpOworCQkJCVVwZGF0ZUNvcmUubG9nKGUpOworCQkJfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKKwkJCQlTdGFuZGFsb25lVXBkYXRlQXBwbGljYXRpb24uZXhjZXB0aW9uTG9nZ2VkKCk7CisJCQkJVXBkYXRlQ29yZS5sb2coZSk7CisJCQl9IGZpbmFsbHkgeworCQkJCWlmKGluICE9bnVsbCl7CisJCQkJCXRyeXsKKwkJCQkJCWluLmNsb3NlKCk7CisJCQkJCX1jYXRjaChJT0V4Y2VwdGlvbiBjZSl7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9CisJLyoqCisJKiBNZXRob2QgcGFyc2VGZWF0dXJlLgorCSogQHRocm93cyBDb3JlRXhjZXB0aW9uCisJKi8KKwlwcml2YXRlIHZvaWQgcGFyc2VEb3dubG9hZGVkRmVhdHVyZXMoTWlycm9yU2l0ZSBzaXRlLCBGaWxlIGZlYXR1cmVEaXIpCisJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJaWYgKGZlYXR1cmVEaXIuZXhpc3RzKCkpIHsKKwkJCVN0cmluZ1tdIGRpcjsKKwkJCVNpdGVGZWF0dXJlUmVmZXJlbmNlTW9kZWwgZmVhdHVyZVJlZjsKKwkJCVVSTCBmZWF0dXJlVVJMOworCQkJRmlsZSBjdXJyZW50RmVhdHVyZUZpbGU7CisJCQlTdHJpbmcgbmV3RmlsZVBhdGggPSBudWxsOworCisJCQl0cnkgeworCQkJCS8vIG9ubHkgbGlzdCBKQVIgZmlsZXMKKwkJCQlkaXIgPSBmZWF0dXJlRGlyLmxpc3QoRmVhdHVyZVBhY2thZ2VkQ29udGVudFByb3ZpZGVyLmZpbHRlcik7CisJCQkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IGRpci5sZW5ndGg7IGluZGV4KyspIHsKKworCQkJCQkvLyBjaGVjayBpZiB0aGUgSkFSIGZpbGUgY29udGFpbnMgYSBmZWF0dXJlLnhtbAorCQkJCQljdXJyZW50RmVhdHVyZUZpbGUgPSBuZXcgRmlsZShmZWF0dXJlRGlyLCBkaXJbaW5kZXhdKTsKKwkJCQkJSmFyQ29udGVudFJlZmVyZW5jZSByZWYgPQorCQkJCQkJbmV3IEphckNvbnRlbnRSZWZlcmVuY2UoIiIsIGN1cnJlbnRGZWF0dXJlRmlsZSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJQ29udGVudFJlZmVyZW5jZSByZXN1bHQgPSBudWxsOworCQkJCQl0cnkgeworCQkJCQkJcmVzdWx0ID0gcmVmLnBlZWsoRmVhdHVyZS5GRUFUVVJFX1hNTCwgbnVsbCwgbnVsbCk7CisJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQkJCVVwZGF0ZUNvcmUud2FybigKKwkJCQkJCQkiRXhjZXB0aW9uIHJldHJpZXZpbmcgZmVhdHVyZS54bWwgaW4gZmlsZToiIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJKyBjdXJyZW50RmVhdHVyZUZpbGUsCisJCQkJCQkJZSk7CisJCQkJCX0KKwkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7CisJCQkJCQlVcGRhdGVDb3JlLndhcm4oCisJCQkJCQkJIlVuYWJsZSB0byBmaW5kIGZlYXR1cmUueG1sIGluIGZpbGU6IiAvLyROT04tTkxTLTEkCisJCQkJCQkJCSsgY3VycmVudEZlYXR1cmVGaWxlKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWZlYXR1cmVVUkwgPSBjdXJyZW50RmVhdHVyZUZpbGUudG9VUkwoKTsKKwkJCQkJCWZlYXR1cmVSZWYgPSBjcmVhdGVGZWF0dXJlUmVmZXJlbmNlTW9kZWwoKTsKKwkJCQkJCWZlYXR1cmVSZWYuc2V0U2l0ZU1vZGVsKHNpdGUpOworCQkJCQkJZmVhdHVyZVJlZi5zZXRVUkxTdHJpbmcoZmVhdHVyZVVSTC50b0V4dGVybmFsRm9ybSgpKTsKKwkJCQkJCWZlYXR1cmVSZWYuc2V0VHlwZShJU2l0ZS5ERUZBVUxUX1BBQ0tBR0VEX0ZFQVRVUkVfVFlQRSk7CisJCQkJCQlmZWF0dXJlUmVmLnNldEZlYXR1cmVJZGVudGlmaWVyKAorCQkJCQkJCWZlYXR1cmVSZWYKKwkJCQkJCQkJLmdldFZlcnNpb25lZElkZW50aWZpZXIoKQorCQkJCQkJCQkuZ2V0SWRlbnRpZmllcigpKTsKKwkJCQkJCWZlYXR1cmVSZWYuc2V0RmVhdHVyZVZlcnNpb24oCisJCQkJCQkJZmVhdHVyZVJlZgorCQkJCQkJCQkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpCisJCQkJCQkJCS5nZXRWZXJzaW9uKCkKKwkJCQkJCQkJLnRvU3RyaW5nKCkpOworCQkJCQkJc2l0ZS5hZGREb3dubG9hZGVkRmVhdHVyZVJlZmVyZW5jZU1vZGVsKGZlYXR1cmVSZWYpOworCQkJCQl9CisJCQkJfQorCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKwkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbigKKwkJCQkJIlVuYWJsZSB0byBjcmVhdGUgVVJMIGZvciBmaWxlICIgKyBuZXdGaWxlUGF0aCArICIuIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJCWUpOworCQkJfQorCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9tb2RlbC9CdW5kbGVNYW5pZmVzdC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvbW9kZWwvQnVuZGxlTWFuaWZlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmJlZWVlCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvbW9kZWwvQnVuZGxlTWFuaWZlc3QuamF2YQpAQCAtMCwwICsxLDExMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5tb2RlbDsKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS51dGlsLmphci4qOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuKjsKKy8qKgorICogUGFyc2VzIE1BTklGRVNULk1GCisgKi8KK3B1YmxpYyBjbGFzcyBCdW5kbGVNYW5pZmVzdCB7CisJcHJpdmF0ZSBQbHVnaW5FbnRyeSBwbHVnaW5FbnRyeTsKKwlwcml2YXRlIElPRXhjZXB0aW9uIGV4Y2VwdGlvbjsKKwkvKioKKwkgKiBDb25zdHJ1Y3RvciBmb3IgbG9jYWwgZmlsZQorCSAqLworcHVibGljIEJ1bmRsZU1hbmlmZXN0KEZpbGUgbWFuaWZlc3QpIHsKKwkJc3VwZXIoKTsKKwkJaWYgKG1hbmlmZXN0LmV4aXN0cygpICYmICFtYW5pZmVzdC5pc0RpcmVjdG9yeSgpKSB7CisJCQlGaWxlSW5wdXRTdHJlYW0gZm9zID0gbnVsbDsKKwkJCXRyeSB7CisJCQkJZm9zID0gbmV3IEZpbGVJbnB1dFN0cmVhbShtYW5pZmVzdCk7CisJCQkJcGFyc2UoZm9zKTsKKwkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworCQkJfSBmaW5hbGx5IHsKKwkJCQlpZiAoZm9zICE9IG51bGwpIHsKKwkJCQkJdHJ5IHsKKwkJCQkJCWZvcy5jbG9zZSgpOworCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9CisJLyoqCisJICogQ29uc3RydWN0b3IgZm9yIGxvY2FsIGZpbGUKKwkgKi8KKwlwdWJsaWMgQnVuZGxlTWFuaWZlc3QoSW5wdXRTdHJlYW0gaW5wdXQpIHsKKwkJc3VwZXIoKTsKKwkJaWYgKGlucHV0ICE9IG51bGwpIHsKKwkJCXBhcnNlKGlucHV0KTsKKwkJfQorCX0KKwkvKioKKwkgKiBQYXJzZXMgbWFuaWZlc3QsIGNyZWF0ZXMgUGx1Z2luRW50cnkgaWYgbWFuaWZlc3QgaXMgdmFsaWQsIHN0b3JlcworCSAqIGV4Y2VwdGlvbiBpZiBhbnkgb2NjdXJzCisJICogCisJICogQHBhcmFtIGluCisJICogICAgICAgICAgICBJbnB1dFN0cmVhbQorCSAqLworCXByaXZhdGUgdm9pZCBwYXJzZShJbnB1dFN0cmVhbSBpbikgeworCQl0cnkgeworCQkJTWFuaWZlc3QgbSA9IG5ldyBNYW5pZmVzdChpbik7CisJCQlBdHRyaWJ1dGVzIGEgPSBtLmdldE1haW5BdHRyaWJ1dGVzKCk7CisJCQkvLyBwbHVnaW4gaWQKKwkJCVN0cmluZyBzeW1ib2xpY05hbWUgPSBhLmdldFZhbHVlKENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKTsKKwkJCWlmIChzeW1ib2xpY05hbWUgPT0gbnVsbCkgeworCQkJCS8vIEluIEVjbGlwc2UgbWFuaWZlc3QgbXVzdCBoYXZlIEJ1bmRsZS1TeW1ib2xpY05hbWUgYXR0cmlidXRlCisJCQkJcmV0dXJuOworCQkJfQorCQkJU3RyaW5nIGlkOworCQkJdHJ5IHsKKwkJCQlNYW5pZmVzdEVsZW1lbnRbXSBlbGVtZW50cyA9IE1hbmlmZXN0RWxlbWVudC5wYXJzZUhlYWRlcigKKwkJCQkJCUNvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCBzeW1ib2xpY05hbWUpOworCQkJCWlkID0gZWxlbWVudHNbMF0uZ2V0VmFsdWUoKTsKKwkJCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBiZSkgeworCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihiZS5nZXRNZXNzYWdlKCkpOworCQkJfQorCQkJLy8gcGx1Z2luIHZlcnNpb24KKwkJCVN0cmluZyB2ZXJzaW9uID0gYS5nZXRWYWx1ZShDb25zdGFudHMuQlVORExFX1ZFUlNJT04pOworCQkJaWYgKHZlcnNpb24gPT0gbnVsbCkgeworCQkJCXJldHVybjsKKwkJCX0KKwkJCVN0cmluZyBob3N0UGx1Z2luID0gYS5nZXRWYWx1ZShDb25zdGFudHMuRlJBR01FTlRfSE9TVCk7CisJCQlwbHVnaW5FbnRyeSA9IG5ldyBQbHVnaW5FbnRyeSgpOworCQkJcGx1Z2luRW50cnkuc2V0VmVyc2lvbmVkSWRlbnRpZmllcihuZXcgVmVyc2lvbmVkSWRlbnRpZmllcihpZCwKKwkJCQkJdmVyc2lvbikpOworCQkJcGx1Z2luRW50cnkuaXNGcmFnbWVudChob3N0UGx1Z2luICE9IG51bGwKKwkJCQkJJiYgaG9zdFBsdWdpbi5sZW5ndGgoKSA+IDApOworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKwkJCWV4Y2VwdGlvbiA9IGlvZTsKKwkJfQorCX0KKwlwdWJsaWMgYm9vbGVhbiBleGlzdHMoKSB7CisJCXJldHVybiBleGNlcHRpb24gIT0gbnVsbCB8fCBwbHVnaW5FbnRyeSAhPSBudWxsOworCX0KKwkvKioKKwkgKiBPYnRhaW5zIFBsdWdpbkVudHJ5IGZyb20gYSBtYW5pZmVzdC4KKwkgKiAKKwkgKiBAcmV0dXJuIFBsdWdpbkVudHJ5IG9yIG51bGwgaWYgdmFsaWQgbWFuaWZlc3QgZG9lcyBub3QgZXhpc3QKKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisJICogICAgICAgICAgICAgaWYgZXhjZXB0aW9uIGR1cmluZyBwYXJzaW5nCisJICovCisJcHVibGljIFBsdWdpbkVudHJ5IGdldFBsdWdpbkVudHJ5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJaWYgKGV4Y2VwdGlvbiAhPSBudWxsKSB7CisJCQl0aHJvdyBleGNlcHRpb247CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gcGx1Z2luRW50cnk7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9tb2RlbC9Db25maWd1cmF0aW9uQWN0aXZpdHlNb2RlbC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvbW9kZWwvQ29uZmlndXJhdGlvbkFjdGl2aXR5TW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWYxYjYzCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvbW9kZWwvQ29uZmlndXJhdGlvbkFjdGl2aXR5TW9kZWwuamF2YQpAQCAtMCwwICsxLDExNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5tb2RlbDsKKyAKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLio7CisKK3B1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uQWN0aXZpdHlNb2RlbCBleHRlbmRzIE1vZGVsT2JqZWN0eworCQorCXByaXZhdGUgU3RyaW5nIGxhYmVsOworCXByaXZhdGUgaW50IGFjdGlvbjsKKwlwcml2YXRlIERhdGUgZGF0ZTsKKwlwcml2YXRlIGludCBzdGF0dXM7CisJcHJpdmF0ZSBJbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsIGluc3RhbGxDb25maWd1cmF0aW9uOworCQorCisJLyoqCisJICogQ29uc3RydWN0b3IgZm9yIENvbmZpZ3VyYXRpb25BY3Rpdml0eU1vZGVsLgorCSAqLworCXB1YmxpYyBDb25maWd1cmF0aW9uQWN0aXZpdHlNb2RlbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiBAc2luY2UgMi4wCisJICovCisJcHVibGljIGludCBnZXRBY3Rpb24oKSB7CisJCXJldHVybiBhY3Rpb247CisJfQorCisJLyoqCisJICogQHNpbmNlIDIuMAorCSAqLworCXB1YmxpYyBEYXRlIGdldERhdGUoKSB7CisJCXJldHVybiBkYXRlOworCX0KKworCS8qKgorCSAqIEBzaW5jZSAyLjAKKwkgKi8KKwlwdWJsaWMgaW50IGdldFN0YXR1cygpIHsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSBkYXRlLgorCSAqIEBwYXJhbSBkYXRlIFRoZSBkYXRlIHRvIHNldAorCSAqLworCXB1YmxpYyB2b2lkIHNldERhdGUoRGF0ZSBkYXRlKSB7CisJCWFzc2VydElzV3JpdGVhYmxlKCk7CisJCXRoaXMuZGF0ZSA9IGRhdGU7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgc3RhdHVzLgorCSAqIEBwYXJhbSBzdGF0dXMgVGhlIHN0YXR1cyB0byBzZXQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTdGF0dXMoaW50IHN0YXR1cykgeworCQlhc3NlcnRJc1dyaXRlYWJsZSgpOworCQl0aGlzLnN0YXR1cyA9IHN0YXR1czsKKwl9CisKKwkvKioKKwkgKiBAc2luY2UgMi4wCisJICovCisJcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKKwkJcmV0dXJuIGxhYmVsOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIGxhYmVsLgorCSAqIEBwYXJhbSBsYWJlbCBUaGUgbGFiZWwgdG8gc2V0CisJICovCisJcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7CisJCWFzc2VydElzV3JpdGVhYmxlKCk7CisJCXRoaXMubGFiZWwgPSBsYWJlbDsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSBhY3Rpb24uCisJICogQHBhcmFtIGFjdGlvbiBUaGUgYWN0aW9uIHRvIHNldAorCSAqLworCXB1YmxpYyB2b2lkIHNldEFjdGlvbihpbnQgYWN0aW9uKSB7CisJCWFzc2VydElzV3JpdGVhYmxlKCk7CisJCXRoaXMuYWN0aW9uID0gYWN0aW9uOworCX0KKworCS8qKgorCSAqIEdldHMgdGhlIGluc3RhbGxDb25maWd1cmF0aW9uLgorCSAqIEByZXR1cm4gUmV0dXJucyBhIEluc3RhbGxDb25maWd1cmF0aW9uTW9kZWwKKwkgKi8KKwlwdWJsaWMgSW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbCBnZXRJbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsKCkgeworCQlyZXR1cm4gaW5zdGFsbENvbmZpZ3VyYXRpb247CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgaW5zdGFsbENvbmZpZ3VyYXRpb24uCisJICogQHBhcmFtIGluc3RhbGxDb25maWd1cmF0aW9uIFRoZSBpbnN0YWxsQ29uZmlndXJhdGlvbiB0byBzZXQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRJbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsKEluc3RhbGxDb25maWd1cmF0aW9uTW9kZWwgaW5zdGFsbENvbmZpZ3VyYXRpb24pIHsKKwkJYXNzZXJ0SXNXcml0ZWFibGUoKTsJCQorCQl0aGlzLmluc3RhbGxDb25maWd1cmF0aW9uID0gaW5zdGFsbENvbmZpZ3VyYXRpb247CisJfQorCit9CisKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL21vZGVsL0NvbmZpZ3VyYXRpb25Qb2xpY3lNb2RlbC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvbW9kZWwvQ29uZmlndXJhdGlvblBvbGljeU1vZGVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRlNTExNgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL21vZGVsL0NvbmZpZ3VyYXRpb25Qb2xpY3lNb2RlbC5qYXZhCkBAIC0wLDAgKzEsMjgwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm1vZGVsOworCitpbXBvcnQgamF2YS5uZXQuKjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOworCisvKioKKyAqIAorICovCitwdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvblBvbGljeU1vZGVsIGV4dGVuZHMgTW9kZWxPYmplY3QgeworCisJCisJCisKKwlwcml2YXRlIGludCBwb2xpY3k7CisJcHJpdmF0ZSBNYXAgLyogb2YgRmVhdHVyZVJlZmVyZW5jZU1vZGVsICovY29uZmlndXJlZEZlYXR1cmVSZWZlcmVuY2VzOworCXByaXZhdGUgTWFwIC8qIG9mIEZlYXR1cmVSZWZlcmVuY2VNb2RlbCAqL3VuY29uZmlndXJlZEZlYXR1cmVSZWZlcmVuY2VzOworCQorCS8vIHNpbmNlIDIuMC4yCisJcHJpdmF0ZSBDb25maWd1cmVkU2l0ZU1vZGVsIGNvbmZpZ3VyZWRTaXRlTW9kZWw7CisJCisJLy8gc2luY2UgMi4xCisJcHJpdmF0ZSBib29sZWFuIGVuYWJsZTsKKworCS8qKgorCSAqIENvbnN0cnVjdG9yIGZvciBDb25maWd1cmF0aW9uUG9saWN5TW9kZWwuCisJICovCisJcHVibGljIENvbmZpZ3VyYXRpb25Qb2xpY3lNb2RlbCgpIHsKKwkJc3VwZXIoKTsKKwkJZW5hYmxlID0gdHJ1ZTsKKwkJY29uZmlndXJlZEZlYXR1cmVSZWZlcmVuY2VzID0gbmV3IEhhc2hNYXAoKTsKKy8vCQl1bmNvbmZpZ3VyZWRGZWF0dXJlUmVmZXJlbmNlcyA9IG5ldyBIYXNoTWFwKCk7CQkKKwl9CisKKwkvKioKKwkgKiBAc2luY2UgMi4wCisJICovCisJcHVibGljIGludCBnZXRQb2xpY3koKSB7CisJCXJldHVybiBwb2xpY3k7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgcG9saWN5LgorCSAqIEBwYXJhbSBwb2xpY3kgVGhlIHBvbGljeSB0byBzZXQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRQb2xpY3koaW50IHBvbGljeSkgeworCQlhc3NlcnRJc1dyaXRlYWJsZSgpOworCQl0aGlzLnBvbGljeSA9IHBvbGljeTsKKwl9CisKKwkvKioKKwkgKiBAc2luY2UgMi4wCisJICovCisJcHVibGljIEZlYXR1cmVSZWZlcmVuY2VNb2RlbFtdIGdldENvbmZpZ3VyZWRGZWF0dXJlc01vZGVsKCkgeworCQlpZiAoY29uZmlndXJlZEZlYXR1cmVSZWZlcmVuY2VzPT1udWxsIHx8IGNvbmZpZ3VyZWRGZWF0dXJlUmVmZXJlbmNlcy5pc0VtcHR5KCkpCisJCQlyZXR1cm4gbmV3IEZlYXR1cmVSZWZlcmVuY2VNb2RlbFswXTsKKwkJcmV0dXJuIChGZWF0dXJlUmVmZXJlbmNlTW9kZWxbXSkgY29uZmlndXJlZEZlYXR1cmVSZWZlcmVuY2VzLmtleVNldCgpLnRvQXJyYXkoYXJyYXlUeXBlRm9yKGNvbmZpZ3VyZWRGZWF0dXJlUmVmZXJlbmNlcy5rZXlTZXQoKSkpOworCX0KKworCS8qKgorCSAqIEBzaW5jZSAyLjAKKwkgKi8KKwlwdWJsaWMgRmVhdHVyZVJlZmVyZW5jZU1vZGVsW10gZ2V0VW5jb25maWd1cmVkRmVhdHVyZXNNb2RlbCgpIHsKKwkJLy8gb2J0YWluIHVuY29uZmlndXJlZCBmZWF0dXJlcyBieSBjb21wYXJpbmcgY29uZmlndXJlZCBvbmVzIHdpdGggdGhvc2UgaW5zdGFsbGVkCisJCWlmICh1bmNvbmZpZ3VyZWRGZWF0dXJlUmVmZXJlbmNlcyA9PSBudWxsCisJCQkJJiYgY29uZmlndXJlZFNpdGVNb2RlbCAhPSBudWxsCisJCQkJJiYgY29uZmlndXJlZFNpdGVNb2RlbC5nZXRTaXRlTW9kZWwoKSAhPSBudWxsKSB7CisJCQlJU2l0ZSBzaXRlID0gKElTaXRlKSBjb25maWd1cmVkU2l0ZU1vZGVsLmdldFNpdGVNb2RlbCgpOworCQkJSVNpdGVGZWF0dXJlUmVmZXJlbmNlW10gc2l0ZUZlYXR1cmVzID0gc2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpOworCQkJaWYgKHNpdGVGZWF0dXJlcy5sZW5ndGggPiBnZXRDb25maWd1cmVkRmVhdHVyZXNNb2RlbCgpLmxlbmd0aCkgeworCQkJCWZvciAoaW50IGk9MDsgaTxzaXRlRmVhdHVyZXMubGVuZ3RoOyBpKyspIHsKKwkJCQkJaWYgKCEoc2l0ZUZlYXR1cmVzW2ldIGluc3RhbmNlb2YgU2l0ZUZlYXR1cmVSZWZlcmVuY2UpKQorCQkJCQkJY29udGludWU7CisJCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gY29uZmlndXJlZEZlYXR1cmVSZWZlcmVuY2VzLmtleVNldCgpLml0ZXJhdG9yKCk7CisJCQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKKwkJCQkJd2hpbGUoIWZvdW5kICYmIGl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJCQkJRmVhdHVyZVJlZmVyZW5jZU1vZGVsIGYgPSAoRmVhdHVyZVJlZmVyZW5jZU1vZGVsKWl0ZXJhdG9yLm5leHQoKTsKKwkJCQkJCWlmIChVcGRhdGVNYW5hZ2VyVXRpbHMuc2FtZVVSTChmLmdldFVSTCgpLCBzaXRlRmVhdHVyZXNbaV0uZ2V0VVJMKCkpKQorCQkJCQkJCWZvdW5kID0gdHJ1ZTsKKwkJCQkJfQorCQkJCQlpZiAoIWZvdW5kKQorCQkJCQkJYWRkVW5jb25maWd1cmVkRmVhdHVyZVJlZmVyZW5jZSgoU2l0ZUZlYXR1cmVSZWZlcmVuY2Upc2l0ZUZlYXR1cmVzW2ldKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKHVuY29uZmlndXJlZEZlYXR1cmVSZWZlcmVuY2VzID09IG51bGwKKwkJCQl8fCB1bmNvbmZpZ3VyZWRGZWF0dXJlUmVmZXJlbmNlcy5pc0VtcHR5KCkpCisJCQlyZXR1cm4gbmV3IEZlYXR1cmVSZWZlcmVuY2VNb2RlbFswXTsKKwkJcmV0dXJuIChGZWF0dXJlUmVmZXJlbmNlTW9kZWxbXSkgdW5jb25maWd1cmVkRmVhdHVyZVJlZmVyZW5jZXMua2V5U2V0KCkKKwkJCQkudG9BcnJheShhcnJheVR5cGVGb3IodW5jb25maWd1cmVkRmVhdHVyZVJlZmVyZW5jZXMua2V5U2V0KCkpKTsKKwl9CisKKwkvKioKKwkgKiBHZXRzIHRoZSBjb25maWd1cmVkU2l0ZU1vZGVsLgorCSAqIEByZXR1cm4gUmV0dXJucyBhIENvbmZpZ3VyZWRTaXRlTW9kZWwKKwkgKiBAc2luY2UgMi4wLjIKKwkgKi8KKwlwdWJsaWMgQ29uZmlndXJlZFNpdGVNb2RlbCBnZXRDb25maWd1cmVkU2l0ZU1vZGVsKCkgeworCQlyZXR1cm4gY29uZmlndXJlZFNpdGVNb2RlbDsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSBjb25maWd1cmVkU2l0ZU1vZGVsLgorCSAqIEBwYXJhbSBjb25maWd1cmVkU2l0ZU1vZGVsIFRoZSBjb25maWd1cmVkU2l0ZU1vZGVsIHRvIHNldAorCSAqIEBzaW5jZSAyLjAuMgorCSAqLworCXB1YmxpYyB2b2lkIHNldENvbmZpZ3VyZWRTaXRlTW9kZWwoQ29uZmlndXJlZFNpdGVNb2RlbCBjb25maWd1cmVkU2l0ZU1vZGVsKSB7CisJCXRoaXMuY29uZmlndXJlZFNpdGVNb2RlbCA9IGNvbmZpZ3VyZWRTaXRlTW9kZWw7CisJfQorCisJLyoqCisJICogCisJICovCisJcHJpdmF0ZSBib29sZWFuIHJlbW92ZShGZWF0dXJlUmVmZXJlbmNlTW9kZWwgZmVhdHVyZSwgTWFwIGxpc3QpIHsKKwkJVVJMIGZlYXR1cmVVUkwgPSBmZWF0dXJlLmdldFVSTCgpOworCQlib29sZWFuIGZvdW5kID0gZmFsc2U7CisJCUl0ZXJhdG9yIGl0ZXIgPSBsaXN0LmtleVNldCgpLml0ZXJhdG9yKCk7CisJCXdoaWxlIChpdGVyLmhhc05leHQoKSAmJiAhZm91bmQpIHsKKwkJCUZlYXR1cmVSZWZlcmVuY2VNb2RlbCBlbGVtZW50ID0gKEZlYXR1cmVSZWZlcmVuY2VNb2RlbCkgaXRlci5uZXh0KCk7CisJCQlpZiAoVXBkYXRlTWFuYWdlclV0aWxzLnNhbWVVUkwoZWxlbWVudC5nZXRVUkwoKSxmZWF0dXJlVVJMKSkgeworCQkJCWxpc3QucmVtb3ZlKGVsZW1lbnQpOworCQkJCWZvdW5kID0gdHJ1ZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZm91bmQ7CisJfQorCisJLyoqCisJICogcmV0dXJucyBhbiBhcnJheSBvZiBzdHJpbmcgY29ycmVzcG9uZGluZyB0byBwbHVnaW5zIGZpbGUKKwkgKi8KKwkvKnBhY2thZ2UqLworCisJCisJLyoqCisJICogCisJICovCisJcHJpdmF0ZSB2b2lkIGFkZChGZWF0dXJlUmVmZXJlbmNlTW9kZWwgZmVhdHVyZSwgTWFwIGxpc3QpIHsKKwkJVVJMIGZlYXR1cmVVUkwgPSBmZWF0dXJlLmdldFVSTCgpOworCQlib29sZWFuIGZvdW5kID0gZmFsc2U7CisJCUl0ZXJhdG9yIGl0ZXIgPSBsaXN0LmtleVNldCgpLml0ZXJhdG9yKCk7CisJCXdoaWxlIChpdGVyLmhhc05leHQoKSAmJiAhZm91bmQpIHsKKwkJCUZlYXR1cmVSZWZlcmVuY2VNb2RlbCBlbGVtZW50ID0gKEZlYXR1cmVSZWZlcmVuY2VNb2RlbCkgaXRlci5uZXh0KCk7CisJCQlpZiAoVXBkYXRlTWFuYWdlclV0aWxzLnNhbWVVUkwoZWxlbWVudC5nZXRVUkwoKSxmZWF0dXJlVVJMKSkgeworCQkJCWZvdW5kID0gdHJ1ZTsKKwkJCX0KKwkJfQorCisJCWlmICghZm91bmQpIHsKKwkJCWxpc3QucHV0KGZlYXR1cmUsbnVsbCk7CisJCX0gZWxzZSB7CisJCQlVcGRhdGVDb3JlLndhcm4oIkZlYXR1cmUgUmVmZXJlbmNlIDoiK2ZlYXR1cmUrIiBhbHJlYWR5IHBhcnQgb2YgdGhlIGxpc3QuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQl9CisJfQorCisJLyoqCisJICogYWRkcyBhIGZlYXR1cmUgaW4gdGhlIGNvbmZpZ3VyZWRSZWZlcmVuY2UgbGlzdAorCSAqIGFsc28gdXNlZCBieSB0aGUgcGFyc2VyIHRvIGF2b2lkIGNyZWF0aW5nIGFub3RoZXIgYWN0aXZpdHkKKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRDb25maWd1cmVkRmVhdHVyZVJlZmVyZW5jZShGZWF0dXJlUmVmZXJlbmNlTW9kZWwgZmVhdHVyZSkgeworCQlhc3NlcnRJc1dyaXRlYWJsZSgpOworCQkKKwkJaWYgKGNvbmZpZ3VyZWRGZWF0dXJlUmVmZXJlbmNlcyA9PSBudWxsKQorCQkJdGhpcy5jb25maWd1cmVkRmVhdHVyZVJlZmVyZW5jZXMgPSBuZXcgSGFzaE1hcCgpOworCQlpZiAoIWNvbmZpZ3VyZWRGZWF0dXJlUmVmZXJlbmNlcy5jb250YWluc0tleShmZWF0dXJlKSl7CisJCQkvL0RFQlVHOgorCQkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX0NPTkZJR1VSQVRJT04peworCQkJCVVwZGF0ZUNvcmUuZGVidWcoIkNvbmZpZ3VyaW5nICIrZmVhdHVyZS5nZXRVUkxTdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJCXRoaXMuYWRkKGZlYXR1cmUsIGNvbmZpZ3VyZWRGZWF0dXJlUmVmZXJlbmNlcyk7CisJCX0JCisKKwkJLy8gd2hlbiB1c2VyIGNvbmZpZ3VyZSBhIGZlYXR1cmUsCisJCS8vIHdlIGhhdmUgdG8gcmVtb3ZlIGl0IGZyb20gdW5jb25maWd1cmVkIGZlYXR1cmUgaWYgaXQgZXhpc3RzCisJCS8vIGJlY2F1c2UgdGhlIHVzZXIgZG9lc24ndCBrbm93Li4uCisJCWlmICh1bmNvbmZpZ3VyZWRGZWF0dXJlUmVmZXJlbmNlcyAhPSBudWxsKSB7CisJCQlib29sZWFuIHN1Y2Nlc3MgPSByZW1vdmUoZmVhdHVyZSwgdW5jb25maWd1cmVkRmVhdHVyZVJlZmVyZW5jZXMpOworCQkJaWYgKCFzdWNjZXNzKQorCQkJCVVwZGF0ZUNvcmUud2FybigiRmVhdHVyZSBub3QgcGFydCBvZiBVbmNvbmZpZ3VyZWQgbGlzdDogIitmZWF0dXJlLmdldFVSTFN0cmluZygpKTsJCQkgLy8kTk9OLU5MUy0xJAorCQl9CisKKwl9CisKKwkvKioKKwkgKiBhZGRzIGEgZmVhdHVyZSBpbiB0aGUgbGlzdAorCSAqIGFsc28gdXNlZCBieSB0aGUgcGFyc2VyIHRvIGF2b2lkIGNyZWF0aW5nIGFub3RoZXIgYWN0aXZpdHkKKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRVbmNvbmZpZ3VyZWRGZWF0dXJlUmVmZXJlbmNlKEZlYXR1cmVSZWZlcmVuY2VNb2RlbCBmZWF0dXJlKSB7CisJCWFzc2VydElzV3JpdGVhYmxlKCk7CisJCWlmICh1bmNvbmZpZ3VyZWRGZWF0dXJlUmVmZXJlbmNlcyA9PSBudWxsKQorCQkJdGhpcy51bmNvbmZpZ3VyZWRGZWF0dXJlUmVmZXJlbmNlcyA9IG5ldyBIYXNoTWFwKCk7CisJCWlmICghdW5jb25maWd1cmVkRmVhdHVyZVJlZmVyZW5jZXMuY29udGFpbnNLZXkoZmVhdHVyZSkpeworCQkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX0NPTkZJR1VSQVRJT04peworCQkJCVVwZGF0ZUNvcmUuZGVidWcoIlVuY29uZmlndXJpbmcgIitmZWF0dXJlLmdldFVSTFN0cmluZygpKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQkJdGhpcy5hZGQoZmVhdHVyZSwgdW5jb25maWd1cmVkRmVhdHVyZVJlZmVyZW5jZXMpOworCQl9CQorCisJCS8vIGFuIHVuY29uZmlndXJlZCBmZWF0dXJlIGlzIGFsd2F5cyBmcm9tIGEgY29uZmlndXJlZCBvbmUgbm8gPworCQkvLyB1bmxlc3MgaXQgd2FzIHBhcnNlZCByaWdodCA/CisJCWlmIChjb25maWd1cmVkRmVhdHVyZVJlZmVyZW5jZXMgIT0gbnVsbCkgeworCQkJYm9vbGVhbiBzdWNjZXNzID0gcmVtb3ZlKGZlYXR1cmUsIGNvbmZpZ3VyZWRGZWF0dXJlUmVmZXJlbmNlcyk7CisJCQlpZiAoIXN1Y2Nlc3MpCisJCQkJVXBkYXRlQ29yZS53YXJuKCJGZWF0dXJlIG5vdCBwYXJ0IG9mIENvbmZpZ3VyZWQgbGlzdDogIitmZWF0dXJlLmdldFVSTFN0cmluZygpKTsJCQkJIC8vJE5PTi1OTFMtMSQKKwkJfQorCX0KKworCS8qKgorCSAqIHJlbW92ZXMgYSBmZWF0dXJlIGZyb20gYW55IGxpc3QKKwkgKi8KKwlwdWJsaWMgdm9pZCByZW1vdmVGZWF0dXJlUmVmZXJlbmNlKEZlYXR1cmVSZWZlcmVuY2VNb2RlbCBmZWF0dXJlKSB7CisJCWFzc2VydElzV3JpdGVhYmxlKCk7CisJCWlmICh1bmNvbmZpZ3VyZWRGZWF0dXJlUmVmZXJlbmNlcyE9bnVsbCl7CisJCQlib29sZWFuIHN1Y2Nlc3MgPSByZW1vdmUoZmVhdHVyZSwgdW5jb25maWd1cmVkRmVhdHVyZVJlZmVyZW5jZXMpOworCQkJaWYgKCFzdWNjZXNzKQorCQkJCVVwZGF0ZUNvcmUud2FybihmZWF0dXJlLmdldFVSTFN0cmluZygpKyIgbm90IHBhcnQgb2YgdW5jb25maWd1cmVkIGxpc3QuIik7CQkJCQkJCSAvLyROT04tTkxTLTEkCisJCX0KKworCQlpZiAoY29uZmlndXJlZEZlYXR1cmVSZWZlcmVuY2VzICE9IG51bGwpIHsKKwkJCWJvb2xlYW4gc3VjY2VzcyA9IHJlbW92ZShmZWF0dXJlLCBjb25maWd1cmVkRmVhdHVyZVJlZmVyZW5jZXMpOworCQkJaWYgKCFzdWNjZXNzKQorCQkJCVVwZGF0ZUNvcmUud2FybihmZWF0dXJlLmdldFVSTFN0cmluZygpKyIgbm90IHBhcnQgb2YgY29uZmlndXJlZCBsaXN0LiIpOwkJCQkJCQkgLy8kTk9OLU5MUy0xJAorCQl9CisJfQorCQorCS8qKgorCSAqIFNldHMgdGhlIHVuY29uZmlndXJlZEZlYXR1cmVSZWZlcmVuY2VzLgorCSAqIEBwYXJhbSBmZWF0dXJlUmVmZXJlbmNlcyBUaGUgdW5jb25maWd1cmVkRmVhdHVyZVJlZmVyZW5jZXMgdG8gc2V0CisJICovCisJcHJvdGVjdGVkIHZvaWQgc2V0VW5jb25maWd1cmVkRmVhdHVyZVJlZmVyZW5jZXMoSUZlYXR1cmVSZWZlcmVuY2VbXSBmZWF0dXJlUmVmZXJlbmNlcykgeworCQl1bmNvbmZpZ3VyZWRGZWF0dXJlUmVmZXJlbmNlcyA9IG5ldyBIYXNoTWFwKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZVJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsKKwkJCXVuY29uZmlndXJlZEZlYXR1cmVSZWZlcmVuY2VzLnB1dChmZWF0dXJlUmVmZXJlbmNlc1tpXSxudWxsKTsKKwkJfQorCX0KKworCisJLyoqCisJICogU2V0cyB0aGUgY29uZmlndXJlZEZlYXR1cmVSZWZlcmVuY2VzLgorCSAqIEBwYXJhbSBmZWF0dXJlUmVmZXJlbmNlcyBUaGUgY29uZmlndXJlZEZlYXR1cmVSZWZlcmVuY2VzIHRvIHNldAorCSAqLworCXByb3RlY3RlZCB2b2lkIHNldENvbmZpZ3VyZWRGZWF0dXJlUmVmZXJlbmNlcyhJRmVhdHVyZVJlZmVyZW5jZVtdIGZlYXR1cmVSZWZlcmVuY2VzKSB7CisJCWNvbmZpZ3VyZWRGZWF0dXJlUmVmZXJlbmNlcyA9IG5ldyBIYXNoTWFwKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZVJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsKKwkJCWNvbmZpZ3VyZWRGZWF0dXJlUmVmZXJlbmNlcy5wdXQoZmVhdHVyZVJlZmVyZW5jZXNbaV0sbnVsbCk7CisJCX0JCQorCQorCX0KKworCS8qKgorCSAqIEByZXR1cm4gYm9vbGVhbgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKKwkJcmV0dXJuIGVuYWJsZTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gdmFsdWUKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gdmFsdWUpIHsKKwkJZW5hYmxlID0gdmFsdWU7CisJfQorCisKKwkKK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL21vZGVsL0NvbmZpZ3VyZWRTaXRlTW9kZWwuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL21vZGVsL0NvbmZpZ3VyZWRTaXRlTW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDViMmM0Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvbW9kZWwvQ29uZmlndXJlZFNpdGVNb2RlbC5qYXZhCkBAIC0wLDAgKzEsMTc3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsKKworLyoqCisgKiAKKyAqLworcHVibGljIGNsYXNzIENvbmZpZ3VyZWRTaXRlTW9kZWwgZXh0ZW5kcyBNb2RlbE9iamVjdCB7CisJcHJpdmF0ZSBTdHJpbmdbXSBwcmV2aW91c1BsdWdpblBhdGg7CisKKwlwcml2YXRlIFNpdGVNb2RlbCBzaXRlOworCXByaXZhdGUgU3RyaW5nIHBsYXRmb3JtVVJMU3RyaW5nOworCXByaXZhdGUgQ29uZmlndXJhdGlvblBvbGljeU1vZGVsIHBvbGljeTsKKwlwcml2YXRlIEluc3RhbGxDb25maWd1cmF0aW9uTW9kZWwgaW5zdGFsbENvbmZpZ3VyYXRpb247CisJcHJpdmF0ZSBib29sZWFuIGluc3RhbGxhYmxlID0gZmFsc2U7CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RvcgorCSAqLworCXB1YmxpYyBDb25maWd1cmVkU2l0ZU1vZGVsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIHJldHVybnMgdGhlIHNpdGUKKwkgKiBAcmV0dXJuIFRoZSBJU2l0ZSAKKwkgKiBAc2luY2UgMi4wCisJICovCisJcHVibGljIFNpdGVNb2RlbCBnZXRTaXRlTW9kZWwoKSB7CisJCXJldHVybiBzaXRlOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHNpdGUuCisJICogQHBhcmFtIHNpdGUgVGhlIHNpdGUgdG8gc2V0CisJICovCisJcHVibGljIHZvaWQgc2V0U2l0ZU1vZGVsKFNpdGVNb2RlbCBzaXRlKSB7CisJCWFzc2VydElzV3JpdGVhYmxlKCk7CisJCXRoaXMuc2l0ZSA9IHNpdGU7CisJfQorCisJLyoqCisJICogcmV0dXJucyB0aGUgcG9saWN5CisJICovCisJcHVibGljIENvbmZpZ3VyYXRpb25Qb2xpY3lNb2RlbCBnZXRDb25maWd1cmF0aW9uUG9saWN5TW9kZWwoKSB7CisJCXJldHVybiBwb2xpY3k7CisJfQorCisJLyoqCisJICogCisJICogQHNpbmNlIDIuMAorCSAqLworCXB1YmxpYyB2b2lkIHNldENvbmZpZ3VyYXRpb25Qb2xpY3lNb2RlbChDb25maWd1cmF0aW9uUG9saWN5TW9kZWwgcG9saWN5KSB7CisJCWFzc2VydElzV3JpdGVhYmxlKCk7CisJCXRoaXMucG9saWN5ID0gcG9saWN5OworCQlwb2xpY3kuc2V0Q29uZmlndXJlZFNpdGVNb2RlbCh0aGlzKTsKKwl9CisKKwkvKioKKwkgKiBAc2luY2UKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1VwZGF0YWJsZSgpIHsKKwkJcmV0dXJuIGluc3RhbGxhYmxlOworCX0KKworCS8qKgorCSAqIEBzaW5jZSAyLjAKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRVcGRhdGFibGUoYm9vbGVhbiBpbnN0YWxsYWJsZSkgeworCQlhc3NlcnRJc1dyaXRlYWJsZSgpOworCQl0aGlzLmluc3RhbGxhYmxlID0gaW5zdGFsbGFibGU7CisJfQorCisJLyoqCisJICogR2V0cyB0aGUgaW5zdGFsbENvbmZpZ3VyYXRpb24uCisJICogQHJldHVybiBSZXR1cm5zIGEgSW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbAorCSAqLworCXB1YmxpYyBJbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsIGdldEluc3RhbGxDb25maWd1cmF0aW9uTW9kZWwoKSB7CisJCXJldHVybiBpbnN0YWxsQ29uZmlndXJhdGlvbjsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSBpbnN0YWxsQ29uZmlndXJhdGlvbi4KKwkgKiBAcGFyYW0gaW5zdGFsbENvbmZpZ3VyYXRpb24gVGhlIGluc3RhbGxDb25maWd1cmF0aW9uIHRvIHNldAorCSAqLworCXB1YmxpYyB2b2lkIHNldEluc3RhbGxDb25maWd1cmF0aW9uTW9kZWwoSW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbCBpbnN0YWxsQ29uZmlndXJhdGlvbikgeworCQlhc3NlcnRJc1dyaXRlYWJsZSgpOworCQl0aGlzLmluc3RhbGxDb25maWd1cmF0aW9uID0gaW5zdGFsbENvbmZpZ3VyYXRpb247CisJfQorCisJLyoqCisJICogR2V0cyB0aGUgcGxhdGZvcm1VUkxTdHJpbmcuCisJICogQHJldHVybiBSZXR1cm5zIGEgU3RyaW5nCisJICovCisJcHVibGljIFN0cmluZyBnZXRQbGF0Zm9ybVVSTFN0cmluZygpIHsKKwkJcmV0dXJuIHBsYXRmb3JtVVJMU3RyaW5nOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHBsYXRmb3JtVVJMU3RyaW5nLgorCSAqIEBwYXJhbSBwbGF0Zm9ybVVSTFN0cmluZyBUaGUgcGxhdGZvcm1VUkxTdHJpbmcgdG8gc2V0CisJICovCisJcHVibGljIHZvaWQgc2V0UGxhdGZvcm1VUkxTdHJpbmcoU3RyaW5nIHBsYXRmb3JtVVJMU3RyaW5nKSB7CisJCXRoaXMucGxhdGZvcm1VUkxTdHJpbmcgPSBwbGF0Zm9ybVVSTFN0cmluZzsKKwl9CisKKwkKKwkJLyoqCisJICogR2V0cyB0aGUgcHJldmlvdXNQbHVnaW5QYXRoLiBUaGUgbGlzdCBvZiBwbHVnaW5zIHRoZSBwbGF0Zm9ybSBoYWQuCisJICogQHJldHVybiBSZXR1cm5zIGEgU3RyaW5nW10KKwkgKi8KKwlwdWJsaWMgU3RyaW5nW10gZ2V0UHJldmlvdXNQbHVnaW5QYXRoKCkgeworCQlpZiAocHJldmlvdXNQbHVnaW5QYXRoID09IG51bGwpCisJCQlwcmV2aW91c1BsdWdpblBhdGggPSBuZXcgU3RyaW5nWzBdOworCQlyZXR1cm4gcHJldmlvdXNQbHVnaW5QYXRoOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHByZXZpb3VzUGx1Z2luUGF0aC4KKwkgKiBAcGFyYW0gcHJldmlvdXNQbHVnaW5QYXRoIFRoZSBwcmV2aW91c1BsdWdpblBhdGggdG8gc2V0CisJICovCisJcHVibGljIHZvaWQgc2V0UHJldmlvdXNQbHVnaW5QYXRoKFN0cmluZ1tdIHByZXZpb3VzUGx1Z2luUGF0aCkgeworCQl0aGlzLnByZXZpb3VzUGx1Z2luUGF0aCA9IG5ldyBTdHJpbmdbcHJldmlvdXNQbHVnaW5QYXRoLmxlbmd0aF07CisJCVN5c3RlbS5hcnJheWNvcHkocHJldmlvdXNQbHVnaW5QYXRoLCAwLCB0aGlzLnByZXZpb3VzUGx1Z2luUGF0aCwgMCwgcHJldmlvdXNQbHVnaW5QYXRoLmxlbmd0aCk7CisJfQorCisJLyoKKwkgKiBjcmVhdGVzIGEgU3RhdHVzCisJICovCisJcHJvdGVjdGVkIElTdGF0dXMgY3JlYXRlU3RhdHVzKGludCBzdGF0dXNUeXBlLCBTdHJpbmcgbXNnLCBFeGNlcHRpb24gZSl7CisJCWlmIChzdGF0dXNUeXBlIT1JU3RhdHVzLk9LKSBzdGF0dXNUeXBlID0gSVN0YXR1cy5FUlJPUjsKKwkJcmV0dXJuIGNyZWF0ZVN0YXR1cyhzdGF0dXNUeXBlLElTdGF0dXMuT0ssIG1zZy50b1N0cmluZygpLCBlKTsKKwl9CisKKwkvKgorCSAqIGNyZWF0ZXMgYSBTdGF0dXMKKwkgKi8KKwlwcm90ZWN0ZWQgSVN0YXR1cyBjcmVhdGVTdGF0dXMoaW50IHN0YXR1c1NldmVyaXR5LCBpbnQgc3RhdHVzQ29kZSwgU3RyaW5nIG1zZywgRXhjZXB0aW9uIGUpeworCQlTdHJpbmcgaWQgPQlVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpOworCQorCQlTdHJpbmdCdWZmZXIgY29tcGxldGVTdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKCIiKTsgLy8kTk9OLU5MUy0xJAorCQlpZiAobXNnIT1udWxsKQorCQkJY29tcGxldGVTdHJpbmcuYXBwZW5kKG1zZyk7CisJCWlmIChlIT1udWxsKXsKKwkJCWNvbXBsZXRlU3RyaW5nLmFwcGVuZCgiXHJcblsiKTsgLy8kTk9OLU5MUy0xJAorCQkJY29tcGxldGVTdHJpbmcuYXBwZW5kKGUudG9TdHJpbmcoKSk7CisJCQljb21wbGV0ZVN0cmluZy5hcHBlbmQoIl1cclxuIik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQlyZXR1cm4gbmV3IFN0YXR1cyhzdGF0dXNTZXZlcml0eSwgaWQsIHN0YXR1c0NvZGUsIGNvbXBsZXRlU3RyaW5nLnRvU3RyaW5nKCksIGUpOworCX0KKwkKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLklDb25maWd1cmVkU2l0ZSNpc0VuYWJsZWQoKQorCSAqLworCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKKwkJcmV0dXJuIGdldENvbmZpZ3VyYXRpb25Qb2xpY3lNb2RlbCgpLmlzRW5hYmxlZCgpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uSUNvbmZpZ3VyZWRTaXRlI3NldEVuYWJsZWQoYm9vbGVhbikKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gdmFsdWUpIHsKKwkJZ2V0Q29uZmlndXJhdGlvblBvbGljeU1vZGVsKCkuc2V0RW5hYmxlZCh2YWx1ZSk7CisJfQorCQorfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvbW9kZWwvRGVmYXVsdFBsdWdpblBhcnNlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvbW9kZWwvRGVmYXVsdFBsdWdpblBhcnNlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0MDYxMzAKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9tb2RlbC9EZWZhdWx0UGx1Z2luUGFyc2VyLmphdmEKQEAgLTAsMCArMSwxMDcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwubW9kZWw7CisKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy4qOworCitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOworaW1wb3J0IG9yZy54bWwuc2F4Lio7CitpbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy4qOworCisvKioKKyAqIFBhcnNlIGRlZmF1bHQgZmVhdHVyZS54bWwKKyAqLworCitwdWJsaWMgY2xhc3MgRGVmYXVsdFBsdWdpblBhcnNlciBleHRlbmRzIERlZmF1bHRIYW5kbGVyIHsKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBTQVhQYXJzZXJGYWN0b3J5IHBhcnNlckZhY3RvcnkgPQorCQlTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisJcHJpdmF0ZSBTQVhQYXJzZXIgcGFyc2VyOworCXByaXZhdGUgU3RyaW5nIGlkID0gbnVsbDsKKwlwcml2YXRlIFN0cmluZyB2ZXJzaW9uID0gbnVsbDsKKwlwcml2YXRlIFBsdWdpbkVudHJ5IHBsdWdpbkVudHJ5OworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTiA9ICJwbHVnaW4iOyAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZSQUdNRU5UID0gImZyYWdtZW50IjsgLy8kTk9OLU5MUy0xJAorCisJcHJpdmF0ZSBjbGFzcyBQYXJzZUNvbXBsZXRlRXhjZXB0aW9uIGV4dGVuZHMgU0FYRXhjZXB0aW9uIHsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworICAgICAgICBwdWJsaWMgUGFyc2VDb21wbGV0ZUV4Y2VwdGlvbihTdHJpbmcgYXJnMCkgeworCQkJc3VwZXIoYXJnMCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RvciBmb3IgRGVmYXVsdEZlYXR1cmVQYXJzZXIKKwkgKi8KKwlwdWJsaWMgRGVmYXVsdFBsdWdpblBhcnNlcigpIHsKKwkJc3VwZXIoKTsKKwkJdHJ5IHsKKwkJCXBhcnNlckZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7CisJCQl0aGlzLnBhcnNlciA9IHBhcnNlckZhY3RvcnkubmV3U0FYUGFyc2VyKCk7CisJCX0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgeworCQkJVXBkYXRlQ29yZS5sb2coZSk7CisJCX0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7CisJCQlVcGRhdGVDb3JlLmxvZyhlKTsKKwkJfQorCX0KKworCS8qKgorCSAqIEBzaW5jZSAyLjAKKwkgKi8KKwlwdWJsaWMgc3luY2hyb25pemVkIFBsdWdpbkVudHJ5IHBhcnNlKElucHV0U3RyZWFtIGluKSB0aHJvd3MgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisJCXRyeSB7CisJCQlwbHVnaW5FbnRyeSA9IG5ldyBQbHVnaW5FbnRyeSgpOworCQkJcGFyc2VyLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShpbiksIHRoaXMpOworCQl9IGNhdGNoIChQYXJzZUNvbXBsZXRlRXhjZXB0aW9uIGUpIHsKKwkJCS8vIGV4cGVjdGVkLCB3ZSBzdG9wcGVkIHRoZSBwYXJzaW5nIHdoZW4gd2UgaGF2ZSB0aGUgaW5mb3JtYXRpb24gd2UgbmVlZAorCQkJLy8vIG5vIG5lZWQgdG8gcHVyc3VlIHRoZSBwYXJzaW5nCisJCX0KKworCQlpZiAoaWQgPT0gbnVsbCB8fCBpZC50cmltKCkubGVuZ3RoKCkgPT0gMCkKKwkJCWlkID0gIl9ub19pZF8iOyAvLyROT04tTkxTLTEkCisJCXBsdWdpbkVudHJ5LnNldFZlcnNpb25lZElkZW50aWZpZXIobmV3IFZlcnNpb25lZElkZW50aWZpZXIoaWQsIHZlcnNpb24pKTsKKwkJcmV0dXJuIHBsdWdpbkVudHJ5OworCX0KKworCS8qKgorCSAqIEBzZWUgRGVmYXVsdEhhbmRsZXIjc3RhcnRFbGVtZW50KFN0cmluZywgU3RyaW5nLCBTdHJpbmcsIEF0dHJpYnV0ZXMpCisJICovCisJcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKKworCQlTdHJpbmcgdGFnID0gbG9jYWxOYW1lLnRyaW0oKTsKKworCQlpZiAodGFnLmVxdWFsc0lnbm9yZUNhc2UoUExVR0lOKSkgeworCQkJcGx1Z2luRW50cnkuaXNGcmFnbWVudChmYWxzZSk7CQkJCisJCQlwcm9jZXNzUGx1Z2luKGF0dHJpYnV0ZXMpOworCQkJcmV0dXJuOworCQl9CisKKwkJaWYgKHRhZy5lcXVhbHNJZ25vcmVDYXNlKEZSQUdNRU5UKSkgeworCQkJcGx1Z2luRW50cnkuaXNGcmFnbWVudCh0cnVlKTsJCQkKKwkJCXByb2Nlc3NQbHVnaW4oYXR0cmlidXRlcyk7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwkvKiogCisJICogcHJvY2VzcyBwbHVnaW4gZW50cnkgaW5mbworCSAqLworCXByaXZhdGUgdm9pZCBwcm9jZXNzUGx1Z2luKEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIFBhcnNlQ29tcGxldGVFeGNlcHRpb24geworCQlpZCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImlkIik7IC8vJE5PTi1OTFMtMSQKKwkJdmVyc2lvbiA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInZlcnNpb24iKTsgLy8kTk9OLU5MUy0xJAorCQl0aHJvdyBuZXcgUGFyc2VDb21wbGV0ZUV4Y2VwdGlvbigiIik7IC8vJE5PTi1OTFMtMSQKKwl9Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9tb2RlbC9JVGltZXN0YW1wLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9tb2RlbC9JVGltZXN0YW1wLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ2Mjg3YgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL21vZGVsL0lUaW1lc3RhbXAuamF2YQpAQCAtMCwwICsxLDIxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwubW9kZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKKworcHVibGljIGludGVyZmFjZSBJVGltZXN0YW1wIHsKKworCXB1YmxpYyBEYXRlIGdldFRpbWVzdGFtcCgpOworCQorCXB1YmxpYyB2b2lkIHNldFRpbWVzdGFtcCggRGF0ZSB0aW1lc3RhbXApOworfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvbW9kZWwvSW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvbW9kZWwvSW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ZDEwMTMKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9tb2RlbC9JbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsLmphdmEKQEAgLTAsMCArMSwzMjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwubW9kZWw7CisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS5uZXQuKjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7CisKKy8qKgorICogQW4gSW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbCBpcyAKKyAqIAorICovCisKK3B1YmxpYyBjbGFzcyBJbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsIGV4dGVuZHMgTW9kZWxPYmplY3QgeworCisJLy8gcGVyZm9ybWFuY2UKKwlwcml2YXRlIFVSTCBidW5kbGVVUkw7CisJcHJpdmF0ZSBVUkwgYmFzZTsKKwlwcml2YXRlIGJvb2xlYW4gcmVzb2x2ZWQgPSBmYWxzZTsKKworCXByaXZhdGUgYm9vbGVhbiBpc0N1cnJlbnQgPSBmYWxzZTsKKwlwcml2YXRlIFVSTCBsb2NhdGlvblVSTDsKKwlwcml2YXRlIFN0cmluZyBsb2NhdGlvblVSTFN0cmluZzsKKwlwcm90ZWN0ZWQgRGF0ZSBkYXRlOworCXByaXZhdGUgU3RyaW5nIGxhYmVsOworCXByaXZhdGUgTGlzdCAvKiBvZiBDb25maWd1cmV0aW9uQWN0aXZpdHlNb2RlbCAqLyBhY3Rpdml0aWVzOworCXByaXZhdGUgTGlzdCAvKiBvZiBjb25maWd1cmF0aW9uU2l0ZU1vZGVsICovIGNvbmZpZ3VyYXRpb25TaXRlczsKKworCXByb3RlY3RlZCBib29sZWFuIGluaXRpYWxpemVkID0gZmFsc2U7CisJcHJvdGVjdGVkIGJvb2xlYW4gbGlnaHRseUluaXRpYWxpemVkID0gZmFsc2U7CisKKwkvKioKKwkgKiBkZWZhdWx0IGNvbnN0cnVjdG9yLiBDcmVhdGUKKwkgKi8KKwlwdWJsaWMgSW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbCgpIHsKKwl9CisKKwkvKioKKwkgKiBAc2luY2UgMi4wCisJICovCisJcHVibGljIENvbmZpZ3VyZWRTaXRlTW9kZWxbXSBnZXRDb25maWd1cmF0aW9uU2l0ZXNNb2RlbCgpIHsKKwkJaWYgKCFpbml0aWFsaXplZCkgCisJCQlpbml0aWFsaXplKCk7CisJCWlmIChjb25maWd1cmF0aW9uU2l0ZXMgPT0gbnVsbCB8fCBjb25maWd1cmF0aW9uU2l0ZXMuc2l6ZSgpID09IDApCisJCQlyZXR1cm4gbmV3IENvbmZpZ3VyZWRTaXRlTW9kZWxbMF07CisJCisJCXJldHVybiAoQ29uZmlndXJlZFNpdGVNb2RlbFtdKSBjb25maWd1cmF0aW9uU2l0ZXMudG9BcnJheShhcnJheVR5cGVGb3IoY29uZmlndXJhdGlvblNpdGVzKSk7CisJfQorCisJLyoqCisJICogQWRkcyB0aGUgY29uZmlndXJhdGlvbiB0byB0aGUgbGlzdAorCSAqIGlzIGNhbGxlZCB3aGVuIGFkZGluZyBhIFNpdGUgb3IgcGFyc2luZyB0aGUgWE1MIGZpbGUKKwkgKiBpbiB0aGlzIGNhc2Ugd2UgZG8gbm90IHdhbnQgdG8gY3JlYXRlIGEgbmV3IGFjdGl2aXR5LCBzbyB3ZSBkbyBub3Qgd2FudCB0IGNhbGwKKwkgKiBhZGRDb25maWd1cmF0aW9uU2l0ZSgpCisJICovCisJcHVibGljIHZvaWQgYWRkQ29uZmlndXJhdGlvblNpdGVNb2RlbChDb25maWd1cmVkU2l0ZU1vZGVsIHNpdGUpIHsKKwkJaWYgKGNvbmZpZ3VyYXRpb25TaXRlcyA9PSBudWxsKSB7CisJCQljb25maWd1cmF0aW9uU2l0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisJCX0KKwkJaWYgKCFjb25maWd1cmF0aW9uU2l0ZXMuY29udGFpbnMoc2l0ZSkpIHsKKwkJCWNvbmZpZ3VyYXRpb25TaXRlcy5hZGQoc2l0ZSk7CisJCX0KKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRDb25maWd1cmF0aW9uU2l0ZU1vZGVsKENvbmZpZ3VyZWRTaXRlTW9kZWxbXSBzaXRlcykgeworCQljb25maWd1cmF0aW9uU2l0ZXMgPSBudWxsOworCQlmb3IgKGludCBpID0gMDsgaSA8IHNpdGVzLmxlbmd0aDsgaSsrKSB7CisJCQlhZGRDb25maWd1cmF0aW9uU2l0ZU1vZGVsKHNpdGVzW2ldKTsKKwkJfQorCX0KKworCS8qKgorCSAqIEBzaW5jZSAyLjAKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiByZW1vdmVDb25maWd1cmF0aW9uU2l0ZU1vZGVsKENvbmZpZ3VyZWRTaXRlTW9kZWwgc2l0ZSkgeworCQlpZiAoIWluaXRpYWxpemVkKSBpbml0aWFsaXplKCk7CisKKwkJaWYgKGNvbmZpZ3VyYXRpb25TaXRlcyAhPSBudWxsKSB7CisJCQlyZXR1cm4gY29uZmlndXJhdGlvblNpdGVzLnJlbW92ZShzaXRlKTsKKwkJfQorCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKioKKwkgKiBAc2luY2UgMi4wCisJICovCisJcHVibGljIGJvb2xlYW4gaXNDdXJyZW50KCkgeworCQlpZiAoIWxpZ2h0bHlJbml0aWFsaXplZCAmJiAhaW5pdGlhbGl6ZWQgKSAKKwkJCWRvTGlnaHRJbml0aWFsaXphdGlvbigpOworCQkKKwkJcmV0dXJuIGlzQ3VycmVudDsKKwl9CisKKwkvKioKKwkgKiAgQHNpbmNlIDIuMAorCSAqLworCXB1YmxpYyB2b2lkIHNldEN1cnJlbnQoYm9vbGVhbiBpc0N1cnJlbnQpIHsKKwkJLy8gZG8gbm90IGNoZWNrIGlmIHdyaXRhYmxlIGFzIHdlIG1heQorCQkvLyBzZXQgYW4gaW5zdGFsbCBjb25maWcgYXMgTm90IGN1cnJlbnQKKwkJdGhpcy5pc0N1cnJlbnQgPSBpc0N1cnJlbnQ7CisJfQorCisJLyoqCisJICogQHNpbmNlIDIuMAorCSAqLworCXB1YmxpYyBDb25maWd1cmF0aW9uQWN0aXZpdHlNb2RlbFtdIGdldEFjdGl2aXR5TW9kZWwoKSB7CisJCWlmIChhY3Rpdml0aWVzID09IG51bGwgJiYgIWluaXRpYWxpemVkKSAKKwkJCWluaXRpYWxpemUoKTsKKwkJaWYgKGFjdGl2aXRpZXMgPT0gbnVsbCB8fCBhY3Rpdml0aWVzLnNpemUoKSA9PSAwKQorCQkJcmV0dXJuIG5ldyBDb25maWd1cmF0aW9uQWN0aXZpdHlNb2RlbFswXTsKKwkJcmV0dXJuIChDb25maWd1cmF0aW9uQWN0aXZpdHlNb2RlbFtdKSBhY3Rpdml0aWVzLnRvQXJyYXkoYXJyYXlUeXBlRm9yKGFjdGl2aXRpZXMpKTsKKwl9CisKKwkvKioKKwkgKiBAc2luY2UgMi4wCisJICovCisJcHVibGljIHZvaWQgYWRkQWN0aXZpdHlNb2RlbChDb25maWd1cmF0aW9uQWN0aXZpdHlNb2RlbCBhY3Rpdml0eSkgeworCQlpZiAoYWN0aXZpdGllcyA9PSBudWxsKQorCQkJYWN0aXZpdGllcyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJaWYgKCFhY3Rpdml0aWVzLmNvbnRhaW5zKGFjdGl2aXR5KSkgeworCQkJYWN0aXZpdGllcy5hZGQoYWN0aXZpdHkpOworCQkJYWN0aXZpdHkuc2V0SW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbCh0aGlzKTsKKwkJfQorCX0KKwkvKioKKwkgKiAKKwkgKi8KKwlwdWJsaWMgRGF0ZSBnZXRDcmVhdGlvbkRhdGUoKSB7CisvLwkJaWYgKCFpbml0aWFsaXplZCkgaW5pdGlhbGl6ZSgpOworCQlpZiAoZGF0ZSA9PSBudWxsKQorCQkJZG9MaWdodEluaXRpYWxpemF0aW9uKCk7CisJCXJldHVybiBkYXRlOworCX0KKwkvKioKKwkgKiBTZXRzIHRoZSBkYXRlLgorCSAqIEBwYXJhbSBkYXRlIFRoZSBkYXRlIHRvIHNldAorCSAqLworCXB1YmxpYyB2b2lkIHNldENyZWF0aW9uRGF0ZShEYXRlIGRhdGUpIHsKKwkJYXNzZXJ0SXNXcml0ZWFibGUoKTsKKwkJdGhpcy5kYXRlID0gZGF0ZTsKKwl9CisJLyoqCisJICogQHNpbmNlIDIuMAorCSAqLworCXB1YmxpYyBVUkwgZ2V0VVJMKCkgeworCQkvL2lmICghaW5pdGlhbGl6ZWQpIGluaXRpYWxpemUoKTsKKwkJLy9ubyBuZWVkIHRvIGluaXRpYWxpemUsIGFsd2F5cyBzZXQKKwkJZGVsYXllZFJlc29sdmUoKTsKKwkJcmV0dXJuIGxvY2F0aW9uVVJMOworCX0KKworCS8qKgorCSAqIEBzaW5jZSAyLjAKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgeworLy8JCWlmICghaW5pdGlhbGl6ZWQpIGluaXRpYWxpemUoKTsKKwkJaWYgKGxhYmVsID09IG51bGwpCisJCQlkb0xpZ2h0SW5pdGlhbGl6YXRpb24oKTsKKwkJcmV0dXJuIGxhYmVsOworCX0KKworCS8qKgorCSAqIEBzaW5jZSAyLjAuMgorCSAqLworCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuIGdldExhYmVsKCk7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgbGFiZWwuCisJICogQHBhcmFtIGxhYmVsIFRoZSBsYWJlbCB0byBzZXQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgbGFiZWwpIHsKKwkJYXNzZXJ0SXNXcml0ZWFibGUoKTsKKwkJdGhpcy5sYWJlbCA9IGxhYmVsOworCX0KKworCS8qKgorCSAqIEdldHMgdGhlIGxvY2F0aW9uVVJMU3RyaW5nLgorCSAqIEByZXR1cm4gUmV0dXJucyBhIFN0cmluZworCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb25VUkxTdHJpbmcoKSB7CisJCWlmICghaW5pdGlhbGl6ZWQpIGRlbGF5ZWRSZXNvbHZlKCk7CisJCXJldHVybiBsb2NhdGlvblVSTFN0cmluZzsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSBsb2NhdGlvblVSTFN0cmluZy4KKwkgKiBAcGFyYW0gbG9jYXRpb25VUkxTdHJpbmcgVGhlIGxvY2F0aW9uVVJMU3RyaW5nIHRvIHNldAorCSAqLworCXB1YmxpYyB2b2lkIHNldExvY2F0aW9uVVJMU3RyaW5nKFN0cmluZyBsb2NhdGlvblVSTFN0cmluZykgeworCQlhc3NlcnRJc1dyaXRlYWJsZSgpOworCQl0aGlzLmxvY2F0aW9uVVJMU3RyaW5nID0gbG9jYXRpb25VUkxTdHJpbmc7CisJCXRoaXMubG9jYXRpb25VUkwgPSBudWxsOworCX0KKworCS8qCisJICogQHNlZSBNb2RlbE9iamVjdCNyZXNvbHZlKFVSTCwgUmVzb3VyY2VCdW5kbGUpCisJICovCisJcHVibGljIHZvaWQgcmVzb2x2ZShVUkwgYmFzZSwgVVJMIGJ1bmRsZVVSTCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7CisKKwkJdGhpcy5iYXNlID0gYmFzZTsKKwkJdGhpcy5idW5kbGVVUkwgPSBidW5kbGVVUkw7CisKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB0aW1lbGluZS4KKwkgKiBAcmV0dXJuIGxvbmcKKwkgKi8KKwlwdWJsaWMgbG9uZyBnZXRUaW1lbGluZSgpIHsKKwkJcmV0dXJuIDA7CisvLwkJaWYgKCFpbml0aWFsaXplZCkgaW5pdGlhbGl6ZSgpOworLy8JCXJldHVybiB0aW1lbGluZTsKKwl9CisKKworCS8qCisJICogaW5pdGlhbGl6ZSB0aGUgY29uZmlndXJhdGlvbnMgZnJvbSB0aGUgcGVyc2lzdGVudCBtb2RlbC4KKwkgKi8KKwlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgpIHsKKwkJCisJCXRyeSB7CisJCQl0cnkgeworCQkJCUlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24gcGxhdGZvcm1Db25maWcgPSBnZXRQbGF0Zm9ybUNvbmZpZ3VyYXRpb24oKTsKKwkJCQkKKwkJCQluZXcgSW5zdGFsbENvbmZpZ3VyYXRpb25QYXJzZXIocGxhdGZvcm1Db25maWcsIHRoaXMsIGZhbHNlKTsKKwkJCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCQlVcGRhdGVDb3JlLndhcm4obG9jYXRpb25VUkxTdHJpbmcgKyAiIGRvZXMgbm90IGV4aXN0LCBUaGUgbG9jYWwgc2l0ZSBpcyBub3QgaW4gc3luY2ggd2l0aCB0aGUgZmlsZSBzeXN0ZW0gYW5kIGlzIHBvaW50aW5nIHRvIGEgZmlsZSB0aGF0IGRvZXNuJ3QgZXhpc3QuIiwgZXhjZXB0aW9uKTsgLy8kTk9OLU5MUy0xJAorCQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLkluc3RhbGxDb25maWd1cmF0aW9uX0Vycm9yRHVyaW5nRmlsZUFjY2VzcywgKG5ldyBTdHJpbmdbXSB7IGxvY2F0aW9uVVJMU3RyaW5nIH0pKSwgZXhjZXB0aW9uKTsKKwkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLkluc3RhbGxDb25maWd1cmF0aW9uX0Vycm9yRHVyaW5nRmlsZUFjY2VzcywgKG5ldyBTdHJpbmdbXSB7IGxvY2F0aW9uVVJMU3RyaW5nIH0pKSwgZXhjZXB0aW9uKTsKKwkJCX0KKwkJCQorCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCVVwZGF0ZUNvcmUud2FybigiRXJyb3IgcHJvY2Vzc2luZyBjb25maWd1cmF0aW9uIGhpc3Rvcnk6IiArIGxvY2F0aW9uVVJMLnRvRXh0ZXJuYWxGb3JtKCksIGUpOyAvLyROT04tTkxTLTEkCisJCX0gZmluYWxseSB7CisJCQlpbml0aWFsaXplZCA9IHRydWU7CisJCX0KKwkJCisJCS8vZmluaXNoIHJlc29sdmUKKwkJLy8gUEVSRjoKKwkJdHJ5IHsKKwkJCS8vIGRlbGVnYXRlCisJCQlyZXNvbHZlTGlzdFJlZmVyZW5jZShnZXRBY3Rpdml0eU1vZGVsKCksIGJhc2UsIGJ1bmRsZVVSTCk7CisJCQlyZXNvbHZlTGlzdFJlZmVyZW5jZShnZXRDb25maWd1cmF0aW9uU2l0ZXNNb2RlbCgpLCBiYXNlLCBidW5kbGVVUkwpOworCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSl7fQkJCisJfQorCisJcHJpdmF0ZSBJUGxhdGZvcm1Db25maWd1cmF0aW9uIGdldFBsYXRmb3JtQ29uZmlndXJhdGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24gcGxhdGZvcm1Db25maWc7CisJCWlmIChVcGRhdGVNYW5hZ2VyVXRpbHMuc2FtZVVSTChnZXRVUkwoKSwgQ29uZmlndXJhdG9yVXRpbHMuZ2V0Q3VycmVudFBsYXRmb3JtQ29uZmlndXJhdGlvbigpLmdldENvbmZpZ3VyYXRpb25Mb2NhdGlvbigpKSkKKwkJCXBsYXRmb3JtQ29uZmlnID0gQ29uZmlndXJhdG9yVXRpbHMuZ2V0Q3VycmVudFBsYXRmb3JtQ29uZmlndXJhdGlvbigpOworCQllbHNlIAorCQkJcGxhdGZvcm1Db25maWcgPSBDb25maWd1cmF0b3JVdGlscy5nZXRQbGF0Zm9ybUNvbmZpZ3VyYXRpb24oZ2V0VVJMKCkpOworCQlyZXR1cm4gcGxhdGZvcm1Db25maWc7CisJfQorCQorCXByaXZhdGUgdm9pZCBkb0xpZ2h0SW5pdGlhbGl6YXRpb24oKSB7CisJCXRyeSB7CisJCQl0cnkgeworCQkJCUlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24gcGxhdGZvcm1Db25maWcgPSBnZXRQbGF0Zm9ybUNvbmZpZ3VyYXRpb24oKTsKKwkJCQorCQkJCW5ldyBJbnN0YWxsQ29uZmlndXJhdGlvblBhcnNlcihwbGF0Zm9ybUNvbmZpZywgdGhpcywgdHJ1ZSk7CisJCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCQkJVXBkYXRlQ29yZS53YXJuKGxvY2F0aW9uVVJMU3RyaW5nICsgIiBkb2VzIG5vdCBleGlzdCwgVGhlIGxvY2FsIHNpdGUgaXMgbm90IGluIHN5bmNoIHdpdGggdGhlIGZpbGUgc3lzdGVtIGFuZCBpcyBwb2ludGluZyB0byBhIGZpbGUgdGhhdCBkb2Vzbid0IGV4aXN0LiIsIGV4Y2VwdGlvbik7IC8vJE5PTi1OTFMtMSQKKwkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5JbnN0YWxsQ29uZmlndXJhdGlvbl9FcnJvckR1cmluZ0ZpbGVBY2Nlc3MsIChuZXcgU3RyaW5nW10geyBsb2NhdGlvblVSTFN0cmluZyB9KSksIGV4Y2VwdGlvbik7CisJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5JbnN0YWxsQ29uZmlndXJhdGlvbl9FcnJvckR1cmluZ0ZpbGVBY2Nlc3MsIChuZXcgU3RyaW5nW10geyBsb2NhdGlvblVSTFN0cmluZyB9KSksIGV4Y2VwdGlvbik7CisJCQl9IAorCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCVVwZGF0ZUNvcmUud2FybigiRXJyb3IgcHJvY2Vzc2luZyBjb25maWd1cmF0aW9uIGhpc3Rvcnk6IiArIGxvY2F0aW9uVVJMLnRvRXh0ZXJuYWxGb3JtKCksIGUpOyAvLyROT04tTkxTLTEkCisJCX0gZmluYWxseSB7CisJCQlsaWdodGx5SW5pdGlhbGl6ZWQgPSB0cnVlOworCQl9CisJfQorCisJLyoKKwkgKiAKKwkgKi8KKwlwcml2YXRlIHZvaWQgZGVsYXllZFJlc29sdmUoKSB7CisKKwkJLy8gUEVSRjogZGVsYXkgcmVzb2x1dGlvbgorCQlpZiAocmVzb2x2ZWQpCisJCQlyZXR1cm47CisKKwkJcmVzb2x2ZWQgPSB0cnVlOworCQkvLyByZXNvbHZlIGxvY2FsIGVsZW1lbnRzCisJCXRyeSB7CisJCQkvL2xvY2F0aW9uVVJMID0gcmVzb2x2ZVVSTChiYXNlLCBidW5kbGVVUkwsIGxvY2F0aW9uVVJMU3RyaW5nKTsJCQorCQkJbG9jYXRpb25VUkwgPSBuZXcgVVJMKGxvY2F0aW9uVVJMU3RyaW5nKTsKKwkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpeworCQkJRmlsZSBmID0gbmV3IEZpbGUobG9jYXRpb25VUkxTdHJpbmcpOworCQkJdHJ5IHsKKwkJCQlpZiAoZi5leGlzdHMoKSkKKwkJCQkJbG9jYXRpb25VUkwgPSBmLnRvVVJMKCk7CisJCQkJZWxzZQorCQkJCQlsb2NhdGlvblVSTCA9IGJhc2U7CisJCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZTEpIHsKKwkJCQlsb2NhdGlvblVSTCA9IGJhc2U7CisJCQl9CisJCX0KKwl9CisJCisJcHVibGljIHZvaWQgcmVzZXRBY3Rpdml0aWVzKCkgeworCQlhY3Rpdml0aWVzID0gbnVsbDsKKwl9Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9tb2RlbC9JbnN0YWxsQ29uZmlndXJhdGlvblBhcnNlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvbW9kZWwvSW5zdGFsbENvbmZpZ3VyYXRpb25QYXJzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzY3YmIwCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvbW9kZWwvSW5zdGFsbENvbmZpZ3VyYXRpb25QYXJzZXIuamF2YQpAQCAtMCwwICsxLDIxOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5tb2RlbDsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLklQbGF0Zm9ybUNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVNpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuU2l0ZUZlYXR1cmVSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuU2l0ZU1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuU2l0ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb25maWd1cmF0b3IuRmVhdHVyZUVudHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb25maWd1cmF0b3IuUGxhdGZvcm1Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb25maWd1cmF0b3IuU2l0ZUVudHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLkJhc2VTaXRlTG9jYWxGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLk1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLlVwZGF0ZUNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuVXBkYXRlTWFuYWdlclV0aWxzOworCisKKy8qKgorICogcGFyc2UgdGhlIGRlZmF1bHQgc2l0ZS54bWwKKyAqLworCitwdWJsaWMgY2xhc3MgSW5zdGFsbENvbmZpZ3VyYXRpb25QYXJzZXIgeworCXByaXZhdGUgUGxhdGZvcm1Db25maWd1cmF0aW9uIHBsYXRmb3JtQ29uZmlnOworCXByaXZhdGUgVVJMIHNpdGVVUkw7CisJcHJpdmF0ZSBJbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsIGNvbmZpZzsKKwlwcml2YXRlIENvbmZpZ3VyZWRTaXRlTW9kZWwgY29uZmlnU2l0ZTsKKworCS8qKgorCSAqIENvbnN0cnVjdG9yIGZvciBEZWZhdWx0U2l0ZVBhcnNlcgorCSAqLworCXB1YmxpYyBJbnN0YWxsQ29uZmlndXJhdGlvblBhcnNlcigKKwkJSVBsYXRmb3JtQ29uZmlndXJhdGlvbiBwbGF0Zm9ybUNvbmZpZywKKwkJSW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbCBjb25maWcsIGJvb2xlYW4gbGlnaHQpCisJCXRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7CisKKwkJQXNzZXJ0LmlzVHJ1ZShwbGF0Zm9ybUNvbmZpZyBpbnN0YW5jZW9mIFBsYXRmb3JtQ29uZmlndXJhdGlvbik7CisJCXRoaXMucGxhdGZvcm1Db25maWcgPSAoUGxhdGZvcm1Db25maWd1cmF0aW9uKXBsYXRmb3JtQ29uZmlnOworCQkKKwkJdGhpcy5jb25maWcgPSBjb25maWc7CisKKwkJLy8gREVCVUc6CQkKKwkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX1BBUlNJTkcpIHsKKwkJCVVwZGF0ZUNvcmUuZGVidWcoIlN0YXJ0IHBhcnNpbmcgQ29uZmlndXJhdGlvbjoiICsgKGNvbmZpZykuZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKSk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQkKKwkJaWYgKGxpZ2h0KSB7CisJCQlwcm9jZXNzQ29uZmlndXJhdGlvbkxpZ2h0KHRoaXMucGxhdGZvcm1Db25maWcpOworCQl9IGVsc2UgeworCQkJcHJvY2Vzc0NvbmZpZyh0aGlzLnBsYXRmb3JtQ29uZmlnKTsKKwkJfQorCX0KKwkKKwkKKworCisKKwkvKiogCisJICogcHJvY2VzcyB0aGUgU2l0ZSBpbmZvCisJICovCisJcHJpdmF0ZSB2b2lkIHByb2Nlc3NTaXRlKFNpdGVFbnRyeSBzaXRlRW50cnkpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisKKwkJLy9zaXRlIHVybAorCQlzaXRlVVJMID0gc2l0ZUVudHJ5LmdldFVSTCgpOworCQl0cnkgeworCQkJc2l0ZVVSTCA9IEZpbGVMb2NhdG9yLnRvRmlsZVVSTChzaXRlVVJMKTsKKwkJCS8vIFRPRE8gd29ya2Fyb3VuZCBidWcgaW4gcGxhdGZvcm0gdXJsIHJlc29sdXRpb24KKwkJCWlmIChzaXRlVVJMLmdldFByb3RvY29sKCkuZXF1YWxzKCJmaWxlIikpIC8vJE5PTi1OTFMtMSQKKwkJCQlzaXRlVVJMID0gbmV3IEZpbGUoc2l0ZVVSTC5nZXRGaWxlKCkpLnRvVVJMKCk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCS8vIGtlZXAgb3JpZ2luYWwgdXJsCisJCX0KKworCQkvLyBwb2xpY3kKKwkJSVNpdGUgc2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoc2l0ZVVSTCxudWxsKTsKKworCQkvLyBjb25maWd1cmF0aW9uIHNpdGUKKwkJQmFzZVNpdGVMb2NhbEZhY3RvcnkgZmFjdG9yeSA9IG5ldyBCYXNlU2l0ZUxvY2FsRmFjdG9yeSgpOworCQljb25maWdTaXRlID0gZmFjdG9yeS5jcmVhdGVDb25maWd1cmF0aW9uU2l0ZU1vZGVsKChTaXRlTW9kZWwpIHNpdGUsIHNpdGVFbnRyeS5nZXRTaXRlUG9saWN5KCkuZ2V0VHlwZSgpKTsKKworCQkvL3BsYXRmb3JtIHVybAorCQljb25maWdTaXRlLnNldFBsYXRmb3JtVVJMU3RyaW5nKHNpdGVFbnRyeS5nZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpKTsKKwkJCisJCS8vIGNvbmZpZ3VyZWQKKwkJY29uZmlnU2l0ZS5zZXRFbmFibGVkKHNpdGVFbnRyeS5pc0VuYWJsZWQoKSk7CisKKwkJLy8gY2hlY2sgaWYgdGhlIHNpdGUgZXhpc3RzIGFuZCBpcyB1cGRhdGFibGUKKwkgCWNvbmZpZ1NpdGUuc2V0VXBkYXRhYmxlKHNpdGVFbnRyeS5pc1VwZGF0ZWFibGUoKSk7CisJIAkKKwkJLy8gYWRkIHRvIGluc3RhbGwgY29uZmlndXJhdGlvbgorCSAJY29uZmlnLmFkZENvbmZpZ3VyYXRpb25TaXRlTW9kZWwoY29uZmlnU2l0ZSk7CisJIAljb25maWdTaXRlLnNldEluc3RhbGxDb25maWd1cmF0aW9uTW9kZWwoY29uZmlnKTsKKwkJCisJCUZlYXR1cmVFbnRyeVtdIGZlYXR1cmVzID0gc2l0ZUVudHJ5LmdldEZlYXR1cmVFbnRyaWVzKCk7CisJCWZvciAoaW50IGk9MDsgaTxmZWF0dXJlcy5sZW5ndGg7IGkrKykgeworCQkJcHJvY2Vzc0ZlYXR1cmUoZmVhdHVyZXNbaV0pOworCQl9CisJfQorCisJLyoqIAorCSAqIHByb2Nlc3MgdGhlIERlZmF1bHRGZWF0dXJlIGluZm8KKwkgKi8KKwlwcml2YXRlIHZvaWQgcHJvY2Vzc0ZlYXR1cmUoRmVhdHVyZUVudHJ5IGZlYXR1cmUpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisKKwkJLy8gdXJsCisJCVN0cmluZyBwYXRoID0gZmVhdHVyZS5nZXRVUkwoKTsgCisJCVVSTCB1cmwgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKHNpdGVVUkwsIHBhdGgsIG51bGwpOworCisJCWlmICh1cmwgIT0gbnVsbCkgeworCQkJU2l0ZUZlYXR1cmVSZWZlcmVuY2UgcmVmID0gbmV3IFNpdGVGZWF0dXJlUmVmZXJlbmNlKCk7CisJCQlyZWYuc2V0U2l0ZSgoSVNpdGUpIGNvbmZpZ1NpdGUuZ2V0U2l0ZU1vZGVsKCkpOworCQkJcmVmLnNldFVSTCh1cmwpOworCQkJKGNvbmZpZ1NpdGUuZ2V0Q29uZmlndXJhdGlvblBvbGljeU1vZGVsKCkpLmFkZENvbmZpZ3VyZWRGZWF0dXJlUmVmZXJlbmNlKHJlZik7CisKKwkJCS8vdXBkYXRlVVJMCisvL1RPRE8gZG8gd2UgbmVlZCB0aGUgdXBkYXRlIHVybCBhbmQgdG8gcmVzb2x2ZSBpdD8KKy8vCQkJU3RyaW5nIHVwZGF0ZVVSTFN0cmluZyA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInVwZGF0ZVVSTCIpOyAvLyROT04tTkxTLTEkCisvLwkJCVVSTEVudHJ5IGVudHJ5ID0gbmV3IFVSTEVudHJ5KCk7CisvLwkJCWVudHJ5LnNldFVSTFN0cmluZyh1cGRhdGVVUkxTdHJpbmcpOworLy8JCQllbnRyeS5yZXNvbHZlKHNpdGVVUkwsbnVsbCk7CisKKwkJCS8vIERFQlVHOgkJCisJCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfUEFSU0lORykgeworCQkJCVVwZGF0ZUNvcmUuZGVidWcoIkVuZCBQcm9jZXNzaW5nIERlZmF1bHRGZWF0dXJlIFRhZzogdXJsOiIgKyB1cmwudG9FeHRlcm5hbEZvcm0oKSk7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKworCQl9IGVsc2UgeworCQkJVXBkYXRlQ29yZS5sb2coIE1lc3NhZ2VzLkluc3RhbGxDb25maWd1cmF0aW9uUGFyc2VyX0ZlYXR1cmVSZWZlcmVuY2VOb1VSTCwgbmV3IEV4Y2VwdGlvbigpKTsgCisJCX0KKworCX0KKworCS8qKiAKKwkgKiBwcm9jZXNzIHRoZSBBY3Rpdml0eSBpbmZvCisJICovCisvLwlwcml2YXRlIHZvaWQgcHJvY2Vzc0FjdGl2aXR5KEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgeworLy8KKy8vCQkvLyBhY3Rpb24KKy8vCQlTdHJpbmcgYWN0aW9uU3RyaW5nID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiYWN0aW9uIik7IC8vJE5PTi1OTFMtMSQKKy8vCQlpbnQgYWN0aW9uID0gSW50ZWdlci5wYXJzZUludChhY3Rpb25TdHJpbmcpOworLy8KKy8vCQkvLyBjcmVhdGUKKy8vCQlDb25maWd1cmF0aW9uQWN0aXZpdHlNb2RlbCBhY3Rpdml0eSA9CisvLwkJCW5ldyBCYXNlU2l0ZUxvY2FsRmFjdG9yeSgpLmNyZWF0ZUNvbmZpZ3VyYXRpb25BY3Rpdml0eU1vZGVsKCk7CisvLwkJYWN0aXZpdHkuc2V0QWN0aW9uKGFjdGlvbik7CisvLworLy8JCS8vIGxhYmVsCisvLwkJU3RyaW5nIGxhYmVsID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgibGFiZWwiKTsgLy8kTk9OLU5MUy0xJAorLy8JCWlmIChsYWJlbCAhPSBudWxsKQorLy8JCQlhY3Rpdml0eS5zZXRMYWJlbChsYWJlbCk7CisvLworLy8JCS8vIGRhdGUKKy8vCQlTdHJpbmcgZGF0ZVN0cmluZyA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImRhdGUiKTsgLy8kTk9OLU5MUy0xJAorLy8JCURhdGUgZGF0ZSA9IG5ldyBEYXRlKExvbmcucGFyc2VMb25nKGRhdGVTdHJpbmcpKTsKKy8vCQlhY3Rpdml0eS5zZXREYXRlKGRhdGUpOworLy8KKy8vCQkvLyBzdGF0dXMKKy8vCQlTdHJpbmcgc3RhdHVzU3RyaW5nID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgic3RhdHVzIik7IC8vJE5PTi1OTFMtMSQKKy8vCQlpbnQgc3RhdHVzID0gSW50ZWdlci5wYXJzZUludChzdGF0dXNTdHJpbmcpOworLy8JCWFjdGl2aXR5LnNldFN0YXR1cyhzdGF0dXMpOworLy8KKy8vCQljb25maWcuYWRkQWN0aXZpdHlNb2RlbChhY3Rpdml0eSk7CisvLworLy8JCS8vIERFQlVHOgkJCisvLwkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX1BBUlNJTkcpIHsKKy8vCQkJVXBkYXRlQ29yZS5kZWJ1ZygiRW5kIFByb2Nlc3NpbmcgQWN0aXZpdHk6IGFjdGlvbjoiICsgYWN0aW9uU3RyaW5nICsgIiBsYWJlbDogIiArIGxhYmVsICsgIiBkYXRlOiIgKyBkYXRlU3RyaW5nICsgIiBzdGF0dXMiICsgc3RhdHVzU3RyaW5nKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAorLy8JCX0KKy8vCisvLwl9CisKKwkvKiogCisJICogcHJvY2VzcyB0aGUgQ29uZmlnIGluZm8KKwkgKi8KKwlwcml2YXRlIHZvaWQgcHJvY2Vzc0NvbmZpZyhQbGF0Zm9ybUNvbmZpZ3VyYXRpb24gcGxhdGZvcm1Db25maWcpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7CisKKwkJLy8gZGF0ZQorCQlwcm9jZXNzQ29uZmlndXJhdGlvbkxpZ2h0KHBsYXRmb3JtQ29uZmlnKTsKKwkJCisJCS8vdGltZWxpbmUKKy8vCQlTdHJpbmcgdGltZWxpbmVTdHJpbmcgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJ0aW1lbGluZSIpOyAvLyROT04tTkxTLTEkCisvLwkJbG9uZyB0aW1lbGluZSA9IGNvbmZpZy5nZXRDcmVhdGlvbkRhdGUoKS5nZXRUaW1lKCk7CisvLwkJaWYgKHRpbWVsaW5lU3RyaW5nIT1udWxsKSB7CisvLwkJCXRpbWVsaW5lID0gTG9uZy5wYXJzZUxvbmcodGltZWxpbmVTdHJpbmcpOworLy8JCX0KKy8vCQljb25maWcuc2V0VGltZWxpbmUodGltZWxpbmUpOworCisJCVNpdGVFbnRyeVtdIHNpdGVzID0gcGxhdGZvcm1Db25maWcuZ2V0Q29uZmlndXJhdGlvbigpLmdldFNpdGVzKCk7CisJCWZvciAoaW50IGk9MDsgaTxzaXRlcy5sZW5ndGg7IGkrKykKKwkJCXByb2Nlc3NTaXRlKHNpdGVzW2ldKTsKKworCX0KKworCisKKwlwcml2YXRlIHZvaWQgcHJvY2Vzc0NvbmZpZ3VyYXRpb25MaWdodChQbGF0Zm9ybUNvbmZpZ3VyYXRpb24gcGxhdGZvcm1Db25maWcpIHsKKwkJRGF0ZSBkYXRlID0gbmV3IERhdGUocGxhdGZvcm1Db25maWcuZ2V0Q2hhbmdlU3RhbXAoKSk7CisJCWNvbmZpZy5zZXRDcmVhdGlvbkRhdGUoZGF0ZSk7CisJCWNvbmZpZy5zZXRMYWJlbChkYXRlLnRvU3RyaW5nKCkpOworCQkKKwkJY29uZmlnLnNldEN1cnJlbnQoIGRhdGUuZXF1YWxzKG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb25maWd1cmF0b3IuUGxhdGZvcm1Db25maWd1cmF0aW9uLmdldEN1cnJlbnQoKS5nZXRDb25maWd1cmF0aW9uKCkuZ2V0RGF0ZSgpKSk7CisJfQorCQorfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvbW9kZWwvU2l0ZUxvY2FsTW9kZWwuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL21vZGVsL1NpdGVMb2NhbE1vZGVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk5ZDQ3MQotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL21vZGVsL1NpdGVMb2NhbE1vZGVsLmphdmEKQEAgLTAsMCArMSwyODYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwubW9kZWw7CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLk1vZGVsT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLkJhc2VTaXRlTG9jYWxGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLlVwZGF0ZUNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuVXBkYXRlTWFuYWdlclV0aWxzOworCisvKioKKyAqIFRoaXMgY2xhc3MgbWFuYWdlcyB0aGUgY29uZmlndXJhdGlvbnMuCisgKi8KKworcHVibGljIGNsYXNzIFNpdGVMb2NhbE1vZGVsIGV4dGVuZHMgTW9kZWxPYmplY3QgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR19GSUxFID0gInBsYXRmb3JtLnhtbCI7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIGxvbmcgc3RhbXA7CisJcHJpdmF0ZSBTdHJpbmcgbGFiZWw7CisJcHJpdmF0ZSBVUkwgbG9jYXRpb247CisJcHJpdmF0ZSBTdHJpbmcgbG9jYXRpb25VUkxTdHJpbmc7CisJcHJpdmF0ZSBpbnQgaGlzdG9yeSA9IFVwZGF0ZUNvcmUuREVGQVVMVF9ISVNUT1JZOworCXByaXZhdGUgTGlzdCAvKiBvZiBJbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsICovY29uZmlndXJhdGlvbnM7CisJcHJpdmF0ZSBMaXN0IC8qIG9mIEluc3RhbGxDb25maWd1cmF0aW9uTW9kZWwgKi9wcmVzZXJ2ZWRDb25maWd1cmF0aW9uczsKKwlwcml2YXRlIEluc3RhbGxDb25maWd1cmF0aW9uTW9kZWwgY3VycmVudENvbmZpZ3VyYXRpb247CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RvciBmb3IgTG9jYWxTaXRlCisJICovCisJcHVibGljIFNpdGVMb2NhbE1vZGVsKCl7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogQHNpbmNlIDIuMAorCSAqLworCXB1YmxpYyBJbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsIGdldEN1cnJlbnRDb25maWd1cmF0aW9uTW9kZWwoKSB7CisJCXJldHVybiBjdXJyZW50Q29uZmlndXJhdGlvbjsKKwl9CisKKwkvKioKKwkgKiBAc2luY2UgMi4wCisJICovCisJcHVibGljIEluc3RhbGxDb25maWd1cmF0aW9uTW9kZWxbXSBnZXRDb25maWd1cmF0aW9uSGlzdG9yeU1vZGVsKCkgeworCQlpZiAoY29uZmlndXJhdGlvbnM9PW51bGwpCisJCQkvLyBpbml0aWFsaXplIGhpc3RvcnkKKwkJCXByb2Nlc3NIaXN0b3J5KCk7CisJCQorCQlpZiAoY29uZmlndXJhdGlvbnMgPT0gbnVsbCB8fCBjb25maWd1cmF0aW9ucy5zaXplKCkgPT0gMCkKKwkJCXJldHVybiBuZXcgSW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbFswXTsKKwkJZWxzZQorCQkJcmV0dXJuIChJbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsW10pY29uZmlndXJhdGlvbnMudG9BcnJheShhcnJheVR5cGVGb3IoY29uZmlndXJhdGlvbnMpKTsKKwl9CisKKwkvKioKKwkgKiBhZGRzIGEgbmV3IGNvbmZpZ3VyYXRpb24gdG8gdGhlIExvY2FsU2l0ZQorCSAqICB0aGUgbmV3bHkgYWRkZWQgY29uZmlndXJhdGlvbiBpcyB0ZWggY3VycmVudCBvbmUKKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRDb25maWd1cmF0aW9uTW9kZWwoSW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbCBjb25maWcpIHsKKwkJaWYgKGNvbmZpZyAhPSBudWxsKSB7CisJCQlpZiAoY29uZmlndXJhdGlvbnMgPT0gbnVsbCkKKwkJCQljb25maWd1cmF0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJCWlmICghY29uZmlndXJhdGlvbnMuY29udGFpbnMoY29uZmlnKSkKKwkJCQljb25maWd1cmF0aW9ucy5hZGQoY29uZmlnKTsKKwkJfQorCX0KKworCS8qKgorCSAqIGFkZHMgYSBuZXcgY29uZmlndXJhdGlvbiB0byB0aGUgTG9jYWxTaXRlCisJICogIHRoZSBuZXdseSBhZGRlZCBjb25maWd1cmF0aW9uIGlzIHRlaCBjdXJyZW50IG9uZQorCSAqLworCXB1YmxpYyBib29sZWFuIHJlbW92ZUNvbmZpZ3VyYXRpb25Nb2RlbChJbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsIGNvbmZpZykgeworCQlpZiAoY29uZmlnICE9IG51bGwpIHsKKwkJCXJldHVybiBjb25maWd1cmF0aW9ucy5yZW1vdmUoY29uZmlnKTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCS8qKgorCSAqIEdldHMgdGhlIGxvY2F0aW9uIG9mIHRoZSBsb2NhbCBzaXRlLgorCSAqIEByZXR1cm4gUmV0dXJucyBhIFVSTAorCSAqLworCXB1YmxpYyBVUkwgZ2V0TG9jYXRpb25VUkwoKSB7CisJCXJldHVybiBsb2NhdGlvbjsKKwl9CisKKwkvKioKKwkgKiBHZXRzIHRoZSBsb2NhdGlvblVSTFN0cmluZy4KKwkgKiBAcmV0dXJuIFJldHVybnMgYSBTdHJpbmcKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uVVJMU3RyaW5nKCkgeworCQlyZXR1cm4gbG9jYXRpb25VUkxTdHJpbmc7CisJfQorCisKKwkvKioKKwkgKiBTZXRzIHRoZSBsb2NhdGlvblVSTFN0cmluZy4KKwkgKiBAcGFyYW0gbG9jYXRpb25VUkxTdHJpbmcgVGhlIGxvY2F0aW9uVVJMU3RyaW5nIHRvIHNldAorCSAqLworCXB1YmxpYyB2b2lkIHNldExvY2F0aW9uVVJMU3RyaW5nKFN0cmluZyBsb2NhdGlvblVSTFN0cmluZykgeworCQlhc3NlcnRJc1dyaXRlYWJsZSgpOworCQl0aGlzLmxvY2F0aW9uVVJMU3RyaW5nID0gbG9jYXRpb25VUkxTdHJpbmc7CisJCXRoaXMubG9jYXRpb249bnVsbDsKKwl9CisKKworCS8qKgorCSAqIEBzaW5jZSAyLjAKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgeworCQlyZXR1cm4gbGFiZWw7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgbGFiZWwuCisJICogQHBhcmFtIGxhYmVsIFRoZSBsYWJlbCB0byBzZXQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgbGFiZWwpIHsKKwkJYXNzZXJ0SXNXcml0ZWFibGUoKTsKKwkJdGhpcy5sYWJlbCA9IGxhYmVsOworCX0KKworCQorCS8qKgorCSAqIEBzaW5jZSAyLjAKKwkgKi8KKwlwdWJsaWMgaW50IGdldE1heGltdW1IaXN0b3J5Q291bnQoKSB7CisJCXJldHVybiBoaXN0b3J5OworCX0KKworCS8qKgorCSAqIEBzaW5jZSAyLjAKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRNYXhpbXVtSGlzdG9yeUNvdW50KGludCBoaXN0b3J5KSB7CisJCWFzc2VydElzV3JpdGVhYmxlKCk7CisJCXRoaXMuaGlzdG9yeSA9IGhpc3Rvcnk7CisJfQorCisJCisJLyoqCisJICogQWRkcyBhIHByZXNlcnZlZCBjb25maWd1cmF0aW9uIGludG8gdGVoIGNvbGxlY3Rpb24KKwkgKiBkbyBub3Qgc2F2ZSB0aGUgY29uZmlndXJhdGlvbgorCSAqIEBzaW5jZSAyLjAKKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRQcmVzZXJ2ZWRJbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsKEluc3RhbGxDb25maWd1cmF0aW9uTW9kZWwgY29uZmlndXJhdGlvbikgeworCQlpZiAocHJlc2VydmVkQ29uZmlndXJhdGlvbnMgPT0gbnVsbCkKKwkJCXByZXNlcnZlZENvbmZpZ3VyYXRpb25zID0gbmV3IEFycmF5TGlzdCgpOworCisJCXByZXNlcnZlZENvbmZpZ3VyYXRpb25zLmFkZChjb25maWd1cmF0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBAc2luY2UgMi4wCisJICovCisJcHVibGljIGJvb2xlYW4gcmVtb3ZlUHJlc2VydmVkQ29uZmlndXJhdGlvbk1vZGVsKEluc3RhbGxDb25maWd1cmF0aW9uTW9kZWwgY29uZmlndXJhdGlvbikgeworCQlpZiAocHJlc2VydmVkQ29uZmlndXJhdGlvbnMgIT0gbnVsbCkgeworCQkJcmV0dXJuIHByZXNlcnZlZENvbmZpZ3VyYXRpb25zLnJlbW92ZShjb25maWd1cmF0aW9uKTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoqCisJICogQHNpbmNlIDIuMAorCSAqLworCXB1YmxpYyBJbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsW10gZ2V0UHJlc2VydmVkQ29uZmlndXJhdGlvbnNNb2RlbCgpIHsKKwkJaWYgKHByZXNlcnZlZENvbmZpZ3VyYXRpb25zPT1udWxsIHx8IHByZXNlcnZlZENvbmZpZ3VyYXRpb25zLmlzRW1wdHkoKSkKKwkJCXJldHVybiBuZXcgSW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbFswXTsKKwkJcmV0dXJuIChJbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsW10pcHJlc2VydmVkQ29uZmlndXJhdGlvbnMudG9BcnJheShhcnJheVR5cGVGb3IocHJlc2VydmVkQ29uZmlndXJhdGlvbnMpKTsKKwl9CisKKworCS8qKgorCSAqIFNldHMgdGhlIGN1cnJlbnRDb25maWd1cmF0aW9uLgorCSAqIEBwYXJhbSBjdXJyZW50Q29uZmlndXJhdGlvbiBUaGUgY3VycmVudENvbmZpZ3VyYXRpb24gdG8gc2V0CisJICovCisJcHVibGljIHZvaWQgc2V0Q3VycmVudENvbmZpZ3VyYXRpb25Nb2RlbChJbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsIGN1cnJlbnRDb25maWd1cmF0aW9uKSB7CisJCWFzc2VydElzV3JpdGVhYmxlKCk7CisJCXRoaXMuY3VycmVudENvbmZpZ3VyYXRpb24gPSBjdXJyZW50Q29uZmlndXJhdGlvbjsKKwkJCisJCS8vMi4wLjIgc2V0IHRoZSBjb25maWd1cmVkU2l0ZSBvZiBzaXRlcworCQlDb25maWd1cmVkU2l0ZU1vZGVsW10gY29uZlNpdGVzID0gY3VycmVudENvbmZpZ3VyYXRpb24uZ2V0Q29uZmlndXJhdGlvblNpdGVzTW9kZWwoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb25mU2l0ZXMubGVuZ3RoOyBpKyspIHsKKwkJCWNvbmZTaXRlc1tpXS5nZXRTaXRlTW9kZWwoKS5zZXRDb25maWd1cmVkU2l0ZU1vZGVsKGNvbmZTaXRlc1tpXSk7CisJCX0KKwl9CisKKwkvKgorCSAqIEBzZWUgTW9kZWxPYmplY3QjcmVzb2x2ZShVUkwpCisJICovCisJcHVibGljIHZvaWQgcmVzb2x2ZShVUkwgYmFzZSxVUkwgYnVuZGxlVVJMKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKKwkJLy8gbG9jYWwKKwkJbG9jYXRpb24gPSByZXNvbHZlVVJMKGJhc2UsYnVuZGxlVVJMLGdldExvY2F0aW9uVVJMU3RyaW5nKCkpOworCQkKKwkJLy8gZGVsZWdhdGUKKwkJcmVzb2x2ZUxpc3RSZWZlcmVuY2UoZ2V0Q29uZmlndXJhdGlvbkhpc3RvcnlNb2RlbCgpLGJhc2UsYnVuZGxlVVJMKTsKKwkJcmVzb2x2ZUxpc3RSZWZlcmVuY2UoZ2V0UHJlc2VydmVkQ29uZmlndXJhdGlvbnNNb2RlbCgpLGJhc2UsYnVuZGxlVVJMKTsKKwkJcmVzb2x2ZVJlZmVyZW5jZShnZXRDdXJyZW50Q29uZmlndXJhdGlvbk1vZGVsKCksYmFzZSxidW5kbGVVUkwpOworCX0KKwkKKworCS8qKgorCSAqIEdldHMgdGhlIHN0YW1wLgorCSAqIEByZXR1cm4gUmV0dXJucyBhIGxvbmcKKwkgKi8KKwlwdWJsaWMgbG9uZyBnZXRTdGFtcCgpIHsKKwkJcmV0dXJuIHN0YW1wOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHN0YW1wLgorCSAqIEBwYXJhbSBzdGFtcCBUaGUgc3RhbXAgdG8gc2V0CisJICovCisJcHVibGljIHZvaWQgc2V0U3RhbXAobG9uZyBzdGFtcCkgeworCQl0aGlzLnN0YW1wID0gc3RhbXA7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC5Nb2RlbE9iamVjdCNnZXRQcm9wZXJ0eU5hbWUoKQorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvcGVydHlOYW1lKCkgeworCQlyZXR1cm4gInBsYXRmb3JtIjsgLy8kTk9OLU5MUy0xJAorCX0KKworCS8qCisJICogcmVhZHMgdGhlIGNvbmZpZ3VyYXRpb24vaGlzdG9yeSBkaXJlY3RvcnkKKwkgKi8KKwlwcml2YXRlIHZvaWQgcHJvY2Vzc0hpc3RvcnkoKSB7CisJCXRyeSB7CisJCQlVUkwgaGlzdG9yeVVSTCA9IG5ldyBVUkwoZ2V0TG9jYXRpb25VUkwoKSwgImhpc3RvcnkiKTsgLy8kTk9OLU5MUy0xJAorCQkJaGlzdG9yeVVSTCA9IEZpbGVMb2NhdG9yLnRvRmlsZVVSTChoaXN0b3J5VVJMKTsKKwkJCUZpbGUgaGlzdG9yeURpciA9IG5ldyBGaWxlKGhpc3RvcnlVUkwuZ2V0RmlsZSgpKTsKKwkJCWlmIChoaXN0b3J5RGlyLmV4aXN0cygpKSB7CisJCQkJRmlsZVtdIGJhY2tlZENvbmZpZ3MgPSBoaXN0b3J5RGlyLmxpc3RGaWxlcygpOworCQkJCUJhc2VTaXRlTG9jYWxGYWN0b3J5IGZhY3RvcnkgPSBuZXcgQmFzZVNpdGVMb2NhbEZhY3RvcnkoKTsKKwkJCQlmb3IgKGludCBpPTA7IGk8YmFja2VkQ29uZmlncy5sZW5ndGg7IGkrKykgeworCQkJCQlTdHJpbmcgbmFtZSA9IGJhY2tlZENvbmZpZ3NbaV0uZ2V0TmFtZSgpOworCQkJCQlpZiAobmFtZS5lbmRzV2l0aCgiLnhtbCIpKSAvLyROT04tTkxTLTEkCisJCQkJCQluYW1lID0gbmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5sZW5ndGgoKS00KTsKKwkJCQkJZWxzZSAKKwkJCQkJCWNvbnRpbnVlOworCQkJCQlEYXRlIGRhdGUgPSBuZXcgRGF0ZShMb25nLnBhcnNlTG9uZyhuYW1lKSk7CisJCQkJCUluc3RhbGxDb25maWd1cmF0aW9uTW9kZWwgY29uZmlnID0gZmFjdG9yeS5jcmVhdGVJbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsKCk7CisJCQkJCWNvbmZpZy5zZXRMb2NhdGlvblVSTFN0cmluZyhiYWNrZWRDb25maWdzW2ldLmdldEFic29sdXRlUGF0aCgpLnJlcGxhY2UoJ1xcJywgJy8nKSk7CisJCQkJCWNvbmZpZy5zZXRMYWJlbChkYXRlLnRvU3RyaW5nKCkpOworCQkJCQljb25maWcuc2V0Q3JlYXRpb25EYXRlKGRhdGUpOworCQkJCQljb25maWcucmVzb2x2ZShiYWNrZWRDb25maWdzW2ldLnRvVVJMKCksIGdldFJlc291cmNlQnVuZGxlVVJMKCkpOworCQorCQkJCQkvLyBhZGQgdGhlIGNvbmZpZworCQkJCQlhZGRDb25maWd1cmF0aW9uTW9kZWwoY29uZmlnKTsKKwkJCQl9CisJCQl9CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlVcGRhdGVDb3JlLndhcm4oIkVycm9yIHByb2Nlc3NpbmcgaGlzdG9yeTogIiwgZSk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCX0KKworCS8qKgorCSAqIHJldHVybiB0aGUgYXBwcm9wcmlhdGUgcmVzb3VyY2UgYnVuZGxlIGZvciB0aGlzIHNpdGVsb2NhbAorCSAqLworCVVSTCBnZXRSZXNvdXJjZUJ1bmRsZVVSTCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJVVJMIHVybCA9IG51bGw7CisJCXRyeSB7CisJCQl1cmwgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuYXNEaXJlY3RvcnlVUkwoZ2V0TG9jYXRpb25VUkwoKSk7CisJCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7CisJCQlVcGRhdGVDb3JlLndhcm4oZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkgKyAiOiIgKyB1cmwudG9FeHRlcm5hbEZvcm0oKSk7IC8vJE5PTi1OTFMtMSQKKwkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKwkJCVVwZGF0ZUNvcmUud2FybihlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7IAorCQl9CisJCXJldHVybiB1cmw7CisJfQorCit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9tb2RlbC9TaXRlTG9jYWxQYXJzZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL21vZGVsL1NpdGVMb2NhbFBhcnNlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiNzI2NjMKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9tb2RlbC9TaXRlTG9jYWxQYXJzZXIuamF2YQpAQCAtMCwwICsxLDEzOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5tb2RlbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi5JTG9jYWxTaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IuSVBsYXRmb3JtQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29uZmlndXJhdG9yLlBsYXRmb3JtQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5CYXNlU2l0ZUxvY2FsRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5JbnN0YWxsQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5Mb2NhbFNpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuVXBkYXRlQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5VcGRhdGVNYW5hZ2VyVXRpbHM7CisKKy8qKgorICogcGFyc2UgdGhlIGRlZmF1bHQgc2l0ZS54bWwKKyAqLworCitwdWJsaWMgY2xhc3MgU2l0ZUxvY2FsUGFyc2VyIHsKKworCXByaXZhdGUgUGxhdGZvcm1Db25maWd1cmF0aW9uIHBsYXRmb3JtQ29uZmlnOworCXByaXZhdGUgU2l0ZUxvY2FsTW9kZWwgc2l0ZTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUcgPSAiY29uZmlnIjsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgUmVzb3VyY2VCdW5kbGUgYnVuZGxlOworCXByaXZhdGUgQmFzZVNpdGVMb2NhbEZhY3RvcnkgZmFjdG9yeSA9IG5ldyBCYXNlU2l0ZUxvY2FsRmFjdG9yeSgpOworCisJLyoqCisJICogcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSByZXNvdXJjZSBidW5kbGUgZm9yIHRoaXMgc2l0ZWxvY2FsCisJICovCisJcHJpdmF0ZSBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gbnVsbDsKKwkJVVJMIHVybCA9IG51bGw7CisJCXRyeSB7CisJCQl1cmwgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuYXNEaXJlY3RvcnlVUkwoc2l0ZS5nZXRMb2NhdGlvblVSTCgpKTsKKwkJCUNsYXNzTG9hZGVyIGwgPSBuZXcgVVJMQ2xhc3NMb2FkZXIobmV3IFVSTFtdIHsgdXJsIH0sIG51bGwpOworCQkJYnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJwbGF0Zm9ybSIsIExvY2FsZS5nZXREZWZhdWx0KCksIGwpOyAvLyROT04tTkxTLTEkCisJCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7CisJCQlVcGRhdGVDb3JlLndhcm4oZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkgKyAiOiIgKyB1cmwudG9FeHRlcm5hbEZvcm0oKSk7IC8vJE5PTi1OTFMtMSQKKwkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKwkJCVVwZGF0ZUNvcmUud2FybihlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7IAorCQl9CisJCXJldHVybiBidW5kbGU7CisJfQorCisJLyoqCisJICogQ29uc3RydWN0b3IgZm9yIERlZmF1bHRTaXRlUGFyc2VyCisJICovCisJcHVibGljIFNpdGVMb2NhbFBhcnNlcihJUGxhdGZvcm1Db25maWd1cmF0aW9uIHBsYXRmb3JtQ29uZmlnLCBJTG9jYWxTaXRlIHNpdGUpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7CisJCUFzc2VydC5pc1RydWUocGxhdGZvcm1Db25maWcgaW5zdGFuY2VvZiBQbGF0Zm9ybUNvbmZpZ3VyYXRpb24pOworCQl0aGlzLnBsYXRmb3JtQ29uZmlnID0gKFBsYXRmb3JtQ29uZmlndXJhdGlvbilwbGF0Zm9ybUNvbmZpZzsKKwkJCisJCUFzc2VydC5pc1RydWUoc2l0ZSBpbnN0YW5jZW9mIFNpdGVMb2NhbE1vZGVsKTsKKwkJdGhpcy5zaXRlID0gKFNpdGVMb2NhbE1vZGVsKSBzaXRlOworCisJCS8vIERFQlVHOgkJCisJCWlmIChVcGRhdGVDb3JlLkRFQlVHICYmIFVwZGF0ZUNvcmUuREVCVUdfU0hPV19QQVJTSU5HKSB7CisJCQlVcGRhdGVDb3JlLmRlYnVnKCJTdGFydCBwYXJzaW5nIGxvY2Fsc2l0ZToiICsgKChTaXRlTG9jYWxNb2RlbCkgc2l0ZSkuZ2V0TG9jYXRpb25VUkxTdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQkKKwkJYnVuZGxlID0gZ2V0UmVzb3VyY2VCdW5kbGUoKTsKKwkJCisJCXByb2Nlc3NDb25maWcoKTsKKwkJLy9wcm9jZXNzSGlzdG9yeSgpOworCX0KKworCQorLy8JLyoqIAorLy8JICogcHJvY2VzcyB0aGUgU2l0ZSBpbmZvCisvLwkgKi8KKy8vCXByaXZhdGUgdm9pZCBwcm9jZXNzU2l0ZShBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24geworLy8JCS8vCisvLwkJU3RyaW5nIGluZm8gPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJsYWJlbCIpOyAvLyROT04tTkxTLTEkCisvLwkJaW5mbyA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRSZXNvdXJjZVN0cmluZyhpbmZvLCBidW5kbGUpOworLy8JCXNpdGUuc2V0TGFiZWwoaW5mbyk7CisvLwkKKy8vCQkvLyBoaXN0b3J5CisvLwkJU3RyaW5nIGhpc3RvcnlTdHJpbmcgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJoaXN0b3J5Iik7IC8vJE5PTi1OTFMtMSQKKy8vCQlpbnQgaGlzdG9yeTsKKy8vCQlpZiAoaGlzdG9yeVN0cmluZyA9PSBudWxsIHx8IGhpc3RvcnlTdHJpbmcuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCisvLwkJCWhpc3RvcnkgPSBTaXRlTG9jYWxNb2RlbC5ERUZBVUxUX0hJU1RPUlk7CisvLwkJfSBlbHNlIHsKKy8vCQkJaGlzdG9yeSA9IEludGVnZXIucGFyc2VJbnQoaGlzdG9yeVN0cmluZyk7CisvLwkJfQorLy8JCXNpdGUuc2V0TWF4aW11bUhpc3RvcnlDb3VudChoaXN0b3J5KTsKKy8vCQorLy8JCS8vc3RhbXAKKy8vCQlTdHJpbmcgc3RhbXBTdHJpbmcgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJzdGFtcCIpOyAvLyROT04tTkxTLTEkCisvLwkJbG9uZyBzdGFtcCA9IExvbmcucGFyc2VMb25nKHN0YW1wU3RyaW5nKTsKKy8vCQlzaXRlLnNldFN0YW1wKHN0YW1wKTsKKy8vCQorLy8JCS8vIERFQlVHOgkJCisvLwkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX1BBUlNJTkcpIHsKKy8vCQkJVXBkYXRlQ29yZS5kZWJ1ZygiRW5kIHByb2Nlc3MgU2l0ZSBsYWJlbDoiICsgaW5mbyk7IC8vJE5PTi1OTFMtMSQKKy8vCQl9CisvLwkKKy8vCX0KKworCS8qKiAKKwkgKiBwcm9jZXNzIHRoZSBDb25maWcgaW5mbworCSAqLworCXByaXZhdGUgdm9pZCBwcm9jZXNzQ29uZmlnKCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7CisKKwkJU3RyaW5nIGxhYmVsID0gcGxhdGZvcm1Db25maWcuZ2V0Q29uZmlndXJhdGlvbigpLmdldERhdGUoKS50b1N0cmluZygpOworCQlsYWJlbCA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRSZXNvdXJjZVN0cmluZyhsYWJlbCwgYnVuZGxlKTsKKwkJc2l0ZS5zZXRMYWJlbChsYWJlbCk7CisKKwkJVVJMIHVybCA9IHNpdGUuZ2V0TG9jYXRpb25VUkwoKTsKKwkJSW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbCBjb25maWcgPSBmYWN0b3J5LmNyZWF0ZUluc3RhbGxDb25maWd1cmF0aW9uTW9kZWwoKTsKKwkJY29uZmlnLnNldExvY2F0aW9uVVJMU3RyaW5nKHVybC50b0V4dGVybmFsRm9ybSgpKTsKKwkJY29uZmlnLnNldExhYmVsKGxhYmVsKTsKKwkJY29uZmlnLnJlc29sdmUodXJsLCBzaXRlLmdldFJlc291cmNlQnVuZGxlVVJMKCkpOworCisJCS8vIGFkZCB0aGUgY29uZmlnCisJCSgoTG9jYWxTaXRlKXNpdGUpLmFkZENvbmZpZ3VyYXRpb24oKEluc3RhbGxDb25maWd1cmF0aW9uKWNvbmZpZyk7CisKKwkJLy8gREVCVUc6CQkKKwkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX1BBUlNJTkcpIHsKKwkJCVVwZGF0ZUNvcmUuZGVidWcoIkVuZCBQcm9jZXNzaW5nIENvbmZpZyBUYWc6IHVybDoiICsgdXJsLnRvRXh0ZXJuYWxGb3JtKCkpOyAvLyROT04tTkxTLTEkCisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9tb2RlbC9TaXRlV2l0aFRpbWVzdGFtcC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvbW9kZWwvU2l0ZVdpdGhUaW1lc3RhbXAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzRkMzIzCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvbW9kZWwvU2l0ZVdpdGhUaW1lc3RhbXAuamF2YQpAQCAtMCwwICsxLDI2NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLkRhdGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5TaXRlOworCisvKioKKyAqIFRoaXMgaXMgYSB3cmFwcGVyIGNsYXNzIGZvciBTaXRlIGNsYXNzIHRoYXQgYWRkcyB0aW1lc3RhbXAKKyAqIAorICoKKyAqLworcHVibGljIGNsYXNzIFNpdGVXaXRoVGltZXN0YW1wIGV4dGVuZHMgU2l0ZSBpbXBsZW1lbnRzIElUaW1lc3RhbXAgeworCisJcHJpdmF0ZSBEYXRlIHRpbWVzdGFtcDsKKwkKKwkvKnByaXZhdGUgU2l0ZSBzaXRlOworCQorCXB1YmxpYyBTaXRlV2l0aFRpbWVzdGFtcCggU2l0ZSBzaXRlKSB7CisJCXRoaXMuc2l0ZSA9IHNpdGU7CisJfSovCisJCisJcHVibGljIERhdGUgZ2V0VGltZXN0YW1wKCkgeworCQlyZXR1cm4gdGltZXN0YW1wOworCX0KKworCXB1YmxpYyB2b2lkIHNldFRpbWVzdGFtcChEYXRlIHRpbWVzdGFtcCkgeworCQl0aGlzLnRpbWVzdGFtcCA9IHRpbWVzdGFtcDsKKwkJCisJfQorLyoKKwlwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkgeworCQlyZXR1cm4gc2l0ZS5pc1JlYWRPbmx5KCk7CisJfQorCisJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsJCQorCQlyZXR1cm4gc2l0ZS5nZXRBZGFwdGVyKGFkYXB0ZXIpOworCX0KKworCXB1YmxpYyB2b2lkIGFkZFBsdWdpbkVudHJ5KElQbHVnaW5FbnRyeSBwbHVnaW5FbnRyeSkgewkJCisJCXNpdGUuYWRkUGx1Z2luRW50cnkocGx1Z2luRW50cnkpOworCX0KKworCXB1YmxpYyBJRmVhdHVyZSBjcmVhdGVGZWF0dXJlKFN0cmluZyB0eXBlLCBVUkwgdXJsKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CQorCQlyZXR1cm4gc2l0ZS5jcmVhdGVGZWF0dXJlKHR5cGUsIHVybCk7CisJfQorCisJcHVibGljIElGZWF0dXJlIGNyZWF0ZUZlYXR1cmUoU3RyaW5nIHR5cGUsIFVSTCB1cmwsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewkJCisJCXJldHVybiBzaXRlLmNyZWF0ZUZlYXR1cmUodHlwZSwgdXJsLCBtb25pdG9yKTsKKwl9CisKKwlwdWJsaWMgSUFyY2hpdmVSZWZlcmVuY2VbXSBnZXRBcmNoaXZlcygpIHsJCQorCQlyZXR1cm4gc2l0ZS5nZXRBcmNoaXZlcygpOworCX0KKworCXB1YmxpYyBJQ2F0ZWdvcnlbXSBnZXRDYXRlZ29yaWVzKCkgewkJCisJCXJldHVybiBzaXRlLmdldENhdGVnb3JpZXMoKTsKKwl9CisKKwlwdWJsaWMgSUNhdGVnb3J5IGdldENhdGVnb3J5KFN0cmluZyBrZXkpIHsJCQorCQlyZXR1cm4gc2l0ZS5nZXRDYXRlZ29yeShrZXkpOworCX0KKworCXB1YmxpYyBJQ29uZmlndXJlZFNpdGUgZ2V0Q3VycmVudENvbmZpZ3VyZWRTaXRlKCkgewkKKwkJcmV0dXJuIHNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyZWRTaXRlKCk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXREZWZhdWx0UGFja2FnZWRGZWF0dXJlVHlwZSgpIHsJCisJCXJldHVybiBzaXRlLmdldERlZmF1bHRQYWNrYWdlZEZlYXR1cmVUeXBlKCk7CisJfQorCisJcHVibGljIElVUkxFbnRyeSBnZXREZXNjcmlwdGlvbigpIHsJCisJCXJldHVybiBzaXRlLmdldERlc2NyaXB0aW9uKCk7CisJfQorCisJcHVibGljIGxvbmcgZ2V0RG93bmxvYWRTaXplRm9yKElGZWF0dXJlIGZlYXR1cmUpIHsJCisJCXJldHVybiBzaXRlLmdldERvd25sb2FkU2l6ZUZvcihmZWF0dXJlKTsKKwl9CisKKwlwdWJsaWMgSVNpdGVGZWF0dXJlUmVmZXJlbmNlIGdldEZlYXR1cmVSZWZlcmVuY2UoSUZlYXR1cmUgZmVhdHVyZSkgewkKKwkJcmV0dXJuIHNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZShmZWF0dXJlKTsKKwl9CisKKwlwdWJsaWMgSVNpdGVGZWF0dXJlUmVmZXJlbmNlW10gZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKSB7CQorCQlyZXR1cm4gc2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpOworCX0KKworCXB1YmxpYyBsb25nIGdldEluc3RhbGxTaXplRm9yKElGZWF0dXJlIGZlYXR1cmUpIHsJCisJCXJldHVybiBzaXRlLmdldEluc3RhbGxTaXplRm9yKGZlYXR1cmUpOworCX0KKworCXB1YmxpYyBJVVJMRW50cnlbXSBnZXRNaXJyb3JTaXRlRW50cmllcygpIHsJCisJCXJldHVybiBzaXRlLmdldE1pcnJvclNpdGVFbnRyaWVzKCk7CisJfQorCisJcHVibGljIElQbHVnaW5FbnRyeVtdIGdldFBsdWdpbkVudHJpZXMoKSB7CQorCQlyZXR1cm4gc2l0ZS5nZXRQbHVnaW5FbnRyaWVzKCk7CisJfQorCisJcHVibGljIElQbHVnaW5FbnRyeVtdIGdldFBsdWdpbkVudHJpZXNPbmx5UmVmZXJlbmNlZEJ5KElGZWF0dXJlIGZlYXR1cmUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsJCisJCXJldHVybiBzaXRlLmdldFBsdWdpbkVudHJpZXNPbmx5UmVmZXJlbmNlZEJ5KGZlYXR1cmUpOworCX0KKworCXB1YmxpYyBpbnQgZ2V0UGx1Z2luRW50cnlDb3VudCgpIHsJCQorCQlyZXR1cm4gc2l0ZS5nZXRQbHVnaW5FbnRyeUNvdW50KCk7CisJfQorCisJcHVibGljIElTaXRlRmVhdHVyZVJlZmVyZW5jZVtdIGdldFJhd0ZlYXR1cmVSZWZlcmVuY2VzKCkgewkKKwkJcmV0dXJuIHNpdGUuZ2V0UmF3RmVhdHVyZVJlZmVyZW5jZXMoKTsKKwl9CisKKwlwdWJsaWMgSVNpdGVDb250ZW50UHJvdmlkZXIgZ2V0U2l0ZUNvbnRlbnRQcm92aWRlcigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsJCisJCXJldHVybiBzaXRlLmdldFNpdGVDb250ZW50UHJvdmlkZXIoKTsKKwl9CisKKwlwdWJsaWMgVVJMIGdldFVSTCgpIHsJCisJCXJldHVybiBzaXRlLmdldFVSTCgpOworCX0KKworCXB1YmxpYyBJRmVhdHVyZVJlZmVyZW5jZSBpbnN0YWxsKElGZWF0dXJlIHNvdXJjZUZlYXR1cmUsIElGZWF0dXJlUmVmZXJlbmNlW10gb3B0aW9uYWxGZWF0dXJlcywgSUZlYXR1cmVDb250ZW50Q29uc3VtZXIgcGFyZW50Q29udGVudENvbnN1bWVyLCBJVmVyaWZpZXIgcGFyZW50VmVyaWZpZXIsIElWZXJpZmljYXRpb25MaXN0ZW5lciB2ZXJpZmljYXRpb25MaXN0ZW5lciwgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzcykgdGhyb3dzIENvcmVFeGNlcHRpb24gewkKKwkJcmV0dXJuIHNpdGUuaW5zdGFsbChzb3VyY2VGZWF0dXJlLCBvcHRpb25hbEZlYXR1cmVzLCBwYXJlbnRDb250ZW50Q29uc3VtZXIsCisJCQkJcGFyZW50VmVyaWZpZXIsIHZlcmlmaWNhdGlvbkxpc3RlbmVyLCBwcm9ncmVzcyk7CisJfQorCisJcHVibGljIElGZWF0dXJlUmVmZXJlbmNlIGluc3RhbGwoSUZlYXR1cmUgc291cmNlRmVhdHVyZSwgSUZlYXR1cmVSZWZlcmVuY2VbXSBvcHRpb25hbEZlYXR1cmVzLCBJVmVyaWZpY2F0aW9uTGlzdGVuZXIgdmVyaWZpY2F0aW9uTGlzdGVuZXIsIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3MpIHRocm93cyBJbnN0YWxsQWJvcnRlZEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7CQkKKwkJcmV0dXJuIHNpdGUuaW5zdGFsbChzb3VyY2VGZWF0dXJlLCBvcHRpb25hbEZlYXR1cmVzLCB2ZXJpZmljYXRpb25MaXN0ZW5lciwKKwkJCQlwcm9ncmVzcyk7CisJfQorCisJcHVibGljIElGZWF0dXJlUmVmZXJlbmNlIGluc3RhbGwoSUZlYXR1cmUgc291cmNlRmVhdHVyZSwgSVZlcmlmaWNhdGlvbkxpc3RlbmVyIHZlcmlmaWNhdGlvbkxpc3RlbmVyLCBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzKSB0aHJvd3MgSW5zdGFsbEFib3J0ZWRFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewkJCisJCXJldHVybiBzaXRlLmluc3RhbGwoc291cmNlRmVhdHVyZSwgdmVyaWZpY2F0aW9uTGlzdGVuZXIsIHByb2dyZXNzKTsKKwl9CisKKwlwdWJsaWMgdm9pZCByZW1vdmUoSUZlYXR1cmUgZmVhdHVyZSwgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzcykgdGhyb3dzIENvcmVFeGNlcHRpb24gewkJCisJCXNpdGUucmVtb3ZlKGZlYXR1cmUsIHByb2dyZXNzKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRTaXRlQ29udGVudFByb3ZpZGVyKElTaXRlQ29udGVudFByb3ZpZGVyIHNpdGVDb250ZW50UHJvdmlkZXIpIHsJCQorCQlzaXRlLnNldFNpdGVDb250ZW50UHJvdmlkZXIoc2l0ZUNvbnRlbnRQcm92aWRlcik7CisJfQorCisJcHVibGljIHZvaWQgYWRkQXJjaGl2ZVJlZmVyZW5jZU1vZGVsKEFyY2hpdmVSZWZlcmVuY2VNb2RlbCBhcmNoaXZlUmVmZXJlbmNlKSB7CQkKKwkJc2l0ZS5hZGRBcmNoaXZlUmVmZXJlbmNlTW9kZWwoYXJjaGl2ZVJlZmVyZW5jZSk7CisJfQorCisJcHVibGljIHZvaWQgYWRkQ2F0ZWdvcnlNb2RlbChDYXRlZ29yeU1vZGVsIGNhdGVnb3J5KSB7CQkKKwkJc2l0ZS5hZGRDYXRlZ29yeU1vZGVsKGNhdGVnb3J5KTsKKwl9CisKKwlwdWJsaWMgdm9pZCBhZGRGZWF0dXJlUmVmZXJlbmNlTW9kZWwoU2l0ZUZlYXR1cmVSZWZlcmVuY2VNb2RlbCBmZWF0dXJlUmVmZXJlbmNlKSB7CQkKKwkJc2l0ZS5hZGRGZWF0dXJlUmVmZXJlbmNlTW9kZWwoZmVhdHVyZVJlZmVyZW5jZSk7CisJfQorCisJcHVibGljIHZvaWQgYWRkTWlycm9yTW9kZWwoVVJMRW50cnlNb2RlbCBtaXJyb3IpIHsJCQorCQlzaXRlLmFkZE1pcnJvck1vZGVsKG1pcnJvcik7CisJfQorCisJcHVibGljIEFyY2hpdmVSZWZlcmVuY2VNb2RlbFtdIGdldEFyY2hpdmVSZWZlcmVuY2VNb2RlbHMoKSB7CQkKKwkJcmV0dXJuIHNpdGUuZ2V0QXJjaGl2ZVJlZmVyZW5jZU1vZGVscygpOworCX0KKworCXB1YmxpYyBDYXRlZ29yeU1vZGVsW10gZ2V0Q2F0ZWdvcnlNb2RlbHMoKSB7CQorCQlyZXR1cm4gc2l0ZS5nZXRDYXRlZ29yeU1vZGVscygpOworCX0KKworCXB1YmxpYyBDb25maWd1cmVkU2l0ZU1vZGVsIGdldENvbmZpZ3VyZWRTaXRlTW9kZWwoKSB7CQorCQlyZXR1cm4gc2l0ZS5nZXRDb25maWd1cmVkU2l0ZU1vZGVsKCk7CisJfQorCisJcHVibGljIFVSTEVudHJ5TW9kZWwgZ2V0RGVzY3JpcHRpb25Nb2RlbCgpIHsJCisJCXJldHVybiBzaXRlLmdldERlc2NyaXB0aW9uTW9kZWwoKTsKKwl9CisKKwlwdWJsaWMgU2l0ZUZlYXR1cmVSZWZlcmVuY2VNb2RlbFtdIGdldEZlYXR1cmVSZWZlcmVuY2VNb2RlbHMoKSB7CQkKKwkJcmV0dXJuIHNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZU1vZGVscygpOworCX0KKworCXB1YmxpYyBVUkwgZ2V0TG9jYXRpb25VUkwoKSB7CQkKKwkJcmV0dXJuIHNpdGUuZ2V0TG9jYXRpb25VUkwoKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uVVJMU3RyaW5nKCkgewkJCisJCXJldHVybiBzaXRlLmdldExvY2F0aW9uVVJMU3RyaW5nKCk7CisJfQorCisJcHVibGljIFVSTEVudHJ5TW9kZWxbXSBnZXRNaXJyb3JTaXRlRW50cnlNb2RlbHMoKSB7CQorCQlyZXR1cm4gc2l0ZS5nZXRNaXJyb3JTaXRlRW50cnlNb2RlbHMoKTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7CQorCQlyZXR1cm4gc2l0ZS5nZXRUeXBlKCk7CisJfQorCisJcHVibGljIHZvaWQgbWFya1JlYWRPbmx5KCkgewkKKwkJc2l0ZS5tYXJrUmVhZE9ubHkoKTsKKwl9CisKKwlwdWJsaWMgdm9pZCByZW1vdmVBcmNoaXZlUmVmZXJlbmNlTW9kZWwoQXJjaGl2ZVJlZmVyZW5jZU1vZGVsIGFyY2hpdmVSZWZlcmVuY2UpIHsJCisJCXNpdGUucmVtb3ZlQXJjaGl2ZVJlZmVyZW5jZU1vZGVsKGFyY2hpdmVSZWZlcmVuY2UpOworCX0KKworCXB1YmxpYyB2b2lkIHJlbW92ZUNhdGVnb3J5TW9kZWwoQ2F0ZWdvcnlNb2RlbCBjYXRlZ29yeSkgewkKKwkJc2l0ZS5yZW1vdmVDYXRlZ29yeU1vZGVsKGNhdGVnb3J5KTsKKwl9CisKKwlwdWJsaWMgdm9pZCByZW1vdmVGZWF0dXJlUmVmZXJlbmNlTW9kZWwoRmVhdHVyZVJlZmVyZW5jZU1vZGVsIGZlYXR1cmVSZWZlcmVuY2UpIHsJCisJCXNpdGUucmVtb3ZlRmVhdHVyZVJlZmVyZW5jZU1vZGVsKGZlYXR1cmVSZWZlcmVuY2UpOworCX0KKworCXB1YmxpYyB2b2lkIHJlbW92ZU1pcnJvcihVUkxFbnRyeU1vZGVsIG1pcnJvcikgewkJCisJCXNpdGUucmVtb3ZlTWlycm9yKG1pcnJvcik7CisJfQorCisJcHVibGljIHZvaWQgcmVzb2x2ZShVUkwgYmFzZSwgVVJMIGJ1bmRsZVVSTCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7CQkKKwkJc2l0ZS5yZXNvbHZlKGJhc2UsIGJ1bmRsZVVSTCk7CisJfQorCisJcHVibGljIHZvaWQgc2V0QXJjaGl2ZVJlZmVyZW5jZU1vZGVscyhBcmNoaXZlUmVmZXJlbmNlTW9kZWxbXSBhcmNoaXZlUmVmZXJlbmNlcykgewkJCisJCXNpdGUuc2V0QXJjaGl2ZVJlZmVyZW5jZU1vZGVscyhhcmNoaXZlUmVmZXJlbmNlcyk7CisJfQorCisJcHVibGljIHZvaWQgc2V0Q2F0ZWdvcnlNb2RlbHMoQ2F0ZWdvcnlNb2RlbFtdIGNhdGVnb3JpZXMpIHsJCQorCQlzaXRlLnNldENhdGVnb3J5TW9kZWxzKGNhdGVnb3JpZXMpOworCX0KKworCXB1YmxpYyB2b2lkIHNldENvbmZpZ3VyZWRTaXRlTW9kZWwoQ29uZmlndXJlZFNpdGVNb2RlbCBjb25maWd1cmVkU2l0ZU1vZGVsKSB7CQkKKwkJc2l0ZS5zZXRDb25maWd1cmVkU2l0ZU1vZGVsKGNvbmZpZ3VyZWRTaXRlTW9kZWwpOworCX0KKworCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uTW9kZWwoVVJMRW50cnlNb2RlbCBkZXNjcmlwdGlvbikgewkJCisJCXNpdGUuc2V0RGVzY3JpcHRpb25Nb2RlbChkZXNjcmlwdGlvbik7CisJfQorCisJcHVibGljIHZvaWQgc2V0RmVhdHVyZVJlZmVyZW5jZU1vZGVscyhGZWF0dXJlUmVmZXJlbmNlTW9kZWxbXSBmZWF0dXJlUmVmZXJlbmNlcykgewkJCisJCXNpdGUuc2V0RmVhdHVyZVJlZmVyZW5jZU1vZGVscyhmZWF0dXJlUmVmZXJlbmNlcyk7CisJfQorCisJcHVibGljIHZvaWQgc2V0TG9jYXRpb25VUkxTdHJpbmcoU3RyaW5nIGxvY2F0aW9uVVJMU3RyaW5nKSB7CQkKKwkJc2l0ZS5zZXRMb2NhdGlvblVSTFN0cmluZyhsb2NhdGlvblVSTFN0cmluZyk7CisJfQorCisJcHVibGljIHZvaWQgc2V0TWlycm9yU2l0ZUVudHJ5TW9kZWxzKFVSTEVudHJ5TW9kZWxbXSBtaXJyb3JzKSB7CQkKKwkJc2l0ZS5zZXRNaXJyb3JTaXRlRW50cnlNb2RlbHMobWlycm9ycyk7CisJfQorCisJcHVibGljIHZvaWQgc2V0TWlycm9yc1VSTFN0cmluZyhTdHJpbmcgbWlycm9yc1VSTCkgewkJCisJCXNpdGUuc2V0TWlycm9yc1VSTFN0cmluZyhtaXJyb3JzVVJMKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKSB7CQkKKwkJc2l0ZS5zZXRUeXBlKHR5cGUpOworCX0KKyovCit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL0JhdGNoRmVhdHVyZU9wZXJhdGlvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9CYXRjaEZlYXR1cmVPcGVyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjg0MzZmCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9CYXRjaEZlYXR1cmVPcGVyYXRpb24uamF2YQpAQCAtMCwwICsxLDc2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm9wZXJhdGlvbnM7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uSUNvbmZpZ3VyZWRTaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLklPcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuSU9wZXJhdGlvbkxpc3RlbmVyOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmF0Y2hGZWF0dXJlT3BlcmF0aW9uIGV4dGVuZHMgT3BlcmF0aW9uIGltcGxlbWVudHMgSUJhdGNoRmVhdHVyZU9wZXJhdGlvbiB7CisKKwlwcml2YXRlIElGZWF0dXJlW10gZmVhdHVyZXM7CisJcHJpdmF0ZSBJQ29uZmlndXJlZFNpdGVbXSB0YXJnZXRTaXRlczsKKwkKKwkKKwlwdWJsaWMgQmF0Y2hGZWF0dXJlT3BlcmF0aW9uKElDb25maWd1cmVkU2l0ZVtdIHRhcmdldFNpdGVzLCBJRmVhdHVyZVtdIGZlYXR1cmVzKSB7CisJCXN1cGVyKCk7CisJCXRoaXMuZmVhdHVyZXMgPSBmZWF0dXJlczsKKwkJdGhpcy50YXJnZXRTaXRlcyA9IHRhcmdldFNpdGVzOworCX0KKwkKKwlwdWJsaWMgSUZlYXR1cmVbXSBnZXRGZWF0dXJlcygpIHsKKwkJcmV0dXJuIGZlYXR1cmVzOworCX0KKworCXB1YmxpYyBJQ29uZmlndXJlZFNpdGVbXSBnZXRUYXJnZXRTaXRlcygpIHsKKwkJcmV0dXJuIHRhcmdldFNpdGVzOworCX0KKworCXB1YmxpYyB2b2lkIHNldFRhcmdldFNpdGVzKElDb25maWd1cmVkU2l0ZVtdIHRhcmdldFNpdGVzKSB7CisJCXRoaXMudGFyZ2V0U2l0ZXMgPSB0YXJnZXRTaXRlczsKKwkJCisJfQorCQorCXB1YmxpYyBib29sZWFuIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBwbSwgSU9wZXJhdGlvbkxpc3RlbmVyIGxpc3RlbmVyKQorCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7CisKKwkJaWYgKGdldEZlYXR1cmVzKCkgPT0gbnVsbCB8fCBnZXRGZWF0dXJlcygpLmxlbmd0aCA9PSAwKQorCQkJcmV0dXJuIGZhbHNlOworCQlJT3BlcmF0aW9uW10gb3BlcmF0aW9ucyA9IG5ldyBJT3BlcmF0aW9uW2dldEZlYXR1cmVzKCkubGVuZ3RoXTsKKwkJCisJCWZvciAoIGludCBpID0gMDsgaSA8IGdldEZlYXR1cmVzKCkubGVuZ3RoOyBpICsrKSB7IAorCQkJb3BlcmF0aW9uc1tpXSA9IGNyZWF0ZU9wZXJhdGlvbihnZXRUYXJnZXRTaXRlcygpW2ldLCBnZXRGZWF0dXJlcygpW2ldKTsKKwkJfQorCQkKKwkJYm9vbGVhbiByZXN0YXJ0TmVlZGVkID0gZmFsc2U7CisKKwkJZm9yICggaW50IGkgPSAwOyBpIDwgb3BlcmF0aW9ucy5sZW5ndGg7IGkgKyspIHsgCisJCQl0cnkgeworCQkJCWJvb2xlYW4gc3RhdHVzID0gb3BlcmF0aW9uc1tpXS5leGVjdXRlKHBtLCBsaXN0ZW5lcik7CisJCQkJaWYgKHN0YXR1cykKKwkJCQkJcmVzdGFydE5lZWRlZCA9IHRydWU7IAorCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKwkJCQl0LnByaW50U3RhY2tUcmFjZSgpOworCQkJfQorCQl9CQorCisJCXJldHVybiByZXN0YXJ0TmVlZGVkOworCisJfQorCisJcHJvdGVjdGVkIGFic3RyYWN0IElPcGVyYXRpb24gY3JlYXRlT3BlcmF0aW9uKElDb25maWd1cmVkU2l0ZSB0YXJnZXRTaXRlLCBJRmVhdHVyZSBmZWF0dXJlKTsKKworfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9CYXRjaEluc3RhbGxPcGVyYXRpb24uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvQmF0Y2hJbnN0YWxsT3BlcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUyNGQyZAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvQmF0Y2hJbnN0YWxsT3BlcmF0aW9uLmphdmEKQEAgLTAsMCArMSwxMjAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwub3BlcmF0aW9uczsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy4qOworCitwdWJsaWMgY2xhc3MgQmF0Y2hJbnN0YWxsT3BlcmF0aW9uCisJZXh0ZW5kcyBPcGVyYXRpb24KKwlpbXBsZW1lbnRzIElCYXRjaE9wZXJhdGlvbiB7CisJCQorCXByb3RlY3RlZCBJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb25bXSBvcGVyYXRpb25zOworCisJcHVibGljIEJhdGNoSW5zdGFsbE9wZXJhdGlvbihJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb25bXSBvcGVyYXRpb25zKSB7CisJCXN1cGVyKCk7CisJCXRoaXMub3BlcmF0aW9ucyA9IG9wZXJhdGlvbnM7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuSU11bHRpT3BlcmF0aW9uI2dldE9wZXJhdGlvbnMoKQorCSAqLworCXB1YmxpYyBJRmVhdHVyZU9wZXJhdGlvbltdIGdldE9wZXJhdGlvbnMoKSB7CisJCXJldHVybiBvcGVyYXRpb25zOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLklPcGVyYXRpb24jZXhlY3V0ZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSU9wZXJhdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7CisJCWludCBpbnN0YWxsQ291bnQgPSAwOworCisJCWlmIChvcGVyYXRpb25zID09IG51bGwgfHwgb3BlcmF0aW9ucy5sZW5ndGggPT0gMCkKKwkJCXJldHVybiBmYWxzZTsKKwkJCQkJCisJCUlTdGF0dXMgc3RhdHVzID0gT3BlcmF0aW9uc01hbmFnZXIuZ2V0VmFsaWRhdG9yKCkudmFsaWRhdGVQZW5kaW5nQ2hhbmdlcyhvcGVyYXRpb25zKTsKKwkJaWYgKHN0YXR1cyAhPSBudWxsICYmIHN0YXR1cy5nZXRDb2RlKCkgPT0gSVN0YXR1cy5FUlJPUikgeworCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc3RhdHVzKTsKKwkJfQorCQkKKy8vCQkvLyBDaGVjayBmb3IgZHVwbGljYXRpb24gY29uZmxpY3RzCisvLwkJQXJyYXlMaXN0IGNvbmZsaWN0cyA9CisvLwkJCUR1cGxpY2F0ZUNvbmZsaWN0c1ZhbGlkYXRvci5jb21wdXRlRHVwbGljYXRlQ29uZmxpY3RzKAorLy8JCQkJb3BlcmF0aW9ucywKKy8vCQkJCWNvbmZpZyk7CisvLwkJaWYgKGNvbmZsaWN0cyAhPSBudWxsKSB7CisvLwkJCWJvb2xlYW4gY29udGludWVQcm9jZXNzaW5nID0gZmFsc2U7CisvLwkJCWlmIChsaXN0ZW5lciAhPSBudWxsKQorLy8JCQkJY29udGludWVQcm9jZXNzaW5nID0gbGlzdGVuZXIuYmVmb3JlRXhlY3V0ZSh0aGlzLCBjb25mbGljdHMpOworLy8JCQlpZiAoIWNvbnRpbnVlUHJvY2Vzc2luZykKKy8vCQkJCXJldHVybiBmYWxzZTsKKy8vCQl9CisJCQorCQlPcGVyYXRpb25zTWFuYWdlci5zZXRJblByb2dyZXNzKHRydWUpOworCQlpZiAobW9uaXRvciA9PSBudWxsKSAKKwkJCW1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOworCQkJCisJCXRyeSB7CQkJCisJCQlpZiAobGlzdGVuZXIgIT0gbnVsbCkKKwkJCQlsaXN0ZW5lci5iZWZvcmVFeGVjdXRlKHRoaXMsIG51bGwpOworCQkJCisJCQltb25pdG9yLmJlZ2luVGFzaygKKwkJCQlNZXNzYWdlcy5PcGVyYXRpb25zTWFuYWdlcl9pbnN0YWxsaW5nLAorCQkJCW9wZXJhdGlvbnMubGVuZ3RoKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgb3BlcmF0aW9ucy5sZW5ndGg7IGkrKykgeworCQkJCVN1YlByb2dyZXNzTW9uaXRvciBzdWJNb25pdG9yID0KKwkJCQkJbmV3IFN1YlByb2dyZXNzTW9uaXRvcigKKwkJCQkJCW1vbml0b3IsCisJCQkJCQkxLAorCQkJCQkJU3ViUHJvZ3Jlc3NNb25pdG9yLlBSRVBFTkRfTUFJTl9MQUJFTF9UT19TVUJUQVNLKTsKKworCQkJCW9wZXJhdGlvbnNbaV0uZXhlY3V0ZShzdWJNb25pdG9yLCBsaXN0ZW5lcik7CisJCQkJT3BlcmF0aW9uc01hbmFnZXIuYWRkUGVuZGluZ09wZXJhdGlvbihvcGVyYXRpb25zW2ldKTsKKworCQkJCW9wZXJhdGlvbnNbaV0ubWFya1Byb2Nlc3NlZCgpOworCQkJCWlmIChsaXN0ZW5lciAhPSBudWxsKQorCQkJCQlsaXN0ZW5lci5hZnRlckV4ZWN1dGUob3BlcmF0aW9uc1tpXSwgbnVsbCk7CisKKwkJCQkvL21vbml0b3Iud29ya2VkKDEpOworCQkJCWluc3RhbGxDb3VudCsrOworCQkJfQorCQkJcmV0dXJuIFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpLnNhdmUoKTsKKyAgICAgICAgfSBjYXRjaCAoSW5zdGFsbEFib3J0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gc2F2ZXMgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbgorICAgICAgICAgICAgaWYgKGluc3RhbGxDb3VudCA+IDApIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKS5zYXZlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgeworICAgICAgICAgICAgICAgICAgICBVcGRhdGVVdGlscy5sb2dFeGNlcHRpb24oY2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGUpOworICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIHNhdmVzIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICAgIGlmIChpbnN0YWxsQ291bnQgPiAwKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkuc2F2ZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgVXBkYXRlVXRpbHMubG9nRXhjZXB0aW9uKGNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihlKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKwkJCU9wZXJhdGlvbnNNYW5hZ2VyLnNldEluUHJvZ3Jlc3MoZmFsc2UpOworCQkJbW9uaXRvci5kb25lKCk7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL0NvbmZpZ09wZXJhdGlvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9Db25maWdPcGVyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmIxOGMwCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9Db25maWdPcGVyYXRpb24uamF2YQpAQCAtMCwwICsxLDc4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm9wZXJhdGlvbnM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuKjsKKworLyoqCisgKiBDb25maWd1cmUgYSBmZWF0dXJlLgorICogQ29uZmlnT3BlcmF0aW9uCisgKi8KK3B1YmxpYyBjbGFzcyBDb25maWdPcGVyYXRpb24KK2V4dGVuZHMgRmVhdHVyZU9wZXJhdGlvbgoraW1wbGVtZW50cyBJQ29uZmlnRmVhdHVyZU9wZXJhdGlvbiB7CisKKwlwdWJsaWMgQ29uZmlnT3BlcmF0aW9uKAorCQkJSUNvbmZpZ3VyZWRTaXRlIHNpdGUsCisJCQlJRmVhdHVyZSBmZWF0dXJlKSB7CisJCXN1cGVyKHNpdGUsIGZlYXR1cmUpOworCX0KKworCXB1YmxpYyBib29sZWFuIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBwbSwgSU9wZXJhdGlvbkxpc3RlbmVyIGxpc3RlbmVyKQorCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKKworCQlJU3RhdHVzIHN0YXR1cyA9CisJCQlPcGVyYXRpb25zTWFuYWdlci5nZXRWYWxpZGF0b3IoKS52YWxpZGF0ZVBlbmRpbmdDb25maWcoZmVhdHVyZSk7CisJCWlmIChzdGF0dXMgIT0gbnVsbCAmJiBzdGF0dXMuZ2V0Q29kZSgpID09IElTdGF0dXMuRVJST1IpIHsKKwkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1cyk7CisJCX0KKwkJdHJ5IHsKKwkJCXRhcmdldFNpdGUuY29uZmlndXJlKGZlYXR1cmUpOworCQkJLy9lbnN1cmVVbmlxdWUoKTsKKworCQkJLy8gUmVzdGFydCBub3QgbmVlZGVkCisJCQlib29sZWFuIHJlc3RhcnROZWVkZWQgPSBmYWxzZTsKKworCQkJLy8gQ2hlY2sgaWYgdGhpcyBvcGVyYXRpb24gaXMgY2FuY2VsbGluZyBvbmUgdGhhdCdzIGFscmVhZHkgcGVuZGluZworCQkJSU9wZXJhdGlvbiBwZW5kaW5nT3BlcmF0aW9uID0KKwkJCQlPcGVyYXRpb25zTWFuYWdlci5maW5kUGVuZGluZ09wZXJhdGlvbihmZWF0dXJlKTsKKworCQkJaWYgKHBlbmRpbmdPcGVyYXRpb24gaW5zdGFuY2VvZiBJVW5jb25maWdGZWF0dXJlT3BlcmF0aW9uKSB7CisJCQkJLy8gbm8gbmVlZCB0byBkbyBlaXRoZXIgcGVuZGluZyBjaGFuZ2UKKwkJCQlPcGVyYXRpb25zTWFuYWdlci5yZW1vdmVQZW5kaW5nT3BlcmF0aW9uKHBlbmRpbmdPcGVyYXRpb24pOworCQkJfSBlbHNlIHsKKwkJCQlPcGVyYXRpb25zTWFuYWdlci5hZGRQZW5kaW5nT3BlcmF0aW9uKHRoaXMpOworCQkJfQorCisJCQltYXJrUHJvY2Vzc2VkKCk7CisJCQlpZiAobGlzdGVuZXIgIT0gbnVsbCkKKwkJCQlsaXN0ZW5lci5hZnRlckV4ZWN1dGUodGhpcywgbnVsbCk7CisKKwkJCXJlc3RhcnROZWVkZWQgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKS5zYXZlKCkgJiYgcmVzdGFydE5lZWRlZDsKKworCQkJLy8gbm90aWZ5IHRoZSBtb2RlbAorCQkJT3BlcmF0aW9uc01hbmFnZXIuZmlyZU9iamVjdENoYW5nZWQoZmVhdHVyZSwgbnVsbCk7CisKKwkJCXJldHVybiByZXN0YXJ0TmVlZGVkOworCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCXVuZG8oKTsKKwkJCVVwZGF0ZVV0aWxzLmxvZ0V4Y2VwdGlvbihlKTsKKwkJCXRocm93IGU7CisJCX0KKwl9CisKKwlwdWJsaWMgdm9pZCB1bmRvKCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQl0YXJnZXRTaXRlLnVuY29uZmlndXJlKGZlYXR1cmUpOworCX0KK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvQ29uZmlndXJlRmVhdHVyZXNPcGVyYXRpb24uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvQ29uZmlndXJlRmVhdHVyZXNPcGVyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjQ3OTczCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9Db25maWd1cmVGZWF0dXJlc09wZXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwub3BlcmF0aW9uczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLklDb25maWd1cmVkU2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy5JT3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLk9wZXJhdGlvbnNNYW5hZ2VyOworCitwdWJsaWMgY2xhc3MgQ29uZmlndXJlRmVhdHVyZXNPcGVyYXRpb24gZXh0ZW5kcyBCYXRjaEZlYXR1cmVPcGVyYXRpb24gaW1wbGVtZW50cworCQlJQ29uZmlndXJlRmVhdHVyZXNPcGVyYXRpb24geworCisJcHVibGljIENvbmZpZ3VyZUZlYXR1cmVzT3BlcmF0aW9uKElDb25maWd1cmVkU2l0ZVtdIHRhcmdldFNpdGVzLAorCQkJSUZlYXR1cmVbXSBmZWF0dXJlcykgeworCQlzdXBlcih0YXJnZXRTaXRlcywgZmVhdHVyZXMpOworCX0KKworCQorCXByb3RlY3RlZCBJT3BlcmF0aW9uIGNyZWF0ZU9wZXJhdGlvbihJQ29uZmlndXJlZFNpdGUgdGFyZ2V0U2l0ZSwgSUZlYXR1cmUgZmVhdHVyZSkgeworCQlyZXR1cm4gT3BlcmF0aW9uc01hbmFnZXIuZ2V0T3BlcmF0aW9uRmFjdG9yeSgpLmNyZWF0ZUNvbmZpZ09wZXJhdGlvbih0YXJnZXRTaXRlLCBmZWF0dXJlKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvRHVwbGljYXRlQ29uZmxpY3RzVmFsaWRhdG9yLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL0R1cGxpY2F0ZUNvbmZsaWN0c1ZhbGlkYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkYTQ5NWUKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL0R1cGxpY2F0ZUNvbmZsaWN0c1ZhbGlkYXRvci5qYXZhCkBAIC0wLDAgKzEsMjI1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm9wZXJhdGlvbnM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi5JQ29uZmlndXJlZFNpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uSUluc3RhbGxDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuVmVyc2lvbmVkSWRlbnRpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5NZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy5JSW5zdGFsbEZlYXR1cmVPcGVyYXRpb247CisKKworLyoqCisgKiAKKyAqLworcHVibGljIGNsYXNzIER1cGxpY2F0ZUNvbmZsaWN0c1ZhbGlkYXRvciAgeworCisJcHVibGljIHN0YXRpYyBjbGFzcyBJZEVudHJ5IHsKKwkJSUNvbmZpZ3VyZWRTaXRlIGNzaXRlOworCQlJRmVhdHVyZSBmZWF0dXJlOworCisJCXB1YmxpYyBJZEVudHJ5KElGZWF0dXJlIGZlYXR1cmUsIElDb25maWd1cmVkU2l0ZSBjc2l0ZSkgeworCQkJdGhpcy5mZWF0dXJlID0gZmVhdHVyZTsKKwkJCXRoaXMuY3NpdGUgPSBjc2l0ZTsKKwkJCWlmIChjc2l0ZSA9PSBudWxsKSB7CisJCQkJU3lzdGVtLm91dC5wcmludGxuKCJjc2l0ZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJfQorCQlwdWJsaWMgYm9vbGVhbiBpc0luc3RhbGxDYW5kaWRhdGUoKSB7CisJCQlyZXR1cm4gY3NpdGUgIT0gbnVsbDsKKwkJfQorCQlwdWJsaWMgSUZlYXR1cmUgZ2V0RmVhdHVyZSgpIHsKKwkJCXJldHVybiBmZWF0dXJlOworCQl9CisKKwkJcHVibGljIFN0cmluZyBnZXRJZGVudGlmaWVyKCkgeworCQkJcmV0dXJuIGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldElkZW50aWZpZXIoKTsKKwkJfQorCQlwdWJsaWMgSUNvbmZpZ3VyZWRTaXRlIGdldENvbmZpZ3VyZWRTaXRlKCkgeworCQkJaWYgKGNzaXRlICE9IG51bGwpCisJCQkJcmV0dXJuIGNzaXRlOworCQkJcmV0dXJuIGZlYXR1cmUuZ2V0U2l0ZSgpLmdldEN1cnJlbnRDb25maWd1cmVkU2l0ZSgpOworCQl9CisJCXB1YmxpYyBib29sZWFuIHNhbWVMZXZlbChJZEVudHJ5IGVudHJ5KSB7CisJCQlWZXJzaW9uZWRJZGVudGlmaWVyIHZpZCA9IGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOworCQkJVmVyc2lvbmVkSWRlbnRpZmllciBldmlkID0KKwkJCQllbnRyeS5nZXRGZWF0dXJlKCkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOworCQkJcmV0dXJuIHZpZC5lcXVhbHMoZXZpZCk7CisJCX0KKwkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJCUlDb25maWd1cmVkU2l0ZSBjb25maWdTaXRlID0gZ2V0Q29uZmlndXJlZFNpdGUoKTsKKwkJCVN0cmluZyB2ZXJzaW9uID0KKwkJCQlmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRWZXJzaW9uKCkudG9TdHJpbmcoKTsKKwkJCVN0cmluZyBsb2NhdGlvbiA9IGNvbmZpZ1NpdGUuZ2V0U2l0ZSgpLmdldFVSTCgpLmdldEZpbGUoKTsKKwkJCXJldHVybiBOTFMuYmluZChNZXNzYWdlcy5EdXBsaWNhdGVDb25mbGljdHNEaWFsb2dfY29uZmxpY3QsIChuZXcgU3RyaW5nW10geyB2ZXJzaW9uLCBsb2NhdGlvbiB9KSk7CisJCX0KKwl9CisKKwlwdWJsaWMgc3RhdGljIEFycmF5TGlzdCBjb21wdXRlRHVwbGljYXRlQ29uZmxpY3RzKAorCQlJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gam9iLAorCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnLAorCQlJQ29uZmlndXJlZFNpdGUgdGFyZ2V0U2l0ZSwKKwkJSUZlYXR1cmVSZWZlcmVuY2VbXSBvcHRpb25hbEZlYXR1cmVzKSB7CisJCUhhc2h0YWJsZSBmZWF0dXJlVGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7CisJCXRyeSB7CisJCQljb21wdXRlUHJlc2VudFN0YXRlKGZlYXR1cmVUYWJsZSwgY29uZmlnKTsKKwkJCWNvbXB1dGVOZXdGZWF0dXJlKAorCQkJCWpvYi5nZXRGZWF0dXJlKCksCisJCQkJdGFyZ2V0U2l0ZSwKKwkJCQlmZWF0dXJlVGFibGUsCisJCQkJb3B0aW9uYWxGZWF0dXJlcyk7CisJCQlyZXR1cm4gY29tcHV0ZUNvbmZsaWN0cyhmZWF0dXJlVGFibGUpOworCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJfQorCisJcHVibGljIHN0YXRpYyBBcnJheUxpc3QgY29tcHV0ZUR1cGxpY2F0ZUNvbmZsaWN0cygKKwkJSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uW10gam9icywKKwkJSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZykgeworCQlIYXNodGFibGUgZmVhdHVyZVRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOworCQljb21wdXRlUHJlc2VudFN0YXRlKGZlYXR1cmVUYWJsZSwgY29uZmlnKTsKKwkJY29tcHV0ZU5ld0ZlYXR1cmVzKGpvYnMsIGZlYXR1cmVUYWJsZSk7CisJCXJldHVybiBjb21wdXRlQ29uZmxpY3RzKGZlYXR1cmVUYWJsZSk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgQXJyYXlMaXN0IGNvbXB1dGVDb25mbGljdHMoSGFzaHRhYmxlIGZlYXR1cmVUYWJsZSkgeworCQlBcnJheUxpc3QgcmVzdWx0ID0gbnVsbDsKKwkJZm9yIChFbnVtZXJhdGlvbiBpdGVyYXRvciA9IGZlYXR1cmVUYWJsZS5lbGVtZW50cygpOworCQkJaXRlcmF0b3IuaGFzTW9yZUVsZW1lbnRzKCk7CisJCQkpIHsKKwkJCUFycmF5TGlzdCBjYW5kaWRhdGUgPSAoQXJyYXlMaXN0KSBpdGVyYXRvci5uZXh0RWxlbWVudCgpOworCQkJaWYgKGNhbmRpZGF0ZS5zaXplKCkgPT0gMSkKKwkJCQljb250aW51ZTsKKwkJCUFycmF5TGlzdCBjb25mbGljdCA9IGNoZWNrRm9yQ29uZmxpY3QoY2FuZGlkYXRlKTsKKwkJCWlmIChjb25mbGljdCAhPSBudWxsKSB7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQkJCQlyZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7CisJCQkJcmVzdWx0LmFkZChjb25mbGljdCk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBBcnJheUxpc3QgY2hlY2tGb3JDb25mbGljdChBcnJheUxpc3QgY2FuZGlkYXRlKSB7CisJCUlkRW50cnkgZmlyc3RFbnRyeSA9IG51bGw7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgY2FuZGlkYXRlLnNpemUoKTsgaSsrKSB7CisJCQlJZEVudHJ5IGVudHJ5ID0gKElkRW50cnkpIGNhbmRpZGF0ZS5nZXQoaSk7CisJCQlpZiAoZmlyc3RFbnRyeSA9PSBudWxsKQorCQkJCWZpcnN0RW50cnkgPSBlbnRyeTsKKwkJCWVsc2UgaWYgKCFlbnRyeS5zYW1lTGV2ZWwoZmlyc3RFbnRyeSkpCisJCQkJcmV0dXJuIGNhbmRpZGF0ZTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGNvbXB1dGVQcmVzZW50U3RhdGUoCisJCUhhc2h0YWJsZSB0YWJsZSwKKwkJSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZykgeworCQlJQ29uZmlndXJlZFNpdGVbXSBjc2l0ZXMgPSBjb25maWcuZ2V0Q29uZmlndXJlZFNpdGVzKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgY3NpdGVzLmxlbmd0aDsgaSsrKSB7CisJCQlJQ29uZmlndXJlZFNpdGUgY3NpdGUgPSBjc2l0ZXNbaV07CisJCQlJRmVhdHVyZVJlZmVyZW5jZVtdIHJlZnMgPSBjc2l0ZS5nZXRDb25maWd1cmVkRmVhdHVyZXMoKTsKKwkJCWZvciAoaW50IGogPSAwOyBqIDwgcmVmcy5sZW5ndGg7IGorKykgeworCQkJCXRyeSB7CisJCQkJCWFkZEVudHJ5KHJlZnNbal0uZ2V0RmVhdHVyZShudWxsKSwgY3NpdGUsIHRhYmxlKTsKKwkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCQkJLy8gZG9uJ3QgbGV0IG9uZSBiYWQgZmVhdHVyZSBzdG9wIHRoZSBsb29wCisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb21wdXRlTmV3RmVhdHVyZXMoCisJCUlJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbltdIGpvYnMsCisJCUhhc2h0YWJsZSBmZWF0dXJlVGFibGUpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBqb2JzLmxlbmd0aDsgaSsrKSB7CisJCQlJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gam9iID0gam9ic1tpXTsKKwkJCUlDb25maWd1cmVkU2l0ZSB0YXJnZXRTaXRlID0gam9iLmdldFRhcmdldFNpdGUoKTsKKwkJCUlGZWF0dXJlIG5ld0ZlYXR1cmUgPSBqb2IuZ2V0RmVhdHVyZSgpOworCQkJdHJ5IHsKKwkJCQljb21wdXRlTmV3RmVhdHVyZShuZXdGZWF0dXJlLCB0YXJnZXRTaXRlLCBmZWF0dXJlVGFibGUsIG51bGwpOworCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQl9CisJCX0KKwl9CisKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGNvbXB1dGVOZXdGZWF0dXJlKAorCQlJRmVhdHVyZSBmZWF0dXJlLAorCQlJQ29uZmlndXJlZFNpdGUgY3NpdGUsCisJCUhhc2h0YWJsZSB0YWJsZSwKKwkJSUZlYXR1cmVSZWZlcmVuY2VbXSBvcHRpb25hbEZlYXR1cmVzKQorCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCWFkZEVudHJ5KGZlYXR1cmUsIGNzaXRlLCB0YWJsZSk7CisJCUlJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VbXSBpcmVmcyA9CisJCQlmZWF0dXJlLmdldEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBpcmVmcy5sZW5ndGg7IGkrKykgeworCQkJSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZSBpcmVmID0gaXJlZnNbaV07CisJCQlib29sZWFuIGFkZCA9IHRydWU7CisKKwkJCWlmIChpcmVmLmlzT3B0aW9uYWwoKSAmJiBvcHRpb25hbEZlYXR1cmVzICE9IG51bGwpIHsKKwkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7CisJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBvcHRpb25hbEZlYXR1cmVzLmxlbmd0aDsgaisrKSB7CisJCQkJCUlGZWF0dXJlUmVmZXJlbmNlIGNoZWNrZWQgPSBvcHRpb25hbEZlYXR1cmVzW2pdOworCQkJCQlpZiAoY2hlY2tlZC5lcXVhbHMoaXJlZikpIHsKKwkJCQkJCWZvdW5kID0gdHJ1ZTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJCWFkZCA9IGZvdW5kOworCQkJfQorCQkJaWYgKGFkZCkKKwkJCQljb21wdXRlTmV3RmVhdHVyZSgKKwkJCQkJaXJlZi5nZXRGZWF0dXJlKG51bGwpLAorCQkJCQljc2l0ZSwKKwkJCQkJdGFibGUsCisJCQkJCW9wdGlvbmFsRmVhdHVyZXMpOworCQl9CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRFbnRyeSgKKwkJSUZlYXR1cmUgZmVhdHVyZSwKKwkJSUNvbmZpZ3VyZWRTaXRlIGNzaXRlLAorCQlIYXNodGFibGUgZmVhdHVyZVRhYmxlKSB7CisJCVN0cmluZyBpZCA9IGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldElkZW50aWZpZXIoKTsKKwkJQXJyYXlMaXN0IGVudHJpZXMgPSAoQXJyYXlMaXN0KSBmZWF0dXJlVGFibGUuZ2V0KGlkKTsKKwkJaWYgKGVudHJpZXMgPT0gbnVsbCkgeworCQkJZW50cmllcyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJCWZlYXR1cmVUYWJsZS5wdXQoaWQsIGVudHJpZXMpOworCQl9CisJCUlkRW50cnkgZW50cnkgPSBuZXcgSWRFbnRyeShmZWF0dXJlLCBjc2l0ZSk7CisJCWJvb2xlYW4gcmVwbGFjZWQgPSBmYWxzZTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLnNpemUoKTsgaSsrKSB7CisJCQlJZEVudHJ5IGV4aXN0aW5nRW50cnkgPSAoSWRFbnRyeSkgZW50cmllcy5nZXQoaSk7CisJCQlJQ29uZmlndXJlZFNpdGUgZXhpc3RpbmdTaXRlID0gZXhpc3RpbmdFbnRyeS5nZXRDb25maWd1cmVkU2l0ZSgpOworCQkJaWYgKGV4aXN0aW5nU2l0ZS5lcXVhbHMoZW50cnkuZ2V0Q29uZmlndXJlZFNpdGUoKSkpIHsKKwkJCQkvLyBzYW1lIHNpdGUgLSByZXBsYWNlIGl0IGlmIG5vdCBuZXcKKwkJCQlpZiAoZW50cnkuaXNJbnN0YWxsQ2FuZGlkYXRlKCkpIHsKKwkJCQkJZW50cmllcy5zZXQoaSwgZW50cnkpOworCQkJCQllbnRyaWVzLnJlbW92ZShleGlzdGluZ0VudHJ5KTsKKwkJCQl9CisJCQkJcmVwbGFjZWQgPSB0cnVlOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmICghcmVwbGFjZWQpCisJCQllbnRyaWVzLmFkZChlbnRyeSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9GZWF0dXJlSGllcmFyY2h5RWxlbWVudC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9GZWF0dXJlSGllcmFyY2h5RWxlbWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlNzFkMzkKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL0ZlYXR1cmVIaWVyYXJjaHlFbGVtZW50LmphdmEKQEAgLTAsMCArMSw0NDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwub3BlcmF0aW9uczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBjb25zdHJ1Y3QgYSBqb2ludCBmZWF0dXJlIGhpZWFyY2h5LgorICogT2xkIGZlYXR1cmUgcmVmZXJlbmNlIHJlcHJlc2VudHMgZmVhdHVyZSB0aGF0IGlzCisgKiBmb3VuZCBvbiBpbiB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLiBOZXcgZmVhdHVyZQorICogcmVmZXJlbmNlIGlzIGZvdW5kIGluIHRoZSBmZWF0dXJlIHRoYXQgaXMgYW4gaW5zdGFsbC91cGRhdGUKKyAqIGNhbmRpZGF0ZS4gVGhlIGVsZW1lbnQgaXMgdXNlZCB0byBqb2luIG5vZGVzIG9mIHRoZQorICogaGllYXJjaHkgZm9ybWVkIGJ5IGluY2x1ZGluZyBmZWF0dXJlcyBzbyB0aGF0CisgKiBlYWNoIG5vZGUgaW4gdGhlIGhpZWFyY2h5IGNvbnRhaW5zIHJlZmVyZW5jZXMgdG8gdGhlCisgKiBvbGQgYW5kIHRoZSBuZXcgZmVhdHVyZS4gT2xkIGFuZCBuZXcgZmVhdHVyZXMgaGF2ZQorICogdGhlIHNhbWUgSURzIGJ1dCBkaWZmZXJlbnQgdmVyc2lvbnMsIGV4Y2VwdCBpbiAKKyAqIHRoZSBjYXNlIG9mIG9wdGlvbmFsIGZlYXR1cmVzLCB3aGVyZSB0aGUgdHJlZSBtYXkKKyAqIGJlIGNvbnN0cnVjdGVkIHRvIGJyaW5nIGluIGFuIG9wdGlvbmFsIGZlYXR1cmUKKyAqIHRoYXQgd2FzIG5vdCBpbnN0YWxsZWQgaW5pdGlhbGx5LiBJbiB0aGF0IGNhc2UsCisgKiBzb21lIG5vZGVzIG1heSBoYXZlIG9sZCBhbiBuZXcgcmVmZXJlbmNlcyB3aXRoIHRoZQorICogc2FtZSBJRCBhbmQgdmVyc2lvbi4gCisgKiA8cD4KKyAqIE9sZCBmZWF0dXJlIHJlZmVyZW5jZSBtYXkgYmUgbnVsbC4gVGhhdCBtZWFucworICogdGhhdCB0aGUgb2xkZXIgZmVhdHVyZSB3aXRoIHRoZSBzYW1lIElEIGJ1dCBsb3dlcgorICogdmVyc2lvbiB3YXMgbm90IGZvdW5kIGluIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCisgKi8KK3B1YmxpYyBjbGFzcyBGZWF0dXJlSGllcmFyY2h5RWxlbWVudCB7CisKKwlwcml2YXRlIE9iamVjdCByb290OworCXByaXZhdGUgQXJyYXlMaXN0IGNoaWxkcmVuOworCXByaXZhdGUgSUZlYXR1cmVSZWZlcmVuY2Ugb2xkRmVhdHVyZVJlZjsKKwlwcml2YXRlIElGZWF0dXJlUmVmZXJlbmNlIG5ld0ZlYXR1cmVSZWY7CisJcHJpdmF0ZSBib29sZWFuIGNoZWNrZWQ7CisJcHJpdmF0ZSBib29sZWFuIG9wdGlvbmFsQ2hpbGRyZW47CisJcHJpdmF0ZSBib29sZWFuIG5hdGl2ZVVwZ3JhZGUgPSBmYWxzZTsKKworCXB1YmxpYyBGZWF0dXJlSGllcmFyY2h5RWxlbWVudCgKKwkJSUZlYXR1cmVSZWZlcmVuY2Ugb2xkUmVmLAorCQlJRmVhdHVyZVJlZmVyZW5jZSBuZXdSZWYpIHsKKwkJb2xkRmVhdHVyZVJlZiA9IG9sZFJlZjsKKwkJbmV3RmVhdHVyZVJlZiA9IG5ld1JlZjsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRSb290KE9iamVjdCByb290KSB7CisJCXRoaXMucm9vdCA9IHJvb3Q7CisJfQorCisJcHVibGljIE9iamVjdCBnZXRSb290KCkgeworCQlyZXR1cm4gcm9vdDsKKwl9CisKKwkvKgorCSAqIFJldHVybiB0cnVlIGlmIGVsZW1lbnQgY2FuIGJlIGNoZWNrZWQsIGZhbHNlIG90aGVyd2lzZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0VkaXRhYmxlKCkgeworCQkvLyBjYW5ub3QgdW5jaGVjayBub24tb3B0aW9uYWwgZmVhdHVyZXMKKwkJaWYgKGlzT3B0aW9uYWwoKSA9PSBmYWxzZSkKKwkJCXJldHVybiBmYWxzZTsKKwkJLy8gY2Fubm90IHVuY2hlY2sgb3B0aW9uYWwgZmVhdHVyZSB0aGF0CisJCS8vIGhhcyBhbHJlYWR5IGJlZW4gaW5zdGFsbGVkCisJCWlmIChvbGRGZWF0dXJlUmVmICE9IG51bGwpCisJCQlyZXR1cm4gZmFsc2U7CisJCXJldHVybiB0cnVlOworCX0KKworCS8qKgorCSAqIEEgaGlyZWFyY2h5IG5vZGUgcmVwcmVzZW50cyBhICdmYWxzZSB1cGRhdGUnIGlmCisJICogYm90aCBvbGQgYW5kIG5ldyByZWZlcmVuY2VzIGV4aXN0IGFuZCBib3RoCisJICogcG9pbnQgdG8gdGhlIGZlYXR1cmUgd2l0aCB0aGUgc2FtZSBJRCBhbmQgdmVyc2lvbi4KKwkgKiBUaGVzZSBub2RlcyB3aWxsIG5vdCBhbnkgYnl0ZXMgdG8gYmUgZG93bmxvYWRlZCAtIAorCSAqIHRoZXkgc2ltcGx5IGV4aXN0IHRvIGFsbG93IHRoZSBoaXJhcmNoeSB0bworCSAqIHJlYWNoIHRoZSBvcHRpb25hbCBjaGlsZHJlbiB0aGF0IGFyZSBtaXNzaW5nCisJICogYW5kIHdpbGwgYmUgaW5zdGFsbGVkLgorCSAqLworCisJcHVibGljIGJvb2xlYW4gaXNGYWxzZVVwZGF0ZSgpIHsKKwkJaWYgKG9sZEZlYXR1cmVSZWYgIT0gbnVsbCAmJiBuZXdGZWF0dXJlUmVmICE9IG51bGwpIHsKKwkJCXRyeSB7CisJCQkJcmV0dXJuIG9sZEZlYXR1cmVSZWYuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmVxdWFscygKKwkJCQkJbmV3RmVhdHVyZVJlZi5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkpOworCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQl9CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgZmVhdHVyZSBpcyBpbmNsdWRlZCBhcyBvcHRpb25hbC4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc09wdGlvbmFsKCkgeworCQlyZXR1cm4gbmV3RmVhdHVyZVJlZiBpbnN0YW5jZW9mIElJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UKKwkJCSYmICgoSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZSkgbmV3RmVhdHVyZVJlZikuaXNPcHRpb25hbCgpOworCX0KKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBvcHRpb25hbCBmZWF0dXJlIGlzIHNlbGVjdGVkCisJICogZm9yIGluc3RhbGxhdGlvbi4gTm9uLW9wdGlvbmFsIGZlYXR1cmVzIG9yIG5vbi1lZGl0YWJsZQorCSAqIGZlYXR1cmVzIGFyZSBhbHdheXMgY2hlY2tlZC4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0NoZWNrZWQoKSB7CisJCXJldHVybiBjaGVja2VkOworCX0KKworCXZvaWQgc2V0TmF0aXZlVXBncmFkZShib29sZWFuIG5hdGl2ZVVwZ3JhZGUpIHsKKwkJdGhpcy5uYXRpdmVVcGdyYWRlID0gbmF0aXZlVXBncmFkZTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBvcHRpb25hbCBmZWF0dXJlIHNob3VsZAorCSAqIGJlIGVuYWJsZWQgd2hlbiBpbnN0YWxsZWQuIEJ5IGRlZmF1bHQsIGFsbAorCSAqIGZlYXR1cmVzIGluIHRoZSBoaWVhcmNoeSBzaG91bGQgYmUgZW5hYmxlZC4KKwkgKiBUaGUgZXhjZXB0aW9uIGlzIGZvciBvcHRpb25hbCBmZWF0dXJlcyB0aGF0CisJICogYXJlIHVwZGF0ZWQgdG8gYSBuZXcgdmVyc2lvbiBpbiBjYXNlIHdoZXJlCisJICogdGhlIG9sZGVyIHZlcnNpb24gb2YgdGhlIG9wdGlvbmFsIGZlYXR1cmUKKwkgKiBpcyBkaXNhYmxlZCBpbiB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbi4gCisJICogSW4gdGhpcyBjYXNlLCB0aGUgZmVhdHVyZSBpcworCSAqIHVwZGF0ZWQgYW5kIGRpc2FibGVkIGluIG9yZGVyIHRvIG1haW50YWluCisJICogaXRzIHN0YXRlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZChJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnKSB7CisJCWlmIChuYXRpdmVVcGdyYWRlKQorCQkJcmV0dXJuIHRydWU7CisJCWlmIChpc09wdGlvbmFsKCkgJiYgb2xkRmVhdHVyZVJlZiAhPSBudWxsKSB7CisJCQl0cnkgeworCQkJCUlGZWF0dXJlIG9sZEZlYXR1cmUgPSBvbGRGZWF0dXJlUmVmLmdldEZlYXR1cmUobnVsbCk7CisJCQkJSUNvbmZpZ3VyZWRTaXRlIGNzaXRlID0KKwkJCQkJVXBkYXRlVXRpbHMuZ2V0Q29uZmlnU2l0ZShvbGRGZWF0dXJlLCBjb25maWcpOworCQkJCXJldHVybiBjc2l0ZS5pc0NvbmZpZ3VyZWQob2xkRmVhdHVyZSk7CisJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCX0KKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlwdWJsaWMgSUZlYXR1cmUgZ2V0RmVhdHVyZSgpIHsKKwkJdHJ5IHsKKwkJCUlGZWF0dXJlIGZlYXR1cmUgPSBuZXdGZWF0dXJlUmVmLmdldEZlYXR1cmUobnVsbCk7CisJCQlyZXR1cm4gZmVhdHVyZTsKKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCX0KKworCS8qKgorCSAqIFNlbGVjdHMgYW4gZWRpdGFibGUgZmVhdHVyZSBmb3IgaW5zdGFsbGF0aW9uLgorCSAqLworCXB1YmxpYyB2b2lkIHNldENoZWNrZWQoYm9vbGVhbiBjaGVja2VkKSB7CisJCXRoaXMuY2hlY2tlZCA9IGNoZWNrZWQ7CisJfQorCS8qKgorCSAqIFJldHVybnMgbGFiZWwgZm9yIFVJIHByZXNlbnRhdGlvbi4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgeworCQl0cnkgeworCQkJcmV0dXJuIGdldEZlYXR1cmVMYWJlbChuZXdGZWF0dXJlUmVmKTsKKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQlpZiAobmV3RmVhdHVyZVJlZiBpbnN0YW5jZW9mIElJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UpIHsKKwkJCQlTdHJpbmcgaW5hbWUgPQorCQkJCQkoKElJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UpIG5ld0ZlYXR1cmVSZWYpLmdldE5hbWUoKTsKKwkJCQlpZiAoaW5hbWUgIT0gbnVsbCkKKwkJCQkJcmV0dXJuIGluYW1lOworCQkJfQorCQkJdHJ5IHsKKwkJCQlWZXJzaW9uZWRJZGVudGlmaWVyIHZpZCA9CisJCQkJCW5ld0ZlYXR1cmVSZWYuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOworCQkJCXJldHVybiB2aWQudG9TdHJpbmcoKTsKKwkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZTIpIHsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisJLyoqCisJICogQ29tcHV0ZXMgbGFiZWwgZnJvbSB0aGUgZmVhdHVyZS4KKwkgKi8KKwlwcml2YXRlIFN0cmluZyBnZXRGZWF0dXJlTGFiZWwoSUZlYXR1cmVSZWZlcmVuY2UgZmVhdHVyZVJlZikKKwkJdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlJRmVhdHVyZSBmZWF0dXJlID0gZmVhdHVyZVJlZi5nZXRGZWF0dXJlKG51bGwpOworCQlyZXR1cm4gZmVhdHVyZS5nZXRMYWJlbCgpCisJCQkrICIgIiAvLyROT04tTkxTLTEkCisJCQkrIGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldFZlcnNpb24oKS50b1N0cmluZygpOworCX0KKwkvKioKKwkgKiBDb21wdXRlcyBjaGlsZHJlbiBieSBsaW5raW5nIG1hdGNoaW5nIGZlYXR1cmVzIGZyb20gdGhlCisJICogb2xkIGZlYXR1cmUncyBhbmQgbmV3IGZlYXR1cmUncyBoaWVyYXJjaHkuCisJICovCisJcHVibGljIEZlYXR1cmVIaWVyYXJjaHlFbGVtZW50W10gZ2V0Q2hpbGRyZW4oCisJCWJvb2xlYW4gdXBkYXRlLAorCQlib29sZWFuIHBhdGNoLAorCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnKSB7CisJCWNvbXB1dGVDaGlsZHJlbih1cGRhdGUsIHBhdGNoLCBjb25maWcpOworCQlGZWF0dXJlSGllcmFyY2h5RWxlbWVudFtdIGFycmF5ID0KKwkJCW5ldyBGZWF0dXJlSGllcmFyY2h5RWxlbWVudFtjaGlsZHJlbi5zaXplKCldOworCQljaGlsZHJlbi50b0FycmF5KGFycmF5KTsKKwkJcmV0dXJuIGFycmF5OworCX0KKworCXB1YmxpYyBGZWF0dXJlSGllcmFyY2h5RWxlbWVudFtdIGdldENoaWxkcmVuKCkgeworCQlpZiAoY2hpbGRyZW4gIT0gbnVsbCkgeworCQkJRmVhdHVyZUhpZXJhcmNoeUVsZW1lbnRbXSBhcnJheSA9CisJCQkJbmV3IEZlYXR1cmVIaWVyYXJjaHlFbGVtZW50W2NoaWxkcmVuLnNpemUoKV07CisJCQljaGlsZHJlbi50b0FycmF5KGFycmF5KTsKKwkJCXJldHVybiBhcnJheTsKKwkJfQorCisJCXJldHVybiBuZXcgRmVhdHVyZUhpZXJhcmNoeUVsZW1lbnRbMF07CisJfQorCS8qKgorCSAqIENvbXB1dGVzIGNoaWxkcmVuIG9mIHRoaXMgbm9kZS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBjb21wdXRlQ2hpbGRyZW4oCisJCWJvb2xlYW4gdXBkYXRlLAorCQlib29sZWFuIHBhdGNoLAorCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnKSB7CisJCWlmIChjaGlsZHJlbiA9PSBudWxsKSB7CisJCQljaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKKwkJCXRyeSB7CisJCQkJSUZlYXR1cmUgb2xkRmVhdHVyZSA9IG51bGw7CisJCQkJSUZlYXR1cmUgbmV3RmVhdHVyZSA9IG51bGw7CisJCQkJbmV3RmVhdHVyZSA9IG5ld0ZlYXR1cmVSZWYuZ2V0RmVhdHVyZShudWxsKTsKKwkJCQlpZiAob2xkRmVhdHVyZVJlZiAhPSBudWxsKQorCQkJCQlvbGRGZWF0dXJlID0gb2xkRmVhdHVyZVJlZi5nZXRGZWF0dXJlKG51bGwpOworCQkJCW9wdGlvbmFsQ2hpbGRyZW4gPQorCQkJCQljb21wdXRlRWxlbWVudHMoCisJCQkJCQlvbGRGZWF0dXJlLAorCQkJCQkJbmV3RmVhdHVyZSwKKwkJCQkJCXVwZGF0ZSwKKwkJCQkJCXBhdGNoLAorCQkJCQkJY29uZmlnLAorCQkJCQkJY2hpbGRyZW4pOworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsKKwkJCQkJRmVhdHVyZUhpZXJhcmNoeUVsZW1lbnQgZWxlbWVudCA9CisJCQkJCQkoRmVhdHVyZUhpZXJhcmNoeUVsZW1lbnQpIGNoaWxkcmVuLmdldChpKTsKKwkJCQkJZWxlbWVudC5zZXRSb290KGdldFJvb3QoKSk7CisJCQkJfQorCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQl9CisJCX0KKwl9CisJLyoqCisJICogCisJICovCisJcHVibGljIGJvb2xlYW4gaGFzT3B0aW9uYWxDaGlsZHJlbigpIHsKKwkJcmV0dXJuIG9wdGlvbmFsQ2hpbGRyZW47CisJfQorCS8qKgorCSAqIEFkZHMgY2hlY2tlZCBvcHRpb25hbCBmZWF0dXJlcyB0byB0aGUgcHJvdmlkZWQgc2V0LgorCSAqLworCXB1YmxpYyB2b2lkIGFkZENoZWNrZWRPcHRpb25hbEZlYXR1cmVzKAorCQlib29sZWFuIHVwZGF0ZSwKKwkJYm9vbGVhbiBwYXRjaCwKKwkJSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZywKKwkJU2V0IHNldCkgeworCQlpZiAoaXNPcHRpb25hbCgpICYmIGlzQ2hlY2tlZCgpKSB7CisJCQkvLyBEbyBub3QgYWRkIGNoZWNrZWQgb3B0aW9uYWwgZmVhdHVyZXMKKwkJCS8vIGlmIHRoaXMgaXMgYW4gdXBkYXRlIGNhc2UgYnV0CisJCQkvLyB0aGUgbm9kZSBpcyBub3QgYSAndHJ1ZScgdXBkYXRlCisJCQkvLyAob2xkIGFuZCBuZXcgZmVhdHVyZSBhcmUgdGhlIGVxdWFsKQorCQkJaWYgKCF1cGRhdGUgfHwgIWlzRmFsc2VVcGRhdGUoKSkKKwkJCQlzZXQuYWRkKG5ld0ZlYXR1cmVSZWYpOworCQl9CisJCUZlYXR1cmVIaWVyYXJjaHlFbGVtZW50W10gZWxlbWVudHMgPSBnZXRDaGlsZHJlbih1cGRhdGUsIHBhdGNoLCBjb25maWcpOworCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7CisJCQllbGVtZW50c1tpXS5hZGRDaGVja2VkT3B0aW9uYWxGZWF0dXJlcyh1cGRhdGUsIHBhdGNoLCBjb25maWcsIHNldCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBDb21wdXRlcyBmaXJzdC1sZXZlbCBjaGlsZHJlbiBvZiB0aGUgbGlua2VkIGhpZXJhcmNoeQorCSAqIGZvciB0aGUgcHJvdmlkZWQgb2xkIGFuZCBuZXcgZmVhdHVyZXMgKHNhbWUgSUQsIGRpZmZlcmVudCB2ZXJzaW9uCisJICogd2hlcmUgbmV3IHZlcnNpb24gaXMgZ3JlYXRlciBvciBlcXVhbCB0aGUgb2xkIHZlcnNpb24pLgorCSAqIE9sZCBmZWF0dXJlIG1heSBiZSBudWxsLiAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29tcHV0ZUVsZW1lbnRzKAorCQlJRmVhdHVyZSBvbGRGZWF0dXJlLAorCQlJRmVhdHVyZSBuZXdGZWF0dXJlLAorCQlib29sZWFuIHVwZGF0ZSwKKwkJYm9vbGVhbiBwYXRjaCwKKwkJSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZywKKwkJQXJyYXlMaXN0IGxpc3QpIHsKKwkJT2JqZWN0W10gb2xkQ2hpbGRyZW4gPSBudWxsOworCQlPYmplY3RbXSBuZXdDaGlsZHJlbiA9IGdldEluY2x1ZGVkRmVhdHVyZXMobmV3RmVhdHVyZSk7CisJCWJvb2xlYW4gb3B0aW9uYWxDaGlsZHJlbiA9IGZhbHNlOworCisJCXRyeSB7CisJCQlpZiAob2xkRmVhdHVyZSAhPSBudWxsKSB7CisJCQkJb2xkQ2hpbGRyZW4gPSBnZXRJbmNsdWRlZEZlYXR1cmVzKG9sZEZlYXR1cmUpOworCQkJfQorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXdDaGlsZHJlbi5sZW5ndGg7IGkrKykgeworCQkJCUlGZWF0dXJlUmVmZXJlbmNlIG9sZFJlZiA9IG51bGw7CisJCQkJSUZlYXR1cmVSZWZlcmVuY2UgbmV3UmVmID0gKElGZWF0dXJlUmVmZXJlbmNlKSBuZXdDaGlsZHJlbltpXTsKKwkJCQlpZiAob2xkQ2hpbGRyZW4gIT0gbnVsbCkgeworCQkJCQlTdHJpbmcgbmV3SWQgPQorCQkJCQkJbmV3UmVmLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRJZGVudGlmaWVyKCk7CisKKwkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBvbGRDaGlsZHJlbi5sZW5ndGg7IGorKykgeworCQkJCQkJSUZlYXR1cmVSZWZlcmVuY2UgY3JlZiA9CisJCQkJCQkJKElGZWF0dXJlUmVmZXJlbmNlKSBvbGRDaGlsZHJlbltqXTsKKwkJCQkJCXRyeSB7CisJCQkJCQkJaWYgKGNyZWYKKwkJCQkJCQkJLmdldFZlcnNpb25lZElkZW50aWZpZXIoKQorCQkJCQkJCQkuZ2V0SWRlbnRpZmllcigpCisJCQkJCQkJCS5lcXVhbHMobmV3SWQpKSB7CisJCQkJCQkJCW9sZFJlZiA9IGNyZWY7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCX0KKwkJCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0gZWxzZSBpZiAocGF0Y2gpIHsKKwkJCQkJLy8gMzA4NDkgLSBmaW5kIHRoZSBvbGQgcmVmZXJlbmNlIGluIHRoZQorCQkJCQkvLyBjb25maWd1cmF0aW9uLgorCQkJCQlpZiAoIVVwZGF0ZVV0aWxzLmlzUGF0Y2gobmV3RmVhdHVyZSkpIHsKKwkJCQkJCW9sZFJlZiA9IGZpbmRQYXRjaGVkUmVmZXJlbmNlKG5ld1JlZiwgY29uZmlnKTsKKwkJCQkJfQorCQkJCX0KKwkJCQkvLyB0ZXN0IGlmIHRoZSBvbGQgb3B0aW9uYWwgZmVhdHVyZSBleGlzdHMKKwkJCQlpZiAob2xkUmVmICE9IG51bGwKKwkJCQkJJiYgKChvbGRSZWYgaW5zdGFuY2VvZiBJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlCisJCQkJCQkmJiAoKElJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UpIG9sZFJlZikuaXNPcHRpb25hbCgpKQorCQkJCQkJfHwgcGF0Y2gpKSB7CisJCQkJCXRyeSB7CisJCQkJCQlJRmVhdHVyZSBmID0gb2xkUmVmLmdldEZlYXR1cmUobnVsbCk7CisJCQkJCQlpZiAoZiA9PSBudWxsKQorCQkJCQkJCW9sZFJlZiA9IG51bGw7CisJCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJCQkJLy8gbWlzc2luZworCQkJCQkJb2xkUmVmID0gbnVsbDsKKwkJCQkJfQorCQkJCX0KKwkJCQlGZWF0dXJlSGllcmFyY2h5RWxlbWVudCBlbGVtZW50ID0KKwkJCQkJbmV3IEZlYXR1cmVIaWVyYXJjaHlFbGVtZW50KG9sZFJlZiwgbmV3UmVmKTsKKwkJCQkvLyBJZiB0aGlzIGlzIGFuIHVwZGF0ZSAob2xkIGZlYXR1cmUgZXhpc3RzKSwgCisJCQkJLy8gb25seSBjaGVjayB0aGUgbmV3IG9wdGlvbmFsIGZlYXR1cmUgaWYgdGhlIG9sZCBleGlzdHMuCisJCQkJLy8gT3RoZXJ3aXNlLCBhbHdheXMgY2hlY2suCisJCQkJaWYgKGVsZW1lbnQuaXNPcHRpb25hbCgpICYmICh1cGRhdGUgfHwgcGF0Y2gpKSB7CisJCQkJCWVsZW1lbnQuc2V0Q2hlY2tlZChvbGRSZWYgIT0gbnVsbCk7CisJCQkJCWlmIChvbGRSZWYgPT0gbnVsbCkgeworCQkJCQkJLy8gRG9lcyBub3QgaGF2ZSBhbiBvbGQgcmVmZXJlbmNlLAorCQkJCQkJLy8gYnV0IGl0IG1heSBjb250YWluIGFuIG9sZGVyCisJCQkJCQkvLyBmZWF0dXJlIHRoYXQgbWF5IHN0aWxsIHF1YWxpZnkKKwkJCQkJCS8vIGZvciB1cGRhdGUuIEZvciBleGFtcGxlLAorCQkJCQkJLy8gYW4gb2xkZXIgdmVyc2lvbiBtYXkgaGF2ZSBiZWVuCisJCQkJCQkvLyBpbnN0YWxsZWQgbmF0aXZlbHkgZnJvbSB0aGUgQ0QtUk9NLgorCQkJCQkJaWYgKGhhc09sZGVyVmVyc2lvbihuZXdSZWYpKSB7CisJCQkJCQkJZWxlbWVudC5zZXROYXRpdmVVcGdyYWRlKHRydWUpOworCQkJCQkJCWVsZW1lbnQuc2V0Q2hlY2tlZCh0cnVlKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0gZWxzZQorCQkJCQllbGVtZW50LnNldENoZWNrZWQodHJ1ZSk7CisJCQkJbGlzdC5hZGQoZWxlbWVudCk7CisJCQkJZWxlbWVudC5jb21wdXRlQ2hpbGRyZW4odXBkYXRlLCBwYXRjaCwgY29uZmlnKTsKKwkJCQlpZiAoZWxlbWVudC5pc09wdGlvbmFsKCkgfHwgZWxlbWVudC5oYXNPcHRpb25hbENoaWxkcmVuKCkpCisJCQkJCW9wdGlvbmFsQ2hpbGRyZW4gPSB0cnVlOworCQkJfQorCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJfQorCQlyZXR1cm4gb3B0aW9uYWxDaGlsZHJlbjsKKwl9CisJcHVibGljIHN0YXRpYyBib29sZWFuIGhhc09sZGVyVmVyc2lvbihJRmVhdHVyZVJlZmVyZW5jZSBuZXdSZWYpIHsKKwkJdHJ5IHsKKwkJCVZlcnNpb25lZElkZW50aWZpZXIgdmlkID0gbmV3UmVmLmdldFZlcnNpb25lZElkZW50aWZpZXIoKTsKKwkJCVBsdWdpblZlcnNpb25JZGVudGlmaWVyIHZlcnNpb24gPSB2aWQuZ2V0VmVyc2lvbigpOworCQkJU3RyaW5nIG1vZGUgPSBnZXRVcGRhdGVWZXJzaW9uc01vZGUoKTsKKworCQkJSUZlYXR1cmVbXSBhbGxJbnN0YWxsZWQgPQorCQkJCVVwZGF0ZVV0aWxzLmdldEluc3RhbGxlZEZlYXR1cmVzKHZpZCwgZmFsc2UpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxJbnN0YWxsZWQubGVuZ3RoOyBpKyspIHsKKwkJCQlJRmVhdHVyZSBjYW5kaWRhdGUgPSBhbGxJbnN0YWxsZWRbaV07CisJCQkJUGx1Z2luVmVyc2lvbklkZW50aWZpZXIgY3ZlcnNpb24gPQorCQkJCQljYW5kaWRhdGUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldFZlcnNpb24oKTsKKwkJCQkvLyBWZXJpZnkgdGhhdCB0aGUgZGlmZmVyZW5jZSBxdWFsaWZpZXMgYXMKKwkJCQkvLyBhbiB1cGRhdGUuCisJCQkJaWYgKG1vZGUuZXF1YWxzKFVwZGF0ZUNvcmUuRVFVSVZBTEVOVF9WQUxVRSkpIHsKKwkJCQkJaWYgKHZlcnNpb24uaXNFcXVpdmFsZW50VG8oY3ZlcnNpb24pKQorCQkJCQkJcmV0dXJuIHRydWU7CisJCQkJfSBlbHNlIGlmIChtb2RlLmVxdWFscyhVcGRhdGVDb3JlLkNPTVBBVElCTEVfVkFMVUUpKSB7CisJCQkJCWlmICh2ZXJzaW9uLmlzQ29tcGF0aWJsZVdpdGgoY3ZlcnNpb24pKQorCQkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJfQorCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgSUZlYXR1cmVSZWZlcmVuY2UgZmluZFBhdGNoZWRSZWZlcmVuY2UoCisJCUlGZWF0dXJlUmVmZXJlbmNlIG5ld1JlZiwKKwkJSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZykKKwkJdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlWZXJzaW9uZWRJZGVudGlmaWVyIHZpZCA9IG5ld1JlZi5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7CisJCUlDb25maWd1cmVkU2l0ZVtdIGNzaXRlcyA9IGNvbmZpZy5nZXRDb25maWd1cmVkU2l0ZXMoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBjc2l0ZXMubGVuZ3RoOyBpKyspIHsKKwkJCUlDb25maWd1cmVkU2l0ZSBjc2l0ZSA9IGNzaXRlc1tpXTsKKwkJCUlGZWF0dXJlUmVmZXJlbmNlW10gcmVmcyA9IGNzaXRlLmdldENvbmZpZ3VyZWRGZWF0dXJlcygpOworCQkJZm9yIChpbnQgaiA9IDA7IGogPCByZWZzLmxlbmd0aDsgaisrKSB7CisJCQkJSUZlYXR1cmVSZWZlcmVuY2UgcmVmID0gcmVmc1tqXTsKKwkJCQlWZXJzaW9uZWRJZGVudGlmaWVyIHJlZlZpZCA9IHJlZi5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7CisJCQkJaWYgKHZpZC5nZXRJZGVudGlmaWVyKCkuZXF1YWxzKHJlZlZpZC5nZXRJZGVudGlmaWVyKCkpKQorCQkJCQlyZXR1cm4gcmVmOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgaW5jbHVkZWQgZmVhdHVyZSByZWZlcmVuY2VzIGZvciB0aGUgZ2l2ZW4gcmVmZXJlbmNlLgorCSAqLworCXB1YmxpYyBzdGF0aWMgT2JqZWN0W10gZ2V0SW5jbHVkZWRGZWF0dXJlcyhJRmVhdHVyZVJlZmVyZW5jZSByZWYpIHsKKwkJdHJ5IHsKKwkJCUlGZWF0dXJlIGZlYXR1cmUgPSByZWYuZ2V0RmVhdHVyZShudWxsKTsKKwkJCXJldHVybiBnZXRJbmNsdWRlZEZlYXR1cmVzKGZlYXR1cmUpOworCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJfQorCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGluY2x1ZGVkIGZlYXR1cmUgcmVmZXJlbmNlcyBmb3IgdGhlIGdpdmVuIGZlYXR1cmUuCisJICovCisKKwlwdWJsaWMgc3RhdGljIE9iamVjdFtdIGdldEluY2x1ZGVkRmVhdHVyZXMoSUZlYXR1cmUgZmVhdHVyZSkgeworCQl0cnkgeworCQkJcmV0dXJuIGZlYXR1cmUuZ2V0SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpOworCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJfQorCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0VXBkYXRlVmVyc2lvbnNNb2RlKCkgeworCQlQcmVmZXJlbmNlcyBzdG9yZSA9IFVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKKwkJcmV0dXJuIHN0b3JlLmdldFN0cmluZyhVcGRhdGVDb3JlLlBfVVBEQVRFX1ZFUlNJT05TKTsKKwl9Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL0ZlYXR1cmVPcGVyYXRpb24uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvRmVhdHVyZU9wZXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkN2Y5ODgKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL0ZlYXR1cmVPcGVyYXRpb24uamF2YQpAQCAtMCwwICsxLDc1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm9wZXJhdGlvbnM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuKjsKKworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRmVhdHVyZU9wZXJhdGlvbiBleHRlbmRzIE9wZXJhdGlvbiBpbXBsZW1lbnRzIElGZWF0dXJlT3BlcmF0aW9uIHsKKwkKKwlwcm90ZWN0ZWQgSUZlYXR1cmUgZmVhdHVyZTsKKwlwcm90ZWN0ZWQgSUZlYXR1cmUgb2xkRmVhdHVyZTsKKwlwcm90ZWN0ZWQgSUNvbmZpZ3VyZWRTaXRlIHRhcmdldFNpdGU7CisKKy8vCXByaXZhdGUgYm9vbGVhbiBvcHRpb25hbERlbHRhOworCQorCQorCXB1YmxpYyBGZWF0dXJlT3BlcmF0aW9uKElDb25maWd1cmVkU2l0ZSB0YXJnZXRTaXRlLCBJRmVhdHVyZSBmZWF0dXJlKSB7CisJCXN1cGVyKCk7CisJCXRoaXMuZmVhdHVyZSA9IGZlYXR1cmU7CisJCXRoaXMudGFyZ2V0U2l0ZSA9IHRhcmdldFNpdGU7CisJfQorCisJcHVibGljIElGZWF0dXJlIGdldEZlYXR1cmUoKSB7CisJCXJldHVybiBmZWF0dXJlOworCX0KKwkKKwlwdWJsaWMgSUZlYXR1cmUgZ2V0T2xkRmVhdHVyZSgpIHsKKwkJcmV0dXJuIG9sZEZlYXR1cmU7CisJfQorCQorLy8JcHVibGljIGJvb2xlYW4gaXNPcHRpb25hbERlbHRhKCkgeworLy8JCXJldHVybiBvcHRpb25hbERlbHRhOworLy8JfQorCQorCXB1YmxpYyBJQ29uZmlndXJlZFNpdGUgZ2V0VGFyZ2V0U2l0ZSgpIHsKKwkJcmV0dXJuIHRhcmdldFNpdGU7CisJfQorCisJcHVibGljIHZvaWQgc2V0VGFyZ2V0U2l0ZShJQ29uZmlndXJlZFNpdGUgdGFyZ2V0U2l0ZSkgeworCQl0aGlzLnRhcmdldFNpdGUgPSB0YXJnZXRTaXRlOworCX0KKwkKKworCXN0YXRpYyBib29sZWFuIHVuY29uZmlndXJlKElGZWF0dXJlIGZlYXR1cmUsIElDb25maWd1cmVkU2l0ZSBzaXRlKQorCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpOworCQlpZiAoc2l0ZSA9PSBudWxsKQorCQkJc2l0ZSA9IFVwZGF0ZVV0aWxzLmdldENvbmZpZ1NpdGUoZmVhdHVyZSwgY29uZmlnKTsKKwkJCisJCWlmIChzaXRlICE9IG51bGwpIHsKKwkJCVBhdGNoQ2xlYW5lciBjbGVhbmVyID0gbmV3IFBhdGNoQ2xlYW5lcihzaXRlLCBmZWF0dXJlKTsKKwkJCWJvb2xlYW4gcmVzdWx0ID0gc2l0ZS51bmNvbmZpZ3VyZShmZWF0dXJlKTsKKwkJCWNsZWFuZXIuZGlzcG9zZSgpOworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcHVibGljIHZvaWQgc2V0RmVhdHVyZShJRmVhdHVyZSBmZWF0dXJlKSB7CisJCXRoaXMuZmVhdHVyZSA9IGZlYXR1cmU7CisJfQorCQorCit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL0ZlYXR1cmVTdGF0dXMuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvRmVhdHVyZVN0YXR1cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4MmVkNTMKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL0ZlYXR1cmVTdGF0dXMuamF2YQpAQCAtMCwwICsxLDU3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm9wZXJhdGlvbnM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOworCisKKy8qKgorICogVGhlIGZlYXR1cmUgc3RhdHVzIHByb3ZpZGUgaW5mbyBhYm91dCB0aGUgYnJva2VuIGZlYXR1cmVzIGFuZCB3aGF0IGlzCisgKiB3cm9uZy4KKyAqLworcHVibGljIGNsYXNzIEZlYXR1cmVTdGF0dXMgZXh0ZW5kcyBTdGF0dXMgeworCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IENPREVfT1RIRVIgPSBJU3RhdHVzLk9LOy8vMAorCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IENPREVfUFJFUkVRX0ZFQVRVUkUgPSAxOworCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IENPREVfUFJFUkVRX1BMVUdJTiA9IDI7CisJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQ09ERV9FWENMVVNJVkUgPSA0OworCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IENPREVfQ1lDTEUgPSA4OworCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IENPREVfT1BUSU9OQUxfQ0hJTEQgPSAxNjsKKwlwdWJsaWMgZmluYWwgc3RhdGljIGludCBDT0RFX0VOVklST05NRU5UID0gMzI7CisJSUZlYXR1cmUgZmVhdHVyZTsKKworCXB1YmxpYyBGZWF0dXJlU3RhdHVzKElGZWF0dXJlIGZlYXR1cmUsIGludCBzZXZlcml0eSwgU3RyaW5nIHBsdWdpbklkLCBpbnQgY29kZSwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKKwkJc3VwZXIoc2V2ZXJpdHksIHBsdWdpbklkLCBjb2RlLCBtZXNzYWdlLCBleGNlcHRpb24pOworCQl0aGlzLmZlYXR1cmUgPSBmZWF0dXJlOworCX0KKwlwdWJsaWMgSUZlYXR1cmUgZ2V0RmVhdHVyZSgpIHsKKwkJcmV0dXJuIGZlYXR1cmU7CisJfQorCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisJCWlmICghKG9iaiBpbnN0YW5jZW9mIEZlYXR1cmVTdGF0dXMpKQorCQkJcmV0dXJuIGZhbHNlOworCQlGZWF0dXJlU3RhdHVzIGZzID0gKEZlYXR1cmVTdGF0dXMpIG9iajsKKwkJLy8gb25seSBjaGVjayBmb3IgZmVhdHVyZSwgcmVnYXJkbGVzcyBvZiBzdGF0dXMgdHlwZQorCQlpZiAoZnMuZ2V0RmVhdHVyZSgpID09IGZlYXR1cmUpCisJCQlyZXR1cm4gdHJ1ZTsKKwkJZWxzZSBpZiAoZnMuZ2V0RmVhdHVyZSgpID09IG51bGwgJiYgZmVhdHVyZSA9PSBudWxsKQorCQkJcmV0dXJuIGZzLmdldE1lc3NhZ2UoKS5lcXVhbHMoZ2V0TWVzc2FnZSgpKTsKKwkJZWxzZSBpZiAoZnMuZ2V0RmVhdHVyZSgpID09IG51bGwgJiYgZmVhdHVyZSAhPSBudWxsKQorCQkJcmV0dXJuIGZhbHNlOworCQllbHNlIGlmIChmcy5nZXRGZWF0dXJlKCkgIT0gbnVsbCAmJiBmZWF0dXJlID09IG51bGwpCisJCQlyZXR1cm4gZmFsc2U7CisJCWVsc2UgaWYgKGZzLmdldEZlYXR1cmUoKS5lcXVhbHMoZmVhdHVyZSkpCisJCQlyZXR1cm4gdHJ1ZTsKKwkJZWxzZQorCQkJcmV0dXJuIGZhbHNlOworCX0KKworfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9JQmF0Y2hGZWF0dXJlT3BlcmF0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL0lCYXRjaEZlYXR1cmVPcGVyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWQ3YWRhCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9JQmF0Y2hGZWF0dXJlT3BlcmF0aW9uLmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zOworCitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uSUNvbmZpZ3VyZWRTaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLklPcGVyYXRpb247CisKK3B1YmxpYyBpbnRlcmZhY2UgSUJhdGNoRmVhdHVyZU9wZXJhdGlvbiBleHRlbmRzIElPcGVyYXRpb24geworCisJLyoqCisJICogUmV0dXJucyB0aGUgZmVhdHVyZXMgdG8gb3BlcmF0ZSBvbi4KKwkgKiBAcmV0dXJuIHRoZSBmZWF0dXJlcyB0byBvcGVyYXRlIG9uLgorCSAqLworCXB1YmxpYyBhYnN0cmFjdCBJRmVhdHVyZVtdIGdldEZlYXR1cmVzKCk7CisJLyoqCisJICogUmV0dXJucyB0aGUgc2l0ZSBpbiB3aGljaCB0aGUgb3BlcmF0aW9uIGlzIGFwcGxpZWQuCisJICogQHJldHVybiB0aGUgc2l0ZSB0aGF0IG93bnMgb3Igd2lsbCBvd24gdGhlIGZlYXR1cmUuCisJICovCisJcHVibGljIGFic3RyYWN0IElDb25maWd1cmVkU2l0ZVtdIGdldFRhcmdldFNpdGVzKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSBzaXRlIGluIHdoaWNoIHRoZSBmZWF0dXJlIGlzIGJlaW5nIG9wZXJhdGVkIG9uLgorCSAqIEBwYXJhbSB0YXJnZXRTaXRlIHRoZSBzaXRlIGluIHdoaWNoIHRoZSBmZWF0cmUgaXMgYmVpbmcgb3BlcmF0ZWQgb24uCisJICovCisJcHVibGljIGFic3RyYWN0IHZvaWQgc2V0VGFyZ2V0U2l0ZXMoSUNvbmZpZ3VyZWRTaXRlW10gdGFyZ2V0U2l0ZSk7Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL0lDb25maWd1cmVGZWF0dXJlc09wZXJhdGlvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9JQ29uZmlndXJlRmVhdHVyZXNPcGVyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWMzNTM0Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9JQ29uZmlndXJlRmVhdHVyZXNPcGVyYXRpb24uamF2YQpAQCAtMCwwICsxLDE1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm9wZXJhdGlvbnM7CisKK3B1YmxpYyBpbnRlcmZhY2UgSUNvbmZpZ3VyZUZlYXR1cmVzT3BlcmF0aW9uIGV4dGVuZHMgSUJhdGNoRmVhdHVyZU9wZXJhdGlvbiB7CisKK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvSVVuY29uZmlndXJlQW5kVW5pbnN0YWxsRmVhdHVyZU9wZXJhdGlvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9JVW5jb25maWd1cmVBbmRVbmluc3RhbGxGZWF0dXJlT3BlcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U1MDA2ZAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvSVVuY29uZmlndXJlQW5kVW5pbnN0YWxsRmVhdHVyZU9wZXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwub3BlcmF0aW9uczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLklGZWF0dXJlT3BlcmF0aW9uOworCitwdWJsaWMgaW50ZXJmYWNlIElVbmNvbmZpZ3VyZUFuZFVuaW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gZXh0ZW5kcworCQlJRmVhdHVyZU9wZXJhdGlvbiB7CisKK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvSVVuY29uZmlndXJlQW5kVW5pbnN0YWxsRmVhdHVyZXNPcGVyYXRpb24uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvSVVuY29uZmlndXJlQW5kVW5pbnN0YWxsRmVhdHVyZXNPcGVyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTkyMTZmCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9JVW5jb25maWd1cmVBbmRVbmluc3RhbGxGZWF0dXJlc09wZXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwub3BlcmF0aW9uczsKKworcHVibGljIGludGVyZmFjZSBJVW5jb25maWd1cmVBbmRVbmluc3RhbGxGZWF0dXJlc09wZXJhdGlvbiBleHRlbmRzCisJCUlCYXRjaEZlYXR1cmVPcGVyYXRpb24geworCit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL0lVbmNvbmZpZ3VyZUZlYXR1cmVzT3BlcmF0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL0lVbmNvbmZpZ3VyZUZlYXR1cmVzT3BlcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRmNWQ1ZAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvSVVuY29uZmlndXJlRmVhdHVyZXNPcGVyYXRpb24uamF2YQpAQCAtMCwwICsxLDE2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm9wZXJhdGlvbnM7CisKKworcHVibGljIGludGVyZmFjZSBJVW5jb25maWd1cmVGZWF0dXJlc09wZXJhdGlvbiBleHRlbmRzIElCYXRjaEZlYXR1cmVPcGVyYXRpb24geworCit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL0lVbmluc3RhbGxGZWF0dXJlc09wZXJhdGlvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9JVW5pbnN0YWxsRmVhdHVyZXNPcGVyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmU2MTE3Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9JVW5pbnN0YWxsRmVhdHVyZXNPcGVyYXRpb24uamF2YQpAQCAtMCwwICsxLDE1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm9wZXJhdGlvbnM7CisKK3B1YmxpYyBpbnRlcmZhY2UgSVVuaW5zdGFsbEZlYXR1cmVzT3BlcmF0aW9uIGV4dGVuZHMgSUJhdGNoRmVhdHVyZU9wZXJhdGlvbiB7CisKK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvSW5zdGFsbE9wZXJhdGlvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9JbnN0YWxsT3BlcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI4MmE3MAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvSW5zdGFsbE9wZXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTY4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm9wZXJhdGlvbnM7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLk1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLio7CisKKy8qKgorICogQ29uZmlndXJlIGEgZmVhdHVyZS4KKyAqIENvbmZpZ09wZXJhdGlvbgorICovCitwdWJsaWMgY2xhc3MgSW5zdGFsbE9wZXJhdGlvbgorCWV4dGVuZHMgRmVhdHVyZU9wZXJhdGlvbgorCWltcGxlbWVudHMgSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIHsKKwkKKwlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IGFyZykgeworCQlpZiAoYXJnID09IG51bGwpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQkKKwkJaWYgKCEoYXJnIGluc3RhbmNlb2YgSW5zdGFsbE9wZXJhdGlvbikpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQkKKwkJSW5zdGFsbE9wZXJhdGlvbiBpbyA9IChJbnN0YWxsT3BlcmF0aW9uKWFyZzsKKwkJCisJCXJldHVybiBpby5nZXRGZWF0dXJlKCkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmVxdWFscyh0aGlzLmdldEZlYXR1cmUoKS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkpOworCX0KKworCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJcmV0dXJuIHN1cGVyLmdldEZlYXR1cmUoKS5oYXNoQ29kZSgpOworCX0KKworCXByaXZhdGUgSUZlYXR1cmVSZWZlcmVuY2VbXSBvcHRpb25hbEZlYXR1cmVzOworCXByaXZhdGUgSUZlYXR1cmVbXSB1bmNvbmZpZ3VyZWRPcHRpb25hbEZlYXR1cmVzOworCXByaXZhdGUgSVZlcmlmaWNhdGlvbkxpc3RlbmVyIHZlcmlmaWVyOworCisJLyoqCisJICogQ29uc3RydWN0b3IKKwkgKiBAcGFyYW0gc2l0ZQorCSAqIEBwYXJhbSBmZWF0dXJlCisJICogQHBhcmFtIG9wdGlvbmFsRmVhdHVyZXMgb3B0aW9uYWwgZmVhdHVyZXMgdG8gaW5zdGFsbC4gSWYgbnVsbCwgdGhlIG9wZXJhdGlvbiB3aWxsIGluc3RhbGwgdGhlbSBhbGwgKGlmIGFueSkKKwkgKiBAcGFyYW0gdW5jb25maWd1cmVkT3B0aW9uYWxFbGVtZW50cyBvcHRpb25hbCBmZWF0dXJlcyB1bmNvbmZpZ3VyZWQgYmVmb3JlIHRoZSBvcGVyYXRpb24uIFRoZXkgc2hvdWxkIHJlbWFpbiB1bmNvbmZpZ3VyZWQgYWZ0ZXIgdGhlIGluc3RhbGwuCisJICogQHBhcmFtIHZlcmlmaWVyCisJICovCisJcHVibGljIEluc3RhbGxPcGVyYXRpb24oCisJCUlDb25maWd1cmVkU2l0ZSBzaXRlLAorCQlJRmVhdHVyZSBmZWF0dXJlLAorCQlJRmVhdHVyZVJlZmVyZW5jZVtdIG9wdGlvbmFsRmVhdHVyZXMsCisJCUlGZWF0dXJlW10gdW5jb25maWd1cmVkT3B0aW9uYWxFbGVtZW50cywKKwkJSVZlcmlmaWNhdGlvbkxpc3RlbmVyIHZlcmlmaWVyKSB7CisJCXN1cGVyKHNpdGUsIGZlYXR1cmUpOworCQlJRmVhdHVyZVtdIGluc3RhbGxlZCA9IFVwZGF0ZVV0aWxzLmdldEluc3RhbGxlZEZlYXR1cmVzKGZlYXR1cmUpOworCQlpZiAoaW5zdGFsbGVkLmxlbmd0aCA+IDApCisJCQl0aGlzLm9sZEZlYXR1cmUgPSBpbnN0YWxsZWRbMF07CisJCXRoaXMudW5jb25maWd1cmVkT3B0aW9uYWxGZWF0dXJlcyA9IHVuY29uZmlndXJlZE9wdGlvbmFsRWxlbWVudHM7CisJCXRoaXMub3B0aW9uYWxGZWF0dXJlcyA9IG9wdGlvbmFsRmVhdHVyZXM7CisJCXRoaXMudmVyaWZpZXIgPSB2ZXJpZmllcjsKKwl9CisKKwlwdWJsaWMgSUZlYXR1cmVSZWZlcmVuY2VbXSBnZXRPcHRpb25hbEZlYXR1cmVzKCkgeworCQlyZXR1cm4gb3B0aW9uYWxGZWF0dXJlczsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgcG0sIElPcGVyYXRpb25MaXN0ZW5lciBsaXN0ZW5lcikKKwkJdGhyb3dzIENvcmVFeGNlcHRpb24geworCisJCWJvb2xlYW4gcmVpbnN0YWxsID0gZmFsc2U7CisJCWlmIChvbGRGZWF0dXJlICE9IG51bGwKKwkJCSYmIGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmVxdWFscygKKwkJCQlvbGRGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSkpCisJCQlyZWluc3RhbGwgPSB0cnVlOworCisJCXNldE9wdGlvbmFsRmVhdHVyZXMoKTsKKworCQlpZiAob3B0aW9uYWxGZWF0dXJlcyA9PSBudWxsKQorCQkJdGFyZ2V0U2l0ZS5pbnN0YWxsKGZlYXR1cmUsIHZlcmlmaWVyLCBwbSk7CisJCWVsc2UKKwkJCXRhcmdldFNpdGUuaW5zdGFsbChmZWF0dXJlLCBvcHRpb25hbEZlYXR1cmVzLCB2ZXJpZmllciwgcG0pOworCisJCWlmICghcmVpbnN0YWxsKSB7CisKKwkJCWlmIChvbGRGZWF0dXJlICE9IG51bGwpIHsgLy8mJiBpc09wdGlvbmFsRGVsdGEoKSkgeworCQkJCXByZXNlcnZlT3B0aW9uYWxTdGF0ZSgpOworCisJCQkJYm9vbGVhbiBvbGRTdWNjZXNzID0gdW5jb25maWd1cmUob2xkRmVhdHVyZSwgbnVsbCk7IC8vIHBpY2sgYW55IHNpdGUgY29udGFpbmluZyBvbGQgZmVhdHVyZQorCQkJCWlmICghb2xkU3VjY2VzcykgeworCQkJCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKTsKKwkJCQkJaWYgKCFVcGRhdGVVdGlscy5pc05lc3RlZENoaWxkKGNvbmZpZywgb2xkRmVhdHVyZSkpIHsKKwkJCQkJCS8vICJlYXQiIHRoZSBlcnJvciBpZiBuZXN0ZWQgY2hpbGQKKwkJCQkJCVN0cmluZyBtZXNzYWdlID0KKwkJCQkJCQlOTFMuYmluZChNZXNzYWdlcy5PcGVyYXRpb25zTWFuYWdlcl9lcnJvcl9vbGQsIChuZXcgU3RyaW5nW10geyBvbGRGZWF0dXJlLmdldExhYmVsKCkgfSkpOworCQkJCQkJSVN0YXR1cyBzdGF0dXMgPQorCQkJCQkJCW5ldyBTdGF0dXMoCisJCQkJCQkJCUlTdGF0dXMuRVJST1IsCisJCQkJCQkJCVVwZGF0ZVV0aWxzLmdldFBsdWdpbklkKCksCisJCQkJCQkJCUlTdGF0dXMuT0ssCisJCQkJCQkJCW1lc3NhZ2UsCisJCQkJCQkJCW51bGwpOworCQkJCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc3RhdHVzKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworLy8JCQlpZiAob2xkRmVhdHVyZSA9PSBudWxsKSB7CisvLwkJCQllbnN1cmVVbmlxdWUoKTsKKy8vCQkJfQorCQl9CisJCXJldHVybiB0cnVlOworCX0KKworCXByaXZhdGUgdm9pZCBwcmVzZXJ2ZU9wdGlvbmFsU3RhdGUoKSB7CisJCWlmICh1bmNvbmZpZ3VyZWRPcHRpb25hbEZlYXR1cmVzID09IG51bGwpCisJCQlyZXR1cm47CisKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCB1bmNvbmZpZ3VyZWRPcHRpb25hbEZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7CisJCQl0cnkgeworCQkJCS8vIEdldCB0aGUgZmVhdHVyZSB0aGF0IG1hdGNoZXMgdGhlIG9yaWdpbmFsIHVuY29uZmlndXJlZCBvbmVzLgorCQkJCUlGZWF0dXJlIGxvY2FsRmVhdHVyZSA9CisJCQkJCVVwZGF0ZVV0aWxzLmdldExvY2FsRmVhdHVyZSgKKwkJCQkJCXRhcmdldFNpdGUsCisJCQkJCQl1bmNvbmZpZ3VyZWRPcHRpb25hbEZlYXR1cmVzW2ldKTsKKwkJCQlpZiAobG9jYWxGZWF0dXJlICE9IG51bGwpCisJCQkJCXRhcmdldFNpdGUudW5jb25maWd1cmUobG9jYWxGZWF0dXJlKTsKKworCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkJLy8gSWdub3JlIHRoaXMgLSB3ZSB3aWxsIGxlYXZlIHdpdGggaXQKKwkJCX0KKwkJfQorCX0KKwkKKwlwcml2YXRlIHZvaWQgc2V0T3B0aW9uYWxGZWF0dXJlcygpIHsKKwkJdHJ5IHsKKwkJCS8vIEVuc3VyZSBvcHRpb25hbCBmZWF0dXJlcyBhcmUgY29ycmVjdGx5IHNldAorCQkJaWYgKG9wdGlvbmFsRmVhdHVyZXMgPT0gbnVsbCAmJiBVcGRhdGVVdGlscy5oYXNPcHRpb25hbEZlYXR1cmVzKGZlYXR1cmUpICkgeworCQkJCUpvYlJvb3Qgam9iUm9vdCA9IG5ldyBKb2JSb290KHRoaXMpOworCQkJCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpOworCQkJCUhhc2hTZXQgc2V0ID0gbmV3IEhhc2hTZXQoKTsKKwkJCQlib29sZWFuIHVwZGF0ZSA9IG9sZEZlYXR1cmUgIT0gbnVsbDsKKwkJCQlib29sZWFuIHBhdGNoID0gVXBkYXRlVXRpbHMuaXNQYXRjaChmZWF0dXJlKTsKKwkJCQlGZWF0dXJlSGllcmFyY2h5RWxlbWVudFtdIGVsZW1lbnRzID0gam9iUm9vdC5nZXRFbGVtZW50cygpOworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKKwkJCQkJZWxlbWVudHNbaV0uYWRkQ2hlY2tlZE9wdGlvbmFsRmVhdHVyZXModXBkYXRlLCBwYXRjaCwgY29uZmlnLCBzZXQpOworCQkJCX0KKwkJCQlvcHRpb25hbEZlYXR1cmVzID0gbmV3IElGZWF0dXJlUmVmZXJlbmNlW3NldC5zaXplKCldOworCQkJCXNldC50b0FycmF5KG9wdGlvbmFsRmVhdHVyZXMpOworCQkJCXVuY29uZmlndXJlZE9wdGlvbmFsRmVhdHVyZXMgPSBqb2JSb290LmdldFVuY29uZmlndXJlZE9wdGlvbmFsRmVhdHVyZXMoY29uZmlnLCB0YXJnZXRTaXRlKTsKKwkJCX0KKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQlVcGRhdGVVdGlscy5sb2dFeGNlcHRpb24oZSk7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL0pvYlJvb3QuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvSm9iUm9vdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNGE1MzUKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL0pvYlJvb3QuamF2YQpAQCAtMCwwICsxLDEwMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy4qOworCitwdWJsaWMgY2xhc3MgSm9iUm9vdCB7CisJcHJpdmF0ZSBJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gam9iOworCXByaXZhdGUgRmVhdHVyZUhpZXJhcmNoeUVsZW1lbnRbXSBlbGVtZW50czsKKworCXB1YmxpYyBKb2JSb290KElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiBqb2IpIHsKKwkJdGhpcy5qb2IgPSBqb2I7CisJfQorCisJcHVibGljIElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiBnZXRKb2IoKSB7CisJCXJldHVybiBqb2I7CisJfQorCisJcHVibGljIEZlYXR1cmVIaWVyYXJjaHlFbGVtZW50W10gZ2V0RWxlbWVudHMoKSB7CisJCWlmIChlbGVtZW50cyA9PSBudWxsKQorCQkJY29tcHV0ZUVsZW1lbnRzKCk7CisJCXJldHVybiBlbGVtZW50czsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHVuY29uZmlndXJlZCBmZWF0dXJlcyBiZWZvcmUgYW4gaW5zdGFsbC4KKwkgKiBBZnRlciBpbnN0YWxsaW5nIHRoZSBmZWF0dXJlcywgdGhlIGNhbGxlciBtdXN0IGdldCB0aGUgbG9jYWwgZmVhdHVyZXMgdGhhdCBtYXRjaAorCSAqIHRoZXNlIHVuY29uZmlndXJlZCBmZWF0dXJlcyBhbmQgdW5jb25maWd1cmUgdGhlbS4KKwkgKiBAcGFyYW0gY29uZmlnCisJICogQHBhcmFtIHRhcmdldFNpdGUKKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIElGZWF0dXJlW10gZ2V0VW5jb25maWd1cmVkT3B0aW9uYWxGZWF0dXJlcygKKwkJSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZywKKwkJSUNvbmZpZ3VyZWRTaXRlIHRhcmdldFNpdGUpIHsKKworCQlBcnJheUxpc3QgdW5jb25maWd1cmVkT3B0aW9uYWxGZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJZ2V0VW5jb25maWd1cmVkT3B0aW9uYWxGZWF0dXJlcyh1bmNvbmZpZ3VyZWRPcHRpb25hbEZlYXR1cmVzLCBjb25maWcsIHRhcmdldFNpdGUsIGdldEVsZW1lbnRzKCksIFVwZGF0ZVV0aWxzLmlzUGF0Y2goam9iLmdldEZlYXR1cmUoKSkpOworCQlJRmVhdHVyZVtdIHVuY29uZmlndXJlZE9wdGlvbmFsRmVhdHVyZXNBcnJheSA9CisJCQluZXcgSUZlYXR1cmVbdW5jb25maWd1cmVkT3B0aW9uYWxGZWF0dXJlcy5zaXplKCldOworCQl1bmNvbmZpZ3VyZWRPcHRpb25hbEZlYXR1cmVzLnRvQXJyYXkodW5jb25maWd1cmVkT3B0aW9uYWxGZWF0dXJlc0FycmF5KTsKKwkJcmV0dXJuIHVuY29uZmlndXJlZE9wdGlvbmFsRmVhdHVyZXNBcnJheTsKKwl9CisKKwlwcml2YXRlIHZvaWQgZ2V0VW5jb25maWd1cmVkT3B0aW9uYWxGZWF0dXJlcygKKwkJQXJyYXlMaXN0IHVuY29uZmlndXJlZE9wdGlvbmFsRmVhdHVyZXMsCisJCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcsCisJCUlDb25maWd1cmVkU2l0ZSB0YXJnZXRTaXRlLAorCQlGZWF0dXJlSGllcmFyY2h5RWxlbWVudFtdIG9wdGlvbmFsRWxlbWVudHMsCisJCWJvb2xlYW4gaXNQYXRjaCkgeworCQlmb3IgKGludCBpID0gMDsgaSA8IG9wdGlvbmFsRWxlbWVudHMubGVuZ3RoOyBpKyspIHsKKwkJCUZlYXR1cmVIaWVyYXJjaHlFbGVtZW50W10gY2hpbGRyZW4gPQorCQkJCW9wdGlvbmFsRWxlbWVudHNbaV0uZ2V0Q2hpbGRyZW4odHJ1ZSwgaXNQYXRjaCwgY29uZmlnKTsKKwkJCWdldFVuY29uZmlndXJlZE9wdGlvbmFsRmVhdHVyZXMoCisJCQkJdW5jb25maWd1cmVkT3B0aW9uYWxGZWF0dXJlcywKKwkJCQljb25maWcsCisJCQkJdGFyZ2V0U2l0ZSwKKwkJCQljaGlsZHJlbiwKKwkJCQlpc1BhdGNoKTsKKwkJCWlmICghb3B0aW9uYWxFbGVtZW50c1tpXS5pc0VuYWJsZWQoY29uZmlnKSkgeworCQkJCXVuY29uZmlndXJlZE9wdGlvbmFsRmVhdHVyZXMuYWRkKG9wdGlvbmFsRWxlbWVudHNbaV0uZ2V0RmVhdHVyZSgpKTsKKwkJCX0KKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBjb21wdXRlRWxlbWVudHMoKSB7CisJCXRyeSB7CisJCQlJRmVhdHVyZSBvbGRGZWF0dXJlID0gam9iLmdldE9sZEZlYXR1cmUoKTsKKwkJCUlGZWF0dXJlIG5ld0ZlYXR1cmUgPSBqb2IuZ2V0RmVhdHVyZSgpOworCQkJQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisJCQlib29sZWFuIHBhdGNoID0gVXBkYXRlVXRpbHMuaXNQYXRjaChuZXdGZWF0dXJlKTsKKwkJCUZlYXR1cmVIaWVyYXJjaHlFbGVtZW50LmNvbXB1dGVFbGVtZW50cygKKwkJCQlvbGRGZWF0dXJlLAorCQkJCW5ld0ZlYXR1cmUsCisJCQkJb2xkRmVhdHVyZSAhPSBudWxsLAorCQkJCXBhdGNoLAorCQkJCVNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCksCisJCQkJbGlzdCk7CisJCQllbGVtZW50cyA9IG5ldyBGZWF0dXJlSGllcmFyY2h5RWxlbWVudFtsaXN0LnNpemUoKV07CisJCQlsaXN0LnRvQXJyYXkoZWxlbWVudHMpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgeworCQkJCWVsZW1lbnRzW2ldLnNldFJvb3QodGhpcyk7CisJCQl9CisJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJVXBkYXRlVXRpbHMubG9nRXhjZXB0aW9uKGUpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9PcGVyYXRpb24uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvT3BlcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI1MGJiMgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvT3BlcmF0aW9uLmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zOworCitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuKjsKKworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgT3BlcmF0aW9uIGltcGxlbWVudHMgSU9wZXJhdGlvbiB7CisJCisJcHJpdmF0ZSBib29sZWFuIHByb2Nlc3NlZDsKKwkKKwkKKwlwdWJsaWMgT3BlcmF0aW9uKCkgeworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBpc1Byb2Nlc3NlZCgpIHsKKwkJcmV0dXJuIHByb2Nlc3NlZDsKKwl9CisJCisJcHVibGljIHZvaWQgbWFya1Byb2Nlc3NlZCgpIHsKKwkJcHJvY2Vzc2VkID0gdHJ1ZTsKKwl9Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL09wZXJhdGlvbkZhY3RvcnkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvT3BlcmF0aW9uRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzNmYzNzYKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL09wZXJhdGlvbkZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDEwOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zOworCitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLio7CisKK3B1YmxpYyBjbGFzcyBPcGVyYXRpb25GYWN0b3J5IGltcGxlbWVudHMgSU9wZXJhdGlvbkZhY3RvcnkgeworCisJcHVibGljIE9wZXJhdGlvbkZhY3RvcnkoKSB7CisJfQorCisJcHVibGljIElDb25maWdGZWF0dXJlT3BlcmF0aW9uIGNyZWF0ZUNvbmZpZ09wZXJhdGlvbigKKwkJSUNvbmZpZ3VyZWRTaXRlIHRhcmdldFNpdGUsCisJCUlGZWF0dXJlIGZlYXR1cmUpIHsKKwkJcmV0dXJuIG5ldyBDb25maWdPcGVyYXRpb24odGFyZ2V0U2l0ZSwgZmVhdHVyZSk7CisJfQorCisJcHVibGljIElCYXRjaE9wZXJhdGlvbiBjcmVhdGVCYXRjaEluc3RhbGxPcGVyYXRpb24oSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uW10gb3BlcmF0aW9ucykgeworCQlyZXR1cm4gbmV3IEJhdGNoSW5zdGFsbE9wZXJhdGlvbihvcGVyYXRpb25zKTsKKwl9CisKKwlwdWJsaWMgSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIGNyZWF0ZUluc3RhbGxPcGVyYXRpb24oCisJCUlDb25maWd1cmVkU2l0ZSB0YXJnZXRTaXRlLAorCQlJRmVhdHVyZSBmZWF0dXJlLAorCQlJRmVhdHVyZVJlZmVyZW5jZVtdIG9wdGlvbmFsRmVhdHVyZXMsCisJCUlGZWF0dXJlW10gdW5jb25maWd1cmVkT3B0aW9uYWxGZWF0dXJlcywKKwkJSVZlcmlmaWNhdGlvbkxpc3RlbmVyIHZlcmlmaWVyKSB7CisJCXJldHVybiBuZXcgSW5zdGFsbE9wZXJhdGlvbigKKwkJCXRhcmdldFNpdGUsCisJCQlmZWF0dXJlLAorCQkJb3B0aW9uYWxGZWF0dXJlcywKKwkJCXVuY29uZmlndXJlZE9wdGlvbmFsRmVhdHVyZXMsCisJCQl2ZXJpZmllcik7CisJfQorCisJcHVibGljIElVbmNvbmZpZ0ZlYXR1cmVPcGVyYXRpb24gY3JlYXRlVW5jb25maWdPcGVyYXRpb24oCisJCUlDb25maWd1cmVkU2l0ZSB0YXJnZXRTaXRlLAorCQlJRmVhdHVyZSBmZWF0dXJlKSB7CisJCXJldHVybiBuZXcgVW5jb25maWdPcGVyYXRpb24odGFyZ2V0U2l0ZSwgZmVhdHVyZSk7CisJfQorCisJcHVibGljIElDb25maWdGZWF0dXJlT3BlcmF0aW9uIGNyZWF0ZVJlcGxhY2VGZWF0dXJlVmVyc2lvbk9wZXJhdGlvbigKKwkJSUZlYXR1cmUgZmVhdHVyZSwKKwkJSUZlYXR1cmUgYW5vdGhlckZlYXR1cmUpIHsKKwkKKwkJcmV0dXJuIG5ldyBSZXBsYWNlRmVhdHVyZVZlcnNpb25PcGVyYXRpb24oZmVhdHVyZSwgYW5vdGhlckZlYXR1cmUpOwkJCisJfQorCQkKKwlwdWJsaWMgSVVuaW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gY3JlYXRlVW5pbnN0YWxsT3BlcmF0aW9uKAorCQlJQ29uZmlndXJlZFNpdGUgdGFyZ2V0U2l0ZSwKKwkJSUZlYXR1cmUgZmVhdHVyZSkgeworCQlyZXR1cm4gbmV3IFVuaW5zdGFsbE9wZXJhdGlvbih0YXJnZXRTaXRlLCBmZWF0dXJlKTsKKwl9CisKKwlwdWJsaWMgSVJldmVydENvbmZpZ3VyYXRpb25PcGVyYXRpb24gY3JlYXRlUmV2ZXJ0Q29uZmlndXJhdGlvbk9wZXJhdGlvbigKKwkJSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZywKKwkJSVByb2JsZW1IYW5kbGVyIHByb2JsZW1IYW5kbGVyKSB7CisJCXJldHVybiBuZXcgUmV2ZXJ0Q29uZmlndXJhdGlvbk9wZXJhdGlvbigKKwkJCWNvbmZpZywKKwkJCXByb2JsZW1IYW5kbGVyKTsKKwl9CisKKwlwdWJsaWMgSVRvZ2dsZVNpdGVPcGVyYXRpb24gY3JlYXRlVG9nZ2xlU2l0ZU9wZXJhdGlvbigKKwkJSUNvbmZpZ3VyZWRTaXRlIHNpdGUpIHsKKwkJcmV0dXJuIG5ldyBUb2dnbGVTaXRlT3BlcmF0aW9uKHNpdGUpOworCX0KKwkKKwlwdWJsaWMgSVVuY29uZmlndXJlQW5kVW5pbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiBjcmVhdGVVbmNvbmZpZ3VyZUFuZFVuaW5zdGFsbEZlYXR1cmVPcGVyYXRpb24oCisJCQlJQ29uZmlndXJlZFNpdGUgdGFyZ2V0U2l0ZSwKKwkJCUlGZWF0dXJlIGZlYXR1cmUpIHsKKwkJCXJldHVybiBuZXcgVW5jb25maWd1cmVBbmRVbmluc3RhbGxGZWF0dXJlT3BlcmF0aW9uKHRhcmdldFNpdGUsIGZlYXR1cmUpOworCX0KKwkKKwlwdWJsaWMgSVVuY29uZmlndXJlRmVhdHVyZXNPcGVyYXRpb24gY3JlYXRlVW5jb25maWd1cmVGZWF0dXJlc09wZXJhdGlvbiAoCisJCQlJQ29uZmlndXJlZFNpdGVbXSB0YXJnZXRTaXRlcywKKwkJCUlGZWF0dXJlW10gZmVhdHVyZXMpIHsKKwkJCXJldHVybiBuZXcgVW5jb25maWd1cmVGZWF0dXJlc09wZXJhdGlvbih0YXJnZXRTaXRlcywgZmVhdHVyZXMpOworCQl9CisKKwlwdWJsaWMgSUNvbmZpZ3VyZUZlYXR1cmVzT3BlcmF0aW9uIGNyZWF0ZUNvbmZpZ3VyZUZlYXR1cmVzT3BlcmF0aW9uKAorCQkJSUNvbmZpZ3VyZWRTaXRlW10gdGFyZ2V0U2l0ZXMsCisJCQlJRmVhdHVyZVtdIGZlYXR1cmVzKSB7CisJCQorCQkJcmV0dXJuIG5ldyBDb25maWd1cmVGZWF0dXJlc09wZXJhdGlvbih0YXJnZXRTaXRlcywgZmVhdHVyZXMpOwkJCisJfQorCQkJCisJcHVibGljIElVbmluc3RhbGxGZWF0dXJlc09wZXJhdGlvbiBjcmVhdGVVbmluc3RhbGxGZWF0dXJlc09wZXJhdGlvbigKKwkJCUlDb25maWd1cmVkU2l0ZVtdIHRhcmdldFNpdGVzLAorCQkJSUZlYXR1cmVbXSBmZWF0dXJlcykgeworCQkJcmV0dXJuIG5ldyBVbmluc3RhbGxGZWF0dXJlc09wZXJhdGlvbih0YXJnZXRTaXRlcywgZmVhdHVyZXMpOworCX0KKwkKKwlwdWJsaWMgSVVuY29uZmlndXJlQW5kVW5pbnN0YWxsRmVhdHVyZXNPcGVyYXRpb24gY3JlYXRlVW5jb25maWd1cmVBbmRVbmluc3RhbGxGZWF0dXJlc09wZXJhdGlvbigKKwkJCUlDb25maWd1cmVkU2l0ZVtdIHRhcmdldFNpdGVzLAorCQkJSUZlYXR1cmVbXSBmZWF0dXJlcykgeworCQkJcmV0dXJuIG5ldyBVbmNvbmZpZ3VyZUFuZFVuaW5zdGFsbEZlYXR1cmVzT3BlcmF0aW9uKHRhcmdldFNpdGVzLCBmZWF0dXJlcyk7CisJfQorfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9PcGVyYXRpb25WYWxpZGF0b3IuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvT3BlcmF0aW9uVmFsaWRhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNhZjI1YgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvT3BlcmF0aW9uVmFsaWRhdG9yLmphdmEKQEAgLTAsMCArMSwxMzk3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm9wZXJhdGlvbnM7CisKKy8vaW1wb3J0IGphdmEuaW8uKjsKKy8vaW1wb3J0IGphdmEubmV0Lio7CisvL2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklVcGRhdGVDb25zdGFudHM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuUGxhdGZvcm1BZG1pbjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLm5ldC5VUkxDb25uZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci4qOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLkNvbmZpZ3VyYXRvclV0aWxzOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IuSVBsYXRmb3JtQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb25maWd1cmF0b3IuUGxhdGZvcm1Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLk1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLlVwZGF0ZUNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLklPcGVyYXRpb25WYWxpZGF0b3I7CitpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLio7CisKKy8qKgorICogIAorICovCitwdWJsaWMgY2xhc3MgT3BlcmF0aW9uVmFsaWRhdG9yIGltcGxlbWVudHMgSU9wZXJhdGlvblZhbGlkYXRvciB7CisJLyoqCisJICogQ2hlY2tzIGlmIHRoZSBwbGF0Zm9ybSBjb25maWd1cmF0aW9uIGhhcyBiZWVuIG1vZGlmaWVkIG91dHNpZGUgdGhpcyBwcm9ncmFtLgorCSAqIEByZXR1cm4gdGhlIGVycm9yIHN0YXR1cywgb3IgbnVsbCBpZiBubyBlcnJvcnMKKwkgKi8KKwlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZVBsYXRmb3JtQ29uZmlnVmFsaWQoKSB7CisJCUFycmF5TGlzdCBzdGF0dXMgPSBuZXcgQXJyYXlMaXN0KDEpOworCQljaGVja1BsYXRmb3JtV2FzTW9kaWZpZWQoc3RhdHVzKTsKKwkJCisJCS8vIHJlcG9ydCBzdGF0dXMKKwkJaWYgKHN0YXR1cy5zaXplKCkgPiAwKQorCQkJcmV0dXJuIGNyZWF0ZU11bHRpU3RhdHVzKE1lc3NhZ2VzLkFjdGl2aXR5Q29uc3RyYWludHNfcm9vdE1lc3NhZ2UsIHN0YXR1cywgSVN0YXR1cy5FUlJPUik7CisJCXJldHVybiBudWxsOworCX0KKwkKKwkvKgorCSAqIENhbGxlZCBieSBVSSBiZWZvcmUgcGVyZm9ybWluZyBvcGVyYXRpb24uIFJldHVybnMgbnVsbCBpZiBubyBlcnJvcnMsIGEKKwkgKiBzdGF0dXMgd2l0aCBJU3RhdHVzLldBUk5JTkcgY29kZSB3aGVuIHRoZSBpbml0aWFsIGNvbmZpZ3VyYXRpb24gaXMKKwkgKiBicm9rZW4sIG9yIGEgc3RhdHVzIHdpdGggSVN0YXR1cy5FUlJPUiB3aGVuIHRoZXJlIHRoZSBvcGVyYXRpb24KKwkgKiBpbnRyb2R1Y2VzIG5ldyBlcnJvcnMKKwkgKi8KKwlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZVBlbmRpbmdJbnN0YWxsKAorCQlJRmVhdHVyZSBvbGRGZWF0dXJlLAorCQlJRmVhdHVyZSBuZXdGZWF0dXJlKSB7CisJCS8vIGNoZWNrIGluaXRpYWwgc3RhdGUKKwkJQXJyYXlMaXN0IGJlZm9yZVN0YXR1cyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJdmFsaWRhdGVJbml0aWFsU3RhdGUoYmVmb3JlU3RhdHVzKTsKKworCQkvLyBjaGVjayBwcm9wb3NlZCBjaGFuZ2UKKwkJQXJyYXlMaXN0IHN0YXR1cyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJY2hlY2tQbGF0Zm9ybVdhc01vZGlmaWVkKHN0YXR1cyk7CisJCXZhbGlkYXRlSW5zdGFsbChvbGRGZWF0dXJlLCBuZXdGZWF0dXJlLCBzdGF0dXMpOworCisJCS8vIHJlcG9ydCBzdGF0dXMKKwkJcmV0dXJuIGNyZWF0ZUNvbWJpbmVkUmVwb3J0U3RhdHVzKGJlZm9yZVN0YXR1cywgc3RhdHVzKTsKKwl9CisKKwkvKgorCSAqIENhbGxlZCBieSBVSSBiZWZvcmUgcGVyZm9ybWluZyBvcGVyYXRpb24KKwkgKi8KKwlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZVBlbmRpbmdVbmNvbmZpZyhJRmVhdHVyZSBmZWF0dXJlKSB7CisJCS8vIGNoZWNrIGluaXRpYWwgc3RhdGUKKwkJQXJyYXlMaXN0IGJlZm9yZVN0YXR1cyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJdmFsaWRhdGVJbml0aWFsU3RhdGUoYmVmb3JlU3RhdHVzKTsKKworCQkvLyBjaGVjayBwcm9wb3NlZCBjaGFuZ2UKKwkJQXJyYXlMaXN0IHN0YXR1cyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJY2hlY2tQbGF0Zm9ybVdhc01vZGlmaWVkKHN0YXR1cyk7CisJCXZhbGlkYXRlVW5jb25maWd1cmUoZmVhdHVyZSwgc3RhdHVzKTsKKworCQkvLyByZXBvcnQgc3RhdHVzCisJCXJldHVybiBjcmVhdGVDb21iaW5lZFJlcG9ydFN0YXR1cyhiZWZvcmVTdGF0dXMsIHN0YXR1cyk7CisJfQorCisJLyoKKwkgKiBDYWxsZWQgYnkgVUkgYmVmb3JlIHBlcmZvcm1pbmcgb3BlcmF0aW9uCisJICovCisJcHVibGljIElTdGF0dXMgdmFsaWRhdGVQZW5kaW5nQ29uZmlnKElGZWF0dXJlIGZlYXR1cmUpIHsKKwkJLy8gY2hlY2sgaW5pdGlhbCBzdGF0ZQorCQlBcnJheUxpc3QgYmVmb3JlU3RhdHVzID0gbmV3IEFycmF5TGlzdCgpOworCQl2YWxpZGF0ZUluaXRpYWxTdGF0ZShiZWZvcmVTdGF0dXMpOworCisJCS8vIGNoZWNrIHByb3Bvc2VkIGNoYW5nZQorCQlBcnJheUxpc3Qgc3RhdHVzID0gbmV3IEFycmF5TGlzdCgpOworCQljaGVja1BsYXRmb3JtV2FzTW9kaWZpZWQoc3RhdHVzKTsKKwkJdmFsaWRhdGVDb25maWd1cmUoZmVhdHVyZSwgc3RhdHVzKTsKKworCQkvLyByZXBvcnQgc3RhdHVzCisJCXJldHVybiBjcmVhdGVDb21iaW5lZFJlcG9ydFN0YXR1cyhiZWZvcmVTdGF0dXMsIHN0YXR1cyk7CisJfQorCisJLyoqCisJICogQ2FsbGVkIGJlZm9yZSBwZXJmb3JtaW5nIG9wZXJhdGlvbi4KKwkgKi8KKwlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZVBlbmRpbmdSZXBsYWNlVmVyc2lvbigKKwkJSUZlYXR1cmUgZmVhdHVyZSwKKwkJSUZlYXR1cmUgYW5vdGhlckZlYXR1cmUpIHsKKwkJLy8gY2hlY2sgaW5pdGlhbCBzdGF0ZQorCQlBcnJheUxpc3QgYmVmb3JlU3RhdHVzID0gbmV3IEFycmF5TGlzdCgpOworCQl2YWxpZGF0ZUluaXRpYWxTdGF0ZShiZWZvcmVTdGF0dXMpOworCisJCS8vIGNoZWNrIHByb3Bvc2VkIGNoYW5nZQorCQlBcnJheUxpc3Qgc3RhdHVzID0gbmV3IEFycmF5TGlzdCgpOworCQljaGVja1BsYXRmb3JtV2FzTW9kaWZpZWQoc3RhdHVzKTsKKwkJdmFsaWRhdGVSZXBsYWNlVmVyc2lvbihmZWF0dXJlLCBhbm90aGVyRmVhdHVyZSwgc3RhdHVzKTsKKworCQkvLyByZXBvcnQgc3RhdHVzCisJCXJldHVybiBjcmVhdGVDb21iaW5lZFJlcG9ydFN0YXR1cyhiZWZvcmVTdGF0dXMsIHN0YXR1cyk7CisJfQorCisKKwkvKgorCSAqIENhbGxlZCBieSB0aGUgVUkgYmVmb3JlIGRvaW5nIGEgcmV2ZXJ0LyByZXN0b3JlIG9wZXJhdGlvbgorCSAqLworCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlUGVuZGluZ1JldmVydChJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnKSB7CisJCS8vIGNoZWNrIGluaXRpYWwgc3RhdGUKKwkJQXJyYXlMaXN0IGJlZm9yZVN0YXR1cyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJdmFsaWRhdGVJbml0aWFsU3RhdGUoYmVmb3JlU3RhdHVzKTsKKworCQkvLyBjaGVjayBwcm9wb3NlZCBjaGFuZ2UKKwkJQXJyYXlMaXN0IHN0YXR1cyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJY2hlY2tQbGF0Zm9ybVdhc01vZGlmaWVkKHN0YXR1cyk7CisJCXZhbGlkYXRlUmV2ZXJ0KGNvbmZpZywgc3RhdHVzKTsKKworCQkvLyByZXBvcnQgc3RhdHVzCisJCXJldHVybiBjcmVhdGVDb21iaW5lZFJlcG9ydFN0YXR1cyhiZWZvcmVTdGF0dXMsIHN0YXR1cyk7CisJfQorCisJLyoKKwkgKiBDYWxsZWQgYnkgdGhlIFVJIGJlZm9yZSBkb2luZyBhIGJhdGNoZWQgcHJvY2Vzc2luZyBvZiBzZXZlcmFsIHBlbmRpbmcKKwkgKiBjaGFuZ2VzLgorCSAqLworCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlUGVuZGluZ0NoYW5nZXMoSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uW10gam9icykgeworCQkvLyBjaGVjayBpbml0aWFsIHN0YXRlCisJCUFycmF5TGlzdCBiZWZvcmVTdGF0dXMgPSBuZXcgQXJyYXlMaXN0KCk7CisJCXZhbGlkYXRlSW5pdGlhbFN0YXRlKGJlZm9yZVN0YXR1cyk7CisJCWNoZWNrUGxhdGZvcm1XYXNNb2RpZmllZChiZWZvcmVTdGF0dXMpOworCisJCS8vIGNoZWNrIHByb3Bvc2VkIGNoYW5nZQorCQlBcnJheUxpc3Qgc3RhdHVzID0gbmV3IEFycmF5TGlzdCgpOworCQl2YWxpZGF0ZVBlbmRpbmdDaGFuZ2VzKGpvYnMsIHN0YXR1cywgYmVmb3JlU3RhdHVzKTsKKworCQkvLyByZXBvcnQgc3RhdHVzCisJCXJldHVybiBjcmVhdGVDb21iaW5lZFJlcG9ydFN0YXR1cyhiZWZvcmVTdGF0dXMsIHN0YXR1cyk7CisJfQorCQorCS8qCisJICogQ2FsbGVkIGJ5IHRoZSBVSSBiZWZvcmUgZG9pbmcgYSBiYXRjaGVkIHByb2Nlc3Npbmcgb2Ygc2V2ZXJhbCBwZW5kaW5nCisJICogY2hhbmdlcy4KKwkgKi8KKwlwdWJsaWMgUmVxdWlyZWRGZWF0dXJlc1Jlc3VsdCBnZXRSZXF1aXJlZEZlYXR1cmVzKElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbltdIGpvYnMpIHsKKwkJCisJCVJlcXVpcmVkRmVhdHVyZXNSZXN1bHQgcmVxdWlyZWRGZWF0dXJlc1Jlc3VsdCA9IG5ldyBSZXF1aXJlZEZlYXR1cmVzUmVzdWx0KCk7CisJCS8vIGNoZWNrIGluaXRpYWwgc3RhdGUKKwkJQXJyYXlMaXN0IGJlZm9yZVN0YXR1cyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJdmFsaWRhdGVJbml0aWFsU3RhdGUoYmVmb3JlU3RhdHVzKTsKKwkJY2hlY2tQbGF0Zm9ybVdhc01vZGlmaWVkKGJlZm9yZVN0YXR1cyk7CisKKwkJLy8gY2hlY2sgcHJvcG9zZWQgY2hhbmdlCisJCUFycmF5TGlzdCBzdGF0dXMgPSBuZXcgQXJyYXlMaXN0KCk7CisJCVNldCByZXF1aXJlZEZlYXR1cmVzID0gdmFsaWRhdGVQZW5kaW5nQ2hhbmdlcyhqb2JzLCBzdGF0dXMsIGJlZm9yZVN0YXR1cyk7CisKKwkJLy8gcmVwb3J0IHN0YXR1cworCQkvL3JldHVybiBjcmVhdGVDb21iaW5lZFJlcG9ydFN0YXR1cyhiZWZvcmVTdGF0dXMsIHN0YXR1cyk7CisJCXJlcXVpcmVkRmVhdHVyZXNSZXN1bHQuc2V0UmVxdWlyZWRGZWF0dXJlcyhyZXF1aXJlZEZlYXR1cmVzKTsKKwkJcmVxdWlyZWRGZWF0dXJlc1Jlc3VsdC5zZXRTdGF0dXMoY3JlYXRlQ29tYmluZWRSZXBvcnRTdGF0dXMoYmVmb3JlU3RhdHVzLCBzdGF0dXMpKTsKKwkJcmV0dXJuIHJlcXVpcmVkRmVhdHVyZXNSZXN1bHQ7CisJfQorCisJLyoKKwkgKiBDaGVjayB0aGUgY3VycmVudCBzdGF0ZS4KKwkgKi8KKwlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZUN1cnJlbnRTdGF0ZSgpIHsKKwkJLy8gY2hlY2sgdGhlIHN0YXRlCisJCUFycmF5TGlzdCBzdGF0dXMgPSBuZXcgQXJyYXlMaXN0KCk7CisJCWNoZWNrUGxhdGZvcm1XYXNNb2RpZmllZChzdGF0dXMpOworCQl2YWxpZGF0ZUluaXRpYWxTdGF0ZShzdGF0dXMpOworCisJCS8vIHJlcG9ydCBzdGF0dXMKKwkJaWYgKHN0YXR1cy5zaXplKCkgPiAwKQorCQkJcmV0dXJuIGNyZWF0ZU11bHRpU3RhdHVzKE1lc3NhZ2VzLkFjdGl2aXR5Q29uc3RyYWludHNfcm9vdE1lc3NhZ2UsIHN0YXR1cywgSVN0YXR1cy5FUlJPUik7CisJCXJldHVybiBudWxsOworCX0KKworCS8qCisJICogQ2hlY2sgdG8gc2VlIGlmIHdlIGFyZSBub3QgYnJva2VuIGV2ZW4gYmVmb3JlIHdlIHN0YXJ0CisJICovCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCB2YWxpZGF0ZUluaXRpYWxTdGF0ZShBcnJheUxpc3Qgc3RhdHVzKSB7CisJCXRyeSB7CisJCQlBcnJheUxpc3QgZmVhdHVyZXMgPSBjb21wdXRlRmVhdHVyZXMoKTsKKwkJCS8vIHVuY29tbWVudCB0aGlzIHdoZW4gcGF0Y2ggcmVsZWFzZWQgaW4gYm9vdAorCQkJLy9jaGVja0NvbmZpZ3VyYXRpb25Mb2NrKHN0YXR1cyk7CisJCQljaGVja0NvbnN0cmFpbnRzKGZlYXR1cmVzLCBzdGF0dXMpOworCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCXN0YXR1cy5hZGQoZS5nZXRTdGF0dXMoKSk7CisJCX0KKwl9CisKKwkvKgorCSAqIGhhbmRsZSB1bmNvbmZpZ3VyZQorCSAqLworCXByaXZhdGUgc3RhdGljIHZvaWQgdmFsaWRhdGVVbmNvbmZpZ3VyZSgKKwkJSUZlYXR1cmUgZmVhdHVyZSwKKwkJQXJyYXlMaXN0IHN0YXR1cykgeworCQl0cnkgeworCQkJY2hlY2tTaXRlUmVhZE9ubHkoZmVhdHVyZSxzdGF0dXMpOworCQkJQXJyYXlMaXN0IGZlYXR1cmVzID0gY29tcHV0ZUZlYXR1cmVzKCk7CisJCQlmZWF0dXJlcyA9IGNvbXB1dGVGZWF0dXJlc0FmdGVyT3BlcmF0aW9uKGZlYXR1cmVzLCBudWxsLCBmZWF0dXJlKTsKKwkJCWNoZWNrQ29uc3RyYWludHMoZmVhdHVyZXMsIHN0YXR1cyk7CisJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJc3RhdHVzLmFkZChlLmdldFN0YXR1cygpKTsKKwkJfQorCX0KKworCisJLyoKKwkgKiBoYW5kbGUgY29uZmlndXJlCisJICovCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCB2YWxpZGF0ZUNvbmZpZ3VyZShJRmVhdHVyZSBmZWF0dXJlLCBBcnJheUxpc3Qgc3RhdHVzKSB7CisJCXRyeSB7CisJCQljaGVja1NpdGVSZWFkT25seShmZWF0dXJlLHN0YXR1cyk7CisJCQlBcnJheUxpc3QgZmVhdHVyZXMgPSBjb21wdXRlRmVhdHVyZXMoKTsKKwkJCWNoZWNrT3B0aW9uYWxDaGlsZENvbmZpZ3VyaW5nKGZlYXR1cmUsIHN0YXR1cyk7CisJCQljaGVja0ZvckN5Y2xlcyhmZWF0dXJlLCBudWxsLCBmZWF0dXJlcyk7CisJCQlmZWF0dXJlcyA9IGNvbXB1dGVGZWF0dXJlc0FmdGVyT3BlcmF0aW9uKGZlYXR1cmVzLCBmZWF0dXJlLCBudWxsKTsKKwkJCWNoZWNrQ29uc3RyYWludHMoZmVhdHVyZXMsIHN0YXR1cyk7CisKKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQlzdGF0dXMuYWRkKGUuZ2V0U3RhdHVzKCkpOworCQl9CisJfQorCisJLyoKKwkgKiBoYW5kbGUgcmVwbGFjZSB2ZXJzaW9uCisJICovCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCB2YWxpZGF0ZVJlcGxhY2VWZXJzaW9uKAorCQlJRmVhdHVyZSBmZWF0dXJlLAorCQlJRmVhdHVyZSBhbm90aGVyRmVhdHVyZSwKKwkJQXJyYXlMaXN0IHN0YXR1cykgeworCQl0cnkgeworCQkJY2hlY2tTaXRlUmVhZE9ubHkoZmVhdHVyZSxzdGF0dXMpOworCQkJQXJyYXlMaXN0IGZlYXR1cmVzID0gY29tcHV0ZUZlYXR1cmVzKCk7CisJCQljaGVja0ZvckN5Y2xlcyhmZWF0dXJlLCBudWxsLCBmZWF0dXJlcyk7CisJCQlmZWF0dXJlcyA9CisJCQkJY29tcHV0ZUZlYXR1cmVzQWZ0ZXJPcGVyYXRpb24oCisJCQkJCWZlYXR1cmVzLAorCQkJCQlhbm90aGVyRmVhdHVyZSwKKwkJCQkJZmVhdHVyZSk7CisJCQljaGVja0NvbnN0cmFpbnRzKGZlYXR1cmVzLCBzdGF0dXMpOworCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCXN0YXR1cy5hZGQoZS5nZXRTdGF0dXMoKSk7CisJCX0KKwl9CisKKwkvKgorCSAqIGhhbmRsZSBpbnN0YWxsIGFuZCB1cGRhdGUKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyB2b2lkIHZhbGlkYXRlSW5zdGFsbCgKKwkJSUZlYXR1cmUgb2xkRmVhdHVyZSwKKwkJSUZlYXR1cmUgbmV3RmVhdHVyZSwKKwkJQXJyYXlMaXN0IHN0YXR1cykgeworCQl0cnkgeworCQkJY2hlY2tTaXRlUmVhZE9ubHkob2xkRmVhdHVyZSxzdGF0dXMpOworCQkJQXJyYXlMaXN0IGZlYXR1cmVzID0gY29tcHV0ZUZlYXR1cmVzKCk7CisJCQljaGVja0ZvckN5Y2xlcyhuZXdGZWF0dXJlLCBudWxsLCBmZWF0dXJlcyk7CisJCQlmZWF0dXJlcyA9CisJCQkJY29tcHV0ZUZlYXR1cmVzQWZ0ZXJPcGVyYXRpb24oZmVhdHVyZXMsIG5ld0ZlYXR1cmUsIG9sZEZlYXR1cmUpOworCQkJY2hlY2tDb25zdHJhaW50cyhmZWF0dXJlcywgc3RhdHVzKTsKKwkJCWNoZWNrTGljZW5zZShuZXdGZWF0dXJlLCBzdGF0dXMpOworCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCXN0YXR1cy5hZGQoZS5nZXRTdGF0dXMoKSk7CisJCX0KKwl9CisKKwkvKgorCSAqIGhhbmRsZSByZXZlcnQgYW5kIHJlc3RvcmUKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyB2b2lkIHZhbGlkYXRlUmV2ZXJ0KAorCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnLAorCQlBcnJheUxpc3Qgc3RhdHVzKSB7CisJCXRyeSB7CisvLwkJCS8vIGNoZWNrIHRoZSB0aW1lbGluZSBhbmQgZG9uJ3QgYm90aGVyCisvLwkJCS8vIHRvIGNoZWNrIGFueXRoaW5nIGVsc2UgaWYgbmVnYXRpdmUKKy8vCQkJaWYgKCFjaGVja1RpbWVsaW5lKGNvbmZpZywgc3RhdHVzKSkKKy8vCQkJCXJldHVybjsKKwkJCUFycmF5TGlzdCBmZWF0dXJlcyA9IGNvbXB1dGVGZWF0dXJlc0FmdGVyUmV2ZXJ0KGNvbmZpZyk7CisJCQljaGVja0NvbnN0cmFpbnRzKGZlYXR1cmVzLCBzdGF0dXMpOworCQkJY2hlY2tSZXZlcnRDb25zdHJhaW50cyhmZWF0dXJlcywgc3RhdHVzKTsKKworCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCXN0YXR1cy5hZGQoZS5nZXRTdGF0dXMoKSk7CisJCX0KKwl9CisKKworCS8qCisJICogSGFuZGxlIG9uZS1jbGljayBjaGFuZ2VzIGFzIGEgYmF0Y2gKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBTZXQgdmFsaWRhdGVQZW5kaW5nQ2hhbmdlcygKKwkJSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uW10gam9icywKKwkJQXJyYXlMaXN0IHN0YXR1cywKKwkJQXJyYXlMaXN0IGJlZm9yZVN0YXR1cykgeworCQl0cnkgeworCQkJQXJyYXlMaXN0IGZlYXR1cmVzID0gY29tcHV0ZUZlYXR1cmVzKCk7CisJCQlBcnJheUxpc3Qgc2F2ZWRGZWF0dXJlcyA9IGZlYXR1cmVzOworCQkJaW50IG5leGNsdXNpdmVzID0gMDsKKworCQkJLy8gcGFzcyAxOiBzZWUgaWYgd2UgY2FuIHByb2Nlc3MgdGhlIGVudGlyZSAiYmF0Y2giCisJCQlBcnJheUxpc3QgdG1wU3RhdHVzID0gbmV3IEFycmF5TGlzdCgpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBqb2JzLmxlbmd0aDsgaSsrKSB7CisJCQkJSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIGpvYiA9IGpvYnNbaV07CisKKwkJCQlJRmVhdHVyZSBuZXdGZWF0dXJlID0gam9iLmdldEZlYXR1cmUoKTsKKwkJCQlJRmVhdHVyZSBvbGRGZWF0dXJlID0gam9iLmdldE9sZEZlYXR1cmUoKTsKKwkJCQljaGVja0xpY2Vuc2UobmV3RmVhdHVyZSwgc3RhdHVzKTsKKwkJCQlpZiAoam9icy5sZW5ndGggPiAxICYmIG5ld0ZlYXR1cmUuaXNFeGNsdXNpdmUoKSkgeworCQkJCQluZXhjbHVzaXZlcysrOworCQkJCQlzdGF0dXMuYWRkKAorCQkJCQkJY3JlYXRlU3RhdHVzKAorCQkJCQkJCW5ld0ZlYXR1cmUsCisJCQkJCQkJRmVhdHVyZVN0YXR1cy5DT0RFX0VYQ0xVU0lWRSwKKwkJCQkJCQlNZXNzYWdlcy5BY3Rpdml0eUNvbnN0cmFpbnRzX2V4Y2x1c2l2ZSkpOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJY2hlY2tGb3JDeWNsZXMobmV3RmVhdHVyZSwgbnVsbCwgZmVhdHVyZXMpOworCQkJCWZlYXR1cmVzID0KKwkJCQkJY29tcHV0ZUZlYXR1cmVzQWZ0ZXJPcGVyYXRpb24oCisJCQkJCQlmZWF0dXJlcywKKwkJCQkJCW5ld0ZlYXR1cmUsCisJCQkJCQlvbGRGZWF0dXJlKTsKKwkJCX0KKwkJCWlmIChuZXhjbHVzaXZlcyA+IDApCisJCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX1NFVDsKKwkJCWNoZWNrQ29uc3RyYWludHMoZmVhdHVyZXMsIHRtcFN0YXR1cyk7CisJCQlpZiAodG1wU3RhdHVzLnNpemUoKSA9PSAwKSAvLyB0aGUgd2hvbGUgImJhdGNoIiBpcyBPSworCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9TRVQ7CisKKwkJCS8vIHBhc3MgMjogd2UgaGF2ZSBjb25mbGljdHMKKwkJCWZlYXR1cmVzID0gc2F2ZWRGZWF0dXJlczsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgam9icy5sZW5ndGg7IGkrKykgeworCQkJCUlJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiBqb2IgPSBqb2JzW2ldOworCQkJCUlGZWF0dXJlIG5ld0ZlYXR1cmUgPSBqb2IuZ2V0RmVhdHVyZSgpOworCQkJCUlGZWF0dXJlIG9sZEZlYXR1cmUgPSBqb2IuZ2V0T2xkRmVhdHVyZSgpOworCisJCQkJZmVhdHVyZXMgPQorCQkJCQljb21wdXRlRmVhdHVyZXNBZnRlck9wZXJhdGlvbigKKwkJCQkJCWZlYXR1cmVzLAorCQkJCQkJbmV3RmVhdHVyZSwKKwkJCQkJCW9sZEZlYXR1cmUpOworCisJCQkJU2V0IHJlc3VsdCA9IGNoZWNrQ29uc3RyYWludHMoZmVhdHVyZXMsIHN0YXR1cyk7CisJCQkJaWYgKHN0YXR1cy5zaXplKCkgPiAwCisJCQkJCSYmICFpc0JldHRlclN0YXR1cyhiZWZvcmVTdGF0dXMsIHN0YXR1cykpIHsKKy8vIGJ1ZyA3NTYxMworLy8JCQkJCUlTdGF0dXMgY29uZmxpY3QgPQorLy8JCQkJCQljcmVhdGVTdGF0dXMoCisvLwkJCQkJCQluZXdGZWF0dXJlLAorLy8JCQkJCQkJRmVhdHVyZVN0YXR1cy5DT0RFX09USEVSLAorLy8JCQkJCQkJUG9saWN5LmJpbmQoS0VZX0NPTkZMSUNUKSk7CisvLwkJCQkJc3RhdHVzLmFkZCgwLCBjb25mbGljdCk7CisJCQkJCXJldHVybiByZXN1bHQ7CisJCQkJfQorCQkJfQorCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCXN0YXR1cy5hZGQoZS5nZXRTdGF0dXMoKSk7CisJCX0KKwkJCisJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9TRVQ7CisJfQorCQorCXByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tQbGF0Zm9ybVdhc01vZGlmaWVkKEFycmF5TGlzdCBzdGF0dXMpIHsKKwkJdHJ5IHsKKwkJCS8vIGNoZWNrcyBpZiB0aGUgcGxhdGZvcm0gaGFzIGJlZW4gbW9kaWZpZWQgb3V0c2lkZSB0aGlzIGVjbGlwc2UgaW5zdGFuY2UKKwkJCUlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24gcGxhdGZvcm1Db25maWcgPSBDb25maWd1cmF0b3JVdGlscy5nZXRDdXJyZW50UGxhdGZvcm1Db25maWd1cmF0aW9uKCk7CisJCQkKKwkJCWxvbmcgY3VycmVudFRpbWVTdGFtcCA9IHBsYXRmb3JtQ29uZmlnLmdldENoYW5nZVN0YW1wKCk7CisJCQkvLyBnZXQgdGhlIGxhc3QgbW9kaWZpZWQgdmFsdWUgZm9yIHRoaXMgY29uZmlnLCBmcm9tIHRoaXMgcHJvY2VzcyBwb2ludCBvZiB2aWV3CisJCQlpZiAocGxhdGZvcm1Db25maWcgaW5zdGFuY2VvZiBQbGF0Zm9ybUNvbmZpZ3VyYXRpb24pIAorCQkJCWN1cnJlbnRUaW1lU3RhbXAgPSAoKFBsYXRmb3JtQ29uZmlndXJhdGlvbilwbGF0Zm9ybUNvbmZpZykuZ2V0Q29uZmlndXJhdGlvbigpLmxhc3RNb2RpZmllZCgpOworCQkJCQorCQkJLy8gZ2V0IHRoZSByZWFsIGxhc3QgbW9kaWZpZWQgdmFsdWUKKwkJCVVSTCBwbGF0Zm9ybVhNTCA9IHBsYXRmb3JtQ29uZmlnLmdldENvbmZpZ3VyYXRpb25Mb2NhdGlvbigpOworCQkJbG9uZyBhY3R1YWxUaW1lU3RhbXAgPSBjdXJyZW50VGltZVN0YW1wOworCQkJaWYgKCJmaWxlIi5lcXVhbHMocGxhdGZvcm1YTUwuZ2V0UHJvdG9jb2woKSkpIC8vJE5PTi1OTFMtMSQKKwkJCQlhY3R1YWxUaW1lU3RhbXAgPSBuZXcgRmlsZShwbGF0Zm9ybVhNTC5nZXRGaWxlKCkpLmxhc3RNb2RpZmllZCgpOworCQkJZWxzZSB7CisJCQkJVVJMQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gcGxhdGZvcm1YTUwub3BlbkNvbm5lY3Rpb24oKTsKKwkJCQlhY3R1YWxUaW1lU3RhbXAgPSBjb25uZWN0aW9uLmdldExhc3RNb2RpZmllZCgpOworCQkJfQorCQkJaWYgKGN1cnJlbnRUaW1lU3RhbXAgIT0gYWN0dWFsVGltZVN0YW1wKQorCQkJCXN0YXR1cy5hZGQoY3JlYXRlU3RhdHVzKAorCQkJCQkJCQludWxsLAorCQkJCQkJCQlGZWF0dXJlU3RhdHVzLkNPREVfT1RIRVIsCisJCQkJCQkJCU1lc3NhZ2VzLkFjdGl2aXR5Q29uc3RyYWludHNfcGxhdGZvcm1Nb2RpZmllZCkpOyAKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJLy8gaWdub3JlCisJCX0KKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja1NpdGVSZWFkT25seShJRmVhdHVyZSBmZWF0dXJlLCBBcnJheUxpc3Qgc3RhdHVzKSB7CisJCWlmKGZlYXR1cmUgPT0gbnVsbCl7CisJCQlyZXR1cm47CisJCX0KKwkJSUNvbmZpZ3VyZWRTaXRlIGNzaXRlID0gZmVhdHVyZS5nZXRTaXRlKCkuZ2V0Q3VycmVudENvbmZpZ3VyZWRTaXRlKCk7CisJCWlmIChjc2l0ZSAhPSBudWxsICYmICFjc2l0ZS5pc1VwZGF0YWJsZSgpKQorCQkJc3RhdHVzLmFkZChjcmVhdGVTdGF0dXMoZmVhdHVyZSwgRmVhdHVyZVN0YXR1cy5DT0RFX09USEVSLAorCQkJCQlOTFMuYmluZChNZXNzYWdlcy5BY3Rpdml0eUNvbnN0cmFpbnRzX3JlYWRPbmx5LCAobmV3IFN0cmluZ1tdIHsgY3NpdGUuZ2V0U2l0ZSgpLmdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkgfSkpKSk7CisJfQorCisJLyoKKwkgKiBDb21wdXRlIGEgbGlzdCBvZiBjb25maWd1cmVkIGZlYXR1cmVzCisJICovCisJcHJpdmF0ZSBzdGF0aWMgQXJyYXlMaXN0IGNvbXB1dGVGZWF0dXJlcygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGNvbXB1dGVGZWF0dXJlcyh0cnVlKTsKKwl9CisJLyoKKwkgKiBDb21wdXRlIGEgbGlzdCBvZiBjb25maWd1cmVkIGZlYXR1cmVzCisJICovCisJcHJpdmF0ZSBzdGF0aWMgQXJyYXlMaXN0IGNvbXB1dGVGZWF0dXJlcyhib29sZWFuIGNvbmZpZ3VyZWRPbmx5KQorCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCUFycmF5TGlzdCBmZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJSUxvY2FsU2l0ZSBsb2NhbFNpdGUgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsKKwkJSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZyA9IGxvY2FsU2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpOworCQlJQ29uZmlndXJlZFNpdGVbXSBjc2l0ZXMgPSBjb25maWcuZ2V0Q29uZmlndXJlZFNpdGVzKCk7CisKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBjc2l0ZXMubGVuZ3RoOyBpKyspIHsKKwkJCUlDb25maWd1cmVkU2l0ZSBjc2l0ZSA9IGNzaXRlc1tpXTsKKworCQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBjcmVmczsKKworCQkJaWYgKGNvbmZpZ3VyZWRPbmx5KQorCQkJCWNyZWZzID0gY3NpdGUuZ2V0Q29uZmlndXJlZEZlYXR1cmVzKCk7CisJCQllbHNlCisJCQkJY3JlZnMgPSBjc2l0ZS5nZXRTaXRlKCkuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsKKwkJCWZvciAoaW50IGogPSAwOyBqIDwgY3JlZnMubGVuZ3RoOyBqKyspIHsKKwkJCQlJRmVhdHVyZVJlZmVyZW5jZSBjcmVmID0gY3JlZnNbal07CisJCQkJSUZlYXR1cmUgY2ZlYXR1cmUgPSBjcmVmLmdldEZlYXR1cmUobnVsbCk7CisJCQkJZmVhdHVyZXMuYWRkKGNmZWF0dXJlKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiBmZWF0dXJlczsKKwl9CisKKwkvKgorCSAqIENvbXB1dGUgdGhlIG5lc3RlZCBmZWF0dXJlIHN1YnRyZWUgc3RhcnRpbmcgYXQgdGhlIHNwZWNpZmllZCBiYXNlCisJICogZmVhdHVyZQorCSAqLworCXB1YmxpYyBzdGF0aWMgQXJyYXlMaXN0IGNvbXB1dGVGZWF0dXJlU3VidHJlZSgKKwkJCUlGZWF0dXJlIHRvcCwKKwkJCUlGZWF0dXJlIGZlYXR1cmUsCisJCQlBcnJheUxpc3QgZmVhdHVyZXMsCisJCQlib29sZWFuIHRvbGVyYXRlTWlzc2luZ0NoaWxkcmVuLAorCQkJQXJyYXlMaXN0IGNvbmZpZ3VyZWRGZWF0dXJlcywKKwkJCUFycmF5TGlzdCB2aXNpdGVkRmVhdHVyZXMpCisJdGhyb3dzIENvcmVFeGNlcHRpb24geworCisJCS8vIGNoZWNrIGFyZ3VtZW50cworCQlpZiAodG9wID09IG51bGwpCisJCQlyZXR1cm4gZmVhdHVyZXM7CisJCWlmIChmZWF0dXJlID09IG51bGwpCisJCQlmZWF0dXJlID0gdG9wOworCQlpZiAoZmVhdHVyZXMgPT0gbnVsbCkKKwkJCWZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOworCQlpZiAodmlzaXRlZEZlYXR1cmVzID09IG51bGwpCisJCQl2aXNpdGVkRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisKKwkJLy8gY2hlY2sgZm9yIDxpbmNsdWRlcz4gY3ljbGUKKwkJaWYgKHZpc2l0ZWRGZWF0dXJlcy5jb250YWlucyhmZWF0dXJlKSkgeworCQkJSVN0YXR1cyBzdGF0dXMgPQorCQkJY3JlYXRlU3RhdHVzKHRvcCwgRmVhdHVyZVN0YXR1cy5DT0RFX0NZQ0xFLCBNZXNzYWdlcy5BY3Rpdml0eUNvbnN0cmFpbnRzX2N5Y2xlKTsKKwkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1cyk7CisJCX0gZWxzZSB7CisJCQkvLyBrZWVwIHRyYWNrIG9mIHZpc2l0ZWQgZmVhdHVyZXMgc28gd2UgY2FuIGRldGVjdCBjeWNsZXMKKwkJCXZpc2l0ZWRGZWF0dXJlcy5hZGQoZmVhdHVyZSk7CisJCX0KKworCQkvLyByZXR1cm4gc3BlY2lmaWVkIGJhc2UgZmVhdHVyZSBhbmQgYWxsIGl0cyBjaGlsZHJlbgorCQlpZiAoIWZlYXR1cmVzLmNvbnRhaW5zKGZlYXR1cmUpKQorCQkJZmVhdHVyZXMuYWRkKGZlYXR1cmUpOworCQlJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlW10gY2hpbGRyZW4gPQorCQlmZWF0dXJlLmdldEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgeworCQkJdHJ5IHsKKwkJCQlJRmVhdHVyZSBjaGlsZCA9IFVwZGF0ZVV0aWxzLmdldEluY2x1ZGVkRmVhdHVyZShmZWF0dXJlLCBjaGlsZHJlbltpXSk7CisJCQkJZmVhdHVyZXMgPQorCQkJCWNvbXB1dGVGZWF0dXJlU3VidHJlZSgKKwkJCQkJCXRvcCwKKwkJCQkJCWNoaWxkLAorCQkJCQkJZmVhdHVyZXMsCisJCQkJCQl0b2xlcmF0ZU1pc3NpbmdDaGlsZHJlbiwKKwkJCQkJCW51bGwsCisJCQkJCQl2aXNpdGVkRmVhdHVyZXMpOworCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkJaWYgKCFjaGlsZHJlbltpXS5pc09wdGlvbmFsKCkgJiYgIXRvbGVyYXRlTWlzc2luZ0NoaWxkcmVuKQorCQkJCQl0aHJvdyBlOworCQkJfQorCQl9CisJCS8vIG5vIGN5Y2xlcyBmb3IgdGhpcyBmZWF0dXJlIGR1cmluZyBERlMKKwkJdmlzaXRlZEZlYXR1cmVzLnJlbW92ZShmZWF0dXJlKTsKKwkJcmV0dXJuIGZlYXR1cmVzOworCX0KKworCXByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tMaWNlbnNlKElGZWF0dXJlIGZlYXR1cmUsIEFycmF5TGlzdCBzdGF0dXMpIHsKKwkJSVVSTEVudHJ5IGxpY2Vuc2VFbnRyeSA9IGZlYXR1cmUuZ2V0TGljZW5zZSgpOworCQlpZiAobGljZW5zZUVudHJ5ICE9IG51bGwpIHsKKwkJCVN0cmluZyBsaWNlbnNlID0gbGljZW5zZUVudHJ5LmdldEFubm90YXRpb24oKTsKKwkJCWlmIChsaWNlbnNlICE9IG51bGwgJiYgbGljZW5zZS50cmltKCkubGVuZ3RoKCkgPiAwKQorCQkJCXJldHVybjsKKwkJfQorCQlzdGF0dXMuYWRkKAorCQkJY3JlYXRlU3RhdHVzKGZlYXR1cmUsIEZlYXR1cmVTdGF0dXMuQ09ERV9PVEhFUiwgTWVzc2FnZXMuQWN0aXZpdHlDb25zdHJhaW50c19ub0xpY2Vuc2UpKTsKKwl9CisKKwkvKgorCSAqIENvbXB1dGUgYSBsaXN0IG9mIGZlYXR1cmVzIHRoYXQgd2lsbCBiZSBjb25maWd1cmVkIGFmdGVyIHRoZSBvcGVyYXRpb24KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBBcnJheUxpc3QgY29tcHV0ZUZlYXR1cmVzQWZ0ZXJPcGVyYXRpb24oCisJCUFycmF5TGlzdCBmZWF0dXJlcywKKwkJSUZlYXR1cmUgYWRkLAorCQlJRmVhdHVyZSByZW1vdmUpCisJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKKworCQlBcnJheUxpc3QgYWRkVHJlZSA9IGNvbXB1dGVGZWF0dXJlU3VidHJlZShhZGQsIG51bGwsIG51bGwsIGZhbHNlLAorCQkvKiBkbyBub3QgdG9sZXJhdGUgbWlzc2luZyBjaGlsZHJlbiAqLworCQlmZWF0dXJlcywgbnVsbCk7CisJCUFycmF5TGlzdCByZW1vdmVUcmVlID0KKwkJCWNvbXB1dGVGZWF0dXJlU3VidHJlZSgKKwkJCQlyZW1vdmUsCisJCQkJbnVsbCwKKwkJCQludWxsLAorCQkJCXRydWUgLyogdG9sZXJhdGUgbWlzc2luZyBjaGlsZHJlbiAqLywKKwkJCQludWxsLAorCQkJCW51bGwKKwkJKTsKKwkJaWYgKHJlbW92ZSAhPSBudWxsKSB7CisJCQkvLyBQYXRjaGVzIHRvIGZlYXR1cmVzIGFyZSByZW1vdmVkIHRvZ2V0aGVyIHdpdGgKKwkJCS8vIHRob3NlIGZlYXR1cmVzLiBJbmNsdWRlIHRoZW0gaW4gdGhlIGxpc3QuCisJCQljb250cmlidXRlUGF0Y2hlc0ZvcihyZW1vdmVUcmVlLCBmZWF0dXJlcywgcmVtb3ZlVHJlZSk7CisJCX0KKworCQlpZiAocmVtb3ZlICE9IG51bGwpCisJCQlmZWF0dXJlcy5yZW1vdmVBbGwocmVtb3ZlVHJlZSk7CisKKwkJaWYgKGFkZCAhPSBudWxsKQorCQkJZmVhdHVyZXMuYWRkQWxsKGFkZFRyZWUpOworCisJCXJldHVybiBmZWF0dXJlczsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGNvbnRyaWJ1dGVQYXRjaGVzRm9yKAorCQlBcnJheUxpc3QgcmVtb3ZlVHJlZSwKKwkJQXJyYXlMaXN0IGZlYXR1cmVzLAorCQlBcnJheUxpc3QgcmVzdWx0KQorCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCByZW1vdmVUcmVlLnNpemUoKTsgaSsrKSB7CisJCQlJRmVhdHVyZSBmZWF0dXJlID0gKElGZWF0dXJlKSByZW1vdmVUcmVlLmdldChpKTsKKwkJCWNvbnRyaWJ1dGVQYXRjaGVzRm9yKGZlYXR1cmUsIGZlYXR1cmVzLCByZXN1bHQpOworCQl9CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb250cmlidXRlUGF0Y2hlc0ZvcigKKwkJSUZlYXR1cmUgZmVhdHVyZSwKKwkJQXJyYXlMaXN0IGZlYXR1cmVzLAorCQlBcnJheUxpc3QgcmVzdWx0KQorCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXMuc2l6ZSgpOyBpKyspIHsKKwkJCUlGZWF0dXJlIGNhbmRpZGF0ZSA9IChJRmVhdHVyZSkgZmVhdHVyZXMuZ2V0KGkpOworCQkJaWYgKFVwZGF0ZVV0aWxzLmlzUGF0Y2goZmVhdHVyZSwgY2FuZGlkYXRlKSkgeworCQkJCUFycmF5TGlzdCByZW1vdmVUcmVlID0KKwkJCQkJY29tcHV0ZUZlYXR1cmVTdWJ0cmVlKGNhbmRpZGF0ZSwgbnVsbCwgbnVsbCwgdHJ1ZSxudWxsLG51bGwpOworCQkJCXJlc3VsdC5hZGRBbGwocmVtb3ZlVHJlZSk7CisJCQl9CisJCX0KKwl9CisKKwkvKgorCSAqIENvbXB1dGUgYSBsaXN0IG9mIGZlYXR1cmVzIHRoYXQgd2lsbCBiZSBjb25maWd1cmVkIGFmdGVyIHBlcmZvcm1pbmcgdGhlCisJICogcmV2ZXJ0CisJICovCisJcHJpdmF0ZSBzdGF0aWMgQXJyYXlMaXN0IGNvbXB1dGVGZWF0dXJlc0FmdGVyUmV2ZXJ0KElJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcpCisJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKKworCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKwkJSUNvbmZpZ3VyZWRTaXRlW10gY3NpdGVzID0gY29uZmlnLmdldENvbmZpZ3VyZWRTaXRlcygpOworCQlmb3IgKGludCBpID0gMDsgaSA8IGNzaXRlcy5sZW5ndGg7IGkrKykgeworCQkJSUNvbmZpZ3VyZWRTaXRlIGNzaXRlID0gY3NpdGVzW2ldOworCQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBmZWF0dXJlcyA9IGNzaXRlLmdldENvbmZpZ3VyZWRGZWF0dXJlcygpOworCQkJZm9yIChpbnQgaiA9IDA7IGogPCBmZWF0dXJlcy5sZW5ndGg7IGorKykgeworCQkJCWxpc3QuYWRkKGZlYXR1cmVzW2pdLmdldEZlYXR1cmUobnVsbCkpOworCQkJfQorCQl9CisJCXJldHVybiBsaXN0OworCX0KKworCisKKwkvKgorCSAqIENvbXB1dGUgYSBsaXN0IG9mIHBsdWdpbiBlbnRyaWVzIGZvciB0aGUgc3BlY2lmaWVkIGZlYXR1cmVzLgorCSAqLworCXByaXZhdGUgc3RhdGljIEFycmF5TGlzdCBjb21wdXRlUGx1Z2luc0ZvckZlYXR1cmVzKEFycmF5TGlzdCBmZWF0dXJlcykKKwkJdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlpZiAoZmVhdHVyZXMgPT0gbnVsbCkKKwkJCXJldHVybiBuZXcgQXJyYXlMaXN0KCk7CisKKwkJSGFzaE1hcCBwbHVnaW5zID0gbmV3IEhhc2hNYXAoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5zaXplKCk7IGkrKykgeworCQkJSUZlYXR1cmUgZmVhdHVyZSA9IChJRmVhdHVyZSkgZmVhdHVyZXMuZ2V0KGkpOworCQkJSVBsdWdpbkVudHJ5W10gZW50cmllcyA9IGZlYXR1cmUuZ2V0UGx1Z2luRW50cmllcygpOworCQkJZm9yIChpbnQgaiA9IDA7IGogPCBlbnRyaWVzLmxlbmd0aDsgaisrKSB7CisJCQkJSVBsdWdpbkVudHJ5IGVudHJ5ID0gZW50cmllc1tqXTsKKwkJCQlwbHVnaW5zLnB1dChlbnRyeS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCksIGVudHJ5KTsKKwkJCX0KKwkJfQorCQlBcnJheUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOworCQlyZXN1bHQuYWRkQWxsKHBsdWdpbnMudmFsdWVzKCkpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCisJLyoqCisJICogQ2hlY2sgZm9yIGZlYXR1cmUgY3ljbGVzOgorCSAqIC0gdmlzaXQgZmVhdHVyZQorCSAqIC0gaWYgZmVhdHVyZSBpcyBpbiB0aGUgY3ljbGUgY2FuZGlkYXRlcyBsaXN0LCB0aGVuIGN5Y2xlIGZvdW5kLCBlbHNlIGFkZCBpdCB0byBjYW5kaWRhdGVzIGxpc3QKKwkgKiAtIERGUyBjaGlsZHJlbiAKKwkgKiAtIHdoZW4gcmV0dXJuIGZyb20gREZTIHJlbW92ZSB0aGUgZmVhdHVyZSBmcm9tIHRoZSBjYW5kaWRhdGVzIGxpc3QKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrRm9yQ3ljbGVzKAorCQkJSUZlYXR1cmUgZmVhdHVyZSwKKwkJCUFycmF5TGlzdCBjYW5kaWRhdGVzLAorCQkJQXJyYXlMaXN0IGNvbmZpZ3VyZWRGZWF0dXJlcykKKwl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisKKwkJLy8gY2hlY2sgYXJndW1lbnRzCisJCWlmIChmZWF0dXJlID09IG51bGwpCisJCQlyZXR1cm47CisJCWlmIChjb25maWd1cmVkRmVhdHVyZXMgPT0gbnVsbCkKKwkJCWNvbmZpZ3VyZWRGZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJaWYgKGNhbmRpZGF0ZXMgPT0gbnVsbCkKKwkJCWNhbmRpZGF0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisJCQorCQkvLyBjaGVjayBmb3IgPGluY2x1ZGVzPiBjeWNsZQorCQlpZiAoY2FuZGlkYXRlcy5jb250YWlucyhmZWF0dXJlKSkgeworCQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKE1lc3NhZ2VzLkFjdGl2aXR5Q29uc3RyYWludHNfY3ljbGUsIChuZXcgU3RyaW5nW10ge2ZlYXR1cmUuZ2V0TGFiZWwoKSwgCisgICAgICAgICAgICBmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpfSkpOworCQkJSVN0YXR1cyBzdGF0dXMgPSBjcmVhdGVTdGF0dXMoZmVhdHVyZSwgRmVhdHVyZVN0YXR1cy5DT0RFX0NZQ0xFLCBtc2cpOworCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc3RhdHVzKTsKKwkJfQorCisJCS8vIHBvdGVudGlhbCBjYW5kaWRhdGUKKwkJY2FuZGlkYXRlcy5hZGQoZmVhdHVyZSk7CisJCQorCQkvLyByZWN1cnNpdmVseSwgY2hlY2sgY3ljbGVzIHdpdGggY2hpbGRyZW4KKwkJSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZVtdIGNoaWxkcmVuID0KKwkJZmVhdHVyZS5nZXRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKKwkJCXRyeSB7CisJCQkJSUZlYXR1cmUgY2hpbGQgPSBVcGRhdGVVdGlscy5nZXRJbmNsdWRlZEZlYXR1cmUoZmVhdHVyZSwgY2hpbGRyZW5baV0pOworCQkJCWNoZWNrRm9yQ3ljbGVzKGNoaWxkLCBjYW5kaWRhdGVzLCBjb25maWd1cmVkRmVhdHVyZXMpOworCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkJaWYgKCFjaGlsZHJlbltpXS5pc09wdGlvbmFsKCkpCisJCQkJCXRocm93IGU7CisJCQl9CisJCX0KKwkJLy8gbm8gbG9uZ2VyIGEgY2FuZGlkYXRlLCBiZWNhdXNlIG5vIGN5Y2xlcyB3aXRoIGNoaWxkcmVuCisJCWNhbmRpZGF0ZXMucmVtb3ZlKGZlYXR1cmUpOworCX0KKwkKKwkvKgorCSAqIHZhbGlkYXRlIGNvbnN0cmFpbnRzCisJICovCisJcHJpdmF0ZSBzdGF0aWMgU2V0ICBjaGVja0NvbnN0cmFpbnRzKEFycmF5TGlzdCBmZWF0dXJlcywgQXJyYXlMaXN0IHN0YXR1cykKKwkJdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlpZiAoZmVhdHVyZXMgPT0gbnVsbCkKKwkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9TRVQ7CisKKwkJQXJyYXlMaXN0IHBsdWdpbnMgPSBjb21wdXRlUGx1Z2luc0ZvckZlYXR1cmVzKGZlYXR1cmVzKTsKKworCQljaGVja0Vudmlyb25tZW50KGZlYXR1cmVzLCBzdGF0dXMpOworCQljaGVja1BsYXRmb3JtRmVhdHVyZShmZWF0dXJlcywgcGx1Z2lucywgc3RhdHVzKTsKKwkJY2hlY2tQcmltYXJ5RmVhdHVyZShmZWF0dXJlcywgcGx1Z2lucywgc3RhdHVzKTsKKwkJcmV0dXJuIGNoZWNrUHJlcmVxcyhmZWF0dXJlcywgcGx1Z2lucywgc3RhdHVzKTsKKwl9CisKKwkvKgorCSAqIFZlcmlmeSBhbGwgZmVhdHVyZXMgYXJlIGVpdGhlciBwb3J0YWJsZSwgb3IgbWF0Y2ggdGhlIGN1cnJlbnQKKwkgKiBlbnZpcm9ubWVudAorCSAqLworCXByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tFbnZpcm9ubWVudCgKKwkJQXJyYXlMaXN0IGZlYXR1cmVzLAorCQlBcnJheUxpc3Qgc3RhdHVzKSB7CisKKwkJU3RyaW5nIG9zID0gUGxhdGZvcm0uZ2V0T1MoKTsKKwkJU3RyaW5nIHdzID0gUGxhdGZvcm0uZ2V0V1MoKTsKKwkJU3RyaW5nIGFyY2ggPSBQbGF0Zm9ybS5nZXRPU0FyY2goKTsKKworCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLnNpemUoKTsgaSsrKSB7CisJCQlJRmVhdHVyZSBmZWF0dXJlID0gKElGZWF0dXJlKSBmZWF0dXJlcy5nZXQoaSk7CisJCQlBcnJheUxpc3QgZm9zID0gY3JlYXRlTGlzdChmZWF0dXJlLmdldE9TKCkpOworCQkJQXJyYXlMaXN0IGZ3cyA9IGNyZWF0ZUxpc3QoZmVhdHVyZS5nZXRXUygpKTsKKwkJCUFycmF5TGlzdCBmYXJjaCA9IGNyZWF0ZUxpc3QoZmVhdHVyZS5nZXRPU0FyY2goKSk7CisKKwkJCWlmIChmb3Muc2l6ZSgpID4gMCkgeworCQkJCWlmICghZm9zLmNvbnRhaW5zKG9zKSkgeworCQkJCQlJU3RhdHVzIHMgPQorCQkJCQkJY3JlYXRlU3RhdHVzKGZlYXR1cmUsIEZlYXR1cmVTdGF0dXMuQ09ERV9FTlZJUk9OTUVOVCwgTWVzc2FnZXMuQWN0aXZpdHlDb25zdHJhaW50c19vcyk7CisJCQkJCWlmICghc3RhdHVzLmNvbnRhaW5zKHMpKQorCQkJCQkJc3RhdHVzLmFkZChzKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJfQorCisJCQlpZiAoZndzLnNpemUoKSA+IDApIHsKKwkJCQlpZiAoIWZ3cy5jb250YWlucyh3cykpIHsKKwkJCQkJSVN0YXR1cyBzID0KKwkJCQkJCWNyZWF0ZVN0YXR1cyhmZWF0dXJlLCBGZWF0dXJlU3RhdHVzLkNPREVfRU5WSVJPTk1FTlQsIE1lc3NhZ2VzLkFjdGl2aXR5Q29uc3RyYWludHNfd3MpOworCQkJCQlpZiAoIXN0YXR1cy5jb250YWlucyhzKSkKKwkJCQkJCXN0YXR1cy5hZGQocyk7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCX0KKworCQkJaWYgKGZhcmNoLnNpemUoKSA+IDApIHsKKwkJCQlpZiAoIWZhcmNoLmNvbnRhaW5zKGFyY2gpKSB7CisJCQkJCUlTdGF0dXMgcyA9CisJCQkJCQljcmVhdGVTdGF0dXMoZmVhdHVyZSwgRmVhdHVyZVN0YXR1cy5DT0RFX0VOVklST05NRU5ULCBNZXNzYWdlcy5BY3Rpdml0eUNvbnN0cmFpbnRzX2FyY2gpOworCQkJCQlpZiAoIXN0YXR1cy5jb250YWlucyhzKSkKKwkJCQkJCXN0YXR1cy5hZGQocyk7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCS8qCisJICogVmVyaWZ5IHdlIGVuZCB1cCB3aXRoIGEgdmVyc2lvbiBvZiBwbGF0Zm9ybSBjb25maWd1cmVkCisJICovCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja1BsYXRmb3JtRmVhdHVyZSgKKwkJQXJyYXlMaXN0IGZlYXR1cmVzLAorCQlBcnJheUxpc3QgcGx1Z2lucywKKwkJQXJyYXlMaXN0IHN0YXR1cykgeworCisJCS8vIGZpbmQgdGhlIHBsdWdpbiB0aGF0IGRlZmluZXMgdGhlIHByb2R1Y3QKKwkJSVByb2R1Y3QgcHJvZHVjdCA9IFBsYXRmb3JtLmdldFByb2R1Y3QoKTsKKwkJaWYgKHByb2R1Y3QgPT0gbnVsbCkKKwkJCXJldHVybjsgLy8gbm9ybWFsbHkgdGhpcyBzaG91bGRuJ3QgaGFwcGVuCisJCUJ1bmRsZSBwcmltYXJ5QnVuZGxlID0gcHJvZHVjdC5nZXREZWZpbmluZ0J1bmRsZSgpOworCQkvLyBjaGVjayBpZiB0aGF0IHBsdWdpbiBpcyBhbW9uZyB0aGUgcmVzdWx0aW5nIHBsdWdpbnMKKwkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOworCQlmb3IgKGludCBqID0gMDsgaiA8IHBsdWdpbnMuc2l6ZSgpOyBqKyspIHsKKwkJCUlQbHVnaW5FbnRyeSBwbHVnaW4gPSAoSVBsdWdpbkVudHJ5KSBwbHVnaW5zLmdldChqKTsKKwkJCWlmIChwcmltYXJ5QnVuZGxlLmdldFN5bWJvbGljTmFtZSgpLmVxdWFscyhwbHVnaW4uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldElkZW50aWZpZXIoKSkpIHsKKwkJCQlmb3VuZCA9IHRydWU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJCisJCWlmICghZm91bmQpIHsKKwkJCUlTdGF0dXMgcyA9CisJCQkJY3JlYXRlU3RhdHVzKG51bGwsIEZlYXR1cmVTdGF0dXMuQ09ERV9PVEhFUiwgTWVzc2FnZXMuQWN0aXZpdHlDb25zdHJhaW50c19wbGF0Zm9ybSk7CisJCQlpZiAoIXN0YXR1cy5jb250YWlucyhzKSkKKwkJCQlzdGF0dXMuYWRkKHMpOworCQl9CisJfQorCisJLyoKKwkgKiBWZXJpZnkgd2UgZW5kIHVwIHdpdGggYSB2ZXJzaW9uIG9mIHByaW1hcnkgZmVhdHVyZSBjb25maWd1cmVkCisJICovCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja1ByaW1hcnlGZWF0dXJlKAorCQlBcnJheUxpc3QgZmVhdHVyZXMsCisJCUFycmF5TGlzdCBwbHVnaW5zLAorCQlBcnJheUxpc3Qgc3RhdHVzKSB7CisKKwkJU3RyaW5nIGZlYXR1cmVJZCA9CisJCQlDb25maWd1cmF0b3JVdGlscworCQkJCS5nZXRDdXJyZW50UGxhdGZvcm1Db25maWd1cmF0aW9uKCkKKwkJCQkuZ2V0UHJpbWFyeUZlYXR1cmVJZGVudGlmaWVyKCk7CisJCQorCQlpZiAoZmVhdHVyZUlkICE9IG51bGwpIHsKKwkJCS8vIHByaW1hcnkgZmVhdHVyZSBpcyBkZWZpbmVkCisJCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLnNpemUoKTsgaSsrKSB7CisJCQkJSUZlYXR1cmUgZmVhdHVyZSA9IChJRmVhdHVyZSkgZmVhdHVyZXMuZ2V0KGkpOworCQkJCWlmIChmZWF0dXJlSWQKKwkJCQkJLmVxdWFscyhmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRJZGVudGlmaWVyKCkpKQorCQkJCQlyZXR1cm47CisJCQl9CisJCisJCQlJU3RhdHVzIHMgPSBjcmVhdGVTdGF0dXMobnVsbCwgRmVhdHVyZVN0YXR1cy5DT0RFX09USEVSLCBNZXNzYWdlcy5BY3Rpdml0eUNvbnN0cmFpbnRzX3ByaW1hcnkpOworCQkJaWYgKCFzdGF0dXMuY29udGFpbnMocykpCisJCQkJc3RhdHVzLmFkZChzKTsKKwkJfSBlbHNlIHsKKwkJCS8vIGNoZWNrIGlmIHRoZSBwcm9kdWN0IHN0aWxsIGVuZHMgdXAgY29udHJpYnV0ZWQKKwkJCS8vIGZpbmQgdGhlIHBsdWdpbiB0aGF0IGRlZmluZXMgdGhlIHByb2R1Y3QKKwkJCUlQcm9kdWN0IHByb2R1Y3QgPSBQbGF0Zm9ybS5nZXRQcm9kdWN0KCk7CisJCQlpZiAocHJvZHVjdCA9PSBudWxsKQorCQkJCXJldHVybjsgLy8gbm9ybWFsbHkgdGhpcyBzaG91bGRuJ3QgaGFwcGVuCisJCQlCdW5kbGUgcHJpbWFyeUJ1bmRsZSA9IHByb2R1Y3QuZ2V0RGVmaW5pbmdCdW5kbGUoKTsKKwkJCS8vIGNoZWNrIGlmIHRoYXQgcGx1Z2luIGlzIGFtb25nIHRoZSByZXN1bHRpbmcgcGx1Z2lucworCisJCQlmb3IgKGludCBqID0gMDsgaiA8IHBsdWdpbnMuc2l6ZSgpOyBqKyspIHsKKwkJCQlJUGx1Z2luRW50cnkgcGx1Z2luID0gKElQbHVnaW5FbnRyeSkgcGx1Z2lucy5nZXQoaik7CisJCQkJaWYgKHByaW1hcnlCdW5kbGUuZ2V0U3ltYm9saWNOYW1lKCkuZXF1YWxzKHBsdWdpbi5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0SWRlbnRpZmllcigpKSkgeworCQkJCQlyZXR1cm47IC8vIHByb2R1Y3QgZm91bmQKKwkJCQl9CisJCQl9CisJCQlJU3RhdHVzIHMgPQorCQkJCWNyZWF0ZVN0YXR1cyhudWxsLCBGZWF0dXJlU3RhdHVzLkNPREVfT1RIRVIsIE1lc3NhZ2VzLkFjdGl2aXR5Q29uc3RyYWludHNfcHJpbWFyeSk7CisJCQlpZiAoIXN0YXR1cy5jb250YWlucyhzKSkKKwkJCQlzdGF0dXMuYWRkKHMpOworCQl9CisJfQorCisJLyoKKwkgKiBWZXJpZnkgd2UgZG8gbm90IGJyZWFrIHByZXJlcXMKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBTZXQgY2hlY2tQcmVyZXFzKAorCQlBcnJheUxpc3QgZmVhdHVyZXMsCisJCUFycmF5TGlzdCBwbHVnaW5zLAorCQlBcnJheUxpc3Qgc3RhdHVzKSB7CisJCQorCQlIYXNoU2V0IHJlc3VsdCA9IG5ldyBIYXNoU2V0KCk7CisKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5zaXplKCk7IGkrKykgeworCQkJSUZlYXR1cmUgZmVhdHVyZSA9IChJRmVhdHVyZSkgZmVhdHVyZXMuZ2V0KGkpOworCQkJSUltcG9ydFtdIGltcG9ydHMgPSBmZWF0dXJlLmdldEltcG9ydHMoKTsKKworCQkJZm9yIChpbnQgaiA9IDA7IGogPCBpbXBvcnRzLmxlbmd0aDsgaisrKSB7CisJCQkJSUltcG9ydCBpaW1wb3J0ID0gaW1wb3J0c1tqXTsKKwkJCQkvLyBmb3IgZWFjaCBpbXBvcnQgZGV0ZXJtaW5lIHBsdWdpbiBvciBmZWF0dXJlLCB2ZXJzaW9uLCBtYXRjaAorCQkJCS8vIHdlIG5lZWQKKwkJCQlWZXJzaW9uZWRJZGVudGlmaWVyIGlpZCA9IGlpbXBvcnQuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOworCQkJCVN0cmluZyBpZCA9IGlpZC5nZXRJZGVudGlmaWVyKCk7CisJCQkJUGx1Z2luVmVyc2lvbklkZW50aWZpZXIgdmVyc2lvbiA9IGlpZC5nZXRWZXJzaW9uKCk7CisJCQkJYm9vbGVhbiBmZWF0dXJlUHJlcmVxID0KKwkJCQkJaWltcG9ydC5nZXRLaW5kKCkgPT0gSUltcG9ydC5LSU5EX0ZFQVRVUkU7CisJCQkJYm9vbGVhbiBpZ25vcmVWZXJzaW9uID0KKwkJCQkJdmVyc2lvbi5nZXRNYWpvckNvbXBvbmVudCgpID09IDAKKwkJCQkJCSYmIHZlcnNpb24uZ2V0TWlub3JDb21wb25lbnQoKSA9PSAwCisJCQkJCQkmJiB2ZXJzaW9uLmdldFNlcnZpY2VDb21wb25lbnQoKSA9PSAwOworCQkJCWludCBydWxlID0gaWltcG9ydC5nZXRSdWxlKCk7CisJCQkJaWYgKHJ1bGUgPT0gSVVwZGF0ZUNvbnN0YW50cy5SVUxFX05PTkUpCisJCQkJCXJ1bGUgPSBJVXBkYXRlQ29uc3RhbnRzLlJVTEVfQ09NUEFUSUJMRTsKKworCQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKKworCQkJCUFycmF5TGlzdCBjYW5kaWRhdGVzOworCisJCQkJaWYgKGZlYXR1cmVQcmVyZXEpCisJCQkJCWNhbmRpZGF0ZXMgPSBmZWF0dXJlczsKKwkJCQllbHNlCisJCQkJCWNhbmRpZGF0ZXMgPSBwbHVnaW5zOworCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgY2FuZGlkYXRlcy5zaXplKCk7IGsrKykgeworCQkJCQlWZXJzaW9uZWRJZGVudGlmaWVyIGNpZDsKKwkJCQkJaWYgKGZlYXR1cmVQcmVyZXEpIHsKKwkJCQkJCS8vIHRoZSBjYW5kaWRhdGUgaXMgYSBmZWF0dXJlCisJCQkJCQlJRmVhdHVyZSBjYW5kaWRhdGUgPSAoSUZlYXR1cmUpIGNhbmRpZGF0ZXMuZ2V0KGspOworCQkJCQkJLy8gc2tpcCBzZWxmCisJCQkJCQlpZiAoZmVhdHVyZS5lcXVhbHMoY2FuZGlkYXRlKSkKKwkJCQkJCQljb250aW51ZTsKKwkJCQkJCWNpZCA9IGNhbmRpZGF0ZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQkvLyB0aGUgY2FuZGlkYXRlIGlzIGEgcGx1Zy1pbgorCQkJCQkJSVBsdWdpbkVudHJ5IHBsdWdpbiA9IChJUGx1Z2luRW50cnkpIGNhbmRpZGF0ZXMuZ2V0KGspOworCQkJCQkJY2lkID0gcGx1Z2luLmdldFZlcnNpb25lZElkZW50aWZpZXIoKTsKKwkJCQkJfQorCQkJCQlQbHVnaW5WZXJzaW9uSWRlbnRpZmllciBjdmVyc2lvbiA9IGNpZC5nZXRWZXJzaW9uKCk7CisJCQkJCWlmIChpZC5lcXVhbHMoY2lkLmdldElkZW50aWZpZXIoKSkpIHsKKwkJCQkJCS8vIGhhdmUgYSBjYW5kaWRhdGUKKwkJCQkJCWlmIChpZ25vcmVWZXJzaW9uKQorCQkJCQkJCWZvdW5kID0gdHJ1ZTsKKwkJCQkJCWVsc2UgaWYgKAorCQkJCQkJCXJ1bGUgPT0gSVVwZGF0ZUNvbnN0YW50cy5SVUxFX1BFUkZFQ1QKKwkJCQkJCQkJJiYgY3ZlcnNpb24uaXNQZXJmZWN0KHZlcnNpb24pKQorCQkJCQkJCWZvdW5kID0gdHJ1ZTsKKwkJCQkJCWVsc2UgaWYgKAorCQkJCQkJCXJ1bGUgPT0gSVVwZGF0ZUNvbnN0YW50cy5SVUxFX0VRVUlWQUxFTlQKKwkJCQkJCQkJJiYgY3ZlcnNpb24uaXNFcXVpdmFsZW50VG8odmVyc2lvbikpCisJCQkJCQkJZm91bmQgPSB0cnVlOworCQkJCQkJZWxzZSBpZiAoCisJCQkJCQkJcnVsZSA9PSBJVXBkYXRlQ29uc3RhbnRzLlJVTEVfQ09NUEFUSUJMRQorCQkJCQkJCQkmJiBjdmVyc2lvbi5pc0NvbXBhdGlibGVXaXRoKHZlcnNpb24pKQorCQkJCQkJCWZvdW5kID0gdHJ1ZTsKKwkJCQkJCWVsc2UgaWYgKAorCQkJCQkJCXJ1bGUgPT0gSVVwZGF0ZUNvbnN0YW50cy5SVUxFX0dSRUFURVJfT1JfRVFVQUwKKwkJCQkJCQkJJiYgY3ZlcnNpb24uaXNHcmVhdGVyT3JFcXVhbFRvKHZlcnNpb24pKQorCQkJCQkJCWZvdW5kID0gdHJ1ZTsKKwkJCQkJfQorCQkJCQlpZiAoZm91bmQpCisJCQkJCQlicmVhazsKKwkJCQl9CisJCQkJCisJCQkJLy8gcGVyaGFwcyB0aGUgYnVuZGxlIHRoYXQgd2UgYXJlIGxvb2tpbmcgZm9yIHdhcyBpbnN0YWxsZWQKKwkJCQkvLyBidXQgaXNuJ3QgYSBwYXJ0IG9mIGEgZmVhdHVyZQorCQkJCWlmICghZm91bmQgJiYgIWZlYXR1cmVQcmVyZXEpCisJCQkJCWZvdW5kID0gaXNJbnN0YWxsZWQoaWlkLCBydWxlLCBpZ25vcmVWZXJzaW9uKTsKKworCQkJCWlmICghZm91bmQpIHsKKwkJCQkJLy8gcmVwb3J0IHN0YXR1cworCQkJCQlTdHJpbmcgdGFyZ2V0ID0KKwkJCQkJCWZlYXR1cmVQcmVyZXEKKwkJCQkJCQk/IE1lc3NhZ2VzLkFjdGl2aXR5Q29uc3RhaW50c19wcmVyZXFfZmVhdHVyZQorCQkJCQkJCTogTWVzc2FnZXMuQWN0aXZpdHlDb25zdGFpbnRzX3ByZXJlcV9wbHVnaW47CisJCQkJCWludCBlcnJvckNvZGUgPSBmZWF0dXJlUHJlcmVxCisJCQkJCQkJPyBGZWF0dXJlU3RhdHVzLkNPREVfUFJFUkVRX0ZFQVRVUkUKKwkJCQkJCQk6IEZlYXR1cmVTdGF0dXMuQ09ERV9QUkVSRVFfUExVR0lOOworCQkJCQlTdHJpbmcgbXNnID0KKwkJCQkJCU5MUy5iaW5kKE1lc3NhZ2VzLkFjdGl2aXR5Q29uc3RyYWludHNfcHJlcmVxLCAobmV3IFN0cmluZ1tdIHsgdGFyZ2V0LCBpZCB9KSk7CisKKwkJCQkJaWYgKCFpZ25vcmVWZXJzaW9uKSB7CisJCQkJCQlpZiAocnVsZSA9PSBJVXBkYXRlQ29uc3RhbnRzLlJVTEVfUEVSRkVDVCkKKwkJCQkJCQltc2cgPQorCQkJCQkJCQlOTFMuYmluZChNZXNzYWdlcy5BY3Rpdml0eUNvbnN0cmFpbnRzX3ByZXJlcVBlcmZlY3QsIChuZXcgU3RyaW5nW10geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uLnRvU3RyaW5nKCl9KSk7CisJCQkJCQllbHNlIGlmIChydWxlID09IElVcGRhdGVDb25zdGFudHMuUlVMRV9FUVVJVkFMRU5UKQorCQkJCQkJCW1zZyA9CisJCQkJCQkJCU5MUy5iaW5kKE1lc3NhZ2VzLkFjdGl2aXR5Q29uc3RyYWludHNfcHJlcmVxRXF1aXZhbGVudCwgKG5ldyBTdHJpbmdbXSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb24udG9TdHJpbmcoKX0pKTsKKwkJCQkJCWVsc2UgaWYgKHJ1bGUgPT0gSVVwZGF0ZUNvbnN0YW50cy5SVUxFX0NPTVBBVElCTEUpCisJCQkJCQkJbXNnID0KKwkJCQkJCQkJTkxTLmJpbmQoTWVzc2FnZXMuQWN0aXZpdHlDb25zdHJhaW50c19wcmVyZXFDb21wYXRpYmxlLCAobmV3IFN0cmluZ1tdIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbi50b1N0cmluZygpfSkpOworCQkJCQkJZWxzZSBpZiAocnVsZSA9PSBJVXBkYXRlQ29uc3RhbnRzLlJVTEVfR1JFQVRFUl9PUl9FUVVBTCkKKwkJCQkJCQltc2cgPQorCQkJCQkJCQlOTFMuYmluZChNZXNzYWdlcy5BY3Rpdml0eUNvbnN0cmFpbnRzX3ByZXJlcUdyZWF0ZXJPckVxdWFsLCAobmV3IFN0cmluZ1tdIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbi50b1N0cmluZygpfSkpOworCQkJCQl9CisJCQkJCUlTdGF0dXMgcyA9IGNyZWF0ZVN0YXR1cyhmZWF0dXJlLCBlcnJvckNvZGUsIG1zZyk7CisJCQkJCXJlc3VsdC5hZGQobmV3IEludGVybmFsSW1wb3J0KGlpbXBvcnQpKTsKKwkJCQkJaWYgKCFzdGF0dXMuY29udGFpbnMocykpCisJCQkJCQlzdGF0dXMuYWRkKHMpOworCQkJCX0KKwkJCX0KKwkJfQorCQkKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisJCisJLyoKKwkgKiBSZXR1cm4gYSBib29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgdGhlIGJ1bmRsZSB3aXRoIHRoZSBnaXZlbiBpZCBhbmQgdmVyc2lvbgorCSAqIGlzIGluc3RhbGxlZCBpbiB0aGUgc3lzdGVtLgorCSAqLworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbnN0YWxsZWQoVmVyc2lvbmVkSWRlbnRpZmllciB2aWQsIGludCBydWxlLCBib29sZWFuIGlnbm9yZVZlcnNpb24pIHsKKwkJQnVuZGxlQ29udGV4dCBjb250ZXh0ID0gVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXRCdW5kbGVDb250ZXh0KCk7CisJCWlmIChjb250ZXh0ID09IG51bGwpCisJCQlyZXR1cm4gZmFsc2U7CisJCVNlcnZpY2VSZWZlcmVuY2UgcmVmZXJlbmNlID0gY29udGV4dC5nZXRTZXJ2aWNlUmVmZXJlbmNlKFBsYXRmb3JtQWRtaW4uY2xhc3MuZ2V0TmFtZSgpKTsKKwkJaWYgKHJlZmVyZW5jZSA9PSBudWxsKQorCQkJcmV0dXJuIGZhbHNlOworCQlQbGF0Zm9ybUFkbWluIGFkbWluID0gKFBsYXRmb3JtQWRtaW4pIGNvbnRleHQuZ2V0U2VydmljZShyZWZlcmVuY2UpOworCQl0cnkgeworCQkJU3RhdGUgc3RhdGUgPSBhZG1pbi5nZXRTdGF0ZShmYWxzZSk7CisJCQlTdHJpbmcgaWQgPSB2aWQuZ2V0SWRlbnRpZmllcigpOworCQkJUGx1Z2luVmVyc2lvbklkZW50aWZpZXIgdmVyc2lvbiA9IHZpZC5nZXRWZXJzaW9uKCk7CisJCQlCdW5kbGVEZXNjcmlwdGlvbltdIGJ1bmRsZXMgPSBzdGF0ZS5nZXRCdW5kbGVzKGlkKTsKKwkJCWlmIChidW5kbGVzID09IG51bGwgfHwgYnVuZGxlcy5sZW5ndGggPT0gMCkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQlmb3IgKGludCBpPTA7IGk8YnVuZGxlcy5sZW5ndGg7IGkrKykgeworCQkJCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZSA9IGJ1bmRsZXNbaV07CisJCQkJUGx1Z2luVmVyc2lvbklkZW50aWZpZXIgY3ZlcnNpb24gPSBuZXcgUGx1Z2luVmVyc2lvbklkZW50aWZpZXIoYnVuZGxlLmdldFZlcnNpb24oKS50b1N0cmluZygpKTsKKwkJCQkvLyBoYXZlIGEgY2FuZGlkYXRlCisJCQkJaWYgKGlnbm9yZVZlcnNpb24pCisJCQkJCXJldHVybiB0cnVlOworCQkJCWlmIChydWxlID09IElVcGRhdGVDb25zdGFudHMuUlVMRV9QRVJGRUNUICYmIGN2ZXJzaW9uLmlzUGVyZmVjdCh2ZXJzaW9uKSkKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJZWxzZSBpZiAocnVsZSA9PSBJVXBkYXRlQ29uc3RhbnRzLlJVTEVfRVFVSVZBTEVOVCAmJiBjdmVyc2lvbi5pc0VxdWl2YWxlbnRUbyh2ZXJzaW9uKSkKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJZWxzZSBpZiAocnVsZSA9PSBJVXBkYXRlQ29uc3RhbnRzLlJVTEVfQ09NUEFUSUJMRSAmJiBjdmVyc2lvbi5pc0NvbXBhdGlibGVXaXRoKHZlcnNpb24pKQorCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQllbHNlIGlmIChydWxlID09IElVcGRhdGVDb25zdGFudHMuUlVMRV9HUkVBVEVSX09SX0VRVUFMICYmIGN2ZXJzaW9uLmlzR3JlYXRlck9yRXF1YWxUbyh2ZXJzaW9uKSkKKwkJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCQlyZXR1cm4gZmFsc2U7CisJCX0gZmluYWxseSB7CisJCQljb250ZXh0LnVuZ2V0U2VydmljZShyZWZlcmVuY2UpOworCQl9CisJfQorCisJLyoKKwkgKiBWZXJpZnkgd2UgZW5kIHVwIHdpdGggdmFsaWQgbmVzdGVkIGZlYXR1cmVzIGFmdGVyIHJldmVydAorCSAqLworCXByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tSZXZlcnRDb25zdHJhaW50cygKKwkJQXJyYXlMaXN0IGZlYXR1cmVzLAorCQlBcnJheUxpc3Qgc3RhdHVzKSB7CisKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5zaXplKCk7IGkrKykgeworCQkJSUZlYXR1cmUgZmVhdHVyZSA9IChJRmVhdHVyZSkgZmVhdHVyZXMuZ2V0KGkpOworCQkJdHJ5IHsKKwkJCQljb21wdXRlRmVhdHVyZVN1YnRyZWUoCisJCQkJCWZlYXR1cmUsCisJCQkJCW51bGwsCisJCQkJCW51bGwsCisJCQkJCWZhbHNlIC8qIGRvIG5vdCB0b2xlcmF0ZSBtaXNzaW5nIGNoaWxkcmVuICovLAorCQkJCQludWxsLAorCQkJCQludWxsCisJCQkJKTsKKwkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJCXN0YXR1cy5hZGQoZS5nZXRTdGF0dXMoKSk7CisJCQl9CisJCX0KKwl9CisKKwkvKgorCSAqIFZlcmlmeSB0aGF0IGEgcGFyZW50IG9mIGFuIG9wdGlvbmFsIGNoaWxkIGlzIGNvbmZpZ3VyZWQgYmVmb3JlIHdlIGFsbG93CisJICogdGhlIGNoaWxkIHRvIGJlIGNvbmZpZ3VyZWQgYXMgd2VsbAorCSAqLworCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja09wdGlvbmFsQ2hpbGRDb25maWd1cmluZygKKwkJSUZlYXR1cmUgZmVhdHVyZSwKKwkJQXJyYXlMaXN0IHN0YXR1cykKKwkJdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlJTG9jYWxTaXRlIGxvY2FsU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpOworCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnID0gbG9jYWxTaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCk7CisJCUlDb25maWd1cmVkU2l0ZVtdIGNzaXRlcyA9IGNvbmZpZy5nZXRDb25maWd1cmVkU2l0ZXMoKTsKKworCQlib29sZWFuIGluY2x1ZGVkID0gZmFsc2U7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgY3NpdGVzLmxlbmd0aDsgaSsrKSB7CisJCQlJQ29uZmlndXJlZFNpdGUgY3NpdGUgPSBjc2l0ZXNbaV07CisJCQlJU2l0ZUZlYXR1cmVSZWZlcmVuY2VbXSBjcmVmcyA9CisJCQkJY3NpdGUuZ2V0U2l0ZSgpLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7CisJCQlmb3IgKGludCBqID0gMDsgaiA8IGNyZWZzLmxlbmd0aDsgaisrKSB7CisJCQkJSUZlYXR1cmVSZWZlcmVuY2UgY3JlZiA9IGNyZWZzW2pdOworCQkJCUlGZWF0dXJlIGNmZWF0dXJlID0gbnVsbDsKKwkJCQl0cnkgeworCQkJCQljZmVhdHVyZSA9IGNyZWYuZ2V0RmVhdHVyZShudWxsKTsKKwkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCQkJLy9GSVhNRTogY2Fubm90IGFzayAnaXNPcHRpb25hbCcgaGVyZQorCQkJCQkvLyBJZ25vcmUgbWlzc2luZyBvcHRpb25hbCBmZWF0dXJlLgorCQkJCQkvKgorCQkJCQkgKiBpZiAoY3JlZi5pc09wdGlvbmFsKCkpIGNvbnRpbnVlOworCQkJCQkgKi8KKwkJCQkJdGhyb3cgZTsKKwkJCQl9CisJCQkJaWYgKGlzUGFyZW50KGNmZWF0dXJlLCBmZWF0dXJlLCB0cnVlKSkgeworCQkJCQkvLyBJbmNsdWRlZCBpbiBhdCBsZWFzdCBvbmUgZmVhdHVyZSBhcyBvcHRpb25hbAorCQkJCQlpbmNsdWRlZCA9IHRydWU7CisJCQkJCWlmIChjc2l0ZS5pc0NvbmZpZ3VyZWQoY2ZlYXR1cmUpKSB7CisJCQkJCQkvLyBBdCBsZWFzdCBvbmUgZmVhdHVyZSBwYXJlbnQKKwkJCQkJCS8vIGlzIGVuYWJsZWQgLSBpdCBpcyBPSyB0bworCQkJCQkJLy8gY29uZmlndXJlIG9wdGlvbmFsIGNoaWxkLgorCQkJCQkJcmV0dXJuOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCWlmIChpbmNsdWRlZCkgeworCQkJLy8gZmVhdHVyZSBpcyBpbmNsdWRlZCBhcyBvcHRpb25hbCBidXQKKwkJCS8vIG5vIHBhcmVudCBpcyBjdXJyZW50bHkgY29uZmlndXJlZC4KKwkJCVN0cmluZyBtc2cgPSBNZXNzYWdlcy5BY3Rpdml0eUNvbnN0cmFpbnRzX29wdGlvbmFsQ2hpbGQ7CisJCQlzdGF0dXMuYWRkKGNyZWF0ZVN0YXR1cyhmZWF0dXJlLCBGZWF0dXJlU3RhdHVzLkNPREVfT1BUSU9OQUxfQ0hJTEQsIG1zZykpOworCQl9IGVsc2UgeworCQkJLy9mZWF0dXJlIGlzIHJvb3QgLSBjYW4gYmUgY29uZmlndXJlZAorCQl9CisJfQorLy8KKy8vCS8qKgorLy8JICogQ2hlY2tzIGlmIHRoZSBjb25maWd1cmF0aW9uIGlzIGxvY2tlZCBieSBvdGhlciBpbnN0YW5jZXMKKy8vCSAqIAorLy8JICogQHBhcmFtIHN0YXR1cworLy8JICovCisvLwlwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrQ29uZmlndXJhdGlvbkxvY2soQXJyYXlMaXN0IHN0YXR1cykgeworLy8JCUlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24gY29uZmlnID0KKy8vCQkJQm9vdExvYWRlci5nZXRDdXJyZW50UGxhdGZvcm1Db25maWd1cmF0aW9uKCk7CisvLwkJVVJMIGNvbmZpZ1VSTCA9IGNvbmZpZy5nZXRDb25maWd1cmF0aW9uTG9jYXRpb24oKTsKKy8vCQlpZiAoISJmaWxlIi5lcXVhbHMoY29uZmlnVVJMLmdldFByb3RvY29sKCkpKSB7CisvLwkJCXN0YXR1cy5hZGQoCisvLwkJCQljcmVhdGVTdGF0dXMoCisvLwkJCQkJbnVsbCwKKy8vCQkJCQkiQ29uZmlndXJhdGlvbiBsb2NhdGlvbiBpcyBub3Qgd3JpdGFibGU6IiArIGNvbmZpZ1VSTCkpOworLy8JCQlyZXR1cm47CisvLwkJfQorLy8JCVN0cmluZyBsb2NhdGlvblN0cmluZyA9IGNvbmZpZ1VSTC5nZXRGaWxlKCk7CisvLwkJRmlsZSBjb25maWdEaXIgPSBuZXcgRmlsZShsb2NhdGlvblN0cmluZyk7CisvLwkJaWYgKCFjb25maWdEaXIuaXNEaXJlY3RvcnkoKSkKKy8vCQkJY29uZmlnRGlyID0gY29uZmlnRGlyLmdldFBhcmVudEZpbGUoKTsKKy8vCQlpZiAoIWNvbmZpZ0Rpci5leGlzdHMoKSkgeworLy8JCQlzdGF0dXMuYWRkKAorLy8JCQkJY3JlYXRlU3RhdHVzKG51bGwsICJDb25maWd1cmF0aW9uIGxvY2F0aW9uIGRvZXMgbm90IGV4aXN0IikpOworLy8JCQlyZXR1cm47CisvLwkJfQorLy8JCUZpbGUgbG9ja3NEaXIgPSBuZXcgRmlsZShjb25maWdEaXIsICJsb2NrcyIpOworLy8JCS8vIGNoZWNrIGFsbCB0aGUgcG9zc2libGUgbG9jayBmaWxlcworLy8JCUZpbGVbXSBsb2NrRmlsZXMgPSBsb2Nrc0Rpci5saXN0RmlsZXMoKTsKKy8vCQlGaWxlIGNvbmZpZ0xvY2sgPSBCb290TG9hZGVyLmdldEN1cnJlbnRQbGF0Zm9ybUNvbmZpZ3VyYXRpb24oKS5nZXRMb2NrRmlsZSgpOworLy8JCWZvciAoaW50IGkgPSAwOyBpIDwgbG9ja0ZpbGVzLmxlbmd0aDsgaSsrKSB7CisvLwkJCWlmIChsb2NrRmlsZXNbaV0uZXF1YWxzKGNvbmZpZ0xvY2spKQorLy8JCQkJY29udGludWU7CisvLwkJCXRyeSB7CisvLwkJCQlSYW5kb21BY2Nlc3NGaWxlIHJhZiA9IG5ldyBSYW5kb21BY2Nlc3NGaWxlKGxvY2tGaWxlc1tpXSwgInJ3Iik7CisvLwkJCQlGaWxlQ2hhbm5lbCBjaGFubmVsID0gcmFmLmdldENoYW5uZWwoKTsKKy8vCQkJCVN5c3RlbS5vdXQucHJpbnRsbihjaGFubmVsLmlzT3BlbigpKTsKKy8vCQkJCUZpbGVMb2NrIGxvY2sgPSBjaGFubmVsLnRyeUxvY2soKTsKKy8vCQkJCWlmIChsb2NrID09IG51bGwpeworLy8JCQkJCS8vIHRoZXJlIGlzIGFub3RoZXIgZWNsaXBzZSBpbnN0YW5jZSBydW5uaW5nCisvLwkJCQkJcmFmLmNsb3NlKCk7CisvLwkJCQkJc3RhdHVzLmFkZCgKKy8vCQkJCQkJY3JlYXRlU3RhdHVzKAorLy8JCQkJCQkJbnVsbCwKKy8vCQkJCQkJCSJBbm90aGVyIGluc3RhbmNlIGlzIHJ1bm5pbmcsIHBsZWFzZSBjbG9zZSBpdCBiZWZvcmUgcGVyZm9ybWluZyBhbnkgY29uZmlndXJhdGlvbiBvcGVyYXRpb25zIikpOworLy8JCQkJCXJldHVybjsKKy8vCQkJCX0KKy8vCisvLwkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisvLwkJCQlzdGF0dXMuYWRkKGNyZWF0ZVN0YXR1cyhudWxsLCAiRmFpbGVkIHRvIGNyZWF0ZSBsb2NrOiIrbG9ja0ZpbGVzW2ldKSk7CisvLwkJCQlyZXR1cm47CisvLwkJCX0gCisvLwkJfQorLy8JfQorCisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1BhcmVudCgKKwkJSUZlYXR1cmUgY2FuZGlkYXRlLAorCQlJRmVhdHVyZSBmZWF0dXJlLAorCQlib29sZWFuIG9wdGlvbmFsT25seSkKKwkJdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlW10gcmVmcyA9CisJCQljYW5kaWRhdGUuZ2V0SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpOworCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZnMubGVuZ3RoOyBpKyspIHsKKwkJCUlJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UgY2hpbGQgPSByZWZzW2ldOworCQkJVmVyc2lvbmVkSWRlbnRpZmllciBmdmlkID0gZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7CisJCQlWZXJzaW9uZWRJZGVudGlmaWVyIGN2aWQgPSBjaGlsZC5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7CisKKwkJCWlmIChmdmlkLmdldElkZW50aWZpZXIoKS5lcXVhbHMoY3ZpZC5nZXRJZGVudGlmaWVyKCkpID09IGZhbHNlKQorCQkJCWNvbnRpbnVlOworCQkJLy8gc2FtZSBJRAorCQkJUGx1Z2luVmVyc2lvbklkZW50aWZpZXIgZnZlcnNpb24gPSBmdmlkLmdldFZlcnNpb24oKTsKKwkJCVBsdWdpblZlcnNpb25JZGVudGlmaWVyIGN2ZXJzaW9uID0gY3ZpZC5nZXRWZXJzaW9uKCk7CisKKwkJCWlmIChmdmVyc2lvbi5lcXVhbHMoY3ZlcnNpb24pKSB7CisJCQkJLy8gaW5jbHVkZWQgYW5kIG1hdGNoZWQ7IHJldHVybiB0cnVlIGlmIG9wdGlvbmFsaXR5IGlzIG5vdAorCQkJCS8vIGltcG9ydGFudCBvciBpdCBpcyBhbmQgdGhlIGluY2x1c2lvbiBpcyBvcHRpb25hbAorCQkJCXJldHVybiBvcHRpb25hbE9ubHkgPT0gZmFsc2UgfHwgY2hpbGQuaXNPcHRpb25hbCgpOworCQkJfQorCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKy8vCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gY2hlY2tUaW1lbGluZSgKKy8vCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnLAorLy8JCUFycmF5TGlzdCBzdGF0dXMpIHsKKy8vCQl0cnkgeworLy8JCQlJTG9jYWxTaXRlIGxzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7CisvLwkJCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjY29uZmlnID0gbHNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKTsKKy8vCQkJaWYgKGNjb25maWcuZ2V0VGltZWxpbmUoKSAhPSBjb25maWcuZ2V0VGltZWxpbmUoKSkgeworLy8JCQkJLy8gTm90IHRoZSBzYW1lIHRpbWVsaW5lIC0gY2Fubm90IHJldmVydAorLy8JCQkJU3RyaW5nIG1zZyA9CisvLwkJCQkJVXBkYXRlVXRpbHMuZ2V0Rm9ybWF0dGVkTWVzc2FnZSgKKy8vCQkJCQkJS0VZX1dST05HX1RJTUVMSU5FLAorLy8JCQkJCQljb25maWcuZ2V0TGFiZWwoKSk7CisvLwkJCQlzdGF0dXMuYWRkKGNyZWF0ZVN0YXR1cyhudWxsLCBGZWF0dXJlU3RhdHVzLkNPREVfT1RIRVIsIG1zZykpOworLy8JCQkJcmV0dXJuIGZhbHNlOworLy8JCQl9CisvLwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisvLwkJCXN0YXR1cy5hZGQoZS5nZXRTdGF0dXMoKSk7CisvLwkJfQorLy8JCXJldHVybiB0cnVlOworLy8JfQorCisJcHJpdmF0ZSBzdGF0aWMgSVN0YXR1cyBjcmVhdGVNdWx0aVN0YXR1cygKKwkJU3RyaW5nIG1lc3NhZ2UsCisJCUFycmF5TGlzdCBjaGlsZHJlbiwKKwkJaW50IGNvZGUpIHsKKwkJSVN0YXR1c1tdIGNhcnJheSA9CisJCQkoSVN0YXR1c1tdKSBjaGlsZHJlbi50b0FycmF5KG5ldyBJU3RhdHVzW2NoaWxkcmVuLnNpemUoKV0pOworCQlyZXR1cm4gbmV3IE11bHRpU3RhdHVzKAorCQkJVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwKKwkJCWNvZGUsCisJCQljYXJyYXksCisJCQltZXNzYWdlLAorCQkJbnVsbCk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgSVN0YXR1cyBjcmVhdGVTdGF0dXMoSUZlYXR1cmUgZmVhdHVyZSwgaW50IGVycm9yQ29kZSwgU3RyaW5nIG1lc3NhZ2UpIHsKKworCQlTdHJpbmcgZnVsbE1lc3NhZ2U7CisJCWlmIChmZWF0dXJlID09IG51bGwpCisJCQlmdWxsTWVzc2FnZSA9IG1lc3NhZ2U7CisJCWVsc2UgeworCQkJUGx1Z2luVmVyc2lvbklkZW50aWZpZXIgdmVyc2lvbiA9CisJCQkJZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0VmVyc2lvbigpOworCQkJZnVsbE1lc3NhZ2UgPQorCQkJCU5MUy5iaW5kKE1lc3NhZ2VzLkFjdGl2aXR5Q29uc3RyYWludHNfY2hpbGRNZXNzYWdlLCAobmV3IFN0cmluZ1tdIHsKKyAgICAgICAgICAgICAgICBmZWF0dXJlLmdldExhYmVsKCksCisgICAgICAgICAgICAgICAgdmVyc2lvbi50b1N0cmluZygpLAorICAgICAgICAgICAgICAgIG1lc3NhZ2UgfSkpOworCQl9CisKKwkJcmV0dXJuIG5ldyBGZWF0dXJlU3RhdHVzKAorCQkJZmVhdHVyZSwKKwkJCUlTdGF0dXMuRVJST1IsCisJCQlVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLAorCQkJZXJyb3JDb2RlLAorCQkJZnVsbE1lc3NhZ2UsCisJCQludWxsKTsKKwl9CisKKwkvLwlwcml2YXRlIHN0YXRpYyBJU3RhdHVzIGNyZWF0ZVJlcG9ydFN0YXR1cyhBcnJheUxpc3QgYmVmb3JlU3RhdHVzLAorCS8vIEFycmF5TGlzdCBzdGF0dXMpIHsKKwkvLwkJLy8gcmVwb3J0IHN0YXR1cworCS8vCQlpZiAoc3RhdHVzLnNpemUoKSA+IDApIHsKKwkvLwkJCWlmIChiZWZvcmVTdGF0dXMuc2l6ZSgpID4gMCkKKwkvLwkJCQlyZXR1cm4gY3JlYXRlTXVsdGlTdGF0dXMoS0VZX1JPT1RfTUVTU0FHRV9JTklULAorCS8vIGJlZm9yZVN0YXR1cyxJU3RhdHVzLkVSUk9SKTsKKwkvLwkJCWVsc2UKKwkvLwkJCQlyZXR1cm4gY3JlYXRlTXVsdGlTdGF0dXMoS0VZX1JPT1RfTUVTU0FHRSwgc3RhdHVzLElTdGF0dXMuRVJST1IpOworCS8vCQl9CisJLy8JCXJldHVybiBudWxsOworCS8vCX0KKworCXByaXZhdGUgc3RhdGljIElTdGF0dXMgY3JlYXRlQ29tYmluZWRSZXBvcnRTdGF0dXMoCisJCUFycmF5TGlzdCBiZWZvcmVTdGF0dXMsCisJCUFycmF5TGlzdCBzdGF0dXMpIHsKKwkJaWYgKGJlZm9yZVN0YXR1cy5zaXplKCkgPT0gMCkgeyAvLyBnb29kIGluaXRpYWwgY29uZmlnCisJCQlpZiAoc3RhdHVzLnNpemUoKSA9PSAwKSB7CisJCQkJcmV0dXJuIG51bGw7IC8vIGFsbCBmaW5lCisJCQl9IGVsc2UgeworCQkJCXJldHVybiBjcmVhdGVNdWx0aVN0YXR1cyhNZXNzYWdlcy5BY3Rpdml0eUNvbnN0cmFpbnRzX3Jvb3RNZXNzYWdlLAorCQkJCQlzdGF0dXMsCisJCQkJCUlTdGF0dXMuRVJST1IpOworCQkJCS8vIGVycm9yIGFmdGVyIG9wZXJhdGlvbgorCQkJfQorCQl9IGVsc2UgeyAvLyBiZWZvcmVTdGF0dXMuc2l6ZSgpID4gMCA6IGluaXRpYWwgY29uZmlnIGVycm9ycworCQkJaWYgKHN0YXR1cy5zaXplKCkgPT0gMCkgeworCQkJCXJldHVybiBudWxsOyAvLyBlcnJvcnMgd2lsbCBiZSBmaXhlZAorCQkJfSBlbHNlIHsKKwkJCQlpZiAoaXNCZXR0ZXJTdGF0dXMoYmVmb3JlU3RhdHVzLCBzdGF0dXMpKSB7CisJCQkJCXJldHVybiBjcmVhdGVNdWx0aVN0YXR1cygKKwkJCQkJCU1lc3NhZ2VzLkFjdGl2aXR5Q29uc3RyYWludHNfd2FybmluZywKKwkJCQkJCWJlZm9yZVN0YXR1cywKKwkJCQkJCUlTdGF0dXMuV0FSTklORyk7CisJCQkJCS8vIGVycm9ycyBtYXkgYmUgZml4ZWQKKwkJCQl9IGVsc2UgeworCQkJCQlBcnJheUxpc3QgY29tYmluZWQgPSBuZXcgQXJyYXlMaXN0KCk7CisJCQkJCWNvbWJpbmVkLmFkZCgKKwkJCQkJCWNyZWF0ZU11bHRpU3RhdHVzKAorCQkJCQkJCU1lc3NhZ2VzLkFjdGl2aXR5Q29uc3RyYWludHNfYmVmb3JlTWVzc2FnZSwKKwkJCQkJCQliZWZvcmVTdGF0dXMsCisJCQkJCQkJSVN0YXR1cy5FUlJPUikpOworCQkJCQljb21iaW5lZC5hZGQoCisJCQkJCQljcmVhdGVNdWx0aVN0YXR1cygKKwkJCQkJCQlNZXNzYWdlcy5BY3Rpdml0eUNvbnN0cmFpbnRzX2FmdGVyTWVzc2FnZSwKKwkJCQkJCQlzdGF0dXMsCisJCQkJCQkJSVN0YXR1cy5FUlJPUikpOworCQkJCQlyZXR1cm4gY3JlYXRlTXVsdGlTdGF0dXMoCisJCQkJCQlNZXNzYWdlcy5BY3Rpdml0eUNvbnN0cmFpbnRzX3Jvb3RNZXNzYWdlSW5pdGlhbCwKKwkJCQkJCWNvbWJpbmVkLAorCQkJCQkJSVN0YXR1cy5FUlJPUik7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgQXJyYXlMaXN0IGNyZWF0ZUxpc3QoU3RyaW5nIGNvbW1hU2VwYXJhdGVkTGlzdCkgeworCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKwkJaWYgKGNvbW1hU2VwYXJhdGVkTGlzdCAhPSBudWxsKSB7CisJCQlTdHJpbmdUb2tlbml6ZXIgdCA9CisJCQkJbmV3IFN0cmluZ1Rva2VuaXplcihjb21tYVNlcGFyYXRlZExpc3QudHJpbSgpLCAiLCIpOyAvLyROT04tTkxTLTEkCisJCQl3aGlsZSAodC5oYXNNb3JlVG9rZW5zKCkpIHsKKwkJCQlTdHJpbmcgdG9rZW4gPSB0Lm5leHRUb2tlbigpLnRyaW0oKTsKKwkJCQlpZiAoIXRva2VuLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKKwkJCQkJbGlzdC5hZGQodG9rZW4pOworCQkJfQorCQl9CisJCXJldHVybiBsaXN0OworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiBzdGF0dXMgaXMgYSBzdWJzZXQgb2YgYmVmb3JlU3RhdHVzCisJICogCisJICogQHBhcmFtIGJlZm9yZVN0YXR1cworCSAqIEBwYXJhbSBzdGF0dXMKKwkgKiBAcmV0dXJuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0JldHRlclN0YXR1cygKKwkJQXJyYXlMaXN0IGJlZm9yZVN0YXR1cywKKwkJQXJyYXlMaXN0IHN0YXR1cykgeworCQkvLyBpZiBubyBzdGF0dXMgYXQgYWxsLCB0aGVuIGl0J3MgYSBzdWJzZXQKKwkJaWYgKHN0YXR1cyA9PSBudWxsIHx8IHN0YXR1cy5zaXplKCkgPT0gMCkKKwkJCXJldHVybiB0cnVlOworCQkvLyB0aGVyZSBpcyBzb21lIHN0YXR1cywgc28gaWYgdGhlcmUgaXMgbm8gaW5pdGlhbCBzdGF0dXMsIHRoZW4gaXQncworCQkvLyBub3QgYSBzdWJzZXQKKwkJaWYgKGJlZm9yZVN0YXR1cyA9PSBudWxsIHx8IGJlZm9yZVN0YXR1cy5zaXplKCkgPT0gMCkKKwkJCXJldHVybiBmYWxzZTsKKwkJLy8gcXVpY2sgY2hlY2sKKwkJaWYgKGJlZm9yZVN0YXR1cy5zaXplKCkgPCBzdGF0dXMuc2l6ZSgpKQorCQkJcmV0dXJuIGZhbHNlOworCisJCS8vIGNoZWNrIGlmIGFsbCB0aGUgc3RhdHVzIGVsZW1lbnRzIGFwcGVhciBpbiB0aGUgb3JpZ2luYWwgc3RhdHVzCisJCWZvciAoaW50IGkgPSAwOyBpIDwgc3RhdHVzLnNpemUoKTsgaSsrKSB7CisJCQlJU3RhdHVzIHMgPSAoSVN0YXR1cykgc3RhdHVzLmdldChpKTsKKwkJCS8vIGlmIHRoaXMgaXMgbm90IGEgZmVhdHVyZSBzdGF0dXMsIHNvbWV0aGluZyBpcyB3cm9uZywgc28gcmV0dXJuCisJCQkvLyBmYWxzZQorCQkJaWYgKCEocyBpbnN0YW5jZW9mIEZlYXR1cmVTdGF0dXMpKQorCQkJCXJldHVybiBmYWxzZTsKKwkJCUZlYXR1cmVTdGF0dXMgZnMgPSAoRmVhdHVyZVN0YXR1cykgczsKKwkJCS8vIGNoZWNrIGFnYWluc3QgYWxsIHN0YXR1cyBlbGVtZW50cworCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOworCQkJZm9yIChpbnQgaiA9IDA7ICFmb3VuZCAmJiBqIDwgYmVmb3JlU3RhdHVzLnNpemUoKTsgaisrKSB7CisJCQkJaWYgKGZzLmVxdWFscyhiZWZvcmVTdGF0dXMuZ2V0KGopKSkKKwkJCQkJZm91bmQgPSB0cnVlOworCQkJfQorCQkJaWYgKCFmb3VuZCkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCQorCXB1YmxpYyBjbGFzcyBSZXF1aXJlZEZlYXR1cmVzUmVzdWx0IHsKKwkJCisJCXByaXZhdGUgSVN0YXR1cyBzdGF0dXM7CisJCXByaXZhdGUgU2V0IHJlcXVpcmVkRmVhdHVyZXM7CisJCQorCQlwdWJsaWMgU2V0IGdldFJlcXVpcmVkRmVhdHVyZXMoKSB7CisJCQlyZXR1cm4gcmVxdWlyZWRGZWF0dXJlczsKKwkJfQorCQlwdWJsaWMgdm9pZCBzZXRSZXF1aXJlZEZlYXR1cmVzKFNldCByZXF1aXJlZEZlYXR1cmVzKSB7CisJCQl0aGlzLnJlcXVpcmVkRmVhdHVyZXMgPSByZXF1aXJlZEZlYXR1cmVzOworCQl9CisJCXB1YmxpYyB2b2lkIGFkZFJlcXVpcmVkRmVhdHVyZXMoU2V0IHJlcXVpcmVkRmVhdHVyZXMpIHsKKwkJCWlmIChyZXF1aXJlZEZlYXR1cmVzID09IG51bGwpIHsKKwkJCQlyZXF1aXJlZEZlYXR1cmVzID0gbmV3IEhhc2hTZXQoKTsKKwkJCX0KKwkJCXRoaXMucmVxdWlyZWRGZWF0dXJlcy5hZGRBbGwocmVxdWlyZWRGZWF0dXJlcyk7CisJCX0KKwkJcHVibGljIElTdGF0dXMgZ2V0U3RhdHVzKCkgeworCQkJcmV0dXJuIHN0YXR1czsKKwkJfQorCQlwdWJsaWMgdm9pZCBzZXRTdGF0dXMoSVN0YXR1cyBzdGF0dXMpIHsKKwkJCXRoaXMuc3RhdHVzID0gc3RhdHVzOworCQl9CisJCQorCQkKKwl9CisJCisJcHVibGljIHN0YXRpYyBjbGFzcyBJbnRlcm5hbEltcG9ydCB7CisJCQorCQlwcml2YXRlIElJbXBvcnQgaWltcG9ydDsKKworCQlwdWJsaWMgSW50ZXJuYWxJbXBvcnQoSUltcG9ydCBpaW1wb3J0KSB7CisJCQl0aGlzLmlpbXBvcnQgPSBpaW1wb3J0OworCQl9CisJCQorCQlwdWJsaWMgSUltcG9ydCBnZXRJbXBvcnQoKSB7CisJCQlyZXR1cm4gaWltcG9ydDsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHNldEltcG9ydChJSW1wb3J0IGlpbXBvcnQpIHsKKwkJCXRoaXMuaWltcG9ydCA9IGlpbXBvcnQ7CisJCX0KKwkJCisJCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KSB7CisKKwkJCWlmICggKCBvYmplY3QgPT0gbnVsbCkgfHwgIShvYmplY3QgaW5zdGFuY2VvZiBJbnRlcm5hbEltcG9ydCkpCisJCQkJcmV0dXJuIGZhbHNlOworCQkJCisJCQlpZiAoIG9iamVjdCA9PSB0aGlzKQorCQkJCXJldHVybiB0cnVlOworCQkJCisJCQlyZXR1cm4gaWltcG9ydC5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZXF1YWxzKCAoKEludGVybmFsSW1wb3J0KW9iamVjdCkuZ2V0SW1wb3J0KCkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpKSAmJiAoZ2V0SW1wb3J0KCkuZ2V0UnVsZSgpID09ICgoSW50ZXJuYWxJbXBvcnQpb2JqZWN0KS5nZXRJbXBvcnQoKS5nZXRSdWxlKCkpOworCisJCX0KKworCQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworCQkJcmV0dXJuIGlpbXBvcnQuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmhhc2hDb2RlKCkgKiBpaW1wb3J0LmdldFJ1bGUoKTsKKwkJfQorCQkKKwl9CisKK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvUGF0Y2hDbGVhbmVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL1BhdGNoQ2xlYW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxZjQxOWMKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL1BhdGNoQ2xlYW5lci5qYXZhCkBAIC0wLDAgKzEsNjQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwub3BlcmF0aW9uczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKKworLyoqCisgKiBUaGlzIHV0aWxpdHkgY2xhc3MgYXR0YWNoZXMgYXMgYSBsaXN0ZW5lZCB0byB0aGUgcHJvdmlkZWQKKyAqIGNvbmZpZ3VyZWQgc2l0ZSwgYW5kIGZvciBldmVyeSB1bmNvbmZpZ3VyZWQgZmVhdHVyZSAKKyAqIGl0IHRlc3RzIGlmIGl0IGlzIGEgcGF0Y2ggYW5kIGNsZWFucyB1cCBpdHMgYmFja3VwIGNvbmZpZ3VyYXRpb24uCisgKi8KKworcHVibGljIGNsYXNzIFBhdGNoQ2xlYW5lciB7CisJcHJpdmF0ZSBJQ29uZmlndXJlZFNpdGUgY3NpdGU7CisJcHJpdmF0ZSBTaXRlTGlzdGVuZXIgbGlzdGVuZXI7CisJY2xhc3MgU2l0ZUxpc3RlbmVyIGltcGxlbWVudHMgSUNvbmZpZ3VyZWRTaXRlQ2hhbmdlZExpc3RlbmVyIHsKKwkJcHVibGljIHZvaWQgZmVhdHVyZUluc3RhbGxlZChJRmVhdHVyZSBmZWF0dXJlKSB7CisJCX0KKwkJcHVibGljIHZvaWQgZmVhdHVyZVJlbW92ZWQoSUZlYXR1cmUgZmVhdHVyZSkgeworCQkJY2xlYW5TYXZlZENvbmZpZ3MoZmVhdHVyZSk7CisJCX0KKwkJcHVibGljIHZvaWQgZmVhdHVyZUNvbmZpZ3VyZWQoSUZlYXR1cmUgZmVhdHVyZSkgeworCQl9CisJCXB1YmxpYyB2b2lkIGZlYXR1cmVVbmNvbmZpZ3VyZWQoSUZlYXR1cmUgZmVhdHVyZSkgeworCQkJY2xlYW5TYXZlZENvbmZpZ3MoZmVhdHVyZSk7CisJCX0KKwl9CisJcHVibGljIFBhdGNoQ2xlYW5lcihJQ29uZmlndXJlZFNpdGUgY3NpdGUsIElGZWF0dXJlIHJvb3QpIHsKKwkJdGhpcy5jc2l0ZSA9IGNzaXRlOworCQlsaXN0ZW5lciA9IG5ldyBTaXRlTGlzdGVuZXIoKTsKKwkJY3NpdGUuYWRkQ29uZmlndXJlZFNpdGVDaGFuZ2VkTGlzdGVuZXIobGlzdGVuZXIpOworCX0KKworCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCWNzaXRlLnJlbW92ZUNvbmZpZ3VyZWRTaXRlQ2hhbmdlZExpc3RlbmVyKGxpc3RlbmVyKTsKKwl9CisJcHJpdmF0ZSB2b2lkIGNsZWFuU2F2ZWRDb25maWdzKElGZWF0dXJlIGZlYXR1cmUpIHsKKwkJaWYgKGZlYXR1cmUuaXNQYXRjaCgpKSB7CisJCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gYmFja3VwQ29uZmlnID0gVXBkYXRlVXRpbHMuZ2V0QmFja3VwQ29uZmlndXJhdGlvbkZvcihmZWF0dXJlKTsKKwkJCWlmIChiYWNrdXBDb25maWchPW51bGwpIHsKKwkJCQkvLyBjbGVhbiBpdAorCQkJCXJlbW92ZShiYWNrdXBDb25maWcpOworCQkJfQorCQl9CisJfQorCXByaXZhdGUgdm9pZCByZW1vdmUoSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZykgeworCQl0cnkgeworCQkJSUxvY2FsU2l0ZSBsb2NhbFNpdGUgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsKKwkJCWxvY2FsU2l0ZS5yZW1vdmVGcm9tUHJlc2VydmVkQ29uZmlndXJhdGlvbnMoY29uZmlnKTsKKwkJfQorCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL1JlcGxhY2VGZWF0dXJlVmVyc2lvbk9wZXJhdGlvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9SZXBsYWNlRmVhdHVyZVZlcnNpb25PcGVyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDU4NThiCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9SZXBsYWNlRmVhdHVyZVZlcnNpb25PcGVyYXRpb24uamF2YQpAQCAtMCwwICsxLDEwMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy4qOworCisvKioKKyAqIFN3YXBzIGEgZmVhdHVyZS4KKyAqIFJlcGxhY2VGZWF0dXJlVmVyc2lvbk9wZXJhdGlvbgorICovCitwdWJsaWMgY2xhc3MgUmVwbGFjZUZlYXR1cmVWZXJzaW9uT3BlcmF0aW9uCisJZXh0ZW5kcyBGZWF0dXJlT3BlcmF0aW9uCisJaW1wbGVtZW50cyBJQ29uZmlnRmVhdHVyZU9wZXJhdGlvbiB7CisKKwlwcml2YXRlIElGZWF0dXJlIGFub3RoZXJGZWF0dXJlOworCQorCXB1YmxpYyBSZXBsYWNlRmVhdHVyZVZlcnNpb25PcGVyYXRpb24oCisJCUlGZWF0dXJlIGZlYXR1cmUsCisJCUlGZWF0dXJlIGFub3RoZXJGZWF0dXJlKSB7CisJCXN1cGVyKGZlYXR1cmUuZ2V0U2l0ZSgpLmdldEN1cnJlbnRDb25maWd1cmVkU2l0ZSgpLCBmZWF0dXJlKTsKKwkJdGhpcy5hbm90aGVyRmVhdHVyZSA9IGFub3RoZXJGZWF0dXJlOworCX0KKworCXB1YmxpYyBib29sZWFuIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBwbSwgSU9wZXJhdGlvbkxpc3RlbmVyIGxpc3RlbmVyKQorCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisKKwkJSVN0YXR1cyBzdGF0dXMgPQorCQkJT3BlcmF0aW9uc01hbmFnZXIuZ2V0VmFsaWRhdG9yKCkudmFsaWRhdGVQZW5kaW5nUmVwbGFjZVZlcnNpb24oZmVhdHVyZSwgYW5vdGhlckZlYXR1cmUpOworCQlpZiAoc3RhdHVzICE9IG51bGwpIHsKKwkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1cyk7CisJCX0KKworCQkvLyB1bmNvbmZpZ3VyZSBjdXJyZW50IGZlYXR1cmUgZmlyc3QsIHRoZW4gY29uZmlndXJlIHRoZSBvdGhlciBvbmUKKwkJCisJCVBhdGNoQ2xlYW5lciBjbGVhbmVyID0gbmV3IFBhdGNoQ2xlYW5lcih0YXJnZXRTaXRlLCBmZWF0dXJlKTsKKwkJdGFyZ2V0U2l0ZS51bmNvbmZpZ3VyZShmZWF0dXJlKTsKKwkJY2xlYW5lci5kaXNwb3NlKCk7CisJCQorCQl0YXJnZXRTaXRlLmNvbmZpZ3VyZShhbm90aGVyRmVhdHVyZSk7CisvLwkJZW5zdXJlVW5pcXVlKCk7CisKKwkJdHJ5IHsKKwkJCS8vIFJlc3RhcnQgbm90IG5lZWRlZAorCQkJYm9vbGVhbiByZXN0YXJ0TmVlZGVkID0gZmFsc2U7CisKKwkJCS8vIENoZWNrIGlmIHRoaXMgb3BlcmF0aW9uIGlzIGNhbmNlbGxpbmcgb25lIHRoYXQncyBhbHJlYWR5IHBlbmRpbmcKKwkJCUlPcGVyYXRpb24gcGVuZGluZ09wZXJhdGlvbiA9CisJCQkJT3BlcmF0aW9uc01hbmFnZXIuZmluZFBlbmRpbmdPcGVyYXRpb24oZmVhdHVyZSk7CisKKwkJCWlmIChwZW5kaW5nT3BlcmF0aW9uIGluc3RhbmNlb2YgSUNvbmZpZ0ZlYXR1cmVPcGVyYXRpb24pIHsKKwkJCQkvLyBubyBuZWVkIHRvIGRvIGVpdGhlciBwZW5kaW5nIGNoYW5nZQorCQkJCU9wZXJhdGlvbnNNYW5hZ2VyLnJlbW92ZVBlbmRpbmdPcGVyYXRpb24ocGVuZGluZ09wZXJhdGlvbik7CisJCQl9IGVsc2UgeworCQkJCU9wZXJhdGlvbnNNYW5hZ2VyLmFkZFBlbmRpbmdPcGVyYXRpb24odGhpcyk7CisJCQkJcmVzdGFydE5lZWRlZCA9IHRydWU7CisJCQl9CisJCQkKKwkJCXBlbmRpbmdPcGVyYXRpb24gPQorCQkJCU9wZXJhdGlvbnNNYW5hZ2VyLmZpbmRQZW5kaW5nT3BlcmF0aW9uKGFub3RoZXJGZWF0dXJlKTsKKwkJCQkKKwkJCWlmIChwZW5kaW5nT3BlcmF0aW9uIGluc3RhbmNlb2YgSVVuY29uZmlnRmVhdHVyZU9wZXJhdGlvbikgeworCQkJCS8vIG5vIG5lZWQgdG8gZG8gZWl0aGVyIHBlbmRpbmcgY2hhbmdlCisJCQkJT3BlcmF0aW9uc01hbmFnZXIucmVtb3ZlUGVuZGluZ09wZXJhdGlvbihwZW5kaW5nT3BlcmF0aW9uKTsKKwkJCX0gZWxzZSB7CisJCQkJT3BlcmF0aW9uc01hbmFnZXIuYWRkUGVuZGluZ09wZXJhdGlvbih0aGlzKTsKKwkJCQlyZXN0YXJ0TmVlZGVkID0gdHJ1ZTsKKwkJCX0KKwkJCQorCQkJbWFya1Byb2Nlc3NlZCgpOworCQkJaWYgKGxpc3RlbmVyICE9IG51bGwpCisJCQkJbGlzdGVuZXIuYWZ0ZXJFeGVjdXRlKHRoaXMsIG51bGwpOworCisJCQlyZXN0YXJ0TmVlZGVkID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkuc2F2ZSgpICYmIHJlc3RhcnROZWVkZWQ7CisKKwkJCS8vIG5vdGlmeSB0aGUgbW9kZWwKKwkJCU9wZXJhdGlvbnNNYW5hZ2VyLmZpcmVPYmplY3RDaGFuZ2VkKGZlYXR1cmUsIG51bGwpOworCisJCQlyZXR1cm4gcmVzdGFydE5lZWRlZDsKKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQl1bmRvKCk7CisJCQlVcGRhdGVVdGlscy5sb2dFeGNlcHRpb24oZSk7CisJCQl0aHJvdyBlOworCQl9CisJfQorCisJcHVibGljIHZvaWQgdW5kbygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJdGFyZ2V0U2l0ZS51bmNvbmZpZ3VyZShhbm90aGVyRmVhdHVyZSk7CisJCXRhcmdldFNpdGUuY29uZmlndXJlKGZlYXR1cmUpOworCX0KK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvUmV2ZXJ0Q29uZmlndXJhdGlvbk9wZXJhdGlvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9SZXZlcnRDb25maWd1cmF0aW9uT3BlcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNlOTcwMgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvUmV2ZXJ0Q29uZmlndXJhdGlvbk9wZXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwub3BlcmF0aW9uczsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuKjsKKworcHVibGljIGNsYXNzIFJldmVydENvbmZpZ3VyYXRpb25PcGVyYXRpb24gZXh0ZW5kcyBPcGVyYXRpb24gaW1wbGVtZW50cyBJUmV2ZXJ0Q29uZmlndXJhdGlvbk9wZXJhdGlvbiB7CisKKwlwcml2YXRlIElJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWc7CisJcHJpdmF0ZSBJUHJvYmxlbUhhbmRsZXIgcHJvYmxlbUhhbmRsZXI7CisKKwlwdWJsaWMgUmV2ZXJ0Q29uZmlndXJhdGlvbk9wZXJhdGlvbigKKwkJSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZywKKwkJSVByb2JsZW1IYW5kbGVyIHByb2JsZW1IYW5kbGVyKSB7CisJCXN1cGVyKCk7CisJCXRoaXMuY29uZmlnID0gY29uZmlnOworCQl0aGlzLnByb2JsZW1IYW5kbGVyID0gcHJvYmxlbUhhbmRsZXI7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuSU9wZXJhdGlvbiNleGVjdXRlKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQorCSAqLworCXB1YmxpYyBib29sZWFuIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJT3BlcmF0aW9uTGlzdGVuZXIgbGlzdGVuZXIpCisJCXRocm93cyBDb3JlRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKKwkJSVN0YXR1cyBzdGF0dXMgPQorCQkJT3BlcmF0aW9uc01hbmFnZXIuZ2V0VmFsaWRhdG9yKCkudmFsaWRhdGVQZW5kaW5nUmV2ZXJ0KGNvbmZpZyk7CisJCWlmIChzdGF0dXMgIT0gbnVsbCAmJiBzdGF0dXMuZ2V0Q29kZSgpID09IElTdGF0dXMuRVJST1IpIHsKKwkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1cyk7CisJCX0KKworCQl0cnkgeworCQkJSUxvY2FsU2l0ZSBsb2NhbFNpdGUgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsKKwkJCWxvY2FsU2l0ZS5yZXZlcnRUbyhjb25maWcsIG1vbml0b3IsIHByb2JsZW1IYW5kbGVyKTsKKwkJCWxvY2FsU2l0ZS5zYXZlKCk7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQlVcGRhdGVVdGlscy5sb2dFeGNlcHRpb24oZSk7CisJCQl0aHJvdyBlOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9Ub2dnbGVTaXRlT3BlcmF0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL1RvZ2dsZVNpdGVPcGVyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWZjZDIxCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9Ub2dnbGVTaXRlT3BlcmF0aW9uLmphdmEKQEAgLTAsMCArMSw1OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLio7CisKK3B1YmxpYyBjbGFzcyBUb2dnbGVTaXRlT3BlcmF0aW9uCisJZXh0ZW5kcyBPcGVyYXRpb24KKwlpbXBsZW1lbnRzIElUb2dnbGVTaXRlT3BlcmF0aW9uIHsKKworCXByaXZhdGUgSUNvbmZpZ3VyZWRTaXRlIHNpdGU7CisKKwlwdWJsaWMgVG9nZ2xlU2l0ZU9wZXJhdGlvbihJQ29uZmlndXJlZFNpdGUgc2l0ZSkgeworCQlzdXBlcigpOworCQl0aGlzLnNpdGUgPSBzaXRlOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLklPcGVyYXRpb24jZXhlY3V0ZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBleGVjdXRlKAorCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsCisJCUlPcGVyYXRpb25MaXN0ZW5lciBsaXN0ZW5lcikKKwkJdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlpZiAoc2l0ZSA9PSBudWxsKQorCQkJcmV0dXJuIGZhbHNlOworCQlib29sZWFuIG9sZFZhbHVlID0gc2l0ZS5pc0VuYWJsZWQoKTsKKwkJc2l0ZS5zZXRFbmFibGVkKCFvbGRWYWx1ZSk7CisJCUlTdGF0dXMgc3RhdHVzID0gT3BlcmF0aW9uc01hbmFnZXIuZ2V0VmFsaWRhdG9yKCkudmFsaWRhdGVDdXJyZW50U3RhdGUoKTsKKwkJaWYgKHN0YXR1cyAhPSBudWxsKSB7CisJCQkvLyByZXZlcnQKKwkJCXNpdGUuc2V0RW5hYmxlZChvbGRWYWx1ZSk7CisJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXMpOworCQl9IGVsc2UgeworCQkJdHJ5IHsKKwkJCQlib29sZWFuIHJlc3RhcnROZWVkZWQgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKS5zYXZlKCk7CisJCQkJT3BlcmF0aW9uc01hbmFnZXIuZmlyZU9iamVjdENoYW5nZWQoc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCisJCQkJcmV0dXJuIHJlc3RhcnROZWVkZWQ7IC8vIHdpbGwgcmVzdGFydCBvbmx5IGlmIGNoYW5nZXMgY291bGQgbm90IGJlIGFwcGxpZWQgdG8gY3VycmVudCBjb25maWcKKwkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJCS8vcmV2ZXJ0CisJCQkJc2l0ZS5zZXRFbmFibGVkKG9sZFZhbHVlKTsKKwkJCQlVcGRhdGVVdGlscy5sb2dFeGNlcHRpb24oZSk7CisJCQkJdGhyb3cgZTsKKwkJCX0KKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvVW5jb25maWdPcGVyYXRpb24uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvVW5jb25maWdPcGVyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGM4ODA4Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9VbmNvbmZpZ09wZXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsODIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwub3BlcmF0aW9uczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy4qOworCisvKioKKyAqIFVuY29uZmlndXJlIGEgZmVhdHVyZS4KKyAqIFVuY29uZmlnT3BlcmF0aW9uCisgKi8KK3B1YmxpYyBjbGFzcyBVbmNvbmZpZ09wZXJhdGlvbgorCWV4dGVuZHMgRmVhdHVyZU9wZXJhdGlvbgorCWltcGxlbWVudHMgSVVuY29uZmlnRmVhdHVyZU9wZXJhdGlvbiB7CisKKwlwdWJsaWMgVW5jb25maWdPcGVyYXRpb24oCisJCUlDb25maWd1cmVkU2l0ZSBzaXRlLAorCQlJRmVhdHVyZSBmZWF0dXJlKSB7CisJCXN1cGVyKHNpdGUsIGZlYXR1cmUpOworCX0KKworCXB1YmxpYyBib29sZWFuIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBwbSwgSU9wZXJhdGlvbkxpc3RlbmVyIGxpc3RlbmVyKQorCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisKKwkJSVN0YXR1cyBzdGF0dXMgPQorCQkJT3BlcmF0aW9uc01hbmFnZXIuZ2V0VmFsaWRhdG9yKCkudmFsaWRhdGVQZW5kaW5nVW5jb25maWcoZmVhdHVyZSk7CisJCWlmIChzdGF0dXMgIT0gbnVsbCAmJiBzdGF0dXMuZ2V0Q29kZSgpID09IElTdGF0dXMuRVJST1IpIHsKKwkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1cyk7CisJCX0KKworCQlQYXRjaENsZWFuZXIgY2xlYW5lciA9IG5ldyBQYXRjaENsZWFuZXIodGFyZ2V0U2l0ZSwgZmVhdHVyZSk7CisJCXRhcmdldFNpdGUudW5jb25maWd1cmUoZmVhdHVyZSk7CisJCWNsZWFuZXIuZGlzcG9zZSgpOworCisJCXRyeSB7CisJCQkvLyBSZXN0YXJ0IG5vdCBuZWVkZWQKKwkJCWJvb2xlYW4gcmVzdGFydE5lZWRlZCA9IGZhbHNlOworCisJCQkvLyBDaGVjayBpZiB0aGlzIG9wZXJhdGlvbiBpcyBjYW5jZWxsaW5nIG9uZSB0aGF0J3MgYWxyZWFkeSBwZW5kaW5nCisJCQlJT3BlcmF0aW9uIHBlbmRpbmdPcGVyYXRpb24gPQorCQkJCU9wZXJhdGlvbnNNYW5hZ2VyLmZpbmRQZW5kaW5nT3BlcmF0aW9uKGZlYXR1cmUpOworCisJCQlpZiAocGVuZGluZ09wZXJhdGlvbiBpbnN0YW5jZW9mIElDb25maWdGZWF0dXJlT3BlcmF0aW9uKSB7CisJCQkJLy8gbm8gbmVlZCB0byBkbyBlaXRoZXIgcGVuZGluZyBjaGFuZ2UKKwkJCQlPcGVyYXRpb25zTWFuYWdlci5yZW1vdmVQZW5kaW5nT3BlcmF0aW9uKHBlbmRpbmdPcGVyYXRpb24pOworCQkJfSBlbHNlIHsKKwkJCQlPcGVyYXRpb25zTWFuYWdlci5hZGRQZW5kaW5nT3BlcmF0aW9uKHRoaXMpOworCQkJCXJlc3RhcnROZWVkZWQgPSB0cnVlOworCQkJfQorCisJCQltYXJrUHJvY2Vzc2VkKCk7CisJCQlpZiAobGlzdGVuZXIgIT0gbnVsbCkKKwkJCQlsaXN0ZW5lci5hZnRlckV4ZWN1dGUodGhpcywgbnVsbCk7CisKKwkJCXJlc3RhcnROZWVkZWQgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKS5zYXZlKCkgJiYgcmVzdGFydE5lZWRlZDsKKworCQkJLy8gbm90aWZ5IHRoZSBtb2RlbAorCQkJT3BlcmF0aW9uc01hbmFnZXIuZmlyZU9iamVjdENoYW5nZWQoZmVhdHVyZSwgbnVsbCk7CisKKwkJCXJldHVybiByZXN0YXJ0TmVlZGVkOworCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCXVuZG8oKTsKKwkJCVVwZGF0ZVV0aWxzLmxvZ0V4Y2VwdGlvbihlKTsKKwkJCXRocm93IGU7CisJCX0KKwl9CisKKwlwdWJsaWMgdm9pZCB1bmRvKCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQl0YXJnZXRTaXRlLmNvbmZpZ3VyZShmZWF0dXJlKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvVW5jb25maWd1cmVBbmRVbmluc3RhbGxGZWF0dXJlT3BlcmF0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL1VuY29uZmlndXJlQW5kVW5pbnN0YWxsRmVhdHVyZU9wZXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkMjJjNjAKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL1VuY29uZmlndXJlQW5kVW5pbnN0YWxsRmVhdHVyZU9wZXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwub3BlcmF0aW9uczsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLklDb25maWd1cmVkU2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLkNvbmZpZ3VyYXRvclV0aWxzOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLklPcGVyYXRpb25MaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy5JVW5jb25maWdGZWF0dXJlT3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLk9wZXJhdGlvbnNNYW5hZ2VyOworCitwdWJsaWMgY2xhc3MgVW5jb25maWd1cmVBbmRVbmluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIGV4dGVuZHMgRmVhdHVyZU9wZXJhdGlvbgorCQlpbXBsZW1lbnRzIElVbmNvbmZpZ3VyZUFuZFVuaW5zdGFsbEZlYXR1cmVPcGVyYXRpb24geworCisJcHVibGljIFVuY29uZmlndXJlQW5kVW5pbnN0YWxsRmVhdHVyZU9wZXJhdGlvbihJQ29uZmlndXJlZFNpdGUgdGFyZ2V0U2l0ZSwgSUZlYXR1cmUgZmVhdHVyZSkgeworCQlzdXBlcih0YXJnZXRTaXRlLCBmZWF0dXJlKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgcG0sIElPcGVyYXRpb25MaXN0ZW5lciBsaXN0ZW5lcikKKwkJCXRocm93cyBDb3JlRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKKwkJCisJCUlVbmNvbmZpZ0ZlYXR1cmVPcGVyYXRpb24gdW5jb25maWdPcGVyYXRpb24gPSBPcGVyYXRpb25zTWFuYWdlci5nZXRPcGVyYXRpb25GYWN0b3J5KCkuY3JlYXRlVW5jb25maWdPcGVyYXRpb24odGFyZ2V0U2l0ZSwgZmVhdHVyZSk7CisKKwkJLypib29sZWFuIGlzUmVzdGFydE5lZWRlZCA9ICovdW5jb25maWdPcGVyYXRpb24uZXhlY3V0ZShwbSwgbGlzdGVuZXIpOworCQkKKworCQlVUkwgcGxhdGZvcm1YTUwgPSBDb25maWd1cmF0b3JVdGlscy5nZXRDdXJyZW50UGxhdGZvcm1Db25maWd1cmF0aW9uKCkuZ2V0Q29uZmlndXJhdGlvbkxvY2F0aW9uKCk7CisJCQorCQlGaWxlIGYgPSBuZXcgRmlsZShwbGF0Zm9ybVhNTC5nZXRGaWxlKCkpOworCisJCWYgPSBuZXcgRmlsZShmLmdldFBhcmVudEZpbGUoKSwgInRvQmVVbmluc3RhbGxlZCIpOyAvLyROT04tTkxTLTEkCisJCXRyeSB7CisJCQlpZiAoIWYuZXhpc3RzKCkpIHsKKwkJCQlmLmNyZWF0ZU5ld0ZpbGUoKTsKKwkJCX0KKwkJCUZpbGVJbnB1dFN0cmVhbSBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGYpOworCQkJUHJvcGVydGllcyB0b0JlVW5pbnN0YWxsZWQgPSBuZXcgUHJvcGVydGllcygpOworCQkJdG9CZVVuaW5zdGFsbGVkLmxvYWQoZmlzKTsKKwkJCXRvQmVVbmluc3RhbGxlZC5wdXQobmV3IEludGVnZXIodG9CZVVuaW5zdGFsbGVkLnNpemUoKSsxKS50b1N0cmluZygpLCB0YXJnZXRTaXRlLmdldFNpdGUoKS5nZXRVUkwoKSArICI7IiArIGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCisJCQlmaXMuY2xvc2UoKTsKKwkJCUZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZik7CisJCQl0b0JlVW5pbnN0YWxsZWQuc3RvcmUoZm9zLCAidG8gYmUgdW5pbnN0YWxsZWQgb24gc3RhcnQtdXAiKTsgLy8kTk9OLU5MUy0xJAorCQkJZm9zLmNsb3NlKCk7CisJCQkKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisJCQkKKwkJfQorCisJCQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvVW5jb25maWd1cmVBbmRVbmluc3RhbGxGZWF0dXJlc09wZXJhdGlvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9VbmNvbmZpZ3VyZUFuZFVuaW5zdGFsbEZlYXR1cmVzT3BlcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk2MTA4ZgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvVW5jb25maWd1cmVBbmRVbmluc3RhbGxGZWF0dXJlc09wZXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwub3BlcmF0aW9uczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLklDb25maWd1cmVkU2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy5JT3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLk9wZXJhdGlvbnNNYW5hZ2VyOworCitwdWJsaWMgY2xhc3MgVW5jb25maWd1cmVBbmRVbmluc3RhbGxGZWF0dXJlc09wZXJhdGlvbiBleHRlbmRzCisJCUJhdGNoRmVhdHVyZU9wZXJhdGlvbiBpbXBsZW1lbnRzCisJCUlVbmNvbmZpZ3VyZUFuZFVuaW5zdGFsbEZlYXR1cmVzT3BlcmF0aW9uIHsKKworCXB1YmxpYyBVbmNvbmZpZ3VyZUFuZFVuaW5zdGFsbEZlYXR1cmVzT3BlcmF0aW9uKElDb25maWd1cmVkU2l0ZVtdIHRhcmdldFNpdGVzLAorCQkJSUZlYXR1cmVbXSBmZWF0dXJlcykgeworCQlzdXBlcih0YXJnZXRTaXRlcywgZmVhdHVyZXMpOworCX0KKworCXByb3RlY3RlZCBJT3BlcmF0aW9uIGNyZWF0ZU9wZXJhdGlvbihJQ29uZmlndXJlZFNpdGUgdGFyZ2V0U2l0ZSwgSUZlYXR1cmUgZmVhdHVyZSkgeworCQlyZXR1cm4gKChPcGVyYXRpb25GYWN0b3J5KU9wZXJhdGlvbnNNYW5hZ2VyLmdldE9wZXJhdGlvbkZhY3RvcnkoKSkuY3JlYXRlVW5jb25maWd1cmVBbmRVbmluc3RhbGxGZWF0dXJlT3BlcmF0aW9uKHRhcmdldFNpdGUsIGZlYXR1cmUpOworCX0KK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvVW5jb25maWd1cmVGZWF0dXJlc09wZXJhdGlvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9VbmNvbmZpZ3VyZUZlYXR1cmVzT3BlcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg0YzhiOAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvVW5jb25maWd1cmVGZWF0dXJlc09wZXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwub3BlcmF0aW9uczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLklDb25maWd1cmVkU2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy5JT3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLk9wZXJhdGlvbnNNYW5hZ2VyOworCitwdWJsaWMgY2xhc3MgVW5jb25maWd1cmVGZWF0dXJlc09wZXJhdGlvbiAKKwlleHRlbmRzIEJhdGNoRmVhdHVyZU9wZXJhdGlvbiBpbXBsZW1lbnRzIElVbmNvbmZpZ3VyZUZlYXR1cmVzT3BlcmF0aW9uIHsKKworCXB1YmxpYyBVbmNvbmZpZ3VyZUZlYXR1cmVzT3BlcmF0aW9uKElDb25maWd1cmVkU2l0ZVtdIHRhcmdldFNpdGVzLCBJRmVhdHVyZVtdIGZlYXR1cmVzKSB7CisJCXN1cGVyKHRhcmdldFNpdGVzLCBmZWF0dXJlcyk7CisJfQorCQorCXByb3RlY3RlZCBJT3BlcmF0aW9uIGNyZWF0ZU9wZXJhdGlvbihJQ29uZmlndXJlZFNpdGUgdGFyZ2V0U2l0ZSwgSUZlYXR1cmUgZmVhdHVyZSkgeworCQlyZXR1cm4gT3BlcmF0aW9uc01hbmFnZXIuZ2V0T3BlcmF0aW9uRmFjdG9yeSgpLmNyZWF0ZVVuY29uZmlnT3BlcmF0aW9uKHRhcmdldFNpdGUsIGZlYXR1cmUpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9Vbmluc3RhbGxGZWF0dXJlc09wZXJhdGlvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9Vbmluc3RhbGxGZWF0dXJlc09wZXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2ODc5ZGUKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL1VuaW5zdGFsbEZlYXR1cmVzT3BlcmF0aW9uLmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zOworCitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uSUNvbmZpZ3VyZWRTaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLklPcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuT3BlcmF0aW9uc01hbmFnZXI7CisKK3B1YmxpYyBjbGFzcyBVbmluc3RhbGxGZWF0dXJlc09wZXJhdGlvbiBleHRlbmRzIEJhdGNoRmVhdHVyZU9wZXJhdGlvbiBpbXBsZW1lbnRzCisJCUlVbmluc3RhbGxGZWF0dXJlc09wZXJhdGlvbiB7CisKKwlwdWJsaWMgVW5pbnN0YWxsRmVhdHVyZXNPcGVyYXRpb24oSUNvbmZpZ3VyZWRTaXRlW10gdGFyZ2V0U2l0ZXMsIElGZWF0dXJlW10gZmVhdHVyZXMpIHsKKwkJc3VwZXIodGFyZ2V0U2l0ZXMsIGZlYXR1cmVzKTsKKwl9CisKKworCXByb3RlY3RlZCBJT3BlcmF0aW9uIGNyZWF0ZU9wZXJhdGlvbihJQ29uZmlndXJlZFNpdGUgdGFyZ2V0U2l0ZSwgSUZlYXR1cmUgZmVhdHVyZSkgeworCQlyZXR1cm4gT3BlcmF0aW9uc01hbmFnZXIuZ2V0T3BlcmF0aW9uRmFjdG9yeSgpLmNyZWF0ZVVuaW5zdGFsbE9wZXJhdGlvbih0YXJnZXRTaXRlLCBmZWF0dXJlKTsKKwl9CisKKworfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9Vbmluc3RhbGxPcGVyYXRpb24uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvVW5pbnN0YWxsT3BlcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM2YjdhNAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvVW5pbnN0YWxsT3BlcmF0aW9uLmphdmEKQEAgLTAsMCArMSw4MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuKjsKKworLyoqCisgKiBDb25maWd1cmUgYSBmZWF0dXJlLgorICogQ29uZmlnT3BlcmF0aW9uCisgKi8KK3B1YmxpYyBjbGFzcyBVbmluc3RhbGxPcGVyYXRpb24gZXh0ZW5kcyBGZWF0dXJlT3BlcmF0aW9uIGltcGxlbWVudHMgSVVuaW5zdGFsbEZlYXR1cmVPcGVyYXRpb257CisKKwlwdWJsaWMgVW5pbnN0YWxsT3BlcmF0aW9uKElDb25maWd1cmVkU2l0ZSBzaXRlLCBJRmVhdHVyZSBmZWF0dXJlKSB7CisJCXN1cGVyKHNpdGUsIGZlYXR1cmUpOworCX0KKworCXB1YmxpYyB2b2lkIHNldFRhcmdldFNpdGUoSUNvbmZpZ3VyZWRTaXRlIHRhcmdldFNpdGUpIHsKKwkJdGhpcy50YXJnZXRTaXRlID0gdGFyZ2V0U2l0ZTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgcG0sIElPcGVyYXRpb25MaXN0ZW5lciBsaXN0ZW5lcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQkKKwkJaWYgKHRhcmdldFNpdGUgPT0gbnVsbCkKKwkJCXRhcmdldFNpdGUgPSBVcGRhdGVVdGlscy5nZXRDb25maWdTaXRlKGZlYXR1cmUsIFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkpOworCisJCS8vIFJlc3RhcnQgbm90IG5lZWRlZAorCQlib29sZWFuIHJlc3RhcnROZWVkZWQgPSBmYWxzZTsKKworCQlpZiAodGFyZ2V0U2l0ZSAhPSBudWxsKSB7CisJCQkvLyBpZiBuZWVkZWQsIHVuY29uZmlndXJlIHRoZSBmZWF0dXJlIGZpcnN0CisJCQlpZiAodGFyZ2V0U2l0ZS5pc0NvbmZpZ3VyZWQoZmVhdHVyZSkpIHsKKwkJCQlJU3RhdHVzIHN0YXR1cyA9IE9wZXJhdGlvbnNNYW5hZ2VyLmdldFZhbGlkYXRvcigpLnZhbGlkYXRlUGVuZGluZ1VuY29uZmlnKGZlYXR1cmUpOworCQkJCWlmIChzdGF0dXMgIT0gbnVsbCAmJiBzdGF0dXMuZ2V0Q29kZSgpID09IElTdGF0dXMuRVJST1IpCisJCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1cyk7CisJCQkJaWYgKHVuY29uZmlndXJlKGZlYXR1cmUsIHRhcmdldFNpdGUpKQorCQkJCQlyZXN0YXJ0TmVlZGVkID0gdHJ1ZTsKKwkJCQllbHNlCisJCQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLk9wZXJhdGlvbnNNYW5hZ2VyX2Vycm9yX3VuaW5zdGFsbCwgKG5ldyBTdHJpbmdbXSB7IGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkgfSkpLCBudWxsKTsKKwkJCX0KKwkJCXRhcmdldFNpdGUucmVtb3ZlKGZlYXR1cmUsIHBtKTsKKwkJfSBlbHNlIHsKKwkJCS8vIHdlIHNob3VsZCBkbyBzb21ldGhpbmcgaGVyZQorCQkJU3RyaW5nIG1lc3NhZ2UgPQorCQkJCU5MUy5iaW5kKE1lc3NhZ2VzLk9wZXJhdGlvbnNNYW5hZ2VyX2Vycm9yX3VuaW5zdGFsbCwgKG5ldyBTdHJpbmdbXSB7IGZlYXR1cmUuZ2V0TGFiZWwoKSB9KSk7CisJCQlJU3RhdHVzIHN0YXR1cyA9CisJCQkJbmV3IFN0YXR1cygKKwkJCQkJSVN0YXR1cy5FUlJPUiwKKwkJCQkJVXBkYXRlVXRpbHMuZ2V0UGx1Z2luSWQoKSwKKwkJCQkJSVN0YXR1cy5PSywKKwkJCQkJbWVzc2FnZSwKKwkJCQkJbnVsbCk7CisJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXMpOworCQl9CisKKwkJbWFya1Byb2Nlc3NlZCgpOworCQlpZiAobGlzdGVuZXIgIT0gbnVsbCkKKwkJCWxpc3RlbmVyLmFmdGVyRXhlY3V0ZSh0aGlzLCBudWxsKTsKKworCQlyZXN0YXJ0TmVlZGVkID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkuc2F2ZSgpICYmIHJlc3RhcnROZWVkZWQ7CisKKwkJLy8gbm90aWZ5IHRoZSBtb2RlbAorCQlPcGVyYXRpb25zTWFuYWdlci5maXJlT2JqZWN0Q2hhbmdlZChmZWF0dXJlLCBVTklOU1RBTEwpOworCQkKKwkJcmV0dXJuIHJlc3RhcnROZWVkZWQ7CisJfQorCit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL1VwZGF0ZVV0aWxzLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL1VwZGF0ZVV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjkxNGEwYQotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvVXBkYXRlVXRpbHMuamF2YQpAQCAtMCwwICsxLDY5MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogICAgIEphbWVzIEQgTWlsZXMgKElCTSBDb3JwLikgLSBidWcgMTkxMzY4LCBQb2xpY3kgVVJMIGRvZXNuJ3Qgc3VwcG9ydCBVVEYtOCBjaGFyYWN0ZXJzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm9wZXJhdGlvbnM7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOworaW1wb3J0IGphdmEubmV0Lio7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5VUkxFbmNvZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5zZWFyY2guKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5zZWFyY2guKjsKKworCisvKioKKyAqIEhlbHBlciBjbGFzcyBmb3IgcGVyZm9ybWluZyB1cGRhdGUgcmVsYXRlZCB0YXNrcywgcXVlcmllcywgZXRjLgorICogQWxsIHRoZSBtZXRob2RzIGFyZSBzdGF0aWMgYW5kIHRoaXMgY2xhc3Mgc2hvdWxkIGJlIGEgc2luZ2xldG9uLgorICovCitwdWJsaWMgY2xhc3MgVXBkYXRlVXRpbHMgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBfVVBEQVRFX1BPTElDWV9VUkwgPSAidXBkYXRlUG9saWN5VVJMIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogUHJpdmF0ZSBjb25zdHJ1Y3RvcgorCSAqLworCXByaXZhdGUgVXBkYXRlVXRpbHMoKSB7CisJfQorCQorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGx1Z2luSWQoKSB7CisJCXJldHVybiBVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpOworCX0KKworCisJcHVibGljIHN0YXRpYyB2b2lkIGxvZ0V4Y2VwdGlvbihUaHJvd2FibGUgZSkgeworCQkKKwkJaWYgKGUgaW5zdGFuY2VvZiBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKSB7CisJCQllID0gKChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKSBlKS5nZXRUYXJnZXRFeGNlcHRpb24oKTsKKwkJfQorCisJCUlTdGF0dXMgc3RhdHVzID0gbnVsbDsKKwkJaWYgKGUgaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKSB7CisJCQlzdGF0dXMgPSAoKENvcmVFeGNlcHRpb24pIGUpLmdldFN0YXR1cygpOworCQl9IGVsc2UgeworCQkJU3RyaW5nIG1lc3NhZ2UgPSBlLmdldE1lc3NhZ2UoKTsKKwkJCWlmIChtZXNzYWdlID09IG51bGwpCisJCQkJbWVzc2FnZSA9IGUudG9TdHJpbmcoKTsKKwkJCXN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgZ2V0UGx1Z2luSWQoKSwgSVN0YXR1cy5PSywgbWVzc2FnZSwgZSk7CisJCX0KKwkJbG9nKHN0YXR1cyk7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGxvZyhJU3RhdHVzIHN0YXR1cykgeworCQlpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgIT0gSVN0YXR1cy5JTkZPKSB7CisJCQlVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldExvZygpLmxvZyhzdGF0dXMpOworCQl9IAorCX0KKworCXB1YmxpYyBzdGF0aWMgSUZlYXR1cmVbXSBzZWFyY2hTaXRlKFN0cmluZyBmZWF0dXJlSWQsIElDb25maWd1cmVkU2l0ZSBzaXRlLCBib29sZWFuIG9ubHlDb25maWd1cmVkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCUlGZWF0dXJlUmVmZXJlbmNlW10gcmVmZXJlbmNlcyA9IG51bGw7CisKKwkJaWYgKG9ubHlDb25maWd1cmVkKQorCQkJcmVmZXJlbmNlcyA9IHNpdGUuZ2V0Q29uZmlndXJlZEZlYXR1cmVzKCk7CisJCWVsc2UKKwkJCXJlZmVyZW5jZXMgPSBzaXRlLmdldFNpdGUoKS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpOworCQlWZWN0b3IgcmVzdWx0ID0gbmV3IFZlY3RvcigpOworCisJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmZXJlbmNlcy5sZW5ndGg7IGkrKykgeworCQkJSUZlYXR1cmUgZmVhdHVyZSA9IHJlZmVyZW5jZXNbaV0uZ2V0RmVhdHVyZShudWxsKTsKKwkJCVN0cmluZyBpZCA9IGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldElkZW50aWZpZXIoKTsKKwkJCWlmIChmZWF0dXJlSWQuZXF1YWxzKGlkKSkgeworCQkJCXJlc3VsdC5hZGQoZmVhdHVyZSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIChJRmVhdHVyZVtdKSByZXN1bHQudG9BcnJheShuZXcgSUZlYXR1cmVbcmVzdWx0LnNpemUoKV0pOworCX0KKworCXB1YmxpYyBzdGF0aWMgSUZlYXR1cmVbXSBnZXRJbnN0YWxsZWRGZWF0dXJlcyhJRmVhdHVyZSBmZWF0dXJlKSB7CisJCXJldHVybiBnZXRJbnN0YWxsZWRGZWF0dXJlcyhmZWF0dXJlLCB0cnVlKTsKKwl9CisKKwkvKioKKwkgKiAKKwkgKiBAcGFyYW0gZmVhdHVyZQorCSAqIEBwYXJhbSBvbmx5Q29uZmlndXJlZAorCSAqIEByZXR1cm4gSUZlYXR1cmVbXSB3aXRoIGZlYXR1cmVzIG1hdGNoaW5nIGZlYXR1cmUgSUQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIElGZWF0dXJlW10gZ2V0SW5zdGFsbGVkRmVhdHVyZXMoSUZlYXR1cmUgZmVhdHVyZSwgYm9vbGVhbiBvbmx5Q29uZmlndXJlZCkgeworCQlyZXR1cm4gZ2V0SW5zdGFsbGVkRmVhdHVyZXMoZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCksIG9ubHlDb25maWd1cmVkKTsKKwl9CisJLyoqCisJICogQHBhcmFtIHZpZAorCSAqIEBwYXJhbSBvbmx5Q29uZmlndXJlZAorCSAqIEByZXR1cm4gSUZlYXR1cmVbXSB3aXRoIGZlYXR1cmVzIG1hdGNoaW5nIGZlYXR1cmUgSUQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIElGZWF0dXJlW10gZ2V0SW5zdGFsbGVkRmVhdHVyZXMoVmVyc2lvbmVkSWRlbnRpZmllciB2aWQsIGJvb2xlYW4gb25seUNvbmZpZ3VyZWQpIHsKKwkJVmVjdG9yIGZlYXR1cmVzID0gbmV3IFZlY3RvcigpOworCQl0cnkgeworCQkJSUxvY2FsU2l0ZSBsb2NhbFNpdGUgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsKKwkJCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcgPSBsb2NhbFNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKTsKKwkJCUlDb25maWd1cmVkU2l0ZVtdIGlzaXRlcyA9IGNvbmZpZy5nZXRDb25maWd1cmVkU2l0ZXMoKTsKKwkJCVN0cmluZyBpZCA9IHZpZC5nZXRJZGVudGlmaWVyKCk7CisKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXNpdGVzLmxlbmd0aDsgaSsrKSB7CisJCQkJSUNvbmZpZ3VyZWRTaXRlIGlzaXRlID0gaXNpdGVzW2ldOworCQkJCUlGZWF0dXJlW10gcmVzdWx0ID0gVXBkYXRlVXRpbHMuc2VhcmNoU2l0ZShpZCwgaXNpdGUsIG9ubHlDb25maWd1cmVkKTsKKwkJCQlmb3IgKGludCBqID0gMDsgaiA8IHJlc3VsdC5sZW5ndGg7IGorKykgeworCQkJCQlJRmVhdHVyZSBpbnN0YWxsZWRGZWF0dXJlID0gcmVzdWx0W2pdOworCQkJCQlmZWF0dXJlcy5hZGQoaW5zdGFsbGVkRmVhdHVyZSk7CisJCQkJfQorCQkJfQorCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCVVwZGF0ZVV0aWxzLmxvZ0V4Y2VwdGlvbihlKTsKKwkJfQorCQlyZXR1cm4gKElGZWF0dXJlW10pIGZlYXR1cmVzLnRvQXJyYXkobmV3IElGZWF0dXJlW2ZlYXR1cmVzLnNpemUoKV0pOworCX0KKwkKKwkvKioKKwkgKiBAcGFyYW0gcGF0Y2gKKwkgKiBAcmV0dXJuIElGZWF0dXJlIG9yIG51bGwKKwkgKi8KKwlwdWJsaWMgc3RhdGljIElGZWF0dXJlIGdldFBhdGNoZWRGZWF0dXJlKElGZWF0dXJlIHBhdGNoKSB7CisJCUlJbXBvcnRbXSBpbXBvcnRzID0gcGF0Y2guZ2V0SW1wb3J0cygpOworCQlmb3IgKGludCBpID0gMDsgaSA8IGltcG9ydHMubGVuZ3RoOyBpKyspIHsKKwkJCUlJbXBvcnQgaWltcG9ydCA9IGltcG9ydHNbaV07CisJCQlpZiAoaWltcG9ydC5pc1BhdGNoKCkpIHsKKwkJCQlWZXJzaW9uZWRJZGVudGlmaWVyIHBhdGNoZWRWaWQgPSBpaW1wb3J0CisJCQkJCQkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOworCQkJCS8vIGZlYXR1cmVzIHdpdGggbWF0Y2hpbmcgaWQKKwkJCQlJRmVhdHVyZVtdIGZlYXR1cmVzID0gZ2V0SW5zdGFsbGVkRmVhdHVyZXMocGF0Y2hlZFZpZCwgZmFsc2UpOworCQkJCWZvciAoaW50IGYgPSAwOyBmIDwgZmVhdHVyZXMubGVuZ3RoOyBmKyspIHsKKwkJCQkJLy8gY2hlY2sgaWYgdmVyc2lvbiBtYXRjaAorCQkJCQlpZiAocGF0Y2hlZFZpZC5lcXVhbHMoZmVhdHVyZXNbZl0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpKSkgeworCQkJCQkJcmV0dXJuIGZlYXR1cmVzW2ZdOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1BhdGNoKElGZWF0dXJlIGNhbmRpZGF0ZSkgeworCQlJSW1wb3J0W10gaW1wb3J0cyA9IGNhbmRpZGF0ZS5nZXRJbXBvcnRzKCk7CisKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbXBvcnRzLmxlbmd0aDsgaSsrKSB7CisJCQlJSW1wb3J0IGlpbXBvcnQgPSBpbXBvcnRzW2ldOworCQkJaWYgKGlpbXBvcnQuaXNQYXRjaCgpKSByZXR1cm4gdHJ1ZTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcHVibGljIHN0YXRpYyBib29sZWFuIGlzUGF0Y2goSUZlYXR1cmUgdGFyZ2V0LCBJRmVhdHVyZSBjYW5kaWRhdGUpIHsKKwkJVmVyc2lvbmVkSWRlbnRpZmllciB2aWQgPSB0YXJnZXQuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOworCQlJSW1wb3J0W10gaW1wb3J0cyA9IGNhbmRpZGF0ZS5nZXRJbXBvcnRzKCk7CisKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbXBvcnRzLmxlbmd0aDsgaSsrKSB7CisJCQlJSW1wb3J0IGlpbXBvcnQgPSBpbXBvcnRzW2ldOworCQkJaWYgKGlpbXBvcnQuaXNQYXRjaCgpKSB7CisJCQkJVmVyc2lvbmVkSWRlbnRpZmllciBpdmlkID0gaWltcG9ydC5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7CisJCQkJaWYgKHZpZC5lcXVhbHMoaXZpZCkpIHsKKwkJCQkJLy8gQmluZ28uCisJCQkJCXJldHVybiB0cnVlOworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcHVibGljIHN0YXRpYyBJSW5zdGFsbENvbmZpZ3VyYXRpb24gZ2V0QmFja3VwQ29uZmlndXJhdGlvbkZvcihJRmVhdHVyZSBmZWF0dXJlKSB7CisJCVZlcnNpb25lZElkZW50aWZpZXIgdmlkID0gZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7CisJCVN0cmluZyBrZXkgPSAiQCIgKyB2aWQuZ2V0SWRlbnRpZmllcigpICsgIl8iICsgdmlkLmdldFZlcnNpb24oKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCXRyeSB7CisJCQlJTG9jYWxTaXRlIGxzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7CisJCQlJSW5zdGFsbENvbmZpZ3VyYXRpb25bXSBjb25maWdzID0gbHNpdGUuZ2V0UHJlc2VydmVkQ29uZmlndXJhdGlvbnMoKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlncy5sZW5ndGg7IGkrKykgeworCQkJCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcgPSBjb25maWdzW2ldOworCQkJCWlmIChjb25maWcuZ2V0TGFiZWwoKS5zdGFydHNXaXRoKGtleSkpCisJCQkJCXJldHVybiBjb25maWc7CisJCQl9CisJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQl9CisJCXJldHVybiBudWxsOworCX0KKwkKKwkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzTGljZW5zZShJRmVhdHVyZSBmZWF0dXJlKSB7CisJCUlVUkxFbnRyeSBpbmZvID0gZmVhdHVyZS5nZXRMaWNlbnNlKCk7CisJCWlmIChpbmZvID09IG51bGwpCisJCQlyZXR1cm4gZmFsc2U7CisJCVN0cmluZyBsaWNlbnNlVHh0ID0gaW5mby5nZXRBbm5vdGF0aW9uKCk7CisJCWlmIChsaWNlbnNlVHh0ID09IG51bGwpCisJCQlyZXR1cm4gZmFsc2U7CisJCXJldHVybiBsaWNlbnNlVHh0LnRyaW0oKS5sZW5ndGgoKSA+IDA7CisJfQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNPcHRpb25hbEZlYXR1cmVzKElGZWF0dXJlIGZlYXR1cmUpIHsKKwkJdHJ5IHsKKwkJCUlJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VbXSBpcmVmcyA9IGZlYXR1cmUuZ2V0SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpcmVmcy5sZW5ndGg7IGkrKykgeworCQkJCUlJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UgaXJlZiA9IGlyZWZzW2ldOworCQkJCWlmIChpcmVmLmlzT3B0aW9uYWwoKSkKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJLy8gc2VlIGlmIGl0IGhhcyBvcHRpb25hbCBjaGlsZHJlbgorCQkJCUlGZWF0dXJlIGNoaWxkID0gZ2V0SW5jbHVkZWRGZWF0dXJlKCBmZWF0dXJlLCBpcmVmKTsKKwkJCQlpZiAoaGFzT3B0aW9uYWxGZWF0dXJlcyhjaGlsZCkpCisJCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcHVibGljIHN0YXRpYyBJRmVhdHVyZSBnZXRMb2NhbEZlYXR1cmUoCisJCUlDb25maWd1cmVkU2l0ZSBjc2l0ZSwKKwkJSUZlYXR1cmUgZmVhdHVyZSkKKwkJdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlJRmVhdHVyZVJlZmVyZW5jZVtdIHJlZnMgPSBjc2l0ZS5nZXRDb25maWd1cmVkRmVhdHVyZXMoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZzLmxlbmd0aDsgaSsrKSB7CisJCQlJRmVhdHVyZVJlZmVyZW5jZSByZWYgPSByZWZzW2ldOworCQkJVmVyc2lvbmVkSWRlbnRpZmllciByZWZWaWQgPSByZWYuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOworCQkJaWYgKGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmVxdWFscyhyZWZWaWQpKQorCQkJCXJldHVybiByZWYuZ2V0RmVhdHVyZShudWxsKTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJcHVibGljIHN0YXRpYyBJQ29uZmlndXJlZFNpdGUgZ2V0Q29uZmlnU2l0ZSgKKwkJSUZlYXR1cmUgZmVhdHVyZSwKKwkJSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZykKKwkJdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlJQ29uZmlndXJlZFNpdGVbXSBjb25maWdTaXRlcyA9IGNvbmZpZy5nZXRDb25maWd1cmVkU2l0ZXMoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWdTaXRlcy5sZW5ndGg7IGkrKykgeworCQkJSUNvbmZpZ3VyZWRTaXRlIHNpdGUgPSBjb25maWdTaXRlc1tpXTsKKwkJCWlmIChzaXRlLmdldFNpdGUoKS5lcXVhbHMoZmVhdHVyZS5nZXRTaXRlKCkpKSB7CisJCQkJcmV0dXJuIHNpdGU7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCQorCXB1YmxpYyBzdGF0aWMgSUNvbmZpZ3VyZWRTaXRlIGdldERlZmF1bHRUYXJnZXRTaXRlKAorCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnLAorCQlJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gcGVuZGluZ0NoYW5nZSkgeworCQlyZXR1cm4gZ2V0RGVmYXVsdFRhcmdldFNpdGUoY29uZmlnLCBwZW5kaW5nQ2hhbmdlLCB0cnVlKTsKKwl9CisKKwlwdWJsaWMgIHN0YXRpYyBJQ29uZmlndXJlZFNpdGUgZ2V0RGVmYXVsdFRhcmdldFNpdGUoCisJCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcsCisJCUlJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiBwZW5kaW5nQ2hhbmdlLAorCQlib29sZWFuIGNoZWNrQWZmaW5pdHlGZWF0dXJlKSB7CisJCUlGZWF0dXJlIG9sZEZlYXR1cmUgPSBwZW5kaW5nQ2hhbmdlLmdldE9sZEZlYXR1cmUoKTsKKwkJSUZlYXR1cmUgbmV3RmVhdHVyZSA9IHBlbmRpbmdDaGFuZ2UuZ2V0RmVhdHVyZSgpOworCQlpZiAob2xkRmVhdHVyZSAhPSBudWxsKSB7CisJCQkvLyBXZSBzaG91bGQgaW5zdGFsbCBpbnRvIHRoZSBzYW1lIHNpdGUgYXMKKwkJCS8vIHRoZSBvbGQgZmVhdHVyZQorCQkJdHJ5IHsKKwkJCQlyZXR1cm4gZ2V0Q29uZmlnU2l0ZShvbGRGZWF0dXJlLCBjb25maWcpOworCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkJbG9nRXhjZXB0aW9uKGUpOworCQkJCXJldHVybiBudWxsOworCQkJfQorCQl9CisKKwkJLy8gVGhpcyBpcyBhIG5ldyBpbnN0YWxsLiBDaGVjayBpZiB0aGVyZSBpcyAKKwkJLy8gYSBkaXNhYmxlZCBmZWF0dXJlIHdpdGggdGhlIHNhbWUgSUQKKwkJU3RyaW5nIG5ld0ZlYXR1cmVJRCA9CisJCQluZXdGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRJZGVudGlmaWVyKCk7CisJCUlDb25maWd1cmVkU2l0ZSBzYW1lU2l0ZSA9IGdldFNpdGVXaXRoRmVhdHVyZShjb25maWcsIG5ld0ZlYXR1cmVJRCk7CisJCWlmIChzYW1lU2l0ZSAhPSBudWxsKSB7CisJCQlyZXR1cm4gc2FtZVNpdGU7CisJCX0KKworCQlpZiAoY2hlY2tBZmZpbml0eUZlYXR1cmUpIHsKKwkJCXJldHVybiBnZXRBZmZpbml0eVNpdGUoY29uZmlnLCBuZXdGZWF0dXJlKTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJcHVibGljIHN0YXRpYyBJQ29uZmlndXJlZFNpdGUgZ2V0QWZmaW5pdHlTaXRlKAorCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnLAorCQlJRmVhdHVyZSBuZXdGZWF0dXJlKSB7CisJCS8vIGNoZWNrIGlmIHRoZSBhZmZpbml0eSBmZWF0dXJlIGlzIGluc3RhbGxlZAorCQlTdHJpbmcgYWZmaW5pdHlJRCA9IG5ld0ZlYXR1cmUuZ2V0QWZmaW5pdHlGZWF0dXJlKCk7CisJCWlmIChhZmZpbml0eUlEICE9IG51bGwpIHsKKwkJCUlDb25maWd1cmVkU2l0ZSBhZmZpbml0eVNpdGUgPQorCQkJCWdldFNpdGVXaXRoRmVhdHVyZShjb25maWcsIGFmZmluaXR5SUQpOworCQkJaWYgKGFmZmluaXR5U2l0ZSAhPSBudWxsKQorCQkJCXJldHVybiBhZmZpbml0eVNpdGU7CisJCX0gZWxzZSB7CisJCQkvLyBpZiB0aGlzIGlzIGEgcGF0Y2gsIGNvbGxvY2F0ZSB3aXRoIHRoZSBmZWF0dXJlCisJCQlJRmVhdHVyZSBwYXRjaGVkRmVhdHVyZSA9IGdldFBhdGNoZWRGZWF0dXJlKG5ld0ZlYXR1cmUpOworCQkJaWYgKHBhdGNoZWRGZWF0dXJlICE9IG51bGwpCisJCQkJcmV0dXJuIGdldFNpdGVXaXRoRmVhdHVyZShjb25maWcsIHBhdGNoZWRGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRJZGVudGlmaWVyKCkpOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyBzdGF0aWMgSUNvbmZpZ3VyZWRTaXRlIGdldFNpdGVXaXRoRmVhdHVyZSgKKwkJSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZywKKwkJU3RyaW5nIGZlYXR1cmVJRCkgeworCQlpZiAoZmVhdHVyZUlEID09IG51bGwpCisJCQlyZXR1cm4gbnVsbDsKKwkJSUNvbmZpZ3VyZWRTaXRlW10gc2l0ZXMgPSBjb25maWcuZ2V0Q29uZmlndXJlZFNpdGVzKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l0ZXMubGVuZ3RoOyBpKyspIHsKKwkJCUlDb25maWd1cmVkU2l0ZSBzaXRlID0gc2l0ZXNbaV07CisJCQlJRmVhdHVyZVJlZmVyZW5jZVtdIHJlZnMgPSBzaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7CisJCQlmb3IgKGludCBqID0gMDsgaiA8IHJlZnMubGVuZ3RoOyBqKyspIHsKKwkJCQlJRmVhdHVyZVJlZmVyZW5jZSByZWYgPSByZWZzW2pdOworCQkJCXRyeSB7CisJCQkJCUlGZWF0dXJlIGZlYXR1cmUgPSByZWYuZ2V0RmVhdHVyZShudWxsKTsKKwkJCQkJaWYgKGZlYXR1cmVJRAorCQkJCQkJLmVxdWFscygKKwkJCQkJCQlmZWF0dXJlCisJCQkJCQkJCS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkKKwkJCQkJCQkJLmdldElkZW50aWZpZXIoKSkpIHsKKwkJCQkJCS8vIGZvdW5kIGl0CisJCQkJCQlyZXR1cm4gc2l0ZTsKKwkJCQkJfQorCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJCQlsb2dFeGNlcHRpb24oZSk7CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKwkKKwlwdWJsaWMgc3RhdGljIHZvaWQgY29sbGVjdE9sZEZlYXR1cmVzKAorCQlJRmVhdHVyZSBmZWF0dXJlLAorCQlJQ29uZmlndXJlZFNpdGUgdGFyZ2V0U2l0ZSwKKwkJQXJyYXlMaXN0IHJlc3VsdCkKKwkJdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlW10gaW5jbHVkZWQgPQorCQkJZmVhdHVyZS5nZXRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5jbHVkZWQubGVuZ3RoOyBpKyspIHsKKwkJCUlJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UgaXJlZiA9IGluY2x1ZGVkW2ldOworCisJCQlJRmVhdHVyZSBpZmVhdHVyZTsKKworCQkJdHJ5IHsKKwkJCQlpZmVhdHVyZSA9IGlyZWYuZ2V0RmVhdHVyZShudWxsKTsKKwkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJCWlmIChpcmVmLmlzT3B0aW9uYWwoKSkKKwkJCQkJY29udGludWU7CisJCQkJdGhyb3cgZTsKKwkJCX0KKwkJCS8vIGZpbmQgb3RoZXIgZmVhdHVyZXMgYW5kIHVuY29uZmlndXJlCisJCQlTdHJpbmcgaWQgPSBpcmVmLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRJZGVudGlmaWVyKCk7CisJCQlJRmVhdHVyZVtdIHNhbWVJZHMgPSBVcGRhdGVVdGlscy5zZWFyY2hTaXRlKGlkLCB0YXJnZXRTaXRlLCB0cnVlKTsKKwkJCWZvciAoaW50IGogPSAwOyBqIDwgc2FtZUlkcy5sZW5ndGg7IGorKykgeworCQkJCUlGZWF0dXJlIHNhbWVJZCA9IHNhbWVJZHNbal07CisJCQkJLy8gSWdub3JlIHNlbGYuCisJCQkJaWYgKHNhbWVJZC5lcXVhbHMoaWZlYXR1cmUpKQorCQkJCQljb250aW51ZTsKKwkJCQlyZXN1bHQuYWRkKHNhbWVJZCk7CisJCQl9CisJCQljb2xsZWN0T2xkRmVhdHVyZXMoaWZlYXR1cmUsIHRhcmdldFNpdGUsIHJlc3VsdCk7CisJCX0KKwl9CisKKy8vCisvLwlwdWJsaWMgc3RhdGljIElJbnN0YWxsQ29uZmlndXJhdGlvbiBjcmVhdGVJbnN0YWxsQ29uZmlndXJhdGlvbigpIHRocm93cyBDb3JlRXhjZXB0aW9ueworLy8JCXRyeSB7CisvLwkJCUlMb2NhbFNpdGUgbG9jYWxTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7CisvLwkJCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcgPQorLy8JCQkJbG9jYWxTaXRlLmNsb25lQ3VycmVudENvbmZpZ3VyYXRpb24oKTsKKy8vCQkJY29uZmlnLnNldExhYmVsKFV0aWxpdGllcy5mb3JtYXQoY29uZmlnLmdldENyZWF0aW9uRGF0ZSgpKSk7CisvLwkJCXJldHVybiBjb25maWc7CisvLwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisvLwkJCS8vIExldCBjYWxsZXJzIGhhbmRsZSBsb2dnaW5nCisvLwkJCS8vbG9nRXhjZXB0aW9uKGUpOworLy8JCQl0aHJvdyBlOworLy8JCX0KKy8vCX0KKwkKKwlwdWJsaWMgc3RhdGljIFVwZGF0ZVNlYXJjaFJlcXVlc3QgY3JlYXRlTmV3VXBkYXRlc1JlcXVlc3QoSUZlYXR1cmUgW10gZmVhdHVyZXMpIHsKKwkJcmV0dXJuIGNyZWF0ZU5ld1VwZGF0ZXNSZXF1ZXN0KGZlYXR1cmVzLCB0cnVlKTsKKwl9CisJCisJcHVibGljIHN0YXRpYyBVcGRhdGVTZWFyY2hSZXF1ZXN0IGNyZWF0ZU5ld1VwZGF0ZXNSZXF1ZXN0KElGZWF0dXJlIFtdIGZlYXR1cmVzLCBib29sZWFuIGF1dG9tYXRpYykgeworCQlVcGRhdGVTZWFyY2hTY29wZSBzY29wZSA9IG5ldyBVcGRhdGVTZWFyY2hTY29wZSgpOworCQlzY29wZS5zZXRVcGRhdGVNYXBVUkwoVXBkYXRlVXRpbHMuZ2V0VXBkYXRlTWFwVVJMKCkpOworCQlVcGRhdGVzU2VhcmNoQ2F0ZWdvcnkgY2F0ZWdvcnkgPSBuZXcgVXBkYXRlc1NlYXJjaENhdGVnb3J5KGF1dG9tYXRpYyk7CisJCWlmIChmZWF0dXJlcyE9bnVsbCkKKwkJCWNhdGVnb3J5LnNldEZlYXR1cmVzKGZlYXR1cmVzKTsKKwkJVXBkYXRlU2VhcmNoUmVxdWVzdCBzZWFyY2hSZXF1ZXN0ID0gbmV3IFVwZGF0ZVNlYXJjaFJlcXVlc3QoY2F0ZWdvcnksIHNjb3BlKTsKKwkJc2VhcmNoUmVxdWVzdC5hZGRGaWx0ZXIobmV3IEVudmlyb25tZW50RmlsdGVyKCkpOworCQlzZWFyY2hSZXF1ZXN0LmFkZEZpbHRlcihuZXcgQmFja0xldmVsRmlsdGVyKCkpOworCQlyZXR1cm4gc2VhcmNoUmVxdWVzdDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNOZXN0ZWRDaGlsZChJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnLCBJRmVhdHVyZSBmZWF0dXJlKSB7CisJCUlDb25maWd1cmVkU2l0ZVtdIGNzaXRlcyA9IGNvbmZpZy5nZXRDb25maWd1cmVkU2l0ZXMoKTsKKwkJdHJ5IHsKKwkJCWZvciAoaW50IGkgPSAwOyBjc2l0ZXMgIT0gbnVsbCAmJiBpIDwgY3NpdGVzLmxlbmd0aDsgaSsrKSB7CisJCQkJSUZlYXR1cmVSZWZlcmVuY2VbXSByZWZzID0gY3NpdGVzW2ldLmdldENvbmZpZ3VyZWRGZWF0dXJlcygpOworCQkJCWZvciAoaW50IGogPSAwOyByZWZzICE9IG51bGwgJiYgaiA8IHJlZnMubGVuZ3RoOyBqKyspIHsKKwkJCQkJSUZlYXR1cmUgcGFyZW50ID0gcmVmc1tqXS5nZXRGZWF0dXJlKG51bGwpOworCQkJCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGNoaWxkcmVuID0KKwkJCQkJCXBhcmVudC5nZXRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCk7CisJCQkJCWZvciAoaW50IGsgPSAwOworCQkJCQkJY2hpbGRyZW4gIT0gbnVsbCAmJiBrIDwgY2hpbGRyZW4ubGVuZ3RoOworCQkJCQkJaysrKSB7CisJCQkJCQlJRmVhdHVyZSBjaGlsZCA9IGNoaWxkcmVuW2tdLmdldEZlYXR1cmUobnVsbCk7CisJCQkJCQlpZiAoZmVhdHVyZS5lcXVhbHMoY2hpbGQpKQorCQkJCQkJCXJldHVybiB0cnVlOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCS8vIHdpbGwgcmV0dXJuIGZhbHNlCisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKwkKKwkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzT2Jzb2xldGVQYXRjaGVzKElGZWF0dXJlIGZlYXR1cmUpIHsKKwkJLy8gQ2hlY2sgYWxsIHRoZSBpbmNsdWRlZCBmZWF0dXJlcyB0aGF0CisJCS8vIGFyZSB1bmNvbmZpZ3VyZWQsIGFuZCBzZWUgaWYgdGhlaXIgcGF0Y2ggCisJCS8vIHJlZmVyZW5jZXMgYXJlIGJldHRlciB0aGFuIHRoZSBvcmlnaW5hbC4KKwkJdHJ5IHsKKwkJCUlGZWF0dXJlUmVmZXJlbmNlW10gaXJlZnMgPSBmZWF0dXJlLmdldEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXJlZnMubGVuZ3RoOyBpKyspIHsKKwkJCQlJRmVhdHVyZVJlZmVyZW5jZSBpcmVmID0gaXJlZnNbaV07CisJCQkJSUZlYXR1cmUgaWZlYXR1cmUgPSBpcmVmLmdldEZlYXR1cmUobnVsbCk7CisJCQkJSUNvbmZpZ3VyZWRTaXRlIGNzaXRlID0gaWZlYXR1cmUuZ2V0U2l0ZSgpLmdldEN1cnJlbnRDb25maWd1cmVkU2l0ZSgpOworCQkJCWlmICghY3NpdGUuaXNDb25maWd1cmVkKGlmZWF0dXJlKSkgeworCQkJCQlpZiAoIWlzUGF0Y2hIYXBweShpZmVhdHVyZSkpCisJCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCQkJfQorCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQkvLyBBbGwgY2hlY2tzIHdlbnQgd2VsbAorCQlyZXR1cm4gdHJ1ZTsKKwl9CisJCisJcHVibGljIHN0YXRpYyBib29sZWFuIGlzUGF0Y2hIYXBweShJRmVhdHVyZSBmZWF0dXJlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCS8vIElmIHRoaXMgaXMgYSBwYXRjaCBhbmQgaXQgaW5jbHVkZXMgCisJCS8vIGFub3RoZXIgcGF0Y2ggYW5kIHRoZSBpbmNsdWRlZCBwYXRjaAorCQkvLyBpcyBkaXNhYmxlZCBidXQgdGhlIGZlYXR1cmUgaXQgd2FzIGRlY2xhcmVkCisJCS8vIHRvIHBhdGNoIGlzIG5vdyBuZXdlciAoYW5kIGlzIHByZXN1bWVkIHRvCisJCS8vIGNvbnRhaW4gdGhlIG5vdyBkaXNhYmxlZCBwYXRjaCksIGFuZAorCQkvLyB0aGUgbmV3ZXIgcGF0Y2hlZCBmZWF0dXJlIGlzIGVuYWJsZWQsCisJCS8vIGEgJ2xlYXAgb2YgZmFpdGgnIGFzc3VtcHRpb24gY2FuIGJlCisJCS8vIG1hZGU6CisKKwkJLy8gQWx0aG91Z2ggdGhlIGluY2x1ZGVkIHBhdGNoIGlzIGRpc2FibGVkLAorCQkvLyB0aGUgZmVhdHVyZSBpdCB3YXMgZGVzaWduZWQgdG8gcGF0Y2gKKwkJLy8gaXMgbm93IG5ld2VyIGFuZCBtb3N0IGxpa2VseSBjb250YWlucworCQkvLyB0aGUgZXF1aXZhbGVudCBmaXggYW5kIG1vcmUuIENvbnNlcXVlbnRseSwKKwkJLy8gd2UgY2FuIGNsYWltIHRoYXQgdGhlIHN0YXR1cyBhbmQgdGhlIGVycm9yCisJCS8vIGljb24gb3ZlcmxheSBhcmUgbWlzbGVhZGluZyBiZWNhdXNlCisJCS8vIGFsbCB0aGUgcmlnaHQgcGx1Zy1pbnMgYXJlIGNvbmZpZ3VyZWQuCisJCUlJbXBvcnRbXSBpbXBvcnRzID0gZmVhdHVyZS5nZXRJbXBvcnRzKCk7CisJCUlJbXBvcnQgcGF0Y2hSZWZlcmVuY2UgPSBudWxsOworCQlmb3IgKGludCBpID0gMDsgaSA8IGltcG9ydHMubGVuZ3RoOyBpKyspIHsKKwkJCUlJbXBvcnQgaWltcG9ydCA9IGltcG9ydHNbaV07CisJCQlpZiAoaWltcG9ydC5pc1BhdGNoKCkpIHsKKwkJCQlwYXRjaFJlZmVyZW5jZSA9IGlpbXBvcnQ7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKHBhdGNoUmVmZXJlbmNlID09IG51bGwpCisJCQlyZXR1cm4gZmFsc2U7CisJCVZlcnNpb25lZElkZW50aWZpZXIgcmVmVmlkID0gcGF0Y2hSZWZlcmVuY2UuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOworCisJCS8vIEZpbmQgdGhlIHBhdGNoZWQgZmVhdHVyZSBhbmQgCisJCUlDb25maWd1cmVkU2l0ZSBjc2l0ZSA9IGZlYXR1cmUuZ2V0U2l0ZSgpLmdldEN1cnJlbnRDb25maWd1cmVkU2l0ZSgpOworCQlpZiAoY3NpdGUgPT0gbnVsbCkKKwkJCXJldHVybiBmYWxzZTsKKworCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGNyZWZzID0gY3NpdGUuZ2V0Q29uZmlndXJlZEZlYXR1cmVzKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgY3JlZnMubGVuZ3RoOyBpKyspIHsKKwkJCUlGZWF0dXJlUmVmZXJlbmNlIGNyZWYgPSBjcmVmc1tpXTsKKwkJCVZlcnNpb25lZElkZW50aWZpZXIgY3ZpZCA9IGNyZWYuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOworCQkJaWYgKGN2aWQuZ2V0SWRlbnRpZmllcigpLmVxdWFscyhyZWZWaWQuZ2V0SWRlbnRpZmllcigpKSkgeworCQkJCS8vIFRoaXMgaXMgdGhlIG9uZS4KKwkJCQlpZiAoY3ZpZC5nZXRWZXJzaW9uKCkuaXNHcmVhdGVyVGhhbihyZWZWaWQuZ2V0VmVyc2lvbigpKSkgeworCQkJCQkvLyBCaW5nbzogd2UgZm91bmQgdGhlIHJlZmVyZW5jZWQgZmVhdHVyZQorCQkJCQkvLyBhbmQgaXRzIHZlcnNpb24gaXMgZ3JlYXRlciAtIAorCQkJCQkvLyB3ZSBjYW4gYXNzdW1lIHRoYXQgaXQgY29udGFpbnMgYmV0dGVyIGNvZGUKKwkJCQkJLy8gdGhhbiB0aGUgcGF0Y2ggdGhhdCByZWZlcmVuY2VkIHRoZQorCQkJCQkvLyBvbGRlciB2ZXJzaW9uLgorCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXB1YmxpYyBzdGF0aWMgVVJMIGdldFVwZGF0ZU1hcFVSTCgpIHsKKwkJUHJlZmVyZW5jZXMgcHJlZiA9IFVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKKwkJU3RyaW5nIG1hcEZpbGUgPSBwcmVmLmdldFN0cmluZyhVcGRhdGVVdGlscy5QX1VQREFURV9QT0xJQ1lfVVJMKTsKKwkJaWYgKG1hcEZpbGUhPW51bGwgJiYgbWFwRmlsZS5sZW5ndGgoKT4wKSB7CisJCQl0cnkgeworCQkJCVVSTCB1cmwgPSBuZXcgVVJMKG1hcEZpbGUpOworCQkJCVVSTCByZXNvbHZlZFVSTCA9IFVSTEVuY29kZXIuZW5jb2RlKHVybCk7CisJCQkJcmV0dXJuIHJlc29sdmVkVVJMOworCQkJfQorCQkJY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisJCQkJVXBkYXRlVXRpbHMubG9nRXhjZXB0aW9uKGUpOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKwkKKwkvKgorCSAqIExvYWQgdGhlIHVwZGF0ZSBtYXAgdXNpbmcgdGhlIG1hcCBVUkwgZm91bmQgaW4gdGhlIHNjb3BlLgorCSAqLwkKKwlwdWJsaWMgc3RhdGljIElTdGF0dXMgbG9hZFVwZGF0ZVBvbGljeShVcGRhdGVQb2xpY3kgbWFwLCBVUkwgdXJsLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJbW9uaXRvci5zdWJUYXNrKE1lc3NhZ2VzLlVwZGF0ZVNlYXJjaFJlcXVlc3RfbG9hZGluZ1BvbGljeSk7IAorCQl0cnkgeworCQkJbWFwLmxvYWQodXJsLCBtb25pdG9yKTsKKwkJCW1vbml0b3Iud29ya2VkKDEpOworCQl9CisJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCUlTdGF0dXMgc3RhdHVzID0gZS5nZXRTdGF0dXMoKTsKKwkJCWlmIChzdGF0dXMgPT0gbnVsbAorCQkJCXx8IHN0YXR1cy5nZXRDb2RlKCkgIT0gSVNpdGUuU0lURV9BQ0NFU1NfRVhDRVBUSU9OKQorCQkJCXRocm93IGU7CisJCQltb25pdG9yLndvcmtlZCgxKTsKKwkJCXJldHVybiBzdGF0dXM7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGRvd25sb2FkRmVhdHVyZUNvbnRlbnQoCisgICAgICAgIElDb25maWd1cmVkU2l0ZSB0YXJnZXRTaXRlLAorCQlJRmVhdHVyZSBmZWF0dXJlLAorCQlJRmVhdHVyZVJlZmVyZW5jZVtdIG9wdGlvbmFsQ2hpbGRyZW4sIC8vIG51bGwgd2hlbiBmZWF0dXJlIGhhcyBubyBvcHRpb25hbCBmZWF0dXJlcworCQlJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzKQorCQl0aHJvd3MgSW5zdGFsbEFib3J0ZWRFeGNlcHRpb24sIENvcmVFeGNlcHRpb24geworCQkKKwkJLy9ERUJVRworCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfSU5TVEFMTCkgeworCQkJVXBkYXRlQ29yZS5kZWJ1ZygKKwkJCQkiRG93bmxvYWRpbmcuLi46IiArIGZlYXR1cmUuZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKSk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCisJCS8vIEdldCBzb3VyY2UgZmVhdHVyZSBwcm92aWRlciBhbmQgdmVyaWZpZXIuCisJCS8vIEluaXRpYWxpemUgdGFyZ2V0IHZhcmlhYmxlcy4KKwkJZmluYWwgSUZlYXR1cmVDb250ZW50UHJvdmlkZXIgcHJvdmlkZXIgPQorCQkJZmVhdHVyZS5nZXRGZWF0dXJlQ29udGVudFByb3ZpZGVyKCk7CisJCUlQbHVnaW5FbnRyeVtdIHRhcmdldFNpdGVQbHVnaW5FbnRyaWVzID0gbnVsbDsKKworCQkvLyBkZXRlcm1pbmUgbGlzdCBvZiBwbHVnaW5zIHRvIGluc3RhbGwKKwkJLy8gZmluZCB0aGUgaW50ZXJzZWN0aW9uIGJldHdlZW4gdGhlIHBsdWdpbiBlbnRyaWVzIGFscmVhZHkgY29udGFpbmVkCisJCS8vIG9uIHRoZSB0YXJnZXQgc2l0ZSwgYW5kIHBsdWdpbiBlbnRyaWVzIHBhY2thZ2VkIGluIHNvdXJjZSBmZWF0dXJlCisJCUlQbHVnaW5FbnRyeVtdIHNvdXJjZUZlYXR1cmVQbHVnaW5FbnRyaWVzID0gZmVhdHVyZS5nZXRQbHVnaW5FbnRyaWVzKCk7CisKKyAgICAgICAgYm9vbGVhbiBmZWF0dXJlQWxyZWFkeUluc3RhbGxlZCA9IGZhbHNlOworICAgICAgICBpZiAodGFyZ2V0U2l0ZSA9PSBudWxsKQorICAgICAgICAgICAgdGFyZ2V0U2l0ZSA9IGdldFNpdGVXaXRoRmVhdHVyZShTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKQorICAgICAgICAgICAgICAgICAgICAuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKSwgKChGZWF0dXJlKSBmZWF0dXJlKQorICAgICAgICAgICAgICAgICAgICAuZ2V0RmVhdHVyZUlkZW50aWZpZXIoKSk7CisJCWlmICh0YXJnZXRTaXRlID09IG51bGwpIHsKKwkJCWlmIChVcGRhdGVDb3JlLkRFQlVHICYmIFVwZGF0ZUNvcmUuREVCVUdfU0hPV19JTlNUQUxMKSB7CisJCQkJVXBkYXRlQ29yZS5kZWJ1ZygiVGhlIHNpdGUgdG8gaW5zdGFsbCBpbiBpcyBudWxsIik7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKworCQkJdGFyZ2V0U2l0ZVBsdWdpbkVudHJpZXMgPSBuZXcgSVBsdWdpbkVudHJ5WzBdOworCQl9IGVsc2UgeworCQkJdGFyZ2V0U2l0ZVBsdWdpbkVudHJpZXMgPSB0YXJnZXRTaXRlLmdldFNpdGUoKS5nZXRQbHVnaW5FbnRyaWVzKCk7CisgICAgICAgICAgICBmZWF0dXJlQWxyZWFkeUluc3RhbGxlZCA9IFVwZGF0ZVV0aWxzLmdldExvY2FsRmVhdHVyZSh0YXJnZXRTaXRlLGZlYXR1cmUpICE9IG51bGw7CisJCX0KKwkJSVBsdWdpbkVudHJ5W10gcGx1Z2luc1RvSW5zdGFsbCA9CisJCQlVcGRhdGVNYW5hZ2VyVXRpbHMuZGlmZigKKwkJCQlzb3VyY2VGZWF0dXJlUGx1Z2luRW50cmllcywKKwkJCQl0YXJnZXRTaXRlUGx1Z2luRW50cmllcyk7CisJCUlOb25QbHVnaW5FbnRyeVtdIG5vblBsdWdpbnNUb0luc3RhbGwgPSBmZWF0dXJlLmdldE5vblBsdWdpbkVudHJpZXMoKTsKKwkJCisJCUlGZWF0dXJlUmVmZXJlbmNlW10gY2hpbGRyZW4gPSBmZWF0dXJlLmdldEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKTsKKwkJaWYgKG9wdGlvbmFsQ2hpbGRyZW4gIT0gbnVsbCkgeworCQkJY2hpbGRyZW4gPQorCQkJCVVwZGF0ZU1hbmFnZXJVdGlscy5vcHRpb25hbENoaWxkcmVuVG9JbnN0YWxsKAorCQkJCQljaGlsZHJlbiwKKwkJCQkJb3B0aW9uYWxDaGlsZHJlbik7CisJCX0KKworCQkvLyBtYWtlIHN1cmUgd2UgaGF2ZSBhbiBJbnN0YWxsTW9uaXRvcgkJCisJCUluc3RhbGxNb25pdG9yIG1vbml0b3I7CisJCWlmIChwcm9ncmVzcyA9PSBudWxsKQorCQkJbW9uaXRvciA9IG5ldyBJbnN0YWxsTW9uaXRvcihuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKKwkJZWxzZSBpZiAocHJvZ3Jlc3MgaW5zdGFuY2VvZiBJbnN0YWxsTW9uaXRvcikKKwkJCW1vbml0b3IgPSAoSW5zdGFsbE1vbml0b3IpIHByb2dyZXNzOworCQllbHNlCisJCQltb25pdG9yID0gbmV3IEluc3RhbGxNb25pdG9yKHByb2dyZXNzKTsKKworCQl0cnkgeworCQkJLy8gZGV0ZXJtaW5lIG51bWJlciBvZiBtb25pdG9yIHRhc2tzCisJCQkvLyAgIDEgdGFzazEgZm9yIHRoZSBmZWF0dXJlIGphciAoZG93bmxvYWQpCisJCQkvLyArIG4gdGFza3MgZm9yIHBsdWdpbiBlbnRyaWVzIChkb3dubG9hZCBmb3IgZWFjaCkKKwkJCS8vICsgbSB0YXNrcyBwZXIgbm9uLXBsdWdpbiBkYXRhIGVudHJ5IChkb3dubG9hZCBmb3IgZWFjaCkKKwkJCS8vIFRPRE8gY3VzdG9tIGluc3RhbGwgaGFuZGxlciAgKyAxIHRhc2sgZm9yIGN1c3RvbSBub24tcGx1Z2luIGVudHJ5IGhhbmRsaW5nICgxIGZvciBhbGwgY29tYmluZWQpCisJCQkvLyArIDMqeCB0YXNrcyBmb3IgY2hpbGRyZW4gZmVhdHVyZXMgKDMgc3VidGFza3MgcGVyIGluc3RhbGwpCisJCQlpbnQgdGFza0NvdW50ID0KKwkJCQkJMQorCQkJCQkrIHBsdWdpbnNUb0luc3RhbGwubGVuZ3RoCisJCQkJCSsgbm9uUGx1Z2luc1RvSW5zdGFsbC5sZW5ndGgKKy8vCQkJCSsgMQorCQkJCQkrIDMgKiBjaGlsZHJlbi5sZW5ndGg7CisJCQltb25pdG9yLmJlZ2luVGFzaygiIiwgdGFza0NvdW50KTsgLy8kTk9OLU5MUy0xJAorCQkJCisJCQkvLyBEb3dubG9hZCBmZWF0dXJlIGFyY2hpdmUocykKKwkJCXByb3ZpZGVyLmdldEZlYXR1cmVFbnRyeUFyY2hpdmVSZWZlcmVuY2VzKG1vbml0b3IpOworCQkJbW9uaXRvcldvcmsobW9uaXRvciwxKTsKKwkJCQorCQkJLy8gRG93bmxvYWQgcGx1Z2luIGFyY2hpdmVzCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHBsdWdpbnNUb0luc3RhbGwubGVuZ3RoOyBpKyspIHsKKwkJCQlwcm92aWRlci5nZXRQbHVnaW5FbnRyeUFyY2hpdmVSZWZlcmVuY2VzKHBsdWdpbnNUb0luc3RhbGxbaV0sIG1vbml0b3IpOworCQkJCW1vbml0b3JXb3JrKG1vbml0b3IsMSk7CisJCQl9CisJCQkKKwkJCQorCisJCQkvLyBEb3dubG9hZCBub24tcGx1Z2luIGFyY2hpdmVzLiBWZXJpZmljYXRpb24gaGFuZGxlZCBieSBvcHRpb25hbCBpbnN0YWxsIGhhbmRsZXIKKyAgICAgICAgICAgIC8vIE5vdGU6IGRvIG5vdCBkb3dubG9hZCBub24tcGx1Z2luIGFyY2hpdmVzIGZvciBpbnN0YWxsZWQgZmVhdHVyZXMKKyAgICAgICAgICAgIGlmIChub25QbHVnaW5zVG9JbnN0YWxsLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICAvLyBTZXR1cCBvcHRpb25hbCBpbnN0YWxsIGhhbmRsZXIKKyAgICAgICAgICAgICAgICBJbnN0YWxsSGFuZGxlclByb3h5IGhhbmRsZXIgPSBudWxsOworICAgICAgICAgICAgICAgIGlmIChmZWF0dXJlLmdldEluc3RhbGxIYW5kbGVyRW50cnkoKSE9bnVsbCkKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlciA9IG5ldyBJbnN0YWxsSGFuZGxlclByb3h5KAorICAgICAgICAgICAgICAgICAgICAgICAgSUluc3RhbGxIYW5kbGVyLkhBTkRMRVJfQUNUSU9OX0lOU1RBTEwsCisgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZS5nZXRJbnN0YWxsSGFuZGxlckVudHJ5KCksCisgICAgICAgICAgICAgICAgICAgICAgICBtb25pdG9yKTsKKyAgICAgICAgICAgIAkKKyAgICAgICAgICAgICAgICBpZiAoIWZlYXR1cmVBbHJlYWR5SW5zdGFsbGVkKQorICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vblBsdWdpbnNUb0luc3RhbGwubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYW5kbGVyPT1udWxsIHx8IGhhbmRsZXIuYWNjZXB0Tm9uUGx1Z2luRGF0YShub25QbHVnaW5zVG9JbnN0YWxsW2ldKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIAlwcm92aWRlci5nZXROb25QbHVnaW5FbnRyeUFyY2hpdmVSZWZlcmVuY2VzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25QbHVnaW5zVG9JbnN0YWxsW2ldLCBtb25pdG9yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vbml0b3JXb3JrKG1vbml0b3IsIDEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBtb25pdG9yV29yayhtb25pdG9yLCBub25QbHVnaW5zVG9JbnN0YWxsLmxlbmd0aCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgIAorCQkJLy8gRG93bmxvYWQgY2hpbGQgZmVhdHVyZXMKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKKwkJCQlJRmVhdHVyZSBjaGlsZEZlYXR1cmUgPSBudWxsOworCQkJCXRyeSB7CisJCQkJCWNoaWxkRmVhdHVyZSA9IGNoaWxkcmVuW2ldLmdldEZlYXR1cmUobnVsbCk7CisJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkJCVVwZGF0ZUNvcmUud2FybihudWxsLCBlKTsKKwkJCQl9CisJCQkJaWYgKGNoaWxkRmVhdHVyZSAhPSBudWxsKSB7CisJCQkJCVN1YlByb2dyZXNzTW9uaXRvciBzdWJNb25pdG9yID0gbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAzKTsKKwkJCQkJZG93bmxvYWRGZWF0dXJlQ29udGVudCh0YXJnZXRTaXRlLCBjaGlsZEZlYXR1cmUsIG9wdGlvbmFsQ2hpbGRyZW4sIHN1Yk1vbml0b3IpOworCQkJCX0KKwkJCX0KKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChtb25pdG9yICE9IG51bGwpCisJCQkJbW9uaXRvci5kb25lKCk7CisJCX0KKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBtb25pdG9yV29yayhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIGludCB0aWNrKQorCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwlpZiAobW9uaXRvciAhPSBudWxsKSB7CisJCW1vbml0b3Iud29ya2VkKHRpY2spOworCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKKwkJCVN0cmluZyBtc2cgPSAiZG93bmxvYWQgY2FuY2VsbGVkIjsvL1BvbGljeS5iaW5kKCJGZWF0dXJlLkluc3RhbGxhdGlvbkNhbmNlbGxlZCIpOyAvLyROT04tTkxTLTEkCisJCQl0aHJvdyBuZXcgSW5zdGFsbEFib3J0ZWRFeGNlcHRpb24obXNnLCBudWxsKTsKKwkJfQorCX0KK30KKwlwdWJsaWMgc3RhdGljIElGZWF0dXJlIGdldEluY2x1ZGVkRmVhdHVyZShJRmVhdHVyZSBmZWF0dXJlLCBJRmVhdHVyZVJlZmVyZW5jZSBpcmVmKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCUlGZWF0dXJlIGlmZWF0dXJlID0gbnVsbDsKKwkJaWYgKGZlYXR1cmUuZ2V0U2l0ZSgpIGluc3RhbmNlb2YgRXh0ZW5kZWRTaXRlKSB7CisJCQlpZmVhdHVyZSA9ICgoRXh0ZW5kZWRTaXRlKWZlYXR1cmUuZ2V0U2l0ZSgpKS5nZXRMaXRlRmVhdHVyZShpcmVmLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSk7CisJCX0KKwkJaWYgKGlmZWF0dXJlID09IG51bGwpIHsKKwkJCWlmZWF0dXJlID0gaXJlZi5nZXRGZWF0dXJlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOworCQl9CisJCXJldHVybiBpZmVhdHVyZTsKKwl9Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9wcm92aXNpb25hbC9TaXRlT3B0aW1pemVyQXBwbGljYXRpb24uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3Byb3Zpc2lvbmFsL1NpdGVPcHRpbWl6ZXJBcHBsaWNhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhOTc5YTIKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9wcm92aXNpb25hbC9TaXRlT3B0aW1pemVyQXBwbGljYXRpb24uamF2YQpAQCAtMCwwICsxLDkwNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqICAgICBDaHJpcyBBbmlzemN6eWsgKElCTSBDb3JwLikgLSBOTC1lbmFibGVkIHRoZSBzaXRlIG9wdGltaXplcgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5wcm92aXNpb25hbDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CitpbXBvcnQgamF2YS51dGlsLmphci5KYXJGaWxlOworaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsYXRmb3JtUnVubmFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC5EZWZhdWx0U2l0ZVBhcnNlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC5GZWF0dXJlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuRmVhdHVyZU1vZGVsRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC5GZWF0dXJlUmVmZXJlbmNlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuSW1wb3J0TW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuUGx1Z2luRW50cnlNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC5TaXRlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuVVJMRW50cnlNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5FeHRlbmRlZFNpdGVVUkxGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLk1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLlVwZGF0ZUNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuVXBkYXRlTWFuYWdlclV0aWxzOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5qYXJwcm9jZXNzb3IuSmFyUHJvY2Vzc29yOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5qYXJwcm9jZXNzb3IuSmFyUHJvY2Vzc29yRXhlY3V0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmphcnByb2Nlc3Nvci5NYWluOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKKworLyoqCisgKiBUaGUgYXBwbGljYXRpb24gY2xhc3MgdXNlZCB0byBwZXJmb3JtIHVwZGF0ZSBzaXRlIG9wdGltaXphdGlvbnMuCisgKiA8cD4KKyAqIFRoaXMgY2xhc3MgY2FuIG9ubHkgYmUgcmVmZXJlbmNlZCBmcm9tIDxjb2RlPm9yZy5lY2xpcHNlLnJ1bnRpbWUuYXBwbGljYXRpb25zPC9jb2RlPgorICogZXh0ZW5zaW9uIHBvaW50LiBJdCBzaG91bGQgbm90IGJlIGV4dGVuZGVkIG9yIGluc3RhbnRpYXRlZC4KKyAqIDxwPgorICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAorICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZworICogc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKKyAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzCisgKiBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgorICogPC9wPgorICogCisgKiBAc2luY2UgMy4yCisgKi8KK3B1YmxpYyBjbGFzcyBTaXRlT3B0aW1pemVyQXBwbGljYXRpb24gaW1wbGVtZW50cyBJUGxhdGZvcm1SdW5uYWJsZSB7CisJcHVibGljIGZpbmFsIHN0YXRpYyBJbnRlZ2VyIEVYSVRfRVJST1IgPSBuZXcgSW50ZWdlcigxKTsKKworCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEpBUl9QUk9DRVNTT1IgPSAiLWphclByb2Nlc3NvciI7IC8vJE5PTi1OTFMtMSQKKworCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERJR0VTVF9CVUlMREVSID0gIi1kaWdlc3RCdWlsZGVyIjsgLy8kTk9OLU5MUy0xJAorCisJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU5QVVQgPSAiaW5wdXQiOyAvLyROT04tTkxTLTEkCisKKwlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBPVVRQVVRfRElSID0gIi1vdXRwdXREaXIiOyAvLyROT04tTkxTLTEkCisKKwlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWRVJCT1NFID0gIi12ZXJib3NlIjsgLy8kTk9OLU5MUy0xJAorCisJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSkFSX1BST0NFU1NPUl9QQUNLID0gIi1wYWNrIjsgLy8kTk9OLU5MUy0xJAorCisJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSkFSX1BST0NFU1NPUl9VTlBBQ0sgPSAiLXVucGFjayI7IC8vJE5PTi1OTFMtMSQKKworCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEpBUl9QUk9DRVNTT1JfUkVQQUNLID0gIi1yZXBhY2siOyAvLyROT04tTkxTLTEkCisKKwlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBKQVJfUFJPQ0VTU09SX1NJR04gPSAiLXNpZ24iOyAvLyROT04tTkxTLTEkCisKKwlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBKQVJfUFJPQ0VTU09SX1BST0NFU1NfQUxMID0gIi1wcm9jZXNzQWxsIjsgLy8kTk9OLU5MUy0xJAorCisJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU0lURV9YTUwgPSAiLXNpdGVYTUwiOyAvLyROT04tTkxTLTEkCisKKwlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTSVRFX0FUVFJJQlVURVNfRklMRSA9ICJzaXRlQXR0cmlidXRlcy50eHQiOyAvLyROT04tTkxTLTEkCisKKwlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBESUdFU1RfT1VUUFVUX0RJUiA9ICItZGlnZXN0T3V0cHV0RGlyIjsgLy8kTk9OLU5MUy0xJAorCisJLyoKKwkgKiBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgREVTQ1JJUFRJT04gPSAiREVTQ1JJUFRJT04iOyBwcml2YXRlIGZpbmFsCisJICogc3RhdGljIFN0cmluZyBMSUNFTkNFID0gIkxJQ0VOQ0UiOyBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ09QWVJJR0hUID0KKwkgKiAiQ09QWVJJR0hUIjsgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEZFQVRVUkVfTEFCRUwgPSAiRkVBVFVSRV9MQUJFTCI7CisJICovCisKKwkvKioKKwkgKiBQYXJzZXMgdGhlIGNvbW1hbmQgbGluZSBpbiB0aGUgZm9ybTogWy1rZXkgW3ZhbHVlXV0qIFtpbnB1dHZhbHVlXSBJZiB0aGUKKwkgKiBsYXN0IGFyZ3VtZW50IGRvZXMgbm90IHN0YXJ0IHdpdGggYSAiLSIgdGhlbiBpdCBpcyB0YWtlbiBhcyB0aGUgaW5wdXQKKwkgKiB2YWx1ZSBhbmQgbm90IHRoZSB2YWx1ZSBmb3IgYSBwcmVjZWRpbmcgLWtleQorCSAqIAorCSAqIEBwYXJhbSBhcmdzCisJICogQHJldHVybgorCSAqLworCXByaXZhdGUgTWFwIHBhcnNlQ21kTGluZShTdHJpbmdbXSBhcmdzKSB7CisJCU1hcCBjbWRzID0gbmV3IEhhc2hNYXAoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7CisJCQlpZiAoaSA9PSBhcmdzLmxlbmd0aCAtIDEgJiYgIWFyZ3NbaV0uc3RhcnRzV2l0aCgiLSIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQljbWRzLnB1dChJTlBVVCwgYXJnc1tpXSk7CisJCQl9IGVsc2UgeworCQkJCVN0cmluZyBrZXkgPSBhcmdzW2ldOworCQkJCVN0cmluZyB2YWwgPSBudWxsOworCQkJCWlmIChpIDwgYXJncy5sZW5ndGggLSAyICYmICFhcmdzW2kgKyAxXS5zdGFydHNXaXRoKCItIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCQl2YWwgPSBhcmdzWysraV07CisJCQkJfQorCisJCQkJaWYgKGtleS5zdGFydHNXaXRoKFNJVEVfWE1MKSkgeworCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4odmFsLmluZGV4T2YoIjpudWxsIikpOworCQkJCQl2YWwgPSBrZXkuc3Vic3RyaW5nKGtleS5pbmRleE9mKCI9IikgKyAxKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oa2V5ICsgIjoiICsgdmFsKTsKKwkJCQkJY21kcy5wdXQoU0lURV9YTUwsIHZhbCk7CisJCQkJfSBlbHNlIGlmIChrZXkuc3RhcnRzV2l0aChESUdFU1RfT1VUUFVUX0RJUikpIHsKKwkJCQkJdmFsID0ga2V5LnN1YnN0cmluZyhrZXkuaW5kZXhPZigiPSIpICsgMSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKGtleSArICI6IiArIHZhbCk7CisJCQkJCWNtZHMucHV0KERJR0VTVF9PVVRQVVRfRElSLCB2YWwpOworCQkJCX0gZWxzZSB7CisKKwkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKGtleSArICI6IiArIHZhbCk7CisJCQkJCWNtZHMucHV0KGtleSwgdmFsKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIGNtZHM7CisJfQorCisJcHJpdmF0ZSBib29sZWFuIHJ1bkphclByb2Nlc3NvcihNYXAgcGFyYW1zKSB7CisJCU1haW4uT3B0aW9ucyBvcHRpb25zID0gbmV3IE1haW4uT3B0aW9ucygpOworCQlvcHRpb25zLnBhY2sgPSBwYXJhbXMuY29udGFpbnNLZXkoSkFSX1BST0NFU1NPUl9QQUNLKTsKKwkJb3B0aW9ucy51bnBhY2sgPSBwYXJhbXMuY29udGFpbnNLZXkoSkFSX1BST0NFU1NPUl9VTlBBQ0spOworCQlvcHRpb25zLnJlcGFjayA9IHBhcmFtcy5jb250YWluc0tleShKQVJfUFJPQ0VTU09SX1JFUEFDSyk7CisJCW9wdGlvbnMucHJvY2Vzc0FsbCA9IHBhcmFtcy5jb250YWluc0tleShKQVJfUFJPQ0VTU09SX1BST0NFU1NfQUxMKTsKKwkJb3B0aW9ucy52ZXJib3NlID0gcGFyYW1zLmNvbnRhaW5zS2V5KFZFUkJPU0UpOworCQlvcHRpb25zLnNpZ25Db21tYW5kID0gKFN0cmluZykgcGFyYW1zLmdldChKQVJfUFJPQ0VTU09SX1NJR04pOworCQlvcHRpb25zLm91dHB1dERpciA9IChTdHJpbmcpIHBhcmFtcy5nZXQoT1VUUFVUX0RJUik7CisKKwkJU3RyaW5nIHByb2JsZW0gPSBudWxsOworCisJCVN0cmluZyBpbnB1dCA9IChTdHJpbmcpIHBhcmFtcy5nZXQoSU5QVVQpOworCQlpZiAoaW5wdXQgPT0gbnVsbCkKKwkJCXByb2JsZW0gPSBNZXNzYWdlcy5TaXRlT3B0aW1pemVyX2lucHV0Tm90U3BlY2lmaWVkOworCQllbHNlIHsKKwkJCUZpbGUgaW5wdXRGaWxlID0gbmV3IEZpbGUoaW5wdXQpOworCQkJaWYgKGlucHV0RmlsZS5leGlzdHMoKSkKKwkJCQlvcHRpb25zLmlucHV0ID0gaW5wdXRGaWxlOworCQkJZWxzZQorCQkJCXByb2JsZW0gPSBOTFMuYmluZChNZXNzYWdlcy5TaXRlT3B0aW1pemVyX2lucHV0RmlsZU5vdEZvdW5kLAorCQkJCQkJbmV3IFN0cmluZ1tdIHsgaW5wdXQgfSk7CisJCX0KKworCQlpZiAob3B0aW9ucy51bnBhY2spIHsKKwkJCWlmICghSmFyUHJvY2Vzc29yLmNhblBlcmZvcm1VbnBhY2soKSkgeworCQkJCXByb2JsZW0gPSBNZXNzYWdlcy5KYXJQcm9jZXNzb3JfdW5wYWNrTm90Rm91bmQ7CisJCQl9IGVsc2UgaWYgKG9wdGlvbnMucGFjayB8fCBvcHRpb25zLnJlcGFjaworCQkJCQl8fCBvcHRpb25zLnNpZ25Db21tYW5kICE9IG51bGwpIHsKKwkJCQlwcm9ibGVtID0gTWVzc2FnZXMuSmFyUHJvY2Vzc29yX25vUGFja1VucGFjazsKKwkJCX0KKwkJfSBlbHNlIGlmICgob3B0aW9ucy5wYWNrIHx8IG9wdGlvbnMucmVwYWNrKQorCQkJCSYmICFKYXJQcm9jZXNzb3IuY2FuUGVyZm9ybVBhY2soKSkgeworCQkJcHJvYmxlbSA9IE1lc3NhZ2VzLkphclByb2Nlc3Nvcl9wYWNrTm90Rm91bmQ7CisJCX0KKworCQlpZiAocHJvYmxlbSAhPSBudWxsKSB7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4ocHJvYmxlbSk7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQluZXcgSmFyUHJvY2Vzc29yRXhlY3V0b3IoKS5ydW5KYXJQcm9jZXNzb3Iob3B0aW9ucyk7CisJCXJldHVybiB0cnVlOworCX0KKworCXByaXZhdGUgYm9vbGVhbiBydW5EaWdlc3RCdWlsZGVyKE1hcCBwYXJhbXMpIHsKKworCQlMaXN0IGZlYXR1cmVMaXN0ID0gZ2V0RmVhdHVyZUxpc3QocGFyYW1zKTsKKworCQlpZiAoKGZlYXR1cmVMaXN0ID09IG51bGwpIHx8IGZlYXR1cmVMaXN0LmlzRW1wdHkoKSkgeworCQkJU3lzdGVtLm91dC5wcmludGxuKCJubyBmZWF0dXJlcyB0byBwcm9jZXNzIik7IC8vJE5PTi1OTFMtMSQKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlNYXAgcGVyRmVhdHVyZUxvY2FsZXMgPSBuZXcgSGFzaE1hcCgpOworCQlNYXAgYXZhaWxhYmxlTG9jYWxlcyA9IGdldEF2YWlsYWJsZUxvY2FsZXMoZmVhdHVyZUxpc3QsCisJCQkJcGVyRmVhdHVyZUxvY2FsZXMpOworCQl0cnkgeworCQkJb3BlbklucHV0U3RyZW1hcyhhdmFpbGFibGVMb2NhbGVzKTsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZTEpIHsKKwkJCWUxLnByaW50U3RhY2tUcmFjZSgpOworCQkJU3lzdGVtLm91dC5wcmludGxuKCJDYW4gbm90IGNyZWF0ZSBmaWxlIGluIG91dHB1dCBkaXJlY290cnkiKTsgLy8kTk9OLU5MUy0xJAorCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJZm9yKGludCBpID0gMDsgaSA8IGZlYXR1cmVMaXN0LnNpemUoKTsgaSsrKSB7CisKKwkJCVN0cmluZyBmZWF0dXJlSmFyRmlsZU5hbWUgPSAoU3RyaW5nKSBmZWF0dXJlTGlzdC5nZXQoaSk7CisKKwkJCWlmIChmZWF0dXJlSmFyRmlsZU5hbWUuZW5kc1dpdGgoImphciIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlByb2Nlc3NpbmcuLi4gIiArIGZlYXR1cmVKYXJGaWxlTmFtZSk7IC8vJE5PTi1OTFMtMSQKKwkJCX0gZWxzZSB7CisJCQkJU3lzdGVtLm91dC5wcmludGxuKCJTa2lwcGluZy4uLiAiICsgZmVhdHVyZUphckZpbGVOYW1lKTsgLy8kTk9OLU5MUy0xJAorCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlKYXJGaWxlIGZlYXR1cmVKYXIgPSBudWxsOworCQkJdHJ5IHsKKwkJCQlmZWF0dXJlSmFyID0gbmV3IEphckZpbGUoZmVhdHVyZUphckZpbGVOYW1lKTsKKwkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlByb2JsZW0gd2l0aCBvcGVuaW5nIGphcjogIiAvLyROT04tTkxTLTEkCisJCQkJCQkrIGZlYXR1cmVKYXJGaWxlTmFtZSk7CisJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCQlGZWF0dXJlTW9kZWxGYWN0b3J5IGZtZiA9IG5ldyBGZWF0dXJlTW9kZWxGYWN0b3J5KCk7CisKKwkJCXRyeSB7CisJCQkJWmlwRW50cnkgZmVhdHVyZVhNTEVudHJ5ID0gZmVhdHVyZUphci5nZXRFbnRyeSgiZmVhdHVyZS54bWwiKTsgLy8kTk9OLU5MUy0xJAorCQkJCU1hcCBmZWF0dXJlUHJvcGVydGllcyA9IGxvYWRQcm9wZXJ0aWVzKGZlYXR1cmVKYXIsCisJCQkJCQlmZWF0dXJlSmFyRmlsZU5hbWUsIHBlckZlYXR1cmVMb2NhbGVzKTsKKworCQkJCUZlYXR1cmVNb2RlbCBmZWF0dXJlTW9kZWwgPSBmbWYucGFyc2VGZWF0dXJlKGZlYXR1cmVKYXIKKwkJCQkJCS5nZXRJbnB1dFN0cmVhbShmZWF0dXJlWE1MRW50cnkpKTsKKworCQkJCWZlYXR1cmVMaXN0ID0gYWRkRmVhdHVyZXNUb0xpc3QoIChTdHJpbmcpIHBhcmFtcy5nZXQoU0lURV9YTUwpLCBmZWF0dXJlTGlzdCwgZmVhdHVyZU1vZGVsLmdldEZlYXR1cmVJbmNsdWRlZCgpLCBhdmFpbGFibGVMb2NhbGVzLCBwZXJGZWF0dXJlTG9jYWxlcyk7CisKKwkJCQlJdGVyYXRvciBhdmFpbGFibGVMb2NhbGVzSXRlcmF0b3IgPSBhdmFpbGFibGVMb2NhbGVzLnZhbHVlcygpCisJCQkJLml0ZXJhdG9yKCk7CisJCQkJd2hpbGUgKGF2YWlsYWJsZUxvY2FsZXNJdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCQkJKChBdmFpbGFibGVMb2NhbGUpIGF2YWlsYWJsZUxvY2FsZXNJdGVyYXRvci5uZXh0KCkpCisJCQkJCS53cml0ZUZlYXR1cmVEaWdlc3RzKGZlYXR1cmVNb2RlbCwKKwkJCQkJCQlmZWF0dXJlUHJvcGVydGllcyk7CisJCQkJfQorCisJCQl9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgeworCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCX0KKwkJSXRlcmF0b3IgYXZhaWxhYmxlTG9jYWxlc0l0ZXJhdG9yID0gYXZhaWxhYmxlTG9jYWxlcy52YWx1ZXMoKQorCQkuaXRlcmF0b3IoKTsKKwkJU3RyaW5nIG91dHB1dERpcmVjdG9yeSA9IChTdHJpbmcpIHBhcmFtcy5nZXQoRElHRVNUX09VVFBVVF9ESVIpOworCisJCW91dHB1dERpcmVjdG9yeSA9IG91dHB1dERpcmVjdG9yeS5zdWJzdHJpbmcob3V0cHV0RGlyZWN0b3J5CisJCQkJLmluZGV4T2YoIj0iKSArIDEpOyAvLyROT04tTkxTLTEkCisJCWlmICghb3V0cHV0RGlyZWN0b3J5LmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSkgeworCQkJb3V0cHV0RGlyZWN0b3J5ID0gb3V0cHV0RGlyZWN0b3J5ICsgRmlsZS5zZXBhcmF0b3I7CisJCX0KKwkJd2hpbGUgKGF2YWlsYWJsZUxvY2FsZXNJdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCXRyeSB7CisJCQkJKChBdmFpbGFibGVMb2NhbGUpIGF2YWlsYWJsZUxvY2FsZXNJdGVyYXRvci5uZXh0KCkpCisJCQkJLmZpbmlzaERpZ2VzdChvdXRwdXREaXJlY3RvcnkpOworCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ2FuIG5vdCB3cml0ZSBpbiBkaWdlc3Qgb3V0cHV0IGRpcmVjdG9yeTogIiAvLyROT04tTkxTLTEkCisJCQkJCQkrIG91dHB1dERpcmVjdG9yeSk7CisJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCX0KKwkJU3lzdGVtLm91dC5wcmludGxuKCJEb25lIik7IC8vJE5PTi1OTFMtMSQKKwkJcmV0dXJuIHRydWU7CisJfQorCisJcHJpdmF0ZSBMaXN0IGFkZEZlYXR1cmVzVG9MaXN0KCBTdHJpbmcgc2l0ZVhNTCwgTGlzdCBmZWF0dXJlTGlzdCwgSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZVtdIGlJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzLCBNYXAgYXZhaWxhYmxlTG9jYWxlcywgTWFwIHBlckZlYXR1cmVMb2NhbGVzICkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCisJCVN0cmluZyBkaXJlY3RvcnlOYW1lID0gKG5ldyBGaWxlKHNpdGVYTUwpKS5nZXRQYXJlbnQoKTsKKwkJaWYgKCFkaXJlY3RvcnlOYW1lLmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSkgeworCQkJZGlyZWN0b3J5TmFtZSA9IGRpcmVjdG9yeU5hbWUgKyBGaWxlLnNlcGFyYXRvcjsKKwkJfQorCQlkaXJlY3RvcnlOYW1lID0gZGlyZWN0b3J5TmFtZSArICJmZWF0dXJlcyIgKyBGaWxlLnNlcGFyYXRvcjsgLy8kTk9OLU5MUy0xJAorCisJCWZvciAoaW50IGkgPSAwOyBpIDwgaUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsKKwkJCVN0cmluZyBmZWF0dXJlVVJMID0gZGlyZWN0b3J5TmFtZSArIGlJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzW2ldLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSArICIuamFyIjsgLy8kTk9OLU5MUy0xJAorCQkJaWYgKCEoaXNGZWF0dXJlQWxyZWFkeUluTGlzdChmZWF0dXJlTGlzdCwgZmVhdHVyZVVSTCkpKSB7CisJCQkJdHJ5IHsKKwkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJFeHRyYWN0aW5nIGxvY2FsZXMgZnJvbSBpbmNsdWRlZCBmZWF0dXJlICIgKyBmZWF0dXJlVVJMKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlwcm9jZXNzTG9jYWxlc0luSmFyKGF2YWlsYWJsZUxvY2FsZXMsIGZlYXR1cmVVUkwsIHBlckZlYXR1cmVMb2NhbGVzLCB0cnVlKTsKKwkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJCWlmIChpSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlc1tpXS5pc09wdGlvbmFsKCkpIAorCQkJCQkJY29udGludWU7CisJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hpbGUgZXh0cmFjdGluZyBsb2NhbGVzIGZyb20gaW5jbHVkZWQgZmVhdHVyZSAiICsgZmVhdHVyZVVSTCk7Ly8kTk9OLU5MUy0xJAkKKwkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oIG5ldyBTdGF0dXMoIElTdGF0dXMuRVJST1IsIFVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIElTdGF0dXMuT0ssICJFcnJvciB3aGlsZSBleHRyYWN0aW5nIGxvY2FsZXMgZnJvbSBpbmNsdWRlZCBmZWF0dXJlICIgKyBmZWF0dXJlVVJMLCBlKSk7IC8vJE5PTi1OTFMtMSQgCisJCQkJfQorCQkJCWZlYXR1cmVMaXN0LmFkZChmZWF0dXJlVVJMKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiBmZWF0dXJlTGlzdDsKKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gaXNGZWF0dXJlQWxyZWFkeUluTGlzdChMaXN0IGZlYXR1cmVMaXN0LCBTdHJpbmcgZmVhdHVyZVVSTCkgeworCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVMaXN0LnNpemUoKTsgaSsrKSB7CisJCQlTdHJpbmcgY3VycmVudEZlYXR1cmVVUkwgPSAoU3RyaW5nKWZlYXR1cmVMaXN0LmdldChpKTsKKwkJCWlmIChjdXJyZW50RmVhdHVyZVVSTC5lcXVhbHMoZmVhdHVyZVVSTCkpIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcHJpdmF0ZSBNYXAgbG9hZFByb3BlcnRpZXMoSmFyRmlsZSBmZWF0dXJlSmFyLCBTdHJpbmcgZmVhdHVyZUphckZpbGVOYW1lLAorCQkJTWFwIHBlckZlYXR1cmVMb2NhbGVzKSB7CisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigKKwkJLy8gKChMaXN0KXBlckZlYXR1cmVMb2NhbGVzLmdldChmZWF0dXJlSmFyRmlsZU5hbWUpKS5zaXplKCkpOworCQlJdGVyYXRvciBpdCA9ICgoTGlzdCkgcGVyRmVhdHVyZUxvY2FsZXMuZ2V0KGZlYXR1cmVKYXJGaWxlTmFtZSkpCisJCS5pdGVyYXRvcigpOworCQlNYXAgcmVzdWx0ID0gbmV3IEhhc2hNYXAoKTsKKwkJd2hpbGUgKGl0Lmhhc05leHQoKSkgeworCQkJU3RyaW5nIHByb3BlcnR5RmlsZU5hbWUgPSAoU3RyaW5nKSBpdC5uZXh0KCk7CisKKwkJCVppcEVudHJ5IGZlYXR1cmVQcm9wZXJ0aWVzRW50cnkgPSBmZWF0dXJlSmFyCisJCQkuZ2V0RW50cnkocHJvcGVydHlGaWxlTmFtZSk7CisJCQlQcm9wZXJ0aWVzIGZlYXR1cmVQcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKKwkJCWlmIChmZWF0dXJlUHJvcGVydGllc0VudHJ5ICE9IG51bGwpIHsKKwkJCQl0cnkgeworCQkJCQlmZWF0dXJlUHJvcGVydGllcy5sb2FkKGZlYXR1cmVKYXIKKwkJCQkJCQkuZ2V0SW5wdXRTdHJlYW0oZmVhdHVyZVByb3BlcnRpZXNFbnRyeSkpOworCQkJCQlTdHJpbmcgbG9jYWxlU3RyaW5nID0gbnVsbDsKKwkJCQkJaWYgKHByb3BlcnR5RmlsZU5hbWUuZW5kc1dpdGgoImZlYXR1cmUucHJvcGVydGllcyIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCWxvY2FsZVN0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkCisJCQkJCX0gZWxzZSB7CisJCQkJCQlsb2NhbGVTdHJpbmcgPSBwcm9wZXJ0eUZpbGVOYW1lLnN1YnN0cmluZyg4LAorCQkJCQkJCQlwcm9wZXJ0eUZpbGVOYW1lLmluZGV4T2YoJy4nKSk7CisJCQkJCX0KKwkJCQkJcmVzdWx0LnB1dChsb2NhbGVTdHJpbmcsIGZlYXR1cmVQcm9wZXJ0aWVzKTsKKwkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcHJpdmF0ZSB2b2lkIG9wZW5JbnB1dFN0cmVtYXMoTWFwIGF2YWlsYWJsZUxvY2FsZXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUl0ZXJhdG9yIGxvY2FsZXMgPSBhdmFpbGFibGVMb2NhbGVzLnZhbHVlcygpLml0ZXJhdG9yKCk7CisJCXdoaWxlIChsb2NhbGVzLmhhc05leHQoKSkgeworCQkJQXZhaWxhYmxlTG9jYWxlIGF2YWlsYWJsZUxvY2FsZSA9IChBdmFpbGFibGVMb2NhbGUpIGxvY2FsZXMubmV4dCgpOworCQkJYXZhaWxhYmxlTG9jYWxlLm9wZW5Mb2NhbGl6ZWRPdXRwdXRTdHJlYW0oKTsKKwkJfQorCX0KKworCXByaXZhdGUgTWFwIGdldEF2YWlsYWJsZUxvY2FsZXMoTGlzdCBmZWF0dXJlTGlzdCwgTWFwIHBlckZlYXR1cmVMb2NhbGVzKSB7CisJCUl0ZXJhdG9yIGZlYXR1cmVzID0gZmVhdHVyZUxpc3QuaXRlcmF0b3IoKTsKKwkJTWFwIGxvY2FsZXMgPSBuZXcgSGFzaE1hcCgpOworCQl3aGlsZSAoZmVhdHVyZXMuaGFzTmV4dCgpKSB7CisJCQlTdHJpbmcgZmVhdHVyZSA9IChTdHJpbmcpIGZlYXR1cmVzLm5leHQoKTsKKwkJCXRyeSB7CisJCQkJU3lzdGVtLm91dC5wcmludGxuKCJFeHRyYWN0aW5nIGxvY2FsZXMgZnJvbSAiICsgZmVhdHVyZSk7IC8vJE5PTi1OTFMtMSQKKwkJCQlwcm9jZXNzTG9jYWxlc0luSmFyKGxvY2FsZXMsIGZlYXR1cmUsIHBlckZlYXR1cmVMb2NhbGVzLCBmYWxzZSk7CisJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciB3aGlsZSBleHRyYWN0aW5nIGxvY2FsZXMgZnJvbSAiIC8vJE5PTi1OTFMtMSQKKwkJCQkJCSsgZmVhdHVyZSk7CisJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbG9jYWxlczsKKwl9CisKKwlwcml2YXRlIHZvaWQgcHJvY2Vzc0xvY2FsZXNJbkphcihNYXAgbG9jYWxlcywgU3RyaW5nIGZlYXR1cmUsCisJCQlNYXAgcGVyRmVhdHVyZUxvY2FsZXMsIGJvb2xlYW4gaWdub3JlTmV3TG9jYWxlcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworCQlKYXJGaWxlIGphciA9IG5ldyBKYXJGaWxlKGZlYXR1cmUpOworCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oZmVhdHVyZSk7CisJCUVudW1lcmF0aW9uIGZpbGVzID0gamFyLmVudHJpZXMoKTsKKworCQlMaXN0IGxvY2FsZXNUZW1wID0gbmV3IEFycmF5TGlzdCgpOworCQlwZXJGZWF0dXJlTG9jYWxlcy5wdXQoZmVhdHVyZSwgbG9jYWxlc1RlbXApOworCisJCXdoaWxlIChmaWxlcy5oYXNNb3JlRWxlbWVudHMoKSkgeworCQkJWmlwRW50cnkgZmlsZSA9IChaaXBFbnRyeSkgZmlsZXMubmV4dEVsZW1lbnQoKTsKKwkJCVN0cmluZyBsb2NhbGVTdHJpbmcgPSBudWxsOworCQkJU3RyaW5nIG5hbWUgPSBmaWxlLmdldE5hbWUoKTsKKwkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigicHJvY2Vzc0xvY2FsZXNJbkphcjoiK25hbWUpOworCQkJaWYgKG5hbWUuc3RhcnRzV2l0aCgiZmVhdHVyZSIpICYmIG5hbWUuZW5kc1dpdGgoIi5wcm9wZXJ0aWVzIikpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKG5hbWUpOworCQkJCWxvY2FsZXNUZW1wLmFkZChuYW1lKTsKKwkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4obmFtZSk7CisJCQkJaWYgKG5hbWUuZW5kc1dpdGgoImZlYXR1cmUucHJvcGVydGllcyIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQkJbG9jYWxlU3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKKwkJCQl9IGVsc2UgeworCQkJCQlsb2NhbGVTdHJpbmcgPSBuYW1lLnN1YnN0cmluZyg4LCBuYW1lLmluZGV4T2YoJy4nKSk7CisJCQkJfQorCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbihuYW1lICsiOjo6OlwiIiArIGxvY2FsZVN0cmluZyArICJcIiIpOworCQkJCWlmICggIWlnbm9yZU5ld0xvY2FsZXMgJiYgIWxvY2FsZXMuY29udGFpbnNLZXkobG9jYWxlU3RyaW5nKSkgeworCQkJCQlsb2NhbGVzLnB1dChsb2NhbGVTdHJpbmcsIG5ldyBBdmFpbGFibGVMb2NhbGUobG9jYWxlU3RyaW5nKSk7CisJCQkJfQorCQkJCWlmIChsb2NhbGVzLmNvbnRhaW5zS2V5KGxvY2FsZVN0cmluZykpIHsKKwkJCQkJQXZhaWxhYmxlTG9jYWxlIGN1cnJlbnRMb2NhbGUgPSAoQXZhaWxhYmxlTG9jYWxlKSBsb2NhbGVzLmdldChsb2NhbGVTdHJpbmcpOworCQkJCQljdXJyZW50TG9jYWxlLmFkZEZlYXR1cmVzKGZlYXR1cmUpOworCQkJCX0KKwkJCX0KKwkJfQorCisJfQorCisJcHJpdmF0ZSBMaXN0IGdldEZlYXR1cmVMaXN0KE1hcCBwYXJhbXMpIHsKKwkJaWYgKHBhcmFtcy5jb250YWluc0tleShTSVRFX1hNTCkKKwkJCQkmJiAoZmlsZUV4aXN0cygoU3RyaW5nKSBwYXJhbXMuZ2V0KFNJVEVfWE1MKSkpKSB7CisJCQlyZXR1cm4gZ2V0RmVhdHVyZUxpc3RGcm9tU2l0ZVhNTCgoU3RyaW5nKSBwYXJhbXMuZ2V0KFNJVEVfWE1MKSk7CisJCX0gZWxzZSBpZiAocGFyYW1zLmNvbnRhaW5zS2V5KElOUFVUKQorCQkJCSYmIGlzRGlyZWN0b3J5KChTdHJpbmcpIHBhcmFtcworCQkJCQkJLmdldChTaXRlT3B0aW1pemVyQXBwbGljYXRpb24uSU5QVVQpKSkgeworCQkJcmV0dXJuIGdldEZlYXR1cmVMaXN0RnJvbURpcmVjdG9yeSgoU3RyaW5nKSBwYXJhbXMuZ2V0KElOUFVUKSk7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHJpdmF0ZSBib29sZWFuIGZpbGVFeGlzdHMoU3RyaW5nIGZpbGVOYW1lKSB7CisJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiZmlsZUV4aXN0czoiK2ZpbGVOYW1lKTsKKwkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZmlsZU5hbWUpOworCQlpZiAoKGZpbGUgIT0gbnVsbCkgJiYgZmlsZS5leGlzdHMoKSkKKwkJCXJldHVybiB0cnVlOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcHJpdmF0ZSBMaXN0IGdldEZlYXR1cmVMaXN0RnJvbURpcmVjdG9yeShTdHJpbmcgZGlyZWN0b3J5TmFtZSkgeworCQlMaXN0IGZlYXR1cmVzVVJMcyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJRmlsZSBkaXJlY3RvcnkgPSBuZXcgRmlsZShkaXJlY3RvcnlOYW1lKTsKKwkJU3RyaW5nW10gZmVhdHVyZUphckZpbGVOYW1lcyA9IGRpcmVjdG9yeS5saXN0KCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZUphckZpbGVOYW1lcy5sZW5ndGg7IGkrKykgeworCQkJZmVhdHVyZXNVUkxzLmFkZChkaXJlY3RvcnlOYW1lICsgRmlsZS5zZXBhcmF0b3IKKwkJCQkJKyBmZWF0dXJlSmFyRmlsZU5hbWVzW2ldKTsKKwkJfQorCQlyZXR1cm4gZmVhdHVyZXNVUkxzOworCX0KKworCXByaXZhdGUgYm9vbGVhbiBpc0RpcmVjdG9yeShTdHJpbmcgZmlsZU5hbWUpIHsKKworCQlGaWxlIGRpcmVjdG9yeSA9IG5ldyBGaWxlKGZpbGVOYW1lKTsKKwkJaWYgKChkaXJlY3RvcnkgIT0gbnVsbCkgJiYgZGlyZWN0b3J5LmV4aXN0cygpCisJCQkJJiYgZGlyZWN0b3J5LmlzRGlyZWN0b3J5KCkpCisJCQlyZXR1cm4gdHJ1ZTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXByaXZhdGUgTGlzdCBnZXRGZWF0dXJlTGlzdEZyb21TaXRlWE1MKFN0cmluZyBzaXRlWE1MKSB7CisKKwkJTGlzdCBmZWF0dXJlc1VSTHMgPSBuZXcgQXJyYXlMaXN0KCk7CisJCVN0cmluZyBkaXJlY3RvcnlOYW1lID0gKG5ldyBGaWxlKHNpdGVYTUwpKS5nZXRQYXJlbnQoKTsKKwkJaWYgKCFkaXJlY3RvcnlOYW1lLmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSkgeworCQkJZGlyZWN0b3J5TmFtZSA9IGRpcmVjdG9yeU5hbWUgKyBGaWxlLnNlcGFyYXRvcjsKKwkJfQorCisJCURlZmF1bHRTaXRlUGFyc2VyIHNpdGVQYXJzZXIgPSBuZXcgRGVmYXVsdFNpdGVQYXJzZXIoKTsKKwkJc2l0ZVBhcnNlci5pbml0KG5ldyBFeHRlbmRlZFNpdGVVUkxGYWN0b3J5KCkpOworCisJCXRyeSB7CisJCQlTaXRlTW9kZWwgc2l0ZSA9IHNpdGVQYXJzZXIucGFyc2UobmV3IEZpbGVJbnB1dFN0cmVhbShzaXRlWE1MKSk7CisJCQlpZihzaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VNb2RlbHMoKS5sZW5ndGggPiAwKSB7CisJCQkJc2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlTW9kZWxzKClbMF0uZ2V0VVJMU3RyaW5nKCk7CisJCQkJRmVhdHVyZVJlZmVyZW5jZU1vZGVsW10gZmVhdHVyZVJlZmVyZW5jZU1vZGVsID0gc2l0ZQorCQkJCS5nZXRGZWF0dXJlUmVmZXJlbmNlTW9kZWxzKCk7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlUmVmZXJlbmNlTW9kZWwubGVuZ3RoOyBpKyspIHsKKwkJCQkJZmVhdHVyZXNVUkxzLmFkZChkaXJlY3RvcnlOYW1lCisJCQkJCQkJKyBmZWF0dXJlUmVmZXJlbmNlTW9kZWxbaV0uZ2V0VVJMU3RyaW5nKCkpOworCQkJCX0KKwkJCX0KKwkJCXJldHVybiBmZWF0dXJlc1VSTHM7CisJCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkZpbGUgbm90IGZvdW5kOiAiICsgZS5nZXRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkCisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQl9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgeworCQkJU3lzdGVtLm91dC5wcmludGxuKCJQYXJzaW5nIHByb2JsZW06ICIgKyBlLmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiUHJvYmxlbSB3aGlsZSBwYXJzaW5nOiAiICsgZS5nZXRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkCisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQbGF0Zm9ybVJ1bm5hYmxlI3J1bihqYXZhLmxhbmcuT2JqZWN0KQorCSAqLworCXB1YmxpYyBPYmplY3QgcnVuKE9iamVjdCBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUGxhdGZvcm0uZW5kU3BsYXNoKCk7CisJCWlmIChhcmdzID09IG51bGwpCisJCQlyZXR1cm4gRVhJVF9FUlJPUjsKKwkJaWYgKGFyZ3MgaW5zdGFuY2VvZiBTdHJpbmdbXSkgeworCQkJTWFwIHBhcmFtcyA9IHBhcnNlQ21kTGluZSgoU3RyaW5nW10pIGFyZ3MpOworCQkJaWYgKHBhcmFtcy5jb250YWluc0tleShKQVJfUFJPQ0VTU09SKSkgeworCQkJCWlmICghcnVuSmFyUHJvY2Vzc29yKHBhcmFtcykpCisJCQkJCXJldHVybiBFWElUX0VSUk9SOworCQkJfQorCisJCQlpZiAocGFyYW1zLmNvbnRhaW5zS2V5KERJR0VTVF9CVUlMREVSKSkgeworCQkJCWlmICghcnVuRGlnZXN0QnVpbGRlcihwYXJhbXMpKQorCQkJCQlyZXR1cm4gRVhJVF9FUlJPUjsKKwkJCX0KKwkJfQorCQlyZXR1cm4gSVBsYXRmb3JtUnVubmFibGUuRVhJVF9PSzsKKwl9CisKKwlwcml2YXRlIGNsYXNzIEF2YWlsYWJsZUxvY2FsZSB7CisKKwkJcHJpdmF0ZSBTdHJpbmcgUFJFRklYID0gInRlbXAiOyAvLyROT04tTkxTLTEkCisKKwkJcHJpdmF0ZSBTdHJpbmcgbG9jYWxlOworCisJCXByaXZhdGUgTWFwIC8qIFZlcnNpb25lZElkZW50aWZpZXIgKi9mZWF0dXJlcyA9IG5ldyBIYXNoTWFwKCk7CisKKwkJcHJpdmF0ZSBQcmludFdyaXRlciBsb2NhbGl6ZWRQcmludFdyaXRlcjsKKworCQlwcml2YXRlIEZpbGUgdGVtcERpZ2VzdERpcmVjdG9yeTsKKworCQlwdWJsaWMgdm9pZCBmaW5pc2hEaWdlc3QoU3RyaW5nIG91dHB1dERpcmVjdG9yeSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJCWxvY2FsaXplZFByaW50V3JpdGVyLnByaW50bG4oIjwvZGlnZXN0PiIpOyAvLyROT04tTkxTLTEkCisJCQlpZiAobG9jYWxpemVkUHJpbnRXcml0ZXIgIT0gbnVsbCkgeworCQkJCWxvY2FsaXplZFByaW50V3JpdGVyLmNsb3NlKCk7CisJCQl9CisKKwkJCUZpbGUgZGlnZXN0ID0gbmV3IEZpbGUob3V0cHV0RGlyZWN0b3J5ICsgRmlsZS5zZXBhcmF0b3IgKyAiZGlnZXN0IiAvLyROT04tTkxTLTEkCisJCQkJCSsgKGxvY2FsZSA9PSBudWxsIHx8IGxvY2FsZS5lcXVhbHMoIiIpID8gIiIgOiAiXyIrbG9jYWxlKSArICIuemlwIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKKwkJCVN5c3RlbS5vdXQucHJpbnRsbihkaWdlc3QuZ2V0QWJzb2x1dGVQYXRoKCkpOworCQkJU3lzdGVtLm91dC5wcmludGxuKGRpZ2VzdC5nZXROYW1lKCkpOworCQkJaWYgKGRpZ2VzdC5leGlzdHMoKSkgeworCQkJCWRpZ2VzdC5kZWxldGUoKTsKKwkJCX0KKwkJCWRpZ2VzdC5jcmVhdGVOZXdGaWxlKCk7CisJCQlPdXRwdXRTdHJlYW0gb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShkaWdlc3QpOworCQkJSmFyT3V0cHV0U3RyZWFtIGpvcyA9IG5ldyBKYXJPdXRwdXRTdHJlYW0ob3MpOworCQkJam9zLnB1dE5leHRFbnRyeShuZXcgWmlwRW50cnkoImRpZ2VzdC54bWwiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCUlucHV0U3RyZWFtIGlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbSh0ZW1wRGlnZXN0RGlyZWN0b3J5KTsKKwkJCWJ5dGVbXSBiID0gbmV3IGJ5dGVbNDA5Nl07CisJCQlpbnQgYnl0ZXNSZWFkID0gMDsKKwkJCWRvIHsKKwkJCQlieXRlc1JlYWQgPSBpcy5yZWFkKGIpOworCQkJCWlmIChieXRlc1JlYWQgPiAwKSB7CisJCQkJCWpvcy53cml0ZShiLCAwLCBieXRlc1JlYWQpOworCQkJCX0KKwkJCX0gd2hpbGUgKGJ5dGVzUmVhZCA+IDApOworCisJCQlqb3MuY2xvc2VFbnRyeSgpOworCQkJam9zLmNsb3NlKCk7CisJCQlvcy5jbG9zZSgpOworCQkJaXMuY2xvc2UoKTsKKwkJCXRlbXBEaWdlc3REaXJlY3RvcnkuZGVsZXRlKCk7CisKKwkJfQorCisJCXB1YmxpYyBBdmFpbGFibGVMb2NhbGUoU3RyaW5nIGxvY2FsZSkgeworCQkJdGhpcy5sb2NhbGUgPSBsb2NhbGU7CisJCX0KKworCQlwdWJsaWMgdm9pZCBhZGRGZWF0dXJlcyhTdHJpbmcgZmVhdHVyZSkgeworCQkJZmVhdHVyZXMucHV0KGZlYXR1cmUsIGZlYXR1cmUpOworCQl9CisKKwkJcHVibGljIHZvaWQgb3BlbkxvY2FsaXplZE91dHB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCQl0ZW1wRGlnZXN0RGlyZWN0b3J5ID0gRmlsZS5jcmVhdGVUZW1wRmlsZShQUkVGSVgsIG51bGwpOworCQkJRmlsZU91dHB1dFN0cmVhbSBmc3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odGVtcERpZ2VzdERpcmVjdG9yeSk7CisJCQlsb2NhbGl6ZWRQcmludFdyaXRlciA9IG5ldyBQcmludFdyaXRlcihuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKGZzdHJlYW0sICJVVEYtOCIpKTsgLy8kTk9OLU5MUy0xJAorCQkJbG9jYWxpemVkUHJpbnRXcml0ZXIKKwkJCS5wcmludGxuKCI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cbiA8ZGlnZXN0PiIpOyAvLyROT04tTkxTLTEkCisJCQl0ZW1wRGlnZXN0RGlyZWN0b3J5LmRlbGV0ZU9uRXhpdCgpOworCQl9CisKKwkJcHVibGljIGludCBoYXNoQ29kZSgpIHsKKwkJCXJldHVybiBsb2NhbGUuaGFzaENvZGUoKTsKKwkJfQorCisJCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisKKwkJCWlmICh0aGlzID09IG9iaikKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCWlmIChvYmogPT0gbnVsbCkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQlpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQlmaW5hbCBBdmFpbGFibGVMb2NhbGUgb3RoZXIgPSAoQXZhaWxhYmxlTG9jYWxlKSBvYmo7CisJCQlpZiAobG9jYWxlID09IG51bGwpIHsKKwkJCQlpZiAob3RoZXIubG9jYWxlICE9IG51bGwpCisJCQkJCXJldHVybiBmYWxzZTsKKwkJCX0gZWxzZSBpZiAoIWxvY2FsZS5lcXVhbHMob3RoZXIubG9jYWxlKSkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHdyaXRlRmVhdHVyZURpZ2VzdHMoRmVhdHVyZU1vZGVsIGZlYXR1cmVNb2RlbCwKKwkJCQlNYXAgZmVhdHVyZVByb3BlcnRpZXMpIHsKKworCQkJaWYgKHRoaXMubG9jYWxlLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCXdyaXRlRmVhdHVyZURpZ2VzdChsb2NhbGl6ZWRQcmludFdyaXRlciwgZmVhdHVyZU1vZGVsLAorCQkJCQkJKFByb3BlcnRpZXMpIGZlYXR1cmVQcm9wZXJ0aWVzLmdldCgiIikpOyAvLyROT04tTkxTLTEkCisJCQkJcmV0dXJuOworCQkJfQorCQkJUHJvcGVydGllcyB0ZW1wID0gbmV3IFByb3BlcnRpZXMoKTsKKwkJCWlmIChsb2NhbGUuaW5kZXhPZigiXyIpIDwgMCkgeyAvLyROT04tTkxTLTEkCisJCQkJdGVtcCA9IGNvbWJpbmVQcm9wZXJ0aWVzKAorCQkJCQkJKFByb3BlcnRpZXMpIGZlYXR1cmVQcm9wZXJ0aWVzLmdldCgiIiksIC8vJE5PTi1OTFMtMSQKKwkJCQkJCShQcm9wZXJ0aWVzKSBmZWF0dXJlUHJvcGVydGllcy5nZXQobG9jYWxlKSwgbnVsbCk7CisJCQkJd3JpdGVGZWF0dXJlRGlnZXN0KGxvY2FsaXplZFByaW50V3JpdGVyLCBmZWF0dXJlTW9kZWwsIHRlbXApOworCQkJfSBlbHNlIHsKKwkJCQl0ZW1wID0gY29tYmluZVByb3BlcnRpZXMoCisJCQkJCQkoUHJvcGVydGllcykgZmVhdHVyZVByb3BlcnRpZXMuZ2V0KCIiKSwgLy8kTk9OLU5MUy0xJAorCQkJCQkJKFByb3BlcnRpZXMpIGZlYXR1cmVQcm9wZXJ0aWVzLmdldChsb2NhbGUuc3Vic3RyaW5nKDAsIGxvY2FsZS5pbmRleE9mKCJfIikpKSwgLy8kTk9OLU5MUy0xJAorCQkJCQkJKFByb3BlcnRpZXMpIGZlYXR1cmVQcm9wZXJ0aWVzLmdldChsb2NhbGUpICk7CisJCQkJd3JpdGVGZWF0dXJlRGlnZXN0KGxvY2FsaXplZFByaW50V3JpdGVyLCBmZWF0dXJlTW9kZWwsIHRlbXApOworCQkJfQorCisJCX0KKwkJCisJCS8qKgorCQkgKiBAcGFyYW0gZGVmYXVsdHMJU2hvdWxkIGJlIGxhbmdfY291bnRyeQorCQkgKiBAcGFyYW0gc2Vjb25kYXJ5CVNob3VsZCBiZSBsYW5nCisJCSAqIEBwYXJhbSBwcmVmZXJyZWQJU2hvdWxkIGJlIGRlZmF1bHQKKwkJICogQHJldHVybgorCQkgKi8KKworCQlwcml2YXRlIFByb3BlcnRpZXMgY29tYmluZVByb3BlcnRpZXMoUHJvcGVydGllcyBkZWZhdWx0cywKKwkJCQlQcm9wZXJ0aWVzIHNlY29uZGFyeSwgUHJvcGVydGllcyBwcmVmZXJyZWQpIHsKKwkJCXJldHVybiBuZXcgQ29tYmluZWRQcm9wZXJ0aWVzKHByZWZlcnJlZCwgc2Vjb25kYXJ5LCBkZWZhdWx0cyk7CisKKwkJfQorCisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlRmVhdHVyZURpZ2VzdChQcmludFdyaXRlciBkaWdlc3QsCisJCQlGZWF0dXJlTW9kZWwgZmVhdHVyZU1vZGVsLCBQcm9wZXJ0aWVzIGZlYXR1cmVQcm9wZXJ0aWVzKSB7CisKKwkJU3RyaW5nIGxhYmVsID0gbnVsbDsKKwkJU3RyaW5nIHByb3ZpZGVyID0gbnVsbDsKKwkJU3RyaW5nIGRlc2NyaXB0aW9uID0gbnVsbDsKKwkJU3RyaW5nIGxpY2Vuc2UgPSBudWxsOworCQlTdHJpbmcgY29weXJpZ2h0ID0gbnVsbDsKKworCQlpZiAoKGZlYXR1cmVQcm9wZXJ0aWVzICE9IG51bGwpCisJCQkJJiYgZmVhdHVyZU1vZGVsLmdldExhYmVsKCkuc3RhcnRzV2l0aCgiJSIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCWxhYmVsID0gZmVhdHVyZVByb3BlcnRpZXMuZ2V0UHJvcGVydHkoZmVhdHVyZU1vZGVsLmdldExhYmVsKCkKKwkJCQkJLnN1YnN0cmluZygxKSk7CisJCX0gZWxzZSB7CisJCQlsYWJlbCA9IGZlYXR1cmVNb2RlbC5nZXRMYWJlbCgpOworCQl9CisJCWlmICgoZmVhdHVyZVByb3BlcnRpZXMgIT0gbnVsbCkKKwkJCQkmJiAoZmVhdHVyZU1vZGVsLmdldERlc2NyaXB0aW9uTW9kZWwoKSAhPSBudWxsKQorCQkJCSYmIChmZWF0dXJlTW9kZWwuZ2V0RGVzY3JpcHRpb25Nb2RlbCgpLmdldEFubm90YXRpb24oKSAhPSBudWxsKQorCQkJCSYmIGZlYXR1cmVNb2RlbC5nZXREZXNjcmlwdGlvbk1vZGVsKCkuZ2V0QW5ub3RhdGlvbigpCisJCQkJLnN0YXJ0c1dpdGgoIiUiKSkgeyAvLyROT04tTkxTLTEkCisJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oZmVhdHVyZVByb3BlcnRpZXMuZ2V0UHJvcGVydHkoZmVhdHVyZU1vZGVsLmdldERlc2NyaXB0aW9uTW9kZWwoKS5nZXRBbm5vdGF0aW9uKCkuc3Vic3RyaW5nKDEpKSk7CisJCQlkZXNjcmlwdGlvbiA9IGZlYXR1cmVQcm9wZXJ0aWVzLmdldFByb3BlcnR5KGZlYXR1cmVNb2RlbAorCQkJCQkuZ2V0RGVzY3JpcHRpb25Nb2RlbCgpLmdldEFubm90YXRpb24oKS5zdWJzdHJpbmcoMSkpOworCQl9IGVsc2UgeworCQkJVVJMRW50cnlNb2RlbCBkZXNjcmlwdGlvbk1vZGVsID0gZmVhdHVyZU1vZGVsLmdldERlc2NyaXB0aW9uTW9kZWwoKTsKKwkJCWlmKCBkZXNjcmlwdGlvbk1vZGVsID09IG51bGwgKQorCQkJCWRlc2NyaXB0aW9uID0gIiI7CisJCQllbHNlCisJCQkJZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbk1vZGVsLmdldEFubm90YXRpb24oKTsKKwkJfQorCQlTdHJpbmcgcHZhbHVlID0gZmVhdHVyZU1vZGVsLmdldFByb3ZpZGVyKCk7CisJCWlmICgoZmVhdHVyZVByb3BlcnRpZXMgIT0gbnVsbCkKKwkJCQkmJiBwdmFsdWUhPW51bGwgJiYgcHZhbHVlLnN0YXJ0c1dpdGgoIiUiKSkgeyAvLyROT04tTkxTLTEkCisJCQlwcm92aWRlciA9IGZlYXR1cmVQcm9wZXJ0aWVzLmdldFByb3BlcnR5KGZlYXR1cmVNb2RlbC5nZXRQcm92aWRlcigpCisJCQkJCS5zdWJzdHJpbmcoMSkpOworCQl9IGVsc2UgeworCQkJcHJvdmlkZXIgPSBwdmFsdWU7CisJCX0KKwkJaWYgKHByb3ZpZGVyPT1udWxsKSBwcm92aWRlciA9ICIiOworCisJCWlmICgoKGZlYXR1cmVQcm9wZXJ0aWVzICE9IG51bGwpICYmIGZlYXR1cmVNb2RlbC5nZXRDb3B5cmlnaHRNb2RlbCgpICE9IG51bGwpCisJCQkJJiYgZmVhdHVyZU1vZGVsLmdldENvcHlyaWdodE1vZGVsKCkuZ2V0QW5ub3RhdGlvbigpLnN0YXJ0c1dpdGgoCisJCQkJIiUiKSkgeyAvLyROT04tTkxTLTEkCisJCQljb3B5cmlnaHQgPSBmZWF0dXJlUHJvcGVydGllcy5nZXRQcm9wZXJ0eShmZWF0dXJlTW9kZWwKKwkJCQkJLmdldENvcHlyaWdodE1vZGVsKCkuZ2V0QW5ub3RhdGlvbigpLnN1YnN0cmluZygxKSk7CisJCX0gZWxzZSB7CisJCQlpZiAoZmVhdHVyZU1vZGVsLmdldENvcHlyaWdodE1vZGVsKCkgIT0gbnVsbCkgeworCQkJCWNvcHlyaWdodCA9IGZlYXR1cmVNb2RlbC5nZXRDb3B5cmlnaHRNb2RlbCgpLmdldEFubm90YXRpb24oKTsKKwkJCX0gZWxzZSB7CisJCQkJY29weXJpZ2h0ID0gbnVsbDsKKwkJCX0KKwkJfQorCisJCWlmICgoZmVhdHVyZVByb3BlcnRpZXMgIT0gbnVsbCkKKwkJCQkmJiAoZmVhdHVyZU1vZGVsLmdldExpY2Vuc2VNb2RlbCgpICE9IG51bGwpCisJCQkJJiYgZmVhdHVyZU1vZGVsLmdldExpY2Vuc2VNb2RlbCgpLmdldEFubm90YXRpb24oKS5zdGFydHNXaXRoKAorCQkJCSIlIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJbGljZW5zZSA9IGZlYXR1cmVQcm9wZXJ0aWVzLmdldFByb3BlcnR5KGZlYXR1cmVNb2RlbAorCQkJCQkuZ2V0TGljZW5zZU1vZGVsKCkuZ2V0QW5ub3RhdGlvbigpLnN1YnN0cmluZygxKSk7CisJCX0gZWxzZSB7CisJCQlsaWNlbnNlID0gZmVhdHVyZU1vZGVsLmdldExpY2Vuc2VNb2RlbCgpLmdldEFubm90YXRpb24oKTsKKwkJfQorCisJCWRpZ2VzdC5wcmludCgiPGZlYXR1cmUgIik7IC8vJE5PTi1OTFMtMSQKKwkJZGlnZXN0LnByaW50KCJsYWJlbD1cIiIgKyBnZXRVVEY4U3RyaW5nKGxhYmVsKSArICJcIiAiKTsgIC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCisJCWRpZ2VzdC5wcmludCgicHJvdmlkZXItbmFtZT1cIiIgKyBnZXRVVEY4U3RyaW5nKHByb3ZpZGVyKSArICJcIiAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCWRpZ2VzdC5wcmludCgiaWQ9XCIiICsgZmVhdHVyZU1vZGVsLmdldEZlYXR1cmVJZGVudGlmaWVyKCkgKyAiXCIgIik7ICAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAorCQlkaWdlc3QucHJpbnQoInZlcnNpb249XCIiICsgZmVhdHVyZU1vZGVsLmdldEZlYXR1cmVWZXJzaW9uKCkgKyAiXCIgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQlpZiAoZmVhdHVyZU1vZGVsLmdldE9TKCkgIT0gbnVsbCkKKwkJCWRpZ2VzdC5wcmludCgib3M9XCIiICsgZmVhdHVyZU1vZGVsLmdldE9TKCkgKyAiXCIgIik7ICAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAorCQlpZiAoZmVhdHVyZU1vZGVsLmdldE5MKCkgIT0gbnVsbCkKKwkJCWRpZ2VzdC5wcmludCgibmw9XCIiICsgZmVhdHVyZU1vZGVsLmdldE5MKCkgKyAiXCIgIik7ICAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAorCQlpZiAoZmVhdHVyZU1vZGVsLmdldFdTKCkgIT0gbnVsbCkKKwkJCWRpZ2VzdC5wcmludCgid3M9XCIiICsgZmVhdHVyZU1vZGVsLmdldFdTKCkgKyAiXCIgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQlpZiAoZmVhdHVyZU1vZGVsLmdldE9TQXJjaCgpICE9IG51bGwpCisJCQlkaWdlc3QucHJpbnQoImFyY2g9XCIiICsgZmVhdHVyZU1vZGVsLmdldE9TQXJjaCgpICsgIlwiICIpOyAgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKKwkJaWYgKGZlYXR1cmVNb2RlbC5pc0V4Y2x1c2l2ZSgpKQorCQkJZGlnZXN0LnByaW50KCJleGNsdXNpdmU9XCIiICsgZmVhdHVyZU1vZGVsLmlzRXhjbHVzaXZlKCkgKyAiXCIgIik7ICAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAorCisJCWlmICgoKGZlYXR1cmVNb2RlbC5nZXRJbXBvcnRNb2RlbHMoKSA9PSBudWxsKSB8fCAoZmVhdHVyZU1vZGVsCisJCQkJLmdldEltcG9ydE1vZGVscygpLmxlbmd0aCA9PSAwKSkKKwkJCQkmJiAoKGZlYXR1cmVNb2RlbC5nZXREZXNjcmlwdGlvbk1vZGVsKCkgPT0gbnVsbCkKKwkJCQkJCXx8IChmZWF0dXJlTW9kZWwuZ2V0RGVzY3JpcHRpb25Nb2RlbCgpLmdldEFubm90YXRpb24oKSA9PSBudWxsKSB8fCAoZmVhdHVyZU1vZGVsCisJCQkJCQkJCS5nZXREZXNjcmlwdGlvbk1vZGVsKCkuZ2V0QW5ub3RhdGlvbigpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSkKKwkJCQkJCQkJJiYgKChmZWF0dXJlTW9kZWwuZ2V0Q29weXJpZ2h0TW9kZWwoKSA9PSBudWxsKQorCQkJCQkJCQkJCXx8IChmZWF0dXJlTW9kZWwuZ2V0Q29weXJpZ2h0TW9kZWwoKS5nZXRBbm5vdGF0aW9uKCkgPT0gbnVsbCkgfHwgKGZlYXR1cmVNb2RlbAorCQkJCQkJCQkJCQkJLmdldENvcHlyaWdodE1vZGVsKCkuZ2V0QW5ub3RhdGlvbigpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSkKKwkJCQkJCQkJCQkJCSYmICgoZmVhdHVyZU1vZGVsLmdldExpY2Vuc2VNb2RlbCgpID09IG51bGwpCisJCQkJCQkJCQkJCQkJCXx8IChmZWF0dXJlTW9kZWwuZ2V0TGljZW5zZU1vZGVsKCkuZ2V0QW5ub3RhdGlvbigpID09IG51bGwpIHx8IChmZWF0dXJlTW9kZWwKKwkJCQkJCQkJCQkJCQkJCQkuZ2V0TGljZW5zZU1vZGVsKCkuZ2V0QW5ub3RhdGlvbigpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSkgCisJCQkJCQkJCQkJCQkJCQkJJiYgKChmZWF0dXJlTW9kZWwuZ2V0RmVhdHVyZUluY2x1ZGVkKCkgPT0gbnVsbCkgfHwgKGZlYXR1cmVNb2RlbAorCQkJCQkJCQkJCQkJCQkJCQkJLmdldEZlYXR1cmVJbmNsdWRlZCgpLmxlbmd0aCA9PSAwKSkpeworCQkJZGlnZXN0LnByaW50bG4oIi8+ICIpOyAvLyROT04tTkxTLTEkCisJCX0gZWxzZSB7CisJCQlkaWdlc3QucHJpbnRsbigiPiAiKTsgLy8kTk9OLU5MUy0xJAorCQkJaWYgKGZlYXR1cmVNb2RlbC5nZXRJbXBvcnRNb2RlbHMoKS5sZW5ndGggPiAwKSB7CisKKwkJCQlkaWdlc3QucHJpbnRsbigiXHQ8cmVxdWlyZXM+ICIpOyAvLyROT04tTkxTLTEkCisJCQkJSW1wb3J0TW9kZWxbXSBpbXBvcnRzID0gZmVhdHVyZU1vZGVsLmdldEltcG9ydE1vZGVscygpOworCQkJCWZvciAoaW50IGogPSAwOyBqIDwgaW1wb3J0cy5sZW5ndGg7IGorKykgeworCQkJCQlkaWdlc3QucHJpbnQoIlx0XHQ8aW1wb3J0ICIpOyAvLyROT04tTkxTLTEkCisJCQkJCWlmIChpbXBvcnRzW2pdLmlzRmVhdHVyZUltcG9ydCgpKSB7CisJCQkJCQlkaWdlc3QucHJpbnQoImZlYXR1cmU9XCIiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQl9IGVsc2UgeworCQkJCQkJZGlnZXN0LnByaW50KCJwbHVnaW49XCIiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQl9CisJCQkJCWRpZ2VzdC5wcmludChpbXBvcnRzW2pdLmdldElkZW50aWZpZXIoKSArICJcIiAiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlkaWdlc3QucHJpbnQoInZlcnNpb249XCIiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlkaWdlc3QucHJpbnQoaW1wb3J0c1tqXS5nZXRWZXJzaW9uKCkgKyAiXCIgIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJZGlnZXN0LnByaW50KCJtYXRjaD1cIiIpOyAvLyROT04tTkxTLTEkCisJCQkJCWRpZ2VzdC5wcmludChpbXBvcnRzW2pdLmdldE1hdGNoaW5nUnVsZU5hbWUoKSArICJcIiAiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlpZiAoaW1wb3J0c1tqXS5pc1BhdGNoKCkpIHsKKwkJCQkJCWRpZ2VzdC5wcmludCgicGF0Y2g9XCJ0cnVlXCIgIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJfQorCQkJCQlkaWdlc3QucHJpbnRsbigiIC8+Iik7IC8vJE5PTi1OTFMtMSQKKwkJCQl9CisKKwkJCQlkaWdlc3QucHJpbnRsbigiXHQ8L3JlcXVpcmVzPiIpOyAvLyROT04tTkxTLTEkCisKKwkJCX0KKworCQkJaWYgKChmZWF0dXJlTW9kZWwuZ2V0RGVzY3JpcHRpb25Nb2RlbCgpICE9IG51bGwpCisJCQkJCSYmIChmZWF0dXJlTW9kZWwuZ2V0RGVzY3JpcHRpb25Nb2RlbCgpLmdldEFubm90YXRpb24oKSAhPSBudWxsKQorCQkJCQkmJiAoZmVhdHVyZU1vZGVsLmdldERlc2NyaXB0aW9uTW9kZWwoKS5nZXRBbm5vdGF0aW9uKCkKKwkJCQkJCQkudHJpbSgpLmxlbmd0aCgpICE9IDApKSB7CisJCQkJZGlnZXN0LnByaW50bG4oIlx0PGRlc2NyaXB0aW9uPiIpOyAvLyROT04tTkxTLTEkCisJCQkJZGlnZXN0LnByaW50bG4oIlx0XHQiICsgVXBkYXRlTWFuYWdlclV0aWxzLmdldFdyaXRhYmxlWE1MU3RyaW5nKGRlc2NyaXB0aW9uKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQlkaWdlc3QucHJpbnRsbigiXHQ8L2Rlc2NyaXB0aW9uPiIpOyAvLyROT04tTkxTLTEkCisJCQl9CisKKwkJCWlmIChmZWF0dXJlTW9kZWwuZ2V0Q29weXJpZ2h0TW9kZWwoKSAhPSBudWxsKSB7CisJCQkJaWYgKGZlYXR1cmVNb2RlbC5nZXRDb3B5cmlnaHRNb2RlbCgpLmdldEFubm90YXRpb24oKSAhPSBudWxsKSB7CisJCQkJCS8vIGlmCisJCQkJCS8vIChmZWF0dXJlTW9kZWwuZ2V0RGVzY3JpcHRpb25Nb2RlbCgpLmdldEFubm90YXRpb24oKS5sZW5ndGgoKQorCQkJCQkvLyAhPSAwKSB7CisJCQkJCWRpZ2VzdC5wcmludGxuKCJcdDxjb3B5cmlnaHQ+Iik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJZGlnZXN0LnByaW50bG4oIlx0XHQiICsgVXBkYXRlTWFuYWdlclV0aWxzLmdldFdyaXRhYmxlWE1MU3RyaW5nKGNvcHlyaWdodCkpOyAvLyROT04tTkxTLTEkCisJCQkJCWRpZ2VzdC5wcmludGxuKCJcdDwvY29weXJpZ2h0PiIpOyAvLyROT04tTkxTLTEkCisJCQkJCS8vIH0KKwkJCQl9CisJCQl9CisKKwkJCWlmICgoZmVhdHVyZU1vZGVsLmdldExpY2Vuc2VNb2RlbCgpICE9IG51bGwpCisJCQkJCSYmIChmZWF0dXJlTW9kZWwuZ2V0TGljZW5zZU1vZGVsKCkuZ2V0QW5ub3RhdGlvbigpICE9IG51bGwpCisJCQkJCSYmIChmZWF0dXJlTW9kZWwuZ2V0TGljZW5zZU1vZGVsKCkuZ2V0QW5ub3RhdGlvbigpCisJCQkJCQkJLnRyaW0oKS5sZW5ndGgoKSAhPSAwKSkgeworCQkJCWRpZ2VzdC5wcmludGxuKCJcdDxsaWNlbnNlPiIpOyAvLyROT04tTkxTLTEkCisJCQkJZGlnZXN0LnByaW50bG4oIlx0XHQiICsgVXBkYXRlTWFuYWdlclV0aWxzLmdldFdyaXRhYmxlWE1MU3RyaW5nKGxpY2Vuc2UpKTsgLy8kTk9OLU5MUy0xJAorCQkJCWRpZ2VzdC5wcmludGxuKCJcdDwvbGljZW5zZT4iKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCisJCQlQbHVnaW5FbnRyeU1vZGVsW10gcGx1Z2lucyA9IGZlYXR1cmVNb2RlbC5nZXRQbHVnaW5FbnRyeU1vZGVscygpOworCQkJaWYgKChwbHVnaW5zICE9IG51bGwpICYmIChwbHVnaW5zLmxlbmd0aCAhPSAwKSkgeworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGx1Z2lucy5sZW5ndGg7IGkrKykgeworCQkJCQlkaWdlc3QucHJpbnQoIlx0PHBsdWdpbiAiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlkaWdlc3QucHJpbnQoImlkPVwiIiArIHBsdWdpbnNbaV0uZ2V0UGx1Z2luSWRlbnRpZmllcigpIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkrICJcIiAiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlkaWdlc3QucHJpbnQoInZlcnNpb249XCIiICsgcGx1Z2luc1tpXS5nZXRQbHVnaW5WZXJzaW9uKCkgLy8kTk9OLU5MUy0xJAorCQkJCQkJCSsgIlwiICIpOyAvLyROT04tTkxTLTEkCisJCQkJCWlmIChwbHVnaW5zW2ldLmdldE9TKCkgIT0gbnVsbCkKKwkJCQkJCWRpZ2VzdC5wcmludCgib3M9XCIiICsgcGx1Z2luc1tpXS5nZXRPUygpICsgIlwiICIpOyAgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKKwkJCQkJaWYgKHBsdWdpbnNbaV0uZ2V0TkwoKSAhPSBudWxsKQorCQkJCQkJZGlnZXN0LnByaW50KCJubD1cIiIgKyBwbHVnaW5zW2ldLmdldE5MKCkgKyAiXCIgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCQlpZiAocGx1Z2luc1tpXS5nZXRXUygpICE9IG51bGwpCisJCQkJCQlkaWdlc3QucHJpbnQoIndzPVwiIiArIHBsdWdpbnNbaV0uZ2V0V1MoKSArICJcIiAiKTsgIC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCisJCQkJCWlmIChwbHVnaW5zW2ldLmdldE9TQXJjaCgpICE9IG51bGwpCisJCQkJCQlkaWdlc3QKKwkJCQkJCS5wcmludCgiYXJjaD1cIiIgKyBwbHVnaW5zW2ldLmdldE9TQXJjaCgpIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJKyAiXCIgIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJaWYgKHBsdWdpbnNbaV0uZ2V0RG93bmxvYWRTaXplKCkgPiAwKQorCQkJCQkJZGlnZXN0LnByaW50KCJkb3dubG9hZC1zaXplPVwiIiAvLyROT04tTkxTLTEkCisJCQkJCQkJCSsgcGx1Z2luc1tpXS5nZXREb3dubG9hZFNpemUoKSArICJcIiAiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlpZiAocGx1Z2luc1tpXS5nZXRJbnN0YWxsU2l6ZSgpID4gMCkKKwkJCQkJCWRpZ2VzdC5wcmludCgiaW5zdGFsbC1zaXplPVwiIiAvLyROT04tTkxTLTEkCisJCQkJCQkJCSsgcGx1Z2luc1tpXS5nZXRJbnN0YWxsU2l6ZSgpICsgIlwiICIpOyAvLyROT04tTkxTLTEkCisJCQkJCWlmICghcGx1Z2luc1tpXS5pc1VucGFjaygpKQorCQkJCQkJZGlnZXN0LnByaW50KCJ1bnBhY2s9XCIiICsgcGx1Z2luc1tpXS5pc1VucGFjaygpIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJKyAiXCIgIik7IC8vJE5PTi1OTFMtMSQKKworCQkJCQlkaWdlc3QucHJpbnRsbigiLz4gIik7IC8vJE5PTi1OTFMtMSQKKwkJCQl9CisJCQl9CQorCisJCQlJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlW10gaW5jbHVkZWRGZWF0dXJlcyA9IGZlYXR1cmVNb2RlbC5nZXRGZWF0dXJlSW5jbHVkZWQoKTsKKworCQkJaWYgKChpbmNsdWRlZEZlYXR1cmVzICE9IG51bGwpICYmIChpbmNsdWRlZEZlYXR1cmVzLmxlbmd0aCAhPSAwKSkgeworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5jbHVkZWRGZWF0dXJlcy5sZW5ndGg7IGkrKykgeworCQkJCQl0cnkgeworCQkJCQkJZGlnZXN0LnByaW50KCJcdDxpbmNsdWRlcyAiKTsgLy8kTk9OLU5MUy0xJAorCisJCQkJCQlkaWdlc3QucHJpbnQoImlkPVwiIiArIGluY2x1ZGVkRmVhdHVyZXNbaV0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldElkZW50aWZpZXIoKSArICJcIiAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJCQlkaWdlc3QucHJpbnQoInZlcnNpb249XCIiICsgaW5jbHVkZWRGZWF0dXJlc1tpXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0VmVyc2lvbigpICsgIlwiICIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkJCWlmIChpbmNsdWRlZEZlYXR1cmVzW2ldLmdldE9TKCkgIT0gbnVsbCkKKwkJCQkJCQlkaWdlc3QucHJpbnQoIm9zPVwiIiArIGluY2x1ZGVkRmVhdHVyZXNbaV0uZ2V0T1MoKSArICJcIiAiKTsgIC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCisJCQkJCQlpZiAoaW5jbHVkZWRGZWF0dXJlc1tpXS5nZXROTCgpICE9IG51bGwpCisJCQkJCQkJZGlnZXN0LnByaW50KCJubD1cIiIgKyBpbmNsdWRlZEZlYXR1cmVzW2ldLmdldE5MKCkgKyAiXCIgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCQkJaWYgKGluY2x1ZGVkRmVhdHVyZXNbaV0uZ2V0V1MoKSAhPSBudWxsKQorCQkJCQkJCWRpZ2VzdC5wcmludCgid3M9XCIiICsgaW5jbHVkZWRGZWF0dXJlc1tpXS5nZXRXUygpICsgIlwiICIpOyAgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKKwkJCQkJCWlmIChpbmNsdWRlZEZlYXR1cmVzW2ldLmdldE9TQXJjaCgpICE9IG51bGwpCisJCQkJCQkJZGlnZXN0LnByaW50KCJhcmNoPVwiIiArIGluY2x1ZGVkRmVhdHVyZXNbaV0uZ2V0T1NBcmNoKCkgKyAiXCIgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAkJCQkJCQkJCQkJCisJCQkJCQlpZiAoIChpbmNsdWRlZEZlYXR1cmVzW2ldIGluc3RhbmNlb2YgSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlKSAmJiAoKChJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UpaW5jbHVkZWRGZWF0dXJlc1tpXSkuZ2V0TGFiZWwoKSAhPSBudWxsKSkKKwkJCQkJCQlkaWdlc3QucHJpbnQoIm5hbWU9XCIiICsgaW5jbHVkZWRGZWF0dXJlc1tpXS5nZXROYW1lKCkgKyAiXCIgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAkJCQkJCQkJCQorCQkJCQkJaWYgKGluY2x1ZGVkRmVhdHVyZXNbaV0uaXNPcHRpb25hbCgpKQorCQkJCQkJCWRpZ2VzdC5wcmludCgib3B0aW9uYWw9XCJ0cnVlXCIgIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCWRpZ2VzdC5wcmludCgic2VhcmNoLWxvY2F0aW9uPVwiIiArIGluY2x1ZGVkRmVhdHVyZXNbaV0uZ2V0U2VhcmNoTG9jYXRpb24oKSArICJcIiAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisKKwkJCQkJCWRpZ2VzdC5wcmludGxuKCIvPiAiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKKwkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlkaWdlc3QucHJpbnRsbigiPC9mZWF0dXJlPiIpOyAvLyROT04tTkxTLTEkCisJCX0KKwl9CisKKwlwcml2YXRlIGNsYXNzIENvbWJpbmVkUHJvcGVydGllcyBleHRlbmRzIFByb3BlcnRpZXMgeworCisJCXByaXZhdGUgUHJvcGVydGllcyBwcm9wZXJ0aWVzMTsKKworCQlwcml2YXRlIFByb3BlcnRpZXMgcHJvcGVydGllczI7CisKKwkJcHJpdmF0ZSBQcm9wZXJ0aWVzIHByb3BlcnRpZXMzOworCisJCS8qKgorCQkgKiBAcGFyYW0gcHJlZmVycmVkIHByZWZlcnJlZCwgc3VjaCBhcyBsYW5nX2NvdW50cnkKKwkJICogQHBhcmFtIHNlY29uZGFyeSBzZWNvbmRhcnksIHN1Y2ggYXMgbGFuZworCQkgKiBAcGFyYW0gZGVmYXVsdHMgZGVmYXVsdCwKKwkJICovCisJCXB1YmxpYyBDb21iaW5lZFByb3BlcnRpZXMoUHJvcGVydGllcyBwcmVmZXJyZWQsCisJCQkJUHJvcGVydGllcyBzZWNvbmRhcnksIFByb3BlcnRpZXMgZGVmYXVsdHMpIHsKKwkJCXRoaXMucHJvcGVydGllczEgPSBwcmVmZXJyZWQ7CisJCQl0aGlzLnByb3BlcnRpZXMyID0gc2Vjb25kYXJ5OworCQkJdGhpcy5wcm9wZXJ0aWVzMyA9IGRlZmF1bHRzOworCQl9CisKKwkJLyoqCisJCSAqIAorCQkgKi8KKwkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKwkJcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eShTdHJpbmcga2V5KSB7CisJCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKKwkJCWlmIChwcm9wZXJ0aWVzMyAhPSBudWxsICYmIHByb3BlcnRpZXMzLmNvbnRhaW5zS2V5KGtleSkpCisJCQkJcmVzdWx0ID0gcHJvcGVydGllczMuZ2V0UHJvcGVydHkoa2V5KTsKKwkJCWlmIChwcm9wZXJ0aWVzMiAhPSBudWxsICYmIHByb3BlcnRpZXMyLmNvbnRhaW5zS2V5KGtleSkpCisJCQkJcmVzdWx0ID0gcHJvcGVydGllczIuZ2V0UHJvcGVydHkoa2V5KTsKKwkJCWlmIChwcm9wZXJ0aWVzMSAhPSBudWxsICYmIHByb3BlcnRpZXMxLmNvbnRhaW5zS2V5KGtleSkpCisJCQkJcmVzdWx0ID0gcHJvcGVydGllczEuZ2V0UHJvcGVydHkoa2V5KTsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0KKworCX0KKwkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRVVEY4U3RyaW5nKFN0cmluZyBzKSB7CisJCWlmKHMgPT0gbnVsbCkKKwkJCXJldHVybiAiIjsKKwkJcmV0dXJuIFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRXcml0YWJsZVhNTFN0cmluZyhzKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NlYXJjaC9CYXNlU2VhcmNoQ2F0ZWdvcnkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NlYXJjaC9CYXNlU2VhcmNoQ2F0ZWdvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWUxNTAxCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2VhcmNoL0Jhc2VTZWFyY2hDYXRlZ29yeS5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuc2VhcmNoOworCitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnNlYXJjaC4qOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZVNlYXJjaENhdGVnb3J5IGltcGxlbWVudHMgSVVwZGF0ZVNlYXJjaENhdGVnb3J5IHsKKwlwcml2YXRlIFN0cmluZyBpZDsKKwkKKwlwcm90ZWN0ZWQgQmFzZVNlYXJjaENhdGVnb3J5KFN0cmluZyBpZCkgeworCQlzZXRJZChpZCk7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7CisJCXJldHVybiBpZDsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIGlkKSB7CisJCWlmICh0aGlzLmlkPT1udWxsKQorCQkJdGhpcy5pZCA9IGlkOworCX0KK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NlYXJjaC9PcHRpb25hbEZlYXR1cmVTZWFyY2hDYXRlZ29yeS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2VhcmNoL09wdGlvbmFsRmVhdHVyZVNlYXJjaENhdGVnb3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE0NjNkMAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NlYXJjaC9PcHRpb25hbEZlYXR1cmVTZWFyY2hDYXRlZ29yeS5qYXZhCkBAIC0wLDAgKzEsOTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuc2VhcmNoOworCitpbXBvcnQgamF2YS5uZXQuKjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuc2VhcmNoLio7CisKKy8qKgorICogU2VhcmNoZXMgZm9yIG9wdGlvbmFsIGZlYXR1cmVzCisgKi8KK3B1YmxpYyBjbGFzcyBPcHRpb25hbEZlYXR1cmVTZWFyY2hDYXRlZ29yeSBleHRlbmRzIEJhc2VTZWFyY2hDYXRlZ29yeSB7CisJcHJpdmF0ZSBJVXBkYXRlU2VhcmNoUXVlcnlbXSBxdWVyaWVzOworCXByaXZhdGUgQXJyYXlMaXN0IHZpZHM7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENBVEVHT1JZX0lEID0KKwkJIm9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnVuaWZpZWQtc2VhcmNoIjsgLy8kTk9OLU5MUy0xJAorCisJcHJpdmF0ZSBjbGFzcyBPcHRpb25hbFF1ZXJ5IGltcGxlbWVudHMgSVVwZGF0ZVNlYXJjaFF1ZXJ5IHsKKwkJcHVibGljIHZvaWQgcnVuKAorCQkJSVNpdGUgc2l0ZSwKKwkJCVN0cmluZ1tdIGNhdGVnb3JpZXNUb1NraXAsCisJCQlJVXBkYXRlU2VhcmNoRmlsdGVyIGZpbHRlciwKKwkJCUlVcGRhdGVTZWFyY2hSZXN1bHRDb2xsZWN0b3IgY29sbGVjdG9yLAorCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisKKwkJCW1vbml0b3IuYmVnaW5UYXNrKCIiLCB2aWRzLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgdmlkcy5zaXplKCk7IGkrKykgeworCQkJCVZlcnNpb25lZElkZW50aWZpZXIgdmlkID0gKFZlcnNpb25lZElkZW50aWZpZXIpIHZpZHMuZ2V0KGkpOworCQkJCW1vbml0b3Iuc3ViVGFzayh2aWQudG9TdHJpbmcoKSk7CisJCQkJSUZlYXR1cmUgZmVhdHVyZSA9CisJCQkJCWNyZWF0ZUZlYXR1cmUoCisJCQkJCQlzaXRlLAorCQkJCQkJdmlkLAorCQkJCQkJbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxKSk7CisJCQkJaWYgKGZlYXR1cmUhPW51bGwgJiYgZmlsdGVyLmFjY2VwdChmZWF0dXJlKSkKKwkJCQkJY29sbGVjdG9yLmFjY2VwdChmZWF0dXJlKTsKKwkJCX0KKwkJfQorCisJCXByaXZhdGUgSUZlYXR1cmUgY3JlYXRlRmVhdHVyZSgKKwkJCUlTaXRlIHNpdGUsCisJCQlWZXJzaW9uZWRJZGVudGlmaWVyIHZpZCwKKwkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgeworCQkJdHJ5IHsKKwkJCQlVUkwgc2l0ZVVSTCA9IHNpdGUuZ2V0VVJMKCk7CisJCQkJLy9UT0RPIFRoaXMgYXNzdW1wdGlvbiBzdGFuZHMgb25seSBpbiB0aGUgZGVmYXVsdCBjYXNlCisJCQkJLy8gSW4gZ2VuZXJhbCwgZmVhdHVyZSBhcmNoaXZlIFVSTCBtYXkgYmUgbWFwcGVkIG9uIHNpdGUuCisJCQkJLy8gQWxzbywgZmVhdHVyZSB0eXBlIG1heSBiZSBzb21ldGhpbmcgZWxzZSAobm90IHBhY2thZ2VkKS4KKwkJCQkvLyBXZSBtYXkgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIChub3Qgb25seSBpZCBhbmQgdmVyc2lvbikKKwkJCQkvLyBpbiBvcmRlciB0byBjcmVhdGUgYSBmZWF0dXJlIG9uIGEgc2l0ZS4KKwkJCQlTdHJpbmcgcmVsYXRpdmUgPSB2aWQudG9TdHJpbmcoKTsKKwkJCQlVUkwgZmVhdHVyZVVSTCA9IG5ldyBVUkwoc2l0ZVVSTCwgImZlYXR1cmVzLyIgKyByZWxhdGl2ZSsiLmphciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQlyZXR1cm4gc2l0ZS5jcmVhdGVGZWF0dXJlKAorCQkJCQkib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUucGFja2FnZWQiLCAvLyROT04tTkxTLTEkCisJCQkJCWZlYXR1cmVVUkwsCisJCQkJCW1vbml0b3IpOworCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJfQorCisJCS8qIChub24tSmF2YWRvYykKKwkJICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuc2VhcmNoLklTZWFyY2hRdWVyeSNnZXRTZWFyY2hTaXRlKCkKKwkJICovCisJCXB1YmxpYyBJUXVlcnlVcGRhdGVTaXRlQWRhcHRlciBnZXRRdWVyeVNlYXJjaFNpdGUoKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCX0KKworCXB1YmxpYyB2b2lkIGFkZFZlcnNpb25lZElkZW50aWZpZXIoVmVyc2lvbmVkSWRlbnRpZmllciB2aWQpIHsKKwkJdmlkcy5hZGQodmlkKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBjbGVhcigpIHsKKwkJdmlkcy5jbGVhcigpOworCX0KKworCXB1YmxpYyBPcHRpb25hbEZlYXR1cmVTZWFyY2hDYXRlZ29yeSgpIHsKKwkJc3VwZXIoQ0FURUdPUllfSUQpOworCQl2aWRzID0gbmV3IEFycmF5TGlzdCgpOworCQlxdWVyaWVzID0gbmV3IElVcGRhdGVTZWFyY2hRdWVyeVtdIHsgbmV3IE9wdGlvbmFsUXVlcnkoKX07CisJfQorCisJcHVibGljIElVcGRhdGVTZWFyY2hRdWVyeVtdIGdldFF1ZXJpZXMoKSB7CisJCXJldHVybiBxdWVyaWVzOworCX0KK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NlYXJjaC9RdWVyeVVwZGF0ZVNpdGVBZGFwdGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zZWFyY2gvUXVlcnlVcGRhdGVTaXRlQWRhcHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzMGQzOTEKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zZWFyY2gvUXVlcnlVcGRhdGVTaXRlQWRhcHRlci5qYXZhCkBAIC0wLDAgKzEsMjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuc2VhcmNoOworCitpbXBvcnQgamF2YS5uZXQuKjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5zZWFyY2guKjsKKworcHVibGljIGNsYXNzIFF1ZXJ5VXBkYXRlU2l0ZUFkYXB0ZXIgZXh0ZW5kcyBVcGRhdGVTaXRlQWRhcHRlciBpbXBsZW1lbnRzIElRdWVyeVVwZGF0ZVNpdGVBZGFwdGVyIHsKKwlwcml2YXRlIFN0cmluZyBtYXBwaW5nSWQ7CisKKwlwdWJsaWMgUXVlcnlVcGRhdGVTaXRlQWRhcHRlcihTdHJpbmcgbGFiZWwsIFVSTCB1cmwsIFN0cmluZyBtYXBwaW5nSWQpIHsKKwkJc3VwZXIobGFiZWwsIHVybCk7CisJCXRoaXMubWFwcGluZ0lkID0gbWFwcGluZ0lkOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdJZCgpIHsKKwkJcmV0dXJuIG1hcHBpbmdJZDsKKwl9Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zZWFyY2gvU2l0ZVNlYXJjaENhdGVnb3J5LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zZWFyY2gvU2l0ZVNlYXJjaENhdGVnb3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhiZDdhZgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NlYXJjaC9TaXRlU2VhcmNoQ2F0ZWdvcnkuamF2YQpAQCAtMCwwICsxLDI0OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqICAgICBKYW1lcyBEIE1pbGVzIChJQk0gQ29ycC4pIC0gYnVnIDE4MTM3NSwgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGluIFNpdGVTZWFyY2hDYXRlZ29yeSRRdWVyeQorICogICAgIEphbWVzIEQgTWlsZXMgKElCTSBDb3JwLikgLSBidWcgMTkxNzgzLCBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpbiBGZWF0dXJlRG93bmxvYWRlcgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5zZWFyY2g7CisKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUNhdGVnb3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklTaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklTaXRlRmVhdHVyZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5FeHRlbmRlZFNpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuTGl0ZUZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuVXBkYXRlQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuc2VhcmNoLklRdWVyeVVwZGF0ZVNpdGVBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5zZWFyY2guSVVwZGF0ZVNlYXJjaEZpbHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuc2VhcmNoLklVcGRhdGVTZWFyY2hRdWVyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuc2VhcmNoLklVcGRhdGVTZWFyY2hSZXN1bHRDb2xsZWN0b3I7CisKKy8qKgorICogU2VhcmNoZXMgYW4gdXBkYXRlIHNpdGUKKyAqLworcHVibGljIGNsYXNzIFNpdGVTZWFyY2hDYXRlZ29yeSBleHRlbmRzIEJhc2VTZWFyY2hDYXRlZ29yeSB7CisJcHJpdmF0ZSBJVXBkYXRlU2VhcmNoUXVlcnlbXSBxdWVyaWVzOworCXByaXZhdGUgYm9vbGVhbiBsaXRlRmVhdHVyZXNBcmVPSzsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FURUdPUllfSUQgPQorCQkib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudW5pZmllZC1zZWFyY2giOyAvLyROT04tTkxTLTEkCisKKwlwcml2YXRlIHN0YXRpYyBjbGFzcyBRdWVyeSBpbXBsZW1lbnRzIElVcGRhdGVTZWFyY2hRdWVyeSB7CisJCQorCQlwcml2YXRlIGJvb2xlYW4gbGl0ZUZlYXR1cmVzQXJlT0s7CisJCQorCQkKKwkJcHVibGljIFF1ZXJ5KCkgeworCQkJbGl0ZUZlYXR1cmVzQXJlT0sgPSBmYWxzZTsKKwkJfQorCQkKKwkJcHVibGljIFF1ZXJ5KGJvb2xlYW4gbGl0ZUZlYXR1cmVzQXJlT0spIHsKKwkJCXRoaXMubGl0ZUZlYXR1cmVzQXJlT0sgPSBsaXRlRmVhdHVyZXNBcmVPSzsKKwkJfQorCQkKKwkJcHVibGljIHZvaWQgc2V0TGl0ZUZlYXR1cmVzQXJlT0soYm9vbGVhbiBsaXRlRmVhdHVyZXNBcmVPSykgeworCQkJdGhpcy5saXRlRmVhdHVyZXNBcmVPSyA9IGxpdGVGZWF0dXJlc0FyZU9LOworCQl9CisJCQorCQlwdWJsaWMgdm9pZCBydW4oCisJCQlJU2l0ZSBzaXRlLAorCQkJU3RyaW5nW10gY2F0ZWdvcmllc1RvU2tpcCwKKwkJCUlVcGRhdGVTZWFyY2hGaWx0ZXIgZmlsdGVyLAorCQkJSVVwZGF0ZVNlYXJjaFJlc3VsdENvbGxlY3RvciBjb2xsZWN0b3IsCisJCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKwkJCQorCQkJSVNpdGVGZWF0dXJlUmVmZXJlbmNlW10gcmVmcyA9IHNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsKKwkJCUhhc2hTZXQgaWdub3JlcyA9IG5ldyBIYXNoU2V0KCk7CQkJCisJCQlNYXAgbGl0ZUZlYXR1cmVzID0gbmV3IEhhc2hNYXAoKTsKKwkJCQorCQkJaWYgKGNhdGVnb3JpZXNUb1NraXAgIT0gbnVsbCkgeworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2F0ZWdvcmllc1RvU2tpcC5sZW5ndGg7IGkrKykgeworCQkJCQlpZ25vcmVzLmFkZChjYXRlZ29yaWVzVG9Ta2lwW2ldKTsKKwkJCQl9CisJCQl9CisJCQlMaXN0IHNpdGVGZWF0dXJlUmVmZXJlbmNlcyA9IG5ldyBBcnJheUxpc3QoQXJyYXlzLmFzTGlzdChyZWZzKSk7CisJCQkKKwkJCWlmIChsaXRlRmVhdHVyZXNBcmVPSyAmJiAoc2l0ZSBpbnN0YW5jZW9mIEV4dGVuZGVkU2l0ZSkgKSB7CisJCQkJCisJCQkJRXh0ZW5kZWRTaXRlIGV4dGVuZGVkU2l0ZSA9IChFeHRlbmRlZFNpdGUpc2l0ZTsKKwkJCQlMaXRlRmVhdHVyZVtdIGxpdGVGZWF0dXJlc0FycmF5ID0gIGV4dGVuZGVkU2l0ZS5nZXRMaXRlRmVhdHVyZXMoKTsKKwkJCQlpZiAoIChsaXRlRmVhdHVyZXNBcnJheSAhPSBudWxsKSAmJiAoIGxpdGVGZWF0dXJlc0FycmF5Lmxlbmd0aCAhPSAwKSkgeworCQkJCQlmb3IoaW50IGkgPSAwOyBpIDwgbGl0ZUZlYXR1cmVzQXJyYXkubGVuZ3RoOyBpKyspIHsKKwkJCQkJCWxpdGVGZWF0dXJlcy5wdXQobGl0ZUZlYXR1cmVzQXJyYXlbaV0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLCBsaXRlRmVhdHVyZXNBcnJheVtpXSk7CQkJCQkKKwkJCQkJfQorCQkJCQkobmV3IEZlYXR1cmVEb3dubG9hZGVyKHNpdGVGZWF0dXJlUmVmZXJlbmNlcywgY29sbGVjdG9yLCBmaWx0ZXIsIGlnbm9yZXMsIG1vbml0b3IsIHRydWUsIGxpdGVGZWF0dXJlcykpLnJ1bigpOworCQkJCQlyZXR1cm47CisJCQkJfSBlbHNlIHsKKwkJCQkJbGl0ZUZlYXR1cmVzQXJlT0sgPSBmYWxzZTsKKwkJCQl9CisJCQl9CisJCQkKKworCQkJCisJCQltb25pdG9yLmJlZ2luVGFzaygiIiwgcmVmcy5sZW5ndGgpOyAvLyROT04tTkxTLTEkCisJCQlUaHJlYWRHcm91cCBmZWF0dXJlRG93bmxvYWRlcnMgPSBuZXcgVGhyZWFkR3JvdXAoIkZlYXR1cmVEb3dubG9hZGVyIik7IC8vJE5PTi1OTFMtMSQKKwkJCWludCBudW1iZXJPZlRocmVhZHMgPSAocmVmcy5sZW5ndGggPiA1KT8gNTogcmVmcy5sZW5ndGg7CisKKwkJCVRocmVhZFtdIGZlYXR1cmVEb3dubG9hZGVyID0gbmV3IFRocmVhZFtudW1iZXJPZlRocmVhZHNdOworCQkJZm9yKCBpbnQgaSA9IDA7IGkgPCBudW1iZXJPZlRocmVhZHM7IGkrKykgeworCQkJCWZlYXR1cmVEb3dubG9hZGVyW2ldID0gbmV3IFRocmVhZChmZWF0dXJlRG93bmxvYWRlcnMsIG5ldyBGZWF0dXJlRG93bmxvYWRlcihzaXRlRmVhdHVyZVJlZmVyZW5jZXMsIGNvbGxlY3RvciwgZmlsdGVyLCBpZ25vcmVzLCBtb25pdG9yKSk7CisJCQkJZmVhdHVyZURvd25sb2FkZXJbaV0uc3RhcnQoKTsKKwkJCX0KKwkJCQorCQkJaW50IGkgPTA7CisJCQl3aGlsZShpIDwgbnVtYmVyT2ZUaHJlYWRzKXsKKwkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKKwkJCQkJc3luY2hyb25pemVkKHNpdGVGZWF0dXJlUmVmZXJlbmNlcykgeyAKKwkJCQkJCXNpdGVGZWF0dXJlUmVmZXJlbmNlcy5jbGVhcigpOworCQkJCQl9CisJCQkJfQorCQkJCXRyeQl7CisJCQkJCWZlYXR1cmVEb3dubG9hZGVyW2ldLmpvaW4oMjUwKTsKKwkJCQkJaWYoIWZlYXR1cmVEb3dubG9hZGVyW2ldLmlzQWxpdmUoKSl7CisJCQkJCQlpKys7CisJCQkJCX0KKwkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgeworCQkJCX0KKwkJCX0KKwkJfQorCisJCS8qIChub24tSmF2YWRvYykKKwkJICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuc2VhcmNoLklTZWFyY2hRdWVyeSNnZXRTZWFyY2hTaXRlKCkKKwkJICovCisJCXB1YmxpYyBJUXVlcnlVcGRhdGVTaXRlQWRhcHRlciBnZXRRdWVyeVNlYXJjaFNpdGUoKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCX0KKworCXB1YmxpYyBTaXRlU2VhcmNoQ2F0ZWdvcnkoKSB7CisJCXN1cGVyKENBVEVHT1JZX0lEKTsKKwkJcXVlcmllcyA9IG5ldyBJVXBkYXRlU2VhcmNoUXVlcnlbXSB7IG5ldyBRdWVyeSgpfTsKKwl9CisKKwlwdWJsaWMgU2l0ZVNlYXJjaENhdGVnb3J5KGJvb2xlYW4gbGl0ZUZlYXR1cmVzQXJlT0spIHsKKwkJdGhpcygpOworCQl0aGlzLmxpdGVGZWF0dXJlc0FyZU9LID0gbGl0ZUZlYXR1cmVzQXJlT0s7CisJCXF1ZXJpZXMgPSBuZXcgSVVwZGF0ZVNlYXJjaFF1ZXJ5W10geyBuZXcgUXVlcnkobGl0ZUZlYXR1cmVzQXJlT0spfTsKKwl9CisKKwlwdWJsaWMgSVVwZGF0ZVNlYXJjaFF1ZXJ5W10gZ2V0UXVlcmllcygpIHsKKwkJcmV0dXJuIHF1ZXJpZXM7CisJfQorCQorCQorCXByaXZhdGUgc3RhdGljIGNsYXNzIEZlYXR1cmVEb3dubG9hZGVyIGltcGxlbWVudHMgUnVubmFibGUgeworCQkKKwkJcHJpdmF0ZSBMaXN0IHNpdGVGZWF0dXJlUmVmZXJlbmNlczsKKwkJCisJCXByaXZhdGUgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yOworCQkKKwkJcHJpdmF0ZSBJVXBkYXRlU2VhcmNoRmlsdGVyIGZpbHRlcjsKKwkJCisJCXByaXZhdGUgSVVwZGF0ZVNlYXJjaFJlc3VsdENvbGxlY3RvciBjb2xsZWN0b3I7CisJCQorCQlwcml2YXRlIEhhc2hTZXQgaWdub3JlczsKKworCQlwcml2YXRlIGJvb2xlYW4gbGl0ZUZlYXR1cmVzQXJlT0s7CisKKwkJcHJpdmF0ZSBNYXAgbGl0ZUZlYXR1cmVzOworCisJCXB1YmxpYyBGZWF0dXJlRG93bmxvYWRlcihMaXN0IHNpdGVGZWF0dXJlUmVmZXJlbmNlcywgSVVwZGF0ZVNlYXJjaFJlc3VsdENvbGxlY3RvciBjb2xsZWN0b3IsIElVcGRhdGVTZWFyY2hGaWx0ZXIgZmlsdGVyLCBIYXNoU2V0IGlnbm9yZXMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgeworCQkJc3VwZXIoKTsKKworCQkJdGhpcy5jb2xsZWN0b3IgPSBjb2xsZWN0b3I7CisJCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKKwkJCXRoaXMuaWdub3JlcyA9IGlnbm9yZXM7CisJCQl0aGlzLm1vbml0b3IgPSBtb25pdG9yOworCQkJdGhpcy5zaXRlRmVhdHVyZVJlZmVyZW5jZXMgPSBzaXRlRmVhdHVyZVJlZmVyZW5jZXM7CisJCX0KKwkJCisJCXB1YmxpYyBGZWF0dXJlRG93bmxvYWRlcihMaXN0IHNpdGVGZWF0dXJlUmVmZXJlbmNlcywgSVVwZGF0ZVNlYXJjaFJlc3VsdENvbGxlY3RvciBjb2xsZWN0b3IsIElVcGRhdGVTZWFyY2hGaWx0ZXIgZmlsdGVyLCBIYXNoU2V0IGlnbm9yZXMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgYm9vbGVhbiBsaXRlRmVhdHVyZXNBcmVPSywgTWFwIGxpdGVGZWF0dXJlcykgeworCQkJdGhpcyhzaXRlRmVhdHVyZVJlZmVyZW5jZXMsIGNvbGxlY3RvciwgZmlsdGVyLCBpZ25vcmVzLCBtb25pdG9yKTsKKwkJCXRoaXMubGl0ZUZlYXR1cmVzQXJlT0sgPSBsaXRlRmVhdHVyZXNBcmVPSyAmJiAobGl0ZUZlYXR1cmVzICE9IG51bGwpOworCQkJdGhpcy5saXRlRmVhdHVyZXMgPSBsaXRlRmVhdHVyZXM7CisJCX0KKworCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkKKwkJCUlTaXRlRmVhdHVyZVJlZmVyZW5jZSBzaXRlRmVhdHVyZVJlZmVyZW5jZSA9IG51bGw7CisJCQkKKwkJCXdoaWxlIChzaXRlRmVhdHVyZVJlZmVyZW5jZXMuc2l6ZSgpICE9IDApIHsKKwkJCQkKKwkJCQlzeW5jaHJvbml6ZWQoc2l0ZUZlYXR1cmVSZWZlcmVuY2VzKSB7IAorCQkJCQl0cnl7CisJCQkJCQlzaXRlRmVhdHVyZVJlZmVyZW5jZSA9IChJU2l0ZUZlYXR1cmVSZWZlcmVuY2Upc2l0ZUZlYXR1cmVSZWZlcmVuY2VzLnJlbW92ZSgwKTsKKwkJCQkJfWNhdGNoKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSl7CisJCQkJCQlzaXRlRmVhdHVyZVJlZmVyZW5jZSA9IG51bGw7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAoc2l0ZUZlYXR1cmVSZWZlcmVuY2UgIT0gbnVsbCkgeworCQkJCQlib29sZWFuIHNraXBGZWF0dXJlID0gZmFsc2U7CisJCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKKwkJCQkJCWJyZWFrOworCQkJCQlpZiAoaWdub3Jlcy5zaXplKCkgPiAwKSB7CisJCQkJCQlJQ2F0ZWdvcnlbXSBjYXRlZ29yaWVzID0gc2l0ZUZlYXR1cmVSZWZlcmVuY2UuZ2V0Q2F0ZWdvcmllcygpOworCQkJCQkJCisJCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNhdGVnb3JpZXMubGVuZ3RoOyBqKyspIHsKKwkJCQkJCQlJQ2F0ZWdvcnkgY2F0ZWdvcnkgPSBjYXRlZ29yaWVzW2pdOworCQkJCQkJCWlmIChpZ25vcmVzLmNvbnRhaW5zKGNhdGVnb3J5LmdldE5hbWUoKSkpIHsKKwkJCQkJCQkJc2tpcEZlYXR1cmUgPSB0cnVlOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJdHJ5IHsKKwkJCQkJCWlmICghc2tpcEZlYXR1cmUpIHsKKwkJCQkJCQlpZiAoZmlsdGVyLmFjY2VwdChzaXRlRmVhdHVyZVJlZmVyZW5jZSkpIHsKKwkJCQkJCQkJSUZlYXR1cmUgZmVhdHVyZSA9IG51bGw7CisJCQkJCQkJCWlmKGxpdGVGZWF0dXJlc0FyZU9LKSB7CisJCQkJCQkJCQlmZWF0dXJlID0gKElGZWF0dXJlKWxpdGVGZWF0dXJlcy5nZXQoc2l0ZUZlYXR1cmVSZWZlcmVuY2UuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpKTsKKwkJCQkJCQkJfQorCQkJCQkJCQlpZiAoZmVhdHVyZSA9PSBudWxsKXsKKwkJCQkJCQkJCWZlYXR1cmUgPSBzaXRlRmVhdHVyZVJlZmVyZW5jZS5nZXRGZWF0dXJlKG51bGwpOworCQkJCQkJCQl9CisJCQkJCQkJCXN5bmNocm9uaXplZChzaXRlRmVhdHVyZVJlZmVyZW5jZXMpIHsKKwkJCQkJCQkJCWlmICggKGZlYXR1cmUgIT0gbnVsbCkgJiYgKGZpbHRlci5hY2NlcHQoc2l0ZUZlYXR1cmVSZWZlcmVuY2UpKSApIHsJCQkJCQkJCQorCQkJCQkJCQkJCWNvbGxlY3Rvci5hY2NlcHQoZmVhdHVyZSk7CQkJCQkJCSAgICAKKwkJCQkJCQkJCQltb25pdG9yLnN1YlRhc2soZmVhdHVyZS5nZXRMYWJlbCgpKTsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkJCQlVcGRhdGVDb3JlLmxvZyhlKTsKKwkJCQkJfSBmaW5hbGx5IHsKKwkJCQkJCW1vbml0b3Iud29ya2VkKDEpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJCisJCX0KKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc0xpdGVGZWF0dXJlc0FyZU9LKCkgeworCQlyZXR1cm4gbGl0ZUZlYXR1cmVzQXJlT0s7CisJfQorCisJcHVibGljIHZvaWQgc2V0TGl0ZUZlYXR1cmVzQXJlT0soYm9vbGVhbiBsaXRlRmVhdHVyZXNBcmVPSykgeworCQl0aGlzLmxpdGVGZWF0dXJlc0FyZU9LID0gbGl0ZUZlYXR1cmVzQXJlT0s7CisJCWZvciggaW50IGkgPSAwOyBpIDwgcXVlcmllcy5sZW5ndGg7IGkrKykgeworCQkJKChRdWVyeSlxdWVyaWVzW2ldKS5zZXRMaXRlRmVhdHVyZXNBcmVPSyhsaXRlRmVhdHVyZXNBcmVPSyk7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zZWFyY2gvVXBkYXRlUG9saWN5LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zZWFyY2gvVXBkYXRlUG9saWN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU2MmE4NgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NlYXJjaC9VcGRhdGVQb2xpY3kuamF2YQpAQCAtMCwwICsxLDMxNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogICAgIEphbWVzIEQgTWlsZXMgKElCTSBDb3JwLikgLSBidWcgMTkxMzY4LCBQb2xpY3kgVVJMIGRvZXNuJ3Qgc3VwcG9ydCBVVEYtOCBjaGFyYWN0ZXJzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnNlYXJjaDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JU2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5VdGlsaXRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuVVJMRW5jb2RlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5VcGRhdGVNYW5hZ2VyVXRpbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuY29ubmVjdGlvbi5Db25uZWN0aW9uRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5jb25uZWN0aW9uLklSZXNwb25zZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuc2VhcmNoLklVcGRhdGVTaXRlQWRhcHRlcjsKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKK2ltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CisKKy8qKgorICogCisgKiBUaGlzIGNsYXNzIG9wZW5zIGNvbm5lY3Rpb24gdG8gdGhlIHVwZGF0ZSBtYXAgcmVzb3VyY2UKKyAqIGFuZCBwYXJzZXMgdGhlIGZpbGUgdG8gbG9hZCB1cGRhdGUgVVJMIG1hcHBpbmdzLgorICogVGhlc2UgbWFwcGluZ3MgYXJlIHVzZWQgdG8gcmVkaXJlY3QgbmV3IHVwZGF0ZXMgc2VhcmNoCisgKiB3aGVuIHRoZSByZWRpcmVjdGlvbiBwYXR0ZXJuIG1hdGNoZXMuCisgKi8KKworcHVibGljIGNsYXNzIFVwZGF0ZVBvbGljeSB7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19QT0xJQ1kgPSAidXBkYXRlLXBvbGljeSI7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1VSTF9NQVAgPSAidXJsLW1hcCI7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1VSTCA9ICJ1cmwiOyAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9QQVRURVJOID0gInBhdHRlcm4iOyAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9UWVBFID0gInVybC10eXBlIjsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfVFlQRV9WQUxVRV9VUERBVEUgPSAidXBkYXRlIjsgLy8kTk9OLU5MUy0xJAorCS8vcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9UWVBFX1ZBTFVFX0JPVEggPSAiYm90aCI7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1RZUEVfVkFMVUVfRElTQ09WRVJZID0gImRpc2NvdmVyeSI7IC8vJE5PTi1OTFMtMSQKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZG9jdW1lbnRCdWlsZGVyRmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKworCXByaXZhdGUgc3RhdGljIGNsYXNzIE1hcFNpdGUgaW1wbGVtZW50cyBJVXBkYXRlU2l0ZUFkYXB0ZXIgeworCQlwcml2YXRlIFVSTCB1cmw7CisJCXB1YmxpYyBNYXBTaXRlKFVSTCB1cmwpIHsKKwkJCXRoaXMudXJsID0gdXJsOworCQl9CisJCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7CisJCQlpZiAodXJsID09IG51bGwpIHsKKwkJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJCXJldHVybiB1cmwudG9TdHJpbmcoKTsKKwkJfQorCQlwdWJsaWMgVVJMIGdldFVSTCgpIHsKKwkJCXJldHVybiB1cmw7CisJCX0KKwl9CisKKwlwcml2YXRlIHN0YXRpYyBjbGFzcyBVcGRhdGVNYXBFbnRyeSB7CisJCXByaXZhdGUgSVVwZGF0ZVNpdGVBZGFwdGVyIHNpdGU7CisJCXByaXZhdGUgU3RyaW5nIHBhdHRlcm47CisKKwkJcHVibGljIFVwZGF0ZU1hcEVudHJ5KFN0cmluZyBwYXR0ZXJuLCBVUkwgdXJsKSB7CisJCQl0aGlzLnBhdHRlcm4gPSBwYXR0ZXJuOworCQkJdGhpcy5zaXRlID0gbmV3IE1hcFNpdGUodXJsKTsKKwkJfQorCQlwdWJsaWMgSVVwZGF0ZVNpdGVBZGFwdGVyIGdldFNpdGUoKSB7CisJCQlyZXR1cm4gc2l0ZTsKKwkJfQorCQlwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKFN0cmluZyBpZCkgeworCQkJcmV0dXJuIGlkLnN0YXJ0c1dpdGgocGF0dGVybik7CisJCX0KKwkJcHVibGljIFN0cmluZyBnZXRQYXR0ZXJuKCkgeworCQkJcmV0dXJuIHBhdHRlcm47CisJCX0KKwl9CisKKwlwcml2YXRlIEFycmF5TGlzdCBlbnRyaWVzOworCXByaXZhdGUgQXJyYXlMaXN0IGRpc2NvdmVyeUVudHJpZXM7CisJcHJpdmF0ZSBJVXBkYXRlU2l0ZUFkYXB0ZXIgZGVmYXVsdFNpdGU7CisJcHJpdmF0ZSBJVXBkYXRlU2l0ZUFkYXB0ZXIgZGVmYXVsdERpc2NvdmVyeVNpdGU7CisJcHJpdmF0ZSBib29sZWFuIGxvYWRlZCA9IGZhbHNlOworCXByaXZhdGUgYm9vbGVhbiBmYWxsYmFja0FsbG93ZWQgPSB0cnVlOworCisJcHVibGljIFVwZGF0ZVBvbGljeSgpIHsKKwkJZW50cmllcyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJZGlzY292ZXJ5RW50cmllcyA9IG5ldyBBcnJheUxpc3QoKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBsb2FkKFVSTCBtYXBGaWxlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCisJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJSW5wdXRTdHJlYW0gcG9saWN5U3RyZWFtID0gbnVsbDsKKwkJdHJ5IHsKKwkJCUlSZXNwb25zZSByZXNwb25zZSA9IENvbm5lY3Rpb25GYWN0b3J5LmdldChtYXBGaWxlKTsKKwkJCVVwZGF0ZU1hbmFnZXJVdGlscy5jaGVja0Nvbm5lY3Rpb25SZXN1bHQocmVzcG9uc2UsIG1hcEZpbGUpOworCQkJcG9saWN5U3RyZWFtID0gcmVzcG9uc2UuZ2V0SW5wdXRTdHJlYW0obW9uaXRvcik7CisJCQkvLyB0aGUgc3RyZWFtIGNhbiBiZSBudWxsIGlmIHRoZSB1c2VyIGNhbmNlbHMgdGhlIGNvbm5lY3Rpb24KKwkJCWlmIChwb2xpY3lTdHJlYW0gPT0gbnVsbCkKKwkJCQlyZXR1cm47CisJCQkKKwkJCWRvY3VtZW50QnVpbGRlckZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7CisJCQlEb2N1bWVudEJ1aWxkZXIgcGFyc2VyID0gZG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKKwkJCURvY3VtZW50IGRvYyA9IHBhcnNlci5wYXJzZShuZXcgSW5wdXRTb3VyY2UocG9saWN5U3RyZWFtKSk7CisKKwkJCXByb2Nlc3NVcGRhdGVQb2xpY3koZG9jKTsKKwkJCWxvYWRlZCA9IHRydWU7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKAorCQkJCU5MUy5iaW5kKE1lc3NhZ2VzLlNpdGVVUkxGYWN0b3J5X1VuYWJsZVRvQWNjZXNzU2l0ZVN0cmVhbSwgKG5ldyBTdHJpbmdbXSB7IG1hcEZpbGUgPT0gbnVsbCA/ICIiIDogbWFwRmlsZS50b0V4dGVybmFsRm9ybSgpIH0pKSwgLy8kTk9OLU5MUy0xJAorCQkJCUlTaXRlLlNJVEVfQUNDRVNTX0VYQ0VQVElPTiwKKwkJCQllKTsKKwkJfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKAorCQkJCU1lc3NhZ2VzLlVwZGF0ZVBvbGljeV9wYXJzZVBvbGljeSwgCisJCQkJMCwKKwkJCQllKTsKKworCQl9IGNhdGNoKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgeworCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oCisJCQkJTWVzc2FnZXMuVXBkYXRlUG9saWN5X3BhcnNlUG9saWN5LCAKKwkJCQkwLAorCQkJCWUpOworCQl9IGZpbmFsbHkgeworCQkJaWYgKHBvbGljeVN0cmVhbSAhPSBudWxsKSB7CisJCQkJdHJ5IHsKKwkJCQkJcG9saWN5U3RyZWFtLmNsb3NlKCk7CisJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXB1YmxpYyBib29sZWFuIGlzTG9hZGVkKCkgeworCQlyZXR1cm4gbG9hZGVkOworCX0KKwkKKwkvKgorCSAqIEdpdmVuIHRoZSBmZWF0dXJlIElELCByZXR1cm5zIHRoZSBtYXBwZWQgdXBkYXRlIFVSTCBpZgorCSAqIGZvdW5kIGluIHRoZSBtYXBwaW5ncy4gVGhpcyBVUkwgd2lsbCBiZSB1c2VkIElOU1RFQUQgb2YKKwkgKiB0aGUgdXBkYXRlIFVSTCBlbmNvZGVkIGluIHRoZSBmZWF0dXJlIGl0c2VsZiBkdXJpbmcgdGhlCisJICogbmV3IHVwZGF0ZSBzZWFyY2guCisJICogPHA+SW4gY2FzZSBvZiBtdWx0aXBsZSBtYXRjaGVzIChlLmcuIG9yZy5lY2xpcHNlIGFuZCBvcmcuZWNsaXBzZS5wbGF0Zm9ybSkKKwkgKiB0aGUgVVJMIGZvciB0aGUgbG9uZ2VyIHBhdHRlcm4gd2lsbCBiZSBwaWNrZWQgKGkuZS4gb3JnLmVjbGlwc2UucGxhdGZvcm0pLgorCSAqLworCXB1YmxpYyBJVXBkYXRlU2l0ZUFkYXB0ZXIgZ2V0TWFwcGVkU2l0ZShTdHJpbmcgaWQpIHsKKwkJVXBkYXRlTWFwRW50cnkgbGFzdEVudHJ5ID0gbnVsbDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLnNpemUoKTsgaSsrKSB7CisJCQlVcGRhdGVNYXBFbnRyeSBlbnRyeSA9IChVcGRhdGVNYXBFbnRyeSkgZW50cmllcy5nZXQoaSk7CisJCQlpZiAoZW50cnkubWF0Y2hlcyhpZCkpIHsKKwkJCQlpZiAobGFzdEVudHJ5ID09IG51bGwpCisJCQkJCWxhc3RFbnRyeSA9IGVudHJ5OworCQkJCWVsc2UgeworCQkJCQkvLyBDaG9vc2UgdGhlIG1hdGNoIHdpdGggbG9uZ2VyIHBhdHRlcm4uCisJCQkJCS8vIEZvciBleGFtcGxlLCBpZiB0d28gbWF0Y2hlcyBhcmUgZm91bmQ6CisJCQkJCS8vICdvcmcuZWNsaXBzZScgYW5kICdvcmcuZWNsaXBzZS5wbGF0Zm9ybScsCisJCQkJCS8vIHBpY2sgJ29yZy5lY2xpcHNlLnBsYXRmb3JtJy4KKwkJCQkJU3RyaW5nIHBhdHRlcm4gPSBlbnRyeS5nZXRQYXR0ZXJuKCk7CisJCQkJCVN0cmluZyBsYXN0UGF0dGVybiA9IGxhc3RFbnRyeS5nZXRQYXR0ZXJuKCk7CisJCQkJCWlmIChwYXR0ZXJuLmxlbmd0aCgpID4gbGFzdFBhdHRlcm4ubGVuZ3RoKCkpCisJCQkJCQlsYXN0RW50cnkgPSBlbnRyeTsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKGxhc3RFbnRyeSAhPSBudWxsKQorCQkJcmV0dXJuIGxhc3RFbnRyeS5nZXRTaXRlKCk7CisJCWVsc2UKKwkJCXJldHVybiBkZWZhdWx0U2l0ZTsKKwl9CisJCisJLyoKKwkgKiBHaXZlbiB0aGUgZmVhdHVyZSBJRCwgcmV0dXJucyB0aGUgbWFwcGVkIGRpc2NvdmVyeSBVUkwgaWYKKwkgKiBmb3VuZCBpbiB0aGUgbWFwcGluZ3MuIFRoaXMgVVJMIHdpbGwgYmUgdXNlZCBJTlNURUFEIG9mCisJICogdGhlIGRpc2NvdmVyeSBVUkwgZW5jb2RlZCBpbiB0aGUgZmVhdHVyZSBpdHNlbGYgZHVyaW5nIHRoZQorCSAqIG5ldyBzZWFyY2guCisJICogPHA+SW4gY2FzZSBvZiBtdWx0aXBsZSBtYXRjaGVzIChlLmcuIG9yZy5lY2xpcHNlIGFuZCBvcmcuZWNsaXBzZS5wbGF0Zm9ybSkKKwkgKiB0aGUgVVJMIGZvciB0aGUgbG9uZ2VyIHBhdHRlcm4gd2lsbCBiZSBwaWNrZWQgKGkuZS4gb3JnLmVjbGlwc2UucGxhdGZvcm0pLgorCSAqLworCXB1YmxpYyBJVXBkYXRlU2l0ZUFkYXB0ZXIgZ2V0TWFwcGVkRGlzY292ZXJ5U2l0ZShTdHJpbmcgaWQpIHsKKwkJVXBkYXRlTWFwRW50cnkgbGFzdEVudHJ5ID0gbnVsbDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBkaXNjb3ZlcnlFbnRyaWVzLnNpemUoKTsgaSsrKSB7CisJCQlVcGRhdGVNYXBFbnRyeSBlbnRyeSA9IChVcGRhdGVNYXBFbnRyeSkgZGlzY292ZXJ5RW50cmllcy5nZXQoaSk7CisJCQlpZiAoZW50cnkubWF0Y2hlcyhpZCkpIHsKKwkJCQlpZiAobGFzdEVudHJ5ID09IG51bGwpCisJCQkJCWxhc3RFbnRyeSA9IGVudHJ5OworCQkJCWVsc2UgeworCQkJCQkvLyBDaG9vc2UgdGhlIG1hdGNoIHdpdGggbG9uZ2VyIHBhdHRlcm4uCisJCQkJCS8vIEZvciBleGFtcGxlLCBpZiB0d28gbWF0Y2hlcyBhcmUgZm91bmQ6CisJCQkJCS8vICdvcmcuZWNsaXBzZScgYW5kICdvcmcuZWNsaXBzZS5wbGF0Zm9ybScsCisJCQkJCS8vIHBpY2sgJ29yZy5lY2xpcHNlLnBsYXRmb3JtJy4KKwkJCQkJU3RyaW5nIHBhdHRlcm4gPSBlbnRyeS5nZXRQYXR0ZXJuKCk7CisJCQkJCVN0cmluZyBsYXN0UGF0dGVybiA9IGxhc3RFbnRyeS5nZXRQYXR0ZXJuKCk7CisJCQkJCWlmIChwYXR0ZXJuLmxlbmd0aCgpID4gbGFzdFBhdHRlcm4ubGVuZ3RoKCkpCisJCQkJCQlsYXN0RW50cnkgPSBlbnRyeTsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKGxhc3RFbnRyeSAhPSBudWxsKQorCQkJcmV0dXJuIGxhc3RFbnRyeS5nZXRTaXRlKCk7CisJCWVsc2UKKwkJCXJldHVybiBkZWZhdWx0RGlzY292ZXJ5U2l0ZTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc0ZhbGxiYWNrQWxsb3dlZCgpIHsKKwkJcmV0dXJuIGZhbGxiYWNrQWxsb3dlZDsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIHJlc2V0KCkgeworCQlpZiAoIWVudHJpZXMuaXNFbXB0eSgpKQorCQkJZW50cmllcy5jbGVhcigpOworCQlpZiAoIWRpc2NvdmVyeUVudHJpZXMuaXNFbXB0eSgpKQorCQkJZGlzY292ZXJ5RW50cmllcy5jbGVhcigpOworCX0KKworCXByaXZhdGUgdm9pZCBwcm9jZXNzVXBkYXRlUG9saWN5KERvY3VtZW50IGRvY3VtZW50KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCU5vZGUgcm9vdCA9IGRvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpOworCQlyZXNldCgpOworCQkKKwkJaWYgKHJvb3QuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoVEFHX1BPTElDWSk9PWZhbHNlKQorCQkJdGhyb3dDb3JlRXhjZXB0aW9uKCInIitUQUdfUE9MSUNZK01lc3NhZ2VzLlVwZGF0ZVBvbGljeV9wb2xpY3lFeHBlY3RlZCwgbnVsbCk7ICAvLyROT04tTkxTLTEkCisJCQkJCisJCU5vZGVMaXN0IG5vZGVzID0gcm9vdC5nZXRDaGlsZE5vZGVzKCk7CisJCQorCQlmb3IgKGludCBpPTA7IGk8bm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykgeworCQkJTm9kZSBjaGlsZCA9IG5vZGVzLml0ZW0oaSk7CisJCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKKwkJCQljb250aW51ZTsKKwkJCVN0cmluZyB0YWcgPSBjaGlsZC5nZXROb2RlTmFtZSgpOworCQkJaWYgKHRhZy5lcXVhbHMoVEFHX1VSTF9NQVApKQorCQkJCXByb2Nlc3NNYXBOb2RlKGNoaWxkKTsKKwkJfQorCX0KKwlwcml2YXRlIHZvaWQgcHJvY2Vzc01hcE5vZGUoTm9kZSBub2RlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCVN0cmluZyBwYXR0ZXJuID0gZ2V0QXR0cmlidXRlKG5vZGUsIEFUVF9QQVRURVJOKTsKKwkJU3RyaW5nIHVybE5hbWUgPSBnZXRBdHRyaWJ1dGUobm9kZSwgQVRUX1VSTCk7CisJCVN0cmluZyB0eXBlID0gZ2V0QXR0cmlidXRlKG5vZGUsIEFUVF9UWVBFKTsKKwkJCisJCWFzc2VydE5vdE51bGwoQVRUX1BBVFRFUk4sIHBhdHRlcm4pOworCQlhc3NlcnROb3ROdWxsKEFUVF9VUkwsIHVybE5hbWUpOworCQkKKwkJLy8gZW1wdHkgdXJsIG1lYW5zIGZlYXR1cmUgaXMgbm90IHVwZGF0ZWFibGUKKwkJaWYgKHVybE5hbWUudHJpbSgpLmxlbmd0aCgpID09IDApIHsKKwkJCWFkZFVwZGF0ZUVudHJ5KHBhdHRlcm4sIG51bGwsIHR5cGUpOworCQkJcmV0dXJuOworCQl9CisKKwkJdHJ5IHsKKwkJCVVSTCB1cmwgPSBuZXcgVVJMKHVybE5hbWUpOworCQkJVVJMIHJlc29sdmVkVVJMID0gVVJMRW5jb2Rlci5lbmNvZGUodXJsKTsKKwkJCWFkZFVwZGF0ZUVudHJ5KHBhdHRlcm4sIHJlc29sdmVkVVJMLCB0eXBlKTsKKwkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93Q29yZUV4Y2VwdGlvbihNZXNzYWdlcy5VcGRhdGVQb2xpY3lfaW52YWxpZFVSTCt1cmxOYW1lLCBudWxsKTsgCisJCX0gCisJfQorCQorCXByaXZhdGUgdm9pZCBhc3NlcnROb3ROdWxsKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJaWYgKHZhbHVlPT1udWxsKQorCQkJdGhyb3dDb3JlRXhjZXB0aW9uKG5hbWUrTWVzc2FnZXMuVXBkYXRlUG9saWN5X25hbWVOb051bGwsIG51bGwpOyAKKwl9CisJCisJcHJpdmF0ZSBTdHJpbmcgZ2V0QXR0cmlidXRlKE5vZGUgbm9kZSwgU3RyaW5nIG5hbWUpIHsKKwkJTmFtZWROb2RlTWFwIGF0dE1hcCA9IG5vZGUuZ2V0QXR0cmlidXRlcygpOworCQlOb2RlIGF0dCA9IGF0dE1hcC5nZXROYW1lZEl0ZW0obmFtZSk7CisJCWlmIChhdHQ9PW51bGwpIHJldHVybiBudWxsOworCQlyZXR1cm4gYXR0LmdldE5vZGVWYWx1ZSgpOworCX0KKworCXByaXZhdGUgdm9pZCBhZGRVcGRhdGVFbnRyeShTdHJpbmcgcGF0dGVybiwgVVJMIHVybCwgU3RyaW5nIHR5cGUpIHsKKwkJaWYgKHBhdHRlcm4uZXF1YWxzSWdub3JlQ2FzZSgiKiIpKSB7Ly8kTk9OLU5MUy0xJAorCQkJaWYgKHR5cGUgPT0gbnVsbCkKKwkJCQlkZWZhdWx0U2l0ZSA9IG5ldyBNYXBTaXRlKHVybCk7CisJCQllbHNlIGlmICh0eXBlLmVxdWFscyhBVFRfVFlQRV9WQUxVRV9VUERBVEUpKQorCQkJCWRlZmF1bHRTaXRlID0gbmV3IE1hcFNpdGUodXJsKTsKKwkJCWVsc2UgaWYgKHR5cGUuZXF1YWxzKEFUVF9UWVBFX1ZBTFVFX0RJU0NPVkVSWSkpCisJCQkJZGVmYXVsdERpc2NvdmVyeVNpdGUgPSBuZXcgTWFwU2l0ZSh1cmwpOworCQkJZWxzZSB7CisJCQkJZGVmYXVsdFNpdGUgPSBuZXcgTWFwU2l0ZSh1cmwpOworCQkJCWRlZmF1bHREaXNjb3ZlcnlTaXRlID0gbmV3IE1hcFNpdGUodXJsKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmICh0eXBlID09IG51bGwgKQorCQkJCWVudHJpZXMuYWRkKG5ldyBVcGRhdGVNYXBFbnRyeShwYXR0ZXJuLCB1cmwpKTsKKwkJCWVsc2UgaWYgKHR5cGUuZXF1YWxzKEFUVF9UWVBFX1ZBTFVFX1VQREFURSkpCisJCQkJZW50cmllcy5hZGQobmV3IFVwZGF0ZU1hcEVudHJ5KHBhdHRlcm4sIHVybCkpOworCQkJZWxzZSBpZiAodHlwZS5lcXVhbHMoQVRUX1RZUEVfVkFMVUVfRElTQ09WRVJZKSkKKwkJCQlkaXNjb3ZlcnlFbnRyaWVzLmFkZChuZXcgVXBkYXRlTWFwRW50cnkocGF0dGVybiwgdXJsKSk7CisJCQllbHNlIHsKKwkJCQllbnRyaWVzLmFkZChuZXcgVXBkYXRlTWFwRW50cnkocGF0dGVybiwgdXJsKSk7CisJCQkJZGlzY292ZXJ5RW50cmllcy5hZGQobmV3IFVwZGF0ZU1hcEVudHJ5KHBhdHRlcm4sIHVybCkpOworCQkJfQorCQl9CisJfQorCQorCXByaXZhdGUgdm9pZCB0aHJvd0NvcmVFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCVN0cmluZyBmdWxsTWVzc2FnZSA9IE1lc3NhZ2VzLlVwZGF0ZVBvbGljeV9VcGRhdGVQb2xpY3krbWVzc2FnZTsgCisJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKGZ1bGxNZXNzYWdlLCAwLCBlKTsKKwl9Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zZWFyY2gvVXBkYXRlU2l0ZUFkYXB0ZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NlYXJjaC9VcGRhdGVTaXRlQWRhcHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1YzFlNTkKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zZWFyY2gvVXBkYXRlU2l0ZUFkYXB0ZXIuamF2YQpAQCAtMCwwICsxLDQ1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnNlYXJjaDsKKworaW1wb3J0IGphdmEubmV0Lio7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuc2VhcmNoLio7CisKKy8qKgorICovCitwdWJsaWMgY2xhc3MgVXBkYXRlU2l0ZUFkYXB0ZXIgaW1wbGVtZW50cyBJVXBkYXRlU2l0ZUFkYXB0ZXIgeworCXByaXZhdGUgU3RyaW5nIGxhYmVsOworCXByaXZhdGUgVVJMIHVybDsKKwkKKwlwdWJsaWMgVXBkYXRlU2l0ZUFkYXB0ZXIoU3RyaW5nIGxhYmVsLCBVUkwgdXJsKSB7CisJCXRoaXMubGFiZWwgPSBsYWJlbDsKKwkJdGhpcy51cmwgPSB1cmw7CisJfQorCXB1YmxpYyBVUkwgZ2V0VVJMKCkgeworCQlyZXR1cm4gdXJsOworCX0KKwlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgeworCQlyZXR1cm4gbGFiZWw7CisJfQorLyoKKwlwdWJsaWMgSVNpdGUgZ2V0U2l0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKwkJdHJ5IHsKKwkJCXJldHVybiBTaXRlTWFuYWdlci5nZXRTaXRlKGdldFVSTCgpLCBtb25pdG9yKTsKKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCX0KKyovCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpeworCQlyZXR1cm4gIiIgKyBnZXRVUkwoKTsgLy8kTk9OLU5MUy0xJAorCX0KK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NlYXJjaC9VcGRhdGVzU2VhcmNoQ2F0ZWdvcnkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NlYXJjaC9VcGRhdGVzU2VhcmNoQ2F0ZWdvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjFkYjA5Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2VhcmNoL1VwZGF0ZXNTZWFyY2hDYXRlZ29yeS5qYXZhCkBAIC0wLDAgKzEsNTcxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiAgQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5zZWFyY2g7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW5WZXJzaW9uSWRlbnRpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uSUNvbmZpZ3VyZWRTaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLklJbnN0YWxsQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi5JTG9jYWxTaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVNpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVNpdGVGZWF0dXJlUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklVUkxFbnRyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JVXBkYXRlQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlNpdGVNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlZlcnNpb25lZElkZW50aWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuVXBkYXRlQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwub3BlcmF0aW9ucy5GZWF0dXJlSGllcmFyY2h5RWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwub3BlcmF0aW9ucy5VcGRhdGVVdGlsczsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy5JSW5zdGFsbEZlYXR1cmVPcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuT3BlcmF0aW9uc01hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnNlYXJjaC5JUXVlcnlVcGRhdGVTaXRlQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuc2VhcmNoLklVcGRhdGVTZWFyY2hGaWx0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnNlYXJjaC5JVXBkYXRlU2VhcmNoUXVlcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnNlYXJjaC5JVXBkYXRlU2VhcmNoUmVzdWx0Q29sbGVjdG9yOworCitwdWJsaWMgY2xhc3MgVXBkYXRlc1NlYXJjaENhdGVnb3J5IGV4dGVuZHMgQmFzZVNlYXJjaENhdGVnb3J5IHsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FURUdPUllfSUQgPQorCQkib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubmV3LXVwZGF0ZXMiOyAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBJRmVhdHVyZSBbXSBmZWF0dXJlczsKKwlwcml2YXRlIGJvb2xlYW4gYXV0b21hdGljOworCisJY2xhc3MgQ2FuZGlkYXRlIHsKKwkJQXJyYXlMaXN0IGNoaWxkcmVuOworCQlDYW5kaWRhdGUgcGFyZW50OworCQlJRmVhdHVyZVJlZmVyZW5jZSByZWY7CisJCXB1YmxpYyBDYW5kaWRhdGUoSUZlYXR1cmVSZWZlcmVuY2UgcmVmKSB7CisJCQl0aGlzLnJlZiA9IHJlZjsKKwkJfQorCQlwdWJsaWMgQ2FuZGlkYXRlKElGZWF0dXJlUmVmZXJlbmNlIHJlZiwgQ2FuZGlkYXRlIHBhcmVudCkgeworCQkJdGhpcyhyZWYpOworCQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CisJCX0KKwkJcHVibGljIHZvaWQgYWRkKENhbmRpZGF0ZSBjaGlsZCkgeworCQkJaWYgKGNoaWxkcmVuID09IG51bGwpCisJCQkJY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7CisJCQljaGlsZC5zZXRQYXJlbnQodGhpcyk7CisJCQljaGlsZHJlbi5hZGQoY2hpbGQpOworCQl9CisJCXZvaWQgc2V0UGFyZW50KENhbmRpZGF0ZSBwYXJlbnQpIHsKKwkJCXRoaXMucGFyZW50ID0gcGFyZW50OworCQl9CisJCXB1YmxpYyBJRmVhdHVyZVJlZmVyZW5jZSBnZXRSZWZlcmVuY2UoKSB7CisJCQlyZXR1cm4gcmVmOworCQl9CisJCXZvaWQgc2V0UmVmZXJlbmNlKElGZWF0dXJlUmVmZXJlbmNlIHJlZikgeworCQkJdGhpcy5yZWYgPSByZWY7CisJCX0KKwkJcHVibGljIElGZWF0dXJlIGdldEZlYXR1cmUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJCQl0cnkgeworCQkJCXJldHVybiByZWYuZ2V0RmVhdHVyZShtb25pdG9yKTsKKwkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJCXJldHVybiBudWxsOworCQkJfQorCQl9CisJCXB1YmxpYyBDYW5kaWRhdGUgZ2V0UGFyZW50KCkgeworCQkJcmV0dXJuIHBhcmVudDsKKwkJfQorCQlwdWJsaWMgQ2FuZGlkYXRlIGdldFJvb3QoKSB7CisJCQlDYW5kaWRhdGUgcm9vdCA9IHRoaXM7CisKKwkJCXdoaWxlIChyb290LmdldFBhcmVudCgpICE9IG51bGwpIHsKKwkJCQlyb290ID0gcm9vdC5nZXRQYXJlbnQoKTsKKwkJCX0KKwkJCXJldHVybiByb290OworCQl9CisJCXB1YmxpYyBJVVJMRW50cnkgZ2V0VXBkYXRlRW50cnkoKSB7CisJCQlpbnQgbG9jYXRpb24gPSBJVXBkYXRlQ29uc3RhbnRzLlNFQVJDSF9ST09UOworCisJCQlpZiAocmVmIGluc3RhbmNlb2YgSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZSkKKwkJCQlsb2NhdGlvbiA9CisJCQkJCSgoSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZSkgcmVmKS5nZXRTZWFyY2hMb2NhdGlvbigpOworCQkJaWYgKHBhcmVudCA9PSBudWxsIHx8IGxvY2F0aW9uID09IElVcGRhdGVDb25zdGFudHMuU0VBUkNIX1NFTEYpIHsKKwkJCQlyZXR1cm4gZ2V0RmVhdHVyZShudWxsKS5nZXRVcGRhdGVTaXRlRW50cnkoKTsKKwkJCX0KKwkJCXJldHVybiBnZXRSb290KCkuZ2V0VXBkYXRlRW50cnkoKTsKKwkJfQorCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQkJcmV0dXJuIHJlZi50b1N0cmluZygpOworCQl9CisJCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgc291cmNlKSB7CisJCQlpZiAoc291cmNlIGluc3RhbmNlb2YgQ2FuZGlkYXRlKSB7CisJCQkJcmV0dXJuIHRoaXMucmVmLmVxdWFscygoKENhbmRpZGF0ZSkgc291cmNlKS5nZXRSZWZlcmVuY2UoKSk7CisJCQl9CisJCQlpZiAoc291cmNlIGluc3RhbmNlb2YgSUZlYXR1cmVSZWZlcmVuY2UpIHsKKwkJCQlyZXR1cm4gdGhpcy5yZWYuZXF1YWxzKHNvdXJjZSk7CisJCQl9CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJcHVibGljIHZvaWQgYWRkVG9GbGF0TGlzdChBcnJheUxpc3QgbGlzdCwgYm9vbGVhbiB1cGRhdGFibGVPbmx5KSB7CisJCQkvLyBhZGQgaXRzZWxmCisJCQlpZiAoIXVwZGF0YWJsZU9ubHkgfHwgaXNVcGRhdGFibGUoKSkKKwkJCQlsaXN0LmFkZCh0aGlzKTsKKwkJCS8vIGFkZCBjaGlsZHJlbgorCQkJaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLnNpemUoKTsgaSsrKSB7CisJCQkJCUNhbmRpZGF0ZSBjaGlsZCA9IChDYW5kaWRhdGUpIGNoaWxkcmVuLmdldChpKTsKKwkJCQkJY2hpbGQuYWRkVG9GbGF0TGlzdChsaXN0LCB1cGRhdGFibGVPbmx5KTsKKwkJCQl9CisJCQl9CisJCX0KKwkJcHVibGljIGJvb2xlYW4gaXNVcGRhdGFibGUoKSB7CisJCQlyZXR1cm4gKHBhcmVudCA9PSBudWxsKTsKKwkJfQorCX0KKworCXByaXZhdGUgc3RhdGljIGNsYXNzIEhpdCB7CisJCUlGZWF0dXJlUmVmZXJlbmNlIHJlZjsKKwkJSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIHBhdGNoRm9yOworCQlib29sZWFuIHBhdGNoOworCQlJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gam9iOworCQkKKwkJcHVibGljIEhpdChJRmVhdHVyZSBjYW5kaWRhdGUsIElGZWF0dXJlUmVmZXJlbmNlIHJlZikgeworCQkJdGhpcy5yZWYgPSByZWY7CisJCX0KKwkJcHVibGljIEhpdChJRmVhdHVyZSBjYW5kaWRhdGUsIElGZWF0dXJlUmVmZXJlbmNlIHJlZiwgYm9vbGVhbiBwYXRjaCkgeworCQkJdGhpcyhjYW5kaWRhdGUsIHJlZik7CisJCQl0aGlzLnBhdGNoID0gcGF0Y2g7CisJCX0KKworCQlwdWJsaWMgSGl0KElGZWF0dXJlIGNhbmRpZGF0ZSwgSUZlYXR1cmVSZWZlcmVuY2UgcmVmLCBJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gcGF0Y2hGb3IpIHsKKwkJCXRoaXMoY2FuZGlkYXRlLCByZWYsIHRydWUpOworCQkJdGhpcy5wYXRjaEZvciA9IHBhdGNoRm9yOworCQl9CisKKwkJcHVibGljIElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiBnZXRKb2IoKSB7CisJCQlpZiAoam9iID09IG51bGwpIHsKKwkJCQl0cnkgeworCQkJCQlJRmVhdHVyZSBmZWF0dXJlID0gcmVmLmdldEZlYXR1cmUobnVsbCk7CisJCQkJCWpvYiA9IE9wZXJhdGlvbnNNYW5hZ2VyLmdldE9wZXJhdGlvbkZhY3RvcnkoKS5jcmVhdGVJbnN0YWxsT3BlcmF0aW9uKG51bGwsIGZlYXR1cmUsIG51bGwsIG51bGwsIG51bGwpOworCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJCQlVcGRhdGVDb3JlLmxvZyhlKTsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gam9iOworCQl9CisKKwkJcHVibGljIGJvb2xlYW4gaXNQYXRjaCgpIHsKKwkJCXJldHVybiBwYXRjaDsKKwkJfQorCQlwdWJsaWMgSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIGdldFBhdGNoZWRKb2IoKSB7CisJCQlyZXR1cm4gcGF0Y2hGb3I7CisJCX0KKwl9CisKKwlwdWJsaWMgY2xhc3MgVXBkYXRlUXVlcnkgaW1wbGVtZW50cyBJVXBkYXRlU2VhcmNoUXVlcnkgeworCQlJRmVhdHVyZSBjYW5kaWRhdGU7CisJCUlRdWVyeVVwZGF0ZVNpdGVBZGFwdGVyIGFkYXB0ZXI7CisKKwkJcHVibGljIFVwZGF0ZVF1ZXJ5KAorCQkJSUZlYXR1cmUgY2FuZGlkYXRlLAorCQkJSVVSTEVudHJ5IHVwZGF0ZUVudHJ5KSB7CisJCQl0aGlzLmNhbmRpZGF0ZSA9IGNhbmRpZGF0ZTsKKwkJCWlmICh1cGRhdGVFbnRyeSAhPSBudWxsICYmIHVwZGF0ZUVudHJ5LmdldFVSTCgpICE9IG51bGwpCisJCQkJYWRhcHRlciA9CisJCQkJCW5ldyBRdWVyeVVwZGF0ZVNpdGVBZGFwdGVyKAorCQkJCQkJZ2V0TGFiZWxGb3JFbnRyeSh1cGRhdGVFbnRyeSksCisJCQkJCQl1cGRhdGVFbnRyeS5nZXRVUkwoKSwKKwkJCQkJCWNhbmRpZGF0ZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0SWRlbnRpZmllcigpKTsKKwkJfQorCQlwcml2YXRlIFN0cmluZyBnZXRMYWJlbEZvckVudHJ5KElVUkxFbnRyeSBlbnRyeSkgeworCQkJU3RyaW5nIGxhYmVsID0gZW50cnkuZ2V0QW5ub3RhdGlvbigpOworCQkJaWYgKGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCkKKwkJCQlsYWJlbCA9IGVudHJ5LmdldFVSTCgpLnRvU3RyaW5nKCk7CisJCQlyZXR1cm4gbGFiZWw7CisJCX0KKworCQlwdWJsaWMgSVF1ZXJ5VXBkYXRlU2l0ZUFkYXB0ZXIgZ2V0UXVlcnlTZWFyY2hTaXRlKCkgeworCQkJcmV0dXJuIGFkYXB0ZXI7CisJCX0KKwkJcHJpdmF0ZSBib29sZWFuIGlzQnJva2VuKCkgeworCQkJdHJ5IHsKKwkJCQlJU3RhdHVzIHN0YXR1cyA9CisJCQkJCVNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpLmdldEZlYXR1cmVTdGF0dXMoY2FuZGlkYXRlKTsKKwkJCQlyZXR1cm4gc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUjsKKwkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfQorCQlwcml2YXRlIGJvb2xlYW4gaXNNaXNzaW5nT3B0aW9uYWxDaGlsZHJlbihJRmVhdHVyZSBmZWF0dXJlKSB7CisJCQl0cnkgeworCQkJCUlJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VbXSBjaGlsZHJlbiA9CisJCQkJCWZlYXR1cmUuZ2V0SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpOworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKKwkJCQkJSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZSByZWYgPSBjaGlsZHJlbltpXTsKKwkJCQkJdHJ5IHsKKwkJCQkJCUlGZWF0dXJlIGNoaWxkID0gcmVmLmdldEZlYXR1cmUobnVsbCk7CisJCQkJCQkvLyBJZiB3ZSBhcmUgaGVyZSwgdGhlIGNoaWxkIGlzIG5vdCBtaXNzaW5nLgorCQkJCQkJLy8gQ2hlY2sgaXQncyBjaGlsZHJlbiByZWN1cnNpdmVseS4KKwkJCQkJCWlmIChpc01pc3NpbmdPcHRpb25hbENoaWxkcmVuKGNoaWxkKSkKKwkJCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkJCQkvLyBNaXNzaW5nIGNoaWxkLiBSZXR1cm4gdHJ1ZSBpZiBvcHRpb25hbCwKKwkJCQkJCS8vIG90aGVyd2lzZSBpdCBpcyBhIGJyb2tlbiBmZWF0dXJlIHRoYXQgd2UgCisJCQkJCQkvLyBkbyBub3QgY2FyZSBhYm91dC4KKwkJCQkJCWlmIChyZWYuaXNPcHRpb25hbCgpKSB7CisJCQkJCQkJcmV0dXJuIEZlYXR1cmVIaWVyYXJjaHlFbGVtZW50Lmhhc09sZGVyVmVyc2lvbihyZWYpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQl9CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJcHVibGljIHZvaWQgcnVuKAorCQkJSVNpdGUgc2l0ZSwKKwkJCVN0cmluZ1tdIGNhdGVnb3JpZXNUb1NraXAsCisJCQlJVXBkYXRlU2VhcmNoRmlsdGVyIGZpbHRlciwKKwkJCUlVcGRhdGVTZWFyY2hSZXN1bHRDb2xsZWN0b3IgY29sbGVjdG9yLAorCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJCQlBcnJheUxpc3QgaGl0cyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJCWJvb2xlYW4gYnJva2VuID0gaXNCcm9rZW4oKTsKKwkJCWJvb2xlYW4gbWlzc2luZ09wdGlvbmFsQ2hpbGRyZW4gPSBmYWxzZTsKKworCQkJLy8gRG9uJ3QgYm90aGVyIHRvIGNvbXB1dGUgbWlzc2luZyBvcHRpb25hbCBjaGlsZHJlbgorCQkJLy8gaWYgdGhlIGZlYXR1cmUgaXMgYnJva2VuIC0gYWxsIHdlIHdhbnQgaXMgdG8gCisJCQkvLyBzZWUgaWYgd2Ugc2hvdWxkIGFsbG93IHNhbWUtdmVyc2lvbiByZS1pbnN0YWxsLgorCQkJaWYgKCFicm9rZW4pCisJCQkJbWlzc2luZ09wdGlvbmFsQ2hpbGRyZW4gPSBpc01pc3NpbmdPcHRpb25hbENoaWxkcmVuKGNhbmRpZGF0ZSk7CisJCQlJU2l0ZUZlYXR1cmVSZWZlcmVuY2VbXSByZWZzID0gc2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpOworCQkJbW9uaXRvci5iZWdpblRhc2soIiIsIHJlZnMubGVuZ3RoICsgMSk7IC8vJE5PTi1OTFMtMSQKKwkJCUFycmF5TGlzdCB1cGRhdGVKb2JzID0gbmV3IEFycmF5TGlzdCgpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZzLmxlbmd0aDsgaSsrKSB7CisJCQkJSVNpdGVGZWF0dXJlUmVmZXJlbmNlIHJlZiA9IHJlZnNbaV07CisJCQkJdHJ5IHsKKwkJCQkJaWYgKGlzTmV3ZXJWZXJzaW9uKGNhbmRpZGF0ZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkscmVmLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSkpIHsKKwkJCQkJCUhpdCBoID0gbmV3IEhpdChjYW5kaWRhdGUsIHJlZik7CisJCQkJCQloaXRzLmFkZChoKTsKKwkJCQkJCUlJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiBqb2IgPSBoLmdldEpvYigpOworCQkJCQkJaWYgKGpvYiAhPSBudWxsKQorCQkJCQkJCXVwZGF0ZUpvYnMuYWRkKGpvYik7CisJCQkJCX0gZWxzZSB7CisJCQkJCQkvLyBhY2NlcHQgdGhlIHNhbWUgZmVhdHVyZSBpZiB0aGUgaW5zdGFsbGVkCisJCQkJCQkvLyBmZWF0dXJlIGlzIGJyb2tlbgorCQkJCQkJaWYgKChicm9rZW4gfHwgbWlzc2luZ09wdGlvbmFsQ2hpbGRyZW4pCisJCQkJCQkJJiYgY2FuZGlkYXRlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5lcXVhbHMoCisJCQkJCQkJCXJlZi5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkpKXsKKwkJCQkJCQloaXRzLmFkZChuZXcgSGl0KGNhbmRpZGF0ZSwgcmVmKSk7CisJCQkJCQkJY29udGludWU7CisJCQkJCQl9CisJCQkJCQllbHNlIHsKKwkJCQkJCQkvLyBjaGVjayBmb3IgcGF0Y2hlcworCQkJCQkJCWlmIChpc1BhdGNoKGNhbmRpZGF0ZSwgcmVmKSl7CisJCQkJCQkJCWhpdHMuYWRkKG5ldyBIaXQoY2FuZGlkYXRlLCByZWYsIHRydWUpKTsKKwkJCQkJCQkJY29udGludWU7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkJfQorCQkJCW1vbml0b3Iud29ya2VkKDEpOworCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSl7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQkJCisJCQl9CisJCQkvLyBhY2NlcHQgcGF0Y2hlcyBmb3IgdXBkYXRlZCBmZWF0dXJlcworCQkJZm9yIChpbnQgbiA9IDA7IG4gPCB1cGRhdGVKb2JzLnNpemUoKTsgbisrKSB7CisJCQkJSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIGpvYiA9IChJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24pIHVwZGF0ZUpvYnMKKwkJCQkJCS5nZXQobik7CisJCQkJCUlGZWF0dXJlIG5ld0NhbmRpZGF0ZSA9IGpvYi5nZXRGZWF0dXJlKCk7CisJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmcy5sZW5ndGg7IGkrKykgeworCQkJCQkJSVNpdGVGZWF0dXJlUmVmZXJlbmNlIHJlZiA9IHJlZnNbaV07CisJCQkJCQlpZiAoaXNQYXRjaChuZXdDYW5kaWRhdGUsIHJlZikpIHsKKwkJCQkJCQlIaXQgaCA9IG5ldyBIaXQobmV3Q2FuZGlkYXRlLCByZWYsIGpvYik7CisJCQkJCQkJaGl0cy5hZGQoaCk7CisJCQkJCQkJY29udGludWU7CisJCQkJCQl9CisJCQkJCQkvL21vbml0b3Iud29ya2VkKDEpOworCQkJCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7CisJCQkJCQkJcmV0dXJuOworCQkJCQkJfQorCQkJCQl9CisJCQl9CisJCQlpZiAoaGl0cy5zaXplKCkgPiAwKSB7CisJCQkJY29sbGVjdFZhbGlkSGl0cyhoaXRzLCBmaWx0ZXIsIGNvbGxlY3Rvcik7CisJCQl9CisJCQltb25pdG9yLndvcmtlZCgxKTsKKwkJCW1vbml0b3IuZG9uZSgpOworCQl9CisJCQorCQkvKioKKwkJICogUmV0dXJucyBJRmVhdHVyZSBhc3NvY2lhdGVkIHdpdGggdGhlIElVcGRhdGVTZWFyY2hRdWVyeQorCQkgKi8KKwkJcHVibGljIElGZWF0dXJlIGdldEZlYXR1cmUoKSB7CisJCQlyZXR1cm4gY2FuZGlkYXRlOworCQl9CisJfQorCisJcHJpdmF0ZSBBcnJheUxpc3QgY2FuZGlkYXRlczsKKworCXB1YmxpYyBVcGRhdGVzU2VhcmNoQ2F0ZWdvcnkoKSB7CisJCXRoaXModHJ1ZSk7CisJfQorCQorCXB1YmxpYyBVcGRhdGVzU2VhcmNoQ2F0ZWdvcnkoYm9vbGVhbiBhdXRvbWF0aWMpIHsKKwkJc3VwZXIoQ0FURUdPUllfSUQpOworCQl0aGlzLmF1dG9tYXRpYyA9IGF1dG9tYXRpYzsKKwl9CisKKwlwcml2YXRlIHZvaWQgY29sbGVjdFZhbGlkSGl0cygKKwkJQXJyYXlMaXN0IGhpdHMsCisJCUlVcGRhdGVTZWFyY2hGaWx0ZXIgZmlsdGVyLAorCQlJVXBkYXRlU2VhcmNoUmVzdWx0Q29sbGVjdG9yIGNvbGxlY3RvcikgeworCQkvL09iamVjdFtdIGFycmF5ID0gaGl0cy50b0FycmF5KCk7CisJCUlGZWF0dXJlIHRvcEhpdCA9IG51bGw7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgaGl0cy5zaXplKCk7IGkrKykgeworCQkJSGl0IGhpdCA9IChIaXQpIGhpdHMuZ2V0KGkpOworCQkJSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIGpvYiA9IGhpdC5nZXRKb2IoKTsKKwkJCWlmIChqb2IgPT0gbnVsbCkKKwkJCQljb250aW51ZTsKKwkJCS8vIGRvIG5vdCBhY2NlcHQgdXBkYXRlcyB3aXRob3V0IGEgbGljZW5zZQorCQkJaWYgKCFVcGRhdGVVdGlscy5oYXNMaWNlbnNlKGpvYi5nZXRGZWF0dXJlKCkpKSB7CisJCQkJVXBkYXRlQ29yZS5sb2coam9iLmdldEZlYXR1cmUoKS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkgKyAiOiAiICsgTWVzc2FnZXMuRGVmYXVsdEZlYXR1cmVQYXJzZXJfTm9MaWNlbnNlVGV4dCwgbnVsbCk7ICAvLyROT04tTkxTLTEkCisJCQkJY29udGludWU7CisJCQl9CisJCQlJU3RhdHVzIHN0YXR1cyA9IG51bGw7CisJCQkKKwkJCS8vIEZpeCBmb3IgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzMjQ1MAorCQkJLy8gT25seSB2YWxpZGF0ZSBmb3IgYXV0b21hdGljIHVwZGF0ZXMgYmVjYXVzZQorCQkJLy8gbm9uLWF1dG9tYXRpYyBvbmNlIHdpbGwgYXJyaXZlIGluIHRoZSByZXZpZXcgd2l6YXJkCisJCQkvLyB3aGVyZSBhZGRpdGlvbmFsIHZhbGlkYXRpb24gd2lsbCBiZSBwZXJmb3JtZWQKKwkJCWlmIChhdXRvbWF0aWMpIHsKKwkJCQlpZiggaGl0LmdldFBhdGNoZWRKb2IoKT09bnVsbCl7CisJCQkJCXN0YXR1cyA9IE9wZXJhdGlvbnNNYW5hZ2VyLmdldFZhbGlkYXRvcigpLnZhbGlkYXRlUGVuZGluZ0luc3RhbGwoam9iLmdldE9sZEZlYXR1cmUoKSwgam9iLmdldEZlYXR1cmUoKSk7CisJCQkJfWVsc2V7CisJCQkJCXN0YXR1cyA9IE9wZXJhdGlvbnNNYW5hZ2VyLmdldFZhbGlkYXRvcigpLnZhbGlkYXRlUGVuZGluZ0NoYW5nZXMobmV3IElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbltde2hpdC5nZXRQYXRjaGVkSm9iKCksIGpvYn0pOworCQkJCX0KKwkJCX0KKwkJCWlmIChzdGF0dXMgPT0gbnVsbCB8fCBzdGF0dXMuZ2V0Q29kZSgpID09IElTdGF0dXMuV0FSTklORykgeworCQkJCWlmIChoaXQuaXNQYXRjaCgpKSB7CisJCQkJCUlGZWF0dXJlIHBhdGNoID0gam9iLmdldEZlYXR1cmUoKTsKKwkJCQkJLy8gRG8gbm90IGFkZCB0aGUgcGF0Y2ggaWYgYWxyZWFkeSBpbnN0YWxsZWQKKwkJCQkJSUZlYXR1cmVbXSBzYW1lSWQgPSBVcGRhdGVVdGlscy5nZXRJbnN0YWxsZWRGZWF0dXJlcyhwYXRjaCwgZmFsc2UpOworCQkJCQlpZiAoc2FtZUlkLmxlbmd0aD09MCkgeworCQkJCQkJaWYgKGZpbHRlci5hY2NlcHQocGF0Y2gpKQorCQkJCQkJCWNvbGxlY3Rvci5hY2NlcHQocGF0Y2gpOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgIHsKKwkJCQkJdG9wSGl0ID0gam9iLmdldEZlYXR1cmUoKTsKKwkJCQkJaWYgKGZpbHRlci5hY2NlcHQodG9wSGl0KSkKKwkJCQkJCWNvbGxlY3Rvci5hY2NlcHQodG9wSGl0KTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgpIHsKKwkJY2FuZGlkYXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJdHJ5IHsKKwkJCUlMb2NhbFNpdGUgbG9jYWxTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7CisJCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnID0gbG9jYWxTaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCk7CisJCQlJQ29uZmlndXJlZFNpdGVbXSBpc2l0ZXMgPSBjb25maWcuZ2V0Q29uZmlndXJlZFNpdGVzKCk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGlzaXRlcy5sZW5ndGg7IGkrKykgeworCQkJCWNvbnRyaWJ1dGVDYW5kaWRhdGVzKGlzaXRlc1tpXSk7CisJCQl9CisJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJVXBkYXRlQ29yZS5sb2coCisJCQkJTWVzc2FnZXMuVXBkYXRlc1NlYXJjaENhdGVnb3J5X2Vycm9yU2VhcmNoaW5nRm9yVXBkYXRlcywgCisJCQkJZSk7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgY29udHJpYnV0ZUNhbmRpZGF0ZXMoSUNvbmZpZ3VyZWRTaXRlIGlzaXRlKQorCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCUlGZWF0dXJlUmVmZXJlbmNlW10gcmVmcyA9IGlzaXRlLmdldENvbmZpZ3VyZWRGZWF0dXJlcygpOworCQlBcnJheUxpc3QgY2FuZGlkYXRlc1BlclNpdGUgPSBuZXcgQXJyYXlMaXN0KCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmcy5sZW5ndGg7IGkrKykgeworCQkJSUZlYXR1cmVSZWZlcmVuY2UgcmVmID0gcmVmc1tpXTsKKwkJCS8vIERvbid0IHdhc3RlIHRpbWUgc2VhcmNoaW5nIGZvciB1cGRhdGVzIHRvIAorCQkJLy8gcGF0Y2hlcy4KKwkJCXRyeSB7CisJCQkJaWYgKFVwZGF0ZVV0aWxzLmlzUGF0Y2gocmVmLmdldEZlYXR1cmUobnVsbCkpKQorCQkJCQljb250aW51ZTsKKwkJCX0KKwkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCUNhbmRpZGF0ZSBjID0gbmV3IENhbmRpZGF0ZShyZWYpOworCQkJY2FuZGlkYXRlc1BlclNpdGUuYWRkKGMpOworCQl9CisJCS8vIENyZWF0ZSBhIHRyZWUgZnJvbSBhIGZsYXQgbGlzdAorCQlidWlsZEhpZXJhcmNoeShjYW5kaWRhdGVzUGVyU2l0ZSk7CisJCS8vIEFkZCB0aGUgcmVtYWluaW5nIHJvb3QgY2FuZGlkYXRlcyB0byAKKwkJLy8gdGhlIGdsb2JhbCBsaXN0IG9mIGNhbmRpZGF0ZXMuCisJCWNhbmRpZGF0ZXMuYWRkQWxsKGNhbmRpZGF0ZXNQZXJTaXRlKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgYnVpbGRIaWVyYXJjaHkoQXJyYXlMaXN0IGNhbmRpZGF0ZXMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJQ2FuZGlkYXRlW10gYXJyYXkgPQorCQkJKENhbmRpZGF0ZVtdKSBjYW5kaWRhdGVzLnRvQXJyYXkobmV3IENhbmRpZGF0ZVtjYW5kaWRhdGVzLnNpemUoKV0pOworCQkvLyBmaWx0ZXIgb3V0IGluY2x1ZGVkIGZlYXR1cmVzIHNvIHRoYXQgb25seSB0b3AtbGV2ZWwgZmVhdHVyZXMgcmVtYWluIG9uIHRoZSBsaXN0CisJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHsKKwkJCUNhbmRpZGF0ZSBwYXJlbnQgPSBhcnJheVtpXTsKKwkJCUlGZWF0dXJlIGZlYXR1cmUgPSBwYXJlbnQuZ2V0RmVhdHVyZShudWxsKTsKKwkJCUlGZWF0dXJlUmVmZXJlbmNlW10gaW5jbHVkZWQgPQorCQkJCWZlYXR1cmUuZ2V0SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpOworCQkJZm9yIChpbnQgaiA9IDA7IGogPCBpbmNsdWRlZC5sZW5ndGg7IGorKykgeworCQkJCUlGZWF0dXJlUmVmZXJlbmNlIGZyZWYgPSBpbmNsdWRlZFtqXTsKKwkJCQlDYW5kaWRhdGUgY2hpbGQgPSBmaW5kQ2FuZGlkYXRlKGNhbmRpZGF0ZXMsIGZyZWYpOworCQkJCWlmIChjaGlsZCAhPSBudWxsKSB7CisJCQkJCXBhcmVudC5hZGQoY2hpbGQpOworCQkJCQljaGlsZC5zZXRSZWZlcmVuY2UoZnJlZik7CisJCQkJCWNhbmRpZGF0ZXMucmVtb3ZlKGNoaWxkKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJcHJpdmF0ZSBDYW5kaWRhdGUgZmluZENhbmRpZGF0ZShBcnJheUxpc3QgbGlzdCwgSUZlYXR1cmVSZWZlcmVuY2UgcmVmKSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgeworCQkJQ2FuZGlkYXRlIGMgPSAoQ2FuZGlkYXRlKSBsaXN0LmdldChpKTsKKwkJCWlmIChjLnJlZi5lcXVhbHMocmVmKSkKKwkJCQlyZXR1cm4gYzsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgSVVwZGF0ZVNlYXJjaFF1ZXJ5W10gZ2V0UXVlcmllcygpIHsKKwkJaW5pdGlhbGl6ZSgpOworCQlBcnJheUxpc3QgYWxsQ2FuZGlkYXRlcyA9IGdldEFsbENhbmRpZGF0ZXMoKTsKKworCQlJVXBkYXRlU2VhcmNoUXVlcnlbXSBxdWVyaWVzID0KKwkJCW5ldyBJVXBkYXRlU2VhcmNoUXVlcnlbYWxsQ2FuZGlkYXRlcy5zaXplKCldOworCQlmb3IgKGludCBpID0gMDsgaSA8IHF1ZXJpZXMubGVuZ3RoOyBpKyspIHsKKwkJCUNhbmRpZGF0ZSBjYW5kaWRhdGUgPSAoQ2FuZGlkYXRlKSBhbGxDYW5kaWRhdGVzLmdldChpKTsKKwkJCUlGZWF0dXJlIGZlYXR1cmUgPSBjYW5kaWRhdGUuZ2V0RmVhdHVyZShudWxsKTsKKwkJCUlVUkxFbnRyeSB1cGRhdGVFbnRyeSA9IGNhbmRpZGF0ZS5nZXRVcGRhdGVFbnRyeSgpOworCQkJaWYgKGZlYXR1cmUgPT0gbnVsbCkgeworCQkJCXF1ZXJpZXNbaV0gPSBudWxsOworCQkJfSBlbHNlIHsKKwkJCQlxdWVyaWVzW2ldID0gbmV3IFVwZGF0ZVF1ZXJ5KGZlYXR1cmUsIHVwZGF0ZUVudHJ5KTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcXVlcmllczsKKwl9CisJCisvKioKKyAqIFNldHMgdGhlIGZlYXR1cmVzIGZvciB3aGljaCBuZXcgdXBkYXRlcyBuZWVkIHRvIGJlIGZvdW5kLiBJZgorICogbm90IHNldCwgdXBkYXRlcyB3aWxsIGJlIHNlYXJjaGVkIGZvciBhbGwgdGhlIGluc3RhbGxlZAorICogYW5kIGNvbmZpZ3VyZWQgZmVhdHVyZXMuCisgKiBAcGFyYW0gZmVhdHVyZXMgdGhlIGZlYXR1cmVzIHRvIHNlYXJjaCB1cGRhdGVzIGZvcgorICovCQorCXB1YmxpYyB2b2lkIHNldEZlYXR1cmVzKElGZWF0dXJlIFtdIGZlYXR1cmVzKSB7CisJCXRoaXMuZmVhdHVyZXMgPSBmZWF0dXJlczsKKwl9CisJCisvKioKKyAqIFJldHVybnMgYW4gYXJyYXkgb2YgZmVhdHVyZXMgZm9yIHdoaWNoIHVwZGF0ZXMgbmVlZCB0bworICogYmUgZm91bmQuIAorICogQHJldHVybiBhbiBhcnJheSBvZiBmZWF0dXJlcyBvciA8c2FtcD5udWxsPC9zYW1wPiBpZiBub3QKKyAqIHNldC4KKyAqLwkKKwlwdWJsaWMgSUZlYXR1cmUgW10gZ2V0RmVhdHVyZXMoKSB7CisJCXJldHVybiBmZWF0dXJlczsKKwl9CisJLyoqCisJICogQHBhcmFtIGZ2aQorCSAqIEBwYXJhbSBjdmkKKwkgKiBAcmV0dXJuIGZ2aSA8IGN2aQorCSAqLworCXByaXZhdGUgYm9vbGVhbiBpc05ld2VyVmVyc2lvbigKKwkJVmVyc2lvbmVkSWRlbnRpZmllciBmdmksCisJCVZlcnNpb25lZElkZW50aWZpZXIgY3ZpKSB7CisJCWlmICghZnZpLmdldElkZW50aWZpZXIoKS5lcXVhbHMoY3ZpLmdldElkZW50aWZpZXIoKSkpCisJCQlyZXR1cm4gZmFsc2U7CisJCVBsdWdpblZlcnNpb25JZGVudGlmaWVyIGZ2ID0gZnZpLmdldFZlcnNpb24oKTsKKwkJUGx1Z2luVmVyc2lvbklkZW50aWZpZXIgY3YgPSBjdmkuZ2V0VmVyc2lvbigpOworCQlTdHJpbmcgbW9kZSA9IGdldFVwZGF0ZVZlcnNpb25zTW9kZSgpOworCQlib29sZWFuIGdyZWF0ZXIgPSBjdi5pc0dyZWF0ZXJUaGFuKGZ2KTsKKwkJaWYgKCFncmVhdGVyKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAobW9kZS5lcXVhbHMoVXBkYXRlQ29yZS5FUVVJVkFMRU5UX1ZBTFVFKSkKKwkJCXJldHVybiBjdi5pc0VxdWl2YWxlbnRUbyhmdik7CisJCWVsc2UgaWYgKG1vZGUuZXF1YWxzKFVwZGF0ZUNvcmUuQ09NUEFUSUJMRV9WQUxVRSkpCisJCQlyZXR1cm4gY3YuaXNDb21wYXRpYmxlV2l0aChmdik7CisJCWVsc2UKKwkJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gaXNQYXRjaChJRmVhdHVyZSBjYW5kaWRhdGUsIElTaXRlRmVhdHVyZVJlZmVyZW5jZSByZWYpIHsKKwkJaWYgKHJlZi5pc1BhdGNoKCkgPT0gZmFsc2UpCisJCQlyZXR1cm4gZmFsc2U7CisJCXRyeSB7CisJCQlJRmVhdHVyZSBmZWF0dXJlID0gcmVmLmdldEZlYXR1cmUobnVsbCk7CisJCQlpZiggVXBkYXRlVXRpbHMuaXNQYXRjaChjYW5kaWRhdGUsIGZlYXR1cmUpKQorCQkJCXJldHVybiB0cnVlOworCQkJLy8gQ2hlY2sgaWYgcGF0Y2ggaXMgZm9yIGNoaWxkcmVuCisJCQl0cnkgeworCQkJCUlJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VbXSBjaGlsZHJlbiA9CisJCQkJCWNhbmRpZGF0ZS5nZXRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCk7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgeworCQkJCQlJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlIGNyZWYgPSBjaGlsZHJlbltpXTsKKwkJCQkJdHJ5IHsKKwkJCQkJCUlGZWF0dXJlIGNoaWxkID0gY3JlZi5nZXRGZWF0dXJlKG51bGwpOworCQkJCQkJaWYgKGlzUGF0Y2goY2hpbGQsIHJlZikpCisJCQkJCQkJcmV0dXJuIHRydWU7CisJCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJCQl9CisJCQkJfQorCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQl9CisJCQlyZXR1cm4gZmFsc2U7CisJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfQorCQorCXByaXZhdGUgU3RyaW5nIGdldFVwZGF0ZVZlcnNpb25zTW9kZSgpIHsKKwkJUHJlZmVyZW5jZXMgc3RvcmUgPSBVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7CisJCXJldHVybiBzdG9yZS5nZXRTdHJpbmcoVXBkYXRlQ29yZS5QX1VQREFURV9WRVJTSU9OUyk7CisJfQorLyoKKyAqIFRoaXMgbWV0aG9kIHJlY3Vyc2l2ZWx5IHdhbGtzIHRoZSBsaXN0IG9mIGNhbmRpZGF0ZXMKKyAqIGJ1aWxkaW5nIHRoZSBmbGF0IHRoYXQgc3RhcnRzIHdpdGggdGhlIHJvb3RzIGJ1dAorICogYWxzbyBpbmNsdWRlcyBhbGwgdGhlIGNoaWxkcmVuIHRoYXQgYXJlIHVwZGF0YWJsZQorICogKHVzZSAnaW5jbHVkZScgY2xhdXNlIHdpdGggYSBtYXRjaCB0aGF0IGlzIG5vdCAncGVyZmVjdCcpLgorICovCisJcHJpdmF0ZSBBcnJheUxpc3QgZ2V0QWxsQ2FuZGlkYXRlcygpIHsKKwkJQXJyYXlMaXN0IHNlbGVjdGVkID0gbmV3IEFycmF5TGlzdCgpOworCQlmb3IgKGludCBpPTA7IGk8Y2FuZGlkYXRlcy5zaXplKCk7IGkrKykgeworCQkJQ2FuZGlkYXRlIGMgPSAoQ2FuZGlkYXRlKWNhbmRpZGF0ZXMuZ2V0KGkpOworCQkJaWYgKGlzT25UaGVMaXN0KGMpKQorCQkJCWMuYWRkVG9GbGF0TGlzdChzZWxlY3RlZCwgdHJ1ZSk7CisJCX0KKwkJcmV0dXJuIHNlbGVjdGVkOworCX0KKwkKKwlwcml2YXRlIGJvb2xlYW4gaXNPblRoZUxpc3QoQ2FuZGlkYXRlIGMpIHsKKwkJaWYgKGZlYXR1cmVzPT1udWxsKSByZXR1cm4gdHJ1ZTsKKwkJVmVyc2lvbmVkSWRlbnRpZmllciB2aWQ7CisJCXRyeSB7CisJCQl2aWQgPSBjLmdldFJlZmVyZW5jZSgpLmdldFZlcnNpb25lZElkZW50aWZpZXIoKTsKKwkJfQorCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJZm9yIChpbnQgaT0wOyBpPGZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7CisJCQlJRmVhdHVyZSBmZWF0dXJlID0gZmVhdHVyZXNbaV07CisJCQlWZXJzaW9uZWRJZGVudGlmaWVyIGZ2aWQgPSBmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKTsKKwkJCWlmIChmdmlkLmVxdWFscyh2aWQpKQorCQkJCXJldHVybiB0cnVlOworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zZWN1cml0eS9DZXJ0aWZpY2F0ZVBhaXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NlY3VyaXR5L0NlcnRpZmljYXRlUGFpci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliMGM0YzEKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zZWN1cml0eS9DZXJ0aWZpY2F0ZVBhaXIuamF2YQpAQCAtMCwwICsxLDczIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuc2VjdXJpdHk7CisgCisgaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC4qOworIAorLyoqCisgKgorICovCitwdWJsaWMgY2xhc3MgQ2VydGlmaWNhdGVQYWlyIHsKKwlwcml2YXRlIENlcnRpZmljYXRlIHJvb3Q7CisJcHJpdmF0ZSBDZXJ0aWZpY2F0ZSBpc3N1ZXI7CisJCisJCisKKwkvKioKKwkgKiBHZXRzIHRoZSByb290LgorCSAqIEByZXR1cm4gUmV0dXJucyBhIENlcnRpZmljYXRlCisJICovCisJcHVibGljIENlcnRpZmljYXRlIGdldFJvb3QoKSB7CisJCXJldHVybiByb290OworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHJvb3QuCisJICogQHBhcmFtIHJvb3QgVGhlIHJvb3QgdG8gc2V0CisJICovCisJcHVibGljIHZvaWQgc2V0Um9vdChDZXJ0aWZpY2F0ZSByb290KSB7CisJCXRoaXMucm9vdCA9IHJvb3Q7CisJfQorCisJLyoqCisJICogR2V0cyB0aGUgaXNzdWVyLgorCSAqIEByZXR1cm4gUmV0dXJucyBhIENlcnRpZmljYXRlCisJICovCisJcHVibGljIENlcnRpZmljYXRlIGdldElzc3VlcigpIHsKKwkJcmV0dXJuIGlzc3VlcjsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSBpc3N1ZXIuCisJICogQHBhcmFtIGlzc3VlciBUaGUgaXNzdWVyIHRvIHNldAorCSAqLworCXB1YmxpYyB2b2lkIHNldElzc3VlcihDZXJ0aWZpY2F0ZSBpc3N1ZXIpIHsKKwkJdGhpcy5pc3N1ZXIgPSBpc3N1ZXI7CisJfQorCisJLyoKKwkgKiBAc2VlIE9iamVjdCNlcXVhbHMoT2JqZWN0KQorCSAqLworCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisJCQorCQlpZiAob2JqPT1udWxsKSByZXR1cm4gZmFsc2U7CisJCQorCQlpZiAoIShvYmogaW5zdGFuY2VvZiBDZXJ0aWZpY2F0ZVBhaXIpKSByZXR1cm4gZmFsc2U7CisJCQorCQlpZiAocm9vdD09bnVsbCB8fCBpc3N1ZXI9PW51bGwpIHJldHVybiBmYWxzZTsKKwkJCisJCUNlcnRpZmljYXRlUGFpciBwYWlyID0gKENlcnRpZmljYXRlUGFpcilvYmo7CisJCQorCQlyZXR1cm4gKHJvb3QuZXF1YWxzKHBhaXIuZ2V0Um9vdCgpKSAmJiBpc3N1ZXIuZXF1YWxzKHBhaXIuZ2V0SXNzdWVyKCkpKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NlY3VyaXR5L0phclZlcmlmaWNhdGlvblJlc3VsdC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2VjdXJpdHkvSmFyVmVyaWZpY2F0aW9uUmVzdWx0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc0MDZmNwotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NlY3VyaXR5L0phclZlcmlmaWNhdGlvblJlc3VsdC5qYXZhCkBAIC0wLDAgKzEsMzM0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnNlY3VyaXR5OworCitpbXBvcnQgamF2YS5zZWN1cml0eS4qOworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC4qOworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZTsKK2ltcG9ydCBqYXZhLnRleHQuRGF0ZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5NZXNzYWdlczsKKworLyoqCisgKiBSZXN1bHQgb2YgdGhlIHNlcnZpY2UKKyAqLworcHVibGljIGNsYXNzIEphclZlcmlmaWNhdGlvblJlc3VsdCBpbXBsZW1lbnRzIElWZXJpZmljYXRpb25SZXN1bHQgeworCisKKwlwcml2YXRlIGludCByZXN1bHRDb2RlOworCXByaXZhdGUgaW50IHZlcmlmaWNhdGlvbkNvZGU7CisJcHJpdmF0ZSBFeGNlcHRpb24gcmVzdWx0RXhjZXB0aW9uOworCXByaXZhdGUgTGlzdCAvKm9mIENlcnRpZmljYXRlc1tdICovCisJY2VydGlmaWNhdGVzOworCXByaXZhdGUgQ2VydGlmaWNhdGVQYWlyW10gcm9vdENlcnRpZmljYXRlczsKKwlwcml2YXRlIENlcnRpZmljYXRlUGFpciBmb3VuZENlcnRpZmljYXRlOyAvLyBjZXJ0aWZpY2F0ZSBmb3VuZCBpbiBvbmUga2V5c3RvcmUKKwkKKwlwcml2YXRlIFN0cmluZyBzaWduZXJJbmZvOworCXByaXZhdGUgU3RyaW5nIHZlcmlmaWVySW5mbzsKKwlwcml2YXRlIENvbnRlbnRSZWZlcmVuY2UgY29udGVudFJlZmVyZW5jZTsKKwlwcml2YXRlIElGZWF0dXJlIGZlYXR1cmU7CisJcHJpdmF0ZSBib29sZWFuIGZlYXR1cmVWZXJpZmljYXRpb247CisJcHJpdmF0ZSBib29sZWFuIGFscmVhZHlTZWVuOworCisJcHVibGljIEphclZlcmlmaWNhdGlvblJlc3VsdCgpIHsKKwl9CisJCisJLyoKKwkgKiAKKwkgKi8KKwlwdWJsaWMgaW50IGdldFJlc3VsdENvZGUoKSB7CisJCXJldHVybiByZXN1bHRDb2RlOworCX0KKwkKKwkvKgorCSAqIAorCSAqLworCXB1YmxpYyBFeGNlcHRpb24gZ2V0VmVyaWZpY2F0aW9uRXhjZXB0aW9uKCkgeworCQlyZXR1cm4gcmVzdWx0RXhjZXB0aW9uOworCX0KKwkKKwkvKgorCSAqIAorCSAqLworCXB1YmxpYyB2b2lkIHNldFJlc3VsdENvZGUoaW50IG5ld1Jlc3VsdENvZGUpIHsKKwkJcmVzdWx0Q29kZSA9IG5ld1Jlc3VsdENvZGU7CisJfQorCQorCS8qCisJICogCisJICovCisJcHVibGljIHZvaWQgc2V0UmVzdWx0RXhjZXB0aW9uKEV4Y2VwdGlvbiBuZXdSZXN1bHRFeGNlcHRpb24pIHsKKwkJcmVzdWx0RXhjZXB0aW9uID0gbmV3UmVzdWx0RXhjZXB0aW9uOworCX0KKwkKKwkvKgorCSAqIAorCSAqLworCXB1YmxpYyBpbnQgZ2V0VmVyaWZpY2F0aW9uQ29kZSgpIHsKKwkJcmV0dXJuIHZlcmlmaWNhdGlvbkNvZGU7CisJfQorCisJLyoKKwkgKiAKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRWZXJpZmljYXRpb25Db2RlKGludCB2ZXJpZmljYXRpb25Db2RlKSB7CisJCXRoaXMudmVyaWZpY2F0aW9uQ29kZSA9IHZlcmlmaWNhdGlvbkNvZGU7CisJfQorCisJLyoKKwkgKiBhZGRzIGFuIGFycmF5IG9mIENlcnRpZmljYXRlcyB0byB0aGUgbGlzdAorCSAqIGZvcmNlIHJlY29tcHV0YXRpb24gb2Ygcm9vdCBjZXJ0CisJICovCisJcHVibGljIHZvaWQgYWRkQ2VydGlmaWNhdGVzKENlcnRpZmljYXRlW10gY2VydHMpIHsKKwkJaWYgKGNlcnRpZmljYXRlcyA9PSBudWxsKQorCQkJY2VydGlmaWNhdGVzID0gbmV3IEFycmF5TGlzdCgpOworCQljZXJ0aWZpY2F0ZXMuYWRkKGNlcnRzKTsKKwkJcm9vdENlcnRpZmljYXRlcyA9IG51bGw7CisJfQorCisJLyoKKwkgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIHJvb3QgY2VydGlmaWNhdGVzCisJICogVGhlIGxpc3Qgb2YgY2VydGlmaWNhdGVzIHdlIHJlY2VpdmVkIGlzIGFuIGFycmF5IG9mIGNlcnRpZmljYXRlcworCSAqIHdlIGhhdmUgdG8gZGV0ZXJtaW5lIAorCSAqIDEpIGhvdyBtYW55IGNoYWluIGRvIHdlIGhhdmUgKGEgY2hhaW4gc3RvcHMgd2hlbiB2ZXJpZmllciBvZiBhIGNlcnQgaXMgCisJICogbm90IHRoZSBzaWduZXIgb2YgdGhlIG5leHQgY2VydCBpbiB0aGUgbGlzdCAKKwkgKiAyKSBidWlsZCBhIGNlcnQgd2l0aCB0aGUgbGVhZiBzaWduZXIgYW5kIHRoZSByb290IHZlcmlmaWVyIGZvciBlYWNoIGNoYWluCisJICovCisJcHVibGljIENlcnRpZmljYXRlUGFpcltdIGdldFJvb3RDZXJ0aWZpY2F0ZXMoKSB7CisJCWlmIChyb290Q2VydGlmaWNhdGVzID09IG51bGwpIHsKKwkJCXJvb3RDZXJ0aWZpY2F0ZXMgPSBuZXcgQ2VydGlmaWNhdGVQYWlyWzBdOwkJCQorCQkJTGlzdCByb290Q2VydGlmaWNhdGVzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKwkJCWlmIChjZXJ0aWZpY2F0ZXMgIT0gbnVsbCAmJiBjZXJ0aWZpY2F0ZXMuc2l6ZSgpID4gMCkgeworCQkJCUl0ZXJhdG9yIGl0ZXIgPSBjZXJ0aWZpY2F0ZXMuaXRlcmF0b3IoKTsKKwkJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKworCQkJCQlDZXJ0aWZpY2F0ZVtdIGNlcnRzID0gKENlcnRpZmljYXRlW10pIGl0ZXIubmV4dCgpOworCQkJCQlpZiAoY2VydHMgIT0gbnVsbCAmJiBjZXJ0cy5sZW5ndGggPiAwKSB7CisKKwkJCQkJCUNlcnRpZmljYXRlUGFpciBwYWlyID0gbmV3IENlcnRpZmljYXRlUGFpcigpOworCQkJCQkJcGFpci5zZXRJc3N1ZXIoY2VydHNbMF0pOworCisJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNlcnRzLmxlbmd0aCAtIDE7IGkrKykgeworCQkJCQkJCVg1MDlDZXJ0aWZpY2F0ZSB4NTA5Y2VydFJvb3QgPSAoWDUwOUNlcnRpZmljYXRlKSBjZXJ0c1tpXTsKKwkJCQkJCQlYNTA5Q2VydGlmaWNhdGUgeDUwOWNlcnRJc3N1ZXIgPSAoWDUwOUNlcnRpZmljYXRlKSBjZXJ0c1tpKzFdOworCQkJCQkJCWlmICgheDUwOWNlcnRSb290LmdldElzc3VlckROKCkuZXF1YWxzKHg1MDljZXJ0SXNzdWVyLmdldFN1YmplY3RETigpKSkgeworCQkJCQkJCQlwYWlyLnNldFJvb3QoeDUwOWNlcnRSb290KTsKKwkJCQkJCQkJaWYgKCFyb290Q2VydGlmaWNhdGVzTGlzdC5jb250YWlucyhwYWlyKSkgeworCQkJCQkJCQkJcm9vdENlcnRpZmljYXRlc0xpc3QuYWRkKHBhaXIpOworCQkJCQkJCQl9CisJCQkJCQkJCXBhaXIgPSBuZXcgQ2VydGlmaWNhdGVQYWlyKCk7CisJCQkJCQkJCXBhaXIuc2V0SXNzdWVyKHg1MDljZXJ0SXNzdWVyKTsKKwkJCQkJCQl9CisJCQkJCQl9CisKKwkJCQkJCS8vIGFkZCB0aGUgbGF0ZXN0IG9uZQorCQkJCQkJaWYgKHBhaXIgIT0gbnVsbCkgeworCQkJCQkJCXBhaXIuc2V0Um9vdChjZXJ0c1tjZXJ0cy5sZW5ndGggLSAxXSk7CisJCQkJCQkJaWYgKCFyb290Q2VydGlmaWNhdGVzTGlzdC5jb250YWlucyhwYWlyKSkgeworCQkJCQkJCQlyb290Q2VydGlmaWNhdGVzTGlzdC5hZGQocGFpcik7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCisJCQl9CisJCQkKKwkJCWlmIChyb290Q2VydGlmaWNhdGVzTGlzdC5zaXplKCkgPiAwKSB7CisJCQkJcm9vdENlcnRpZmljYXRlcyA9IG5ldyBDZXJ0aWZpY2F0ZVBhaXJbcm9vdENlcnRpZmljYXRlc0xpc3Quc2l6ZSgpXTsJCQkJCisJCQkJcm9vdENlcnRpZmljYXRlc0xpc3QudG9BcnJheShyb290Q2VydGlmaWNhdGVzKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcm9vdENlcnRpZmljYXRlczsKKwl9CisKKwkvKgorCSAqIAorCSAqLworCXByaXZhdGUgQ2VydGlmaWNhdGVQYWlyIGdldEZvdW5kQ2VydGlmaWNhdGUoKSB7CisJCXJldHVybiBmb3VuZENlcnRpZmljYXRlOworCX0KKworCS8qCisJICogCisJICovCisJcHVibGljIHZvaWQgc2V0Rm91bmRDZXJ0aWZpY2F0ZShDZXJ0aWZpY2F0ZVBhaXIgZm91bmRDZXJ0aWZpY2F0ZSkgeworCQl0aGlzLmZvdW5kQ2VydGlmaWNhdGUgPSBmb3VuZENlcnRpZmljYXRlOworCX0KKworCisJLyoKKwkgKiBJbml0aWFsaXplcyB0aGUgc2lnbmVySW5mbyBhbmQgdGhlIFZlcmlmaWVySW5mbyBmcm9tIHRoZSBDZXJ0aWZpY2F0ZSBQYWlyCisJICovCisJcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVDZXJ0aWZpY2F0ZXMoKXsKKwkJWDUwOUNlcnRpZmljYXRlIGNlcnRSb290ID0gbnVsbDsKKwkJWDUwOUNlcnRpZmljYXRlIGNlcnRJc3N1ZXIgPSBudWxsOworCQlDZXJ0aWZpY2F0ZVBhaXIgdHJ1c3RlZENlcnRpZmljYXRlOworCQlpZiAoZ2V0Rm91bmRDZXJ0aWZpY2F0ZSgpID09IG51bGwpIHsKKwkJCUNlcnRpZmljYXRlUGFpcltdIGNlcnRzID0gZ2V0Um9vdENlcnRpZmljYXRlcygpOworCQkJaWYgKGNlcnRzLmxlbmd0aCA9PSAwKQorCQkJCXJldHVybjsKKwkJCXRydXN0ZWRDZXJ0aWZpY2F0ZSA9IGNlcnRzWzBdOworCQl9IGVsc2UgeworCQkJdHJ1c3RlZENlcnRpZmljYXRlID0gZ2V0Rm91bmRDZXJ0aWZpY2F0ZSgpOworCQl9CisJCWNlcnRSb290ID0gKFg1MDlDZXJ0aWZpY2F0ZSkgdHJ1c3RlZENlcnRpZmljYXRlLmdldFJvb3QoKTsKKwkJY2VydElzc3VlciA9IChYNTA5Q2VydGlmaWNhdGUpIHRydXN0ZWRDZXJ0aWZpY2F0ZS5nZXRJc3N1ZXIoKTsKKworCQlTdHJpbmdCdWZmZXIgc3RyYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJc3RyYi5hcHBlbmQoaXNzdWVyU3RyaW5nKGNlcnRJc3N1ZXIuZ2V0U3ViamVjdEROKCkpKTsKKwkJc3RyYi5hcHBlbmQoIlxyXG4iKTsgLy8kTk9OLU5MUy0xJAorCQlzdHJiLmFwcGVuZChOTFMuYmluZChNZXNzYWdlcy5KYXJWZXJpZmljYXRpb25SZXN1bHRfVmFsaWRCZXR3ZWVuLCAobmV3IFN0cmluZ1tdIHsgZGF0ZVN0cmluZyhjZXJ0SXNzdWVyLmdldE5vdEJlZm9yZSgpKSwgZGF0ZVN0cmluZyhjZXJ0SXNzdWVyLmdldE5vdEFmdGVyKCkpIH0pKSk7CisJCXN0cmIuYXBwZW5kKGNoZWNrVmFsaWRpdHkoY2VydElzc3VlcikpOworCQlzaWduZXJJbmZvID0gc3RyYi50b1N0cmluZygpOworCQlpZiAoY2VydElzc3VlciAhPSBudWxsICYmICFjZXJ0SXNzdWVyLmVxdWFscyhjZXJ0Um9vdCkpIHsKKwkJCXN0cmIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CQorCQkJc3RyYi5hcHBlbmQoaXNzdWVyU3RyaW5nKGNlcnRJc3N1ZXIuZ2V0SXNzdWVyRE4oKSkpOworCQkJc3RyYi5hcHBlbmQoIlxyXG4iKTsgLy8kTk9OLU5MUy0xJAorCQkJc3RyYi5hcHBlbmQoTkxTLmJpbmQoTWVzc2FnZXMuSmFyVmVyaWZpY2F0aW9uUmVzdWx0X1ZhbGlkQmV0d2VlbiwgKG5ldyBTdHJpbmdbXSB7IGRhdGVTdHJpbmcoY2VydFJvb3QuZ2V0Tm90QmVmb3JlKCkpLCBkYXRlU3RyaW5nKGNlcnRSb290LmdldE5vdEFmdGVyKCkpIH0pKSk7IAorCQkJc3RyYi5hcHBlbmQoY2hlY2tWYWxpZGl0eShjZXJ0Um9vdCkpOworCQkJdmVyaWZpZXJJbmZvID0gc3RyYi50b1N0cmluZygpOworCQl9CisKKwl9CisKKwkvKgorCSAqIFJldHVybnMgYSBTdHJpbmcgdG8gc2hvdyBpZiB0aGUgY2VydGlmaWNhdGUgaXMgdmFsaWQKKwkgKi8KKwlwcml2YXRlIFN0cmluZyBjaGVja1ZhbGlkaXR5KFg1MDlDZXJ0aWZpY2F0ZSBjZXJ0KSB7CisKKwkJdHJ5IHsKKwkJCWNlcnQuY2hlY2tWYWxpZGl0eSgpOworCQl9IGNhdGNoIChDZXJ0aWZpY2F0ZUV4cGlyZWRFeGNlcHRpb24gZSkgeworCQkJcmV0dXJuICgiXHJcbiIgKyBNZXNzYWdlcy5KYXJWZXJpZmljYXRpb25SZXN1bHRfRXhwaXJlZENlcnRpZmljYXRlKTsgIC8vJE5PTi1OTFMtMSQKKwkJfSBjYXRjaCAoQ2VydGlmaWNhdGVOb3RZZXRWYWxpZEV4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm4gKCJcclxuIiArIE1lc3NhZ2VzLkphclZlcmlmaWNhdGlvblJlc3VsdF9DZXJ0aWZpY2F0ZU5vdFlldFZhbGlkKTsgIC8vJE5PTi1OTFMtMSQKKwkJfQorCQlyZXR1cm4gKCJcclxuIiArIE1lc3NhZ2VzLkphclZlcmlmaWNhdGlvblJlc3VsdF9DZXJ0aWZpY2F0ZVZhbGlkKTsgIC8vJE5PTi1OTFMtMSQKKwl9CisKKwkvKgorCSAqIFJldHVybnMgdGhlIGxhYmVsIFN0cmluZyBmcm9tIGEgWDUwbmFtZQorCSAqLworCXByaXZhdGUgU3RyaW5nIGlzc3VlclN0cmluZyhQcmluY2lwYWwgcHJpbmNpcGFsKSB7CisvLyAxOTkwMgorLy8JCXRyeSB7CisvLwkJCWlmIChwcmluY2lwYWwgaW5zdGFuY2VvZiBYNTAwTmFtZSkgeworLy8JCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKy8vCQkJCVg1MDBOYW1lIG5hbWUgPSAoWDUwME5hbWUpIHByaW5jaXBhbDsKKy8vCQkJCWJ1Zi5hcHBlbmQoKG5hbWUuZ2V0RE5RdWFsaWZpZXIoKSAhPSBudWxsKSA/IG5hbWUuZ2V0RE5RdWFsaWZpZXIoKSArICIsICIgOiAiIik7CisvLwkJCQlidWYuYXBwZW5kKG5hbWUuZ2V0Q29tbW9uTmFtZSgpKTsKKy8vCQkJCWJ1Zi5hcHBlbmQoKG5hbWUuZ2V0T3JnYW5pemF0aW9uYWxVbml0KCkgIT0gbnVsbCkgPyAiLCAiICsgbmFtZS5nZXRPcmdhbml6YXRpb25hbFVuaXQoKSA6ICIiKTsKKy8vCQkJCWJ1Zi5hcHBlbmQoKG5hbWUuZ2V0T3JnYW5pemF0aW9uKCkgIT0gbnVsbCkgPyAiLCAiICsgbmFtZS5nZXRPcmdhbml6YXRpb24oKSA6ICIiKTsKKy8vCQkJCWJ1Zi5hcHBlbmQoKG5hbWUuZ2V0TG9jYWxpdHkoKSAhPSBudWxsKSA/ICIsICIgKyBuYW1lLmdldExvY2FsaXR5KCkgOiAiIik7CisvLwkJCQlidWYuYXBwZW5kKChuYW1lLmdldENvdW50cnkoKSAhPSBudWxsKSA/ICIsICIgKyBuYW1lLmdldENvdW50cnkoKSA6ICIiKTsKKy8vCQkJCXJldHVybiBuZXcgU3RyaW5nKGJ1Zik7CisvLwkJCX0KKy8vCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworLy8JCQlVcGRhdGVDb3JlLndhcm4oIkVycm9yIHBhcnNpbmcgWDUwMCBDZXJ0aWZpY2F0ZSIsZSk7CisvLwkJfQorCQlyZXR1cm4gcHJpbmNpcGFsLnRvU3RyaW5nKCk7CisJfQorCisJLyoKKwkgKiAKKwkgKi8KKwlwcml2YXRlIFN0cmluZyBkYXRlU3RyaW5nKERhdGUgZGF0ZSkgeworCQlyZXR1cm4gRGF0ZUZvcm1hdC5nZXREYXRlSW5zdGFuY2UoKS5mb3JtYXQoZGF0ZSk7CisJfQorCisJLyoKKwkgKgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0U2lnbmVySW5mbygpIHsKKwkJaWYgKHNpZ25lckluZm89PW51bGwpIGluaXRpYWxpemVDZXJ0aWZpY2F0ZXMoKTsKKwkJcmV0dXJuIHNpZ25lckluZm87CisJfQorCisJLyoKKwkgKgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0VmVyaWZpZXJJbmZvKCkgeworCQlpZiAoc2lnbmVySW5mbz09bnVsbCkgaW5pdGlhbGl6ZUNlcnRpZmljYXRlcygpOwkJCisJCXJldHVybiB2ZXJpZmllckluZm87CisJfQorCisJLyoKKwkgKgorCSAqLworCXB1YmxpYyBDb250ZW50UmVmZXJlbmNlIGdldENvbnRlbnRSZWZlcmVuY2UoKSB7CisJCXJldHVybiBjb250ZW50UmVmZXJlbmNlOworCX0KKworCS8qCisJICogCisJICovCisJcHVibGljIHZvaWQgc2V0Q29udGVudFJlZmVyZW5jZShDb250ZW50UmVmZXJlbmNlIHJlZikgeworCQl0aGlzLmNvbnRlbnRSZWZlcmVuY2UgPSByZWY7CisJfQorCisKKwkvKgorCSAqCisJICovCisJcHVibGljIElGZWF0dXJlIGdldEZlYXR1cmUoKSB7CisJCXJldHVybiBmZWF0dXJlOworCX0KKworCS8qCisJICogCisJICovCisJcHVibGljIHZvaWQgc2V0RmVhdHVyZShJRmVhdHVyZSBmZWF0dXJlKSB7CisJCXRoaXMuZmVhdHVyZSA9IGZlYXR1cmU7CisJfQorCisJLyoKKwkgKiAKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCisJLyoKKwkgKiAKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0ZlYXR1cmVWZXJpZmljYXRpb24oKSB7CisJCXJldHVybiBmZWF0dXJlVmVyaWZpY2F0aW9uOworCX0KKwkKKwkvKgorCSAqIAorCSAqLworCXB1YmxpYyB2b2lkIGlzRmVhdHVyZVZlcmlmaWNhdGlvbihib29sZWFuIGZlYXR1cmVWZXJpZmljYXRpb24pIHsKKwkJdGhpcy5mZWF0dXJlVmVyaWZpY2F0aW9uID0gZmVhdHVyZVZlcmlmaWNhdGlvbjsKKwl9CisKKwkvKgorCSAqCisJICovCisJcHVibGljIGJvb2xlYW4gYWxyZWFkeVNlZW4oKSB7CisJCXJldHVybiBhbHJlYWR5U2VlbjsKKwl9CisKKwkvKgorCSAqIAorCSAqLworCXB1YmxpYyBib29sZWFuIGFscmVhZHlTZWVuKGJvb2xlYW4gc2VlbikgeworCQlyZXR1cm4gdGhpcy5hbHJlYWR5U2VlbiA9IHNlZW47CisJfQorCit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zZWN1cml0eS9KYXJWZXJpZmllci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2VjdXJpdHkvSmFyVmVyaWZpZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGIyNWIyCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2VjdXJpdHkvSmFyVmVyaWZpZXIuamF2YQpAQCAtMCwwICsxLDQ1NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5zZWN1cml0eTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5zZWN1cml0eS5LZXlTdG9yZTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LktleVN0b3JlRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRW50cnk7CitpbXBvcnQgamF2YS51dGlsLmphci5KYXJGaWxlOworaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5Db250ZW50UmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklWZXJpZmljYXRpb25SZXN1bHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVZlcmlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkluc3RhbGxNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkphckNvbnRlbnRSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuVXRpbGl0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlZlcmlmaWVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLk1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLlVwZGF0ZUNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuY29ubmVjdGlvbi5Db25uZWN0aW9uRmFjdG9yeTsKKworLyoqCisgKiBUaGUgSmFyVmVyaWZpZXIgd2lsbCBjaGVjayB0aGUgaW50ZWdyaXR5IG9mIHRoZSBKQVIuCisgKiBJZiB0aGUgSmFyIGlzIHNpZ25lZCBhbmQgdGhlIGludGVncml0eSBpcyB2YWxpZGF0ZWQsCisgKiBpdCB3aWxsIGNoZWNrIGlmIG9uZSBvZiB0aGUgY2VydGlmaWNhdGUgb2YgZWFjaCBmaWxlCisgKiBpcyBpbiBvbmUgb2YgdGhlIGtleXN0b3JlLgorICoKKyAqLworCitwdWJsaWMgY2xhc3MgSmFyVmVyaWZpZXIgZXh0ZW5kcyBWZXJpZmllciB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFOSUZFU1QgPSAiTUVUQS1JTkYiOyAvLyROT04tTkxTLTEkCisKKwlwcml2YXRlIEphclZlcmlmaWNhdGlvblJlc3VsdCByZXN1bHQ7CisJcHJpdmF0ZSBMaXN0IC8qb2YgQ2VydGlmaWNhdGVQYWlyKi8KKwl0cnVzdGVkQ2VydGlmaWNhdGVzOworCXByaXZhdGUgYm9vbGVhbiBhY2NlcHRVbnNpZ25lZEZpbGVzOworCXByaXZhdGUgTGlzdCAvKiBvZiBLZXlTdG9yZSAqLworCWxpc3RPZktleXN0b3JlczsKKwlwcml2YXRlIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcjsKKwlwcml2YXRlIEZpbGUgamFyRmlsZTsKKworCXByaXZhdGUgc3RhdGljCWJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVs4MTkyXTsKKwkKKwkvKgorCSAqIERlZmF1bHQgQ29uc3RydWN0b3IKKwkgKi8KKwlwdWJsaWMgSmFyVmVyaWZpZXIoKSB7CisJCWluaXRpYWxpemUoKTsKKwl9CisKKwkvKgorCSAqIFJldHVybnMgdGhlIGxpc3Qgb2YgdGhlIGtleXN0b3Jlcy4KKwkgKi8KKwlwcml2YXRlIExpc3QgZ2V0S2V5U3RvcmVzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlpZiAobGlzdE9mS2V5c3RvcmVzID09IG51bGwpIHsKKwkJCWxpc3RPZktleXN0b3JlcyA9IG5ldyBBcnJheUxpc3QoMCk7CisJCQlLZXlTdG9yZXMgbGlzdE9mS2V5c3RvcmVIYW5kbGVzID0gbmV3IEtleVN0b3JlcygpOworCQkJSW5wdXRTdHJlYW0gaW4gPSBudWxsOworCQkJS2V5U3RvcmUga2V5c3RvcmUgPSBudWxsOworCQkJS2V5c3RvcmVIYW5kbGUgaGFuZGxlID0gbnVsbDsKKwkJCXdoaWxlIChsaXN0T2ZLZXlzdG9yZUhhbmRsZXMuaGFzTmV4dCgpKSB7CisJCQkJdHJ5IHsKKwkJCQkJaGFuZGxlID0gbGlzdE9mS2V5c3RvcmVIYW5kbGVzLm5leHQoKTsKKwkJCQkJaW4gPSBDb25uZWN0aW9uRmFjdG9yeS5nZXQoaGFuZGxlLmdldExvY2F0aW9uKCkpLmdldElucHV0U3RyZWFtKCk7CisJCQkJCXRyeSB7CisJCQkJCQlrZXlzdG9yZSA9IEtleVN0b3JlLmdldEluc3RhbmNlKGhhbmRsZS5nZXRUeXBlKCkpOworCQkJCQkJa2V5c3RvcmUubG9hZChpbiwgbnVsbCk7IC8vIG5vIHBhc3N3b3JkCisJCQkJCX0gY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBlKSB7CisJCQkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5KYXJWZXJpZmllcl9VbmFibGVUb0ZpbmRFbmNyeXB0aW9uLCAobmV3IFN0cmluZ1tdIHsgaGFuZGxlLmdldExvY2F0aW9uKCkudG9FeHRlcm5hbEZvcm0oKSB9KSksIGUpOworCQkJCQl9IGNhdGNoIChDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiBlKSB7CisJCQkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5KYXJWZXJpZmllcl9VbmFibGVUb0xvYWRDZXJ0aWZpY2F0ZSwgKG5ldyBTdHJpbmdbXSB7IGhhbmRsZS5nZXRMb2NhdGlvbigpLnRvRXh0ZXJuYWxGb3JtKCkgfSkpLCBlKTsKKwkJCQkJfSBjYXRjaCAoS2V5U3RvcmVFeGNlcHRpb24gZSkgeworCQkJCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oTkxTLmJpbmQoTWVzc2FnZXMuSmFyVmVyaWZpZXJfVW5hYmxlVG9GaW5kUHJvdmlkZXJGb3JLZXlzdG9yZSwgKG5ldyBTdHJpbmdbXSB7IGhhbmRsZS5nZXRUeXBlKCkgfSkpLCBlKTsKKwkJCQkJfSBmaW5hbGx5IHsKKwkJCQkJCWlmIChpbiAhPSBudWxsKSB7CisJCQkJCQkJdHJ5IHsKKwkJCQkJCQkJaW4uY2xvc2UoKTsKKwkJCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJCQkJfSAvLyBub3RoaW5nCisJCQkJCQl9CisJCQkJCX0gLy8gdHJ5IGxvYWRpbmcgYSBrZXlTdG9yZQorCisJCQkJCS8vIGtleXN0b3JlIHdhcyBsb2FkZWQKKwkJCQkJbGlzdE9mS2V5c3RvcmVzLmFkZChrZXlzdG9yZSk7CisJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCQkvLyBub3RoaW5nLi4uIGlmIHRoZSBrZXlzdG9yZSBkb2Vzbid0IGV4aXN0LCBjb250aW51ZQkKKwkJCQl9CisKKwkJCX0gLy8gd2hpbGUgYWxsIGtleSBzdG9yZXMKKworCQl9CisKKwkJcmV0dXJuIGxpc3RPZktleXN0b3JlczsKKwl9CisKKwkvKgorCSAqIAorCSAqLworCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgeworCQlyZXN1bHQgPSBudWxsOworCQl0cnVzdGVkQ2VydGlmaWNhdGVzID0gbnVsbDsKKwkJYWNjZXB0VW5zaWduZWRGaWxlcyA9IGZhbHNlOworCQlsaXN0T2ZLZXlzdG9yZXMgPSBudWxsOworCX0KKworCS8qCisJICogaW5pdAorCSAqLworCXByaXZhdGUgdm9pZCBpbml0KElGZWF0dXJlIGZlYXR1cmUsIENvbnRlbnRSZWZlcmVuY2UgY29udGVudFJlZikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlqYXJGaWxlID0gbnVsbDsKKwkJaWYgKGNvbnRlbnRSZWYgaW5zdGFuY2VvZiBKYXJDb250ZW50UmVmZXJlbmNlKSB7CisJCQlKYXJDb250ZW50UmVmZXJlbmNlIGphclJlZmVyZW5jZSA9IChKYXJDb250ZW50UmVmZXJlbmNlKSBjb250ZW50UmVmOworCQkJdHJ5IHsKKwkJCQlqYXJGaWxlID0gamFyUmVmZXJlbmNlLmFzRmlsZSgpOworCQkJCWlmIChVcGRhdGVDb3JlLkRFQlVHICYmIFVwZGF0ZUNvcmUuREVCVUdfU0hPV19JTlNUQUxMKQorCQkJCQlVcGRhdGVDb3JlLmRlYnVnKCJBdHRlbXB0aW5nIHRvIHJlYWQgSkFSIGZpbGU6IitqYXJGaWxlKTsgLy8kTk9OLU5MUy0xJAorCQkJCisJCQkJLy8gIyBvZiBlbnRyaWVzCisJCQkJaWYgKCFqYXJGaWxlLmV4aXN0cygpKSB0aHJvdyBuZXcgSU9FeGNlcHRpb24oKTsKKwkJCQlKYXJGaWxlIGphciA9IG5ldyBKYXJGaWxlKGphckZpbGUpOworCQkJCWlmIChqYXIgIT1udWxsKXsKKwkJCQkJdHJ5IHsKKwkJCQkJCWphci5jbG9zZSgpOworCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworCQkJCQkJLy8gdW5jaGVja2VkCisJCQkJCX0KKwkJCQl9CisJCQl9IGNhdGNoIChaaXBFeGNlcHRpb24gZSl7CisJCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oTkxTLmJpbmQoTWVzc2FnZXMuSmFyVmVyaWZpZXJfSW52YWxpZEphciwgKG5ldyBTdHJpbmdbXSB7IGphclJlZmVyZW5jZS50b1N0cmluZygpIH0pKSwgZSk7CQkJCQorCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLkphclZlcmlmaWVyX1VuYWJsZVRvQWNjZXNzSmFyLCAobmV3IFN0cmluZ1tdIHsgamFyUmVmZXJlbmNlLnRvU3RyaW5nKCkgfSkpLCBlKTsKKwkJCX0KKwkJfQorCisJCXJlc3VsdCA9IG5ldyBKYXJWZXJpZmljYXRpb25SZXN1bHQoKTsKKwkJcmVzdWx0LnNldFZlcmlmaWNhdGlvbkNvZGUoSVZlcmlmaWNhdGlvblJlc3VsdC5VTktOT1dOX0VSUk9SKTsKKwkJcmVzdWx0LnNldFJlc3VsdEV4Y2VwdGlvbihudWxsKTsKKwkJcmVzdWx0LnNldEZlYXR1cmUoZmVhdHVyZSk7CisJCXJlc3VsdC5zZXRDb250ZW50UmVmZXJlbmNlKGNvbnRlbnRSZWYpOworCX0KKworCS8qCisJICogUmV0dXJucyB0cnVlIGlmIG9uZSBvZiB0aGUgY2VydGlmaWNhdGUgZXhpc3RzIGluIHRoZSBrZXlzdG9yZQorCSAqLworCXByaXZhdGUgYm9vbGVhbiBleGlzdHNJbktleXN0b3JlKENlcnRpZmljYXRlIGNlcnQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCUxpc3Qga2V5U3RvcmVzID0gZ2V0S2V5U3RvcmVzKCk7CisJCQlpZiAoIWtleVN0b3Jlcy5pc0VtcHR5KCkpIHsKKwkJCQlJdGVyYXRvciBsaXN0T2ZLZXlzdG9yZXMgPSBrZXlTdG9yZXMuaXRlcmF0b3IoKTsKKwkJCQl3aGlsZSAobGlzdE9mS2V5c3RvcmVzLmhhc05leHQoKSkgeworCQkJCQlLZXlTdG9yZSBrZXlzdG9yZSA9IChLZXlTdG9yZSkgbGlzdE9mS2V5c3RvcmVzLm5leHQoKTsKKworCQkJCQlpZiAoa2V5c3RvcmUuZ2V0Q2VydGlmaWNhdGVBbGlhcyhjZXJ0KSAhPSBudWxsKSB7CisJCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfSBjYXRjaCAoS2V5U3RvcmVFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oTWVzc2FnZXMuSmFyVmVyaWZpZXJfS2V5U3RvcmVOb3RMb2FkZWQsIGUpOyAKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoKKwkgKiAKKwkgKi8KKwlwcml2YXRlIExpc3QgcmVhZEphckZpbGUoSmFyRmlsZSBqYXJGaWxlLCBTdHJpbmcgaWRlbnRpZmllcikKKwkJdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKworCQlFbnVtZXJhdGlvbiBlbnRyaWVzID0gamFyRmlsZS5lbnRyaWVzKCk7CisJCUphckVudHJ5IGN1cnJlbnRFbnRyeSA9IG51bGw7CisJCUlucHV0U3RyZWFtIGluID0gbnVsbDsKKwkJaWYgKG1vbml0b3IgIT0gbnVsbCkKKwkJCW1vbml0b3Iuc2V0VGFza05hbWUoTkxTLmJpbmQoTWVzc2FnZXMuSmFyVmVyaWZpZXJfVmVyaWZ5LCAobmV3IFN0cmluZ1tdIHsgaWRlbnRpZmllciA9PSBudWxsID8gamFyRmlsZS5nZXROYW1lKCk6IGlkZW50aWZpZXIgfSkpKTsgCisKKwkJdHJ5IHsKKwkJCXdoaWxlIChlbnRyaWVzLmhhc01vcmVFbGVtZW50cygpKSB7CisJCQkJY3VycmVudEVudHJ5ID0gKEphckVudHJ5KSBlbnRyaWVzLm5leHRFbGVtZW50KCk7CisJCQkJbGlzdC5hZGQoY3VycmVudEVudHJ5KTsKKwkJCQlpbiA9IGphckZpbGUuZ2V0SW5wdXRTdHJlYW0oY3VycmVudEVudHJ5KTsKKwkJCQl3aGlsZSAoKGluLnJlYWQoYnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoKSkgIT0gLTEpIHsKKwkJCQkJLy8gU2VjdXJpdHkgZXJyb3IgdGhyb3duIGlmIHRlbXBlcmVkCisJCQkJfQorCQkJCWlmIChpbiE9bnVsbCkKKwkJCQkJaW4uY2xvc2UoKTsKKwkJCX0KKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJcmVzdWx0LnNldFZlcmlmaWNhdGlvbkNvZGUoSVZlcmlmaWNhdGlvblJlc3VsdC5VTktOT1dOX0VSUk9SKTsKKwkJCXJlc3VsdC5zZXRSZXN1bHRFeGNlcHRpb24oZSk7CisJCX0gZmluYWxseSB7CisJCQl0cnkgeworCQkJCWlmIChpbiAhPSBudWxsKQorCQkJCQlpbi5jbG9zZSgpOworCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZTEpIHsKKwkJCQkvLyBpZ25vcmUKKwkJCX0KKwkJfQorCisJCXJldHVybiBsaXN0OworCX0KKworCS8qCisJICogQHBhcmFtIG5ld01vbml0b3Igb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRNb25pdG9yKElQcm9ncmVzc01vbml0b3IgbmV3TW9uaXRvcikgeworCQltb25pdG9yID0gbmV3TW9uaXRvcjsKKwl9CisKKwkvKgorCSAqIEBzZWUgSVZlcmlmaWVyI3ZlcmlmeShJRmVhdHVyZSxDb250ZW50UmVmZXJlbmNlLGJvb2xlYW4sIEluc3RhbGxNb25pdG9yKQorCSAqLworCXB1YmxpYyBJVmVyaWZpY2F0aW9uUmVzdWx0IHZlcmlmeSgKKwkJSUZlYXR1cmUgZmVhdHVyZSwKKwkJQ29udGVudFJlZmVyZW5jZSByZWZlcmVuY2UsCisJCWJvb2xlYW4gaXNGZWF0dXJlVmVyaWZpY2F0aW9uLAorCQlJbnN0YWxsTW9uaXRvciBtb25pdG9yKQorCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisKKwkJaWYgKHJlZmVyZW5jZSA9PSBudWxsKQorCQkJcmV0dXJuIHJlc3VsdDsKKworCQkvLyBpZiBwYXJlbnQga25vd3MgaG93IHRvIHZlcmlmeSwgYXNrIHRoZSBwYXJlbnQgZmlyc3QKKwkJaWYgKGdldFBhcmVudCgpICE9IG51bGwpIHsKKwkJCUlWZXJpZmljYXRpb25SZXN1bHQgdnIgPQorCQkJCWdldFBhcmVudCgpLnZlcmlmeShmZWF0dXJlLCByZWZlcmVuY2UsIGlzRmVhdHVyZVZlcmlmaWNhdGlvbiwgbW9uaXRvcik7CisJCQlpZiAodnIuZ2V0VmVyaWZpY2F0aW9uQ29kZSgpICE9IElWZXJpZmljYXRpb25SZXN1bHQuVFlQRV9FTlRSWV9VTlJFQ09HTklaRUQpCisJCQkJcmV0dXJuIHZyOworCQl9CisKKwkJLy8gdGhlIHBhcmVudCBjb3VsZG4ndCB2ZXJpZnkKKwkJc2V0TW9uaXRvcihtb25pdG9yKTsKKwkJaW5pdChmZWF0dXJlLCByZWZlcmVuY2UpOworCQlyZXN1bHQuaXNGZWF0dXJlVmVyaWZpY2F0aW9uKGlzRmVhdHVyZVZlcmlmaWNhdGlvbik7CisKKwkJaWYgKGphckZpbGUhPW51bGwpIHsKKwkJCQlyZXN1bHQgPSB2ZXJpZnkoamFyRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgcmVmZXJlbmNlLmdldElkZW50aWZpZXIoKSk7CisJCX0gZWxzZSB7CisJCQlyZXN1bHQuc2V0VmVyaWZpY2F0aW9uQ29kZShJVmVyaWZpY2F0aW9uUmVzdWx0LlRZUEVfRU5UUllfVU5SRUNPR05JWkVEKTsKKwkJfQorCisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoKKwkgKiAKKwkgKi8KKwlwcml2YXRlIEphclZlcmlmaWNhdGlvblJlc3VsdCB2ZXJpZnkoU3RyaW5nIGZpbGUsIFN0cmluZyBpZGVudGlmaWVyKSB7CisKKwkJdHJ5IHsKKworCQkJLy8gdmVyaWZ5IGludGVncml0eQorCQkJdmVyaWZ5SW50ZWdyaXR5KGZpbGUsIGlkZW50aWZpZXIpOworCisJCQkvLyBkbyBub3QgY2xvc2UgaW5wdXQgc3RyZWFtCisJCQkvLyBhcyB2ZXJpZnlJbnRlZ3JpdHkgYWxyZWFkeSBkaWQgaXQKKworCQkJLy9pZiB1c2VyIGFscmVhZHkgc2FpZCB5ZXMKKwkJCXJlc3VsdC5hbHJlYWR5U2VlbihhbHJlYWR5VmFsaWRhdGVkKCkpOworCisJCQkvLyB2ZXJpZnkgc291cmNlIGNlcnRpZmljYXRlCisJCQlpZiAocmVzdWx0LmdldFZlcmlmaWNhdGlvbkNvZGUoKQorCQkJCT09IElWZXJpZmljYXRpb25SZXN1bHQuVFlQRV9FTlRSWV9TSUdORURfVU5SRUNPR05JWkVEKSB7CisJCQkJdmVyaWZ5QXV0aGVudGljYXRpb24oKTsKKwkJCX0KKworCQkJLy8gc2F2ZSB0aGUgZmFjdCB0aGUgZmlsZSBpcyBub3Qgc2lnbmVkLCBzbyB0aGUgdXNlciB3aWxsIG5vdCBiZSBwcm9tcHRlZCBhZ2FpbiAKKwkJCWlmIChyZXN1bHQuZ2V0VmVyaWZpY2F0aW9uQ29kZSgpCisJCQkJPT0gSVZlcmlmaWNhdGlvblJlc3VsdC5UWVBFX0VOVFJZX05PVF9TSUdORUQpIHsKKwkJCQlhY2NlcHRVbnNpZ25lZEZpbGVzID0gdHJ1ZTsKKwkJCX0KKworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJcmVzdWx0LnNldFZlcmlmaWNhdGlvbkNvZGUoSVZlcmlmaWNhdGlvblJlc3VsdC5VTktOT1dOX0VSUk9SKTsKKwkJCXJlc3VsdC5zZXRSZXN1bHRFeGNlcHRpb24oZSk7CisJCX0KKworCQlpZiAobW9uaXRvciAhPSBudWxsKSB7CisJCQltb25pdG9yLndvcmtlZCgxKTsKKwkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgeworCQkJCXJlc3VsdC5zZXRWZXJpZmljYXRpb25Db2RlKElWZXJpZmljYXRpb25SZXN1bHQuVkVSSUZJQ0FUSU9OX0NBTkNFTExFRCk7CisJCQl9CisJCX0KKworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qCisJICogVmVyaWZpZXMgdGhhdCBlYWNoIGZpbGUgaGFzIGF0IGxlYXN0IG9uZSBjZXJ0aWZpY2F0ZQorCSAqIHZhbGlkIGluIHRoZSBrZXlzdG9yZQorCSAqCisJICogQXQgbGVhc3Qgb25lIGNlcnRpZmljYXRlIGZyb20gZWFjaCBDZXJ0aWZpY2F0ZSBBcnJheQorCSAqIG9mIHRoZSBKYXIgZmlsZSBtdXN0IGJlIGZvdW5kIGluIHRoZSBrbm93biBDZXJ0aWZpY2F0ZXMKKwkgKi8KKwlwcml2YXRlIHZvaWQgdmVyaWZ5QXV0aGVudGljYXRpb24oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisKKwkJQ2VydGlmaWNhdGVQYWlyW10gZW50cmllcyA9IHJlc3VsdC5nZXRSb290Q2VydGlmaWNhdGVzKCk7CisJCWJvb2xlYW4gY2VydGlmaWNhdGVGb3VuZCA9IGZhbHNlOworCisJCS8vIElmIGFsbCB0aGUgY2VydGlmaWNhdGUgb2YgYW4gZW50cnkgYXJlCisJCS8vIG5vdCBmb3VuZCBpbiB0aGUgbGlzdCBvZiBrbm93biBjZXJ0aWZjYXRlCisJCS8vIHRoZSBjZXJ0aWZpY2F0ZSBpcyBub3QgdHJ1c3RlZCBieSBhbnkga2V5c3RvcmUuCisJCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgeworCQkJY2VydGlmaWNhdGVGb3VuZCA9IGV4aXN0c0luS2V5c3RvcmUoZW50cmllc1tpXS5nZXRSb290KCkpOworCQkJaWYgKGNlcnRpZmljYXRlRm91bmQpIHsKKwkJCQlyZXN1bHQuc2V0VmVyaWZpY2F0aW9uQ29kZShJVmVyaWZpY2F0aW9uUmVzdWx0LlRZUEVfRU5UUllfU0lHTkVEX1JFQ09HTklaRUQpOworCQkJCXJlc3VsdC5zZXRGb3VuZENlcnRpZmljYXRlKGVudHJpZXNbaV0pOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCX0KKworCS8qCisJICogVmVyaWZpZXMgdGhlIGludGVncml0eSBvZiB0aGUgSkFSCisJICovCisJcHJpdmF0ZSB2b2lkIHZlcmlmeUludGVncml0eShTdHJpbmcgZmlsZSwgU3RyaW5nIGlkZW50aWZpZXIpIHsKKworCQlKYXJGaWxlIGphckZpbGUgPSBudWxsOworCisJCXRyeSB7CisJCQkvLyBJZiB0aGUgSkFSIGlzIHNpZ25lZCBhbmQgbm90IHZhbGlkCisJCQkvLyBhIHNlY3VyaXR5IGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bgorCQkJLy8gd2hpbGUgcmVhZGluZyBpdAorCQkJamFyRmlsZSA9IG5ldyBKYXJGaWxlKGZpbGUsIHRydWUpOworCQkJTGlzdCBmaWxlc0luSmFyID0gcmVhZEphckZpbGUoamFyRmlsZSwgaWRlbnRpZmllcik7CisKKwkJCS8vIHlvdSBoYXZlIHRvIHJlYWQgYWxsIHRoZSBmaWxlcyBvbmNlCisJCQkvLyBiZWZvcmUgZ2V0dGluZyB0aGUgY2VydGlmaWNhdGVzIAorCQkJaWYgKGphckZpbGUuZ2V0TWFuaWZlc3QoKSAhPSBudWxsKSB7CisJCQkJSXRlcmF0b3IgaXRlciA9IGZpbGVzSW5KYXIuaXRlcmF0b3IoKTsKKwkJCQlib29sZWFuIGNlcnRpZmljYXRlRm91bmQgPSBmYWxzZTsKKwkJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKwkJCQkJSmFyRW50cnkgY3VycmVudEphckVudHJ5ID0gKEphckVudHJ5KSBpdGVyLm5leHQoKTsKKwkJCQkJQ2VydGlmaWNhdGVbXSBjZXJ0cyA9IGN1cnJlbnRKYXJFbnRyeS5nZXRDZXJ0aWZpY2F0ZXMoKTsKKwkJCQkJaWYgKChjZXJ0cyAhPSBudWxsKSAmJiAoY2VydHMubGVuZ3RoICE9IDApKSB7CisJCQkJCQljZXJ0aWZpY2F0ZUZvdW5kID0gdHJ1ZTsKKwkJCQkJCXJlc3VsdC5hZGRDZXJ0aWZpY2F0ZXMoY2VydHMpOworCQkJCQl9IGVsc2UgeworCQkJCQkJU3RyaW5nIGphckVudHJ5TmFtZSA9IGN1cnJlbnRKYXJFbnRyeS5nZXROYW1lKCk7CisJCQkJCQlpZiAoIWphckVudHJ5TmFtZS50b1VwcGVyQ2FzZSgpLnN0YXJ0c1dpdGgoTUFOSUZFU1QpCisJCQkJCQkJJiYgIWN1cnJlbnRKYXJFbnRyeS5pc0RpcmVjdG9yeSgpKSB7CisJCQkJCQkJLy8gaWYgdGhlIGphckVudHJ5IGlzIG5vdCBpbiBNQU5JRkVTVCwgY29uc2lkZXIgdGhlIHdob2xlIGZpbGUgdW5zaWduZWQJCQkJCQkJCisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisKKwkJCQkJfQorCQkJCX0KKworCQkJCWlmIChjZXJ0aWZpY2F0ZUZvdW5kKQorCQkJCQlyZXN1bHQuc2V0VmVyaWZpY2F0aW9uQ29kZShJVmVyaWZpY2F0aW9uUmVzdWx0LlRZUEVfRU5UUllfU0lHTkVEX1VOUkVDT0dOSVpFRCk7CisJCQkJZWxzZQorCQkJCQlyZXN1bHQuc2V0VmVyaWZpY2F0aW9uQ29kZShJVmVyaWZpY2F0aW9uUmVzdWx0LlRZUEVfRU5UUllfTk9UX1NJR05FRCk7CisJCQl9IGVsc2UgeworCQkJCUV4Y2VwdGlvbiBlID0gbmV3IEV4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5KYXJWZXJpZmllcl9JbnZhbGlkRmlsZSwgKG5ldyBTdHJpbmdbXSB7IGZpbGUgfSkpKTsKKwkJCQlyZXN1bHQuc2V0UmVzdWx0RXhjZXB0aW9uKGUpOworCQkJCXJlc3VsdC5zZXRWZXJpZmljYXRpb25Db2RlKElWZXJpZmljYXRpb25SZXN1bHQuVFlQRV9FTlRSWV9OT1RfU0lHTkVEKTsKKwkJCQlVcGRhdGVDb3JlLndhcm4obnVsbCxlKTsKKwkJCX0KKwkJfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgeworCQkJLy8gSmFyIGZpbGUgaXMgc2lnbmVkCisJCQkvLyBidXQgY29udGVudCBoYXMgY2hhbmdlZCBzaW5jZSBzaWduZWQKKwkJCXJlc3VsdC5zZXRWZXJpZmljYXRpb25Db2RlKElWZXJpZmljYXRpb25SZXN1bHQuVFlQRV9FTlRSWV9DT1JSVVBURUQpOworCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisJCQlyZXN1bHQuc2V0VmVyaWZpY2F0aW9uQ29kZShJVmVyaWZpY2F0aW9uUmVzdWx0LlZFUklGSUNBVElPTl9DQU5DRUxMRUQpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJcmVzdWx0LnNldFZlcmlmaWNhdGlvbkNvZGUoSVZlcmlmaWNhdGlvblJlc3VsdC5VTktOT1dOX0VSUk9SKTsKKwkJCXJlc3VsdC5zZXRSZXN1bHRFeGNlcHRpb24oZSk7CisJCX0gZmluYWxseSB7CisJCQlpZiAoamFyRmlsZSE9bnVsbCl7CisJCQkJdHJ5IHtqYXJGaWxlLmNsb3NlKCk7fSBjYXRjaCAoSU9FeGNlcHRpb24gZSl7fQorCQkJfQorCQl9CisKKwl9CisKKwkvKgorCSAqIAorCSAqLworCXByaXZhdGUgYm9vbGVhbiBhbHJlYWR5VmFsaWRhdGVkKCkgeworCisJCWlmIChyZXN1bHQuZ2V0VmVyaWZpY2F0aW9uQ29kZSgpID09IElWZXJpZmljYXRpb25SZXN1bHQuVFlQRV9FTlRSWV9OT1RfU0lHTkVEKQorCQkJcmV0dXJuIChhY2NlcHRVbnNpZ25lZEZpbGVzKTsKKworCQlpZiAoZ2V0VHJ1c3RlZENlcnRpZmljYXRlcygpICE9IG51bGwpIHsKKwkJCUl0ZXJhdG9yIGl0ZXIgPSBnZXRUcnVzdGVkQ2VydGlmaWNhdGVzKCkuaXRlcmF0b3IoKTsKKwkJCUNlcnRpZmljYXRlUGFpcltdIGphclBhaXJzID0gcmVzdWx0LmdldFJvb3RDZXJ0aWZpY2F0ZXMoKTsKKworCQkJLy8gY2hlY2sgaWYgdGhpcyBpcyBub3QgYSB1c2VyIGFjY2VwdGVkIGNlcnRpZmljYXRlIGZvciB0aGlzIGZlYXR1cmUJCisJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKwkJCQlDZXJ0aWZpY2F0ZVBhaXIgdHJ1c3RlZENlcnRpZmljYXRlID0gKENlcnRpZmljYXRlUGFpcikgaXRlci5uZXh0KCk7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBqYXJQYWlycy5sZW5ndGg7IGkrKykgeworCQkJCQlpZiAodHJ1c3RlZENlcnRpZmljYXRlLmVxdWFscyhqYXJQYWlyc1tpXSkpIHsKKwkJCQkJCXJldHVybiB0cnVlOworCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQkvLyBpZiBjZXJ0aWZpY2F0ZSBwYWlyIG5vdCBmb3VuZCBpbiB0cnVzdGVkIGFkZCBpdCBmb3IgbmV4dCB0aW1lCisJCQlmb3IgKGludCBpID0gMDsgaSA8IGphclBhaXJzLmxlbmd0aDsgaSsrKSB7CisJCQkJYWRkVHJ1c3RlZENlcnRpZmljYXRlKGphclBhaXJzW2ldKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKgorCSAqIAorCSAqLworCXByaXZhdGUgdm9pZCBhZGRUcnVzdGVkQ2VydGlmaWNhdGUoQ2VydGlmaWNhdGVQYWlyIHBhaXIpIHsKKwkJaWYgKHRydXN0ZWRDZXJ0aWZpY2F0ZXMgPT0gbnVsbCkKKwkJCXRydXN0ZWRDZXJ0aWZpY2F0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisJCWlmIChwYWlyICE9IG51bGwpCisJCQl0cnVzdGVkQ2VydGlmaWNhdGVzLmFkZChwYWlyKTsKKwl9CisKKwkvKgorCSAqIAorCSAqLworCXByaXZhdGUgTGlzdCBnZXRUcnVzdGVkQ2VydGlmaWNhdGVzKCkgeworCQlpZiAodHJ1c3RlZENlcnRpZmljYXRlcyA9PSBudWxsKQorCQkJdHJ1c3RlZENlcnRpZmljYXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJcmV0dXJuIHRydXN0ZWRDZXJ0aWZpY2F0ZXM7CisJfQorCisJLyoqCisJICogQHNlZSBJVmVyaWZpZXIjc2V0UGFyZW50KElWZXJpZmllcikKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoSVZlcmlmaWVyIHBhcmVudFZlcmlmaWVyKSB7CisJCXN1cGVyLnNldFBhcmVudChwYXJlbnRWZXJpZmllcik7CisJCWluaXRpYWxpemUoKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NlY3VyaXR5L0tleVN0b3Jlcy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2VjdXJpdHkvS2V5U3RvcmVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTkwN2NhNgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NlY3VyaXR5L0tleVN0b3Jlcy5qYXZhCkBAIC0wLDAgKzEsMjE5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnNlY3VyaXR5OworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEuaW8uUmVhZGVyOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS5zZWN1cml0eS5TZWN1cml0eTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLlVwZGF0ZUNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuY29ubmVjdGlvbi5Db25uZWN0aW9uRmFjdG9yeTsKKy8qKgorICogQ2xhc3MgdG8gbWFuYWdlIHRoZSBkaWZmZXJlbnQgS2V5U3RvcmVzIHdlIHNob3VsZAorICogY2hlY2sgZm9yIGNlcnRpZmljYXRlcyBvZiBTaWduZWQgSkFSCisgKi8KK3B1YmxpYyBjbGFzcyBLZXlTdG9yZXMgeworCisKKwkvKioKKwkgKiBqYXZhLnBvbGljeSBmaWxlcyBwcm9wZXJ0aWVzIG9mIHRoZSBqYXZhLnNlY3VyaXR5IGZpbGUKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV9QT0xJQ1lfVVJMID0gInBvbGljeS51cmwuIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogRGVmYXVsdCBrZXlzdG9yZSB0eXBlIGluIGphdmEuc2VjdXJpdHkgZmlsZQorCSAqLwkKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9LRVlTVE9SRV9UWVBFID0gImtleXN0b3JlLnR5cGUiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBMaXN0IG9mIEtleXN0b3JlSGFuZGxlIHBvaW50aW5nIG9mIHZhbGlkIEtleVN0b3JlcworCSAqIHRoZSBVUkwgb2YgdGhlIEtleXN0b3JlSGFuZGxlIGlzIG5vdCB0ZXN0ZWQgeWV0Li4uCisJICovCisJcHJpdmF0ZSBMaXN0IC8qIG9mIEtleXN0b3JlSGFuZGxlICovIGxpc3RPZktleVN0b3JlczsKKworCS8qKgorCSAqIEl0ZXJhdG9yCisJICovCisJcHJpdmF0ZSBJdGVyYXRvciBpdGVyYXRvcjsKKwkvKioKKwkgKiBLZXlTdG9yZXMgY29uc3RydWN0b3IgY29tbWVudC4KKwkgKi8KKwlwdWJsaWMgS2V5U3RvcmVzKCkgeworCQlzdXBlcigpOworCQlpbml0aWFsaXplRGVmYXVsdEtleVN0b3JlcygpOworCX0KKwkvKioKKwkgKiAKKwkgKi8KKwlwcml2YXRlIEl0ZXJhdG9yIGdldEl0ZXJhdG9yKCkgeworCQlpZiAoaXRlcmF0b3IgPT0gbnVsbCkKKwkJCWl0ZXJhdG9yID0gbGlzdE9mS2V5U3RvcmVzLml0ZXJhdG9yKCk7CisJCXJldHVybiBpdGVyYXRvcjsKKwl9CisJLyoqCisJICogcmV0dXJucyB0cnVzIGlmIHRoZXJlIGlzIG1vcmUgS2V5c3RvcmVzIGluIHRoZSBsaXN0CisJICovCisJcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKKwkJcmV0dXJuIGdldEl0ZXJhdG9yKCkuaGFzTmV4dCgpOworCX0KKwkvKioKKwkgKiBwb3B1bGF0ZSB0aGUgbGlzdCBvZiBLZXlzdG9yZXMKKwkgKiBzaG91bGQgYmUgZG9uZSB3aXRoIERpYWxvZyB3aXRoIENhbmNlbC9Ta2lwIGJ1dHRvbiBpZgorCSAqIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBVUkwgaXMgZG93bi4uLgorCSAqLworCXByaXZhdGUgdm9pZCBpbml0aWFsaXplRGVmYXVsdEtleVN0b3JlcygpIHsKKworCQlsaXN0T2ZLZXlTdG9yZXMgPSBuZXcgQXJyYXlMaXN0KDUpOworCisJCS8vIGdldCBKUkUgY2FjZXJ0cworCQl0cnkgeworCQkJVVJMIHVybCA9IG5ldyBVUkwoImZpbGUiLCBudWxsLCAwLCBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaG9tZSIpICsgRmlsZS5zZXBhcmF0b3IgKyAibGliIiArIEZpbGUuc2VwYXJhdG9yICsgInNlY3VyaXR5IiArIEZpbGUuc2VwYXJhdG9yICsgImNhY2VydHMiKTsgIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAorCQkJbGlzdE9mS2V5U3RvcmVzLmFkZChuZXcgS2V5c3RvcmVIYW5kbGUodXJsLFNlY3VyaXR5LmdldFByb3BlcnR5KERFRkFVTFRfS0VZU1RPUkVfVFlQRSkpKTsKKwkJfQorCQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKwkJCS8vIHNob3VsZCBub3QgaGFwcGVuLCBoYXJkY29kZWQuLi4KKwkJfQorCisJCS8vIGdldCBqYXZhLmhvbWUgLmtleXN0b3JlCisJCXRyeSB7CisJCQlVUkwgdXJsID0gbmV3IFVSTCgiZmlsZSIsIG51bGwsIDAsIFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5ob21lIikgKyBGaWxlLnNlcGFyYXRvciArICIua2V5c3RvcmUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCWxpc3RPZktleVN0b3Jlcy5hZGQobmV3IEtleXN0b3JlSGFuZGxlKHVybCxTZWN1cml0eS5nZXRQcm9wZXJ0eShERUZBVUxUX0tFWVNUT1JFX1RZUEUpKSk7CisJCX0KKwkJY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisJCQkvLyBzaG91bGQgbm90IGhhcHBlbiwgaGFyZGNvZGVkLi4uCisJCX0KKworCQkvLyBnZXQgS2V5U3RvcmVzIGZyb20gcG9saWN5IGZpbGVzLi4uCisJCWludCBpbmRleCA9IDE7CisJCVN0cmluZyBqYXZhX3BvbGljeSA9IFNlY3VyaXR5LmdldFByb3BlcnR5KEpBVkFfUE9MSUNZX1VSTCtpbmRleCk7CisJCXdoaWxlIChqYXZhX3BvbGljeSE9bnVsbCl7CisJCQkvLyByZXRyaWV2ZSBrZXlzdG9yZSB1cmwgZnJvbSBqYXZhLnBvbGljeQorCQkJLy8gYWxzbyByZXRyaWV2ZSBrZXlzdG9yZSB0eXBlCisJCQlLZXlzdG9yZUhhbmRsZSBrZXlzdG9yZSA9IGdldEtleXN0b3JlRnJvbUxvY2F0aW9uKGphdmFfcG9saWN5KTsKKwkJCWlmIChrZXlzdG9yZSE9bnVsbCl7CisJCQkJbGlzdE9mS2V5U3RvcmVzLmFkZChrZXlzdG9yZSk7CisJCQl9CisJCQlpbmRleCsrOwkKKwkJCWphdmFfcG9saWN5ID0gU2VjdXJpdHkuZ2V0UHJvcGVydHkoSkFWQV9QT0xJQ1lfVVJMK2luZGV4KTsJCQkKKwkJfQorCisJfQorCS8qKgorCSAqIHJldHVybnMgdGhlIFVSTCBmb3IgdGhlIE5leHQgS2V5c3RvcmVIYW5kbGUKKwkgKi8KKwlwdWJsaWMgS2V5c3RvcmVIYW5kbGUgbmV4dCgpIHsKKwkJcmV0dXJuIChLZXlzdG9yZUhhbmRsZSkgZ2V0SXRlcmF0b3IoKS5uZXh0KCk7CisJfQorCQorCS8qKgorCSAqIHJldHJpZXZlIHRoZSBrZXlzdG9yZSBmcm9tIGphdmEucG9saWN5IGZpbGUKKwkgKi8KKwlwcml2YXRlIEtleXN0b3JlSGFuZGxlIGdldEtleXN0b3JlRnJvbUxvY2F0aW9uKFN0cmluZyBsb2NhdGlvbil7CisJCQorCQlJbnB1dFN0cmVhbSBpbiA9IG51bGw7CisJCWNoYXJbXSBidWZmID0gbmV3IGNoYXJbNDA5Nl07CisJCQorCQkKKwkJaW50IGluZGV4T2YkID0gbG9jYXRpb24uaW5kZXhPZigiJHsiKTsgLy8kTk9OLU5MUy0xJAorCQlpbnQgaW5kZXhPZkN1cmx5ID0gbG9jYXRpb24uaW5kZXhPZignfScsaW5kZXhPZiQpOworCQlpZiAoaW5kZXhPZiQhPS0xICYmIGluZGV4T2ZDdXJseSE9LTEpeworCQkJU3RyaW5nIHByb3AgPSBTeXN0ZW0uZ2V0UHJvcGVydHkobG9jYXRpb24uc3Vic3RyaW5nKGluZGV4T2YkKzIsaW5kZXhPZkN1cmx5KSk7CisJCQlTdHJpbmcgbG9jYXRpb24yID0gbG9jYXRpb24uc3Vic3RyaW5nKDAsaW5kZXhPZiQpOworCQkJbG9jYXRpb24yICs9IHByb3A7CisJCQlsb2NhdGlvbjIgKz0gbG9jYXRpb24uc3Vic3RyaW5nKGluZGV4T2ZDdXJseSsxKTsKKwkJCWxvY2F0aW9uID0gbG9jYXRpb24yOworCQl9CisJCQorCQkKKwkJdHJ5IHsKKwkJCVVSTCB1cmwgPSBuZXcgVVJMKGxvY2F0aW9uKTsKKwkJCWluID0gQ29ubmVjdGlvbkZhY3RvcnkuZ2V0KHVybCkuZ2V0SW5wdXRTdHJlYW0oKTsKKwkJCVJlYWRlciByZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW4pOworCQkJaW50IHJlc3VsdCA9IHJlYWRlci5yZWFkKGJ1ZmYpOworCQkJU3RyaW5nQnVmZmVyIGNvbnRlbnRCdWZmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQkJd2hpbGUgKHJlc3VsdCE9LTEpeworCQkJCWNvbnRlbnRCdWZmLmFwcGVuZChidWZmLDAscmVzdWx0KTsKKwkJCQlyZXN1bHQgPSByZWFkZXIucmVhZChidWZmKTsJCQkJCisJCQl9CisKKwkJCWlmIChjb250ZW50QnVmZi5sZW5ndGgoKT4wKXsJCQkKKwkJCQlTdHJpbmcgY29udGVudCA9IG5ldyBTdHJpbmcoY29udGVudEJ1ZmYpOworCQkJCWludCBpbmRleE9mS2V5c3RvcmUgPSBjb250ZW50LmluZGV4T2YoImtleXN0b3JlIik7IC8vJE5PTi1OTFMtMSQKKwkJCQlpZiAoaW5kZXhPZktleXN0b3JlICE9IC0xKXsKKwkJCQkJaW50IGluZGV4T2ZTZW1pQ29sdW1uID0gY29udGVudC5pbmRleE9mKCc7JyxpbmRleE9mS2V5c3RvcmUpOworCQkJCQlyZXR1cm4gZ2V0S2V5c3RvcmVGcm9tU3RyaW5nKGNvbnRlbnQuc3Vic3RyaW5nKGluZGV4T2ZLZXlzdG9yZSxpbmRleE9mU2VtaUNvbHVtbiksdXJsKTsKKwkJCQl9CisJCQl9CisJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKXsKKwkJCWxvZyhlKTsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSl7CisJCQkvLyB1cmwub3BlblN0cmVhbSwgcmVhZGVyLnJlYWQgKHgyKQorCQkJLy8gb25seSBsb2csIHRoZSBrZXlzdG9yZSBtYXkgbm90IGV4aXN0CisJCQlsb2coZSk7CQorCQl9IGZpbmFsbHkgeworCQkJaWYgKGluIT1udWxsKXsKKwkJCQl0cnkgeworCQkJCQlpbi5jbG9zZSgpOworCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpe30KKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJLyoqCisJICogcmV0cmlldmUgdGhlIGtleXN0b3JlIGZyb20gamF2YS5wb2xpY3kgZmlsZQorCSAqLworCXByaXZhdGUgS2V5c3RvcmVIYW5kbGUgZ2V0S2V5c3RvcmVGcm9tU3RyaW5nKFN0cmluZyBjb250ZW50LFVSTCByb290VVJMKXsKKwkJS2V5c3RvcmVIYW5kbGUgaGFuZGxlID0gbnVsbDsKKwkJU3RyaW5nIGtleVN0b3JlVHlwZSA9IFNlY3VyaXR5LmdldFByb3BlcnR5KERFRkFVTFRfS0VZU1RPUkVfVFlQRSk7CisJCQorCQkKKwkJaW50IGluZGV4T2ZTcGFjZSA9IGNvbnRlbnQuaW5kZXhPZignICcpOworCQlpZiAoaW5kZXhPZlNwYWNlPT0tMSkgcmV0dXJuIG51bGw7CisJCQorCQlpbnQgc2Vjb25kU3BhY2UgPSBjb250ZW50Lmxhc3RJbmRleE9mKCcsJyk7CisJCWlmIChzZWNvbmRTcGFjZT09LTEpIHsKKwkJCXNlY29uZFNwYWNlID0gY29udGVudC5sZW5ndGgoKTsKKwkJfSBlbHNlIHsKKwkJCWtleVN0b3JlVHlwZSA9IGNvbnRlbnQuc3Vic3RyaW5nKHNlY29uZFNwYWNlKzEsY29udGVudC5sZW5ndGgoKSkudHJpbSgpOworCQl9CisJCQorCQlVUkwgdXJsID0gbnVsbDsKKwkJdHJ5IHsKKwkJCXVybCA9IG5ldyBVUkwoY29udGVudC5zdWJzdHJpbmcoaW5kZXhPZlNwYWNlLHNlY29uZFNwYWNlKSk7CisJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKXsKKwkJCWxvZyhlKTsKKwkJCS8vIHRoZSB1cmwgbWF5YmUgcmVsYXRpdmUKKwkJCXRyeSB7CisJCQl1cmwgPSBuZXcgVVJMKHJvb3RVUkwsY29udGVudC5zdWJzdHJpbmcoaW5kZXhPZlNwYWNlLHNlY29uZFNwYWNlKSk7CQkJCQorCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUxKXsKKwkJCQlsb2coZTEpOwkJCQorCQkJfQorCQl9CisKKwkJaWYgKHVybCE9bnVsbCkKKwkJCWhhbmRsZSA9IG5ldyBLZXlzdG9yZUhhbmRsZSh1cmwsa2V5U3RvcmVUeXBlKTsJCQkJCisJCQkKKwkJcmV0dXJuIGhhbmRsZTsKKwl9CQorCQorCXByaXZhdGUgdm9pZCBsb2coRXhjZXB0aW9uIGUpeworCQlVcGRhdGVDb3JlLndhcm4oIkNhbm5vdCByZXRyaWV2ZSBhIEtleVN0b3JlIixlKTsgLy8kTk9OLU5MUy0xJAorCX0KK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NlY3VyaXR5L0tleXN0b3JlSGFuZGxlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zZWN1cml0eS9LZXlzdG9yZUhhbmRsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxYTdiMjkKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zZWN1cml0eS9LZXlzdG9yZUhhbmRsZS5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuc2VjdXJpdHk7CisKK2ltcG9ydCBqYXZhLm5ldC4qOworCisKKyAKKy8qKgorICogTWFuYWdlcyBhIGhhbmRsZSB0byBhIGtleXN0b3JlCisgKi8KK3B1YmxpYyBjbGFzcyBLZXlzdG9yZUhhbmRsZSB7CisJCisJcHJpdmF0ZSBVUkwgbG9jYXRpb247CisJcHJpdmF0ZSBTdHJpbmcgdHlwZTsKKwkKKwlwdWJsaWMgS2V5c3RvcmVIYW5kbGUoVVJMIHVybCwgU3RyaW5nIHR5cGUpeworCQl0aGlzLmxvY2F0aW9uID0gdXJsOworCQl0aGlzLnR5cGUgPSB0eXBlOworCX0KKworCS8qKgorCSAqIEdldHMgdGhlIGxvY2F0aW9uLgorCSAqIEByZXR1cm4gUmV0dXJucyBhIFVSTAorCSAqLworCXB1YmxpYyBVUkwgZ2V0TG9jYXRpb24oKSB7CisJCXJldHVybiBsb2NhdGlvbjsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSBsb2NhdGlvbi4KKwkgKiBAcGFyYW0gbG9jYXRpb24gVGhlIGxvY2F0aW9uIHRvIHNldAorCSAqLworCXB1YmxpYyB2b2lkIHNldExvY2F0aW9uKFVSTCBsb2NhdGlvbikgeworCQl0aGlzLmxvY2F0aW9uID0gbG9jYXRpb247CisJfQorCisJLyoqCisJICogR2V0cyB0aGUgdHlwZS4KKwkgKiBAcmV0dXJuIFJldHVybnMgYSBTdHJpbmcKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7CisJCXJldHVybiB0eXBlOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHR5cGUuCisJICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgdG8gc2V0CisJICovCisJcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSkgeworCQl0aGlzLnR5cGUgPSB0eXBlOworCX0KKworfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdmVyaWZpZXIvQ2VydFZlcmlmaWNhdGlvblJlc3VsdC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdmVyaWZpZXIvQ2VydFZlcmlmaWNhdGlvblJlc3VsdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4YzNiOWUKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC92ZXJpZmllci9DZXJ0VmVyaWZpY2F0aW9uUmVzdWx0LmphdmEKQEAgLTAsMCArMSwyNTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudmVyaWZpZXI7CisKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaW5jaXBhbDsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuKjsKK2ltcG9ydCBqYXZhLnRleHQuRGF0ZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNpZ25lZGNvbnRlbnQuU2lnbmVkQ29udGVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNpZ25lZGNvbnRlbnQuU2lnbmVySW5mbzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuTWVzc2FnZXM7CisKKy8qKgorICogUmVzdWx0IG9mIHRoZSBzZXJ2aWNlCisgKi8KK3B1YmxpYyBjbGFzcyBDZXJ0VmVyaWZpY2F0aW9uUmVzdWx0IGltcGxlbWVudHMgSVZlcmlmaWNhdGlvblJlc3VsdCB7CisKKworCXByaXZhdGUgaW50IHJlc3VsdENvZGU7CisJcHJpdmF0ZSBpbnQgdmVyaWZpY2F0aW9uQ29kZTsKKwlwcml2YXRlIEV4Y2VwdGlvbiByZXN1bHRFeGNlcHRpb247CisKKwlwcml2YXRlIFNpZ25lZENvbnRlbnQgc2lnbmVkQ29udGVudDsKKwlwcml2YXRlIFN0cmluZyBzaWduZXJJbmZvOworCXByaXZhdGUgU3RyaW5nIHZlcmlmaWVySW5mbzsKKwlwcml2YXRlIENvbnRlbnRSZWZlcmVuY2UgY29udGVudFJlZmVyZW5jZTsKKwlwcml2YXRlIElGZWF0dXJlIGZlYXR1cmU7CisJcHJpdmF0ZSBib29sZWFuIGZlYXR1cmVWZXJpZmljYXRpb247CisJcHJpdmF0ZSBib29sZWFuIGFscmVhZHlTZWVuOworCisJcHVibGljIENlcnRWZXJpZmljYXRpb25SZXN1bHQoKSB7CisJfQorCQorCS8qCisJICogCisJICovCisJcHVibGljIGludCBnZXRSZXN1bHRDb2RlKCkgeworCQlyZXR1cm4gcmVzdWx0Q29kZTsKKwl9CisJCisJLyoKKwkgKiAKKwkgKi8KKwlwdWJsaWMgRXhjZXB0aW9uIGdldFZlcmlmaWNhdGlvbkV4Y2VwdGlvbigpIHsKKwkJcmV0dXJuIHJlc3VsdEV4Y2VwdGlvbjsKKwl9CisJCisJLyoKKwkgKiAKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRSZXN1bHRDb2RlKGludCBuZXdSZXN1bHRDb2RlKSB7CisJCXJlc3VsdENvZGUgPSBuZXdSZXN1bHRDb2RlOworCX0KKwkKKwkvKgorCSAqIAorCSAqLworCXB1YmxpYyB2b2lkIHNldFJlc3VsdEV4Y2VwdGlvbihFeGNlcHRpb24gbmV3UmVzdWx0RXhjZXB0aW9uKSB7CisJCXJlc3VsdEV4Y2VwdGlvbiA9IG5ld1Jlc3VsdEV4Y2VwdGlvbjsKKwl9CisJCisJLyoKKwkgKiAKKwkgKi8KKwlwdWJsaWMgaW50IGdldFZlcmlmaWNhdGlvbkNvZGUoKSB7CisJCXJldHVybiB2ZXJpZmljYXRpb25Db2RlOworCX0KKworCS8qCisJICogCisJICovCisJcHVibGljIHZvaWQgc2V0VmVyaWZpY2F0aW9uQ29kZShpbnQgdmVyaWZpY2F0aW9uQ29kZSkgeworCQl0aGlzLnZlcmlmaWNhdGlvbkNvZGUgPSB2ZXJpZmljYXRpb25Db2RlOworCX0KKworCXZvaWQgc2V0U2lnbmVkQ29udGVudChTaWduZWRDb250ZW50IHNpZ25lZENvbnRlbnQpIHsKKwkJdGhpcy5zaWduZWRDb250ZW50ID0gc2lnbmVkQ29udGVudDsKKwl9CisKKwlwdWJsaWMgU2lnbmVySW5mb1tdIGdldFNpZ25lcnMoKSB7CisJCXJldHVybiBzaWduZWRDb250ZW50LmdldFNpZ25lckluZm9zKCk7CisJfQorCisJLyoKKwkgKiBJbml0aWFsaXplcyB0aGUgc2lnbmVySW5mbyBhbmQgdGhlIFZlcmlmaWVySW5mbyBmcm9tIHRoZSBDZXJ0aWZpY2F0ZSBQYWlyCisJICovCisJcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVDZXJ0aWZpY2F0ZXMoKXsKKwkJWDUwOUNlcnRpZmljYXRlIGNlcnRSb290ID0gbnVsbDsKKwkJWDUwOUNlcnRpZmljYXRlIGNlcnRJc3N1ZXIgPSBudWxsOworCQlTaWduZXJJbmZvIHRydXN0ZWRTaWduZXI7CisJCVNpZ25lckluZm9bXSBzaWduZXJzID0gZ2V0U2lnbmVycygpOworCQlpZiAoc2lnbmVycy5sZW5ndGggPT0gMCkKKwkJCXJldHVybjsKKwkJdHJ1c3RlZFNpZ25lciA9IHNpZ25lcnNbMF07CisJCWZvciAoaW50IGkgPSAwOyBpIDwgc2lnbmVycy5sZW5ndGg7IGkrKykgeworCQkJaWYgKHNpZ25lcnNbaV0uaXNUcnVzdGVkKCkpIHsKKwkJCQl0cnVzdGVkU2lnbmVyID0gc2lnbmVyc1tpXTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlDZXJ0aWZpY2F0ZVtdIGNlcnRzID0gdHJ1c3RlZFNpZ25lci5nZXRDZXJ0aWZpY2F0ZUNoYWluKCk7CisJCWlmIChjZXJ0cyA9PSBudWxsIHx8IGNlcnRzLmxlbmd0aCA9PSAwKQorCQkJcmV0dXJuOworCQljZXJ0Um9vdCA9IChYNTA5Q2VydGlmaWNhdGUpIGNlcnRzW2NlcnRzLmxlbmd0aCAtIDFdOworCQljZXJ0SXNzdWVyID0gKFg1MDlDZXJ0aWZpY2F0ZSkgY2VydHNbMF07CisKKwkJU3RyaW5nQnVmZmVyIHN0cmIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJCXN0cmIuYXBwZW5kKGlzc3VlclN0cmluZyhjZXJ0SXNzdWVyLmdldFN1YmplY3RETigpKSk7CisJCXN0cmIuYXBwZW5kKCJcclxuIik7IC8vJE5PTi1OTFMtMSQKKwkJc3RyYi5hcHBlbmQoTkxTLmJpbmQoTWVzc2FnZXMuSmFyVmVyaWZpY2F0aW9uUmVzdWx0X1ZhbGlkQmV0d2VlbiwgKG5ldyBTdHJpbmdbXSB7IGRhdGVTdHJpbmcoY2VydElzc3Vlci5nZXROb3RCZWZvcmUoKSksIGRhdGVTdHJpbmcoY2VydElzc3Vlci5nZXROb3RBZnRlcigpKSB9KSkpOworCQlzdHJiLmFwcGVuZChjaGVja1ZhbGlkaXR5KHRydXN0ZWRTaWduZXIpKTsKKwkJc2lnbmVySW5mbyA9IHN0cmIudG9TdHJpbmcoKTsKKwkJaWYgKGNlcnRJc3N1ZXIgIT0gbnVsbCAmJiAhY2VydElzc3Vlci5lcXVhbHMoY2VydFJvb3QpKSB7CisJCQlzdHJiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwkKKwkJCXN0cmIuYXBwZW5kKGlzc3VlclN0cmluZyhjZXJ0SXNzdWVyLmdldElzc3VlckROKCkpKTsKKwkJCXN0cmIuYXBwZW5kKCJcclxuIik7IC8vJE5PTi1OTFMtMSQKKwkJCXN0cmIuYXBwZW5kKE5MUy5iaW5kKE1lc3NhZ2VzLkphclZlcmlmaWNhdGlvblJlc3VsdF9WYWxpZEJldHdlZW4sIChuZXcgU3RyaW5nW10geyBkYXRlU3RyaW5nKGNlcnRSb290LmdldE5vdEJlZm9yZSgpKSwgZGF0ZVN0cmluZyhjZXJ0Um9vdC5nZXROb3RBZnRlcigpKSB9KSkpOyAKKwkJCXZlcmlmaWVySW5mbyA9IHN0cmIudG9TdHJpbmcoKTsKKwkJfQorCisJfQorCisJLyoKKwkgKiBSZXR1cm5zIGEgU3RyaW5nIHRvIHNob3cgaWYgdGhlIGNlcnRpZmljYXRlIGlzIHZhbGlkCisJICovCisJcHJpdmF0ZSBTdHJpbmcgY2hlY2tWYWxpZGl0eShTaWduZXJJbmZvIHNpZ25lcikgeworCisJCXRyeSB7CisJCQlzaWduZWRDb250ZW50LmNoZWNrVmFsaWRpdHkoc2lnbmVyKTsKKwkJfSBjYXRjaCAoQ2VydGlmaWNhdGVFeHBpcmVkRXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiAoIlxyXG4iICsgTWVzc2FnZXMuSmFyVmVyaWZpY2F0aW9uUmVzdWx0X0V4cGlyZWRDZXJ0aWZpY2F0ZSk7ICAvLyROT04tTkxTLTEkCisJCX0gY2F0Y2ggKENlcnRpZmljYXRlTm90WWV0VmFsaWRFeGNlcHRpb24gZSkgeworCQkJcmV0dXJuICgiXHJcbiIgKyBNZXNzYWdlcy5KYXJWZXJpZmljYXRpb25SZXN1bHRfQ2VydGlmaWNhdGVOb3RZZXRWYWxpZCk7ICAvLyROT04tTkxTLTEkCisJCX0KKwkJcmV0dXJuICgiXHJcbiIgKyBNZXNzYWdlcy5KYXJWZXJpZmljYXRpb25SZXN1bHRfQ2VydGlmaWNhdGVWYWxpZCk7ICAvLyROT04tTkxTLTEkCisJfQorCisJLyoKKwkgKiBSZXR1cm5zIHRoZSBsYWJlbCBTdHJpbmcgZnJvbSBhIFg1MG5hbWUKKwkgKi8KKwlwcml2YXRlIFN0cmluZyBpc3N1ZXJTdHJpbmcoUHJpbmNpcGFsIHByaW5jaXBhbCkgeworLy8gMTk5MDIKKy8vCQl0cnkgeworLy8JCQlpZiAocHJpbmNpcGFsIGluc3RhbmNlb2YgWDUwME5hbWUpIHsKKy8vCQkJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisvLwkJCQlYNTAwTmFtZSBuYW1lID0gKFg1MDBOYW1lKSBwcmluY2lwYWw7CisvLwkJCQlidWYuYXBwZW5kKChuYW1lLmdldEROUXVhbGlmaWVyKCkgIT0gbnVsbCkgPyBuYW1lLmdldEROUXVhbGlmaWVyKCkgKyAiLCAiIDogIiIpOworLy8JCQkJYnVmLmFwcGVuZChuYW1lLmdldENvbW1vbk5hbWUoKSk7CisvLwkJCQlidWYuYXBwZW5kKChuYW1lLmdldE9yZ2FuaXphdGlvbmFsVW5pdCgpICE9IG51bGwpID8gIiwgIiArIG5hbWUuZ2V0T3JnYW5pemF0aW9uYWxVbml0KCkgOiAiIik7CisvLwkJCQlidWYuYXBwZW5kKChuYW1lLmdldE9yZ2FuaXphdGlvbigpICE9IG51bGwpID8gIiwgIiArIG5hbWUuZ2V0T3JnYW5pemF0aW9uKCkgOiAiIik7CisvLwkJCQlidWYuYXBwZW5kKChuYW1lLmdldExvY2FsaXR5KCkgIT0gbnVsbCkgPyAiLCAiICsgbmFtZS5nZXRMb2NhbGl0eSgpIDogIiIpOworLy8JCQkJYnVmLmFwcGVuZCgobmFtZS5nZXRDb3VudHJ5KCkgIT0gbnVsbCkgPyAiLCAiICsgbmFtZS5nZXRDb3VudHJ5KCkgOiAiIik7CisvLwkJCQlyZXR1cm4gbmV3IFN0cmluZyhidWYpOworLy8JCQl9CisvLwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKy8vCQkJVXBkYXRlQ29yZS53YXJuKCJFcnJvciBwYXJzaW5nIFg1MDAgQ2VydGlmaWNhdGUiLGUpOworLy8JCX0KKwkJcmV0dXJuIHByaW5jaXBhbC50b1N0cmluZygpOworCX0KKworCS8qCisJICogCisJICovCisJcHJpdmF0ZSBTdHJpbmcgZGF0ZVN0cmluZyhEYXRlIGRhdGUpIHsKKwkJcmV0dXJuIERhdGVGb3JtYXQuZ2V0RGF0ZUluc3RhbmNlKCkuZm9ybWF0KGRhdGUpOworCX0KKworCS8qCisJICoKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFNpZ25lckluZm8oKSB7CisJCWlmIChzaWduZXJJbmZvPT1udWxsKSBpbml0aWFsaXplQ2VydGlmaWNhdGVzKCk7CisJCXJldHVybiBzaWduZXJJbmZvOworCX0KKworCS8qCisJICoKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFZlcmlmaWVySW5mbygpIHsKKwkJaWYgKHNpZ25lckluZm89PW51bGwpIGluaXRpYWxpemVDZXJ0aWZpY2F0ZXMoKTsJCQorCQlyZXR1cm4gdmVyaWZpZXJJbmZvOworCX0KKworCS8qCisJICoKKwkgKi8KKwlwdWJsaWMgQ29udGVudFJlZmVyZW5jZSBnZXRDb250ZW50UmVmZXJlbmNlKCkgeworCQlyZXR1cm4gY29udGVudFJlZmVyZW5jZTsKKwl9CisKKwkvKgorCSAqIAorCSAqLworCXB1YmxpYyB2b2lkIHNldENvbnRlbnRSZWZlcmVuY2UoQ29udGVudFJlZmVyZW5jZSByZWYpIHsKKwkJdGhpcy5jb250ZW50UmVmZXJlbmNlID0gcmVmOworCX0KKworCisJLyoKKwkgKgorCSAqLworCXB1YmxpYyBJRmVhdHVyZSBnZXRGZWF0dXJlKCkgeworCQlyZXR1cm4gZmVhdHVyZTsKKwl9CisKKwkvKgorCSAqIAorCSAqLworCXB1YmxpYyB2b2lkIHNldEZlYXR1cmUoSUZlYXR1cmUgZmVhdHVyZSkgeworCQl0aGlzLmZlYXR1cmUgPSBmZWF0dXJlOworCX0KKworCS8qCisJICogCisJICovCisJcHVibGljIFN0cmluZyBnZXRUZXh0KCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKworCS8qCisJICogCisJICovCisJcHVibGljIGJvb2xlYW4gaXNGZWF0dXJlVmVyaWZpY2F0aW9uKCkgeworCQlyZXR1cm4gZmVhdHVyZVZlcmlmaWNhdGlvbjsKKwl9CisJCisJLyoKKwkgKiAKKwkgKi8KKwlwdWJsaWMgdm9pZCBpc0ZlYXR1cmVWZXJpZmljYXRpb24oYm9vbGVhbiBmZWF0dXJlVmVyaWZpY2F0aW9uKSB7CisJCXRoaXMuZmVhdHVyZVZlcmlmaWNhdGlvbiA9IGZlYXR1cmVWZXJpZmljYXRpb247CisJfQorCisJLyoKKwkgKgorCSAqLworCXB1YmxpYyBib29sZWFuIGFscmVhZHlTZWVuKCkgeworCQlyZXR1cm4gYWxyZWFkeVNlZW47CisJfQorCisJLyoKKwkgKiAKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBhbHJlYWR5U2Vlbihib29sZWFuIHNlZW4pIHsKKwkJcmV0dXJuIHRoaXMuYWxyZWFkeVNlZW4gPSBzZWVuOworCX0KKworfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdmVyaWZpZXIvQ2VydFZlcmlmaWVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC92ZXJpZmllci9DZXJ0VmVyaWZpZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGM4NDQwCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdmVyaWZpZXIvQ2VydFZlcmlmaWVyLmphdmEKQEAgLTAsMCArMSwyNzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudmVyaWZpZXI7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuamFyLkphckZpbGU7CitpbXBvcnQgamF2YS51dGlsLnppcC5aaXBFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zaWduZWRjb250ZW50Lio7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLk1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLlVwZGF0ZUNvcmU7CisKKy8qKgorICogVGhlIEphclZlcmlmaWVyIHdpbGwgY2hlY2sgdGhlIGludGVncml0eSBvZiB0aGUgSkFSLgorICogSWYgdGhlIEphciBpcyBzaWduZWQgYW5kIHRoZSBpbnRlZ3JpdHkgaXMgdmFsaWRhdGVkLAorICogaXQgd2lsbCBjaGVjayBpZiBvbmUgb2YgdGhlIGNlcnRpZmljYXRlIG9mIGVhY2ggZmlsZQorICogaXMgaW4gb25lIG9mIHRoZSBrZXlzdG9yZS4KKyAqCisgKi8KKworcHVibGljIGNsYXNzIENlcnRWZXJpZmllciBleHRlbmRzIFZlcmlmaWVyIHsKKworCXByaXZhdGUgQ2VydFZlcmlmaWNhdGlvblJlc3VsdCByZXN1bHQ7CisJcHJpdmF0ZSBib29sZWFuIGFjY2VwdFVuc2lnbmVkRmlsZXM7CisJcHJpdmF0ZSBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3I7CisJcHJpdmF0ZSBGaWxlIGphckZpbGU7CisJcHJpdmF0ZSBTaWduZWRDb250ZW50RmFjdG9yeSBmYWN0b3J5OworCXByaXZhdGUgTGlzdCB0cnVzdGVkU2lnbmVySW5mb3M7CisKKwkvKgorCSAqIERlZmF1bHQgQ29uc3RydWN0b3IKKwkgKi8KKwlwdWJsaWMgQ2VydFZlcmlmaWVyKFNpZ25lZENvbnRlbnRGYWN0b3J5IGZhY3RvcnkpIHsKKwkJdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTsKKwkJaW5pdGlhbGl6ZSgpOworCX0KKworCisJLyoKKwkgKiAKKwkgKi8KKwlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgpIHsKKwkJcmVzdWx0ID0gbnVsbDsKKwkJYWNjZXB0VW5zaWduZWRGaWxlcyA9IGZhbHNlOworCX0KKworCS8qCisJICogaW5pdAorCSAqLworCXByaXZhdGUgdm9pZCBpbml0KElGZWF0dXJlIGZlYXR1cmUsIENvbnRlbnRSZWZlcmVuY2UgY29udGVudFJlZikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlqYXJGaWxlID0gbnVsbDsKKwkJaWYgKGNvbnRlbnRSZWYgaW5zdGFuY2VvZiBKYXJDb250ZW50UmVmZXJlbmNlKSB7CisJCQlKYXJDb250ZW50UmVmZXJlbmNlIGphclJlZmVyZW5jZSA9IChKYXJDb250ZW50UmVmZXJlbmNlKSBjb250ZW50UmVmOworCQkJdHJ5IHsKKwkJCQlqYXJGaWxlID0gamFyUmVmZXJlbmNlLmFzRmlsZSgpOworCQkJCWlmIChVcGRhdGVDb3JlLkRFQlVHICYmIFVwZGF0ZUNvcmUuREVCVUdfU0hPV19JTlNUQUxMKQorCQkJCQlVcGRhdGVDb3JlLmRlYnVnKCJBdHRlbXB0aW5nIHRvIHJlYWQgSkFSIGZpbGU6IitqYXJGaWxlKTsgLy8kTk9OLU5MUy0xJAorCQkJCisJCQkJLy8gIyBvZiBlbnRyaWVzCisJCQkJaWYgKCFqYXJGaWxlLmV4aXN0cygpKSB0aHJvdyBuZXcgSU9FeGNlcHRpb24oKTsKKwkJCQlKYXJGaWxlIGphciA9IG5ldyBKYXJGaWxlKGphckZpbGUpOworCQkJCWlmIChqYXIgIT1udWxsKXsKKwkJCQkJdHJ5IHsKKwkJCQkJCWphci5jbG9zZSgpOworCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworCQkJCQkJLy8gdW5jaGVja2VkCisJCQkJCX0KKwkJCQl9CisJCQl9IGNhdGNoIChaaXBFeGNlcHRpb24gZSl7CisJCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oTkxTLmJpbmQoTWVzc2FnZXMuSmFyVmVyaWZpZXJfSW52YWxpZEphciwgKG5ldyBTdHJpbmdbXSB7IGphclJlZmVyZW5jZS50b1N0cmluZygpIH0pKSwgZSk7CQkJCQorCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLkphclZlcmlmaWVyX1VuYWJsZVRvQWNjZXNzSmFyLCAobmV3IFN0cmluZ1tdIHsgamFyUmVmZXJlbmNlLnRvU3RyaW5nKCkgfSkpLCBlKTsKKwkJCX0KKwkJfQorCisJCXJlc3VsdCA9IG5ldyBDZXJ0VmVyaWZpY2F0aW9uUmVzdWx0KCk7CisJCXJlc3VsdC5zZXRWZXJpZmljYXRpb25Db2RlKElWZXJpZmljYXRpb25SZXN1bHQuVU5LTk9XTl9FUlJPUik7CisJCXJlc3VsdC5zZXRSZXN1bHRFeGNlcHRpb24obnVsbCk7CisJCXJlc3VsdC5zZXRGZWF0dXJlKGZlYXR1cmUpOworCQlyZXN1bHQuc2V0Q29udGVudFJlZmVyZW5jZShjb250ZW50UmVmKTsKKwl9CisKKwkvKgorCSAqIEBwYXJhbSBuZXdNb25pdG9yIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yCisJICovCisJcHJpdmF0ZSB2b2lkIHNldE1vbml0b3IoSVByb2dyZXNzTW9uaXRvciBuZXdNb25pdG9yKSB7CisJCW1vbml0b3IgPSBuZXdNb25pdG9yOworCX0KKworCS8qCisJICogQHNlZSBJVmVyaWZpZXIjdmVyaWZ5KElGZWF0dXJlLENvbnRlbnRSZWZlcmVuY2UsYm9vbGVhbiwgSW5zdGFsbE1vbml0b3IpCisJICovCisJcHVibGljIElWZXJpZmljYXRpb25SZXN1bHQgdmVyaWZ5KAorCQlJRmVhdHVyZSBmZWF0dXJlLAorCQlDb250ZW50UmVmZXJlbmNlIHJlZmVyZW5jZSwKKwkJYm9vbGVhbiBpc0ZlYXR1cmVWZXJpZmljYXRpb24sCisJCUluc3RhbGxNb25pdG9yIG1vbml0b3IpCisJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKKworCQlpZiAocmVmZXJlbmNlID09IG51bGwpCisJCQlyZXR1cm4gcmVzdWx0OworCisJCS8vIGlmIHBhcmVudCBrbm93cyBob3cgdG8gdmVyaWZ5LCBhc2sgdGhlIHBhcmVudCBmaXJzdAorCQlpZiAoZ2V0UGFyZW50KCkgIT0gbnVsbCkgeworCQkJSVZlcmlmaWNhdGlvblJlc3VsdCB2ciA9CisJCQkJZ2V0UGFyZW50KCkudmVyaWZ5KGZlYXR1cmUsIHJlZmVyZW5jZSwgaXNGZWF0dXJlVmVyaWZpY2F0aW9uLCBtb25pdG9yKTsKKwkJCWlmICh2ci5nZXRWZXJpZmljYXRpb25Db2RlKCkgIT0gSVZlcmlmaWNhdGlvblJlc3VsdC5UWVBFX0VOVFJZX1VOUkVDT0dOSVpFRCkKKwkJCQlyZXR1cm4gdnI7CisJCX0KKworCQkvLyB0aGUgcGFyZW50IGNvdWxkbid0IHZlcmlmeQorCQlzZXRNb25pdG9yKG1vbml0b3IpOworCQlpbml0KGZlYXR1cmUsIHJlZmVyZW5jZSk7CisJCXJlc3VsdC5pc0ZlYXR1cmVWZXJpZmljYXRpb24oaXNGZWF0dXJlVmVyaWZpY2F0aW9uKTsKKworCQlpZiAoamFyRmlsZSE9bnVsbCkgeworCQkJcmVzdWx0ID0gdmVyaWZ5KGphckZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIHJlZmVyZW5jZS5nZXRJZGVudGlmaWVyKCkpOworCQl9IGVsc2UgeworCQkJcmVzdWx0LnNldFZlcmlmaWNhdGlvbkNvZGUoSVZlcmlmaWNhdGlvblJlc3VsdC5UWVBFX0VOVFJZX1VOUkVDT0dOSVpFRCk7CisJCX0KKworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qCisJICogCisJICovCisJcHJpdmF0ZSBDZXJ0VmVyaWZpY2F0aW9uUmVzdWx0IHZlcmlmeShTdHJpbmcgZmlsZSwgU3RyaW5nIGlkZW50aWZpZXIpIHsKKworCQl0cnkgeworCQkJU2lnbmVkQ29udGVudCB2ZXJpZmllciA9IGZhY3RvcnkuZ2V0U2lnbmVkQ29udGVudChuZXcgRmlsZShmaWxlKSk7CisJCQkvLyB2ZXJpZnkgaW50ZWdyaXR5CisJCQl2ZXJpZnlJbnRlZ3JpdHkodmVyaWZpZXIsIGlkZW50aWZpZXIpOworCisJCQkvL2lmIHVzZXIgYWxyZWFkeSBzYWlkIHllcworCQkJcmVzdWx0LmFscmVhZHlTZWVuKGFscmVhZHlWYWxpZGF0ZWQoKSk7CisKKwkJCS8vIHNhdmUgdGhlIGZhY3QgdGhlIGZpbGUgaXMgbm90IHNpZ25lZCwgc28gdGhlIHVzZXIgd2lsbCBub3QgYmUgcHJvbXB0ZWQgYWdhaW4gCisJCQlpZiAocmVzdWx0LmdldFZlcmlmaWNhdGlvbkNvZGUoKQorCQkJCT09IElWZXJpZmljYXRpb25SZXN1bHQuVFlQRV9FTlRSWV9OT1RfU0lHTkVEKSB7CisJCQkJYWNjZXB0VW5zaWduZWRGaWxlcyA9IHRydWU7CisJCQl9CisKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCXJlc3VsdC5zZXRWZXJpZmljYXRpb25Db2RlKElWZXJpZmljYXRpb25SZXN1bHQuVU5LTk9XTl9FUlJPUik7CisJCQlyZXN1bHQuc2V0UmVzdWx0RXhjZXB0aW9uKGUpOworCQl9CisKKwkJaWYgKG1vbml0b3IgIT0gbnVsbCkgeworCQkJbW9uaXRvci53b3JrZWQoMSk7CisJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKKwkJCQlyZXN1bHQuc2V0VmVyaWZpY2F0aW9uQ29kZShJVmVyaWZpY2F0aW9uUmVzdWx0LlZFUklGSUNBVElPTl9DQU5DRUxMRUQpOworCQkJfQorCQl9CisKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKgorCSAqIFZlcmlmaWVzIHRoZSBpbnRlZ3JpdHkgb2YgdGhlIEpBUgorCSAqLworCXByaXZhdGUgdm9pZCB2ZXJpZnlJbnRlZ3JpdHkoU2lnbmVkQ29udGVudCB2ZXJpZmllciwgU3RyaW5nIGlkZW50aWZpZXIpIHsKKwkJdHJ5IHsKKwkJCWlmICh2ZXJpZmllci5pc1NpZ25lZCgpKSB7CisJCQkJLy8gSWYgdGhlIEpBUiBpcyBzaWduZWQgYW5kIGludmFsaWQgdGhlbiBtYXJrIGFzIGNvcnJ1cHRlZAorCQkJCWlmIChoYXNWYWxpZENvbnRlbnQodmVyaWZpZXIuZ2V0U2lnbmVkRW50cmllcygpKSkgeworCQkJCQlyZXN1bHQuc2V0U2lnbmVkQ29udGVudCh2ZXJpZmllcik7CisJCQkJCVNpZ25lckluZm9bXSBzaWduZXJzID0gdmVyaWZpZXIuZ2V0U2lnbmVySW5mb3MoKTsKKwkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaWduZXJzLmxlbmd0aDsgaSsrKQorCQkJCQkJaWYgKHNpZ25lcnNbaV0uaXNUcnVzdGVkKCkpIHsKKwkJCQkJCQlyZXN1bHQuc2V0VmVyaWZpY2F0aW9uQ29kZShJVmVyaWZpY2F0aW9uUmVzdWx0LlRZUEVfRU5UUllfU0lHTkVEX1JFQ09HTklaRUQpOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQlpZiAocmVzdWx0LmdldFZlcmlmaWNhdGlvbkNvZGUoKSAhPSBJVmVyaWZpY2F0aW9uUmVzdWx0LlRZUEVfRU5UUllfU0lHTkVEX1JFQ09HTklaRUQpCisJCQkJCQlyZXN1bHQuc2V0VmVyaWZpY2F0aW9uQ29kZShJVmVyaWZpY2F0aW9uUmVzdWx0LlRZUEVfRU5UUllfU0lHTkVEX1VOUkVDT0dOSVpFRCk7CisJCQkJfSBlbHNlCisJCQkJCXJlc3VsdC5zZXRWZXJpZmljYXRpb25Db2RlKElWZXJpZmljYXRpb25SZXN1bHQuVFlQRV9FTlRSWV9DT1JSVVBURUQpOworCQkJfSBlbHNlIHsKKwkJCQlyZXN1bHQuc2V0VmVyaWZpY2F0aW9uQ29kZShJVmVyaWZpY2F0aW9uUmVzdWx0LlRZUEVfRU5UUllfTk9UX1NJR05FRCk7CisJCQkJcmV0dXJuOworCQkJfQorCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJcmVzdWx0LnNldFZlcmlmaWNhdGlvbkNvZGUoSVZlcmlmaWNhdGlvblJlc3VsdC5VTktOT1dOX0VSUk9SKTsKKwkJCXJlc3VsdC5zZXRSZXN1bHRFeGNlcHRpb24oZSk7CisJCX0KKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gaGFzVmFsaWRDb250ZW50KFNpZ25lZENvbnRlbnRFbnRyeVtdIHNpZ25lZEVudHJpZXMpIHsKKwkJdHJ5IHsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2lnbmVkRW50cmllcy5sZW5ndGg7IGkrKykKKwkJCQlzaWduZWRFbnRyaWVzW2ldLnZlcmlmeSgpOworCQl9IGNhdGNoIChJbnZhbGlkQ29udGVudEV4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKworCS8qCisJICogCisJICovCisJcHJpdmF0ZSBib29sZWFuIGFscmVhZHlWYWxpZGF0ZWQoKSB7CisJCWludCB2ZXJpZnlDb2RlID0gcmVzdWx0LmdldFZlcmlmaWNhdGlvbkNvZGUoKTsKKwkJaWYgKHZlcmlmeUNvZGUgPT0gSVZlcmlmaWNhdGlvblJlc3VsdC5UWVBFX0VOVFJZX05PVF9TSUdORUQpCisJCQlyZXR1cm4gKGFjY2VwdFVuc2lnbmVkRmlsZXMpOworCQlpZiAodmVyaWZ5Q29kZSA9PSBJVmVyaWZpY2F0aW9uUmVzdWx0LlVOS05PV05fRVJST1IpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmIChyZXN1bHQuZ2V0U2lnbmVycygpICE9IG51bGwpIHsgLy9nZXRUcnVzdGVkQ2VydGlmaWNhdGVzKCkgY2FuJ3QgYmUgbnVsbCBhcyBpdCBpcyBsYXp5IGluaXRpYWxpemVkCisJCQlJdGVyYXRvciBpdGVyID0gZ2V0VHJ1c3RlZEluZm9zKCkuaXRlcmF0b3IoKTsKKwkJCVNpZ25lckluZm9bXSBzaWduZXJzID0gcmVzdWx0LmdldFNpZ25lcnMoKTsKKworCQkJLy8gY2hlY2sgaWYgdGhpcyBpcyBub3QgYSB1c2VyIGFjY2VwdGVkIGNlcnRpZmljYXRlIGZvciB0aGlzIGZlYXR1cmUJCisJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKwkJCQlTaWduZXJJbmZvIGNoYWluID0gKFNpZ25lckluZm8pIGl0ZXIubmV4dCgpOworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2lnbmVycy5sZW5ndGg7IGkrKykKKwkJCQkJaWYgKGNoYWluLmVxdWFscyhzaWduZXJzW2ldKSkKKwkJCQkJCXJldHVybiB0cnVlOworCQkJfQorCisJCQkvLyBpZiBjZXJ0aWZpY2F0ZSBwYWlyIG5vdCBmb3VuZCBpbiB0cnVzdGVkIGFkZCBpdCBmb3IgbmV4dCB0aW1lCisJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpZ25lcnMubGVuZ3RoOyBpKyspIHsKKwkJCQlhZGRUcnVzdGVkU2lnbmVySW5mbyhzaWduZXJzW2ldKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKgorCSAqIAorCSAqLworCXByaXZhdGUgdm9pZCBhZGRUcnVzdGVkU2lnbmVySW5mbyhTaWduZXJJbmZvIHNpZ25lcikgeworCQlpZiAodHJ1c3RlZFNpZ25lckluZm9zID09IG51bGwpCisJCQl0cnVzdGVkU2lnbmVySW5mb3MgPSBuZXcgQXJyYXlMaXN0KCk7CisJCWlmIChzaWduZXIgIT0gbnVsbCkKKwkJCXRydXN0ZWRTaWduZXJJbmZvcy5hZGQoc2lnbmVyKTsKKwl9CisKKwkvKgorCSAqIAorCSAqLworCXByaXZhdGUgTGlzdCBnZXRUcnVzdGVkSW5mb3MoKSB7CisJCWlmICh0cnVzdGVkU2lnbmVySW5mb3MgPT0gbnVsbCkKKwkJCXRydXN0ZWRTaWduZXJJbmZvcyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJcmV0dXJuIHRydXN0ZWRTaWduZXJJbmZvczsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElWZXJpZmllciNzZXRQYXJlbnQoSVZlcmlmaWVyKQorCSAqLworCXB1YmxpYyB2b2lkIHNldFBhcmVudChJVmVyaWZpZXIgcGFyZW50VmVyaWZpZXIpIHsKKwkJc3VwZXIuc2V0UGFyZW50KHBhcmVudFZlcmlmaWVyKTsKKwkJaW5pdGlhbGl6ZSgpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy8uY2xhc3NwYXRoIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy8uY2xhc3NwYXRoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhOTFlOGUKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzLy5jbGFzc3BhdGgKQEAgLTAsMCArMSw3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KKzxjbGFzc3BhdGg+DQorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPg0KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLyIvPg0KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCis8L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzLy5jdnNpZ25vcmUgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzLy5jdnNpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVlODJkNwotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvLmN2c2lnbm9yZQpAQCAtMCwwICsxIEBACitiaW4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzLy5wcm9qZWN0IGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy8ucHJvamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWNiNTRhCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy8ucHJvamVjdApAQCAtMCwwICsxLDMzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KKzxwcm9qZWN0RGVzY3JpcHRpb24+DQorCTxuYW1lPm9yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlczwvbmFtZT4NCisJPGNvbW1lbnQ+PC9jb21tZW50Pg0KKwk8cHJvamVjdHM+DQorCQk8cHJvamVjdD5vcmcuYXBhY2hlLnhlcmNlczwvcHJvamVjdD4NCisJCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmNvcmUuYm9vdDwvcHJvamVjdD4NCisJCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmNvcmUucnVudGltZTwvcHJvamVjdD4NCisJCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlPC9wcm9qZWN0Pg0KKwk8L3Byb2plY3RzPg0KKwk8YnVpbGRTcGVjPg0KKwkJPGJ1aWxkQ29tbWFuZD4NCisJCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCisJCQk8YXJndW1lbnRzPg0KKwkJCTwvYXJndW1lbnRzPg0KKwkJPC9idWlsZENvbW1hbmQ+DQorCQk8YnVpbGRDb21tYW5kPg0KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS51aS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQorCQkJPGFyZ3VtZW50cz4NCisJCQk8L2FyZ3VtZW50cz4NCisJCTwvYnVpbGRDb21tYW5kPg0KKwkJPGJ1aWxkQ29tbWFuZD4NCisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUudWkuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCisJCQk8YXJndW1lbnRzPg0KKwkJCTwvYXJndW1lbnRzPg0KKwkJPC9idWlsZENvbW1hbmQ+DQorCTwvYnVpbGRTcGVjPg0KKwk8bmF0dXJlcz4NCisJCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPg0KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUudWkuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnRlYW0uY3ZzLmNvcmUuY3ZzbmF0dXJlPC9uYXR1cmU+DQorCTwvbmF0dXJlcz4NCis8L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNDlmZjkKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpAQCAtMCwwICsxLDY0IEBACisjV2VkIEZlYiAxMSAxMzowMjo1NyBFU1QgMjAwOQorZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uY29tcGFyaW5nSWRlbnRpY2FsPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVhZENvZGU9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhdGFsT3B0aW9uYWxFcnJvcj1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSGFzaENvZGVNZXRob2Q9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1N5bmNocm9uaXplZE9uSW5oZXJpdGVkTWV0aG9kPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsUmVmZXJlbmNlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucGFyYW1ldGVyQXNzaWdubWVudD1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3RlbnRpYWxOdWxsUmVmZXJlbmNlPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50TnVsbENoZWNrPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZWR1bmRhbnRTdXBlcmludGVyZmFjZT1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbkV4ZW1wdEV4Y2VwdGlvbkFuZFRocm93YWJsZT1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uSW5jbHVkZURvY0NvbW1lbnRSZWZlcmVuY2U9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlckluY2x1ZGVEb2NDb21tZW50UmVmZXJlbmNlPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRXYXJuaW5nVG9rZW49d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL01FVEEtSU5GL01BTklGRVNULk1GIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9NRVRBLUlORi9NQU5JRkVTVC5NRgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjM5NDI1Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMCwwICsxLDEzIEBACitNYW5pZmVzdC1WZXJzaW9uOiAxLjAKK0J1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKK0J1bmRsZS1OYW1lOiAlbmFtZQorQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzOyBzaW5nbGV0b246PXRydWUKK0J1bmRsZS1WZXJzaW9uOiAyLjAuMAorQnVuZGxlLUNsYXNzUGF0aDogdXBkYXRlZXhhbXBsZXMuamFyCitCdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLmNvbXBhdGliaWxpdHkuUGx1Z2luQWN0aXZhdG9yCitCdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXItbmFtZQorQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCitSZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbXBhdGliaWxpdHksCisgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUsCisgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSIyLjEiCitCdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9TY3JhcGJvb2syLmpwYWdlIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9TY3JhcGJvb2syLmpwYWdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1ZGE5OWEKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL1NjcmFwYm9vazIuanBhZ2UKQEAgLTAsMCArMSwxMTEgQEAKK1NpdGVNYW5hZ2VyLmdldFNpdGUoVVJMKXRocm93cyBDb3JlRXhjZXB0aW9uDQorICBTdHJpbmcgdHlwZSA9IGdldFR5cGVGb3Jwcm90b2NvbChVUkwuZ2V0cHJvdG9jb2wpOw0KKyAgdHJ5IHsNCisgICAgaWYgKHR5cGUgIT0gbnVsbCl7DQorCWF0dGVtcHRDcmVhdGlvblNpdGUodHlwZSxVUkwpOw0KKyAgICB9IGVsc2Ugew0KKwlhdHRlbXB0Q3JlYXRpb25TaXRlKCJodHRwIixVUkwpOw0KKyAgICB9DQorICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpew0KKyAgICB0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbigiQ2Fubm90IGNyZWF0ZSBzaXRlIixlLmdldE1lc3NhZ2UoKSk7DQorICB9DQorDQorU2l0ZU1hbmFnZXIuYXR0ZW1wdENyZWF0aW9uU2l0ZSh0eXBlLFVSTCl0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KKyAgdHJ5IHsNCisgICAgY3JlYXRlU2l0ZSh0eXBlLFVSTCk7DQorICB9IGNhdGNoIChJbnZhbGlkVHlwZUV4Y2VwdGlvbiBlKXsNCisgICAgdHJ5IHsNCisgICAgICBjcmVhdGVTaXRlKGUuZ2V0UmVhbFR5cGUoKSxVUkwpOw0KKyAgICB9IGNhdGNoIChJbnZhbGlkU2l0ZUV4ZXB0aW9uIGUpew0KKyAgICAgIHRocm93IG5ldyBDb3JlRXhjZXB0aW9uKCJXcm9uZyBzaXRlIHR5cGUiKTsNCisgICAgfQ0KKyAgfQ0KKw0KK1NpdGVNYW5hZ2VyLmNyZWF0ZVNpdGUodHlwZSxVUkwpIHRocm93cyBDb3JlRXhlcHRpb24sIEludmFsaWRTaXRlVHlwZUV4Y2VwdGlvbg0KKw0KKw0KK3RyeSB7DQorCQkJDQorCWZhY3RvcnkuY3JlYXRlU2l0ZSh1cmwsIGZvcmNlQ3JlYXRpb24pOw0KKwkNCit9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQorCS8vIGlmIHRoZSBVUkwgaXMgcG9pbnRpbmcgdG8gZWl0aGVyIGEgZmlsZSANCisvLyBvciBhIGRpcmVjdG9yeSwgd2l0aG91dCByZWZlcmVuY2UJCQkNCitpZiAodXJsLmdldFJlZigpICE9IG51bGwpIHsNCisJLy8gNCBub3RoaW5nIHdlIGNhbiBkbw0KKwl0aHJvdyBuZXdDb3JlRXhjZXB0aW9uKCJFcnJvciBhY2Nlc3NpbmcgdXJsOiIrdXJsLnRvRXh0ZXJuYWxGb3JtKCkrIlxyXG4iK2UuZ2V0TWVzc2FnZSgpLGUpOw0KK30gZWxzZSBpZiAodXJsLmdldEZpbGUoKS5lbmRzV2l0aCgiLyIpKSB7DQorCS8vIDEgdHJ5IHRvIGFkZCBzaXRlLnhtbA0KKwl0cnkgew0KKwkJdXJsID0gbmV3IFVSTCh1cmwsU2l0ZS5TSVRFX1hNTCk7DQorCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlMSl7DQorCQl0aHJvdyBuZXdDb3JlRXhjZXB0aW9uKCJDYW5ub3QgY3JlYXRlIFVSTDoiK3VybC50b0V4dGVybmFsRm9ybSgpKyIrIitTaXRlLlNJVEVfWE1MLGUxKTsNCisJfQ0KKwl0cnkgew0KKwkJc2l0ZSA9IGZhY3RvcnkuY3JlYXRlU2l0ZSh1cmwsIGZvcmNlQ3JlYXRpb24pOw0KKwl9IGNhdGNoIChQYXJzaW5nRXhjZXB0aW9uIGUxKXsNCisJCXRocm93IG5ld0NvcmVFeGNlcHRpb24oIkVycm9yIHBhcnNpbmcgVVJMOiIrdXJsLnRvRXh0ZXJuYWxGb3JtKCkrIlxyXG4iK2UxLmdldE1lc3NhZ2UoKSxlMSk7CQkJCQkNCisJfSBjYXRjaCAoSU9FeGNlcHRpb24gZTEpew0KKwkJdGhyb3cgbmV3Q29yZUV4Y2VwdGlvbigiRXJyb3IgYWNjZXNzaW5nIHVybDoiK3VybC50b0V4dGVybmFsRm9ybSgpKyJcclxuIitlMS5nZXRNZXNzYWdlKCksZTEpOwkJCQkJDQorCX0NCit9IGVsc2UgaWYgKHVybC5nZXRGaWxlKCkuZW5kc1dpdGgoU2l0ZS5TSVRFX1hNTCkpIHsNCisJLy8gMyBub3RoaW5nIHdlIGNhbiBkbw0KKwl0aHJvdyBuZXdDb3JlRXhjZXB0aW9uKCJFcnJvciBhY2Nlc3NpbmcgdXJsOiIrdXJsLnRvRXh0ZXJuYWxGb3JtKCkrIlxyXG4iK2UuZ2V0TWVzc2FnZSgpLGUpOw0KK30gZWxzZSB7DQorCS8vIDIgdHJ5IHRvIGFkZCAvc2l0ZS54bWwNCisJdHJ5IHsNCisJCXVybCA9IG5ldyBVUkwodXJsLmdldFByb3RvY29sKCksdXJsLmdldEhvc3QoKSwgdXJsLmdldFBvcnQoKSwgdXJsLmdldEZpbGUoKSsiLyIrU2l0ZS5TSVRFX1hNTCk7DQorCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlMSl7DQorCQl0aHJvdyBuZXdDb3JlRXhjZXB0aW9uKCJDYW5ub3QgY3JlYXRlIFVSTDoiK3VybC50b0V4dGVybmFsRm9ybSgpKyIrIitTaXRlLlNJVEVfWE1MLGUxKTsNCisJfQ0KKwkNCisJdHJ5IHsNCisJCXNpdGUgPSBmYWN0b3J5LmNyZWF0ZVNpdGUodXJsLCBmb3JjZUNyZWF0aW9uKTsNCisJfSBjYXRjaCAoUGFyc2luZ0V4Y2VwdGlvbiBlMSl7DQorCQl0aHJvdyBuZXdDb3JlRXhjZXB0aW9uKCJFcnJvciBwYXJzaW5nIFVSTDoiK3VybC50b0V4dGVybmFsRm9ybSgpKyJcclxuIitlMS5nZXRNZXNzYWdlKCkrIlxyXG5QcmV2aW91cyBJbnB1dC9PdXRwdXQgRXJyb3I6IitlLmdldE1lc3NhZ2UoKSxlMSk7CQkJCQkNCisJfSBjYXRjaCAoSU9FeGNlcHRpb24gZTEpew0KKwkJdGhyb3cgbmV3Q29yZUV4Y2VwdGlvbigiRXJyb3IgYWNjZXNzaW5nIHVybDoiK3VybC50b0V4dGVybmFsRm9ybSgpKyJcclxuIitlMS5nZXRNZXNzYWdlKCkrIlxyXG5QcmV2aW91cyBJbnB1dC9PdXRwdXQgRXJyb3I6IitlLmdldE1lc3NhZ2UoKSxlMSk7CQkJCQkNCisJCQkJfQkJCQkNCisJCQl9DQorDQorCQl9IGNhdGNoIChQYXJzaW5nRXhjZXB0aW9uIGUpIHsNCisJCQkNCisJCQkvLyBpZiB0aGUgVVJMIGlzIHBvaW50aW5nIHRvIGVpdGhlciBhIGZpbGUgDQorLy8gb3IgYSBkaXJlY3RvcnksIHdpdGhvdXQgcmVmZXJlbmNlCQkJDQoraWYgKHVybC5nZXRSZWYoKSAhPSBudWxsKSB7DQorCS8vIDQgbm90aGluZyB3ZSBjYW4gZG8NCisJdGhyb3cgbmV3Q29yZUV4Y2VwdGlvbigiRXJyb3IgcGFyc2luZyBVUkw6Iit1cmwudG9FeHRlcm5hbEZvcm0oKSsiXHJcbiIrZS5nZXRNZXNzYWdlKCksZSk7DQorfSBlbHNlIGlmICh1cmwuZ2V0RmlsZSgpLmVuZHNXaXRoKCIvIikpIHsNCisJLy8gMSB0cnkgdG8gYWRkIHNpdGUueG1sDQorCXRyeSB7DQorCQl1cmwgPSBuZXcgVVJMKHVybCxTaXRlLlNJVEVfWE1MKTsNCisJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUxKXsNCisJCXRocm93IG5ld0NvcmVFeGNlcHRpb24oIkNhbm5vdCBjcmVhdGUgVVJMOiIrdXJsLnRvRXh0ZXJuYWxGb3JtKCkrIisiK1NpdGUuU0lURV9YTUwsZTEpOw0KKwl9DQorCXRyeSB7DQorCQlzaXRlID0gZmFjdG9yeS5jcmVhdGVTaXRlKHVybCwgZm9yY2VDcmVhdGlvbik7DQorCX0gY2F0Y2ggKFBhcnNpbmdFeGNlcHRpb24gZTEpew0KKwkJdGhyb3cgbmV3Q29yZUV4Y2VwdGlvbigiRXJyb3IgcGFyc2luZyBVUkw6Iit1cmwudG9FeHRlcm5hbEZvcm0oKSsiXHJcbiIrZTEuZ2V0TWVzc2FnZSgpLGUxKTsJCQkJCQ0KKwl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMSl7DQorCQl0aHJvdyBuZXdDb3JlRXhjZXB0aW9uKCJFcnJvciBhY2Nlc3NpbmcgdXJsOiIrdXJsLnRvRXh0ZXJuYWxGb3JtKCkrIlxyXG4iK2UxLmdldE1lc3NhZ2UoKSxlMSk7DQorCQkJCX0JCQkJDQorDQorCQkJfSBlbHNlIGlmICh1cmwuZ2V0RmlsZSgpLmVuZHNXaXRoKFNpdGUuU0lURV9YTUwpKSB7DQorCQkJCS8vIDMgbm90aGluZyB3ZSBjYW4gZG8NCisJdGhyb3cgbmV3Q29yZUV4Y2VwdGlvbigiRXJyb3IgcGFyc2luZyBVUkw6Iit1cmwudG9FeHRlcm5hbEZvcm0oKSsiXHJcbiIrZS5nZXRNZXNzYWdlKCksZSk7CQkJCQkNCit9IGVsc2Ugew0KKwkvLyAyIHRyeSB0byBhZGQgL3NpdGUueG1sDQorCQ0KKwl0cnkgew0KKwkJdXJsID0gbmV3IFVSTCh1cmwuZ2V0UHJvdG9jb2woKSx1cmwuZ2V0SG9zdCgpLCB1cmwuZ2V0UG9ydCgpLCB1cmwuZ2V0RmlsZSgpKyIvIitTaXRlLlNJVEVfWE1MKTsNCisJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUxKXsNCisJCXRocm93IG5ld0NvcmVFeGNlcHRpb24oIkNhbm5vdCBjcmVhdGUgVVJMOiIrdXJsLnRvRXh0ZXJuYWxGb3JtKCkrIisiK1NpdGUuU0lURV9YTUwsZTEpOw0KKwl9DQorCXRyeSB7DQorCQlzaXRlID0gZmFjdG9yeS5jcmVhdGVTaXRlKHVybCwgZm9yY2VDcmVhdGlvbik7DQorCX0gY2F0Y2ggKFBhcnNpbmdFeGNlcHRpb24gZTEpew0KKwkJdGhyb3cgbmV3Q29yZUV4Y2VwdGlvbigiRXJyb3IgcGFyc2luZyBVUkw6Iit1cmwudG9FeHRlcm5hbEZvcm0oKSsiXHJcbiIrZTEuZ2V0TWVzc2FnZSgpKyJcclxuUHJldmlvdXMgUGFyc2luZyBlcnJvcjoiK2UuZ2V0TWVzc2FnZSgpLGUxKTsJCQkJCQ0KKwl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMSl7DQorCQl0aHJvdyBuZXdDb3JlRXhjZXB0aW9uKCJFcnJvciBhY2Nlc3NpbmcgdXJsOiIrdXJsLnRvRXh0ZXJuYWxGb3JtKCkrIlxyXG4iK2UxLmdldE1lc3NhZ2UoKSsiXHJcblByZXZpb3VzIFBhcnNpbmcgZXJyb3I6IitlLmdldE1lc3NhZ2UoKSxlMSk7DQorCQ0KKw0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvYWJvdXQuaHRtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvYWJvdXQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjgzMjRlCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9hYm91dC5odG1sCkBAIC0wLDAgKzEsNDIgQEAKKzxodG1sPg0KKzxoZWFkPg0KKzx0aXRsZT5BYm91dDwvdGl0bGU+DQorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCitwLCB0YWJsZSwgdGQsIHRoIHsgZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIGdlbmV2YTsgZm9udC1zaXplOiAxMHB0fQ0KK3ByZSB7IGZvbnQtZmFtaWx5OiAiQ291cmllciBOZXciLCBDb3VyaWVyLCBtb25vOyBmb250LXNpemU6IDEwcHR9DQoraDIgeyBmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgZ2VuZXZhOyBmb250LXNpemU6IDE4cHQ7IGZvbnQtd2VpZ2h0OiBib2xkIDsgbGluZS1oZWlnaHQ6IDE0cHh9DQorY29kZSB7IGZvbnQtZmFtaWx5OiAiQ291cmllciBOZXciLCBDb3VyaWVyLCBtb25vOyBmb250LXNpemU6IDEwcHR9DQorc3VwIHsgZm9udC1mYW1pbHk6IGFyaWFsLGhlbHZldGljYSxnZW5ldmE7IGZvbnQtc2l6ZTogMTBweH0NCitoMyB7IGZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBnZW5ldmE7IGZvbnQtc2l6ZTogMTRwdDsgZm9udC13ZWlnaHQ6IGJvbGR9DQorbGkgeyBmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgZ2VuZXZhOyBmb250LXNpemU6IDEwcHR9DQoraDEgeyBmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgZ2VuZXZhOyBmb250LXNpemU6IDI4cHg7IGZvbnQtd2VpZ2h0OiBib2xkfQ0KK2JvZHkgeyBmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgZ2VuZXZhOyBmb250LXNpemU6IDEwcHQ7IGNsaXA6IHJlY3QoICAgKTsgbWFyZ2luLXRvcDogNW1tOyBtYXJnaW4tbGVmdDogM21tfQ0KKzwvc3R5bGU+DQorPC9oZWFkPg0KKzxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPSJibHVlIiB2bGluaz0icHVycGxlIj4NCis8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iNSIgY2VsbHBhZGRpbmc9IjIiIHdpZHRoPSIxMDAlIiA+DQorICA8dHI+IA0KKyAgICA8dGQgYWxpZ249IkxFRlQiIHZhbGlnbj0iVE9QIiBjb2xzcGFuPSIyIiBiZ2NvbG9yPSIjMDA4MEMwIj48Yj48Zm9udCBjb2xvcj0iI0ZGRkZGRiI+QWJvdXQgVGhpcyBDb250ZW50PC9mb250PjwvYj48L3RkPg0KKyAgPC90cj4NCisgIDx0cj4gDQorICAgIDx0ZD4gDQorPHA+MTF0aCBEZWNlbWJlciwgMjAwMTwvcD4JDQorPGgzPkxpY2Vuc2U8L2gzPg0KKzxwPkVjbGlwc2Uub3JnIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gJnF1b3Q7Q29udGVudCZxdW90Oy4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQ0KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sIj5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAwLjU8L2E+ICZxdW90O0NQTCZxdW90Oy4gIEZvciBwdXJwb3NlcyBvZiB0aGUgQ1BMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+DQorDQorPGgzPkNvbnRyaWJ1dGlvbnM8L2gzPg0KKw0KKzxwPklmIHRoaXMgQ29udGVudCBpcyBsaWNlbnNlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBDUEwsIGFueSBDb250cmlidXRpb25zLCBhcyBkZWZpbmVkIGluIHRoZSBDUEwsIHVwbG9hZGVkLCBzdWJtaXR0ZWQsIG9yIG90aGVyd2lzZQ0KK21hZGUgYXZhaWxhYmxlIHRvIEVjbGlwc2Uub3JnLCBtZW1iZXJzIG9mIEVjbGlwc2Uub3JnIGFuZC9vciB0aGUgaG9zdCBvZiBFY2xpcHNlLm9yZyB3ZWIgc2l0ZSwgYnkgeW91IHRoYXQgcmVsYXRlIHRvIHN1Y2gNCitDb250ZW50IGFyZSBwcm92aWRlZCB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENQTCBhbmQgY2FuIGJlIG1hZGUgYXZhaWxhYmxlIHRvIG90aGVycyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENQTC48L3A+DQorDQorPHA+SWYgdGhpcyBDb250ZW50IGlzIGxpY2Vuc2VkIHRvIHlvdSB1bmRlciBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zIG90aGVyIHRoYW4gdGhlIENQTCAmcXVvdDtPdGhlciBMaWNlbnNlJnF1b3Q7LCBhbnkgbW9kaWZpY2F0aW9ucywgZW5oYW5jZW1lbnRzIGFuZC9vcg0KK290aGVyIGNvZGUgYW5kL29yIGRvY3VtZW50YXRpb24gJnF1b3Q7TW9kaWZpY2F0aW9ucyZxdW90OyB1cGxvYWRlZCwgc3VibWl0dGVkLCBvciBvdGhlcndpc2UgbWFkZSBhdmFpbGFibGUgdG8gRWNsaXBzZS5vcmcsIG1lbWJlcnMgb2YgRWNsaXBzZS5vcmcgYW5kL29yIHRoZQ0KK2hvc3Qgb2YgRWNsaXBzZS5vcmcsIGJ5IHlvdSB0aGF0IHJlbGF0ZSB0byBzdWNoIENvbnRlbnQgYXJlIHByb3ZpZGVkIHVuZGVyIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBPdGhlciBMaWNlbnNlIGFuZCBjYW4gYmUgbWFkZSBhdmFpbGFibGUNCit0byBvdGhlcnMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPdGhlciBMaWNlbnNlLiAgSW4gYWRkaXRpb24sIHdpdGggcmVnYXJkIHRvIE1vZGlmaWNhdGlvbnMgZm9yIHdoaWNoIHlvdSBhcmUgdGhlIGNvcHlyaWdodCBob2xkZXIsIHlvdSBhcmUgYWxzbw0KK3Byb3ZpZGluZyB0aGUgTW9kaWZpY2F0aW9ucyB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENQTCBhbmQgc3VjaCBNb2RpZmljYXRpb25zIGNhbiBiZSBtYWRlIGF2YWlsYWJsZSB0byBvdGhlcnMgdW5kZXIgdGhlIHRlcm1zIG9mDQordGhlIENQTC48L3A+DQorPC90ZD48L3RyPjwvdGFibGU+DQorPC9ib2R5Pg0KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL2J1aWxkLnByb3BlcnRpZXMgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL2J1aWxkLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY1ZTJhYQotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvYnVpbGQucHJvcGVydGllcwpAQCAtMCwwICsxLDE3IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorIyBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQorIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQorIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCisjIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KKyMgDQorIyBDb250cmlidXRvcnM6DQorIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KK3NvdXJjZS51cGRhdGVleGFtcGxlc2NvcmUuamFyID0gc3JjLw0KK3NyYy5pbmNsdWRlcz1hYm91dC5odG1sDQorYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcDQorICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXA0KKyAgICAgICAgICAgICAgICouamFyLFwNCisgICAgICAgICAgICAgICBhYm91dC5odG1sLFwNCisgICAgICAgICAgICAgICBNRVRBLUlORi8NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3BsdWdpbi5wcm9wZXJ0aWVzIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9wbHVnaW4ucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTM1YmU0Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9wbHVnaW4ucHJvcGVydGllcwpAQCAtMCwwICsxLDEzIEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorIyBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQorIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQorIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCisjIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KKyMgDQorIyBDb250cmlidXRvcnM6DQorIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKw0KK25hbWUgPSBJbnN0YWxsL1VwZGF0ZSBCdWlsZFppcCBFeGFtcGxlDQorcHJvdmlkZXItbmFtZSA9IEVjbGlwc2Uub3JnClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9wbHVnaW4ueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9wbHVnaW4ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxODgzMTgKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3BsdWdpbi54bWwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zaXRlL2ZlYXR1cmVzL2NvbS5yZWRkb3QucmVkZG90XzEuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc2l0ZS9mZWF0dXJlcy9jb20ucmVkZG90LnJlZGRvdF8xLjAuMC5qYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY1MDdhNwotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc2l0ZS9mZWF0dXJlcy9jb20ucmVkZG90LnJlZGRvdF8xLjAuMC5qYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zaXRlL2ZlYXR1cmVzL2NvbS5yZWRkb3QucmVkZG90XzIuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc2l0ZS9mZWF0dXJlcy9jb20ucmVkZG90LnJlZGRvdF8yLjAuMC5qYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIzNjgxNQotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc2l0ZS9mZWF0dXJlcy9jb20ucmVkZG90LnJlZGRvdF8yLjAuMC5qYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zaXRlL2luZm8vaW1hZ2VzL3JlZERvdC5qcGcgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NpdGUvaW5mby9pbWFnZXMvcmVkRG90LmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGZiNWMzCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zaXRlL2luZm8vaW1hZ2VzL3JlZERvdC5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zaXRlL3BsdWdpbnMvY29tLnJlZGRvdC5yZWRkb3RfMS4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zaXRlL3BsdWdpbnMvY29tLnJlZGRvdC5yZWRkb3RfMS4wLjAuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4OGI3OTMKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NpdGUvcGx1Z2lucy9jb20ucmVkZG90LnJlZGRvdF8xLjAuMC5qYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zaXRlL3BsdWdpbnMvY29tLnJlZGRvdC5yZWRkb3RfMi4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zaXRlL3BsdWdpbnMvY29tLnJlZGRvdC5yZWRkb3RfMi4wLjAuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMzFhZDMKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NpdGUvcGx1Z2lucy9jb20ucmVkZG90LnJlZGRvdF8yLjAuMC5qYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zaXRlL3NpdGUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zaXRlL3NpdGUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1Yzg1OGIKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NpdGUvc2l0ZS54bWwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2V4YW1wbGVzL2J1aWxkemlwL0J1aWxkWmlwQ29udmVydGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvZXhhbXBsZXMvYnVpbGR6aXAvQnVpbGRaaXBDb252ZXJ0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWQ0YTc1Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2V4YW1wbGVzL2J1aWxkemlwL0J1aWxkWmlwQ29udmVydGVyLmphdmEKQEAgLTAsMCArMSwxNjIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQorICoNCisgKiBDb250cmlidXRvcnM6DQorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzLmJ1aWxkemlwOw0KKw0KK2ltcG9ydCBqYXZhLmlvLkZpbGU7DQoraW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsNCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsNCitpbXBvcnQgamF2YS5pby5TdHJpbmdCdWZmZXJJbnB1dFN0cmVhbTsNCitpbXBvcnQgamF2YS5uZXQuVVJMOw0KK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsNCitpbXBvcnQgamF2YS51dGlsLmphci5KYXJFbnRyeTsNCitpbXBvcnQgamF2YS51dGlsLmphci5KYXJPdXRwdXRTdHJlYW07DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkNvbnRlbnRSZWZlcmVuY2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZUNvbnRlbnRQcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVBsdWdpbkVudHJ5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5KYXJDb250ZW50UmVmZXJlbmNlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC5JbnN0YWxsQWJvcnRlZEV4Y2VwdGlvbjsNCisNCisvKioNCisgKiBDb252ZXJ0cyBlY2xpcHNlIGJ1aWxkIC56aXAgZmlsZXMgaW50byBwYWNrYWdlZCBmZWF0dXJlDQorICovDQorcHVibGljIGNsYXNzIEJ1aWxkWmlwQ29udmVydGVyIHsNCisNCisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgew0KKwkJaWYgKGFyZ3MubGVuZ3RoIDw9MCkgew0KKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiVXNhZ2U6ICAgICBCdWlsZFppcENvbnZlcnRlciA8cGF0aCB0byB0aGUgemlwIGZpbGU+LlxyXG5FeGFtcGxlOiBCdWlsZFppcENvbnZlcnRlciBkOi9kb3dubG9hZC9pbnRlZ3JhdGlvbi1lY2xpcHNlLVNESy0yMDAyMDEwOS13aW4zMi56aXAiKTsNCisJCQlyZXR1cm47DQorCQl9DQorCQl0cnkgew0KKwkJCVVSTCBidWlsZHppcCA9IG5ldyBVUkwoKCJmaWxlOiIrYXJnc1swXSkucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJykpOw0KKwkJCUJ1aWxkWmlwRmVhdHVyZUZhY3RvcnkgZmFjdG9yeSA9IG5ldyBCdWlsZFppcEZlYXR1cmVGYWN0b3J5KCk7DQorCQkJSUZlYXR1cmUgZmVhdHVyZSA9IGZhY3RvcnkuY3JlYXRlRmVhdHVyZShidWlsZHppcCwgbnVsbCk7DQorCQkJSUZlYXR1cmVDb250ZW50UHJvdmlkZXIgcHJvdmlkZXIgPSBmZWF0dXJlLmdldEZlYXR1cmVDb250ZW50UHJvdmlkZXIoKTsNCisJCQkNCisJCQlDb250ZW50UmVmZXJlbmNlW10gcmVmcyA9IHByb3ZpZGVyLmdldEZlYXR1cmVFbnRyeUNvbnRlbnRSZWZlcmVuY2VzKG51bGwpOw0KKwkJCQ0KKwkJCUZpbGUgc2l0ZSA9IG5ldyBGaWxlKChhcmdzWzBdKyIucGFja2FnZWQvIikucmVwbGFjZSgnLycsRmlsZS5zZXBhcmF0b3JDaGFyKSk7DQorCQkJc2l0ZS5ta2RpcnMoKTsNCisJCQlGaWxlIGZlYXR1cmVzRGlyID0gbmV3IEZpbGUoc2l0ZSwiZmVhdHVyZXMiKTsNCisJCQlmZWF0dXJlc0Rpci5ta2RpcnMoKTsNCisJCQlGaWxlIHBsdWdpbnNEaXIgPSBuZXcgRmlsZShzaXRlLCAicGx1Z2lucyIpOw0KKwkJCXBsdWdpbnNEaXIubWtkaXJzKCk7DQorCQkJDQorCQkJRmlsZSBqYXJGaWxlID0gbmV3IEZpbGUoZmVhdHVyZXNEaXIsZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkrIi5qYXIiKTsNCisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIndyaXRpbmcgZmVhdHVyZSBhcmNoaXZlOiAiK2ZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpKyIuamFyIik7DQorCQkJd3JpdGVKYXIoamFyRmlsZSwgcmVmcywgZmVhdHVyZSwgbnVsbCwgbnVsbCk7DQorCQkJSmFyQ29udGVudFJlZmVyZW5jZSBqYXIgPSBuZXcgSmFyQ29udGVudFJlZmVyZW5jZSgiYnVpbGQuemlwIixidWlsZHppcCk7DQorCQkJUHJvcGVydGllcyBtYW5pZmVzdCA9IGdldEJ1aWxkTWFuaWZlc3QoamFyKTsNCisJCQkNCisJCQlJUGx1Z2luRW50cnlbXSBwbHVnaW5zID0gZmVhdHVyZS5nZXRQbHVnaW5FbnRyaWVzKCk7DQorCQkJZm9yIChpbnQgaT0wOyBpPHBsdWdpbnMubGVuZ3RoOyBpKyspIHsNCisJCQkJcmVmcyA9IHByb3ZpZGVyLmdldFBsdWdpbkVudHJ5Q29udGVudFJlZmVyZW5jZXMocGx1Z2luc1tpXSwgbnVsbCk7DQorCQkJCWphckZpbGUgPSBuZXcgRmlsZShwbHVnaW5zRGlyLHBsdWdpbnNbaV0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpKyIuamFyIik7DQorCQkJCVN5c3RlbS5vdXQucHJpbnRsbigid3JpdGluZyBwbHVnaW4gYXJjaGl2ZTogIitwbHVnaW5zW2ldLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSsiLmphciIpOw0KKwkJCQl3cml0ZUphcihqYXJGaWxlLCByZWZzLCBmZWF0dXJlLCBwbHVnaW5zW2ldLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRJZGVudGlmaWVyKCksIG1hbmlmZXN0KTsNCisJCQl9DQorCQkJDQorCQkJd3JpdGVTaXRlTWFuaWZlc3Qoc2l0ZSwgZmVhdHVyZSk7DQorCQl9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7DQorCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCX0NCisJfQ0KKwkNCisJcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlSmFyKEZpbGUgamFyRmlsZSxDb250ZW50UmVmZXJlbmNlW10gcmVmcywgSUZlYXR1cmUgZmVhdHVyZSwgU3RyaW5nIHBsdWdpbklkLCBQcm9wZXJ0aWVzIG1hbmlmZXN0KSB7DQorCQkJDQorCQlKYXJPdXRwdXRTdHJlYW0gam9zID0gbnVsbDsNCisJCUZpbGVPdXRwdXRTdHJlYW0gb3MgPSBudWxsOw0KKwkJSW5wdXRTdHJlYW0gaXMgPSBudWxsOw0KKwkJDQorCQl0cnkgew0KKwkJCW9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oamFyRmlsZSk7DQorCQkJam9zID0gbmV3IEphck91dHB1dFN0cmVhbShvcyk7DQorCQkJSmFyRW50cnkgZW50cnkgPSBudWxsOw0KKwkJCVN0cmluZyBidWYgPSBudWxsOw0KKwkJCVN0cmluZ0J1ZmZlcklucHV0U3RyZWFtIHNiaXMgPSBudWxsOw0KKwkJCQ0KKwkJCS8vIHdyaXRlIGphciBtYW5pZmVzdCAoZmlyc3QgZW50cnkgaW4gb3V0cHV0IHN0cmVhbSkNCisJCQlidWYgPSAiTWFuaWZlc3QtVmVyc2lvbjogMS4wXG5DcmVhdGVkLUJ5OiAyLjAuMCAod3d3LmVjbGlwc2Uub3JnIEZlYXR1cmUgUGFja2FnZXIpXG4iOw0KKwkJCXNiaXMgPSBuZXcgU3RyaW5nQnVmZmVySW5wdXRTdHJlYW0oYnVmKTsNCisJCQllbnRyeSA9IG5ldyBKYXJFbnRyeSgiTUVUQS1JTkYvTUFOSUZFU1QuTUYiKTsNCisJCQlqb3MucHV0TmV4dEVudHJ5KGVudHJ5KTsNCisJCQlVdGlsaXRpZXMuY29weShzYmlzLGpvcyxudWxsKTsNCisJCQlzYmlzLmNsb3NlKCk7DQorCQkJDQorCQkJLy8gamFyIHVwIHRoZSByZWZlcmVuY2VzDQorCQkJZm9yIChpbnQgaT0wOyBpPHJlZnMubGVuZ3RoOyBpKyspIHsNCisJCQkJU3RyaW5nIGlkID0gcmVmc1tpXS5nZXRJZGVudGlmaWVyKCk7DQorCQkJCWVudHJ5ID0gbmV3IEphckVudHJ5KGlkKTsNCisJCQkJam9zLnB1dE5leHRFbnRyeShlbnRyeSk7DQorCQkJCWlzID0gcmVmc1tpXS5nZXRJbnB1dFN0cmVhbSgpOw0KKwkJCQlVdGlsaXRpZXMuY29weShpcyxqb3MsbnVsbCk7DQorCQkJCWlzLmNsb3NlKCk7IGlzID0gbnVsbDsNCisJCQl9DQorCQkJDQorCQkJLy8gZm9yIHBsdWdpbiBqYXJzLCB3cml0ZSBidWlsZCBtYW5pZmVzdA0KKwkJCWlmIChwbHVnaW5JZCAhPSBudWxsICYmIG1hbmlmZXN0ICE9IG51bGwpIHsNCisJCQkJU3RyaW5nIGtleSA9ICJwbHVnaW5AIitwbHVnaW5JZDsNCisJCQkJU3RyaW5nIHZhbHVlID0gbWFuaWZlc3QuZ2V0UHJvcGVydHkoa2V5KTsNCisJCQkJaWYgKHZhbHVlICE9IG51bGwpIHsNCisJCQkJCWlmICh2YWx1ZS5lcXVhbHMoIkhFQUQiKSkgew0KKwkJCQkJCXZhbHVlICs9ICItIiArIGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldFZlcnNpb24oKS5nZXRNYWpvckNvbXBvbmVudCgpOw0KKwkJCQkJfQ0KKwkJCQkJYnVmID0ga2V5ICsgIj0iICsgdmFsdWU7DQorCQkJCQlzYmlzID0gbmV3IFN0cmluZ0J1ZmZlcklucHV0U3RyZWFtKGJ1Zik7DQorCQkJCQllbnRyeSA9IG5ldyBKYXJFbnRyeSgiYnVpbGRtYW5pZmVzdC5wcm9wZXJ0aWVzIik7DQorCQkJCQlqb3MucHV0TmV4dEVudHJ5KGVudHJ5KTsNCisJCQkJCVV0aWxpdGllcy5jb3B5KHNiaXMsam9zLG51bGwpOw0KKwkJCQkJc2Jpcy5jbG9zZSgpOw0KKwkJCQl9DQorCQkJfQ0KKwkJCQ0KKwkJCS8vIGNsb3NlIGphcg0KKwkJCWpvcy5jbG9zZSgpOyBqb3MgPSBudWxsOyBvcyA9IG51bGw7DQorCQl9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7DQorCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCX0gZmluYWxseSB7DQorCQkJaWYgKGlzICE9IG51bGwpIA0KKwkJCQl0cnkge2lzLmNsb3NlKCk7fSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7fQ0KKwkJCQkNCisJCQlpZiAoam9zICE9IG51bGwpIA0KKwkJCQl0cnkge2pvcy5jbG9zZSgpO30gY2F0Y2goSU9FeGNlcHRpb24gZSkge30NCisJCQllbHNlIGlmIChvcyAhPSBudWxsKQ0KKwkJCQl0cnkge29zLmNsb3NlKCk7fSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7fQ0KKwkJfQkJDQorCX0NCisJDQorCXB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZVNpdGVNYW5pZmVzdChGaWxlIHNpdGUsIElGZWF0dXJlIGZlYXR1cmUpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW5zdGFsbEFib3J0ZWRFeGNlcHRpb24gew0KKwkJRmlsZSBtYW5pZmVzdCA9IG5ldyBGaWxlKHNpdGUsICJzaXRlLnhtbCIpOw0KKwkJRmlsZU91dHB1dFN0cmVhbSBvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKG1hbmlmZXN0KTsNCisJCVN0cmluZyBzaXRlWE1MID0gIjxzaXRlPlxuICAgPGZlYXR1cmUgdXJsPVwiZmVhdHVyZXMvIitmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKyIuamFyXCIvPlxuPC9zaXRlPiI7DQorCQlTdHJpbmdCdWZmZXJJbnB1dFN0cmVhbSBzYmlzID0gbmV3IFN0cmluZ0J1ZmZlcklucHV0U3RyZWFtKHNpdGVYTUwpOw0KKwkJVXRpbGl0aWVzLmNvcHkoc2JpcyxvcyxudWxsKTsNCisJCW9zLmNsb3NlKCk7DQorCQlzYmlzLmNsb3NlKCk7DQorCX0NCisJDQorCXB1YmxpYyBzdGF0aWMgUHJvcGVydGllcyBnZXRCdWlsZE1hbmlmZXN0KEphckNvbnRlbnRSZWZlcmVuY2UgamFyKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KKwkJQ29udGVudFJlZmVyZW5jZSBtYW5pZmVzdEVudHJ5ID0gamFyLnBlZWsoImVjbGlwc2UvYnVpbGRtYW5pZmVzdC5wcm9wZXJ0aWVzIixudWxsLypDb250ZW50U2VsZWN0b3IqLywgbnVsbC8qUHJvZ3Jlc3NNb25pdG9yKi8pOw0KKwkJSW5wdXRTdHJlYW0gaXMgPSBudWxsOw0KKwkJUHJvcGVydGllcyBwcm9wcyA9IG51bGw7DQorCQl0cnkgew0KKwkJCXByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsNCisJCQlpcyA9IG1hbmlmZXN0RW50cnkuZ2V0SW5wdXRTdHJlYW0oKTsNCisJCQlwcm9wcy5sb2FkKGlzKTsNCisJCX0gZmluYWxseSB7DQorCQkJaWYgKGlzICE9IG51bGwpIHRyeXsgaXMuY2xvc2UoKTsgfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7fQ0KKwkJfQ0KKwkJcmV0dXJuIHByb3BzOw0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9leGFtcGxlcy9idWlsZHppcC9CdWlsZFppcEZlYXR1cmVDb250ZW50UHJvdmlkZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9leGFtcGxlcy9idWlsZHppcC9CdWlsZFppcEZlYXR1cmVDb250ZW50UHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjFkZDVhCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2V4YW1wbGVzL2J1aWxkemlwL0J1aWxkWmlwRmVhdHVyZUNvbnRlbnRQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMjYxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KKyAqDQorICogQ29udHJpYnV0b3JzOg0KKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy5idWlsZHppcDsNCisNCitpbXBvcnQgamF2YS5pby5GaWxlOw0KK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07DQoraW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQoraW1wb3J0IGphdmEubmV0LlVSTDsNCitpbXBvcnQgamF2YS51dGlsLmphci5KYXJFbnRyeTsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5Db250ZW50UmVmZXJlbmNlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5GZWF0dXJlQ29udGVudFByb3ZpZGVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZUNvbnRlbnRQcm92aWRlcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSU5vblBsdWdpbkVudHJ5Ow0KK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JUGx1Z2luRW50cnk7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklWZXJpZmllcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSW5zdGFsbE1vbml0b3I7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkphckNvbnRlbnRSZWZlcmVuY2U7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkphckNvbnRlbnRSZWZlcmVuY2UuQ29udGVudFNlbGVjdG9yOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC5GZWF0dXJlTW9kZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLkluc3RhbGxBYm9ydGVkRXhjZXB0aW9uOw0KKw0KKy8qKg0KKyAqIEFuIGV4YW1wbGUgZmVhdHVyZSBjb250ZW50IHByb3ZpZGVyLiBJdCBoYW5kbGVzIGZlYXR1cmVzIHBhY2thZ2VkIGFzDQorICogYnVpbGQgemlwJ3MgdXNpbmcgdGhlIGZvcm1hdCB1c2VkIGZvciBpbnRlZ3JhdGlvbiBhbmQgc3RhYmxlIGJ1aWxkcw0KKyAqIHBvc3RlZCBvbiB0aGUgZG93bmxvYWRzIHBhZ2VzIGF0IHd3dy5lY2xpcHNlLm9yZw0KKyAqIDwvcD4NCisgKiBAc2luY2UgMi4wDQorICovDQorDQorcHVibGljIGNsYXNzIEJ1aWxkWmlwRmVhdHVyZUNvbnRlbnRQcm92aWRlciBleHRlbmRzIEZlYXR1cmVDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJRmVhdHVyZUNvbnRlbnRQcm92aWRlciB7DQorDQorCXByaXZhdGUgSmFyQ29udGVudFJlZmVyZW5jZSBiYXNlUmVmZXJlbmNlOw0KKwlwcml2YXRlIENvbnRlbnRSZWZlcmVuY2UgZ2VuZXJhdGVkRmVhdHVyZU1hbmlmZXN0OwkNCisJcHJpdmF0ZSBDb250ZW50UmVmZXJlbmNlW10gZmVhdHVyZUVudHJ5Q29udGVudFJlZmVyZW5jZXM7DQorCXByaXZhdGUgSVBsdWdpbkVudHJ5IGN1cnJlbnRQbHVnaW5FbnRyeTsNCisJcHJpdmF0ZSBJTm9uUGx1Z2luRW50cnkgY3VycmVudE5vblBsdWdpbkVudHJ5Ow0KKwkNCisJcHVibGljIEJ1aWxkWmlwRmVhdHVyZUNvbnRlbnRQcm92aWRlcihVUkwgYmFzZSkgew0KKwkJc3VwZXIoYmFzZSk7DQorCQl0aGlzLmJhc2VSZWZlcmVuY2UgPSBuZXcgSmFyQ29udGVudFJlZmVyZW5jZSgiYnVpbGQuemlwIixiYXNlKTsNCisJfQ0KKwkNCisJLyoNCisJICogQHNlZSBJRmVhdHVyZUNvbnRlbnRQcm92aWRlciNnZXRGZWF0dXJlTWFuaWZlc3QoKQ0KKwkgKi8NCisJcHVibGljIENvbnRlbnRSZWZlcmVuY2UgZ2V0RmVhdHVyZU1hbmlmZXN0UmVmZXJlbmNlKEluc3RhbGxNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCisJCWlmIChnZW5lcmF0ZWRGZWF0dXJlTWFuaWZlc3QgPT0gbnVsbCkgew0KKwkJCXRocm93IG5ld0NvcmVFeGNlcHRpb24oIkZlYXR1cmUgbWFuaWZlc3QgaXMgbm90IGF2YWlsYWJsZSIsbnVsbCk7DQorCQl9DQorCQllbHNlDQorCQkJcmV0dXJuIGdlbmVyYXRlZEZlYXR1cmVNYW5pZmVzdDsNCisJfQ0KKw0KKwkvKg0KKwkgKiBAc2VlIElGZWF0dXJlQ29udGVudFByb3ZpZGVyI2dldEFyY2hpdmVSZWZlcmVuY2VzKCkNCisJICovDQorCXB1YmxpYyBDb250ZW50UmVmZXJlbmNlW10gZ2V0QXJjaGl2ZVJlZmVyZW5jZXMoSW5zdGFsbE1vbml0b3IgbW9uaXRvcikgew0KKwkJLy8gdGhlIGZlYXR1cmUgYW5kIGFsbCBpdHMgcGx1Z2lucyBmaWxlcyBhcmUgcGFja2FnZWQgaW4gYSBzaW5nbGUgYXJjaGl2ZQ0KKwkJcmV0dXJuIG5ldyBDb250ZW50UmVmZXJlbmNlW10geyBiYXNlUmVmZXJlbmNlIH07DQorCX0NCisNCisJLyoNCisJICogQHNlZSBJRmVhdHVyZUNvbnRlbnRQcm92aWRlciNnZXRGZWF0dXJlRW50cnlBcmNoaXZlUmVmZXJlbmNlcygpDQorCSAqLw0KKwlwdWJsaWMgQ29udGVudFJlZmVyZW5jZVtdIGdldEZlYXR1cmVFbnRyeUFyY2hpdmVSZWZlcmVuY2VzKEluc3RhbGxNb25pdG9yIG1vbml0b3IpIHsNCisJCS8vIHRoZSBmZWF0dXJlIGFuZCBhbGwgaXRzIHBsdWdpbnMgZmlsZXMgYXJlIHBhY2thZ2VkIGluIGEgc2luZ2xlIGFyY2hpdmUNCisJCXJldHVybiBuZXcgQ29udGVudFJlZmVyZW5jZVtdIHsgYmFzZVJlZmVyZW5jZSB9Ow0KKwl9DQorDQorCS8qDQorCSAqIEBzZWUgSUZlYXR1cmVDb250ZW50UHJvdmlkZXIjZ2V0UGx1Z2luRW50cnlBcmNoaXZlUmVmZXJlbmNlcyhJUGx1Z2luRW50cnkpDQorCSAqLw0KKwlwdWJsaWMgQ29udGVudFJlZmVyZW5jZVtdIGdldFBsdWdpbkVudHJ5QXJjaGl2ZVJlZmVyZW5jZXMoSVBsdWdpbkVudHJ5IHBsdWdpbkVudHJ5LCBJbnN0YWxsTW9uaXRvciBtb25pdG9yKSB7DQorCQkvLyB0aGUgZmVhdHVyZSBhbmQgYWxsIGl0cyBwbHVnaW5zIGZpbGVzIGFyZSBwYWNrYWdlZCBpbiBhIHNpbmdsZSBhcmNoaXZlDQorCQlyZXR1cm4gbmV3IENvbnRlbnRSZWZlcmVuY2VbXSB7IGJhc2VSZWZlcmVuY2UgfTsNCisJfQ0KKw0KKwkvKg0KKwkgKiBAc2VlIElGZWF0dXJlQ29udGVudFByb3ZpZGVyI2dldE5vblBsdWdpbkVudHJ5QXJjaGl2ZVJlZmVyZW5jZXMoSU5vblBsdWdpbkVudHJ5KQ0KKwkgKi8NCisJcHVibGljIENvbnRlbnRSZWZlcmVuY2VbXSBnZXROb25QbHVnaW5FbnRyeUFyY2hpdmVSZWZlcmVuY2VzKElOb25QbHVnaW5FbnRyeSBub25QbHVnaW5FbnRyeSwgSW5zdGFsbE1vbml0b3IgbW9uaXRvcikgDQorCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQorCQl0cnkgew0KKwkJCXJldHVybiBwZWVrTm9uUGx1Z2luRW50cnlDb250ZW50KG5vblBsdWdpbkVudHJ5LG1vbml0b3IpOw0KKwkJfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7DQorCQkJdGhyb3cgbmV3Q29yZUV4Y2VwdGlvbigiVW5hYmxlIHRvIHJldHVybiBjb250ZW50IGZvciBub24gcGx1Z2luIGVudHJ5ICIrbm9uUGx1Z2luRW50cnkuZ2V0SWRlbnRpZmllcigpLGUpOw0KKwkJfQ0KKwl9DQorDQorCS8qDQorCSAqIEBzZWUgSUZlYXR1cmVDb250ZW50UHJvdmlkZXIjZ2V0RmVhdHVyZUVudHJ5Q29udGVudFJlZmVyZW5jZXMoKQ0KKwkgKi8NCisJcHVibGljIENvbnRlbnRSZWZlcmVuY2VbXSBnZXRGZWF0dXJlRW50cnlDb250ZW50UmVmZXJlbmNlcyhJbnN0YWxsTW9uaXRvciBtb25pdG9yKSB7DQorCQlpZiAoZmVhdHVyZUVudHJ5Q29udGVudFJlZmVyZW5jZXMgPT0gbnVsbCkNCisJCQlyZXR1cm4gbmV3IENvbnRlbnRSZWZlcmVuY2VbMF07DQorCQllbHNlDQorCQkJcmV0dXJuICBmZWF0dXJlRW50cnlDb250ZW50UmVmZXJlbmNlczsNCisJfQ0KKw0KKwkvKg0KKwkgKiBAc2VlIElGZWF0dXJlQ29udGVudFByb3ZpZGVyI2dldFBsdWdpbkVudHJ5Q29udGVudFJlZmVyZW5jZXMoSVBsdWdpbkVudHJ5KQ0KKwkgKi8NCisJcHVibGljIENvbnRlbnRSZWZlcmVuY2VbXSBnZXRQbHVnaW5FbnRyeUNvbnRlbnRSZWZlcmVuY2VzKElQbHVnaW5FbnRyeSBwbHVnaW5FbnRyeSwgSW5zdGFsbE1vbml0b3IgbW9uaXRvcikNCisJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsNCisJCXRyeSB7DQorCQkJcmV0dXJuIHBlZWtQbHVnaW5FbnRyeUNvbnRlbnQocGx1Z2luRW50cnksIG1vbml0b3IpOw0KKwkJfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7DQorCQkJdGhyb3cgbmV3Q29yZUV4Y2VwdGlvbigiVW5hYmxlIHRvIHJldHVybiBjb250ZW50IGZvciBwbHVnaW4gZW50cnkgIitwbHVnaW5FbnRyeS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCksZSk7DQorCQl9DQorCX0NCisJDQorCXB1YmxpYyBVUkwgZ2V0RmVhdHVyZUJhc2VVUkwoKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KKwkJcmV0dXJuIGdldFdvcmtpbmdEaXJlY3RvcnkoKS50b1VSTCgpOw0KKwkJCQ0KKwl9DQorDQorCUNvbnRlbnRSZWZlcmVuY2UgZ2V0RmVhdHVyZUJ1aWxkTWFuaWZlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCisJCXJldHVybiBiYXNlUmVmZXJlbmNlLnBlZWsoImVjbGlwc2UvYnVpbGRtYW5pZmVzdC5wcm9wZXJ0aWVzIixudWxsLypDb250ZW50U2VsZWN0b3IqLywgbnVsbC8qUHJvZ3Jlc3NNb25pdG9yKi8pOw0KKwl9DQorDQorCUNvbnRlbnRSZWZlcmVuY2UgZ2V0UGx1Z2luTWFuaWZlc3QoU3RyaW5nIHBsdWdpbklkLCBib29sZWFuIGlzRnJhZ21lbnQpIHRocm93cyBFeGNlcHRpb24gewkJCQ0KKwkJU3RyaW5nIG1hbmlmZXN0TmFtZSA9ICJlY2xpcHNlL3BsdWdpbnMvIiArIHBsdWdpbklkICsgIi8iICsgKGlzRnJhZ21lbnQgPyAiZnJhZ21lbnQueG1sIiA6ICJwbHVnaW4ueG1sIik7DQorCQlyZXR1cm4gYmFzZVJlZmVyZW5jZS5wZWVrKG1hbmlmZXN0TmFtZSwgbnVsbC8qQ29udGVudFNlbGVjdG9yKi8sIG51bGwvKlByb2dyZXNzTW9uaXRvciovKTsNCisJfQ0KKwkNCisJdm9pZCB1bnBhY2tGZWF0dXJlRW50cnlDb250ZW50KEZlYXR1cmVNb2RlbCBmZWF0dXJlLCBJbnN0YWxsTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24sIEluc3RhbGxBYm9ydGVkRXhjZXB0aW9uIHsNCisJCQkNCisJCS8vIGRlZmluZSBzZWxlY3RvciBmb3IgZmVhdHVyZSBlbnRyeSBmaWxlcw0KKwkJQ29udGVudFNlbGVjdG9yIHNlbGVjdG9yID0gbmV3IENvbnRlbnRTZWxlY3RvcigpIHsNCisJCQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKEphckVudHJ5IGphckVudHJ5KSB7DQorCQkJCWlmIChqYXJFbnRyeS5pc0RpcmVjdG9yeSgpKQ0KKwkJCQkJcmV0dXJuIGZhbHNlOwkJCQkJDQorCQkJCVN0cmluZyBlbnRyeSA9IGphckVudHJ5LmdldE5hbWUoKTsNCisJCQkJaWYgKGVudHJ5LnN0YXJ0c1dpdGgoImVjbGlwc2UvcmVhZG1lLyIpKQ0KKwkJCQkJcmV0dXJuIHRydWU7DQorCQkJCWVsc2UgaWYgKGVudHJ5LnN0YXJ0c1dpdGgoImVjbGlwc2Uvc3BsYXNoLyIpKQ0KKwkJCQkJcmV0dXJuIHRydWU7DQorCQkJCWVsc2UgaWYgKGVudHJ5LnN0YXJ0c1dpdGgoImVjbGlwc2UvIikgJiYgZW50cnkuaW5kZXhPZigiLyIsOCk9PS0xICYmIGVudHJ5LmVuZHNXaXRoKCIuaHRtbCIpKQ0KKwkJCQkJcmV0dXJuIHRydWU7DQorCQkJCWVsc2UNCisJCQkJCXJldHVybiBmYWxzZTsJDQorCQkJfQ0KKwkJCXB1YmxpYyBTdHJpbmcgZGVmaW5lSWRlbnRpZmllcihKYXJFbnRyeSBqYXJFbnRyeSkgew0KKwkJCQlTdHJpbmcgZW50cnkgPSBqYXJFbnRyeS5nZXROYW1lKCk7DQorCQkJCWlmIChlbnRyeS5zdGFydHNXaXRoKCJlY2xpcHNlLyIpKQ0KKwkJCQkJcmV0dXJuIGVudHJ5LnN1YnN0cmluZyg4KTsNCisJCQkJZWxzZQ0KKwkJCQkJcmV0dXJuIGVudHJ5Ow0KKwkJCX0NCisJCX07DQorCQkNCisJCS8vIHVucGFjayBmZWF0dXJlIGVudHJ5IGZpbGVzDQorCQlGaWxlIHRtcERpciA9IGdldFdvcmtpbmdEaXJlY3RvcnkoKTsNCisJCUNvbnRlbnRSZWZlcmVuY2VbXSByZWZzID0gYmFzZVJlZmVyZW5jZS51bnBhY2sodG1wRGlyLCBzZWxlY3RvciwgbW9uaXRvcik7DQorCQkNCisJCS8vIHdyaXRlIG91dCBmZWF0dXJlIG1hbmlmZXN0IChmZWF0dXJlLnhtbCk7DQorCQlGaWxlIG1hbmlmZXN0ID0gVXRpbGl0aWVzLmNyZWF0ZUxvY2FsRmlsZSh0bXBEaXIsImZlYXR1cmUueG1sIik7DQorCQlDb250ZW50UmVmZXJlbmNlIG1hbmlmZXN0UmVmZXJlbmNlID0gbmV3IENvbnRlbnRSZWZlcmVuY2UoImZlYXR1cmUueG1sIiwgbWFuaWZlc3QpOw0KKwkJRGVmYXVsdE1vZGVsV3JpdGVyIHcgPSBuZXcgRGVmYXVsdE1vZGVsV3JpdGVyKGZlYXR1cmUpOw0KKwkJRmlsZU91dHB1dFN0cmVhbSBvcyA9IG51bGw7DQorCQl0cnkgew0KKwkJCW9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0obWFuaWZlc3QpOw0KKwkJCXcud3JpdGVGZWF0dXJlTWFuaWZlc3Qob3MpOw0KKwkJfSBmaW5hbGx5IHsNCisJCQlpZiAob3MgIT0gbnVsbCkgdHJ5IHsgb3MuY2xvc2UoKTsgfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7fQ0KKwkJfQ0KKwkJdGhpcy5nZW5lcmF0ZWRGZWF0dXJlTWFuaWZlc3QgPSBtYW5pZmVzdFJlZmVyZW5jZTsNCisJCQ0KKwkJLy8gc2F2ZSByZWZlcmVuY2VzIChuZXdseS13cml0dGVuIGZlYXR1cmUueG1sIHBsdXMgcmVzdCBvZiBzZWxlY3RlZCBmZWF0dXJlIGZpbGVzKQ0KKwkJQ29udGVudFJlZmVyZW5jZVtdIGFsbFJlZnMgPSBuZXcgQ29udGVudFJlZmVyZW5jZVtyZWZzLmxlbmd0aCsxXTsNCisJCWFsbFJlZnNbMF0gPSBtYW5pZmVzdFJlZmVyZW5jZTsNCisJCVN5c3RlbS5hcnJheWNvcHkocmVmcywwLGFsbFJlZnMsMSxyZWZzLmxlbmd0aCk7DQorCQlmZWF0dXJlRW50cnlDb250ZW50UmVmZXJlbmNlcyA9IGFsbFJlZnM7DQorCX0NCisJCQ0KKwlDb250ZW50UmVmZXJlbmNlW10gcGVla1BsdWdpbkVudHJ5Q29udGVudChJUGx1Z2luRW50cnkgcGx1Z2luLCBJbnN0YWxsTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KKwkJDQorCQkvLyBkZWZpbmUgc2VsZWN0b3IgZm9yIHBsdWdpbiBlbnRyeSBmaWxlcw0KKwkJQ29udGVudFNlbGVjdG9yIHNlbGVjdG9yID0gbmV3IENvbnRlbnRTZWxlY3RvcigpIHsNCisJCQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKEphckVudHJ5IGphckVudHJ5KSB7DQorCQkJCWlmIChqYXJFbnRyeS5pc0RpcmVjdG9yeSgpKQ0KKwkJCQkJcmV0dXJuIGZhbHNlOw0KKwkJCQlTdHJpbmcgZW50cnkgPSBqYXJFbnRyeS5nZXROYW1lKCk7DQorCQkJCVN0cmluZyBpZCA9IGN1cnJlbnRQbHVnaW5FbnRyeS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0SWRlbnRpZmllcigpOw0KKwkJCQlpZiAoaWQ9PW51bGwpDQorCQkJCQlyZXR1cm4gZmFsc2U7DQorCQkJCWVsc2UgaWYgKGVudHJ5LnN0YXJ0c1dpdGgoImVjbGlwc2UvcGx1Z2lucy8iK2lkKyIvIikpDQorCQkJCQlyZXR1cm4gdHJ1ZTsNCisJCQkJZWxzZQ0KKwkJCQkJcmV0dXJuIGZhbHNlOwkNCisJCQl9DQorCQkJcHVibGljIFN0cmluZyBkZWZpbmVJZGVudGlmaWVyKEphckVudHJ5IGphckVudHJ5KSB7DQorCQkJCVN0cmluZyBlbnRyeSA9IGphckVudHJ5LmdldE5hbWUoKTsNCisJCQkJaW50IGl4ID0gZW50cnkuaW5kZXhPZigiLyIsMTYpOw0KKwkJCQlpZiAoaXggIT0gLTEpIHsNCisJCQkJCXJldHVybiBlbnRyeS5zdWJzdHJpbmcoaXgrMSk7DQorCQkJCX0gZWxzZSB7DQorCQkJCQlyZXR1cm4gZW50cnk7DQorCQkJCX0NCisJCQl9DQorCQl9Ow0KKwkJDQorCQkvLyB1bnBhY2sgcGx1Z2luIGVudHJ5IGZpbGVzDQorCQljdXJyZW50UGx1Z2luRW50cnkgPSBwbHVnaW47DQorCQlyZXR1cm4gYmFzZVJlZmVyZW5jZS5wZWVrKHNlbGVjdG9yLCBtb25pdG9yKTsNCisJfQ0KKwkJDQorCUNvbnRlbnRSZWZlcmVuY2VbXSBwZWVrTm9uUGx1Z2luRW50cnlDb250ZW50KElOb25QbHVnaW5FbnRyeSBkYXRhLCBJbnN0YWxsTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KKwkJDQorCQkvLyBkZWZpbmUgc2VsZWN0b3IgZm9yIG5vbiBwbHVnaW4gZW50cnkgZmlsZXMNCisJCUNvbnRlbnRTZWxlY3RvciBzZWxlY3RvciA9IG5ldyBDb250ZW50U2VsZWN0b3IoKSB7DQorCQkJcHVibGljIGJvb2xlYW4gaW5jbHVkZShKYXJFbnRyeSBqYXJFbnRyeSkgew0KKwkJCQlpZiAoamFyRW50cnkuaXNEaXJlY3RvcnkoKSkNCisJCQkJCXJldHVybiBmYWxzZTsNCisJCQkJU3RyaW5nIGVudHJ5ID0gamFyRW50cnkuZ2V0TmFtZSgpOw0KKwkJCQlTdHJpbmcgaWQgPSBjdXJyZW50Tm9uUGx1Z2luRW50cnkuZ2V0SWRlbnRpZmllcigpOw0KKwkJCQlpZiAoIWlkLmVxdWFscygicm9vdCIpKQ0KKwkJCQkJcmV0dXJuIGZhbHNlOw0KKwkJCQllbHNlIGlmICghZW50cnkuc3RhcnRzV2l0aCgiZWNsaXBzZS9wbHVnaW5zLyIpKQ0KKwkJCQkJcmV0dXJuIHRydWU7DQorCQkJCWVsc2UNCisJCQkJCXJldHVybiBmYWxzZTsJDQorCQkJfQ0KKwkJCXB1YmxpYyBTdHJpbmcgZGVmaW5lSWRlbnRpZmllcihKYXJFbnRyeSBqYXJFbnRyeSkgew0KKwkJCQlTdHJpbmcgZW50cnkgPSBqYXJFbnRyeS5nZXROYW1lKCk7DQorCQkJCWlmIChlbnRyeS5zdGFydHNXaXRoKCJlY2xpcHNlLyIpKQ0KKwkJCQkJcmV0dXJuIGVudHJ5LnN1YnN0cmluZyg4KTsNCisJCQkJZWxzZQ0KKwkJCQkJcmV0dXJuIGVudHJ5Ow0KKwkJCX0NCisJCX07DQorCQkNCisJCS8vIHVucGFjayBub24gcGx1Z2luIGVudHJ5IGZpbGVzDQorCQljdXJyZW50Tm9uUGx1Z2luRW50cnkgPSBkYXRhOw0KKwkJcmV0dXJuIGJhc2VSZWZlcmVuY2UucGVlayhzZWxlY3RvciwgbW9uaXRvcik7DQorCX0NCisJDQorCXByaXZhdGUgQ29yZUV4Y2VwdGlvbiBuZXdDb3JlRXhjZXB0aW9uKFN0cmluZyBzLCBUaHJvd2FibGUgZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KKwkJcmV0dXJuIG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwib3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzIiwwLHMsZSkpOw0KKwl9DQorCS8qDQorCSAqIEBzZWUgSUZlYXR1cmVDb250ZW50UHJvdmlkZXIjZ2V0VmVyaWZpZXIoKQ0KKwkgKi8NCisJcHVibGljIElWZXJpZmllciBnZXRWZXJpZmllcigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9leGFtcGxlcy9idWlsZHppcC9CdWlsZFppcEZlYXR1cmVGYWN0b3J5LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvZXhhbXBsZXMvYnVpbGR6aXAvQnVpbGRaaXBGZWF0dXJlRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkZjU4MGQKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvZXhhbXBsZXMvYnVpbGR6aXAvQnVpbGRaaXBGZWF0dXJlRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQorICoNCisgKiBDb250cmlidXRvcnM6DQorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzLmJ1aWxkemlwOw0KKw0KK2ltcG9ydCBqYXZhLm5ldC5VUkw7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkJhc2VGZWF0dXJlRmFjdG9yeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuRmVhdHVyZTsNCitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlRmFjdG9yeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVNpdGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLkZlYXR1cmVNb2RlbDsNCisNCisvKioNCisgKiBBbiBleGFtcGxlIGZlYXR1cmUgZmFjdG9yeSBiYXNlZCBvbiB0aGUgcGFja2FnaW5nIA0KKyAqIGZvcm1hdCB1c2VkIGZvciBpbnRlZ3JhdGlvbiBhbmQgc3RhYmxlIGJ1aWxkcw0KKyAqIHBvc3RlZCBvbiB0aGUgZG93bmxvYWRzIHBhZ2VzIGF0IHd3dy5lY2xpcHNlLm9yZw0KKyAqIDwvcD4NCisgKiBAc2luY2UgMi4wDQorICovDQorDQorcHVibGljIGNsYXNzIEJ1aWxkWmlwRmVhdHVyZUZhY3RvcnkNCisJZXh0ZW5kcyBCYXNlRmVhdHVyZUZhY3RvcnkNCisJaW1wbGVtZW50cyBJRmVhdHVyZUZhY3Rvcnkgew0KKw0KKwkvKg0KKwkgKiBAc2VlIElGZWF0dXJlRmFjdG9yeSNjcmVhdGVGZWF0dXJlKFVSTCwgSVNpdGUsIElQcm9ncmVzc01vbml0b3IpDQorCSAqLw0KKwlwdWJsaWMgSUZlYXR1cmUgY3JlYXRlRmVhdHVyZShVUkwgdXJsLCBJU2l0ZSBzaXRlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCisJCXRyeSB7DQorCQkJLy8gY3JlYXRlIGNvbnRlbnQgcHJvdmlkZXIgZm9yIGZlYXR1cmUNCisJCQlCdWlsZFppcEZlYXR1cmVDb250ZW50UHJvdmlkZXIgY3AgPSBuZXcgQnVpbGRaaXBGZWF0dXJlQ29udGVudFByb3ZpZGVyKHVybCk7DQorCQkJRmVhdHVyZSBmZWF0dXJlID0gbnVsbDsNCisJCQkNCisJCQkvLyBwYXJzZSB0aGUgZmVhdHVyZQ0KKwkJCWZlYXR1cmUgPSAoRmVhdHVyZSkgcGFyc2VGZWF0dXJlKGNwKTsNCisJCQkNCisJCQkvLyBpbml0aWFsaXplIGZlYXR1cmUNCisJCQlmZWF0dXJlLnNldEZlYXR1cmVDb250ZW50UHJvdmlkZXIoY3ApOw0KKwkJCWZlYXR1cmUuc2V0U2l0ZShzaXRlKTsNCisJCQlmZWF0dXJlLnJlc29sdmUoY3AuZ2V0RmVhdHVyZUJhc2VVUkwoKSwgbnVsbCk7IA0KKwkJCWZlYXR1cmUubWFya1JlYWRPbmx5KCk7DQorCQkJcmV0dXJuIGZlYXR1cmU7DQorCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KKwkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwib3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzLmJ1aWxkemlwIiwwLCJVbmFibGUgdG8gY3JlYXRlIGZlYXR1cmUiLGUpKTsNCisJCX0NCisJfQ0KKw0KKwkvKg0KKwkgKiBwYXJzZSB0aGUgYnVpbGQgemlwIHRvIHJlY29uc3RydWN0IGEgZmVhdHVyZSBtb2RlbA0KKwkgKi8NCisJcHVibGljIEZlYXR1cmVNb2RlbCBwYXJzZUZlYXR1cmUoQnVpbGRaaXBGZWF0dXJlQ29udGVudFByb3ZpZGVyIGNwKSB0aHJvd3MgRXhjZXB0aW9uIHsNCisJCXJldHVybiAobmV3IEJ1aWxkWmlwRmVhdHVyZVBhcnNlcih0aGlzKSkucGFyc2UoY3ApOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9leGFtcGxlcy9idWlsZHppcC9CdWlsZFppcEZlYXR1cmVQYXJzZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9leGFtcGxlcy9idWlsZHppcC9CdWlsZFppcEZlYXR1cmVQYXJzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTMyYjNjCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2V4YW1wbGVzL2J1aWxkemlwL0J1aWxkWmlwRmVhdHVyZVBhcnNlci5qYXZhCkBAIC0wLDAgKzEsMjA4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KKyAqDQorICogQ29udHJpYnV0b3JzOg0KKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy5idWlsZHppcDsNCisNCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsNCitpbXBvcnQgamF2YS5uZXQuVVJMRGVjb2RlcjsNCitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsNCitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpblZlcnNpb25JZGVudGlmaWVyOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5Db250ZW50UmVmZXJlbmNlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC5GZWF0dXJlTW9kZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLlBsdWdpbkVudHJ5TW9kZWw7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLlVSTEVudHJ5TW9kZWw7DQorDQorLyoqDQorICogQW4gZXhhbXBsZSBmZWF0dXJlIHBhcnNlci4gSXQgaGFuZGxlcyBmZWF0dXJlcyBwYWNrYWdlZCBhcw0KKyAqIGJ1aWxkIHppcCdzIHVzaW5nIHRoZSBmb3JtYXQgdXNlZCBmb3IgaW50ZWdyYXRpb24gYW5kIHN0YWJsZSBidWlsZHMNCisgKiBwb3N0ZWQgb24gdGhlIGRvd25sb2FkcyBwYWdlcyBhdCB3d3cuZWNsaXBzZS5vcmcNCisgKiA8L3A+DQorICogQHNpbmNlIDIuMA0KKyAqLw0KKw0KK3B1YmxpYyBjbGFzcyBCdWlsZFppcEZlYXR1cmVQYXJzZXIgewkNCisJDQorCXByaXZhdGUgQnVpbGRaaXBGZWF0dXJlRmFjdG9yeSBmYWN0b3J5Ow0KKwlwcml2YXRlIEJ1aWxkWmlwUGx1Z2luUGFyc2VyIHBsdWdpblBhcnNlcjsNCisJDQorCXB1YmxpYyBCdWlsZFppcEZlYXR1cmVQYXJzZXIoQnVpbGRaaXBGZWF0dXJlRmFjdG9yeSBmYWN0b3J5KSB7DQorCQl0aGlzLmZhY3RvcnkgPSBmYWN0b3J5Ow0KKwl9DQorCQ0KKwlwdWJsaWMgRmVhdHVyZU1vZGVsIHBhcnNlKEJ1aWxkWmlwRmVhdHVyZUNvbnRlbnRQcm92aWRlciBjcCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQkJCQ0KKwkJcmV0dXJuIHBhcnNlRmVhdHVyZShjcCk7DQorCX0NCisJDQorCXByaXZhdGUgRmVhdHVyZU1vZGVsIHBhcnNlRmVhdHVyZShCdWlsZFppcEZlYXR1cmVDb250ZW50UHJvdmlkZXIgY3ApIHRocm93cyBFeGNlcHRpb24gewkJDQorCQkNCisJCS8vIGdldCByZWZlcmVuY2UgdG8gdGhlIGJ1aWxkIG1hbmlmZXN0DQorCQlDb250ZW50UmVmZXJlbmNlIG1hbmlmZXN0UmVmID0gY3AuZ2V0RmVhdHVyZUJ1aWxkTWFuaWZlc3QoKTsNCisJCUlucHV0U3RyZWFtIGlzID0gbWFuaWZlc3RSZWYuZ2V0SW5wdXRTdHJlYW0oKTsJCQ0KKwkJDQorCQkvLyBsb2FkIGJ1aWxkbWFuaWZlc3QucHJvcGVydGllcw0KKwkJUHJvcGVydGllcyBtYW5pZmVzdCA9IG5ldyBQcm9wZXJ0aWVzKCk7DQorCQl0cnkgew0KKwkJCW1hbmlmZXN0LmxvYWQoaXMpOw0KKwkJfSBmaW5hbGx5IHsNCisJCQlpZiAoaXMhPW51bGwpIHRyeSB7IGlzLmNsb3NlKCk7IH0gY2F0Y2goSU9FeGNlcHRpb24gZSkge30NCisJCX0NCisJCQ0KKwkJLy8gcG9wdWxhdGUgZmVhdHVyZSBtb2RlbA0KKwkJRmVhdHVyZU1vZGVsIGZlYXR1cmUgPSBmYWN0b3J5LmNyZWF0ZUZlYXR1cmVNb2RlbCgpOw0KKwkJcGFyc2VGZWF0dXJlRW50cnkoY3AsIGZlYXR1cmUsIG1hbmlmZXN0KTsNCisJCQ0KKwkJLy8gcGFyc2UgcGx1Z2luIGVudHJpZXMNCisJCXBhcnNlUGx1Z2luRW50cmllcyhjcCwgZmVhdHVyZSwgbWFuaWZlc3QpOyANCisJCQ0KKwkJLy8gcGFyc2Ugbm9uLXBsdWdpbiBlbnRyaWVzDQorCQlwYXJzZU5vblBsdWdpbkVudHJpZXMoY3AsIGZlYXR1cmUsIG1hbmlmZXN0KTsNCisJCQ0KKwkJLy8gdW5wYWNrIGZlYXR1cmUgZW50cnkgY29udGVudA0KKwkJY3AudW5wYWNrRmVhdHVyZUVudHJ5Q29udGVudChmZWF0dXJlLCBudWxsLypJUHJvZ3Jlc3NNb25pdG9yKi8pOw0KKwkJDQorCQlyZXR1cm4gZmVhdHVyZTsNCisJfQ0KKwkNCisJcHJpdmF0ZSB2b2lkIHBhcnNlRmVhdHVyZUVudHJ5KEJ1aWxkWmlwRmVhdHVyZUNvbnRlbnRQcm92aWRlciBjcCwgRmVhdHVyZU1vZGVsIGZlYXR1cmUsIFByb3BlcnRpZXMgbWFuaWZlc3QpIHRocm93cyBFeGNlcHRpb24gew0KKwkJDQorCQkvLyBwYXJzZSBvdXQgYnVpbGQgemlwIGZpbGUgbmFtZS4gSXQgaXMgYXNzdW1lZCB0byBiZSBpbiB0aGUNCisJCS8vIGZvcm0gPHBhY2thZ2UgaWRlbnRpZmllcj4tPGJ1aWxkIGRhdGU+LTx0YXJnZXQgcGxhdGZvcm0+LnppcCwNCisJCS8vIHdoZXJlDQorCQkvLwkJPHBhY2thZ2UgaWRlbnRpZmllcj4gaXMgaHlwaGVuICgtKSBzZXBhcmF0ZXJkIHRva2VuIGxpc3QNCisJCS8vCQk8YnVpbGQgZGF0ZT4gaXMgc2luZ2xlIGFsbC1udW1lcmljIHRva2VuDQorCQkvLwkJPHRhcmdldCBwbGF0Zm9ybT4gaXMgaHlwaGVuICgtKSBzZXBhcmF0ZXJkIHRva2VuIGxpc3QNCisJCQ0KKwkJU3RyaW5nIHBrZ0lkID0gIiI7DQorCQlTdHJpbmcgdGFyZ2V0ID0gIiI7DQorCQlTdHJpbmcgYnVpbGQgPSAiIjsNCisJCVN0cmluZyBzdGF0ZSA9ICJJRCI7DQorCQlib29sZWFuIGZpcnN0VG9rZW4gPSB0cnVlOw0KKwkJU3RyaW5nIHppcE5hbWUgPSBVUkxEZWNvZGVyLmRlY29kZShjcC5nZXRVUkwoKS5nZXRGaWxlKCkpOw0KKwkJaW50IGl4ID0gemlwTmFtZS5sYXN0SW5kZXhPZigiLyIpOw0KKwkJaWYgKGl4ICE9IC0xKQ0KKwkJCXppcE5hbWUgPSB6aXBOYW1lLnN1YnN0cmluZyhpeCsxKTsNCisJCWlmICh6aXBOYW1lLmVuZHNXaXRoKCIuemlwIikpIHsNCisJCQl6aXBOYW1lID0gemlwTmFtZS5zdWJzdHJpbmcoMCx6aXBOYW1lLmxlbmd0aCgpLTQpOw0KKwkJfQ0KKwkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoemlwTmFtZSwiLSIsZmFsc2UpOw0KKwkJU3RyaW5nIHRva2VuOw0KKwkJd2hpbGUodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgew0KKwkJCXRva2VuID0gdG9rZW5pemVyLm5leHRUb2tlbigpOw0KKwkJCXRyeSB7DQorCQkJCUxvbmcucGFyc2VMb25nKHRva2VuKTsNCisJCQkJc3RhdGUgPSAiVEFSR0VUIjsNCisJCQkJdGFyZ2V0ID0gIiI7DQorCQkJCWZpcnN0VG9rZW4gPSB0cnVlOw0KKwkJCQlidWlsZCA9IHRva2VuKyIuMC4wIjsNCisJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgew0KKwkJCQlpZiAoc3RhdGUuZXF1YWxzKCJJRCIpKSB7DQorCQkJCQlwa2dJZCArPSAoZmlyc3RUb2tlbiA/ICIiIDogIiAiKSArIHRva2VuOw0KKwkJCQl9IGVsc2Ugew0KKwkJCQkJdGFyZ2V0ICs9IChmaXJzdFRva2VuID8gIiIgOiAiICIpICsgdG9rZW47DQorCQkJCX0NCisJCQkJZmlyc3RUb2tlbiA9IGZhbHNlOw0KKwkJCX0NCisJCX0NCisJCQ0KKwkJLy8gZ2VuZXJhdGUgYmFzZSBmZWF0dXJlIGF0dHJpYnV0ZXMNCisJCWZlYXR1cmUuc2V0RmVhdHVyZUlkZW50aWZpZXIocGtnSWQucmVwbGFjZSgnICcsJy4nKSk7DQorCQlmZWF0dXJlLnNldEZlYXR1cmVWZXJzaW9uKGJ1aWxkKTsNCisJCWZlYXR1cmUuc2V0TGFiZWwocGtnSWQuc3Vic3RyaW5nKDAsMSkudG9VcHBlckNhc2UoKSArIHBrZ0lkLnN1YnN0cmluZygxKSArICIgZm9yICIgKyB0YXJnZXQpOw0KKwkJZmVhdHVyZS5zZXRQcm92aWRlcigid3d3LmVjbGlwc2Uub3JnIik7DQorCQlmZWF0dXJlLnNldEltYWdlVVJMU3RyaW5nKCJzcGxhc2gvc3BsYXNoX2Z1bGwuYm1wIik7DQorCQlmZWF0dXJlLnNldE9TKHRhcmdldC5yZXBsYWNlKCcgJywnLScpKTsJDQorCQkNCisJCS8vIGFkZCBkZXNjcmlwdGlvbg0KKwkJVVJMRW50cnlNb2RlbCBkZXNjcmlwdGlvbiA9IGZhY3RvcnkuY3JlYXRlVVJMRW50cnlNb2RlbCgpOw0KKwkJZGVzY3JpcHRpb24uc2V0VVJMU3RyaW5nKCJyZWFkbWUvcmVhZG1lLmh0bWwiKTsNCisJCWRlc2NyaXB0aW9uLnNldEFubm90YXRpb24oIngiKTsNCisJCWZlYXR1cmUuc2V0RGVzY3JpcHRpb25Nb2RlbChkZXNjcmlwdGlvbik7DQorCQkNCisJCS8vIGFkZCBsaWNlbnNlDQorCQlVUkxFbnRyeU1vZGVsIGxpY2Vuc2UgPSBmYWN0b3J5LmNyZWF0ZVVSTEVudHJ5TW9kZWwoKTsNCisJCWxpY2Vuc2Uuc2V0VVJMU3RyaW5nKCJhYm91dC5odG1sIik7DQorCQlsaWNlbnNlLnNldEFubm90YXRpb24oIllvdSBtdXN0IHZpZXcgdGhlIGZ1bGwgbGljZW5zZSBieSBmb2xsb3dpbmcgdGhlIFwiTGljZW5zZVwiIGxpbmsgaW4gdGhlIGZlYXR1cmUgcHJldmlldy5cblNlbGVjdGluZyBcIkFjY2VwdFwiIGluZGljYXRlcyB0aGF0IHlvdSBoYXZlIHZpZXdlZCBhbmQgYWNjZXB0ZWQgdGhlIGZlYXR1cmUgbGljZW5zZS4iKTsNCisJCWZlYXR1cmUuc2V0TGljZW5zZU1vZGVsKGxpY2Vuc2UpOw0KKwkJDQorCQkvLyBhZGQgY29weXJpZ2h0DQorCQlVUkxFbnRyeU1vZGVsIGNvcHlyaWdodCA9IGZhY3RvcnkuY3JlYXRlVVJMRW50cnlNb2RlbCgpOw0KKwkJY29weXJpZ2h0LnNldFVSTFN0cmluZygibm90aWNlLmh0bWwiKTsNCisJCWNvcHlyaWdodC5zZXRBbm5vdGF0aW9uKCJ4Iik7DQorCQlmZWF0dXJlLnNldENvcHlyaWdodE1vZGVsKGNvcHlyaWdodCk7DQorCX0JDQorCQ0KKwlwcml2YXRlIHZvaWQgcGFyc2VQbHVnaW5FbnRyaWVzKEJ1aWxkWmlwRmVhdHVyZUNvbnRlbnRQcm92aWRlciBjcCwgRmVhdHVyZU1vZGVsIGZlYXR1cmUsIFByb3BlcnRpZXMgbWFuaWZlc3QpIHRocm93cyBFeGNlcHRpb24gew0KKwkJDQorCQlFbnVtZXJhdGlvbiBlbnRyaWVzID0gbWFuaWZlc3Qua2V5cygpOw0KKwkJU3RyaW5nIHBsdWdpbjsNCisJCVN0cmluZyBwbHVnaW5JZDsNCisJCVN0cmluZyBwbHVnaW5WZXJzaW9uOw0KKwkJU3RyaW5nIHBsdWdpbkJ1aWxkVmVyc2lvbjsNCisJCVBsdWdpbkVudHJ5TW9kZWwgcGx1Z2luRW50cnk7DQorCQl3aGlsZShlbnRyaWVzLmhhc01vcmVFbGVtZW50cygpKSB7DQorCQkJcGx1Z2luID0gKFN0cmluZykgZW50cmllcy5uZXh0RWxlbWVudCgpOw0KKwkJCWlmIChwbHVnaW4uc3RhcnRzV2l0aCgicGx1Z2luQCIpKSB7DQorCQkJCXBsdWdpbklkID0gcGx1Z2luLnN1YnN0cmluZyg3KTsNCisJCQkJcGx1Z2luQnVpbGRWZXJzaW9uID0gbWFuaWZlc3QuZ2V0UHJvcGVydHkocGx1Z2luKTsNCisJCQkJaWYgKHBsdWdpbkJ1aWxkVmVyc2lvbi5lcXVhbHMoIkhFQUQiKSkgew0KKwkJCQkJU3RyaW5nIGZlYXR1cmVWZXJzaW9uID0gZmVhdHVyZS5nZXRGZWF0dXJlVmVyc2lvbigpOw0KKwkJCQkJaW50IGl4ID0gZmVhdHVyZVZlcnNpb24uaW5kZXhPZigiLiIpOw0KKwkJCQkJU3RyaW5nIGZlYXR1cmVNYWpvciA9IGl4PT0tMSA/IGZlYXR1cmVWZXJzaW9uIDogZmVhdHVyZVZlcnNpb24uc3Vic3RyaW5nKDAsaXgpOw0KKwkJCQkJcGx1Z2luQnVpbGRWZXJzaW9uICs9ICItIiArIGZlYXR1cmVNYWpvcjsNCisJCQkJfQ0KKwkJCQlwbHVnaW5FbnRyeSA9IGZhY3RvcnkuY3JlYXRlUGx1Z2luRW50cnlNb2RlbCgpOw0KKwkJCQlwbHVnaW5WZXJzaW9uID0gcGFyc2VQbHVnaW5WZXJzaW9uSW5NYW5pZmVzdChjcCwgcGx1Z2luSWQsIHBsdWdpbkVudHJ5KTsNCisJCQkJaWYgKHBsdWdpblZlcnNpb24gIT0gbnVsbCkgew0KKwkJCQkJcGx1Z2luRW50cnkuc2V0UGx1Z2luSWRlbnRpZmllcihwbHVnaW5JZCk7DQorCQkJCQlwbHVnaW5FbnRyeS5zZXRQbHVnaW5WZXJzaW9uKChuZXcgUGx1Z2luVmVyc2lvbklkZW50aWZpZXIocGx1Z2luVmVyc2lvbikpLnRvU3RyaW5nKCkrIi4iK3BsdWdpbkJ1aWxkVmVyc2lvbik7DQorCQkJCQlmZWF0dXJlLmFkZFBsdWdpbkVudHJ5TW9kZWwocGx1Z2luRW50cnkpOw0KKwkJCQl9DQorCQkJfQ0KKwkJfQkJDQorCX0NCisJDQorCXByaXZhdGUgdm9pZCBwYXJzZU5vblBsdWdpbkVudHJpZXMoQnVpbGRaaXBGZWF0dXJlQ29udGVudFByb3ZpZGVyIGNwLCBGZWF0dXJlTW9kZWwgZmVhdHVyZSwgUHJvcGVydGllcyBtYW5pZmVzdCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQorCS8vCU5vblBsdWdpbkVudHJ5TW9kZWwgbm9uUGx1Z2luRW50cnkgPSBmYWN0b3J5LmNyZWF0ZU5vblBsdWdpbkVudHJ5TW9kZWwoKTsNCisJLy8Jbm9uUGx1Z2luRW50cnkuc2V0SWRlbnRpZmllcigicm9vdCIpOw0KKwkvLwlmZWF0dXJlLmFkZE5vblBsdWdpbkVudHJ5TW9kZWwobm9uUGx1Z2luRW50cnkpOw0KKwl9DQorCQ0KKwlwcml2YXRlIFN0cmluZyBwYXJzZVBsdWdpblZlcnNpb25Jbk1hbmlmZXN0KEJ1aWxkWmlwRmVhdHVyZUNvbnRlbnRQcm92aWRlciBjcCwgU3RyaW5nIHBsdWdpbklkLCBQbHVnaW5FbnRyeU1vZGVsIHBsdWdpbkVudHJ5KSB7DQorDQorCQlpZiAocGx1Z2luUGFyc2VyID09IG51bGwpDQorCQkJcGx1Z2luUGFyc2VyID0gbmV3IEJ1aWxkWmlwUGx1Z2luUGFyc2VyKCk7DQorCQkJCQ0KKwkJSW5wdXRTdHJlYW0gaXMgPSBudWxsOwkJCQkNCisJCUNvbnRlbnRSZWZlcmVuY2UgcGx1Z2luTWFuaWZlc3Q7DQorCQl0cnkgew0KKwkJCS8vIHRyeSBwbHVnaW4ueG1sDQorCQkJcGx1Z2luTWFuaWZlc3QgID0gY3AuZ2V0UGx1Z2luTWFuaWZlc3QocGx1Z2luSWQsIGZhbHNlKTsNCisJCQlpcyA9IHBsdWdpbk1hbmlmZXN0LmdldElucHV0U3RyZWFtKCk7DQorCQkJcmV0dXJuIHBsdWdpblBhcnNlci5wYXJzZShpcyk7DQorCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KKwkJCXRyeSB7DQorCQkJCS8vIHJldHJ5IHdpdGggZmVhdHVyZS54bWwNCisJCQkJcGx1Z2luTWFuaWZlc3QgID0gY3AuZ2V0UGx1Z2luTWFuaWZlc3QocGx1Z2luSWQsIHRydWUpOw0KKwkJCQlpcyA9IHBsdWdpbk1hbmlmZXN0LmdldElucHV0U3RyZWFtKCk7DQorCQkJCVN0cmluZyByZXN1bHQgPSBwbHVnaW5QYXJzZXIucGFyc2UoaXMpOw0KKwkJCQlwbHVnaW5FbnRyeS5pc0ZyYWdtZW50KHRydWUpOw0KKwkJCQlyZXR1cm4gcmVzdWx0Ow0KKwkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlMikgew0KKwkJCQlyZXR1cm4gbnVsbDsNCisJCQl9DQorCQl9IGZpbmFsbHkgew0KKwkJCWlmIChpcyAhPSBudWxsKSB0cnkgeyBpcy5jbG9zZSgpOyB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7fQ0KKwkJfQ0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9leGFtcGxlcy9idWlsZHppcC9CdWlsZFppcFBsdWdpblBhcnNlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2V4YW1wbGVzL2J1aWxkemlwL0J1aWxkWmlwUGx1Z2luUGFyc2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU3MDgwNwotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9leGFtcGxlcy9idWlsZHppcC9CdWlsZFppcFBsdWdpblBhcnNlci5qYXZhCkBAIC0wLDAgKzEsODggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQorICoNCisgKiBDb250cmlidXRvcnM6DQorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzLmJ1aWxkemlwOw0KKw0KK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOw0KKw0KK2ltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy5wYXJzZXJzLlNBWFBhcnNlcjsNCitpbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsNCitpbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7DQoraW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlcjsNCisNCisvKioNCisgKiBQYXJzZSBkZWZhdWx0IGZlYXR1cmUueG1sDQorICovDQorDQorcHVibGljIGNsYXNzIEJ1aWxkWmlwUGx1Z2luUGFyc2VyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIgew0KKw0KKwlwcml2YXRlIFNBWFBhcnNlciBwYXJzZXI7DQorCXByaXZhdGUgU3RyaW5nIHZlcnNpb247DQorCQ0KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOID0gInBsdWdpbiI7DQorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGUkFHTUVOVCA9ICJmcmFnbWVudCI7DQorCQ0KKwlwcml2YXRlIGNsYXNzIFBhcnNlQ29tcGxldGVFeGNlcHRpb24gZXh0ZW5kcyBTQVhFeGNlcHRpb24gew0KKwkJcHVibGljIFBhcnNlQ29tcGxldGVFeGNlcHRpb24oU3RyaW5nIGFyZzApIHsNCisJCQlzdXBlcihhcmcwKTsNCisJCX0NCisJfQ0KKw0KKwkvKioNCisJICogQ29uc3RydWN0b3IgZm9yIERlZmF1bHRGZWF0dXJlUGFyc2VyDQorCSAqLw0KKwlwdWJsaWMgQnVpbGRaaXBQbHVnaW5QYXJzZXIoKSB7DQorCQlzdXBlcigpOw0KKwkJdGhpcy5wYXJzZXIgPSBuZXcgU0FYUGFyc2VyKCk7DQorCQl0aGlzLnBhcnNlci5zZXRDb250ZW50SGFuZGxlcih0aGlzKTsNCisJfQ0KKwkNCisJLyoqDQorCSAqIEBzaW5jZSAyLjANCisJICovDQorCXB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIHBhcnNlKElucHV0U3RyZWFtIGluKSB0aHJvd3MgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7DQorCQl0cnkgew0KKwkJCXZlcnNpb24gPSBudWxsOw0KKwkJCXBhcnNlci5wYXJzZShuZXcgSW5wdXRTb3VyY2UoaW4pKTsNCisJCX0gY2F0Y2goUGFyc2VDb21wbGV0ZUV4Y2VwdGlvbiBlKSB7DQorCQl9DQorCQlyZXR1cm4gdmVyc2lvbjsNCisJfQ0KKwkNCisJLyoqDQorCSAqIEBzZWUgRGVmYXVsdEhhbmRsZXIjc3RhcnRFbGVtZW50KFN0cmluZywgU3RyaW5nLCBTdHJpbmcsIEF0dHJpYnV0ZXMpDQorCSAqLw0KKwlwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSxTdHJpbmcgcU5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7DQorCQkNCisJCVN0cmluZyB0YWcgPSBsb2NhbE5hbWUudHJpbSgpOw0KKwkNCisJCWlmICh0YWcuZXF1YWxzSWdub3JlQ2FzZShQTFVHSU4pKSB7DQorCQkJcHJvY2Vzc1BsdWdpbihhdHRyaWJ1dGVzKTsNCisJCQlyZXR1cm47DQorCQl9DQorCQ0KKwkJaWYgKHRhZy5lcXVhbHNJZ25vcmVDYXNlKEZSQUdNRU5UKSkgew0KKwkJCXByb2Nlc3NQbHVnaW4oYXR0cmlidXRlcyk7DQorCQkJcmV0dXJuOw0KKwkJfQ0KKwl9DQorCQ0KKwkvKiogDQorCSAqIHByb2Nlc3MgcGx1Z2luIGVudHJ5IGluZm8NCisJICovDQorCXByaXZhdGUgdm9pZCBwcm9jZXNzUGx1Z2luKEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIFBhcnNlQ29tcGxldGVFeGNlcHRpb24gew0KKwkJdmVyc2lvbiA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInZlcnNpb24iKTsNCisJCXRocm93IG5ldyBQYXJzZUNvbXBsZXRlRXhjZXB0aW9uKCIiKTsNCisJfQ0KK30NCisNCisNCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvZXhhbXBsZXMvYnVpbGR6aXAvQnVpbGRaaXBTaXRlQ29udGVudFByb3ZpZGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvZXhhbXBsZXMvYnVpbGR6aXAvQnVpbGRaaXBTaXRlQ29udGVudFByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY0ODA5MQotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9leGFtcGxlcy9idWlsZHppcC9CdWlsZFppcFNpdGVDb250ZW50UHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDM2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KKyAqDQorICogQ29udHJpYnV0b3JzOg0KKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy5idWlsZHppcDsNCisNCitpbXBvcnQgamF2YS5uZXQuVVJMOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuU2l0ZUNvbnRlbnRQcm92aWRlcjsNCisNCitwdWJsaWMgY2xhc3MgQnVpbGRaaXBTaXRlQ29udGVudFByb3ZpZGVyIGV4dGVuZHMgU2l0ZUNvbnRlbnRQcm92aWRlciB7DQorDQorCS8qKg0KKwkgKiBDb25zdHJ1Y3RvciBmb3IgU2l0ZUNvbnRlbnRQcm92aWRlci4NCisJICovDQorCXB1YmxpYyBCdWlsZFppcFNpdGVDb250ZW50UHJvdmlkZXIoVVJMIHVybCkgew0KKwkJc3VwZXIodXJsKTsNCisJfQ0KKwkNCisJLyoNCisJICogQHNlZSBJU2l0ZUNvbnRlbnRQcm92aWRlciNnZXRBcmNoaXZlUmVmZXJlbmNlKFN0cmluZykNCisJICovDQorCXB1YmxpYyBVUkwgZ2V0QXJjaGl2ZVJlZmVyZW5jZShTdHJpbmcgaWQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCisJCS8vIGJ1aWxkIHppcCBmZWF0dXJlcyBkbyBub3QgaGF2ZSBhc3NvY2lhdGVkIGFyY2hpdmVzDQorCQkvLyB0aGUgemlwIGZpbGUgYWxzbyBjb250YWlucyB0aGUgYXJjaGl2ZXMgZmlsZXMNCisJCXJldHVybiBudWxsOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9leGFtcGxlcy9idWlsZHppcC9CdWlsZFppcFNpdGVGYWN0b3J5LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvZXhhbXBsZXMvYnVpbGR6aXAvQnVpbGRaaXBTaXRlRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmOThiZjQKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvZXhhbXBsZXMvYnVpbGR6aXAvQnVpbGRaaXBTaXRlRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsOTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQorICoNCisgKiBDb250cmlidXRvcnM6DQorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzLmJ1aWxkemlwOw0KKw0KK2ltcG9ydCBqYXZhLmlvLkZpbGU7DQoraW1wb3J0IGphdmEuaW8uRmlsZUZpbHRlcjsNCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOw0KK2ltcG9ydCBqYXZhLm5ldC5VUkw7DQoraW1wb3J0IGphdmEubmV0LlVSTERlY29kZXI7DQoraW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7DQoraW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkJhc2VTaXRlRmFjdG9yeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVNpdGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlNpdGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLkludmFsaWRTaXRlVHlwZUV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuQ2F0ZWdvcnlNb2RlbDsNCisNCitwdWJsaWMgY2xhc3MgQnVpbGRaaXBTaXRlRmFjdG9yeSBleHRlbmRzIEJhc2VTaXRlRmFjdG9yeSB7DQorDQorCS8qDQorCSAqIEBzZWUgSVNpdGVGYWN0b3J5I2NyZWF0ZVNpdGUoVVJMKQ0KKwkgKi8NCisJcHVibGljIElTaXRlIGNyZWF0ZVNpdGUoVVJMIHVybCkgdGhyb3dzIENvcmVFeGNlcHRpb24sSW52YWxpZFNpdGVUeXBlRXhjZXB0aW9uIHsNCisNCisJCVNpdGUgc2l0ZSA9IG51bGw7DQorDQorCQkvLyBjcmVhdGUgc2l0ZSBhbmQgYWRkIGNhdGVnb3J5DQorCQlzaXRlID0gKFNpdGUpIGNyZWF0ZVNpdGVNYXBNb2RlbCgpOw0KKwkJQ2F0ZWdvcnlNb2RlbCBjYXRlZ29yeSA9IGNyZWF0ZVNpdGVDYXRlZ29yeU1vZGVsKCk7DQorCQljYXRlZ29yeS5zZXROYW1lKCJlY2xpcHNlLWJ1aWxkcyIpOw0KKwkJY2F0ZWdvcnkuc2V0TGFiZWwoIkVjbGlwc2UgQnVpbGRzIik7DQorCQlzaXRlLmFkZENhdGVnb3J5TW9kZWwoY2F0ZWdvcnkpOw0KKw0KKwkJLy8gc2V0IGNvbnRlbnQgcHJvdmlkZXINCisJCUJ1aWxkWmlwU2l0ZUNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBuZXcgQnVpbGRaaXBTaXRlQ29udGVudFByb3ZpZGVyKHVybCk7DQorCQlzaXRlLnNldFNpdGVDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsNCisNCisJCS8vIGdldCBhbGwgbWF0Y2hpbmcgemlwIGZpbGVzIG9uIHRoZSBzaXRlDQorCQlGaWxlRmlsdGVyIGZpbHRlciA9IG5ldyBGaWxlRmlsdGVyKCkgew0KKwkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGZpbGUpIHsNCisJCQkJaWYgKGZpbGUuZ2V0TmFtZSgpLmVuZHNXaXRoKCIuemlwIikpIHsNCisJCQkJCXRyeSB7DQorCQkJCQkJWmlwRmlsZSB6aXAgPSBuZXcgWmlwRmlsZShmaWxlKTsNCisJCQkJCQlaaXBFbnRyeSBlbnRyeSA9IHppcC5nZXRFbnRyeSgiZWNsaXBzZS9idWlsZG1hbmlmZXN0LnByb3BlcnRpZXMiKTsNCisJCQkJCQlpZiAoZW50cnkgPT0gbnVsbCkNCisJCQkJCQkJcmV0dXJuIGZhbHNlOw0KKwkJCQkJCWVsc2UNCisJCQkJCQkJcmV0dXJuIHRydWU7DQorCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQorCQkJCQkJcmV0dXJuIGZhbHNlOw0KKwkJCQkJfQ0KKwkJCQl9IGVsc2UNCisJCQkJCXJldHVybiBmYWxzZTsNCisJCQl9DQorCQl9Ow0KKwkJRmlsZSBmaWxlID0gbmV3IEZpbGUoVVJMRGVjb2Rlci5kZWNvZGUodXJsLmdldEZpbGUoKSkpOw0KKwkJRmlsZVtdIHppcHMgPSBmaWxlLmxpc3RGaWxlcyhmaWx0ZXIpOw0KKw0KKwkJLy8gY3JlYXRlIGEgcmVmZXJlbmNlIGZvciBlYWNoIG1hdGNoaW5nIHppcA0KKwkJU2l0ZUZlYXR1cmVSZWZlcmVuY2VNb2RlbCByZWYgPSBudWxsOw0KKwkJZm9yIChpbnQgaSA9IDA7IHppcHMgIT0gbnVsbCAmJiBpIDwgemlwcy5sZW5ndGg7IGkrKykgew0KKwkJCXJlZiA9IGNyZWF0ZUZlYXR1cmVSZWZlcmVuY2VNb2RlbCgpOw0KKwkJCXJlZi5zZXRUeXBlKCJvcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMuemlwIik7DQorCQkJcmVmLnNldFNpdGVNb2RlbChzaXRlKTsNCisJCQlyZWYuc2V0VVJMU3RyaW5nKCJmaWxlOiIgKyB6aXBzW2ldLmdldEFic29sdXRlUGF0aCgpKTsNCisJCQlyZWYuc2V0Q2F0ZWdvcnlOYW1lcyhuZXcgU3RyaW5nW10geyAiZWNsaXBzZS1idWlsZHMiIH0pOw0KKwkJCXNpdGUuYWRkRmVhdHVyZVJlZmVyZW5jZU1vZGVsKHJlZik7DQorCQl9DQorCQl0cnkgew0KKwkJCXNpdGUucmVzb2x2ZSh1cmwsIG51bGwpOyAvLyByZXNvbHZlIGFueSBVUkxzIHJlbGF0aXZlIHRvIHRoZSBzaXRlDQorCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSl7DQorCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oIiIsZSk7DQorCQl9DQorDQorCQlyZXR1cm4gc2l0ZTsNCisJfQ0KKw0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvZXhhbXBsZXMvYnVpbGR6aXAvRGVmYXVsdE1vZGVsV3JpdGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvZXhhbXBsZXMvYnVpbGR6aXAvRGVmYXVsdE1vZGVsV3JpdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA5ZTU0MwotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9leGFtcGxlcy9idWlsZHppcC9EZWZhdWx0TW9kZWxXcml0ZXIuamF2YQpAQCAtMCwwICsxLDIzMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy5idWlsZHppcDsKKworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC4qOworCisvKioKKyAqIFdyaXRlIHN0YW5kYXJkIGZlYXR1cmUgbWFuaWZlc3QgKGZlYXR1cmUueG1sKSBmcm9tIG1vZGVsLgorICogPC9wPgorICogQHNpbmNlIDIuMAorICovCisKK3B1YmxpYyBjbGFzcyBEZWZhdWx0TW9kZWxXcml0ZXIgeworCQorCXByaXZhdGUgRmVhdHVyZU1vZGVsIGZlYXR1cmU7CisJCisJLyoqCisJICogQHNpbmNlIDIuMAorCSAqLworCXB1YmxpYyBEZWZhdWx0TW9kZWxXcml0ZXIoRmVhdHVyZU1vZGVsIGZlYXR1cmUpIHsKKwkJdGhpcy5mZWF0dXJlID0gZmVhdHVyZTsKKwl9CisJCisJLyoqCisJICogQHNpbmNlIDIuMAorCSAqLworCXB1YmxpYyB2b2lkIHdyaXRlRmVhdHVyZU1hbmlmZXN0KE91dHB1dFN0cmVhbSBvcykgeworCQlQcmludFdyaXRlciB3ID0gbmV3IFByaW50V3JpdGVyKG9zKTsKKwkJd3JpdGVGZWF0dXJlKHcsMCxmZWF0dXJlKTsKKwkJdy5mbHVzaCgpOworCX0KKwkKKwlwcml2YXRlIHZvaWQgd3JpdGVGZWF0dXJlKFByaW50V3JpdGVyIHcsIGludCBsZXZlbCwgRmVhdHVyZU1vZGVsIGZlYXR1cmUpIHsKKwkJaWYgKGZlYXR1cmUgPT0gbnVsbCkgcmV0dXJuOworCQkKKwkJU3RyaW5nIGluID0gZ2V0SW5kZW50KGxldmVsKTsKKwkJdy5wcmludGxuKGluKyI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz4iKTsKKwkJCisJCXcucHJpbnRsbihpbisiPGZlYXR1cmUiKTsKKwkJaWYgKGZlYXR1cmUuZ2V0RmVhdHVyZUlkZW50aWZpZXIoKSE9bnVsbCkKKwkJCXcucHJpbnRsbihpbisiICAgIisiaWQ9XCIiK2ZlYXR1cmUuZ2V0RmVhdHVyZUlkZW50aWZpZXIoKSsiXCIiKTsKKwkJaWYgKGZlYXR1cmUuZ2V0RmVhdHVyZVZlcnNpb24oKSE9bnVsbCkKKwkJCXcucHJpbnRsbihpbisiICAgIisidmVyc2lvbj1cIiIrZmVhdHVyZS5nZXRGZWF0dXJlVmVyc2lvbigpKyJcIiIpOworCQlpZiAoZmVhdHVyZS5nZXRMYWJlbE5vbkxvY2FsaXplZCgpIT1udWxsKQorCQkJdy5wcmludGxuKGluKyIgICAiKyJsYWJlbD1cIiIrZmVhdHVyZS5nZXRMYWJlbE5vbkxvY2FsaXplZCgpKyJcIiIpOworCQlpZiAoZmVhdHVyZS5nZXRQcm92aWRlck5vbkxvY2FsaXplZCgpIT1udWxsKQorCQkJdy5wcmludGxuKGluKyIgICAiKyJwcm92aWRlci1uYW1lPVwiIitmZWF0dXJlLmdldFByb3ZpZGVyTm9uTG9jYWxpemVkKCkrIlwiIik7CisJCWlmIChmZWF0dXJlLmdldEltYWdlVVJMU3RyaW5nKCkhPW51bGwpCisJCQl3LnByaW50bG4oaW4rIiAgICIrImltYWdlPVwiIitmZWF0dXJlLmdldEltYWdlVVJMU3RyaW5nKCkrIlwiIik7CisJCWlmIChmZWF0dXJlLmdldE9TKCkhPW51bGwpCisJCQl3LnByaW50bG4oaW4rIiAgICIrIm9zPVwiIitmZWF0dXJlLmdldE9TKCkrIlwiIik7CisJCWlmIChmZWF0dXJlLmdldFdTKCkhPW51bGwpCisJCQl3LnByaW50bG4oaW4rIiAgICIrIndzPVwiIitmZWF0dXJlLmdldFdTKCkrIlwiIik7CisJCWlmIChmZWF0dXJlLmdldE5MKCkhPW51bGwpCisJCQl3LnByaW50bG4oaW4rIiAgICIrIm5sPVwiIitmZWF0dXJlLmdldE5MKCkrIlwiIik7CisJCWlmIChmZWF0dXJlLmdldEFwcGxpY2F0aW9uKCkhPW51bGwpCisJCQl3LnByaW50bG4oaW4rIiAgICIrImFwcGxpY2F0aW9uPVwiIitmZWF0dXJlLmdldEFwcGxpY2F0aW9uKCkrIlwiIik7CisJCXcucHJpbnRsbihpbisiICAgIisiPiIpOworCQkKKwkJd3JpdGVEZXNjcmlwdGlvbih3LCBsZXZlbCsxLCBmZWF0dXJlLmdldERlc2NyaXB0aW9uTW9kZWwoKSk7CisJCXdyaXRlQ29weXJpZ2h0KHcsIGxldmVsKzEsIGZlYXR1cmUuZ2V0Q29weXJpZ2h0TW9kZWwoKSk7CisJCXdyaXRlTGljZW5zZSh3LCBsZXZlbCsxLCBmZWF0dXJlLmdldExpY2Vuc2VNb2RlbCgpKTsKKwkJd3JpdGVVUkxzKHcsIGxldmVsKzEsIGZlYXR1cmUpOworCQl3cml0ZVByZXJlcXModywgbGV2ZWwrMSwgZmVhdHVyZSk7CisJCXdyaXRlUGx1Z2luRW50cmllcyh3LCBsZXZlbCsxLCBmZWF0dXJlKTsKKwkJd3JpdGVOb25QbHVnaW5FbnRyaWVzKHcsIGxldmVsKzEsIGZlYXR1cmUpOworICAgICAgICAgCisgICAgICAgIHcucHJpbnRsbigiIik7CisgICAgICAgIHcucHJpbnRsbihpbisiPC9mZWF0dXJlPiIpOworCX0KKwkKKwlwcml2YXRlIHZvaWQgd3JpdGVEZXNjcmlwdGlvbihQcmludFdyaXRlciB3LCBpbnQgbGV2ZWwsIFVSTEVudHJ5TW9kZWwgdWUpIHsKKwkJd3JpdGVEZXNjcmlwdGlvbkVudHJ5KHcsbGV2ZWwsIHVlLCAiZGVzY3JpcHRpb24iKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIHdyaXRlQ29weXJpZ2h0KFByaW50V3JpdGVyIHcsIGludCBsZXZlbCwgVVJMRW50cnlNb2RlbCB1ZSkgeworCQl3cml0ZURlc2NyaXB0aW9uRW50cnkodyxsZXZlbCwgdWUsICJjb3B5cmlnaHQiKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIHdyaXRlTGljZW5zZShQcmludFdyaXRlciB3LCBpbnQgbGV2ZWwsIFVSTEVudHJ5TW9kZWwgdWUpIHsKKwkJd3JpdGVEZXNjcmlwdGlvbkVudHJ5KHcsbGV2ZWwsIHVlLCAibGljZW5zZSIpOworCX0KKwkKKwlwcml2YXRlIHZvaWQgd3JpdGVEZXNjcmlwdGlvbkVudHJ5KFByaW50V3JpdGVyIHcsIGludCBsZXZlbCwgVVJMRW50cnlNb2RlbCB1ZSwgU3RyaW5nIHRhZykgeworCQlpZiAodWUgPT0gbnVsbCkgcmV0dXJuOworCQlTdHJpbmcgdXJsID0gdWUuZ2V0VVJMU3RyaW5nKCk7CisJCVN0cmluZyB0eHQgPSB1ZS5nZXRBbm5vdGF0aW9uTm9uTG9jYWxpemVkKCk7CisJCWlmICh1cmw9PW51bGwgJiYgdHh0PT1udWxsKSByZXR1cm47CisJCQorCQlTdHJpbmcgaW4gPSBnZXRJbmRlbnQobGV2ZWwpOworCQl3LnByaW50bG4oIiIpOworCQlpZiAodXJsPT1udWxsKQorCQkJdy5wcmludGxuKGluKyI8Iit0YWcrIj4iKTsKKwkJZWxzZSB7CisJCQl3LnByaW50KGluKyI8Iit0YWcrIiB1cmw9XCIiK3VlLmdldFVSTFN0cmluZygpKyJcIiIpOworCQkJaWYgKHR4dD09bnVsbCkKKwkJCQl3LnByaW50bG4oIi8+Iik7CisJCQllbHNlCisJCQkJdy5wcmludGxuKCI+Iik7CisJCX0KKwkJaWYgKHR4dCE9bnVsbCkgeworCQkJdy5wcmludGxuKGluICsgdHh0KTsKKwkJCXcucHJpbnRsbihpbisiPC8iK3RhZysiPiIpOworCQl9CisJfQorCQorCXByaXZhdGUgdm9pZCB3cml0ZVVSTHMoUHJpbnRXcml0ZXIgdywgaW50IGxldmVsLCBGZWF0dXJlTW9kZWwgZmVhdHVyZSkgewkKKwkJVVJMRW50cnlNb2RlbCB1cGRhdGUgPSBmZWF0dXJlLmdldFVwZGF0ZVNpdGVFbnRyeU1vZGVsKCk7CisJCVVSTEVudHJ5TW9kZWxbXSBkaXNjb3ZlcnkgPSBmZWF0dXJlLmdldERpc2NvdmVyeVNpdGVFbnRyeU1vZGVscygpOwkJCisJCWlmICh1cGRhdGUgPT0gbnVsbCAmJiAoZGlzY292ZXJ5ID09IG51bGwgfHwgZGlzY292ZXJ5Lmxlbmd0aD09MCkpIHJldHVybjsKKwkJCisJCVN0cmluZyBpbiA9IGdldEluZGVudChsZXZlbCk7CisJCVN0cmluZyBpbjIgPSBnZXRJbmRlbnQobGV2ZWwrMSk7CQkKKwkJdy5wcmludGxuKCIiKTsKKwkJdy5wcmludGxuKGluKyI8dXJsPiIpOworCQkKKwkJaWYgKHVwZGF0ZSAhPSBudWxsKSB7CisJCQl3LnByaW50bG4oaW4yKyI8dXBkYXRlIik7CisJCQlpZiAodXBkYXRlLmdldFVSTFN0cmluZygpIT1udWxsKQorCQkJCXcucHJpbnRsbihpbjIrIiAgICIrInVybD1cIiIrdXBkYXRlLmdldFVSTFN0cmluZygpKyJcIiIpOworCQkJaWYgKHVwZGF0ZS5nZXRBbm5vdGF0aW9uTm9uTG9jYWxpemVkKCkhPW51bGwpCisJCQkJdy5wcmludGxuKGluMisiICAgIisibGFiZWw9XCIiK3VwZGF0ZS5nZXRBbm5vdGF0aW9uTm9uTG9jYWxpemVkKCkrIlwiIik7CisJCQl3LnByaW50bG4oaW4yKyIgICAiKyIvPiIpOworCQl9CisJCQorCQlmb3IgKGludCBpPTA7IGRpc2NvdmVyeSE9bnVsbCAmJiBpPGRpc2NvdmVyeS5sZW5ndGg7IGkrKykgeworCQkJdy5wcmludGxuKGluMisiPGRpc2NvdmVyeSIpOworCQkJaWYgKGRpc2NvdmVyeVtpXS5nZXRVUkxTdHJpbmcoKSE9bnVsbCkJCisJCQkJdy5wcmludGxuKGluMisiICAgIisidXJsPVwiIitkaXNjb3ZlcnlbaV0uZ2V0VVJMU3RyaW5nKCkrIlwiIik7CisJCQlpZiAoZGlzY292ZXJ5W2ldLmdldEFubm90YXRpb25Ob25Mb2NhbGl6ZWQoKSE9bnVsbCkKKwkJCQl3LnByaW50bG4oaW4yKyIgICAiKyJsYWJlbD1cIiIrZGlzY292ZXJ5W2ldLmdldEFubm90YXRpb25Ob25Mb2NhbGl6ZWQoKSsiXCIiKTsKKwkJCXcucHJpbnRsbihpbjIrIiAgICIrIi8+Iik7CisJCX0KKwkJCisJCXcucHJpbnRsbihpbisiPC91cmw+Iik7CisJfQorCQorCXByaXZhdGUgdm9pZCB3cml0ZVByZXJlcXMoUHJpbnRXcml0ZXIgdywgaW50IGxldmVsLCBGZWF0dXJlTW9kZWwgZmVhdHVyZSkgewkKKwkJSW1wb3J0TW9kZWxbXSBpbXAgPSBmZWF0dXJlLmdldEltcG9ydE1vZGVscygpOwkKKwkJaWYgKGltcCA9PSBudWxsIHx8IGltcC5sZW5ndGggPT0gMCkgcmV0dXJuOworCQkKKwkJU3RyaW5nIGluID0gZ2V0SW5kZW50KGxldmVsKTsKKwkJU3RyaW5nIGluMiA9IGdldEluZGVudChsZXZlbCsxKTsKKwkJdy5wcmludGxuKCIiKTsKKwkJdy5wcmludGxuKGluKyI8cmVxdWlyZXM+Iik7CisJCQorCQlmb3IgKGludCBpPTA7IGltcCE9bnVsbCAmJiBpPGltcC5sZW5ndGg7IGkrKykgeworCQkJdy5wcmludGxuKGluMisiPGltcG9ydCIpOworCQkJaWYgKGltcFtpXS5nZXRJZGVudGlmaWVyKCkhPW51bGwpCisJCQkJdy5wcmludGxuKGluMisiICAgIisicGx1Z2luPVwiIitpbXBbaV0uZ2V0SWRlbnRpZmllcigpKyJcIiIpOworCQkJaWYgKGltcFtpXS5nZXRWZXJzaW9uKCkhPW51bGwpCisJCQkJdy5wcmludGxuKGluMisiICAgIisidmVyc2lvbj1cIiIraW1wW2ldLmdldFZlcnNpb24oKSsiXCIiKTsKKwkJCWlmIChpbXBbaV0uZ2V0TWF0Y2hpbmdSdWxlTmFtZSgpIT1udWxsKQorCQkJCXcucHJpbnRsbihpbjIrIiAgICIrIm1hdGNoPVwiIitpbXBbaV0uZ2V0TWF0Y2hpbmdSdWxlTmFtZSgpKyJcIiIpOworCQkJdy5wcmludGxuKGluMisiICAgIisiLz4iKTsKKwkJfQorCQkKKwkJdy5wcmludGxuKGluKyI8L3JlcXVpcmVzPiIpOworCX0KKwkKKwlwcml2YXRlIHZvaWQgd3JpdGVQbHVnaW5FbnRyaWVzKFByaW50V3JpdGVyIHcsIGludCBsZXZlbCwgRmVhdHVyZU1vZGVsIGZlYXR1cmUpIHsKKwkJUGx1Z2luRW50cnlNb2RlbFtdIHBsdWdpbiA9IGZlYXR1cmUuZ2V0UGx1Z2luRW50cnlNb2RlbHMoKTsKKwkJaWYgKHBsdWdpbiA9PSBudWxsIHx8IHBsdWdpbi5sZW5ndGggPT0gMCkgcmV0dXJuOworCQkKKwkJU3RyaW5nIGluID0gZ2V0SW5kZW50KGxldmVsKTsKKwkJdy5wcmludGxuKCIiKTsKKwkJCisJCWZvciAoaW50IGk9MDsgaTxwbHVnaW4ubGVuZ3RoOyBpKyspIHsKKwkJCXcucHJpbnRsbihpbisiPHBsdWdpbiIpOworCQkJaWYgKHBsdWdpbltpXS5nZXRQbHVnaW5JZGVudGlmaWVyKCkhPW51bGwpCisJCQkJdy5wcmludGxuKGluKyIgICAiKyJpZD1cIiIrcGx1Z2luW2ldLmdldFBsdWdpbklkZW50aWZpZXIoKSsiXCIiKTsKKwkJCWlmIChwbHVnaW5baV0uZ2V0UGx1Z2luVmVyc2lvbigpIT1udWxsKQorCQkJCXcucHJpbnRsbihpbisiICAgIisidmVyc2lvbj1cIiIrcGx1Z2luW2ldLmdldFBsdWdpblZlcnNpb24oKSsiXCIiKTsKKwkJCWlmIChwbHVnaW5baV0uaXNGcmFnbWVudCgpKQorCQkJCXcucHJpbnRsbihpbisiICAgIisiZnJhZ21lbnQ9XCIiK3BsdWdpbltpXS5pc0ZyYWdtZW50KCkrIlwiIik7CisJCQlpZiAocGx1Z2luW2ldLmdldE9TKCkhPW51bGwpCisJCQkJdy5wcmludGxuKGluKyIgICAiKyJvcz1cIiIrcGx1Z2luW2ldLmdldE9TKCkrIlwiIik7CisJCQlpZiAocGx1Z2luW2ldLmdldFdTKCkhPW51bGwpCisJCQkJdy5wcmludGxuKGluKyIgICAiKyJ3cz1cIiIrcGx1Z2luW2ldLmdldFdTKCkrIlwiIik7CisJCQlpZiAocGx1Z2luW2ldLmdldE5MKCkhPW51bGwpCisJCQkJdy5wcmludGxuKGluKyIgICAiKyJubD1cIiIrcGx1Z2luW2ldLmdldE5MKCkrIlwiIik7CisJCQlpZiAocGx1Z2luW2ldLmdldERvd25sb2FkU2l6ZSgpIT1Db250ZW50RW50cnlNb2RlbC5VTktOT1dOX1NJWkUpCisJCQkJdy5wcmludGxuKGluKyIgICAiKyJkb3dubG9hZC1zaXplPVwiIitwbHVnaW5baV0uZ2V0RG93bmxvYWRTaXplKCkrIlwiIik7CisJCQlpZiAocGx1Z2luW2ldLmdldEluc3RhbGxTaXplKCkhPUNvbnRlbnRFbnRyeU1vZGVsLlVOS05PV05fU0laRSkKKwkJCQl3LnByaW50bG4oaW4rIiAgICIrImluc3RhbGwtc2l6ZT1cIiIrcGx1Z2luW2ldLmdldEluc3RhbGxTaXplKCkrIlwiIik7CisJCQl3LnByaW50bG4oaW4rIiAgICIrIi8+Iik7CisJCX0KKwl9CisJCisJcHJpdmF0ZSB2b2lkIHdyaXRlTm9uUGx1Z2luRW50cmllcyhQcmludFdyaXRlciB3LCBpbnQgbGV2ZWwsIEZlYXR1cmVNb2RlbCBmZWF0dXJlKSB7CisJCU5vblBsdWdpbkVudHJ5TW9kZWxbXSBkYXRhID0gZmVhdHVyZS5nZXROb25QbHVnaW5FbnRyeU1vZGVscygpOworCQlpZiAoZGF0YSA9PSBudWxsIHx8IGRhdGEubGVuZ3RoID09IDApIHJldHVybjsKKwkJCisJCVN0cmluZyBpbiA9IGdldEluZGVudChsZXZlbCk7CisJCXcucHJpbnRsbigiIik7CisJCQorCQlmb3IgKGludCBpPTA7IGk8ZGF0YS5sZW5ndGg7IGkrKykgeworCQkJdy5wcmludGxuKGluKyI8ZGF0YSIpOworCQkJaWYgKGRhdGFbaV0uZ2V0SWRlbnRpZmllcigpIT1udWxsKQorCQkJCXcucHJpbnRsbihpbisiICAgIisiaWQ9XCIiK2RhdGFbaV0uZ2V0SWRlbnRpZmllcigpKyJcIiIpOworCQkJaWYgKGRhdGFbaV0uZ2V0T1MoKSE9bnVsbCkKKwkJCQl3LnByaW50bG4oaW4rIiAgICIrIm9zPVwiIitkYXRhW2ldLmdldE9TKCkrIlwiIik7CisJCQlpZiAoZGF0YVtpXS5nZXRXUygpIT1udWxsKQorCQkJCXcucHJpbnRsbihpbisiICAgIisid3M9XCIiK2RhdGFbaV0uZ2V0V1MoKSsiXCIiKTsKKwkJCWlmIChkYXRhW2ldLmdldE5MKCkhPW51bGwpCisJCQkJdy5wcmludGxuKGluKyIgICAiKyJubD1cIiIrZGF0YVtpXS5nZXROTCgpKyJcIiIpOworCQkJaWYgKGRhdGFbaV0uZ2V0RG93bmxvYWRTaXplKCkhPUNvbnRlbnRFbnRyeU1vZGVsLlVOS05PV05fU0laRSkKKwkJCQl3LnByaW50bG4oaW4rIiAgICIrImRvd25sb2FkLXNpemU9XCIiK2RhdGFbaV0uZ2V0RG93bmxvYWRTaXplKCkrIlwiIik7CisJCQlpZiAoZGF0YVtpXS5nZXRJbnN0YWxsU2l6ZSgpIT1Db250ZW50RW50cnlNb2RlbC5VTktOT1dOX1NJWkUpCisJCQkJdy5wcmludGxuKGluKyIgICAiKyJpbnN0YWxsLXNpemU9XCIiK2RhdGFbaV0uZ2V0SW5zdGFsbFNpemUoKSsiXCIiKTsKKwkJCXcucHJpbnRsbihpbisiICAgIisiLz4iKTsKKwkJfQorCX0KKwkKKwkKKwlwcml2YXRlIFN0cmluZyBnZXRJbmRlbnQoaW50IGxldmVsKSB7CisJCVN0cmluZyBpbmRlbnQgPSAiIjsKKwkJZm9yIChpbnQgaT0wOyBpPGxldmVsOyBpKyspIAorCQkJaW5kZW50ICs9ICIgICAiOworCQlyZXR1cm4gaW5kZW50OworCX0KK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9leGFtcGxlcy9idWlsZHppcC9UZXN0LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvZXhhbXBsZXMvYnVpbGR6aXAvVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5NDZhY2MKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvZXhhbXBsZXMvYnVpbGR6aXAvVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQorICoNCisgKiBDb250cmlidXRvcnM6DQorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzLmJ1aWxkemlwOw0KKw0KK2ltcG9ydCBqYXZhLm5ldC5VUkw7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7DQorIA0KKy8qKg0KKyAqIHVuaXQgdGVzdCBoYXJuZXNzDQorICovDQorDQorcHVibGljIGNsYXNzIFRlc3Qgew0KKw0KKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7DQorCQkNCisJCXRyeSB7DQorCQkJVVJMIHVybCA9IG5ldyBVUkwoImZpbGU6ZDovZG93bmxvYWRzL2VjbGlwc2UgMi4wL2ludGVncmF0aW9uLWVjbGlwc2UtU0RLLTIwMDIwMTA5LXdpbjMyLnppcCIpOw0KKwkJCUJ1aWxkWmlwRmVhdHVyZUZhY3RvcnkgZmFjdG9yeSA9IG5ldyBCdWlsZFppcEZlYXR1cmVGYWN0b3J5KCk7DQorCQkJRmVhdHVyZSBmZWF0dXJlID0gKEZlYXR1cmUpIGZhY3RvcnkuY3JlYXRlRmVhdHVyZSh1cmwsbnVsbC8qSVNpdGUqLyk7DQorCQkJRGVmYXVsdE1vZGVsV3JpdGVyIHcgPSBuZXcgRGVmYXVsdE1vZGVsV3JpdGVyKGZlYXR1cmUpOw0KKwkJCXcud3JpdGVGZWF0dXJlTWFuaWZlc3QoU3lzdGVtLm91dCk7DQorCQkJDQorCQkJU3lzdGVtLm91dC5wcmludGxuKCIiKTsNCisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkZlYXR1cmUgZW50cnkgcmVmZXJlbmNlcyIpOw0KKwkJCUNvbnRlbnRSZWZlcmVuY2VbXSByZWZzID0gZmVhdHVyZS5nZXRGZWF0dXJlQ29udGVudFByb3ZpZGVyKCkuZ2V0RmVhdHVyZUVudHJ5Q29udGVudFJlZmVyZW5jZXMobnVsbCk7DQorCQkJZm9yIChpbnQgaT0wOyBpPCByZWZzLmxlbmd0aDsgaSsrKSB7DQorCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgIityZWZzW2ldLmdldElkZW50aWZpZXIoKSk7DQorCQkJfQ0KKwkJCQ0KKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiIik7DQorCQkJU3lzdGVtLm91dC5wcmludGxuKCJQbHVnLWluIGVudHJ5IHJlZmVyZW5jZXMiKTsNCisJCQlJUGx1Z2luRW50cnlbXSBlbnRyeSA9IGZlYXR1cmUuZ2V0UGx1Z2luRW50cmllcygpOw0KKwkJCXJlZnMgPSBmZWF0dXJlLmdldEZlYXR1cmVDb250ZW50UHJvdmlkZXIoKS5nZXRQbHVnaW5FbnRyeUNvbnRlbnRSZWZlcmVuY2VzKGVudHJ5WzBdLCBudWxsKTsNCisJCQlmb3IgKGludCBpPTA7IGk8IHJlZnMubGVuZ3RoOyBpKyspIHsNCisJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAiK3JlZnNbaV0uZ2V0SWRlbnRpZmllcigpKTsNCisJCQl9CQkJDQorCQkJDQorCQkJU3lzdGVtLm91dC5wcmludGxuKCIiKTsNCisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5vbi1wbHVnLWluIGVudHJ5IHJlZmVyZW5jZXMiKTsNCisJCQlJTm9uUGx1Z2luRW50cnlbXSBkYXRhID0gZmVhdHVyZS5nZXROb25QbHVnaW5FbnRyaWVzKCk7DQorCQkJcmVmcyA9IGZlYXR1cmUuZ2V0RmVhdHVyZUNvbnRlbnRQcm92aWRlcigpLmdldE5vblBsdWdpbkVudHJ5QXJjaGl2ZVJlZmVyZW5jZXMoZGF0YVswXSwgbnVsbCk7DQorCQkJZm9yIChpbnQgaT0wOyBpPCByZWZzLmxlbmd0aDsgaSsrKSB7DQorCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgIityZWZzW2ldLmdldElkZW50aWZpZXIoKSk7DQorCQkJfQkJCQ0KKwkJCQ0KKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiRG9uZSAuLi4iKTsNCisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQorCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCisJCX0JCQ0KKwl9DQorfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9leGFtcGxlcy9idWlsZHppcC9qYXZhLnBhZ2UuanBhZ2UgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvZXhhbXBsZXMvYnVpbGR6aXAvamF2YS5wYWdlLmpwYWdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjYjI0YmQKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvZXhhbXBsZXMvYnVpbGR6aXAvamF2YS5wYWdlLmpwYWdlCkBAIC0wLDAgKzEsNDUgQEAKKw0KKw0KK2phdmEudXRpbC5Qcm9wZXJ0aWVzIHAgPSBTeXN0ZW0uZ2V0UHJvcGVydGllcygpOw0KK2phdmEudXRpbC5FbnVtZXJhdGlvbiBrZXlzID0gcC5rZXlzKCk7DQord2hpbGUgKGtleXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsNCisJU3RyaW5nIGtleSA9IChTdHJpbmcpa2V5cy5uZXh0RWxlbWVudCgpOw0KKwlTeXN0ZW0ub3V0LnByaW50bG4oa2V5ICsgIiA9ICIgKyAoU3RyaW5nKXAuZ2V0KGtleSkpOw0KK30NCisNCisNCisNCisNCisNCitTdHJpbmcgZmlsZU5hbWUgPSAiZDpcXGRvd25sb2Fkc1xcZWNsaXBzZSAyLjBcXGludGVncmF0aW9uLWVjbGlwc2UtU0RLLTIwMDIwMTA5LXdpbjMyLnppcCI7DQoramF2YS5pby5GaWxlIGFyY2hpdmVGaWxlID0gbmV3IGphdmEuaW8uRmlsZShmaWxlTmFtZSk7DQoramF2YS51dGlsLmphci5KYXJGaWxlIGphckFyY2hpdmUgPSBuZXcgamF2YS51dGlsLmphci5KYXJGaWxlKGFyY2hpdmVGaWxlKTsNCitqYXZhLnV0aWwuamFyLkphckVudHJ5IGVudHJ5Ow0KK2phdmEudXRpbC5FbnVtZXJhdGlvbiBlbnRyaWVzID0gamFyQXJjaGl2ZS5lbnRyaWVzKCk7DQord2hpbGUoZW50cmllcy5oYXNNb3JlRWxlbWVudHMoKSkgew0KKwllbnRyeSA9IChqYXZhLnV0aWwuamFyLkphckVudHJ5KSBlbnRyaWVzLm5leHRFbGVtZW50KCk7DQorCVN5c3RlbS5vdXQucHJpbnRsbihlbnRyeS5nZXROYW1lKCkpOw0KK30NCisNCisNCitTdHJpbmcgYSA9ICIyMjMiOw0KK1N0cmluZyBiID0gIjEyMyI7DQorYS5jb21wYXJlVG8oYik7DQorDQorDQorb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuVmVyc2lvbiB2MSA9IA0KKwluZXcgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuVmVyc2lvbigxLDIsMywiYnVpbGQgMTI3SiIpOw0KK29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlZlcnNpb24gdjIgPSANCisJbmV3IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlZlcnNpb24oMSwyLDMsImJ1aWxkIDEyN0oiKTsNCit2MS5jb21wYXJlKHYyKTsNCisNCisNCitqYXZhLmlvLkZpbGUgZiA9IG5ldyBqYXZhLmlvLkZpbGUoImQ6XFxkb3dubG9hZHNcXGVjbGlwc2UgMi4wXFx4XFwiKTsNCitmLmlzRGlyZWN0b3J5KCk7DQorDQorDQorU3RyaW5nIHMgPSAiaGVsbG8iOw0KK09iamVjdCBhID0gamF2YS5sYW5nLnJlZmxlY3QuQXJyYXkubmV3SW5zdGFuY2Uocy5nZXRDbGFzcygpLDApOw0KK1N5c3RlbS5vdXQucHJpbnRsbihhLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsNCisNCisNCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvZXhhbXBsZXMvZnJlZWZvcm0vRnJlZUZvcm1TaXRlQ29udGVudFByb3ZpZGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvZXhhbXBsZXMvZnJlZWZvcm0vRnJlZUZvcm1TaXRlQ29udGVudFByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA2ZTMzYwotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9leGFtcGxlcy9mcmVlZm9ybS9GcmVlRm9ybVNpdGVDb250ZW50UHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDQ0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KKyAqIA0KKyAqIENvbnRyaWJ1dG9yczoNCisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMuZnJlZWZvcm07DQoraW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsNCitpbXBvcnQgamF2YS5uZXQuVVJMOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlNpdGVDb250ZW50UHJvdmlkZXI7DQorDQorcHVibGljIGNsYXNzIEZyZWVGb3JtU2l0ZUNvbnRlbnRQcm92aWRlciBleHRlbmRzIFNpdGVDb250ZW50UHJvdmlkZXIgew0KKw0KKwkvKioNCisJICogQ29uc3RydWN0b3IgZm9yIFNpdGVDb250ZW50UHJvdmlkZXIuDQorCSAqLw0KKwlwdWJsaWMgRnJlZUZvcm1TaXRlQ29udGVudFByb3ZpZGVyKFVSTCB1cmwpIHsNCisJCXN1cGVyKHVybCk7DQorCX0NCisJDQorCS8qDQorCSAqIEBzZWUgSVNpdGVDb250ZW50UHJvdmlkZXIjZ2V0QXJjaGl2ZVJlZmVyZW5jZShTdHJpbmcpDQorCSAqLw0KKwlwdWJsaWMgVVJMIGdldEFyY2hpdmVSZWZlcmVuY2UoU3RyaW5nIGlkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQorCQl0cnkgew0KKwkJCXJldHVybiBuZXcgVVJMKGdldFVSTCgpLGlkKTsNCisJCX0gY2F0Y2goTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsNCisJCQl0aHJvdyBuZXdDb3JlRXhjZXB0aW9uKCJVbmFibGUgdG8gcmV0dXJuIGFyY2hpdmUgVVJMIixlKTsNCisJCX0NCisJfQ0KKwkNCisJcHJpdmF0ZSBDb3JlRXhjZXB0aW9uIG5ld0NvcmVFeGNlcHRpb24oU3RyaW5nIHMsIFRocm93YWJsZSBlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQorCQlyZXR1cm4gbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCJvcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMiLDAscyxlKSk7DQorCX0NCisNCit9DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2V4YW1wbGVzL2ZyZWVmb3JtL0ZyZWVGb3JtU2l0ZUZhY3RvcnkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9leGFtcGxlcy9mcmVlZm9ybS9GcmVlRm9ybVNpdGVGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU0NjAzYwotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9leGFtcGxlcy9mcmVlZm9ybS9GcmVlRm9ybVNpdGVGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw3OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCisgKiANCisgKiBDb250cmlidXRvcnM6DQorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzLmZyZWVmb3JtOw0KK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOw0KK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247DQoraW1wb3J0IGphdmEubmV0LlVSTDsNCisNCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkJhc2VTaXRlRmFjdG9yeTsNCitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVNpdGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlNpdGU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLkludmFsaWRTaXRlVHlwZUV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuVVJMRW50cnlNb2RlbDsNCisNCitwdWJsaWMgY2xhc3MgRnJlZUZvcm1TaXRlRmFjdG9yeSBleHRlbmRzIEJhc2VTaXRlRmFjdG9yeSB7DQorDQorCS8qDQorCSAqIEBzZWUgSVNpdGVGYWN0b3J5I2NyZWF0ZVNpdGUoVVJMKQ0KKwkgKi8NCisJcHVibGljIElTaXRlIGNyZWF0ZVNpdGUoVVJMIHVybCkNCisJCXRocm93cyBDb3JlRXhjZXB0aW9uLCBJbnZhbGlkU2l0ZVR5cGVFeGNlcHRpb24gew0KKw0KKwkJLy8gQ3JlYXRlIHNpdGUNCisJCVNpdGUgc2l0ZSA9IG51bGw7DQorCQlJbnB1dFN0cmVhbSBpcyA9IG51bGw7DQorCQl0cnkgew0KKwkJCWlzID0gdXJsLm9wZW5TdHJlYW0oKTsNCisJCQlzaXRlID0gKFNpdGUpIHBhcnNlU2l0ZShpcyk7DQorDQorCQkJVVJMRW50cnlNb2RlbCByZWFsU2l0ZVJlZiA9IHNpdGUuZ2V0RGVzY3JpcHRpb25Nb2RlbCgpOw0KKwkJCWlmIChyZWFsU2l0ZVJlZiA9PSBudWxsKQ0KKwkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbigNCisJCQkJCSJVbmFibGUgdG8gb2J0YWluIHVwZGF0ZSBzaXRlIHJlZmVyZW5jZSIsDQorCQkJCQludWxsKTsNCisJCQlTdHJpbmcgc2l0ZVVSTFN0cmluZyA9IHJlYWxTaXRlUmVmLmdldFVSTFN0cmluZygpOw0KKwkJCWlmIChzaXRlVVJMU3RyaW5nID09IG51bGwpDQorCQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKA0KKwkJCQkJIlVuYWJsZSB0byBvYnRhaW4gdXBkYXRlIHNpdGUgcmVmZXJlbmNlIiwNCisJCQkJCW51bGwpOw0KKwkJCVVSTCBzaXRlVVJMID0gbmV3IFVSTChzaXRlVVJMU3RyaW5nKTsNCisJCQlGcmVlRm9ybVNpdGVDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyID0NCisJCQkJbmV3IEZyZWVGb3JtU2l0ZUNvbnRlbnRQcm92aWRlcihzaXRlVVJMKTsNCisJCQlzaXRlLnNldFNpdGVDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsNCisJCQlzaXRlLnJlc29sdmUoc2l0ZVVSTCwgbnVsbCk7IC8vIHJlc29sdmUgYW55IFVSTHMgcmVsYXRpdmUgdG8gdGhlIHNpdGUNCisNCisJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKXsNCisJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbigiVW5hYmxlIHRvIGNyZWF0ZSBVUkwiLGUpOw0KKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSl7DQorCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oIlVuYWJsZSB0byBhY2Nlc3MgVVJMIixlKTsNCisJCX0gZmluYWxseSB7DQorCQkJaWYgKGlzICE9IG51bGwpDQorCQkJCXRyeSB7DQorCQkJCQlpcy5jbG9zZSgpOw0KKwkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQorCQkJCX0NCisJCX0NCisNCisJCXJldHVybiBzaXRlOw0KKwl9DQorDQorCS8qDQorCSAqIEBzZWUgU2l0ZU1vZGVsRmFjdG9yeSNjYW5QYXJzZVNpdGVUeXBlKFN0cmluZykNCisJICovDQorCXB1YmxpYyBib29sZWFuIGNhblBhcnNlU2l0ZVR5cGUoU3RyaW5nIHR5cGUpIHsNCisJCXJldHVybiB0eXBlICE9IG51bGwNCisJCQkmJiB0eXBlLmVxdWFscygib3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzLnNpdGUuZnJlZWZvcm0iKTsNCisJfQ0KKw0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci8uY2xhc3NwYXRoIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIvLmNsYXNzcGF0aApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTBjN2E1Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIvLmNsYXNzcGF0aApAQCAtMCwwICsxLDcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8Y2xhc3NwYXRoPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvQ0RDLTEuMCVGb3VuZGF0aW9uLTEuMCIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgorPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci8uY3ZzaWdub3JlIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIvLmN2c2lnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTA3N2E0Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIvLmN2c2lnbm9yZQpAQCAtMCwwICsxIEBACitiaW4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyLy5wcm9qZWN0IGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIvLnByb2plY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQyMTM2NAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyLy5wcm9qZWN0CkBAIC0wLDAgKzEsMjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdERlc2NyaXB0aW9uPgorCTxuYW1lPm9yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXI8L25hbWU+CisJPGNvbW1lbnQ+PC9jb21tZW50PgorCTxidWlsZFNwZWM+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwk8L2J1aWxkU3BlYz4KKwk8bmF0dXJlcz4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgorCTwvbmF0dXJlcz4KKzwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1MzQ2YzMKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKQEAgLTAsMCArMSw3IEBACisjV2VkIEFwciAyNiAxNDozNDowMyBFRFQgMjAwNgorZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4xCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuMworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyL2Fib3V0Lmh0bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci9hYm91dC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MDIzMzAKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci9hYm91dC5odG1sCkBAIC0wLDAgKzEsMjggQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCisgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Cis8dGl0bGU+QWJvdXQ8L3RpdGxlPgorPC9oZWFkPgorPGJvZHkgbGFuZz0iRU4tVVMiPgorPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+CisgCis8cD5KdW5lIDIsIDIwMDY8L3A+CQorPGgzPkxpY2Vuc2U8L2gzPgorCis8cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKK2luZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKK0VjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCithdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgorRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KKworPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKK2JlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKK2FwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKK3Byb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQoraW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKK2FuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+CisKKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci9idWlsZC5wcm9wZXJ0aWVzIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIvYnVpbGQucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmZjYWE3Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIvYnVpbGQucHJvcGVydGllcwpAQCAtMCwwICsxLDE3IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyMKKyMgQ29udHJpYnV0b3JzOgorIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitiaW4uaW5jbHVkZXMgPSBwbHVnaW4ucHJvcGVydGllcyxcCisgICAgICAgICAgICAgICAuLFwKKyAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAorICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCisgICAgICAgICAgICAgICBNRVRBLUlORi8KK3NyYy5pbmNsdWRlcyA9IGFib3V0Lmh0bWwKK3NvdXJjZS4uID0gc3JjLwpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIvcGx1Z2luLnByb3BlcnRpZXMgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci9wbHVnaW4ucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjliMDgwCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIvcGx1Z2luLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxOCBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisjIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjCisjIENvbnRyaWJ1dG9yczoKKyMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBVcGRhdGUgU2NoZWR1bGVyIHBsdWdpbi54bWwgcmVzb3VyY2VzCisjCitwbHVnaW5OYW1lID0gQXV0b21hdGljIFVwZGF0ZXMgU2NoZWR1bGVyCitwcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZworYXV0b21hdGljVXBkYXRlc1ByZWZQYWdlID0gQXV0b21hdGljIFVwZGF0ZXMKK3ByZWZlcmVuY2VzID0gVXBkYXRlcyBTY2hlZHVsZXIgUHJlZmVyZW5jZXMKK3ByZWZlcmVuY2VLZXl3b3Jkcy5nZW5lcmFsPWF1dG9tYXRpYyB1cGRhdGUgc2NoZWR1bGUgZG93bmxvYWQKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyL3BsdWdpbi54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci9wbHVnaW4ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxZWU3MzMKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci9wbHVnaW4ueG1sCkBAIC0wLDAgKzEsMzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Cis8cGx1Z2luPgorCisgICAgCTxleHRlbnNpb24gaWQ9InByZWZlcmVuY2VzIiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzIiBuYW1lPSIlcHJlZmVyZW5jZXMiPgorCQk8aW5pdGlhbGl6ZXIgY2xhc3M9Im9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5zY2hlZHVsZXIucHJlZmVyZW5jZXMuUHJlZmVyZW5jZUluaXRpYWxpemVyIi8+CisJPC9leHRlbnNpb24+CisgICA8ZXh0ZW5zaW9uCisgICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuc3RhcnR1cCI+CisgICAgICA8c3RhcnR1cCBjbGFzcz0ib3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnNjaGVkdWxlci5TY2hlZHVsZXJTdGFydHVwIj4KKyAgICAgIDwvc3RhcnR1cD4KKyAgIDwvZXh0ZW5zaW9uPgorICAgPGV4dGVuc2lvbgorICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnN0YXJ0dXAiPgorICAgICAgPHN0YXJ0dXAgY2xhc3M9Im9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5zY2hlZHVsZXIuU2NoZWR1bGVkUGx1Z2luVW5pbnN0YWxsIj4KKyAgICAgIDwvc3RhcnR1cD4KKyAgIDwvZXh0ZW5zaW9uPgorICAgPGV4dGVuc2lvbgorICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcyI+CisgICAgICA8cGFnZQorICAgICAgICAgICAgbmFtZT0iJWF1dG9tYXRpY1VwZGF0ZXNQcmVmUGFnZSIKKyAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkucHJlZmVyZW5jZXMuTWFpblByZWZlcmVuY2VQYWdlIgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5zY2hlZHVsZXIucHJlZmVyZW5jZXMuQXV0b21hdGljVXBkYXRlc1ByZWZlcmVuY2VQYWdlIgorICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIuQXV0b21hdGljVXBkYXRlc1ByZWZlcmVuY2VQYWdlIj4KKyAgICAgICAgICAgIDxrZXl3b3JkUmVmZXJlbmNlIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyLmdlbmVyYWwiLz4KKyAgICAgIDwvcGFnZT4KKyAgIDwvZXh0ZW5zaW9uPgorCisgICAgICA8ZXh0ZW5zaW9uCisgICAJCXBvaW50PSJvcmcuZWNsaXBzZS51aS5rZXl3b3JkcyI+CisgICAgICA8a2V5d29yZAorICAgICAgICAgICAgbGFiZWw9IiVwcmVmZXJlbmNlS2V5d29yZHMuZ2VuZXJhbCIKKyAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyLmdlbmVyYWwiLz4KKyAgICAgIDwvZXh0ZW5zaW9uPgorPC9wbHVnaW4+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NjaGVkdWxlci9BdXRvbWF0aWNVcGRhdGVKb2IuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2NoZWR1bGVyL0F1dG9tYXRpY1VwZGF0ZUpvYi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2YWZkOWEKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NjaGVkdWxlci9BdXRvbWF0aWNVcGRhdGVKb2IuamF2YQpAQCAtMCwwICsxLDI5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnNjaGVkdWxlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5zZWFyY2guVXBkYXRlU2VhcmNoUmVxdWVzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudWkuVXBkYXRlSm9iOworCitjbGFzcyBBdXRvbWF0aWNVcGRhdGVKb2IgZXh0ZW5kcyBVcGRhdGVKb2IgeworCisJcHVibGljIEF1dG9tYXRpY1VwZGF0ZUpvYihTdHJpbmcgbmFtZSwgYm9vbGVhbiBpc0F1dG9tYXRpYywgYm9vbGVhbiBkb3dubG9hZCkgeworCQlzdXBlcihuYW1lLCBpc0F1dG9tYXRpYywgZG93bmxvYWQpOworCX0KKworCXB1YmxpYyBBdXRvbWF0aWNVcGRhdGVKb2IoU3RyaW5nIG5hbWUsIFVwZGF0ZVNlYXJjaFJlcXVlc3Qgc2VhcmNoUmVxdWVzdCkgeworCQlzdXBlcihuYW1lLCBzZWFyY2hSZXF1ZXN0KTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBiZWxvbmdzVG8oT2JqZWN0IGZhbWlseSkgeworCQlyZXR1cm4gU2NoZWR1bGVyU3RhcnR1cC5hdXRvbWF0aWNKb2JGYW1pbHkgPT0gZmFtaWx5OworCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NjaGVkdWxlci9TY2hlZHVsZWRQbHVnaW5Vbmluc3RhbGwuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2NoZWR1bGVyL1NjaGVkdWxlZFBsdWdpblVuaW5zdGFsbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxOTJmNjgKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NjaGVkdWxlci9TY2hlZHVsZWRQbHVnaW5Vbmluc3RhbGwuamF2YQpAQCAtMCwwICsxLDk4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnNjaGVkdWxlcjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVN0YXJ0dXA7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uSUNvbmZpZ3VyZWRTaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IuQ29uZmlndXJhdG9yVXRpbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmVSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuU2l0ZU1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm9wZXJhdGlvbnMuT3BlcmF0aW9uRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy5JT3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLk9wZXJhdGlvbnNNYW5hZ2VyOworCitwdWJsaWMgY2xhc3MgU2NoZWR1bGVkUGx1Z2luVW5pbnN0YWxsIGltcGxlbWVudHMgSVN0YXJ0dXAgeworCisJcHVibGljIHZvaWQgZWFybHlTdGFydHVwKCkgeworCQlVUkwgcGxhdGZvcm1YTUwgPSBDb25maWd1cmF0b3JVdGlscy5nZXRDdXJyZW50UGxhdGZvcm1Db25maWd1cmF0aW9uKCkuZ2V0Q29uZmlndXJhdGlvbkxvY2F0aW9uKCk7CisJCQorCQlGaWxlIGYgPSBuZXcgRmlsZShwbGF0Zm9ybVhNTC5nZXRGaWxlKCkpOworCisJCWYgPSBuZXcgRmlsZShmLmdldFBhcmVudEZpbGUoKSwgInRvQmVVbmluc3RhbGxlZCIpOyAvLyROT04tTkxTLTEkCisJCXRyeSB7CisJCQlpZiAoIWYuZXhpc3RzKCkpIHsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlGaWxlSW5wdXRTdHJlYW0gZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmKTsKKwkJCVByb3BlcnRpZXMgdG9CZVVuaW5zdGFsbGVkID0gbmV3IFByb3BlcnRpZXMoKTsKKwkJCXRvQmVVbmluc3RhbGxlZC5sb2FkKGZpcyk7CisJCQlmaXMuY2xvc2UoKTsKKworCQkJSUZlYXR1cmVbXSBmZWF0dXJlcyA9IG5ldyBJRmVhdHVyZVt0b0JlVW5pbnN0YWxsZWQuc2l6ZSgpXTsKKwkJCUlDb25maWd1cmVkU2l0ZVtdIGNvbmZpZ3VyZWRTaXRlcyA9IG5ldyBJQ29uZmlndXJlZFNpdGVbdG9CZVVuaW5zdGFsbGVkLnNpemUoKV07CisKKwkJCUlDb25maWd1cmVkU2l0ZVtdIHNpdGVzID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5nZXRDb25maWd1cmVkU2l0ZXMoKTsKKworCQkJRW51bWVyYXRpb24gZmVhdHVyZXNUb0JlRGVsZXRlZCA9IHRvQmVVbmluc3RhbGxlZC5lbGVtZW50cygpOworCQkJaW50IGkgPSAwOworCQkJd2hpbGUoZmVhdHVyZXNUb0JlRGVsZXRlZC5oYXNNb3JlRWxlbWVudHMoKSkgeworCQkJCVN0cmluZyB0ZW1wID0gKFN0cmluZylmZWF0dXJlc1RvQmVEZWxldGVkLm5leHRFbGVtZW50KCk7CisJCQkJU3RyaW5nVG9rZW5pemVyIHN0ayA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoIHRlbXAsICI7Iik7IC8vJE5PTi1OTFMtMSQKKwkJCQlTdHJpbmcgdGFyZ2V0U2l0ZSA9IHN0ay5uZXh0VG9rZW4oKTsKKwkJCQlTdHJpbmcgZmVhdHVyZU5hbWUgPSBzdGsubmV4dFRva2VuKCk7CisJCQkJZm9yKGludCBqID0gMDsgaiA8IHNpdGVzLmxlbmd0aDsgaisrKSB7CisJCQkJCWlmIChzaXRlc1tqXS5nZXRTaXRlKCkuZ2V0VVJMKCkudG9TdHJpbmcoKS5lcXVhbHModGFyZ2V0U2l0ZSkpIHsKKwkJCQkJCWNvbmZpZ3VyZWRTaXRlc1tpXSA9IHNpdGVzW2pdOworCQkJCQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBzaXRlRmVhdHVyZXMgPSBjb25maWd1cmVkU2l0ZXNbaV0uZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsKKwkJCQkJCWZvcihpbnQgayA9IDA7IGsgPCBzaXRlRmVhdHVyZXMubGVuZ3RoOyBrKyspIHsKKwkJCQkJCQlpZiAoc2l0ZUZlYXR1cmVzW2tdLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpLmVxdWFscyhmZWF0dXJlTmFtZSkpIHsKKwkJCQkJCQkJZmVhdHVyZXNbaV0gPSBzaXRlRmVhdHVyZXNba10uZ2V0RmVhdHVyZShudWxsKTsKKwkJCQkJCQkJCisJCQkJCQkJCWJyZWFrOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCQorCQkJCQl9CisJCQkJfQorCQkJCWkrKzsKKwkJCX0KKwkJCQorCisJCQlJT3BlcmF0aW9uIHVuaW5zdGFsbEZlYXR1cmVzT3BlcmF0aW9uID0KKwkJCQkoKE9wZXJhdGlvbkZhY3RvcnkpT3BlcmF0aW9uc01hbmFnZXIuZ2V0T3BlcmF0aW9uRmFjdG9yeSgpKS5jcmVhdGVVbmluc3RhbGxGZWF0dXJlc09wZXJhdGlvbiggY29uZmlndXJlZFNpdGVzLCBmZWF0dXJlcyk7CisKKwkJCXVuaW5zdGFsbEZlYXR1cmVzT3BlcmF0aW9uLmV4ZWN1dGUobnVsbCwgbnVsbCk7CisJCQkKKwkJCWYuZGVsZXRlKCk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworCQkJCisJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jaworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7CisJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQl9CisJfQorCQorCit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NjaGVkdWxlci9TY2hlZHVsZXJTdGFydHVwLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NjaGVkdWxlci9TY2hlZHVsZXJTdGFydHVwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk0MDFiNwotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2NoZWR1bGVyL1NjaGVkdWxlclN0YXJ0dXAuamF2YQpAQCAtMCwwICsxLDI3MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5zY2hlZHVsZXI7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSUpvYkNoYW5nZUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JU3RhcnR1cDsKKworLyoqCisgKiBUaGlzIHBsdWctaW4gaXMgbG9hZGVkIG9uIHN0YXJ0dXAgdG8gZm9yayBhIGpvYiB0aGF0IHNlYXJjaGVzIGZvciBuZXcKKyAqIHBsdWctaW5zLgorICovCitwdWJsaWMgY2xhc3MgU2NoZWR1bGVyU3RhcnR1cCBpbXBsZW1lbnRzIElTdGFydHVwIHsKKwkvLyBQcmVmZXJlbmNlcworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBfRU5BQkxFRCA9ICJlbmFibGVkIjsgLy8kTk9OLU5MUy0xJAorCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUF9TQ0hFRFVMRSA9ICJzY2hlZHVsZSI7IC8vJE5PTi1OTFMtMSQKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX09OX1NUQVJUVVAgPSAib24tc3RhcnR1cCI7IC8vJE5PTi1OTFMtMSQKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX09OX1NDSEVEVUxFID0gIm9uLXNjaGVkdWxlIjsgLy8kTk9OLU5MUy0xJAorCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUF9ET1dOTE9BRCA9ICJkb3dubG9hZCI7IC8vIHZhbHVlIGlzIHRydWUgb3IgZmFsc2UsIGRlZmF1bHQgaXNmYWxzZSAvLyROT04tTkxTLTEkCisKKwkvLyB2YWx1ZXMgYXJlIHRvIGJlIHBpY2tlZCB1cCBmcm9tIHRoZSBhcnJ5YXMgREFZUyBhbmQgSE9VUlMKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX0RBWSA9ICJkYXkiOyAvLyROT04tTkxTLTEkCisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX0hPVVIgPSAiaG91ciI7IC8vJE5PTi1OTFMtMSQKKworCS8vIEtlZXBzIHRyYWNrIG9mIHRoZSBydW5uaW5nIGpvYgorCXByaXZhdGUgSm9iIGpvYjsKKworCXN0YXRpYyBmaW5hbCBPYmplY3QgYXV0b21hdGljSm9iRmFtaWx5ID0gbmV3IE9iamVjdCgpOworCisJLy8gTGlzdGVuZXIgZm9yIGpvYiBjaGFuZ2VzCisJcHJpdmF0ZSBJSm9iQ2hhbmdlTGlzdGVuZXIgam9iTGlzdGVuZXI7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERBWVMgPSB7CisJCQlVcGRhdGVTY2hlZHVsZXJNZXNzYWdlcy5TY2hlZHVsZXJTdGFydHVwX2RheSwKKwkJCVVwZGF0ZVNjaGVkdWxlck1lc3NhZ2VzLlNjaGVkdWxlclN0YXJ0dXBfTW9uZGF5LAorCQkJVXBkYXRlU2NoZWR1bGVyTWVzc2FnZXMuU2NoZWR1bGVyU3RhcnR1cF9UdWVzZGF5LAorCQkJVXBkYXRlU2NoZWR1bGVyTWVzc2FnZXMuU2NoZWR1bGVyU3RhcnR1cF9XZWRuZXNkYXksCisJCQlVcGRhdGVTY2hlZHVsZXJNZXNzYWdlcy5TY2hlZHVsZXJTdGFydHVwX1RodXJzZGF5LAorCQkJVXBkYXRlU2NoZWR1bGVyTWVzc2FnZXMuU2NoZWR1bGVyU3RhcnR1cF9GcmlkYXksCisJCQlVcGRhdGVTY2hlZHVsZXJNZXNzYWdlcy5TY2hlZHVsZXJTdGFydHVwX1NhdHVyZGF5LAorCQkJVXBkYXRlU2NoZWR1bGVyTWVzc2FnZXMuU2NoZWR1bGVyU3RhcnR1cF9TdW5kYXkgfTsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gSE9VUlMgPSB7CisJCQlVcGRhdGVTY2hlZHVsZXJNZXNzYWdlcy5TY2hlZHVsZXJTdGFydHVwXzFBTSwKKwkJCVVwZGF0ZVNjaGVkdWxlck1lc3NhZ2VzLlNjaGVkdWxlclN0YXJ0dXBfMkFNLAorCQkJVXBkYXRlU2NoZWR1bGVyTWVzc2FnZXMuU2NoZWR1bGVyU3RhcnR1cF8zQU0sCisJCQlVcGRhdGVTY2hlZHVsZXJNZXNzYWdlcy5TY2hlZHVsZXJTdGFydHVwXzRBTSwKKwkJCVVwZGF0ZVNjaGVkdWxlck1lc3NhZ2VzLlNjaGVkdWxlclN0YXJ0dXBfNUFNLAorCQkJVXBkYXRlU2NoZWR1bGVyTWVzc2FnZXMuU2NoZWR1bGVyU3RhcnR1cF82QU0sCisJCQlVcGRhdGVTY2hlZHVsZXJNZXNzYWdlcy5TY2hlZHVsZXJTdGFydHVwXzdBTSwKKwkJCVVwZGF0ZVNjaGVkdWxlck1lc3NhZ2VzLlNjaGVkdWxlclN0YXJ0dXBfOEFNLAorCQkJVXBkYXRlU2NoZWR1bGVyTWVzc2FnZXMuU2NoZWR1bGVyU3RhcnR1cF85QU0sCisJCQlVcGRhdGVTY2hlZHVsZXJNZXNzYWdlcy5TY2hlZHVsZXJTdGFydHVwXzEwQU0sCisJCQlVcGRhdGVTY2hlZHVsZXJNZXNzYWdlcy5TY2hlZHVsZXJTdGFydHVwXzExQU0sCisJCQlVcGRhdGVTY2hlZHVsZXJNZXNzYWdlcy5TY2hlZHVsZXJTdGFydHVwXzEyUE0sCisJCQlVcGRhdGVTY2hlZHVsZXJNZXNzYWdlcy5TY2hlZHVsZXJTdGFydHVwXzFQTSwKKwkJCVVwZGF0ZVNjaGVkdWxlck1lc3NhZ2VzLlNjaGVkdWxlclN0YXJ0dXBfMlBNLAorCQkJVXBkYXRlU2NoZWR1bGVyTWVzc2FnZXMuU2NoZWR1bGVyU3RhcnR1cF8zUE0sCisJCQlVcGRhdGVTY2hlZHVsZXJNZXNzYWdlcy5TY2hlZHVsZXJTdGFydHVwXzRQTSwKKwkJCVVwZGF0ZVNjaGVkdWxlck1lc3NhZ2VzLlNjaGVkdWxlclN0YXJ0dXBfNVBNLAorCQkJVXBkYXRlU2NoZWR1bGVyTWVzc2FnZXMuU2NoZWR1bGVyU3RhcnR1cF82UE0sCisJCQlVcGRhdGVTY2hlZHVsZXJNZXNzYWdlcy5TY2hlZHVsZXJTdGFydHVwXzdQTSwKKwkJCVVwZGF0ZVNjaGVkdWxlck1lc3NhZ2VzLlNjaGVkdWxlclN0YXJ0dXBfOFBNLAorCQkJVXBkYXRlU2NoZWR1bGVyTWVzc2FnZXMuU2NoZWR1bGVyU3RhcnR1cF85UE0sCisJCQlVcGRhdGVTY2hlZHVsZXJNZXNzYWdlcy5TY2hlZHVsZXJTdGFydHVwXzEwUE0sCisJCQlVcGRhdGVTY2hlZHVsZXJNZXNzYWdlcy5TY2hlZHVsZXJTdGFydHVwXzExUE0sCisJCQlVcGRhdGVTY2hlZHVsZXJNZXNzYWdlcy5TY2hlZHVsZXJTdGFydHVwXzEyQU0sIH07CisKKwkvKioKKwkgKiBUaGUgY29uc3RydWN0b3IuCisJICovCisJcHVibGljIFNjaGVkdWxlclN0YXJ0dXAoKSB7CisJCVVwZGF0ZVNjaGVkdWxlclBsdWdpbi5zZXRTY2hlZHVsZXIodGhpcyk7CisJfQorCisJcHVibGljIHZvaWQgZWFybHlTdGFydHVwKCkgeworCQlzY2hlZHVsZVVwZGF0ZUpvYigpOworCX0KKworCXB1YmxpYyB2b2lkIHNjaGVkdWxlVXBkYXRlSm9iKCkgeworCQlQcmVmZXJlbmNlcyBwcmVmID0gVXBkYXRlU2NoZWR1bGVyUGx1Z2luLmdldERlZmF1bHQoKQorCQkJCS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOworCQkvLyBTZWUgaWYgYXV0b21hdGljIHNlYXJjaCBpcyBlbmFibGVkIGF0IGFsbAorCQlpZiAocHJlZi5nZXRCb29sZWFuKFBfRU5BQkxFRCkgPT0gZmFsc2UpCisJCQlyZXR1cm47CisKKwkJU3RyaW5nIHNjaGVkdWxlID0gcHJlZi5nZXRTdHJpbmcoUF9TQ0hFRFVMRSk7CisJCWxvbmcgZGVsYXkgPSAtMUw7CisJCWlmIChzY2hlZHVsZS5lcXVhbHMoVkFMVUVfT05fU1RBUlRVUCkpCisJCQkvLyBoYXZlIHdlIGFscmVhZHkgc3RhcnRlZCBhIGpvYiA/CisJCQlpZiAoam9iID09IG51bGwpCisJCQkJZGVsYXkgPSAwTDsKKwkJCWVsc2UKKwkJCQlkZWxheSA9IC0xTDsKKwkJZWxzZQorCQkJZGVsYXkgPSBjb21wdXRlRGVsYXkocHJlZik7CisJCWlmIChkZWxheSA9PSAtMUwpCisJCQlyZXR1cm47CisJCXN0YXJ0U2VhcmNoKGRlbGF5KTsKKwl9CisKKwlwcml2YXRlIGludCBnZXREYXkoUHJlZmVyZW5jZXMgcHJlZikgeworCQlTdHJpbmcgZGF5ID0gcHJlZi5nZXRTdHJpbmcoUF9EQVkpOworCQlmb3IgKGludCBkID0gMDsgZCA8IERBWVMubGVuZ3RoOyBkKyspCisJCQlpZiAoREFZU1tkXS5lcXVhbHMoZGF5KSkKKwkJCQlzd2l0Y2ggKGQpIHsKKwkJCQljYXNlIDA6CisJCQkJCXJldHVybiAtMTsKKwkJCQljYXNlIDE6CisJCQkJCXJldHVybiBDYWxlbmRhci5NT05EQVk7CisJCQkJY2FzZSAyOgorCQkJCQlyZXR1cm4gQ2FsZW5kYXIuVFVFU0RBWTsKKwkJCQljYXNlIDM6CisJCQkJCXJldHVybiBDYWxlbmRhci5XRURORVNEQVk7CisJCQkJY2FzZSA0OgorCQkJCQlyZXR1cm4gQ2FsZW5kYXIuVEhVUlNEQVk7CisJCQkJY2FzZSA1OgorCQkJCQlyZXR1cm4gQ2FsZW5kYXIuRlJJREFZOworCQkJCWNhc2UgNjoKKwkJCQkJcmV0dXJuIENhbGVuZGFyLlNBVFVSREFZOworCQkJCWNhc2UgNzoKKwkJCQkJcmV0dXJuIENhbGVuZGFyLlNVTkRBWTsKKwkJCQl9CisJCXJldHVybiAtMTsKKwl9CisKKwlwcml2YXRlIGludCBnZXRIb3VyKFByZWZlcmVuY2VzIHByZWYpIHsKKwkJU3RyaW5nIGhvdXIgPSBwcmVmLmdldFN0cmluZyhQX0hPVVIpOworCQlmb3IgKGludCBoID0gMDsgaCA8IEhPVVJTLmxlbmd0aDsgaCsrKQorCQkJaWYgKEhPVVJTW2hdLmVxdWFscyhob3VyKSkKKwkJCQlyZXR1cm4gaCArIDE7CisJCXJldHVybiAxOworCX0KKworCS8qCisJICogQ29tcHV0ZXMgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgZnJvbSB0aGlzIG1vbWVudCB0byB0aGUgbmV4dAorCSAqIHNjaGVkdWxlZCBzZWFyY2guIElmIHRoYXQgbW9tZW50IGhhcyBhbHJlYWR5IHBhc3NlZCwgcmV0dXJucyAwTCAoc3RhcnQKKwkgKiBpbW1lZGlhdGVseSkuCisJICovCisJcHJpdmF0ZSBsb25nIGNvbXB1dGVEZWxheShQcmVmZXJlbmNlcyBwcmVmKSB7CisKKwkJaW50IHRhcmdldF9kID0gZ2V0RGF5KHByZWYpOworCQlpbnQgdGFyZ2V0X2ggPSBnZXRIb3VyKHByZWYpOworCisJCUNhbGVuZGFyIGNhbGVuZGFyID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKKwkJLy8gbWF5IG5lZWQgdG8gdXNlIHRoZSBCb290TG9hZGVyIGxvY2FsZQorCQlpbnQgY3VycmVudF9kID0gY2FsZW5kYXIuZ2V0KENhbGVuZGFyLkRBWV9PRl9XRUVLKTsKKwkJLy8gc3RhcnRzIHdpdGggU1VOREFZCisJCWludCBjdXJyZW50X2ggPSBjYWxlbmRhci5nZXQoQ2FsZW5kYXIuSE9VUl9PRl9EQVkpOworCQlpbnQgY3VycmVudF9tID0gY2FsZW5kYXIuZ2V0KENhbGVuZGFyLk1JTlVURSk7CisJCWludCBjdXJyZW50X3MgPSBjYWxlbmRhci5nZXQoQ2FsZW5kYXIuU0VDT05EKTsKKwkJaW50IGN1cnJlbnRfbXMgPSBjYWxlbmRhci5nZXQoQ2FsZW5kYXIuTUlMTElTRUNPTkQpOworCisJCWxvbmcgZGVsYXkgPSAwTDsgLy8gbWlsbGlzZWNvbmRzCisKKwkJaWYgKHRhcmdldF9kID09IC0xKSB7CisJCQkvLyBDb21wdXRlIHRoZSBkZWxheSBmb3IgImV2ZXJ5IGRheSBhdCB4IG8nY2xvY2siCisJCQkvLyBJcyBpdCBub3cgPworCQkJaWYgKHRhcmdldF9oID09IGN1cnJlbnRfaCAmJiBjdXJyZW50X20gPT0gMCAmJiBjdXJyZW50X3MgPT0gMCkKKwkJCQlyZXR1cm4gZGVsYXk7CisKKwkJCWludCBkZWx0YV9oID0gdGFyZ2V0X2ggLSBjdXJyZW50X2g7CisJCQlpZiAodGFyZ2V0X2ggPD0gY3VycmVudF9oKQorCQkJCWRlbHRhX2ggKz0gMjQ7CisJCQlkZWxheSA9ICgoZGVsdGFfaCAqIDYwIC0gY3VycmVudF9tKSAqIDYwIC0gY3VycmVudF9zKSAqIDEwMDAKKwkJCQkJLSBjdXJyZW50X21zOworCQkJcmV0dXJuIGRlbGF5OworCQl9IGVsc2UgeworCQkJLy8gQ29tcHV0ZSB0aGUgZGVsYXkgZm9yICJldmVyeSBYZGF5IGF0IHggbydjbG9jayIKKwkJCS8vIElzIGl0IG5vdyA/CisJCQlpZiAodGFyZ2V0X2QgPT0gY3VycmVudF9kICYmIHRhcmdldF9oID09IGN1cnJlbnRfaAorCQkJCQkmJiBjdXJyZW50X20gPT0gMCAmJiBjdXJyZW50X3MgPT0gMCkKKwkJCQlyZXR1cm4gZGVsYXk7CisKKwkJCWludCBkZWx0YV9kID0gdGFyZ2V0X2QgLSBjdXJyZW50X2Q7CisJCQlpZiAodGFyZ2V0X2QgPCBjdXJyZW50X2QKKwkJCQkJfHwgdGFyZ2V0X2QgPT0gY3VycmVudF9kCisJCQkJCSYmICh0YXJnZXRfaCA8IGN1cnJlbnRfaCB8fCB0YXJnZXRfaCA9PSBjdXJyZW50X2gKKwkJCQkJCQkmJiBjdXJyZW50X20gPiAwKSkKKwkJCQlkZWx0YV9kICs9IDc7CisKKwkJCWRlbGF5ID0gKCgoZGVsdGFfZCAqIDI0ICsgdGFyZ2V0X2ggLSBjdXJyZW50X2gpICogNjAgLSBjdXJyZW50X20pICogNjAgLSBjdXJyZW50X3MpCisJCQkJCSogMTAwMCAtIGN1cnJlbnRfbXM7CisKKwkJCXJldHVybiBkZWxheTsKKwkJfQorCQkvLyByZXR1cm4gLTFMOworCX0KKworCXByaXZhdGUgdm9pZCBzdGFydFNlYXJjaChsb25nIGRlbGF5KSB7CisJCWlmIChqb2IgIT0gbnVsbCkgeworCQkJLy8gY2FuY2VsIG9sZCBqb2IuCisJCQkvLyBXZSBuZWVkIHRvIGRlcmVnaXN0ZXIgdGhlIGxpc3RlbmVyIGZpcnN0LHNvIHdlIHdvbid0CisJCQkvLyBhdXRvbWF0aWNhbGx5IHN0YXJ0IGFub3RoZXIgam9iCisJCQlpZiAoam9iTGlzdGVuZXIgIT0gbnVsbCkKKwkJCQlKb2IuZ2V0Sm9iTWFuYWdlcigpLnJlbW92ZUpvYkNoYW5nZUxpc3RlbmVyKGpvYkxpc3RlbmVyKTsKKwkJCUpvYi5nZXRKb2JNYW5hZ2VyKCkuY2FuY2VsKGF1dG9tYXRpY0pvYkZhbWlseSk7CisJCX0KKwkJaWYgKGpvYkxpc3RlbmVyID09IG51bGwpIHsKKwkJCS8vIHVzaW5nIHJlZmxlY3Rpb24gdG8gYXZvaWQgcHJlbWF0dXJlIGNsYXNzIGxvYWRpbmcKKwkJCWpvYkxpc3RlbmVyID0gY3JlYXRlSm9iQ2hhbmdlQWRhcHRlcigpOworCQkJaWYgKGpvYkxpc3RlbmVyID09IG51bGwpCisJCQkJcmV0dXJuOworCQl9CisJCUpvYi5nZXRKb2JNYW5hZ2VyKCkuYWRkSm9iQ2hhbmdlTGlzdGVuZXIoam9iTGlzdGVuZXIpOworCQlTdHJpbmcgam9iTmFtZSA9IFVwZGF0ZVNjaGVkdWxlck1lc3NhZ2VzLkF1dG9tYXRpY1VwZGF0ZXNKb2JfQXV0b21hdGljVXBkYXRlU2VhcmNoOyAvLyk7CisJCWJvb2xlYW4gZG93bmxvYWQgPSBVcGRhdGVTY2hlZHVsZXJQbHVnaW4uZ2V0RGVmYXVsdCgpCisJCQkJLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbigKKwkJCQkJCVVwZGF0ZVNjaGVkdWxlclBsdWdpbi5QX0RPV05MT0FEKTsKKwkJam9iID0gY3JlYXRlVXBkYXRlSm9iKGpvYk5hbWUsIGRvd25sb2FkKTsKKwkJaWYgKGpvYiAhPSBudWxsKQorCQkJam9iLnNjaGVkdWxlKGRlbGF5KTsKKworCX0KKworCS8qCisJICogTG9hZHMgdGhlIHVwZGF0ZSBqb2IgdXNpbmcgcmVmbGVjdGlvbiB0byBhdm9pZCBwcmVtYXR1cmUgc3RhcnR1cCBvZiB0aGUKKwkgKiBVcGRhdGUgVUkgcGx1Zy1pbi4KKwkgKi8KKworCXByaXZhdGUgSm9iIGNyZWF0ZVVwZGF0ZUpvYihTdHJpbmcgbmFtZSwgYm9vbGVhbiBkb3dubG9hZCkgeworCQl0cnkgeworCQkJQ2xhc3MgdGhlQ2xhc3MgPSBDbGFzcworCQkJCQkuZm9yTmFtZSgib3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnNjaGVkdWxlci5BdXRvbWF0aWNVcGRhdGVKb2IiKTsgLy8kTk9OLU5MUy0xJAorCQkJQ29uc3RydWN0b3IgY29uc3RydWN0b3IgPSB0aGVDbGFzcy5nZXRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbXSB7CisJCQkJCVN0cmluZy5jbGFzcywgQm9vbGVhbi5UWVBFLCBCb29sZWFuLlRZUEUgfSk7CisJCQlyZXR1cm4gKEpvYikgY29uc3RydWN0b3IubmV3SW5zdGFuY2UobmV3IE9iamVjdFtdIHsgbmFtZSwKKwkJCQkJQm9vbGVhbi5UUlVFLCBuZXcgQm9vbGVhbihkb3dubG9hZCkgfSk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlVcGRhdGVTY2hlZHVsZXJQbHVnaW4ubG9nRXhjZXB0aW9uKGUsIGZhbHNlKTsKKwkJCXJldHVybiBudWxsOworCQl9CisJfQorCisJLyoKKwkgKiBMb2FkcyB0aGUgam9iIGxpc3RlbmVyIHVzaW5nIHJlZmxlY3Rpb24gdG8gYXZvaWQgcHJlbWF0dXJlIHN0YXJ0dXAgb2YgdGhlCisJICogVXBkYXRlIFVJIHBsdWctaW4uCisJICovCisJcHJpdmF0ZSBJSm9iQ2hhbmdlTGlzdGVuZXIgY3JlYXRlSm9iQ2hhbmdlQWRhcHRlcigpIHsKKwkJdHJ5IHsKKwkJCUNsYXNzIHRoZUNsYXNzID0gQ2xhc3MKKwkJCQkJLmZvck5hbWUoIm9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5zY2hlZHVsZXIuVXBkYXRlSm9iQ2hhbmdlQWRhcHRlciIpOyAvLyROT04tTkxTLTEkCisJCQlDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciA9IHRoZUNsYXNzCisJCQkJCS5nZXRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbXSB7IFNjaGVkdWxlclN0YXJ0dXAuY2xhc3MgfSk7CisJCQlyZXR1cm4gKElKb2JDaGFuZ2VMaXN0ZW5lcikgY29uc3RydWN0b3IKKwkJCQkJLm5ld0luc3RhbmNlKG5ldyBPYmplY3RbXSB7IHRoaXMgfSk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlVcGRhdGVTY2hlZHVsZXJQbHVnaW4ubG9nRXhjZXB0aW9uKGUsIGZhbHNlKTsKKwkJCXJldHVybiBudWxsOworCQl9CisJfQorCisJSm9iIGdldEpvYigpIHsKKwkJcmV0dXJuIGpvYjsKKwl9Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NjaGVkdWxlci9VcGRhdGVKb2JDaGFuZ2VBZGFwdGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NjaGVkdWxlci9VcGRhdGVKb2JDaGFuZ2VBZGFwdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ0NzNjNAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2NoZWR1bGVyL1VwZGF0ZUpvYkNoYW5nZUFkYXB0ZXIuamF2YQpAQCAtMCwwICsxLDExMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5zY2hlZHVsZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JSm9iQ2hhbmdlRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iQ2hhbmdlQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSU1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS53aXphcmRzLkluc3RhbGxXaXphcmQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLndpemFyZHMuSW5zdGFsbFdpemFyZDI7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLndpemFyZHMuUmVzaXphYmxlSW5zdGFsbFdpemFyZERpYWxvZzsKKworY2xhc3MgVXBkYXRlSm9iQ2hhbmdlQWRhcHRlciBleHRlbmRzIEpvYkNoYW5nZUFkYXB0ZXIgeworCXByaXZhdGUgU2NoZWR1bGVyU3RhcnR1cCBzdGFydHVwOworCisJcHVibGljIFVwZGF0ZUpvYkNoYW5nZUFkYXB0ZXIoU2NoZWR1bGVyU3RhcnR1cCBzdGFydHVwKSB7CisJCXRoaXMuc3RhcnR1cCA9IHN0YXJ0dXA7CisJfQorCisJcHVibGljIHZvaWQgZG9uZShJSm9iQ2hhbmdlRXZlbnQgZXZlbnQpIHsKKwkJaWYgKGV2ZW50LmdldEpvYigpID09IHN0YXJ0dXAuZ2V0Sm9iKCkpIHsKKworCQkJLy8gcHJvbXB0IHRoZSB1c2VyCisJCQlpZiAoKChBdXRvbWF0aWNVcGRhdGVKb2IpIHN0YXJ0dXAuZ2V0Sm9iKCkpLmdldFVwZGF0ZXMoKS5sZW5ndGggPiAwCisJCQkJCSYmICFJbnN0YWxsV2l6YXJkLmlzUnVubmluZygpKSB7CisJCQkJaWYgKFVwZGF0ZVNjaGVkdWxlclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKQorCQkJCQkJLmdldEJvb2xlYW4oVXBkYXRlU2NoZWR1bGVyUGx1Z2luLlBfRE9XTkxPQUQpKSB7CisJCQkJCVVwZGF0ZVVJLmdldFN0YW5kYXJkRGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7CisJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQkJYXN5bmNOb3RpZnlEb3dubG9hZFVzZXIoKTsKKwkJCQkJCQlzdGFydHVwLnNjaGVkdWxlVXBkYXRlSm9iKCk7CisJCQkJCQl9CisJCQkJCX0pOworCQkJCX0gZWxzZSB7CisJCQkJCVVwZGF0ZVVJLmdldFN0YW5kYXJkRGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7CisJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQkJYXN5bmNOb3RpZnlVc2VyKCk7CisJCQkJCQkJc3RhcnR1cC5zY2hlZHVsZVVwZGF0ZUpvYigpOworCQkJCQkJfQorCQkJCQl9KTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgYXN5bmNOb3RpZnlVc2VyKCkgeworCQkvLyBhc2sgdGhlIHVzZXIgdG8gaW5zdGFsbCB1cGRhdGVzCisJCVVwZGF0ZVVJLmdldFN0YW5kYXJkRGlzcGxheSgpLmJlZXAoKTsKKwkJaWYgKE1lc3NhZ2VEaWFsb2cub3BlblF1ZXN0aW9uKFVwZGF0ZVVJLmdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCksCisJCQkJVXBkYXRlVUlNZXNzYWdlcy5BdXRvbWF0aWNVcGRhdGVzSm9iX0VjbGlwc2VVcGRhdGVzMSwKKwkJCQlVcGRhdGVVSU1lc3NhZ2VzLkF1dG9tYXRpY1VwZGF0ZXNKb2JfVXBkYXRlc0F2YWlsYWJsZSkpIHsKKwkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKFVwZGF0ZVVJLmdldFN0YW5kYXJkRGlzcGxheSgpLAorCQkJCQluZXcgUnVubmFibGUoKSB7CisJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQkJb3Blbkluc3RhbGxXaXphcmQyKCk7CisJCQkJCQl9CisJCQkJCX0pOworCQl9CisJCS8vIG5vdGlmeSB0aGUgbWFuYWdlciB0aGF0IHRoZSBqb2IgaXMgZG9uZQorCQkvLyBqb2IuZG9uZShTdGF0dXMuT0tfU1RBVFVTKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgYXN5bmNOb3RpZnlEb3dubG9hZFVzZXIoKSB7CisJCS8vIGFzayB0aGUgdXNlciB0byBpbnN0YWxsIHVwZGF0ZXMKKwkJVXBkYXRlVUkuZ2V0U3RhbmRhcmREaXNwbGF5KCkuYmVlcCgpOworCQlpZiAoTWVzc2FnZURpYWxvZy5vcGVuUXVlc3Rpb24oVXBkYXRlVUkuZ2V0QWN0aXZlV29ya2JlbmNoU2hlbGwoKSwKKwkJCQlVcGRhdGVVSU1lc3NhZ2VzLkF1dG9tYXRpY1VwZGF0ZXNKb2JfRWNsaXBzZVVwZGF0ZXMyLAorCQkJCVVwZGF0ZVVJTWVzc2FnZXMuQXV0b21hdGljVXBkYXRlc0pvYl9VcGRhdGVzRG93bmxvYWRlZCkpIHsKKwkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKFVwZGF0ZVVJLmdldFN0YW5kYXJkRGlzcGxheSgpLAorCQkJCQluZXcgUnVubmFibGUoKSB7CisJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQkJb3Blbkluc3RhbGxXaXphcmQyKCk7CisJCQkJCQl9CisJCQkJCX0pOworCQl9IGVsc2UgeworCQkJLy8gRG9uJ3QgZGlzY2FyZCBkb3dubG9hZGVkIGRhdGEsIGFzIG5leHQgdGltZSB3ZSBjb21wYXJlCisJCQkvLyB0aW1lc3RhbXBzLgorCisJCQkvLyBkaXNjYXJkIGFsbCB0aGUgZG93bmxvYWRlZCBkYXRhIGZyb20gY2FjaGUgKG1heSBpbmNsdWRlIG9sZAorCQkJLy8gZGF0YSBhcyB3ZWxsKQorCQkJLy8gVXRpbGl0aWVzLmZsdXNoTG9jYWxGaWxlKCk7CisJCX0KKwkJLy8gbm90aWZ5IHRoZSBtYW5hZ2VyIHRoYXQgdGhlIGpvYiBpcyBkb25lCisJCS8vIGpvYi5kb25lKFN0YXR1cy5PS19TVEFUVVMpOworCX0KKworCXByaXZhdGUgdm9pZCBvcGVuSW5zdGFsbFdpemFyZDIoKSB7CisJCWlmIChJbnN0YWxsV2l6YXJkLmlzUnVubmluZygpKQorCQkJLy8gam9iIGVuZHMgYW5kIGEgbmV3IG9uZSBpcyByZXNjaGVkdWxlZAorCQkJcmV0dXJuOworCQlBdXRvbWF0aWNVcGRhdGVKb2IgdWpvYiA9IChBdXRvbWF0aWNVcGRhdGVKb2IpIHN0YXJ0dXAuZ2V0Sm9iKCk7CisJCUluc3RhbGxXaXphcmQyIHdpemFyZCA9IG5ldyBJbnN0YWxsV2l6YXJkMih1am9iLmdldFNlYXJjaFJlcXVlc3QoKSwKKwkJCQl1am9iLmdldFVwZGF0ZXMoKSwgdHJ1ZSk7CisJCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgUmVzaXphYmxlSW5zdGFsbFdpemFyZERpYWxvZyhVcGRhdGVVSQorCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpLCB3aXphcmQsCisJCQkJVXBkYXRlVUlNZXNzYWdlcy5BdXRvbWF0aWNVcGRhdGVzSm9iX1VwZGF0ZXMpOworCQlkaWFsb2cuY3JlYXRlKCk7CisJCWRpYWxvZy5vcGVuKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NjaGVkdWxlci9VcGRhdGVTY2hlZHVsZXJNZXNzYWdlcy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zY2hlZHVsZXIvVXBkYXRlU2NoZWR1bGVyTWVzc2FnZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDZmZGU4Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zY2hlZHVsZXIvVXBkYXRlU2NoZWR1bGVyTWVzc2FnZXMuamF2YQpAQCAtMCwwICsxLDY3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnNjaGVkdWxlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBVcGRhdGVTY2hlZHVsZXJNZXNzYWdlcyBleHRlbmRzIE5MUyB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnNjaGVkdWxlci5VcGRhdGVTY2hlZHVsZXJSZXNvdXJjZXMiOy8vJE5PTi1OTFMtMSQKKworCXByaXZhdGUgVXBkYXRlU2NoZWR1bGVyTWVzc2FnZXMoKSB7CisJCS8vIERvIG5vdCBpbnN0YW50aWF0ZQorCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNjaGVkdWxlclN0YXJ0dXBfZGF5OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNjaGVkdWxlclN0YXJ0dXBfTW9uZGF5OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNjaGVkdWxlclN0YXJ0dXBfVHVlc2RheTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlZHVsZXJTdGFydHVwX1dlZG5lc2RheTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlZHVsZXJTdGFydHVwX1RodXJzZGF5OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNjaGVkdWxlclN0YXJ0dXBfRnJpZGF5OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNjaGVkdWxlclN0YXJ0dXBfU2F0dXJkYXk7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2NoZWR1bGVyU3RhcnR1cF9TdW5kYXk7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2NoZWR1bGVyU3RhcnR1cF8xQU07CisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2NoZWR1bGVyU3RhcnR1cF8yQU07CisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2NoZWR1bGVyU3RhcnR1cF8zQU07CisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2NoZWR1bGVyU3RhcnR1cF80QU07CisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2NoZWR1bGVyU3RhcnR1cF81QU07CisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2NoZWR1bGVyU3RhcnR1cF82QU07CisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2NoZWR1bGVyU3RhcnR1cF83QU07CisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2NoZWR1bGVyU3RhcnR1cF84QU07CisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2NoZWR1bGVyU3RhcnR1cF85QU07CisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2NoZWR1bGVyU3RhcnR1cF8xMEFNOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNjaGVkdWxlclN0YXJ0dXBfMTFBTTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlZHVsZXJTdGFydHVwXzEyUE07CisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2NoZWR1bGVyU3RhcnR1cF8xUE07CisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2NoZWR1bGVyU3RhcnR1cF8yUE07CisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2NoZWR1bGVyU3RhcnR1cF8zUE07CisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2NoZWR1bGVyU3RhcnR1cF80UE07CisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2NoZWR1bGVyU3RhcnR1cF81UE07CisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2NoZWR1bGVyU3RhcnR1cF82UE07CisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2NoZWR1bGVyU3RhcnR1cF83UE07CisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2NoZWR1bGVyU3RhcnR1cF84UE07CisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2NoZWR1bGVyU3RhcnR1cF85UE07CisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2NoZWR1bGVyU3RhcnR1cF8xMFBNOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNjaGVkdWxlclN0YXJ0dXBfMTFQTTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlZHVsZXJTdGFydHVwXzEyQU07CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0b21hdGljVXBkYXRlc0pvYl9BdXRvbWF0aWNVcGRhdGVTZWFyY2g7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0b21hdGljVXBkYXRlc1ByZWZlcmVuY2VQYWdlX2ZpbmRVcGRhdGVzOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dG9tYXRpY1VwZGF0ZXNQcmVmZXJlbmNlUGFnZV9VcGRhdGVTY2hlZHVsZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRvbWF0aWNVcGRhdGVzUHJlZmVyZW5jZVBhZ2VfZmluZE9uU3RhcnQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0b21hdGljVXBkYXRlc1ByZWZlcmVuY2VQYWdlX2ZpbmRPblNjaGVkdWxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dG9tYXRpY1VwZGF0ZXNQcmVmZXJlbmNlUGFnZV9kb3dubG9hZE9wdGlvbnM7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0b21hdGljVXBkYXRlc1ByZWZlcmVuY2VQYWdlX3NlYXJjaEFuZE5vdGlmeTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRvbWF0aWNVcGRhdGVzUHJlZmVyZW5jZVBhZ2VfZG93bmxvYWRBbmROb3RpZnk7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0b21hdGljVXBkYXRlc1ByZWZlcmVuY2VQYWdlX2F0OworCXN0YXRpYyB7CisJCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIFVwZGF0ZVNjaGVkdWxlck1lc3NhZ2VzLmNsYXNzKTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zY2hlZHVsZXIvVXBkYXRlU2NoZWR1bGVyUGx1Z2luLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NjaGVkdWxlci9VcGRhdGVTY2hlZHVsZXJQbHVnaW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDgwZmJjCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zY2hlZHVsZXIvVXBkYXRlU2NoZWR1bGVyUGx1Z2luLmphdmEKQEAgLTAsMCArMSwxNTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuc2NoZWR1bGVyOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuKjsKK2ltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLio7CitpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLio7CisKKy8qKgorICogVGhpcyBwbHVnLWluIGlzIGxvYWRlZCBvbiBzdGFydHVwIHRvIGZvcmsgYSBqb2IgdGhhdAorICogc2VhcmNoZXMgZm9yIG5ldyBwbHVnLWlucy4KKyAqLworcHVibGljIGNsYXNzIFVwZGF0ZVNjaGVkdWxlclBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW57CisJLy8gUHJlZmVyZW5jZXMKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX0VOQUJMRUQgPSAiZW5hYmxlZCI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX1NDSEVEVUxFID0gInNjaGVkdWxlIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX09OX1NUQVJUVVAgPSAib24tc3RhcnR1cCI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9PTl9TQ0hFRFVMRSA9ICJvbi1zY2hlZHVsZSI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX0RPV05MT0FEID0gImRvd25sb2FkIjsgLy8gdmFsdWUgaXMgdHJ1ZSBvciBmYWxzZSwgZGVmYXVsdCBpcyBmYWxzZSAvLyROT04tTkxTLTEkCisKKwkvL1RoZSBzaGFyZWQgaW5zdGFuY2UuCisJcHJpdmF0ZSBzdGF0aWMgVXBkYXRlU2NoZWR1bGVyUGx1Z2luIHBsdWdpbjsKKwkvL1Jlc291cmNlIGJ1bmRsZS4KKwlwcml2YXRlIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlOworCQorCS8vIHNpbmdsZXRvbgorCXByaXZhdGUgc3RhdGljIFNjaGVkdWxlclN0YXJ0dXAgc2NoZWR1bGVyOworCisJLyoqCisJICogVGhlIGNvbnN0cnVjdG9yLgorCSAqLworCXB1YmxpYyBVcGRhdGVTY2hlZHVsZXJQbHVnaW4oKSB7CisJCXBsdWdpbiA9IHRoaXM7CisJfQorCisKKwlwdWJsaWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7CisJCWlmIChyZXNvdXJjZUJ1bmRsZSA9PSBudWxsKQorCQkJdHJ5IHsKKwkJCQlyZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgib3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnNjaGVkdWxlci5VcGRhdGVTY2hlZHVsZXJSZXNvdXJjZXMiKTsgLy8kTk9OLU5MUy0xJAorCQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHgpIHsKKwkJCQlyZXNvdXJjZUJ1bmRsZSA9IG51bGw7CisJCQl9CisJCXJldHVybiByZXNvdXJjZUJ1bmRsZTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCisJICovCisJcHVibGljIHN0YXRpYyBVcGRhdGVTY2hlZHVsZXJQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKKwkJcmV0dXJuIHBsdWdpbjsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQbHVnaW5JZCgpIHsKKwkJcmV0dXJuIGdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXhjZXB0aW9uKFRocm93YWJsZSBlKSB7CisJCWxvZ0V4Y2VwdGlvbihlLCB0cnVlKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXhjZXB0aW9uKFRocm93YWJsZSBlLCBib29sZWFuIHNob3dFcnJvckRpYWxvZykgeworCQlpZiAoZSBpbnN0YW5jZW9mIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24pIHsKKwkJCWUgPSAoKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24pIGUpLmdldFRhcmdldEV4Y2VwdGlvbigpOworCQl9CisKKwkJSVN0YXR1cyBzdGF0dXMgPSBudWxsOworCQlpZiAoZSBpbnN0YW5jZW9mIENvcmVFeGNlcHRpb24pIHsKKwkJCXN0YXR1cyA9ICgoQ29yZUV4Y2VwdGlvbikgZSkuZ2V0U3RhdHVzKCk7CisJCX0gZWxzZSB7CisJCQlTdHJpbmcgbWVzc2FnZSA9IGUuZ2V0TWVzc2FnZSgpOworCQkJaWYgKG1lc3NhZ2UgPT0gbnVsbCkKKwkJCQltZXNzYWdlID0gZS50b1N0cmluZygpOworCQkJc3RhdHVzID0KKwkJCQluZXcgU3RhdHVzKAorCQkJCQlJU3RhdHVzLkVSUk9SLAorCQkJCQlnZXRQbHVnaW5JZCgpLAorCQkJCQlJU3RhdHVzLk9LLAorCQkJCQltZXNzYWdlLAorCQkJCQllKTsKKwkJfQorCQlsb2coc3RhdHVzLCBzaG93RXJyb3JEaWFsb2cpOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coSVN0YXR1cyBzdGF0dXMsIGJvb2xlYW4gc2hvd0Vycm9yRGlhbG9nKSB7CisJCWlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSAhPSBJU3RhdHVzLklORk8pIHsKKwkJCWlmIChzaG93RXJyb3JEaWFsb2cpCisJCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKAorCQkJCQlnZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpLAorCQkJCQludWxsLAorCQkJCQludWxsLAorCQkJCQlzdGF0dXMpOworLy8JCQkgU2hvdWxkIGxvZyBvbiB0aGUgdXBkYXRlIHBsdWdpbidzIGxvZworLy8JCQlQbGF0Zm9ybS5nZXRQbHVnaW4oIm9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIpLmdldExvZygpLmxvZyhzdGF0dXMpOyAvLyROT04tTkxTLTEkCisJCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyIik7ICAvLyROT04tTkxTLTEkCisJCQlQbGF0Zm9ybS5nZXRMb2coYnVuZGxlKS5sb2coc3RhdHVzKTsKKwkJfSBlbHNlIHsKKwkJCU1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKAorCQkJCWdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCksCisJCQkJbnVsbCwKKwkJCQlzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKKwkJfQorCX0KKworCXB1YmxpYyBzdGF0aWMgSVdvcmtiZW5jaFBhZ2UgZ2V0QWN0aXZlUGFnZSgpIHsKKwkJVXBkYXRlU2NoZWR1bGVyUGx1Z2luIHBsdWdpbiA9IGdldERlZmF1bHQoKTsKKwkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPQorCQkJcGx1Z2luLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOworCQlpZiAod2luZG93ICE9IG51bGwpCisJCQlyZXR1cm4gd2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIHN0YXRpYyBTaGVsbCBnZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpIHsKKwkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBnZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKKwkJcmV0dXJuIHdpbmRvdyAhPSBudWxsID8gd2luZG93LmdldFNoZWxsKCkgOiBudWxsOworCX0KKworCXB1YmxpYyBzdGF0aWMgSVdvcmtiZW5jaFdpbmRvdyBnZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKSB7CisJCXJldHVybiBnZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvciNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24geworCQlzdXBlci5zdGFydChjb250ZXh0KTsKKwl9CisJCisJcHVibGljIHN0YXRpYyBTY2hlZHVsZXJTdGFydHVwIGdldFNjaGVkdWxlcigpIHsKKwkJLy8gSWYgdGhlIHNjaGVkdWxlciB3YXMgZGlzYWJsZWQsIGl0IGRvZXMgbm90IGdldCBpbml0aWFsaXplZAorCQlpZiAoc2NoZWR1bGVyID09IG51bGwpCisJCQlzY2hlZHVsZXIgPSBuZXcgU2NoZWR1bGVyU3RhcnR1cCgpOworCQlyZXR1cm4gc2NoZWR1bGVyOworCX0KKwkKKwlzdGF0aWMgdm9pZCBzZXRTY2hlZHVsZXIoU2NoZWR1bGVyU3RhcnR1cCBzY2hlZHVsZXIpIHsKKwkJVXBkYXRlU2NoZWR1bGVyUGx1Z2luLnNjaGVkdWxlciA9IHNjaGVkdWxlcjsKKwl9Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NjaGVkdWxlci9VcGRhdGVTY2hlZHVsZXJSZXNvdXJjZXMucHJvcGVydGllcyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2NoZWR1bGVyL1VwZGF0ZVNjaGVkdWxlclJlc291cmNlcy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5NGE4MTEKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NjaGVkdWxlci9VcGRhdGVTY2hlZHVsZXJSZXNvdXJjZXMucHJvcGVydGllcwpAQCAtMCwwICsxLDUzIEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENvcHlyaWdodCAoYykgMjAwMywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyMKKyMgQ29udHJpYnV0b3JzOgorIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjTWVzc2FnZXMgZm9yIFVwZGF0ZSBTY2hlZHVsZXIgcGx1Zy1pbgorCitTY2hlZHVsZXJTdGFydHVwX2RheT1FdmVyeSBkYXkKK1NjaGVkdWxlclN0YXJ0dXBfTW9uZGF5PUV2ZXJ5IE1vbmRheQorU2NoZWR1bGVyU3RhcnR1cF9UdWVzZGF5PUV2ZXJ5IFR1ZXNkYXkKK1NjaGVkdWxlclN0YXJ0dXBfV2VkbmVzZGF5PUV2ZXJ5IFdlZG5lc2RheQorU2NoZWR1bGVyU3RhcnR1cF9UaHVyc2RheT1FdmVyeSBUaHVyc2RheQorU2NoZWR1bGVyU3RhcnR1cF9GcmlkYXk9RXZlcnkgRnJpZGF5CitTY2hlZHVsZXJTdGFydHVwX1NhdHVyZGF5PUV2ZXJ5IFNhdHVyZGF5CitTY2hlZHVsZXJTdGFydHVwX1N1bmRheT1FdmVyeSBTdW5kYXkKK1NjaGVkdWxlclN0YXJ0dXBfMUFNPTE6MDAgQU0KK1NjaGVkdWxlclN0YXJ0dXBfMkFNPTI6MDAgQU0KK1NjaGVkdWxlclN0YXJ0dXBfM0FNPTM6MDAgQU0KK1NjaGVkdWxlclN0YXJ0dXBfNEFNPTQ6MDAgQU0KK1NjaGVkdWxlclN0YXJ0dXBfNUFNPTU6MDAgQU0KK1NjaGVkdWxlclN0YXJ0dXBfNkFNPTY6MDAgQU0KK1NjaGVkdWxlclN0YXJ0dXBfN0FNPTc6MDAgQU0KK1NjaGVkdWxlclN0YXJ0dXBfOEFNPTg6MDAgQU0KK1NjaGVkdWxlclN0YXJ0dXBfOUFNPTk6MDAgQU0KK1NjaGVkdWxlclN0YXJ0dXBfMTBBTT0xMDowMCBBTQorU2NoZWR1bGVyU3RhcnR1cF8xMUFNPTExOjAwIEFNCitTY2hlZHVsZXJTdGFydHVwXzEyUE09MTI6MDAgUE0KK1NjaGVkdWxlclN0YXJ0dXBfMVBNPTE6MDAgUE0KK1NjaGVkdWxlclN0YXJ0dXBfMlBNPTI6MDAgUE0KK1NjaGVkdWxlclN0YXJ0dXBfM1BNPTM6MDAgUE0KK1NjaGVkdWxlclN0YXJ0dXBfNFBNPTQ6MDAgUE0KK1NjaGVkdWxlclN0YXJ0dXBfNVBNPTU6MDAgUE0KK1NjaGVkdWxlclN0YXJ0dXBfNlBNPTY6MDAgUE0KK1NjaGVkdWxlclN0YXJ0dXBfN1BNPTc6MDAgUE0KK1NjaGVkdWxlclN0YXJ0dXBfOFBNPTg6MDAgUE0KK1NjaGVkdWxlclN0YXJ0dXBfOVBNPTk6MDAgUE0KK1NjaGVkdWxlclN0YXJ0dXBfMTBQTT0xMDowMCBQTQorU2NoZWR1bGVyU3RhcnR1cF8xMVBNPTExOjAwIFBNCitTY2hlZHVsZXJTdGFydHVwXzEyQU09MTI6MDAgQU0KK0F1dG9tYXRpY1VwZGF0ZXNKb2JfQXV0b21hdGljVXBkYXRlU2VhcmNoPUF1dG9tYXRpYyBVcGRhdGUgU2VhcmNoCitBdXRvbWF0aWNVcGRhdGVzUHJlZmVyZW5jZVBhZ2VfZmluZFVwZGF0ZXM9QXV0b21hdGljYWxseSAmZmluZCBuZXcgdXBkYXRlcyBhbmQgbm90aWZ5IG1lCitBdXRvbWF0aWNVcGRhdGVzUHJlZmVyZW5jZVBhZ2VfVXBkYXRlU2NoZWR1bGU9VXBkYXRlICZTY2hlZHVsZQorQXV0b21hdGljVXBkYXRlc1ByZWZlcmVuY2VQYWdlX2ZpbmRPblN0YXJ0PUxvb2sgZm9yIHVwZGF0ZXMgZWFjaCB0aW1lICZwbGF0Zm9ybSBpcyBzdGFydGVkCitBdXRvbWF0aWNVcGRhdGVzUHJlZmVyZW5jZVBhZ2VfZmluZE9uU2NoZWR1bGU9Jkxvb2sgZm9yIHVwZGF0ZXMgb24gdGhlIGZvbGxvd2luZyBzY2hlZHVsZToKK0F1dG9tYXRpY1VwZGF0ZXNQcmVmZXJlbmNlUGFnZV9kb3dubG9hZE9wdGlvbnM9RG93bmxvYWQgJk9wdGlvbnMKK0F1dG9tYXRpY1VwZGF0ZXNQcmVmZXJlbmNlUGFnZV9zZWFyY2hBbmROb3RpZnk9U2VhcmNoIGZvciB1cGRhdGVzIGFuZCAmbm90aWZ5IG1lIHdoZW4gdGhleSBhcmUgYXZhaWxhYmxlCitBdXRvbWF0aWNVcGRhdGVzUHJlZmVyZW5jZVBhZ2VfZG93bmxvYWRBbmROb3RpZnk9RG93bmxvYWQgbmV3ICZ1cGRhdGVzIGF1dG9tYXRpY2FsbHkgYW5kIG5vdGlmeSBtZSB3aGVuIHJlYWR5IHRvIGluc3RhbGwgdGhlbQorQXV0b21hdGljVXBkYXRlc1ByZWZlcmVuY2VQYWdlX2F0PWF0CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NjaGVkdWxlci9wcmVmZXJlbmNlcy9BdXRvbWF0aWNVcGRhdGVzUHJlZmVyZW5jZVBhZ2UuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2NoZWR1bGVyL3ByZWZlcmVuY2VzL0F1dG9tYXRpY1VwZGF0ZXNQcmVmZXJlbmNlUGFnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3MGNjZWQKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NjaGVkdWxlci9wcmVmZXJlbmNlcy9BdXRvbWF0aWNVcGRhdGVzUHJlZmVyZW5jZVBhZ2UuamF2YQpAQCAtMCwwICsxLDI0MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5zY2hlZHVsZXIucHJlZmVyZW5jZXM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5zY2hlZHVsZXIuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuc2NoZWR1bGVyLlVwZGF0ZVNjaGVkdWxlclBsdWdpbjsKKworcHVibGljIGNsYXNzIEF1dG9tYXRpY1VwZGF0ZXNQcmVmZXJlbmNlUGFnZQorCWV4dGVuZHMgUHJlZmVyZW5jZVBhZ2UKKwlpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSB7CisKKwlwcml2YXRlIEJ1dHRvbiBlbmFibGVkQ2hlY2s7CisJcHJpdmF0ZSBCdXR0b24gb25TdGFydHVwUmFkaW87CisJcHJpdmF0ZSBCdXR0b24gb25TY2hlZHVsZVJhZGlvOworCXByaXZhdGUgQ29tYm8gZGF5Q29tYm87CisJcHJpdmF0ZSBMYWJlbCBhdExhYmVsOworCXByaXZhdGUgQ29tYm8gaG91ckNvbWJvOworCXByaXZhdGUgQnV0dG9uIHNlYXJjaE9ubHlSYWRpbzsKKwlwcml2YXRlIEJ1dHRvbiBzZWFyY2hBbmREb3dubG9hZFJhZGlvOworCXByaXZhdGUgR3JvdXAgdXBkYXRlU2NoZWR1bGVHcm91cDsKKwlwcml2YXRlIEdyb3VwIGRvd25sb2FkR3JvdXA7CisKKwlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7CisJfQorCisJcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgeworCQlDb21wb3NpdGUgY29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKKwkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOworCQlsYXlvdXQubWFyZ2luV2lkdGggPSBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKKwkJY29udGFpbmVyLnNldExheW91dChsYXlvdXQpOworCisJCWVuYWJsZWRDaGVjayA9IG5ldyBCdXR0b24oY29udGFpbmVyLCBTV1QuQ0hFQ0spOworCQllbmFibGVkQ2hlY2suc2V0VGV4dChVcGRhdGVTY2hlZHVsZXJNZXNzYWdlcy5BdXRvbWF0aWNVcGRhdGVzUHJlZmVyZW5jZVBhZ2VfZmluZFVwZGF0ZXMpOyAKKworCQljcmVhdGVTcGFjZXIoY29udGFpbmVyLCAxKTsKKworCQl1cGRhdGVTY2hlZHVsZUdyb3VwID0gbmV3IEdyb3VwKGNvbnRhaW5lciwgU1dULk5PTkUpOworCQl1cGRhdGVTY2hlZHVsZUdyb3VwLnNldFRleHQoVXBkYXRlU2NoZWR1bGVyTWVzc2FnZXMuQXV0b21hdGljVXBkYXRlc1ByZWZlcmVuY2VQYWdlX1VwZGF0ZVNjaGVkdWxlKTsgCisJCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7CisJCWxheW91dC5udW1Db2x1bW5zID0gMzsKKwkJdXBkYXRlU2NoZWR1bGVHcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKKwkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKKwkJdXBkYXRlU2NoZWR1bGVHcm91cC5zZXRMYXlvdXREYXRhKGdkKTsKKworCQlvblN0YXJ0dXBSYWRpbyA9IG5ldyBCdXR0b24odXBkYXRlU2NoZWR1bGVHcm91cCwgU1dULlJBRElPKTsKKwkJb25TdGFydHVwUmFkaW8uc2V0VGV4dCgKKwkJCVVwZGF0ZVNjaGVkdWxlck1lc3NhZ2VzLkF1dG9tYXRpY1VwZGF0ZXNQcmVmZXJlbmNlUGFnZV9maW5kT25TdGFydCk7IAorCQlnZCA9IG5ldyBHcmlkRGF0YSgpOworCQlnZC5ob3Jpem9udGFsU3BhbiA9IDM7CisJCW9uU3RhcnR1cFJhZGlvLnNldExheW91dERhdGEoZ2QpOworCQlvblN0YXJ0dXBSYWRpby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQlwYWdlQ2hhbmdlZCgpOworCQkJfQorCQl9KTsKKworCQlvblNjaGVkdWxlUmFkaW8gPSBuZXcgQnV0dG9uKHVwZGF0ZVNjaGVkdWxlR3JvdXAsIFNXVC5SQURJTyk7CisJCW9uU2NoZWR1bGVSYWRpby5zZXRUZXh0KFVwZGF0ZVNjaGVkdWxlck1lc3NhZ2VzLkF1dG9tYXRpY1VwZGF0ZXNQcmVmZXJlbmNlUGFnZV9maW5kT25TY2hlZHVsZSk7IAorCQlnZCA9IG5ldyBHcmlkRGF0YSgpOworCQlnZC5ob3Jpem9udGFsU3BhbiA9IDM7CisJCW9uU2NoZWR1bGVSYWRpby5zZXRMYXlvdXREYXRhKGdkKTsKKwkJb25TY2hlZHVsZVJhZGlvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCXBhZ2VDaGFuZ2VkKCk7CisJCQl9CisJCX0pOworCisJCWRheUNvbWJvID0gbmV3IENvbWJvKHVwZGF0ZVNjaGVkdWxlR3JvdXAsIFNXVC5SRUFEX09OTFkpOworCQlkYXlDb21iby5zZXRJdGVtcyhTY2hlZHVsZXJTdGFydHVwLkRBWVMpOworCQlnZCA9IG5ldyBHcmlkRGF0YSgpOworCQlnZC53aWR0aEhpbnQgPSAyMDA7CisJCWdkLmhvcml6b250YWxJbmRlbnQgPSAzMDsKKwkJZGF5Q29tYm8uc2V0TGF5b3V0RGF0YShnZCk7CisJCQorCQlhdExhYmVsID0gbmV3IExhYmVsKHVwZGF0ZVNjaGVkdWxlR3JvdXAsIFNXVC5OVUxMKTsKKwkJYXRMYWJlbC5zZXRUZXh0KFVwZGF0ZVNjaGVkdWxlck1lc3NhZ2VzLkF1dG9tYXRpY1VwZGF0ZXNQcmVmZXJlbmNlUGFnZV9hdCk7IAorCQkKKwkJaG91ckNvbWJvID0gbmV3IENvbWJvKHVwZGF0ZVNjaGVkdWxlR3JvdXAsIFNXVC5SRUFEX09OTFkpOworCQlob3VyQ29tYm8uc2V0SXRlbXMoU2NoZWR1bGVyU3RhcnR1cC5IT1VSUyk7CisJCWdkID0gbmV3IEdyaWREYXRhKCk7CisJCS8vZ2Qud2lkdGhIaW50ID0gMTAwOworCQlob3VyQ29tYm8uc2V0TGF5b3V0RGF0YShnZCk7CisJCisJCWNyZWF0ZVNwYWNlcihjb250YWluZXIsIDEpOworCQkKKwkJZG93bmxvYWRHcm91cCA9IG5ldyBHcm91cChjb250YWluZXIsIFNXVC5OT05FKTsKKwkJZG93bmxvYWRHcm91cC5zZXRUZXh0KFVwZGF0ZVNjaGVkdWxlck1lc3NhZ2VzLkF1dG9tYXRpY1VwZGF0ZXNQcmVmZXJlbmNlUGFnZV9kb3dubG9hZE9wdGlvbnMpOyAKKwkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKKwkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOworCQlkb3dubG9hZEdyb3VwLnNldExheW91dChsYXlvdXQpOworCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOworCQlkb3dubG9hZEdyb3VwLnNldExheW91dERhdGEoZ2QpOworCisJCXNlYXJjaE9ubHlSYWRpbyA9IG5ldyBCdXR0b24oZG93bmxvYWRHcm91cCwgU1dULlJBRElPKTsKKwkJc2VhcmNoT25seVJhZGlvLnNldFRleHQoCisJCQlVcGRhdGVTY2hlZHVsZXJNZXNzYWdlcy5BdXRvbWF0aWNVcGRhdGVzUHJlZmVyZW5jZVBhZ2Vfc2VhcmNoQW5kTm90aWZ5KTsgCisJCWdkID0gbmV3IEdyaWREYXRhKCk7CisJCWdkLmhvcml6b250YWxTcGFuID0gMzsKKwkJc2VhcmNoT25seVJhZGlvLnNldExheW91dERhdGEoZ2QpOworCQlzZWFyY2hPbmx5UmFkaW8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CisJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJcGFnZUNoYW5nZWQoKTsKKwkJCX0KKwkJfSk7CisKKwkJc2VhcmNoQW5kRG93bmxvYWRSYWRpbyA9IG5ldyBCdXR0b24oZG93bmxvYWRHcm91cCwgU1dULlJBRElPKTsKKwkJc2VhcmNoQW5kRG93bmxvYWRSYWRpby5zZXRUZXh0KFVwZGF0ZVNjaGVkdWxlck1lc3NhZ2VzLkF1dG9tYXRpY1VwZGF0ZXNQcmVmZXJlbmNlUGFnZV9kb3dubG9hZEFuZE5vdGlmeSk7IAorCQlnZCA9IG5ldyBHcmlkRGF0YSgpOworCQlnZC5ob3Jpem9udGFsU3BhbiA9IDM7CisJCXNlYXJjaEFuZERvd25sb2FkUmFkaW8uc2V0TGF5b3V0RGF0YShnZCk7CisJCXNlYXJjaEFuZERvd25sb2FkUmFkaW8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CisJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJcGFnZUNoYW5nZWQoKTsKKwkJCX0KKwkJfSk7CisJCQkKKwkJaW5pdGlhbGl6ZSgpOworCisJCWVuYWJsZWRDaGVjay5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQlwYWdlQ2hhbmdlZCgpOworCQkJfQorCQl9KTsKKworCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KGNvbnRhaW5lcik7CisJCXJldHVybiBjb250YWluZXI7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlU3BhY2VyKENvbXBvc2l0ZSBjb21wb3NpdGUsIGludCBjb2x1bW5TcGFuKSB7CisJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOworCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOworCQlnZC5ob3Jpem9udGFsU3BhbiA9IGNvbHVtblNwYW47CisJCWxhYmVsLnNldExheW91dERhdGEoZ2QpOworCX0KKworCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgeworCQlQcmVmZXJlbmNlcyBwcmVmID0gVXBkYXRlU2NoZWR1bGVyUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOworCQllbmFibGVkQ2hlY2suc2V0U2VsZWN0aW9uKHByZWYuZ2V0Qm9vbGVhbihVcGRhdGVTY2hlZHVsZXJQbHVnaW4uUF9FTkFCTEVEKSk7CisJCXNldFNjaGVkdWxlKHByZWYuZ2V0U3RyaW5nKFVwZGF0ZVNjaGVkdWxlclBsdWdpbi5QX1NDSEVEVUxFKSk7CisKKwkJZGF5Q29tYm8uc2V0VGV4dChTY2hlZHVsZXJTdGFydHVwLkRBWVNbZ2V0RGF5KHByZWYsIGZhbHNlKV0pOworCQlob3VyQ29tYm8uc2V0VGV4dChTY2hlZHVsZXJTdGFydHVwLkhPVVJTW2dldEhvdXIocHJlZiwgZmFsc2UpXSk7CisJCQorCQlzZWFyY2hPbmx5UmFkaW8uc2V0U2VsZWN0aW9uKCFwcmVmLmdldEJvb2xlYW4oVXBkYXRlU2NoZWR1bGVyUGx1Z2luLlBfRE9XTkxPQUQpKTsKKwkJc2VhcmNoQW5kRG93bmxvYWRSYWRpby5zZXRTZWxlY3Rpb24ocHJlZi5nZXRCb29sZWFuKFVwZGF0ZVNjaGVkdWxlclBsdWdpbi5QX0RPV05MT0FEKSk7CisKKwkJcGFnZUNoYW5nZWQoKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2V0U2NoZWR1bGUoU3RyaW5nIHZhbHVlKSB7CisJCWlmICh2YWx1ZS5lcXVhbHMoVXBkYXRlU2NoZWR1bGVyUGx1Z2luLlZBTFVFX09OX1NUQVJUVVApKQorCQkJb25TdGFydHVwUmFkaW8uc2V0U2VsZWN0aW9uKHRydWUpOworCQllbHNlCisJCQlvblNjaGVkdWxlUmFkaW8uc2V0U2VsZWN0aW9uKHRydWUpOworCX0KKworCXByaXZhdGUgdm9pZCBwYWdlQ2hhbmdlZCgpIHsKKwkJYm9vbGVhbiBtYXN0ZXIgPSBlbmFibGVkQ2hlY2suZ2V0U2VsZWN0aW9uKCk7CisJCXVwZGF0ZVNjaGVkdWxlR3JvdXAuc2V0RW5hYmxlZChtYXN0ZXIpOworCQlvblN0YXJ0dXBSYWRpby5zZXRFbmFibGVkKG1hc3Rlcik7CisJCW9uU2NoZWR1bGVSYWRpby5zZXRFbmFibGVkKG1hc3Rlcik7CisJCWRheUNvbWJvLnNldEVuYWJsZWQobWFzdGVyICYmIG9uU2NoZWR1bGVSYWRpby5nZXRTZWxlY3Rpb24oKSk7CisJCWF0TGFiZWwuc2V0RW5hYmxlZChtYXN0ZXIgJiYgb25TY2hlZHVsZVJhZGlvLmdldFNlbGVjdGlvbigpKTsKKwkJaG91ckNvbWJvLnNldEVuYWJsZWQobWFzdGVyICYmIG9uU2NoZWR1bGVSYWRpby5nZXRTZWxlY3Rpb24oKSk7CisJCWRvd25sb2FkR3JvdXAuc2V0RW5hYmxlZChtYXN0ZXIpOworCQlzZWFyY2hPbmx5UmFkaW8uc2V0RW5hYmxlZChtYXN0ZXIpOworCQlzZWFyY2hBbmREb3dubG9hZFJhZGlvLnNldEVuYWJsZWQobWFzdGVyKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7CisJCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOworCQlQcmVmZXJlbmNlcyBwcmVmID0gVXBkYXRlU2NoZWR1bGVyUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOworCQllbmFibGVkQ2hlY2suc2V0U2VsZWN0aW9uKHByZWYuZ2V0RGVmYXVsdEJvb2xlYW4oVXBkYXRlU2NoZWR1bGVyUGx1Z2luLlBfRU5BQkxFRCkpOwkJCisJCQorCQlzZXRTY2hlZHVsZShwcmVmLmdldERlZmF1bHRTdHJpbmcoVXBkYXRlU2NoZWR1bGVyUGx1Z2luLlBfU0NIRURVTEUpKTsKKwkJb25TY2hlZHVsZVJhZGlvLnNldFNlbGVjdGlvbihwcmVmLmdldERlZmF1bHRCb29sZWFuKFVwZGF0ZVNjaGVkdWxlclBsdWdpbi5QX1NDSEVEVUxFKSk7CisJCQorCQlkYXlDb21iby5zZXRUZXh0KFNjaGVkdWxlclN0YXJ0dXAuREFZU1tnZXREYXkocHJlZiwgdHJ1ZSldKTsKKwkJaG91ckNvbWJvLnNldFRleHQoU2NoZWR1bGVyU3RhcnR1cC5IT1VSU1tnZXRIb3VyKHByZWYsIHRydWUpXSk7CisJCQorCQlzZWFyY2hPbmx5UmFkaW8uc2V0U2VsZWN0aW9uKCFwcmVmLmdldERlZmF1bHRCb29sZWFuKFVwZGF0ZVNjaGVkdWxlclBsdWdpbi5QX0RPV05MT0FEKSk7CisJCXNlYXJjaEFuZERvd25sb2FkUmFkaW8uc2V0U2VsZWN0aW9uKHByZWYuZ2V0RGVmYXVsdEJvb2xlYW4oVXBkYXRlU2NoZWR1bGVyUGx1Z2luLlBfRE9XTkxPQUQpKTsKKwkJcGFnZUNoYW5nZWQoKTsKKwl9CisKKwkvKiogCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIElQcmVmZXJlbmNlUGFnZS4KKwkgKiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZQorCSAqLworCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKKwkJUHJlZmVyZW5jZXMgcHJlZiA9IFVwZGF0ZVNjaGVkdWxlclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKKwkJcHJlZi5zZXRWYWx1ZShVcGRhdGVTY2hlZHVsZXJQbHVnaW4uUF9FTkFCTEVELCBlbmFibGVkQ2hlY2suZ2V0U2VsZWN0aW9uKCkpOworCQlpZiAob25TdGFydHVwUmFkaW8uZ2V0U2VsZWN0aW9uKCkpCisJCQlwcmVmLnNldFZhbHVlKFVwZGF0ZVNjaGVkdWxlclBsdWdpbi5QX1NDSEVEVUxFLCBVcGRhdGVTY2hlZHVsZXJQbHVnaW4uVkFMVUVfT05fU1RBUlRVUCk7CisJCWVsc2UgCisJCQlwcmVmLnNldFZhbHVlKFVwZGF0ZVNjaGVkdWxlclBsdWdpbi5QX1NDSEVEVUxFLCBVcGRhdGVTY2hlZHVsZXJQbHVnaW4uVkFMVUVfT05fU0NIRURVTEUpOworCQkJCisJCXByZWYuc2V0VmFsdWUoU2NoZWR1bGVyU3RhcnR1cC5QX0RBWSwgZGF5Q29tYm8uZ2V0VGV4dCgpKTsKKwkJcHJlZi5zZXRWYWx1ZShTY2hlZHVsZXJTdGFydHVwLlBfSE9VUiwgaG91ckNvbWJvLmdldFRleHQoKSk7CisJCQorCQlwcmVmLnNldFZhbHVlKFVwZGF0ZVNjaGVkdWxlclBsdWdpbi5QX0RPV05MT0FELCBzZWFyY2hBbmREb3dubG9hZFJhZGlvLmdldFNlbGVjdGlvbigpKTsKKwkJCisJCVVwZGF0ZVNjaGVkdWxlclBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7CisJCQorCQlVcGRhdGVTY2hlZHVsZXJQbHVnaW4uZ2V0U2NoZWR1bGVyKCkuc2NoZWR1bGVVcGRhdGVKb2IoKTsKKwkJcmV0dXJuIHRydWU7CisJfQorCQorCXByaXZhdGUgaW50IGdldERheShQcmVmZXJlbmNlcyBwcmVmLCBib29sZWFuIHVzZURlZmF1bHQpIHsKKwkJU3RyaW5nIGRheSA9IHVzZURlZmF1bHQ/IHByZWYuZ2V0RGVmYXVsdFN0cmluZyhTY2hlZHVsZXJTdGFydHVwLlBfREFZKTogcHJlZi5nZXRTdHJpbmcoU2NoZWR1bGVyU3RhcnR1cC5QX0RBWSk7CisJCWZvciAoaW50IGk9MDsgaTxTY2hlZHVsZXJTdGFydHVwLkRBWVMubGVuZ3RoOyBpKyspCisJCQlpZiAoU2NoZWR1bGVyU3RhcnR1cC5EQVlTW2ldLmVxdWFscyhkYXkpKQorCQkJCXJldHVybiBpOworCQlyZXR1cm4gMDsKKwl9CisJCisJcHJpdmF0ZSBpbnQgZ2V0SG91cihQcmVmZXJlbmNlcyBwcmVmLCBib29sZWFuIHVzZURlZmF1bHQpIHsKKwkJU3RyaW5nIGhvdXIgPSB1c2VEZWZhdWx0PyBwcmVmLmdldERlZmF1bHRTdHJpbmcoU2NoZWR1bGVyU3RhcnR1cC5QX0hPVVIpOiBwcmVmLmdldFN0cmluZyhTY2hlZHVsZXJTdGFydHVwLlBfSE9VUik7CisJCWZvciAoaW50IGk9MDsgaTxTY2hlZHVsZXJTdGFydHVwLkhPVVJTLmxlbmd0aDsgaSsrKQorCQkJaWYgKFNjaGVkdWxlclN0YXJ0dXAuSE9VUlNbaV0uZXF1YWxzKGhvdXIpKQorCQkJCXJldHVybiBpOworCQlyZXR1cm4gMDsKKwl9Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NjaGVkdWxlci9wcmVmZXJlbmNlcy9QcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2NoZWR1bGVyL3ByZWZlcmVuY2VzL1ByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyYzc3NTAKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NjaGVkdWxlci9wcmVmZXJlbmNlcy9QcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQpAQCAtMCwwICsxLDM0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnNjaGVkdWxlci5wcmVmZXJlbmNlczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuRGVmYXVsdFNjb3BlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5zY2hlZHVsZXIuVXBkYXRlU2NoZWR1bGVyUGx1Z2luOworaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucHJlZnMuUHJlZmVyZW5jZXM7CisKKworLyoqCisgKiBAc2luY2UgMy4xCisgKi8KK3B1YmxpYyBjbGFzcyBQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBBYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciB7CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIjaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpCisJICovCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpIHsKKwkJUHJlZmVyZW5jZXMgbm9kZSA9IG5ldyBEZWZhdWx0U2NvcGUoKS5nZXROb2RlKCJvcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyIik7IC8vJE5PTi1OTFMtMSQKKwkJbm9kZS5wdXRCb29sZWFuKFVwZGF0ZVNjaGVkdWxlclBsdWdpbi5QX0VOQUJMRUQsIGZhbHNlKTsKKwkJbm9kZS5wdXQoVXBkYXRlU2NoZWR1bGVyUGx1Z2luLlBfU0NIRURVTEUsIFVwZGF0ZVNjaGVkdWxlclBsdWdpbi5WQUxVRV9PTl9TVEFSVFVQKTsKKwkJbm9kZS5wdXRCb29sZWFuKFVwZGF0ZVNjaGVkdWxlclBsdWdpbi5QX0RPV05MT0FELCBmYWxzZSk7CisJfQorCit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvLmNsYXNzcGF0aCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS8uY2xhc3NwYXRoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4NDgyNDkKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvLmNsYXNzcGF0aApAQCAtMCwwICsxLDcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQorPGNsYXNzcGF0aD4NCisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+DQorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4NCisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQorPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlLy5jdnNpZ25vcmUgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvLmN2c2lnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWU4MmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlLy5jdnNpZ25vcmUKQEAgLTAsMCArMSBAQAorYmluClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlLy5wcm9qZWN0IGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlLy5wcm9qZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwNDI2MjQKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvLnByb2plY3QKQEAgLTAsMCArMSwzOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCis8cHJvamVjdERlc2NyaXB0aW9uPg0KKwk8bmFtZT5vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZTwvbmFtZT4NCisJPGNvbW1lbnQ+PC9jb21tZW50Pg0KKwk8cHJvamVjdHM+DQorCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5jb3JlLmJvb3Q8L3Byb2plY3Q+DQorCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlczwvcHJvamVjdD4NCisJCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmNvcmUucnVudGltZTwvcHJvamVjdD4NCisJCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5PC9wcm9qZWN0Pg0KKwkJPHByb2plY3Q+b3JnLmVjbGlwc2UuaGVscC5hcHBzZXJ2ZXI8L3Byb2plY3Q+DQorCQk8cHJvamVjdD5vcmcuZWNsaXBzZS50b21jYXQ8L3Byb2plY3Q+DQorCQk8cHJvamVjdD5vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yPC9wcm9qZWN0Pg0KKwkJPHByb2plY3Q+b3JnLmVjbGlwc2UudXBkYXRlLmNvcmU8L3Byb2plY3Q+DQorCQk8cHJvamVjdD5vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5saW51eDwvcHJvamVjdD4NCisJCTxwcm9qZWN0Pm9yZy5qdW5pdDwvcHJvamVjdD4NCisJPC9wcm9qZWN0cz4NCisJPGJ1aWxkU3BlYz4NCisJCTxidWlsZENvbW1hbmQ+DQorCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+DQorCQkJPGFyZ3VtZW50cz4NCisJCQk8L2FyZ3VtZW50cz4NCisJCTwvYnVpbGRDb21tYW5kPg0KKwkJPGJ1aWxkQ29tbWFuZD4NCisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPg0KKwkJCTxhcmd1bWVudHM+DQorCQkJPC9hcmd1bWVudHM+DQorCQk8L2J1aWxkQ29tbWFuZD4NCisJCTxidWlsZENvbW1hbmQ+DQorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+DQorCQkJPGFyZ3VtZW50cz4NCisJCQk8L2FyZ3VtZW50cz4NCisJCTwvYnVpbGRDb21tYW5kPg0KKwk8L2J1aWxkU3BlYz4NCisJPG5hdHVyZXM+DQorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCisJCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KKwk8L25hdHVyZXM+DQorPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQwMDM5OAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKQEAgLTAsMCArMSw2NCBAQAorI1dlZCBGZWIgMjUgMTA6MDY6NDEgRVNUIDIwMDkKK2VjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmNvbXBhcmluZ0lkZW50aWNhbD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlYWRDb2RlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhdGFsT3B0aW9uYWxFcnJvcj1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSGFzaENvZGVNZXRob2Q9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTeW5jaHJvbml6ZWRPbkluaGVyaXRlZE1ldGhvZD1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsUmVmZXJlbmNlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucGFyYW1ldGVyQXNzaWdubWVudD1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3RlbnRpYWxOdWxsUmVmZXJlbmNlPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50TnVsbENoZWNrPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZWR1bmRhbnRTdXBlcmludGVyZmFjZT1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbkV4ZW1wdEV4Y2VwdGlvbkFuZFRocm93YWJsZT1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uSW5jbHVkZURvY0NvbW1lbnRSZWZlcmVuY2U9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJJbmNsdWRlRG9jQ29tbWVudFJlZmVyZW5jZT1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkV2FybmluZ1Rva2VuPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyMGM4Y2UKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTAsMCArMSwzOCBAQAorTWFuaWZlc3QtVmVyc2lvbjogMS4wCitCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCitCdW5kbGUtTmFtZTogJW5hbWUKK0J1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlOyBzaW5nbGV0b246PXRydWUKK0J1bmRsZS1WZXJzaW9uOiAzLjMuMC5xdWFsaWZpZXIKK0J1bmRsZS1DbGFzc1BhdGg6IHVwZGF0ZXRlc3RzLmphcgorQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZVRlc3RzUGx1Z2luCitCdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXItbmFtZQorQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCitFeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLAorIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5hcGksCisgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmJyYW5kaW5nLAorIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb25maWd1cmF0aW9ucywKKyBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS5ib290LAorIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5pbXBsZW1lbnRhdGlvbiwKKyBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMubWlycm9yLAorIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5tb2RlbCwKKyBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMubmF0aXZlVGVzdHMsCisgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLm5lc3RlZGZlYXR1cmVzLAorIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5wYXJzZXIsCisgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnBlcmZtcywKKyBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMucmVjb25jaWxpYXRpb24sCisgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnJlZ3VsYXJJbnN0YWxsLAorIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5yZWd1bGFyUmVtb3ZlLAorIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5zaXRldmFsaWRhdGlvbiwKKyBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuc3RhbmRhbG9uZSwKKyBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMudHlwZXMsCisgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnVpdmFsdWVzCitSZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAorIG9yZy5qdW5pdCwKKyBvcmcuZWNsaXBzZS51cGRhdGUuY29yZSwKKyBvcmcuZWNsaXBzZS5oZWxwLmFwcHNlcnZlciwKKyBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLAorIG9yZy5lY2xpcHNlLnRlc3QucGVyZm9ybWFuY2UsCisgb3JnLmVjbGlwc2UuZXF1aW5veC5odHRwLnJlZ2lzdHJ5CitFY2xpcHNlLUxhenlTdGFydDogdHJ1ZQorSW1wb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVxdWlub3guaHR0cC5qZXR0eSwKKyBvcmcub3NnaS5zZXJ2aWNlLmh0dHA7dmVyc2lvbj0iMS4yLjAiCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvYWJvdXQuaHRtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9hYm91dC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MDIzMzAKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvYWJvdXQuaHRtbApAQCAtMCwwICsxLDI4IEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgorICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgorPHRpdGxlPkFib3V0PC90aXRsZT4KKzwvaGVhZD4KKzxib2R5IGxhbmc9IkVOLVVTIj4KKzxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgorIAorPHA+SnVuZSAyLCAyMDA2PC9wPgkKKzxoMz5MaWNlbnNlPC9oMz4KKworPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCitpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCitFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAorYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KK0ZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CisKKzxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCitiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5CithcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCitwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKK2luZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50CithbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgorCis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YS9mZWF0dXJlcy9mZWF0dXJlMy9mZWF0dXJlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEvZmVhdHVyZXMvZmVhdHVyZTMvZmVhdHVyZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZjODg5OQotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEvZmVhdHVyZXMvZmVhdHVyZTMvZmVhdHVyZS54bWwKQEAgLTAsMCArMSwxMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMyIgaW1hZ2U9ImZlYXR1cmUxLmdpZiIgbGFiZWw9IlRoaXJkIEZlYXR1cmUiIHByb3ZpZGVyLW5hbWU9IlNtYXJ0IENvbXBhbnkiIHZlcnNpb249IjEuMC4wIiA+CisgIDxkZXNjcmlwdGlvbj5EZXNjcmlwdGlvbjwvZGVzY3JpcHRpb24+CisgIDxjb3B5cmlnaHQ+Y29weXJpZ2h0PC9jb3B5cmlnaHQ+CisgIDxsaWNlbnNlPmxpY2Vuc2U8L2xpY2Vuc2U+CisgIDx1cmw+CisgICAgPHVwZGF0ZSBsYWJlbD0iVVJMIHRvIHVwZGF0ZSB0aGUgZmVhdHVyZSIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3BhdGgvZmVhdHVyZTEvIi8+CisgICAgPGRpc2NvdmVyeSBsYWJlbD0iRGlzY292ZXJ5IDEiIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyIvPgorICAgIDxkaXNjb3ZlcnkgbGFiZWw9IkRpc2NvdmVyeSAyIiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciLz4KKyAgPC91cmw+CisgIDxwbHVnaW4gZG93bmxvYWQtc2l6ZT0iMTUwMCIgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjEiIGluc3RhbGwtc2l6ZT0iMTAwMCIgZnJhZ21lbnQ9ImZhbHNlIiBubD0iZW4iIG9zPSJXSU4zMixMSU5VWCxIUFVYLE1BQ09TWCxBSVgsU09MQVJJUyxRTlgsVU5LTk9XTiIgdmVyc2lvbj0iMy41LjYiIHdzPSJXSU4zMixNT1RJRixHVEssQ0FSQk9OLFBIT1RPTixDT0NPQSxVTktOT1dOIi8+Cis8L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhL3BsdWdpbnMvUGRlX2NvcmUuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YS9wbHVnaW5zL1BkZV9jb3JlLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTA3MjE3Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YS9wbHVnaW5zL1BkZV9jb3JlLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhL3BsdWdpbnMvaGVscC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhL3BsdWdpbnMvaGVscC5qYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU4NGY2NgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEvcGx1Z2lucy9oZWxwLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhL3BsdWdpbnMvanVuaXRfMy43LmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEvcGx1Z2lucy9qdW5pdF8zLjcuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3NTg3YjIKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhL3BsdWdpbnMvanVuaXRfMy43LmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjFfMS4xLjEvcGx1Z2luLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMS9wbHVnaW4ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMDVkODIKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjFfMS4xLjEvcGx1Z2luLnhtbApAQCAtMCwwICsxLDggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQorPHBsdWdpbiBuYW1lPSJKVW5pdCBUZXN0IEZyYW1ld29yayIgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjEiIHZlcnNpb249IjMuNS42IiB2ZW5kb3ItbmFtZT0ianVuaXQub3JnIj4NCisgIDxydW50aW1lPg0KKyAgICA8bGlicmFyeSBuYW1lPSJqdW5pdC5qYXIiPg0KKyAgICAgIDxleHBvcnQgbmFtZT0iKiIvPg0KKyAgICA8L2xpYnJhcnk+DQorICA8L3J1bnRpbWU+DQorPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YS9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xL3NyYy5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjFfMS4xLjEvc3JjLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDRkNjA5Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YS9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xL3NyYy5qYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvZmVhdHVyZXMvZmVhdHVyZTMvZmVhdHVyZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhMi9mZWF0dXJlcy9mZWF0dXJlMy9mZWF0dXJlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmYxNDg1Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvZmVhdHVyZXMvZmVhdHVyZTMvZmVhdHVyZS54bWwKQEAgLTAsMCArMSwxMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMyIgaW1hZ2U9ImZlYXR1cmUxLmdpZiIgbGFiZWw9IlRoaXJkIEZlYXR1cmUiIHByb3ZpZGVyLW5hbWU9IlNtYXJ0IENvbXBhbnkiIHZlcnNpb249IjEuMC4wIiA+CisgIDxkZXNjcmlwdGlvbj5EZXNjcmlwdGlvbjwvZGVzY3JpcHRpb24+CisgIDxjb3B5cmlnaHQ+Y29weXJpZ2h0PC9jb3B5cmlnaHQ+CisgIDxsaWNlbnNlPmxpY2Vuc2U8L2xpY2Vuc2U+CisgIDx1cmw+CisgICAgPHVwZGF0ZSBsYWJlbD0iVVJMIHRvIHVwZGF0ZSB0aGUgZmVhdHVyZSIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3BhdGgvZmVhdHVyZTEvIi8+CisgICAgPGRpc2NvdmVyeSBsYWJlbD0iRGlzY292ZXJ5IDEiIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyIvPgorICAgIDxkaXNjb3ZlcnkgbGFiZWw9IkRpc2NvdmVyeSAyIiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciLz4KKyAgPC91cmw+CisgIDxwbHVnaW4gZG93bmxvYWQtc2l6ZT0iMTUwMCIgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xIiBpbnN0YWxsLXNpemU9IjEwMDAiIGZyYWdtZW50PSJmYWxzZSIgbmw9ImVuLGZyIiBvcz0iV0lOMzIsTElOVVgsSFBVWCxNQUNPU1gsQUlYLFNPTEFSSVMsUU5YLFVOS05PV04iIHZlcnNpb249IjEuMS4xIiB3cz0iV0lOMzIsTU9USUYsR1RLLENBUkJPTixQSE9UT04sQ09DT0EsVU5LTk9XTiIvPgorPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvZmVhdHVyZXMvaGVscEZlYXR1cmUuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvZmVhdHVyZXMvaGVscEZlYXR1cmUuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlZThlOGYKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhMi9mZWF0dXJlcy9oZWxwRmVhdHVyZS5qYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGRlLmZlYXR1cmVfMS4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGRlLmZlYXR1cmVfMS4wLjAuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlMjNjYWIKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhMi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wZGUuZmVhdHVyZV8xLjAuMC5qYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvaW5mby9pbWcvdG9wX3RpdGxzbS5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhMi9pbmZvL2ltZy90b3BfdGl0bHNtLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTE3YmI2Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvaW5mby9pbWcvdG9wX3RpdGxzbS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvaW5mby9pbWcvd2VsX21sLmpwZyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEyL2luZm8vaW1nL3dlbF9tbC5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFlMzNkZgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEyL2luZm8vaW1nL3dlbF9tbC5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvaW5mby9zaXRlSW5mby5odG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvaW5mby9zaXRlSW5mby5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNjVhYTMKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhMi9pbmZvL3NpdGVJbmZvLmh0bWwKQEAgLTAsMCArMSw2MyBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+DQorPGhlYWQ+DQorPC9oZWFkPg0KKyAgPGJvZHk+DQorPGltZyBzcmM9ImltZy90b3BfdGl0bHNtLmdpZiIgYWx0PSIiIHdpZHRoPSI0NjAiIGhlaWdodD0iNTAiPg0KKzxicj4NCis8YnI+DQorICAgICBJdCBzdGFydGVkIHdpdGggU21hbGx0YWxrPGJyPg0KKyAgICBPVEkgaGFzIGJlZW4gYnVpbGRpbmcgdG9vbHMgZm9yIHBsYXRmb3JtLWluZGVwZW5kZW50IE9PIGRldmVsb3BtZW50IHNpbmNlDQorICAxOTg4LiBPdXIgRU5WWSZyZWc7IHRlY2hub2xvZ3kgZmlyc3QgYnJvdWdodCBjb2xsYWJvcmF0aXZlIHNvZnR3YXJlIGRldmVsb3BtZW50LA0KKyAgdmVyc2lvbiBtYW5hZ2VtZW50IGFuZCBzaGFyZWQgcmVwb3NpdG9yaWVzIHRvIFNtYWxsdGFsay4gSUJNIGlzIG9uZSBvZg0KK21hbnkgICBjb21wYW5pZXMgdG8gbGljZW5zZSBFTlZZLCB3aGljaCBjb250aW51ZXMgdG8gYmUgdGhlIGZvdW5kYXRpb24gb2YNCitWaXN1YWxBZ2UmcmVnOyAgIFNtYWxsdGFsay48YnI+DQorPGJyPg0KKzxicj4NCis8YnI+DQorICAgICAgTmV4dCBjYW1lIEphdmEmIzg0ODI7PGJyPg0KKyAgICBCZWNhdXNlIG9mIG91ciBleHBlcnRpc2UgaW4gT08gdGVjaG5vbG9neSwgSUJNIHR1cm5lZCB0byBPVEkgZm9yIGEgbmV4dC1nZW5lcmF0aW9uDQorICBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCBmb3IgSmF2YS4gVGhlIHJlc3VsdCBpcyBWaXN1YWxBZ2UgZm9yIEphdmEsIHdoaWNoDQorICBjb250aW51ZXMgdG8gd2luIGF3YXJkcyBmb3IgaXRzIGlubm92YXRpdmUgSURFIGFuZCB0ZWFtIHN1cHBvcnQuIEluZm9Xb3JsZA0KKyAgaGFzIGNob3NlbiBWaXN1YWxBZ2UgZm9yIEphdmEgYXMgZGV2ZWxvcG1lbnQgdG9vbCBvZiB0aGUgeWVhciAtIHllYXIgYWZ0ZXINCisgIHllYXIgYWZ0ZXIgeWVhciE8YnI+DQorPGJyPg0KKzxicj4NCis8YnI+DQorICAgICAgVGhlbiBwZXJ2YXNpdmUgY29tcHV0aW5nPGJyPg0KKyAgICBPVEkgY29udGludWVzIGl0cyBkZXZlbG9wbWVudCBvZiBJQk0ncyBWaXN1YWxBZ2UgTWljcm8gRWRpdGlvbiwgYSBzdGF0ZS1vZi10aGUtYXJ0DQorICBwbGF0Zm9ybSBmb3IgY29sbGFib3JhdGl2ZSBkZXZlbG9wbWVudCBvZiBlbWJlZGRlZCBhcHBsaWNhdGlvbnMgYW5kIHN5c3RlbXMNCisgIHRoYXQgYXJlIHZlcnkgbGVhbi4gQXMgdGhlIHN0ZWFkeSBzdHJlYW0gb2YgcHJlc3MgcmVsZWFzZXMgYXR0ZXN0cywgVmlzdWFsQWdlDQorICBNaWNybyBFZGl0aW9uIGlzIGFscmVhZHkgbGljZW5zZWQgdG8gdGhlIGxlYWRpbmcgbWljcm9jaGlwIG1hbnVmYWN0dXJlcnMsDQorICBtaWNyb2tlcm5lbCBkZXZlbG9wZXJzLCBhbmQgcHJvZHVjZXJzIG9mIGhhbmRoZWxkIGFuZCBjb25zdW1lciBkZXZpY2VzLjxicj4NCis8YnI+DQorPGJyPg0KKzxicj4NCisgICAgICBOb3cgaXQncyBFY2xpcHNlPGJyPg0KKyAgICBPVEkgaGFzIGJ1aWx0IHRoZSBuZXh0IGdlbmVyYXRpb24gSUJNIGFwcGxpY2F0aW9uIGRldmVsb3BtZW50IHRvb2xzIHBsYXRmb3JtLg0KKyAgRWNsaXBzZSBpcyBhIGtpbmQgb2YgdW5pdmVyc2FsIHRvb2wgcGxhdGZvcm0gLSBhbiBvcGVuIGV4dGVuc2libGUgSURFIGZvcg0KKyAgYW55dGhpbmcgYW5kIG5vdGhpbmcgaW4gcGFydGljdWxhci4gVGhlIHJlYWwgdmFsdWUgY29tZXMgZnJvbSB0b29sIHBsdWctaW5zDQorICB0aGF0ICJ0ZWFjaCIgRWNsaXBzZSBob3cgdG8gd29yayB3aXRoIHRoaW5ncyAtIGphdmEgZmlsZXMsIHdlYiBjb250ZW50LA0KK2dyYXBoaWNzLCAgdmlkZW8gLSBhbG1vc3QgYW55dGhpbmcgeW91IGNhbiBpbWFnaW5lLiBFY2xpcHNlIGFsbG93cyB5b3UgdG8NCitpbmRlcGVuZGVudGx5ICBkZXZlbG9wIHRvb2xzIHRoYXQgaW50ZWdyYXRlIHdpdGggb3RoZXIgcGVvcGxlJ3MgdG9vbHMgc28NCitzZWFtbGVzc2x5IHlvdSB3b24ndCBrbm93IHdoZXJlIG9uZSB0b29sIGVuZHMgYW5kIGFub3RoZXIgc3RhcnRzLiBUaGUgSUJNDQorc3VwcG9ydGVkIHZlcnNpb24gb2YgdGhpcyB0ZWNobm9sb2d5LCBXZWJTcGhlcmUgU3R1ZGlvIFdvcmtiZW5jaCwgd2lsbCBiZQ0KK3RoZSBjb3JlIG9mIHRoZSBuZXh0ICBnZW5lcmF0aW9uIG9mIElCTSBhbmQgSUJNIEJ1c2luZXNzIFBhcnRuZXIgZS1idXNpbmVzcw0KK3Rvb2xzIG9wdGltaXplZCBmb3IgIHRoZSBXZWJTcGhlcmUgc29mdHdhcmUgcGxhdGZvcm0uPGJyPg0KKzxicj4NCis8YnI+DQorPGJyPg0KKyAgICAgIFNvIHdoYXQncyBuZXh0Pzxicj4NCisgICAgT1RJIGNvbnRpbnVlcyB0byBkZWxpdmVyIG9iamVjdC1vcmllbnRlZCB0ZWNobm9sb2d5IHRoYXQgc2NhbGVzIGFjcm9zcw0KKyBwbGF0Zm9ybXMsICBhY3Jvc3MgdGVhbXMgYW5kIGFjcm9zcyBwcm9qZWN0IHNpemUuIEZyb20gYSBtYWluZnJhbWUgdG8gYQ0KK3dhdGNoICAtIHdlJ3JlICBjbG9zaW5nIGluIG9uIHRoYXQgdmlzaW9uLjxicj4NCis8YnI+DQorPGltZyBzcmM9ImltZy93ZWxfbWwuanBnIiB3aWR0aD0iNDYwIiBoZWlnaHQ9IjQ2MCIgYWx0PSIiPg0KKzxicj4NCis8YnI+DQorPGJyPg0KKzxicj4NCis8YnI+DQorPGJyPg0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvcGx1Z2lucy9QZGVfY29yZS5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhMi9wbHVnaW5zL1BkZV9jb3JlLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTA3MjE3Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvcGx1Z2lucy9QZGVfY29yZS5qYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvcGx1Z2lucy9oZWxwLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEyL3BsdWdpbnMvaGVscC5qYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU4NGY2NgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEyL3BsdWdpbnMvaGVscC5qYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvcGx1Z2lucy9qdW5pdF8zLjcuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvcGx1Z2lucy9qdW5pdF8zLjcuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3NTg3YjIKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhMi9wbHVnaW5zL2p1bml0XzMuNy5qYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMS9wbHVnaW4ueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMS9wbHVnaW4ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMDVkODIKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhMi9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xL3BsdWdpbi54bWwKQEAgLTAsMCArMSw4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KKzxwbHVnaW4gbmFtZT0iSlVuaXQgVGVzdCBGcmFtZXdvcmsiIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4xIiB2ZXJzaW9uPSIzLjUuNiIgdmVuZG9yLW5hbWU9Imp1bml0Lm9yZyI+DQorICA8cnVudGltZT4NCisgICAgPGxpYnJhcnkgbmFtZT0ianVuaXQuamFyIj4NCisgICAgICA8ZXhwb3J0IG5hbWU9IioiLz4NCisgICAgPC9saWJyYXJ5Pg0KKyAgPC9ydW50aW1lPg0KKzwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEyL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjFfMS4xLjEvc3JjLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEyL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjFfMS4xLjEvc3JjLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDRkNjA5Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMS9zcmMuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEyL3NpdGUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvc2l0ZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYyMTFhOAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEyL3NpdGUueG1sCkBAIC0wLDAgKzEsMjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQorPHNpdGUgdHlwZT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmlsZSI+DQorPGRlc2NyaXB0aW9uIHVybD0iaW5mby9zaXRlSW5mby5odG1sIi8+DQorICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL2hlbHBGZWF0dXJlLmphciIgdHlwZT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUucGFja2FnZWQiPg0KKyAgICA8Y2F0ZWdvcnkgbmFtZT0iZWNsaXBzZS9VTUwiLz4NCisgIDwvZmVhdHVyZT4NCisgIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UucGRlLmZlYXR1cmVfMS4wLjAuamFyIiB0eXBlPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5wYWNrYWdlZCI+DQorICAgIDxjYXRlZ29yeSBuYW1lPSJlY2xpcHNlL0oyRUUiLz4NCisgIDwvZmVhdHVyZT4NCisgIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvZmVhdHVyZTMvIiBvcz0iTElOVVgiPg0KKyAgICA8Y2F0ZWdvcnkgbmFtZT0iZWNsaXBzZSIvPg0KKyAgPC9mZWF0dXJlPg0KKyAgPGFyY2hpdmUgcGF0aD0icGx1Z2lucy9vcmcuZWNsaXBzZS5oZWxwXzEuMC4wLmphciIgdXJsPSJwbHVnaW5zL2hlbHAuamFyIi8+DQorICA8YXJjaGl2ZSBwYXRoPSJwbHVnaW5zL29yZy5lY2xpcHNlLnBkZS5jb3JlXzEuMC4wLmphciIgdXJsPSJwbHVnaW5zL1BkZV9jb3JlLmphciIvPg0KKyAgPGFyY2hpdmUgcGF0aD0icGx1Z2lucy9vcmcuanVuaXRfMy41LjAuamFyIiB1cmw9InBsdWdpbnMvanVuaXRfMy43LmphciIvPg0KKyAgPGFyY2hpdmUgcGF0aD0icGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMS5qYXIiIHVybD0icGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMSIvPiAgDQorICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJJQk0gV1NBRCBUb29scyIgbmFtZT0iZWNsaXBzZSIvPg0KKyAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iSjJFRSB0b29scyIgbmFtZT0iZWNsaXBzZS9KMkVFIi8+DQorICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJFSkIgVG9vbHMiIG5hbWU9ImVjbGlwc2UvSjJFRS9FSkIiLz4NCisgIDxjYXRlZ29yeS1kZWYgbGFiZWw9IlVNTCB0b29scyIgbmFtZT0iZWNsaXBzZS9VTUwiLz4NCisgIDxjYXRlZ29yeS1kZWYgbGFiZWw9Ik1lc3NhZ2luZyBUb29scyIgbmFtZT0iQjJCIi8+ICANCis8L3NpdGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRlRQTGlrZVNpdGUvc2l0ZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9GVFBMaWtlU2l0ZS9zaXRlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTYyZTJlCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRlRQTGlrZVNpdGUvc2l0ZS54bWwKQEAgLTAsMCArMSw0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KKzxzaXRlIHR5cGU9Im9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlLmZ0cCI+DQorICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL2ZlYXR1cmUzL2ZlYXR1cmVzMi5qYXJmaWxlIi8+DQorPC9zaXRlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0ZlYXR1cmVUeXBlRXhhbXBsZXMvc2l0ZTEvZmVhdHVyZXMvZmVhdHVyZTMvZmVhdHVyZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9GZWF0dXJlVHlwZUV4YW1wbGVzL3NpdGUxL2ZlYXR1cmVzL2ZlYXR1cmUzL2ZlYXR1cmUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjOThmNDIKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9GZWF0dXJlVHlwZUV4YW1wbGVzL3NpdGUxL2ZlYXR1cmVzL2ZlYXR1cmUzL2ZlYXR1cmUueG1sCkBAIC0wLDAgKzEsMTIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQorPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUzIiBpbWFnZT0iZmVhdHVyZTEuZ2lmIiBsYWJlbD0iVGhpcmQgRmVhdHVyZSIgcHJvdmlkZXItbmFtZT0iU21hcnQgQ29tcGFueSIgdmVyc2lvbj0iMS4wLjAiPg0KKyAgPGRlc2NyaXB0aW9uPkRlc2NyaXB0aW9uPC9kZXNjcmlwdGlvbj4NCisgIDxjb3B5cmlnaHQ+Y29weXJpZ2h0PC9jb3B5cmlnaHQ+DQorICA8bGljZW5zZT5saWNlbnNlPC9saWNlbnNlPg0KKyAgPHVybD4NCisgICAgPHVwZGF0ZSBsYWJlbD0iVVJMIHRvIHVwZGF0ZSB0aGUgZmVhdHVyZSIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3BhdGgvZmVhdHVyZTEvIi8+DQorICAgIDxkaXNjb3ZlcnkgbGFiZWw9IkRpc2NvdmVyeSAxIiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciLz4NCisgICAgPGRpc2NvdmVyeSBsYWJlbD0iRGlzY292ZXJ5IDIiIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyIvPg0KKyAgPC91cmw+DQorICA8cGx1Z2luIGRvd25sb2FkLXNpemU9IjE1MDAiIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMSIgaW5zdGFsbC1zaXplPSIxMDAwIiBmcmFnbWVudD0iZmFsc2UiIG9zPSJXSU4zMixMSU5VWCIgdmVyc2lvbj0iMS4xLjEiIHdzPSJXSU4zMixNT1RJRixHVEsiLz4NCis8L2ZlYXR1cmU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRmVhdHVyZVR5cGVFeGFtcGxlcy9zaXRlMS9zaXRlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0ZlYXR1cmVUeXBlRXhhbXBsZXMvc2l0ZTEvc2l0ZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg2ZDExOQotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0ZlYXR1cmVUeXBlRXhhbXBsZXMvc2l0ZTEvc2l0ZS54bWwKQEAgLTAsMCArMSw0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KKzxzaXRlIHR5cGU9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZpbGUiPg0KKyAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9mZWF0dXJlMyIgdHlwZT0ib3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUuZmVhdHVyZTEiLz4NCis8L3NpdGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRmVhdHVyZVR5cGVFeGFtcGxlcy9zaXRlMi9mZWF0dXJlcy9mZWF0dXJlMy9mZWF0dXJlczIuamFyZmlsZSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0ZlYXR1cmVUeXBlRXhhbXBsZXMvc2l0ZTIvZmVhdHVyZXMvZmVhdHVyZTMvZmVhdHVyZXMyLmphcmZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQwYWI0ZgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0ZlYXR1cmVUeXBlRXhhbXBsZXMvc2l0ZTIvZmVhdHVyZXMvZmVhdHVyZTMvZmVhdHVyZXMyLmphcmZpbGUKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRmVhdHVyZVR5cGVFeGFtcGxlcy9zaXRlMi9zaXRlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0ZlYXR1cmVUeXBlRXhhbXBsZXMvc2l0ZTIvc2l0ZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI1ZmUwZQotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0ZlYXR1cmVUeXBlRXhhbXBsZXMvc2l0ZTIvc2l0ZS54bWwKQEAgLTAsMCArMSw0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KKzxzaXRlIHR5cGU9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZpbGUiPg0KKyAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9mZWF0dXJlMy9mZWF0dXJlczIuamFyZmlsZSIgdHlwZT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUucGFja2FnZWQiLz4NCis8L3NpdGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRmVhdHVyZVR5cGVFeGFtcGxlcy9zaXRlMy9mZWF0dXJlcy9mZWF0dXJlMy9mZWF0dXJlczIuamFyZmlsZSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0ZlYXR1cmVUeXBlRXhhbXBsZXMvc2l0ZTMvZmVhdHVyZXMvZmVhdHVyZTMvZmVhdHVyZXMyLmphcmZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQwYWI0ZgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0ZlYXR1cmVUeXBlRXhhbXBsZXMvc2l0ZTMvZmVhdHVyZXMvZmVhdHVyZTMvZmVhdHVyZXMyLmphcmZpbGUKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRmVhdHVyZVR5cGVFeGFtcGxlcy9zaXRlMy9zaXRlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0ZlYXR1cmVUeXBlRXhhbXBsZXMvc2l0ZTMvc2l0ZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFmMzcyZAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0ZlYXR1cmVUeXBlRXhhbXBsZXMvc2l0ZTMvc2l0ZS54bWwKQEAgLTAsMCArMSw0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KKzxzaXRlIHR5cGU9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZpbGUiPg0KKyAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9mZWF0dXJlMy9mZWF0dXJlczIuamFyZmlsZSIgdHlwZT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudW5rbm93bnR5cGUuamFyIi8+DQorPC9zaXRlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGUgd2l0aCBzcGFjZS9mZWF0dXJlcyBzcGFjZS9oZWxwRmVhdHVyZS5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlIHdpdGggc3BhY2UvZmVhdHVyZXMgc3BhY2UvaGVscEZlYXR1cmUuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2YWZlZjYKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlIHdpdGggc3BhY2UvZmVhdHVyZXMgc3BhY2UvaGVscEZlYXR1cmUuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGUgd2l0aCBzcGFjZS9mZWF0dXJlcyBzcGFjZS9zcGFjZSBmZWF0dXJlLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGUgd2l0aCBzcGFjZS9mZWF0dXJlcyBzcGFjZS9zcGFjZSBmZWF0dXJlLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmMxYTZlCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZSB3aXRoIHNwYWNlL2ZlYXR1cmVzIHNwYWNlL3NwYWNlIGZlYXR1cmUuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGUgd2l0aCBzcGFjZS9pbmZvL2ltZy90b3BfdGl0bHNtLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGUgd2l0aCBzcGFjZS9pbmZvL2ltZy90b3BfdGl0bHNtLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTE3YmI2Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZSB3aXRoIHNwYWNlL2luZm8vaW1nL3RvcF90aXRsc20uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGUgd2l0aCBzcGFjZS9pbmZvL2ltZy93ZWxfbWwuanBnIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZSB3aXRoIHNwYWNlL2luZm8vaW1nL3dlbF9tbC5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFlMzNkZgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGUgd2l0aCBzcGFjZS9pbmZvL2ltZy93ZWxfbWwuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGUgd2l0aCBzcGFjZS9pbmZvL3NpdGVJbmZvLmh0bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlIHdpdGggc3BhY2UvaW5mby9zaXRlSW5mby5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNjVhYTMKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlIHdpdGggc3BhY2UvaW5mby9zaXRlSW5mby5odG1sCkBAIC0wLDAgKzEsNjMgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPg0KKzxoZWFkPg0KKzwvaGVhZD4NCisgIDxib2R5Pg0KKzxpbWcgc3JjPSJpbWcvdG9wX3RpdGxzbS5naWYiIGFsdD0iIiB3aWR0aD0iNDYwIiBoZWlnaHQ9IjUwIj4NCis8YnI+DQorPGJyPg0KKyAgICAgSXQgc3RhcnRlZCB3aXRoIFNtYWxsdGFsazxicj4NCisgICAgT1RJIGhhcyBiZWVuIGJ1aWxkaW5nIHRvb2xzIGZvciBwbGF0Zm9ybS1pbmRlcGVuZGVudCBPTyBkZXZlbG9wbWVudCBzaW5jZQ0KKyAgMTk4OC4gT3VyIEVOVlkmcmVnOyB0ZWNobm9sb2d5IGZpcnN0IGJyb3VnaHQgY29sbGFib3JhdGl2ZSBzb2Z0d2FyZSBkZXZlbG9wbWVudCwNCisgIHZlcnNpb24gbWFuYWdlbWVudCBhbmQgc2hhcmVkIHJlcG9zaXRvcmllcyB0byBTbWFsbHRhbGsuIElCTSBpcyBvbmUgb2YNCittYW55ICAgY29tcGFuaWVzIHRvIGxpY2Vuc2UgRU5WWSwgd2hpY2ggY29udGludWVzIHRvIGJlIHRoZSBmb3VuZGF0aW9uIG9mDQorVmlzdWFsQWdlJnJlZzsgICBTbWFsbHRhbGsuPGJyPg0KKzxicj4NCis8YnI+DQorPGJyPg0KKyAgICAgIE5leHQgY2FtZSBKYXZhJiM4NDgyOzxicj4NCisgICAgQmVjYXVzZSBvZiBvdXIgZXhwZXJ0aXNlIGluIE9PIHRlY2hub2xvZ3ksIElCTSB0dXJuZWQgdG8gT1RJIGZvciBhIG5leHQtZ2VuZXJhdGlvbg0KKyAgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgZm9yIEphdmEuIFRoZSByZXN1bHQgaXMgVmlzdWFsQWdlIGZvciBKYXZhLCB3aGljaA0KKyAgY29udGludWVzIHRvIHdpbiBhd2FyZHMgZm9yIGl0cyBpbm5vdmF0aXZlIElERSBhbmQgdGVhbSBzdXBwb3J0LiBJbmZvV29ybGQNCisgIGhhcyBjaG9zZW4gVmlzdWFsQWdlIGZvciBKYXZhIGFzIGRldmVsb3BtZW50IHRvb2wgb2YgdGhlIHllYXIgLSB5ZWFyIGFmdGVyDQorICB5ZWFyIGFmdGVyIHllYXIhPGJyPg0KKzxicj4NCis8YnI+DQorPGJyPg0KKyAgICAgIFRoZW4gcGVydmFzaXZlIGNvbXB1dGluZzxicj4NCisgICAgT1RJIGNvbnRpbnVlcyBpdHMgZGV2ZWxvcG1lbnQgb2YgSUJNJ3MgVmlzdWFsQWdlIE1pY3JvIEVkaXRpb24sIGEgc3RhdGUtb2YtdGhlLWFydA0KKyAgcGxhdGZvcm0gZm9yIGNvbGxhYm9yYXRpdmUgZGV2ZWxvcG1lbnQgb2YgZW1iZWRkZWQgYXBwbGljYXRpb25zIGFuZCBzeXN0ZW1zDQorICB0aGF0IGFyZSB2ZXJ5IGxlYW4uIEFzIHRoZSBzdGVhZHkgc3RyZWFtIG9mIHByZXNzIHJlbGVhc2VzIGF0dGVzdHMsIFZpc3VhbEFnZQ0KKyAgTWljcm8gRWRpdGlvbiBpcyBhbHJlYWR5IGxpY2Vuc2VkIHRvIHRoZSBsZWFkaW5nIG1pY3JvY2hpcCBtYW51ZmFjdHVyZXJzLA0KKyAgbWljcm9rZXJuZWwgZGV2ZWxvcGVycywgYW5kIHByb2R1Y2VycyBvZiBoYW5kaGVsZCBhbmQgY29uc3VtZXIgZGV2aWNlcy48YnI+DQorPGJyPg0KKzxicj4NCis8YnI+DQorICAgICAgTm93IGl0J3MgRWNsaXBzZTxicj4NCisgICAgT1RJIGhhcyBidWlsdCB0aGUgbmV4dCBnZW5lcmF0aW9uIElCTSBhcHBsaWNhdGlvbiBkZXZlbG9wbWVudCB0b29scyBwbGF0Zm9ybS4NCisgIEVjbGlwc2UgaXMgYSBraW5kIG9mIHVuaXZlcnNhbCB0b29sIHBsYXRmb3JtIC0gYW4gb3BlbiBleHRlbnNpYmxlIElERSBmb3INCisgIGFueXRoaW5nIGFuZCBub3RoaW5nIGluIHBhcnRpY3VsYXIuIFRoZSByZWFsIHZhbHVlIGNvbWVzIGZyb20gdG9vbCBwbHVnLWlucw0KKyAgdGhhdCAidGVhY2giIEVjbGlwc2UgaG93IHRvIHdvcmsgd2l0aCB0aGluZ3MgLSBqYXZhIGZpbGVzLCB3ZWIgY29udGVudCwNCitncmFwaGljcywgIHZpZGVvIC0gYWxtb3N0IGFueXRoaW5nIHlvdSBjYW4gaW1hZ2luZS4gRWNsaXBzZSBhbGxvd3MgeW91IHRvDQoraW5kZXBlbmRlbnRseSAgZGV2ZWxvcCB0b29scyB0aGF0IGludGVncmF0ZSB3aXRoIG90aGVyIHBlb3BsZSdzIHRvb2xzIHNvDQorc2VhbWxlc3NseSB5b3Ugd29uJ3Qga25vdyB3aGVyZSBvbmUgdG9vbCBlbmRzIGFuZCBhbm90aGVyIHN0YXJ0cy4gVGhlIElCTQ0KK3N1cHBvcnRlZCB2ZXJzaW9uIG9mIHRoaXMgdGVjaG5vbG9neSwgV2ViU3BoZXJlIFN0dWRpbyBXb3JrYmVuY2gsIHdpbGwgYmUNCit0aGUgY29yZSBvZiB0aGUgbmV4dCAgZ2VuZXJhdGlvbiBvZiBJQk0gYW5kIElCTSBCdXNpbmVzcyBQYXJ0bmVyIGUtYnVzaW5lc3MNCit0b29scyBvcHRpbWl6ZWQgZm9yICB0aGUgV2ViU3BoZXJlIHNvZnR3YXJlIHBsYXRmb3JtLjxicj4NCis8YnI+DQorPGJyPg0KKzxicj4NCisgICAgICBTbyB3aGF0J3MgbmV4dD88YnI+DQorICAgIE9USSBjb250aW51ZXMgdG8gZGVsaXZlciBvYmplY3Qtb3JpZW50ZWQgdGVjaG5vbG9neSB0aGF0IHNjYWxlcyBhY3Jvc3MNCisgcGxhdGZvcm1zLCAgYWNyb3NzIHRlYW1zIGFuZCBhY3Jvc3MgcHJvamVjdCBzaXplLiBGcm9tIGEgbWFpbmZyYW1lIHRvIGENCit3YXRjaCAgLSB3ZSdyZSAgY2xvc2luZyBpbiBvbiB0aGF0IHZpc2lvbi48YnI+DQorPGJyPg0KKzxpbWcgc3JjPSJpbWcvd2VsX21sLmpwZyIgd2lkdGg9IjQ2MCIgaGVpZ2h0PSI0NjAiIGFsdD0iIj4NCis8YnI+DQorPGJyPg0KKzxicj4NCis8YnI+DQorPGJyPg0KKzxicj4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGUgd2l0aCBzcGFjZS9pbnN0YWxsL2ZlYXR1cmVzIHNwYWNlL2ZlYXR1cmUzL2ZlYXR1cmUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZSB3aXRoIHNwYWNlL2luc3RhbGwvZmVhdHVyZXMgc3BhY2UvZmVhdHVyZTMvZmVhdHVyZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNiODlmYwotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGUgd2l0aCBzcGFjZS9pbnN0YWxsL2ZlYXR1cmVzIHNwYWNlL2ZlYXR1cmUzL2ZlYXR1cmUueG1sCkBAIC0wLDAgKzEsMTIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTMiIGltYWdlPSJmZWF0dXJlMS5naWYiIGxhYmVsPSJUaGlyZCBGZWF0dXJlIiBwcm92aWRlci1uYW1lPSJTbWFydCBDb21wYW55IiB2ZXJzaW9uPSIxLjAuMCIgPgorICA8ZGVzY3JpcHRpb24+RGVzY3JpcHRpb248L2Rlc2NyaXB0aW9uPgorICA8Y29weXJpZ2h0PmNvcHlyaWdodDwvY29weXJpZ2h0PgorICA8bGljZW5zZT5saWNlbnNlPC9saWNlbnNlPgorICA8dXJsPgorICAgIDx1cGRhdGUgbGFiZWw9IlVSTCB0byB1cGRhdGUgdGhlIGZlYXR1cmUiIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9wYXRoL2ZlYXR1cmUxLyIvPgorICAgIDxkaXNjb3ZlcnkgbGFiZWw9IkRpc2NvdmVyeSAxIiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciLz4KKyAgICA8ZGlzY292ZXJ5IGxhYmVsPSJEaXNjb3ZlcnkgMiIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIi8+CisgIDwvdXJsPgorICA8cGx1Z2luIGRvd25sb2FkLXNpemU9IjE1MDAiIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMSIgaW5zdGFsbC1zaXplPSIxMDAwIiBmcmFnbWVudD0iZmFsc2UiIG5sPSJlbixmciIgb3M9IldJTjMyLExJTlVYLEhQVVgsTUFDT1NYIiB2ZXJzaW9uPSIxLjEuMSIgd3M9IldJTjMyLE1PVElGLEdUSyxDQVJCT04sQ09DT0EiLz4KKzwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGUgd2l0aCBzcGFjZS9wbHVnaW5zIHNwYWNlL1BkZV9jb3JlLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGUgd2l0aCBzcGFjZS9wbHVnaW5zIHNwYWNlL1BkZV9jb3JlLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTA3MjE3Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZSB3aXRoIHNwYWNlL3BsdWdpbnMgc3BhY2UvUGRlX2NvcmUuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGUgd2l0aCBzcGFjZS9wbHVnaW5zIHNwYWNlL2hlbHAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZSB3aXRoIHNwYWNlL3BsdWdpbnMgc3BhY2UvaGVscC5qYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU4NGY2NgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGUgd2l0aCBzcGFjZS9wbHVnaW5zIHNwYWNlL2hlbHAuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGUgd2l0aCBzcGFjZS9wbHVnaW5zIHNwYWNlL2p1bml0XzMuNy5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlIHdpdGggc3BhY2UvcGx1Z2lucyBzcGFjZS9qdW5pdF8zLjcuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3NTg3YjIKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlIHdpdGggc3BhY2UvcGx1Z2lucyBzcGFjZS9qdW5pdF8zLjcuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGUgd2l0aCBzcGFjZS9wbHVnaW5zIHNwYWNlL29yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xL3BsdWdpbi54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlIHdpdGggc3BhY2UvcGx1Z2lucyBzcGFjZS9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMS9wbHVnaW4ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMTg0NmMKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlIHdpdGggc3BhY2UvcGx1Z2lucyBzcGFjZS9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMS9wbHVnaW4ueG1sCkBAIC0wLDAgKzEsOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxwbHVnaW4gbmFtZT0iSlVuaXQgVGVzdCBGcmFtZXdvcmsiIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4xIiB2ZXJzaW9uPSIzLjUuNiIgdmVuZG9yLW5hbWU9Imp1bml0Lm9yZyI+CisgIDxydW50aW1lPgorICAgIDxsaWJyYXJ5IG5hbWU9Imp1bml0LmphciI+CisgICAgICA8ZXhwb3J0IG5hbWU9IioiLz4KKyAgICA8L2xpYnJhcnk+CisgIDwvcnVudGltZT4KKzwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGUgd2l0aCBzcGFjZS9wbHVnaW5zIHNwYWNlL29yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xL3NyYy5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlIHdpdGggc3BhY2UvcGx1Z2lucyBzcGFjZS9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMS9zcmMuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkNGQ2MDkKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlIHdpdGggc3BhY2UvcGx1Z2lucyBzcGFjZS9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMS9zcmMuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGUgd2l0aCBzcGFjZS9zaXRlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGUgd2l0aCBzcGFjZS9zaXRlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDkyOGZiCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZSB3aXRoIHNwYWNlL3NpdGUueG1sCkBAIC0wLDAgKzEsMjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQorPHNpdGUgdHlwZT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmlsZSI+DQorPGRlc2NyaXB0aW9uIHVybD0iaW5mby9zaXRlSW5mby5odG1sIi8+DQorICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzIHNwYWNlL2hlbHBGZWF0dXJlLmphciIgdHlwZT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUucGFja2FnZWQiPg0KKyAgICA8Y2F0ZWdvcnkgbmFtZT0iZWNsaXBzZS9VTUwiLz4NCisgIDwvZmVhdHVyZT4NCisgIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMgc3BhY2Uvc3BhY2UgZmVhdHVyZS5qYXIiIHR5cGU9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnBhY2thZ2VkIj4NCisgICAgPGNhdGVnb3J5IG5hbWU9ImVjbGlwc2UvSjJFRSIvPg0KKyAgPC9mZWF0dXJlPg0KKyAgPGZlYXR1cmUgdXJsPSJpbnN0YWxsL2ZlYXR1cmVzIHNwYWNlL2ZlYXR1cmUzLyI+DQorICAgIDxjYXRlZ29yeSBuYW1lPSJlY2xpcHNlIi8+DQorICA8L2ZlYXR1cmU+DQorICA8YXJjaGl2ZSBwYXRoPSJwbHVnaW5zL29yZy5lY2xpcHNlLmhlbHBfMS4wLjAuamFyIiB1cmw9InBsdWdpbnMgc3BhY2UvaGVscC5qYXIiLz4NCisgIDxhcmNoaXZlIHBhdGg9InBsdWdpbnMvb3JnLmVjbGlwc2UucGRlLmNvcmVfMS4wLjAuamFyIiB1cmw9InBsdWdpbnMgc3BhY2UvUGRlX2NvcmUuamFyIi8+DQorICA8YXJjaGl2ZSBwYXRoPSJwbHVnaW5zL29yZy5qdW5pdF8zLjUuMC5qYXIiIHVybD0icGx1Z2lucyBzcGFjZS9qdW5pdF8zLjcuamFyIi8+DQorICA8YXJjaGl2ZSBwYXRoPSJwbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xLmphciIgdXJsPSJwbHVnaW5zIHNwYWNlL29yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xIi8+ICANCisgIDxjYXRlZ29yeS1kZWYgbGFiZWw9IklCTSBXU0FEIFRvb2xzIiBuYW1lPSJlY2xpcHNlIi8+DQorICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJKMkVFIHRvb2xzIiBuYW1lPSJlY2xpcHNlL0oyRUUiLz4NCisgIDxjYXRlZ29yeS1kZWYgbGFiZWw9IkVKQiBUb29scyIgbmFtZT0iZWNsaXBzZS9KMkVFL0VKQiIvPg0KKyAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iVU1MIHRvb2xzIiBuYW1lPSJlY2xpcHNlL1VNTCIvPg0KKyAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iTWVzc2FnaW5nIFRvb2xzIiBuYW1lPSJCMkIiLz4gIA0KKzwvc2l0ZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlVHlwZUV4YW1wbGVzL3NpdGUxL2ZlYXR1cmVzL2ZlYXR1cmUzL2ZlYXR1cmVzMi5qYXJmaWxlIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZVR5cGVFeGFtcGxlcy9zaXRlMS9mZWF0dXJlcy9mZWF0dXJlMy9mZWF0dXJlczIuamFyZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDBhYjRmCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZVR5cGVFeGFtcGxlcy9zaXRlMS9mZWF0dXJlcy9mZWF0dXJlMy9mZWF0dXJlczIuamFyZmlsZQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlVHlwZUV4YW1wbGVzL3NpdGUxL3NpdGUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZVR5cGVFeGFtcGxlcy9zaXRlMS9zaXRlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjcxNjVhCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZVR5cGVFeGFtcGxlcy9zaXRlMS9zaXRlLnhtbApAQCAtMCwwICsxLDQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQorPHNpdGUgdHlwZT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuaHR0cCI+DQorICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL2ZlYXR1cmUzL2ZlYXR1cmVzMi5qYXJmaWxlIi8+DQorPC9zaXRlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGVVUkxUZXN0L2RhdGEvYXJ0aWZhY3RzL2ZlYXR1cmVzL2hlbHBGZWF0dXJlLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGVVUkxUZXN0L2RhdGEvYXJ0aWZhY3RzL2ZlYXR1cmVzL2hlbHBGZWF0dXJlLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODA5NzEzCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZVVSTFRlc3QvZGF0YS9hcnRpZmFjdHMvZmVhdHVyZXMvaGVscEZlYXR1cmUuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGVVUkxUZXN0L2RhdGEvYXJ0aWZhY3RzL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBkZS5mZWF0dXJlXzEuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGVVUkxUZXN0L2RhdGEvYXJ0aWZhY3RzL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBkZS5mZWF0dXJlXzEuMC4wLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTkyYzFkCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZVVSTFRlc3QvZGF0YS9hcnRpZmFjdHMvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGRlLmZlYXR1cmVfMS4wLjAuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGVVUkxUZXN0L2RhdGEvYXJ0aWZhY3RzL3BsdWdpbnMvUGRlX2NvcmUuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZVVSTFRlc3QvZGF0YS9hcnRpZmFjdHMvcGx1Z2lucy9QZGVfY29yZS5qYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjEwNzIxNwotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGVVUkxUZXN0L2RhdGEvYXJ0aWZhY3RzL3BsdWdpbnMvUGRlX2NvcmUuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGVVUkxUZXN0L2RhdGEvYXJ0aWZhY3RzL3BsdWdpbnMvaGVscC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlVVJMVGVzdC9kYXRhL2FydGlmYWN0cy9wbHVnaW5zL2hlbHAuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1ODRmNjYKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlVVJMVGVzdC9kYXRhL2FydGlmYWN0cy9wbHVnaW5zL2hlbHAuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGVVUkxUZXN0L2RhdGEvYXJ0aWZhY3RzL3BsdWdpbnMvanVuaXRfMy43LmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGVVUkxUZXN0L2RhdGEvYXJ0aWZhY3RzL3BsdWdpbnMvanVuaXRfMy43LmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzU4N2IyCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZVVSTFRlc3QvZGF0YS9hcnRpZmFjdHMvcGx1Z2lucy9qdW5pdF8zLjcuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGVVUkxUZXN0L2RhdGEvaW5mby9pbWcvdG9wX3RpdGxzbS5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlVVJMVGVzdC9kYXRhL2luZm8vaW1nL3RvcF90aXRsc20uZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MTdiYjYKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlVVJMVGVzdC9kYXRhL2luZm8vaW1nL3RvcF90aXRsc20uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGVVUkxUZXN0L2RhdGEvaW5mby9pbWcvd2VsX21sLmpwZyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGVVUkxUZXN0L2RhdGEvaW5mby9pbWcvd2VsX21sLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWUzM2RmCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZVVSTFRlc3QvZGF0YS9pbmZvL2ltZy93ZWxfbWwuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGVVUkxUZXN0L2RhdGEvaW5mby9zaXRlSW5mby5odG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZVVSTFRlc3QvZGF0YS9pbmZvL3NpdGVJbmZvLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA2NWFhMwotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGVVUkxUZXN0L2RhdGEvaW5mby9zaXRlSW5mby5odG1sCkBAIC0wLDAgKzEsNjMgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPg0KKzxoZWFkPg0KKzwvaGVhZD4NCisgIDxib2R5Pg0KKzxpbWcgc3JjPSJpbWcvdG9wX3RpdGxzbS5naWYiIGFsdD0iIiB3aWR0aD0iNDYwIiBoZWlnaHQ9IjUwIj4NCis8YnI+DQorPGJyPg0KKyAgICAgSXQgc3RhcnRlZCB3aXRoIFNtYWxsdGFsazxicj4NCisgICAgT1RJIGhhcyBiZWVuIGJ1aWxkaW5nIHRvb2xzIGZvciBwbGF0Zm9ybS1pbmRlcGVuZGVudCBPTyBkZXZlbG9wbWVudCBzaW5jZQ0KKyAgMTk4OC4gT3VyIEVOVlkmcmVnOyB0ZWNobm9sb2d5IGZpcnN0IGJyb3VnaHQgY29sbGFib3JhdGl2ZSBzb2Z0d2FyZSBkZXZlbG9wbWVudCwNCisgIHZlcnNpb24gbWFuYWdlbWVudCBhbmQgc2hhcmVkIHJlcG9zaXRvcmllcyB0byBTbWFsbHRhbGsuIElCTSBpcyBvbmUgb2YNCittYW55ICAgY29tcGFuaWVzIHRvIGxpY2Vuc2UgRU5WWSwgd2hpY2ggY29udGludWVzIHRvIGJlIHRoZSBmb3VuZGF0aW9uIG9mDQorVmlzdWFsQWdlJnJlZzsgICBTbWFsbHRhbGsuPGJyPg0KKzxicj4NCis8YnI+DQorPGJyPg0KKyAgICAgIE5leHQgY2FtZSBKYXZhJiM4NDgyOzxicj4NCisgICAgQmVjYXVzZSBvZiBvdXIgZXhwZXJ0aXNlIGluIE9PIHRlY2hub2xvZ3ksIElCTSB0dXJuZWQgdG8gT1RJIGZvciBhIG5leHQtZ2VuZXJhdGlvbg0KKyAgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgZm9yIEphdmEuIFRoZSByZXN1bHQgaXMgVmlzdWFsQWdlIGZvciBKYXZhLCB3aGljaA0KKyAgY29udGludWVzIHRvIHdpbiBhd2FyZHMgZm9yIGl0cyBpbm5vdmF0aXZlIElERSBhbmQgdGVhbSBzdXBwb3J0LiBJbmZvV29ybGQNCisgIGhhcyBjaG9zZW4gVmlzdWFsQWdlIGZvciBKYXZhIGFzIGRldmVsb3BtZW50IHRvb2wgb2YgdGhlIHllYXIgLSB5ZWFyIGFmdGVyDQorICB5ZWFyIGFmdGVyIHllYXIhPGJyPg0KKzxicj4NCis8YnI+DQorPGJyPg0KKyAgICAgIFRoZW4gcGVydmFzaXZlIGNvbXB1dGluZzxicj4NCisgICAgT1RJIGNvbnRpbnVlcyBpdHMgZGV2ZWxvcG1lbnQgb2YgSUJNJ3MgVmlzdWFsQWdlIE1pY3JvIEVkaXRpb24sIGEgc3RhdGUtb2YtdGhlLWFydA0KKyAgcGxhdGZvcm0gZm9yIGNvbGxhYm9yYXRpdmUgZGV2ZWxvcG1lbnQgb2YgZW1iZWRkZWQgYXBwbGljYXRpb25zIGFuZCBzeXN0ZW1zDQorICB0aGF0IGFyZSB2ZXJ5IGxlYW4uIEFzIHRoZSBzdGVhZHkgc3RyZWFtIG9mIHByZXNzIHJlbGVhc2VzIGF0dGVzdHMsIFZpc3VhbEFnZQ0KKyAgTWljcm8gRWRpdGlvbiBpcyBhbHJlYWR5IGxpY2Vuc2VkIHRvIHRoZSBsZWFkaW5nIG1pY3JvY2hpcCBtYW51ZmFjdHVyZXJzLA0KKyAgbWljcm9rZXJuZWwgZGV2ZWxvcGVycywgYW5kIHByb2R1Y2VycyBvZiBoYW5kaGVsZCBhbmQgY29uc3VtZXIgZGV2aWNlcy48YnI+DQorPGJyPg0KKzxicj4NCis8YnI+DQorICAgICAgTm93IGl0J3MgRWNsaXBzZTxicj4NCisgICAgT1RJIGhhcyBidWlsdCB0aGUgbmV4dCBnZW5lcmF0aW9uIElCTSBhcHBsaWNhdGlvbiBkZXZlbG9wbWVudCB0b29scyBwbGF0Zm9ybS4NCisgIEVjbGlwc2UgaXMgYSBraW5kIG9mIHVuaXZlcnNhbCB0b29sIHBsYXRmb3JtIC0gYW4gb3BlbiBleHRlbnNpYmxlIElERSBmb3INCisgIGFueXRoaW5nIGFuZCBub3RoaW5nIGluIHBhcnRpY3VsYXIuIFRoZSByZWFsIHZhbHVlIGNvbWVzIGZyb20gdG9vbCBwbHVnLWlucw0KKyAgdGhhdCAidGVhY2giIEVjbGlwc2UgaG93IHRvIHdvcmsgd2l0aCB0aGluZ3MgLSBqYXZhIGZpbGVzLCB3ZWIgY29udGVudCwNCitncmFwaGljcywgIHZpZGVvIC0gYWxtb3N0IGFueXRoaW5nIHlvdSBjYW4gaW1hZ2luZS4gRWNsaXBzZSBhbGxvd3MgeW91IHRvDQoraW5kZXBlbmRlbnRseSAgZGV2ZWxvcCB0b29scyB0aGF0IGludGVncmF0ZSB3aXRoIG90aGVyIHBlb3BsZSdzIHRvb2xzIHNvDQorc2VhbWxlc3NseSB5b3Ugd29uJ3Qga25vdyB3aGVyZSBvbmUgdG9vbCBlbmRzIGFuZCBhbm90aGVyIHN0YXJ0cy4gVGhlIElCTQ0KK3N1cHBvcnRlZCB2ZXJzaW9uIG9mIHRoaXMgdGVjaG5vbG9neSwgV2ViU3BoZXJlIFN0dWRpbyBXb3JrYmVuY2gsIHdpbGwgYmUNCit0aGUgY29yZSBvZiB0aGUgbmV4dCAgZ2VuZXJhdGlvbiBvZiBJQk0gYW5kIElCTSBCdXNpbmVzcyBQYXJ0bmVyIGUtYnVzaW5lc3MNCit0b29scyBvcHRpbWl6ZWQgZm9yICB0aGUgV2ViU3BoZXJlIHNvZnR3YXJlIHBsYXRmb3JtLjxicj4NCis8YnI+DQorPGJyPg0KKzxicj4NCisgICAgICBTbyB3aGF0J3MgbmV4dD88YnI+DQorICAgIE9USSBjb250aW51ZXMgdG8gZGVsaXZlciBvYmplY3Qtb3JpZW50ZWQgdGVjaG5vbG9neSB0aGF0IHNjYWxlcyBhY3Jvc3MNCisgcGxhdGZvcm1zLCAgYWNyb3NzIHRlYW1zIGFuZCBhY3Jvc3MgcHJvamVjdCBzaXplLiBGcm9tIGEgbWFpbmZyYW1lIHRvIGENCit3YXRjaCAgLSB3ZSdyZSAgY2xvc2luZyBpbiBvbiB0aGF0IHZpc2lvbi48YnI+DQorPGJyPg0KKzxpbWcgc3JjPSJpbWcvd2VsX21sLmpwZyIgd2lkdGg9IjQ2MCIgaGVpZ2h0PSI0NjAiIGFsdD0iIj4NCis8YnI+DQorPGJyPg0KKzxicj4NCis8YnI+DQorPGJyPg0KKzxicj4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGVVUkxUZXN0L2RhdGEvc2l0ZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlVVJMVGVzdC9kYXRhL3NpdGUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzZWE2ODQKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlVVJMVGVzdC9kYXRhL3NpdGUueG1sCkBAIC0wLDAgKzEsMTggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8c2l0ZSB1cmwgPSAiYXJ0aWZhY3RzLyI+Cis8ZGVzY3JpcHRpb24gdXJsPSJpbmZvL3NpdGVJbmZvLmh0bWwiLz4KKyAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9oZWxwRmVhdHVyZS5qYXIiIHR5cGU9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnBhY2thZ2VkIj4KKyAgICA8Y2F0ZWdvcnkgbmFtZT0iZWNsaXBzZS9VTUwiLz4KKyAgPC9mZWF0dXJlPgorICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnBkZS5mZWF0dXJlXzEuMC4wLmphciIgdHlwZT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUucGFja2FnZWQiPgorICAgIDxjYXRlZ29yeSBuYW1lPSJlY2xpcHNlL0oyRUUiLz4KKyAgPC9mZWF0dXJlPgorICA8YXJjaGl2ZSBwYXRoPSJwbHVnaW5zL29yZy5lY2xpcHNlLmhlbHBfMS4wLjAuamFyIiB1cmw9InBsdWdpbnMvaGVscC5qYXIiLz4KKyAgPGFyY2hpdmUgcGF0aD0icGx1Z2lucy9vcmcuZWNsaXBzZS5wZGUuY29yZV8xLjAuMC5qYXIiIHVybD0icGx1Z2lucy9QZGVfY29yZS5qYXIiLz4KKyAgPGFyY2hpdmUgcGF0aD0icGx1Z2lucy9vcmcuanVuaXRfMy41LjAuamFyIiB1cmw9InBsdWdpbnMvanVuaXRfMy43LmphciIvPgorICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJJQk0gV1NBRCBUb29scyIgbmFtZT0iZWNsaXBzZSIvPgorICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJKMkVFIHRvb2xzIiBuYW1lPSJlY2xpcHNlL0oyRUUiLz4KKyAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iRUpCIFRvb2xzIiBuYW1lPSJlY2xpcHNlL0oyRUUvRUpCIi8+CisgIDxjYXRlZ29yeS1kZWYgbGFiZWw9IlVNTCB0b29scyIgbmFtZT0iZWNsaXBzZS9VTUwiLz4KKyAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iTWVzc2FnaW5nIFRvb2xzIiBuYW1lPSJCMkIiLz4gIAorPC9zaXRlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL2RhdGFFbnRyeVNpdGVUZXN0L3NpdGUxL2ZpbGUxLnppcCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL2RhdGFFbnRyeVNpdGVUZXN0L3NpdGUxL2ZpbGUxLnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTcwYjdlCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvZGF0YUVudHJ5U2l0ZVRlc3Qvc2l0ZTEvZmlsZTEuemlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL2RhdGFFbnRyeVNpdGVUZXN0L3NpdGUxL2luc3RhbGwvZmVhdHVyZXMvZmVhdHVyZTMvZmVhdHVyZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9kYXRhRW50cnlTaXRlVGVzdC9zaXRlMS9pbnN0YWxsL2ZlYXR1cmVzL2ZlYXR1cmUzL2ZlYXR1cmUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiNDU0ZWMKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9kYXRhRW50cnlTaXRlVGVzdC9zaXRlMS9pbnN0YWxsL2ZlYXR1cmVzL2ZlYXR1cmUzL2ZlYXR1cmUueG1sCkBAIC0wLDAgKzEsNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCis8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTMiIGltYWdlPSJmZWF0dXJlMS5naWYiIGxhYmVsPSJUaGlyZCBGZWF0dXJlIiBwcm92aWRlci1uYW1lPSJTbWFydCBDb21wYW55IiB2ZXJzaW9uPSIxLjAuMCI+DQorCTxpbnN0YWxsLWhhbmRsZXIgaGFuZGxlcj0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuRGVmYXVsdEluc3RhbGxIYW5kbGVyIi8+DQorICAJPGRhdGEgZG93bmxvYWQtc2l6ZT0iMTUwMCIgaWQ9ImZpbGUuemlwIiBpbnN0YWxsLXNpemU9IjEwMDAiLz4NCis8L2ZlYXR1cmU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvZGF0YUVudHJ5U2l0ZVRlc3Qvc2l0ZTEvc2l0ZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9kYXRhRW50cnlTaXRlVGVzdC9zaXRlMS9zaXRlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDFmMjFkCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvZGF0YUVudHJ5U2l0ZVRlc3Qvc2l0ZTEvc2l0ZS54bWwKQEAgLTAsMCArMSw3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KKzxzaXRlIHR5cGU9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZpbGUiPg0KKzxkZXNjcmlwdGlvbiB1cmw9ImluZm8vc2l0ZUluZm8uaHRtbCIvPg0KKyAgPGZlYXR1cmUgdXJsPSJpbnN0YWxsL2ZlYXR1cmVzL2ZlYXR1cmUzIj4NCisgIDwvZmVhdHVyZT4NCisgIDxhcmNoaXZlIHBhdGg9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUzXzEuMC4wL2ZpbGUuemlwIiB1cmw9ImZpbGUxLnppcCIvPg0KKzwvc2l0ZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9kYXRhRW50cnlTaXRlVGVzdC9zaXRlMi9mZWF0dXJlcy9mZWF0dXJlczMuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvZGF0YUVudHJ5U2l0ZVRlc3Qvc2l0ZTIvZmVhdHVyZXMvZmVhdHVyZXMzLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGM2ZWNhCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvZGF0YUVudHJ5U2l0ZVRlc3Qvc2l0ZTIvZmVhdHVyZXMvZmVhdHVyZXMzLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9kYXRhRW50cnlTaXRlVGVzdC9zaXRlMi9ub24gZGF0YS9hbm90aGVyIGZpbGUuemlwIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvZGF0YUVudHJ5U2l0ZVRlc3Qvc2l0ZTIvbm9uIGRhdGEvYW5vdGhlciBmaWxlLnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTcwYjdlCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvZGF0YUVudHJ5U2l0ZVRlc3Qvc2l0ZTIvbm9uIGRhdGEvYW5vdGhlciBmaWxlLnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9kYXRhRW50cnlTaXRlVGVzdC9zaXRlMi9zaXRlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL2RhdGFFbnRyeVNpdGVUZXN0L3NpdGUyL3NpdGUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0MDk0M2MKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9kYXRhRW50cnlTaXRlVGVzdC9zaXRlMi9zaXRlLnhtbApAQCAtMCwwICsxLDcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQorPHNpdGUgdHlwZT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmlsZSI+DQorPGRlc2NyaXB0aW9uIHVybD0iaW5mby9zaXRlSW5mby5odG1sIi8+DQorICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL2ZlYXR1cmVzMy5qYXIiIHR5cGU9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnBhY2thZ2VkIj4NCisgIDwvZmVhdHVyZT4NCisgIDxhcmNoaXZlIHBhdGg9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUzXzEuMC4wL2ZpbGUuemlwIiB1cmw9Im5vbiBkYXRhL2Fub3RoZXIgZmlsZS56aXAiLz4NCis8L3NpdGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvZmVhdHVyZXMvZmVhdHVyZXMyLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL2ZlYXR1cmVzL2ZlYXR1cmVzMi5qYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThkMDA0ZAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL2ZlYXR1cmVzL2ZlYXR1cmVzMi5qYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UudGVzdC5mZWF0dXJlXzEuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnRlc3QuZmVhdHVyZV8xLjAuMC5qYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODcwYTcwZAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnRlc3QuZmVhdHVyZV8xLjAuMC5qYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTFfMS4wLjQuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTFfMS4wLjQuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxYzcxNTMKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9mZWF0dXJlcy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMV8xLjAuNC5qYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvZmVhdHVyZXMvb3JnLmVjbGlwc2VfdGVzdF9mZWF0dXJlLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL2ZlYXR1cmVzL29yZy5lY2xpcHNlX3Rlc3RfZmVhdHVyZS5qYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM4ZGRjNAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL2ZlYXR1cmVzL29yZy5lY2xpcHNlX3Rlc3RfZmVhdHVyZS5qYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTEvLnByb2plY3QgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMS8ucHJvamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDUyMDY5Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTEvLnByb2plY3QKQEAgLTAsMCArMSwxNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxwcm9qZWN0RGVzY3JpcHRpb24+CisJPG5hbWU+dXBkYXRlLXNpdGUxPC9uYW1lPgorCTxjb21tZW50PjwvY29tbWVudD4KKwk8cHJvamVjdHM+CisJPC9wcm9qZWN0cz4KKwk8YnVpbGRTcGVjPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlVwZGF0ZVNpdGVCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwk8L2J1aWxkU3BlYz4KKwk8bmF0dXJlcz4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuVXBkYXRlU2l0ZU5hdHVyZTwvbmF0dXJlPgorCTwvbmF0dXJlcz4KKzwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTEvLnNpdGVidWlsZC9idWlsZC5sb2cgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMS8uc2l0ZWJ1aWxkL2J1aWxkLmxvZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmNlMTk0Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTEvLnNpdGVidWlsZC9idWlsZC5sb2cKQEAgLTAsMCArMSwzMTggQEAKK1RhcmdldCBzdGFydGVkOiBpbml0DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQorVGFyZ2V0IHN0YXJ0ZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCitUYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCitUYXJnZXQgc3RhcnRlZDogaW5pdA0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1RhcmdldCBmaW5pc2hlZDogaW5pdA0KK1RhcmdldCBzdGFydGVkOiBhbGwuZmVhdHVyZXMNCitUYXJnZXQgZmluaXNoZWQ6IGFsbC5mZWF0dXJlcw0KK1RhcmdldCBzdGFydGVkOiBhbGwucGx1Z2lucw0KK1Rhc2sgc3RhcnRlZDogYW50DQorVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCitUYXJnZXQgc3RhcnRlZDogaW5pdA0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1RhcmdldCBmaW5pc2hlZDogaW5pdA0KK1RhcmdldCBzdGFydGVkOiBidWlsZC51cGRhdGUuamFyDQorVGFzayBzdGFydGVkOiBkZWxldGUNCitUYXNrIGZpbmlzaGVkOiBkZWxldGUNCitUYXNrIHN0YXJ0ZWQ6IG1rZGlyDQorVGFzayBmaW5pc2hlZDogbWtkaXINCitUYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCitUYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1RhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KK1RhcmdldCBzdGFydGVkOiBpbml0DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQorVGFyZ2V0IHN0YXJ0ZWQ6IGJ1aWxkLmphcnMNCitUYXNrIHN0YXJ0ZWQ6IGF2YWlsYWJsZQ0KK1Rhc2sgZmluaXNoZWQ6IGF2YWlsYWJsZQ0KK1Rhc2sgc3RhcnRlZDogYW50Y2FsbA0KK1RhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQorVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXJnZXQgZmluaXNoZWQ6IGluaXQNCitUYXJnZXQgc3RhcnRlZDogcGx1Z2luMy5qYXINCitUYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KK1Rhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KK1Rhc2sgc3RhcnRlZDogbWtkaXINCitUYXNrIGZpbmlzaGVkOiBta2Rpcg0KK1Rhc2sgc3RhcnRlZDogamF2YWMNCitNZXNzYWdlIGxvZ2dlZDogQ29tcGlsZSBmYWlsZWQ7IHNlZSB0aGUgY29tcGlsZXIgZXJyb3Igb3V0cHV0IGZvciBkZXRhaWxzLg0KK1Rhc2sgZmluaXNoZWQ6IGphdmFjDQorVGFzayBzdGFydGVkOiBjb3B5DQorVGFzayBmaW5pc2hlZDogY29weQ0KK1Rhc2sgc3RhcnRlZDogbWtkaXINCitUYXNrIGZpbmlzaGVkOiBta2Rpcg0KK1Rhc2sgc3RhcnRlZDogamFyDQorVGFzayBmaW5pc2hlZDogamFyDQorVGFzayBzdGFydGVkOiBkZWxldGUNCitUYXNrIGZpbmlzaGVkOiBkZWxldGUNCitUYXJnZXQgZmluaXNoZWQ6IHBsdWdpbjMuamFyDQorVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KK1RhcmdldCBmaW5pc2hlZDogYnVpbGQuamFycw0KK1Rhc2sgZmluaXNoZWQ6IGFudGNhbGwNCitUYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCitUYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1RhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KK1RhcmdldCBzdGFydGVkOiBpbml0DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQorVGFyZ2V0IHN0YXJ0ZWQ6IGdhdGhlci5iaW4ucGFydHMNCitUYXNrIHN0YXJ0ZWQ6IG1rZGlyDQorVGFzayBmaW5pc2hlZDogbWtkaXINCitUYXNrIHN0YXJ0ZWQ6IGNvcHkNCitUYXNrIGZpbmlzaGVkOiBjb3B5DQorVGFzayBzdGFydGVkOiBjb3B5DQorVGFzayBmaW5pc2hlZDogY29weQ0KK1RhcmdldCBmaW5pc2hlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KK1Rhc2sgZmluaXNoZWQ6IGFudGNhbGwNCitUYXNrIHN0YXJ0ZWQ6IHppcA0KK1Rhc2sgZmluaXNoZWQ6IHppcA0KK1Rhc2sgc3RhcnRlZDogZGVsZXRlDQorVGFzayBmaW5pc2hlZDogZGVsZXRlDQorVGFyZ2V0IGZpbmlzaGVkOiBidWlsZC51cGRhdGUuamFyDQorVGFzayBmaW5pc2hlZDogYW50DQorVGFzayBzdGFydGVkOiBhbnQNCitUYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1RhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KK1RhcmdldCBzdGFydGVkOiBpbml0DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQorVGFyZ2V0IHN0YXJ0ZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCitUYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KK1Rhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KK1Rhc2sgc3RhcnRlZDogbWtkaXINCitUYXNrIGZpbmlzaGVkOiBta2Rpcg0KK1Rhc2sgc3RhcnRlZDogYW50Y2FsbA0KK1RhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQorVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXJnZXQgZmluaXNoZWQ6IGluaXQNCitUYXJnZXQgc3RhcnRlZDogYnVpbGQuamFycw0KK1Rhc2sgc3RhcnRlZDogYXZhaWxhYmxlDQorVGFzayBmaW5pc2hlZDogYXZhaWxhYmxlDQorVGFzayBzdGFydGVkOiBhbnRjYWxsDQorVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCitUYXJnZXQgc3RhcnRlZDogaW5pdA0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1RhcmdldCBmaW5pc2hlZDogaW5pdA0KK1RhcmdldCBzdGFydGVkOiBwbHVnaW40Lmphcg0KK1Rhc2sgc3RhcnRlZDogZGVsZXRlDQorVGFzayBmaW5pc2hlZDogZGVsZXRlDQorVGFzayBzdGFydGVkOiBta2Rpcg0KK1Rhc2sgZmluaXNoZWQ6IG1rZGlyDQorVGFzayBzdGFydGVkOiBqYXZhYw0KK01lc3NhZ2UgbG9nZ2VkOiBDb21waWxlIGZhaWxlZDsgc2VlIHRoZSBjb21waWxlciBlcnJvciBvdXRwdXQgZm9yIGRldGFpbHMuDQorVGFzayBmaW5pc2hlZDogamF2YWMNCitUYXNrIHN0YXJ0ZWQ6IGNvcHkNCitUYXNrIGZpbmlzaGVkOiBjb3B5DQorVGFzayBzdGFydGVkOiBta2Rpcg0KK1Rhc2sgZmluaXNoZWQ6IG1rZGlyDQorVGFzayBzdGFydGVkOiBqYXINCitUYXNrIGZpbmlzaGVkOiBqYXINCitUYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KK1Rhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KK1RhcmdldCBmaW5pc2hlZDogcGx1Z2luNC5qYXINCitUYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQorVGFyZ2V0IGZpbmlzaGVkOiBidWlsZC5qYXJzDQorVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KK1Rhc2sgc3RhcnRlZDogYW50Y2FsbA0KK1RhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQorVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXJnZXQgZmluaXNoZWQ6IGluaXQNCitUYXJnZXQgc3RhcnRlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KK1Rhc2sgc3RhcnRlZDogbWtkaXINCitUYXNrIGZpbmlzaGVkOiBta2Rpcg0KK1Rhc2sgc3RhcnRlZDogY29weQ0KK1Rhc2sgZmluaXNoZWQ6IGNvcHkNCitUYXNrIHN0YXJ0ZWQ6IGNvcHkNCitUYXNrIGZpbmlzaGVkOiBjb3B5DQorVGFyZ2V0IGZpbmlzaGVkOiBnYXRoZXIuYmluLnBhcnRzDQorVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KK1Rhc2sgc3RhcnRlZDogemlwDQorVGFzayBmaW5pc2hlZDogemlwDQorVGFzayBzdGFydGVkOiBkZWxldGUNCitUYXNrIGZpbmlzaGVkOiBkZWxldGUNCitUYXJnZXQgZmluaXNoZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCitUYXNrIGZpbmlzaGVkOiBhbnQNCitUYXJnZXQgZmluaXNoZWQ6IGFsbC5wbHVnaW5zDQorVGFyZ2V0IHN0YXJ0ZWQ6IHVwZGF0ZS5mZWF0dXJlDQorVGFyZ2V0IGZpbmlzaGVkOiB1cGRhdGUuZmVhdHVyZQ0KK1RhcmdldCBzdGFydGVkOiBhbGwuY2hpbGRyZW4NCitUYXJnZXQgZmluaXNoZWQ6IGFsbC5jaGlsZHJlbg0KK1Rhc2sgZmluaXNoZWQ6IGFudGNhbGwNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KK1Rhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KK1Rhc2sgc3RhcnRlZDogbWtkaXINCitUYXNrIGZpbmlzaGVkOiBta2Rpcg0KK1Rhc2sgc3RhcnRlZDogYW50Y2FsbA0KK1RhcmdldCBzdGFydGVkOiBpbml0DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQorVGFyZ2V0IHN0YXJ0ZWQ6IGdhdGhlci5iaW4ucGFydHMNCitUYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCitUYXJnZXQgc3RhcnRlZDogY2hpbGRyZW4NCitUYXJnZXQgZmluaXNoZWQ6IGNoaWxkcmVuDQorVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KK1Rhc2sgc3RhcnRlZDogbWtkaXINCitUYXNrIGZpbmlzaGVkOiBta2Rpcg0KK1Rhc2sgc3RhcnRlZDogY29weQ0KK1Rhc2sgZmluaXNoZWQ6IGNvcHkNCitUYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UuaWRSZXBsYWNlcg0KK1Rhc2sgZmluaXNoZWQ6IGVjbGlwc2UuaWRSZXBsYWNlcg0KK1Rhc2sgc3RhcnRlZDogYW50Y2FsbA0KK1RhcmdldCBzdGFydGVkOiBST09URklMRVMqXypfKg0KK1RhcmdldCBmaW5pc2hlZDogUk9PVEZJTEVTKl8qXyoNCitUYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQorVGFyZ2V0IGZpbmlzaGVkOiBnYXRoZXIuYmluLnBhcnRzDQorVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KK1Rhc2sgc3RhcnRlZDogamFyDQorVGFzayBmaW5pc2hlZDogamFyDQorVGFzayBzdGFydGVkOiBkZWxldGUNCitUYXNrIGZpbmlzaGVkOiBkZWxldGUNCitUYXJnZXQgZmluaXNoZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCitUYXJnZXQgc3RhcnRlZDogaW5pdA0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1RhcmdldCBmaW5pc2hlZDogaW5pdA0KK1RhcmdldCBzdGFydGVkOiByZWZyZXNoDQorVGFzayBzdGFydGVkOiBlY2xpcHNlLmNvbnZlcnRQYXRoDQorVGFzayBmaW5pc2hlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KK1Rhc2sgc3RhcnRlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCitNZXNzYWdlIGxvZ2dlZDogUHJvamVjdCAke3VwZGF0ZS5mZWF0dXJlM18xLjAuMH0gZG9lcyBub3QgZXhpc3QgYW5kIGNhbm5vdCBiZSByZWZyZXNoZWQuDQorVGFzayBmaW5pc2hlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCitUYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCitUYXJnZXQgc3RhcnRlZDogaW5pdA0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1RhcmdldCBmaW5pc2hlZDogaW5pdA0KK1RhcmdldCBzdGFydGVkOiBhbGwuZmVhdHVyZXMNCitUYXJnZXQgZmluaXNoZWQ6IGFsbC5mZWF0dXJlcw0KK1RhcmdldCBzdGFydGVkOiBhbGwucGx1Z2lucw0KK1Rhc2sgc3RhcnRlZDogYW50DQorVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCitUYXJnZXQgc3RhcnRlZDogaW5pdA0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1RhcmdldCBmaW5pc2hlZDogaW5pdA0KK1RhcmdldCBzdGFydGVkOiByZWZyZXNoDQorVGFzayBzdGFydGVkOiBlY2xpcHNlLmNvbnZlcnRQYXRoDQorVGFzayBmaW5pc2hlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KK1Rhc2sgc3RhcnRlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCitUYXNrIGZpbmlzaGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KK1RhcmdldCBmaW5pc2hlZDogcmVmcmVzaA0KK1Rhc2sgZmluaXNoZWQ6IGFudA0KK1Rhc2sgc3RhcnRlZDogYW50DQorVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCitUYXJnZXQgc3RhcnRlZDogaW5pdA0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1RhcmdldCBmaW5pc2hlZDogaW5pdA0KK1RhcmdldCBzdGFydGVkOiByZWZyZXNoDQorVGFzayBzdGFydGVkOiBlY2xpcHNlLmNvbnZlcnRQYXRoDQorVGFzayBmaW5pc2hlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KK1Rhc2sgc3RhcnRlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCitUYXNrIGZpbmlzaGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KK1RhcmdldCBmaW5pc2hlZDogcmVmcmVzaA0KK1Rhc2sgZmluaXNoZWQ6IGFudA0KK1RhcmdldCBmaW5pc2hlZDogYWxsLnBsdWdpbnMNCitUYXJnZXQgc3RhcnRlZDogdXBkYXRlLmZlYXR1cmUNCitUYXJnZXQgZmluaXNoZWQ6IHVwZGF0ZS5mZWF0dXJlDQorVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5jaGlsZHJlbg0KK1RhcmdldCBmaW5pc2hlZDogYWxsLmNoaWxkcmVuDQorVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KK1RhcmdldCBmaW5pc2hlZDogcmVmcmVzaA0KK0J1aWxkIGZpbmlzaGVkLg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUxLy5zaXRlYnVpbGQvc2l0ZWJ1aWxkLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUxLy5zaXRlYnVpbGQvc2l0ZWJ1aWxkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTcwMGI5Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTEvLnNpdGVidWlsZC9zaXRlYnVpbGQueG1sCkBAIC0wLDAgKzEsMTEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8c2l0ZS1idWlsZAorICAgICAgZmVhdHVyZS1sb2NhdGlvbj0iZmVhdHVyZXMiCisgICAgICBwbHVnaW4tbG9jYXRpb249InBsdWdpbnMiCisgICAgICBhdXRvYnVpbGQ9ImZhbHNlIgorICAgICAgc2NydWItb3V0cHV0PSJmYWxzZSIKKyAgICAgIHVzZS1jb25zb2xlPSJ0cnVlIj4KKyAgIDxmZWF0dXJlIGlkPSJ1cGRhdGUuZmVhdHVyZTEiIHZlcnNpb249IjEuMC4wIi8+CisgICA8ZmVhdHVyZSBpZD0idXBkYXRlLmZlYXR1cmUyIiB2ZXJzaW9uPSIxLjAuMCIvPgorICAgPGZlYXR1cmUgaWQ9InVwZGF0ZS5mZWF0dXJlMyIgdmVyc2lvbj0iMS4wLjAiLz4KKzwvc2l0ZS1idWlsZD4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUxL2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMV8xLjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMS9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTFfMS4wLjAuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4MTJiMGIKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMS9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTFfMS4wLjAuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUxL2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMl8xLjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMS9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTJfMS4wLjAuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiZjE3NTQKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMS9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTJfMS4wLjAuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUxL2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlM18xLjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMS9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTNfMS4wLjAuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2ODJhNjIKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMS9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTNfMS4wLjAuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUxL3BsdWdpbnMvY29tLnBsdWdpbjFfMS4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTEvcGx1Z2lucy9jb20ucGx1Z2luMV8xLjAuMC5qYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJiYzdmMwotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUxL3BsdWdpbnMvY29tLnBsdWdpbjFfMS4wLjAuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUxL3BsdWdpbnMvY29tLnBsdWdpbjJfMS4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTEvcGx1Z2lucy9jb20ucGx1Z2luMl8xLjAuMC5qYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ0MjU4MwotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUxL3BsdWdpbnMvY29tLnBsdWdpbjJfMS4wLjAuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUxL3BsdWdpbnMvY29tLnBsdWdpbjNfMS4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTEvcGx1Z2lucy9jb20ucGx1Z2luM18xLjAuMC5qYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE5NGU1MgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUxL3BsdWdpbnMvY29tLnBsdWdpbjNfMS4wLjAuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUxL3BsdWdpbnMvY29tLnBsdWdpbjRfMS4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTEvcGx1Z2lucy9jb20ucGx1Z2luNF8xLjAuMC5qYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhjY2EyOAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUxL3BsdWdpbnMvY29tLnBsdWdpbjRfMS4wLjAuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUxL3NpdGUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTEvc2l0ZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYzZjdiYgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUxL3NpdGUueG1sCkBAIC0wLDAgKzEsMjcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8c2l0ZT4KKyAgIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUxXzEuMC4wLmphciIgaWQ9InVwZGF0ZS5mZWF0dXJlMSIgdmVyc2lvbj0iMS4wLjAiPgorICAgICAgPGNhdGVnb3J5IG5hbWU9IlNpdGUxLUNhdGVnb3J5MSIvPgorICAgPC9mZWF0dXJlPgorICAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy91cGRhdGUuZmVhdHVyZTJfMS4wLjAuamFyIiBpZD0idXBkYXRlLmZlYXR1cmUyIiB2ZXJzaW9uPSIxLjAuMCI+CisgICAgICA8Y2F0ZWdvcnkgbmFtZT0iU2l0ZTEtQ2F0ZWdvcnkyIi8+CisgICA8L2ZlYXR1cmU+CisgICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlM18xLjAuMC5qYXIiIGlkPSJ1cGRhdGUuZmVhdHVyZTMiIHZlcnNpb249IjEuMC4wIj4KKyAgICAgIDxjYXRlZ29yeSBuYW1lPSJTaXRlMS1DYXRlZ29yeTMiLz4KKyAgIDwvZmVhdHVyZT4KKyAgIDxjYXRlZ29yeS1kZWYgbmFtZT0iU2l0ZTEtQ2F0ZWdvcnkxIiBsYWJlbD0iU2l0ZTEtQ2F0ZWdvcnkxLUxhYmVsIj4KKyAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgIGVjZXRlcmEuCisgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgPC9jYXRlZ29yeS1kZWY+CisgICA8Y2F0ZWdvcnktZGVmIG5hbWU9IlNpdGUxLUNhdGVnb3J5MiIgbGFiZWw9IlNpdGUxLUNhdGVnb3J5Mi1MYWJlbCI+CisgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICBlY2V0ZXJhLgorICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgIDwvY2F0ZWdvcnktZGVmPgorICAgPGNhdGVnb3J5LWRlZiBuYW1lPSJTaXRlMS1DYXRlZ29yeTMiIGxhYmVsPSJTaXRlMS1DYXRlZ29yeTMtTGFiZWwiPgorICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgZWNldGVyYS4KKyAgICAgIDwvZGVzY3JpcHRpb24+CisgICA8L2NhdGVnb3J5LWRlZj4KKzwvc2l0ZT4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUyLy5wcm9qZWN0IGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTIvLnByb2plY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRiNjg3ZQotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUyLy5wcm9qZWN0CkBAIC0wLDAgKzEsMTcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdERlc2NyaXB0aW9uPgorCTxuYW1lPnVwZGF0ZS1zaXRlMjwvbmFtZT4KKwk8Y29tbWVudD48L2NvbW1lbnQ+CisJPHByb2plY3RzPgorCTwvcHJvamVjdHM+CisJPGJ1aWxkU3BlYz4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5VcGRhdGVTaXRlQnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJPC9idWlsZFNwZWM+CisJPG5hdHVyZXM+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlVwZGF0ZVNpdGVOYXR1cmU8L25hdHVyZT4KKwk8L25hdHVyZXM+Cis8L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUyLy5zaXRlYnVpbGQvYnVpbGQubG9nIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTIvLnNpdGVidWlsZC9idWlsZC5sb2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk3Nzg1MAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUyLy5zaXRlYnVpbGQvYnVpbGQubG9nCkBAIC0wLDAgKzEsMjAzIEBACitUYXJnZXQgc3RhcnRlZDogaW5pdA0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1RhcmdldCBmaW5pc2hlZDogaW5pdA0KK1RhcmdldCBzdGFydGVkOiBidWlsZC51cGRhdGUuamFyDQorVGFzayBzdGFydGVkOiBhbnRjYWxsDQorVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXJnZXQgZmluaXNoZWQ6IGluaXQNCitUYXJnZXQgc3RhcnRlZDogYWxsLmZlYXR1cmVzDQorVGFyZ2V0IGZpbmlzaGVkOiBhbGwuZmVhdHVyZXMNCitUYXJnZXQgc3RhcnRlZDogYWxsLnBsdWdpbnMNCitUYXNrIHN0YXJ0ZWQ6IGFudA0KK1RhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQorVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXJnZXQgZmluaXNoZWQ6IGluaXQNCitUYXJnZXQgc3RhcnRlZDogYnVpbGQudXBkYXRlLmphcg0KK1Rhc2sgc3RhcnRlZDogZGVsZXRlDQorVGFzayBmaW5pc2hlZDogZGVsZXRlDQorVGFzayBzdGFydGVkOiBta2Rpcg0KK1Rhc2sgZmluaXNoZWQ6IG1rZGlyDQorVGFzayBzdGFydGVkOiBhbnRjYWxsDQorVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCitUYXJnZXQgc3RhcnRlZDogaW5pdA0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1RhcmdldCBmaW5pc2hlZDogaW5pdA0KK1RhcmdldCBzdGFydGVkOiBidWlsZC5qYXJzDQorVGFzayBzdGFydGVkOiBhdmFpbGFibGUNCitUYXNrIGZpbmlzaGVkOiBhdmFpbGFibGUNCitUYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCitUYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1RhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KK1RhcmdldCBzdGFydGVkOiBpbml0DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQorVGFyZ2V0IHN0YXJ0ZWQ6IHBsdWdpbjIuamFyDQorVGFzayBzdGFydGVkOiBkZWxldGUNCitUYXNrIGZpbmlzaGVkOiBkZWxldGUNCitUYXNrIHN0YXJ0ZWQ6IG1rZGlyDQorVGFzayBmaW5pc2hlZDogbWtkaXINCitUYXNrIHN0YXJ0ZWQ6IGphdmFjDQorTWVzc2FnZSBsb2dnZWQ6IENvbXBpbGUgZmFpbGVkOyBzZWUgdGhlIGNvbXBpbGVyIGVycm9yIG91dHB1dCBmb3IgZGV0YWlscy4NCitUYXNrIGZpbmlzaGVkOiBqYXZhYw0KK1Rhc2sgc3RhcnRlZDogY29weQ0KK1Rhc2sgZmluaXNoZWQ6IGNvcHkNCitUYXNrIHN0YXJ0ZWQ6IG1rZGlyDQorVGFzayBmaW5pc2hlZDogbWtkaXINCitUYXNrIHN0YXJ0ZWQ6IGphcg0KK1Rhc2sgZmluaXNoZWQ6IGphcg0KK1Rhc2sgc3RhcnRlZDogZGVsZXRlDQorVGFzayBmaW5pc2hlZDogZGVsZXRlDQorVGFyZ2V0IGZpbmlzaGVkOiBwbHVnaW4yLmphcg0KK1Rhc2sgZmluaXNoZWQ6IGFudGNhbGwNCitUYXJnZXQgZmluaXNoZWQ6IGJ1aWxkLmphcnMNCitUYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQorVGFzayBzdGFydGVkOiBhbnRjYWxsDQorVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCitUYXJnZXQgc3RhcnRlZDogaW5pdA0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1RhcmdldCBmaW5pc2hlZDogaW5pdA0KK1RhcmdldCBzdGFydGVkOiBnYXRoZXIuYmluLnBhcnRzDQorVGFzayBzdGFydGVkOiBta2Rpcg0KK1Rhc2sgZmluaXNoZWQ6IG1rZGlyDQorVGFzayBzdGFydGVkOiBjb3B5DQorVGFzayBmaW5pc2hlZDogY29weQ0KK1Rhc2sgc3RhcnRlZDogY29weQ0KK1Rhc2sgZmluaXNoZWQ6IGNvcHkNCitUYXJnZXQgZmluaXNoZWQ6IGdhdGhlci5iaW4ucGFydHMNCitUYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQorVGFzayBzdGFydGVkOiB6aXANCitUYXNrIGZpbmlzaGVkOiB6aXANCitUYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KK1Rhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KK1RhcmdldCBmaW5pc2hlZDogYnVpbGQudXBkYXRlLmphcg0KK1Rhc2sgZmluaXNoZWQ6IGFudA0KK1RhcmdldCBmaW5pc2hlZDogYWxsLnBsdWdpbnMNCitUYXJnZXQgc3RhcnRlZDogdXBkYXRlLmZlYXR1cmUNCitUYXJnZXQgZmluaXNoZWQ6IHVwZGF0ZS5mZWF0dXJlDQorVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5jaGlsZHJlbg0KK1RhcmdldCBmaW5pc2hlZDogYWxsLmNoaWxkcmVuDQorVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgc3RhcnRlZDogZGVsZXRlDQorVGFzayBmaW5pc2hlZDogZGVsZXRlDQorVGFzayBzdGFydGVkOiBta2Rpcg0KK1Rhc2sgZmluaXNoZWQ6IG1rZGlyDQorVGFzayBzdGFydGVkOiBhbnRjYWxsDQorVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXJnZXQgZmluaXNoZWQ6IGluaXQNCitUYXJnZXQgc3RhcnRlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KK1Rhc2sgc3RhcnRlZDogYW50Y2FsbA0KK1RhcmdldCBzdGFydGVkOiBjaGlsZHJlbg0KK1RhcmdldCBmaW5pc2hlZDogY2hpbGRyZW4NCitUYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQorVGFzayBzdGFydGVkOiBta2Rpcg0KK1Rhc2sgZmluaXNoZWQ6IG1rZGlyDQorVGFzayBzdGFydGVkOiBjb3B5DQorVGFzayBmaW5pc2hlZDogY29weQ0KK1Rhc2sgc3RhcnRlZDogZWNsaXBzZS5pZFJlcGxhY2VyDQorVGFzayBmaW5pc2hlZDogZWNsaXBzZS5pZFJlcGxhY2VyDQorVGFzayBzdGFydGVkOiBhbnRjYWxsDQorVGFyZ2V0IHN0YXJ0ZWQ6IFJPT1RGSUxFUypfKl8qDQorVGFyZ2V0IGZpbmlzaGVkOiBST09URklMRVMqXypfKg0KK1Rhc2sgZmluaXNoZWQ6IGFudGNhbGwNCitUYXJnZXQgZmluaXNoZWQ6IGdhdGhlci5iaW4ucGFydHMNCitUYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQorVGFzayBzdGFydGVkOiBqYXINCitUYXNrIGZpbmlzaGVkOiBqYXINCitUYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KK1Rhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KK1RhcmdldCBmaW5pc2hlZDogYnVpbGQudXBkYXRlLmphcg0KK1RhcmdldCBzdGFydGVkOiBpbml0DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQorVGFyZ2V0IHN0YXJ0ZWQ6IHJlZnJlc2gNCitUYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCitUYXNrIGZpbmlzaGVkOiBlY2xpcHNlLmNvbnZlcnRQYXRoDQorVGFzayBzdGFydGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KK01lc3NhZ2UgbG9nZ2VkOiBQcm9qZWN0ICR7dXBkYXRlLmZlYXR1cmUyXzEuMC4wfSBkb2VzIG5vdCBleGlzdCBhbmQgY2Fubm90IGJlIHJlZnJlc2hlZC4NCitUYXNrIGZpbmlzaGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KK1Rhc2sgc3RhcnRlZDogYW50Y2FsbA0KK1RhcmdldCBzdGFydGVkOiBpbml0DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQorVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5mZWF0dXJlcw0KK1RhcmdldCBmaW5pc2hlZDogYWxsLmZlYXR1cmVzDQorVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5wbHVnaW5zDQorVGFzayBzdGFydGVkOiBhbnQNCitUYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1RhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KK1RhcmdldCBzdGFydGVkOiBpbml0DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQorVGFyZ2V0IHN0YXJ0ZWQ6IHJlZnJlc2gNCitUYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCitUYXNrIGZpbmlzaGVkOiBlY2xpcHNlLmNvbnZlcnRQYXRoDQorVGFzayBzdGFydGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KK1Rhc2sgZmluaXNoZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQorVGFyZ2V0IGZpbmlzaGVkOiByZWZyZXNoDQorVGFzayBmaW5pc2hlZDogYW50DQorVGFyZ2V0IGZpbmlzaGVkOiBhbGwucGx1Z2lucw0KK1RhcmdldCBzdGFydGVkOiB1cGRhdGUuZmVhdHVyZQ0KK1RhcmdldCBmaW5pc2hlZDogdXBkYXRlLmZlYXR1cmUNCitUYXJnZXQgc3RhcnRlZDogYWxsLmNoaWxkcmVuDQorVGFyZ2V0IGZpbmlzaGVkOiBhbGwuY2hpbGRyZW4NCitUYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQorVGFyZ2V0IGZpbmlzaGVkOiByZWZyZXNoDQorQnVpbGQgZmluaXNoZWQuDQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTIvLnNpdGVidWlsZC9zaXRlYnVpbGQueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTIvLnNpdGVidWlsZC9zaXRlYnVpbGQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNTg4MjAKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMi8uc2l0ZWJ1aWxkL3NpdGVidWlsZC54bWwKQEAgLTAsMCArMSwxMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxzaXRlLWJ1aWxkCisgICAgICBmZWF0dXJlLWxvY2F0aW9uPSJmZWF0dXJlcyIKKyAgICAgIHBsdWdpbi1sb2NhdGlvbj0icGx1Z2lucyIKKyAgICAgIGF1dG9idWlsZD0iZmFsc2UiCisgICAgICBzY3J1Yi1vdXRwdXQ9ImZhbHNlIgorICAgICAgdXNlLWNvbnNvbGU9InRydWUiPgorICAgPGZlYXR1cmUgaWQ9InVwZGF0ZS5mZWF0dXJlMSIgdmVyc2lvbj0iMS4wLjEiLz4KKyAgIDxmZWF0dXJlIGlkPSJ1cGRhdGUuZmVhdHVyZTIiIHZlcnNpb249IjEuMC4xIi8+Cis8L3NpdGUtYnVpbGQ+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMi9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTFfMS4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTIvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUxXzEuMC4wLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTc1YjRhCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTIvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUxXzEuMC4wLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMi9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTJfMS4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTIvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUyXzEuMC4wLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTY2MGI5Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTIvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUyXzEuMC4wLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMi9wbHVnaW5zL2NvbS5wbHVnaW4xXzEuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUyL3BsdWdpbnMvY29tLnBsdWdpbjFfMS4wLjAuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MTVmMjAKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMi9wbHVnaW5zL2NvbS5wbHVnaW4xXzEuMC4wLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMi9wbHVnaW5zL2NvbS5wbHVnaW4yXzEuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUyL3BsdWdpbnMvY29tLnBsdWdpbjJfMS4wLjAuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlYzVmNGMKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMi9wbHVnaW5zL2NvbS5wbHVnaW4yXzEuMC4wLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMi9zaXRlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUyL3NpdGUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxZDRiNzEKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMi9zaXRlLnhtbApAQCAtMCwwICsxLDUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8c2l0ZT4KKyAgIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUxXzEuMC4xLmphciIgaWQ9InVwZGF0ZS5mZWF0dXJlMSIgdmVyc2lvbj0iMS4wLjEiLz4KKyAgIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUyXzEuMC4xLmphciIgaWQ9InVwZGF0ZS5mZWF0dXJlMiIgdmVyc2lvbj0iMS4wLjEiLz4KKzwvc2l0ZT4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUzLy5wcm9qZWN0IGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTMvLnByb2plY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRkYjZiNwotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUzLy5wcm9qZWN0CkBAIC0wLDAgKzEsMTcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdERlc2NyaXB0aW9uPgorCTxuYW1lPnVwZGF0ZS1zaXRlMzwvbmFtZT4KKwk8Y29tbWVudD48L2NvbW1lbnQ+CisJPHByb2plY3RzPgorCTwvcHJvamVjdHM+CisJPGJ1aWxkU3BlYz4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5VcGRhdGVTaXRlQnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJPC9idWlsZFNwZWM+CisJPG5hdHVyZXM+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlVwZGF0ZVNpdGVOYXR1cmU8L25hdHVyZT4KKwk8L25hdHVyZXM+Cis8L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUzLy5zaXRlYnVpbGQvYnVpbGQubG9nIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTMvLnNpdGVidWlsZC9idWlsZC5sb2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGEyZWUwMQotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUzLy5zaXRlYnVpbGQvYnVpbGQubG9nCkBAIC0wLDAgKzEsMzE4IEBACitUYXJnZXQgc3RhcnRlZDogaW5pdA0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1RhcmdldCBmaW5pc2hlZDogaW5pdA0KK1RhcmdldCBzdGFydGVkOiBidWlsZC51cGRhdGUuamFyDQorVGFzayBzdGFydGVkOiBhbnRjYWxsDQorVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXJnZXQgZmluaXNoZWQ6IGluaXQNCitUYXJnZXQgc3RhcnRlZDogYWxsLmZlYXR1cmVzDQorVGFyZ2V0IGZpbmlzaGVkOiBhbGwuZmVhdHVyZXMNCitUYXJnZXQgc3RhcnRlZDogYWxsLnBsdWdpbnMNCitUYXNrIHN0YXJ0ZWQ6IGFudA0KK1RhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQorVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXJnZXQgZmluaXNoZWQ6IGluaXQNCitUYXJnZXQgc3RhcnRlZDogYnVpbGQudXBkYXRlLmphcg0KK1Rhc2sgc3RhcnRlZDogZGVsZXRlDQorVGFzayBmaW5pc2hlZDogZGVsZXRlDQorVGFzayBzdGFydGVkOiBta2Rpcg0KK1Rhc2sgZmluaXNoZWQ6IG1rZGlyDQorVGFzayBzdGFydGVkOiBhbnRjYWxsDQorVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCitUYXJnZXQgc3RhcnRlZDogaW5pdA0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1RhcmdldCBmaW5pc2hlZDogaW5pdA0KK1RhcmdldCBzdGFydGVkOiBidWlsZC5qYXJzDQorVGFzayBzdGFydGVkOiBhdmFpbGFibGUNCitUYXNrIGZpbmlzaGVkOiBhdmFpbGFibGUNCitUYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCitUYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1RhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KK1RhcmdldCBzdGFydGVkOiBpbml0DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQorVGFyZ2V0IHN0YXJ0ZWQ6IHBsdWdpbjJhLmphcg0KK1Rhc2sgc3RhcnRlZDogZGVsZXRlDQorVGFzayBmaW5pc2hlZDogZGVsZXRlDQorVGFzayBzdGFydGVkOiBta2Rpcg0KK1Rhc2sgZmluaXNoZWQ6IG1rZGlyDQorVGFzayBzdGFydGVkOiBqYXZhYw0KK01lc3NhZ2UgbG9nZ2VkOiBDb21waWxlIGZhaWxlZDsgc2VlIHRoZSBjb21waWxlciBlcnJvciBvdXRwdXQgZm9yIGRldGFpbHMuDQorVGFzayBmaW5pc2hlZDogamF2YWMNCitUYXNrIHN0YXJ0ZWQ6IGNvcHkNCitUYXNrIGZpbmlzaGVkOiBjb3B5DQorVGFzayBzdGFydGVkOiBta2Rpcg0KK1Rhc2sgZmluaXNoZWQ6IG1rZGlyDQorVGFzayBzdGFydGVkOiBqYXINCitUYXNrIGZpbmlzaGVkOiBqYXINCitUYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KK1Rhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KK1RhcmdldCBmaW5pc2hlZDogcGx1Z2luMmEuamFyDQorVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KK1RhcmdldCBmaW5pc2hlZDogYnVpbGQuamFycw0KK1Rhc2sgZmluaXNoZWQ6IGFudGNhbGwNCitUYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCitUYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1RhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KK1RhcmdldCBzdGFydGVkOiBpbml0DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQorVGFyZ2V0IHN0YXJ0ZWQ6IGdhdGhlci5iaW4ucGFydHMNCitUYXNrIHN0YXJ0ZWQ6IG1rZGlyDQorVGFzayBmaW5pc2hlZDogbWtkaXINCitUYXNrIHN0YXJ0ZWQ6IGNvcHkNCitUYXNrIGZpbmlzaGVkOiBjb3B5DQorVGFzayBzdGFydGVkOiBjb3B5DQorVGFzayBmaW5pc2hlZDogY29weQ0KK1RhcmdldCBmaW5pc2hlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KK1Rhc2sgZmluaXNoZWQ6IGFudGNhbGwNCitUYXNrIHN0YXJ0ZWQ6IHppcA0KK1Rhc2sgZmluaXNoZWQ6IHppcA0KK1Rhc2sgc3RhcnRlZDogZGVsZXRlDQorVGFzayBmaW5pc2hlZDogZGVsZXRlDQorVGFyZ2V0IGZpbmlzaGVkOiBidWlsZC51cGRhdGUuamFyDQorVGFzayBmaW5pc2hlZDogYW50DQorVGFzayBzdGFydGVkOiBhbnQNCitUYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1RhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KK1RhcmdldCBzdGFydGVkOiBpbml0DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQorVGFyZ2V0IHN0YXJ0ZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCitUYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KK1Rhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KK1Rhc2sgc3RhcnRlZDogbWtkaXINCitUYXNrIGZpbmlzaGVkOiBta2Rpcg0KK1Rhc2sgc3RhcnRlZDogYW50Y2FsbA0KK1RhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQorVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXJnZXQgZmluaXNoZWQ6IGluaXQNCitUYXJnZXQgc3RhcnRlZDogYnVpbGQuamFycw0KK1Rhc2sgc3RhcnRlZDogYXZhaWxhYmxlDQorVGFzayBmaW5pc2hlZDogYXZhaWxhYmxlDQorVGFzayBzdGFydGVkOiBhbnRjYWxsDQorVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCitUYXJnZXQgc3RhcnRlZDogaW5pdA0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1RhcmdldCBmaW5pc2hlZDogaW5pdA0KK1RhcmdldCBzdGFydGVkOiBwbHVnaW4yLmphcg0KK1Rhc2sgc3RhcnRlZDogZGVsZXRlDQorVGFzayBmaW5pc2hlZDogZGVsZXRlDQorVGFzayBzdGFydGVkOiBta2Rpcg0KK1Rhc2sgZmluaXNoZWQ6IG1rZGlyDQorVGFzayBzdGFydGVkOiBqYXZhYw0KK01lc3NhZ2UgbG9nZ2VkOiBDb21waWxlIGZhaWxlZDsgc2VlIHRoZSBjb21waWxlciBlcnJvciBvdXRwdXQgZm9yIGRldGFpbHMuDQorVGFzayBmaW5pc2hlZDogamF2YWMNCitUYXNrIHN0YXJ0ZWQ6IGNvcHkNCitUYXNrIGZpbmlzaGVkOiBjb3B5DQorVGFzayBzdGFydGVkOiBta2Rpcg0KK1Rhc2sgZmluaXNoZWQ6IG1rZGlyDQorVGFzayBzdGFydGVkOiBqYXINCitUYXNrIGZpbmlzaGVkOiBqYXINCitUYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KK1Rhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KK1RhcmdldCBmaW5pc2hlZDogcGx1Z2luMi5qYXINCitUYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQorVGFyZ2V0IGZpbmlzaGVkOiBidWlsZC5qYXJzDQorVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KK1Rhc2sgc3RhcnRlZDogYW50Y2FsbA0KK1RhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQorVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXJnZXQgZmluaXNoZWQ6IGluaXQNCitUYXJnZXQgc3RhcnRlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KK1Rhc2sgc3RhcnRlZDogbWtkaXINCitUYXNrIGZpbmlzaGVkOiBta2Rpcg0KK1Rhc2sgc3RhcnRlZDogY29weQ0KK1Rhc2sgZmluaXNoZWQ6IGNvcHkNCitUYXNrIHN0YXJ0ZWQ6IGNvcHkNCitUYXNrIGZpbmlzaGVkOiBjb3B5DQorVGFyZ2V0IGZpbmlzaGVkOiBnYXRoZXIuYmluLnBhcnRzDQorVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KK1Rhc2sgc3RhcnRlZDogemlwDQorVGFzayBmaW5pc2hlZDogemlwDQorVGFzayBzdGFydGVkOiBkZWxldGUNCitUYXNrIGZpbmlzaGVkOiBkZWxldGUNCitUYXJnZXQgZmluaXNoZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCitUYXNrIGZpbmlzaGVkOiBhbnQNCitUYXJnZXQgZmluaXNoZWQ6IGFsbC5wbHVnaW5zDQorVGFyZ2V0IHN0YXJ0ZWQ6IHVwZGF0ZS5mZWF0dXJlDQorVGFyZ2V0IGZpbmlzaGVkOiB1cGRhdGUuZmVhdHVyZQ0KK1RhcmdldCBzdGFydGVkOiBhbGwuY2hpbGRyZW4NCitUYXJnZXQgZmluaXNoZWQ6IGFsbC5jaGlsZHJlbg0KK1Rhc2sgZmluaXNoZWQ6IGFudGNhbGwNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KK1Rhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KK1Rhc2sgc3RhcnRlZDogbWtkaXINCitUYXNrIGZpbmlzaGVkOiBta2Rpcg0KK1Rhc2sgc3RhcnRlZDogYW50Y2FsbA0KK1RhcmdldCBzdGFydGVkOiBpbml0DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQorVGFyZ2V0IHN0YXJ0ZWQ6IGdhdGhlci5iaW4ucGFydHMNCitUYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCitUYXJnZXQgc3RhcnRlZDogY2hpbGRyZW4NCitUYXJnZXQgZmluaXNoZWQ6IGNoaWxkcmVuDQorVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KK1Rhc2sgc3RhcnRlZDogbWtkaXINCitUYXNrIGZpbmlzaGVkOiBta2Rpcg0KK1Rhc2sgc3RhcnRlZDogY29weQ0KK1Rhc2sgZmluaXNoZWQ6IGNvcHkNCitUYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UuaWRSZXBsYWNlcg0KK1Rhc2sgZmluaXNoZWQ6IGVjbGlwc2UuaWRSZXBsYWNlcg0KK1Rhc2sgc3RhcnRlZDogYW50Y2FsbA0KK1RhcmdldCBzdGFydGVkOiBST09URklMRVMqXypfKg0KK1RhcmdldCBmaW5pc2hlZDogUk9PVEZJTEVTKl8qXyoNCitUYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQorVGFyZ2V0IGZpbmlzaGVkOiBnYXRoZXIuYmluLnBhcnRzDQorVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KK1Rhc2sgc3RhcnRlZDogamFyDQorVGFzayBmaW5pc2hlZDogamFyDQorVGFzayBzdGFydGVkOiBkZWxldGUNCitUYXNrIGZpbmlzaGVkOiBkZWxldGUNCitUYXJnZXQgZmluaXNoZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCitUYXJnZXQgc3RhcnRlZDogaW5pdA0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1RhcmdldCBmaW5pc2hlZDogaW5pdA0KK1RhcmdldCBzdGFydGVkOiByZWZyZXNoDQorVGFzayBzdGFydGVkOiBlY2xpcHNlLmNvbnZlcnRQYXRoDQorVGFzayBmaW5pc2hlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KK1Rhc2sgc3RhcnRlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCitNZXNzYWdlIGxvZ2dlZDogUHJvamVjdCAke3VwZGF0ZS5mZWF0dXJlMmJfMi4wLjB9IGRvZXMgbm90IGV4aXN0IGFuZCBjYW5ub3QgYmUgcmVmcmVzaGVkLg0KK1Rhc2sgZmluaXNoZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQorVGFzayBzdGFydGVkOiBhbnRjYWxsDQorVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXJnZXQgZmluaXNoZWQ6IGluaXQNCitUYXJnZXQgc3RhcnRlZDogYWxsLmZlYXR1cmVzDQorVGFyZ2V0IGZpbmlzaGVkOiBhbGwuZmVhdHVyZXMNCitUYXJnZXQgc3RhcnRlZDogYWxsLnBsdWdpbnMNCitUYXNrIHN0YXJ0ZWQ6IGFudA0KK1RhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQorVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXJnZXQgZmluaXNoZWQ6IGluaXQNCitUYXJnZXQgc3RhcnRlZDogcmVmcmVzaA0KK1Rhc2sgc3RhcnRlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KK1Rhc2sgZmluaXNoZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCitUYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQorVGFzayBmaW5pc2hlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCitUYXJnZXQgZmluaXNoZWQ6IHJlZnJlc2gNCitUYXNrIGZpbmlzaGVkOiBhbnQNCitUYXNrIHN0YXJ0ZWQ6IGFudA0KK1RhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQorVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXJnZXQgZmluaXNoZWQ6IGluaXQNCitUYXJnZXQgc3RhcnRlZDogcmVmcmVzaA0KK1Rhc2sgc3RhcnRlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KK1Rhc2sgZmluaXNoZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCitUYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQorVGFzayBmaW5pc2hlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCitUYXJnZXQgZmluaXNoZWQ6IHJlZnJlc2gNCitUYXNrIGZpbmlzaGVkOiBhbnQNCitUYXJnZXQgZmluaXNoZWQ6IGFsbC5wbHVnaW5zDQorVGFyZ2V0IHN0YXJ0ZWQ6IHVwZGF0ZS5mZWF0dXJlDQorVGFyZ2V0IGZpbmlzaGVkOiB1cGRhdGUuZmVhdHVyZQ0KK1RhcmdldCBzdGFydGVkOiBhbGwuY2hpbGRyZW4NCitUYXJnZXQgZmluaXNoZWQ6IGFsbC5jaGlsZHJlbg0KK1Rhc2sgZmluaXNoZWQ6IGFudGNhbGwNCitUYXJnZXQgZmluaXNoZWQ6IHJlZnJlc2gNCitCdWlsZCBmaW5pc2hlZC4NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMy8uc2l0ZWJ1aWxkL3NpdGVidWlsZC54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMy8uc2l0ZWJ1aWxkL3NpdGVidWlsZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM1MTBiMAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUzLy5zaXRlYnVpbGQvc2l0ZWJ1aWxkLnhtbApAQCAtMCwwICsxLDEwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHNpdGUtYnVpbGQKKyAgICAgIGZlYXR1cmUtbG9jYXRpb249ImZlYXR1cmVzIgorICAgICAgcGx1Z2luLWxvY2F0aW9uPSJwbHVnaW5zIgorICAgICAgYXV0b2J1aWxkPSJmYWxzZSIKKyAgICAgIHNjcnViLW91dHB1dD0iZmFsc2UiCisgICAgICB1c2UtY29uc29sZT0idHJ1ZSI+CisgICA8ZmVhdHVyZSBpZD0idXBkYXRlLmZlYXR1cmUxYiIgdmVyc2lvbj0iMi4wLjAiLz4KKyAgIDxmZWF0dXJlIGlkPSJ1cGRhdGUuZmVhdHVyZTJiIiB2ZXJzaW9uPSIyLjAuMCIvPgorPC9zaXRlLWJ1aWxkPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTMvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUxYl8yLjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMy9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTFiXzIuMC4wLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjlhODc2Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTMvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUxYl8yLjAuMC5qYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTMvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUyYl8yLjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMy9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTJiXzIuMC4wLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2JiNzBmCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTMvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUyYl8yLjAuMC5qYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTMvcGx1Z2lucy9jb20ucGx1Z2luMV8xLjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMy9wbHVnaW5zL2NvbS5wbHVnaW4xXzEuMC4wLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTJkNDFkCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTMvcGx1Z2lucy9jb20ucGx1Z2luMV8xLjAuMC5qYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTMvcGx1Z2lucy9jb20ucGx1Z2luMWFfMS4wLjEuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTMvcGx1Z2lucy9jb20ucGx1Z2luMWFfMS4wLjEuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3MTgzYzcKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMy9wbHVnaW5zL2NvbS5wbHVnaW4xYV8xLjAuMS5qYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTMvcGx1Z2lucy9jb20ucGx1Z2luMl8xLjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMy9wbHVnaW5zL2NvbS5wbHVnaW4yXzEuMC4wLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzFiMjhlCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTMvcGx1Z2lucy9jb20ucGx1Z2luMl8xLjAuMC5qYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTMvcGx1Z2lucy9jb20ucGx1Z2luMmFfMS4wLjEuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTMvcGx1Z2lucy9jb20ucGx1Z2luMmFfMS4wLjEuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1N2JhNWQKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMy9wbHVnaW5zL2NvbS5wbHVnaW4yYV8xLjAuMS5qYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTMvc2l0ZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMy9zaXRlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjg1MDZiCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTMvc2l0ZS54bWwKQEAgLTAsMCArMSwxOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxzaXRlPgorICAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy91cGRhdGUuZmVhdHVyZTFiXzIuMC4wLmphciIgaWQ9InVwZGF0ZS5mZWF0dXJlMWIiIHZlcnNpb249IjIuMC4wIj4KKyAgICAgIDxjYXRlZ29yeSBuYW1lPSJTaXRlMy1DYXRlZ29yeTEiLz4KKyAgIDwvZmVhdHVyZT4KKyAgIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUyYl8yLjAuMC5qYXIiIGlkPSJ1cGRhdGUuZmVhdHVyZTJiIiB2ZXJzaW9uPSIyLjAuMCI+CisgICAgICA8Y2F0ZWdvcnkgbmFtZT0iU2l0ZTMtQ2F0ZWdvcnkyIi8+CisgICA8L2ZlYXR1cmU+CisgICA8Y2F0ZWdvcnktZGVmIG5hbWU9IlNpdGUzLUNhdGVnb3J5MSIgbGFiZWw9IlNpdGUzLUNhdGVnb3J5MS1MYWJlbCI+CisgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICBlY2V0ZXJhLgorICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgIDwvY2F0ZWdvcnktZGVmPgorICAgPGNhdGVnb3J5LWRlZiBuYW1lPSJTaXRlMy1DYXRlZ29yeTIiIGxhYmVsPSJTaXRlMy1DYXRlZ29yeTItTGFiZWwiPgorICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgZWNldGVyYS4KKyAgICAgIDwvZGVzY3JpcHRpb24+CisgICA8L2NhdGVnb3J5LWRlZj4KKzwvc2l0ZT4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU0Ly5wcm9qZWN0IGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTQvLnByb2plY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGEwN2FhZgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU0Ly5wcm9qZWN0CkBAIC0wLDAgKzEsMTcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdERlc2NyaXB0aW9uPgorCTxuYW1lPnVwZGF0ZS1zaXRlNDwvbmFtZT4KKwk8Y29tbWVudD48L2NvbW1lbnQ+CisJPHByb2plY3RzPgorCTwvcHJvamVjdHM+CisJPGJ1aWxkU3BlYz4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5VcGRhdGVTaXRlQnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJPC9idWlsZFNwZWM+CisJPG5hdHVyZXM+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlVwZGF0ZVNpdGVOYXR1cmU8L25hdHVyZT4KKwk8L25hdHVyZXM+Cis8L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU0Ly5zaXRlYnVpbGQvYnVpbGQubG9nIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTQvLnNpdGVidWlsZC9idWlsZC5sb2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNmZThlMwotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU0Ly5zaXRlYnVpbGQvYnVpbGQubG9nCkBAIC0wLDAgKzEsNzkxIEBACitUYXJnZXQgc3RhcnRlZDogaW5pdA0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1RhcmdldCBmaW5pc2hlZDogaW5pdA0KK1RhcmdldCBzdGFydGVkOiBidWlsZC51cGRhdGUuamFyDQorVGFzayBzdGFydGVkOiBhbnRjYWxsDQorVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXJnZXQgZmluaXNoZWQ6IGluaXQNCitUYXJnZXQgc3RhcnRlZDogYWxsLmZlYXR1cmVzDQorVGFzayBzdGFydGVkOiBhbnQNCitUYXJnZXQgc3RhcnRlZDogaW5pdA0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1RhcmdldCBmaW5pc2hlZDogaW5pdA0KK1RhcmdldCBzdGFydGVkOiBidWlsZC51cGRhdGUuamFyDQorVGFzayBzdGFydGVkOiBhbnRjYWxsDQorVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXJnZXQgZmluaXNoZWQ6IGluaXQNCitUYXJnZXQgc3RhcnRlZDogYWxsLmZlYXR1cmVzDQorVGFyZ2V0IGZpbmlzaGVkOiBhbGwuZmVhdHVyZXMNCitUYXJnZXQgc3RhcnRlZDogYWxsLnBsdWdpbnMNCitUYXNrIHN0YXJ0ZWQ6IGFudA0KK1RhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQorVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXJnZXQgZmluaXNoZWQ6IGluaXQNCitUYXJnZXQgc3RhcnRlZDogYnVpbGQudXBkYXRlLmphcg0KK1Rhc2sgc3RhcnRlZDogZGVsZXRlDQorVGFzayBmaW5pc2hlZDogZGVsZXRlDQorVGFzayBzdGFydGVkOiBta2Rpcg0KK1Rhc2sgZmluaXNoZWQ6IG1rZGlyDQorVGFzayBzdGFydGVkOiBhbnRjYWxsDQorVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCitUYXJnZXQgc3RhcnRlZDogaW5pdA0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1RhcmdldCBmaW5pc2hlZDogaW5pdA0KK1RhcmdldCBzdGFydGVkOiBidWlsZC5qYXJzDQorVGFzayBzdGFydGVkOiBhdmFpbGFibGUNCitUYXNrIGZpbmlzaGVkOiBhdmFpbGFibGUNCitUYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCitUYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1RhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KK1RhcmdldCBzdGFydGVkOiBpbml0DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQorVGFyZ2V0IHN0YXJ0ZWQ6IHBsdWdpbjEuamFyDQorVGFzayBzdGFydGVkOiBkZWxldGUNCitUYXNrIGZpbmlzaGVkOiBkZWxldGUNCitUYXNrIHN0YXJ0ZWQ6IG1rZGlyDQorVGFzayBmaW5pc2hlZDogbWtkaXINCitUYXNrIHN0YXJ0ZWQ6IGphdmFjDQorTWVzc2FnZSBsb2dnZWQ6IENvbXBpbGUgZmFpbGVkOyBzZWUgdGhlIGNvbXBpbGVyIGVycm9yIG91dHB1dCBmb3IgZGV0YWlscy4NCitUYXNrIGZpbmlzaGVkOiBqYXZhYw0KK1Rhc2sgc3RhcnRlZDogY29weQ0KK1Rhc2sgZmluaXNoZWQ6IGNvcHkNCitUYXNrIHN0YXJ0ZWQ6IG1rZGlyDQorVGFzayBmaW5pc2hlZDogbWtkaXINCitUYXNrIHN0YXJ0ZWQ6IGphcg0KK1Rhc2sgZmluaXNoZWQ6IGphcg0KK1Rhc2sgc3RhcnRlZDogZGVsZXRlDQorVGFzayBmaW5pc2hlZDogZGVsZXRlDQorVGFyZ2V0IGZpbmlzaGVkOiBwbHVnaW4xLmphcg0KK1Rhc2sgZmluaXNoZWQ6IGFudGNhbGwNCitUYXJnZXQgZmluaXNoZWQ6IGJ1aWxkLmphcnMNCitUYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQorVGFzayBzdGFydGVkOiBhbnRjYWxsDQorVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCitUYXJnZXQgc3RhcnRlZDogaW5pdA0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1RhcmdldCBmaW5pc2hlZDogaW5pdA0KK1RhcmdldCBzdGFydGVkOiBnYXRoZXIuYmluLnBhcnRzDQorVGFzayBzdGFydGVkOiBta2Rpcg0KK1Rhc2sgZmluaXNoZWQ6IG1rZGlyDQorVGFzayBzdGFydGVkOiBjb3B5DQorVGFzayBmaW5pc2hlZDogY29weQ0KK1Rhc2sgc3RhcnRlZDogY29weQ0KK1Rhc2sgZmluaXNoZWQ6IGNvcHkNCitUYXJnZXQgZmluaXNoZWQ6IGdhdGhlci5iaW4ucGFydHMNCitUYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQorVGFzayBzdGFydGVkOiB6aXANCitUYXNrIGZpbmlzaGVkOiB6aXANCitUYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KK1Rhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KK1RhcmdldCBmaW5pc2hlZDogYnVpbGQudXBkYXRlLmphcg0KK1Rhc2sgZmluaXNoZWQ6IGFudA0KK1RhcmdldCBmaW5pc2hlZDogYWxsLnBsdWdpbnMNCitUYXJnZXQgc3RhcnRlZDogdXBkYXRlLmZlYXR1cmUNCitUYXJnZXQgZmluaXNoZWQ6IHVwZGF0ZS5mZWF0dXJlDQorVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5jaGlsZHJlbg0KK1RhcmdldCBmaW5pc2hlZDogYWxsLmNoaWxkcmVuDQorVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgc3RhcnRlZDogZGVsZXRlDQorVGFzayBmaW5pc2hlZDogZGVsZXRlDQorVGFzayBzdGFydGVkOiBta2Rpcg0KK1Rhc2sgZmluaXNoZWQ6IG1rZGlyDQorVGFzayBzdGFydGVkOiBhbnRjYWxsDQorVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXJnZXQgZmluaXNoZWQ6IGluaXQNCitUYXJnZXQgc3RhcnRlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KK1Rhc2sgc3RhcnRlZDogYW50Y2FsbA0KK1RhcmdldCBzdGFydGVkOiBjaGlsZHJlbg0KK1RhcmdldCBmaW5pc2hlZDogY2hpbGRyZW4NCitUYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQorVGFzayBzdGFydGVkOiBta2Rpcg0KK1Rhc2sgZmluaXNoZWQ6IG1rZGlyDQorVGFzayBzdGFydGVkOiBjb3B5DQorVGFzayBmaW5pc2hlZDogY29weQ0KK1Rhc2sgc3RhcnRlZDogZWNsaXBzZS5pZFJlcGxhY2VyDQorVGFzayBmaW5pc2hlZDogZWNsaXBzZS5pZFJlcGxhY2VyDQorVGFzayBzdGFydGVkOiBhbnRjYWxsDQorVGFyZ2V0IHN0YXJ0ZWQ6IFJPT1RGSUxFUypfKl8qDQorVGFyZ2V0IGZpbmlzaGVkOiBST09URklMRVMqXypfKg0KK1Rhc2sgZmluaXNoZWQ6IGFudGNhbGwNCitUYXJnZXQgZmluaXNoZWQ6IGdhdGhlci5iaW4ucGFydHMNCitUYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQorVGFzayBzdGFydGVkOiBqYXINCitUYXNrIGZpbmlzaGVkOiBqYXINCitUYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KK1Rhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KK1RhcmdldCBmaW5pc2hlZDogYnVpbGQudXBkYXRlLmphcg0KK1Rhc2sgZmluaXNoZWQ6IGFudA0KK1Rhc2sgc3RhcnRlZDogYW50DQorVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXJnZXQgZmluaXNoZWQ6IGluaXQNCitUYXJnZXQgc3RhcnRlZDogYnVpbGQudXBkYXRlLmphcg0KK1Rhc2sgc3RhcnRlZDogYW50Y2FsbA0KK1RhcmdldCBzdGFydGVkOiBpbml0DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQorVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5mZWF0dXJlcw0KK1RhcmdldCBmaW5pc2hlZDogYWxsLmZlYXR1cmVzDQorVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5wbHVnaW5zDQorVGFzayBzdGFydGVkOiBhbnQNCitUYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1RhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KK1RhcmdldCBzdGFydGVkOiBpbml0DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQorVGFyZ2V0IHN0YXJ0ZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCitUYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KK1Rhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KK1Rhc2sgc3RhcnRlZDogbWtkaXINCitUYXNrIGZpbmlzaGVkOiBta2Rpcg0KK1Rhc2sgc3RhcnRlZDogYW50Y2FsbA0KK1RhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQorVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXJnZXQgZmluaXNoZWQ6IGluaXQNCitUYXJnZXQgc3RhcnRlZDogYnVpbGQuamFycw0KK1Rhc2sgc3RhcnRlZDogYXZhaWxhYmxlDQorVGFzayBmaW5pc2hlZDogYXZhaWxhYmxlDQorVGFzayBzdGFydGVkOiBhbnRjYWxsDQorVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCitUYXJnZXQgc3RhcnRlZDogaW5pdA0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1RhcmdldCBmaW5pc2hlZDogaW5pdA0KK1RhcmdldCBzdGFydGVkOiBwbHVnaW4xLmphcg0KK1RhcmdldCBmaW5pc2hlZDogcGx1Z2luMS5qYXINCitUYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQorVGFyZ2V0IGZpbmlzaGVkOiBidWlsZC5qYXJzDQorVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KK1Rhc2sgc3RhcnRlZDogYW50Y2FsbA0KK1RhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQorVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXJnZXQgZmluaXNoZWQ6IGluaXQNCitUYXJnZXQgc3RhcnRlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KK1Rhc2sgc3RhcnRlZDogbWtkaXINCitUYXNrIGZpbmlzaGVkOiBta2Rpcg0KK1Rhc2sgc3RhcnRlZDogY29weQ0KK1Rhc2sgZmluaXNoZWQ6IGNvcHkNCitUYXNrIHN0YXJ0ZWQ6IGNvcHkNCitUYXNrIGZpbmlzaGVkOiBjb3B5DQorVGFyZ2V0IGZpbmlzaGVkOiBnYXRoZXIuYmluLnBhcnRzDQorVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KK1Rhc2sgc3RhcnRlZDogemlwDQorVGFzayBmaW5pc2hlZDogemlwDQorVGFzayBzdGFydGVkOiBkZWxldGUNCitUYXNrIGZpbmlzaGVkOiBkZWxldGUNCitUYXJnZXQgZmluaXNoZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCitUYXNrIGZpbmlzaGVkOiBhbnQNCitUYXJnZXQgZmluaXNoZWQ6IGFsbC5wbHVnaW5zDQorVGFyZ2V0IHN0YXJ0ZWQ6IHVwZGF0ZS5mZWF0dXJlDQorVGFyZ2V0IGZpbmlzaGVkOiB1cGRhdGUuZmVhdHVyZQ0KK1RhcmdldCBzdGFydGVkOiBhbGwuY2hpbGRyZW4NCitUYXJnZXQgZmluaXNoZWQ6IGFsbC5jaGlsZHJlbg0KK1Rhc2sgZmluaXNoZWQ6IGFudGNhbGwNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KK1Rhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KK1Rhc2sgc3RhcnRlZDogbWtkaXINCitUYXNrIGZpbmlzaGVkOiBta2Rpcg0KK1Rhc2sgc3RhcnRlZDogYW50Y2FsbA0KK1RhcmdldCBzdGFydGVkOiBpbml0DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQorVGFyZ2V0IHN0YXJ0ZWQ6IGdhdGhlci5iaW4ucGFydHMNCitUYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCitUYXJnZXQgc3RhcnRlZDogY2hpbGRyZW4NCitUYXJnZXQgZmluaXNoZWQ6IGNoaWxkcmVuDQorVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KK1Rhc2sgc3RhcnRlZDogbWtkaXINCitUYXNrIGZpbmlzaGVkOiBta2Rpcg0KK1Rhc2sgc3RhcnRlZDogY29weQ0KK1Rhc2sgZmluaXNoZWQ6IGNvcHkNCitUYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UuaWRSZXBsYWNlcg0KK1Rhc2sgZmluaXNoZWQ6IGVjbGlwc2UuaWRSZXBsYWNlcg0KK1Rhc2sgc3RhcnRlZDogYW50Y2FsbA0KK1RhcmdldCBzdGFydGVkOiBST09URklMRVMqXypfKg0KK1RhcmdldCBmaW5pc2hlZDogUk9PVEZJTEVTKl8qXyoNCitUYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQorVGFyZ2V0IGZpbmlzaGVkOiBnYXRoZXIuYmluLnBhcnRzDQorVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KK1Rhc2sgc3RhcnRlZDogamFyDQorVGFzayBmaW5pc2hlZDogamFyDQorVGFzayBzdGFydGVkOiBkZWxldGUNCitUYXNrIGZpbmlzaGVkOiBkZWxldGUNCitUYXJnZXQgZmluaXNoZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCitUYXNrIGZpbmlzaGVkOiBhbnQNCitUYXNrIHN0YXJ0ZWQ6IGFudA0KK1RhcmdldCBzdGFydGVkOiBpbml0DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQorVGFyZ2V0IHN0YXJ0ZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCitUYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCitUYXJnZXQgc3RhcnRlZDogaW5pdA0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1RhcmdldCBmaW5pc2hlZDogaW5pdA0KK1RhcmdldCBzdGFydGVkOiBhbGwuZmVhdHVyZXMNCitUYXJnZXQgZmluaXNoZWQ6IGFsbC5mZWF0dXJlcw0KK1RhcmdldCBzdGFydGVkOiBhbGwucGx1Z2lucw0KK1Rhc2sgc3RhcnRlZDogYW50DQorVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCitUYXJnZXQgc3RhcnRlZDogaW5pdA0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1RhcmdldCBmaW5pc2hlZDogaW5pdA0KK1RhcmdldCBzdGFydGVkOiBidWlsZC51cGRhdGUuamFyDQorVGFzayBzdGFydGVkOiBkZWxldGUNCitUYXNrIGZpbmlzaGVkOiBkZWxldGUNCitUYXNrIHN0YXJ0ZWQ6IG1rZGlyDQorVGFzayBmaW5pc2hlZDogbWtkaXINCitUYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCitUYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1RhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KK1RhcmdldCBzdGFydGVkOiBpbml0DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQorVGFyZ2V0IHN0YXJ0ZWQ6IGJ1aWxkLmphcnMNCitUYXNrIHN0YXJ0ZWQ6IGF2YWlsYWJsZQ0KK1Rhc2sgZmluaXNoZWQ6IGF2YWlsYWJsZQ0KK1Rhc2sgc3RhcnRlZDogYW50Y2FsbA0KK1RhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQorVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXJnZXQgZmluaXNoZWQ6IGluaXQNCitUYXJnZXQgc3RhcnRlZDogcGx1Z2luMS5qYXINCitUYXJnZXQgZmluaXNoZWQ6IHBsdWdpbjEuamFyDQorVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KK1RhcmdldCBmaW5pc2hlZDogYnVpbGQuamFycw0KK1Rhc2sgZmluaXNoZWQ6IGFudGNhbGwNCitUYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCitUYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1RhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KK1RhcmdldCBzdGFydGVkOiBpbml0DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQorVGFyZ2V0IHN0YXJ0ZWQ6IGdhdGhlci5iaW4ucGFydHMNCitUYXNrIHN0YXJ0ZWQ6IG1rZGlyDQorVGFzayBmaW5pc2hlZDogbWtkaXINCitUYXNrIHN0YXJ0ZWQ6IGNvcHkNCitUYXNrIGZpbmlzaGVkOiBjb3B5DQorVGFzayBzdGFydGVkOiBjb3B5DQorVGFzayBmaW5pc2hlZDogY29weQ0KK1RhcmdldCBmaW5pc2hlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KK1Rhc2sgZmluaXNoZWQ6IGFudGNhbGwNCitUYXNrIHN0YXJ0ZWQ6IHppcA0KK1Rhc2sgZmluaXNoZWQ6IHppcA0KK1Rhc2sgc3RhcnRlZDogZGVsZXRlDQorVGFzayBmaW5pc2hlZDogZGVsZXRlDQorVGFyZ2V0IGZpbmlzaGVkOiBidWlsZC51cGRhdGUuamFyDQorVGFzayBmaW5pc2hlZDogYW50DQorVGFzayBzdGFydGVkOiBhbnQNCitUYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1RhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KK1RhcmdldCBzdGFydGVkOiBpbml0DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQorVGFyZ2V0IHN0YXJ0ZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCitUYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KK1Rhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KK1Rhc2sgc3RhcnRlZDogbWtkaXINCitUYXNrIGZpbmlzaGVkOiBta2Rpcg0KK1Rhc2sgc3RhcnRlZDogYW50Y2FsbA0KK1RhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQorVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXJnZXQgZmluaXNoZWQ6IGluaXQNCitUYXJnZXQgc3RhcnRlZDogYnVpbGQuamFycw0KK1Rhc2sgc3RhcnRlZDogYXZhaWxhYmxlDQorVGFzayBmaW5pc2hlZDogYXZhaWxhYmxlDQorVGFzayBzdGFydGVkOiBhbnRjYWxsDQorVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCitUYXJnZXQgc3RhcnRlZDogaW5pdA0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1RhcmdldCBmaW5pc2hlZDogaW5pdA0KK1RhcmdldCBzdGFydGVkOiBwbHVnaW4xYS5qYXINCitUYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KK1Rhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KK1Rhc2sgc3RhcnRlZDogbWtkaXINCitUYXNrIGZpbmlzaGVkOiBta2Rpcg0KK1Rhc2sgc3RhcnRlZDogamF2YWMNCitNZXNzYWdlIGxvZ2dlZDogQ29tcGlsZSBmYWlsZWQ7IHNlZSB0aGUgY29tcGlsZXIgZXJyb3Igb3V0cHV0IGZvciBkZXRhaWxzLg0KK1Rhc2sgZmluaXNoZWQ6IGphdmFjDQorVGFzayBzdGFydGVkOiBjb3B5DQorVGFzayBmaW5pc2hlZDogY29weQ0KK1Rhc2sgc3RhcnRlZDogbWtkaXINCitUYXNrIGZpbmlzaGVkOiBta2Rpcg0KK1Rhc2sgc3RhcnRlZDogamFyDQorVGFzayBmaW5pc2hlZDogamFyDQorVGFzayBzdGFydGVkOiBkZWxldGUNCitUYXNrIGZpbmlzaGVkOiBkZWxldGUNCitUYXJnZXQgZmluaXNoZWQ6IHBsdWdpbjFhLmphcg0KK1Rhc2sgZmluaXNoZWQ6IGFudGNhbGwNCitUYXJnZXQgZmluaXNoZWQ6IGJ1aWxkLmphcnMNCitUYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQorVGFzayBzdGFydGVkOiBhbnRjYWxsDQorVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCitUYXJnZXQgc3RhcnRlZDogaW5pdA0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1RhcmdldCBmaW5pc2hlZDogaW5pdA0KK1RhcmdldCBzdGFydGVkOiBnYXRoZXIuYmluLnBhcnRzDQorVGFzayBzdGFydGVkOiBta2Rpcg0KK1Rhc2sgZmluaXNoZWQ6IG1rZGlyDQorVGFzayBzdGFydGVkOiBjb3B5DQorVGFzayBmaW5pc2hlZDogY29weQ0KK1Rhc2sgc3RhcnRlZDogY29weQ0KK1Rhc2sgZmluaXNoZWQ6IGNvcHkNCitUYXJnZXQgZmluaXNoZWQ6IGdhdGhlci5iaW4ucGFydHMNCitUYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQorVGFzayBzdGFydGVkOiB6aXANCitUYXNrIGZpbmlzaGVkOiB6aXANCitUYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KK1Rhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KK1RhcmdldCBmaW5pc2hlZDogYnVpbGQudXBkYXRlLmphcg0KK1Rhc2sgZmluaXNoZWQ6IGFudA0KK1RhcmdldCBmaW5pc2hlZDogYWxsLnBsdWdpbnMNCitUYXJnZXQgc3RhcnRlZDogdXBkYXRlLmZlYXR1cmUNCitUYXJnZXQgZmluaXNoZWQ6IHVwZGF0ZS5mZWF0dXJlDQorVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5jaGlsZHJlbg0KK1RhcmdldCBmaW5pc2hlZDogYWxsLmNoaWxkcmVuDQorVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgc3RhcnRlZDogZGVsZXRlDQorVGFzayBmaW5pc2hlZDogZGVsZXRlDQorVGFzayBzdGFydGVkOiBta2Rpcg0KK1Rhc2sgZmluaXNoZWQ6IG1rZGlyDQorVGFzayBzdGFydGVkOiBhbnRjYWxsDQorVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXJnZXQgZmluaXNoZWQ6IGluaXQNCitUYXJnZXQgc3RhcnRlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KK1Rhc2sgc3RhcnRlZDogYW50Y2FsbA0KK1RhcmdldCBzdGFydGVkOiBjaGlsZHJlbg0KK1RhcmdldCBmaW5pc2hlZDogY2hpbGRyZW4NCitUYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQorVGFzayBzdGFydGVkOiBta2Rpcg0KK1Rhc2sgZmluaXNoZWQ6IG1rZGlyDQorVGFzayBzdGFydGVkOiBjb3B5DQorVGFzayBmaW5pc2hlZDogY29weQ0KK1Rhc2sgc3RhcnRlZDogZWNsaXBzZS5pZFJlcGxhY2VyDQorVGFzayBmaW5pc2hlZDogZWNsaXBzZS5pZFJlcGxhY2VyDQorVGFzayBzdGFydGVkOiBhbnRjYWxsDQorVGFyZ2V0IHN0YXJ0ZWQ6IFJPT1RGSUxFUypfKl8qDQorVGFyZ2V0IGZpbmlzaGVkOiBST09URklMRVMqXypfKg0KK1Rhc2sgZmluaXNoZWQ6IGFudGNhbGwNCitUYXJnZXQgZmluaXNoZWQ6IGdhdGhlci5iaW4ucGFydHMNCitUYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQorVGFzayBzdGFydGVkOiBqYXINCitUYXNrIGZpbmlzaGVkOiBqYXINCitUYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KK1Rhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KK1RhcmdldCBmaW5pc2hlZDogYnVpbGQudXBkYXRlLmphcg0KK1Rhc2sgZmluaXNoZWQ6IGFudA0KK1RhcmdldCBmaW5pc2hlZDogYWxsLmZlYXR1cmVzDQorVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5wbHVnaW5zDQorVGFyZ2V0IGZpbmlzaGVkOiBhbGwucGx1Z2lucw0KK1RhcmdldCBzdGFydGVkOiB1cGRhdGUuZmVhdHVyZQ0KK1RhcmdldCBmaW5pc2hlZDogdXBkYXRlLmZlYXR1cmUNCitUYXJnZXQgc3RhcnRlZDogYWxsLmNoaWxkcmVuDQorVGFyZ2V0IGZpbmlzaGVkOiBhbGwuY2hpbGRyZW4NCitUYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFzayBzdGFydGVkOiBkZWxldGUNCitUYXNrIGZpbmlzaGVkOiBkZWxldGUNCitUYXNrIHN0YXJ0ZWQ6IG1rZGlyDQorVGFzayBmaW5pc2hlZDogbWtkaXINCitUYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCitUYXJnZXQgc3RhcnRlZDogaW5pdA0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1RhcmdldCBmaW5pc2hlZDogaW5pdA0KK1RhcmdldCBzdGFydGVkOiBnYXRoZXIuYmluLnBhcnRzDQorVGFzayBzdGFydGVkOiBhbnRjYWxsDQorVGFyZ2V0IHN0YXJ0ZWQ6IGNoaWxkcmVuDQorVGFyZ2V0IGZpbmlzaGVkOiBjaGlsZHJlbg0KK1Rhc2sgZmluaXNoZWQ6IGFudGNhbGwNCitUYXNrIHN0YXJ0ZWQ6IG1rZGlyDQorVGFzayBmaW5pc2hlZDogbWtkaXINCitUYXNrIHN0YXJ0ZWQ6IGNvcHkNCitUYXNrIGZpbmlzaGVkOiBjb3B5DQorVGFzayBzdGFydGVkOiBlY2xpcHNlLmlkUmVwbGFjZXINCitUYXNrIGZpbmlzaGVkOiBlY2xpcHNlLmlkUmVwbGFjZXINCitUYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCitUYXJnZXQgc3RhcnRlZDogUk9PVEZJTEVTKl8qXyoNCitUYXJnZXQgZmluaXNoZWQ6IFJPT1RGSUxFUypfKl8qDQorVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KK1RhcmdldCBmaW5pc2hlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KK1Rhc2sgZmluaXNoZWQ6IGFudGNhbGwNCitUYXNrIHN0YXJ0ZWQ6IGphcg0KK1Rhc2sgZmluaXNoZWQ6IGphcg0KK1Rhc2sgc3RhcnRlZDogZGVsZXRlDQorVGFzayBmaW5pc2hlZDogZGVsZXRlDQorVGFyZ2V0IGZpbmlzaGVkOiBidWlsZC51cGRhdGUuamFyDQorVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXJnZXQgZmluaXNoZWQ6IGluaXQNCitUYXJnZXQgc3RhcnRlZDogcmVmcmVzaA0KK1Rhc2sgc3RhcnRlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KK1Rhc2sgZmluaXNoZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCitUYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQorTWVzc2FnZSBsb2dnZWQ6IFByb2plY3QgJHt1cGRhdGUuZmVhdHVyZTFjXzMuMC4wfSBkb2VzIG5vdCBleGlzdCBhbmQgY2Fubm90IGJlIHJlZnJlc2hlZC4NCitUYXNrIGZpbmlzaGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KK1Rhc2sgc3RhcnRlZDogYW50Y2FsbA0KK1RhcmdldCBzdGFydGVkOiBpbml0DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQorVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5mZWF0dXJlcw0KK1Rhc2sgc3RhcnRlZDogYW50DQorVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXJnZXQgZmluaXNoZWQ6IGluaXQNCitUYXJnZXQgc3RhcnRlZDogcmVmcmVzaA0KK1Rhc2sgc3RhcnRlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KK1Rhc2sgZmluaXNoZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCitUYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQorTWVzc2FnZSBsb2dnZWQ6IFByb2plY3QgJHt1cGRhdGUuZmVhdHVyZTFfMS4wLjB9IGRvZXMgbm90IGV4aXN0IGFuZCBjYW5ub3QgYmUgcmVmcmVzaGVkLg0KK1Rhc2sgZmluaXNoZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQorVGFzayBzdGFydGVkOiBhbnRjYWxsDQorVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXJnZXQgZmluaXNoZWQ6IGluaXQNCitUYXJnZXQgc3RhcnRlZDogYWxsLmZlYXR1cmVzDQorVGFyZ2V0IGZpbmlzaGVkOiBhbGwuZmVhdHVyZXMNCitUYXJnZXQgc3RhcnRlZDogYWxsLnBsdWdpbnMNCitUYXNrIHN0YXJ0ZWQ6IGFudA0KK1RhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQorVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXJnZXQgZmluaXNoZWQ6IGluaXQNCitUYXJnZXQgc3RhcnRlZDogcmVmcmVzaA0KK1Rhc2sgc3RhcnRlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KK1Rhc2sgZmluaXNoZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCitUYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQorVGFzayBmaW5pc2hlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCitUYXJnZXQgZmluaXNoZWQ6IHJlZnJlc2gNCitUYXNrIGZpbmlzaGVkOiBhbnQNCitUYXJnZXQgZmluaXNoZWQ6IGFsbC5wbHVnaW5zDQorVGFyZ2V0IHN0YXJ0ZWQ6IHVwZGF0ZS5mZWF0dXJlDQorVGFyZ2V0IGZpbmlzaGVkOiB1cGRhdGUuZmVhdHVyZQ0KK1RhcmdldCBzdGFydGVkOiBhbGwuY2hpbGRyZW4NCitUYXJnZXQgZmluaXNoZWQ6IGFsbC5jaGlsZHJlbg0KK1Rhc2sgZmluaXNoZWQ6IGFudGNhbGwNCitUYXJnZXQgZmluaXNoZWQ6IHJlZnJlc2gNCitUYXNrIGZpbmlzaGVkOiBhbnQNCitUYXNrIHN0YXJ0ZWQ6IGFudA0KK1RhcmdldCBzdGFydGVkOiBpbml0DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQorVGFyZ2V0IHN0YXJ0ZWQ6IHJlZnJlc2gNCitUYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCitUYXNrIGZpbmlzaGVkOiBlY2xpcHNlLmNvbnZlcnRQYXRoDQorVGFzayBzdGFydGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KK01lc3NhZ2UgbG9nZ2VkOiBQcm9qZWN0ICR7dXBkYXRlLmZlYXR1cmUxXzEuMC4wfSBkb2VzIG5vdCBleGlzdCBhbmQgY2Fubm90IGJlIHJlZnJlc2hlZC4NCitUYXNrIGZpbmlzaGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KK1Rhc2sgc3RhcnRlZDogYW50Y2FsbA0KK1RhcmdldCBzdGFydGVkOiBpbml0DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQorVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5mZWF0dXJlcw0KK1RhcmdldCBmaW5pc2hlZDogYWxsLmZlYXR1cmVzDQorVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5wbHVnaW5zDQorVGFzayBzdGFydGVkOiBhbnQNCitUYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1RhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KK1RhcmdldCBzdGFydGVkOiBpbml0DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQorVGFyZ2V0IHN0YXJ0ZWQ6IHJlZnJlc2gNCitUYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCitUYXNrIGZpbmlzaGVkOiBlY2xpcHNlLmNvbnZlcnRQYXRoDQorVGFzayBzdGFydGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KK1Rhc2sgZmluaXNoZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQorVGFyZ2V0IGZpbmlzaGVkOiByZWZyZXNoDQorVGFzayBmaW5pc2hlZDogYW50DQorVGFyZ2V0IGZpbmlzaGVkOiBhbGwucGx1Z2lucw0KK1RhcmdldCBzdGFydGVkOiB1cGRhdGUuZmVhdHVyZQ0KK1RhcmdldCBmaW5pc2hlZDogdXBkYXRlLmZlYXR1cmUNCitUYXJnZXQgc3RhcnRlZDogYWxsLmNoaWxkcmVuDQorVGFyZ2V0IGZpbmlzaGVkOiBhbGwuY2hpbGRyZW4NCitUYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQorVGFyZ2V0IGZpbmlzaGVkOiByZWZyZXNoDQorVGFzayBmaW5pc2hlZDogYW50DQorVGFzayBzdGFydGVkOiBhbnQNCitUYXJnZXQgc3RhcnRlZDogaW5pdA0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1RhcmdldCBmaW5pc2hlZDogaW5pdA0KK1RhcmdldCBzdGFydGVkOiByZWZyZXNoDQorVGFzayBzdGFydGVkOiBlY2xpcHNlLmNvbnZlcnRQYXRoDQorVGFzayBmaW5pc2hlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KK1Rhc2sgc3RhcnRlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCitNZXNzYWdlIGxvZ2dlZDogUHJvamVjdCAke3VwZGF0ZS5mZWF0dXJlMWJfMi4wLjB9IGRvZXMgbm90IGV4aXN0IGFuZCBjYW5ub3QgYmUgcmVmcmVzaGVkLg0KK1Rhc2sgZmluaXNoZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQorVGFzayBzdGFydGVkOiBhbnRjYWxsDQorVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXJnZXQgZmluaXNoZWQ6IGluaXQNCitUYXJnZXQgc3RhcnRlZDogYWxsLmZlYXR1cmVzDQorVGFyZ2V0IGZpbmlzaGVkOiBhbGwuZmVhdHVyZXMNCitUYXJnZXQgc3RhcnRlZDogYWxsLnBsdWdpbnMNCitUYXNrIHN0YXJ0ZWQ6IGFudA0KK1RhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQorVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXJnZXQgZmluaXNoZWQ6IGluaXQNCitUYXJnZXQgc3RhcnRlZDogcmVmcmVzaA0KK1Rhc2sgc3RhcnRlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KK1Rhc2sgZmluaXNoZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCitUYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQorVGFzayBmaW5pc2hlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCitUYXJnZXQgZmluaXNoZWQ6IHJlZnJlc2gNCitUYXNrIGZpbmlzaGVkOiBhbnQNCitUYXNrIHN0YXJ0ZWQ6IGFudA0KK1RhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQorVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXJnZXQgZmluaXNoZWQ6IGluaXQNCitUYXJnZXQgc3RhcnRlZDogcmVmcmVzaA0KK1Rhc2sgc3RhcnRlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KK1Rhc2sgZmluaXNoZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCitUYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQorVGFzayBmaW5pc2hlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCitUYXJnZXQgZmluaXNoZWQ6IHJlZnJlc2gNCitUYXNrIGZpbmlzaGVkOiBhbnQNCitUYXJnZXQgZmluaXNoZWQ6IGFsbC5wbHVnaW5zDQorVGFyZ2V0IHN0YXJ0ZWQ6IHVwZGF0ZS5mZWF0dXJlDQorVGFyZ2V0IGZpbmlzaGVkOiB1cGRhdGUuZmVhdHVyZQ0KK1RhcmdldCBzdGFydGVkOiBhbGwuY2hpbGRyZW4NCitUYXJnZXQgZmluaXNoZWQ6IGFsbC5jaGlsZHJlbg0KK1Rhc2sgZmluaXNoZWQ6IGFudGNhbGwNCitUYXJnZXQgZmluaXNoZWQ6IHJlZnJlc2gNCitUYXNrIGZpbmlzaGVkOiBhbnQNCitUYXJnZXQgZmluaXNoZWQ6IGFsbC5mZWF0dXJlcw0KK1RhcmdldCBzdGFydGVkOiBhbGwucGx1Z2lucw0KK1RhcmdldCBmaW5pc2hlZDogYWxsLnBsdWdpbnMNCitUYXJnZXQgc3RhcnRlZDogdXBkYXRlLmZlYXR1cmUNCitUYXJnZXQgZmluaXNoZWQ6IHVwZGF0ZS5mZWF0dXJlDQorVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5jaGlsZHJlbg0KK1RhcmdldCBmaW5pc2hlZDogYWxsLmNoaWxkcmVuDQorVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KK1RhcmdldCBmaW5pc2hlZDogcmVmcmVzaA0KK0J1aWxkIGZpbmlzaGVkLg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU0Ly5zaXRlYnVpbGQvc2l0ZWJ1aWxkLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU0Ly5zaXRlYnVpbGQvc2l0ZWJ1aWxkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2NiMDE3Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTQvLnNpdGVidWlsZC9zaXRlYnVpbGQueG1sCkBAIC0wLDAgKzEsOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxzaXRlLWJ1aWxkCisgICAgICBmZWF0dXJlLWxvY2F0aW9uPSJmZWF0dXJlcyIKKyAgICAgIHBsdWdpbi1sb2NhdGlvbj0icGx1Z2lucyIKKyAgICAgIGF1dG9idWlsZD0iZmFsc2UiCisgICAgICBzY3J1Yi1vdXRwdXQ9ImZhbHNlIgorICAgICAgdXNlLWNvbnNvbGU9InRydWUiPgorICAgPGZlYXR1cmUgaWQ9InVwZGF0ZS5mZWF0dXJlMWMiIHZlcnNpb249IjMuMC4wIi8+Cis8L3NpdGUtYnVpbGQ+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNC9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTFfMS4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTQvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUxXzEuMC4wLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGQyZjI4Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTQvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUxXzEuMC4wLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNC9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTFfMS4wLjEuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTQvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUxXzEuMC4xLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWIwYjZmCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTQvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUxXzEuMC4xLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNC9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTFiXzIuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU0L2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMWJfMi4wLjAuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxYjZiY2IKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNC9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTFiXzIuMC4wLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNC9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTFjXzMuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU0L2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMWNfMy4wLjAuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3NTMzMDUKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNC9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTFjXzMuMC4wLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNC9wbHVnaW5zL2NvbS5wbHVnaW4xXzEuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU0L3BsdWdpbnMvY29tLnBsdWdpbjFfMS4wLjAuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlMDc2MGYKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNC9wbHVnaW5zL2NvbS5wbHVnaW4xXzEuMC4wLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNC9wbHVnaW5zL2NvbS5wbHVnaW4xYV8xLjAuMS5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNC9wbHVnaW5zL2NvbS5wbHVnaW4xYV8xLjAuMS5qYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM0ZWIwNwotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU0L3BsdWdpbnMvY29tLnBsdWdpbjFhXzEuMC4xLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNC9zaXRlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU0L3NpdGUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjNzNjYmUKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNC9zaXRlLnhtbApAQCAtMCwwICsxLDExIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHNpdGU+CisgICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMWNfMy4wLjAuamFyIiBpZD0idXBkYXRlLmZlYXR1cmUxYyIgdmVyc2lvbj0iMy4wLjAiPgorICAgICAgPGNhdGVnb3J5IG5hbWU9IlNpdGU0LUNhdGVnb3J5MSIvPgorICAgPC9mZWF0dXJlPgorICAgPGNhdGVnb3J5LWRlZiBuYW1lPSJTaXRlNC1DYXRlZ29yeTEiIGxhYmVsPSJTaXRlNC1DYXRlZ29yeTEtTGFiZWwiPgorICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgZWNldGVyYS4KKyAgICAgIDwvZGVzY3JpcHRpb24+CisgICA8L2NhdGVnb3J5LWRlZj4KKzwvc2l0ZT4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU1Ly5wcm9qZWN0IGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTUvLnByb2plY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE5MzMwMgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU1Ly5wcm9qZWN0CkBAIC0wLDAgKzEsMTcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdERlc2NyaXB0aW9uPgorCTxuYW1lPnVwZGF0ZS1zaXRlNTwvbmFtZT4KKwk8Y29tbWVudD48L2NvbW1lbnQ+CisJPHByb2plY3RzPgorCTwvcHJvamVjdHM+CisJPGJ1aWxkU3BlYz4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5VcGRhdGVTaXRlQnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJPC9idWlsZFNwZWM+CisJPG5hdHVyZXM+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlVwZGF0ZVNpdGVOYXR1cmU8L25hdHVyZT4KKwk8L25hdHVyZXM+Cis8L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU1Ly5zaXRlYnVpbGQvYnVpbGQubG9nIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTUvLnNpdGVidWlsZC9idWlsZC5sb2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI0NGZhYQotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU1Ly5zaXRlYnVpbGQvYnVpbGQubG9nCkBAIC0wLDAgKzEsNzkxIEBACitUYXJnZXQgc3RhcnRlZDogaW5pdA0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1RhcmdldCBmaW5pc2hlZDogaW5pdA0KK1RhcmdldCBzdGFydGVkOiBidWlsZC51cGRhdGUuamFyDQorVGFzayBzdGFydGVkOiBhbnRjYWxsDQorVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXJnZXQgZmluaXNoZWQ6IGluaXQNCitUYXJnZXQgc3RhcnRlZDogYWxsLmZlYXR1cmVzDQorVGFzayBzdGFydGVkOiBhbnQNCitUYXJnZXQgc3RhcnRlZDogaW5pdA0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1RhcmdldCBmaW5pc2hlZDogaW5pdA0KK1RhcmdldCBzdGFydGVkOiBidWlsZC51cGRhdGUuamFyDQorVGFzayBzdGFydGVkOiBhbnRjYWxsDQorVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXJnZXQgZmluaXNoZWQ6IGluaXQNCitUYXJnZXQgc3RhcnRlZDogYWxsLmZlYXR1cmVzDQorVGFyZ2V0IGZpbmlzaGVkOiBhbGwuZmVhdHVyZXMNCitUYXJnZXQgc3RhcnRlZDogYWxsLnBsdWdpbnMNCitUYXNrIHN0YXJ0ZWQ6IGFudA0KK1RhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQorVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXJnZXQgZmluaXNoZWQ6IGluaXQNCitUYXJnZXQgc3RhcnRlZDogYnVpbGQudXBkYXRlLmphcg0KK1Rhc2sgc3RhcnRlZDogZGVsZXRlDQorVGFzayBmaW5pc2hlZDogZGVsZXRlDQorVGFzayBzdGFydGVkOiBta2Rpcg0KK1Rhc2sgZmluaXNoZWQ6IG1rZGlyDQorVGFzayBzdGFydGVkOiBhbnRjYWxsDQorVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCitUYXJnZXQgc3RhcnRlZDogaW5pdA0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1RhcmdldCBmaW5pc2hlZDogaW5pdA0KK1RhcmdldCBzdGFydGVkOiBidWlsZC5qYXJzDQorVGFzayBzdGFydGVkOiBhdmFpbGFibGUNCitUYXNrIGZpbmlzaGVkOiBhdmFpbGFibGUNCitUYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCitUYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1RhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KK1RhcmdldCBzdGFydGVkOiBpbml0DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQorVGFyZ2V0IHN0YXJ0ZWQ6IHBsdWdpbjIuamFyDQorVGFzayBzdGFydGVkOiBkZWxldGUNCitUYXNrIGZpbmlzaGVkOiBkZWxldGUNCitUYXNrIHN0YXJ0ZWQ6IG1rZGlyDQorVGFzayBmaW5pc2hlZDogbWtkaXINCitUYXNrIHN0YXJ0ZWQ6IGphdmFjDQorTWVzc2FnZSBsb2dnZWQ6IENvbXBpbGUgZmFpbGVkOyBzZWUgdGhlIGNvbXBpbGVyIGVycm9yIG91dHB1dCBmb3IgZGV0YWlscy4NCitUYXNrIGZpbmlzaGVkOiBqYXZhYw0KK1Rhc2sgc3RhcnRlZDogY29weQ0KK1Rhc2sgZmluaXNoZWQ6IGNvcHkNCitUYXNrIHN0YXJ0ZWQ6IG1rZGlyDQorVGFzayBmaW5pc2hlZDogbWtkaXINCitUYXNrIHN0YXJ0ZWQ6IGphcg0KK1Rhc2sgZmluaXNoZWQ6IGphcg0KK1Rhc2sgc3RhcnRlZDogZGVsZXRlDQorVGFzayBmaW5pc2hlZDogZGVsZXRlDQorVGFyZ2V0IGZpbmlzaGVkOiBwbHVnaW4yLmphcg0KK1Rhc2sgZmluaXNoZWQ6IGFudGNhbGwNCitUYXJnZXQgZmluaXNoZWQ6IGJ1aWxkLmphcnMNCitUYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQorVGFzayBzdGFydGVkOiBhbnRjYWxsDQorVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCitUYXJnZXQgc3RhcnRlZDogaW5pdA0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1RhcmdldCBmaW5pc2hlZDogaW5pdA0KK1RhcmdldCBzdGFydGVkOiBnYXRoZXIuYmluLnBhcnRzDQorVGFzayBzdGFydGVkOiBta2Rpcg0KK1Rhc2sgZmluaXNoZWQ6IG1rZGlyDQorVGFzayBzdGFydGVkOiBjb3B5DQorVGFzayBmaW5pc2hlZDogY29weQ0KK1Rhc2sgc3RhcnRlZDogY29weQ0KK1Rhc2sgZmluaXNoZWQ6IGNvcHkNCitUYXJnZXQgZmluaXNoZWQ6IGdhdGhlci5iaW4ucGFydHMNCitUYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQorVGFzayBzdGFydGVkOiB6aXANCitUYXNrIGZpbmlzaGVkOiB6aXANCitUYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KK1Rhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KK1RhcmdldCBmaW5pc2hlZDogYnVpbGQudXBkYXRlLmphcg0KK1Rhc2sgZmluaXNoZWQ6IGFudA0KK1RhcmdldCBmaW5pc2hlZDogYWxsLnBsdWdpbnMNCitUYXJnZXQgc3RhcnRlZDogdXBkYXRlLmZlYXR1cmUNCitUYXJnZXQgZmluaXNoZWQ6IHVwZGF0ZS5mZWF0dXJlDQorVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5jaGlsZHJlbg0KK1RhcmdldCBmaW5pc2hlZDogYWxsLmNoaWxkcmVuDQorVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgc3RhcnRlZDogZGVsZXRlDQorVGFzayBmaW5pc2hlZDogZGVsZXRlDQorVGFzayBzdGFydGVkOiBta2Rpcg0KK1Rhc2sgZmluaXNoZWQ6IG1rZGlyDQorVGFzayBzdGFydGVkOiBhbnRjYWxsDQorVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXJnZXQgZmluaXNoZWQ6IGluaXQNCitUYXJnZXQgc3RhcnRlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KK1Rhc2sgc3RhcnRlZDogYW50Y2FsbA0KK1RhcmdldCBzdGFydGVkOiBjaGlsZHJlbg0KK1RhcmdldCBmaW5pc2hlZDogY2hpbGRyZW4NCitUYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQorVGFzayBzdGFydGVkOiBta2Rpcg0KK1Rhc2sgZmluaXNoZWQ6IG1rZGlyDQorVGFzayBzdGFydGVkOiBjb3B5DQorVGFzayBmaW5pc2hlZDogY29weQ0KK1Rhc2sgc3RhcnRlZDogZWNsaXBzZS5pZFJlcGxhY2VyDQorVGFzayBmaW5pc2hlZDogZWNsaXBzZS5pZFJlcGxhY2VyDQorVGFzayBzdGFydGVkOiBhbnRjYWxsDQorVGFyZ2V0IHN0YXJ0ZWQ6IFJPT1RGSUxFUypfKl8qDQorVGFyZ2V0IGZpbmlzaGVkOiBST09URklMRVMqXypfKg0KK1Rhc2sgZmluaXNoZWQ6IGFudGNhbGwNCitUYXJnZXQgZmluaXNoZWQ6IGdhdGhlci5iaW4ucGFydHMNCitUYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQorVGFzayBzdGFydGVkOiBqYXINCitUYXNrIGZpbmlzaGVkOiBqYXINCitUYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KK1Rhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KK1RhcmdldCBmaW5pc2hlZDogYnVpbGQudXBkYXRlLmphcg0KK1Rhc2sgZmluaXNoZWQ6IGFudA0KK1Rhc2sgc3RhcnRlZDogYW50DQorVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXJnZXQgZmluaXNoZWQ6IGluaXQNCitUYXJnZXQgc3RhcnRlZDogYnVpbGQudXBkYXRlLmphcg0KK1Rhc2sgc3RhcnRlZDogYW50Y2FsbA0KK1RhcmdldCBzdGFydGVkOiBpbml0DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQorVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5mZWF0dXJlcw0KK1RhcmdldCBmaW5pc2hlZDogYWxsLmZlYXR1cmVzDQorVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5wbHVnaW5zDQorVGFzayBzdGFydGVkOiBhbnQNCitUYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1RhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KK1RhcmdldCBzdGFydGVkOiBpbml0DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQorVGFyZ2V0IHN0YXJ0ZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCitUYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KK1Rhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KK1Rhc2sgc3RhcnRlZDogbWtkaXINCitUYXNrIGZpbmlzaGVkOiBta2Rpcg0KK1Rhc2sgc3RhcnRlZDogYW50Y2FsbA0KK1RhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQorVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXJnZXQgZmluaXNoZWQ6IGluaXQNCitUYXJnZXQgc3RhcnRlZDogYnVpbGQuamFycw0KK1Rhc2sgc3RhcnRlZDogYXZhaWxhYmxlDQorVGFzayBmaW5pc2hlZDogYXZhaWxhYmxlDQorVGFzayBzdGFydGVkOiBhbnRjYWxsDQorVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCitUYXJnZXQgc3RhcnRlZDogaW5pdA0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1RhcmdldCBmaW5pc2hlZDogaW5pdA0KK1RhcmdldCBzdGFydGVkOiBwbHVnaW4yLmphcg0KK1RhcmdldCBmaW5pc2hlZDogcGx1Z2luMi5qYXINCitUYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQorVGFyZ2V0IGZpbmlzaGVkOiBidWlsZC5qYXJzDQorVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KK1Rhc2sgc3RhcnRlZDogYW50Y2FsbA0KK1RhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQorVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXJnZXQgZmluaXNoZWQ6IGluaXQNCitUYXJnZXQgc3RhcnRlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KK1Rhc2sgc3RhcnRlZDogbWtkaXINCitUYXNrIGZpbmlzaGVkOiBta2Rpcg0KK1Rhc2sgc3RhcnRlZDogY29weQ0KK1Rhc2sgZmluaXNoZWQ6IGNvcHkNCitUYXNrIHN0YXJ0ZWQ6IGNvcHkNCitUYXNrIGZpbmlzaGVkOiBjb3B5DQorVGFyZ2V0IGZpbmlzaGVkOiBnYXRoZXIuYmluLnBhcnRzDQorVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KK1Rhc2sgc3RhcnRlZDogemlwDQorVGFzayBmaW5pc2hlZDogemlwDQorVGFzayBzdGFydGVkOiBkZWxldGUNCitUYXNrIGZpbmlzaGVkOiBkZWxldGUNCitUYXJnZXQgZmluaXNoZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCitUYXNrIGZpbmlzaGVkOiBhbnQNCitUYXJnZXQgZmluaXNoZWQ6IGFsbC5wbHVnaW5zDQorVGFyZ2V0IHN0YXJ0ZWQ6IHVwZGF0ZS5mZWF0dXJlDQorVGFyZ2V0IGZpbmlzaGVkOiB1cGRhdGUuZmVhdHVyZQ0KK1RhcmdldCBzdGFydGVkOiBhbGwuY2hpbGRyZW4NCitUYXJnZXQgZmluaXNoZWQ6IGFsbC5jaGlsZHJlbg0KK1Rhc2sgZmluaXNoZWQ6IGFudGNhbGwNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KK1Rhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KK1Rhc2sgc3RhcnRlZDogbWtkaXINCitUYXNrIGZpbmlzaGVkOiBta2Rpcg0KK1Rhc2sgc3RhcnRlZDogYW50Y2FsbA0KK1RhcmdldCBzdGFydGVkOiBpbml0DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQorVGFyZ2V0IHN0YXJ0ZWQ6IGdhdGhlci5iaW4ucGFydHMNCitUYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCitUYXJnZXQgc3RhcnRlZDogY2hpbGRyZW4NCitUYXJnZXQgZmluaXNoZWQ6IGNoaWxkcmVuDQorVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KK1Rhc2sgc3RhcnRlZDogbWtkaXINCitUYXNrIGZpbmlzaGVkOiBta2Rpcg0KK1Rhc2sgc3RhcnRlZDogY29weQ0KK1Rhc2sgZmluaXNoZWQ6IGNvcHkNCitUYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UuaWRSZXBsYWNlcg0KK1Rhc2sgZmluaXNoZWQ6IGVjbGlwc2UuaWRSZXBsYWNlcg0KK1Rhc2sgc3RhcnRlZDogYW50Y2FsbA0KK1RhcmdldCBzdGFydGVkOiBST09URklMRVMqXypfKg0KK1RhcmdldCBmaW5pc2hlZDogUk9PVEZJTEVTKl8qXyoNCitUYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQorVGFyZ2V0IGZpbmlzaGVkOiBnYXRoZXIuYmluLnBhcnRzDQorVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KK1Rhc2sgc3RhcnRlZDogamFyDQorVGFzayBmaW5pc2hlZDogamFyDQorVGFzayBzdGFydGVkOiBkZWxldGUNCitUYXNrIGZpbmlzaGVkOiBkZWxldGUNCitUYXJnZXQgZmluaXNoZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCitUYXNrIGZpbmlzaGVkOiBhbnQNCitUYXNrIHN0YXJ0ZWQ6IGFudA0KK1RhcmdldCBzdGFydGVkOiBpbml0DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQorVGFyZ2V0IHN0YXJ0ZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCitUYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCitUYXJnZXQgc3RhcnRlZDogaW5pdA0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1RhcmdldCBmaW5pc2hlZDogaW5pdA0KK1RhcmdldCBzdGFydGVkOiBhbGwuZmVhdHVyZXMNCitUYXJnZXQgZmluaXNoZWQ6IGFsbC5mZWF0dXJlcw0KK1RhcmdldCBzdGFydGVkOiBhbGwucGx1Z2lucw0KK1Rhc2sgc3RhcnRlZDogYW50DQorVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCitUYXJnZXQgc3RhcnRlZDogaW5pdA0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1RhcmdldCBmaW5pc2hlZDogaW5pdA0KK1RhcmdldCBzdGFydGVkOiBidWlsZC51cGRhdGUuamFyDQorVGFzayBzdGFydGVkOiBkZWxldGUNCitUYXNrIGZpbmlzaGVkOiBkZWxldGUNCitUYXNrIHN0YXJ0ZWQ6IG1rZGlyDQorVGFzayBmaW5pc2hlZDogbWtkaXINCitUYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCitUYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1RhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KK1RhcmdldCBzdGFydGVkOiBpbml0DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQorVGFyZ2V0IHN0YXJ0ZWQ6IGJ1aWxkLmphcnMNCitUYXNrIHN0YXJ0ZWQ6IGF2YWlsYWJsZQ0KK1Rhc2sgZmluaXNoZWQ6IGF2YWlsYWJsZQ0KK1Rhc2sgc3RhcnRlZDogYW50Y2FsbA0KK1RhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQorVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXJnZXQgZmluaXNoZWQ6IGluaXQNCitUYXJnZXQgc3RhcnRlZDogcGx1Z2luMmEuamFyDQorVGFzayBzdGFydGVkOiBkZWxldGUNCitUYXNrIGZpbmlzaGVkOiBkZWxldGUNCitUYXNrIHN0YXJ0ZWQ6IG1rZGlyDQorVGFzayBmaW5pc2hlZDogbWtkaXINCitUYXNrIHN0YXJ0ZWQ6IGphdmFjDQorTWVzc2FnZSBsb2dnZWQ6IENvbXBpbGUgZmFpbGVkOyBzZWUgdGhlIGNvbXBpbGVyIGVycm9yIG91dHB1dCBmb3IgZGV0YWlscy4NCitUYXNrIGZpbmlzaGVkOiBqYXZhYw0KK1Rhc2sgc3RhcnRlZDogY29weQ0KK1Rhc2sgZmluaXNoZWQ6IGNvcHkNCitUYXNrIHN0YXJ0ZWQ6IG1rZGlyDQorVGFzayBmaW5pc2hlZDogbWtkaXINCitUYXNrIHN0YXJ0ZWQ6IGphcg0KK1Rhc2sgZmluaXNoZWQ6IGphcg0KK1Rhc2sgc3RhcnRlZDogZGVsZXRlDQorVGFzayBmaW5pc2hlZDogZGVsZXRlDQorVGFyZ2V0IGZpbmlzaGVkOiBwbHVnaW4yYS5qYXINCitUYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQorVGFyZ2V0IGZpbmlzaGVkOiBidWlsZC5qYXJzDQorVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KK1Rhc2sgc3RhcnRlZDogYW50Y2FsbA0KK1RhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQorVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXJnZXQgZmluaXNoZWQ6IGluaXQNCitUYXJnZXQgc3RhcnRlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KK1Rhc2sgc3RhcnRlZDogbWtkaXINCitUYXNrIGZpbmlzaGVkOiBta2Rpcg0KK1Rhc2sgc3RhcnRlZDogY29weQ0KK1Rhc2sgZmluaXNoZWQ6IGNvcHkNCitUYXNrIHN0YXJ0ZWQ6IGNvcHkNCitUYXNrIGZpbmlzaGVkOiBjb3B5DQorVGFyZ2V0IGZpbmlzaGVkOiBnYXRoZXIuYmluLnBhcnRzDQorVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KK1Rhc2sgc3RhcnRlZDogemlwDQorVGFzayBmaW5pc2hlZDogemlwDQorVGFzayBzdGFydGVkOiBkZWxldGUNCitUYXNrIGZpbmlzaGVkOiBkZWxldGUNCitUYXJnZXQgZmluaXNoZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCitUYXNrIGZpbmlzaGVkOiBhbnQNCitUYXNrIHN0YXJ0ZWQ6IGFudA0KK1RhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQorVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXJnZXQgZmluaXNoZWQ6IGluaXQNCitUYXJnZXQgc3RhcnRlZDogYnVpbGQudXBkYXRlLmphcg0KK1Rhc2sgc3RhcnRlZDogZGVsZXRlDQorVGFzayBmaW5pc2hlZDogZGVsZXRlDQorVGFzayBzdGFydGVkOiBta2Rpcg0KK1Rhc2sgZmluaXNoZWQ6IG1rZGlyDQorVGFzayBzdGFydGVkOiBhbnRjYWxsDQorVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCitUYXJnZXQgc3RhcnRlZDogaW5pdA0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1RhcmdldCBmaW5pc2hlZDogaW5pdA0KK1RhcmdldCBzdGFydGVkOiBidWlsZC5qYXJzDQorVGFzayBzdGFydGVkOiBhdmFpbGFibGUNCitUYXNrIGZpbmlzaGVkOiBhdmFpbGFibGUNCitUYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCitUYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1RhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KK1RhcmdldCBzdGFydGVkOiBpbml0DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQorVGFyZ2V0IHN0YXJ0ZWQ6IHBsdWdpbjIuamFyDQorVGFyZ2V0IGZpbmlzaGVkOiBwbHVnaW4yLmphcg0KK1Rhc2sgZmluaXNoZWQ6IGFudGNhbGwNCitUYXJnZXQgZmluaXNoZWQ6IGJ1aWxkLmphcnMNCitUYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQorVGFzayBzdGFydGVkOiBhbnRjYWxsDQorVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCitUYXJnZXQgc3RhcnRlZDogaW5pdA0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1RhcmdldCBmaW5pc2hlZDogaW5pdA0KK1RhcmdldCBzdGFydGVkOiBnYXRoZXIuYmluLnBhcnRzDQorVGFzayBzdGFydGVkOiBta2Rpcg0KK1Rhc2sgZmluaXNoZWQ6IG1rZGlyDQorVGFzayBzdGFydGVkOiBjb3B5DQorVGFzayBmaW5pc2hlZDogY29weQ0KK1Rhc2sgc3RhcnRlZDogY29weQ0KK1Rhc2sgZmluaXNoZWQ6IGNvcHkNCitUYXJnZXQgZmluaXNoZWQ6IGdhdGhlci5iaW4ucGFydHMNCitUYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQorVGFzayBzdGFydGVkOiB6aXANCitUYXNrIGZpbmlzaGVkOiB6aXANCitUYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KK1Rhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KK1RhcmdldCBmaW5pc2hlZDogYnVpbGQudXBkYXRlLmphcg0KK1Rhc2sgZmluaXNoZWQ6IGFudA0KK1RhcmdldCBmaW5pc2hlZDogYWxsLnBsdWdpbnMNCitUYXJnZXQgc3RhcnRlZDogdXBkYXRlLmZlYXR1cmUNCitUYXJnZXQgZmluaXNoZWQ6IHVwZGF0ZS5mZWF0dXJlDQorVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5jaGlsZHJlbg0KK1RhcmdldCBmaW5pc2hlZDogYWxsLmNoaWxkcmVuDQorVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgc3RhcnRlZDogZGVsZXRlDQorVGFzayBmaW5pc2hlZDogZGVsZXRlDQorVGFzayBzdGFydGVkOiBta2Rpcg0KK1Rhc2sgZmluaXNoZWQ6IG1rZGlyDQorVGFzayBzdGFydGVkOiBhbnRjYWxsDQorVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXJnZXQgZmluaXNoZWQ6IGluaXQNCitUYXJnZXQgc3RhcnRlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KK1Rhc2sgc3RhcnRlZDogYW50Y2FsbA0KK1RhcmdldCBzdGFydGVkOiBjaGlsZHJlbg0KK1RhcmdldCBmaW5pc2hlZDogY2hpbGRyZW4NCitUYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQorVGFzayBzdGFydGVkOiBta2Rpcg0KK1Rhc2sgZmluaXNoZWQ6IG1rZGlyDQorVGFzayBzdGFydGVkOiBjb3B5DQorVGFzayBmaW5pc2hlZDogY29weQ0KK1Rhc2sgc3RhcnRlZDogZWNsaXBzZS5pZFJlcGxhY2VyDQorVGFzayBmaW5pc2hlZDogZWNsaXBzZS5pZFJlcGxhY2VyDQorVGFzayBzdGFydGVkOiBhbnRjYWxsDQorVGFyZ2V0IHN0YXJ0ZWQ6IFJPT1RGSUxFUypfKl8qDQorVGFyZ2V0IGZpbmlzaGVkOiBST09URklMRVMqXypfKg0KK1Rhc2sgZmluaXNoZWQ6IGFudGNhbGwNCitUYXJnZXQgZmluaXNoZWQ6IGdhdGhlci5iaW4ucGFydHMNCitUYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQorVGFzayBzdGFydGVkOiBqYXINCitUYXNrIGZpbmlzaGVkOiBqYXINCitUYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KK1Rhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KK1RhcmdldCBmaW5pc2hlZDogYnVpbGQudXBkYXRlLmphcg0KK1Rhc2sgZmluaXNoZWQ6IGFudA0KK1RhcmdldCBmaW5pc2hlZDogYWxsLmZlYXR1cmVzDQorVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5wbHVnaW5zDQorVGFyZ2V0IGZpbmlzaGVkOiBhbGwucGx1Z2lucw0KK1RhcmdldCBzdGFydGVkOiB1cGRhdGUuZmVhdHVyZQ0KK1RhcmdldCBmaW5pc2hlZDogdXBkYXRlLmZlYXR1cmUNCitUYXJnZXQgc3RhcnRlZDogYWxsLmNoaWxkcmVuDQorVGFyZ2V0IGZpbmlzaGVkOiBhbGwuY2hpbGRyZW4NCitUYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFzayBzdGFydGVkOiBkZWxldGUNCitUYXNrIGZpbmlzaGVkOiBkZWxldGUNCitUYXNrIHN0YXJ0ZWQ6IG1rZGlyDQorVGFzayBmaW5pc2hlZDogbWtkaXINCitUYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCitUYXJnZXQgc3RhcnRlZDogaW5pdA0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1RhcmdldCBmaW5pc2hlZDogaW5pdA0KK1RhcmdldCBzdGFydGVkOiBnYXRoZXIuYmluLnBhcnRzDQorVGFzayBzdGFydGVkOiBhbnRjYWxsDQorVGFyZ2V0IHN0YXJ0ZWQ6IGNoaWxkcmVuDQorVGFyZ2V0IGZpbmlzaGVkOiBjaGlsZHJlbg0KK1Rhc2sgZmluaXNoZWQ6IGFudGNhbGwNCitUYXNrIHN0YXJ0ZWQ6IG1rZGlyDQorVGFzayBmaW5pc2hlZDogbWtkaXINCitUYXNrIHN0YXJ0ZWQ6IGNvcHkNCitUYXNrIGZpbmlzaGVkOiBjb3B5DQorVGFzayBzdGFydGVkOiBlY2xpcHNlLmlkUmVwbGFjZXINCitUYXNrIGZpbmlzaGVkOiBlY2xpcHNlLmlkUmVwbGFjZXINCitUYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCitUYXJnZXQgc3RhcnRlZDogUk9PVEZJTEVTKl8qXyoNCitUYXJnZXQgZmluaXNoZWQ6IFJPT1RGSUxFUypfKl8qDQorVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KK1RhcmdldCBmaW5pc2hlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KK1Rhc2sgZmluaXNoZWQ6IGFudGNhbGwNCitUYXNrIHN0YXJ0ZWQ6IGphcg0KK1Rhc2sgZmluaXNoZWQ6IGphcg0KK1Rhc2sgc3RhcnRlZDogZGVsZXRlDQorVGFzayBmaW5pc2hlZDogZGVsZXRlDQorVGFyZ2V0IGZpbmlzaGVkOiBidWlsZC51cGRhdGUuamFyDQorVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXJnZXQgZmluaXNoZWQ6IGluaXQNCitUYXJnZXQgc3RhcnRlZDogcmVmcmVzaA0KK1Rhc2sgc3RhcnRlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KK1Rhc2sgZmluaXNoZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCitUYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQorTWVzc2FnZSBsb2dnZWQ6IFByb2plY3QgJHt1cGRhdGUuZmVhdHVyZTJjXzMuMC4wfSBkb2VzIG5vdCBleGlzdCBhbmQgY2Fubm90IGJlIHJlZnJlc2hlZC4NCitUYXNrIGZpbmlzaGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KK1Rhc2sgc3RhcnRlZDogYW50Y2FsbA0KK1RhcmdldCBzdGFydGVkOiBpbml0DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQorVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5mZWF0dXJlcw0KK1Rhc2sgc3RhcnRlZDogYW50DQorVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXJnZXQgZmluaXNoZWQ6IGluaXQNCitUYXJnZXQgc3RhcnRlZDogcmVmcmVzaA0KK1Rhc2sgc3RhcnRlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KK1Rhc2sgZmluaXNoZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCitUYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQorTWVzc2FnZSBsb2dnZWQ6IFByb2plY3QgJHt1cGRhdGUuZmVhdHVyZTJfMS4wLjB9IGRvZXMgbm90IGV4aXN0IGFuZCBjYW5ub3QgYmUgcmVmcmVzaGVkLg0KK1Rhc2sgZmluaXNoZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQorVGFzayBzdGFydGVkOiBhbnRjYWxsDQorVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXJnZXQgZmluaXNoZWQ6IGluaXQNCitUYXJnZXQgc3RhcnRlZDogYWxsLmZlYXR1cmVzDQorVGFyZ2V0IGZpbmlzaGVkOiBhbGwuZmVhdHVyZXMNCitUYXJnZXQgc3RhcnRlZDogYWxsLnBsdWdpbnMNCitUYXNrIHN0YXJ0ZWQ6IGFudA0KK1RhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQorVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXJnZXQgZmluaXNoZWQ6IGluaXQNCitUYXJnZXQgc3RhcnRlZDogcmVmcmVzaA0KK1Rhc2sgc3RhcnRlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KK1Rhc2sgZmluaXNoZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCitUYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQorVGFzayBmaW5pc2hlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCitUYXJnZXQgZmluaXNoZWQ6IHJlZnJlc2gNCitUYXNrIGZpbmlzaGVkOiBhbnQNCitUYXJnZXQgZmluaXNoZWQ6IGFsbC5wbHVnaW5zDQorVGFyZ2V0IHN0YXJ0ZWQ6IHVwZGF0ZS5mZWF0dXJlDQorVGFyZ2V0IGZpbmlzaGVkOiB1cGRhdGUuZmVhdHVyZQ0KK1RhcmdldCBzdGFydGVkOiBhbGwuY2hpbGRyZW4NCitUYXJnZXQgZmluaXNoZWQ6IGFsbC5jaGlsZHJlbg0KK1Rhc2sgZmluaXNoZWQ6IGFudGNhbGwNCitUYXJnZXQgZmluaXNoZWQ6IHJlZnJlc2gNCitUYXNrIGZpbmlzaGVkOiBhbnQNCitUYXNrIHN0YXJ0ZWQ6IGFudA0KK1RhcmdldCBzdGFydGVkOiBpbml0DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQorVGFyZ2V0IHN0YXJ0ZWQ6IHJlZnJlc2gNCitUYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCitUYXNrIGZpbmlzaGVkOiBlY2xpcHNlLmNvbnZlcnRQYXRoDQorVGFzayBzdGFydGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KK01lc3NhZ2UgbG9nZ2VkOiBQcm9qZWN0ICR7dXBkYXRlLmZlYXR1cmUyXzEuMC4wfSBkb2VzIG5vdCBleGlzdCBhbmQgY2Fubm90IGJlIHJlZnJlc2hlZC4NCitUYXNrIGZpbmlzaGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KK1Rhc2sgc3RhcnRlZDogYW50Y2FsbA0KK1RhcmdldCBzdGFydGVkOiBpbml0DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQorVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5mZWF0dXJlcw0KK1RhcmdldCBmaW5pc2hlZDogYWxsLmZlYXR1cmVzDQorVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5wbHVnaW5zDQorVGFzayBzdGFydGVkOiBhbnQNCitUYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1RhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KK1RhcmdldCBzdGFydGVkOiBpbml0DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQorVGFyZ2V0IHN0YXJ0ZWQ6IHJlZnJlc2gNCitUYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCitUYXNrIGZpbmlzaGVkOiBlY2xpcHNlLmNvbnZlcnRQYXRoDQorVGFzayBzdGFydGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KK1Rhc2sgZmluaXNoZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQorVGFyZ2V0IGZpbmlzaGVkOiByZWZyZXNoDQorVGFzayBmaW5pc2hlZDogYW50DQorVGFyZ2V0IGZpbmlzaGVkOiBhbGwucGx1Z2lucw0KK1RhcmdldCBzdGFydGVkOiB1cGRhdGUuZmVhdHVyZQ0KK1RhcmdldCBmaW5pc2hlZDogdXBkYXRlLmZlYXR1cmUNCitUYXJnZXQgc3RhcnRlZDogYWxsLmNoaWxkcmVuDQorVGFyZ2V0IGZpbmlzaGVkOiBhbGwuY2hpbGRyZW4NCitUYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQorVGFyZ2V0IGZpbmlzaGVkOiByZWZyZXNoDQorVGFzayBmaW5pc2hlZDogYW50DQorVGFzayBzdGFydGVkOiBhbnQNCitUYXJnZXQgc3RhcnRlZDogaW5pdA0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgc3RhcnRlZDogcHJvcGVydHkNCitUYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KK1RhcmdldCBmaW5pc2hlZDogaW5pdA0KK1RhcmdldCBzdGFydGVkOiByZWZyZXNoDQorVGFzayBzdGFydGVkOiBlY2xpcHNlLmNvbnZlcnRQYXRoDQorVGFzayBmaW5pc2hlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KK1Rhc2sgc3RhcnRlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCitNZXNzYWdlIGxvZ2dlZDogUHJvamVjdCAke3VwZGF0ZS5mZWF0dXJlMmJfMi4wLjB9IGRvZXMgbm90IGV4aXN0IGFuZCBjYW5ub3QgYmUgcmVmcmVzaGVkLg0KK1Rhc2sgZmluaXNoZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQorVGFzayBzdGFydGVkOiBhbnRjYWxsDQorVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXJnZXQgZmluaXNoZWQ6IGluaXQNCitUYXJnZXQgc3RhcnRlZDogYWxsLmZlYXR1cmVzDQorVGFyZ2V0IGZpbmlzaGVkOiBhbGwuZmVhdHVyZXMNCitUYXJnZXQgc3RhcnRlZDogYWxsLnBsdWdpbnMNCitUYXNrIHN0YXJ0ZWQ6IGFudA0KK1RhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQorVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXJnZXQgZmluaXNoZWQ6IGluaXQNCitUYXJnZXQgc3RhcnRlZDogcmVmcmVzaA0KK1Rhc2sgc3RhcnRlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KK1Rhc2sgZmluaXNoZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCitUYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQorVGFzayBmaW5pc2hlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCitUYXJnZXQgZmluaXNoZWQ6IHJlZnJlc2gNCitUYXNrIGZpbmlzaGVkOiBhbnQNCitUYXNrIHN0YXJ0ZWQ6IGFudA0KK1RhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQorVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KK1Rhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQorVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQorVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQorVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCitUYXJnZXQgZmluaXNoZWQ6IGluaXQNCitUYXJnZXQgc3RhcnRlZDogcmVmcmVzaA0KK1Rhc2sgc3RhcnRlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KK1Rhc2sgZmluaXNoZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCitUYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQorVGFzayBmaW5pc2hlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCitUYXJnZXQgZmluaXNoZWQ6IHJlZnJlc2gNCitUYXNrIGZpbmlzaGVkOiBhbnQNCitUYXJnZXQgZmluaXNoZWQ6IGFsbC5wbHVnaW5zDQorVGFyZ2V0IHN0YXJ0ZWQ6IHVwZGF0ZS5mZWF0dXJlDQorVGFyZ2V0IGZpbmlzaGVkOiB1cGRhdGUuZmVhdHVyZQ0KK1RhcmdldCBzdGFydGVkOiBhbGwuY2hpbGRyZW4NCitUYXJnZXQgZmluaXNoZWQ6IGFsbC5jaGlsZHJlbg0KK1Rhc2sgZmluaXNoZWQ6IGFudGNhbGwNCitUYXJnZXQgZmluaXNoZWQ6IHJlZnJlc2gNCitUYXNrIGZpbmlzaGVkOiBhbnQNCitUYXJnZXQgZmluaXNoZWQ6IGFsbC5mZWF0dXJlcw0KK1RhcmdldCBzdGFydGVkOiBhbGwucGx1Z2lucw0KK1RhcmdldCBmaW5pc2hlZDogYWxsLnBsdWdpbnMNCitUYXJnZXQgc3RhcnRlZDogdXBkYXRlLmZlYXR1cmUNCitUYXJnZXQgZmluaXNoZWQ6IHVwZGF0ZS5mZWF0dXJlDQorVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5jaGlsZHJlbg0KK1RhcmdldCBmaW5pc2hlZDogYWxsLmNoaWxkcmVuDQorVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KK1RhcmdldCBmaW5pc2hlZDogcmVmcmVzaA0KK0J1aWxkIGZpbmlzaGVkLg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU1Ly5zaXRlYnVpbGQvc2l0ZWJ1aWxkLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU1Ly5zaXRlYnVpbGQvc2l0ZWJ1aWxkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTI0M2QzCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTUvLnNpdGVidWlsZC9zaXRlYnVpbGQueG1sCkBAIC0wLDAgKzEsMTAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8c2l0ZS1idWlsZAorICAgICAgZmVhdHVyZS1sb2NhdGlvbj0iZmVhdHVyZXMiCisgICAgICBwbHVnaW4tbG9jYXRpb249InBsdWdpbnMiCisgICAgICBhdXRvYnVpbGQ9ImZhbHNlIgorICAgICAgc2NydWItb3V0cHV0PSJmYWxzZSIKKyAgICAgIHVzZS1jb25zb2xlPSJ0cnVlIj4KKyAgIDxmZWF0dXJlIGlkPSJ1cGRhdGUuZmVhdHVyZTFjIiB2ZXJzaW9uPSIzLjAuMCIvPgorICAgPGZlYXR1cmUgaWQ9InVwZGF0ZS5mZWF0dXJlMmMiIHZlcnNpb249IjMuMC4wIi8+Cis8L3NpdGUtYnVpbGQ+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTFfMS4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTUvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUxXzEuMC4wLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTJkOWUyCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTUvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUxXzEuMC4wLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTFfMS4wLjEuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTUvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUxXzEuMC4xLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWIwYjZmCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTUvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUxXzEuMC4xLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTFiXzIuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU1L2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMWJfMi4wLjAuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5YjA3NjQKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTFiXzIuMC4wLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTFjXzMuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU1L2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMWNfMy4wLjAuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0MjZmODYKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTFjXzMuMC4wLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTJfMS4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTUvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUyXzEuMC4wLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDcwY2NkCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTUvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUyXzEuMC4wLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTJiXzIuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU1L2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMmJfMi4wLjAuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0OGFjMDUKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTJiXzIuMC4wLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTJjXzMuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU1L2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMmNfMy4wLjAuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwMDM3ZGYKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTJjXzMuMC4wLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS9wbHVnaW5zL2NvbS5wbHVnaW4xXzEuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU1L3BsdWdpbnMvY29tLnBsdWdpbjFfMS4wLjAuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1NDM3NDkKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS9wbHVnaW5zL2NvbS5wbHVnaW4xXzEuMC4wLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS9wbHVnaW5zL2NvbS5wbHVnaW4xYV8xLjAuMS5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS9wbHVnaW5zL2NvbS5wbHVnaW4xYV8xLjAuMS5qYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMyY2MzZgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU1L3BsdWdpbnMvY29tLnBsdWdpbjFhXzEuMC4xLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS9wbHVnaW5zL2NvbS5wbHVnaW4yXzEuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU1L3BsdWdpbnMvY29tLnBsdWdpbjJfMS4wLjAuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiYzhhODgKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS9wbHVnaW5zL2NvbS5wbHVnaW4yXzEuMC4wLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS9wbHVnaW5zL2NvbS5wbHVnaW4yYV8xLjAuMS5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS9wbHVnaW5zL2NvbS5wbHVnaW4yYV8xLjAuMS5qYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNjZDBmYgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU1L3BsdWdpbnMvY29tLnBsdWdpbjJhXzEuMC4xLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS9zaXRlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU1L3NpdGUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlMjZkYjEKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS9zaXRlLnhtbApAQCAtMCwwICsxLDE5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHNpdGU+CisgICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMWNfMy4wLjAuamFyIiBpZD0idXBkYXRlLmZlYXR1cmUxYyIgdmVyc2lvbj0iMy4wLjAiPgorICAgICAgPGNhdGVnb3J5IG5hbWU9IlNpdGU1LUNhdGVnb3J5MSIvPgorICAgPC9mZWF0dXJlPgorICAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy91cGRhdGUuZmVhdHVyZTJjXzMuMC4wLmphciIgaWQ9InVwZGF0ZS5mZWF0dXJlMmMiIHZlcnNpb249IjMuMC4wIj4KKyAgICAgIDxjYXRlZ29yeSBuYW1lPSJTaXRlNS1DYXRlZ29yeTIiLz4KKyAgIDwvZmVhdHVyZT4KKyAgIDxjYXRlZ29yeS1kZWYgbmFtZT0iU2l0ZTUtQ2F0ZWdvcnkxIiBsYWJlbD0iU2l0ZTUtQ2F0ZWdvcnkxLUxhYmVsIj4KKyAgICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgIGVjZXRlcmEuCisgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgPC9jYXRlZ29yeS1kZWY+CisgICA8Y2F0ZWdvcnktZGVmIG5hbWU9IlNpdGU1LUNhdGVnb3J5MiIgbGFiZWw9IlNpdGU1LUNhdGVnb3J5Mi1MYWJlbCI+CisgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICBlY2V0ZXJhLgorICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgIDwvY2F0ZWdvcnktZGVmPgorPC9zaXRlPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0L2ZlYXR1cmVzL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmNoaWxkcmVuZmVhdHVyZV8yLjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QvZmVhdHVyZXMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuY2hpbGRyZW5mZWF0dXJlXzIuMC4wLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjU4MDM0Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0L2ZlYXR1cmVzL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmNoaWxkcmVuZmVhdHVyZV8yLjAuMC5qYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0L2ZlYXR1cmVzL3Jvb3RmZWF0dXJlLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdC9mZWF0dXJlcy9yb290ZmVhdHVyZS5qYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAxMTA1MAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdC9mZWF0dXJlcy9yb290ZmVhdHVyZS5qYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0L3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMV8zLjUuNi5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4xXzMuNS42LmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDlmNWJjCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0L3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMV8zLjUuNi5qYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0L3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMl81LjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4yXzUuMC4wLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjRiMDRhCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0L3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMl81LjAuMC5qYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0L3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMl81LjAuMS5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4yXzUuMC4xLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjIwOGZlCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0L3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMl81LjAuMS5qYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0L3NpdGUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0L3NpdGUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyM2NiMWEKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3Qvc2l0ZS54bWwKQEAgLTAsMCArMSw0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHNpdGU+CisgIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvcm9vdGZlYXR1cmUuamFyIi8+Cis8L3NpdGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0Mi9mZWF0dXJlcy9jaGlsZHJlbmZlYXR1cmUuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0Mi9mZWF0dXJlcy9jaGlsZHJlbmZlYXR1cmUuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlMDU3ZTYKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QyL2ZlYXR1cmVzL2NoaWxkcmVuZmVhdHVyZS5qYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0Mi9mZWF0dXJlcy9yb290ZmVhdHVyZS5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QyL2ZlYXR1cmVzL3Jvb3RmZWF0dXJlLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGEwYTNjCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0Mi9mZWF0dXJlcy9yb290ZmVhdHVyZS5qYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0Mi9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjFfMy41LjYuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0Mi9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjFfMy41LjYuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkOWY1YmMKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QyL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMV8zLjUuNi5qYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0Mi9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjJfNS4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0Mi9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjJfNS4wLjAuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiNGIwNGEKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QyL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMl81LjAuMC5qYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0Mi9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjJfNS4wLjEuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0Mi9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjJfNS4wLjEuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyMjA4ZmUKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QyL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMl81LjAuMS5qYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0Mi9zaXRlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdDIvc2l0ZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc1MmRhMgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdDIvc2l0ZS54bWwKQEAgLTAsMCArMSw3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHNpdGU+CisgIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvcm9vdGZlYXR1cmUuamFyIi8+CisgIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvY2hpbGRyZW5mZWF0dXJlLmphciIvPiAgCisgIAorICA8YXJjaGl2ZSBwYXRoPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5jaGlsZHJlbmZlYXR1cmVfMi4xLjAuamFyIiB1cmw9ImZlYXR1cmVzL2NoaWxkcmVuZmVhdHVyZS5qYXIiLz4gIAorPC9zaXRlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdDMvZmVhdHVyZXMvY2hpbGRyZW5mZWF0dXJlLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdDMvZmVhdHVyZXMvY2hpbGRyZW5mZWF0dXJlLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmVlNGJhCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0My9mZWF0dXJlcy9jaGlsZHJlbmZlYXR1cmUuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdDMvZmVhdHVyZXMvcm9vdGZlYXR1cmUuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0My9mZWF0dXJlcy9yb290ZmVhdHVyZS5qYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk5YmRkYQotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdDMvZmVhdHVyZXMvcm9vdGZlYXR1cmUuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdDMvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4xXzMuNS42LmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdDMvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4xXzMuNS42LmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDlmNWJjCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0My9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjFfMy41LjYuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdDMvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4yXzUuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdDMvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4yXzUuMC4wLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjRiMDRhCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0My9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjJfNS4wLjAuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdDMvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4yXzUuMC4xLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdDMvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4yXzUuMC4xLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjIwOGZlCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0My9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjJfNS4wLjEuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdDMvc2l0ZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QzL3NpdGUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmNjk2YmEKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QzL3NpdGUueG1sCkBAIC0wLDAgKzEsNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxzaXRlPgorICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL3Jvb3RmZWF0dXJlLmphciIvPgorICAKKyAgPGFyY2hpdmUgcGF0aD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuY2hpbGRyZW5mZWF0dXJlXzIuMS4wLmphciIgdXJsPSJmZWF0dXJlcy9jaGlsZHJlbmZlYXR1cmUuamFyIi8+ICAKKzwvc2l0ZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9mZWF0dXJlMS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9mZWF0dXJlMS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNkNzA4MAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL2ZlYXR1cmUxLnhtbApAQCAtMCwwICsxLDI1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGZlYXR1cmUKKyAgIGlkPSJvcmcuZWNsaXBzZS5wbGF0Zm9ybSIKKyAgIHZlcnNpb249IjIuMS4wIgorICAgbGFiZWw9IkVjbGlwc2UgUGxhdGZvcm0iCisgICBwcm92aWRlci1uYW1lPSJ3d3cuZWNsaXBzZS5vcmciCisgICBpbWFnZT0ic3BsYXNoL3NwbGFzaF9mdWxsLmJtcCIKKyAgID4KKworCTxsaWNlbnNlPgorICAgIAkgbGljZW5zZQorCTwvbGljZW5zZT4KKworICAgPGNvcHlyaWdodCB1cmw9Im5vdGljZS5odG1sIi8+CisgICB4CisJCisgICA8bGljZW5zZSB1cmw9ImFib3V0Lmh0bWwiPgorICAgeAorICAgPC9saWNlbnNlPgorCisgICA8dXJsPgorICAgICAgPHVwZGF0ZSB1cmw9ImZpbGU6L0Q6LyIgbGFiZWw9IkVjbGlwc2UgVXBkYXRlIFNpdGUiLz4KKyAgIDwvdXJsPgorCis8L2ZlYXR1cmU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvZmVhdHVyZTFiaXMueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvZmVhdHVyZTFiaXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NTVmOTcKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9mZWF0dXJlMWJpcy54bWwKQEAgLTAsMCArMSwyNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxmZWF0dXJlCisgICBpZD0ib3JnLmVjbGlwc2UucGxhdGZvcm0iCisgICB2ZXJzaW9uPSIyLjEuMCIKKyAgIGxhYmVsPSJFY2xpcHNlIFBsYXRmb3JtIgorICAgcHJvdmlkZXItbmFtZT0id3d3LmVjbGlwc2Uub3JnIgorICAgaW1hZ2U9InNwbGFzaC9zcGxhc2hfZnVsbC5ibXAiCisgICA+CisKKyAgIDxkZXNjcmlwdGlvbj4KKyAgIEVjbGlwc2UgcGxhdGZvcm0gZmVhdHVyZS4KKyAgIDwvZGVzY3JpcHRpb24+CisKKyAgIDxjb3B5cmlnaHQgdXJsPSJub3RpY2UuaHRtbCIvPgorICAgPGJsYWggLz4KKwkKKyAgIDxsaWNlbnNlIHVybD0iYWJvdXQuaHRtbCI+CisKKyAgIDwvbGljZW5zZT4KKworICAgPHVybD4KKyAgICAgIDx1cGRhdGUgdXJsPSJmaWxlOi9EOi8iIGxhYmVsPSJFY2xpcHNlIFVwZGF0ZSBTaXRlIi8+CisgICA8L3VybD4KKworPC9mZWF0dXJlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL2ZlYXR1cmUyLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL2ZlYXR1cmUyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzJkZjliCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvZmVhdHVyZTIueG1sCkBAIC0wLDAgKzEsMjQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8ZmVhdHVyZQorICAgaWQ9Im9yZy5lY2xpcHNlLnBsYXRmb3JtIgorICAgdmVyc2lvbj0iMi4xLjAiCisgICBsYWJlbD0iRWNsaXBzZSBQbGF0Zm9ybSIKKyAgIHByb3ZpZGVyLW5hbWU9Ind3dy5lY2xpcHNlLm9yZyIKKyAgIGltYWdlPSJzcGxhc2gvc3BsYXNoX2Z1bGwuYm1wIgorICAgYmxhaD0iYmxhaCIKKyAgID4KKworICAgPGRlc2NyaXB0aW9uIGJsYWg9ImJsYWgiPgorICAgRWNsaXBzZSBwbGF0Zm9ybSBmZWF0dXJlLgorICAgPC9kZXNjcmlwdGlvbj4KKworICAgPGNvcHlyaWdodCB1cmw9Im5vdGljZS5odG1sIiBibGFoPSJibGFoIi8+CisJCisgICA8bGljZW5zZSB1cmw9ImFib3V0Lmh0bWwiIGJsYWg9ImJsYWgiPgorICAgPC9saWNlbnNlPgorCisgICA8dXJsIGJsYWg9ImJsYWgiPgorICAgICAgPHVwZGF0ZSB1cmw9ImZpbGU6L0Q6LyIgbGFiZWw9IkVjbGlwc2UgVXBkYXRlIFNpdGUiIGJsYWg9ImJsYWgiLz4KKyAgIDwvdXJsPgorCis8L2ZlYXR1cmU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvZmVhdHVyZTMueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvZmVhdHVyZTMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhNjYwYmUKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9mZWF0dXJlMy54bWwKQEAgLTAsMCArMSwyNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxmZWF0dXJlCisgICBpZD0ib3JnLmVjbGlwc2UucGxhdGZvcm0iCisgICB2ZXJzaW9uPSIyLjEuMCIKKyAgIGxhYmVsPSJFY2xpcHNlIFBsYXRmb3JtIgorICAgcHJvdmlkZXItbmFtZT0id3d3LmVjbGlwc2Uub3JnIgorICAgaW1hZ2U9InNwbGFzaC9zcGxhc2hfZnVsbC5ibXAiCisgICA+CisKKyAgIDxkZXNjcmlwdGlvbj4KKyAgIEVjbGlwc2UgcGxhdGZvcm0gZmVhdHVyZS4KKyAgIDwvZGVzY3JpcHRpb24+CisKKyAgIDxjb3B5cmlnaHQgdXJsPSIkb3MkLyR3cyQvbm90aWNlLmh0bWwiLz4KKyAgIHgKKwkKKyAgIDxsaWNlbnNlIHVybD0iYWJvdXQuaHRtbCI+CisgICB4CisgICA8L2xpY2Vuc2U+CisKKyAgIDx1cmw+CisgICAgICA8dXBkYXRlIHVybD0iZmlsZTovRDovIiBsYWJlbD0iRWNsaXBzZSBVcGRhdGUgU2l0ZSIvPgorICAgPC91cmw+CisKKzwvZmVhdHVyZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9mZWF0dXJlNC54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9mZWF0dXJlNC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTcxODdjOQotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL2ZlYXR1cmU0LnhtbApAQCAtMCwwICsxLDI2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGZlYXR1cmUKKyAgIGlkPSJvcmcuZWNsaXBzZS5wbGF0Zm9ybSIKKyAgIHZlcnNpb249IjIuMS4wIgorICAgbGFiZWw9IkVjbGlwc2UgUGxhdGZvcm0iCisgICBwcm92aWRlci1uYW1lPSJ3d3cuZWNsaXBzZS5vcmciCisgICBpbWFnZT0ic3BsYXNoL3NwbGFzaF9mdWxsLmJtcCIKKyAgID4KKworICAgPGRlc2NyaXB0aW9uPgorICAgRWNsaXBzZSBwbGF0Zm9ybSBmZWF0dXJlLgorICAgPC9kZXNjcmlwdGlvbj4KKworICAgPGNvcHlyaWdodCB1cmw9IiRvcyQvJHdzJC9ub3RpY2UuaHRtbCIvPgorICAgeAorCQorICAgPGxpY2Vuc2UgdXJsPSJhYm91dC5odG1sIj4KKyAgIHgKKyAgIDwvbGljZW5zZT4KKworICAgPHVybD4KKyAgICAgIDx1cGRhdGUgdXJsPSJmaWxlOi9EOi8iIGxhYmVsPSJFY2xpcHNlIFVwZGF0ZSBTaXRlIi8+CisgICAgICA8ZGlzY292ZXJ5IHVybD0iZmlsZTovYzovIiBsYWJlbCA9ICJEaXNjb3ZlcnkiIHR5cGU9IndlYiIvPgorICAgPC91cmw+CisKKzwvZmVhdHVyZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9yZWRkb3QueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvcmVkZG90LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2YxNzAxCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvcmVkZG90LnhtbApAQCAtMCwwICsxLDE5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4NCis8c2l0ZSB1cmw9ImluZm8vc2l0ZUluZm8uaHRtbCI+DQorPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9yZWRkb3RfMS4wLjAuamFyIj4gDQorPGNhdGVnb3J5IG5hbWU9InJlZGRvdCIvPg0KKzwvZmVhdHVyZT4NCis8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL3JlZGRvdF8yLjEuMC5qYXIiPg0KKzxjYXRlZ29yeSBuYW1lPSJyZWRkb3QiLz4NCis8L2ZlYXR1cmU+DQorPGFyY2hpdmUgcGF0aD0iY29tLnJlZGRvdC5yZWRvdF8xLjAuMCIgdXJsPSJwbHVnaW5zL2NvbS5yZWRkb3QucmVkZG90XzEuMC4wLmphciIvPg0KKzxhcmNoaXZlIHBhdGg9ImNvbS5yZWRkb3QucmVkb3RfMi4xLjAiIHVybD0icGx1Z2lucy9jb20ucmVkZG90LnJlZGRvdF8yLjEuMC5qYXIiLz4NCis8Y2F0ZWdvcnktZGVmIGxhYmVsPSJSZWQgRG90IFZlcnNpb25zIiBuYW1lPSJyZWRkb3QiPg0KKzxkZXNjcmlwdGlvbiB1cmw9IlJlZERvdFZlcnNpb25zLmh0bWwiPg0KK1RoaXMgY2F0ZWdvcnkgY29udGFpbnMgYWxsIG9mIHRoZSAmbHQ7Y3VycmVudGx5Jmd0OyBhdmFpbGFibGUgdmVyc2lvbnMgb2YgUmVkIERvdCBmZWF0dXJlLg0KKzwhW0NEQVRBWzxncmVldGluZz5IZWxsbywgd29ybGQhPC9ncmVldGluZz5dXT4NCis8L2Rlc2NyaXB0aW9uPg0KKzwvY2F0ZWdvcnktZGVmPg0KKzwvc2l0ZT4NCisNCisNCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9yZWRkb3QxLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL3JlZGRvdDEueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3NDQ5MGUKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9yZWRkb3QxLnhtbApAQCAtMCwwICsxLDE4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4NCis8c2l0ZSB1cmw9ImluZm8vc2l0ZUluZm8uaHRtbCI+DQorPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9yZWRkb3RfMS4wLjAuamFyIj4gDQorPGNhdGVnb3J5IG5hbWU9InJlZGRvdCIvPg0KKzwvZmVhdHVyZT4NCis8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL3JlZGRvdF8yLjEuMC5qYXIiPg0KKzxjYXRlZ29yeSBuYW1lPSJyZWRkb3QiLz4NCis8L2ZlYXR1cmU+DQorPGFyY2hpdmUgcGF0aD0iY29tLnJlZGRvdC5yZWRvdF8xLjAuMCIgdXJsPSJwbHVnaW5zL2NvbS5yZWRkb3QucmVkZG90XzEuMC4wLmphciIvPg0KKzxhcmNoaXZlIHBhdGg9ImNvbS5yZWRkb3QucmVkb3RfMi4xLjAiIHVybD0icGx1Z2lucy9jb20ucmVkZG90LnJlZGRvdF8yLjEuMC5qYXIiLz4NCis8Y2F0ZWdvcnktZGVmIGxhYmVsPSJSZWQgRG90IFZlcnNpb25zIiBuYW1lPSJyZWRkb3QiPg0KKzxkZXNjcmlwdGlvbiB1cmw9IlJlZERvdFZlcnNpb25zLmh0bWwiPg0KK1RoaXMgY2F0ZWdvcnkgY29udGFpbnMgYWxsIG9mIHRoZSAmbHQ7Y3VycmVudGx5Jmd0OyBhdmFpbGFibGUgdmVyc2lvbnMgb2YgUmVkIERvdCBmZWF0dXJlLg0KKzwvZGVzY3JpcHRpb24+DQorPC9jYXRlZ29yeS1kZWY+DQorPC9zaXRlPg0KKw0KKw0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL3NpdGUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvc2l0ZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQwZDgzMQotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL3NpdGUueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQorPHNpdGUgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzIiBuYW1lPSJUZXN0cyIgdmVyc2lvbj0iMC4wLjEiIHR5cGU9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZpbGUiPg0KKyAgPGhhbmRsZXI+DQorICAJPGJvbyBjbGFzcyA9InVua25vd24iLz4NCisgIDwvaGFuZGxlcj4NCisgIA0KKyAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS50ZXN0LmZlYXR1cmVfMS4wLjAuamFyIj4NCisgICAgPGNhdGVnb3J5IG5hbWU9ImNhdGVnb3J5MSIvPg0KKyAgPC9mZWF0dXJlPg0KKyAgDQorICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL2ZlYXR1cmVzMi5qYXIiPg0KKyAgICA8Y2F0ZWdvcnkgbmFtZT0iY2F0ZWdvcnkxL3N1YmNhdDEiLz4NCisgICAgPGNhdGVnb3J5IG5hbWU9ImNhdGVnb3J5MiIvPg0KKyAgPC9mZWF0dXJlPg0KKyAgDQorICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxXzEuMC40LmphciI+DQorICAgIDxjYXRlZ29yeSBuYW1lPSJjYXRlZ29yeTEiLz4NCisgICAgPGNhdGVnb3J5IG5hbWU9ImNhdGVnb3J5MiIvPg0KKyAgICA8YmxhaC8+DQorICA8L2ZlYXR1cmU+DQorICANCisgIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2VfdGVzdF9mZWF0dXJlLmphciIvPg0KKyAgDQorICA8ZmVhdHVyZSB1cmw9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUyXzEuMC4wL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUyXzIuMi4yLmphciI+DQorICAgIDxjYXRlZ29yeSBuYW1lPSJjYXRlZ29yeTEiLz4NCisgIDwvZmVhdHVyZT4NCisgIA0KKyAgPGZlYXR1cmUgdXJsPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5mZWF0dXJlMl8xLjAuMC9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5mZWF0dXJlMl8yLjIuMi5qYXIiPg0KKyAgPC9mZWF0dXJlPg0KKyAgDQorICA8YXJjaGl2ZSBwYXRoPSJwbHVnaW5zL2hlbGxvIiA+DQorICAJPGRlZmF1bHQvPg0KKyAgPC9hcmNoaXZlPg0KKw0KKyAgPGNhdGVnb3J5LWRlZiBuYW1lPSJjYXRlZ29yeTIiIGxhYmVsPSIlc2VjdXJpdHkiLz4NCisgIDxjYXRlZ29yeS1kZWYgbmFtZT0iY2F0ZWdvcnkxL3N1YmNhdDEiIGxhYmVsPSJTcGVjaWFsIEZpeCIvPg0KKyAgPGNhdGVnb3J5LWRlZiBuYW1lPSJjYXRlZ29yeTEiIGxhYmVsPSIlZHJpdmVycyIvPiAgDQorDQorDQorPC9zaXRlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL3NpdGUxMC54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9zaXRlMTAueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MjY4MGQKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9zaXRlMTAueG1sCkBAIC0wLDAgKzEsMTIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8c2l0ZSBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMiIG5hbWU9IlRlc3RzIiB2ZXJzaW9uPSIwLjAuMSIgdHlwZT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmlsZSIgYmxhaD0iYmxhaCI+CisgIAorICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnRlc3QuZmVhdHVyZV8xLjAuMC5qYXIiIGJsYWg9ImJsYWgiIGlkPSJvcmcuZWNsaXBzZS50ZXN0LmZlYXR1cmUiIHZlcnNpb249IjEuMC4wIi8+CisgIAorICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL2ZlYXR1cmVzMi5qYXIiIGlkPSJ1bmtud29uLmlkIiB2ZXJzaW9uPSJiYWQgdmVyc2lvbiIvPgorICAKKyAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMV8xLjAuNC5qYXIiIGlkPSJvbmx5LmlkIi8+CisgICAgCisgIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2VfdGVzdF9mZWF0dXJlLmphciIgdmVyc2lvbj0iMS4wLjAiLz4KKyAgCis8L3NpdGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvc2l0ZTIueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvc2l0ZTIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNzU1MGUKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9zaXRlMi54bWwKQEAgLTAsMCArMSw0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHNpdGU+CisgIDxmZWF0dXJlIGlkPSJjb20uaWJtLmpkdCIgdXJsPSJodHRwOi8vd3d3Lm5vdC1lY2xpcHNlLm9yZy9mZWF0dXJlMyIgdmVyc2lvbj0iMS4wLjAiLz4KKzwvc2l0ZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9zaXRlMy54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9zaXRlMy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJiYjY4MgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL3NpdGUzLnhtbApAQCAtMCwwICsxLDYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8c2l0ZT4KKyAgPGZlYXR1cmUgaWQ9ImNvbS5pYm0uamR0IiB1cmw9ImZlYXR1cmUzL2ZlYXR1cmUuamFyIiB2ZXJzaW9uPSIxLjAuMCI+CisgICAgICAgIDxjYXRlZ29yeSBuYW1lPSJ1bmtub3duIi8+CisgIDwvZmVhdHVyZT4KKzwvc2l0ZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9zaXRlNC54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9zaXRlNC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFiN2QxNgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL3NpdGU0LnhtbApAQCAtMCwwICsxLDIwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4KKzxzaXRlPgorICAgPGRlc2NyaXB0aW9uIHVybD0iaW5mby9zaXRlSW5mby5odG1sIi8+CisKKyAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iUmVkIERvdCBWZXJzaW9ucyIgbmFtZT0icmVkZG90Ij4KKyAgICAgIDxkZXNjcmlwdGlvbiB1cmw9IlJlZERvdFZlcnNpb25zLmh0bWwiPgorICAgICAgICAgVGhpcyBjYXRlZ29yeSBjb250YWlucyBhbGwgb2YgdGhlIGN1cnJlbnRseSBhdmFpbGFibGUgdmVyc2lvbnMgb2YgUmVkIERvdCBmZWF0dXJlLgorICAgICAgPC9kZXNjcmlwdGlvbj4KKyAgIDwvY2F0ZWdvcnktZGVmPgorICAgCisgICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL2NvbS5yZWRkb3QucmVkZG90XzEuMC4wLmphciI+CisgICAgICA8Y2F0ZWdvcnkgbmFtZT0icmVkZG90Ii8+CisgICA8L2ZlYXR1cmU+CisKKyAgIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvY29tLnJlZGRvdC5yZWRkb3RfMi4xLjAuamFyIj4KKyAgICAgIDxjYXRlZ29yeSBuYW1lPSJyZWRkb3QiLz4KKyAgIDwvZmVhdHVyZT4KKworIAorPC9zaXRlPiAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL3NpdGU3LnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL3NpdGU3LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTkwZDcwCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvc2l0ZTcueG1sCkBAIC0wLDAgKzEsNDIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8c2l0ZSBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMiIG5hbWU9IlRlc3RzIiB2ZXJzaW9uPSIwLjAuMSIgdHlwZT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmlsZSI+CisgIDxoYW5kbGVyPgorICAJPGJvbyBjbGFzcyA9InVua25vd24iLz4KKyAgPC9oYW5kbGVyPgorICAKKyAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS50ZXN0LmZlYXR1cmVfMS4wLjAuamFyIj4KKyAgICA8Y2F0ZWdvcnkgbmFtZT0iY2F0ZWdvcnkxIi8+CisgIDwvZmVhdHVyZT4KKyAgCisgIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvZmVhdHVyZXMyLmphciI+CisgICAgPGNhdGVnb3J5IG5hbWU9ImNhdGVnb3J5MS9zdWJjYXQxIi8+CisgICAgPGNhdGVnb3J5IG5hbWU9ImNhdGVnb3J5MiIvPgorICA8L2ZlYXR1cmU+CisgIAorICA8YmxhaC8+CisgIAorICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxXzEuMC40LmphciI+CisgICAgPGNhdGVnb3J5IG5hbWU9ImNhdGVnb3J5MSIvPgorICAgIDxjYXRlZ29yeSBuYW1lPSJjYXRlZ29yeTIiLz4KKyAgICA8YmxhaC8+CisgIDwvZmVhdHVyZT4KKyAgCisgIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2VfdGVzdF9mZWF0dXJlLmphciIvPgorICAKKyAgPGZlYXR1cmUgdXJsPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5mZWF0dXJlMl8xLjAuMC9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5mZWF0dXJlMl8yLjIuMi5qYXIiPgorICAgIDxjYXRlZ29yeSBuYW1lPSJjYXRlZ29yeTEiLz4KKyAgPC9mZWF0dXJlPgorICAKKyAgPGZlYXR1cmUgdXJsPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5mZWF0dXJlMl8xLjAuMC9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5mZWF0dXJlMl8yLjIuMi5qYXIiPgorICA8L2ZlYXR1cmU+CisgIAorICA8YXJjaGl2ZSBwYXRoPSJwbHVnaW5zL2hlbGxvIiA+CisgIAk8ZGVmYXVsdC8+CisgIDwvYXJjaGl2ZT4KKworICA8Y2F0ZWdvcnktZGVmIG5hbWU9ImNhdGVnb3J5MiIgbGFiZWw9IiVzZWN1cml0eSIvPgorICA8Y2F0ZWdvcnktZGVmIG5hbWU9ImNhdGVnb3J5MS9zdWJjYXQxIiBsYWJlbD0iU3BlY2lhbCBGaXgiLz4KKyAgPGNhdGVnb3J5LWRlZiBuYW1lPSJjYXRlZ29yeTEiIGxhYmVsPSIlZHJpdmVycyIvPiAgCisKKworPC9zaXRlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL3NpdGU4LnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL3NpdGU4LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmNiYWExCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvc2l0ZTgueG1sCkBAIC0wLDAgKzEsNDEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8c2l0ZSBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMiIG5hbWU9IlRlc3RzIiB2ZXJzaW9uPSIwLjAuMSIgdHlwZT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmlsZSI+CisgIDxoYW5kbGVyPgorICAJPGJvbyBjbGFzcyA9InVua25vd24iLz4KKyAgPC9oYW5kbGVyPgorICAKKyAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS50ZXN0LmZlYXR1cmVfMS4wLjAuamFyIj4KKyAgICA8Y2F0ZWdvcnkgbmFtZT0iY2F0ZWdvcnkxIi8+CisgIDwvZmVhdHVyZT4KKyAgCisgIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvZmVhdHVyZXMyLmphciI+CisgICAgPGNhdGVnb3J5IG5hbWU9ImNhdGVnb3J5MS9zdWJjYXQxIi8+CisgICAgPGNhdGVnb3J5IG5hbWU9ImNhdGVnb3J5MiIvPgorICA8L2ZlYXR1cmU+CisgIHhjeGdmc2RmZ3Nkc2QKKyAgCisgIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTFfMS4wLjQuamFyIj4KKyAgICA8Y2F0ZWdvcnkgbmFtZT0iY2F0ZWdvcnkxIi8+CisgICAgPGNhdGVnb3J5IG5hbWU9ImNhdGVnb3J5MiIvPgorICAgIDxibGFoLz4KKyAgPC9mZWF0dXJlPgorICAKKyAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZV90ZXN0X2ZlYXR1cmUuamFyIi8+CisgIAorICA8ZmVhdHVyZSB1cmw9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUyXzEuMC4wL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUyXzIuMi4yLmphciI+CisgICAgPGNhdGVnb3J5IG5hbWU9ImNhdGVnb3J5MSIvPgorICA8L2ZlYXR1cmU+CisgIAorICA8ZmVhdHVyZSB1cmw9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUyXzEuMC4wL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUyXzIuMi4yLmphciI+CisgIDwvZmVhdHVyZT4KKyAgCisgIDxhcmNoaXZlIHBhdGg9InBsdWdpbnMvaGVsbG8iID4KKyAgCTxkZWZhdWx0Lz4KKyAgPC9hcmNoaXZlPgorCisgIDxjYXRlZ29yeS1kZWYgbmFtZT0iY2F0ZWdvcnkyIiBsYWJlbD0iJXNlY3VyaXR5Ii8+CisgIDxjYXRlZ29yeS1kZWYgbmFtZT0iY2F0ZWdvcnkxL3N1YmNhdDEiIGxhYmVsPSJTcGVjaWFsIEZpeCIvPgorICA8Y2F0ZWdvcnktZGVmIG5hbWU9ImNhdGVnb3J5MSIgbGFiZWw9IiVkcml2ZXJzIi8+ICAKKworCis8L3NpdGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvc2l0ZTkueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvc2l0ZTkueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzOGM1YTQKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9zaXRlOS54bWwKQEAgLTAsMCArMSw0MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxzaXRlIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cyIgbmFtZT0iVGVzdHMiIHZlcnNpb249IjAuMC4xIiB0eXBlPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5maWxlIiBibGFoPSJibGFoIj4KKyAgPGhhbmRsZXIgYmxhaD0iYmxhaCI+CisgIAk8Ym9vIGNsYXNzID0idW5rbm93biIgYmxhaD0iYmxhaCIvPgorICA8L2hhbmRsZXI+CisgIAorICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnRlc3QuZmVhdHVyZV8xLjAuMC5qYXIiIGJsYWg9ImJsYWgiPgorICAgIDxjYXRlZ29yeSBuYW1lPSJjYXRlZ29yeTEiIGJsYWg9ImJsYWgiIC8+CisgIDwvZmVhdHVyZT4KKyAgCisgIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvZmVhdHVyZXMyLmphciI+CisgICAgPGNhdGVnb3J5IG5hbWU9ImNhdGVnb3J5MS9zdWJjYXQxIi8+CisgICAgPGNhdGVnb3J5IG5hbWU9ImNhdGVnb3J5MiIvPgorICA8L2ZlYXR1cmU+CisgIAorICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxXzEuMC40LmphciI+CisgICAgPGNhdGVnb3J5IG5hbWU9ImNhdGVnb3J5MSIvPgorICAgIDxjYXRlZ29yeSBuYW1lPSJjYXRlZ29yeTIiLz4KKyAgICA8YmxhaC8+CisgIDwvZmVhdHVyZT4KKyAgCisgIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2VfdGVzdF9mZWF0dXJlLmphciIvPgorICAKKyAgPGZlYXR1cmUgdXJsPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5mZWF0dXJlMl8xLjAuMC9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5mZWF0dXJlMl8yLjIuMi5qYXIiPgorICAgIDxjYXRlZ29yeSBuYW1lPSJjYXRlZ29yeTEiLz4KKyAgPC9mZWF0dXJlPgorICAKKyAgPGZlYXR1cmUgdXJsPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5mZWF0dXJlMl8xLjAuMC9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5mZWF0dXJlMl8yLjIuMi5qYXIiPgorICA8L2ZlYXR1cmU+CisgIAorICA8YXJjaGl2ZSBwYXRoPSJwbHVnaW5zL2hlbGxvIiBibGFoPSJibGFoIj4KKyAgCTxkZWZhdWx0IGJsYWg9ImJsYWgiLz4KKyAgPC9hcmNoaXZlPgorCisgIDxjYXRlZ29yeS1kZWYgbmFtZT0iY2F0ZWdvcnkyIiBsYWJlbD0iJXNlY3VyaXR5IiBibGFoPSJibGFoIi8+CisgIDxjYXRlZ29yeS1kZWYgbmFtZT0iY2F0ZWdvcnkxL3N1YmNhdDEiIGxhYmVsPSJTcGVjaWFsIEZpeCIgYmxhaD0iYmxhaCIvPgorICA8Y2F0ZWdvcnktZGVmIG5hbWU9ImNhdGVnb3J5MSIgbGFiZWw9IiVkcml2ZXJzIi8+ICAKKworCis8L3NpdGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvc2l0ZWZ0cC54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9zaXRlZnRwLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODgzZWMwCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvc2l0ZWZ0cC54bWwKQEAgLTAsMCArMSw0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHNpdGUgdHlwZT0ib3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUuZnRwIj4KKyAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9mZWF0dXJlMy9mZWF0dXJlczIuamFyZmlsZSIvPgorPC9zaXRlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9GZWF0dXJlV2l0aEluc3RhbGxIYW5kbGVyLy5jbGFzc3BhdGggYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvRmVhdHVyZVdpdGhJbnN0YWxsSGFuZGxlci8uY2xhc3NwYXRoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4YWNiMzkKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvRmVhdHVyZVdpdGhJbnN0YWxsSGFuZGxlci8uY2xhc3NwYXRoCkBAIC0wLDAgKzEsOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxjbGFzc3BhdGg+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iL29yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Ii9vcmcuZWNsaXBzZS51aSIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgorPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvRmVhdHVyZVdpdGhJbnN0YWxsSGFuZGxlci8ucHJvamVjdCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9GZWF0dXJlV2l0aEluc3RhbGxIYW5kbGVyLy5wcm9qZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlYmM1MDUKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvRmVhdHVyZVdpdGhJbnN0YWxsSGFuZGxlci8ucHJvamVjdApAQCAtMCwwICsxLDIzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHByb2plY3REZXNjcmlwdGlvbj4KKwk8bmFtZT5GZWF0dXJlV2l0aEluc3RhbGxIYW5kbGVyPC9uYW1lPgorCTxjb21tZW50PjwvY29tbWVudD4KKwk8cHJvamVjdHM+CisJPC9wcm9qZWN0cz4KKwk8YnVpbGRTcGVjPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwk8L2J1aWxkU3BlYz4KKwk8bmF0dXJlcz4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KKwk8L25hdHVyZXM+Cis8L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9GZWF0dXJlV2l0aEluc3RhbGxIYW5kbGVyL0ZlYXR1cmVXaXRoSW5zdGFsbEhhbmRsZXJfMS4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL0ZlYXR1cmVXaXRoSW5zdGFsbEhhbmRsZXIvRmVhdHVyZVdpdGhJbnN0YWxsSGFuZGxlcl8xLjAuMC5qYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk1YjcyMgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9GZWF0dXJlV2l0aEluc3RhbGxIYW5kbGVyL0ZlYXR1cmVXaXRoSW5zdGFsbEhhbmRsZXJfMS4wLjAuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9GZWF0dXJlV2l0aEluc3RhbGxIYW5kbGVyL2Jpbi9IYW5kbGVyV2l0aFVJJDEuY2xhc3MgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvRmVhdHVyZVdpdGhJbnN0YWxsSGFuZGxlci9iaW4vSGFuZGxlcldpdGhVSSQxLmNsYXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3MjkxYjAKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvRmVhdHVyZVdpdGhJbnN0YWxsSGFuZGxlci9iaW4vSGFuZGxlcldpdGhVSSQxLmNsYXNzCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9GZWF0dXJlV2l0aEluc3RhbGxIYW5kbGVyL2Jpbi9IYW5kbGVyV2l0aFVJLmNsYXNzIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL0ZlYXR1cmVXaXRoSW5zdGFsbEhhbmRsZXIvYmluL0hhbmRsZXJXaXRoVUkuY2xhc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU4ZTg4MQotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9GZWF0dXJlV2l0aEluc3RhbGxIYW5kbGVyL2Jpbi9IYW5kbGVyV2l0aFVJLmNsYXNzCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9GZWF0dXJlV2l0aEluc3RhbGxIYW5kbGVyL2J1aWxkLnByb3BlcnRpZXMgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvRmVhdHVyZVdpdGhJbnN0YWxsSGFuZGxlci9idWlsZC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmYjdjYzUKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvRmVhdHVyZVdpdGhJbnN0YWxsSGFuZGxlci9idWlsZC5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTUgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisjIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorIworIyBDb250cmlidXRvcnM6CisjICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3NvdXJjZS5oYW5kbGVyLmphciA9IHNyYy8sXAorICAgICAgICAgICAgICAgICAgICAgYmluLworb3V0cHV0LmhhbmRsZXIuamFyID0gYmluLworYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAorICAgICAgICAgICAgICAgaGFuZGxlci5qYXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9GZWF0dXJlV2l0aEluc3RhbGxIYW5kbGVyL2ZlYXR1cmUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL0ZlYXR1cmVXaXRoSW5zdGFsbEhhbmRsZXIvZmVhdHVyZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI5MGVhNwotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9GZWF0dXJlV2l0aEluc3RhbGxIYW5kbGVyL2ZlYXR1cmUueG1sCkBAIC0wLDAgKzEsMjcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8ZmVhdHVyZQorICAgICAgaWQ9IkZlYXR1cmVXaXRoSW5zdGFsbEhhbmRsZXIiCisgICAgICBsYWJlbD0iRmVhdHVyZVdpdGhJbnN0YWxsSGFuZGxlciIKKyAgICAgIHZlcnNpb249IjEuMC4wIj4KKworICAgPGluc3RhbGwtaGFuZGxlciBsaWJyYXJ5PSJoYW5kbGVyLmphciIgaGFuZGxlcj0iSGFuZGxlcldpdGhVSSIgLz4KKworICAgPGRlc2NyaXB0aW9uIHVybD0iW0VudGVyIEZlYXR1cmUgVVJMIGhlcmUuXSI+CisgICAgICBbRW50ZXIgRmVhdHVyZSBEZXNjcmlwdGlvbiBoZXJlLl0KKyAgIDwvZGVzY3JpcHRpb24+CisKKyAgIDxjb3B5cmlnaHQgdXJsPSJbRW50ZXIgQ29weXJpZ2h0IFVSTCBoZXJlLl0iPgorICAgICAgW0VudGVyIENvcHlyaWdodCBEZXNjcmlwdGlvbiBoZXJlLl0KKyAgIDwvY29weXJpZ2h0PgorCisgICA8bGljZW5zZSB1cmw9IltFbnRlciBMaWNlbnNlIFVSTCBoZXJlLl0iPgorICAgICAgW0VudGVyIExpY2Vuc2UgRGVzY3JpcHRpb24gaGVyZS5dCisgICA8L2xpY2Vuc2U+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuYXBhY2hlLmx1Y2VuZSIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIxLjMuMCIvPgorCis8L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvRmVhdHVyZVdpdGhJbnN0YWxsSGFuZGxlci9oYW5kbGVyLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9GZWF0dXJlV2l0aEluc3RhbGxIYW5kbGVyL2hhbmRsZXIuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3YmMyNDQKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvRmVhdHVyZVdpdGhJbnN0YWxsSGFuZGxlci9oYW5kbGVyLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvRmVhdHVyZVdpdGhJbnN0YWxsSGFuZGxlci9zcmMvSGFuZGxlcldpdGhVSS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL0ZlYXR1cmVXaXRoSW5zdGFsbEhhbmRsZXIvc3JjL0hhbmRsZXJXaXRoVUkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGRmYmMwCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL0ZlYXR1cmVXaXRoSW5zdGFsbEhhbmRsZXIvc3JjL0hhbmRsZXJXaXRoVUkuamF2YQpAQCAtMCwwICsxLDE0NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKKy8qCisgKiBDcmVhdGVkIG9uIE9jdCAxLCAyMDA0CisgKgorICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCisgKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKKyAqLworCisvKioKKyAqIEBhdXRob3IgYmlyc2FuCisgKgorICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KKyAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcworICovCitwdWJsaWMgY2xhc3MgSGFuZGxlcldpdGhVSSBpbXBsZW1lbnRzIElJbnN0YWxsSGFuZGxlciB7CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JSW5zdGFsbEhhbmRsZXIjY29tcGxldGVDb25maWd1cmUoKQorCSAqLworCXB1YmxpYyB2b2lkIGNvbXBsZXRlQ29uZmlndXJlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCVN5c3RlbS5vdXQucHJpbnRsbigiY29tcGxldGVDb25maWd1cmUoKSIpOworCisJfQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklJbnN0YWxsSGFuZGxlciNjb21wbGV0ZUluc3RhbGwob3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmVDb250ZW50Q29uc3VtZXIpCisJICovCisJcHVibGljIHZvaWQgY29tcGxldGVJbnN0YWxsKElGZWF0dXJlQ29udGVudENvbnN1bWVyIGNvbnN1bWVyKQorCQkJdGhyb3dzIENvcmVFeGNlcHRpb24geworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCVN5c3RlbS5vdXQucHJpbnRsbigiY29tcGxldGVJbnN0YWxsKCkiKTsKKwl9CisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUluc3RhbGxIYW5kbGVyI2NvbXBsZXRlVW5jb25maWd1cmUoKQorCSAqLworCXB1YmxpYyB2b2lkIGNvbXBsZXRlVW5jb25maWd1cmUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJU3lzdGVtLm91dC5wcmludGxuKCJjb21wbGV0ZUluc3RhbGwoKSIpOworCX0KKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JSW5zdGFsbEhhbmRsZXIjY29tcGxldGVVbmluc3RhbGwoKQorCSAqLworCXB1YmxpYyB2b2lkIGNvbXBsZXRlVW5pbnN0YWxsKCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCVN5c3RlbS5vdXQucHJpbnRsbigiY29tcGxldGVVbmluc3RhbGwoKSIpOworCX0KKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JSW5zdGFsbEhhbmRsZXIjY29uZmlndXJlQ29tcGxldGVkKGJvb2xlYW4pCisJICovCisJcHVibGljIHZvaWQgY29uZmlndXJlQ29tcGxldGVkKGJvb2xlYW4gc3VjY2VzcykgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCVN5c3RlbS5vdXQucHJpbnRsbigiY29uZmlndXJlQ29tcGxldGVkKCkiKTsKKwl9CisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUluc3RhbGxIYW5kbGVyI2NvbmZpZ3VyZUluaXRpYXRlZCgpCisJICovCisJcHVibGljIHZvaWQgY29uZmlndXJlSW5pdGlhdGVkKCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCVN5c3RlbS5vdXQucHJpbnRsbigiY29uZmlndXJlSW5pdGlhdGVkKCkiKTsKKwl9CisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUluc3RhbGxIYW5kbGVyI2luaXRpYWxpemUoaW50LCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZSwgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUluc3RhbGxIYW5kbGVyRW50cnksIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkluc3RhbGxNb25pdG9yKQorCSAqLworCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoaW50IHR5cGUsIElGZWF0dXJlIGZlYXR1cmUsCisJCQlJSW5zdGFsbEhhbmRsZXJFbnRyeSBlbnRyeSwgSW5zdGFsbE1vbml0b3IgbW9uaXRvcikKKwkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQlTeXN0ZW0ub3V0LnByaW50bG4oImluaXRpYWxpemUoKSIpOworCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMoIG5ldyBSdW5uYWJsZSgpIHsKKwkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQlNZXNzYWdlRGlhbG9nLm9wZW5JbmZvcm1hdGlvbihEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRBY3RpdmVTaGVsbCgpLCAiSW5zdGFsbEhhbmRsZXIiLCAiVGhpcyBpcyBhIGR1bW15IG1lc3NhZ2UiKTsKKwkJCX0KKwkJfSk7CisJfQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklJbnN0YWxsSGFuZGxlciNpbnN0YWxsQ29tcGxldGVkKGJvb2xlYW4pCisJICovCisJcHVibGljIHZvaWQgaW5zdGFsbENvbXBsZXRlZChib29sZWFuIHN1Y2Nlc3MpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQlTeXN0ZW0ub3V0LnByaW50bG4oImluc3RhbGxDb21wbGV0ZWQoKSIpOworCX0KKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JSW5zdGFsbEhhbmRsZXIjaW5zdGFsbEluaXRpYXRlZCgpCisJICovCisJcHVibGljIHZvaWQgaW5zdGFsbEluaXRpYXRlZCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQlTeXN0ZW0ub3V0LnByaW50bG4oImluc3RhbGxJbml0aWF0ZWQoKSIpOworCX0KKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JSW5zdGFsbEhhbmRsZXIjbm9uUGx1Z2luRGF0YURvd25sb2FkZWQob3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSU5vblBsdWdpbkVudHJ5W10sIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklWZXJpZmljYXRpb25MaXN0ZW5lcikKKwkgKi8KKwlwdWJsaWMgdm9pZCBub25QbHVnaW5EYXRhRG93bmxvYWRlZChJTm9uUGx1Z2luRW50cnlbXSBub25QbHVnaW5EYXRhLAorCQkJSVZlcmlmaWNhdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJU3lzdGVtLm91dC5wcmludGxuKCJub25QbHVnaW5EYXRhRG93bmxvYWRlZCgpIik7CisJfQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklJbnN0YWxsSGFuZGxlciNwbHVnaW5zRG93bmxvYWRlZChvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JUGx1Z2luRW50cnlbXSkKKwkgKi8KKwlwdWJsaWMgdm9pZCBwbHVnaW5zRG93bmxvYWRlZChJUGx1Z2luRW50cnlbXSBwbHVnaW5zKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJU3lzdGVtLm91dC5wcmludGxuKCJwbHVnaW5zRG93bmxvYWRlZCgpIik7CisJfQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklJbnN0YWxsSGFuZGxlciN1bmNvbmZpZ3VyZUNvbXBsZXRlZChib29sZWFuKQorCSAqLworCXB1YmxpYyB2b2lkIHVuY29uZmlndXJlQ29tcGxldGVkKGJvb2xlYW4gc3VjY2VzcykgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCVN5c3RlbS5vdXQucHJpbnRsbigidW5jb25maWd1cmVDb21wbGV0ZWQoKSIpOworCX0KKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JSW5zdGFsbEhhbmRsZXIjdW5jb25maWd1cmVJbml0aWF0ZWQoKQorCSAqLworCXB1YmxpYyB2b2lkIHVuY29uZmlndXJlSW5pdGlhdGVkKCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCVN5c3RlbS5vdXQucHJpbnRsbigidW5jb25maWd1cmVJbml0aWF0ZWQoKSIpOworCX0KKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JSW5zdGFsbEhhbmRsZXIjdW5pbnN0YWxsQ29tcGxldGVkKGJvb2xlYW4pCisJICovCisJcHVibGljIHZvaWQgdW5pbnN0YWxsQ29tcGxldGVkKGJvb2xlYW4gc3VjY2VzcykgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCVN5c3RlbS5vdXQucHJpbnRsbigidW5pbnN0YWxsQ29tcGxldGVkKCkiKTsKKwl9CisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUluc3RhbGxIYW5kbGVyI3VuaW5zdGFsbEluaXRpYXRlZCgpCisJICovCisJcHVibGljIHZvaWQgdW5pbnN0YWxsSW5pdGlhdGVkKCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCVN5c3RlbS5vdXQucHJpbnRsbigidW5pbnN0YWxsSW5pdGlhdGVkKCkiKTsKKwl9Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmRvY18yLjAuMC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZG9jXzIuMC4wL01FVEEtSU5GL01BTklGRVNULk1GCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5NDk5YmMKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmRvY18yLjAuMC9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMCwwICsxLDIgQEAKK01hbmlmZXN0LVZlcnNpb246IDEuMAorCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmRvY18yLjAuMC9jcGwtdjEwLmh0bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmRvY18yLjAuMC9jcGwtdjEwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU0MTZjMQotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZG9jXzIuMC4wL2NwbC12MTAuaHRtbApAQCAtMCwwICsxLDI2NiBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKKyAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Cis8aGVhZD4KKzxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iSFRNTCBUaWR5LCBzZWUgd3d3LnczLm9yZyIgLz4KKzx0aXRsZT5Db21tb24gUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvdGl0bGU+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiCitjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSIgLz4KKzwvaGVhZD4KKzxib2R5IGJnY29sb3I9IiNGRkZGRkYiIHZsaW5rPSIjODAwMDAwIj4KKzxwIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsgdGV4dC1hbGlnbjogY2VudGVyIj5Db21tb24gUHVibGljCitMaWNlbnNlIC0gdiAxLjA8L3A+CisKKzxwPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUiBUSEUgVEVSTVMgT0YgVEhJUworQ09NTU9OIFBVQkxJQyBMSUNFTlNFICgiQUdSRUVNRU5UIikuIEFOWSBVU0UsIFJFUFJPRFVDVElPTiBPUgorRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UgT0YKK1RISVMgQUdSRUVNRU5ULjwvcD4KKworPHAgc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkIj4xLiBERUZJTklUSU9OUzwvcD4KKworPHA+IkNvbnRyaWJ1dGlvbiIgbWVhbnM6PC9wPgorCis8ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogMmVtIj5hKSBpbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbAorQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24gZGlzdHJpYnV0ZWQgdW5kZXIKK3RoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9IkxFRlQiIC8+CitiKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9kaXY+CisKKzxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiAyZW0iPmkpIGNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvZGl2PgorCis8ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogMmVtIj5paSkgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvZGl2PgorCis8ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogMmVtIj53aGVyZSBzdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucwordG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZCBieSB0aGF0CitwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhCitDb250cmlidXRvciBpZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvcgoraXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24gc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucworZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlCittb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIFByb2dyYW0KK3VuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCit3b3JrcyBvZiB0aGUgUHJvZ3JhbS48L2Rpdj4KKworPHA+IkNvbnRyaWJ1dG9yIiBtZWFucyBhbnkgcGVyc29uIG9yIGVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZQorUHJvZ3JhbS48L3A+CisKKzxwPiJMaWNlbnNlZCBQYXRlbnRzICIgbWVhbiBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgYQorQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlIG9yIHNhbGUgb2YKK2l0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLjwvcD4KKworPHA+IlByb2dyYW0iIG1lYW5zIHRoZSBDb250cmlidXRpb25zIGRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aAordGhpcyBBZ3JlZW1lbnQuPC9wPgorCis8cD4iUmVjaXBpZW50IiBtZWFucyBhbnlvbmUgd2hvIHJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMKK0FncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9wPgorCis8cCBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQiPjIuIEdSQU5UIE9GIFJJR0hUUzwvcD4KKworPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDJlbSI+YSkgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcworQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50IGEKK25vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvCityZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkKK3BlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCitDb250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQKK29iamVjdCBjb2RlIGZvcm0uPC9kaXY+CisKKzxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiAyZW0iPmIpIFN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMKK0FncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudCBhCitub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBwYXRlbnQgbGljZW5zZSB1bmRlcgorTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydCBhbmQKK290aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4KK3NvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5Cit0byB0aGUgY29tYmluYXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZQordGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkIGJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZgordGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbiB0byBiZSBjb3ZlcmVkIGJ5IHRoZQorTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0byBhbnkgb3RoZXIKK2NvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcworbGljZW5zZWQgaGVyZXVuZGVyLjwvZGl2PgorCis8ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogMmVtIj5jKSBSZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdAorYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cyBDb250cmlidXRpb25zCitzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKK3RoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwKK3Byb3BlcnR5IHJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkKK2xpYWJpbGl0eSB0byBSZWNpcGllbnQgZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQKK29uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYQorY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQgbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsCitlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5IHRvIHNlY3VyZSBhbnkKK290aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLCBpZgorYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8KK2Rpc3RyaWJ1dGUgdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUKK3RoYXQgbGljZW5zZSBiZWZvcmUgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvZGl2PgorCis8ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogMmVtIj5kKSBFYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdAordG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQgcmlnaHRzIGluIGl0cworQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KK3RoaXMgQWdyZWVtZW50LjwvZGl2PgorCis8cCBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQiPjMuIFJFUVVJUkVNRU5UUzwvcD4KKworPHA+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaW4gb2JqZWN0Citjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3A+CisKKzxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiAyZW0iPmEpIGl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZAorY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9kaXY+CisKKzxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiAyZW0iPmIpIGl0cyBsaWNlbnNlIGFncmVlbWVudDo8L2Rpdj4KKworPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDJlbSI+aSkgZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZgorYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQgY29uZGl0aW9ucywgZXhwcmVzcyBhbmQKK2ltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUgYW5kCitub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YKK21lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7PC9kaXY+CisKKzxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiAyZW0iPmlpKSBlZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YKK2FsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGRpcmVjdCwKK2luZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2ggYXMKK2xvc3QgcHJvZml0czs8L2Rpdj4KKworPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDJlbSI+aWlpKSBzdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaAorZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdCBDb250cmlidXRvciBhbG9uZQorYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvZGl2PgorCis8ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogMmVtIj5pdikgc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZQorUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQgaW5mb3JtcyBsaWNlbnNlZXMKK2hvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEgbWVkaXVtCitjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48L2Rpdj4KKworPHA+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UgY29kZSBmb3JtOjwvcD4KKworPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDJlbSI+YSkgaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlcgordGhpcyBBZ3JlZW1lbnQ7IGFuZDwvZGl2PgorCis8ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogMmVtIj5iKSBhIGNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZQoraW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uPC9kaXY+CisKKzxwPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkgY29weXJpZ2h0IG5vdGljZXMKK2NvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uPC9wPgorCis8cD5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZSBvcmlnaW5hdG9yIG9mIGl0cworQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3Mgc3Vic2VxdWVudAorUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLjwvcD4KKworPHAgc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkIj40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvcD4KKworPHA+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5IGFjY2VwdCBjZXJ0YWluCityZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzIGFuZAordGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZQorY29tbWVyY2lhbCB1c2Ugb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlCitQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lcgord2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbCBsaWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4KK1RoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKK3Byb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCJDb21tZXJjaWFsIENvbnRyaWJ1dG9yIikKK2hlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIgQ29udHJpYnV0b3IKKygiSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IiKSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kIGNvc3RzCisoY29sbGVjdGl2ZWx5ICJMb3NzZXMiKSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKK2xlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkCitDb250cmlidXRvciB0byB0aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaAorQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiBjb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUKK1Byb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzCitzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcyByZWxhdGluZyB0byBhbnkgYWN0dWFsCitvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyIHRvIHF1YWxpZnksCithbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKK0NvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsCitDb250cmlidXRvciB0byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwKK0NvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQgYW55IHJlbGF0ZWQgc2V0dGxlbWVudAorbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlIGluIGFueQorc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9wPgorCis8cD5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZSBQcm9ncmFtIGluIGEKK2NvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQorQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMKK3BlcmZvcm1hbmNlIGNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsCit0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbAorQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcyBzZWN0aW9uLCB0aGUKK0NvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCitvdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCit3YXJyYW50aWVzLCBhbmQgaWYgYSBjb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5CithbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UKK2RhbWFnZXMuPC9wPgorCis8cCBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQiPjUuIE5PIFdBUlJBTlRZPC9wPgorCis8cD5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMKK1BST1ZJREVEIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GCitBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwKK0FOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCitNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50CitpcyBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcKK2FuZCBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aAoraXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGJ1dCBub3QKK2xpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywgY29tcGxpYW5jZSB3aXRoCithcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yIGVxdWlwbWVudCwKK2FuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy48L3A+CisKKzxwIHN0eWxlPSJmb250LXdlaWdodDogYm9sZCI+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3A+CisKKzxwPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBORUlUSEVSCitSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUiBBTlkKK0RJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorREFNQUdFUyAoSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRAorQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKK0xJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCitBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBPUiBUSEUKK0VYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKK1BPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3A+CisKKzxwIHN0eWxlPSJmb250LXdlaWdodDogYm9sZCI+Ny4gR0VORVJBTDwvcD4KKworPHA+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUKK3VuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgorZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZAord2l0aG91dCBmdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsCitiZSByZWZvcm1lZCB0byB0aGUgbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24KK3ZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3A+CisKKzxwPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYSBDb250cmlidXRvcgord2l0aCByZXNwZWN0IHRvIGEgcGF0ZW50IGFwcGxpY2FibGUgdG8gc29mdHdhcmUgKGluY2x1ZGluZyBhCitjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCitncmFudGVkIGJ5IHRoYXQgQ29udHJpYnV0b3IgdG8gc3VjaCBSZWNpcGllbnQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKK3NoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIEluCithZGRpdGlvbiwgaWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkKK2VudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKK2FsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZQorUHJvZ3JhbSB3aXRoIG90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncworcGF0ZW50KHMpLCB0aGVuIHN1Y2ggUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpCitzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLjwvcD4KKworPHA+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgaWYKK2l0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IgY29uZGl0aW9ucyBvZgordGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQorcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwKK1JlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMKK3RvIGNlYXNlIHVzZSBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseQorcHJhY3RpY2FibGUuIEhvd2V2ZXIsIFJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50CithbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkgUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsCitjb250aW51ZSBhbmQgc3Vydml2ZS48L3A+CisKKzxwPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGlzCitBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKK2NvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlCitBZ3JlZW1lbnQgU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMKKyhpbmNsdWRpbmcgcmV2aXNpb25zKSBvZiB0aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lCitvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMgdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzCitBZ3JlZW1lbnQuIElCTSBpcyB0aGUgaW5pdGlhbCBBZ3JlZW1lbnQgU3Rld2FyZC4gSUJNIG1heSBhc3NpZ24gdGhlCityZXNwb25zaWJpbGl0eSB0byBzZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZQorc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhCitkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0gKGluY2x1ZGluZworQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCit0aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3Cit2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8KK2Rpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldwordmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQgaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKQorYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8gdGhlIGludGVsbGVjdHVhbAorcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCitleHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlCitQcm9ncmFtIG5vdCBleHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUKK3Jlc2VydmVkLjwvcD4KKworPHA+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlIFN0YXRlIG9mIE5ldyBZb3JrCithbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EuCitObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKK0FncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaAorcGFydHkgd2FpdmVzIGl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcKK2xpdGlnYXRpb24uPC9wPgorPC9ib2R5PgorPC9odG1sPgorCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmRvY18yLjAuMC9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5kb2NfMi4wLjAvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGUzZTAyCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5kb2NfMi4wLjAvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmRvY18yLjAuMC9mZWF0dXJlLnByb3BlcnRpZXMgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmRvY18yLjAuMC9mZWF0dXJlLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRkMjIyNAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZG9jXzIuMC4wL2ZlYXR1cmUucHJvcGVydGllcwpAQCAtMCwwICsxLDE1MSBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisjIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjCisjIENvbnRyaWJ1dG9yczoKKyMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAvKioKKyMgICogPGNvcHlyaWdodD4KKyMgICoKKyMgICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisjICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworIyAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAorIyAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyAgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAorIyAgKiAKKyMgICogQ29udHJpYnV0b3JzOiAKKyMgICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyMgICoKKyMgICogPC9jb3B5cmlnaHQ+CisjICAqCisjICAqICRJZDogZmVhdHVyZS5wcm9wZXJ0aWVzLHYgMS4xIDIwMDQvMTAvMTggMTU6NTA6NDIgZGJpcnNhbiBFeHAgJAorIyAgKi8KKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgRG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlIGxhc3QgbGluZSBjb250YWluaW5nOgorIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKKyMgSW5zdGVhZCwgZWl0aGVyIHJlZGVmaW5lIGFuIGV4aXN0aW5nIHByb3BlcnR5LCBvciBjcmVhdGUgYSBuZXcgcHJvcGVydHksCisjIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbmQgY2hhbmdlIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IG5hbWUuCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjIFRoaXMgZmlsZSBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKKyMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCisjIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCisjIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KKworIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQorZmVhdHVyZU5hbWU9RWNsaXBzZSBNb2RlbGluZyBGcmFtZXdvcmsgKEVNRikgRG9jdW1lbnRhdGlvbgorCisjICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCitwcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKKworIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQordXBkYXRlU2l0ZU5hbWU9RWNsaXBzZS5vcmcgdXBkYXRlIHNpdGUKKworIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKK2Rlc2NyaXB0aW9uPUVjbGlwc2UgTW9kZWxpbmcgRnJhbWV3b3JrLiAoZG9jdW1lbnRhdGlvbikKKworIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCisjIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKK2xpY2Vuc2VVUkw9bGljZW5zZS5odG1sCisKKyMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCisjIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKK2xpY2Vuc2U9XAorRUNMSVBTRS5PUkcgU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKKzE0dGggQXVndXN0LCAyMDAzXG5cCitcblwKK1VzYWdlIE9mIENvbnRlbnRcblwKK1xuXAorRUNMSVBTRS5PUkcgTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKK09USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAorVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCitBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKK05PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKK0FHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKK0FORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCitPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAorVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAorT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKK0JFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKK1xuXAorQXBwbGljYWJsZSBMaWNlbnNlc1xuXAorXG5cCitVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgRWNsaXBzZS5vcmdcblwKK2lzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENvbW1vbiBQdWJsaWNcblwKK0xpY2Vuc2UgVmVyc2lvbiAxLjAgKCJDUEwiKS4gQSBjb3B5IG9mIHRoZSBDUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCitDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbC5cblwKK0ZvciBwdXJwb3NlcyBvZiB0aGUgQ1BMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAorXG5cCitDb250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKK2RvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAorcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKK2FzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAorXG5cCitDb250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHNcblwKKygiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3JcblwKK21vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWRcblwKKyJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZVxuXAorUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzXG5cCithcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAicGx1Z2lucyIgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluXG5cCitkaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLlxuXAorXG5cCitGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKKyJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCitJbmNsdWRlZCBGZWF0dXJlcy5cblwKK1xuXAorVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAorY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCitjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAoraW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAorTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAoraW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCitcblwKKyAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCisgICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCisgICAtIFN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAorICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCitcblwKK05vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSBFY2xpcHNlLm9yZyBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCitFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAorTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCitJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAord2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKK3lvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKK3RoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAorRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCitjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKK3VzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAorXG5cCitUSEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKK1RPIFRIRSBDUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAorU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAorXG5cCisgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKKyAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKKyAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAorICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKK1xuXAorSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAorVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKK2lzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCBFY2xpcHNlLm9yZyB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAorZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAorXG5cCitDcnlwdG9ncmFwaHlcblwKK1xuXAorQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCitjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCithbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCit1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKK3JlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKK2FuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuCisjIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCisjIFRoZSBhYm92ZSBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBzaGlwcGVkIGZvciB0cmFuc2xhdGlvbi4KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmRvY18yLjAuMC9mZWF0dXJlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZG9jXzIuMC4wL2ZlYXR1cmUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5MzYzZTcKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmRvY18yLjAuMC9mZWF0dXJlLnhtbApAQCAtMCwwICsxLDQ2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorCis8IS0tCisvKioKKyAqIDxjb3B5cmlnaHQ+CisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoKKyAqIDwvY29weXJpZ2h0PgorICoKKyAqICRJZDogZmVhdHVyZS54bWwsdiAxLjEgMjAwNC8wMy8wNiAxNzozMTozMSBtYXJjZWxvcCBFeHAgJAorICovCistLT4KKworPGZlYXR1cmUKKwlpZD0ib3JnLmVjbGlwc2UuZW1mLmRvYyIKKyAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgorICAgIHZlcnNpb249IjIuMC4wIgorICAgIGltYWdlPSAiZWNsaXBzZV91cGRhdGVfMTIwLmpwZyIKKyAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KKworCTxkZXNjcmlwdGlvbj4KKyAgICAJJWRlc2NyaXB0aW9uCisJPC9kZXNjcmlwdGlvbj4KKworICAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgorCQklbGljZW5zZQorCTwvbGljZW5zZT4KKworCTx1cmw+CisJCTx1cGRhdGUgdXJsPSJodHRwOi8vdXBkYXRlLmVjbGlwc2Uub3JnL3VwZGF0ZXMiIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiLz4KKwk8L3VybD4KKworCTxwbHVnaW4KKwkJaWQ9Im9yZy5lY2xpcHNlLmVtZi5kb2MiCisgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIgICAJCQorCQl2ZXJzaW9uPSIyLjAuMCIvPgorPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5kb2NfMi4wLjAvbGljZW5zZS5odG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5kb2NfMi4wLjAvbGljZW5zZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3YTVlMTgKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmRvY18yLjAuMC9saWNlbnNlLmh0bWwKQEAgLTAsMCArMSwxMjYgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCisgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgorPGhlYWQ+Cis8bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9IkhUTUwgVGlkeSwgc2VlIHd3dy53My5vcmciIC8+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiCitjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSIgLz4KKzx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keSBsYW5nPSJFTi1VUyIgbGluaz0iYmx1ZSIgdmxpbms9InB1cnBsZSI+Cis8aDI+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgorCis8cD4xNHRoIEF1Z3VzdCwgMjAwMzwvcD4KKworPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgorCis8cD5FQ0xJUFNFLk9SRyBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OCitBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZCisiQ09OVEVOVCIpLiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORAorQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GCitMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkKK1VTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUworR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkKK0FQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQKK0JFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTCitBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFCitBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWQorTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+CisKKzxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4KKworPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5CitFY2xpcHNlLm9yZyBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCit0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiQ1BMIikuIEEgY29weSBvZiB0aGUgQ1BMIGlzCitwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEKK2hyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4uCitGb3IgcHVycG9zZXMgb2YgdGhlIENQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CisKKzxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdAorY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcKK0NWUyByZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlCithdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuPC9wPgorCis8cD5Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbgorZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhCitidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZAorbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcworYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkCit3aXRoIGEgRmVhdHVyZS4gUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcworbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZAorImZlYXR1cmVzIi48L3A+CisKKzxwPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLgorRmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZAordmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvcD4KKworPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZAorYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kCitjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlCitjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuCitBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhCitEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZworbG9jYXRpb25zOjwvcD4KKworPHVsPgorPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+CisKKzxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+CisKKzxsaT5TdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4KK1BsdWctaW5zPC9saT4KKworPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgorPC91bD4KKworPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IEVjbGlwc2Uub3JnIGlzIGluc3RhbGxlZAordXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZQorKCJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlCitGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZQorc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcKK3RoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uCitGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZgorZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzIGFuZAorRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yCityZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mCit0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LjwvcD4KKworPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZCitSRUZFUiBUTyBUSEUgQ1BMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQKK0NPTkRJVElPTlMuIFNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQKK0FSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgorCis8dWw+Cis8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEKK2hyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KKworPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YQoraHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPgoraHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CisKKzxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YQoraHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPgoraHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+CisKKzxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEKK2hyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgorPC91bD4KKworPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQKK0NPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZQorTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdAorRWNsaXBzZS5vcmcgdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQKK3BhcnRpY3VsYXIgQ29udGVudC48L3A+CisKKzxoMz5DcnlwdG9ncmFwaHk8L2gzPgorCis8cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoCit5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwKK2FuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uCitzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlCitjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKK3Bvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYKK3RoaXMgaXMgcGVybWl0dGVkLjwvcD4KKzwvYm9keT4KKzwvaHRtbD4KKwpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uZG9jXzIuMC4wL01FVEEtSU5GL01BTklGRVNULk1GIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uZG9jXzIuMC4wL01FVEEtSU5GL01BTklGRVNULk1GCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5NDk5YmMKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5kb2NfMi4wLjAvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTAsMCArMSwyIEBACitNYW5pZmVzdC1WZXJzaW9uOiAxLjAKKwpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uZG9jXzIuMC4wL2NwbC12MTAuaHRtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLmRvY18yLjAuMC9jcGwtdjEwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZhYTIwOAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLmRvY18yLjAuMC9jcGwtdjEwLmh0bWwKQEAgLTAsMCArMSwxMjUgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KKzxIVE1MPgorPEhFQUQ+Cis8VElUTEU+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L1RJVExFPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Cis8L0hFQUQ+CisKKzxCT0RZIEJHQ09MT1I9IiNGRkZGRkYiIFZMSU5LPSIjODAwMDAwIj4KKworCis8UCBBTElHTj0iQ0VOVEVSIj48Qj5Db21tb24gUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvQj4KKzxQPjxCPjwvQj48Rk9OVCBTSVpFPSIzIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIzIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSIFRIRSBURVJNUyBPRiBUSElTIENPTU1PTiBQVUJMSUMgTElDRU5TRSAoIkFHUkVFTUVOVCIpLiAgQU5ZIFVTRSwgUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFIE9GIFRISVMgQUdSRUVNRU5ULjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjxCPjEuICBERUZJTklUSU9OUzwvQj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj4iQ29udHJpYnV0aW9uIiBtZWFuczo8L0ZPTlQ+CisKKzxVTD48Rk9OVCBTSVpFPSIyIj5hKSBpbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbiBkaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPEJSIENMRUFSPSJMRUZUIj4KK2IpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiI+aSkJIAljaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiI+aWkpCQlhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9GT05UPjwvVUw+CisKKworPFVMPjxGT05UIFNJWkU9IjIiPndoZXJlIHN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQgYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPkEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IgaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24gc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5Db250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSB3aGljaDogIChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBQcm9ncmFtLiAgPC9GT05UPjwvVUw+CisKKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPiJDb250cmlidXRvciIgbWVhbnMgYW55IHBlcnNvbiBvciBlbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+IkxpY2Vuc2VkIFBhdGVudHMgIiBtZWFuIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZSBvciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiAgPC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj4iUHJvZ3JhbSIgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMgZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50LjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPiJSZWNpcGllbnQiIG1lYW5zIGFueW9uZSB3aG8gcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjxCPjwvQj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48Qj4yLiAgR1JBTlQgT0YgUklHSFRTPC9CPjwvRk9OVD4KKworPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5hKQk8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+U3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50czwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiNGRjAwMDAiPiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLjwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPmIpIAlTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDA4MDAwIj4gPC9GT05UPjxGT05UIFNJWkU9IjIiPnJveWFsdHktZnJlZSBwYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0IGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiAgVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQgYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24gdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8gYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uICBObyBoYXJkd2FyZSBwZXIgc2UgaXMgbGljZW5zZWQgaGVyZXVuZGVyLiAgIDwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiI+YykJUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cyBDb250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvciB0aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiAgRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQgZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiAgQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZCBsaWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eSB0byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuICBGb3IgZXhhbXBsZSwgaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjwvVUw+CisKKworPFVMPjxGT05UIFNJWkU9IjIiPmQpCUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0IHJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4gdGhpcyBBZ3JlZW1lbnQuIDwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KKworPFA+PEZPTlQgU0laRT0iMiI+PEI+My4gIFJFUVVJUkVNRU5UUzwvQj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48Qj48L0I+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0OjwvRk9OVD4KKworPFVMPjxGT05UIFNJWkU9IjIiPmEpCWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiI+YikJaXRzIGxpY2Vuc2UgYWdyZWVtZW50OjwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj5pKQllZmZlY3RpdmVseSBkaXNjbGFpbXM8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZCBjb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlIGFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9GT05UPjwvVUw+CisKKworPFVMPjxGT05UIFNJWkU9IjIiPmlpKSAJZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaCBhcyBsb3N0IHByb2ZpdHM7IDwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj5paWkpPC9GT05UPjxGT05UIFNJWkU9IjIiPglzdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0IENvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiI+aXYpCXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQgaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj4gPC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjRkYwMDAwIj48L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiNGRjAwMDAiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KKworPFA+PEZPTlQgU0laRT0iMiI+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UgY29kZSBmb3JtOjwvRk9OVD4KKworPFVMPjxGT05UIFNJWkU9IjIiPmEpCWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiI+YikJYSBjb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uICA8L0ZPTlQ+PC9VTD4KKworPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj48U1RSSUtFPjwvU1RSSUtFPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj48U1RSSUtFPjwvU1RSSUtFPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55IGNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uICA8L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZSBvcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cyBzdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gIDwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjxCPjQuICBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvQj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkgYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycyBhbmQgdGhlIGxpa2UuICBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2Ugb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwgbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuICAgVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgiQ29tbWVyY2lhbCBDb250cmlidXRvciIpIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIgQ29udHJpYnV0b3IgKCJJbmRlbW5pZmllZCBDb250cmlidXRvciIpIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQgY29zdHMgKGNvbGxlY3RpdmVseSAiTG9zc2VzIikgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyIGxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvIHRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcuICBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcyByZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gIEluIG9yZGVyIHRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB0byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZCBhbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUgaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhIENvbW1lcmNpYWwgQ29udHJpYnV0b3IuICBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZSBjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiAgVW5kZXIgdGhpcyBzZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUgb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYSBjb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48Qj41LiAgTk8gV0FSUkFOVFk8L0I+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzPC9GT05UPjxGT05UIFNJWkU9IjIiPiBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+dGhlIFByb2dyYW08L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudDwvRk9OVD48Rk9OVCBTSVpFPSIyIj4sIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywgY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgPC9GT05UPjxGT05UIFNJWkU9IjIiPnByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zPC9GT05UPjxGT05UIFNJWkU9IjIiPi4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PEI+Ni4gIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9CPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgPC9GT05UPjxGT05UIFNJWkU9IjIiPihJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksPC9GT05UPjxGT05UIFNJWkU9IjIiPiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjxCPjcuICBHRU5FUkFMPC9CPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0IGZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlIG1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGEgQ29udHJpYnV0b3Igd2l0aCByZXNwZWN0IHRvIGEgcGF0ZW50IGFwcGxpY2FibGUgdG8gc29mdHdhcmUgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpLCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMgZ3JhbnRlZCBieSB0aGF0IENvbnRyaWJ1dG9yIHRvIHN1Y2ggUmVjaXBpZW50IHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuICBJbiBhZGRpdGlvbiwgaWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoIG90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaCBSZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlIHBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gIElmIGFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gIEhvd2V2ZXIsIFJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieSBSZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcyBjb3B5cmlnaHRlZCAgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50IFN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5wdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YgdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj50aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzIHRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIElCTSBpcyB0aGUgaW5pdGlhbCBBZ3JlZW1lbnQgU3Rld2FyZC4gICBJQk0gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8gc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPkVhY2ggbmV3IHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBUaGUgUHJvZ3JhbSAoaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgPC9GT05UPjxGT05UIFNJWkU9IjIiPnZlcnNpb24uICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+RXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQgaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0byB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlciBleHByZXNzbHksIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5ieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlPC9GT05UPjxGT05UIFNJWkU9IjIiPi48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+ICBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdCBleHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlIFN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzIEFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gIEVhY2ggcGFydHkgd2FpdmVzIGl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorCis8L0JPRFk+CisKKzwvSFRNTD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5kb2NfMi4wLjAvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLmRvY18yLjAuMC9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhNGQ2MzkKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5kb2NfMi4wLjAvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5kb2NfMi4wLjAvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uZG9jXzIuMC4wL2ZlYXR1cmUucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGE3ZDFkCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uZG9jXzIuMC4wL2ZlYXR1cmUucHJvcGVydGllcwpAQCAtMCwwICsxLDE1MSBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisjIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjCisjIENvbnRyaWJ1dG9yczoKKyMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAvKioKKyMgICogPGNvcHlyaWdodD4KKyMgICoKKyMgICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisjICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworIyAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAorIyAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyAgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAorIyAgKiAKKyMgICogQ29udHJpYnV0b3JzOiAKKyMgICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyMgICoKKyMgICogPC9jb3B5cmlnaHQ+CisjICAqCisjICAqICRJZDogZmVhdHVyZS5wcm9wZXJ0aWVzLHYgMS4xIDIwMDQvMTAvMTggMTU6NTA6NDIgZGJpcnNhbiBFeHAgJCAKKyMgICovCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoKKyMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCisjIEluc3RlYWQsIGVpdGhlciByZWRlZmluZSBhbiBleGlzdGluZyBwcm9wZXJ0eSwgb3IgY3JlYXRlIGEgbmV3IHByb3BlcnR5LAorIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworIyBUaGlzIGZpbGUgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCisjICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQorIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQorIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCisKKyMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKK2ZlYXR1cmVOYW1lPUVNRiBTZXJ2aWNlIERhdGEgT2JqZWN0cyAoU0RPKSBEb2N1bWVudGF0aW9uCisKKyMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKK3Byb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZworCisjICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCit1cGRhdGVTaXRlTmFtZT1FY2xpcHNlLm9yZyB1cGRhdGUgc2l0ZQorCisjICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQorZGVzY3JpcHRpb249RU1GIFNlcnZpY2UgRGF0YSBPYmplY3RzIChTRE8pIERvY3VtZW50YXRpb24KKworIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCisjIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKK2xpY2Vuc2VVUkw9bGljZW5zZS5odG1sCisKKyMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCisjIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKK2xpY2Vuc2U9XAorRUNMSVBTRS5PUkcgU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKKzE0dGggQXVndXN0LCAyMDAzXG5cCitcblwKK1VzYWdlIE9mIENvbnRlbnRcblwKK1xuXAorRUNMSVBTRS5PUkcgTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKK09USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAorVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCitBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKK05PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKK0FHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKK0FORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCitPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAorVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAorT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKK0JFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKK1xuXAorQXBwbGljYWJsZSBMaWNlbnNlc1xuXAorXG5cCitVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgRWNsaXBzZS5vcmdcblwKK2lzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENvbW1vbiBQdWJsaWNcblwKK0xpY2Vuc2UgVmVyc2lvbiAxLjAgKCJDUEwiKS4gQSBjb3B5IG9mIHRoZSBDUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCitDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbC5cblwKK0ZvciBwdXJwb3NlcyBvZiB0aGUgQ1BMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAorXG5cCitDb250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKK2RvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAorcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKK2FzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAorXG5cCitDb250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHNcblwKKygiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3JcblwKK21vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWRcblwKKyJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZVxuXAorUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzXG5cCithcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAicGx1Z2lucyIgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluXG5cCitkaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLlxuXAorXG5cCitGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKKyJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCitJbmNsdWRlZCBGZWF0dXJlcy5cblwKK1xuXAorVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAorY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCitjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAoraW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAorTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAoraW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCitcblwKKyAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCisgICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCisgICAtIFN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAorICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCitcblwKK05vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSBFY2xpcHNlLm9yZyBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCitFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAorTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCitJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAord2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKK3lvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKK3RoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAorRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCitjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKK3VzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAorXG5cCitUSEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKK1RPIFRIRSBDUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAorU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAorXG5cCisgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKKyAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKKyAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAorICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKK1xuXAorSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAorVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKK2lzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCBFY2xpcHNlLm9yZyB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAorZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAorXG5cCitDcnlwdG9ncmFwaHlcblwKK1xuXAorQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCitjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCithbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCit1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKK3JlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKK2FuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuCisjIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCisjIFRoZSBhYm92ZSBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBzaGlwcGVkIGZvciB0cmFuc2xhdGlvbi4KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5kb2NfMi4wLjAvZmVhdHVyZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5kb2NfMi4wLjAvZmVhdHVyZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRmYjQ0YQotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLmRvY18yLjAuMC9mZWF0dXJlLnhtbApAQCAtMCwwICsxLDQ2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorCis8IS0tCisvKioKKyAqIDxjb3B5cmlnaHQ+CisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoKKyAqIDwvY29weXJpZ2h0PgorICoKKyAqICRJZDogZmVhdHVyZS54bWwsdiAxLjIgMjAwNC8wMy8yNiAxNTozMjoxMyBtYXJjZWxvcCBFeHAgJAorICovCistLT4KKworPGZlYXR1cmUKKwlpZD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5kb2MiCisgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKKyAgICB2ZXJzaW9uPSIyLjAuMCIKKyAgICBpbWFnZT0gImVjbGlwc2VfdXBkYXRlXzEyMC5qcGciCisgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+CisKKwk8ZGVzY3JpcHRpb24+CisgICAgCSVkZXNjcmlwdGlvbgorCTwvZGVzY3JpcHRpb24+CisKKyAgICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KKwkJJWxpY2Vuc2UKKwk8L2xpY2Vuc2U+CisKKwk8dXJsPgorCQk8dXBkYXRlIHVybD0iaHR0cDovL3VwZGF0ZS5lY2xpcHNlLm9yZy91cGRhdGVzIiBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIi8+CisJPC91cmw+CisKKwk8cGx1Z2luCisJCWlkPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLmRvYyIKKyAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgaW5zdGFsbC1zaXplPSIwIiAgIAkJCisJCXZlcnNpb249IjIuMC4wIi8+Cis8L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5kb2NfMi4wLjAvbGljZW5zZS5odG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uZG9jXzIuMC4wL2xpY2Vuc2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjhjMzgwCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uZG9jXzIuMC4wL2xpY2Vuc2UuaHRtbApAQCAtMCwwICsxLDcxIEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Cis8aHRtbD4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Cis8aDI+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgorPHA+MTR0aCBBdWd1c3QsIDIwMDM8L3A+CisKKzxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KKworPHA+RUNMSVBTRS5PUkcgTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUworICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKKyAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKKyAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCisgICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKKyAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KKyAgIAorPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAorICAgCis8cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgRWNsaXBzZS5vcmcgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCisgICAoJnF1b3Q7Q1BMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgQ1BMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+LgorICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBDUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KKworPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKKyAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgorCis8cD5Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiAgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gICBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzCisgICBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7IGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy48L3A+CisgIAorPHA+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBGaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9wPgorICAKKzxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCitJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCitpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+CisKKzx1bD4KKwk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KKwk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgorCTxsaT5TdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KKwk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Cis8L3VsPgorCQkKKzxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSBFY2xpcHNlLm9yZyBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQoraW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKK2luZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90Oy4KK1N1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCit0aGF0IGRpcmVjdG9yeS48L3A+CisKKzxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgQ1BMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKK09USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgorCis8dWw+CisJPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KKwk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCisJPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KKwk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgorPC91bD4KKworPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQorY29udGFjdCBFY2xpcHNlLm9yZyB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgorCis8aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KKworPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bworICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCisgICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5zb3VyY2VfMi4wLjAvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5zb3VyY2VfMi4wLjAvTUVUQS1JTkYvTUFOSUZFU1QuTUYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk0OTliYwotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLnNvdXJjZV8yLjAuMC9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMCwwICsxLDIgQEAKK01hbmlmZXN0LVZlcnNpb246IDEuMAorCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5zb3VyY2VfMi4wLjAvY3BsLXYxMC5odG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uc291cmNlXzIuMC4wL2NwbC12MTAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmFhMjA4Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uc291cmNlXzIuMC4wL2NwbC12MTAuaHRtbApAQCAtMCwwICsxLDEyNSBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgorPEhUTUw+Cis8SEVBRD4KKzxUSVRMRT5Db21tb24gUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvVElUTEU+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzwvSEVBRD4KKworPEJPRFkgQkdDT0xPUj0iI0ZGRkZGRiIgVkxJTks9IiM4MDAwMDAiPgorCisKKzxQIEFMSUdOPSJDRU5URVIiPjxCPkNvbW1vbiBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9CPgorPFA+PEI+PC9CPjxGT05UIFNJWkU9IjMiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjMiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIgVEhFIFRFUk1TIE9GIFRISVMgQ09NTU9OIFBVQkxJQyBMSUNFTlNFICgiQUdSRUVNRU5UIikuICBBTlkgVVNFLCBSRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UgT0YgVEhJUyBBR1JFRU1FTlQuPC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PEI+MS4gIERFRklOSVRJT05TPC9CPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPiJDb250cmlidXRpb24iIG1lYW5zOjwvRk9OVD4KKworPFVMPjxGT05UIFNJWkU9IjIiPmEpIGluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uIGRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8QlIgQ0xFQVI9IkxFRlQiPgorYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj5pKQkgCWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj5paSkJCWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiI+d2hlcmUgc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZCBieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+QSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvciBpZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbiBzdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPkNvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIHdoaWNoOiAgKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFByb2dyYW0uICA8L0ZPTlQ+PC9VTD4KKworPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+IkNvbnRyaWJ1dG9yIiBtZWFucyBhbnkgcGVyc29uIG9yIGVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj4iTGljZW5zZWQgUGF0ZW50cyAiIG1lYW4gcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlIG9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uICA8L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPiJQcm9ncmFtIiBtZWFucyB0aGUgQ29udHJpYnV0aW9ucyBkaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+IlJlY2lwaWVudCIgbWVhbnMgYW55b25lIHdobyByZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PEI+PC9CPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjxCPjIuICBHUkFOVCBPRiBSSUdIVFM8L0I+PC9GT05UPgorCis8VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPmEpCTwvRk9OVD48Rk9OVCBTSVpFPSIyIj5TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzPC9GT05UPjxGT05UIFNJWkU9IjIiPiBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iI0ZGMDAwMCI+IDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uPC9GT05UPjwvVUw+CisKKworPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+YikgCVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgPC9GT05UPjxGT05UIFNJWkU9IjIiPlJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDgwMDAiPiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+cm95YWx0eS1mcmVlIHBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uICBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZCBieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbiB0byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiAgVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0byBhbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gIE5vIGhhcmR3YXJlIHBlciBzZSBpcyBsaWNlbnNlZCBoZXJldW5kZXIuICAgPC9GT05UPjwvVUw+CisKKworPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj5jKQlSZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzIENvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yIHRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuICBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudCBmb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuICBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kIGxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5IHRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gIEZvciBleGFtcGxlLCBpZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiI+ZCkJRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQgcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbiB0aGlzIEFncmVlbWVudC4gPC9GT05UPjwvVUw+CisKKworPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgorCis8UD48Rk9OVCBTSVpFPSIyIj48Qj4zLiAgUkVRVUlSRU1FTlRTPC9CPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjxCPjwvQj5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9GT05UPgorCis8VUw+PEZPTlQgU0laRT0iMiI+YSkJaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj5iKQlpdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9GT05UPjwvVUw+CisKKworPFVMPjxGT05UIFNJWkU9IjIiPmkpCWVmZmVjdGl2ZWx5IGRpc2NsYWltczwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kIGNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUgYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiI+aWkpIAllZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoIGFzIGxvc3QgcHJvZml0czsgPC9GT05UPjwvVUw+CisKKworPFVMPjxGT05UIFNJWkU9IjIiPmlpaSk8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+CXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQgQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj5pdikJc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZCBpbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiNGRjAwMDAiPjwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iI0ZGMDAwMCI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgorCis8UD48Rk9OVCBTSVpFPSIyIj5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZSBjb2RlIGZvcm06PC9GT05UPgorCis8VUw+PEZPTlQgU0laRT0iMiI+YSkJaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj5iKQlhIGNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gIDwvRk9OVD48L1VMPgorCis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPjxTVFJJS0U+PC9TVFJJS0U+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPjxTVFJJS0U+PC9TVFJJS0U+PC9GT05UPjxGT05UIFNJWkU9IjIiPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkgY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gIDwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlIG9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzIHN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiAgPC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PEI+NC4gIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9CPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heSBhY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzIGFuZCB0aGUgbGlrZS4gIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZSBvZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbCBsaWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gICBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCJDb21tZXJjaWFsIENvbnRyaWJ1dG9yIikgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlciBDb250cmlidXRvciAoIkluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIikgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZCBjb3N0cyAoY29sbGVjdGl2ZWx5ICJMb3NzZXMiKSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIgbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8gdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiBjb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZy4gIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzIHJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiAgSW4gb3JkZXIgdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kIGFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiAgVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZSBpbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiAgVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEgQ29tbWVyY2lhbCBDb250cmlidXRvci4gIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlIGNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuICBVbmRlciB0aGlzIHNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZSBvdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhIGNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjxCPjUuICBOTyBXQVJSQU5UWTwvQj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXM8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj50aGUgUHJvZ3JhbTwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50PC9GT05UPjxGT05UIFNJWkU9IjIiPiwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLCBjb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+cHJvZ3JhbXMgb3IgZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnM8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+LiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48Qj42LiAgRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L0I+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+KElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSw8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PEI+Ny4gIEdFTkVSQUw8L0I+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQgZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUgbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYSBDb250cmlidXRvciB3aXRoIHJlc3BlY3QgdG8gYSBwYXRlbnQgYXBwbGljYWJsZSB0byBzb2Z0d2FyZSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCksIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcyBncmFudGVkIGJ5IHRoYXQgQ29udHJpYnV0b3IgdG8gc3VjaCBSZWNpcGllbnQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gIEluIGFkZGl0aW9uLCBpZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGggb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoIFJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvciBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUgcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiAgSWYgYWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiAgSG93ZXZlciwgUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5IFJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzIGNvcHlyaWdodGVkICBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQgU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gPC9GT05UPjxGT05UIFNJWkU9IjIiPnB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZiB0aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gPC9GT05UPjxGT05UIFNJWkU9IjIiPnRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMgdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gSUJNIGlzIHRoZSBpbml0aWFsIEFncmVlbWVudCBTdGV3YXJkLiAgIElCTSBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0byBzZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+RWFjaCBuZXcgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIFRoZSBQcm9ncmFtIChpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+dmVyc2lvbi4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5FeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZCBpbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyIGV4cHJlc3NseSwgPC9GT05UPjxGT05UIFNJWkU9IjIiPmJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2U8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+LjwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90IGV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUgU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMgQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiAgRWFjaCBwYXJ0eSB3YWl2ZXMgaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+CisKKzwvQk9EWT4KKworPC9IVE1MPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLnNvdXJjZV8yLjAuMC9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uc291cmNlXzIuMC4wL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E0ZDYzOQotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLnNvdXJjZV8yLjAuMC9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLnNvdXJjZV8yLjAuMC9mZWF0dXJlLnByb3BlcnRpZXMgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5zb3VyY2VfMi4wLjAvZmVhdHVyZS5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjYmIxY2IKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5zb3VyY2VfMi4wLjAvZmVhdHVyZS5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTUxIEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyMKKyMgQ29udHJpYnV0b3JzOgorIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIC8qKgorIyAgKiA8Y29weXJpZ2h0PgorIyAgKgorIyAgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyMgICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisjICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCisjICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisjICAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCisjICAqIAorIyAgKiBDb250cmlidXRvcnM6IAorIyAgKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyAgKgorIyAgKiA8L2NvcHlyaWdodD4KKyMgICoKKyMgICogJElkOiBmZWF0dXJlLnByb3BlcnRpZXMsdiAxLjEgMjAwNC8xMC8xOCAxNTo1MDo0MiBkYmlyc2FuIEV4cCAkIAorIyAgKi8KKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgRG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlIGxhc3QgbGluZSBjb250YWluaW5nOgorIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKKyMgSW5zdGVhZCwgZWl0aGVyIHJlZGVmaW5lIGFuIGV4aXN0aW5nIHByb3BlcnR5LCBvciBjcmVhdGUgYSBuZXcgcHJvcGVydHksCisjIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbmQgY2hhbmdlIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IG5hbWUuCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjIFRoaXMgZmlsZSBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKKyMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCisjIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCisjIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KKworIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQorZmVhdHVyZU5hbWU9RU1GIFNlcnZpY2UgRGF0YSBPYmplY3RzIChTRE8pIFNvdXJjZQorCisjICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCitwcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKKworIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQordXBkYXRlU2l0ZU5hbWU9RWNsaXBzZS5vcmcgdXBkYXRlIHNpdGUKKworIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKK2Rlc2NyaXB0aW9uPUVNRiBTZXJ2aWNlIERhdGEgT2JqZWN0cyAoU0RPKSBTb3VyY2UKKworIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCisjIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKK2xpY2Vuc2VVUkw9bGljZW5zZS5odG1sCisKKyMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCisjIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKK2xpY2Vuc2U9XAorRUNMSVBTRS5PUkcgU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKKzE0dGggQXVndXN0LCAyMDAzXG5cCitcblwKK1VzYWdlIE9mIENvbnRlbnRcblwKK1xuXAorRUNMSVBTRS5PUkcgTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKK09USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAorVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCitBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKK05PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKK0FHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKK0FORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCitPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAorVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAorT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKK0JFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKK1xuXAorQXBwbGljYWJsZSBMaWNlbnNlc1xuXAorXG5cCitVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgRWNsaXBzZS5vcmdcblwKK2lzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENvbW1vbiBQdWJsaWNcblwKK0xpY2Vuc2UgVmVyc2lvbiAxLjAgKCJDUEwiKS4gQSBjb3B5IG9mIHRoZSBDUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCitDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbC5cblwKK0ZvciBwdXJwb3NlcyBvZiB0aGUgQ1BMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAorXG5cCitDb250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKK2RvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAorcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKK2FzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAorXG5cCitDb250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHNcblwKKygiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3JcblwKK21vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWRcblwKKyJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZVxuXAorUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzXG5cCithcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAicGx1Z2lucyIgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluXG5cCitkaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLlxuXAorXG5cCitGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKKyJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCitJbmNsdWRlZCBGZWF0dXJlcy5cblwKK1xuXAorVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAorY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCitjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAoraW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAorTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAoraW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCitcblwKKyAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCisgICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCisgICAtIFN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAorICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCitcblwKK05vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSBFY2xpcHNlLm9yZyBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCitFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAorTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCitJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAord2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKK3lvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKK3RoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAorRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCitjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKK3VzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAorXG5cCitUSEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKK1RPIFRIRSBDUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAorU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAorXG5cCisgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKKyAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKKyAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAorICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKK1xuXAorSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAorVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKK2lzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCBFY2xpcHNlLm9yZyB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAorZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAorXG5cCitDcnlwdG9ncmFwaHlcblwKK1xuXAorQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCitjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCithbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCit1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKK3JlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKK2FuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuCisjIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCisjIFRoZSBhYm92ZSBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBzaGlwcGVkIGZvciB0cmFuc2xhdGlvbi4KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5zb3VyY2VfMi4wLjAvZmVhdHVyZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5zb3VyY2VfMi4wLjAvZmVhdHVyZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE1ZDg3ZAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLnNvdXJjZV8yLjAuMC9mZWF0dXJlLnhtbApAQCAtMCwwICsxLDIxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGZlYXR1cmUgcHJpbWFyeT0iZmFsc2UiICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIiAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIiAgaW1hZ2U9ImVjbGlwc2VfdXBkYXRlXzEyMC5qcGciIGlkPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLnNvdXJjZSIgIHZlcnNpb249IjIuMC4wIj4KKwk8ZGVzY3JpcHRpb24gPgorCQklZGVzY3JpcHRpb24KKwk8L2Rlc2NyaXB0aW9uPgorCTxjb3B5cmlnaHQgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+CisJCUNvcHlyaWdodCAoYykgMjAwMi0yMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCithcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAord2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKK2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCisJPC9jb3B5cmlnaHQ+CisJPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+CisJCSVsaWNlbnNlCisJPC9saWNlbnNlPgorCTx1cmw+CisJCTx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vdXBkYXRlLmVjbGlwc2Uub3JnL3VwZGF0ZXMvIi8+CisJCTxkaXNjb3ZlcnkgbGFiZWw9IiVzZWNvbmRhcnlVcGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvdG9vbHMvZW1mL3VwZGF0ZXMvIi8+CisJPC91cmw+CisJPHBsdWdpbiAgICBmcmFnbWVudD0iZmFsc2UiICBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIGlkPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLnNvdXJjZSIgdmVyc2lvbj0iMi4wLjAiLz4KKzwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLnNvdXJjZV8yLjAuMC9saWNlbnNlLmh0bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5zb3VyY2VfMi4wLjAvbGljZW5zZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmOGMzODAKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5zb3VyY2VfMi4wLjAvbGljZW5zZS5odG1sCkBAIC0wLDAgKzEsNzEgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KKzxodG1sPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Cis8dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KKzxoMj5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Cis8cD4xNHRoIEF1Z3VzdCwgMjAwMzwvcD4KKworPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgorCis8cD5FQ0xJUFNFLk9SRyBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCisgICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAorICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQorICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKKyAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAorICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgorICAgCis8aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCisgICAKKzxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSBFY2xpcHNlLm9yZyBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKKyAgICgmcXVvdDtDUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBDUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4uCisgICBGb3IgcHVycG9zZXMgb2YgdGhlIENQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgorCis8cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUworICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+CisKKzxwPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLiBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mICB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiAgIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMKKyAgIG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LjwvcD4KKyAgCis8cD5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIEZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L3A+CisgIAorPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKK0luY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKK2luY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KKworPHVsPgorCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgorCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+CisJPGxpPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgorCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KKzwvdWw+CisJCQorPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IEVjbGlwc2Uub3JnIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCitpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgoraW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7LgorU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KK3RoYXQgZGlyZWN0b3J5LjwvcD4KKworPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBDUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQorT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+CisKKzx1bD4KKwk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgorCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKKwk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgorCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Cis8L3VsPgorCis8cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCitjb250YWN0IEVjbGlwc2Uub3JnIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+CisKKzxoMz5DcnlwdG9ncmFwaHk8L2gzPgorCis8cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCisgICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKKyAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvXzIuMC4wL01FVEEtSU5GL01BTklGRVNULk1GIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG9fMi4wLjAvTUVUQS1JTkYvTUFOSUZFU1QuTUYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk0OTliYwotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvXzIuMC4wL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0wLDAgKzEsMiBAQAorTWFuaWZlc3QtVmVyc2lvbjogMS4wCisKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvXzIuMC4wL2NwbC12MTAuaHRtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvXzIuMC4wL2NwbC12MTAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmFhMjA4Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG9fMi4wLjAvY3BsLXYxMC5odG1sCkBAIC0wLDAgKzEsMTI1IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Cis8SFRNTD4KKzxIRUFEPgorPFRJVExFPkNvbW1vbiBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9USVRMRT4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorPC9IRUFEPgorCis8Qk9EWSBCR0NPTE9SPSIjRkZGRkZGIiBWTElOSz0iIzgwMDAwMCI+CisKKworPFAgQUxJR049IkNFTlRFUiI+PEI+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L0I+Cis8UD48Qj48L0I+PEZPTlQgU0laRT0iMyI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMyI+PC9GT05UPjxGT05UIFNJWkU9IjIiPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUiBUSEUgVEVSTVMgT0YgVEhJUyBDT01NT04gUFVCTElDIExJQ0VOU0UgKCJBR1JFRU1FTlQiKS4gIEFOWSBVU0UsIFJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRSBPRiBUSElTIEFHUkVFTUVOVC48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48Qj4xLiAgREVGSU5JVElPTlM8L0I+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+IkNvbnRyaWJ1dGlvbiIgbWVhbnM6PC9GT05UPgorCis8VUw+PEZPTlQgU0laRT0iMiI+YSkgaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24gZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxCUiBDTEVBUj0iTEVGVCI+CitiKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9GT05UPjwvVUw+CisKKworPFVMPjxGT05UIFNJWkU9IjIiPmkpCSAJY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9GT05UPjwvVUw+CisKKworPFVMPjxGT05UIFNJWkU9IjIiPmlpKQkJYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj53aGVyZSBzdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkIGJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5BIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yIGlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uIHN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+Q29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gd2hpY2g6ICAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgUHJvZ3JhbS4gIDwvRk9OVD48L1VMPgorCis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj4iQ29udHJpYnV0b3IiIG1lYW5zIGFueSBwZXJzb24gb3IgZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPiJMaWNlbnNlZCBQYXRlbnRzICIgbWVhbiBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2Ugb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gIDwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IlByb2dyYW0iIG1lYW5zIHRoZSBDb250cmlidXRpb25zIGRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj4iUmVjaXBpZW50IiBtZWFucyBhbnlvbmUgd2hvIHJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48Qj48L0I+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PEI+Mi4gIEdSQU5UIE9GIFJJR0hUUzwvQj48L0ZPTlQ+CisKKzxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+YSkJPC9GT05UPjxGT05UIFNJWkU9IjIiPlN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHM8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjRkYwMDAwIj4gPC9GT05UPjxGT05UIFNJWkU9IjIiPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS48L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjwvVUw+CisKKworPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5iKSAJU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+UmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwODAwMCI+IDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5yb3lhbHR5LWZyZWUgcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkIGJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uIHRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuICBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvIGFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiAgTm8gaGFyZHdhcmUgcGVyIHNlIGlzIGxpY2Vuc2VkIGhlcmV1bmRlci4gICA8L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjwvVUw+CisKKworPFVMPjxGT05UIFNJWkU9IjIiPmMpCVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMgQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IgdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50IGZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQgbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkgdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiAgRm9yIGV4YW1wbGUsIGlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZSBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9GT05UPjwvVUw+CisKKworPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj5kKQlFYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodCByaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluIHRoaXMgQWdyZWVtZW50LiA8L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjwvVUw+CisKKzxQPjxGT05UIFNJWkU9IjIiPjxCPjMuICBSRVFVSVJFTUVOVFM8L0I+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PEI+PC9CPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L0ZPTlQ+CisKKzxVTD48Rk9OVCBTSVpFPSIyIj5hKQlpdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9GT05UPjwvVUw+CisKKworPFVMPjxGT05UIFNJWkU9IjIiPmIpCWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiI+aSkJZWZmZWN0aXZlbHkgZGlzY2xhaW1zPC9GT05UPjxGT05UIFNJWkU9IjIiPiBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQgY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZSBhbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj5paSkgCWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2ggYXMgbG9zdCBwcm9maXRzOyA8L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiI+aWlpKTwvRk9OVD48Rk9OVCBTSVpFPSIyIj4Jc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdCBDb250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9GT05UPjwvVUw+CisKKworPFVMPjxGT05UIFNJWkU9IjIiPml2KQlzdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kIGluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+IDwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iI0ZGMDAwMCI+PC9GT05UPjwvVUw+CisKKworPFVMPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjRkYwMDAwIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPjwvVUw+CisKKzxQPjxGT05UIFNJWkU9IjIiPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlIGNvZGUgZm9ybTo8L0ZPTlQ+CisKKzxVTD48Rk9OVCBTSVpFPSIyIj5hKQlpdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9GT05UPjwvVUw+CisKKworPFVMPjxGT05UIFNJWkU9IjIiPmIpCWEgY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiAgPC9GT05UPjwvVUw+CisKKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+PFNUUklLRT48L1NUUklLRT48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+PFNUUklLRT48L1NUUklLRT48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueSBjb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiAgPC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUgb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3Mgc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uICA8L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48Qj40LiAgQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L0I+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5IGFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMgYW5kIHRoZSBsaWtlLiAgV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlIG9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsIGxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiAgIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoIkNvbW1lcmNpYWwgQ29udHJpYnV0b3IiKSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyIENvbnRyaWJ1dG9yICgiSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IiKSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kIGNvc3RzIChjb2xsZWN0aXZlbHkgIkxvc3NlcyIpIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlciBsZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0byB0aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIGNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLiAgVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMgcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuICBJbiBvcmRlciB0byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQgYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuICBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlIGluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguICBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yLiAgSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UgY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gIFVuZGVyIHRoaXMgc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlIG90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEgY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PEI+NS4gIE5PIFdBUlJBTlRZPC9CPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpczwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgPC9GT05UPjxGT05UIFNJWkU9IjIiPnRoZSBQcm9ncmFtPC9GT05UPjxGT05UIFNJWkU9IjIiPiBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+LCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsIGNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5wcm9ncmFtcyBvciBlcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9uczwvRk9OVD48Rk9OVCBTSVpFPSIyIj4uICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjxCPjYuICBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvQj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj4oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLDwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48Qj43LiAgR0VORVJBTDwvQj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dCBmdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZSBtaW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhIENvbnRyaWJ1dG9yIHdpdGggcmVzcGVjdCB0byBhIHBhdGVudCBhcHBsaWNhYmxlIHRvIHNvZnR3YXJlIChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzIGdyYW50ZWQgYnkgdGhhdCBDb250cmlidXRvciB0byBzdWNoIFJlY2lwaWVudCB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiAgSW4gYWRkaXRpb24sIGlmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aCBvdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2ggUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZSBwZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuICBJZiBhbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuICBIb3dldmVyLCBSZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkgUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMgY29weXJpZ2h0ZWQgIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudCBTdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+cHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mIHRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+dGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcyB0aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBJQk0gaXMgdGhlIGluaXRpYWwgQWdyZWVtZW50IFN0ZXdhcmQuICAgSUJNIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvIHNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5FYWNoIG5ldyB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgVGhlIFByb2dyYW0gKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAoaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IDwvRk9OVD48Rk9OVCBTSVpFPSIyIj52ZXJzaW9uLiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPkV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkIGluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8gdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIgZXhwcmVzc2x5LCA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+YnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZTwvRk9OVD48Rk9OVCBTSVpFPSIyIj4uPC9GT05UPjxGT05UIFNJWkU9IjIiPiAgQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QgZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZSBTdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcyBBZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuICBFYWNoIHBhcnR5IHdhaXZlcyBpdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKworPC9CT0RZPgorCis8L0hUTUw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG9fMi4wLjAvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvXzIuMC4wL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E0ZDYzOQotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvXzIuMC4wL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG9fMi4wLjAvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG9fMi4wLjAvZmVhdHVyZS5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MmYzYjkKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkb18yLjAuMC9mZWF0dXJlLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxNTQgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisjIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorIworIyBDb250cmlidXRvcnM6CisjICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgLyoqCisjICAqIDxjb3B5cmlnaHQ+CisjICAqCisjICAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyMgICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKKyMgICogCisjICAqIENvbnRyaWJ1dG9yczogCisjICAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjICAqCisjICAqIDwvY29weXJpZ2h0PgorIyAgKgorIyAgKiAkaWQkCisjICAqLworCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBEbyBub3QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUgbGFzdCBsaW5lIGNvbnRhaW5pbmc6CisjICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQorIyBJbnN0ZWFkLCBlaXRoZXIgcmVkZWZpbmUgYW4gZXhpc3RpbmcgcHJvcGVydHksIG9yIGNyZWF0ZSBhIG5ldyBwcm9wZXJ0eSwKKyMgYXBwZW5kIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUsIGFuZCBjaGFuZ2UgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgbmFtZS4KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyMgVGhpcyBmaWxlIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAorIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKKyMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKKyMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgorCisjICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCitmZWF0dXJlTmFtZT1FTUYgU2VydmljZSBEYXRhIE9iamVjdHMgKFNETykKKworIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQorcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCisKKyMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKK3VwZGF0ZVNpdGVOYW1lPUVjbGlwc2Uub3JnIHVwZGF0ZSBzaXRlCisKKyMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCitkZXNjcmlwdGlvbj1FTUYgU2VydmljZSBEYXRhIE9iamVjdHMgKFNETykuCisKKyMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgorIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCitsaWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAorCisjICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgorIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCitsaWNlbnNlPVwKK0VDTElQU0UuT1JHIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCisxNHRoIEF1Z3VzdCwgMjAwM1xuXAorXG5cCitVc2FnZSBPZiBDb250ZW50XG5cCitcblwKK0VDTElQU0UuT1JHIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCitPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKK1VTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAorQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCitOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCitBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCitBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAorT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKK1RFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKK09GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCitCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCitcblwKK0FwcGxpY2FibGUgTGljZW5zZXNcblwKK1xuXAorVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IEVjbGlwc2Uub3JnXG5cCitpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBDb21tb24gUHVibGljXG5cCitMaWNlbnNlIFZlcnNpb24gMS4wICgiQ1BMIikuIEEgY29weSBvZiB0aGUgQ1BMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAorQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwuXG5cCitGb3IgcHVycG9zZXMgb2YgdGhlIENQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKK1xuXAorQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCitkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKK3JlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCithcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKK1xuXAorQ29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzXG5cCisoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLiBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yXG5cCittb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkXG5cCisiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGVcblwKK1BsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gUGx1Zy1pbnMgYW5kIEZyYWdtZW50c1xuXAorYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpblxuXAorZGlyZWN0b3JpZXMgbmFtZWQgImZlYXR1cmVzIi5cblwKK1xuXAorRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCisiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAorSW5jbHVkZWQgRmVhdHVyZXMuXG5cCitcblwKK1RoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKK2NvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAorY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKK2luIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKK0xpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKK2luY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAorXG5cCisgICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAorICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAorICAgLSBTdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKKyAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAorXG5cCitOb3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgRWNsaXBzZS5vcmcgaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAorRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKK0xpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAorSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKK3dpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCit5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCit0aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKK0ZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAorY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCit1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKK1xuXAorVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCitUTyBUSEUgQ1BMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKK1NPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKK1xuXAorICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCisgICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCisgICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKKyAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCitcblwKK0lUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKK1RPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCitpcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgRWNsaXBzZS5vcmcgdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKK2dvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKK1xuXAorQ3J5cHRvZ3JhcGh5XG5cCitcblwKK0NvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAorY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAorYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAordXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCityZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCithbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cbgorIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQorIyBUaGUgYWJvdmUgcHJvcGVydGllcyBoYXZlIGJlZW4gc2hpcHBlZCBmb3IgdHJhbnNsYXRpb24uCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjICJzZWNvbmRhcnlVcGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHNlY29uZGFyeSB1cGRhdGUgc2l0ZSAob24gZG93bmxvYWQuZWNsaXBzZS5vcmcpCitzZWNvbmRhcnlVcGRhdGVTaXRlTmFtZT1FTUYvU0RPL1hTRCBTZWNvbmRhcnkgVXBkYXRlIFNpdGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvXzIuMC4wL2ZlYXR1cmUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG9fMi4wLjAvZmVhdHVyZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA0NjYyYgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvXzIuMC4wL2ZlYXR1cmUueG1sCkBAIC0wLDAgKzEsNTkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8ZmVhdHVyZQorICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8iCisgICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgorICAgICAgdmVyc2lvbj0iMi4wLjAiCisgICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgorICAgICAgaW1hZ2U9ImVjbGlwc2VfdXBkYXRlXzEyMC5qcGciPgorCisgICA8ZGVzY3JpcHRpb24+CisgICAgICAlZGVzY3JpcHRpb24KKyAgIDwvZGVzY3JpcHRpb24+CisKKyAgIDxjb3B5cmlnaHQgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+CisgICAgICBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KK0FsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKK3doaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CitodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAorICAgPC9jb3B5cmlnaHQ+CisKKyAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgorICAgICAgJWxpY2Vuc2UKKyAgIDwvbGljZW5zZT4KKworICAgPHVybD4KKyAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vdXBkYXRlLmVjbGlwc2Uub3JnL3VwZGF0ZXMvIi8+CisgICAgICA8ZGlzY292ZXJ5IGxhYmVsPSIlc2Vjb25kYXJ5VXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3Rvb2xzL2VtZi91cGRhdGVzLyIvPgorICAgPC91cmw+CisKKyAgIDxyZXF1aXJlcz4KKyAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcyIgdmVyc2lvbj0iMy4wLjAiIG1hdGNoPSJjb21wYXRpYmxlIi8+CisgICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlIiB2ZXJzaW9uPSIyLjAuMCIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KKyAgIDwvcmVxdWlyZXM+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuY29tbW9uai5zZG8iCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMi4wLjAiLz4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8iCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMi4wLjAiLz4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uZWRpdCIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIyLjAuMCIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5lZGl0b3IiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMi4wLjAiLz4KKworPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG9fMi4wLjAvbGljZW5zZS5odG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG9fMi4wLjAvbGljZW5zZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmOGMzODAKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkb18yLjAuMC9saWNlbnNlLmh0bWwKQEAgLTAsMCArMSw3MSBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgorPGh0bWw+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgorPGgyPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KKzxwPjE0dGggQXVndXN0LCAyMDAzPC9wPgorCis8aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+CisKKzxwPkVDTElQU0UuT1JHIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKKyAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECisgICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCisgICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgorICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECisgICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+CisgICAKKzxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKKyAgIAorPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IEVjbGlwc2Uub3JnIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAorICAgKCZxdW90O0NQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIENQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPi4KKyAgIEZvciBwdXJwb3NlcyBvZiB0aGUgQ1BMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CisKKzxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCisgICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KKworPHA+Q29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBGaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCBhIEZlYXR1cmUuICAgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcworICAgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90OyBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuPC9wPgorICAKKzxwPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gRmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvcD4KKyAgCis8cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAorSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQoraW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgorCis8dWw+CisJPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+CisJPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KKwk8bGk+U3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+CisJPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgorPC91bD4KKwkJCis8cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgRWNsaXBzZS5vcmcgaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKK2luc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCitpbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsuCitTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgordGhhdCBkaXJlY3RvcnkuPC9wPgorCis8cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIENQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCitPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KKworPHVsPgorCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+CisJPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQorCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+CisJPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KKzwvdWw+CisKKzxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKK2NvbnRhY3QgRWNsaXBzZS5vcmcgdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KKworPGgzPkNyeXB0b2dyYXBoeTwvaDM+CisKKzxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KKyAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAorICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5zZGtfMi4wLjAvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLnNka18yLjAuMC9NRVRBLUlORi9NQU5JRkVTVC5NRgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTQ5OWJjCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5zZGtfMi4wLjAvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTAsMCArMSwyIEBACitNYW5pZmVzdC1WZXJzaW9uOiAxLjAKKwpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5zZGtfMi4wLjAvY3BsLXYxMC5odG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5zZGtfMi4wLjAvY3BsLXYxMC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NDE2YzEKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLnNka18yLjAuMC9jcGwtdjEwLmh0bWwKQEAgLTAsMCArMSwyNjYgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCisgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgorPGhlYWQ+Cis8bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9IkhUTUwgVGlkeSwgc2VlIHd3dy53My5vcmciIC8+Cis8dGl0bGU+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L3RpdGxlPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIgorY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiIC8+Cis8L2hlYWQ+Cis8Ym9keSBiZ2NvbG9yPSIjRkZGRkZGIiB2bGluaz0iIzgwMDAwMCI+Cis8cCBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7IHRleHQtYWxpZ246IGNlbnRlciI+Q29tbW9uIFB1YmxpYworTGljZW5zZSAtIHYgMS4wPC9wPgorCis8cD5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIgVEhFIFRFUk1TIE9GIFRISVMKK0NPTU1PTiBQVUJMSUMgTElDRU5TRSAoIkFHUkVFTUVOVCIpLiBBTlkgVVNFLCBSRVBST0RVQ1RJT04gT1IKK0RJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFIE9GCitUSElTIEFHUkVFTUVOVC48L3A+CisKKzxwIHN0eWxlPSJmb250LXdlaWdodDogYm9sZCI+MS4gREVGSU5JVElPTlM8L3A+CisKKzxwPiJDb250cmlidXRpb24iIG1lYW5zOjwvcD4KKworPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDJlbSI+YSkgaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwKK0NvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uIGRpc3RyaWJ1dGVkIHVuZGVyCit0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPSJMRUZUIiAvPgorYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvZGl2PgorCis8ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogMmVtIj5pKSBjaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L2Rpdj4KKworPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDJlbSI+aWkpIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L2Rpdj4KKworPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDJlbSI+d2hlcmUgc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMKK3RvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQgYnkgdGhhdAorcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYQorQ29udHJpYnV0b3IgaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IKK2l0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uIHN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMKK2RvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZQorbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBQcm9ncmFtCit1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQord29ya3Mgb2YgdGhlIFByb2dyYW0uPC9kaXY+CisKKzxwPiJDb250cmlidXRvciIgbWVhbnMgYW55IHBlcnNvbiBvciBlbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUKK1Byb2dyYW0uPC9wPgorCis8cD4iTGljZW5zZWQgUGF0ZW50cyAiIG1lYW4gcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IGEKK0NvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZSBvciBzYWxlIG9mCitpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS48L3A+CisKKzxwPiJQcm9ncmFtIiBtZWFucyB0aGUgQ29udHJpYnV0aW9ucyBkaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGgKK3RoaXMgQWdyZWVtZW50LjwvcD4KKworPHA+IlJlY2lwaWVudCIgbWVhbnMgYW55b25lIHdobyByZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzCitBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvcD4KKworPHAgc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkIj4yLiBHUkFOVCBPRiBSSUdIVFM8L3A+CisKKzxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiAyZW0iPmEpIFN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMKK0FncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudCBhCitub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bworcmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5CitwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAorQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kCitvYmplY3QgY29kZSBmb3JtLjwvZGl2PgorCis8ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogMmVtIj5iKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzCitBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQgYQorbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgcGF0ZW50IGxpY2Vuc2UgdW5kZXIKK0xpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQgYW5kCitvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluCitzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseQordG8gdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUKK3RpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZCBieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YKK3RoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24gdG8gYmUgY292ZXJlZCBieSB0aGUKK0xpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8gYW55IG90aGVyCitjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKK2xpY2Vuc2VkIGhlcmV1bmRlci48L2Rpdj4KKworPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDJlbSI+YykgUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQKK2FsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMgQ29udHJpYnV0aW9ucworc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCit0aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsCitwcm9wZXJ0eSByaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55CitsaWFiaWxpdHkgdG8gUmVjaXBpZW50IGZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkCitvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEKK2NvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kIGxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLAorZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eSB0byBzZWN1cmUgYW55CitvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwgaWYKK2EgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvCitkaXN0cmlidXRlIHRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlCit0aGF0IGxpY2Vuc2UgYmVmb3JlIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L2Rpdj4KKworPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDJlbSI+ZCkgRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQKK3RvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0IHJpZ2h0cyBpbiBpdHMKK0NvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCit0aGlzIEFncmVlbWVudC48L2Rpdj4KKworPHAgc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkIj4zLiBSRVFVSVJFTUVOVFM8L3A+CisKKzxwPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGluIG9iamVjdAorY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9wPgorCis8ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogMmVtIj5hKSBpdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQKK2NvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvZGl2PgorCis8ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogMmVtIj5iKSBpdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9kaXY+CisKKzxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiAyZW0iPmkpIGVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YKK2FsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kIGNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kCitpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlIGFuZAorbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mCittZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOzwvZGl2PgorCis8ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogMmVtIj5paSkgZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mCithbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBkaXJlY3QsCitpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoIGFzCitsb3N0IHByb2ZpdHM7PC9kaXY+CisKKzxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiAyZW0iPmlpaSkgc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2gKK2RpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQgQ29udHJpYnV0b3IgYWxvbmUKK2FuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L2Rpdj4KKworPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDJlbSI+aXYpIHN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUKK1Byb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kIGluZm9ybXMgbGljZW5zZWVzCitob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bQorY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPC9kaXY+CisKKzxwPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlIGNvZGUgZm9ybTo8L3A+CisKKzxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiAyZW0iPmEpIGl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIKK3RoaXMgQWdyZWVtZW50OyBhbmQ8L2Rpdj4KKworPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDJlbSI+YikgYSBjb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUKK2luY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLjwvZGl2PgorCis8cD5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55IGNvcHlyaWdodCBub3RpY2VzCitjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLjwvcD4KKworPHA+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUgb3JpZ2luYXRvciBvZiBpdHMKK0NvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzIHN1YnNlcXVlbnQKK1JlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi48L3A+CisKKzxwIHN0eWxlPSJmb250LXdlaWdodDogYm9sZCI+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3A+CisKKzxwPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heSBhY2NlcHQgY2VydGFpbgorcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycyBhbmQKK3RoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUKK2NvbW1lcmNpYWwgdXNlIG9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZQorUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIKK3doaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwgbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuCitUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCitwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgiQ29tbWVyY2lhbCBDb250cmlidXRvciIpCitoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyIENvbnRyaWJ1dG9yCisoIkluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIikgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZCBjb3N0cworKGNvbGxlY3RpdmVseSAiTG9zc2VzIikgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCitsZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZAorQ29udHJpYnV0b3IgdG8gdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2gKK0NvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlCitQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcworc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMgcmVsYXRpbmcgdG8gYW55IGFjdHVhbAorb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlciB0byBxdWFsaWZ5LAorYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCitDb250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbAorQ29udHJpYnV0b3IgdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsCitDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kIGFueSByZWxhdGVkIHNldHRsZW1lbnQKK25lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZSBpbiBhbnkKK3N1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvcD4KKworPHA+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUgUHJvZ3JhbSBpbiBhCitjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKK0NvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzCitwZXJmb3JtYW5jZSBjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLAordGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwKK0NvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMgc2VjdGlvbiwgdGhlCitDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQorb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAord2FycmFudGllcywgYW5kIGlmIGEgY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheQorYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlCitkYW1hZ2VzLjwvcD4KKworPHAgc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkIj41LiBOTyBXQVJSQU5UWTwvcD4KKworPHA+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTCitQUk9WSURFRCBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRgorQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sCitBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAorTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudAoraXMgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nCithbmQgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGgKK2l0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBidXQgbm90CitsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsIGNvbXBsaWFuY2Ugd2l0aAorYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvciBlcXVpcG1lbnQsCithbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuPC9wPgorCis8cCBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQiPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9wPgorCis8cD5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgTkVJVEhFUgorUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IgQU5ZCitESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKK0RBTUFHRVMgKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQKK0FORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCitMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFCitFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCitQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9wPgorCis8cCBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQiPjcuIEdFTkVSQUw8L3A+CisKKzxwPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlCit1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKK2VuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQKK3dpdGhvdXQgZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbAorYmUgcmVmb3JtZWQgdG8gdGhlIG1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uCit2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9wPgorCis8cD5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGEgQ29udHJpYnV0b3IKK3dpdGggcmVzcGVjdCB0byBhIHBhdGVudCBhcHBsaWNhYmxlIHRvIHNvZnR3YXJlIChpbmNsdWRpbmcgYQorY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCksIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcworZ3JhbnRlZCBieSB0aGF0IENvbnRyaWJ1dG9yIHRvIHN1Y2ggUmVjaXBpZW50IHVuZGVyIHRoaXMgQWdyZWVtZW50CitzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiBJbgorYWRkaXRpb24sIGlmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55CitlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCithbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUKK1Byb2dyYW0gd2l0aCBvdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MKK3BhdGVudChzKSwgdGhlbiBzdWNoIFJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKQorc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC48L3A+CisKKzxwPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGlmCitpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yIGNvbmRpdGlvbnMgb2YKK3RoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKK3BlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsCitSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzCit0byBjZWFzZSB1c2UgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkKK3ByYWN0aWNhYmxlLiBIb3dldmVyLCBSZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudAorYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5IFJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbAorY29udGludWUgYW5kIHN1cnZpdmUuPC9wPgorCis8cD5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhpcworQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCitjb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZQorQWdyZWVtZW50IFN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zCisoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YgdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZQorb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzIHRoZSByaWdodCB0byBtb2RpZnkgdGhpcworQWdyZWVtZW50LiBJQk0gaXMgdGhlIGluaXRpYWwgQWdyZWVtZW50IFN0ZXdhcmQuIElCTSBtYXkgYXNzaWduIHRoZQorcmVzcG9uc2liaWxpdHkgdG8gc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUKK3NlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYQorZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtIChpbmNsdWRpbmcKK0NvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgordGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldwordmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvCitkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcKK3ZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkIGluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikKK2Fib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvIHRoZSBpbnRlbGxlY3R1YWwKK3Byb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgorZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZQorUHJvZ3JhbSBub3QgZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlCityZXNlcnZlZC48L3A+CisKKzxwPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZSBTdGF0ZSBvZiBOZXcgWW9yaworYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhLgorTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCitBZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2gKK3BhcnR5IHdhaXZlcyBpdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nCitsaXRpZ2F0aW9uLjwvcD4KKzwvYm9keT4KKzwvaHRtbD4KKwpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5zZGtfMi4wLjAvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuc2RrXzIuMC4wL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhlM2UwMgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuc2RrXzIuMC4wL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5zZGtfMi4wLjAvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5zZGtfMi4wLjAvZmVhdHVyZS5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5NDc3NWMKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLnNka18yLjAuMC9mZWF0dXJlLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxNDAgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisjIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorIworIyBDb250cmlidXRvcnM6CisjICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgLyoqCisjICAqIDxjb3B5cmlnaHQ+CisjICAqCisjICAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyMgICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKKyMgICogCisjICAqIENvbnRyaWJ1dG9yczogCisjICAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjICAqCisjICAqIDwvY29weXJpZ2h0PgorIyAgKgorIyAgKiAkSWQ6IGZlYXR1cmUucHJvcGVydGllcyx2IDEuMSAyMDA0LzEwLzE4IDE1OjUwOjQyIGRiaXJzYW4gRXhwICQKKyMgICovCisKKyMgZmVhdHVyZS5wcm9wZXJ0aWVzCisjIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAorIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKKyMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKKyMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgorCisjICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCitmZWF0dXJlTmFtZT1FTUYgU0RLCisKKyMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKK3Byb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZworCisjICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCit1cGRhdGVTaXRlTmFtZT1FY2xpcHNlLm9yZyB1cGRhdGUgc2l0ZQorCisjICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQorZGVzY3JpcHRpb249QmluYXJpZXMgYW5kIEFQSSBkb2N1bWVudGF0aW9uIGFuZCBzb3VyY2UgemlwcyBmb3IgRU1GLgorCisjICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKKyMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQorbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKKworIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKKyMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgorbGljZW5zZT1cCitFQ0xJUFNFLk9SRyBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAorMTR0aCBBdWd1c3QsIDIwMDNcblwKK1xuXAorVXNhZ2UgT2YgQ29udGVudFxuXAorXG5cCitFQ0xJUFNFLk9SRyBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAorT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCitVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKK0FHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAorTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAorQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAorQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKK09SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCitURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCitPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAorQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAorXG5cCitBcHBsaWNhYmxlIExpY2Vuc2VzXG5cCitcblwKK1VubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSBFY2xpcHNlLm9yZ1xuXAoraXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ29tbW9uIFB1YmxpY1xuXAorTGljZW5zZSBWZXJzaW9uIDEuMCAoIkNQTCIpLiBBIGNvcHkgb2YgdGhlIENQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKK0NvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sLlxuXAorRm9yIHB1cnBvc2VzIG9mIHRoZSBDUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCitcblwKK0NvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAorZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCityZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAorYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCitcblwKK0NvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50c1xuXAorKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvclxuXAorbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBGaWxlcyBuYW1lZFxuXAorImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlXG5cCitQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCBhIEZlYXR1cmUuIFBsdWctaW5zIGFuZCBGcmFnbWVudHNcblwKK2FyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICJwbHVnaW5zIiBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW5cblwKK2RpcmVjdG9yaWVzIG5hbWVkICJmZWF0dXJlcyIuXG5cCitcblwKK0ZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAorImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKK0luY2x1ZGVkIEZlYXR1cmVzLlxuXAorXG5cCitUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCitjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKK2NvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCitpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCitMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCitpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKK1xuXAorICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKKyAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKKyAgIC0gU3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCisgICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKK1xuXAorTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IEVjbGlwc2Uub3JnIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKK0VjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCitMaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKK0luY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCit3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoreW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAordGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCitGZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKK2NvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAordXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCitcblwKK1RIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAorVE8gVEhFIENQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCitTT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCitcblwKKyAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAorICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAorICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCisgICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAorXG5cCitJVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCitUTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAoraXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IEVjbGlwc2Uub3JnIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCitnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCitcblwKK0NyeXB0b2dyYXBoeVxuXAorXG5cCitDb250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKK2N1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKK2FuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKK3VzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAorcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAorYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG4KKyMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuc2RrXzIuMC4wL2ZlYXR1cmUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5zZGtfMi4wLjAvZmVhdHVyZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQxOGRlMgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuc2RrXzIuMC4wL2ZlYXR1cmUueG1sCkBAIC0wLDAgKzEsODYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+CisKKzwhLS0KKy8qKgorICogPGNvcHlyaWdodD4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKgorICogPC9jb3B5cmlnaHQ+CisgKgorICogJElkOiBmZWF0dXJlLnhtbCx2IDEuMiAyMDA0LzAzLzI1IDE0OjA2OjM0IG1hcmNlbG9wIEV4cCAkCisgKi8KKy0tPgorCis8ZmVhdHVyZQorICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuc2RrIgorICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCisgICAgdmVyc2lvbj0iMi4wLjAiCisgICAgaW1hZ2U9ICJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIgorICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgorCisJPGRlc2NyaXB0aW9uPgorICAgICAgICAlZGVzY3JpcHRpb24KKyAgICA8L2Rlc2NyaXB0aW9uPgorICAgCisJPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+CisgICAgICAgICVsaWNlbnNlCisgICAgPC9saWNlbnNlPgorCisgICAgPHVybD4KKyAgICAgIDx1cGRhdGUgdXJsPSJodHRwOi8vdXBkYXRlLmVjbGlwc2Uub3JnL3VwZGF0ZXMiIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiLz4KKyAgICA8L3VybD4KKworICAgIDxpbmNsdWRlcworICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mIgorICAgICAgICB2ZXJzaW9uPSIyLjAuMCIKKyAgICAgICAgbWF0Y2g9ImNvbXBhdGlibGUiLz4gCisgICAgICAgIAorICAgIDxpbmNsdWRlcworICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLnNvdXJjZSIKKyAgICAgICAgdmVyc2lvbj0iMi4wLjAiCisgICAgICAgIG1hdGNoPSJjb21wYXRpYmxlIi8+IAorCisgICAgPGluY2x1ZGVzCisgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuZG9jIgorICAgICAgICB2ZXJzaW9uPSIyLjAuMCIKKyAgICAgICAgbWF0Y2g9ImNvbXBhdGlibGUiLz4gICAKKworICAgIDxpbmNsdWRlcworICAgICAgICBpZD0ib3JnLmVjbGlwc2UueHNkIgorICAgICAgICB2ZXJzaW9uPSIyLjAuMCIKKyAgICAgICAgbWF0Y2g9ImNvbXBhdGlibGUiLz4gCisKKyAgICA8aW5jbHVkZXMKKyAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnhzZC5zb3VyY2UiCisgICAgICAgIHZlcnNpb249IjIuMC4wIgorICAgICAgICBtYXRjaD0iY29tcGF0aWJsZSIvPiAKKworICAgIDxpbmNsdWRlcworICAgICAgICBpZD0ib3JnLmVjbGlwc2UueHNkLmRvYyIKKyAgICAgICAgdmVyc2lvbj0iMi4wLjAiCisgICAgICAgIG1hdGNoPSJjb21wYXRpYmxlIi8+IAorCisgICAgPGluY2x1ZGVzCisgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvIgorICAgICAgICB2ZXJzaW9uPSIyLjAuMCIKKyAgICAgICAgbWF0Y2g9ImNvbXBhdGlibGUiLz4gCisKKyAgICA8aW5jbHVkZXMKKyAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uc291cmNlIgorICAgICAgICB2ZXJzaW9uPSIyLjAuMCIKKyAgICAgICAgbWF0Y2g9ImNvbXBhdGlibGUiLz4gCisKKyAgICA8aW5jbHVkZXMKKyAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uZG9jIgorICAgICAgICB2ZXJzaW9uPSIyLjAuMCIKKyAgICAgICAgbWF0Y2g9ImNvbXBhdGlibGUiLz4gCisgICAgICAgCis8L2ZlYXR1cmU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5zZGtfMi4wLjAvbGljZW5zZS5odG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5zZGtfMi4wLjAvbGljZW5zZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3YTVlMTgKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLnNka18yLjAuMC9saWNlbnNlLmh0bWwKQEAgLTAsMCArMSwxMjYgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCisgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgorPGhlYWQ+Cis8bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9IkhUTUwgVGlkeSwgc2VlIHd3dy53My5vcmciIC8+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiCitjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSIgLz4KKzx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keSBsYW5nPSJFTi1VUyIgbGluaz0iYmx1ZSIgdmxpbms9InB1cnBsZSI+Cis8aDI+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgorCis8cD4xNHRoIEF1Z3VzdCwgMjAwMzwvcD4KKworPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgorCis8cD5FQ0xJUFNFLk9SRyBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OCitBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZCisiQ09OVEVOVCIpLiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORAorQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GCitMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkKK1VTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUworR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkKK0FQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQKK0JFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTCitBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFCitBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWQorTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+CisKKzxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4KKworPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5CitFY2xpcHNlLm9yZyBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCit0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiQ1BMIikuIEEgY29weSBvZiB0aGUgQ1BMIGlzCitwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEKK2hyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4uCitGb3IgcHVycG9zZXMgb2YgdGhlIENQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CisKKzxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdAorY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcKK0NWUyByZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlCithdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuPC9wPgorCis8cD5Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbgorZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhCitidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZAorbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcworYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkCit3aXRoIGEgRmVhdHVyZS4gUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcworbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZAorImZlYXR1cmVzIi48L3A+CisKKzxwPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLgorRmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZAordmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvcD4KKworPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZAorYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kCitjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlCitjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuCitBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhCitEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZworbG9jYXRpb25zOjwvcD4KKworPHVsPgorPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+CisKKzxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+CisKKzxsaT5TdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4KK1BsdWctaW5zPC9saT4KKworPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgorPC91bD4KKworPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IEVjbGlwc2Uub3JnIGlzIGluc3RhbGxlZAordXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZQorKCJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlCitGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZQorc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcKK3RoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uCitGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZgorZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzIGFuZAorRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yCityZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mCit0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LjwvcD4KKworPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZCitSRUZFUiBUTyBUSEUgQ1BMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQKK0NPTkRJVElPTlMuIFNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQKK0FSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgorCis8dWw+Cis8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEKK2hyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KKworPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YQoraHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPgoraHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CisKKzxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YQoraHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPgoraHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+CisKKzxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEKK2hyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgorPC91bD4KKworPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQKK0NPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZQorTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdAorRWNsaXBzZS5vcmcgdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQKK3BhcnRpY3VsYXIgQ29udGVudC48L3A+CisKKzxoMz5DcnlwdG9ncmFwaHk8L2gzPgorCis8cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoCit5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwKK2FuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uCitzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlCitjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKK3Bvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYKK3RoaXMgaXMgcGVybWl0dGVkLjwvcD4KKzwvYm9keT4KKzwvaHRtbD4KKwpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5zb3VyY2VfMi4wLjAvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLnNvdXJjZV8yLjAuMC9NRVRBLUlORi9NQU5JRkVTVC5NRgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTQ5OWJjCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5zb3VyY2VfMi4wLjAvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTAsMCArMSwyIEBACitNYW5pZmVzdC1WZXJzaW9uOiAxLjAKKwpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5zb3VyY2VfMi4wLjAvY3BsLXYxMC5odG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5zb3VyY2VfMi4wLjAvY3BsLXYxMC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NDE2YzEKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLnNvdXJjZV8yLjAuMC9jcGwtdjEwLmh0bWwKQEAgLTAsMCArMSwyNjYgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCisgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgorPGhlYWQ+Cis8bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9IkhUTUwgVGlkeSwgc2VlIHd3dy53My5vcmciIC8+Cis8dGl0bGU+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L3RpdGxlPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIgorY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiIC8+Cis8L2hlYWQ+Cis8Ym9keSBiZ2NvbG9yPSIjRkZGRkZGIiB2bGluaz0iIzgwMDAwMCI+Cis8cCBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7IHRleHQtYWxpZ246IGNlbnRlciI+Q29tbW9uIFB1YmxpYworTGljZW5zZSAtIHYgMS4wPC9wPgorCis8cD5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIgVEhFIFRFUk1TIE9GIFRISVMKK0NPTU1PTiBQVUJMSUMgTElDRU5TRSAoIkFHUkVFTUVOVCIpLiBBTlkgVVNFLCBSRVBST0RVQ1RJT04gT1IKK0RJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFIE9GCitUSElTIEFHUkVFTUVOVC48L3A+CisKKzxwIHN0eWxlPSJmb250LXdlaWdodDogYm9sZCI+MS4gREVGSU5JVElPTlM8L3A+CisKKzxwPiJDb250cmlidXRpb24iIG1lYW5zOjwvcD4KKworPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDJlbSI+YSkgaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwKK0NvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uIGRpc3RyaWJ1dGVkIHVuZGVyCit0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPSJMRUZUIiAvPgorYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvZGl2PgorCis8ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogMmVtIj5pKSBjaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L2Rpdj4KKworPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDJlbSI+aWkpIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L2Rpdj4KKworPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDJlbSI+d2hlcmUgc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMKK3RvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQgYnkgdGhhdAorcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYQorQ29udHJpYnV0b3IgaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IKK2l0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uIHN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMKK2RvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZQorbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBQcm9ncmFtCit1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQord29ya3Mgb2YgdGhlIFByb2dyYW0uPC9kaXY+CisKKzxwPiJDb250cmlidXRvciIgbWVhbnMgYW55IHBlcnNvbiBvciBlbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUKK1Byb2dyYW0uPC9wPgorCis8cD4iTGljZW5zZWQgUGF0ZW50cyAiIG1lYW4gcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IGEKK0NvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZSBvciBzYWxlIG9mCitpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS48L3A+CisKKzxwPiJQcm9ncmFtIiBtZWFucyB0aGUgQ29udHJpYnV0aW9ucyBkaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGgKK3RoaXMgQWdyZWVtZW50LjwvcD4KKworPHA+IlJlY2lwaWVudCIgbWVhbnMgYW55b25lIHdobyByZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzCitBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvcD4KKworPHAgc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkIj4yLiBHUkFOVCBPRiBSSUdIVFM8L3A+CisKKzxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiAyZW0iPmEpIFN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMKK0FncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudCBhCitub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bworcmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5CitwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAorQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kCitvYmplY3QgY29kZSBmb3JtLjwvZGl2PgorCis8ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogMmVtIj5iKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzCitBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQgYQorbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgcGF0ZW50IGxpY2Vuc2UgdW5kZXIKK0xpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQgYW5kCitvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluCitzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseQordG8gdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUKK3RpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZCBieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YKK3RoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24gdG8gYmUgY292ZXJlZCBieSB0aGUKK0xpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8gYW55IG90aGVyCitjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKK2xpY2Vuc2VkIGhlcmV1bmRlci48L2Rpdj4KKworPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDJlbSI+YykgUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQKK2FsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMgQ29udHJpYnV0aW9ucworc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCit0aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsCitwcm9wZXJ0eSByaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55CitsaWFiaWxpdHkgdG8gUmVjaXBpZW50IGZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkCitvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEKK2NvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kIGxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLAorZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eSB0byBzZWN1cmUgYW55CitvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwgaWYKK2EgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvCitkaXN0cmlidXRlIHRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlCit0aGF0IGxpY2Vuc2UgYmVmb3JlIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L2Rpdj4KKworPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDJlbSI+ZCkgRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQKK3RvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0IHJpZ2h0cyBpbiBpdHMKK0NvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCit0aGlzIEFncmVlbWVudC48L2Rpdj4KKworPHAgc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkIj4zLiBSRVFVSVJFTUVOVFM8L3A+CisKKzxwPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGluIG9iamVjdAorY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9wPgorCis8ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogMmVtIj5hKSBpdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQKK2NvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvZGl2PgorCis8ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogMmVtIj5iKSBpdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9kaXY+CisKKzxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiAyZW0iPmkpIGVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YKK2FsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kIGNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kCitpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlIGFuZAorbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mCittZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOzwvZGl2PgorCis8ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogMmVtIj5paSkgZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mCithbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBkaXJlY3QsCitpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoIGFzCitsb3N0IHByb2ZpdHM7PC9kaXY+CisKKzxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiAyZW0iPmlpaSkgc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2gKK2RpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQgQ29udHJpYnV0b3IgYWxvbmUKK2FuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L2Rpdj4KKworPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDJlbSI+aXYpIHN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUKK1Byb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kIGluZm9ybXMgbGljZW5zZWVzCitob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bQorY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPC9kaXY+CisKKzxwPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlIGNvZGUgZm9ybTo8L3A+CisKKzxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiAyZW0iPmEpIGl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIKK3RoaXMgQWdyZWVtZW50OyBhbmQ8L2Rpdj4KKworPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDJlbSI+YikgYSBjb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUKK2luY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLjwvZGl2PgorCis8cD5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55IGNvcHlyaWdodCBub3RpY2VzCitjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLjwvcD4KKworPHA+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUgb3JpZ2luYXRvciBvZiBpdHMKK0NvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzIHN1YnNlcXVlbnQKK1JlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi48L3A+CisKKzxwIHN0eWxlPSJmb250LXdlaWdodDogYm9sZCI+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3A+CisKKzxwPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heSBhY2NlcHQgY2VydGFpbgorcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycyBhbmQKK3RoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUKK2NvbW1lcmNpYWwgdXNlIG9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZQorUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIKK3doaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwgbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuCitUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCitwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgiQ29tbWVyY2lhbCBDb250cmlidXRvciIpCitoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyIENvbnRyaWJ1dG9yCisoIkluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIikgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZCBjb3N0cworKGNvbGxlY3RpdmVseSAiTG9zc2VzIikgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCitsZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZAorQ29udHJpYnV0b3IgdG8gdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2gKK0NvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlCitQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcworc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMgcmVsYXRpbmcgdG8gYW55IGFjdHVhbAorb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlciB0byBxdWFsaWZ5LAorYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCitDb250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbAorQ29udHJpYnV0b3IgdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsCitDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kIGFueSByZWxhdGVkIHNldHRsZW1lbnQKK25lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZSBpbiBhbnkKK3N1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvcD4KKworPHA+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUgUHJvZ3JhbSBpbiBhCitjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKK0NvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzCitwZXJmb3JtYW5jZSBjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLAordGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwKK0NvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMgc2VjdGlvbiwgdGhlCitDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQorb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAord2FycmFudGllcywgYW5kIGlmIGEgY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheQorYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlCitkYW1hZ2VzLjwvcD4KKworPHAgc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkIj41LiBOTyBXQVJSQU5UWTwvcD4KKworPHA+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTCitQUk9WSURFRCBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRgorQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sCitBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAorTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudAoraXMgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nCithbmQgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGgKK2l0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBidXQgbm90CitsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsIGNvbXBsaWFuY2Ugd2l0aAorYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvciBlcXVpcG1lbnQsCithbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuPC9wPgorCis8cCBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQiPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9wPgorCis8cD5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgTkVJVEhFUgorUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IgQU5ZCitESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKK0RBTUFHRVMgKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQKK0FORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCitMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFCitFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCitQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9wPgorCis8cCBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQiPjcuIEdFTkVSQUw8L3A+CisKKzxwPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlCit1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKK2VuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQKK3dpdGhvdXQgZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbAorYmUgcmVmb3JtZWQgdG8gdGhlIG1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uCit2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9wPgorCis8cD5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGEgQ29udHJpYnV0b3IKK3dpdGggcmVzcGVjdCB0byBhIHBhdGVudCBhcHBsaWNhYmxlIHRvIHNvZnR3YXJlIChpbmNsdWRpbmcgYQorY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCksIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcworZ3JhbnRlZCBieSB0aGF0IENvbnRyaWJ1dG9yIHRvIHN1Y2ggUmVjaXBpZW50IHVuZGVyIHRoaXMgQWdyZWVtZW50CitzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiBJbgorYWRkaXRpb24sIGlmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55CitlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCithbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUKK1Byb2dyYW0gd2l0aCBvdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MKK3BhdGVudChzKSwgdGhlbiBzdWNoIFJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKQorc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC48L3A+CisKKzxwPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGlmCitpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yIGNvbmRpdGlvbnMgb2YKK3RoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKK3BlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsCitSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzCit0byBjZWFzZSB1c2UgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkKK3ByYWN0aWNhYmxlLiBIb3dldmVyLCBSZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudAorYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5IFJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbAorY29udGludWUgYW5kIHN1cnZpdmUuPC9wPgorCis8cD5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhpcworQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCitjb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZQorQWdyZWVtZW50IFN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zCisoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YgdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZQorb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzIHRoZSByaWdodCB0byBtb2RpZnkgdGhpcworQWdyZWVtZW50LiBJQk0gaXMgdGhlIGluaXRpYWwgQWdyZWVtZW50IFN0ZXdhcmQuIElCTSBtYXkgYXNzaWduIHRoZQorcmVzcG9uc2liaWxpdHkgdG8gc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUKK3NlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYQorZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtIChpbmNsdWRpbmcKK0NvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgordGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldwordmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvCitkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcKK3ZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkIGluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikKK2Fib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvIHRoZSBpbnRlbGxlY3R1YWwKK3Byb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgorZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZQorUHJvZ3JhbSBub3QgZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlCityZXNlcnZlZC48L3A+CisKKzxwPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZSBTdGF0ZSBvZiBOZXcgWW9yaworYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhLgorTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCitBZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2gKK3BhcnR5IHdhaXZlcyBpdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nCitsaXRpZ2F0aW9uLjwvcD4KKzwvYm9keT4KKzwvaHRtbD4KKwpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5zb3VyY2VfMi4wLjAvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuc291cmNlXzIuMC4wL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhlM2UwMgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuc291cmNlXzIuMC4wL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5zb3VyY2VfMi4wLjAvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5zb3VyY2VfMi4wLjAvZmVhdHVyZS5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzZjA3ZWQKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLnNvdXJjZV8yLjAuMC9mZWF0dXJlLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxNTEgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisjIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorIworIyBDb250cmlidXRvcnM6CisjICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgLyoqCisjICAqIDxjb3B5cmlnaHQ+CisjICAqCisjICAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyMgICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKKyMgICogCisjICAqIENvbnRyaWJ1dG9yczogCisjICAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjICAqCisjICAqIDwvY29weXJpZ2h0PgorIyAgKgorIyAgKiAkSWQ6IGZlYXR1cmUucHJvcGVydGllcyx2IDEuMSAyMDA0LzEwLzE4IDE1OjUwOjQyIGRiaXJzYW4gRXhwICQKKyMgICovCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoKKyMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCisjIEluc3RlYWQsIGVpdGhlciByZWRlZmluZSBhbiBleGlzdGluZyBwcm9wZXJ0eSwgb3IgY3JlYXRlIGEgbmV3IHByb3BlcnR5LAorIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworIyBUaGlzIGZpbGUgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCisjICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQorIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQorIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCisKKyMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKK2ZlYXR1cmVOYW1lPUVjbGlwc2UgTW9kZWxpbmcgRnJhbWV3b3JrIChFTUYpIFNvdXJjZQorCisjICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCitwcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKKworIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQordXBkYXRlU2l0ZU5hbWU9RWNsaXBzZS5vcmcgdXBkYXRlIHNpdGUKKworIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKK2Rlc2NyaXB0aW9uPUVjbGlwc2UgTW9kZWxpbmcgRnJhbWV3b3JrLiAoc291cmNlIGNvZGUpCisKKyMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgorIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCitsaWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAorCisjICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgorIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCitsaWNlbnNlPVwKK0VDTElQU0UuT1JHIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCisxNHRoIEF1Z3VzdCwgMjAwM1xuXAorXG5cCitVc2FnZSBPZiBDb250ZW50XG5cCitcblwKK0VDTElQU0UuT1JHIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCitPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKK1VTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAorQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCitOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCitBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCitBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAorT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKK1RFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKK09GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCitCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCitcblwKK0FwcGxpY2FibGUgTGljZW5zZXNcblwKK1xuXAorVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IEVjbGlwc2Uub3JnXG5cCitpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBDb21tb24gUHVibGljXG5cCitMaWNlbnNlIFZlcnNpb24gMS4wICgiQ1BMIikuIEEgY29weSBvZiB0aGUgQ1BMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAorQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwuXG5cCitGb3IgcHVycG9zZXMgb2YgdGhlIENQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKK1xuXAorQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCitkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKK3JlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCithcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKK1xuXAorQ29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzXG5cCisoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLiBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yXG5cCittb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkXG5cCisiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGVcblwKK1BsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gUGx1Zy1pbnMgYW5kIEZyYWdtZW50c1xuXAorYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpblxuXAorZGlyZWN0b3JpZXMgbmFtZWQgImZlYXR1cmVzIi5cblwKK1xuXAorRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCisiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAorSW5jbHVkZWQgRmVhdHVyZXMuXG5cCitcblwKK1RoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKK2NvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAorY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKK2luIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKK0xpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKK2luY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAorXG5cCisgICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAorICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAorICAgLSBTdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKKyAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAorXG5cCitOb3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgRWNsaXBzZS5vcmcgaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAorRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKK0xpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAorSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKK3dpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCit5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCit0aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKK0ZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAorY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCit1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKK1xuXAorVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCitUTyBUSEUgQ1BMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKK1NPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKK1xuXAorICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCisgICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCisgICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKKyAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCitcblwKK0lUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKK1RPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCitpcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgRWNsaXBzZS5vcmcgdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKK2dvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKK1xuXAorQ3J5cHRvZ3JhcGh5XG5cCitcblwKK0NvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAorY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAorYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAordXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCityZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCithbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cbgorIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQorIyBUaGUgYWJvdmUgcHJvcGVydGllcyBoYXZlIGJlZW4gc2hpcHBlZCBmb3IgdHJhbnNsYXRpb24uCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5zb3VyY2VfMi4wLjAvZmVhdHVyZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLnNvdXJjZV8yLjAuMC9mZWF0dXJlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjAwMjE0Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5zb3VyY2VfMi4wLjAvZmVhdHVyZS54bWwKQEAgLTAsMCArMSwyMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxmZWF0dXJlIHByaW1hcnk9ImZhbHNlIiAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIgIGltYWdlPSJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIiBpZD0ib3JnLmVjbGlwc2UuZW1mLnNvdXJjZSIgIHZlcnNpb249IjIuMC4wIj4KKwk8ZGVzY3JpcHRpb24gPgorCQklZGVzY3JpcHRpb24KKwk8L2Rlc2NyaXB0aW9uPgorCTxjb3B5cmlnaHQgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+CisJCUNvcHlyaWdodCAoYykgMjAwMi0yMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCithcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAord2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKK2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCisJPC9jb3B5cmlnaHQ+CisJPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+CisJCSVsaWNlbnNlCisJPC9saWNlbnNlPgorCTx1cmw+CisJCTx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vdXBkYXRlLmVjbGlwc2Uub3JnL3VwZGF0ZXMvIi8+CisJCTxkaXNjb3ZlcnkgbGFiZWw9IiVzZWNvbmRhcnlVcGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvdG9vbHMvZW1mL3VwZGF0ZXMvIi8+CisJPC91cmw+CisJPHBsdWdpbiAgICBmcmFnbWVudD0iZmFsc2UiICBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIGlkPSJvcmcuZWNsaXBzZS5lbWYuc291cmNlIiB2ZXJzaW9uPSIyLjAuMCIvPgorPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5zb3VyY2VfMi4wLjAvbGljZW5zZS5odG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5zb3VyY2VfMi4wLjAvbGljZW5zZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3YTVlMTgKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLnNvdXJjZV8yLjAuMC9saWNlbnNlLmh0bWwKQEAgLTAsMCArMSwxMjYgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCisgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgorPGhlYWQ+Cis8bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9IkhUTUwgVGlkeSwgc2VlIHd3dy53My5vcmciIC8+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiCitjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSIgLz4KKzx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keSBsYW5nPSJFTi1VUyIgbGluaz0iYmx1ZSIgdmxpbms9InB1cnBsZSI+Cis8aDI+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgorCis8cD4xNHRoIEF1Z3VzdCwgMjAwMzwvcD4KKworPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgorCis8cD5FQ0xJUFNFLk9SRyBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OCitBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZCisiQ09OVEVOVCIpLiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORAorQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GCitMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkKK1VTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUworR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkKK0FQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQKK0JFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTCitBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFCitBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWQorTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+CisKKzxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4KKworPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5CitFY2xpcHNlLm9yZyBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCit0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiQ1BMIikuIEEgY29weSBvZiB0aGUgQ1BMIGlzCitwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEKK2hyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4uCitGb3IgcHVycG9zZXMgb2YgdGhlIENQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CisKKzxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdAorY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcKK0NWUyByZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlCithdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuPC9wPgorCis8cD5Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbgorZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhCitidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZAorbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcworYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkCit3aXRoIGEgRmVhdHVyZS4gUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcworbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZAorImZlYXR1cmVzIi48L3A+CisKKzxwPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLgorRmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZAordmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvcD4KKworPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZAorYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kCitjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlCitjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuCitBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhCitEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZworbG9jYXRpb25zOjwvcD4KKworPHVsPgorPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+CisKKzxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+CisKKzxsaT5TdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4KK1BsdWctaW5zPC9saT4KKworPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgorPC91bD4KKworPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IEVjbGlwc2Uub3JnIGlzIGluc3RhbGxlZAordXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZQorKCJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlCitGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZQorc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcKK3RoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uCitGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZgorZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzIGFuZAorRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yCityZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mCit0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LjwvcD4KKworPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZCitSRUZFUiBUTyBUSEUgQ1BMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQKK0NPTkRJVElPTlMuIFNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQKK0FSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgorCis8dWw+Cis8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEKK2hyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KKworPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YQoraHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPgoraHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CisKKzxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YQoraHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPgoraHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+CisKKzxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEKK2hyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgorPC91bD4KKworPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQKK0NPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZQorTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdAorRWNsaXBzZS5vcmcgdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQKK3BhcnRpY3VsYXIgQ29udGVudC48L3A+CisKKzxoMz5DcnlwdG9ncmFwaHk8L2gzPgorCis8cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoCit5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwKK2FuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uCitzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlCitjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKK3Bvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYKK3RoaXMgaXMgcGVybWl0dGVkLjwvcD4KKzwvYm9keT4KKzwvaHRtbD4KKwpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZl8yLjAuMC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWZfMi4wLjAvTUVUQS1JTkYvTUFOSUZFU1QuTUYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk0OTliYwotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWZfMi4wLjAvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTAsMCArMSwyIEBACitNYW5pZmVzdC1WZXJzaW9uOiAxLjAKKwpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZl8yLjAuMC9jcGwtdjEwLmh0bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mXzIuMC4wL2NwbC12MTAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTQxNmMxCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZl8yLjAuMC9jcGwtdjEwLmh0bWwKQEAgLTAsMCArMSwyNjYgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCisgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgorPGhlYWQ+Cis8bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9IkhUTUwgVGlkeSwgc2VlIHd3dy53My5vcmciIC8+Cis8dGl0bGU+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L3RpdGxlPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIgorY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiIC8+Cis8L2hlYWQ+Cis8Ym9keSBiZ2NvbG9yPSIjRkZGRkZGIiB2bGluaz0iIzgwMDAwMCI+Cis8cCBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7IHRleHQtYWxpZ246IGNlbnRlciI+Q29tbW9uIFB1YmxpYworTGljZW5zZSAtIHYgMS4wPC9wPgorCis8cD5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIgVEhFIFRFUk1TIE9GIFRISVMKK0NPTU1PTiBQVUJMSUMgTElDRU5TRSAoIkFHUkVFTUVOVCIpLiBBTlkgVVNFLCBSRVBST0RVQ1RJT04gT1IKK0RJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFIE9GCitUSElTIEFHUkVFTUVOVC48L3A+CisKKzxwIHN0eWxlPSJmb250LXdlaWdodDogYm9sZCI+MS4gREVGSU5JVElPTlM8L3A+CisKKzxwPiJDb250cmlidXRpb24iIG1lYW5zOjwvcD4KKworPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDJlbSI+YSkgaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwKK0NvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uIGRpc3RyaWJ1dGVkIHVuZGVyCit0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPSJMRUZUIiAvPgorYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvZGl2PgorCis8ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogMmVtIj5pKSBjaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L2Rpdj4KKworPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDJlbSI+aWkpIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L2Rpdj4KKworPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDJlbSI+d2hlcmUgc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMKK3RvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQgYnkgdGhhdAorcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYQorQ29udHJpYnV0b3IgaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IKK2l0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uIHN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMKK2RvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZQorbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBQcm9ncmFtCit1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQord29ya3Mgb2YgdGhlIFByb2dyYW0uPC9kaXY+CisKKzxwPiJDb250cmlidXRvciIgbWVhbnMgYW55IHBlcnNvbiBvciBlbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUKK1Byb2dyYW0uPC9wPgorCis8cD4iTGljZW5zZWQgUGF0ZW50cyAiIG1lYW4gcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IGEKK0NvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZSBvciBzYWxlIG9mCitpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS48L3A+CisKKzxwPiJQcm9ncmFtIiBtZWFucyB0aGUgQ29udHJpYnV0aW9ucyBkaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGgKK3RoaXMgQWdyZWVtZW50LjwvcD4KKworPHA+IlJlY2lwaWVudCIgbWVhbnMgYW55b25lIHdobyByZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzCitBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvcD4KKworPHAgc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkIj4yLiBHUkFOVCBPRiBSSUdIVFM8L3A+CisKKzxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiAyZW0iPmEpIFN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMKK0FncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudCBhCitub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bworcmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5CitwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAorQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kCitvYmplY3QgY29kZSBmb3JtLjwvZGl2PgorCis8ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogMmVtIj5iKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzCitBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQgYQorbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgcGF0ZW50IGxpY2Vuc2UgdW5kZXIKK0xpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQgYW5kCitvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluCitzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseQordG8gdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUKK3RpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZCBieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YKK3RoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24gdG8gYmUgY292ZXJlZCBieSB0aGUKK0xpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8gYW55IG90aGVyCitjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKK2xpY2Vuc2VkIGhlcmV1bmRlci48L2Rpdj4KKworPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDJlbSI+YykgUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQKK2FsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMgQ29udHJpYnV0aW9ucworc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCit0aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsCitwcm9wZXJ0eSByaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55CitsaWFiaWxpdHkgdG8gUmVjaXBpZW50IGZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkCitvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEKK2NvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kIGxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLAorZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eSB0byBzZWN1cmUgYW55CitvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwgaWYKK2EgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvCitkaXN0cmlidXRlIHRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlCit0aGF0IGxpY2Vuc2UgYmVmb3JlIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L2Rpdj4KKworPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDJlbSI+ZCkgRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQKK3RvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0IHJpZ2h0cyBpbiBpdHMKK0NvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCit0aGlzIEFncmVlbWVudC48L2Rpdj4KKworPHAgc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkIj4zLiBSRVFVSVJFTUVOVFM8L3A+CisKKzxwPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGluIG9iamVjdAorY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9wPgorCis8ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogMmVtIj5hKSBpdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQKK2NvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvZGl2PgorCis8ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogMmVtIj5iKSBpdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9kaXY+CisKKzxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiAyZW0iPmkpIGVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YKK2FsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kIGNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kCitpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlIGFuZAorbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mCittZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOzwvZGl2PgorCis8ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogMmVtIj5paSkgZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mCithbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBkaXJlY3QsCitpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoIGFzCitsb3N0IHByb2ZpdHM7PC9kaXY+CisKKzxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiAyZW0iPmlpaSkgc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2gKK2RpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQgQ29udHJpYnV0b3IgYWxvbmUKK2FuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L2Rpdj4KKworPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDJlbSI+aXYpIHN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUKK1Byb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kIGluZm9ybXMgbGljZW5zZWVzCitob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bQorY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPC9kaXY+CisKKzxwPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlIGNvZGUgZm9ybTo8L3A+CisKKzxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiAyZW0iPmEpIGl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIKK3RoaXMgQWdyZWVtZW50OyBhbmQ8L2Rpdj4KKworPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDJlbSI+YikgYSBjb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUKK2luY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLjwvZGl2PgorCis8cD5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55IGNvcHlyaWdodCBub3RpY2VzCitjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLjwvcD4KKworPHA+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUgb3JpZ2luYXRvciBvZiBpdHMKK0NvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzIHN1YnNlcXVlbnQKK1JlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi48L3A+CisKKzxwIHN0eWxlPSJmb250LXdlaWdodDogYm9sZCI+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3A+CisKKzxwPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heSBhY2NlcHQgY2VydGFpbgorcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycyBhbmQKK3RoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUKK2NvbW1lcmNpYWwgdXNlIG9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZQorUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIKK3doaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwgbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuCitUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCitwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgiQ29tbWVyY2lhbCBDb250cmlidXRvciIpCitoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyIENvbnRyaWJ1dG9yCisoIkluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIikgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZCBjb3N0cworKGNvbGxlY3RpdmVseSAiTG9zc2VzIikgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCitsZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZAorQ29udHJpYnV0b3IgdG8gdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2gKK0NvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlCitQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcworc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMgcmVsYXRpbmcgdG8gYW55IGFjdHVhbAorb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlciB0byBxdWFsaWZ5LAorYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCitDb250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbAorQ29udHJpYnV0b3IgdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsCitDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kIGFueSByZWxhdGVkIHNldHRsZW1lbnQKK25lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZSBpbiBhbnkKK3N1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvcD4KKworPHA+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUgUHJvZ3JhbSBpbiBhCitjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKK0NvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzCitwZXJmb3JtYW5jZSBjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLAordGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwKK0NvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMgc2VjdGlvbiwgdGhlCitDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQorb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAord2FycmFudGllcywgYW5kIGlmIGEgY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheQorYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlCitkYW1hZ2VzLjwvcD4KKworPHAgc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkIj41LiBOTyBXQVJSQU5UWTwvcD4KKworPHA+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTCitQUk9WSURFRCBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRgorQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sCitBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAorTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudAoraXMgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nCithbmQgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGgKK2l0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBidXQgbm90CitsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsIGNvbXBsaWFuY2Ugd2l0aAorYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvciBlcXVpcG1lbnQsCithbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuPC9wPgorCis8cCBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQiPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9wPgorCis8cD5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgTkVJVEhFUgorUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IgQU5ZCitESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKK0RBTUFHRVMgKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQKK0FORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCitMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFCitFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCitQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9wPgorCis8cCBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQiPjcuIEdFTkVSQUw8L3A+CisKKzxwPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlCit1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKK2VuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQKK3dpdGhvdXQgZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbAorYmUgcmVmb3JtZWQgdG8gdGhlIG1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uCit2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9wPgorCis8cD5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGEgQ29udHJpYnV0b3IKK3dpdGggcmVzcGVjdCB0byBhIHBhdGVudCBhcHBsaWNhYmxlIHRvIHNvZnR3YXJlIChpbmNsdWRpbmcgYQorY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCksIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcworZ3JhbnRlZCBieSB0aGF0IENvbnRyaWJ1dG9yIHRvIHN1Y2ggUmVjaXBpZW50IHVuZGVyIHRoaXMgQWdyZWVtZW50CitzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiBJbgorYWRkaXRpb24sIGlmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55CitlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCithbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUKK1Byb2dyYW0gd2l0aCBvdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MKK3BhdGVudChzKSwgdGhlbiBzdWNoIFJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKQorc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC48L3A+CisKKzxwPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGlmCitpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yIGNvbmRpdGlvbnMgb2YKK3RoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKK3BlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsCitSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzCit0byBjZWFzZSB1c2UgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkKK3ByYWN0aWNhYmxlLiBIb3dldmVyLCBSZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudAorYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5IFJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbAorY29udGludWUgYW5kIHN1cnZpdmUuPC9wPgorCis8cD5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhpcworQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCitjb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZQorQWdyZWVtZW50IFN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zCisoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YgdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZQorb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzIHRoZSByaWdodCB0byBtb2RpZnkgdGhpcworQWdyZWVtZW50LiBJQk0gaXMgdGhlIGluaXRpYWwgQWdyZWVtZW50IFN0ZXdhcmQuIElCTSBtYXkgYXNzaWduIHRoZQorcmVzcG9uc2liaWxpdHkgdG8gc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUKK3NlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYQorZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtIChpbmNsdWRpbmcKK0NvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgordGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldwordmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvCitkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcKK3ZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkIGluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikKK2Fib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvIHRoZSBpbnRlbGxlY3R1YWwKK3Byb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgorZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZQorUHJvZ3JhbSBub3QgZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlCityZXNlcnZlZC48L3A+CisKKzxwPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZSBTdGF0ZSBvZiBOZXcgWW9yaworYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhLgorTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCitBZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2gKK3BhcnR5IHdhaXZlcyBpdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nCitsaXRpZ2F0aW9uLjwvcD4KKzwvYm9keT4KKzwvaHRtbD4KKwpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZl8yLjAuMC9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZl8yLjAuMC9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ZTNlMDIKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mXzIuMC4wL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZl8yLjAuMC9mZWF0dXJlLnByb3BlcnRpZXMgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mXzIuMC4wL2ZlYXR1cmUucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Yzk0N2E0Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZl8yLjAuMC9mZWF0dXJlLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxNTQgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisjIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorIworIyBDb250cmlidXRvcnM6CisjICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgLyoqCisjICAqIDxjb3B5cmlnaHQ+CisjICAqCisjICAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyMgICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKKyMgICogCisjICAqIENvbnRyaWJ1dG9yczogCisjICAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjICAqCisjICAqIDwvY29weXJpZ2h0PgorIyAgKgorIyAgKiAkSWQ6IGZlYXR1cmUucHJvcGVydGllcyx2IDEuMSAyMDA0LzEwLzE4IDE1OjUwOjQyIGRiaXJzYW4gRXhwICQKKyMgICovCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoKKyMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCisjIEluc3RlYWQsIGVpdGhlciByZWRlZmluZSBhbiBleGlzdGluZyBwcm9wZXJ0eSwgb3IgY3JlYXRlIGEgbmV3IHByb3BlcnR5LAorIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworIyBUaGlzIGZpbGUgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCisjICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQorIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQorIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCisKKyMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKK2ZlYXR1cmVOYW1lPUVjbGlwc2UgTW9kZWxpbmcgRnJhbWV3b3JrIChFTUYpCisKKyMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKK3Byb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZworCisjICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCit1cGRhdGVTaXRlTmFtZT1FY2xpcHNlLm9yZyB1cGRhdGUgc2l0ZQorCisjICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQorZGVzY3JpcHRpb249RWNsaXBzZSBNb2RlbGluZyBGcmFtZXdvcmsuIChCaW5hcnkgcnVudGltZSkKKworIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCisjIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKK2xpY2Vuc2VVUkw9bGljZW5zZS5odG1sCisKKyMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCisjIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKK2xpY2Vuc2U9XAorRUNMSVBTRS5PUkcgU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKKzE0dGggQXVndXN0LCAyMDAzXG5cCitcblwKK1VzYWdlIE9mIENvbnRlbnRcblwKK1xuXAorRUNMSVBTRS5PUkcgTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKK09USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAorVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCitBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKK05PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKK0FHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKK0FORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCitPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAorVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAorT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKK0JFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKK1xuXAorQXBwbGljYWJsZSBMaWNlbnNlc1xuXAorXG5cCitVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgRWNsaXBzZS5vcmdcblwKK2lzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENvbW1vbiBQdWJsaWNcblwKK0xpY2Vuc2UgVmVyc2lvbiAxLjAgKCJDUEwiKS4gQSBjb3B5IG9mIHRoZSBDUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCitDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbC5cblwKK0ZvciBwdXJwb3NlcyBvZiB0aGUgQ1BMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAorXG5cCitDb250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKK2RvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAorcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKK2FzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAorXG5cCitDb250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHNcblwKKygiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3JcblwKK21vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWRcblwKKyJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZVxuXAorUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzXG5cCithcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAicGx1Z2lucyIgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluXG5cCitkaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLlxuXAorXG5cCitGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKKyJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCitJbmNsdWRlZCBGZWF0dXJlcy5cblwKK1xuXAorVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAorY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCitjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAoraW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAorTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAoraW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCitcblwKKyAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCisgICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCisgICAtIFN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAorICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCitcblwKK05vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSBFY2xpcHNlLm9yZyBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCitFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAorTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCitJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAord2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKK3lvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKK3RoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAorRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCitjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKK3VzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAorXG5cCitUSEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKK1RPIFRIRSBDUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAorU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAorXG5cCisgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKKyAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKKyAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAorICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKK1xuXAorSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAorVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKK2lzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCBFY2xpcHNlLm9yZyB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAorZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAorXG5cCitDcnlwdG9ncmFwaHlcblwKK1xuXAorQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCitjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCithbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCit1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKK3JlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKK2FuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuCisjIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCisjIFRoZSBhYm92ZSBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBzaGlwcGVkIGZvciB0cmFuc2xhdGlvbi4KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyMgInNlY29uZGFyeVVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgc2Vjb25kYXJ5IHVwZGF0ZSBzaXRlIChvbiBkb3dubG9hZC5lY2xpcHNlLm9yZykKK3NlY29uZGFyeVVwZGF0ZVNpdGVOYW1lPUVNRi9TRE8vWFNEIFNlY29uZGFyeSBVcGRhdGUgU2l0ZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZl8yLjAuMC9mZWF0dXJlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWZfMi4wLjAvZmVhdHVyZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ1OWYzNwotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWZfMi4wLjAvZmVhdHVyZS54bWwKQEAgLTAsMCArMSwxNDggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8ZmVhdHVyZQorICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZiIKKyAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCisgICAgICB2ZXJzaW9uPSIyLjAuMCIKKyAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCisgICAgICBpbWFnZT0iZWNsaXBzZV91cGRhdGVfMTIwLmpwZyI+CisKKyAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICVkZXNjcmlwdGlvbgorICAgPC9kZXNjcmlwdGlvbj4KKworICAgPGNvcHlyaWdodCB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj4KKyAgICAgIENvcHlyaWdodCAoYykgMjAwMi0yMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCithcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAord2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKK2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCisgICA8L2NvcHlyaWdodD4KKworICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+CisgICAgICAlbGljZW5zZQorICAgPC9saWNlbnNlPgorCisgICA8dXJsPgorICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly91cGRhdGUuZWNsaXBzZS5vcmcvdXBkYXRlcy8iLz4KKyAgICAgIDxkaXNjb3ZlcnkgbGFiZWw9IiVzZWNvbmRhcnlVcGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvdG9vbHMvZW1mL3VwZGF0ZXMvIi8+CisgICA8L3VybD4KKworICAgPHJlcXVpcmVzPgorICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzIiB2ZXJzaW9uPSIzLjAuMCIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KKyAgIDwvcmVxdWlyZXM+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMi4wLjAiLz4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5jb2RlZ2VuIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjIuMC4wIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuY29kZWdlbi51aSIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIyLjAuMCIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLmNvZGVnZW4uZWNvcmUiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMi4wLjAiLz4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5jb2RlZ2VuLmVjb3JlLnVpIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjIuMC4wIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuY29tbW9uIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjIuMC4wIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjIuMC4wIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMi4wLjAiLz4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5lZGl0IgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjIuMC4wIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZWRpdG9yIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjIuMC4wIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuY2hhbmdlIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjIuMC4wIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuY2hhbmdlLmVkaXQiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMi4wLjAiLz4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMi4wLjAiLz4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5lZGl0IgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjIuMC4wIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuZWRpdC51aSIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIyLjAuMCIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLm1hcHBpbmciCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMi4wLjAiLz4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5tYXBwaW5nLnVpIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjIuMC4wIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYubWFwcGluZy5lY29yZTJlY29yZSIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIyLjAuMCIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLm1hcHBpbmcuZWNvcmUyZWNvcmUuZWRpdG9yIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjIuMC4wIi8+CisKKzwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWZfMi4wLjAvbGljZW5zZS5odG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZl8yLjAuMC9saWNlbnNlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdhNWUxOAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWZfMi4wLjAvbGljZW5zZS5odG1sCkBAIC0wLDAgKzEsMTI2IEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgorICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KKzxoZWFkPgorPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJIVE1MIFRpZHksIHNlZSB3d3cudzMub3JnIiAvPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIgorY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiIC8+Cis8dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgorPC9oZWFkPgorPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9ImJsdWUiIHZsaW5rPSJwdXJwbGUiPgorPGgyPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KKworPHA+MTR0aCBBdWd1c3QsIDIwMDM8L3A+CisKKzxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KKworPHA+RUNMSVBTRS5PUkcgTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTgorQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWQorIkNPTlRFTlQiKS4gVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQKK0NPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRgorTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZCitVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMKK0dPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZCitBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VECitCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUworQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRQorQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkKK05PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgorCis8aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+CisKKzxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieQorRWNsaXBzZS5vcmcgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgordGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkNQTCIpLiBBIGNvcHkgb2YgdGhlIENQTCBpcworcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhCitocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+LgorRm9yIHB1cnBvc2VzIG9mIHRoZSBDUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgorCis8cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QKK2NvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnCitDVlMgcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZQorYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvcD4KKworPHA+Q29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4KK2ZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLiBBIEZlYXR1cmUgaXMgYQorYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQKK21hdGVyaWFsLiBGaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMKK2FuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZAord2l0aCBhIEZlYXR1cmUuIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMKK25hbWVkICJwbHVnaW5zIiBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQKKyJmZWF0dXJlcyIuPC9wPgorCis8cD5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4KK0ZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQKK3ZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L3A+CisKKzxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQKK2JlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZAorY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZQorY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLgorQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYQorRG93bmxvYWQgb3IgTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcKK2xvY2F0aW9uczo8L3A+CisKKzx1bD4KKzxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgorCis8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgorCis8bGk+U3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluCitQbHVnLWluczwvbGk+CisKKzxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KKzwvdWw+CisKKzxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSBFY2xpcHNlLm9yZyBpcyBpbnN0YWxsZWQKK3VzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UKKygiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZQorRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UKK3Nob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nCit0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLgorRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YKK2ZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQKK0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvcgorcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZgordGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS48L3A+CisKKzxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWQorUkVGRVIgVE8gVEhFIENQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5ECitDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUCitBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KKworPHVsPgorPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhCitocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+CisKKzxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEKK2hyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj4KK2h0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgorCis8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEKK2hyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj4KK2h0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgorCis8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhCitocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KKzwvdWw+CisKKzxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5ECitDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUKK0xpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QKK0VjbGlwc2Uub3JnIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0CitwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgorCis8aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KKworPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaAoreW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sCithbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbgorc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZQorY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCitwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmCit0aGlzIGlzIHBlcm1pdHRlZC48L3A+Cis8L2JvZHk+Cis8L2h0bWw+CisKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZHQtZmVhdHVyZS8ucHJvamVjdCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZHQtZmVhdHVyZS8ucHJvamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzJiODIyCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpkdC1mZWF0dXJlLy5wcm9qZWN0CkBAIC0wLDAgKzEsMTcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdERlc2NyaXB0aW9uPgorCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC1mZWF0dXJlPC9uYW1lPgorCTxjb21tZW50PjwvY29tbWVudD4KKwk8cHJvamVjdHM+CisJPC9wcm9qZWN0cz4KKwk8YnVpbGRTcGVjPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwk8L2J1aWxkU3BlYz4KKwk8bmF0dXJlcz4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgorCTwvbmF0dXJlcz4KKzwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpkdC1mZWF0dXJlL2NwbC12MTAuaHRtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZHQtZmVhdHVyZS9jcGwtdjEwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZhYTIwOAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZHQtZmVhdHVyZS9jcGwtdjEwLmh0bWwKQEAgLTAsMCArMSwxMjUgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KKzxIVE1MPgorPEhFQUQ+Cis8VElUTEU+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L1RJVExFPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Cis8L0hFQUQ+CisKKzxCT0RZIEJHQ09MT1I9IiNGRkZGRkYiIFZMSU5LPSIjODAwMDAwIj4KKworCis8UCBBTElHTj0iQ0VOVEVSIj48Qj5Db21tb24gUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvQj4KKzxQPjxCPjwvQj48Rk9OVCBTSVpFPSIzIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIzIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSIFRIRSBURVJNUyBPRiBUSElTIENPTU1PTiBQVUJMSUMgTElDRU5TRSAoIkFHUkVFTUVOVCIpLiAgQU5ZIFVTRSwgUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFIE9GIFRISVMgQUdSRUVNRU5ULjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjxCPjEuICBERUZJTklUSU9OUzwvQj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj4iQ29udHJpYnV0aW9uIiBtZWFuczo8L0ZPTlQ+CisKKzxVTD48Rk9OVCBTSVpFPSIyIj5hKSBpbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbiBkaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPEJSIENMRUFSPSJMRUZUIj4KK2IpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiI+aSkJIAljaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiI+aWkpCQlhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9GT05UPjwvVUw+CisKKworPFVMPjxGT05UIFNJWkU9IjIiPndoZXJlIHN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQgYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPkEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IgaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24gc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5Db250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSB3aGljaDogIChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBQcm9ncmFtLiAgPC9GT05UPjwvVUw+CisKKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPiJDb250cmlidXRvciIgbWVhbnMgYW55IHBlcnNvbiBvciBlbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+IkxpY2Vuc2VkIFBhdGVudHMgIiBtZWFuIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZSBvciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiAgPC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj4iUHJvZ3JhbSIgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMgZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50LjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPiJSZWNpcGllbnQiIG1lYW5zIGFueW9uZSB3aG8gcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjxCPjwvQj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48Qj4yLiAgR1JBTlQgT0YgUklHSFRTPC9CPjwvRk9OVD4KKworPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5hKQk8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+U3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50czwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiNGRjAwMDAiPiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLjwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPmIpIAlTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDA4MDAwIj4gPC9GT05UPjxGT05UIFNJWkU9IjIiPnJveWFsdHktZnJlZSBwYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0IGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiAgVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQgYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24gdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8gYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uICBObyBoYXJkd2FyZSBwZXIgc2UgaXMgbGljZW5zZWQgaGVyZXVuZGVyLiAgIDwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiI+YykJUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cyBDb250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvciB0aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiAgRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQgZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiAgQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZCBsaWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eSB0byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuICBGb3IgZXhhbXBsZSwgaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjwvVUw+CisKKworPFVMPjxGT05UIFNJWkU9IjIiPmQpCUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0IHJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4gdGhpcyBBZ3JlZW1lbnQuIDwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KKworPFA+PEZPTlQgU0laRT0iMiI+PEI+My4gIFJFUVVJUkVNRU5UUzwvQj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48Qj48L0I+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0OjwvRk9OVD4KKworPFVMPjxGT05UIFNJWkU9IjIiPmEpCWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiI+YikJaXRzIGxpY2Vuc2UgYWdyZWVtZW50OjwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj5pKQllZmZlY3RpdmVseSBkaXNjbGFpbXM8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZCBjb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlIGFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9GT05UPjwvVUw+CisKKworPFVMPjxGT05UIFNJWkU9IjIiPmlpKSAJZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaCBhcyBsb3N0IHByb2ZpdHM7IDwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj5paWkpPC9GT05UPjxGT05UIFNJWkU9IjIiPglzdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0IENvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiI+aXYpCXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQgaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj4gPC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjRkYwMDAwIj48L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiNGRjAwMDAiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KKworPFA+PEZPTlQgU0laRT0iMiI+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UgY29kZSBmb3JtOjwvRk9OVD4KKworPFVMPjxGT05UIFNJWkU9IjIiPmEpCWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiI+YikJYSBjb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uICA8L0ZPTlQ+PC9VTD4KKworPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj48U1RSSUtFPjwvU1RSSUtFPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj48U1RSSUtFPjwvU1RSSUtFPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55IGNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uICA8L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZSBvcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cyBzdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gIDwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjxCPjQuICBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvQj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkgYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycyBhbmQgdGhlIGxpa2UuICBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2Ugb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwgbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuICAgVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgiQ29tbWVyY2lhbCBDb250cmlidXRvciIpIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIgQ29udHJpYnV0b3IgKCJJbmRlbW5pZmllZCBDb250cmlidXRvciIpIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQgY29zdHMgKGNvbGxlY3RpdmVseSAiTG9zc2VzIikgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyIGxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvIHRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcuICBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcyByZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gIEluIG9yZGVyIHRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB0byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZCBhbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUgaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhIENvbW1lcmNpYWwgQ29udHJpYnV0b3IuICBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZSBjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiAgVW5kZXIgdGhpcyBzZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUgb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYSBjb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48Qj41LiAgTk8gV0FSUkFOVFk8L0I+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzPC9GT05UPjxGT05UIFNJWkU9IjIiPiBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+dGhlIFByb2dyYW08L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudDwvRk9OVD48Rk9OVCBTSVpFPSIyIj4sIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywgY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgPC9GT05UPjxGT05UIFNJWkU9IjIiPnByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zPC9GT05UPjxGT05UIFNJWkU9IjIiPi4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PEI+Ni4gIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9CPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgPC9GT05UPjxGT05UIFNJWkU9IjIiPihJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksPC9GT05UPjxGT05UIFNJWkU9IjIiPiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjxCPjcuICBHRU5FUkFMPC9CPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0IGZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlIG1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGEgQ29udHJpYnV0b3Igd2l0aCByZXNwZWN0IHRvIGEgcGF0ZW50IGFwcGxpY2FibGUgdG8gc29mdHdhcmUgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpLCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMgZ3JhbnRlZCBieSB0aGF0IENvbnRyaWJ1dG9yIHRvIHN1Y2ggUmVjaXBpZW50IHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuICBJbiBhZGRpdGlvbiwgaWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoIG90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaCBSZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlIHBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gIElmIGFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gIEhvd2V2ZXIsIFJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieSBSZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcyBjb3B5cmlnaHRlZCAgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50IFN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5wdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YgdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj50aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzIHRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIElCTSBpcyB0aGUgaW5pdGlhbCBBZ3JlZW1lbnQgU3Rld2FyZC4gICBJQk0gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8gc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPkVhY2ggbmV3IHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBUaGUgUHJvZ3JhbSAoaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgPC9GT05UPjxGT05UIFNJWkU9IjIiPnZlcnNpb24uICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+RXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQgaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0byB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlciBleHByZXNzbHksIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5ieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlPC9GT05UPjxGT05UIFNJWkU9IjIiPi48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+ICBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdCBleHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlIFN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzIEFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gIEVhY2ggcGFydHkgd2FpdmVzIGl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorCis8L0JPRFk+CisKKzwvSFRNTD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamR0LWZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZHQtZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ZTNlMDIKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamR0LWZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamR0LWZlYXR1cmUvZmVhdHVyZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamR0LWZlYXR1cmUvZmVhdHVyZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IwYjUzMAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZHQtZmVhdHVyZS9mZWF0dXJlLnhtbApAQCAtMCwwICsxLDExMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxmZWF0dXJlCisgICAgICBpZD0ib3JnLmVjbGlwc2UuamR0IgorICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKKyAgICAgIHZlcnNpb249IjMuMS4wIgorICAgICAgaW1hZ2U9ICJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIgorICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+CisKKyAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICVkZXNjcmlwdGlvbgorICAgPC9kZXNjcmlwdGlvbj4KKworICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+CisgICAgICVsaWNlbnNlCisgICA8L2xpY2Vuc2U+CisKKyAgIDx1cmw+CisgICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL3VwZGF0ZS5lY2xpcHNlLm9yZy91cGRhdGVzLzMuMCIvPgorICAgICAgPGRpc2NvdmVyeSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly91cGRhdGUuZWNsaXBzZS5vcmcvdXBkYXRlcy8zLjAiLz4KKyAgIDwvdXJsPgorCisgIDxyZXF1aXJlcz4KKyAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5wbGF0Zm9ybSIgdmVyc2lvbj0iMy4xLjAiIG1hdGNoPSJjb21wYXRpYmxlIiAvPgorICA8L3JlcXVpcmVzPgorICAKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZHQiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMy4xLjAiPgorICAgPC9wbHVnaW4+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5hbnQudWkiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMy4xLjAiPgorICAgPC9wbHVnaW4+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZyIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIzLjEuMCI+CisgICA8L3BsdWdpbj4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmx0ay51aS5yZWZhY3RvcmluZyIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIzLjEuMCI+CisgICA8L3BsdWdpbj4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjMuMS4wIj4KKyAgIDwvcGx1Z2luPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamR0LmRlYnVnLnVpIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjMuMS4wIj4KKyAgIDwvcGx1Z2luPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamR0LmRlYnVnIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjMuMS4wIj4KKyAgIDwvcGx1Z2luPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamR0Lmp1bml0IgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjMuMS4wIj4KKyAgIDwvcGx1Z2luPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamR0Lmp1bml0LnJ1bnRpbWUiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMy4xLjAiPgorICAgPC9wbHVnaW4+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjMuMS4wIj4KKyAgIDwvcGx1Z2luPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamR0LnVpIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjMuMS4wIj4KKyAgIDwvcGx1Z2luPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmp1bml0IgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjMuOC4xIj4KKyAgIDwvcGx1Z2luPgorCisgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qZHQuZG9jLnVzZXIiIHZlcnNpb249IjMuMS4wIi8+CisKKyAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcubWFjb3N4IiB2ZXJzaW9uPSIzLjEuMCIgIG9zPSJtYWNvc3giIHdzPSJjYXJib24iLz4gIAorPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpkdC1mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZHQtZmVhdHVyZS9saWNlbnNlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdkODUwMAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZHQtZmVhdHVyZS9saWNlbnNlLmh0bWwKQEAgLTAsMCArMSw3MiBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgorPGh0bWw+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgorPGgyPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KKzxwPjE1PHN1cD50aDwvc3VwPiBKdW5lLCAyMDA0PC9wPgorCis8aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+CisKKzxwPkVDTElQU0UuT1JHIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKKyAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECisgICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCisgICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgorICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECisgICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+CisgICAKKzxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKKyAgIAorPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IEVjbGlwc2Uub3JnIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAorICAgKCZxdW90O0NQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIENQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPi4KKyAgIEZvciBwdXJwb3NlcyBvZiB0aGUgQ1BMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CisKKzxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCisgICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KKworPHA+Q29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBGaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCBhIEZlYXR1cmUuICAgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcworICAgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90OyBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuPC9wPgorICAKKzxwPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gRmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvcD4KKyAgCis8cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAorSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQoraW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgorCis8dWw+CisJPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+CisJPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KKwk8bGk+U3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+CisJPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgorPC91bD4KKwkJCis8cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgRWNsaXBzZS5vcmcgaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKK2luc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCitpbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsuCitTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgordGhhdCBkaXJlY3RvcnkuPC9wPgorCis8cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIENQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCitPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KKworPHVsPgorCTxsaT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPik8L2xpPgorCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+CisJPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQorCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+CisJPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KKzwvdWw+CisKKzxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKK2NvbnRhY3QgRWNsaXBzZS5vcmcgdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KKworPGgzPkNyeXB0b2dyYXBoeTwvaDM+CisKKzxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KKyAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAorICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamR0LnNvdXJjZS1mZWF0dXJlLy5wcm9qZWN0IGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpkdC5zb3VyY2UtZmVhdHVyZS8ucHJvamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWFmMTg0Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpkdC5zb3VyY2UtZmVhdHVyZS8ucHJvamVjdApAQCAtMCwwICsxLDE3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHByb2plY3REZXNjcmlwdGlvbj4KKwk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuc291cmNlLWZlYXR1cmU8L25hbWU+CisJPGNvbW1lbnQ+PC9jb21tZW50PgorCTxwcm9qZWN0cz4KKwk8L3Byb2plY3RzPgorCTxidWlsZFNwZWM+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCTwvYnVpbGRTcGVjPgorCTxuYXR1cmVzPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+CisJPC9uYXR1cmVzPgorPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamR0LnNvdXJjZS1mZWF0dXJlL2NwbC12MTAuaHRtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZHQuc291cmNlLWZlYXR1cmUvY3BsLXYxMC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1OGQ5OWMKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamR0LnNvdXJjZS1mZWF0dXJlL2NwbC12MTAuaHRtbApAQCAtMCwwICsxLDEyNSBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgorPEhUTUw+Cis8SEVBRD4KKzxUSVRMRT5Db21tb24gUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvVElUTEU+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzwvSEVBRD4KKworPEJPRFkgQkdDT0xPUj0iI0ZGRkZGRiIgVkxJTks9IiM4MDAwMDAiPgorCisKKzxQIEFMSUdOPSJDRU5URVIiPjxCPkNvbW1vbiBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9CPgorPFA+PEI+PC9CPjxGT05UIFNJWkU9IjMiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjMiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIgVEhFIFRFUk1TIE9GIFRISVMgQ09NTU9OIFBVQkxJQyBMSUNFTlNFICgiQUdSRUVNRU5UIikuICBBTlkgVVNFLCBSRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UgT0YgVEhJUyBBR1JFRU1FTlQuPC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PEI+MS4gIERFRklOSVRJT05TPC9CPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPiJDb250cmlidXRpb24iIG1lYW5zOjwvRk9OVD4KKworPFVMPjxGT05UIFNJWkU9IjIiPmEpIGluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uIGRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8QlIgQ0xFQVI9IkxFRlQiPgorYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj5pKQkgCWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj5paSkJCWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiI+d2hlcmUgc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZCBieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+QSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvciBpZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbiBzdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPkNvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIHdoaWNoOiAgKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFByb2dyYW0uICA8L0ZPTlQ+PC9VTD4KKworPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+IkNvbnRyaWJ1dG9yIiBtZWFucyBhbnkgcGVyc29uIG9yIGVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj4iTGljZW5zZWQgUGF0ZW50cyAiIG1lYW4gcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlIG9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uICA8L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPiJQcm9ncmFtIiBtZWFucyB0aGUgQ29udHJpYnV0aW9ucyBkaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+IlJlY2lwaWVudCIgbWVhbnMgYW55b25lIHdobyByZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PEI+PC9CPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjxCPjIuICBHUkFOVCBPRiBSSUdIVFM8L0I+PC9GT05UPgorCis8VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPmEpCTwvRk9OVD48Rk9OVCBTSVpFPSIyIj5TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzPC9GT05UPjxGT05UIFNJWkU9IjIiPiBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iI0ZGMDAwMCI+IDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uPC9GT05UPjwvVUw+CisKKworPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+YikgCVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgPC9GT05UPjxGT05UIFNJWkU9IjIiPlJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDgwMDAiPiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+cm95YWx0eS1mcmVlIHBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uICBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZCBieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbiB0byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiAgVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0byBhbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gIE5vIGhhcmR3YXJlIHBlciBzZSBpcyBsaWNlbnNlZCBoZXJldW5kZXIuICAgPC9GT05UPjwvVUw+CisKKworPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj5jKQlSZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzIENvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yIHRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuICBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudCBmb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuICBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kIGxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5IHRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gIEZvciBleGFtcGxlLCBpZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiI+ZCkJRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQgcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbiB0aGlzIEFncmVlbWVudC4gPC9GT05UPjwvVUw+CisKKworPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgorCis8UD48Rk9OVCBTSVpFPSIyIj48Qj4zLiAgUkVRVUlSRU1FTlRTPC9CPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjxCPjwvQj5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9GT05UPgorCis8VUw+PEZPTlQgU0laRT0iMiI+YSkJaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj5iKQlpdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9GT05UPjwvVUw+CisKKworPFVMPjxGT05UIFNJWkU9IjIiPmkpCWVmZmVjdGl2ZWx5IGRpc2NsYWltczwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kIGNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUgYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiI+aWkpIAllZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoIGFzIGxvc3QgcHJvZml0czsgPC9GT05UPjwvVUw+CisKKworPFVMPjxGT05UIFNJWkU9IjIiPmlpaSk8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+CXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQgQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj5pdikJc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZCBpbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiNGRjAwMDAiPjwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iI0ZGMDAwMCI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgorCis8UD48Rk9OVCBTSVpFPSIyIj5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZSBjb2RlIGZvcm06PC9GT05UPgorCis8VUw+PEZPTlQgU0laRT0iMiI+YSkJaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj5iKQlhIGNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gIDwvRk9OVD48L1VMPgorCis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPjxTVFJJS0U+PC9TVFJJS0U+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPjxTVFJJS0U+PC9TVFJJS0U+PC9GT05UPjxGT05UIFNJWkU9IjIiPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkgY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gIDwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlIG9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzIHN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiAgPC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PEI+NC4gIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9CPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heSBhY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzIGFuZCB0aGUgbGlrZS4gIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZSBvZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbCBsaWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gICBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCJDb21tZXJjaWFsIENvbnRyaWJ1dG9yIikgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlciBDb250cmlidXRvciAoIkluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIikgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZCBjb3N0cyAoY29sbGVjdGl2ZWx5ICJMb3NzZXMiKSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIgbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8gdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiBjb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZy4gIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzIHJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiAgSW4gb3JkZXIgdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kIGFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiAgVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZSBpbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiAgVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEgQ29tbWVyY2lhbCBDb250cmlidXRvci4gIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlIGNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuICBVbmRlciB0aGlzIHNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZSBvdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhIGNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjxCPjUuICBOTyBXQVJSQU5UWTwvQj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXM8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj50aGUgUHJvZ3JhbTwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50PC9GT05UPjxGT05UIFNJWkU9IjIiPiwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLCBjb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+cHJvZ3JhbXMgb3IgZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnM8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+LiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48Qj42LiAgRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L0I+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+KElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSw8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PEI+Ny4gIEdFTkVSQUw8L0I+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQgZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUgbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYSBDb250cmlidXRvciB3aXRoIHJlc3BlY3QgdG8gYSBwYXRlbnQgYXBwbGljYWJsZSB0byBzb2Z0d2FyZSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCksIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcyBncmFudGVkIGJ5IHRoYXQgQ29udHJpYnV0b3IgdG8gc3VjaCBSZWNpcGllbnQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gIEluIGFkZGl0aW9uLCBpZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGggb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoIFJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvciBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUgcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiAgSWYgYWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiAgSG93ZXZlciwgUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5IFJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzIGNvcHlyaWdodGVkICBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQgU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gPC9GT05UPjxGT05UIFNJWkU9IjIiPnB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZiB0aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gPC9GT05UPjxGT05UIFNJWkU9IjIiPnRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMgdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gSUJNIGlzIHRoZSBpbml0aWFsIEFncmVlbWVudCBTdGV3YXJkLiAgIElCTSBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0byBzZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+RWFjaCBuZXcgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIFRoZSBQcm9ncmFtIChpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+dmVyc2lvbi4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5FeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZCBpbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyIGV4cHJlc3NseSwgPC9GT05UPjxGT05UIFNJWkU9IjIiPmJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2U8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+LjwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90IGV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUgU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMgQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiAgRWFjaCBwYXJ0eSB3YWl2ZXMgaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+CisKKzwvQk9EWT4KKworPC9IVE1MPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpkdC5zb3VyY2UtZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpkdC5zb3VyY2UtZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ZTNlMDIKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamR0LnNvdXJjZS1mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpkdC5zb3VyY2UtZmVhdHVyZS9mZWF0dXJlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZHQuc291cmNlLWZlYXR1cmUvZmVhdHVyZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM2YWM4NgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZHQuc291cmNlLWZlYXR1cmUvZmVhdHVyZS54bWwKQEAgLTAsMCArMSwxNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxmZWF0dXJlIHByaW1hcnk9ImZhbHNlIiAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIgIGltYWdlPSJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIiBpZD0ib3JnLmVjbGlwc2UuamR0LnNvdXJjZSIgIHZlcnNpb249IjMuMS4wIj4KKwk8ZGVzY3JpcHRpb24gPgorCQklZGVzY3JpcHRpb24KKwk8L2Rlc2NyaXB0aW9uPgorCTxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgorCQklbGljZW5zZQorCTwvbGljZW5zZT4KKwk8dXJsPgorCQk8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL3VwZGF0ZS5lY2xpcHNlLm9yZy91cGRhdGVzLzMuMCIvPgorCQk8ZGlzY292ZXJ5IGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL3VwZGF0ZS5lY2xpcHNlLm9yZy91cGRhdGVzLzMuMCIvPgorCTwvdXJsPgorCTxwbHVnaW4gICAgZnJhZ21lbnQ9ImZhbHNlIiAgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiBpZD0ib3JnLmVjbGlwc2UuamR0LmRvYy5pc3YiIHZlcnNpb249IjMuMS4wIi8+CisJPHBsdWdpbiAgICBmcmFnbWVudD0iZmFsc2UiICBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIGlkPSJvcmcuZWNsaXBzZS5qZHQuc291cmNlIiB2ZXJzaW9uPSIzLjEuMCIvPgorCTxwbHVnaW4gd3M9ImNhcmJvbiIgIG9zPSJtYWNvc3giIGZyYWdtZW50PSJ0cnVlIiBhcmNoPSJwcGMiIGRvd25sb2FkLXNpemU9IjAiIGluc3RhbGwtc2l6ZT0iMCIgaWQ9Im9yZy5lY2xpcHNlLmpkdC5zb3VyY2UubWFjb3N4LmNhcmJvbi5wcGMiIHZlcnNpb249IjMuMS4wIi8+Cis8L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamR0LnNvdXJjZS1mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZHQuc291cmNlLWZlYXR1cmUvbGljZW5zZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ZDg1MDAKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamR0LnNvdXJjZS1mZWF0dXJlL2xpY2Vuc2UuaHRtbApAQCAtMCwwICsxLDcyIEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Cis8aHRtbD4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Cis8aDI+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgorPHA+MTU8c3VwPnRoPC9zdXA+IEp1bmUsIDIwMDQ8L3A+CisKKzxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KKworPHA+RUNMSVBTRS5PUkcgTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUworICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKKyAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKKyAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCisgICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKKyAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KKyAgIAorPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAorICAgCis8cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgRWNsaXBzZS5vcmcgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCisgICAoJnF1b3Q7Q1BMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgQ1BMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+LgorICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBDUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KKworPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKKyAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgorCis8cD5Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiAgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gICBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzCisgICBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7IGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy48L3A+CisgIAorPHA+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBGaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9wPgorICAKKzxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCitJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCitpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+CisKKzx1bD4KKwk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KKwk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgorCTxsaT5TdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KKwk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Cis8L3VsPgorCQkKKzxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSBFY2xpcHNlLm9yZyBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQoraW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKK2luZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90Oy4KK1N1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCit0aGF0IGRpcmVjdG9yeS48L3A+CisKKzxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgQ1BMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKK09USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgorCis8dWw+CisJPGxpPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+KTwvbGk+CisJPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KKwk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCisJPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KKwk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgorPC91bD4KKworPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQorY29udGFjdCBFY2xpcHNlLm9yZyB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgorCis8aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KKworPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bworICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCisgICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wZGUtZmVhdHVyZS8ucHJvamVjdCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wZGUtZmVhdHVyZS8ucHJvamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjNhMjRkCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBkZS1mZWF0dXJlLy5wcm9qZWN0CkBAIC0wLDAgKzEsMTcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdERlc2NyaXB0aW9uPgorCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS1mZWF0dXJlPC9uYW1lPgorCTxjb21tZW50PjwvY29tbWVudD4KKwk8cHJvamVjdHM+CisJPC9wcm9qZWN0cz4KKwk8YnVpbGRTcGVjPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwk8L2J1aWxkU3BlYz4KKwk8bmF0dXJlcz4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgorCTwvbmF0dXJlcz4KKzwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBkZS1mZWF0dXJlL2NwbC12MTAuaHRtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wZGUtZmVhdHVyZS9jcGwtdjEwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZhYTIwOAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wZGUtZmVhdHVyZS9jcGwtdjEwLmh0bWwKQEAgLTAsMCArMSwxMjUgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KKzxIVE1MPgorPEhFQUQ+Cis8VElUTEU+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L1RJVExFPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Cis8L0hFQUQ+CisKKzxCT0RZIEJHQ09MT1I9IiNGRkZGRkYiIFZMSU5LPSIjODAwMDAwIj4KKworCis8UCBBTElHTj0iQ0VOVEVSIj48Qj5Db21tb24gUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvQj4KKzxQPjxCPjwvQj48Rk9OVCBTSVpFPSIzIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIzIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSIFRIRSBURVJNUyBPRiBUSElTIENPTU1PTiBQVUJMSUMgTElDRU5TRSAoIkFHUkVFTUVOVCIpLiAgQU5ZIFVTRSwgUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFIE9GIFRISVMgQUdSRUVNRU5ULjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjxCPjEuICBERUZJTklUSU9OUzwvQj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj4iQ29udHJpYnV0aW9uIiBtZWFuczo8L0ZPTlQ+CisKKzxVTD48Rk9OVCBTSVpFPSIyIj5hKSBpbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbiBkaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPEJSIENMRUFSPSJMRUZUIj4KK2IpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiI+aSkJIAljaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiI+aWkpCQlhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9GT05UPjwvVUw+CisKKworPFVMPjxGT05UIFNJWkU9IjIiPndoZXJlIHN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQgYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPkEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IgaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24gc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5Db250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSB3aGljaDogIChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBQcm9ncmFtLiAgPC9GT05UPjwvVUw+CisKKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPiJDb250cmlidXRvciIgbWVhbnMgYW55IHBlcnNvbiBvciBlbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+IkxpY2Vuc2VkIFBhdGVudHMgIiBtZWFuIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZSBvciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiAgPC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj4iUHJvZ3JhbSIgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMgZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50LjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPiJSZWNpcGllbnQiIG1lYW5zIGFueW9uZSB3aG8gcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjxCPjwvQj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48Qj4yLiAgR1JBTlQgT0YgUklHSFRTPC9CPjwvRk9OVD4KKworPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5hKQk8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+U3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50czwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiNGRjAwMDAiPiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLjwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPmIpIAlTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDA4MDAwIj4gPC9GT05UPjxGT05UIFNJWkU9IjIiPnJveWFsdHktZnJlZSBwYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0IGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiAgVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQgYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24gdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8gYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uICBObyBoYXJkd2FyZSBwZXIgc2UgaXMgbGljZW5zZWQgaGVyZXVuZGVyLiAgIDwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiI+YykJUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cyBDb250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvciB0aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiAgRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQgZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiAgQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZCBsaWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eSB0byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuICBGb3IgZXhhbXBsZSwgaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjwvVUw+CisKKworPFVMPjxGT05UIFNJWkU9IjIiPmQpCUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0IHJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4gdGhpcyBBZ3JlZW1lbnQuIDwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KKworPFA+PEZPTlQgU0laRT0iMiI+PEI+My4gIFJFUVVJUkVNRU5UUzwvQj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48Qj48L0I+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0OjwvRk9OVD4KKworPFVMPjxGT05UIFNJWkU9IjIiPmEpCWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiI+YikJaXRzIGxpY2Vuc2UgYWdyZWVtZW50OjwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj5pKQllZmZlY3RpdmVseSBkaXNjbGFpbXM8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZCBjb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlIGFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9GT05UPjwvVUw+CisKKworPFVMPjxGT05UIFNJWkU9IjIiPmlpKSAJZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaCBhcyBsb3N0IHByb2ZpdHM7IDwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj5paWkpPC9GT05UPjxGT05UIFNJWkU9IjIiPglzdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0IENvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiI+aXYpCXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQgaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj4gPC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjRkYwMDAwIj48L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiNGRjAwMDAiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KKworPFA+PEZPTlQgU0laRT0iMiI+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UgY29kZSBmb3JtOjwvRk9OVD4KKworPFVMPjxGT05UIFNJWkU9IjIiPmEpCWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiI+YikJYSBjb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uICA8L0ZPTlQ+PC9VTD4KKworPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj48U1RSSUtFPjwvU1RSSUtFPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj48U1RSSUtFPjwvU1RSSUtFPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55IGNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uICA8L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZSBvcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cyBzdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gIDwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjxCPjQuICBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvQj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkgYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycyBhbmQgdGhlIGxpa2UuICBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2Ugb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwgbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuICAgVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgiQ29tbWVyY2lhbCBDb250cmlidXRvciIpIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIgQ29udHJpYnV0b3IgKCJJbmRlbW5pZmllZCBDb250cmlidXRvciIpIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQgY29zdHMgKGNvbGxlY3RpdmVseSAiTG9zc2VzIikgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyIGxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvIHRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcuICBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcyByZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gIEluIG9yZGVyIHRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB0byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZCBhbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUgaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhIENvbW1lcmNpYWwgQ29udHJpYnV0b3IuICBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZSBjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiAgVW5kZXIgdGhpcyBzZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUgb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYSBjb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48Qj41LiAgTk8gV0FSUkFOVFk8L0I+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzPC9GT05UPjxGT05UIFNJWkU9IjIiPiBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+dGhlIFByb2dyYW08L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudDwvRk9OVD48Rk9OVCBTSVpFPSIyIj4sIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywgY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgPC9GT05UPjxGT05UIFNJWkU9IjIiPnByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zPC9GT05UPjxGT05UIFNJWkU9IjIiPi4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PEI+Ni4gIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9CPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgPC9GT05UPjxGT05UIFNJWkU9IjIiPihJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksPC9GT05UPjxGT05UIFNJWkU9IjIiPiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjxCPjcuICBHRU5FUkFMPC9CPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0IGZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlIG1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGEgQ29udHJpYnV0b3Igd2l0aCByZXNwZWN0IHRvIGEgcGF0ZW50IGFwcGxpY2FibGUgdG8gc29mdHdhcmUgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpLCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMgZ3JhbnRlZCBieSB0aGF0IENvbnRyaWJ1dG9yIHRvIHN1Y2ggUmVjaXBpZW50IHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuICBJbiBhZGRpdGlvbiwgaWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoIG90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaCBSZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlIHBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gIElmIGFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gIEhvd2V2ZXIsIFJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieSBSZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcyBjb3B5cmlnaHRlZCAgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50IFN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5wdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YgdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj50aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzIHRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIElCTSBpcyB0aGUgaW5pdGlhbCBBZ3JlZW1lbnQgU3Rld2FyZC4gICBJQk0gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8gc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPkVhY2ggbmV3IHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBUaGUgUHJvZ3JhbSAoaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgPC9GT05UPjxGT05UIFNJWkU9IjIiPnZlcnNpb24uICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+RXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQgaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0byB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlciBleHByZXNzbHksIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5ieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlPC9GT05UPjxGT05UIFNJWkU9IjIiPi48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+ICBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdCBleHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlIFN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzIEFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gIEVhY2ggcGFydHkgd2FpdmVzIGl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorCis8L0JPRFk+CisKKzwvSFRNTD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGRlLWZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wZGUtZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ZTNlMDIKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGRlLWZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGRlLWZlYXR1cmUvZmVhdHVyZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGRlLWZlYXR1cmUvZmVhdHVyZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQyMjI2NgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wZGUtZmVhdHVyZS9mZWF0dXJlLnhtbApAQCAtMCwwICsxLDY5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGZlYXR1cmUKKyAgICAgIGlkPSJvcmcuZWNsaXBzZS5wZGUiCisgICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgorICAgICAgdmVyc2lvbj0iMy4xLjAiCisgICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgorICAgICAgaW1hZ2U9ImVjbGlwc2VfdXBkYXRlXzEyMC5qcGciPgorCisgICA8ZGVzY3JpcHRpb24+CisgICAgICAlZGVzY3JpcHRpb24KKyAgIDwvZGVzY3JpcHRpb24+CisKKyAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgorICAgICAgJWxpY2Vuc2UKKyAgIDwvbGljZW5zZT4KKworICAgPHVybD4KKyAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vdXBkYXRlLmVjbGlwc2Uub3JnL3VwZGF0ZXMvMy4wIi8+CisgICAgICA8ZGlzY292ZXJ5IGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL3VwZGF0ZS5lY2xpcHNlLm9yZy91cGRhdGVzLzMuMCIvPgorICAgPC91cmw+CisKKyAgIDxyZXF1aXJlcz4KKyAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZHQiIHZlcnNpb249IjMuMC4wIiBtYXRjaD0iY29tcGF0aWJsZSIvPgorICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnBsYXRmb3JtIiB2ZXJzaW9uPSIzLjAuMCIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KKyAgIDwvcmVxdWlyZXM+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wZGUiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMy4xLjAiLz4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnBkZS5idWlsZCIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIzLjEuMCIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UucGRlLmNvcmUiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMy4xLjAiLz4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnBkZS5qdW5pdC5ydW50aW1lIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjMuMS4wIi8+CisgICAgICAgICAKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wZGUucnVudGltZSIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIzLjEuMCIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UucGRlLnVpIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjMuMS4wIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wZGUuZG9jLnVzZXIiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMy4xLjAiLz4KKworPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBkZS1mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wZGUtZmVhdHVyZS9saWNlbnNlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdkODUwMAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wZGUtZmVhdHVyZS9saWNlbnNlLmh0bWwKQEAgLTAsMCArMSw3MiBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgorPGh0bWw+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgorPGgyPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KKzxwPjE1PHN1cD50aDwvc3VwPiBKdW5lLCAyMDA0PC9wPgorCis8aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+CisKKzxwPkVDTElQU0UuT1JHIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKKyAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECisgICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCisgICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgorICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECisgICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+CisgICAKKzxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKKyAgIAorPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IEVjbGlwc2Uub3JnIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAorICAgKCZxdW90O0NQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIENQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPi4KKyAgIEZvciBwdXJwb3NlcyBvZiB0aGUgQ1BMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CisKKzxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCisgICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KKworPHA+Q29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBGaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCBhIEZlYXR1cmUuICAgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcworICAgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90OyBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuPC9wPgorICAKKzxwPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gRmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvcD4KKyAgCis8cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAorSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQoraW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgorCis8dWw+CisJPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+CisJPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KKwk8bGk+U3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+CisJPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgorPC91bD4KKwkJCis8cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgRWNsaXBzZS5vcmcgaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKK2luc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCitpbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsuCitTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgordGhhdCBkaXJlY3RvcnkuPC9wPgorCis8cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIENQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCitPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KKworPHVsPgorCTxsaT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPik8L2xpPgorCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+CisJPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQorCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+CisJPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KKzwvdWw+CisKKzxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKK2NvbnRhY3QgRWNsaXBzZS5vcmcgdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KKworPGgzPkNyeXB0b2dyYXBoeTwvaDM+CisKKzxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KKyAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAorICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGRlLnNvdXJjZS1mZWF0dXJlLy5wcm9qZWN0IGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBkZS5zb3VyY2UtZmVhdHVyZS8ucHJvamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGJjZTdiCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBkZS5zb3VyY2UtZmVhdHVyZS8ucHJvamVjdApAQCAtMCwwICsxLDE3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHByb2plY3REZXNjcmlwdGlvbj4KKwk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuc291cmNlLWZlYXR1cmU8L25hbWU+CisJPGNvbW1lbnQ+PC9jb21tZW50PgorCTxwcm9qZWN0cz4KKwk8L3Byb2plY3RzPgorCTxidWlsZFNwZWM+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCTwvYnVpbGRTcGVjPgorCTxuYXR1cmVzPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+CisJPC9uYXR1cmVzPgorPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGRlLnNvdXJjZS1mZWF0dXJlL2NwbC12MTAuaHRtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wZGUuc291cmNlLWZlYXR1cmUvY3BsLXYxMC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2YWEyMDgKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGRlLnNvdXJjZS1mZWF0dXJlL2NwbC12MTAuaHRtbApAQCAtMCwwICsxLDEyNSBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgorPEhUTUw+Cis8SEVBRD4KKzxUSVRMRT5Db21tb24gUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvVElUTEU+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzwvSEVBRD4KKworPEJPRFkgQkdDT0xPUj0iI0ZGRkZGRiIgVkxJTks9IiM4MDAwMDAiPgorCisKKzxQIEFMSUdOPSJDRU5URVIiPjxCPkNvbW1vbiBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9CPgorPFA+PEI+PC9CPjxGT05UIFNJWkU9IjMiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjMiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIgVEhFIFRFUk1TIE9GIFRISVMgQ09NTU9OIFBVQkxJQyBMSUNFTlNFICgiQUdSRUVNRU5UIikuICBBTlkgVVNFLCBSRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UgT0YgVEhJUyBBR1JFRU1FTlQuPC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PEI+MS4gIERFRklOSVRJT05TPC9CPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPiJDb250cmlidXRpb24iIG1lYW5zOjwvRk9OVD4KKworPFVMPjxGT05UIFNJWkU9IjIiPmEpIGluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uIGRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8QlIgQ0xFQVI9IkxFRlQiPgorYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj5pKQkgCWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj5paSkJCWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiI+d2hlcmUgc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZCBieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+QSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvciBpZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbiBzdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPkNvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIHdoaWNoOiAgKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFByb2dyYW0uICA8L0ZPTlQ+PC9VTD4KKworPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+IkNvbnRyaWJ1dG9yIiBtZWFucyBhbnkgcGVyc29uIG9yIGVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj4iTGljZW5zZWQgUGF0ZW50cyAiIG1lYW4gcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlIG9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uICA8L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPiJQcm9ncmFtIiBtZWFucyB0aGUgQ29udHJpYnV0aW9ucyBkaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+IlJlY2lwaWVudCIgbWVhbnMgYW55b25lIHdobyByZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PEI+PC9CPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjxCPjIuICBHUkFOVCBPRiBSSUdIVFM8L0I+PC9GT05UPgorCis8VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPmEpCTwvRk9OVD48Rk9OVCBTSVpFPSIyIj5TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzPC9GT05UPjxGT05UIFNJWkU9IjIiPiBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iI0ZGMDAwMCI+IDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uPC9GT05UPjwvVUw+CisKKworPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+YikgCVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgPC9GT05UPjxGT05UIFNJWkU9IjIiPlJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDgwMDAiPiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+cm95YWx0eS1mcmVlIHBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uICBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZCBieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbiB0byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiAgVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0byBhbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gIE5vIGhhcmR3YXJlIHBlciBzZSBpcyBsaWNlbnNlZCBoZXJldW5kZXIuICAgPC9GT05UPjwvVUw+CisKKworPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj5jKQlSZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzIENvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yIHRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuICBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudCBmb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuICBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kIGxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5IHRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gIEZvciBleGFtcGxlLCBpZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiI+ZCkJRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQgcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbiB0aGlzIEFncmVlbWVudC4gPC9GT05UPjwvVUw+CisKKworPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgorCis8UD48Rk9OVCBTSVpFPSIyIj48Qj4zLiAgUkVRVUlSRU1FTlRTPC9CPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjxCPjwvQj5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9GT05UPgorCis8VUw+PEZPTlQgU0laRT0iMiI+YSkJaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj5iKQlpdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9GT05UPjwvVUw+CisKKworPFVMPjxGT05UIFNJWkU9IjIiPmkpCWVmZmVjdGl2ZWx5IGRpc2NsYWltczwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kIGNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUgYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiI+aWkpIAllZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoIGFzIGxvc3QgcHJvZml0czsgPC9GT05UPjwvVUw+CisKKworPFVMPjxGT05UIFNJWkU9IjIiPmlpaSk8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+CXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQgQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj5pdikJc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZCBpbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiNGRjAwMDAiPjwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iI0ZGMDAwMCI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgorCis8UD48Rk9OVCBTSVpFPSIyIj5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZSBjb2RlIGZvcm06PC9GT05UPgorCis8VUw+PEZPTlQgU0laRT0iMiI+YSkJaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj5iKQlhIGNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gIDwvRk9OVD48L1VMPgorCis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPjxTVFJJS0U+PC9TVFJJS0U+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPjxTVFJJS0U+PC9TVFJJS0U+PC9GT05UPjxGT05UIFNJWkU9IjIiPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkgY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gIDwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlIG9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzIHN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiAgPC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PEI+NC4gIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9CPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heSBhY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzIGFuZCB0aGUgbGlrZS4gIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZSBvZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbCBsaWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gICBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCJDb21tZXJjaWFsIENvbnRyaWJ1dG9yIikgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlciBDb250cmlidXRvciAoIkluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIikgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZCBjb3N0cyAoY29sbGVjdGl2ZWx5ICJMb3NzZXMiKSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIgbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8gdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiBjb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZy4gIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzIHJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiAgSW4gb3JkZXIgdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kIGFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiAgVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZSBpbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiAgVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEgQ29tbWVyY2lhbCBDb250cmlidXRvci4gIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlIGNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuICBVbmRlciB0aGlzIHNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZSBvdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhIGNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjxCPjUuICBOTyBXQVJSQU5UWTwvQj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXM8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj50aGUgUHJvZ3JhbTwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50PC9GT05UPjxGT05UIFNJWkU9IjIiPiwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLCBjb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+cHJvZ3JhbXMgb3IgZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnM8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+LiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48Qj42LiAgRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L0I+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+KElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSw8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PEI+Ny4gIEdFTkVSQUw8L0I+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQgZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUgbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYSBDb250cmlidXRvciB3aXRoIHJlc3BlY3QgdG8gYSBwYXRlbnQgYXBwbGljYWJsZSB0byBzb2Z0d2FyZSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCksIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcyBncmFudGVkIGJ5IHRoYXQgQ29udHJpYnV0b3IgdG8gc3VjaCBSZWNpcGllbnQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gIEluIGFkZGl0aW9uLCBpZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGggb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoIFJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvciBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUgcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiAgSWYgYWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiAgSG93ZXZlciwgUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5IFJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzIGNvcHlyaWdodGVkICBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQgU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gPC9GT05UPjxGT05UIFNJWkU9IjIiPnB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZiB0aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gPC9GT05UPjxGT05UIFNJWkU9IjIiPnRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMgdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gSUJNIGlzIHRoZSBpbml0aWFsIEFncmVlbWVudCBTdGV3YXJkLiAgIElCTSBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0byBzZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+RWFjaCBuZXcgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIFRoZSBQcm9ncmFtIChpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+dmVyc2lvbi4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5FeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZCBpbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyIGV4cHJlc3NseSwgPC9GT05UPjxGT05UIFNJWkU9IjIiPmJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2U8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+LjwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90IGV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUgU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMgQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiAgRWFjaCBwYXJ0eSB3YWl2ZXMgaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+CisKKzwvQk9EWT4KKworPC9IVE1MPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wZGUuc291cmNlLWZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wZGUuc291cmNlLWZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGUzZTAyCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBkZS5zb3VyY2UtZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wZGUuc291cmNlLWZlYXR1cmUvZmVhdHVyZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGRlLnNvdXJjZS1mZWF0dXJlL2ZlYXR1cmUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhYmJiYzcKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGRlLnNvdXJjZS1mZWF0dXJlL2ZlYXR1cmUueG1sCkBAIC0wLDAgKzEsMTQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8ZmVhdHVyZSBwcmltYXJ5PSJmYWxzZSIgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiICBpbWFnZT0iZWNsaXBzZV91cGRhdGVfMTIwLmpwZyIgaWQ9Im9yZy5lY2xpcHNlLnBkZS5zb3VyY2UiICB2ZXJzaW9uPSIzLjEuMCI+CisJPGRlc2NyaXB0aW9uID4KKwkJJWRlc2NyaXB0aW9uCisJPC9kZXNjcmlwdGlvbj4KKwk8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KKwkJJWxpY2Vuc2UKKwk8L2xpY2Vuc2U+CisJPHVybD4KKwkJPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly91cGRhdGUuZWNsaXBzZS5vcmcvdXBkYXRlcy8zLjAiLz4KKwkJPGRpc2NvdmVyeSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly91cGRhdGUuZWNsaXBzZS5vcmcvdXBkYXRlcy8zLjAiLz4KKwk8L3VybD4KKwk8cGx1Z2luICAgIGZyYWdtZW50PSJmYWxzZSIgIGRvd25sb2FkLXNpemU9IjAiIGluc3RhbGwtc2l6ZT0iMCIgaWQ9Im9yZy5lY2xpcHNlLnBkZS5zb3VyY2UiIHZlcnNpb249IjMuMS4wIi8+Cis8L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGRlLnNvdXJjZS1mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wZGUuc291cmNlLWZlYXR1cmUvbGljZW5zZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ZDg1MDAKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGRlLnNvdXJjZS1mZWF0dXJlL2xpY2Vuc2UuaHRtbApAQCAtMCwwICsxLDcyIEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Cis8aHRtbD4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Cis8aDI+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgorPHA+MTU8c3VwPnRoPC9zdXA+IEp1bmUsIDIwMDQ8L3A+CisKKzxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KKworPHA+RUNMSVBTRS5PUkcgTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUworICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKKyAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKKyAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCisgICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKKyAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KKyAgIAorPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAorICAgCis8cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgRWNsaXBzZS5vcmcgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCisgICAoJnF1b3Q7Q1BMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgQ1BMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+LgorICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBDUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KKworPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKKyAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgorCis8cD5Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiAgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gICBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzCisgICBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7IGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy48L3A+CisgIAorPHA+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBGaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9wPgorICAKKzxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCitJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCitpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+CisKKzx1bD4KKwk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KKwk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgorCTxsaT5TdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KKwk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Cis8L3VsPgorCQkKKzxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSBFY2xpcHNlLm9yZyBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQoraW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKK2luZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90Oy4KK1N1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCit0aGF0IGRpcmVjdG9yeS48L3A+CisKKzxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgQ1BMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKK09USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgorCis8dWw+CisJPGxpPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+KTwvbGk+CisJPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KKwk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCisJPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KKwk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgorPC91bD4KKworPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQorY29udGFjdCBFY2xpcHNlLm9yZyB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgorCis8aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KKworPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bworICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCisgICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wbGF0Zm9ybS1mZWF0dXJlLy5wcm9qZWN0IGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBsYXRmb3JtLWZlYXR1cmUvLnByb2plY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY1M2M3MAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wbGF0Zm9ybS1mZWF0dXJlLy5wcm9qZWN0CkBAIC0wLDAgKzEsMTcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdERlc2NyaXB0aW9uPgorCTxuYW1lPm9yZy5lY2xpcHNlLnBsYXRmb3JtLWZlYXR1cmU8L25hbWU+CisJPGNvbW1lbnQ+PC9jb21tZW50PgorCTxwcm9qZWN0cz4KKwk8L3Byb2plY3RzPgorCTxidWlsZFNwZWM+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCTwvYnVpbGRTcGVjPgorCTxuYXR1cmVzPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+CisJPC9uYXR1cmVzPgorPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGxhdGZvcm0tZmVhdHVyZS9jcGwtdjEwLmh0bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGxhdGZvcm0tZmVhdHVyZS9jcGwtdjEwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZhYTIwOAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wbGF0Zm9ybS1mZWF0dXJlL2NwbC12MTAuaHRtbApAQCAtMCwwICsxLDEyNSBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgorPEhUTUw+Cis8SEVBRD4KKzxUSVRMRT5Db21tb24gUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvVElUTEU+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzwvSEVBRD4KKworPEJPRFkgQkdDT0xPUj0iI0ZGRkZGRiIgVkxJTks9IiM4MDAwMDAiPgorCisKKzxQIEFMSUdOPSJDRU5URVIiPjxCPkNvbW1vbiBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9CPgorPFA+PEI+PC9CPjxGT05UIFNJWkU9IjMiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjMiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIgVEhFIFRFUk1TIE9GIFRISVMgQ09NTU9OIFBVQkxJQyBMSUNFTlNFICgiQUdSRUVNRU5UIikuICBBTlkgVVNFLCBSRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UgT0YgVEhJUyBBR1JFRU1FTlQuPC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PEI+MS4gIERFRklOSVRJT05TPC9CPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPiJDb250cmlidXRpb24iIG1lYW5zOjwvRk9OVD4KKworPFVMPjxGT05UIFNJWkU9IjIiPmEpIGluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uIGRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8QlIgQ0xFQVI9IkxFRlQiPgorYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj5pKQkgCWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj5paSkJCWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiI+d2hlcmUgc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZCBieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+QSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvciBpZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbiBzdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPkNvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIHdoaWNoOiAgKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFByb2dyYW0uICA8L0ZPTlQ+PC9VTD4KKworPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+IkNvbnRyaWJ1dG9yIiBtZWFucyBhbnkgcGVyc29uIG9yIGVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj4iTGljZW5zZWQgUGF0ZW50cyAiIG1lYW4gcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlIG9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uICA8L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPiJQcm9ncmFtIiBtZWFucyB0aGUgQ29udHJpYnV0aW9ucyBkaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+IlJlY2lwaWVudCIgbWVhbnMgYW55b25lIHdobyByZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PEI+PC9CPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjxCPjIuICBHUkFOVCBPRiBSSUdIVFM8L0I+PC9GT05UPgorCis8VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPmEpCTwvRk9OVD48Rk9OVCBTSVpFPSIyIj5TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzPC9GT05UPjxGT05UIFNJWkU9IjIiPiBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iI0ZGMDAwMCI+IDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uPC9GT05UPjwvVUw+CisKKworPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+YikgCVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgPC9GT05UPjxGT05UIFNJWkU9IjIiPlJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDgwMDAiPiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+cm95YWx0eS1mcmVlIHBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uICBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZCBieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbiB0byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiAgVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0byBhbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gIE5vIGhhcmR3YXJlIHBlciBzZSBpcyBsaWNlbnNlZCBoZXJldW5kZXIuICAgPC9GT05UPjwvVUw+CisKKworPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj5jKQlSZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzIENvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yIHRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuICBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudCBmb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuICBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kIGxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5IHRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gIEZvciBleGFtcGxlLCBpZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiI+ZCkJRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQgcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbiB0aGlzIEFncmVlbWVudC4gPC9GT05UPjwvVUw+CisKKworPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgorCis8UD48Rk9OVCBTSVpFPSIyIj48Qj4zLiAgUkVRVUlSRU1FTlRTPC9CPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjxCPjwvQj5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9GT05UPgorCis8VUw+PEZPTlQgU0laRT0iMiI+YSkJaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj5iKQlpdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9GT05UPjwvVUw+CisKKworPFVMPjxGT05UIFNJWkU9IjIiPmkpCWVmZmVjdGl2ZWx5IGRpc2NsYWltczwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kIGNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUgYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiI+aWkpIAllZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoIGFzIGxvc3QgcHJvZml0czsgPC9GT05UPjwvVUw+CisKKworPFVMPjxGT05UIFNJWkU9IjIiPmlpaSk8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+CXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQgQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj5pdikJc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZCBpbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiNGRjAwMDAiPjwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iI0ZGMDAwMCI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgorCis8UD48Rk9OVCBTSVpFPSIyIj5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZSBjb2RlIGZvcm06PC9GT05UPgorCis8VUw+PEZPTlQgU0laRT0iMiI+YSkJaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj5iKQlhIGNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gIDwvRk9OVD48L1VMPgorCis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPjxTVFJJS0U+PC9TVFJJS0U+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPjxTVFJJS0U+PC9TVFJJS0U+PC9GT05UPjxGT05UIFNJWkU9IjIiPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkgY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gIDwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlIG9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzIHN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiAgPC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PEI+NC4gIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9CPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heSBhY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzIGFuZCB0aGUgbGlrZS4gIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZSBvZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbCBsaWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gICBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCJDb21tZXJjaWFsIENvbnRyaWJ1dG9yIikgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlciBDb250cmlidXRvciAoIkluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIikgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZCBjb3N0cyAoY29sbGVjdGl2ZWx5ICJMb3NzZXMiKSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIgbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8gdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiBjb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZy4gIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzIHJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiAgSW4gb3JkZXIgdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kIGFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiAgVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZSBpbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiAgVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEgQ29tbWVyY2lhbCBDb250cmlidXRvci4gIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlIGNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuICBVbmRlciB0aGlzIHNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZSBvdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhIGNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjxCPjUuICBOTyBXQVJSQU5UWTwvQj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXM8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj50aGUgUHJvZ3JhbTwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50PC9GT05UPjxGT05UIFNJWkU9IjIiPiwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLCBjb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+cHJvZ3JhbXMgb3IgZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnM8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+LiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48Qj42LiAgRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L0I+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+KElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSw8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PEI+Ny4gIEdFTkVSQUw8L0I+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQgZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUgbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYSBDb250cmlidXRvciB3aXRoIHJlc3BlY3QgdG8gYSBwYXRlbnQgYXBwbGljYWJsZSB0byBzb2Z0d2FyZSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCksIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcyBncmFudGVkIGJ5IHRoYXQgQ29udHJpYnV0b3IgdG8gc3VjaCBSZWNpcGllbnQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gIEluIGFkZGl0aW9uLCBpZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGggb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoIFJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvciBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUgcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiAgSWYgYWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiAgSG93ZXZlciwgUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5IFJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzIGNvcHlyaWdodGVkICBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQgU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gPC9GT05UPjxGT05UIFNJWkU9IjIiPnB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZiB0aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gPC9GT05UPjxGT05UIFNJWkU9IjIiPnRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMgdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gSUJNIGlzIHRoZSBpbml0aWFsIEFncmVlbWVudCBTdGV3YXJkLiAgIElCTSBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0byBzZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+RWFjaCBuZXcgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIFRoZSBQcm9ncmFtIChpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+dmVyc2lvbi4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5FeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZCBpbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyIGV4cHJlc3NseSwgPC9GT05UPjxGT05UIFNJWkU9IjIiPmJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2U8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+LjwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90IGV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUgU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMgQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiAgRWFjaCBwYXJ0eSB3YWl2ZXMgaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+CisKKzwvQk9EWT4KKworPC9IVE1MPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wbGF0Zm9ybS1mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGxhdGZvcm0tZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ZTNlMDIKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGxhdGZvcm0tZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wbGF0Zm9ybS1mZWF0dXJlL2ZlYXR1cmUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBsYXRmb3JtLWZlYXR1cmUvZmVhdHVyZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODcyZjVjYgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wbGF0Zm9ybS1mZWF0dXJlL2ZlYXR1cmUueG1sCkBAIC0wLDAgKzEsMzg3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSAKK0luIHRoZSBmb2xsb3dpbmcgbWFya3VwLCBpZ25vcmUgdGhlICJwcmltYXJ5IiBhbmQgImFwcGxpY2F0aW9uIiBhdHRyaWJ1dGVzLgorU2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02ODM1MSBmb3IgbW9yZSBkZXRhaWxzLgorLS0+Cis8ZmVhdHVyZQorICAgICAgaWQ9Im9yZy5lY2xpcHNlLnBsYXRmb3JtIgorICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKKyAgICAgIHZlcnNpb249IjMuMS4wIgorICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKKyAgICAgIHBsdWdpbj0iIgorICAgICAgaW1hZ2U9ImVjbGlwc2VfdXBkYXRlXzEyMC5qcGciCisgICAgICBwcmltYXJ5PSJ0cnVlIgorICAgICAgYXBwbGljYXRpb249Im9yZy5lY2xpcHNlLnVpLmlkZS53b3JrYmVuY2giPgorCisgICA8ZGVzY3JpcHRpb24+CisgICAgICAlZGVzY3JpcHRpb24KKyAgIDwvZGVzY3JpcHRpb24+CisKKyAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgorICAgICAgJWxpY2Vuc2UKKyAgIDwvbGljZW5zZT4KKworICAgPHVybD4KKyAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vdXBkYXRlLmVjbGlwc2Uub3JnL3VwZGF0ZXMvMy4wIi8+CisgICAgICA8ZGlzY292ZXJ5IGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL3VwZGF0ZS5lY2xpcHNlLm9yZy91cGRhdGVzLzMuMCIvPgorICAgPC91cmw+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuYXBhY2hlLmFudCIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIxLjYuMiIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmFwYWNoZS5sdWNlbmUiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMS4zLjAiLz4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmFudC5jb3JlIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjMuMS4wIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb21wYXJlIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjMuMS4wIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLmJvb3QiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMy4wLjAiLz4KKyAgICAgICAgIAorICAgPHBsdWdpbgorICAgCQkgaWQ9Im9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMiCisgICAJCSBkb3dubG9hZC1zaXplPSIwIgorICAgCQkgaW5zdGFsbC1zaXplPSIwIgorICAgCQkgdmVyc2lvbj0iMy4xLjAiLz4KKyAgIAorICAgPHBsdWdpbgorICAgCQkgaWQ9Im9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMiCisgICAJCSBkb3dubG9hZC1zaXplPSIwIgorICAgCQkgaW5zdGFsbC1zaXplPSIwIgorICAgCQkgdmVyc2lvbj0iMy4xLjAiLz4KKyAgIAorICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjMuMS4wIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMy4xLjAiLz4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5IgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjMuMC4wIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5vc2dpIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjMuMS4wIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjMuMC4wIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5vc2dpLnV0aWwiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMy4wLjAiLz4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUudmFyaWFibGVzIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjMuMC4wIi8+CisgICAgICAgICAKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjMuMS4wIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5kZWJ1Zy51aSIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIzLjEuMCIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuaGVscCIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIzLjAuMCIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuaGVscC53ZWJhcHAiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMy4wLjAiLz4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmhlbHAuYmFzZSIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIzLjAuMCIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuaGVscC51aSIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIzLjAuMCIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuaGVscC5hcHBzZXJ2ZXIiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMy4wLjAiLz4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmhlbHAuaWRlIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjMuMC4wIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wbGF0Zm9ybSIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIzLjEuMCIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UucGxhdGZvcm0uZG9jLnVzZXIiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMy4xLjAiLz4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnNlYXJjaCIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIzLjEuMCIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0IgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjMuMS4wIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS50ZWFtLmNvcmUiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMy4xLjAiLz4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnRlYW0uY3ZzLmNvcmUiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMy4xLjAiLz4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnRlYW0uY3ZzLnNzaCIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIzLjEuMCIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudGVhbS5jdnMuc3NoMiIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIzLjEuMCIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudGVhbS5jdnMudWkiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMy4xLjAiLz4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnRlYW0udWkiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMy4xLjAiLz4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnRvbWNhdCIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSI0LjEuMzAiLz4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnRleHQiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMy4xLjAiLz4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpmYWNlIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjMuMS4wIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZmFjZS50ZXh0IgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjMuMS4wIi8+CisJCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuY29uc29sZSIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIzLjEuMCIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkucHJlc2VudGF0aW9ucy5yMjEiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMy4xLjAiLz4KKyAgICAgICAgICAgIAorICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmludHJvIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjMuMS4wIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5jaGVhdHNoZWV0cyIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIzLjAuMCIvPgorICAgICAgICAgICAgCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjMuMS4wIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvciIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIzLjEuMCIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudmlld3MiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMy4xLjAiLz4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMy4xLjAiLz4KKyAgICAgICAgIAorICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmZvcm1zIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjMuMC4wIi8+CisgICAgICAgICAKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aSIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIzLjEuMCIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scyIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIzLjEuMCIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuaWRlIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjMuMS4wIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjMuMC4wIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZSIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIzLjAuMCIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlciIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIzLjAuMCIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLnVpIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjMuMC4wIi8+CisgICAgICAgIAorICA8IS0tIFByZS0zLjAgYmluYXJ5IGNvbXBhdGliaWxpdHkgLS0+CisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoLmNvbXBhdGliaWxpdHkiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMy4xLjAiCisgICAgICAgICBmcmFnbWVudD0idHJ1ZSIvPgorCisgIDwhLS1BaXggcGxhdGZvcm0gaW5jbHVzaW9uIC0tPgorICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5zd3QubW90aWYiIGRvd25sb2FkLXNpemU9IjAiIGluc3RhbGwtc2l6ZT0iMCIgdmVyc2lvbj0iMy4xLjAiIGZyYWdtZW50PSJ0cnVlIiBvcz0iYWl4IiB3cz0ibW90aWYiLz4KKyAgCisgIDwhLS0gSFBVWCBQbGF0Zm9ybSBzcGVjaWZpY3MgLS0+CisgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnN3dC5tb3RpZiIgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiB2ZXJzaW9uPSIzLjEuMCIgZnJhZ21lbnQ9InRydWUiIG9zPSJocHV4IiB3cz0ibW90aWYiLz4KKyAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuaHB1eCIgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiB2ZXJzaW9uPSIzLjAuMCIgZnJhZ21lbnQ9InRydWUiIG9zPSJocHV4Ii8+CisKKyAgPCEtLSBMSU5VWCBHVEstLT4gIAorICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5zd3QuZ3RrIiBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIHZlcnNpb249IjMuMS4wIiAgZnJhZ21lbnQ9InRydWUiIG9zPSJsaW51eCIgd3M9Imd0ayIgYXJjaD0ieDg2IiAvPgorICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5zd3QuZ3RrIiBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIHZlcnNpb249IjMuMS4wIiAgZnJhZ21lbnQ9InRydWUiIG9zPSJsaW51eCIgd3M9Imd0ayIgYXJjaD0icHBjIiAvPgorICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5saW51eCIgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiB2ZXJzaW9uPSIzLjAuMCIgZnJhZ21lbnQ9InRydWUiIG9zPSJsaW51eCIvPgorICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5saW51eCIgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiB2ZXJzaW9uPSIzLjAuMCIgZnJhZ21lbnQ9InRydWUiIG9zPSJsaW51eCIgLz4KKworICA8IS0tIExJTlVYIEdUSyBBTUQ2NC0tPgorICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5zd3QuZ3RrNjQiIGRvd25sb2FkLXNpemU9IjAiIGluc3RhbGwtc2l6ZT0iMCIgdmVyc2lvbj0iMy4xLjAiICBmcmFnbWVudD0idHJ1ZSIgb3M9ImxpbnV4IiB3cz0iZ3RrIiBhcmNoPSJhbWQ2NCIgLz4KKworICA8IS0tIExJTlVYIE1vdGlmLS0+ICAgIAorICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5zd3QubW90aWYiIGRvd25sb2FkLXNpemU9IjAiIGluc3RhbGwtc2l6ZT0iMCIgdmVyc2lvbj0iMy4xLjAiIGZyYWdtZW50PSJ0cnVlIiBvcz0ibGludXgiIHdzPSJtb3RpZiIvPgorICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5saW51eCIgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiB2ZXJzaW9uPSIzLjAuMCIgZnJhZ21lbnQ9InRydWUiIG9zPSJsaW51eCIvPgorICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5saW51eCIgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiB2ZXJzaW9uPSIzLjAuMCIgZnJhZ21lbnQ9InRydWUiIG9zPSJsaW51eCIgLz4KKworICA8IS0tIE1hY09TIFggQ2FyYm9uIC0tPiAgCisgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnN3dC5jYXJib24iIGRvd25sb2FkLXNpemU9IjAiIGluc3RhbGwtc2l6ZT0iMCIgdmVyc2lvbj0iMy4xLjAiICBmcmFnbWVudD0idHJ1ZSIgb3M9Im1hY29zeCIgd3M9ImNhcmJvbiIvPiAKKyAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubWFjb3N4IiBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIHZlcnNpb249IjMuMC4wIiBmcmFnbWVudD0idHJ1ZSIgb3M9Im1hY29zeCIgd3M9ImNhcmJvbiIvPgorICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS51aS5jYXJib24iIGRvd25sb2FkLXNpemU9IjAiIGluc3RhbGwtc2l6ZT0iMCIgdmVyc2lvbj0iMy4xLjAiIGZyYWdtZW50PSJ0cnVlIiBvcz0ibWFjb3N4IiB3cz0iY2FyYm9uIi8+CisgIAorICA8IS0tIFFOWCBQaG90b24gLS0+CisgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnN3dC5waG90b24iIGRvd25sb2FkLXNpemU9IjAiIGluc3RhbGwtc2l6ZT0iMCIgdmVyc2lvbj0iMy4xLjAiIGZyYWdtZW50PSJ0cnVlIiBvcz0icW54IiB3cz0icGhvdG9uIi8+CisgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnFueCIgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiB2ZXJzaW9uPSIzLjAuMCIgZnJhZ21lbnQ9InRydWUiIG9zPSJxbngiIHdzPSJwaG90b24iLz4KKyAgCisgIDwhLS0gU29sYXJpcyBNb3RpZiAtLT4KKyAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uuc3d0Lm1vdGlmIiBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIHZlcnNpb249IjMuMS4wIiBmcmFnbWVudD0idHJ1ZSIgb3M9InNvbGFyaXMiIHdzPSJtb3RpZiIvPgorICAKKyAgPCEtLSBXaW4zMiAtLT4KKyAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uuc3d0LndpbjMyIiBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIHZlcnNpb249IjMuMS4wIiBmcmFnbWVudD0idHJ1ZSIgd3M9IndpbjMyIi8+CisgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLndpbjMyIiBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIHZlcnNpb249IjMuMC4wIiBmcmFnbWVudD0idHJ1ZSIgb3M9IndpbjMyIi8+CisgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnVpLndpbjMyIiBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIHZlcnNpb249IjMuMS4wIiBmcmFnbWVudD0idHJ1ZSIgd3M9IndpbjMyIi8+CisgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLndpbjMyIiBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIHZlcnNpb249IjMuMC4wIiBmcmFnbWVudD0idHJ1ZSIgb3M9IndpbjMyIi8+Cis8L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGxhdGZvcm0tZmVhdHVyZS9saWNlbnNlLmh0bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGxhdGZvcm0tZmVhdHVyZS9saWNlbnNlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdkODUwMAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wbGF0Zm9ybS1mZWF0dXJlL2xpY2Vuc2UuaHRtbApAQCAtMCwwICsxLDcyIEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Cis8aHRtbD4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Cis8aDI+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgorPHA+MTU8c3VwPnRoPC9zdXA+IEp1bmUsIDIwMDQ8L3A+CisKKzxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KKworPHA+RUNMSVBTRS5PUkcgTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUworICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKKyAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKKyAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCisgICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKKyAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KKyAgIAorPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAorICAgCis8cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgRWNsaXBzZS5vcmcgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCisgICAoJnF1b3Q7Q1BMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgQ1BMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+LgorICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBDUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KKworPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKKyAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgorCis8cD5Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiAgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gICBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzCisgICBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7IGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy48L3A+CisgIAorPHA+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBGaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9wPgorICAKKzxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCitJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCitpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+CisKKzx1bD4KKwk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KKwk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgorCTxsaT5TdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KKwk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Cis8L3VsPgorCQkKKzxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSBFY2xpcHNlLm9yZyBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQoraW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKK2luZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90Oy4KK1N1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCit0aGF0IGRpcmVjdG9yeS48L3A+CisKKzxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgQ1BMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKK09USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgorCis8dWw+CisJPGxpPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+KTwvbGk+CisJPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KKwk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCisJPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KKwk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgorPC91bD4KKworPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQorY29udGFjdCBFY2xpcHNlLm9yZyB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgorCis8aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KKworPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bworICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCisgICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5zb3VyY2UtZmVhdHVyZS8ucHJvamVjdCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5zb3VyY2UtZmVhdHVyZS8ucHJvamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2NhNDBjCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBsYXRmb3JtLnNvdXJjZS1mZWF0dXJlLy5wcm9qZWN0CkBAIC0wLDAgKzEsMTcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdERlc2NyaXB0aW9uPgorCTxuYW1lPm9yZy5lY2xpcHNlLnBsYXRmb3JtLnNvdXJjZS1mZWF0dXJlPC9uYW1lPgorCTxjb21tZW50PjwvY29tbWVudD4KKwk8cHJvamVjdHM+CisJPC9wcm9qZWN0cz4KKwk8YnVpbGRTcGVjPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwk8L2J1aWxkU3BlYz4KKwk8bmF0dXJlcz4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgorCTwvbmF0dXJlcz4KKzwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBsYXRmb3JtLnNvdXJjZS1mZWF0dXJlL2NwbC12MTAuaHRtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5zb3VyY2UtZmVhdHVyZS9jcGwtdjEwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZhYTIwOAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5zb3VyY2UtZmVhdHVyZS9jcGwtdjEwLmh0bWwKQEAgLTAsMCArMSwxMjUgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KKzxIVE1MPgorPEhFQUQ+Cis8VElUTEU+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L1RJVExFPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Cis8L0hFQUQ+CisKKzxCT0RZIEJHQ09MT1I9IiNGRkZGRkYiIFZMSU5LPSIjODAwMDAwIj4KKworCis8UCBBTElHTj0iQ0VOVEVSIj48Qj5Db21tb24gUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvQj4KKzxQPjxCPjwvQj48Rk9OVCBTSVpFPSIzIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIzIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSIFRIRSBURVJNUyBPRiBUSElTIENPTU1PTiBQVUJMSUMgTElDRU5TRSAoIkFHUkVFTUVOVCIpLiAgQU5ZIFVTRSwgUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFIE9GIFRISVMgQUdSRUVNRU5ULjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjxCPjEuICBERUZJTklUSU9OUzwvQj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj4iQ29udHJpYnV0aW9uIiBtZWFuczo8L0ZPTlQ+CisKKzxVTD48Rk9OVCBTSVpFPSIyIj5hKSBpbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbiBkaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPEJSIENMRUFSPSJMRUZUIj4KK2IpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiI+aSkJIAljaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiI+aWkpCQlhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9GT05UPjwvVUw+CisKKworPFVMPjxGT05UIFNJWkU9IjIiPndoZXJlIHN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQgYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPkEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IgaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24gc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5Db250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSB3aGljaDogIChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBQcm9ncmFtLiAgPC9GT05UPjwvVUw+CisKKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPiJDb250cmlidXRvciIgbWVhbnMgYW55IHBlcnNvbiBvciBlbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+IkxpY2Vuc2VkIFBhdGVudHMgIiBtZWFuIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZSBvciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiAgPC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj4iUHJvZ3JhbSIgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMgZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50LjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPiJSZWNpcGllbnQiIG1lYW5zIGFueW9uZSB3aG8gcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjxCPjwvQj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48Qj4yLiAgR1JBTlQgT0YgUklHSFRTPC9CPjwvRk9OVD4KKworPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5hKQk8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+U3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50czwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiNGRjAwMDAiPiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLjwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPmIpIAlTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDA4MDAwIj4gPC9GT05UPjxGT05UIFNJWkU9IjIiPnJveWFsdHktZnJlZSBwYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0IGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiAgVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQgYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24gdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8gYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uICBObyBoYXJkd2FyZSBwZXIgc2UgaXMgbGljZW5zZWQgaGVyZXVuZGVyLiAgIDwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiI+YykJUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cyBDb250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvciB0aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiAgRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQgZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiAgQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZCBsaWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eSB0byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuICBGb3IgZXhhbXBsZSwgaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjwvVUw+CisKKworPFVMPjxGT05UIFNJWkU9IjIiPmQpCUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0IHJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4gdGhpcyBBZ3JlZW1lbnQuIDwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KKworPFA+PEZPTlQgU0laRT0iMiI+PEI+My4gIFJFUVVJUkVNRU5UUzwvQj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48Qj48L0I+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0OjwvRk9OVD4KKworPFVMPjxGT05UIFNJWkU9IjIiPmEpCWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiI+YikJaXRzIGxpY2Vuc2UgYWdyZWVtZW50OjwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj5pKQllZmZlY3RpdmVseSBkaXNjbGFpbXM8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZCBjb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlIGFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9GT05UPjwvVUw+CisKKworPFVMPjxGT05UIFNJWkU9IjIiPmlpKSAJZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaCBhcyBsb3N0IHByb2ZpdHM7IDwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj5paWkpPC9GT05UPjxGT05UIFNJWkU9IjIiPglzdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0IENvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiI+aXYpCXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQgaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj4gPC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjRkYwMDAwIj48L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiNGRjAwMDAiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KKworPFA+PEZPTlQgU0laRT0iMiI+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UgY29kZSBmb3JtOjwvRk9OVD4KKworPFVMPjxGT05UIFNJWkU9IjIiPmEpCWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiI+YikJYSBjb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uICA8L0ZPTlQ+PC9VTD4KKworPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj48U1RSSUtFPjwvU1RSSUtFPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj48U1RSSUtFPjwvU1RSSUtFPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55IGNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uICA8L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZSBvcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cyBzdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gIDwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjxCPjQuICBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvQj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkgYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycyBhbmQgdGhlIGxpa2UuICBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2Ugb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwgbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuICAgVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgiQ29tbWVyY2lhbCBDb250cmlidXRvciIpIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIgQ29udHJpYnV0b3IgKCJJbmRlbW5pZmllZCBDb250cmlidXRvciIpIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQgY29zdHMgKGNvbGxlY3RpdmVseSAiTG9zc2VzIikgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyIGxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvIHRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcuICBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcyByZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gIEluIG9yZGVyIHRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB0byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZCBhbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUgaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhIENvbW1lcmNpYWwgQ29udHJpYnV0b3IuICBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZSBjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiAgVW5kZXIgdGhpcyBzZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUgb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYSBjb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48Qj41LiAgTk8gV0FSUkFOVFk8L0I+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzPC9GT05UPjxGT05UIFNJWkU9IjIiPiBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+dGhlIFByb2dyYW08L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudDwvRk9OVD48Rk9OVCBTSVpFPSIyIj4sIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywgY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgPC9GT05UPjxGT05UIFNJWkU9IjIiPnByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zPC9GT05UPjxGT05UIFNJWkU9IjIiPi4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PEI+Ni4gIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9CPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgPC9GT05UPjxGT05UIFNJWkU9IjIiPihJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksPC9GT05UPjxGT05UIFNJWkU9IjIiPiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjxCPjcuICBHRU5FUkFMPC9CPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0IGZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlIG1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGEgQ29udHJpYnV0b3Igd2l0aCByZXNwZWN0IHRvIGEgcGF0ZW50IGFwcGxpY2FibGUgdG8gc29mdHdhcmUgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpLCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMgZ3JhbnRlZCBieSB0aGF0IENvbnRyaWJ1dG9yIHRvIHN1Y2ggUmVjaXBpZW50IHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuICBJbiBhZGRpdGlvbiwgaWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoIG90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaCBSZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlIHBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gIElmIGFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gIEhvd2V2ZXIsIFJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieSBSZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcyBjb3B5cmlnaHRlZCAgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50IFN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5wdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YgdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj50aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzIHRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIElCTSBpcyB0aGUgaW5pdGlhbCBBZ3JlZW1lbnQgU3Rld2FyZC4gICBJQk0gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8gc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPkVhY2ggbmV3IHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBUaGUgUHJvZ3JhbSAoaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgPC9GT05UPjxGT05UIFNJWkU9IjIiPnZlcnNpb24uICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+RXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQgaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0byB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlciBleHByZXNzbHksIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5ieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlPC9GT05UPjxGT05UIFNJWkU9IjIiPi48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+ICBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdCBleHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlIFN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzIEFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gIEVhY2ggcGFydHkgd2FpdmVzIGl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorCis8L0JPRFk+CisKKzwvSFRNTD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGxhdGZvcm0uc291cmNlLWZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5zb3VyY2UtZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ZTNlMDIKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGxhdGZvcm0uc291cmNlLWZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGxhdGZvcm0uc291cmNlLWZlYXR1cmUvZmVhdHVyZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGxhdGZvcm0uc291cmNlLWZlYXR1cmUvZmVhdHVyZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JkZWU0MAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5zb3VyY2UtZmVhdHVyZS9mZWF0dXJlLnhtbApAQCAtMCwwICsxLDI2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGZlYXR1cmUgcHJpbWFyeT0iZmFsc2UiICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIiAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIiAgaW1hZ2U9ImVjbGlwc2VfdXBkYXRlXzEyMC5qcGciIGlkPSJvcmcuZWNsaXBzZS5wbGF0Zm9ybS5zb3VyY2UiICB2ZXJzaW9uPSIzLjEuMCI+CisJPGRlc2NyaXB0aW9uID4KKwkJJWRlc2NyaXB0aW9uCisJPC9kZXNjcmlwdGlvbj4KKwk8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KKwkJJWxpY2Vuc2UKKwk8L2xpY2Vuc2U+CisJPHVybD4KKwkJPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly91cGRhdGUuZWNsaXBzZS5vcmcvdXBkYXRlcy8zLjAiLz4KKwkJPGRpc2NvdmVyeSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly91cGRhdGUuZWNsaXBzZS5vcmcvdXBkYXRlcy8zLjAiLz4KKwk8L3VybD4KKwk8cGx1Z2luICAgIGZyYWdtZW50PSJmYWxzZSIgIGRvd25sb2FkLXNpemU9IjAiIGluc3RhbGwtc2l6ZT0iMCIgaWQ9Im9yZy5lY2xpcHNlLnBsYXRmb3JtLmRvYy5pc3YiIHZlcnNpb249IjMuMS4wIi8+CisJPHBsdWdpbiAgICBmcmFnbWVudD0iZmFsc2UiICBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIGlkPSJvcmcuZWNsaXBzZS5wbGF0Zm9ybS5zb3VyY2UiIHZlcnNpb249IjMuMS4wIi8+CisJPHBsdWdpbiB3cz0iZ3RrIiAgb3M9ImxpbnV4IiBmcmFnbWVudD0idHJ1ZSIgYXJjaD0iaWE2NCIgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiBpZD0ib3JnLmVjbGlwc2UucGxhdGZvcm0uc291cmNlLmxpbnV4Lmd0ay5pYTY0IiB2ZXJzaW9uPSIzLjEuMCIvPgorCTxwbHVnaW4gd3M9ImNhcmJvbiIgIG9zPSJtYWNvc3giIGZyYWdtZW50PSJ0cnVlIiBhcmNoPSJwcGMiIGRvd25sb2FkLXNpemU9IjAiIGluc3RhbGwtc2l6ZT0iMCIgaWQ9Im9yZy5lY2xpcHNlLnBsYXRmb3JtLnNvdXJjZS5tYWNvc3guY2FyYm9uLnBwYyIgdmVyc2lvbj0iMy4xLjAiLz4KKwk8cGx1Z2luIHdzPSJwaG90b24iICBvcz0icW54IiBmcmFnbWVudD0idHJ1ZSIgYXJjaD0ieDg2IiBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIGlkPSJvcmcuZWNsaXBzZS5wbGF0Zm9ybS5zb3VyY2UucW54LnBob3Rvbi54ODYiIHZlcnNpb249IjMuMS4wIi8+CisJPHBsdWdpbiB3cz0iZ3RrIiAgb3M9ImxpbnV4IiBmcmFnbWVudD0idHJ1ZSIgYXJjaD0icHBjIiBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIGlkPSJvcmcuZWNsaXBzZS5wbGF0Zm9ybS5zb3VyY2UubGludXguZ3RrLnBwYyIgdmVyc2lvbj0iMy4xLjAiLz4KKwk8cGx1Z2luIHdzPSJtb3RpZiIgIG9zPSJocHV4IiBmcmFnbWVudD0idHJ1ZSIgYXJjaD0iUEFfUklTQyIgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiBpZD0ib3JnLmVjbGlwc2UucGxhdGZvcm0uc291cmNlLmhwdXgubW90aWYuUEFfUklTQyIgdmVyc2lvbj0iMy4xLjAiLz4KKwk8cGx1Z2luIHdzPSJtb3RpZiIgIG9zPSJhaXgiIGZyYWdtZW50PSJ0cnVlIiBhcmNoPSJwcGMiIGRvd25sb2FkLXNpemU9IjAiIGluc3RhbGwtc2l6ZT0iMCIgaWQ9Im9yZy5lY2xpcHNlLnBsYXRmb3JtLnNvdXJjZS5haXgubW90aWYucHBjIiB2ZXJzaW9uPSIzLjEuMCIvPgorCTxwbHVnaW4gd3M9Imd0ayIgIG9zPSJsaW51eCIgZnJhZ21lbnQ9InRydWUiIGFyY2g9Ing4NiIgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiBpZD0ib3JnLmVjbGlwc2UucGxhdGZvcm0uc291cmNlLmxpbnV4Lmd0ay54ODYiIHZlcnNpb249IjMuMS4wIi8+CisJPHBsdWdpbiB3cz0id2luMzIiICBvcz0id2luMzIiIGZyYWdtZW50PSJ0cnVlIiBhcmNoPSJ4ODYiIGRvd25sb2FkLXNpemU9IjAiIGluc3RhbGwtc2l6ZT0iMCIgaWQ9Im9yZy5lY2xpcHNlLnBsYXRmb3JtLnNvdXJjZS53aW4zMi53aW4zMi54ODYiIHZlcnNpb249IjMuMS4wIi8+CisJPHBsdWdpbiB3cz0ibW90aWYiICBvcz0ic29sYXJpcyIgZnJhZ21lbnQ9InRydWUiIGFyY2g9InNwYXJjIiBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIGlkPSJvcmcuZWNsaXBzZS5wbGF0Zm9ybS5zb3VyY2Uuc29sYXJpcy5tb3RpZi5zcGFyYyIgdmVyc2lvbj0iMy4xLjAiLz4KKwk8cGx1Z2luIHdzPSJndGsiICBvcz0ibGludXgiIGZyYWdtZW50PSJ0cnVlIiBhcmNoPSJhbWQ2NCIgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiBpZD0ib3JnLmVjbGlwc2UucGxhdGZvcm0uc291cmNlLmxpbnV4Lmd0ay5hbWQ2NCIgdmVyc2lvbj0iMy4xLjAiLz4KKwk8cGx1Z2luIHdzPSJtb3RpZiIgIG9zPSJsaW51eCIgZnJhZ21lbnQ9InRydWUiIGFyY2g9Ing4NiIgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiBpZD0ib3JnLmVjbGlwc2UucGxhdGZvcm0uc291cmNlLmxpbnV4Lm1vdGlmLng4NiIgdmVyc2lvbj0iMy4xLjAiLz4KKzwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5zb3VyY2UtZmVhdHVyZS9saWNlbnNlLmh0bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGxhdGZvcm0uc291cmNlLWZlYXR1cmUvbGljZW5zZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ZDg1MDAKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGxhdGZvcm0uc291cmNlLWZlYXR1cmUvbGljZW5zZS5odG1sCkBAIC0wLDAgKzEsNzIgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KKzxodG1sPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Cis8dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KKzxoMj5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Cis8cD4xNTxzdXA+dGg8L3N1cD4gSnVuZSwgMjAwNDwvcD4KKworPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgorCis8cD5FQ0xJUFNFLk9SRyBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCisgICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAorICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQorICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKKyAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAorICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgorICAgCis8aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCisgICAKKzxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSBFY2xpcHNlLm9yZyBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKKyAgICgmcXVvdDtDUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBDUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4uCisgICBGb3IgcHVycG9zZXMgb2YgdGhlIENQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgorCis8cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUworICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+CisKKzxwPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLiBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mICB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiAgIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMKKyAgIG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LjwvcD4KKyAgCis8cD5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIEZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L3A+CisgIAorPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKK0luY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKK2luY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KKworPHVsPgorCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgorCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+CisJPGxpPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgorCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KKzwvdWw+CisJCQorPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IEVjbGlwc2Uub3JnIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCitpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgoraW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7LgorU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KK3RoYXQgZGlyZWN0b3J5LjwvcD4KKworPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBDUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQorT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+CisKKzx1bD4KKwk8bGk+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4pPC9saT4KKwk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgorCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKKwk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgorCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Cis8L3VsPgorCis8cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCitjb250YWN0IEVjbGlwc2Uub3JnIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+CisKKzxoMz5DcnlwdG9ncmFwaHk8L2gzPgorCis8cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCisgICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKKyAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnNkay1mZWF0dXJlLy5wcm9qZWN0IGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnNkay1mZWF0dXJlLy5wcm9qZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZjdkNzkKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2Uuc2RrLWZlYXR1cmUvLnByb2plY3QKQEAgLTAsMCArMSwxNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxwcm9qZWN0RGVzY3JpcHRpb24+CisJPG5hbWU+b3JnLmVjbGlwc2Uuc2RrLWZlYXR1cmU8L25hbWU+CisJPGNvbW1lbnQ+PC9jb21tZW50PgorCTxwcm9qZWN0cz4KKwk8L3Byb2plY3RzPgorCTxidWlsZFNwZWM+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCTwvYnVpbGRTcGVjPgorCTxuYXR1cmVzPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+CisJPC9uYXR1cmVzPgorPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2Uuc2RrLWZlYXR1cmUvY3BsLXYxMC5odG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnNkay1mZWF0dXJlL2NwbC12MTAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmFhMjA4Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnNkay1mZWF0dXJlL2NwbC12MTAuaHRtbApAQCAtMCwwICsxLDEyNSBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgorPEhUTUw+Cis8SEVBRD4KKzxUSVRMRT5Db21tb24gUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvVElUTEU+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzwvSEVBRD4KKworPEJPRFkgQkdDT0xPUj0iI0ZGRkZGRiIgVkxJTks9IiM4MDAwMDAiPgorCisKKzxQIEFMSUdOPSJDRU5URVIiPjxCPkNvbW1vbiBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9CPgorPFA+PEI+PC9CPjxGT05UIFNJWkU9IjMiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjMiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIgVEhFIFRFUk1TIE9GIFRISVMgQ09NTU9OIFBVQkxJQyBMSUNFTlNFICgiQUdSRUVNRU5UIikuICBBTlkgVVNFLCBSRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UgT0YgVEhJUyBBR1JFRU1FTlQuPC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PEI+MS4gIERFRklOSVRJT05TPC9CPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPiJDb250cmlidXRpb24iIG1lYW5zOjwvRk9OVD4KKworPFVMPjxGT05UIFNJWkU9IjIiPmEpIGluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uIGRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8QlIgQ0xFQVI9IkxFRlQiPgorYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj5pKQkgCWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj5paSkJCWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiI+d2hlcmUgc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZCBieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+QSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvciBpZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbiBzdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPkNvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIHdoaWNoOiAgKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFByb2dyYW0uICA8L0ZPTlQ+PC9VTD4KKworPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+IkNvbnRyaWJ1dG9yIiBtZWFucyBhbnkgcGVyc29uIG9yIGVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj4iTGljZW5zZWQgUGF0ZW50cyAiIG1lYW4gcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlIG9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uICA8L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPiJQcm9ncmFtIiBtZWFucyB0aGUgQ29udHJpYnV0aW9ucyBkaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+IlJlY2lwaWVudCIgbWVhbnMgYW55b25lIHdobyByZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PEI+PC9CPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjxCPjIuICBHUkFOVCBPRiBSSUdIVFM8L0I+PC9GT05UPgorCis8VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPmEpCTwvRk9OVD48Rk9OVCBTSVpFPSIyIj5TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzPC9GT05UPjxGT05UIFNJWkU9IjIiPiBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iI0ZGMDAwMCI+IDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uPC9GT05UPjwvVUw+CisKKworPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+YikgCVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgPC9GT05UPjxGT05UIFNJWkU9IjIiPlJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDgwMDAiPiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+cm95YWx0eS1mcmVlIHBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uICBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZCBieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbiB0byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiAgVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0byBhbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gIE5vIGhhcmR3YXJlIHBlciBzZSBpcyBsaWNlbnNlZCBoZXJldW5kZXIuICAgPC9GT05UPjwvVUw+CisKKworPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj5jKQlSZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzIENvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yIHRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuICBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudCBmb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuICBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kIGxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5IHRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gIEZvciBleGFtcGxlLCBpZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiI+ZCkJRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQgcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbiB0aGlzIEFncmVlbWVudC4gPC9GT05UPjwvVUw+CisKKworPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgorCis8UD48Rk9OVCBTSVpFPSIyIj48Qj4zLiAgUkVRVUlSRU1FTlRTPC9CPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjxCPjwvQj5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9GT05UPgorCis8VUw+PEZPTlQgU0laRT0iMiI+YSkJaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj5iKQlpdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9GT05UPjwvVUw+CisKKworPFVMPjxGT05UIFNJWkU9IjIiPmkpCWVmZmVjdGl2ZWx5IGRpc2NsYWltczwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kIGNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUgYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiI+aWkpIAllZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoIGFzIGxvc3QgcHJvZml0czsgPC9GT05UPjwvVUw+CisKKworPFVMPjxGT05UIFNJWkU9IjIiPmlpaSk8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+CXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQgQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj5pdikJc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZCBpbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiNGRjAwMDAiPjwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iI0ZGMDAwMCI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgorCis8UD48Rk9OVCBTSVpFPSIyIj5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZSBjb2RlIGZvcm06PC9GT05UPgorCis8VUw+PEZPTlQgU0laRT0iMiI+YSkJaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj5iKQlhIGNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gIDwvRk9OVD48L1VMPgorCis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPjxTVFJJS0U+PC9TVFJJS0U+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPjxTVFJJS0U+PC9TVFJJS0U+PC9GT05UPjxGT05UIFNJWkU9IjIiPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkgY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gIDwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlIG9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzIHN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiAgPC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PEI+NC4gIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9CPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heSBhY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzIGFuZCB0aGUgbGlrZS4gIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZSBvZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbCBsaWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gICBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCJDb21tZXJjaWFsIENvbnRyaWJ1dG9yIikgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlciBDb250cmlidXRvciAoIkluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIikgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZCBjb3N0cyAoY29sbGVjdGl2ZWx5ICJMb3NzZXMiKSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIgbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8gdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiBjb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZy4gIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzIHJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiAgSW4gb3JkZXIgdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kIGFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiAgVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZSBpbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiAgVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEgQ29tbWVyY2lhbCBDb250cmlidXRvci4gIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlIGNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuICBVbmRlciB0aGlzIHNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZSBvdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhIGNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjxCPjUuICBOTyBXQVJSQU5UWTwvQj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXM8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj50aGUgUHJvZ3JhbTwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50PC9GT05UPjxGT05UIFNJWkU9IjIiPiwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLCBjb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+cHJvZ3JhbXMgb3IgZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnM8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+LiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48Qj42LiAgRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L0I+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+KElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSw8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PEI+Ny4gIEdFTkVSQUw8L0I+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQgZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUgbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYSBDb250cmlidXRvciB3aXRoIHJlc3BlY3QgdG8gYSBwYXRlbnQgYXBwbGljYWJsZSB0byBzb2Z0d2FyZSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCksIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcyBncmFudGVkIGJ5IHRoYXQgQ29udHJpYnV0b3IgdG8gc3VjaCBSZWNpcGllbnQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gIEluIGFkZGl0aW9uLCBpZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGggb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoIFJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvciBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUgcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiAgSWYgYWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiAgSG93ZXZlciwgUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5IFJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzIGNvcHlyaWdodGVkICBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQgU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gPC9GT05UPjxGT05UIFNJWkU9IjIiPnB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZiB0aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gPC9GT05UPjxGT05UIFNJWkU9IjIiPnRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMgdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gSUJNIGlzIHRoZSBpbml0aWFsIEFncmVlbWVudCBTdGV3YXJkLiAgIElCTSBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0byBzZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+RWFjaCBuZXcgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIFRoZSBQcm9ncmFtIChpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+dmVyc2lvbi4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5FeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZCBpbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyIGV4cHJlc3NseSwgPC9GT05UPjxGT05UIFNJWkU9IjIiPmJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2U8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+LjwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90IGV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUgU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMgQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiAgRWFjaCBwYXJ0eSB3YWl2ZXMgaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+CisKKzwvQk9EWT4KKworPC9IVE1MPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5zZGstZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnNkay1mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhlM2UwMgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5zZGstZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5zZGstZmVhdHVyZS9mZWF0dXJlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5zZGstZmVhdHVyZS9mZWF0dXJlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjk5MDRjCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnNkay1mZWF0dXJlL2ZlYXR1cmUueG1sCkBAIC0wLDAgKzEsMzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8ZmVhdHVyZQorICAgICAgaWQ9Im9yZy5lY2xpcHNlLnNkayIKKyAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCisgICAgICB2ZXJzaW9uPSIzLjEuMCIKKyAgICAgIGltYWdlPSAiZWNsaXBzZV91cGRhdGVfMTIwLmpwZyIKKyAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgorCisgICA8ZGVzY3JpcHRpb24+CisgICAgICAlZGVzY3JpcHRpb24KKyAgIDwvZGVzY3JpcHRpb24+CisgICAKKyAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgorICAgICAlbGljZW5zZQorICAgPC9saWNlbnNlPgorCisgICA8dXJsPgorICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly91cGRhdGUuZWNsaXBzZS5vcmcvdXBkYXRlcy8zLjAiLz4KKyAgICAgIDxkaXNjb3ZlcnkgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vdXBkYXRlLmVjbGlwc2Uub3JnL3VwZGF0ZXMvMy4wIi8+CisgICA8L3VybD4KKworICA8aW5jbHVkZXMgaWQ9Im9yZy5lY2xpcHNlLnBsYXRmb3JtIiB2ZXJzaW9uPSIzLjEuMCIgLz4gCisgIDxpbmNsdWRlcyBpZD0ib3JnLmVjbGlwc2UucGxhdGZvcm0uc291cmNlIiB2ZXJzaW9uPSIzLjEuMCIgLz4gCisgIDxpbmNsdWRlcyBpZD0ib3JnLmVjbGlwc2UuamR0IiB2ZXJzaW9uPSIzLjEuMCIgLz4KKyAgPGluY2x1ZGVzIGlkPSJvcmcuZWNsaXBzZS5qZHQuc291cmNlIiB2ZXJzaW9uPSIzLjEuMCIgLz4gCisgIDxpbmNsdWRlcyBpZD0ib3JnLmVjbGlwc2UucGRlIiB2ZXJzaW9uPSIzLjEuMCIgLz4gCisgIDxpbmNsdWRlcyBpZD0ib3JnLmVjbGlwc2UucGRlLnNvdXJjZSIgdmVyc2lvbj0iMy4xLjAiIC8+IAorICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5zZGsiIHZlcnNpb249IjMuMS4wIi8+CisgIAorPC9mZWF0dXJlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5zZGstZmVhdHVyZS9saWNlbnNlLmh0bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2Uuc2RrLWZlYXR1cmUvbGljZW5zZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ZDg1MDAKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2Uuc2RrLWZlYXR1cmUvbGljZW5zZS5odG1sCkBAIC0wLDAgKzEsNzIgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KKzxodG1sPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Cis8dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KKzxoMj5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Cis8cD4xNTxzdXA+dGg8L3N1cD4gSnVuZSwgMjAwNDwvcD4KKworPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgorCis8cD5FQ0xJUFNFLk9SRyBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCisgICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAorICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQorICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKKyAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAorICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgorICAgCis8aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCisgICAKKzxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSBFY2xpcHNlLm9yZyBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKKyAgICgmcXVvdDtDUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBDUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4uCisgICBGb3IgcHVycG9zZXMgb2YgdGhlIENQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgorCis8cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUworICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+CisKKzxwPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLiBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mICB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiAgIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMKKyAgIG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LjwvcD4KKyAgCis8cD5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIEZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L3A+CisgIAorPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKK0luY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKK2luY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KKworPHVsPgorCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgorCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+CisJPGxpPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgorCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KKzwvdWw+CisJCQorPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IEVjbGlwc2Uub3JnIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCitpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgoraW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7LgorU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KK3RoYXQgZGlyZWN0b3J5LjwvcD4KKworPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBDUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQorT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+CisKKzx1bD4KKwk8bGk+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4pPC9saT4KKwk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgorCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKKwk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgorCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Cis8L3VsPgorCis8cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCitjb250YWN0IEVjbGlwc2Uub3JnIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+CisKKzxoMz5DcnlwdG9ncmFwaHk8L2gzPgorCis8cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCisgICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKKyAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnhzZC5kb2NfMi4wLjAvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UueHNkLmRvY18yLjAuMC9NRVRBLUlORi9NQU5JRkVTVC5NRgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTQ5OWJjCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnhzZC5kb2NfMi4wLjAvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTAsMCArMSwyIEBACitNYW5pZmVzdC1WZXJzaW9uOiAxLjAKKwpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnhzZC5kb2NfMi4wLjAvY3BsLXYxMC5odG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnhzZC5kb2NfMi4wLjAvY3BsLXYxMC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2YWEyMDgKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UueHNkLmRvY18yLjAuMC9jcGwtdjEwLmh0bWwKQEAgLTAsMCArMSwxMjUgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KKzxIVE1MPgorPEhFQUQ+Cis8VElUTEU+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L1RJVExFPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Cis8L0hFQUQ+CisKKzxCT0RZIEJHQ09MT1I9IiNGRkZGRkYiIFZMSU5LPSIjODAwMDAwIj4KKworCis8UCBBTElHTj0iQ0VOVEVSIj48Qj5Db21tb24gUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvQj4KKzxQPjxCPjwvQj48Rk9OVCBTSVpFPSIzIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIzIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSIFRIRSBURVJNUyBPRiBUSElTIENPTU1PTiBQVUJMSUMgTElDRU5TRSAoIkFHUkVFTUVOVCIpLiAgQU5ZIFVTRSwgUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFIE9GIFRISVMgQUdSRUVNRU5ULjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjxCPjEuICBERUZJTklUSU9OUzwvQj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj4iQ29udHJpYnV0aW9uIiBtZWFuczo8L0ZPTlQ+CisKKzxVTD48Rk9OVCBTSVpFPSIyIj5hKSBpbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbiBkaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPEJSIENMRUFSPSJMRUZUIj4KK2IpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiI+aSkJIAljaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiI+aWkpCQlhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9GT05UPjwvVUw+CisKKworPFVMPjxGT05UIFNJWkU9IjIiPndoZXJlIHN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQgYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPkEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IgaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24gc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5Db250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSB3aGljaDogIChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBQcm9ncmFtLiAgPC9GT05UPjwvVUw+CisKKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPiJDb250cmlidXRvciIgbWVhbnMgYW55IHBlcnNvbiBvciBlbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+IkxpY2Vuc2VkIFBhdGVudHMgIiBtZWFuIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZSBvciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiAgPC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj4iUHJvZ3JhbSIgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMgZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50LjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPiJSZWNpcGllbnQiIG1lYW5zIGFueW9uZSB3aG8gcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjxCPjwvQj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48Qj4yLiAgR1JBTlQgT0YgUklHSFRTPC9CPjwvRk9OVD4KKworPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5hKQk8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+U3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50czwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiNGRjAwMDAiPiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLjwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPmIpIAlTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDA4MDAwIj4gPC9GT05UPjxGT05UIFNJWkU9IjIiPnJveWFsdHktZnJlZSBwYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0IGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiAgVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQgYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24gdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8gYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uICBObyBoYXJkd2FyZSBwZXIgc2UgaXMgbGljZW5zZWQgaGVyZXVuZGVyLiAgIDwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiI+YykJUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cyBDb250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvciB0aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiAgRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQgZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiAgQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZCBsaWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eSB0byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuICBGb3IgZXhhbXBsZSwgaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjwvVUw+CisKKworPFVMPjxGT05UIFNJWkU9IjIiPmQpCUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0IHJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4gdGhpcyBBZ3JlZW1lbnQuIDwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KKworPFA+PEZPTlQgU0laRT0iMiI+PEI+My4gIFJFUVVJUkVNRU5UUzwvQj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48Qj48L0I+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0OjwvRk9OVD4KKworPFVMPjxGT05UIFNJWkU9IjIiPmEpCWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiI+YikJaXRzIGxpY2Vuc2UgYWdyZWVtZW50OjwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj5pKQllZmZlY3RpdmVseSBkaXNjbGFpbXM8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZCBjb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlIGFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9GT05UPjwvVUw+CisKKworPFVMPjxGT05UIFNJWkU9IjIiPmlpKSAJZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaCBhcyBsb3N0IHByb2ZpdHM7IDwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj5paWkpPC9GT05UPjxGT05UIFNJWkU9IjIiPglzdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0IENvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiI+aXYpCXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQgaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj4gPC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjRkYwMDAwIj48L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiNGRjAwMDAiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KKworPFA+PEZPTlQgU0laRT0iMiI+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UgY29kZSBmb3JtOjwvRk9OVD4KKworPFVMPjxGT05UIFNJWkU9IjIiPmEpCWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiI+YikJYSBjb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uICA8L0ZPTlQ+PC9VTD4KKworPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj48U1RSSUtFPjwvU1RSSUtFPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj48U1RSSUtFPjwvU1RSSUtFPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55IGNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uICA8L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZSBvcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cyBzdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gIDwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjxCPjQuICBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvQj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkgYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycyBhbmQgdGhlIGxpa2UuICBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2Ugb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwgbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuICAgVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgiQ29tbWVyY2lhbCBDb250cmlidXRvciIpIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIgQ29udHJpYnV0b3IgKCJJbmRlbW5pZmllZCBDb250cmlidXRvciIpIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQgY29zdHMgKGNvbGxlY3RpdmVseSAiTG9zc2VzIikgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyIGxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvIHRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcuICBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcyByZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gIEluIG9yZGVyIHRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB0byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZCBhbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUgaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhIENvbW1lcmNpYWwgQ29udHJpYnV0b3IuICBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZSBjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiAgVW5kZXIgdGhpcyBzZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUgb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYSBjb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48Qj41LiAgTk8gV0FSUkFOVFk8L0I+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzPC9GT05UPjxGT05UIFNJWkU9IjIiPiBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+dGhlIFByb2dyYW08L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudDwvRk9OVD48Rk9OVCBTSVpFPSIyIj4sIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywgY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgPC9GT05UPjxGT05UIFNJWkU9IjIiPnByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zPC9GT05UPjxGT05UIFNJWkU9IjIiPi4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PEI+Ni4gIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9CPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgPC9GT05UPjxGT05UIFNJWkU9IjIiPihJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksPC9GT05UPjxGT05UIFNJWkU9IjIiPiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjxCPjcuICBHRU5FUkFMPC9CPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0IGZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlIG1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGEgQ29udHJpYnV0b3Igd2l0aCByZXNwZWN0IHRvIGEgcGF0ZW50IGFwcGxpY2FibGUgdG8gc29mdHdhcmUgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpLCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMgZ3JhbnRlZCBieSB0aGF0IENvbnRyaWJ1dG9yIHRvIHN1Y2ggUmVjaXBpZW50IHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuICBJbiBhZGRpdGlvbiwgaWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoIG90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaCBSZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlIHBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gIElmIGFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gIEhvd2V2ZXIsIFJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieSBSZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcyBjb3B5cmlnaHRlZCAgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50IFN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5wdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YgdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj50aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzIHRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIElCTSBpcyB0aGUgaW5pdGlhbCBBZ3JlZW1lbnQgU3Rld2FyZC4gICBJQk0gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8gc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPkVhY2ggbmV3IHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBUaGUgUHJvZ3JhbSAoaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgPC9GT05UPjxGT05UIFNJWkU9IjIiPnZlcnNpb24uICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+RXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQgaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0byB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlciBleHByZXNzbHksIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5ieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlPC9GT05UPjxGT05UIFNJWkU9IjIiPi48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+ICBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdCBleHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlIFN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzIEFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gIEVhY2ggcGFydHkgd2FpdmVzIGl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorCis8L0JPRFk+CisKKzwvSFRNTD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UueHNkLmRvY18yLjAuMC9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnhzZC5kb2NfMi4wLjAvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGUzZTAyCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnhzZC5kb2NfMi4wLjAvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UueHNkLmRvY18yLjAuMC9mZWF0dXJlLnByb3BlcnRpZXMgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UueHNkLmRvY18yLjAuMC9mZWF0dXJlLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRjMWQ1NgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS54c2QuZG9jXzIuMC4wL2ZlYXR1cmUucHJvcGVydGllcwpAQCAtMCwwICsxLDE1MSBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisjIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjCisjIENvbnRyaWJ1dG9yczoKKyMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAvKioKKyMgICogPGNvcHlyaWdodD4KKyMgICoKKyMgICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisjICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworIyAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAorIyAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyAgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAorIyAgKiAKKyMgICogQ29udHJpYnV0b3JzOiAKKyMgICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyMgICoKKyMgICogPC9jb3B5cmlnaHQ+CisjICAqCisjICAqICRJZDogZmVhdHVyZS5wcm9wZXJ0aWVzLHYgMS4xIDIwMDQvMTAvMTggMTU6NTA6NDIgZGJpcnNhbiBFeHAgJAorIyAgKi8KKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgRG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlIGxhc3QgbGluZSBjb250YWluaW5nOgorIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKKyMgSW5zdGVhZCwgZWl0aGVyIHJlZGVmaW5lIGFuIGV4aXN0aW5nIHByb3BlcnR5LCBvciBjcmVhdGUgYSBuZXcgcHJvcGVydHksCisjIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbmQgY2hhbmdlIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IG5hbWUuCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjIFRoaXMgZmlsZSBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKKyMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCisjIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCisjIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KKworIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQorZmVhdHVyZU5hbWU9WE1MIFNjaGVtYSBJbmZvc2V0IE1vZGVsIChYU0QpIERvY3VtZW50YXRpb24KKworIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQorcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCisKKyMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKK3VwZGF0ZVNpdGVOYW1lPUVjbGlwc2Uub3JnIHVwZGF0ZSBzaXRlCisKKyMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCitkZXNjcmlwdGlvbj1FY2xpcHNlIE1vZGVsaW5nIEZyYW1ld29yay4gKGRvY3VtZW50YXRpb24pCisKKyMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgorIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCitsaWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAorCisjICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgorIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCitsaWNlbnNlPVwKK0VDTElQU0UuT1JHIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCisxNHRoIEF1Z3VzdCwgMjAwM1xuXAorXG5cCitVc2FnZSBPZiBDb250ZW50XG5cCitcblwKK0VDTElQU0UuT1JHIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCitPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKK1VTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAorQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCitOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCitBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCitBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAorT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKK1RFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKK09GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCitCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCitcblwKK0FwcGxpY2FibGUgTGljZW5zZXNcblwKK1xuXAorVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IEVjbGlwc2Uub3JnXG5cCitpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBDb21tb24gUHVibGljXG5cCitMaWNlbnNlIFZlcnNpb24gMS4wICgiQ1BMIikuIEEgY29weSBvZiB0aGUgQ1BMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAorQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwuXG5cCitGb3IgcHVycG9zZXMgb2YgdGhlIENQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKK1xuXAorQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCitkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKK3JlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCithcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKK1xuXAorQ29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzXG5cCisoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLiBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yXG5cCittb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkXG5cCisiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGVcblwKK1BsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gUGx1Zy1pbnMgYW5kIEZyYWdtZW50c1xuXAorYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpblxuXAorZGlyZWN0b3JpZXMgbmFtZWQgImZlYXR1cmVzIi5cblwKK1xuXAorRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCisiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAorSW5jbHVkZWQgRmVhdHVyZXMuXG5cCitcblwKK1RoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKK2NvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAorY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKK2luIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKK0xpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKK2luY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAorXG5cCisgICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAorICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAorICAgLSBTdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKKyAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAorXG5cCitOb3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgRWNsaXBzZS5vcmcgaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAorRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKK0xpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAorSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKK3dpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCit5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCit0aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKK0ZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAorY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCit1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKK1xuXAorVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCitUTyBUSEUgQ1BMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKK1NPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKK1xuXAorICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCisgICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCisgICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKKyAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCitcblwKK0lUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKK1RPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCitpcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgRWNsaXBzZS5vcmcgdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKK2dvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKK1xuXAorQ3J5cHRvZ3JhcGh5XG5cCitcblwKK0NvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAorY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAorYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAordXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCityZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCithbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cbgorIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQorIyBUaGUgYWJvdmUgcHJvcGVydGllcyBoYXZlIGJlZW4gc2hpcHBlZCBmb3IgdHJhbnNsYXRpb24uCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnhzZC5kb2NfMi4wLjAvZmVhdHVyZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UueHNkLmRvY18yLjAuMC9mZWF0dXJlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTRmMzgwCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnhzZC5kb2NfMi4wLjAvZmVhdHVyZS54bWwKQEAgLTAsMCArMSw0OCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKworPCEtLQorLyoqCisgKiA8Y29weXJpZ2h0PgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczogCisgKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoKKyAqIDwvY29weXJpZ2h0PgorICoKKyAqICRJZDogZmVhdHVyZS54bWwsdiAxLjEgMjAwNC8wMy8wNiAxODowMDowOSBtYXJjZWxvcCBFeHAgJAorICovCistLT4KKworPGZlYXR1cmUKKyAgICAgIGlkPSJvcmcuZWNsaXBzZS54c2QuZG9jIgorICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKKyAgICAgIHZlcnNpb249IjIuMC4wIgorICAgICAgaW1hZ2U9ICJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIgorICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+CisKKyAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICVkZXNjcmlwdGlvbgorICAgPC9kZXNjcmlwdGlvbj4KKworICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+CisgICAgICVsaWNlbnNlCisgICA8L2xpY2Vuc2U+CisKKyAgIDx1cmw+CisgICAgICA8dXBkYXRlIHVybD0iaHR0cDovL3VwZGF0ZS5lY2xpcHNlLm9yZy91cGRhdGVzIiBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIi8+CisgICA8L3VybD4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnhzZC5kb2MiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMi4wLjAiPgorICAgPC9wbHVnaW4+CisgICAJCQorPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnhzZC5kb2NfMi4wLjAvbGljZW5zZS5odG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnhzZC5kb2NfMi4wLjAvbGljZW5zZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmOGMzODAKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UueHNkLmRvY18yLjAuMC9saWNlbnNlLmh0bWwKQEAgLTAsMCArMSw3MSBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgorPGh0bWw+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgorPGgyPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KKzxwPjE0dGggQXVndXN0LCAyMDAzPC9wPgorCis8aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+CisKKzxwPkVDTElQU0UuT1JHIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKKyAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECisgICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCisgICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgorICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECisgICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+CisgICAKKzxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKKyAgIAorPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IEVjbGlwc2Uub3JnIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAorICAgKCZxdW90O0NQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIENQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPi4KKyAgIEZvciBwdXJwb3NlcyBvZiB0aGUgQ1BMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CisKKzxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCisgICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KKworPHA+Q29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBGaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCBhIEZlYXR1cmUuICAgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcworICAgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90OyBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuPC9wPgorICAKKzxwPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gRmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvcD4KKyAgCis8cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAorSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQoraW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgorCis8dWw+CisJPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+CisJPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KKwk8bGk+U3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+CisJPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgorPC91bD4KKwkJCis8cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgRWNsaXBzZS5vcmcgaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKK2luc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCitpbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsuCitTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgordGhhdCBkaXJlY3RvcnkuPC9wPgorCis8cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIENQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCitPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KKworPHVsPgorCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+CisJPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQorCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+CisJPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KKzwvdWw+CisKKzxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKK2NvbnRhY3QgRWNsaXBzZS5vcmcgdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KKworPGgzPkNyeXB0b2dyYXBoeTwvaDM+CisKKzxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KKyAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAorICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnhzZC5zb3VyY2VfMi4wLjAvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UueHNkLnNvdXJjZV8yLjAuMC9NRVRBLUlORi9NQU5JRkVTVC5NRgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTQ5OWJjCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnhzZC5zb3VyY2VfMi4wLjAvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTAsMCArMSwyIEBACitNYW5pZmVzdC1WZXJzaW9uOiAxLjAKKwpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnhzZC5zb3VyY2VfMi4wLjAvY3BsLXYxMC5odG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnhzZC5zb3VyY2VfMi4wLjAvY3BsLXYxMC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2YWEyMDgKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UueHNkLnNvdXJjZV8yLjAuMC9jcGwtdjEwLmh0bWwKQEAgLTAsMCArMSwxMjUgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KKzxIVE1MPgorPEhFQUQ+Cis8VElUTEU+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L1RJVExFPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Cis8L0hFQUQ+CisKKzxCT0RZIEJHQ09MT1I9IiNGRkZGRkYiIFZMSU5LPSIjODAwMDAwIj4KKworCis8UCBBTElHTj0iQ0VOVEVSIj48Qj5Db21tb24gUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvQj4KKzxQPjxCPjwvQj48Rk9OVCBTSVpFPSIzIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIzIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSIFRIRSBURVJNUyBPRiBUSElTIENPTU1PTiBQVUJMSUMgTElDRU5TRSAoIkFHUkVFTUVOVCIpLiAgQU5ZIFVTRSwgUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFIE9GIFRISVMgQUdSRUVNRU5ULjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjxCPjEuICBERUZJTklUSU9OUzwvQj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj4iQ29udHJpYnV0aW9uIiBtZWFuczo8L0ZPTlQ+CisKKzxVTD48Rk9OVCBTSVpFPSIyIj5hKSBpbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbiBkaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPEJSIENMRUFSPSJMRUZUIj4KK2IpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiI+aSkJIAljaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiI+aWkpCQlhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9GT05UPjwvVUw+CisKKworPFVMPjxGT05UIFNJWkU9IjIiPndoZXJlIHN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQgYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPkEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IgaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24gc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5Db250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSB3aGljaDogIChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBQcm9ncmFtLiAgPC9GT05UPjwvVUw+CisKKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPiJDb250cmlidXRvciIgbWVhbnMgYW55IHBlcnNvbiBvciBlbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+IkxpY2Vuc2VkIFBhdGVudHMgIiBtZWFuIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZSBvciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiAgPC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj4iUHJvZ3JhbSIgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMgZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50LjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPiJSZWNpcGllbnQiIG1lYW5zIGFueW9uZSB3aG8gcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjxCPjwvQj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48Qj4yLiAgR1JBTlQgT0YgUklHSFRTPC9CPjwvRk9OVD4KKworPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5hKQk8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+U3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50czwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiNGRjAwMDAiPiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLjwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPmIpIAlTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDA4MDAwIj4gPC9GT05UPjxGT05UIFNJWkU9IjIiPnJveWFsdHktZnJlZSBwYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0IGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiAgVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQgYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24gdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8gYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uICBObyBoYXJkd2FyZSBwZXIgc2UgaXMgbGljZW5zZWQgaGVyZXVuZGVyLiAgIDwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiI+YykJUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cyBDb250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvciB0aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiAgRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQgZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiAgQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZCBsaWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eSB0byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuICBGb3IgZXhhbXBsZSwgaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjwvVUw+CisKKworPFVMPjxGT05UIFNJWkU9IjIiPmQpCUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0IHJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4gdGhpcyBBZ3JlZW1lbnQuIDwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KKworPFA+PEZPTlQgU0laRT0iMiI+PEI+My4gIFJFUVVJUkVNRU5UUzwvQj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48Qj48L0I+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0OjwvRk9OVD4KKworPFVMPjxGT05UIFNJWkU9IjIiPmEpCWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiI+YikJaXRzIGxpY2Vuc2UgYWdyZWVtZW50OjwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj5pKQllZmZlY3RpdmVseSBkaXNjbGFpbXM8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZCBjb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlIGFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9GT05UPjwvVUw+CisKKworPFVMPjxGT05UIFNJWkU9IjIiPmlpKSAJZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaCBhcyBsb3N0IHByb2ZpdHM7IDwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj5paWkpPC9GT05UPjxGT05UIFNJWkU9IjIiPglzdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0IENvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiI+aXYpCXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQgaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj4gPC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjRkYwMDAwIj48L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiNGRjAwMDAiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KKworPFA+PEZPTlQgU0laRT0iMiI+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UgY29kZSBmb3JtOjwvRk9OVD4KKworPFVMPjxGT05UIFNJWkU9IjIiPmEpCWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiI+YikJYSBjb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uICA8L0ZPTlQ+PC9VTD4KKworPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj48U1RSSUtFPjwvU1RSSUtFPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj48U1RSSUtFPjwvU1RSSUtFPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55IGNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uICA8L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZSBvcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cyBzdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gIDwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjxCPjQuICBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvQj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkgYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycyBhbmQgdGhlIGxpa2UuICBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2Ugb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwgbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuICAgVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgiQ29tbWVyY2lhbCBDb250cmlidXRvciIpIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIgQ29udHJpYnV0b3IgKCJJbmRlbW5pZmllZCBDb250cmlidXRvciIpIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQgY29zdHMgKGNvbGxlY3RpdmVseSAiTG9zc2VzIikgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyIGxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvIHRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcuICBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcyByZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gIEluIG9yZGVyIHRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB0byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZCBhbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUgaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhIENvbW1lcmNpYWwgQ29udHJpYnV0b3IuICBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZSBjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiAgVW5kZXIgdGhpcyBzZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUgb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYSBjb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48Qj41LiAgTk8gV0FSUkFOVFk8L0I+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzPC9GT05UPjxGT05UIFNJWkU9IjIiPiBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+dGhlIFByb2dyYW08L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudDwvRk9OVD48Rk9OVCBTSVpFPSIyIj4sIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywgY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgPC9GT05UPjxGT05UIFNJWkU9IjIiPnByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zPC9GT05UPjxGT05UIFNJWkU9IjIiPi4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PEI+Ni4gIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9CPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgPC9GT05UPjxGT05UIFNJWkU9IjIiPihJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksPC9GT05UPjxGT05UIFNJWkU9IjIiPiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjxCPjcuICBHRU5FUkFMPC9CPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0IGZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlIG1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGEgQ29udHJpYnV0b3Igd2l0aCByZXNwZWN0IHRvIGEgcGF0ZW50IGFwcGxpY2FibGUgdG8gc29mdHdhcmUgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpLCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMgZ3JhbnRlZCBieSB0aGF0IENvbnRyaWJ1dG9yIHRvIHN1Y2ggUmVjaXBpZW50IHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuICBJbiBhZGRpdGlvbiwgaWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoIG90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaCBSZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlIHBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gIElmIGFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gIEhvd2V2ZXIsIFJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieSBSZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcyBjb3B5cmlnaHRlZCAgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50IFN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5wdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YgdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj50aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzIHRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIElCTSBpcyB0aGUgaW5pdGlhbCBBZ3JlZW1lbnQgU3Rld2FyZC4gICBJQk0gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8gc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPkVhY2ggbmV3IHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBUaGUgUHJvZ3JhbSAoaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgPC9GT05UPjxGT05UIFNJWkU9IjIiPnZlcnNpb24uICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+RXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQgaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0byB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlciBleHByZXNzbHksIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5ieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlPC9GT05UPjxGT05UIFNJWkU9IjIiPi48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+ICBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdCBleHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlIFN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzIEFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gIEVhY2ggcGFydHkgd2FpdmVzIGl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorCis8L0JPRFk+CisKKzwvSFRNTD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UueHNkLnNvdXJjZV8yLjAuMC9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnhzZC5zb3VyY2VfMi4wLjAvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGUzZTAyCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnhzZC5zb3VyY2VfMi4wLjAvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UueHNkLnNvdXJjZV8yLjAuMC9mZWF0dXJlLnByb3BlcnRpZXMgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UueHNkLnNvdXJjZV8yLjAuMC9mZWF0dXJlLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgwNmFmMgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS54c2Quc291cmNlXzIuMC4wL2ZlYXR1cmUucHJvcGVydGllcwpAQCAtMCwwICsxLDE1MSBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisjIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjCisjIENvbnRyaWJ1dG9yczoKKyMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAvKioKKyMgICogPGNvcHlyaWdodD4KKyMgICoKKyMgICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisjICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworIyAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAorIyAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyAgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAorIyAgKiAKKyMgICogQ29udHJpYnV0b3JzOiAKKyMgICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyMgICoKKyMgICogPC9jb3B5cmlnaHQ+CisjICAqCisjICAqICRJZDogZmVhdHVyZS5wcm9wZXJ0aWVzLHYgMS4xIDIwMDQvMTAvMTggMTU6NTA6NDIgZGJpcnNhbiBFeHAgJAorIyAgKi8KKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgRG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlIGxhc3QgbGluZSBjb250YWluaW5nOgorIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKKyMgSW5zdGVhZCwgZWl0aGVyIHJlZGVmaW5lIGFuIGV4aXN0aW5nIHByb3BlcnR5LCBvciBjcmVhdGUgYSBuZXcgcHJvcGVydHksCisjIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbmQgY2hhbmdlIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IG5hbWUuCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjIFRoaXMgZmlsZSBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKKyMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCisjIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCisjIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KKworIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQorZmVhdHVyZU5hbWU9WE1MIFNjaGVtYSBJbmZvc2V0IE1vZGVsIChYU0QpIFNvdXJjZQorCisjICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCitwcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKKworIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQordXBkYXRlU2l0ZU5hbWU9RWNsaXBzZS5vcmcgdXBkYXRlIHNpdGUKKworIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKK2Rlc2NyaXB0aW9uPUVjbGlwc2UgTW9kZWxpbmcgRnJhbWV3b3JrLiAoc291cmNlIGNvZGUpCisKKyMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgorIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCitsaWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAorCisjICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgorIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCitsaWNlbnNlPVwKK0VDTElQU0UuT1JHIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCisxNHRoIEF1Z3VzdCwgMjAwM1xuXAorXG5cCitVc2FnZSBPZiBDb250ZW50XG5cCitcblwKK0VDTElQU0UuT1JHIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCitPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKK1VTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAorQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCitOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCitBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCitBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAorT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKK1RFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKK09GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCitCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCitcblwKK0FwcGxpY2FibGUgTGljZW5zZXNcblwKK1xuXAorVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IEVjbGlwc2Uub3JnXG5cCitpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBDb21tb24gUHVibGljXG5cCitMaWNlbnNlIFZlcnNpb24gMS4wICgiQ1BMIikuIEEgY29weSBvZiB0aGUgQ1BMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAorQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwuXG5cCitGb3IgcHVycG9zZXMgb2YgdGhlIENQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKK1xuXAorQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCitkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKK3JlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCithcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKK1xuXAorQ29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzXG5cCisoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLiBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yXG5cCittb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkXG5cCisiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGVcblwKK1BsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gUGx1Zy1pbnMgYW5kIEZyYWdtZW50c1xuXAorYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpblxuXAorZGlyZWN0b3JpZXMgbmFtZWQgImZlYXR1cmVzIi5cblwKK1xuXAorRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCisiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAorSW5jbHVkZWQgRmVhdHVyZXMuXG5cCitcblwKK1RoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKK2NvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAorY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKK2luIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKK0xpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKK2luY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAorXG5cCisgICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAorICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAorICAgLSBTdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKKyAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAorXG5cCitOb3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgRWNsaXBzZS5vcmcgaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAorRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKK0xpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAorSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKK3dpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCit5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCit0aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKK0ZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAorY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCit1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKK1xuXAorVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCitUTyBUSEUgQ1BMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKK1NPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKK1xuXAorICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCisgICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCisgICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKKyAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCitcblwKK0lUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKK1RPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCitpcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgRWNsaXBzZS5vcmcgdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKK2dvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKK1xuXAorQ3J5cHRvZ3JhcGh5XG5cCitcblwKK0NvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAorY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAorYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAordXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCityZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCithbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cbgorIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQorIyBUaGUgYWJvdmUgcHJvcGVydGllcyBoYXZlIGJlZW4gc2hpcHBlZCBmb3IgdHJhbnNsYXRpb24uCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnhzZC5zb3VyY2VfMi4wLjAvZmVhdHVyZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UueHNkLnNvdXJjZV8yLjAuMC9mZWF0dXJlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWYyYjc3Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnhzZC5zb3VyY2VfMi4wLjAvZmVhdHVyZS54bWwKQEAgLTAsMCArMSw0OCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKworPCEtLQorLyoqCisgKiA8Y29weXJpZ2h0PgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczogCisgKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoKKyAqIDwvY29weXJpZ2h0PgorICoKKyAqICRJZDogZmVhdHVyZS54bWwsdiAxLjEgMjAwNC8wMy8wNiAxODowMDoxMSBtYXJjZWxvcCBFeHAgJAorICovCistLT4KKworPGZlYXR1cmUKKyAgICAgIGlkPSJvcmcuZWNsaXBzZS54c2Quc291cmNlIgorICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKKyAgICAgIHZlcnNpb249IjIuMC4wIgorICAgICAgaW1hZ2U9ICJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIgorICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+CisKKyAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICVkZXNjcmlwdGlvbgorICAgPC9kZXNjcmlwdGlvbj4KKworICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+CisgICAgICVsaWNlbnNlCisgICA8L2xpY2Vuc2U+CisKKyAgIDx1cmw+CisgICAgICA8dXBkYXRlIHVybD0iaHR0cDovL3VwZGF0ZS5lY2xpcHNlLm9yZy91cGRhdGVzIiBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIi8+CisgICA8L3VybD4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnhzZC5zb3VyY2UiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMi4wLjAiPgorICAgPC9wbHVnaW4+CisgICAKKzwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS54c2Quc291cmNlXzIuMC4wL2xpY2Vuc2UuaHRtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS54c2Quc291cmNlXzIuMC4wL2xpY2Vuc2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjhjMzgwCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnhzZC5zb3VyY2VfMi4wLjAvbGljZW5zZS5odG1sCkBAIC0wLDAgKzEsNzEgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KKzxodG1sPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Cis8dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KKzxoMj5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Cis8cD4xNHRoIEF1Z3VzdCwgMjAwMzwvcD4KKworPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgorCis8cD5FQ0xJUFNFLk9SRyBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCisgICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAorICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQorICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKKyAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAorICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgorICAgCis8aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCisgICAKKzxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSBFY2xpcHNlLm9yZyBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKKyAgICgmcXVvdDtDUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBDUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4uCisgICBGb3IgcHVycG9zZXMgb2YgdGhlIENQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgorCis8cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUworICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+CisKKzxwPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLiBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mICB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiAgIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMKKyAgIG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LjwvcD4KKyAgCis8cD5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIEZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L3A+CisgIAorPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKK0luY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKK2luY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KKworPHVsPgorCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgorCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+CisJPGxpPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgorCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KKzwvdWw+CisJCQorPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IEVjbGlwc2Uub3JnIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCitpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgoraW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7LgorU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KK3RoYXQgZGlyZWN0b3J5LjwvcD4KKworPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBDUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQorT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+CisKKzx1bD4KKwk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgorCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKKwk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgorCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Cis8L3VsPgorCis8cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCitjb250YWN0IEVjbGlwc2Uub3JnIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+CisKKzxoMz5DcnlwdG9ncmFwaHk8L2gzPgorCis8cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCisgICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKKyAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgorPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS54c2RfMi4wLjAvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UueHNkXzIuMC4wL01FVEEtSU5GL01BTklGRVNULk1GCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5NDk5YmMKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UueHNkXzIuMC4wL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0wLDAgKzEsMiBAQAorTWFuaWZlc3QtVmVyc2lvbjogMS4wCisKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS54c2RfMi4wLjAvY3BsLXYxMC5odG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnhzZF8yLjAuMC9jcGwtdjEwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZhYTIwOAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS54c2RfMi4wLjAvY3BsLXYxMC5odG1sCkBAIC0wLDAgKzEsMTI1IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Cis8SFRNTD4KKzxIRUFEPgorPFRJVExFPkNvbW1vbiBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9USVRMRT4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorPC9IRUFEPgorCis8Qk9EWSBCR0NPTE9SPSIjRkZGRkZGIiBWTElOSz0iIzgwMDAwMCI+CisKKworPFAgQUxJR049IkNFTlRFUiI+PEI+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L0I+Cis8UD48Qj48L0I+PEZPTlQgU0laRT0iMyI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMyI+PC9GT05UPjxGT05UIFNJWkU9IjIiPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUiBUSEUgVEVSTVMgT0YgVEhJUyBDT01NT04gUFVCTElDIExJQ0VOU0UgKCJBR1JFRU1FTlQiKS4gIEFOWSBVU0UsIFJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRSBPRiBUSElTIEFHUkVFTUVOVC48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48Qj4xLiAgREVGSU5JVElPTlM8L0I+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+IkNvbnRyaWJ1dGlvbiIgbWVhbnM6PC9GT05UPgorCis8VUw+PEZPTlQgU0laRT0iMiI+YSkgaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24gZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxCUiBDTEVBUj0iTEVGVCI+CitiKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9GT05UPjwvVUw+CisKKworPFVMPjxGT05UIFNJWkU9IjIiPmkpCSAJY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9GT05UPjwvVUw+CisKKworPFVMPjxGT05UIFNJWkU9IjIiPmlpKQkJYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj53aGVyZSBzdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkIGJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5BIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yIGlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uIHN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+Q29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gd2hpY2g6ICAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgUHJvZ3JhbS4gIDwvRk9OVD48L1VMPgorCis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj4iQ29udHJpYnV0b3IiIG1lYW5zIGFueSBwZXJzb24gb3IgZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPiJMaWNlbnNlZCBQYXRlbnRzICIgbWVhbiBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2Ugb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gIDwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IlByb2dyYW0iIG1lYW5zIHRoZSBDb250cmlidXRpb25zIGRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj4iUmVjaXBpZW50IiBtZWFucyBhbnlvbmUgd2hvIHJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48Qj48L0I+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PEI+Mi4gIEdSQU5UIE9GIFJJR0hUUzwvQj48L0ZPTlQ+CisKKzxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+YSkJPC9GT05UPjxGT05UIFNJWkU9IjIiPlN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHM8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjRkYwMDAwIj4gPC9GT05UPjxGT05UIFNJWkU9IjIiPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS48L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjwvVUw+CisKKworPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5iKSAJU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+UmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwODAwMCI+IDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5yb3lhbHR5LWZyZWUgcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkIGJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uIHRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuICBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvIGFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiAgTm8gaGFyZHdhcmUgcGVyIHNlIGlzIGxpY2Vuc2VkIGhlcmV1bmRlci4gICA8L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjwvVUw+CisKKworPFVMPjxGT05UIFNJWkU9IjIiPmMpCVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMgQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IgdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50IGZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQgbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkgdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiAgRm9yIGV4YW1wbGUsIGlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZSBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9GT05UPjwvVUw+CisKKworPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj5kKQlFYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodCByaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluIHRoaXMgQWdyZWVtZW50LiA8L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjwvVUw+CisKKzxQPjxGT05UIFNJWkU9IjIiPjxCPjMuICBSRVFVSVJFTUVOVFM8L0I+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PEI+PC9CPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L0ZPTlQ+CisKKzxVTD48Rk9OVCBTSVpFPSIyIj5hKQlpdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9GT05UPjwvVUw+CisKKworPFVMPjxGT05UIFNJWkU9IjIiPmIpCWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiI+aSkJZWZmZWN0aXZlbHkgZGlzY2xhaW1zPC9GT05UPjxGT05UIFNJWkU9IjIiPiBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQgY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZSBhbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvRk9OVD48L1VMPgorCisKKzxVTD48Rk9OVCBTSVpFPSIyIj5paSkgCWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2ggYXMgbG9zdCBwcm9maXRzOyA8L0ZPTlQ+PC9VTD4KKworCis8VUw+PEZPTlQgU0laRT0iMiI+aWlpKTwvRk9OVD48Rk9OVCBTSVpFPSIyIj4Jc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdCBDb250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9GT05UPjwvVUw+CisKKworPFVMPjxGT05UIFNJWkU9IjIiPml2KQlzdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kIGluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+IDwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iI0ZGMDAwMCI+PC9GT05UPjwvVUw+CisKKworPFVMPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjRkYwMDAwIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPjwvVUw+CisKKzxQPjxGT05UIFNJWkU9IjIiPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlIGNvZGUgZm9ybTo8L0ZPTlQ+CisKKzxVTD48Rk9OVCBTSVpFPSIyIj5hKQlpdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9GT05UPjwvVUw+CisKKworPFVMPjxGT05UIFNJWkU9IjIiPmIpCWEgY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiAgPC9GT05UPjwvVUw+CisKKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+PFNUUklLRT48L1NUUklLRT48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+PFNUUklLRT48L1NUUklLRT48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueSBjb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiAgPC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUgb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3Mgc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uICA8L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48Qj40LiAgQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L0I+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5IGFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMgYW5kIHRoZSBsaWtlLiAgV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlIG9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsIGxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiAgIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoIkNvbW1lcmNpYWwgQ29udHJpYnV0b3IiKSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyIENvbnRyaWJ1dG9yICgiSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IiKSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kIGNvc3RzIChjb2xsZWN0aXZlbHkgIkxvc3NlcyIpIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlciBsZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0byB0aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIGNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLiAgVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMgcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuICBJbiBvcmRlciB0byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQgYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuICBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlIGluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguICBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yLiAgSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UgY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gIFVuZGVyIHRoaXMgc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlIG90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEgY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PEI+NS4gIE5PIFdBUlJBTlRZPC9CPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpczwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgPC9GT05UPjxGT05UIFNJWkU9IjIiPnRoZSBQcm9ncmFtPC9GT05UPjxGT05UIFNJWkU9IjIiPiBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+LCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsIGNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5wcm9ncmFtcyBvciBlcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9uczwvRk9OVD48Rk9OVCBTSVpFPSIyIj4uICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjxCPjYuICBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvQj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj4oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLDwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48Qj43LiAgR0VORVJBTDwvQj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dCBmdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZSBtaW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhIENvbnRyaWJ1dG9yIHdpdGggcmVzcGVjdCB0byBhIHBhdGVudCBhcHBsaWNhYmxlIHRvIHNvZnR3YXJlIChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzIGdyYW50ZWQgYnkgdGhhdCBDb250cmlidXRvciB0byBzdWNoIFJlY2lwaWVudCB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiAgSW4gYWRkaXRpb24sIGlmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aCBvdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2ggUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Cis8UD48Rk9OVCBTSVpFPSIyIj5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZSBwZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuICBJZiBhbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuICBIb3dldmVyLCBSZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkgUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMgY29weXJpZ2h0ZWQgIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudCBTdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+cHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mIHRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+dGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcyB0aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBJQk0gaXMgdGhlIGluaXRpYWwgQWdyZWVtZW50IFN0ZXdhcmQuICAgSUJNIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvIHNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5FYWNoIG5ldyB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgVGhlIFByb2dyYW0gKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAoaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IDwvRk9OVD48Rk9OVCBTSVpFPSIyIj52ZXJzaW9uLiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPkV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkIGluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8gdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIgZXhwcmVzc2x5LCA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+YnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZTwvRk9OVD48Rk9OVCBTSVpFPSIyIj4uPC9GT05UPjxGT05UIFNJWkU9IjIiPiAgQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QgZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZSBTdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcyBBZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuICBFYWNoIHBhcnR5IHdhaXZlcyBpdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9GT05UPgorPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKzxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KKworPC9CT0RZPgorCis8L0hUTUw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnhzZF8yLjAuMC9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnhzZF8yLjAuMC9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ZTNlMDIKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UueHNkXzIuMC4wL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnhzZF8yLjAuMC9mZWF0dXJlLnByb3BlcnRpZXMgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UueHNkXzIuMC4wL2ZlYXR1cmUucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjBkZWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnhzZF8yLjAuMC9mZWF0dXJlLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxNTQgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisjIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorIworIyBDb250cmlidXRvcnM6CisjICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgLyoqCisjICAqIDxjb3B5cmlnaHQ+CisjICAqCisjICAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyMgICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKKyMgICogCisjICAqIENvbnRyaWJ1dG9yczogCisjICAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjICAqCisjICAqIDwvY29weXJpZ2h0PgorIyAgKgorIyAgKiAkSWQ6IGZlYXR1cmUucHJvcGVydGllcyx2IDEuMSAyMDA0LzEwLzE4IDE1OjUwOjQyIGRiaXJzYW4gRXhwICQgCisjICAqLworCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBEbyBub3QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUgbGFzdCBsaW5lIGNvbnRhaW5pbmc6CisjICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQorIyBJbnN0ZWFkLCBlaXRoZXIgcmVkZWZpbmUgYW4gZXhpc3RpbmcgcHJvcGVydHksIG9yIGNyZWF0ZSBhIG5ldyBwcm9wZXJ0eSwKKyMgYXBwZW5kIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUsIGFuZCBjaGFuZ2UgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgbmFtZS4KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyMgVGhpcyBmaWxlIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAorIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKKyMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKKyMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgorCisjICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCitmZWF0dXJlTmFtZT1YU0QgU2NoZW1hIEluZm9zZXQgTW9kZWwKKworIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQorcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCisKKyMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKK3VwZGF0ZVNpdGVOYW1lPUVjbGlwc2Uub3JnIHVwZGF0ZSBzaXRlCisKKyMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCitkZXNjcmlwdGlvbj1YTUwgU2NoZW1hIEluZm9zZXQgTW9kZWwKKworIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCisjIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKK2xpY2Vuc2VVUkw9bGljZW5zZS5odG1sCisKKyMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCisjIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKK2xpY2Vuc2U9XAorRUNMSVBTRS5PUkcgU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKKzE0dGggQXVndXN0LCAyMDAzXG5cCitcblwKK1VzYWdlIE9mIENvbnRlbnRcblwKK1xuXAorRUNMSVBTRS5PUkcgTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKK09USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAorVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCitBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKK05PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKK0FHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKK0FORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCitPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAorVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAorT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKK0JFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKK1xuXAorQXBwbGljYWJsZSBMaWNlbnNlc1xuXAorXG5cCitVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgRWNsaXBzZS5vcmdcblwKK2lzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENvbW1vbiBQdWJsaWNcblwKK0xpY2Vuc2UgVmVyc2lvbiAxLjAgKCJDUEwiKS4gQSBjb3B5IG9mIHRoZSBDUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCitDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbC5cblwKK0ZvciBwdXJwb3NlcyBvZiB0aGUgQ1BMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAorXG5cCitDb250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKK2RvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAorcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKK2FzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAorXG5cCitDb250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHNcblwKKygiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3JcblwKK21vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWRcblwKKyJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZVxuXAorUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzXG5cCithcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAicGx1Z2lucyIgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluXG5cCitkaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLlxuXAorXG5cCitGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKKyJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCitJbmNsdWRlZCBGZWF0dXJlcy5cblwKK1xuXAorVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAorY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCitjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAoraW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAorTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAoraW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCitcblwKKyAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCisgICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCisgICAtIFN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAorICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCitcblwKK05vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSBFY2xpcHNlLm9yZyBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCitFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAorTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCitJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAord2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKK3lvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKK3RoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAorRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCitjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKK3VzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAorXG5cCitUSEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKK1RPIFRIRSBDUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAorU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAorXG5cCisgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKKyAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKKyAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAorICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKK1xuXAorSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAorVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKK2lzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCBFY2xpcHNlLm9yZyB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAorZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAorXG5cCitDcnlwdG9ncmFwaHlcblwKK1xuXAorQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCitjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCithbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCit1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKK3JlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKK2FuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuCisjIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCisjIFRoZSBhYm92ZSBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBzaGlwcGVkIGZvciB0cmFuc2xhdGlvbi4KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyMgInNlY29uZGFyeVVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgc2Vjb25kYXJ5IHVwZGF0ZSBzaXRlIChvbiBkb3dubG9hZC5lY2xpcHNlLm9yZykKK3NlY29uZGFyeVVwZGF0ZVNpdGVOYW1lPUVNRi9TRE8vWFNEIFNlY29uZGFyeSBVcGRhdGUgU2l0ZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnhzZF8yLjAuMC9mZWF0dXJlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS54c2RfMi4wLjAvZmVhdHVyZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U1MTM0MgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS54c2RfMi4wLjAvZmVhdHVyZS54bWwKQEAgLTAsMCArMSw3MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxmZWF0dXJlCisgICAgICBpZD0ib3JnLmVjbGlwc2UueHNkIgorICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKKyAgICAgIHZlcnNpb249IjIuMC4wIgorICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKKyAgICAgIGltYWdlPSJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIj4KKworICAgPGRlc2NyaXB0aW9uPgorICAgICAgJWRlc2NyaXB0aW9uCisgICA8L2Rlc2NyaXB0aW9uPgorCisgICA8Y29weXJpZ2h0IHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPgorICAgICAgQ29weXJpZ2h0IChjKSAyMDAyLTIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCitBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKK2FyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCit3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAoraHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKKyAgIDwvY29weXJpZ2h0PgorCisgICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KKyAgICAgICVsaWNlbnNlCisgICA8L2xpY2Vuc2U+CisKKyAgIDx1cmw+CisgICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL3VwZGF0ZS5lY2xpcHNlLm9yZy91cGRhdGVzLyIvPgorICAgICAgPGRpc2NvdmVyeSBsYWJlbD0iJXNlY29uZGFyeVVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy90b29scy9lbWYvdXBkYXRlcy8iLz4KKyAgIDwvdXJsPgorCisgICA8cmVxdWlyZXM+CisgICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMiIHZlcnNpb249IjMuMC4wIiBtYXRjaD0iY29tcGF0aWJsZSIvPgorICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmVtZi5lY29yZSIgdmVyc2lvbj0iMi4wLjAiIG1hdGNoPSJjb21wYXRpYmxlIi8+CisgICA8L3JlcXVpcmVzPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UueHNkIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjIuMC4wIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS54c2QuZWRpdCIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIyLjAuMCIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UueHNkLmVkaXRvciIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIyLjAuMCIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UueHNkLnRlc3QiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMi4wLjAiLz4KKworICAgPHBsdWdpbgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5tYXBwaW5nLnhzZDJlY29yZSIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIyLjAuMCIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLm1hcHBpbmcueHNkMmVjb3JlLmVkaXRvciIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIyLjAuMCIvPgorCis8L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UueHNkXzIuMC4wL2xpY2Vuc2UuaHRtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS54c2RfMi4wLjAvbGljZW5zZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmOGMzODAKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UueHNkXzIuMC4wL2xpY2Vuc2UuaHRtbApAQCAtMCwwICsxLDcxIEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Cis8aHRtbD4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Cis8aDI+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgorPHA+MTR0aCBBdWd1c3QsIDIwMDM8L3A+CisKKzxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KKworPHA+RUNMSVBTRS5PUkcgTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUworICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKKyAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKKyAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCisgICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKKyAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KKyAgIAorPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAorICAgCis8cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgRWNsaXBzZS5vcmcgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCisgICAoJnF1b3Q7Q1BMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgQ1BMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+LgorICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBDUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KKworPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKKyAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgorCis8cD5Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiAgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gICBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzCisgICBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7IGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy48L3A+CisgIAorPHA+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBGaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9wPgorICAKKzxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCitJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCitpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+CisKKzx1bD4KKwk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KKwk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgorCTxsaT5TdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KKwk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Cis8L3VsPgorCQkKKzxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSBFY2xpcHNlLm9yZyBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQoraW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKK2luZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90Oy4KK1N1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCit0aGF0IGRpcmVjdG9yeS48L3A+CisKKzxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgQ1BMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKK09USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgorCis8dWw+CisJPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KKwk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCisJPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KKwk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgorPC91bD4KKworPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQorY29udGFjdCBFY2xpcHNlLm9yZyB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgorCis8aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KKworPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bworICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCisgICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL3BsYXRmb3JtLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvcGxhdGZvcm0ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4M2U1YzQKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL3BsYXRmb3JtLnhtbApAQCAtMCwwICsxLDE3OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS1DcmVhdGVkIG9uIE1vbiBBdWcgMjMgMTU6MDU6NDMgRURUIDIwMDQtLT4KKzxjb25maWcgZGF0ZT0iMTA5MzI4Nzk0MzEzNCIgdHJhbnNpZW50PSJmYWxzZSIgdmVyc2lvbj0iMy4wIj4KKzxzaXRlIGVuYWJsZWQ9InRydWUiIHBvbGljeT0iVVNFUi1FWENMVURFIiB1cGRhdGVhYmxlPSJ0cnVlIiB1cmw9InBsYXRmb3JtOi9iYXNlLyI+Cis8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFycnVwLnJhZC5mZWF0dXJlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcnJ1cC5yYWQuZmVhdHVyZV82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Cis8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFydXBkYXRlLmRldi5wcm9kdWN0IiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcnVwZGF0ZS5kZXYucHJvZHVjdF82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Cis8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFydXBkYXRlLmRldiIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJ1cGRhdGUuZGV2XzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KKzxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS51bWwyIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnVtbDJfMS4wLjEvIiB2ZXJzaW9uPSIxLjAuMSIvPgorPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcnh0b29scy5jb21wYXJlbWVyZ2UuZWpiZGRmZWF0dXJlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcnh0b29scy5jb21wYXJlbWVyZ2UuZWpiZGQtZmVhdHVyZV82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Cis8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZm9vLnNlcnZlcmF0dGFjaC52NSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5mb28uc2VydmVyYXR0YWNoLnY1XzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KKzxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJkZWJ1Zy54c2wiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFyZGVidWcueHNsXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KKzxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJ4dG9vbHMucGxhdGZvcm0uZmVhdHVyZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJ4dG9vbHMucGxhdGZvcm0uZmVhdHVyZV82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Cis8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyc3VwcG9ydC5yYWQuZG9jIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcnN1cHBvcnQucmFkLmRvY18xLjAuMC8iIHZlcnNpb249IjEuMC4wIi8+Cis8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFycjJhLnJkai5mZWF0dXJlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcnIyYS5yZGouZmVhdHVyZV82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Cis8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFydXBkYXRlLnRlc3QuY3QuZmVhdHVyZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJ1cGRhdGUudGVzdC5jdC5mZWF0dXJlXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KKzxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJ4dG9vbHMuZURhdGF2aXouZmVhdHVyZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJ4dG9vbHMuZURhdGF2aXouZmVhdHVyZV82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Cis8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFycmFkLndlbGNvbWUuZmVhdHVyZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJyYWQud2VsY29tZS5mZWF0dXJlXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KKzxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJkZWJ1Zy53c2EubGF1bmNoLmxvYWQiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFyZGVidWcud3NhLmxhdW5jaC5sb2FkXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KKzxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJydXAuZmVhdHVyZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJydXAuZmVhdHVyZV82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Cis8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyeHRvb2xzLnZpc3VhbGl6YXRpb24uZmVhdHVyZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJ4dG9vbHMudmlzdWFsaXphdGlvbi5mZWF0dXJlXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KKzxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJyYWQubmF2LmRvYy5mZWF0dXJlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcnJhZC5uYXYuZG9jLmZlYXR1cmVfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgorPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnkudGVzdCIgcHJpbWFyeT0idHJ1ZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS55LnRlc3RfMy4wLjEvIiB2ZXJzaW9uPSIzLjAuMSIvPgorPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcmRlYnVnLmFjdGl2ZXNjcmlwdC53aW4zMiIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJkZWJ1Zy5hY3RpdmVzY3JpcHQud2luMzJfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgorPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcnh0b29scy5wbGF0Zm9ybS53aW4zMi5mZWF0dXJlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcnh0b29scy5wbGF0Zm9ybS53aW4zMi5mZWF0dXJlXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KKzxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5mb28ucG9ydGFsLnRvb2xzLmZlYXR1cmUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZm9vLnBvcnRhbC50b29scy5mZWF0dXJlXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KKzxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5mb28uc2VydmVyYXR0YWNoIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmZvby5zZXJ2ZXJhdHRhY2hfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgorPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnkudGVzdC5leGFtcGxlcyIgcHJpbWFyeT0idHJ1ZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS55LnRlc3QuZXhhbXBsZXNfMy4wLjEvIiB2ZXJzaW9uPSIzLjAuMSIvPgorPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcnouY29tbW9uLnVpIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcnouY29tbW9uLnVpXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KKzxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJ6LmVqYiIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJ6LmVqYl82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Cis8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UueS5wcm9maWxpbmciIHByaW1hcnk9InRydWUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UueS5wcm9maWxpbmdfMy4wLjEvIiB2ZXJzaW9uPSIzLjAuMSIvPgorPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmZvby5lamJkZXBsb3kuZmVhdHVyZS5ubDEiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZm9vLmVqYmRlcGxveS5mZWF0dXJlLm5sMV82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Cis8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyei5lbWYuaW50ZWdyYXRpb24iIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFyei5lbWYuaW50ZWdyYXRpb25fNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgorPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcmRlYnVnLmphdmFzY3JpcHQiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFyZGVidWcuamF2YXNjcmlwdF82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Cis8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyZGVidWcuYXN0LmZlYXR1cmUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFyZGVidWcuYXN0LmZlYXR1cmVfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgorPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLndzdnQtZmVhdHVyZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Z0LWZlYXR1cmVfMS4wLjAvIiB2ZXJzaW9uPSIxLjAuMCIvPgorPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmZvby5zaWIubWVkaWF0aW9uLmRldmVsb3AuZmVhdHVyZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5mb28uc2liLm1lZGlhdGlvbi5kZXZlbG9wLmZlYXR1cmVfMS4wLjAvIiB2ZXJzaW9uPSIxLjAuMCIvPgorPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmZvby53ZWJzZXJ2aWNlLndhcy5jcmVhdGlvbi5lamIuZmVhdHVyZS5ubDEiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZm9vLndlYnNlcnZpY2Uud2FzLmNyZWF0aW9uLmVqYi5mZWF0dXJlLm5sMV82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Cis8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZm9vLndlYmVkaXQuZWRpdG9yLmZlYXR1cmUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZm9vLndlYmVkaXQuZWRpdG9yLmZlYXR1cmVfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgorPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcnouZGF0YSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJ6LmRhdGFfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgorPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmZvby5zaWIubWVkaWF0aW9uLmRlcGxveS5mZWF0dXJlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmZvby5zaWIubWVkaWF0aW9uLmRlcGxveS5mZWF0dXJlXzEuMC4wLyIgdmVyc2lvbj0iMS4wLjAiLz4KKzxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5mb28uZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5mb28uZV82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Cis8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZm9vLndlYnNlcnZpY2Uud2FzLmNyZWF0aW9uLmVqYi5mZWF0dXJlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmZvby53ZWJzZXJ2aWNlLndhcy5jcmVhdGlvbi5lamIuZmVhdHVyZV82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Cis8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZm9vLnNpdGVlZGl0LmZlYXR1cmUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZm9vLnNpdGVlZGl0LmZlYXR1cmVfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgorPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmZvby5wcm9maWxpbmcuc2VydmVyLmNvbXBhdGlibGUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZm9vLnByb2ZpbGluZy5zZXJ2ZXIuY29tcGF0aWJsZV82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Cis8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyei53cyIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJ6LndzXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KKzxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5mb28uZWpiLnNhbXBsZXMtZmVhdHVyZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5mb28uZWpiLnNhbXBsZXMtZmVhdHVyZV82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Cis8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyei5hY3Rpdml0aWVzLmZlYXR1cmUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFyei5hY3Rpdml0aWVzLmZlYXR1cmVfMS4wLjAvIiB2ZXJzaW9uPSIxLjAuMCIvPgorPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmZvby5leGFtcGxlcyIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5mb28uZXhhbXBsZXNfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgorPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcnguc2RrIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcnguc2RrXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KKzxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJkZWJ1Zy5wZHQud2luMzIiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFyZGVidWcucGR0LndpbjMyXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KKzxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJkZWJ1Zy53c2EiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFyZGVidWcud3NhXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KKzxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5mb28uanZlLmV4cHJlc3MiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZm9vLmp2ZS5leHByZXNzXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KKzxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJkYXRhLmxpbnV4IiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcmRhdGEubGludXhfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgorPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcnNzZS54bWxtYXJrdXAiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFyc3NlLnhtbG1hcmt1cF82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Cis8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyei52YWxpZGF0aW9uIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcnoudmFsaWRhdGlvbl82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Cis8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UueS5nbGEiIHByaW1hcnk9InRydWUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UueS5nbGFfMy4wLjEvIiB2ZXJzaW9uPSIzLjAuMSIvPgorPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcnoud3MubW9kZWwiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFyei53cy5tb2RlbF82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Cis8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyeC5hc3QiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFyeC5hc3RfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgorPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcndzLmFzdC5zdC5leHQubmwxIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcndzLmFzdC5zdC5leHQubmwxXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KKzxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJ6LmNvbW1vbi51dGlsaXRpZXMiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFyei5jb21tb24udXRpbGl0aWVzXzEuMC4wLyIgdmVyc2lvbj0iMS4wLjAiLz4KKzxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJ6LmNvbW1vbiIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJ6LmNvbW1vbl82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Cis8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyei54bWwubW9kZWwiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFyei54bWwubW9kZWxfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgorPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcmRlYnVnLnBkdCIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJkZWJ1Zy5wZHRfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgorPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcnoubmF2aWdhdG9yIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcnoubmF2aWdhdG9yXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KKzxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5mb28ud2VidG9vbHMuZmVhdHVyZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5mb28ud2VidG9vbHMuZmVhdHVyZV82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Cis8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyei5lbWYuaW50ZWdyYXRpb24uY29yZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJ6LmVtZi5pbnRlZ3JhdGlvbi5jb3JlXzEuMC4wLyIgdmVyc2lvbj0iMS4wLjAiLz4KKzxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5mb28uc3RydXRzLmZlYXR1cmUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZm9vLnN0cnV0cy5mZWF0dXJlXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KKzxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJzc2UuYmFzZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJzc2UuYmFzZV82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Cis8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyZGVidWcuaGVscC5kb2MiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFyZGVidWcuaGVscC5kb2NfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgorPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnkubW9kZWxzIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnkubW9kZWxzXzMuMC4xLyIgdmVyc2lvbj0iMy4wLjEiLz4KKzxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS55LmxvZ2dpbmciIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UueS5sb2dnaW5nXzMuMC4xLyIgdmVyc2lvbj0iMy4wLjEiLz4KKzxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJkZWJ1Zy5qYXZhc2NyaXB0Lm5sMS5mZWF0dXJlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcmRlYnVnLmphdmFzY3JpcHQubmwxLmZlYXR1cmVfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgorPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcndzLmFzdC5zdC5iYXRjaCIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJ3cy5hc3Quc3QuYmF0Y2hfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgorPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcnNzZS5zbmlwcGV0cyIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJzc2Uuc25pcHBldHNfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgorPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcndzLnJhcGlkZGVwbG95IiBwbHVnaW4taWRlbnRpZmllcj0ib3JnLmVjbGlwc2UuYmFyd3MucmFwaWRkZXBsb3kuY29yZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJ3cy5yYXBpZGRlcGxveV8xLjAuMC8iIHZlcnNpb249IjEuMC4wIi8+Cis8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyZGF0YSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJkYXRhXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KKzxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5mb28uc2VjdXJpdHkiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZm9vLnNlY3VyaXR5XzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KKzxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5mb28ucHJvYmVraXQiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZm9vLnByb2Jla2l0XzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KKzxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5mb28uanNmLmZlYXR1cmUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZm9vLmpzZi5mZWF0dXJlXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KKzxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5mb28uYW5hbHlzaXMiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZm9vLmFuYWx5c2lzXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KKzxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5mb28uYWMtdGVjaCIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5mb28uYWMtdGVjaF82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Cis8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZm9vLndlYnNlcnZpY2Uud2FzLmNyZWF0aW9uLmZlYXR1cmUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZm9vLndlYnNlcnZpY2Uud2FzLmNyZWF0aW9uLmZlYXR1cmVfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgorPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmZvby5lamIiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZm9vLmVqYl82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Cis8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZm9vLmVqYmRlcGxveS5mZWF0dXJlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmZvby5lamJkZXBsb3kuZmVhdHVyZV81LjEuMS8iIHZlcnNpb249IjUuMS4xIi8+Cis8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyei5lIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcnouZV82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Cis8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZm9vLmZ0cCIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5mb28uZnRwXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KKzxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS55LmV4YW1wbGVzIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnkuZXhhbXBsZXNfMy4wLjEvIiB2ZXJzaW9uPSIzLjAuMSIvPgorPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmZvby5qdmUuY29yZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5mb28uanZlLmNvcmVfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgorPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnkuY29yZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS55LmNvcmVfMy4wLjEvIiB2ZXJzaW9uPSIzLjAuMSIvPgorPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcnoud3MuYXhpcyIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJ6LndzLmF4aXNfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgorPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmZvby5qdmUuZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5mb28uanZlLmVfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgorPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmZvby5yZXNvdXJjZXMuY29tbW9uLmZlYXR1cmUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZm9vLnJlc291cmNlcy5jb21tb24uZmVhdHVyZV82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Cis8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyd3MiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFyd3NfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgorPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnkiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UueV8zLjAuMS8iIHZlcnNpb249IjMuMC4xIi8+Cis8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyZGVidWcuYXN0Lm5sMS5mZWF0dXJlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcmRlYnVnLmFzdC5ubDEuZmVhdHVyZV82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Cis8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyeiIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJ6XzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KKzxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJscGV4IiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcmxwZXhfMy4wLjAvIiB2ZXJzaW9uPSIzLjAuMCIvPgorPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcnhtbCIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJ4bWxfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgorPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcnoud3MuY29uc3VtcHRpb24iIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFyei53cy5jb25zdW1wdGlvbl82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Cis8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZm9vLmVnbC5mZWF0dXJlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmZvby5lZ2wuZmVhdHVyZV82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Cis8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyei5zZXJ2ZXIudG9tY2F0IiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcnouc2VydmVyLnRvbWNhdF82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Cis8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyd3MucmFwaWRkZXBsb3kuY21kZnJhbWV3b3JrIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcndzLnJhcGlkZGVwbG95LmNtZGZyYW1ld29ya18xLjAuMC8iIHZlcnNpb249IjEuMC4wIi8+Cis8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZm9vLmVqYi5zYmYuZmVhdHVyZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5mb28uZWpiLnNiZi5mZWF0dXJlXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KKzxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5mb28ucWV2IiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmZvby5xZXZfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgorPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmZvby53cy5leHQuZmVhdHVyZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5mb28ud3MuZXh0LmZlYXR1cmVfNS45LjAvIiB2ZXJzaW9uPSI1LjkuMCIvPgorPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcnoueG1sIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcnoueG1sXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KKzxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJ1cGRhdGUud2ViLmRldmVsb3BlciIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJ1cGRhdGUud2ViLmRldmVsb3Blcl82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Cis8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyd3MuYXN0LnN0LmJhc2UubmwxIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcndzLmFzdC5zdC5iYXNlLm5sMV82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Cis8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyei5qZHQuaW50ZWdyYXRpb24iIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFyei5qZHQuaW50ZWdyYXRpb25fNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgorPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnkuc291cmNlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnkuc291cmNlXzMuMC4xLyIgdmVyc2lvbj0iMy4wLjEiLz4KKzxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5mb28uZ2xhIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmZvby5nbGFfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgorPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmZvby53cy5lamIubmwxLmZlYXR1cmUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZm9vLndzLmVqYi5ubDEuZmVhdHVyZV82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Cis8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyd3MuYXN0LnN0LmJhc2UiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFyd3MuYXN0LnN0LmJhc2VfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgorPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcnN1cHBvcnQucndkLmRvYyIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJzdXBwb3J0LnJ3ZC5kb2NfMS4wLjAvIiB2ZXJzaW9uPSIxLjAuMCIvPgorPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcnVwZGF0ZS5wZC5wcm9mIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcnVwZGF0ZS5wZC5wcm9mXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KKzxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5mb28ud2Vic2VydmljZS53YXMuY3JlYXRpb24uZmVhdHVyZS5ubDEiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZm9vLndlYnNlcnZpY2Uud2FzLmNyZWF0aW9uLmZlYXR1cmUubmwxXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KKzxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS53c3Z0dmFsaWRhdG9yZmVhdHVyZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Z0dmFsaWRhdG9yZmVhdHVyZV8xLjAuMC8iIHZlcnNpb249IjEuMC4wIi8+Cis8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyd3MuYXN0LnN0LmJhdGNoLm5sMSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJ3cy5hc3Quc3QuYmF0Y2gubmwxXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KKzxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJ3cy5hc3QuZG9jLmZlYXR1cmUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFyd3MuYXN0LmRvYy5mZWF0dXJlXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KKzxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5mb28ud3MuZWpiLmZlYXR1cmUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZm9vLndzLmVqYi5mZWF0dXJlXzUuOS4wLyIgdmVyc2lvbj0iNS45LjAiLz4KKzxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJ3cy5yYXBpZGRlcGxveS5ubDEiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFyd3MucmFwaWRkZXBsb3kubmwxXzEuMC4wLyIgdmVyc2lvbj0iMS4wLjAiLz4KKzxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJ6LmpjYSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJ6LmpjYV82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Cis8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyei54bWwudmFsaWRhdGUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFyei54bWwudmFsaWRhdGVfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgorPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcnouZXh0ZW5zaW9uIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcnouZXh0ZW5zaW9uXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KKzxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJ6LmVudi51aSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJ6LmVudi51aV82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Cis8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyei5lbnYiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFyei5lbnZfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgorPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcnVwZGF0ZS5qc2NyaWIuZnJhbWV3b3JrIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcnVwZGF0ZS5qc2NyaWIuZnJhbWV3b3JrXzEuMi4wLyIgdmVyc2lvbj0iMS4yLjAiLz4KKzxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJkZWJ1Zy5wZHQubmwxLmZlYXR1cmUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFyZGVidWcucGR0Lm5sMS5mZWF0dXJlXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KKzxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJyd2QuZG9jLmZlYXR1cmUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFycndkLmRvYy5mZWF0dXJlXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KKzxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJ1cGRhdGUub3JwaGFucyIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJ1cGRhdGUub3JwaGFuc18xLjAuMC8iIHZlcnNpb249IjEuMC4wIi8+Cis8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZm9vLnByb2ZpbGluZyIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5mb28ucHJvZmlsaW5nXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KKzxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS55LnByb2Jla2l0IiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnkucHJvYmVraXRfMy4wLjEvIiB2ZXJzaW9uPSIzLjAuMSIvPgorPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcnNzZS53ZWJtYXJrdXAiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFyc3NlLndlYm1hcmt1cF82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Cis8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyZGF0YS53aW4zMiIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJkYXRhLndpbjMyXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KKzxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJ6LnNlcnZlciIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJ6LnNlcnZlcl82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Cis8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuamVtIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmplbV8xLjAuMC8iIHZlcnNpb249IjEuMC4wIi8+Cis8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZm9vLnByb2plY3QuaW50ZXJjaGFuZ2UiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZm9vLnByb2plY3QuaW50ZXJjaGFuZ2VfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgorPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnZlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnZlXzEuMC4wLyIgdmVyc2lvbj0iMS4wLjAiLz4KKzxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJkZWJ1Zy53c2EubmwxLmZlYXR1cmUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFyZGVidWcud3NhLm5sMS5mZWF0dXJlXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KKzxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5mb28ud2Vic2VydmljZS53YXMuZGVwbG95LmZlYXR1cmUubmwxIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmZvby53ZWJzZXJ2aWNlLndhcy5kZXBsb3kuZmVhdHVyZS5ubDFfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgorPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmZvby53cy5leHQubmwxLmZlYXR1cmUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZm9vLndzLmV4dC5ubDEuZmVhdHVyZV82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Cis8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyZGVidWcuaGVscGFzLmRvYyIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJkZWJ1Zy5oZWxwYXMuZG9jXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KKzxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5mb28uZW1mLnVpLmludGVncmF0aW9uIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmZvby5lbWYudWkuaW50ZWdyYXRpb25fNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgorPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmZvby53ZWJzZXJ2aWNlLndhcy5kZXBsb3kuZmVhdHVyZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5mb28ud2Vic2VydmljZS53YXMuZGVwbG95LmZlYXR1cmVfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgorPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcnoud2ViIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcnoud2ViXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KKzxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5mb28ucHJvZmlsaW5nLnNlcnZlciIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5mb28ucHJvZmlsaW5nLnNlcnZlcl82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Cis8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyd3MuYXN0LnN0LmV4dCIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJ3cy5hc3Quc3QuZXh0XzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KKzxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJydXAudXBkYXRlem9uZS5mZWF0dXJlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcnJ1cC51cGRhdGV6b25lLmZlYXR1cmVfMS4wLjAvIiB2ZXJzaW9uPSIxLjAuMCIvPgorPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcnNhbXBsZWdhbGxlcnktZmVhdHVyZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJzYW1wbGVnYWxsZXJ5LWZlYXR1cmVfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgorPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmpkdC5zb3VyY2UiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuamR0LnNvdXJjZV8zLjAuMS8iIHZlcnNpb249IjMuMC4xIi8+Cis8ZmVhdHVyZSBhcHBsaWNhdGlvbj0ib3JnLmVjbGlwc2UudWkuaWRlLndvcmtiZW5jaCIgaWQ9Im9yZy5lY2xpcHNlLmJhcnVwZGF0ZS5zZHAuZmVhdHVyZSIgcHJpbWFyeT0idHJ1ZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJ1cGRhdGUuc2RwLmZlYXR1cmVfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgorPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnBkZS5zb3VyY2UiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UucGRlLnNvdXJjZV8zLjAuMS8iIHZlcnNpb249IjMuMC4xIi8+Cis8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZm9vLmx1bS51dGlscy5mZWF0dXJlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmZvby5sdW0udXRpbHMuZmVhdHVyZV82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Cis8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyZXN1cHBvcnQuY2xpZW50Lm5sMSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJlc3VwcG9ydC5jbGllbnQvIiB2ZXJzaW9uPSIwLjkuMTQiLz4KKzxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS55LmxvZ2dpbmciIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UueS5sb2dnaW5nXzMuMC4xLyIgdmVyc2lvbj0iMy4wLjEiLz4KKzxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLmRvYyIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLmRvY18yLjAuMC8iIHZlcnNpb249IjIuMC4wIi8+Cis8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZm9vLmxvZ2dpbmciIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZm9vLmxvZ2dpbmdfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgorPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcnVwZGF0ZS53ZWxjb21lLmZlYXR1cmUubmwxIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcnVwZGF0ZS53ZWxjb21lLmZlYXR1cmUubmwxLyIgdmVyc2lvbj0iNi4wLjAiLz4KKzxmZWF0dXJlIGFwcGxpY2F0aW9uPSJvcmcuZWNsaXBzZS51aS5pZGUud29ya2JlbmNoIiBpZD0ib3JnLmVjbGlwc2UucGxhdGZvcm0iIHByaW1hcnk9InRydWUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UucGxhdGZvcm1fMy4wLjEvIiB2ZXJzaW9uPSIzLjAuMSIvPgorPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcmNvbW1vbi5kb2MuZmVhdHVyZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJjb21tb24uZG9jLmZlYXR1cmUvIiB2ZXJzaW9uPSI2LjAuMCIvPgorPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmpkdCIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5qZHRfMy4wLjEvIiB2ZXJzaW9uPSIzLjAuMSIvPgorPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcnN1cHBvcnQuY29yZS5kb2MiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFyc3VwcG9ydC5jb3JlLmRvYy8iIHZlcnNpb249IjEuMC4wIi8+Cis8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UueHl6LmNsZWFyY2FzZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS54eXouY2xlYXJjYXNlXzYuMC4xMS8iIHZlcnNpb249IjYuMC4xMSIvPgorPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcnR1dG9yaWFsZ2FsbGVyeS1mZWF0dXJlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcnR1dG9yaWFsZ2FsbGVyeS1mZWF0dXJlXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KKzxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJ1cGRhdGUud2VsY29tZS5mZWF0dXJlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcnVwZGF0ZS53ZWxjb21lLmZlYXR1cmUvIiB2ZXJzaW9uPSI2LjAuMCIvPgorPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmVtZiIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWZfMi4wLjEvIiB2ZXJzaW9uPSIyLjAuMSIvPgorPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnBsYXRmb3JtLnNvdXJjZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5zb3VyY2VfMy4wLjEvIiB2ZXJzaW9uPSIzLjAuMSIvPgorPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcnVwZGF0ZS5jb21tb24uYWN0aXZpdGllcy5mZWF0dXJlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcnVwZGF0ZS5jb21tb24uYWN0aXZpdGllcy5mZWF0dXJlXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KKzxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJ1cGRhdGUuY2RpLml0bG0iIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFydXBkYXRlLmNkaS5pdGxtXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KKzxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5wZGUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UucGRlXzMuMC4xLyIgdmVyc2lvbj0iMy4wLjEiLz4KKzxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5lbWYuZG9jIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5kb2NfMi4wLjEvIiB2ZXJzaW9uPSIyLjAuMSIvPgorPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8iIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkb18yLjAuMS8iIHZlcnNpb249IjIuMC4xIi8+Cis8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyc3VwcG9ydC5jb3JlLmRvYy5ubDEiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFyc3VwcG9ydC5jb3JlLmRvYy5ubDEvIiB2ZXJzaW9uPSIxLjAuMCIvPgorPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcnh0b29scy5jb21wYXJlbWVyZ2UiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFyeHRvb2xzLmNvbXBhcmVtZXJnZV82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Cis8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyeHRvb2xzLmNvbW1vbi51aS5wcm9wZXJ0aWVzIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcnh0b29scy5jb21tb24udWkucHJvcGVydGllc182LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Cis8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UueHNkIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnhzZF8yLjAuMS8iIHZlcnNpb249IjIuMC4xIi8+Cis8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZ2VmIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmdlZl8zLjAuMC8iIHZlcnNpb249IjMuMC4wIi8+Cis8L3NpdGU+Cis8L2NvbmZpZz4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmVhdHVyZTEucGx1Z2luMV8xLjEuMS5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUxLnBsdWdpbjFfMS4xLjEuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjOTk1ZDUKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUxLnBsdWdpbjFfMS4xLjEuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmVhdHVyZTIucGx1Z2luMl8yLjIuMi5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUyLnBsdWdpbjJfMi4yLjIuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjOTk1ZDUKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUyLnBsdWdpbjJfMi4yLjIuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZHVtbXlfNy45LjguamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5kdW1teV83LjkuOC5qYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhmMTkzZAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZHVtbXlfNy45LjguamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMV8zLjUuNi5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjFfMy41LjYuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNzVhZGUKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjFfMy41LjYuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMl81LjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjJfNS4wLjAuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhOTU4YzcKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjJfNS4wLjAuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjFfMS4xLjEvcGx1Z2luLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjFfMS4xLjEvcGx1Z2luLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjA1ZDgyCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMS9wbHVnaW4ueG1sCkBAIC0wLDAgKzEsOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCis8cGx1Z2luIG5hbWU9IkpVbml0IFRlc3QgRnJhbWV3b3JrIiBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMSIgdmVyc2lvbj0iMy41LjYiIHZlbmRvci1uYW1lPSJqdW5pdC5vcmciPg0KKyAgPHJ1bnRpbWU+DQorICAgIDxsaWJyYXJ5IG5hbWU9Imp1bml0LmphciI+DQorICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+DQorICAgIDwvbGlicmFyeT4NCisgIDwvcnVudGltZT4NCis8L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xL3NyYy5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xL3NyYy5qYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ0ZDYwOQotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjFfMS4xLjEvc3JjLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9yZWNvbmNpbGlhdGlvblNpdGVzL3NpdGUxL2luc3RhbGwvZmVhdHVyZXMvZmVhdHVyZTMvZmVhdHVyZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9yZWNvbmNpbGlhdGlvblNpdGVzL3NpdGUxL2luc3RhbGwvZmVhdHVyZXMvZmVhdHVyZTMvZmVhdHVyZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE0MWFmOAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3JlY29uY2lsaWF0aW9uU2l0ZXMvc2l0ZTEvaW5zdGFsbC9mZWF0dXJlcy9mZWF0dXJlMy9mZWF0dXJlLnhtbApAQCAtMCwwICsxLDEyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUzIiBpbWFnZT0iZmVhdHVyZTEuZ2lmIiBsYWJlbD0iVGhpcmQgRmVhdHVyZSIgcHJvdmlkZXItbmFtZT0iU21hcnQgQ29tcGFueSIgdmVyc2lvbj0iMS4wLjAiID4KKyAgPGRlc2NyaXB0aW9uPkRlc2NyaXB0aW9uPC9kZXNjcmlwdGlvbj4KKyAgPGNvcHlyaWdodD5jb3B5cmlnaHQ8L2NvcHlyaWdodD4KKyAgPGxpY2Vuc2U+bGljZW5zZTwvbGljZW5zZT4KKyAgPHVybD4KKyAgICA8dXBkYXRlIGxhYmVsPSJVUkwgdG8gdXBkYXRlIHRoZSBmZWF0dXJlIiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIi8+CisgICAgPGRpc2NvdmVyeSBsYWJlbD0iRGlzY292ZXJ5IDEiIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyIvPgorICAgIDxkaXNjb3ZlcnkgbGFiZWw9IkRpc2NvdmVyeSAyIiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciLz4KKyAgPC91cmw+CisgIDxwbHVnaW4gZG93bmxvYWQtc2l6ZT0iMTUwMCIgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xIiBpbnN0YWxsLXNpemU9IjEwMDAiIGZyYWdtZW50PSJmYWxzZSIgbmw9InVzIiBvcz0iT1NfV0lOMzIiIHZlcnNpb249IjEuMS4xIiB3cz0iV1NfV0lOMzIiLz4KKzwvZmVhdHVyZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9yZWNvbmNpbGlhdGlvblNpdGVzL3NpdGUxL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjFfMS4xLjEvcGx1Z2luLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3JlY29uY2lsaWF0aW9uU2l0ZXMvc2l0ZTEvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMS9wbHVnaW4ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMTg0NmMKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9yZWNvbmNpbGlhdGlvblNpdGVzL3NpdGUxL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjFfMS4xLjEvcGx1Z2luLnhtbApAQCAtMCwwICsxLDggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cGx1Z2luIG5hbWU9IkpVbml0IFRlc3QgRnJhbWV3b3JrIiBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMSIgdmVyc2lvbj0iMy41LjYiIHZlbmRvci1uYW1lPSJqdW5pdC5vcmciPgorICA8cnVudGltZT4KKyAgICA8bGlicmFyeSBuYW1lPSJqdW5pdC5qYXIiPgorICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+CisgICAgPC9saWJyYXJ5PgorICA8L3J1bnRpbWU+Cis8L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9yZWNvbmNpbGlhdGlvblNpdGVzL3NpdGUxL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjFfMS4xLjEvc3JjLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3JlY29uY2lsaWF0aW9uU2l0ZXMvc2l0ZTEvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMS9zcmMuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkNGQ2MDkKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9yZWNvbmNpbGlhdGlvblNpdGVzL3NpdGUxL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjFfMS4xLjEvc3JjLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9yZWNvbmNpbGlhdGlvblNpdGVzL3NpdGUyL2luc3RhbGwvZmVhdHVyZXMvZmVhdHVyZTMvZmVhdHVyZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9yZWNvbmNpbGlhdGlvblNpdGVzL3NpdGUyL2luc3RhbGwvZmVhdHVyZXMvZmVhdHVyZTMvZmVhdHVyZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhhN2RlOAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3JlY29uY2lsaWF0aW9uU2l0ZXMvc2l0ZTIvaW5zdGFsbC9mZWF0dXJlcy9mZWF0dXJlMy9mZWF0dXJlLnhtbApAQCAtMCwwICsxLDEyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUzIiBpbWFnZT0iZmVhdHVyZTEuZ2lmIiBsYWJlbD0iVGhpcmQgRmVhdHVyZSIgcHJvdmlkZXItbmFtZT0iU21hcnQgQ29tcGFueSIgdmVyc2lvbj0iMS4wLjAiID4KKyAgPGRlc2NyaXB0aW9uPkRlc2NyaXB0aW9uPC9kZXNjcmlwdGlvbj4KKyAgPGNvcHlyaWdodD5jb3B5cmlnaHQ8L2NvcHlyaWdodD4KKyAgPGxpY2Vuc2U+bGljZW5zZTwvbGljZW5zZT4KKyAgPHVybD4KKyAgICA8dXBkYXRlIGxhYmVsPSJVUkwgdG8gdXBkYXRlIHRoZSBmZWF0dXJlIiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIi8+CisgICAgPGRpc2NvdmVyeSBsYWJlbD0iRGlzY292ZXJ5IDEiIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyIvPgorICAgIDxkaXNjb3ZlcnkgbGFiZWw9IkRpc2NvdmVyeSAyIiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciLz4KKyAgPC91cmw+CisgIDxwbHVnaW4gZG93bmxvYWQtc2l6ZT0iMTUwMCIgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlIiBpbnN0YWxsLXNpemU9IjEwMDAiIGZyYWdtZW50PSJmYWxzZSIgbmw9InVzIiBvcz0iT1NfV0lOMzIiIHZlcnNpb249IjIuMS4wIiB3cz0iV1NfV0lOMzIiLz4KKzwvZmVhdHVyZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9yZWNvbmNpbGlhdGlvblNpdGVzL3NpdGUyL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmVfMi4wLjAvcGx1Z2luLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3JlY29uY2lsaWF0aW9uU2l0ZXMvc2l0ZTIvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZV8yLjAuMC9wbHVnaW4ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMTg0NmMKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9yZWNvbmNpbGlhdGlvblNpdGVzL3NpdGUyL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmVfMi4wLjAvcGx1Z2luLnhtbApAQCAtMCwwICsxLDggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cGx1Z2luIG5hbWU9IkpVbml0IFRlc3QgRnJhbWV3b3JrIiBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMSIgdmVyc2lvbj0iMy41LjYiIHZlbmRvci1uYW1lPSJqdW5pdC5vcmciPgorICA8cnVudGltZT4KKyAgICA8bGlicmFyeSBuYW1lPSJqdW5pdC5qYXIiPgorICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+CisgICAgPC9saWJyYXJ5PgorICA8L3J1bnRpbWU+Cis8L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9yZWNvbmNpbGlhdGlvblNpdGVzL3NpdGUyL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmVfMi4wLjAvc3JjLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3JlY29uY2lsaWF0aW9uU2l0ZXMvc2l0ZTIvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZV8yLjAuMC9zcmMuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkNGQ2MDkKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9yZWNvbmNpbGlhdGlvblNpdGVzL3NpdGUyL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmVfMi4wLjAvc3JjLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9zaXRlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3NpdGUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmYzYwYzcKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9zaXRlLnhtbApAQCAtMCwwICsxLDE5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KKzxzaXRlIHR5cGU9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZpbGUiPg0KKzxkZXNjcmlwdGlvbiB1cmw9ImluZm8vc2l0ZUluZm8uaHRtbCIvPg0KKyAgPGZlYXR1cmUgdXJsPSJ0ZXN0QVBJL2ZlYXR1cmVzL2ZlYXR1cmUzIj4NCisgICAgPGNhdGVnb3J5IG5hbWU9ImVjbGlwc2UvVU1MIi8+DQorICA8L2ZlYXR1cmU+DQorICA8ZmVhdHVyZSB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZmVhdHVyZTIiPg0KKyAgICA8Y2F0ZWdvcnkgbmFtZT0iZWNsaXBzZS9KMkVFIi8+DQorICA8L2ZlYXR1cmU+DQorICA8ZmVhdHVyZSB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZmVhdHVyZTEiPg0KKyAgICA8Y2F0ZWdvcnkgbmFtZT0iZWNsaXBzZS9KMkVFIi8+DQorICA8L2ZlYXR1cmU+DQorICA8YXJjaGl2ZSBwYXRoPSJwbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xLmphciIgdXJsPSJwbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xIi8+ICAgIA0KKyAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iSjJFRSB0b29scyIgbmFtZT0iZWNsaXBzZS9KMkVFIi8+DQorICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJFSkIgVG9vbHMiIG5hbWU9ImVjbGlwc2UvSjJFRS9FSkIiLz4NCisgIDxjYXRlZ29yeS1kZWYgbGFiZWw9IlVNTCB0b29scyIgbmFtZT0iZWNsaXBzZS9VTUwiLz4NCisgIDxjYXRlZ29yeS1kZWYgbGFiZWw9Ik1lc3NhZ2luZyBUb29scyIgbmFtZT0iQjJCIi8+DQorICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJFY2xpcHNlIFRvb2xzIiBuYW1lPSJlY2xpcHNlIi8+DQorPC9zaXRlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3NpdGUyL3NpdGUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvc2l0ZTIvc2l0ZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzlkMWMxMQotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3NpdGUyL3NpdGUueG1sCkBAIC0wLDAgKzEsNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCis8c2l0ZSB1cmw9IkluZm8uaHRtbCIgdHlwZT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmlsZSI+DQorICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL2ZlYXR1cmUxIi8+DQorICA8YXJjaGl2ZSBwYXRoPSJvcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMSIgdXJsPSJwbHVnaW5zL3BsdWdpbjEiLz4NCisgIDxhcmNoaXZlIHBhdGg9Im9yZy5lY2xpcHNlLnVwZGF0ZS5hcmNoaXZlMiIgdXJsPSJwbHVnaW5zL3BsdWdpbjIiLz4NCis8L3NpdGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvc2l0ZVRlc3RMb2NhbFNpdGUvcGx1Z2lucy9idW5kbGVBbmRQbHVnaW5NYW5pZmVzdHNfMS4wLjMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9zaXRlVGVzdExvY2FsU2l0ZS9wbHVnaW5zL2J1bmRsZUFuZFBsdWdpbk1hbmlmZXN0c18xLjAuMy9NRVRBLUlORi9NQU5JRkVTVC5NRgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2YwZjBmCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvc2l0ZVRlc3RMb2NhbFNpdGUvcGx1Z2lucy9idW5kbGVBbmRQbHVnaW5NYW5pZmVzdHNfMS4wLjMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTAsMCArMSwxMiBAQAorTWFuaWZlc3QtVmVyc2lvbjogMS4wCitHZW5lcmF0ZWQtZnJvbTogMTA3NzA2MjYwMzcwOAorQnVuZGxlLU5hbWU6IFRlc3QKK0J1bmRsZS1WZXJzaW9uOiAxLjAuMworQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuYnVuZGxlQW5kUGx1Z2luTWFuaWZlc3RzQlVORExFUEFSU0VECitCdW5kbGUtVmVuZG9yOiBFY2xpcHNlLm9yZworQnVuZGxlLUNsYXNzUGF0aDogcGx1Z2luLmphcgorTGVnYWN5OiB0cnVlCitCdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5idW5kbGVBbmRQbHVnaW5NYW5pZmVzdHMuQWN0aXZhdG9yCitSZXF1aXJlLUJ1bmRsZTogCisgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAorIG9yZy5lY2xpcHNlLnVpCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9zaXRlVGVzdExvY2FsU2l0ZS9wbHVnaW5zL2J1bmRsZUFuZFBsdWdpbk1hbmlmZXN0c18xLjAuMy9wbHVnaW4ueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvc2l0ZVRlc3RMb2NhbFNpdGUvcGx1Z2lucy9idW5kbGVBbmRQbHVnaW5NYW5pZmVzdHNfMS4wLjMvcGx1Z2luLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjU5ZGRiCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvc2l0ZVRlc3RMb2NhbFNpdGUvcGx1Z2lucy9idW5kbGVBbmRQbHVnaW5NYW5pZmVzdHNfMS4wLjMvcGx1Z2luLnhtbApAQCAtMCwwICsxLDMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cGx1Z2luIG5hbWU9IkpVbml0IFRlc3QgRnJhbWV3b3JrIiBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuYnVuZGxlQW5kUGx1Z2luTWFuaWZlc3RzIiB2ZXJzaW9uPSIxLjAuMyIgdmVuZG9yLW5hbWU9IkVjbGlwc2Uub3JnIj4KKzwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3NpdGVUZXN0TG9jYWxTaXRlL3BsdWdpbnMvYnVuZGxlTWFuaWZlc3RfMS4wLjEvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9zaXRlVGVzdExvY2FsU2l0ZS9wbHVnaW5zL2J1bmRsZU1hbmlmZXN0XzEuMC4xL01FVEEtSU5GL01BTklGRVNULk1GCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMjJkYzgKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9zaXRlVGVzdExvY2FsU2l0ZS9wbHVnaW5zL2J1bmRsZU1hbmlmZXN0XzEuMC4xL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0wLDAgKzEsMTIgQEAKK01hbmlmZXN0LVZlcnNpb246IDEuMAorR2VuZXJhdGVkLWZyb206IDEwNzcwNjI2MDM3MDgKK0J1bmRsZS1OYW1lOiBUZXN0CitCdW5kbGUtVmVyc2lvbjogMS4wLjEKK0J1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmJ1bmRsZU1hbmlmZXN0OyBzaW5nbGV0b249dHJ1ZQorQnVuZGxlLVZlbmRvcjogRWNsaXBzZS5vcmcKK0J1bmRsZS1DbGFzc1BhdGg6IHBsdWdpbi5qYXIKK0xlZ2FjeTogdHJ1ZQorQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuYnVuZGxlTWFuaWZlc3QuQWN0aXZhdG9yCitSZXF1aXJlLUJ1bmRsZTogCisgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAorIG9yZy5lY2xpcHNlLnVpCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9zaXRlVGVzdExvY2FsU2l0ZS9wbHVnaW5zL2ZlYXR1cmUxX3BsdWdpbjJfNS4wLjAvcGx1Z2luLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3NpdGVUZXN0TG9jYWxTaXRlL3BsdWdpbnMvZmVhdHVyZTFfcGx1Z2luMl81LjAuMC9wbHVnaW4ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmODFjNDYKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9zaXRlVGVzdExvY2FsU2l0ZS9wbHVnaW5zL2ZlYXR1cmUxX3BsdWdpbjJfNS4wLjAvcGx1Z2luLnhtbApAQCAtMCwwICsxLDggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQorPHBsdWdpbiBuYW1lPSJKVW5pdCBUZXN0IEZyYW1ld29yayIgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjIiIHZlcnNpb249IjUuMC4wIiB2ZW5kb3ItbmFtZT0ianVuaXQub3JnIj4NCisgIDxydW50aW1lPg0KKyAgICA8bGlicmFyeSBuYW1lPSJqdW5pdC5qYXIiPg0KKyAgICAgIDxleHBvcnQgbmFtZT0iKiIvPg0KKyAgICA8L2xpYnJhcnk+DQorICA8L3J1bnRpbWU+DQorPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvc2l0ZVRlc3RMb2NhbFNpdGUvcGx1Z2lucy9mZWF0dXJlMV9wbHVnaW4yXzUuMC4wL3NyYy5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9zaXRlVGVzdExvY2FsU2l0ZS9wbHVnaW5zL2ZlYXR1cmUxX3BsdWdpbjJfNS4wLjAvc3JjLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDRkNjA5Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvc2l0ZVRlc3RMb2NhbFNpdGUvcGx1Z2lucy9mZWF0dXJlMV9wbHVnaW4yXzUuMC4wL3NyYy5qYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvc2l0ZVRlc3RMb2NhbFNpdGUvcGx1Z2lucy9mZWF0dXJlMV9wbHVnaW4yXzUuMC4xL3BsdWdpbi54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9zaXRlVGVzdExvY2FsU2l0ZS9wbHVnaW5zL2ZlYXR1cmUxX3BsdWdpbjJfNS4wLjEvcGx1Z2luLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmIzYzI2Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvc2l0ZVRlc3RMb2NhbFNpdGUvcGx1Z2lucy9mZWF0dXJlMV9wbHVnaW4yXzUuMC4xL3BsdWdpbi54bWwKQEAgLTAsMCArMSw4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KKzxwbHVnaW4gbmFtZT0iSlVuaXQgVGVzdCBGcmFtZXdvcmsiIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4yIiB2ZXJzaW9uPSI1LjAuMSIgdmVuZG9yLW5hbWU9Imp1bml0Lm9yZyI+DQorICA8cnVudGltZT4NCisgICAgPGxpYnJhcnkgbmFtZT0ianVuaXQuamFyIj4NCisgICAgICA8ZXhwb3J0IG5hbWU9IioiLz4NCisgICAgPC9saWJyYXJ5Pg0KKyAgPC9ydW50aW1lPg0KKzwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3NpdGVUZXN0TG9jYWxTaXRlL3BsdWdpbnMvZmVhdHVyZTFfcGx1Z2luMl81LjAuMS9zcmMuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvc2l0ZVRlc3RMb2NhbFNpdGUvcGx1Z2lucy9mZWF0dXJlMV9wbHVnaW4yXzUuMC4xL3NyYy5qYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ0ZDYwOQotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3NpdGVUZXN0TG9jYWxTaXRlL3BsdWdpbnMvZmVhdHVyZTFfcGx1Z2luMl81LjAuMS9zcmMuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3NpdGVUZXN0TG9jYWxTaXRlL3BsdWdpbnMvbm90QnVuZGxlTWFuaWZlc3RfMS4wLjIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9zaXRlVGVzdExvY2FsU2l0ZS9wbHVnaW5zL25vdEJ1bmRsZU1hbmlmZXN0XzEuMC4yL01FVEEtSU5GL01BTklGRVNULk1GCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjMjQyOTUKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9zaXRlVGVzdExvY2FsU2l0ZS9wbHVnaW5zL25vdEJ1bmRsZU1hbmlmZXN0XzEuMC4yL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0wLDAgKzEsOSBAQAorTWFuaWZlc3QtVmVyc2lvbjogMS4wCitHZW5lcmF0ZWQtZnJvbTogMTA3NzA2MjYwMzcwOAorQnVuZGxlLU5hbWU6IE5vdCBWYWxpZCBCdW5kbGUgTWFuaWZlc3QKK0J1bmRsZS1WZXJzaW9uOiAxLjAuMgorQnVuZGxlLVZlbmRvcjogRWNsaXBzZS5vcmcKK0J1bmRsZS1DbGFzc1BhdGg6IHBsdWdpbi5qYXIKK1JlcXVpcmUtQnVuZGxlOiAKKyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCisgb3JnLmVjbGlwc2UudWkKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3Rlc3RBUEkvZmVhdHVyZXMvZmVhdHVyZTMvZmVhdHVyZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS90ZXN0QVBJL2ZlYXR1cmVzL2ZlYXR1cmUzL2ZlYXR1cmUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4NzhkNjAKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS90ZXN0QVBJL2ZlYXR1cmVzL2ZlYXR1cmUzL2ZlYXR1cmUueG1sCkBAIC0wLDAgKzEsMTIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTMiIGltYWdlPSJmZWF0dXJlMS5naWYiIGxhYmVsPSJUaGlyZCBGZWF0dXJlIiBwcm92aWRlci1uYW1lPSJTbWFydCBDb21wYW55IiB2ZXJzaW9uPSIxLjAuMCIgPgorICA8ZGVzY3JpcHRpb24+RGVzY3JpcHRpb248L2Rlc2NyaXB0aW9uPgorICA8Y29weXJpZ2h0PmNvcHlyaWdodDwvY29weXJpZ2h0PgorICA8bGljZW5zZT5saWNlbnNlPC9saWNlbnNlPgorICA8dXJsPgorICAgIDx1cGRhdGUgbGFiZWw9IlVSTCB0byB1cGRhdGUgdGhlIGZlYXR1cmUiIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iLz4KKyAgICA8ZGlzY292ZXJ5IGxhYmVsPSJEaXNjb3ZlcnkgMSIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIi8+CisgICAgPGRpc2NvdmVyeSBsYWJlbD0iRGlzY292ZXJ5IDIiIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyIvPgorICA8L3VybD4KKyAgPHBsdWdpbiBkb3dubG9hZC1zaXplPSIxNTAwIiBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjEiIGluc3RhbGwtc2l6ZT0iMTAwMCIgZnJhZ21lbnQ9ImZhbHNlIiBubD0idXMiIG9zPSJXSU4zMixMSU5VWCIgdmVyc2lvbj0iMS4xLjEiLz4KKzwvZmVhdHVyZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS90ZXN0QVBJL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjFfMS4xLjEvcGx1Z2luLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3Rlc3RBUEkvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMS9wbHVnaW4ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMTg0NmMKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS90ZXN0QVBJL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjFfMS4xLjEvcGx1Z2luLnhtbApAQCAtMCwwICsxLDggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cGx1Z2luIG5hbWU9IkpVbml0IFRlc3QgRnJhbWV3b3JrIiBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMSIgdmVyc2lvbj0iMy41LjYiIHZlbmRvci1uYW1lPSJqdW5pdC5vcmciPgorICA8cnVudGltZT4KKyAgICA8bGlicmFyeSBuYW1lPSJqdW5pdC5qYXIiPgorICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+CisgICAgPC9saWJyYXJ5PgorICA8L3J1bnRpbWU+Cis8L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS90ZXN0QVBJL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjFfMS4xLjEvc3JjLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3Rlc3RBUEkvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMS9zcmMuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkNGQ2MDkKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS90ZXN0QVBJL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjFfMS4xLjEvc3JjLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS90ZXN0QVBJL3NpdGUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvdGVzdEFQSS9zaXRlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzE1ZDQzCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvdGVzdEFQSS9zaXRlLnhtbApAQCAtMCwwICsxLDE5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHNpdGUgdHlwZT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmlsZSI+Cis8ZGVzY3JpcHRpb24gdXJsPSJpbmZvL3NpdGVJbmZvLmh0bWwiLz4KKyAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9mZWF0dXJlMyI+CisgICAgPGNhdGVnb3J5IG5hbWU9ImVjbGlwc2UvVU1MIi8+CisgIDwvZmVhdHVyZT4KKyAgPGZlYXR1cmUgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2ZlYXR1cmUyIj4KKyAgICA8Y2F0ZWdvcnkgbmFtZT0iZWNsaXBzZS9KMkVFIi8+CisgIDwvZmVhdHVyZT4KKyAgPGZlYXR1cmUgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2ZlYXR1cmUxIj4KKyAgICA8Y2F0ZWdvcnkgbmFtZT0iZWNsaXBzZS9KMkVFIi8+CisgIDwvZmVhdHVyZT4KKyAgPGFyY2hpdmUgcGF0aD0icGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMS5qYXIiIHVybD0icGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMSIvPiAgICAKKyAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iSjJFRSB0b29scyIgbmFtZT0iZWNsaXBzZS9KMkVFIi8+CisgIDxjYXRlZ29yeS1kZWYgbGFiZWw9IkVKQiBUb29scyIgbmFtZT0iZWNsaXBzZS9KMkVFL0VKQiIvPgorICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJVTUwgdG9vbHMiIG5hbWU9ImVjbGlwc2UvVU1MIi8+CisgIDxjYXRlZ29yeS1kZWYgbGFiZWw9Ik1lc3NhZ2luZyBUb29scyIgbmFtZT0iQjJCIi8+CisgIDxjYXRlZ29yeS1kZWYgbGFiZWw9IkVjbGlwc2UgVG9vbHMiIG5hbWU9ImVjbGlwc2UiLz4KKzwvc2l0ZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS92YWxpZGF0aW9uL3NpdGUyLy5lY2xpcHNlcHJvZHVjdCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3ZhbGlkYXRpb24vc2l0ZTIvLmVjbGlwc2Vwcm9kdWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiODI5YWEKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS92YWxpZGF0aW9uL3NpdGUyLy5lY2xpcHNlcHJvZHVjdApAQCAtMCwwICsxLDMgQEAKK2lkPWFub3RoZXIucHJvZHVjdC5pZA0KK25hbWU9TmFtZSBvZiB0aGUgcHJvZHVjdA0KK3Zlcj0xLjIuNApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3ZhbGlkYXRpb24vc2l0ZTMvLmVjbGlwc2VleHRlbnNpb24gYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS92YWxpZGF0aW9uL3NpdGUzLy5lY2xpcHNlZXh0ZW5zaW9uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkNzJkZjcKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS92YWxpZGF0aW9uL3NpdGUzLy5lY2xpcHNlZXh0ZW5zaW9uCkBAIC0wLDAgKzEgQEAKK2lkPWlkLm9mLmV4dGVuZGVkLnByb2R1Y3QKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS92YWxpZGF0aW9uL3NpdGU0L2VjbGlwc2UvLmVjbGlwc2VleHRlbnNpb24gYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS92YWxpZGF0aW9uL3NpdGU0L2VjbGlwc2UvLmVjbGlwc2VleHRlbnNpb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNjODRlOQotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3ZhbGlkYXRpb24vc2l0ZTQvZWNsaXBzZS8uZWNsaXBzZWV4dGVuc2lvbgpAQCAtMCwwICsxIEBACitpZD1kaWZmZXJlbnQucHJvZHVjdC5pZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3ZhbGlkYXRpb24vc2l0ZTUvLmVjbGlwc2VVTSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3ZhbGlkYXRpb24vc2l0ZTUvLmVjbGlwc2VVTQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTZjNTIyCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvdmFsaWRhdGlvbi9zaXRlNS8uZWNsaXBzZVVNCkBAIC0wLDAgKzEsMyBAQAoraWQ9b3JnLmVjbGlwc2UucGxhdGZvcm0NCituYW1lPWEgUHJvZHVjdCANCit2ZXJzaW9uPTMuNS42ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvdmFsaWRhdGlvbi9zaXRlNS9lY2xpcHNlLy5lY2xpcHNlZXh0ZW5zaW9uIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvdmFsaWRhdGlvbi9zaXRlNS9lY2xpcHNlLy5lY2xpcHNlZXh0ZW5zaW9uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmZjQwYTMKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS92YWxpZGF0aW9uL3NpdGU1L2VjbGlwc2UvLmVjbGlwc2VleHRlbnNpb24KQEAgLTAsMCArMSwzIEBACitpZD1vcmcuZWNsaXBzZS5wbGF0Zm9ybQorbmFtZT1FY2xpcHNlIFBsYXRmb3JtCit2ZXJzaW9uPTMuMS4wCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS92YWxpZGF0aW9uL3NpdGU2Ly5lY2xpcHNlVU0gYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS92YWxpZGF0aW9uL3NpdGU2Ly5lY2xpcHNlVU0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk3ZjlmOAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3ZhbGlkYXRpb24vc2l0ZTYvLmVjbGlwc2VVTQpAQCAtMCwwICsxIEBACitpZD1vcmcuZWNsaXBzZS5zZGsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS92YWxpZGF0aW9uL3NpdGU2L2NoaWxkcmVuL2NoaWxkcmVuL2VjbGlwc2UvLmVjbGlwc2VleHRlbnNpb24gYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS92YWxpZGF0aW9uL3NpdGU2L2NoaWxkcmVuL2NoaWxkcmVuL2VjbGlwc2UvLmVjbGlwc2VleHRlbnNpb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk3ZjlmOAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3ZhbGlkYXRpb24vc2l0ZTYvY2hpbGRyZW4vY2hpbGRyZW4vZWNsaXBzZS8uZWNsaXBzZWV4dGVuc2lvbgpAQCAtMCwwICsxIEBACitpZD1vcmcuZWNsaXBzZS5zZGsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS94bWxzL2FwaXRlc3RzL29yZy5lY2xpcHNlLnRlc3QuZmVhdHVyZV8xLjAuMC9mZWF0dXJlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3htbHMvYXBpdGVzdHMvb3JnLmVjbGlwc2UudGVzdC5mZWF0dXJlXzEuMC4wL2ZlYXR1cmUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1MTE4MDAKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS94bWxzL2FwaXRlc3RzL29yZy5lY2xpcHNlLnRlc3QuZmVhdHVyZV8xLjAuMC9mZWF0dXJlLnhtbApAQCAtMCwwICsxLDEzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KKzxmZWF0dXJlIGlkPSJvcmcudGVzdDEuaWRlbnQxIiBsYWJlbD0iRmVhdHVyZSBPbmUiIG5sPSJlbl91cyxmcixkZSIgb3M9Ik9TX1dJTjMyLE9TX0xJTlVYIiBwcm92aWRlci1uYW1lPSJPYmplY3QgVGVjaG5vbG9neSBJbnRlcm5hdGlvbmFsIiB2ZXJzaW9uPSIxLjAuMCIgd3M9IldTX1dJTjMyLFdTX01PVElGLFdTX0dUSyI+DQorICA8ZGVzY3JpcHRpb24+VGVzdCBmZWF0dXJlIGZvciB0ZXN0SWRlbnRpZmllciB0ZXN0PC9kZXNjcmlwdGlvbj4NCisgIDxjb3B5cmlnaHQ+Q29weXJpZ2h0IChjKSB0aGUgY29tcGFueTwvY29weXJpZ2h0Pg0KKyAgPGxpY2Vuc2U+RG8geW91IGFjY2VwdCB0aGUgbGljZW5zZSA/PC9saWNlbnNlPg0KKyAgPHVybD4NCisgICAgPHVwZGF0ZSBsYWJlbD0iVVJMIHRvIHVwZGF0ZSB0ZWggZmVhdHVyZSIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIi8+DQorICAgIDxkaXNjb3ZlcnkgbGFiZWw9IkRpc2NvdmVyeSAxIiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciLz4NCisgICAgPGRpc2NvdmVyeSBsYWJlbD0iRGlzY292ZXJ5IDIiIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyIvPg0KKyAgPC91cmw+DQorICA8cGx1Z2luIGRvd25sb2FkLXNpemU9IjE1MDAiIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4xIiBpbnN0YWxsLXNpemU9IjEwMDAiIGZyYWdtZW50PSJmYWxzZSIgbmw9InVzIiBvcz0iT1NfV0lOMzIiIHZlcnNpb249IjMuNS42IiB3cz0iV1NfV0lOMzIiLz4NCisgIDxwbHVnaW4gZG93bmxvYWQtc2l6ZT0iMTIwMCIgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjIiIGluc3RhbGwtc2l6ZT0iOTc4IiBmcmFnbWVudD0iZmFsc2UiIHZlcnNpb249IjUuMC4wIi8+DQorPC9mZWF0dXJlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3htbHMvYXBpdGVzdHMvb3JnLmVjbGlwc2VfdGVzdF9mZWF0dXJlL2ZlYXR1cmUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEveG1scy9hcGl0ZXN0cy9vcmcuZWNsaXBzZV90ZXN0X2ZlYXR1cmUvZmVhdHVyZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYwNWNkYQotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3htbHMvYXBpdGVzdHMvb3JnLmVjbGlwc2VfdGVzdF9mZWF0dXJlL2ZlYXR1cmUueG1sCkBAIC0wLDAgKzEsMTMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQorPGZlYXR1cmUgaWQ9Im9yZy50ZXN0MS5pZGVudDIiIGxhYmVsPSJGZWF0dXJlIE9uZSIgbmw9ImVuX3VzLGZyLGRlIiBvcz0iT1NfV0lOMzIsT1NfTElOVVgiIHByb3ZpZGVyLW5hbWU9Ik9iamVjdCBUZWNobm9sb2d5IEludGVybmF0aW9uYWwiIHZlcnNpb249IjEuMC4wIiB3cz0iV1NfV0lOMzIsV1NfTU9USUYsV1NfR1RLIj4NCisgIDxkZXNjcmlwdGlvbj5UZXN0IGZlYXR1cmUgZm9yIHRlc3RJZGVudGlmaWVyIHRlc3Q8L2Rlc2NyaXB0aW9uPg0KKyAgPGNvcHlyaWdodD5Db3B5cmlnaHQgKGMpIHRoZSBjb21wYW55PC9jb3B5cmlnaHQ+DQorICA8bGljZW5zZT5EbyB5b3UgYWNjZXB0IHRoZSBsaWNlbnNlID88L2xpY2Vuc2U+DQorICA8dXJsPg0KKyAgICA8dXBkYXRlIGxhYmVsPSJVUkwgdG8gdXBkYXRlIHRlaCBmZWF0dXJlIiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciLz4NCisgICAgPGRpc2NvdmVyeSBsYWJlbD0iRGlzY292ZXJ5IDEiIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyIvPg0KKyAgICA8ZGlzY292ZXJ5IGxhYmVsPSJEaXNjb3ZlcnkgMiIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIi8+DQorICA8L3VybD4NCisgIDxwbHVnaW4gZG93bmxvYWQtc2l6ZT0iMTUwMCIgdXJsPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4xIiBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMSIgaW5zdGFsbC1zaXplPSIxMDAwIiBmcmFnbWVudD0iZmFsc2UiIG5sPSJ1cyIgb3M9Ik9TX1dJTjMyIiB2ZXJzaW9uPSIzLjUuNiIgd3M9IldTX1dJTjMyIi8+DQorICA8cGx1Z2luIGRvd25sb2FkLXNpemU9IjEyMDAiIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4yIiBpbnN0YWxsLXNpemU9Ijk3OCIgZnJhZ21lbnQ9ImZhbHNlIiB2ZXJzaW9uPSI1LjAuMCIvPg0KKzwvZmVhdHVyZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS94bWxzL2ZlYXR1cmVfMS4wLjAvZmVhdHVyZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS94bWxzL2ZlYXR1cmVfMS4wLjAvZmVhdHVyZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRlZTEzOQotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3htbHMvZmVhdHVyZV8xLjAuMC9mZWF0dXJlLnhtbApAQCAtMCwwICsxLDEzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KKzxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMSIgaW1hZ2U9ImZlYXR1cmUxLmdpZiIgbGFiZWw9IkZlYXR1cmUgT25lIiBubD0iZW4sZnIsZGUiIG9zPSJPU19XSU4zMixPU19MSU5VWCIgcHJvdmlkZXItbmFtZT0iT2JqZWN0IFRlY2hub2xvZ3kgSW50ZXJuYXRpb25hbCIgdmVyc2lvbj0iMS4wLjQiIHdzPSJXU19XSU4zMixXU19NT1RJRixXU19HVEsiPg0KKyAgPGRlc2NyaXB0aW9uPkkgYmVsaWV2ZSB0aGlzIGlzIHRoZSBkZXNjcmlwdGlvbiBvZiBmZWF0dXJlIDEsIHdlbGwsIGZlYXR1cmUgMSBpcyBhbiBleGNlcHRpb25hbCBmZWF0dXJlIHRoYXQgeW91IHNob3VsZCBpbnN0YWxsIHJpZ2h0IE5PVyBvbiB5b3VyIG1hY2hpbmUuLi4gdHJ5IGl0LjwvZGVzY3JpcHRpb24+DQorICA8Y29weXJpZ2h0Pk9rLCBub3csIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgY29tcGxleCBDb3B5cmlnaHQgIG5vdCBwcmVwYXJlZCBieSBhIGxhd3llciBDb3B5cmlnaHQgKGMpIHRoZSBjb21wYW55PC9jb3B5cmlnaHQ+DQorICA8bGljZW5zZT4jMSBEbyB5b3UgYWNjZXB0IGl0ICMyIHlvdSBkbyBudG8gYWNjZXB0IGl0IC4uLkRvIHlvdSBhY2NwdCBpdCA/PC9saWNlbnNlPg0KKyAgPHVybD4NCisgICAgPHVwZGF0ZSBsYWJlbD0iVVJMIHRvIHVwZGF0ZSB0aGUgZmVhdHVyZSIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3BhdGgvZmVhdHVyZTEvIi8+DQorICAgIDxkaXNjb3ZlcnkgbGFiZWw9IkRpc2NvdmVyeSAxIiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciLz4NCisgICAgPGRpc2NvdmVyeSBsYWJlbD0iRGlzY292ZXJ5IDIiIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyIvPg0KKyAgPC91cmw+DQorICA8cGx1Z2luIGRvd25sb2FkLXNpemU9IjE1MDAiIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4xIiBpbnN0YWxsLXNpemU9IjEwMDAiIGZyYWdtZW50PSJmYWxzZSIgbmw9InVzIiBvcz0iT1NfV0lOMzIiIHZlcnNpb249IjMuNS42IiB3cz0iV1NfV0lOMzIiLz4NCisgIDxwbHVnaW4gZG93bmxvYWQtc2l6ZT0iMTIwMCIgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjIiIGluc3RhbGwtc2l6ZT0iOTc4IiBmcmFnbWVudD0iZmFsc2UiIHZlcnNpb249IjUuMC4wIi8+DQorPC9mZWF0dXJlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3htbHMvZmVhdHVyZV8xLjAuMC9mZWF0dXJlMS5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS94bWxzL2ZlYXR1cmVfMS4wLjAvZmVhdHVyZTEuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzZTMwYTIKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS94bWxzL2ZlYXR1cmVfMS4wLjAvZmVhdHVyZTEuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3htbHMvc2l0ZTEvc2l0ZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS94bWxzL3NpdGUxL3NpdGUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0ODIzYzAKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS94bWxzL3NpdGUxL3NpdGUueG1sCkBAIC0wLDAgKzEsMjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQorPHNpdGUgdXJsPSJpbmZvIiB0eXBlPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5maWxlIj4NCisgIDxmZWF0dXJlIGlkPSJvcmcuaXN2LmZlYXR1cmUzIiB1cmw9Ind3dy5lY2xpcHNlLm9yZy9mZWF0dXJlMyIgdmVyc2lvbj0iMy40LjUiPg0KKyAgICA8Y2F0ZWdvcnkgbmFtZT0iZWNsaXBzZS9VTUwiLz4NCisgIDwvZmVhdHVyZT4NCisgIDxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMiIgdXJsPSJ3d3cuZWNsaXBzZS5vcmcvZmVhdHVyZTIiIHZlcnNpb249IjMuNC42Ij4NCisgICAgPGNhdGVnb3J5IG5hbWU9ImVjbGlwc2UvSjJFRSIvPg0KKyAgPC9mZWF0dXJlPg0KKyAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZhdHVyZTEiIHVybD0id3d3LmVjbGlwc2Uub3JnL2ZlYXR1cmUxIiB2ZXJzaW9uPSIyLjMuNSI+DQorICAgIDxjYXRlZ29yeSBuYW1lPSJlY2xpcHNlL0oyRUUiLz4NCisgIDwvZmVhdHVyZT4NCisgIDxhcmNoaXZlIHBhdGg9Im9yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xIiB1cmw9Ind3dy5lY2xpcHNlLm9yZy9wbHVpZ24xIi8+DQorICA8YXJjaGl2ZSBwYXRoPSJvcmcuZWNsaXBzZS51cGRhdGUuYXJjaGl2ZTIiIHVybD0id3d3LmVjbGlwc2Uub3JnL3BsdWdpbjIiLz4NCisgIDxhcmNoaXZlIHBhdGg9Im9yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4zIiB1cmw9Ind3dy5lY2xpcHNlLm9yZy9wbHVnaW4zIi8+DQorICA8YXJjaGl2ZSBwYXRoPSJvcmcuZWNsaXBzZS51bmtub3duLnBsdWdpbiIgdXJsPSJ3d3cuZWNsaXBzZS5vcmcvcGx1Z2lucy9wbHVnaW40Ii8+DQorICA8YXJjaGl2ZSBwYXRoPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5mb28xIiB1cmw9Ind3dy5lY2xpcHNlLm9yZy9wbHVnaW4xIi8+DQorICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJKMkVFIHRvb2xzIiBuYW1lPSJlY2xpcHNlL0oyRUUiLz4NCisgIDxjYXRlZ29yeS1kZWYgbGFiZWw9IkVKQiBUb29scyIgbmFtZT0iZWNsaXBzZS9KMkVFL0VKQiIvPg0KKyAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iVU1MIHRvb2xzIiBuYW1lPSJlY2xpcHNlL1VNTCIvPg0KKyAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iTWVzc2FnaW5nIFRvb2xzIiBuYW1lPSJCMkIiLz4NCisgIDxjYXRlZ29yeS1kZWYgbGFiZWw9IkVjbGlwc2UgdG9vbHMiIG5hbWU9ImVjbGlwc2UiLz4NCis8L3NpdGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3BsdWdpbi54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvcGx1Z2luLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTU0MzY1Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3BsdWdpbi54bWwKQEAgLTAsMCArMSwyNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCis8P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+DQorPHBsdWdpbj4NCisNCisgICAgIDxleHRlbnNpb24NCisgICAgICAgICBpZD0iZmVhdHVyZTEiDQorICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmVUeXBlcyI+DQorICAgICAgPGZlYXR1cmUtZmFjdG9yeQ0KKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5GZWF0dXJlRXhlY3V0YWJsZUZhY3RvcnkiPg0KKyAgICAgIDwvZmVhdHVyZS1mYWN0b3J5Pg0KKyAgIDwvZXh0ZW5zaW9uPg0KKyAgIDxleHRlbnNpb24NCisgICAgICAgICBpZD0iZnRwIg0KKyAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5zaXRlVHlwZXMiPg0KKyAgICAgIDxzaXRlLWZhY3RvcnkNCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmltcGxlbWVudGF0aW9uLlNpdGVGVFBGYWN0b3J5Ij4NCisgICAgICA8L3NpdGUtZmFjdG9yeT4NCisgICA8L2V4dGVuc2lvbj4NCisgICA8ZXh0ZW5zaW9uDQorICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVxdWlub3guaHR0cC5yZWdpc3RyeS5yZXNvdXJjZXMiPg0KKyAgICAgIDxyZXNvdXJjZQ0KKyAgICAgICAgICAgIGFsaWFzPSIvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUudXBkYXRldGVzdHMiDQorICAgICAgICAgICAgYmFzZS1uYW1lPSIvd2Vic2VydmVyIj4NCisgICAgICA8L3Jlc291cmNlPg0KKyAgIDwvZXh0ZW5zaW9uPg0KKw0KKzwvcGx1Z2luPg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL0FsbFRlc3RzLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9BbGxUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3ZmI0NWQKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9BbGxUZXN0cy5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHM7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworCitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmFwaS5BbGxBUElUZXN0czsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuYnJhbmRpbmcuKjsKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb25maWd1cmF0aW9ucy5BbGxDb25maWd1cmF0aW9uc1Rlc3RzOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlLlRlc3RFcnJvclJlY292ZXJ5TG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlLmJvb3QuQWxsUGxhdGZvcm1Db25maWd1cmF0aW9uVGVzdHM7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLm1pcnJvci4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5tb2RlbC5BbGxNb2RlbFRlc3RzOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5uZXN0ZWRmZWF0dXJlcy5BbGxOZXN0ZWRUZXN0czsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMucGFyc2VyLkFsbFBhcnNlclRlc3RzOworLy9pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnBlcmZtcy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5yZWNvbmNpbGlhdGlvbi5BbGxSZWNvbmNpbGlhdGlvblRlc3RzOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5yZWd1bGFySW5zdGFsbC5BbGxSZWd1bGFySW5zdGFsbFRlc3RzOworLy9pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnJlZ3VsYXJSZW1vdmUuQWxsUmVndWxhclJlbW92ZVRlc3RzOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5zaXRldmFsaWRhdGlvbi5BbGxTaXRlVmFsaWRhdGlvblRlc3RzOworLy9pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnN0YW5kYWxvbmUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMudHlwZXMuQWxsVHlwZXNUZXN0czsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMudWl2YWx1ZXMuQWxsQ29yZVVJVGVzdHM7CisKK3B1YmxpYyBjbGFzcyBBbGxUZXN0cyBleHRlbmRzIFRlc3RTdWl0ZSB7CisJcHVibGljIEFsbFRlc3RzKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKwlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOworCQlzdWl0ZS5zZXROYW1lKCJBbGwgVXBkYXRlIE1hbmFnZXIgVGVzdHMiKTsKKwkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RFcnJvclJlY292ZXJ5TG9nLmNsYXNzKSk7CisJCXN1aXRlLmFkZFRlc3QoQWxsTWlycm9yVGVzdHMuc3VpdGUoKSk7CQorCQlzdWl0ZS5hZGRUZXN0KEFsbFNpdGVWYWxpZGF0aW9uVGVzdHMuc3VpdGUoKSk7CisJCXN1aXRlLmFkZFRlc3QoQWxsUGxhdGZvcm1Db25maWd1cmF0aW9uVGVzdHMuc3VpdGUoKSk7CisJCXN1aXRlLmFkZFRlc3QoQWxsUmVndWxhckluc3RhbGxUZXN0cy5zdWl0ZSgpKTsKKwkJc3VpdGUuYWRkVGVzdChBbGxBUElUZXN0cy5zdWl0ZSgpKTsKKwkJc3VpdGUuYWRkVGVzdChBbGxQYXJzZXJUZXN0cy5zdWl0ZSgpKTsKKwkJc3VpdGUuYWRkVGVzdChBbGxDb3JlVUlUZXN0cy5zdWl0ZSgpKTsKKy8vCQlzdWl0ZS5hZGRUZXN0KEFsbENvbmZpZ3VyYXRpb25zVGVzdHMuc3VpdGUoKSk7CisJCXN1aXRlLmFkZFRlc3QoQWxsVHlwZXNUZXN0cy5zdWl0ZSgpKTsKKy8vCQlzdWl0ZS5hZGRUZXN0KEFsbFJlZ3VsYXJSZW1vdmVUZXN0cy5zdWl0ZSgpKTsKKwkJc3VpdGUuYWRkVGVzdChBbGxOZXN0ZWRUZXN0cy5zdWl0ZSgpKTsJCisJCXN1aXRlLmFkZFRlc3QoQWxsUmVjb25jaWxpYXRpb25UZXN0cy5zdWl0ZSgpKTsJCQkJCQorCQlzdWl0ZS5hZGRUZXN0KEFsbE1vZGVsVGVzdHMuc3VpdGUoKSk7CisJCXN1aXRlLmFkZFRlc3QoQWxsQnJhbmRpbmdUZXN0cy5zdWl0ZSgpKTsKKwkJLy9zdWl0ZS5hZGRUZXN0KEFsbFN0YW5kYWxvbmVUZXN0cy5zdWl0ZSgpKTsKKwkJLy9zdWl0ZS5hZGRUZXN0KEFsbFBlcmZvcm1hbmNlVGVzdHMuc3VpdGUoKSk7CisJCXJldHVybiBzdWl0ZTsKKwl9Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9VcGRhdGVNYW5hZ2VyVGVzdENhc2UuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL1VwZGF0ZU1hbmFnZXJUZXN0Q2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzY2MyZWQKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9VcGRhdGVNYW5hZ2VyVGVzdENhc2UuamF2YQpAQCAtMCwwICsxLDE2MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0czsKKworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuKjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsdWdpbkRlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLklDb25maWd1cmVkU2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklQbHVnaW5FbnRyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLlVwZGF0ZU1hbmFnZXJVdGlsczsKKy8qKgorICogQWxsIFVwZGF0ZSBNYW5hZ2VyIFRlc3QgY2FzZXMgbXVzdCBzdWJjbGFzcyB0aGlzIGJhc2UgdGVzdCBjYXNlLgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVXBkYXRlTWFuYWdlclRlc3RDYXNlIGV4dGVuZHMgVGVzdENhc2UgeworCisJcHJvdGVjdGVkIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBidW5kbGU7CisJcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZGF0YVBhdGg7CisKKwlwcm90ZWN0ZWQgc3RhdGljIFVSTCBTT1VSQ0VfRklMRV9TSVRFOworCXByb3RlY3RlZCBzdGF0aWMgVVJMIFNPVVJDRV9GSUxFX1NJVEVfSU5TVEFMTEVEOworCXByb3RlY3RlZCBzdGF0aWMgVVJMIFNPVVJDRV9IVFRQX1NJVEU7CisJcHJvdGVjdGVkIHN0YXRpYyBVUkwgVEFSR0VUX0ZJTEVfU0lURTsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBX1BBVEggPSAiZGF0YS8iOworCisJLyoqCisJICogRGVmYXVsdCBDb25zdHJ1Y3RvcgorCSAqLworCXB1YmxpYyBVcGRhdGVNYW5hZ2VyVGVzdENhc2UoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJCXRyeSB7CisJCQlpbml0KCk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlmYWlsKGUudG9TdHJpbmcoKSk7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQl9CisJfQorCisJcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGluaXQoKSB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKKworCQlJUGx1Z2luRGVzY3JpcHRvciBkYXRhRGVzYyA9IFBsYXRmb3JtLmdldFBsdWdpblJlZ2lzdHJ5KCkuZ2V0UGx1Z2luRGVzY3JpcHRvcigib3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUiKTsKKwkJVVJMIHJlc29sdmVkVVJMID0gUGxhdGZvcm0uYXNMb2NhbFVSTChQbGF0Zm9ybS5yZXNvbHZlKGRhdGFEZXNjLmdldEluc3RhbGxVUkwoKSkpOworCQlVUkwgZGF0YVVSTCA9IG5ldyBVUkwocmVzb2x2ZWRVUkwsIERBVEFfUEFUSCk7CisJCWRhdGFQYXRoID0gZGF0YVVSTC5nZXRGaWxlKCk7CisJCVN0cmluZyBob21lUGF0aCA9IChTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaW8udG1wZGlyIikpLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpOworCisJCWlmIChidW5kbGUgPT0gbnVsbCkgeworCQkJQ2xhc3NMb2FkZXIgbCA9IG5ldyBVUkxDbGFzc0xvYWRlcihuZXcgVVJMW10geyBkYXRhVVJMIH0sIG51bGwpOworCQkJYnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJyZXNvdXJjZXMiLCBMb2NhbGUuZ2V0RGVmYXVsdCgpLCBsKTsKKwkJfQorCisJCXRyeSB7CisJCQlTT1VSQ0VfRklMRV9TSVRFID0gbmV3IEZpbGUoZGF0YVBhdGgpLnRvVVJMKCk7CisJCQlTT1VSQ0VfRklMRV9TSVRFX0lOU1RBTExFRCA9IG5ldyBGaWxlKGRhdGFQYXRoICsgInRlc3RBUEkvIikudG9VUkwoKTsKKwkJCVNPVVJDRV9IVFRQX1NJVEUgPSBuZXcgVVJMKCJodHRwIiwgZ2V0SHR0cEhvc3QoKSwgZ2V0SHR0cFBvcnQoKSwgYnVuZGxlLmdldFN0cmluZygiSFRUUF9QQVRIXzEiKSk7CisJCQlUQVJHRVRfRklMRV9TSVRFID0gbmV3IFVSTCgiZmlsZSIsIG51bGwsIGhvbWVQYXRoICsgIi90YXJnZXQvIik7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlmYWlsKGUudG9TdHJpbmcoKSk7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQl9CisKKwkJLy9jbGVhbnVwIHRhcmdldCAKKwkJRmlsZSB0YXJnZXQgPSBuZXcgRmlsZShob21lUGF0aCArICIvdGFyZ2V0LyIpOworCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0odGFyZ2V0KTsKKwkJLy8gY2xlYW51cCBpbmZvIGFib3V0IGp1c3QgaW5zdGFsbGVkIHBsdWdpbnMKKwkJSW5zdGFsbFJlZ2lzdHJ5LmNsZWFudXAoKTsKKwkJCisJCS8vIHNldHVwIGNhY2hlIHNpdGUgdG8gZmFsc2UuIAorCQkvLyBOb3RlOiB0aGUgc3RhbmQtYWxvbmUgdGVzdHMgd2lsbCBzZXQgaXQgYmFjayB0byB0cnVlCisJCUludGVybmFsU2l0ZU1hbmFnZXIuZ2xvYmFsVXNlQ2FjaGUgPSBmYWxzZTsKKwl9CisKKwkvKioKKwkgKiBTaW1wbGUgaW1wbGVtZW50YXRpb24gb2Ygc2V0VXAuIFN1YmNsYXNzZXMgYXJlIHByZXZlbnRlZCAKKwkgKiBmcm9tIG92ZXJyaWRpbmcgdGhpcyBtZXRob2QgdG8gbWFpbnRhaW4gbG9nZ2luZyBjb25zaXN0ZW5jeS4KKwkgKiB1bVNldFVwKCkgc2hvdWxkIGJlIG92ZXJyaWRkZW4gaW5zdGVhZC4KKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tICIgKyB0aGlzLmdldE5hbWUoKSk7CisJCVN5c3RlbS5vdXQucHJpbnRsbih0aGlzLmdldE5hbWUoKSArICI6IHNldFVwLi4uIik7CisJCXVtU2V0VXAoKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHVwIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgb3BlbiBhIG5ldHdvcmsgY29ubmVjdGlvbi4KKwkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYmVmb3JlIGEgdGVzdCBpcyBleGVjdXRlZC4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCB1bVNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCS8vIGRvIG5vdGhpbmcuCisJfQorCisJLyoqCisJICogU2ltcGxlIGltcGxlbWVudGF0aW9uIG9mIHRlYXJEb3duLiAgU3ViY2xhc3NlcyBhcmUgcHJldmVudGVkIAorCSAqIGZyb20gb3ZlcnJpZGluZyB0aGlzIG1ldGhvZCB0byBtYWludGFpbiBsb2dnaW5nIGNvbnNpc3RlbmN5LgorCSAqIHVtVGVhckRvd24oKSBzaG91bGQgYmUgb3ZlcnJpZGRlbiBpbnN0ZWFkLgorCSAqLworCXByb3RlY3RlZCBmaW5hbCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN5c3RlbS5vdXQucHJpbnRsbih0aGlzLmdldE5hbWUoKSArICI6IHRlYXJEb3duLi4uXG4iKTsKKwkJdW1UZWFyRG93bigpOworCX0KKworCS8qKgorCSAqIFRlYXJzIGRvd24gdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBjbG9zZSBhIG5ldHdvcmsgY29ubmVjdGlvbi4KKwkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIgYSB0ZXN0IGlzIGV4ZWN1dGVkLgorCSAqLworCXByb3RlY3RlZCB2b2lkIHVtVGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gZG8gbm90aGluZy4KKwl9CisKKwlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRIdHRwSG9zdCgpIHsKKwkJcmV0dXJuIFVwZGF0ZVRlc3RzUGx1Z2luLmdldFdlYkFwcFNlcnZlckhvc3QoKTsKKwl9CisKKwlwcm90ZWN0ZWQgc3RhdGljIGludCBnZXRIdHRwUG9ydCgpIHsKKwkJcmV0dXJuIFVwZGF0ZVRlc3RzUGx1Z2luLmdldFdlYkFwcFNlcnZlclBvcnQoKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmUoSUZlYXR1cmUgZmVhdHVyZSwgSUNvbmZpZ3VyZWRTaXRlIGNvbmZpZ1NpdGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJSVNpdGUgc2l0ZSA9IGNvbmZpZ1NpdGUuZ2V0U2l0ZSgpOworCQlyZW1vdmUoZmVhdHVyZSwgc2l0ZSk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlKElGZWF0dXJlIGZlYXR1cmUsIElTaXRlIHNpdGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJc2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlKGZlYXR1cmUpOworCQkvLyByZW1vdmUgdGhlIHBsdWdpbnMgYW5kIGZlYXR1cmVzIGRpcgorCQlTdHJpbmcgc2l0ZVBhdGggPSBzaXRlLmdldFVSTCgpLmdldEZpbGUoKTsKKwkJRmlsZSBmaWxlID0gbnVsbDsKKworCQlTdHJpbmcgZmVhdHVyZU5hbWUgPSBmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSArICJfIiArIGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldFZlcnNpb24oKS50b1N0cmluZygpOworCQlmaWxlID0gbmV3IEZpbGUoc2l0ZVBhdGgsICJmZWF0dXJlcyIgKyBGaWxlLnNlcGFyYXRvciArIGZlYXR1cmVOYW1lKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqUmVtb3ZpbmcgOiIgKyBmaWxlKTsKKwkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGZpbGUpOworCisJCUlQbHVnaW5FbnRyeVtdIGVudHJpZXMgPSBmZWF0dXJlLmdldFBsdWdpbkVudHJpZXMoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7CisJCQlTdHJpbmcgbmFtZSA9IGVudHJpZXNbaV0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldElkZW50aWZpZXIoKS50b1N0cmluZygpICsgIl8iICsgZW50cmllc1tpXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0VmVyc2lvbigpLnRvU3RyaW5nKCkgKyBGaWxlLnNlcGFyYXRvcjsKKwkJCWZpbGUgPSBuZXcgRmlsZShzaXRlUGF0aCwgInBsdWdpbnMiICsgRmlsZS5zZXBhcmF0b3IgKyBuYW1lKTsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlJlbW92aW5nIDoiICsgZmlsZSk7CisJCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0oZmlsZSk7CisJCQlJbnN0YWxsUmVnaXN0cnkudW5yZWdpc3RlclBsdWdpbihlbnRyaWVzW2ldKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL1VwZGF0ZVRlc3RzUGx1Z2luLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9VcGRhdGVUZXN0c1BsdWdpbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5NTcwZTIKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9VcGRhdGVUZXN0c1BsdWdpbi5qYXZhCkBAIC0wLDAgKzEsMTI1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzOworaW1wb3J0IGphdmEudXRpbC5EaWN0aW9uYXJ5OworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaHR0cC5qZXR0eS5KZXR0eUNvbmZpZ3VyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5VcGRhdGVDb3JlOworaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7CitpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7CitpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuU2VydmljZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLmh0dHAuSHR0cFNlcnZpY2U7CitpbXBvcnQgb3JnLm9zZ2kudXRpbC50cmFja2VyLlNlcnZpY2VUcmFja2VyOworCisvKioKKyAqIG1hbmFnZXMgdGhlIHN0YXJ0dXAgYW5kIHNodXRvd24gb2YgdGhlIAorICogd2ViIHNlcnZlcgorICovCitwdWJsaWMgY2xhc3MgVXBkYXRlVGVzdHNQbHVnaW4gZXh0ZW5kcyBQbHVnaW4geworCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGFwcFNlcnZlckhvc3QgPSBudWxsOworCXByaXZhdGUgc3RhdGljIGludCBhcHBTZXJ2ZXJQb3J0ID0gMDsKKwlwcml2YXRlIHN0YXRpYyBVcGRhdGVUZXN0c1BsdWdpbiBwbHVnaW47CisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpbml0aWFsaXplZD1mYWxzZTsKKwlwcml2YXRlIHN0YXRpYyBTZXJ2aWNlVHJhY2tlciBodHRwU2VydmljZVRyYWNrZXI7CisKKwlwdWJsaWMgc3RhdGljIFVwZGF0ZVRlc3RzUGx1Z2luIGdldFBsdWdpbigpIHsKKwkJcmV0dXJuIHBsdWdpbjsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQWN0aXZhdG9yI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQorCSAqLworCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXN1cGVyLnN0YXJ0KGNvbnRleHQpOworCQlwbHVnaW4gPSB0aGlzOworCQkKKwkJaHR0cFNlcnZpY2VUcmFja2VyID0gbmV3IFNlcnZpY2VUcmFja2VyKGNvbnRleHQsIEh0dHBTZXJ2aWNlLmNsYXNzLmdldE5hbWUoKSwgbnVsbCk7CisJCWh0dHBTZXJ2aWNlVHJhY2tlci5vcGVuKCk7CisJfQorCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVBY3RpdmF0b3Ijc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXBsdWdpbiA9IG51bGw7CisJCQorCQlpZihodHRwU2VydmljZVRyYWNrZXIgIT0gbnVsbCkKKwkJCWh0dHBTZXJ2aWNlVHJhY2tlci5jbG9zZSgpOworCQkKKwkJaHR0cFNlcnZpY2VUcmFja2VyID0gbnVsbDsKKwkJc3VwZXIuc3RvcChjb250ZXh0KTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBob3N0IGlkZW50aWZpZXIgZm9yIHRoZSB3ZWIgYXBwIHNlcnZlcgorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFdlYkFwcFNlcnZlckhvc3QoKSB7CisJCWlmICghaW5pdGlhbGl6ZWQpIGluaXRpYWxpemUoKTsKKwkJcmV0dXJuIGFwcFNlcnZlckhvc3Q7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcG9ydCBpZGVudGlmaWVyIGZvciB0aGUgd2ViIGFwcCBzZXJ2ZXIKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGludCBnZXRXZWJBcHBTZXJ2ZXJQb3J0KCkgeworCQlpZiAoIWluaXRpYWxpemVkKSBpbml0aWFsaXplKCk7CQkKKwkJcmV0dXJuIGFwcFNlcnZlclBvcnQ7CisJfQorCS8qKgorCSAqIE1ldGhvZCBpbml0aWFsaXplLgorCSAqLworCXByaXZhdGUgc3RhdGljIHZvaWQgaW5pdGlhbGl6ZSgpIHsKKwkJU3RyaW5nIHRleHQgPSBudWxsOworCQl0cnkgeworCisJCQkvLyBlbnN1cmUgdGhhdCB0aGUgaHR0cCBzdHVmZiBpcyBzdGFydGVkCisJCQlEaWN0aW9uYXJ5IGQgPSBuZXcgSGFzaHRhYmxlKCk7CisJCQlkLnB1dCgiaHR0cC5wb3J0IiwgbmV3IEludGVnZXIoMCkpOyAvLyROT04tTkxTLTEkCisJCQlKZXR0eUNvbmZpZ3VyYXRvci5zdGFydFNlcnZlcigidXBkYXRlVGVzdHMiLCBkKTsKKwkJCWVuc3VyZUJ1bmRsZVN0YXJ0ZWQoIm9yZy5lY2xpcHNlLmVxdWlub3guaHR0cC5yZWdpc3RyeSIpOyAvLyROT04tTkxTLTEkCisJCQkKKwkJCVNlcnZpY2VSZWZlcmVuY2UgcmVmZXJlbmNlID0gCisJCQkJaHR0cFNlcnZpY2VUcmFja2VyLmdldFNlcnZpY2VSZWZlcmVuY2UoKTsKKwkJCQorCQkJU3RyaW5nIHBvcnQgPSAoU3RyaW5nKSByZWZlcmVuY2UuZ2V0UHJvcGVydHkoImh0dHAucG9ydCIpOyAvLyROT04tTkxTLTEkCisJCQkKKwkJCWFwcFNlcnZlckhvc3QgPSAibG9jYWxob3N0IjsgLy8kTk9OLU5MUy0xJAorCQkJYXBwU2VydmVyUG9ydCA9IEludGVnZXIucGFyc2VJbnQocG9ydCk7CisKKwkJCXRleHQgPSAiVGhlIHdlYlNlcnZlciBkaWQgc3RhcnQgaXA6IiArIGFwcFNlcnZlckhvc3QgKyAiOiIgKyBhcHBTZXJ2ZXJQb3J0OworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJdGV4dCA9ICJUaGUgd2ViU2VydmVyIGRpZG4ndCBzdGFydCAiOworCQkJSVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsICJvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZSIsIElTdGF0dXMuT0ssICJXZWJTZXJ2ZXIgbm90IHN0YXJ0ZWQuIFVwZGF0ZSBUZXN0cyByZXN1bHRzIGFyZSBpbnZhbGlkIiwgbnVsbCk7CisJCQlVcGRhdGVDb3JlLndhcm4oIiIsbmV3IENvcmVFeGNlcHRpb24oc3RhdHVzKSk7CisJCX0gZmluYWxseSB7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4odGV4dCk7CisJCQlpbml0aWFsaXplZCA9IHRydWU7CisJCX0KKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBlbnN1cmVCdW5kbGVTdGFydGVkKFN0cmluZyBzeW1ib2xpY05hbWUpIHRocm93cyBCdW5kbGVFeGNlcHRpb24geworCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHN5bWJvbGljTmFtZSk7CisJCWlmIChidW5kbGUgIT0gbnVsbCkgeworCQkJaWYgKGJ1bmRsZS5nZXRTdGF0ZSgpID09IEJ1bmRsZS5SRVNPTFZFRCB8fCBidW5kbGUuZ2V0U3RhdGUoKSA9PSBCdW5kbGUuU1RBUlRJTkcpIHsKKwkJCQlidW5kbGUuc3RhcnQoKTsKKwkJCX0KKwkJfQorCX0KKworfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYXBpL0FsbEFQSVRlc3RzLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9hcGkvQWxsQVBJVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDY2ZjlkCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYXBpL0FsbEFQSVRlc3RzLmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5hcGk7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7CisKKy8qKgorICogTWFuYWdlcyB0aGUgQVBJIHRlc3RzCisgKi8KK3B1YmxpYyBjbGFzcyBBbGxBUElUZXN0cyBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7CisJLyoqCisJICogQ29uc3RydWN0b3IKKwkgKi8KKwlwdWJsaWMgQWxsQVBJVGVzdHMoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCQorCS8qKgorCSAqIExpc3Qgb2YgQVBJIHRlc3RzCisJICovCisJcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKKwkJc3VpdGUuc2V0TmFtZSgiQVBJIFRlc3RzIik7CisKKwkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RTaXRlQVBJLmNsYXNzKSk7CisJCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShUZXN0TG9jYWxTaXRlQVBJLmNsYXNzKSk7CQkKKwkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RVcGRhdGVNYW5hZ2VyVXRpbHNBUEkuY2xhc3MpKTsJCQorCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdERlZmF1bHRFeGVjdXRhYmxlRmVhdHVyZUFQSS5jbGFzcykpOworCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdERlZmF1bHRQYWNrYWdlRmVhdHVyZUFQSS5jbGFzcykpOworCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdFBsdWdpbkNvbnRhaW5lckFQSS5jbGFzcykpOworCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdFNpdGVNYW5hZ2VyQVBJLmNsYXNzKSk7CQkKKwkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3ROZXN0ZWRGZWF0dXJlQVBJLmNsYXNzKSk7CisJCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShUZXN0RmVhdHVyZUNvbnRlbnRQcm92aWRlcl9GaWxlRmlsdGVyQVBJLmNsYXNzKSk7CisJCXJldHVybiBzdWl0ZTsKKwl9Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9hcGkvRGVmYXVsdEZlYXR1cmUuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2FwaS9EZWZhdWx0RmVhdHVyZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4MGNjZTUKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9hcGkvRGVmYXVsdEZlYXR1cmUuamF2YQpAQCAtMCwwICsxLDE3MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuYXBpOworCitpbXBvcnQgamF2YS5uZXQuVVJMOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLkZlYXR1cmVFeGVjdXRhYmxlQ29udGVudFByb3ZpZGVyOworLyoqCisgKiBBYnN0cmFjdCBDbGFzcyB0aGF0IGltcGxlbWVudHMgbW9zdCBvZiB0aGUgYmVoYXZpb3Igb2YgYSBmZWF0dXJlCisgKiBBIGZlYXR1cmUgQUxXQVlTIGJlbG9uZ3MgdG8gYW4gSVNpdGUKKyAqLworcHVibGljIGNsYXNzIERlZmF1bHRGZWF0dXJlIGV4dGVuZHMgRmVhdHVyZSB7CisKKworCS8qKgorCSAqIENvcHkgY29uc3RydWN0b3IKKwkgKi8KKwlwdWJsaWMgRGVmYXVsdEZlYXR1cmUoSUZlYXR1cmUgc291cmNlRmVhdHVyZSwgSVNpdGUgdGFyZ2V0U2l0ZSkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQl0aGlzKHRhcmdldFNpdGUpOworCQl0aGlzLnNldEZlYXR1cmVDb250ZW50UHJvdmlkZXIoc291cmNlRmVhdHVyZS5nZXRGZWF0dXJlQ29udGVudFByb3ZpZGVyKCkpOworCQl0aGlzLnNldElkZW50aWZpZXIoc291cmNlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkpOworCQl0aGlzLnNldExhYmVsKHNvdXJjZUZlYXR1cmUuZ2V0TGFiZWwoKSk7CisJCXRoaXMuc2V0VXBkYXRlU2l0ZUVudHJ5KHNvdXJjZUZlYXR1cmUuZ2V0VXBkYXRlU2l0ZUVudHJ5KCkpOworCQl0aGlzLnNldERpc2NvdmVyeVNpdGVFbnRyaWVzKHNvdXJjZUZlYXR1cmUuZ2V0RGlzY292ZXJ5U2l0ZUVudHJpZXMoKSk7CisJCXRoaXMuc2V0UHJvdmlkZXIoc291cmNlRmVhdHVyZS5nZXRQcm92aWRlcigpKTsKKwkJdGhpcy5zZXREZXNjcmlwdGlvbihzb3VyY2VGZWF0dXJlLmdldERlc2NyaXB0aW9uKCkpOworCQl0aGlzLnNldENvcHlyaWdodChzb3VyY2VGZWF0dXJlLmdldENvcHlyaWdodCgpKTsKKwkJdGhpcy5zZXRMaWNlbnNlKHNvdXJjZUZlYXR1cmUuZ2V0TGljZW5zZSgpKTsKKwkJdGhpcy5zZXRQbHVnaW5FbnRyaWVzKHNvdXJjZUZlYXR1cmUuZ2V0UGx1Z2luRW50cmllcygpKTsKKwkJdGhpcy5zZXRJbWFnZShzb3VyY2VGZWF0dXJlLmdldEltYWdlKCkpOworCX0KKwkKKwkvKioKKwkgKiBDb25zdHJ1Y3RvcgorCSAqLworCXB1YmxpYyBEZWZhdWx0RmVhdHVyZShJU2l0ZSB0YXJnZXRTaXRlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCXN1cGVyKCk7CisJCXRoaXMuc2V0U2l0ZSh0YXJnZXRTaXRlKTsJCQorCX0JCisJCisJCisJLyoqCisJICogU2V0cyB0aGUgaWRlbnRpZmllcgorCSAqIEBwYXJhbSBpZGVudGlmaWVyIFRoZSBpZGVudGlmaWVyIHRvIHNldAorCSAqLworCXB1YmxpYyB2b2lkIHNldElkZW50aWZpZXIoVmVyc2lvbmVkSWRlbnRpZmllciBpZGVudGlmaWVyKSB7CisJCXNldEZlYXR1cmVJZGVudGlmaWVyKGlkZW50aWZpZXIuZ2V0SWRlbnRpZmllcigpKTsKKwkJc2V0RmVhdHVyZVZlcnNpb24oaWRlbnRpZmllci5nZXRWZXJzaW9uKCkudG9TdHJpbmcoKSk7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgZGlzY292ZXJ5U2l0ZUVudHJpZXMKKwkgKiBAcGFyYW0gZGlzY292ZXJ5SW5mb3MgVGhlIGRpc2NvdmVyeUluZm9zIHRvIHNldAorCSAqLworCXB1YmxpYyB2b2lkIHNldERpc2NvdmVyeVNpdGVFbnRyaWVzKElVUkxFbnRyeVtdIGRpc2NvdmVyeUluZm9zKSB7CisJCXNldERpc2NvdmVyeVNpdGVFbnRyeU1vZGVscygoVVJMRW50cnlNb2RlbFtdKSBkaXNjb3ZlcnlJbmZvcyk7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgdXBkYXRlU2l0ZUVudHJ5CisJICogQHBhcmFtIHVwZGF0ZUluZm8gVGhlIHVwZGF0ZUluZm8gdG8gc2V0CisJICovCisJcHVibGljIHZvaWQgc2V0VXBkYXRlU2l0ZUVudHJ5KElVUkxFbnRyeSB1cGRhdGVJbmZvKSB7CisJCXNldFVwZGF0ZVNpdGVFbnRyeU1vZGVsKChVUkxFbnRyeU1vZGVsKSB1cGRhdGVJbmZvKTsKKwl9CisKKwkvKioKKwkgKiBBZGRzIGEgZGlzY292ZXJ5SW5mbworCSAqIEBwYXJhbSBkaXNjb3ZlcnlJbmZvIFRoZSBkaXNjb3ZlcnlJbmZvIHRvIGFkZAorCSAqLworCXB1YmxpYyB2b2lkIGFkZERpc2NvdmVyeVNpdGVFbnRyeShJVVJMRW50cnkgZGlzY292ZXJ5SW5mbykgeworCQlhZGREaXNjb3ZlcnlTaXRlRW50cnlNb2RlbCgoVVJMRW50cnlNb2RlbCkgZGlzY292ZXJ5SW5mbyk7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgZGVzY3JpcHRpb24KKwkgKiBAcGFyYW0gZGVzY3JpcHRpb24gVGhlIGRlc2NyaXB0aW9uIHRvIHNldAorCSAqLworCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKElVUkxFbnRyeSBkZXNjcmlwdGlvbikgeworCQlzZXREZXNjcmlwdGlvbk1vZGVsKChVUkxFbnRyeU1vZGVsKSBkZXNjcmlwdGlvbik7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgY29weXJpZ2h0CisJICogQHBhcmFtIGNvcHlyaWdodCBUaGUgY29weXJpZ2h0IHRvIHNldAorCSAqLworCXB1YmxpYyB2b2lkIHNldENvcHlyaWdodChJVVJMRW50cnkgY29weXJpZ2h0KSB7CisJCXNldENvcHlyaWdodE1vZGVsKChVUkxFbnRyeU1vZGVsKSBjb3B5cmlnaHQpOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIGxpY2Vuc2UKKwkgKiBAcGFyYW0gbGljZW5zZSBUaGUgbGljZW5zZSB0byBzZXQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRMaWNlbnNlKElVUkxFbnRyeSBsaWNlbnNlKSB7CisJCXNldExpY2Vuc2VNb2RlbCgoVVJMRW50cnlNb2RlbCkgbGljZW5zZSk7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgaW1hZ2UKKwkgKiBAcGFyYW0gaW1hZ2UgVGhlIGltYWdlIHRvIHNldAorCSAqLworCXB1YmxpYyB2b2lkIHNldEltYWdlKFVSTCBpbWFnZSkgeworCQlpZiAoaW1hZ2U9PW51bGwpIHJldHVybjsKKwkJc2V0SW1hZ2VVUkxTdHJpbmcoaW1hZ2UudG9FeHRlcm5hbEZvcm0oKSk7CisJfQorCisJLyoqCisJICogQWRkcyBhbiBpbXBvcnQKKwkgKiBAcGFyYW0gYW5JbXBvcnQgVGhlIGltcG9ydCB0byBhZGQKKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRJbXBvcnQoSUltcG9ydCBhbkltcG9ydCkgeworCQlpZiAoYW5JbXBvcnQgIT0gbnVsbCkgeworCQkJYWRkSW1wb3J0TW9kZWwoKEltcG9ydE1vZGVsKSBhbkltcG9ydCk7CisJCX0KKwl9CisKKworCS8qKgorCSAqIFNldHMgdGhlIHBsdWdpbkVudHJpZXMKKwkgKiBAcGFyYW0gcGx1Z2luRW50cmllcyBUaGUgcGx1Z2luRW50cmllcyB0byBzZXQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRQbHVnaW5FbnRyaWVzKElQbHVnaW5FbnRyeVtdIHBsdWdpbkVudHJpZXMpIHsKKwkJaWYgKHBsdWdpbkVudHJpZXMgIT0gbnVsbCkgeworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwbHVnaW5FbnRyaWVzLmxlbmd0aDsgaSsrKSB7CisJCQkJYWRkUGx1Z2luRW50cnkocGx1Z2luRW50cmllc1tpXSk7CisJCQl9CisJCX0KKwl9CisKKworCS8qKgorCSAqIHNldHMgdGVoIFVSTCBpc2Ygbm90IGFscmVhZHkgcHJlc2VudAorCSAqLworCXB1YmxpYyB2b2lkIHNldFVSTChVUkwgdXJsKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbnsKKwkJLy9pZiAoZ2V0RmVhdHVyZUNvbnRlbnRQcm92aWRlcigpPT1udWxsKXsKKwkJCUZlYXR1cmVDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyID0gbmV3IEZlYXR1cmVFeGVjdXRhYmxlQ29udGVudFByb3ZpZGVyKHVybCk7CisJCQl0aGlzLnNldEZlYXR1cmVDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKKwkJCWNvbnRlbnRQcm92aWRlci5zZXRGZWF0dXJlKHRoaXMpOworCQkvL30KKwl9CisJCisJCisJLyoKKwkgKiBAc2VlIElQbHVnaW5Db250YWluZXIjYWRkUGx1Z2luRW50cnkoSVBsdWdpbkVudHJ5KQorCSAqLworCXB1YmxpYyB2b2lkIGFkZFBsdWdpbkVudHJ5KElQbHVnaW5FbnRyeSBwbHVnaW5FbnRyeSkgeworCQlpZiAocGx1Z2luRW50cnkgIT0gbnVsbCkgeworCQkJYWRkUGx1Z2luRW50cnlNb2RlbCgoUGx1Z2luRW50cnlNb2RlbCkgcGx1Z2luRW50cnkpOworCQl9CisJfQorCisJLyoKKwkgKiBAc2VlIElGZWF0dXJlI2FkZE5vblBsdWdpbkVudHJ5KElOb25QbHVnaW5FbnRyeSkKKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGROb25QbHVnaW5FbnRyeShJTm9uUGx1Z2luRW50cnkgZGF0YUVudHJ5KSB7CisJCWlmIChkYXRhRW50cnkgIT0gbnVsbCkgeworCQkJYWRkTm9uUGx1Z2luRW50cnlNb2RlbCgoTm9uUGx1Z2luRW50cnlNb2RlbCkgZGF0YUVudHJ5KTsKKwkJfQorCX0JCisKKwl9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYXBpL015VVJMRW50cnkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2FwaS9NeVVSTEVudHJ5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ1YTlmMgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2FwaS9NeVVSTEVudHJ5LmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5hcGk7CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlVSTEVudHJ5OworCisvKioKKyAqIFdyYXBwZXIgYXJvdW5kIFVSTEVudHJ5CisgKi8KK3B1YmxpYyBjbGFzcyBNeVVSTEVudHJ5IGV4dGVuZHMgVVJMRW50cnkgeworCQorCXB1YmxpYyBNeVVSTEVudHJ5KFN0cmluZyBhbm5vdGF0aW9uLCBVUkwgdXJsKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKKwkJc3VwZXIoKTsKKwkJc2V0QW5ub3RhdGlvbihhbm5vdGF0aW9uKTsKKwkJaWYgKHVybCE9bnVsbCkgeworCQkJc2V0VVJMU3RyaW5nKHVybC50b0V4dGVybmFsRm9ybSgpKTsKKwkJCXJlc29sdmUobnVsbCxudWxsKTsKKwkJfQorCX0KKworfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYXBpL1Rlc3REZWZhdWx0RXhlY3V0YWJsZUZlYXR1cmVBUEkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2FwaS9UZXN0RGVmYXVsdEV4ZWN1dGFibGVGZWF0dXJlQVBJLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ5OGEwMgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2FwaS9UZXN0RGVmYXVsdEV4ZWN1dGFibGVGZWF0dXJlQVBJLmphdmEKQEAgLTAsMCArMSwxODQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuYXBpOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLlVwZGF0ZU1hbmFnZXJVdGlsczsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlTWFuYWdlclRlc3RDYXNlOworCisKKworcHVibGljIGNsYXNzIFRlc3REZWZhdWx0RXhlY3V0YWJsZUZlYXR1cmVBUEkgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2UgeworCQorCXByaXZhdGUgRGVmYXVsdEZlYXR1cmUgcmVtb3RlRmVhdHVyZT1udWxsOworCQorCS8qKgorCSAqIFRlc3QgdGhlIHRlc3RGZWF0dXJlcygpCisJICovCisJcHVibGljIFRlc3REZWZhdWx0RXhlY3V0YWJsZUZlYXR1cmVBUEkoU3RyaW5nIGFyZzApIHsKKwkJc3VwZXIoYXJnMCk7CisJfQorCQorCS8qKgorCSAqIHRoZSBmZWF0dXJlIHRvIHRlc3QKKwkgKi8KKwlwcml2YXRlIERlZmF1bHRGZWF0dXJlIGdldEZlYXR1cmUoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKKwkJaWYgKHJlbW90ZUZlYXR1cmUgPT0gbnVsbCl7CisKKwkJSVNpdGUgc2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoU09VUkNFX0ZJTEVfU0lURSwgbnVsbCk7CisJCVVSTCB1cmwgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKHNpdGUuZ2V0VVJMKCksInRlc3RBUEkvIitTaXRlLkRFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfUEFUSCsiZmVhdHVyZTMvIixudWxsKTsKKwkJU2l0ZUZlYXR1cmVSZWZlcmVuY2UgcmVmID0gbmV3IFNpdGVGZWF0dXJlUmVmZXJlbmNlKCk7CisJCXJlZi5zZXRTaXRlKHNpdGUpOworCQlyZWYuc2V0VVJMKHVybCk7CisJCUlGZWF0dXJlIGZlYXR1cmUgPSByZWYuZ2V0RmVhdHVyZShudWxsKTsKKwkJcmVtb3RlRmVhdHVyZSA9IG5ldyBEZWZhdWx0RmVhdHVyZShmZWF0dXJlLHNpdGUpOworCisJCX0KKwkJcmV0dXJuIHJlbW90ZUZlYXR1cmU7CisJfQorCisJcHVibGljIHZvaWQgdGVzdElkZW50aWZpZXIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGlkMSA9ICJ4bWxzL2FwaXRlc3RzL29yZy5lY2xpcHNlLnRlc3QuZmVhdHVyZV8xLjAuMC8iOworCQlTdHJpbmcgaWQyID0gInhtbHMvYXBpdGVzdHMvb3JnLmVjbGlwc2VfdGVzdF9mZWF0dXJlIjsKKwkJVmVyc2lvbmVkSWRlbnRpZmllciBpZGVudDEgPSBuZXcgVmVyc2lvbmVkSWRlbnRpZmllcigib3JnLnRlc3QxLmlkZW50MSIsIjEuMC4wIik7CisJCVZlcnNpb25lZElkZW50aWZpZXIgaWRlbnQyID0gbmV3IFZlcnNpb25lZElkZW50aWZpZXIoIm9yZy50ZXN0MS5pZGVudDIiLCIxLjAuMCIpOwkJCisJCQorCisJCQlJU2l0ZSBzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShTT1VSQ0VfRklMRV9TSVRFLG51bGwpOworCQkJCisJCQlVUkwgdXJsMSA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwoc2l0ZS5nZXRVUkwoKSxpZDEsbnVsbCk7CQkJCisJCQlyZW1vdGVGZWF0dXJlID0gbmV3IERlZmF1bHRGZWF0dXJlKHNpdGUpOworCQkJcmVtb3RlRmVhdHVyZS5zZXRVUkwodXJsMSk7CisJCQlyZW1vdGVGZWF0dXJlLnNldElkZW50aWZpZXIoaWRlbnQxKTsKKwkJCWFzc2VydEVxdWFscyhpZGVudDEudG9TdHJpbmcoKSxyZW1vdGVGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKTsKKwkgCQorCQkJIFVSTCB1cmwyID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTChzaXRlLmdldFVSTCgpLGlkMixudWxsKTsJCQorCQkJcmVtb3RlRmVhdHVyZSA9IG5ldyBEZWZhdWx0RmVhdHVyZShzaXRlKTsKKwkJCXJlbW90ZUZlYXR1cmUuc2V0VVJMKHVybDIpOworCQkJcmVtb3RlRmVhdHVyZS5zZXRJZGVudGlmaWVyKGlkZW50Mik7CisJCQlhc3NlcnRFcXVhbHMoaWRlbnQyLnRvU3RyaW5nKCkscmVtb3RlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSk7CisJCQorCisJfQorCisKKworCXB1YmxpYyB2b2lkIHRlc3RTaXRlKCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbnsKKwkJU3RyaW5nIGlkZW50MSA9IFNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRIKyJmZWF0dXJlMy8iOwkJCisKKwkJCUlTaXRlIHNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKFNPVVJDRV9GSUxFX1NJVEUsbnVsbCk7CisJCQkKKwkJCVVSTCBpZCA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwoc2l0ZS5nZXRVUkwoKSxpZGVudDEsbnVsbCk7CQkJCisJCQlyZW1vdGVGZWF0dXJlID0gbmV3IERlZmF1bHRGZWF0dXJlKHNpdGUpOworCQkJcmVtb3RlRmVhdHVyZS5zZXRVUkwoaWQpOworCQkJYXNzZXJ0RXF1YWxzKHNpdGUscmVtb3RlRmVhdHVyZS5nZXRTaXRlKCkpOworCisJfQorCisKKwlwdWJsaWMgdm9pZCB0ZXN0TGFiZWwoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbixNYWxmb3JtZWRVUkxFeGNlcHRpb24geworCQlTdHJpbmcgbGFiZWwgPSAiZHVtbXkgbGFiZWwiOworCQlGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlKCk7CisJCWZlYXR1cmUuc2V0TGFiZWwobGFiZWwpOworCQlhc3NlcnRFcXVhbHMobGFiZWwsZmVhdHVyZS5nZXRMYWJlbCgpKTsKKwl9CisKKworCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVVUkwoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbixNYWxmb3JtZWRVUkxFeGNlcHRpb24geworCQlVUkwgdXJsID0gbnVsbDsKKwkJU3RyaW5nIGxhYmVsID0gIk9USSBTaXRlIjsKKwkJdHJ5IHsKKwkJCXVybCA9IG5ldyBVUkwoImh0dHA6Ly93d3cub3RpLmNvbS8iKTsKKwkJCQorCQl9IGNhdGNoIChqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb24gZSl7fSAvLyBpbXBvc3NpYmxlIGVoICEKKwkJRGVmYXVsdEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmUoKTsKKwkJZmVhdHVyZS5zZXRVcGRhdGVTaXRlRW50cnkobmV3IE15VVJMRW50cnkobGFiZWwsIHVybCkpOworCQlhc3NlcnRFcXVhbHModXJsLGZlYXR1cmUuZ2V0VXBkYXRlU2l0ZUVudHJ5KCkuZ2V0VVJMKCkpOworCQlhc3NlcnRFcXVhbHMobGFiZWwsZmVhdHVyZS5nZXRVcGRhdGVTaXRlRW50cnkoKS5nZXRBbm5vdGF0aW9uKCkpOworCisJfSAKKworCisJCisJcHVibGljIHZvaWQgdGVzdERpc2NvdmVyeVVSTHMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbixNYWxmb3JtZWRVUkxFeGNlcHRpb24geworCQlJVVJMRW50cnlbXSB1cmxJbmZvID0gbmV3IE15VVJMRW50cnlbMl07CisJCVVSTFtdIHVybCA9IG5ldyBVUkxbMl07CisJCVN0cmluZ1tdIGxhYmVsID0gbmV3IFN0cmluZ1syXTsKKwkJdHJ5IHsKKwkJCXVybFswXSA9IG5ldyBVUkwoImh0dHA6Ly93d3cub3RpLmNvbS8iKTsKKwkJCXVybFsxXSA9IG5ldyBVUkwoImh0dHA6Ly9lY2xpcHNlLm9yZy8iKTsKKwkJCWxhYmVsWzBdID0gIk9USSBTaXRlIjsKKwkJCWxhYmVsWzFdID0gIkVjbGlwc2UgU2l0ZSI7CisJCX0gY2F0Y2ggKGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKXt9IC8vIGltcG9zc2libGUgZWggIQorCQlEZWZhdWx0RmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZSgpOworCQlmb3IgKGludCBpPTA7aTwyO2krKyl7CisJCQkJdXJsSW5mb1tpXSA9IG5ldyBNeVVSTEVudHJ5KGxhYmVsW2ldLHVybFtpXSk7CisJCX0KKwkJZmVhdHVyZS5zZXREaXNjb3ZlcnlTaXRlRW50cmllcyh1cmxJbmZvKTsKKwkJZm9yIChpbnQgaT0wOyBpPGZlYXR1cmUuZ2V0RGlzY292ZXJ5U2l0ZUVudHJpZXMoKS5sZW5ndGg7aSsrKXsKKwkJCWFzc2VydEVxdWFscyh1cmxJbmZvW2ldLGZlYXR1cmUuZ2V0RGlzY292ZXJ5U2l0ZUVudHJpZXMoKVtpXSk7CisJCX0KKworCX0KKworCisJcHVibGljIHZvaWQgdGVzdFByb3ZpZGVyKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKKwkJU3RyaW5nIHByb3ZpZGVyID0gIm5vdCBzbyBkdW1teSBwcm92aWRlciI7CisJCUlGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlKCk7CisJCSgoRmVhdHVyZSlmZWF0dXJlKS5zZXRQcm92aWRlcihwcm92aWRlcik7CisJCWFzc2VydEVxdWFscyhwcm92aWRlcixmZWF0dXJlLmdldFByb3ZpZGVyKCkpOworCX0KKworCisKKwlwdWJsaWMgdm9pZCB0ZXN0RGVzY3JpcHRpb24oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbixNYWxmb3JtZWRVUkxFeGNlcHRpb24geworCQlTdHJpbmcgZGVzYyA9ICJwcmV0dHkgbG9uZyBkZXNjcmlwdGlvbiBhcyBhIHN0cmluZyB3aXRoIFxyXG4gYW5kIFx0IGFuZCBcbiI7CisJCUlVUkxFbnRyeSBpbmZvID0gbmV3IE15VVJMRW50cnkoZGVzYyxudWxsKTsKKwkJRGVmYXVsdEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmUoKTsKKwkJZmVhdHVyZS5zZXREZXNjcmlwdGlvbihpbmZvKTsKKwkJYXNzZXJ0RXF1YWxzKGRlc2MsZmVhdHVyZS5nZXREZXNjcmlwdGlvbigpLmdldEFubm90YXRpb24oKSk7CisJfQorCQorCisJcHVibGljIHZvaWQgdGVzdERlc2NyaXB0aW9uMSgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBNYWxmb3JtZWRVUkxFeGNlcHRpb24geworCQlVUkwgdXJsID0gbnVsbDsKKwkJdHJ5IHsKKwkJCXVybCA9IG5ldyBVUkwoImh0dHA6Ly93d3cub3RpLmNvbSIpOworCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSl7LypwcmV0dHkgaW1wb3NzaWJsZSovfQorCQlJVVJMRW50cnkgaW5mbyA9IG5ldyBNeVVSTEVudHJ5KG51bGwsdXJsKTsKKwkJRGVmYXVsdEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmUoKTsKKwkJZmVhdHVyZS5zZXREZXNjcmlwdGlvbihpbmZvKTsKKwkJYXNzZXJ0RXF1YWxzKHVybCxmZWF0dXJlLmdldERlc2NyaXB0aW9uKCkuZ2V0VVJMKCkpOworCX0JCisJCisKKwlwdWJsaWMgdm9pZCB0ZXN0RGVzY3JpcHRpb24yKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7CisJCQorIAkgVVJMIHVybCA9IG51bGw7CisJCXRyeSB7CisJCQl1cmwgPSBuZXcgVVJMKCJodHRwOi8vd3d3Lm90aS5jb20iKTsKKwkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpey8qcHJldHR5IGltcG9zc2libGUqL30KKwkJU3RyaW5nIGRlc2MgPSAicHJldHR5IGxvbmcgZGVzY3JpcHRpb24gYXMgYSBzdHJpbmcgd2l0aCBcclxuIGFuZCBcdCBhbmQgXG4iOworCQlJVVJMRW50cnkgaW5mbyA9IG5ldyBNeVVSTEVudHJ5KGRlc2MsdXJsKTsKKwkJRGVmYXVsdEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmUoKTsKKwkJZmVhdHVyZS5zZXREZXNjcmlwdGlvbihpbmZvKTsKKwkJU3RyaW5nIHJlc3VsdCA9IGZlYXR1cmUuZ2V0RGVzY3JpcHRpb24oKS5nZXRBbm5vdGF0aW9uKCk7CisJCWFzc2VydEVxdWFscyhkZXNjLHJlc3VsdCk7CisJCWFzc2VydEVxdWFscyh1cmwsZmVhdHVyZS5nZXREZXNjcmlwdGlvbigpLmdldFVSTCgpKTsKKwl9CQorCisKKworfQorCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9hcGkvVGVzdERlZmF1bHRQYWNrYWdlRmVhdHVyZUFQSS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYXBpL1Rlc3REZWZhdWx0UGFja2FnZUZlYXR1cmVBUEkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWI2NjBjCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYXBpL1Rlc3REZWZhdWx0UGFja2FnZUZlYXR1cmVBUEkuamF2YQpAQCAtMCwwICsxLDE3NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5hcGk7CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuVXBkYXRlTWFuYWdlclV0aWxzOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7CisKKworCitwdWJsaWMgY2xhc3MgVGVzdERlZmF1bHRQYWNrYWdlRmVhdHVyZUFQSSBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7CisJCisJcHJpdmF0ZQlEZWZhdWx0RmVhdHVyZSByZW1vdGVGZWF0dXJlPW51bGw7CisJCisJLyoqCisJICogVGVzdCB0aGUgdGVzdEZlYXR1cmVzKCkKKwkgKi8KKwlwdWJsaWMgVGVzdERlZmF1bHRQYWNrYWdlRmVhdHVyZUFQSShTdHJpbmcgYXJnMCkgeworCQlzdXBlcihhcmcwKTsKKwl9CisJCisJLyoqCisJICogdGhlIGZlYXR1cmUgdG8gdGVzdAorCSAqLworCXByaXZhdGUgRGVmYXVsdEZlYXR1cmUgZ2V0RmVhdHVyZSgpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24geworCQlpZiAocmVtb3RlRmVhdHVyZSA9PSBudWxsKXsKKwkJSVNpdGUgc2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoU09VUkNFX0ZJTEVfU0lURSwgbnVsbCk7CisJCVVSTCBpZCA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwoc2l0ZS5nZXRVUkwoKSwib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmVhdHVyZTFfMS4wLjAuamFyIixudWxsKTsJCisJCXJlbW90ZUZlYXR1cmUgPSBuZXcgRGVmYXVsdEZlYXR1cmUoc2l0ZSk7CisJCXJlbW90ZUZlYXR1cmUuc2V0VVJMKGlkKTsKKwkJfQorCQlyZXR1cm4gcmVtb3RlRmVhdHVyZTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0SWRlbnRpZmllcigpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBNYWxmb3JtZWRVUkxFeGNlcHRpb24geworCQkKKwkJU3RyaW5nIGlkMSA9ICJmZWF0dXJlcy9vcmcuZWNsaXBzZS50ZXN0LmZlYXR1cmVfMS4wLjAuamFyIjsKKwkJU3RyaW5nIGlkMiA9ICJmZWF0dXJlcy9vcmcuZWNsaXBzZV90ZXN0X2ZlYXR1cmUuamFyIjsKKwkJVmVyc2lvbmVkSWRlbnRpZmllciBpZGVudDEgPSBuZXcgVmVyc2lvbmVkSWRlbnRpZmllcigib3JnLnRlc3QxLmlkZW50MSIsIjEuMC4wIik7CisJCVZlcnNpb25lZElkZW50aWZpZXIgaWRlbnQyID0gbmV3IFZlcnNpb25lZElkZW50aWZpZXIoIm9yZy50ZXN0MS5pZGVudDIiLCIxLjAuMCIpOwkJCisJCQorCisJCQlJU2l0ZSBzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShTT1VSQ0VfRklMRV9TSVRFLCBudWxsKTsKKwkJCQorCQkJVVJMIHVybDEgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKHNpdGUuZ2V0VVJMKCksaWQxLG51bGwpOwkJCQorCQkJcmVtb3RlRmVhdHVyZSA9IG5ldyBEZWZhdWx0RmVhdHVyZShzaXRlKTsKKwkJCXJlbW90ZUZlYXR1cmUuc2V0VVJMKHVybDEpOworCQkJcmVtb3RlRmVhdHVyZS5zZXRJZGVudGlmaWVyKGlkZW50MSk7CisJCQlhc3NlcnRFcXVhbHMoaWRlbnQxLnRvU3RyaW5nKCkscmVtb3RlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSk7CisJCQorCQkJIFVSTCB1cmwyID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTChzaXRlLmdldFVSTCgpLGlkMixudWxsKTsJCQorCQkJcmVtb3RlRmVhdHVyZSA9IG5ldyBEZWZhdWx0RmVhdHVyZShzaXRlKTsKKwkJCXJlbW90ZUZlYXR1cmUuc2V0VVJMKHVybDIpOworCQkJcmVtb3RlRmVhdHVyZS5zZXRJZGVudGlmaWVyKGlkZW50Mik7CQkJCisJCQlhc3NlcnRFcXVhbHMoaWRlbnQyLnRvU3RyaW5nKCkscmVtb3RlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSk7CisJfQorCisKKwlwdWJsaWMgdm9pZCB0ZXN0U2l0ZSgpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24geworCQlTdHJpbmcgaWRlbnQxID0gIm9yZy5lY2xpcHNlLnRlc3QuZmVhdHVyZV8xLjAuMC5qYXIiOwkJCisKKwkJCUlTaXRlIHNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKFNPVVJDRV9GSUxFX1NJVEUsIG51bGwpOworCQkJCisJCQlVUkwgaWQgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKHNpdGUuZ2V0VVJMKCksaWRlbnQxLG51bGwpOwkJCisJCQlyZW1vdGVGZWF0dXJlID0gbmV3IERlZmF1bHRGZWF0dXJlKHNpdGUpOworCQkJcmVtb3RlRmVhdHVyZS5zZXRVUkwoaWQpOwkKKwkJCWFzc2VydEVxdWFscyhzaXRlLHJlbW90ZUZlYXR1cmUuZ2V0U2l0ZSgpKTsKKworCX0KKworCisJcHVibGljIHZvaWQgdGVzdExhYmVsKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7CisJCVN0cmluZyBsYWJlbCA9ICJkdW1teSBsYWJlbCI7CisJCUZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmUoKTsKKwkJZmVhdHVyZS5zZXRMYWJlbChsYWJlbCk7CisJCWFzc2VydEVxdWFscyhsYWJlbCxmZWF0dXJlLmdldExhYmVsKCkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVVUkwoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKKwkJVVJMIHVybCA9IG51bGw7CisJCVN0cmluZyBsYWJlbCA9ICJPVEkgU2l0ZSI7CisJCXRyeSB7CisJCQl1cmwgPSBuZXcgVVJMKCJodHRwOi8vd3d3Lm90aS5jb20vIik7CisJCQkKKwkJfSBjYXRjaCAoamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpe30gLy8gaW1wb3NzaWJsZSBlaCAhCisJCURlZmF1bHRGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlKCk7CisJCWZlYXR1cmUuc2V0VXBkYXRlU2l0ZUVudHJ5KG5ldyBNeVVSTEVudHJ5KGxhYmVsLCB1cmwpKTsKKwkJYXNzZXJ0RXF1YWxzKHVybCxmZWF0dXJlLmdldFVwZGF0ZVNpdGVFbnRyeSgpLmdldFVSTCgpKTsKKwkJYXNzZXJ0RXF1YWxzKGxhYmVsLGZlYXR1cmUuZ2V0VXBkYXRlU2l0ZUVudHJ5KCkuZ2V0QW5ub3RhdGlvbigpKTsKKworCX0gCisKKworCQorCXB1YmxpYyB2b2lkIHRlc3REaXNjb3ZlcnlVUkxzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7CisJCUlVUkxFbnRyeVtdIHVybEluZm8gPSBuZXcgVVJMRW50cnlbMl07CisJCVVSTFtdIHVybCA9IG5ldyBVUkxbMl07CisJCVN0cmluZ1tdIGxhYmVsID0gbmV3IFN0cmluZ1syXTsKKwkJdHJ5IHsKKwkJCXVybFswXSA9IG5ldyBVUkwoImh0dHA6Ly93d3cub3RpLmNvbS8iKTsKKwkJCXVybFsxXSA9IG5ldyBVUkwoImh0dHA6Ly9lY2xpcHNlLm9yZy8iKTsKKwkJCWxhYmVsWzBdID0gIk9USSBTaXRlIjsKKwkJCWxhYmVsWzFdID0gIkVjbGlwc2UgU2l0ZSI7CisJCX0gY2F0Y2ggKGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKXt9IC8vIGltcG9zc2libGUgZWggIQorCQlEZWZhdWx0RmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZSgpOworCQlmb3IgKGludCBpPTA7aTwyO2krKyl7CisJCQkJdXJsSW5mb1tpXSA9IG5ldyBNeVVSTEVudHJ5KGxhYmVsW2ldLHVybFtpXSk7CisJCX0KKwkJZmVhdHVyZS5zZXREaXNjb3ZlcnlTaXRlRW50cmllcyh1cmxJbmZvKTsKKwkJZm9yIChpbnQgaT0wOyBpPGZlYXR1cmUuZ2V0RGlzY292ZXJ5U2l0ZUVudHJpZXMoKS5sZW5ndGg7aSsrKXsKKwkJCWFzc2VydEVxdWFscyh1cmxJbmZvW2ldLGZlYXR1cmUuZ2V0RGlzY292ZXJ5U2l0ZUVudHJpZXMoKVtpXSk7CisJCX0KKworCisJfQorCisKKwlwdWJsaWMgdm9pZCB0ZXN0UHJvdmlkZXIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKKwkJU3RyaW5nIHByb3ZpZGVyID0gIm5vdCBzbyBkdW1teSBwcm92aWRlciI7CisJCUZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmUoKTsKKwkJZmVhdHVyZS5zZXRQcm92aWRlcihwcm92aWRlcik7CisJCWFzc2VydEVxdWFscyhwcm92aWRlcixmZWF0dXJlLmdldFByb3ZpZGVyKCkpOworCX0KKworCisKKwlwdWJsaWMgdm9pZCB0ZXN0RGVzY3JpcHRpb24oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGRlc2MgPSAicHJldHR5IGxvbmcgZGVzY3JpcHRpb24gYXMgYSBzdHJpbmcgd2l0aCBcclxuIGFuZCBcdCBhbmQgXG4iOworCQlJVVJMRW50cnkgaW5mbyA9IG5ldyBNeVVSTEVudHJ5KGRlc2MsbnVsbCk7CisJCURlZmF1bHRGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlKCk7CisJCWZlYXR1cmUuc2V0RGVzY3JpcHRpb24oaW5mbyk7CisJCWFzc2VydEVxdWFscyhkZXNjLGZlYXR1cmUuZ2V0RGVzY3JpcHRpb24oKS5nZXRBbm5vdGF0aW9uKCkpOworCX0KKwkKKworCXB1YmxpYyB2b2lkIHRlc3REZXNjcmlwdGlvbjEoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKKwkJVVJMIHVybCA9IG51bGw7CisJCXRyeSB7CisJCQl1cmwgPSBuZXcgVVJMKCJodHRwOi8vd3d3Lm90aS5jb20iKTsKKwkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpey8qcHJldHR5IGltcG9zc2libGUqL30KKwkJSVVSTEVudHJ5IGluZm8gPSBuZXcgTXlVUkxFbnRyeShudWxsLHVybCk7CisJCURlZmF1bHRGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlKCk7CisJCWZlYXR1cmUuc2V0RGVzY3JpcHRpb24oaW5mbyk7CisJCWFzc2VydEVxdWFscyh1cmwsZmVhdHVyZS5nZXREZXNjcmlwdGlvbigpLmdldFVSTCgpKTsKKwl9CQorCQorCXB1YmxpYyB2b2lkIHRlc3REZXNjcmlwdGlvbjIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKKwkJCisJCVVSTCB1cmwgPSBudWxsOworCQl0cnkgeworCQkJdXJsID0gbmV3IFVSTCgiaHR0cDovL3d3dy5vdGkuY29tIik7CisJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKXsvKnByZXR0eSBpbXBvc3NpYmxlKi99CisJCVN0cmluZyBkZXNjID0gInByZXR0eSBsb25nIGRlc2NyaXB0aW9uIGFzIGEgc3RyaW5nIHdpdGggXHJcbiBhbmQgXHQgYW5kIFxuIjsKKwkJSVVSTEVudHJ5IGluZm8gPSBuZXcgTXlVUkxFbnRyeShkZXNjLHVybCk7CisJCURlZmF1bHRGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlKCk7CisJCWZlYXR1cmUuc2V0RGVzY3JpcHRpb24oaW5mbyk7CisJCWFzc2VydEVxdWFscyhkZXNjLGZlYXR1cmUuZ2V0RGVzY3JpcHRpb24oKS5nZXRBbm5vdGF0aW9uKCkpOworCQlhc3NlcnRFcXVhbHModXJsLGZlYXR1cmUuZ2V0RGVzY3JpcHRpb24oKS5nZXRVUkwoKSk7CisJfQorCisKKworfQorCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9hcGkvVGVzdEZlYXR1cmVDb250ZW50UHJvdmlkZXJfRmlsZUZpbHRlckFQSS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYXBpL1Rlc3RGZWF0dXJlQ29udGVudFByb3ZpZGVyX0ZpbGVGaWx0ZXJBUEkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWIyMThjCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYXBpL1Rlc3RGZWF0dXJlQ29udGVudFByb3ZpZGVyX0ZpbGVGaWx0ZXJBUEkuamF2YQpAQCAtMCwwICsxLDg1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmFwaTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5GZWF0dXJlQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLkZlYXR1cmVFeGVjdXRhYmxlQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7CisKKworCitwdWJsaWMgY2xhc3MgVGVzdEZlYXR1cmVDb250ZW50UHJvdmlkZXJfRmlsZUZpbHRlckFQSSBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7CisJCisJCisJLyoqCisJICogVGVzdCB0aGUgdGVzdEZlYXR1cmVzKCkKKwkgKi8KKwlwdWJsaWMgVGVzdEZlYXR1cmVDb250ZW50UHJvdmlkZXJfRmlsZUZpbHRlckFQSShTdHJpbmcgYXJnMCkgeworCQlzdXBlcihhcmcwKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEZpbGVGaWx0ZXIoKXsKKwkJCisJCVN0cmluZyBwMSA9ICIvcDEvcDIvYS4qIjsKKwkJU3RyaW5nIHAyID0gInAxL3AyL2IuKiI7CisJCVN0cmluZyBwMyA9ICIvcDEvcDIvYS50eHQiOworCQlTdHJpbmcgcDQgPSAiL3AxL3AyLyoudHh0IjsKKwkJCisJCVN0cmluZyBuYW1lMSA9ICIvcDEvcDIvYS50eHQiOworCQlTdHJpbmcgbmFtZTIgPSAiL3AxL3AyL2IudHh0IjsKKwkJU3RyaW5nIG5hbWUzID0gIi9wMy9wMi9hLnR4dCI7CisJCVN0cmluZyBuYW1lNCA9ICJwMS9wMi9hLnR4dCI7CisJCVN0cmluZyBuYW1lNSA9ICIvcDEvcDIvYi50eHQiOworCQlTdHJpbmcgbmFtZTYgPSAiL3AxL3AyL2MudHh0IjsKKwkJU3RyaW5nIG5hbWU3ID0gIi9wMS9wMi9wMy9hLnR4dCI7CisJCQorCQkKKwkJRmVhdHVyZUNvbnRlbnRQcm92aWRlciBjcCA9IG5ldyBGZWF0dXJlRXhlY3V0YWJsZUNvbnRlbnRQcm92aWRlcihudWxsKTsKKwkJCisJCUZlYXR1cmVDb250ZW50UHJvdmlkZXIuRmlsZUZpbHRlciBmaWx0ZXIxID0gY3AubmV3IEZpbGVGaWx0ZXIocDEpOworCQlGZWF0dXJlQ29udGVudFByb3ZpZGVyLkZpbGVGaWx0ZXIgZmlsdGVyMiA9IGNwLm5ldyBGaWxlRmlsdGVyKHAyKTsKKwkJRmVhdHVyZUNvbnRlbnRQcm92aWRlci5GaWxlRmlsdGVyIGZpbHRlcjMgPSBjcC5uZXcgRmlsZUZpbHRlcihwMyk7CisJCUZlYXR1cmVDb250ZW50UHJvdmlkZXIuRmlsZUZpbHRlciBmaWx0ZXI0ID0gY3AubmV3IEZpbGVGaWx0ZXIocDQpOworCisJCWFzc2VydFRydWUoIjEuMSIsZmlsdGVyMS5hY2NlcHQobmFtZTEpKTsJCQorCQlhc3NlcnRUcnVlKCIxLjIiLCFmaWx0ZXIxLmFjY2VwdChuYW1lMikpOwkJCisJCWFzc2VydFRydWUoIjEuMyIsIWZpbHRlcjEuYWNjZXB0KG5hbWUzKSk7CQorCQlhc3NlcnRUcnVlKCIxLjQiLCFmaWx0ZXIxLmFjY2VwdChuYW1lNCkpOwkJCisJCWFzc2VydFRydWUoIjEuNSIsIWZpbHRlcjEuYWNjZXB0KG5hbWU1KSk7CQkKKwkJYXNzZXJ0VHJ1ZSgiMS42IiwhZmlsdGVyMS5hY2NlcHQobmFtZTYpKTsJCQorCQlhc3NlcnRUcnVlKCIxLjciLCFmaWx0ZXIxLmFjY2VwdChuYW1lNykpOworCQorCQlhc3NlcnRUcnVlKCIyLjEiLCFmaWx0ZXIyLmFjY2VwdChuYW1lMSkpOwkJCisJCWFzc2VydFRydWUoIjIuMiIsIWZpbHRlcjIuYWNjZXB0KG5hbWUyKSk7CQkKKwkJYXNzZXJ0VHJ1ZSgiMi4zIiwhZmlsdGVyMi5hY2NlcHQobmFtZTMpKTsJCisJCWFzc2VydFRydWUoIjIuNCIsIWZpbHRlcjIuYWNjZXB0KG5hbWU0KSk7CQkKKwkJYXNzZXJ0VHJ1ZSgiMi41IiwhZmlsdGVyMi5hY2NlcHQobmFtZTUpKTsJCQorCQlhc3NlcnRUcnVlKCIyLjYiLCFmaWx0ZXIyLmFjY2VwdChuYW1lNikpOwkJCisJCWFzc2VydFRydWUoIjIuNyIsIWZpbHRlcjIuYWNjZXB0KG5hbWU3KSk7CisKKwkJYXNzZXJ0VHJ1ZSgiMy4xIixmaWx0ZXIzLmFjY2VwdChuYW1lMSkpOwkJCisJCWFzc2VydFRydWUoIjMuMiIsIWZpbHRlcjMuYWNjZXB0KG5hbWUyKSk7CQkKKwkJYXNzZXJ0VHJ1ZSgiMy4zIiwhZmlsdGVyMy5hY2NlcHQobmFtZTMpKTsJCisJCWFzc2VydFRydWUoIjMuNCIsIWZpbHRlcjMuYWNjZXB0KG5hbWU0KSk7CQkKKwkJYXNzZXJ0VHJ1ZSgiMy41IiwhZmlsdGVyMy5hY2NlcHQobmFtZTUpKTsJCQorCQlhc3NlcnRUcnVlKCIzLjYiLCFmaWx0ZXIzLmFjY2VwdChuYW1lNikpOwkJCisJCWFzc2VydFRydWUoIjMuNyIsIWZpbHRlcjMuYWNjZXB0KG5hbWU3KSk7CisJCQorCQlhc3NlcnRUcnVlKCI0LjEiLGZpbHRlcjQuYWNjZXB0KG5hbWUxKSk7CQkKKwkJYXNzZXJ0VHJ1ZSgiNC4yIixmaWx0ZXI0LmFjY2VwdChuYW1lMikpOwkJCisJCWFzc2VydFRydWUoIjQuMyIsIWZpbHRlcjQuYWNjZXB0KG5hbWUzKSk7CQorCQlhc3NlcnRUcnVlKCI0LjQiLCFmaWx0ZXI0LmFjY2VwdChuYW1lNCkpOwkJCisJCWFzc2VydFRydWUoIjQuNSIsZmlsdGVyNC5hY2NlcHQobmFtZTUpKTsJCQorCQlhc3NlcnRUcnVlKCI0LjYiLGZpbHRlcjQuYWNjZXB0KG5hbWU2KSk7CQkKKwkJYXNzZXJ0VHJ1ZSgiNC43IiwhZmlsdGVyNC5hY2NlcHQobmFtZTcpKTsJCQkJCQkJCQorCQkJCQkKKwl9Cit9CisKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2FwaS9UZXN0TG9jYWxTaXRlQVBJLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9hcGkvVGVzdExvY2FsU2l0ZUFQSS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlNGFhMmUKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9hcGkvVGVzdExvY2FsU2l0ZUFQSS5qYXZhCkBAIC0wLDAgKzEsMTE3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmFwaTsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLkNhdGVnb3J5TW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuU2l0ZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7CisKK3B1YmxpYyBjbGFzcyBUZXN0TG9jYWxTaXRlQVBJIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsKKwkKKwkvKioKKwkgKiBUZXN0IHRoZSBnZXRGZWF0dXJlcygpCisJICovCisJcHVibGljIFRlc3RMb2NhbFNpdGVBUEkoU3RyaW5nIGFyZzApIHsKKwkJc3VwZXIoYXJnMCk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RGaWxlUGFyc2luZygpIHRocm93cyBFeGNlcHRpb24geworCisJCUlTaXRlIHNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKG5ldyBVUkwoU09VUkNFX0ZJTEVfU0lURSwic2l0ZVRlc3RMb2NhbFNpdGUvIiksIG51bGwpOworCQlJQXJjaGl2ZVJlZmVyZW5jZVtdIGluZm8gPSBzaXRlLmdldEFyY2hpdmVzKCk7CisJCQorCQlpZiAoaW5mby5sZW5ndGg8PTApeworCQkJZmFpbCgibm8gcGx1Z2lucyBpbiBzaXRlOiAiK3NpdGUuZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKSk7CisJCX0KKwkJIAorCQlib29sZWFuIGZvdW5kMSA9IGZhbHNlOworCQlib29sZWFuIGZvdW5kMiA9IGZhbHNlOworCQlTdHJpbmcgbmFtZTE9ICJwbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjJfNS4wLjAuamFyIjsKKwkJU3RyaW5nIG5hbWUyID0gInBsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMl81LjAuMS5qYXIiOworCQkKKwkJZm9yIChpbnQgaSA9MDsgaTxpbmZvLmxlbmd0aDsgaSsrKXsKKwkJCWlmIChpbmZvW2ldLmdldFBhdGgoKS5lcXVhbHMobmFtZTEpKSBmb3VuZDEgPSB0cnVlOworCQkJaWYgKGluZm9baV0uZ2V0UGF0aCgpLmVxdWFscyhuYW1lMikpIGZvdW5kMiA9IHRydWU7CisJCX0KKwkJCisJCWlmICghZm91bmQxIHx8ICFmb3VuZDIpeworCQkJZmFpbCgiQ2Fubm90IGZpbmQgcGx1Z2luIDogb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMiB2ZXJzaW9uIDUuMC4wIGFuZCA1LjAuMSBvbiB0aGUgc2l0ZSwgYnkgcGFyc2luZyBmaWxlIHN5c3RlbSIpOworCQl9CisJCQorCisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RCdW5kbGVNYW5pZmVzdFBhcnNpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlJU2l0ZSBzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShuZXcgVVJMKFNPVVJDRV9GSUxFX1NJVEUsInNpdGVUZXN0TG9jYWxTaXRlLyIpLG51bGwpOworCQlJQXJjaGl2ZVJlZmVyZW5jZVtdIGluZm8gPSBzaXRlLmdldEFyY2hpdmVzKCk7CisJCQorCQlpZiAoaW5mby5sZW5ndGg8PTApeworCQkJZmFpbCgibm8gcGx1Z2lucyBpbiBzaXRlOiAiK3NpdGUuZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKSk7CisJCX0KKwkJIAorCQlib29sZWFuIGZvdW5kMSA9IGZhbHNlOworCQlib29sZWFuIGZvdW5kMiA9IGZhbHNlOworCQlib29sZWFuIGZvdW5kMyA9IGZhbHNlOworCQlTdHJpbmcgbmFtZTE9ICJwbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmJ1bmRsZU1hbmlmZXN0XzEuMC4xLmphciI7CisJCVN0cmluZyBuYW1lMiA9ICJwbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmJ1bmRsZUFuZFBsdWdpbk1hbmlmZXN0c0JVTkRMRVBBUlNFRF8xLjAuMy5qYXIiOworCQlTdHJpbmcgbmFtZTMgPSAicGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5idW5kbGVBbmRQbHVnaW5NYW5pZmVzdHNfMS4wLjMuamFyIjsKKwkJCisJCWZvciAoaW50IGkgPTA7IGk8aW5mby5sZW5ndGg7IGkrKyl7CisJCQlpZiAoaW5mb1tpXS5nZXRQYXRoKCkuZXF1YWxzKG5hbWUxKSkgZm91bmQxID0gdHJ1ZTsKKwkJCWlmIChpbmZvW2ldLmdldFBhdGgoKS5lcXVhbHMobmFtZTIpKSBmb3VuZDIgPSB0cnVlOworCQkJaWYgKGluZm9baV0uZ2V0UGF0aCgpLmVxdWFscyhuYW1lMykpIGZvdW5kMyA9IHRydWU7CisJCX0KKwkJCisJCWlmICghZm91bmQxIHx8ICFmb3VuZDIpeworCQkJZmFpbCgiQ2Fubm90IGZpbmQgcGx1Z2luIDogb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMiB2ZXJzaW9uIDUuMC4wIGFuZCA1LjAuMSBvbiB0aGUgc2l0ZSwgYnkgcGFyc2luZyBmaWxlIHN5c3RlbSIpOworCQl9CisJCWlmIChmb3VuZDMpeworCQkJZmFpbCgiUGx1Z2luIG1hbmlmZXN0IHBhcnNlZCBpbnN0ZWFkIG9mIGJ1bmRsZSBtYW5pZmVzdC4iKTsKKwkJfQorCQkKKworCX0KKwkKKwkKKwlwdWJsaWMgdm9pZCB0ZXN0Q2F0ZWdvcmllcygpIHRocm93cyBFeGNlcHRpb24geworCisJCUlTaXRlIHNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKFNPVVJDRV9GSUxFX1NJVEUsIG51bGwpOworCQkKKwkJSUNhdGVnb3J5IGNhdGVnb3J5ID0gbmV3IENhdGVnb3J5KCJjYXRlZ29yeSIsIkxhYmVsIG9mIGNhdGVnb3J5Iik7CisJCQorCQkoKFNpdGVNb2RlbClzaXRlKS5hZGRDYXRlZ29yeU1vZGVsKChDYXRlZ29yeU1vZGVsKWNhdGVnb3J5KTsKKwkJCisJCUlDYXRlZ29yeVtdIGNhdGVnb3JpZXMgPSBzaXRlLmdldENhdGVnb3JpZXMoKTsKKwkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOworCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgY2F0ZWdvcmllcy5sZW5ndGg7IGluZGV4KyspIHsKKwkJCUlDYXRlZ29yeSBlbGVtZW50ID0gY2F0ZWdvcmllc1tpbmRleF07CisJCQlpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKCJjYXRlZ29yeSIpKSBmb3VuZCA9IHRydWU7CisJCX0KKwkJaWYgKCFmb3VuZCkgZmFpbCgiY2Fubm90IGZpbmQgY2F0ZWdvcnkgJ2NhdGVnb3J5JyBpbiBzaXRlIik7CisKKwkJSVNpdGVGZWF0dXJlUmVmZXJlbmNlIHJlZiA9IG5ldyBTaXRlRmVhdHVyZVJlZmVyZW5jZSgpOworCQlyZWYuc2V0U2l0ZShzaXRlKTsKKwkJcmVmLmFkZENhdGVnb3J5KGNhdGVnb3J5KTsJCQorCQljYXRlZ29yaWVzID0gcmVmLmdldENhdGVnb3JpZXMoKTsKKwkJZm91bmQgPSBmYWxzZTsKKwkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IGNhdGVnb3JpZXMubGVuZ3RoOyBpbmRleCsrKSB7CisJCQlJQ2F0ZWdvcnkgZWxlbWVudCA9IGNhdGVnb3JpZXNbaW5kZXhdOworCQkJaWYgKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscygiY2F0ZWdvcnkiKSkgZm91bmQgPSB0cnVlOworCQl9CisJCWlmICghZm91bmQpIGZhaWwoImNhbm5vdCBmaW5kIGNhdGVnb3J5ICdjYXRlZ29yeScgaW4gZmVhdHVyZSIpOworCQkKKwkJCX0KKworfQorCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9hcGkvVGVzdE5lc3RlZEZlYXR1cmVBUEkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2FwaS9UZXN0TmVzdGVkRmVhdHVyZUFQSS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5ZTMwNjEKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9hcGkvVGVzdE5lc3RlZEZlYXR1cmVBUEkuamF2YQpAQCAtMCwwICsxLDE1MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5hcGk7CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuVXBkYXRlTWFuYWdlclV0aWxzOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7CisKK3B1YmxpYyBjbGFzcyBUZXN0TmVzdGVkRmVhdHVyZUFQSSBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7CisKKwkvKioKKwkgKiBUZXN0IHRoZSB0ZXN0RmVhdHVyZXMoKQorCSAqLworCXB1YmxpYyBUZXN0TmVzdGVkRmVhdHVyZUFQSShTdHJpbmcgYXJnMCkgeworCQlzdXBlcihhcmcwKTsKKwl9CisKKwkvKioKKwkgKiB0aGUgZmVhdHVyZSB0byB0ZXN0CisJICovCisJcHJpdmF0ZSBJRmVhdHVyZSBnZXRSb290RmVhdHVyZSgpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24geworCQlJU2l0ZSBzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShuZXcgVVJMKFNPVVJDRV9GSUxFX1NJVEUsICJuZXN0ZWRGZWF0dXJlU2l0ZVRlc3Qvc2l0ZS54bWwiKSxudWxsKTsKKwkJVVJMIHVybCA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwoc2l0ZS5nZXRVUkwoKSwgU2l0ZS5ERUZBVUxUX0lOU1RBTExFRF9GRUFUVVJFX1BBVEggKyAicm9vdGZlYXR1cmUuamFyIiwgbnVsbCk7CisJCVNpdGVGZWF0dXJlUmVmZXJlbmNlIHJlZiA9IG5ldyBTaXRlRmVhdHVyZVJlZmVyZW5jZSgpOworCQlyZWYuc2V0U2l0ZShzaXRlKTsKKwkJcmVmLnNldFVSTCh1cmwpOworCQlyZWYuc2V0VHlwZShJU2l0ZS5ERUZBVUxUX1BBQ0tBR0VEX0ZFQVRVUkVfVFlQRSk7CisJCUlGZWF0dXJlIGZlYXR1cmUgPSByZWYuZ2V0RmVhdHVyZShudWxsKTsKKwkJcmV0dXJuIGZlYXR1cmU7CisJfQorCisJLyoqCisJICogdGhlIGZlYXR1cmUgdG8gdGVzdAorCSAqLworCXByaXZhdGUgSUZlYXR1cmUgZ2V0Q2hpbGRGZWF0dXJlKCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7CisKKwkJSVNpdGUgc2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUobmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFLCAibmVzdGVkRmVhdHVyZVNpdGVUZXN0LyIpLCBudWxsKTsKKwkJVVJMIHVybCA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwoc2l0ZS5nZXRVUkwoKSwgU2l0ZS5ERUZBVUxUX0lOU1RBTExFRF9GRUFUVVJFX1BBVEggKyAib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuY2hpbGRyZW5mZWF0dXJlXzIuMC4wLmphciIsIG51bGwpOworCQlTaXRlRmVhdHVyZVJlZmVyZW5jZSByZWYgPSBuZXcgU2l0ZUZlYXR1cmVSZWZlcmVuY2UoKTsKKwkJcmVmLnNldFNpdGUoc2l0ZSk7CisJCXJlZi5zZXRVUkwodXJsKTsKKwkJcmVmLnNldFR5cGUoSVNpdGUuREVGQVVMVF9QQUNLQUdFRF9GRUFUVVJFX1RZUEUpOworCQlJRmVhdHVyZSBmZWF0dXJlID0gcmVmLmdldEZlYXR1cmUobnVsbCk7CisJCXJldHVybiBmZWF0dXJlOworCX0KKworCS8qCisJICogCisJICovCisJcHVibGljIHZvaWQgdGVzdE5lc3RlZCgpIHRocm93cyBFeGNlcHRpb24geworCisJCUlGZWF0dXJlIHJvb3RGZWF0dXJlID0gZ2V0Um9vdEZlYXR1cmUoKTsKKwkJSUZlYXR1cmVSZWZlcmVuY2VbXSByZWYgPSByb290RmVhdHVyZS5nZXRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCk7CisJCUlGZWF0dXJlIGNoaWxkRmVhdHVyZSA9IGdldENoaWxkRmVhdHVyZSgpOworCQlhc3NlcnRFcXVhbHMoIkNoaWxkcmVuIGZlYXR1cmUgYXJlIG5vdCBlcXVhbCIsIGNoaWxkRmVhdHVyZSwgcmVmWzBdLmdldEZlYXR1cmUobnVsbCkpOworCX0KKworCS8qKgorCSAqIHRoZSBmZWF0dXJlIHRvIHRlc3QKKwkgKi8KKwlwcml2YXRlIElGZWF0dXJlIGdldFJvb3RGZWF0dXJlMigpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24geworCQlJU2l0ZSBzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShuZXcgVVJMKFNPVVJDRV9GSUxFX1NJVEUsICJuZXN0ZWRGZWF0dXJlU2l0ZVRlc3QyL3NpdGUueG1sIiksbnVsbCk7CisJCVVSTCB1cmwgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKHNpdGUuZ2V0VVJMKCksIFNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRIICsgInJvb3RmZWF0dXJlLmphciIsIG51bGwpOworCQlTaXRlRmVhdHVyZVJlZmVyZW5jZSByZWYgPSBuZXcgU2l0ZUZlYXR1cmVSZWZlcmVuY2UoKTsKKwkJcmVmLnNldFNpdGUoc2l0ZSk7CisJCXJlZi5zZXRVUkwodXJsKTsKKwkJcmVmLnNldFR5cGUoSVNpdGUuREVGQVVMVF9QQUNLQUdFRF9GRUFUVVJFX1RZUEUpOworCQlJRmVhdHVyZSBmZWF0dXJlID0gcmVmLmdldEZlYXR1cmUobnVsbCk7CisJCXJldHVybiBmZWF0dXJlOworCX0KKworCS8qKgorCSAqIHRoZSBmZWF0dXJlIHRvIHRlc3QKKwkgKi8KKwlwcml2YXRlIElGZWF0dXJlIGdldENoaWxkRmVhdHVyZTIoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKKworCQlJU2l0ZSBzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShuZXcgVVJMKFNPVVJDRV9GSUxFX1NJVEUsICJuZXN0ZWRGZWF0dXJlU2l0ZVRlc3QyL3NpdGUueG1sIiksbnVsbCk7CisJCVVSTCB1cmwgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKHNpdGUuZ2V0VVJMKCksIFNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRIICsgImNoaWxkcmVuZmVhdHVyZS5qYXIiLCBudWxsKTsKKwkJU2l0ZUZlYXR1cmVSZWZlcmVuY2UgcmVmID0gbmV3IFNpdGVGZWF0dXJlUmVmZXJlbmNlKCk7CisJCXJlZi5zZXRTaXRlKHNpdGUpOworCQlyZWYuc2V0VVJMKHVybCk7CisJCXJlZi5zZXRUeXBlKElTaXRlLkRFRkFVTFRfUEFDS0FHRURfRkVBVFVSRV9UWVBFKTsKKwkJSUZlYXR1cmUgZmVhdHVyZSA9IHJlZi5nZXRGZWF0dXJlKG51bGwpOworCQlyZXR1cm4gZmVhdHVyZTsKKwl9CisKKwkvKgorCSAqIAorCSAqLworCXB1YmxpYyB2b2lkIHRlc3ROZXN0ZWQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJSUZlYXR1cmUgcm9vdEZlYXR1cmUgPSBnZXRSb290RmVhdHVyZTIoKTsKKwkJSUZlYXR1cmVSZWZlcmVuY2VbXSByZWYgPSByb290RmVhdHVyZS5nZXRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCk7CisJCUlGZWF0dXJlIGNoaWxkRmVhdHVyZSA9IGdldENoaWxkRmVhdHVyZTIoKTsKKwkJYXNzZXJ0RXF1YWxzKCJDaGlsZHJlbiBmZWF0dXJlIGFyZSBub3QgZXF1YWwiLCBjaGlsZEZlYXR1cmUsIHJlZlswXS5nZXRGZWF0dXJlKG51bGwpKTsKKwl9CisKKy8vCS8qKgorLy8JICogdGhlIGZlYXR1cmUgdG8gdGVzdAorLy8JICovCisvLwlwcml2YXRlIElGZWF0dXJlIGdldFJvb3RGZWF0dXJlMygpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24geworLy8JCUlTaXRlIHNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKG5ldyBVUkwoU09VUkNFX0ZJTEVfU0lURSwgIm5lc3RlZEZlYXR1cmVTaXRlVGVzdDMvc2l0ZS54bWwiKSwgbnVsbCk7CisvLwkJVVJMIHVybCA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwoc2l0ZS5nZXRVUkwoKSwgU2l0ZS5ERUZBVUxUX0lOU1RBTExFRF9GRUFUVVJFX1BBVEggKyAicm9vdGZlYXR1cmUuamFyIiwgbnVsbCk7CisvLwkJU2l0ZUZlYXR1cmVSZWZlcmVuY2UgcmVmID0gbmV3IFNpdGVGZWF0dXJlUmVmZXJlbmNlKCk7CisvLwkJcmVmLnNldFNpdGUoc2l0ZSk7CisvLwkJcmVmLnNldFVSTCh1cmwpOworLy8JCXJlZi5zZXRUeXBlKElTaXRlLkRFRkFVTFRfUEFDS0FHRURfRkVBVFVSRV9UWVBFKTsKKy8vCQlJRmVhdHVyZSBmZWF0dXJlID0gcmVmLmdldEZlYXR1cmUobnVsbCk7CisvLwkJcmV0dXJuIGZlYXR1cmU7CisvLwl9CisKKy8vCS8qKgorLy8JICogdGhlIGZlYXR1cmUgdG8gdGVzdAorLy8JICovCisvLwlwcml2YXRlIElGZWF0dXJlIGdldENoaWxkRmVhdHVyZTMoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKKy8vCisvLwkJSVNpdGUgc2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUobmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFLCAibmVzdGVkRmVhdHVyZVNpdGVUZXN0My9zaXRlLnhtbCIpKTsKKy8vCQlVUkwgdXJsID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTChzaXRlLmdldFVSTCgpLCBTaXRlLkRFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfUEFUSCArICJjaGlsZHJlbmZlYXR1cmUuamFyIiwgbnVsbCk7CisvLwkJU2l0ZUZlYXR1cmVSZWZlcmVuY2UgcmVmID0gbmV3IFNpdGVGZWF0dXJlUmVmZXJlbmNlKCk7CisvLwkJcmVmLnNldFNpdGUoc2l0ZSk7CisvLwkJcmVmLnNldFVSTCh1cmwpOworLy8JCXJlZi5zZXRUeXBlKElTaXRlLkRFRkFVTFRfUEFDS0FHRURfRkVBVFVSRV9UWVBFKTsKKy8vCQlJRmVhdHVyZSBmZWF0dXJlID0gcmVmLmdldEZlYXR1cmUobnVsbCk7CisvLwkJcmV0dXJuIGZlYXR1cmU7CisvLwl9CisKKwkvKgorCSAqIAorCSAqLworCS8qCXB1YmxpYyB2b2lkIHRlc3ROZXN0ZWQzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCisJCQlJRmVhdHVyZSByb290RmVhdHVyZSA9IGdldFJvb3RGZWF0dXJlMygpOworCQkJSUZlYXR1cmVSZWZlcmVuY2VbXSByZWYgPSByb290RmVhdHVyZS5nZXRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCk7CisJCQlJRmVhdHVyZSBjaGlsZEZlYXR1cmUgPSBnZXRDaGlsZEZlYXR1cmUzKCk7CisJCQlhc3NlcnRFcXVhbHMoCisJCQkJIkNoaWxkcmVuIGZlYXR1cmUgYXJlIG5vdCBlcXVhbCIsCisJCQkJY2hpbGRGZWF0dXJlLAorCQkJCXJlZlswXS5nZXRGZWF0dXJlKCkpOworCQl9CisJKi8KKworfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYXBpL1Rlc3RQbHVnaW5Db250YWluZXJBUEkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2FwaS9UZXN0UGx1Z2luQ29udGFpbmVyQVBJLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU1NTUyNQotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2FwaS9UZXN0UGx1Z2luQ29udGFpbmVyQVBJLmphdmEKQEAgLTAsMCArMSw3NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5hcGk7CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuVXBkYXRlTWFuYWdlclV0aWxzOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7CisKK3B1YmxpYyBjbGFzcyBUZXN0UGx1Z2luQ29udGFpbmVyQVBJIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsKKworCXByaXZhdGUgU2l0ZSBzaXRlOworCXByaXZhdGUgRGVmYXVsdEZlYXR1cmUgZmVhdHVyZTsKKworCS8qKgorCSAqIHRoZSBTaXRlIHRvIHRlc3QKKwkgKi8KKwlwcml2YXRlIFNpdGUgZ2V0U2l0ZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBNYWxmb3JtZWRVUkxFeGNlcHRpb24geworCQlpZiAoc2l0ZSA9PSBudWxsKSB7CisKKwkJCXNpdGUgPSAoU2l0ZSlTaXRlTWFuYWdlci5nZXRTaXRlKG5ldyBVUkwoU09VUkNFX0ZJTEVfU0lURSwidGVzdEFQSS8iKSwgbnVsbCk7CisKKwkJfQorCQlyZXR1cm4gc2l0ZTsKKwl9CisKKwkvKioKKwkgKiB0aGUgZmVhdHVyZSB0byB0ZXN0CisJICovCisJcHJpdmF0ZSBEZWZhdWx0RmVhdHVyZSBnZXRGZWF0dXJlKCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7CisJCWlmIChmZWF0dXJlID09IG51bGwpIHsKKwkJCUlTaXRlIHNpdGUgPSBnZXRTaXRlKCk7CisJCQlVUkwgaWQgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKHNpdGUuZ2V0VVJMKCksIm9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUxXzEuMC4wLmphciIsbnVsbCk7CQkJCQkJCisJCQlmZWF0dXJlID0gbmV3IERlZmF1bHRGZWF0dXJlKHNpdGUpOworCQkJZmVhdHVyZS5zZXRVUkwoaWQpOwkKKwkJfQorCQlyZXR1cm4gZmVhdHVyZTsKKwl9CisKKwkvKioKKwkgKiBUZXN0IHRoZSBnZXRGZWF0dXJlcygpCisJICovCisJcHVibGljIFRlc3RQbHVnaW5Db250YWluZXJBUEkoU3RyaW5nIGFyZzApIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJc3VwZXIoYXJnMCk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEFic3RyYWN0RmVhdHVyZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBNYWxmb3JtZWRVUkxFeGNlcHRpb24geworCQlQbHVnaW5FbnRyeSBwbHVnaW5FbnRyeSA9IG5ldyBQbHVnaW5FbnRyeSgpOworCQlwbHVnaW5FbnRyeS5zZXRWZXJzaW9uZWRJZGVudGlmaWVyKG5ldyBWZXJzaW9uZWRJZGVudGlmaWVyKCJpZCIsICI2IikpOworCQlGZWF0dXJlIF9mZWF0dXJlID0gZ2V0RmVhdHVyZSgpOworCQkoKERlZmF1bHRGZWF0dXJlKV9mZWF0dXJlKS5hZGRQbHVnaW5FbnRyeShwbHVnaW5FbnRyeSk7CisJCWFzc2VydEVxdWFscyhfZmVhdHVyZS5nZXRQbHVnaW5FbnRyeUNvdW50KCksIDEpOworCQlhc3NlcnRFcXVhbHMoX2ZlYXR1cmUuZ2V0UGx1Z2luRW50cmllcygpWzBdLCBwbHVnaW5FbnRyeSk7CisKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0QWJzdGFjdFNpdGUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKKwkJUGx1Z2luRW50cnkgcGx1Z2luRW50cnkgPSBuZXcgUGx1Z2luRW50cnkoKTsKKwkJcGx1Z2luRW50cnkuc2V0VmVyc2lvbmVkSWRlbnRpZmllcihuZXcgVmVyc2lvbmVkSWRlbnRpZmllcigiaWQiLCAiNiIpKTsKKwkJU2l0ZSBfc2l0ZSA9IGdldFNpdGUoKTsKKwkJX3NpdGUuYWRkUGx1Z2luRW50cnkocGx1Z2luRW50cnkpOworCQlhc3NlcnRFcXVhbHMoX3NpdGUuZ2V0UGx1Z2luRW50cnlDb3VudCgpLCAxKTsKKwkJYXNzZXJ0RXF1YWxzKF9zaXRlLmdldFBsdWdpbkVudHJpZXMoKVswXSwgcGx1Z2luRW50cnkpOworCisJfQorCit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9hcGkvVGVzdFNpdGVBUEkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2FwaS9UZXN0U2l0ZUFQSS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMTQxNzgKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9hcGkvVGVzdFNpdGVBUEkuamF2YQpAQCAtMCwwICsxLDM5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmFwaTsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5uZXQuVVJMOworCitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVNpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuU2l0ZU1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZU1hbmFnZXJUZXN0Q2FzZTsKKworcHVibGljIGNsYXNzIFRlc3RTaXRlQVBJIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsKKwkKKwkvKioKKwkgKiBUZXN0IHRoZSBnZXRGZWF0dXJlcygpCisJICovCisJcHVibGljIFRlc3RTaXRlQVBJKFN0cmluZyBhcmcwKSB7CisJCXN1cGVyKGFyZzApOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0VVJMKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJSVNpdGUgc2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoU09VUkNFX0ZJTEVfU0lURSwgbnVsbCk7CisJCWFzc2VydEVxdWFscyhuZXcgRmlsZShzaXRlLmdldFVSTCgpLmdldEZpbGUoKSksbmV3IEZpbGUoU09VUkNFX0ZJTEVfU0lURS5nZXRGaWxlKCkpKTsKKwkJCisJCUlTaXRlIHNpdGUyID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShTT1VSQ0VfSFRUUF9TSVRFLCBudWxsKTsKKwkJYXNzZXJ0RXF1YWxzKHNpdGUyLmdldFVSTCgpLG5ldyBVUkwoImh0dHAiLCBnZXRIdHRwSG9zdCgpLGdldEh0dHBQb3J0KCksIGJ1bmRsZS5nZXRTdHJpbmcoIkhUVFBfUEFUSF8xIikrInNpdGUueG1sIikpOworCisJfQorCit9CisKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2FwaS9UZXN0U2l0ZU1hbmFnZXJBUEkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2FwaS9UZXN0U2l0ZU1hbmFnZXJBUEkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmM5NjEzCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYXBpL1Rlc3RTaXRlTWFuYWdlckFQSS5qYXZhCkBAIC0wLDAgKzEsNzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuYXBpOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlTWFuYWdlclRlc3RDYXNlOworCitwdWJsaWMgY2xhc3MgVGVzdFNpdGVNYW5hZ2VyQVBJIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsKKwkKKwkvKioKKwkgKiBUZXN0IHRoZSBnZXRGZWF0dXJlcygpCisJICovCisJcHVibGljIFRlc3RTaXRlTWFuYWdlckFQSShTdHJpbmcgYXJnMCkgeworCQlzdXBlcihhcmcwKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEZpbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSVNpdGUgZmlsZVNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKFRBUkdFVF9GSUxFX1NJVEUsbnVsbCk7CisJCVN0cmluZyBzaXRlID0gZmlsZVNpdGUuZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKTsJCQorCQlhc3NlcnRFcXVhbHMoVEFSR0VUX0ZJTEVfU0lURS50b0V4dGVybmFsRm9ybSgpLCBzaXRlKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFVua25vd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJVVJMIHVybCA9IG5ldyBVUkwoImZ0cDovLzI1NS4yNTUuMjU1LjI1NS8iKTsKKwkJdHJ5IHsKKwkJSVNpdGUgc2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUodXJsLG51bGwpOworCQlpZiAoc2l0ZSE9bnVsbCkgCisJCQlmYWlsKCJDb25uZWN0ZWQgdG8gZnRwOi8vMjU1LjI1NS4yNTUuMjU1Lywgc2hvdWxkIG5vdCBoYXBwZW4iKTsKKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKXsKKwkJCS8vIGV4cGVjdGVkCisJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKXsKKwkJCS8vIGV4cGVjdGVkIGFzIHRoZSB2ZXJzaW9uIG9mIHRoZSBXZWJEYXYgSFRUUCBDb25uZWN0aW9uIHJldHVybnMgc28KKwkJfQorCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0TG9jYWxTaXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCQorCQlJTG9jYWxTaXRlIHNpdGUgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsKKwkJSUNvbmZpZ3VyZWRTaXRlW10gaW5zdFNpdGVzID0gc2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldENvbmZpZ3VyZWRTaXRlcygpOworCQlhc3NlcnRUcnVlKGluc3RTaXRlcy5sZW5ndGg+MCk7CisJCVN5c3RlbS5vdXQucHJpbnRsbigiTG9jYWwgU2l0ZToiK2luc3RTaXRlc1swXS5nZXRTaXRlKCkuZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKSk7CisJCQorCQlJU2l0ZSByZW1vdGVTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShTT1VSQ0VfRklMRV9TSVRFX0lOU1RBTExFRCxudWxsKTsKKwkJSUZlYXR1cmUgcmVtb3RlRmVhdHVyZSA9IHJlbW90ZVNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKVswXS5nZXRGZWF0dXJlKG51bGwpOworCQlyZW1vdmUocmVtb3RlRmVhdHVyZSxpbnN0U2l0ZXNbMF0uZ2V0U2l0ZSgpKTsJCQorCQlpbnN0U2l0ZXNbMF0uZ2V0U2l0ZSgpLmluc3RhbGwocmVtb3RlRmVhdHVyZSxudWxsLG51bGwpOworCQkKKwkJSUZlYXR1cmVSZWZlcmVuY2VbXSBmZWF0dXJlcyA9IHNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5nZXRDb25maWd1cmVkU2l0ZXMoKVswXS5nZXRTaXRlKCkuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsKKwkJYXNzZXJ0VHJ1ZShmZWF0dXJlcy5sZW5ndGg+MCk7CisKKwkJLy9jbGVhbnVwCisJCWFzc2VydE5vdE51bGwocmVtb3RlRmVhdHVyZSk7CQkKKwkJRmlsZSBmaWxlID0gbmV3IEZpbGUoaW5zdFNpdGVzWzBdLmdldFNpdGUoKS5nZXRVUkwoKS5nZXRGaWxlKCkrRmlsZS5zZXBhcmF0b3IrU2l0ZS5ERUZBVUxUX0lOU1RBTExFRF9GRUFUVVJFX1BBVEgrcmVtb3RlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkpOworCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0oZmlsZSk7CisJCWZpbGUgPSBuZXcgRmlsZShpbnN0U2l0ZXNbMF0uZ2V0U2l0ZSgpLmdldFVSTCgpLmdldEZpbGUoKStGaWxlLnNlcGFyYXRvcitTaXRlLkRFRkFVTFRfUExVR0lOX1BBVEgrIm9yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xIik7CisJCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShmaWxlKTsJCQorCQlGaWxlIGxvY2FsRmlsZSA9IG5ldyBGaWxlKCgoTG9jYWxTaXRlKVNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpKS5nZXRMb2NhdGlvblVSTCgpLmdldEZpbGUoKSk7CisJCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShsb2NhbEZpbGUpOwkKKworCX0KKwkKKworfQorCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9hcGkvVGVzdFVwZGF0ZU1hbmFnZXJVdGlsc0FQSS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYXBpL1Rlc3RVcGRhdGVNYW5hZ2VyVXRpbHNBUEkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDk3ZTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYXBpL1Rlc3RVcGRhdGVNYW5hZ2VyVXRpbHNBUEkuamF2YQpAQCAtMCwwICsxLDIyOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5hcGk7CitpbXBvcnQgamF2YS5uZXQuVVJMOworCitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuVXBkYXRlTWFuYWdlclV0aWxzOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7CisKK3B1YmxpYyBjbGFzcyBUZXN0VXBkYXRlTWFuYWdlclV0aWxzQVBJIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsKKwkKKwkvKioKKwkgKiBUZXN0IHRoZSBnZXRGZWF0dXJlcygpCisJICovCisJcHVibGljIFRlc3RVcGRhdGVNYW5hZ2VyVXRpbHNBUEkoU3RyaW5nIGFyZzApIHsKKwkJc3VwZXIoYXJnMCk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RnZXRVUkwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJVVJMIHVybDEgPSBuZXcgVVJMKCJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIik7CisJCVVSTCB1cmwyID0gbmV3IFVSTCgiZmlsZTovL2M6L2hlbGxvIik7CisJCVVSTCB1cmwzID0gbmV3IFVSTCgiZmlsZTovaG9tZS9lY2xpcHNlLyIpOworCQlVUkwgdXJsNCA9IG5ldyBVUkwoImZ0cDovaG9zdDo4MDgwL3BhdGgvIik7CisJCVVSTCB1cmw1ID0gbmV3IFVSTCgiamFyOmZpbGU6L3RtcC8xMDAxMDAhLyIpOworCQkKKwkJU3RyaW5nIGRlZmF1bHQxID0gImRlZmF1bHQxL2RlZmF1bHQiOworCQlTdHJpbmcgZGVmYXVsdDIgPSAiL2RlZmF1bHQyLyI7CisJCQorCQlTdHJpbmcgc3RyMSA9ICJodHRwOi8vZGV2LmVjbGlwc2Uub3JnIjsKKwkJU3RyaW5nIHN0cjIgPSAicmVsYXRpdmUxL3BhdGgvIjsKKwkJU3RyaW5nIHN0cjMgPSAiL3JlbGF0aXZlMi9wYXRoIjsKKwkJCisJCVN0cmluZyByZXN1bHQxPW51bGw7CisJCVN0cmluZyByZXN1bHQyPW51bGw7CisJCQorCQkvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkJLy8gMS4wCisJCXJlc3VsdDEgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKHVybDEsc3RyMSxkZWZhdWx0MSkudG9FeHRlcm5hbEZvcm0oKTsKKwkJIHJlc3VsdDIgPSAiaHR0cDovL2Rldi5lY2xpcHNlLm9yZyI7CisJCWFzc2VydEVxdWFscygiMS4wIixyZXN1bHQyLHJlc3VsdDEpOworCQkKKwkJLy8gMS4xCisJCSByZXN1bHQxID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTChudWxsLHN0cjEsbnVsbCkudG9FeHRlcm5hbEZvcm0oKTsKKwkJIHJlc3VsdDIgPSAiaHR0cDovL2Rldi5lY2xpcHNlLm9yZyI7CisJCWFzc2VydEVxdWFscygiMS4xIixyZXN1bHQyLHJlc3VsdDEpOworCQkKKwkJLy8gMS4yCisJCSByZXN1bHQxID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTCh1cmwxLHN0cjEsbnVsbCkudG9FeHRlcm5hbEZvcm0oKTsKKwkJIHJlc3VsdDIgPSAiaHR0cDovL2Rldi5lY2xpcHNlLm9yZyI7CisJCWFzc2VydEVxdWFscygiMS4yIixyZXN1bHQyLHJlc3VsdDEpOworCQkKKwkJLy8gMS4zCisJCSByZXN1bHQxID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTCh1cmwxLHN0cjIsZGVmYXVsdDEpLnRvRXh0ZXJuYWxGb3JtKCk7CisJCSByZXN1bHQyID0gImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvcmVsYXRpdmUxL3BhdGgvIjsKKwkJYXNzZXJ0RXF1YWxzKCIxLjMiLHJlc3VsdDIscmVzdWx0MSk7CisJCQorCQkvLyAxLjQKKwkJIHJlc3VsdDEgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKHVybDEsc3RyMyxkZWZhdWx0MSkudG9FeHRlcm5hbEZvcm0oKTsKKwkJIHJlc3VsdDIgPSAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9yZWxhdGl2ZTIvcGF0aCI7CisJCWFzc2VydEVxdWFscygiMS40IixyZXN1bHQyLHJlc3VsdDEpOworCQkKKwkJLy8gMS41CisJCSByZXN1bHQxID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTCh1cmwxLG51bGwsZGVmYXVsdDEpLnRvRXh0ZXJuYWxGb3JtKCk7CisJCSByZXN1bHQyID0gImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZGVmYXVsdDEvZGVmYXVsdCI7CisJCWFzc2VydEVxdWFscygiMS41IixyZXN1bHQyLHJlc3VsdDEpOworCQkKKwkJLy8gMS42CisJCSByZXN1bHQxID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTCh1cmwxLG51bGwsZGVmYXVsdDIpLnRvRXh0ZXJuYWxGb3JtKCk7CisJCSByZXN1bHQyID0gImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZGVmYXVsdDIvIjsKKwkJYXNzZXJ0RXF1YWxzKCIxLjYiLHJlc3VsdDIscmVzdWx0MSk7CisJCQorCQkvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkJLy8gMi4wCisJCSByZXN1bHQxID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTCh1cmwyLHN0cjEsZGVmYXVsdDEpLnRvRXh0ZXJuYWxGb3JtKCk7CisJCSByZXN1bHQyID0gImh0dHA6Ly9kZXYuZWNsaXBzZS5vcmciOworCQlhc3NlcnRFcXVhbHMoIjIuMCIscmVzdWx0MixyZXN1bHQxKTsKKwkJCisJCS8vIDIuMQorCQkgcmVzdWx0MSA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwobnVsbCxzdHIxLG51bGwpLnRvRXh0ZXJuYWxGb3JtKCk7CisJCSByZXN1bHQyID0gImh0dHA6Ly9kZXYuZWNsaXBzZS5vcmciOworCQlhc3NlcnRFcXVhbHMoIjIuMSIscmVzdWx0MixyZXN1bHQxKTsKKwkJCisJCS8vIDIuMgorCQkgcmVzdWx0MSA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwodXJsMixzdHIxLG51bGwpLnRvRXh0ZXJuYWxGb3JtKCk7CisJCSByZXN1bHQyID0gImh0dHA6Ly9kZXYuZWNsaXBzZS5vcmciOworCQlhc3NlcnRFcXVhbHMoIjIuMiIscmVzdWx0MixyZXN1bHQxKTsKKwkJCisJCS8vIDIuMworCQkgcmVzdWx0MSA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwodXJsMixzdHIyLGRlZmF1bHQxKS50b0V4dGVybmFsRm9ybSgpOworCQkgcmVzdWx0MiA9ICJmaWxlOi8vYzovcmVsYXRpdmUxL3BhdGgvIjsKKwkJYXNzZXJ0RXF1YWxzKCIyLjMiLHJlc3VsdDIscmVzdWx0MSk7CisJCQorCQkvLyAyLjQKKwkJIHJlc3VsdDEgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKHVybDIsc3RyMyxkZWZhdWx0MSkudG9FeHRlcm5hbEZvcm0oKTsKKwkJIHJlc3VsdDIgPSAiZmlsZTovL2M6L3JlbGF0aXZlMi9wYXRoIjsKKwkJYXNzZXJ0RXF1YWxzKCIyLjQiLHJlc3VsdDIscmVzdWx0MSk7CisJCQorCQkvLyAyLjUKKwkJIHJlc3VsdDEgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKHVybDIsbnVsbCxkZWZhdWx0MSkudG9FeHRlcm5hbEZvcm0oKTsKKwkJIHJlc3VsdDIgPSAiZmlsZTovL2M6L2RlZmF1bHQxL2RlZmF1bHQiOworCQlhc3NlcnRFcXVhbHMoIjIuNSIscmVzdWx0MixyZXN1bHQxKTsKKwkJCisJCS8vIDIuNgorCQkgcmVzdWx0MSA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwodXJsMixudWxsLGRlZmF1bHQyKS50b0V4dGVybmFsRm9ybSgpOworCQkgcmVzdWx0MiA9ICJmaWxlOi8vYzovZGVmYXVsdDIvIjsKKwkJYXNzZXJ0RXF1YWxzKCIyLjYiLHJlc3VsdDIscmVzdWx0MSk7CisJCQorCisJCS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQkvLyAzLjAKKwkJIHJlc3VsdDEgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKHVybDMsc3RyMSxkZWZhdWx0MSkudG9FeHRlcm5hbEZvcm0oKTsKKwkJIHJlc3VsdDIgPSAiaHR0cDovL2Rldi5lY2xpcHNlLm9yZyI7CisJCWFzc2VydEVxdWFscygiMy4wIixyZXN1bHQyLHJlc3VsdDEpOworCQkKKwkJLy8gMy4xCisJCSByZXN1bHQxID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTChudWxsLHN0cjEsbnVsbCkudG9FeHRlcm5hbEZvcm0oKTsKKwkJIHJlc3VsdDIgPSAiaHR0cDovL2Rldi5lY2xpcHNlLm9yZyI7CisJCWFzc2VydEVxdWFscygiMy4xIixyZXN1bHQyLHJlc3VsdDEpOworCQkKKwkJLy8gMy4yCisJCSByZXN1bHQxID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTCh1cmwzLHN0cjEsbnVsbCkudG9FeHRlcm5hbEZvcm0oKTsKKwkJIHJlc3VsdDIgPSAiaHR0cDovL2Rldi5lY2xpcHNlLm9yZyI7CisJCWFzc2VydEVxdWFscygiMy4yIixyZXN1bHQyLHJlc3VsdDEpOworCQkKKwkJLy8gMy4zCisJCSByZXN1bHQxID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTCh1cmwzLHN0cjIsZGVmYXVsdDEpLnRvRXh0ZXJuYWxGb3JtKCk7CisJCSByZXN1bHQyID0gImZpbGU6L2hvbWUvZWNsaXBzZS9yZWxhdGl2ZTEvcGF0aC8iOworCQlhc3NlcnRFcXVhbHMoIjMuMyIscmVzdWx0MixyZXN1bHQxKTsKKwkJCisJCS8vIDMuNAorCQkgcmVzdWx0MSA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwodXJsMyxzdHIzLGRlZmF1bHQxKS50b0V4dGVybmFsRm9ybSgpOworCQkgcmVzdWx0MiA9ICJmaWxlOi9ob21lL2VjbGlwc2UvcmVsYXRpdmUyL3BhdGgiOworCQlhc3NlcnRFcXVhbHMoIjMuNCIscmVzdWx0MixyZXN1bHQxKTsKKwkJCisJCS8vIDMuNQorCQkgcmVzdWx0MSA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwodXJsMyxudWxsLGRlZmF1bHQxKS50b0V4dGVybmFsRm9ybSgpOworCQkgcmVzdWx0MiA9ICJmaWxlOi9ob21lL2VjbGlwc2UvZGVmYXVsdDEvZGVmYXVsdCI7CisJCWFzc2VydEVxdWFscygiMy41IixyZXN1bHQyLHJlc3VsdDEpOworCQkKKwkJLy8gMy42CisJCSByZXN1bHQxID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTCh1cmwzLG51bGwsZGVmYXVsdDIpLnRvRXh0ZXJuYWxGb3JtKCk7CisJCSByZXN1bHQyID0gImZpbGU6L2hvbWUvZWNsaXBzZS9kZWZhdWx0Mi8iOworCQlhc3NlcnRFcXVhbHMoIjMuNiIscmVzdWx0MixyZXN1bHQxKTsKKwkJCQkKKwkJLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJCS8vIDQuMAorCQkgcmVzdWx0MSA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwodXJsNCxzdHIxLGRlZmF1bHQxKS50b0V4dGVybmFsRm9ybSgpOworCQkgcmVzdWx0MiA9ICJodHRwOi8vZGV2LmVjbGlwc2Uub3JnIjsKKwkJYXNzZXJ0RXF1YWxzKCI0LjAiLHJlc3VsdDIscmVzdWx0MSk7CisJCQorCQkvLyA0LjEKKwkJIHJlc3VsdDEgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKG51bGwsc3RyMSxudWxsKS50b0V4dGVybmFsRm9ybSgpOworCQkgcmVzdWx0MiA9ICJodHRwOi8vZGV2LmVjbGlwc2Uub3JnIjsKKwkJYXNzZXJ0RXF1YWxzKCI0LjEiLHJlc3VsdDIscmVzdWx0MSk7CisJCQorCQkvLyA0LjIKKwkJIHJlc3VsdDEgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKHVybDQsc3RyMSxudWxsKS50b0V4dGVybmFsRm9ybSgpOworCQkgcmVzdWx0MiA9ICJodHRwOi8vZGV2LmVjbGlwc2Uub3JnIjsKKwkJYXNzZXJ0RXF1YWxzKCI0LjIiLHJlc3VsdDIscmVzdWx0MSk7CisJCQorCQkvLyA0LjMKKwkJIHJlc3VsdDEgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKHVybDQsc3RyMixkZWZhdWx0MSkudG9FeHRlcm5hbEZvcm0oKTsKKwkJIHJlc3VsdDIgPSAiZnRwOi9ob3N0OjgwODAvcGF0aC9yZWxhdGl2ZTEvcGF0aC8iOworCQlhc3NlcnRFcXVhbHMoIjQuMyIscmVzdWx0MixyZXN1bHQxKTsKKwkJCisJCS8vIDQuNAorCQkgcmVzdWx0MSA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwodXJsNCxzdHIzLGRlZmF1bHQxKS50b0V4dGVybmFsRm9ybSgpOworCQkgcmVzdWx0MiA9ICJmdHA6L2hvc3Q6ODA4MC9wYXRoL3JlbGF0aXZlMi9wYXRoIjsKKwkJYXNzZXJ0RXF1YWxzKCI0LjQiLHJlc3VsdDIscmVzdWx0MSk7CisJCQorCQkvLyA0LjUKKwkJIHJlc3VsdDEgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKHVybDQsbnVsbCxkZWZhdWx0MSkudG9FeHRlcm5hbEZvcm0oKTsKKwkJIHJlc3VsdDIgPSAiZnRwOi9ob3N0OjgwODAvcGF0aC9kZWZhdWx0MS9kZWZhdWx0IjsKKwkJYXNzZXJ0RXF1YWxzKCI0LjUiLHJlc3VsdDIscmVzdWx0MSk7CisJCQorCQkvLyA0LjYKKwkJIHJlc3VsdDEgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKHVybDQsbnVsbCxkZWZhdWx0MikudG9FeHRlcm5hbEZvcm0oKTsKKwkJIHJlc3VsdDIgPSAiZnRwOi9ob3N0OjgwODAvcGF0aC9kZWZhdWx0Mi8iOworCQlhc3NlcnRFcXVhbHMoIjQuNiIscmVzdWx0MixyZXN1bHQxKTsKKwkJCisJCS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCQkvLyA1LjAKKwkJIHJlc3VsdDEgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKHVybDUsc3RyMSxkZWZhdWx0MSkudG9FeHRlcm5hbEZvcm0oKTsKKwkJIHJlc3VsdDIgPSAiaHR0cDovL2Rldi5lY2xpcHNlLm9yZyI7CisJCWFzc2VydEVxdWFscygiNS4wIixyZXN1bHQyLHJlc3VsdDEpOworCQkKKwkJLy8gNS4xCisJCSByZXN1bHQxID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTChudWxsLHN0cjEsbnVsbCkudG9FeHRlcm5hbEZvcm0oKTsKKwkJIHJlc3VsdDIgPSAiaHR0cDovL2Rldi5lY2xpcHNlLm9yZyI7CisJCWFzc2VydEVxdWFscygiNS4xIixyZXN1bHQyLHJlc3VsdDEpOworCQkKKwkJLy8gNS4yCisJCSByZXN1bHQxID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTCh1cmw1LHN0cjEsbnVsbCkudG9FeHRlcm5hbEZvcm0oKTsKKwkJIHJlc3VsdDIgPSAiaHR0cDovL2Rldi5lY2xpcHNlLm9yZyI7CisJCWFzc2VydEVxdWFscygiNS4yIixyZXN1bHQyLHJlc3VsdDEpOworCQkKKwkJLy8gNS4zCisJCSByZXN1bHQxID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTCh1cmw1LHN0cjIsZGVmYXVsdDEpLnRvRXh0ZXJuYWxGb3JtKCk7CisJCSByZXN1bHQyID0gImphcjpmaWxlOi90bXAvMTAwMTAwIS9yZWxhdGl2ZTEvcGF0aC8iOworCQlhc3NlcnRFcXVhbHMoIjUuMyIscmVzdWx0MixyZXN1bHQxKTsKKwkJCisJCS8vIDUuNAorCQkgcmVzdWx0MSA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwodXJsNSxzdHIzLGRlZmF1bHQxKS50b0V4dGVybmFsRm9ybSgpOworCQkgcmVzdWx0MiA9ICJqYXI6ZmlsZTovdG1wLzEwMDEwMCEvcmVsYXRpdmUyL3BhdGgiOworCQlhc3NlcnRFcXVhbHMoIjUuNCIscmVzdWx0MixyZXN1bHQxKTsKKwkJCisJCS8vIDUuNQorCQkgcmVzdWx0MSA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwodXJsNSxudWxsLGRlZmF1bHQxKS50b0V4dGVybmFsRm9ybSgpOworCQkgcmVzdWx0MiA9ICJqYXI6ZmlsZTovdG1wLzEwMDEwMCEvZGVmYXVsdDEvZGVmYXVsdCI7CisJCWFzc2VydEVxdWFscygiNS41IixyZXN1bHQyLHJlc3VsdDEpOworCQkKKwkJLy8gNS42CisJCSByZXN1bHQxID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTCh1cmw1LG51bGwsZGVmYXVsdDIpLnRvRXh0ZXJuYWxGb3JtKCk7CisJCSByZXN1bHQyID0gImphcjpmaWxlOi90bXAvMTAwMTAwIS9kZWZhdWx0Mi8iOworCQlhc3NlcnRFcXVhbHMoIjUuNiIscmVzdWx0MixyZXN1bHQxKTsJCQkJCisKKwl9CisJCisJCisKK30KKwpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYnJhbmRpbmcvQWxsQnJhbmRpbmdUZXN0cy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYnJhbmRpbmcvQWxsQnJhbmRpbmdUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0YWExYzIKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9icmFuZGluZy9BbGxCcmFuZGluZ1Rlc3RzLmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5icmFuZGluZzsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworCitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZU1hbmFnZXJUZXN0Q2FzZTsKKworLyoqCisgKiBNYW5hZ2VzIHRoZSBBUEkgdGVzdHMKKyAqLworcHVibGljIGNsYXNzIEFsbEJyYW5kaW5nVGVzdHMgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2UgeworCS8qKgorCSAqIENvbnN0cnVjdG9yCisJICovCisJcHVibGljIEFsbEJyYW5kaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCQorCS8qKgorCSAqIExpc3Qgb2YgQVBJIHRlc3RzCisJICovCisJcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKKwkJc3VpdGUuc2V0TmFtZSgiQnJhbmRpbmcgVGVzdHMiKTsKKworCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoQnVuZGxlUHJvdmlkZXJUZXN0LmNsYXNzKSk7CQorCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoUHJvZHVjdFRlc3QuY2xhc3MpKTsJCisKKwkJcmV0dXJuIHN1aXRlOworCX0KK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2JyYW5kaW5nL0J1bmRsZVByb3ZpZGVyVGVzdC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYnJhbmRpbmcvQnVuZGxlUHJvdmlkZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY5YTI2NAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2JyYW5kaW5nL0J1bmRsZVByb3ZpZGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuYnJhbmRpbmc7CisKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb25maWd1cmF0b3IuYnJhbmRpbmcuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlTWFuYWdlclRlc3RDYXNlOworaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay4qOworCitwdWJsaWMgY2xhc3MgQnVuZGxlUHJvdmlkZXJUZXN0IGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsKKworCXB1YmxpYyBCdW5kbGVQcm92aWRlclRlc3QoU3RyaW5nIHRlc3RjYXNlKXsKKwkJc3VwZXIodGVzdGNhc2UpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RNYWluKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCQorCQlJQnVuZGxlR3JvdXBQcm92aWRlcltdIGJ1bmRsZUdyb3VwUHJvdmlkZXJzID0gUGxhdGZvcm0uZ2V0QnVuZGxlR3JvdXBQcm92aWRlcnMoKTsKKwkJZm9yIChpbnQgaT0wOyBpPGJ1bmRsZUdyb3VwUHJvdmlkZXJzLmxlbmd0aDsgaSsrKSB7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkJ1bmRsZUdyb3VwUHJvdmlkZXI6IitidW5kbGVHcm91cFByb3ZpZGVyc1tpXS5nZXROYW1lKCkpOworCQkJSUJ1bmRsZUdyb3VwW10gYnVuZGxlR3JvdXBzID0gYnVuZGxlR3JvdXBQcm92aWRlcnNbaV0uZ2V0QnVuZGxlR3JvdXBzKCk7CisJCQlmb3IgKGludCBqPTA7IGo8YnVuZGxlR3JvdXBzLmxlbmd0aDsgaisrKSB7CisJCQkJU3lzdGVtLm91dC5wcmludGxuKCJCdW5kbGVHcm91cCBuYW1lOiIrYnVuZGxlR3JvdXBzW2pdLmdldE5hbWUoKSArIlxuIiArCisJCQkJCQkiZGVzY3JpcHRpb246IiArIGJ1bmRsZUdyb3Vwc1tqXS5nZXREZXNjcmlwdGlvbigpICsgIlxuIisKKwkJCQkJCSJpZDoiICsgYnVuZGxlR3JvdXBzW2pdLmdldElkZW50aWZpZXIoKSArICJcbiIgKworCQkJCQkJInByb3ZpZGVyOiIgKyBidW5kbGVHcm91cHNbal0uZ2V0UHJvdmlkZXJOYW1lKCkgKyAiXG4iICsKKwkJCQkJCSJ2ZXJzaW9uOiIgKyBidW5kbGVHcm91cHNbal0uZ2V0VmVyc2lvbigpICsgIlxuIiArCisJCQkJCQkibGljZW5zZToiICsgYnVuZGxlR3JvdXBzW2pdLmdldFByb3BlcnR5KElCdW5kbGVHcm91cENvbnN0YW50cy5MSUNFTlNFX0hSRUYpICsgIlxuIiArCisJCQkJCQkiZmVhdHVyZUltYWdlOiIgKyBidW5kbGVHcm91cHNbal0uZ2V0UHJvcGVydHkoSUJ1bmRsZUdyb3VwQ29uc3RhbnRzLkZFQVRVUkVfSU1BR0UpICsgIlxuIiArCisJCQkJCQkidGlwcyBhbmQgdHJpY2tzOiIgKyBidW5kbGVHcm91cHNbal0uZ2V0UHJvcGVydHkoSUJ1bmRsZUdyb3VwQ29uc3RhbnRzLlRJUFNfQU5EX1RSSUNLU19IUkVGKSArICJcbiIgKworCQkJCQkJIndlbGNvbWVQYWdlOiIgKyBidW5kbGVHcm91cHNbal0uZ2V0UHJvcGVydHkoSUJ1bmRsZUdyb3VwQ29uc3RhbnRzLldFTENPTUVfUEFHRSkgKyAiXG4iICsKKwkJCQkJCSJ3ZWxjb21lUGVyc3BlY3RpdmU6IiArIGJ1bmRsZUdyb3Vwc1tqXS5nZXRQcm9wZXJ0eShJQnVuZGxlR3JvdXBDb25zdGFudHMuV0VMQ09NRV9QRVJTUEVDVElWRSkpOworCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiYnVuZGxlczoiKTsKKwkJCQlCdW5kbGVbXSBidW5kbGVzID0gYnVuZGxlR3JvdXBzW2pdLmdldEJ1bmRsZXMoKTsKKwkJCQlmb3IgKGludCBiPTA7IGI8YnVuZGxlcy5sZW5ndGg7IGIrKykKKwkJCQkJU3lzdGVtLm91dC5wcmludGxuKGJ1bmRsZXNbYl0uZ2V0U3ltYm9saWNOYW1lKCkpOworCQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOworCQkJfQorCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYnJhbmRpbmcvUHJvZHVjdFRlc3QuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2JyYW5kaW5nL1Byb2R1Y3RUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2YwZDM5NgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2JyYW5kaW5nL1Byb2R1Y3RUZXN0LmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5icmFuZGluZzsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb25maWd1cmF0b3IuYnJhbmRpbmcuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuKjsKKworcHVibGljIGNsYXNzIFByb2R1Y3RUZXN0IGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsKKworCXB1YmxpYyBQcm9kdWN0VGVzdChTdHJpbmcgdGVzdGNhc2UpeworCQlzdXBlcih0ZXN0Y2FzZSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdE1haW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJCisJCUlQcm9kdWN0IHByb2R1Y3QgPSBQbGF0Zm9ybS5nZXRQcm9kdWN0KCk7CisJCWlmIChwcm9kdWN0ID09IG51bGwpCisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5vIHByb2R1Y3QgZGVmaW5lZCIpOworCQllbHNlCisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlByb2R1Y3QgaXM6IFxuIiArCisJCQkJCSJuYW1lPSIgKyBwcm9kdWN0LmdldE5hbWUoKSArICJcbiIgKworCQkJCQkiYXBwbGljYXRpb249IiArIHByb2R1Y3QuZ2V0QXBwbGljYXRpb24oKSArICJcbiIgKworCQkJCQkiZGVzY3JpcHRpb249IiArIHByb2R1Y3QuZ2V0RGVzY3JpcHRpb24oKSArICJcbiIgKworCQkJCQkiaWQ9IisgcHJvZHVjdC5nZXRJZCgpICsgIlxuIiArCisJCQkJCSJhYm91dF90ZXh0OiIrcHJvZHVjdC5nZXRQcm9wZXJ0eShJUHJvZHVjdENvbnN0YW50cy5BQk9VVF9URVhUKSArIlxuIiArCisJCQkJCSJhYm91dF9pbWFnZToiK3Byb2R1Y3QuZ2V0UHJvcGVydHkoSVByb2R1Y3RDb25zdGFudHMuQUJPVVRfSU1BR0UpICsiXG4iICsKKwkJCQkJImFwcF9uYW1lOiIrcHJvZHVjdC5nZXRQcm9wZXJ0eShJUHJvZHVjdENvbnN0YW50cy5BUFBfTkFNRSkgKyJcbiIgKworCQkJCQkid2luZG93X2ltYWdlOiIrcHJvZHVjdC5nZXRQcm9wZXJ0eShJUHJvZHVjdENvbnN0YW50cy5XSU5ET1dfSU1BR0UpICsiXG4iICsKKwkJCQkJIndpbmRvd19pbWFnZXM6Iitwcm9kdWN0LmdldFByb3BlcnR5KElQcm9kdWN0Q29uc3RhbnRzLldJTkRPV19JTUFHRVMpICk7CisJCQkJCisJfQorfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvY29uZmlndXJhdGlvbnMvQWxsQ29uZmlndXJhdGlvbnNUZXN0cy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvY29uZmlndXJhdGlvbnMvQWxsQ29uZmlndXJhdGlvbnNUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlMjYwMGIKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9jb25maWd1cmF0aW9ucy9BbGxDb25maWd1cmF0aW9uc1Rlc3RzLmphdmEKQEAgLTAsMCArMSwzMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb25maWd1cmF0aW9uczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLio7CisKKworcHVibGljIGNsYXNzIEFsbENvbmZpZ3VyYXRpb25zVGVzdHMgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2UgeworcHVibGljIEFsbENvbmZpZ3VyYXRpb25zVGVzdHMoU3RyaW5nIG5hbWUpIHsKKwlzdXBlcihuYW1lKTsKK30KK3B1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKKwlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7CisJc3VpdGUuc2V0TmFtZSgiUmVndWxhciBJbnN0YWxsIFRlc3RzIik7CisJCisvLwlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdFJldmVydC5jbGFzcykpOworCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShUZXN0QmFja3dhcmQuY2xhc3MpKTsKKwkJCisJcmV0dXJuIHN1aXRlOworfQorfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvY29uZmlndXJhdGlvbnMvVGVzdEJhY2t3YXJkLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9jb25maWd1cmF0aW9ucy9UZXN0QmFja3dhcmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTQyMGJlCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvY29uZmlndXJhdGlvbnMvVGVzdEJhY2t3YXJkLmphdmEKQEAgLTAsMCArMSw2NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb25maWd1cmF0aW9uczsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7CisKK3B1YmxpYyBjbGFzcyBUZXN0QmFja3dhcmQgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2UgeworCQorCS8qKgorCSAqIFRlc3QgdGhlIGdldEZlYXR1cmVzKCkKKwkgKi8KKwlwdWJsaWMgVGVzdEJhY2t3YXJkKFN0cmluZyBhcmcwKSB7CisJCXN1cGVyKGFyZzApOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlQmFja3dhcmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQkvLyBjbGVhbnVwCisJCUxvY2FsU2l0ZSBzaXRlTG9jYWwgPSAoKExvY2FsU2l0ZSlTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKSk7CisJCUZpbGUgbG9jYWxGaWxlID0gbmV3IEZpbGUoKHNpdGVMb2NhbCkuZ2V0TG9jYXRpb25VUkwoKS5nZXRGaWxlKCkpOworCQlJbnRlcm5hbFNpdGVNYW5hZ2VyLmxvY2FsU2l0ZT1udWxsOwkJCisKKwkJSUxvY2FsU2l0ZSBzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7CisJCUlTaXRlIHJlbW90ZVNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKFNPVVJDRV9IVFRQX1NJVEUsbnVsbCk7CisJCUlGZWF0dXJlUmVmZXJlbmNlIGZlYXR1cmVSZWYgPSByZW1vdGVTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKClbMF07CisJCQorCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gb2xkSW5zdGFsbENvbmZpZyA9IHNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKTsKKwkJSUNvbmZpZ3VyZWRTaXRlIG9sZENvbmZpZ1NpdGUgPSBvbGRJbnN0YWxsQ29uZmlnLmdldENvbmZpZ3VyZWRTaXRlcygpWzBdOworCQkKKwkJKChDb25maWd1cmVkU2l0ZSlvbGRDb25maWdTaXRlKS5zZXRVcGRhdGFibGUodHJ1ZSk7CQorCQlhc3NlcnROb3ROdWxsKCJSZWZlcmVuY2UgaXMgbnVsbCIsZmVhdHVyZVJlZik7CisJCXJlbW92ZShmZWF0dXJlUmVmLmdldEZlYXR1cmUobnVsbCksb2xkQ29uZmlnU2l0ZSk7CQorCQlvbGRDb25maWdTaXRlLmluc3RhbGwoZmVhdHVyZVJlZi5nZXRGZWF0dXJlKG51bGwpLG51bGwsbnVsbCk7CisJCXNpdGUuc2F2ZSgpOworCQorCQkKKwkJLy8gQWN0aXZpdHkgLT4gSW5zdGFsbENvbmZpZworCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY3VycmVudCA9IHNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKTsKKy8vCQlJQWN0aXZpdHkgYWN0aXZpdHkgPSBjdXJyZW50LmdldEFjdGl2aXRpZXMoKVswXTsJCisvLwkJYXNzZXJ0VHJ1ZShhY3Rpdml0eS5nZXRJbnN0YWxsQ29uZmlndXJhdGlvbigpLmVxdWFscyhjdXJyZW50KSk7CisJCQorCQkvLyBDb25maWdTaXRlLT5JbnN0YWxsQ29uZmlnCisJCUlDb25maWd1cmVkU2l0ZSBuZXdDb25maWdTaXRlID0gY3VycmVudC5nZXRDb25maWd1cmVkU2l0ZXMoKVswXTsKKwkJYXNzZXJ0VHJ1ZShuZXdDb25maWdTaXRlLmdldEluc3RhbGxDb25maWd1cmF0aW9uKCkuZXF1YWxzKGN1cnJlbnQpKTsKKwkJCisJCS8vIGNsZWFudXAKKwkJbG9jYWxGaWxlID0gbmV3IEZpbGUoKChMb2NhbFNpdGUpU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkpLmdldExvY2F0aW9uVVJMKCkuZ2V0RmlsZSgpKTsKKwkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGxvY2FsRmlsZSk7CQkJCisJfQorCit9CisKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2NvbmZpZ3VyYXRpb25zL1Rlc3RSZXZlcnQuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2NvbmZpZ3VyYXRpb25zL1Rlc3RSZXZlcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWE5ZGZlCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvY29uZmlndXJhdGlvbnMvVGVzdFJldmVydC5qYXZhCkBAIC0wLDAgKzEsMTI2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvbmZpZ3VyYXRpb25zOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm1vZGVsLkNvbmZpZ3VyZWRTaXRlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZU1hbmFnZXJUZXN0Q2FzZTsKKworcHVibGljIGNsYXNzIFRlc3RSZXZlcnQgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2UgeworCQorCS8qKgorCSAqIFRlc3QgdGhlIGdldEZlYXR1cmVzKCkKKwkgKi8KKwlwdWJsaWMgVGVzdFJldmVydChTdHJpbmcgYXJnMCkgeworCQlzdXBlcihhcmcwKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFNpbXBsZVJldmVydEluc3RhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQkvLyBjbGVhbnVwCisJCUxvY2FsU2l0ZSBzaXRlTG9jYWwgPSAoKExvY2FsU2l0ZSlTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKSk7CisJCUZpbGUgbG9jYWxGaWxlID0gbmV3IEZpbGUoc2l0ZUxvY2FsLmdldExvY2F0aW9uVVJMKCkuZ2V0RmlsZSgpKTsKKwkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGxvY2FsRmlsZSk7CQkKKwkJSW50ZXJuYWxTaXRlTWFuYWdlci5sb2NhbFNpdGU9bnVsbDsJCQorCisJCUlMb2NhbFNpdGUgc2l0ZSA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpOworCQlJU2l0ZSByZW1vdGVTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShTT1VSQ0VfSFRUUF9TSVRFLG51bGwpOworCQlJRmVhdHVyZVJlZmVyZW5jZSBmZWF0dXJlUmVmID0gcmVtb3RlU2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpWzBdOworCQlJRmVhdHVyZVJlZmVyZW5jZSBmZWF0dXJlUmVmMiA9IHJlbW90ZVNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKVsxXTsKKwkJSUZlYXR1cmUgZmVhdHVyZSA9IGZlYXR1cmVSZWYuZ2V0RmVhdHVyZShudWxsKTsKKwkJCisJCS8vIG9sZCBjb25maWcsIG5vIGZlYXR1cmVzIGluc3RhbGxlZAorCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gb2xkID0gc2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpOworCQlDb25maWd1cmF0aW9uUG9saWN5IGV4Y2x1ZGVwb2xpY3kgPSBuZXcgQ29uZmlndXJhdGlvblBvbGljeSgpOworCQlleGNsdWRlcG9saWN5LnNldFBvbGljeShJUGxhdGZvcm1Db25maWd1cmF0aW9uLklTaXRlUG9saWN5LlVTRVJfRVhDTFVERSk7CisJCUlDb25maWd1cmVkU2l0ZSBvbGRDb25maWdTaXRlID0gb2xkLmdldENvbmZpZ3VyZWRTaXRlcygpWzBdOworCQlleGNsdWRlcG9saWN5LnNldENvbmZpZ3VyZWRTaXRlTW9kZWwoKENvbmZpZ3VyZWRTaXRlTW9kZWwpb2xkQ29uZmlnU2l0ZSk7CQkKKwkJKChDb25maWd1cmVkU2l0ZU1vZGVsKW9sZENvbmZpZ1NpdGUpLnNldENvbmZpZ3VyYXRpb25Qb2xpY3lNb2RlbChleGNsdWRlcG9saWN5KTsKKwkJCisJCS8vIGluc3RhbGwgb25lIGZlYXR1cmUKKwkJSUluc3RhbGxDb25maWd1cmF0aW9uIG5ld0NvbmZpZyA9IHNpdGUuY2xvbmVDdXJyZW50Q29uZmlndXJhdGlvbigpOworCQlJQ29uZmlndXJlZFNpdGUgY29uZmlnU2l0ZSA9IG5ld0NvbmZpZy5nZXRDb25maWd1cmVkU2l0ZXMoKVswXTsKKwkJaWYgKCFjb25maWdTaXRlLmdldFNpdGUoKS5lcXVhbHMob2xkQ29uZmlnU2l0ZS5nZXRTaXRlKCkpKSBmYWlsKCJDb25maWcgc2l0ZXMgYXJlIG5vdCBlcXVhbHMiKTsKKwkJc2l0ZS5hZGRDb25maWd1cmF0aW9uKG5ld0NvbmZpZyk7CQorCQkKKwkJKChDb25maWd1cmVkU2l0ZSljb25maWdTaXRlKS5zZXRVcGRhdGFibGUodHJ1ZSk7CQkJCisJCUlGZWF0dXJlUmVmZXJlbmNlIGluc3RhbGxlZEZlYXR1cmUgPSBjb25maWdTaXRlLmluc3RhbGwoZmVhdHVyZSxudWxsLG51bGwpOworCQlzaXRlLnNhdmUoKTsKKworCQkvLyB1bmNvbmZpZ3VyZSBpdAorCQljb25maWdTaXRlLnVuY29uZmlndXJlKGluc3RhbGxlZEZlYXR1cmUuZ2V0RmVhdHVyZShudWxsKSk7CisKKwkJLy8gaW5zdGFsbCBhbm90aGVyIGZlYXR1cmUKKwkJSUZlYXR1cmUgZmVhdHVyZTIgPSBmZWF0dXJlUmVmMi5nZXRGZWF0dXJlKG51bGwpOworCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gbmV3Q29uZmlnMiA9IHNpdGUuY2xvbmVDdXJyZW50Q29uZmlndXJhdGlvbigpOworCQlJQ29uZmlndXJlZFNpdGUgYW5vdGhlckNvbmZpZ1NpdGUgPSBuZXdDb25maWcyLmdldENvbmZpZ3VyZWRTaXRlcygpWzBdOworCQlpZiAoIWFub3RoZXJDb25maWdTaXRlLmdldFNpdGUoKS5lcXVhbHMob2xkQ29uZmlnU2l0ZS5nZXRTaXRlKCkpKSBmYWlsKCJDb25maWcgc2l0ZXMgYXJlIG5vdCBlcXVhbHMiKTsJCQorCQlzaXRlLmFkZENvbmZpZ3VyYXRpb24obmV3Q29uZmlnMik7CQkKKwkJYW5vdGhlckNvbmZpZ1NpdGUuaW5zdGFsbChmZWF0dXJlMixudWxsLG51bGwpOworCQlzaXRlLnNhdmUoKTsKKworCQkvLyByZXZlcnQgdG8gb2xkIHN0YXRlIHdoZXJlIG5vIGZlYXR1cmUgd2hlcmUgY29uZmlndXJlZAorCQlzaXRlLnJldmVydFRvKG9sZCxudWxsLG51bGwpOworCQlzaXRlLnNhdmUoKTsKKwkJCisJCS8vIGNoZWNrCisJCVN0cmluZyB0aW1lID0gIiIrc2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldENyZWF0aW9uRGF0ZSgpLmdldFRpbWUoKTsKKwkJRmlsZSBmaWxlID0gbmV3IEZpbGUoKChMb2NhbFNpdGUpU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkpLmdldExvY2F0aW9uVVJMKCkuZ2V0RmlsZSgpKTsKKwkJYXNzZXJ0VHJ1ZSgibmV3IGNvbmZpZ3VyYXRpb24gZG9lcyBub3QgZXhpc3QiLCBmaWxlLmV4aXN0cygpKTsKKwkJCisJCQorCQkvL2ZpbmQgY29uZmlndXJlZCBzaXRlCisJCUlDb25maWd1cmVkU2l0ZSBuZXdDb25maWdTaXRlID0gbnVsbDsKKwkJSUNvbmZpZ3VyZWRTaXRlW10gc2l0ZXMgPSBzaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkuZ2V0Q29uZmlndXJlZFNpdGVzKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l0ZXMubGVuZ3RoOyBpKyspIHsKKwkJCWlmIChzaXRlc1tpXS5nZXRTaXRlKCkuZXF1YWxzKG9sZENvbmZpZ1NpdGUuZ2V0U2l0ZSgpKSl7CisJCQkJIG5ld0NvbmZpZ1NpdGUgPSBzaXRlc1tpXTsKKwkJCQkgYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKG5ld0NvbmZpZ1NpdGU9PW51bGwpIGZhaWwoIkNhbm5vdCBmaW5kIGNvbmZpZ3VyYXRpb24gc2l0ZSIpOworCisJCWludCBvbGROdW1iZXIgPSBvbGRDb25maWdTaXRlLmdldENvbmZpZ3VyZWRGZWF0dXJlcygpLmxlbmd0aDsKKwkJaW50IG5ld051bWJlciA9IG5ld0NvbmZpZ1NpdGUuZ2V0Q29uZmlndXJlZEZlYXR1cmVzKCkubGVuZ3RoOworCQkKKwkJLy8KKwkJSUZlYXR1cmVSZWZlcmVuY2VbXSBjb25maWdGZWF0dXJlcyA9IG5ld0NvbmZpZ1NpdGUuZ2V0Q29uZmlndXJlZEZlYXR1cmVzKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlnRmVhdHVyZXMubGVuZ3RoOyBpKyspIHsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbihjb25maWdGZWF0dXJlc1tpXSk7CisJCX0JCQorCQlhc3NlcnRUcnVlKCJXcm9uZyBudW1iZXIgb2YgY29uZmlndXJlZCBmZWF0dXJlcyBvbGQ6IitvbGROdW1iZXIrIiBuZXc6IituZXdOdW1iZXIsb2xkTnVtYmVyPT1uZXdOdW1iZXIpOworCQkKKwkJLy8gdGVzdCBvbmx5IDIgaW5zdGFsbCBjb25maWcgaW4gbG9jYWwgc2l0ZQorCQlpbnQgbmV3TnVtYmVyVW5jb25maWd1cmVkRmVhdHVyZXMgPSAoKENvbmZpZ3VyZWRTaXRlKW5ld0NvbmZpZ1NpdGUpLmdldENvbmZpZ3VyYXRpb25Qb2xpY3koKS5nZXRVbmNvbmZpZ3VyZWRGZWF0dXJlcygpLmxlbmd0aDsKKwkJaW50IG9sZE51bWJlclVuY29uZmlndXJlZEZlYXR1cmVzID0gKChDb25maWd1cmVkU2l0ZSlvbGRDb25maWdTaXRlKS5nZXRDb25maWd1cmF0aW9uUG9saWN5KCkuZ2V0VW5jb25maWd1cmVkRmVhdHVyZXMoKS5sZW5ndGg7CQkKKwkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBudW1iZXIgb2YgdW5jb25maWd1cmVkIGZlYXR1cmVzIixvbGROdW1iZXJVbmNvbmZpZ3VyZWRGZWF0dXJlcysyLG5ld051bWJlclVuY29uZmlndXJlZEZlYXR1cmVzKTsKKwkJCisJCS8vIGNsZWFudXAKKwkJbG9jYWxGaWxlID0gbmV3IEZpbGUoc2l0ZUxvY2FsLmdldExvY2F0aW9uVVJMKCkuZ2V0RmlsZSgpKTsKKwkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGxvY2FsRmlsZSk7CQkKKwkJbG9jYWxGaWxlID0gbmV3IEZpbGUoKChMb2NhbFNpdGUpU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkpLmdldExvY2F0aW9uVVJMKCkuZ2V0RmlsZSgpKTsKKwkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGxvY2FsRmlsZSk7CQkJCQorCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0oZmlsZSk7CQorCQl0aW1lID0gIiIrbmV3Q29uZmlnLmdldENyZWF0aW9uRGF0ZSgpLmdldFRpbWUoKTsKKwkJZmlsZSA9IG5ldyBGaWxlKG5ldyBVUkwoKChMb2NhbFNpdGUpU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkpLmdldExvY2F0aW9uVVJMKCksIkRlZmF1bHRDb25maWciK3RpbWUrIi54bWwiKS5nZXRGaWxlKCkpOwkKKwkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGZpbGUpOwkKKwkJdGltZSA9ICIiK25ld0NvbmZpZzIuZ2V0Q3JlYXRpb25EYXRlKCkuZ2V0VGltZSgpOworCQlmaWxlID0gbmV3IEZpbGUobmV3IFVSTCgoKExvY2FsU2l0ZSlTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKSkuZ2V0TG9jYXRpb25VUkwoKSwiRGVmYXVsdENvbmZpZyIrdGltZSsiLnhtbCIpLmdldEZpbGUoKSk7CQorCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0oZmlsZSk7CQorCX0KKworfQorCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9jb3JlL1Rlc3RFcnJvclJlY292ZXJ5TG9nLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9jb3JlL1Rlc3RFcnJvclJlY292ZXJ5TG9nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI0YmZmNgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2NvcmUvVGVzdEVycm9yUmVjb3ZlcnlMb2cuamF2YQpAQCAtMCwwICsxLDMyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IFRoZSBFY2xpcHNlIEZvdW5kYXRpb24uCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAgICBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmU7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5FcnJvclJlY292ZXJ5TG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7CisKK3B1YmxpYyBjbGFzcyBUZXN0RXJyb3JSZWNvdmVyeUxvZyBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7CisJCisJcHVibGljIFRlc3RFcnJvclJlY292ZXJ5TG9nKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0TG9jYWxSYW5kb21JZGVudGlmaWVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgeworCQkJU3RyaW5nIGZuYW1lID0gRXJyb3JSZWNvdmVyeUxvZy5nZXRMb2NhbFJhbmRvbUlkZW50aWZpZXIoU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmlvLnRtcGRpciIpICsgIi9mZWF0dXJlLnhtbCIpOworCQkJRmlsZSBmID0gbmV3IEZpbGUoZm5hbWUpOworCQkJYXNzZXJ0VHJ1ZShmLmNyZWF0ZU5ld0ZpbGUoKSk7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9jb3JlL2Jvb3QvQWxsUGxhdGZvcm1Db25maWd1cmF0aW9uVGVzdHMuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2NvcmUvYm9vdC9BbGxQbGF0Zm9ybUNvbmZpZ3VyYXRpb25UZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0NTBmNTQKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9jb3JlL2Jvb3QvQWxsUGxhdGZvcm1Db25maWd1cmF0aW9uVGVzdHMuamF2YQpAQCAtMCwwICsxLDM4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUuYm9vdDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CisKK3B1YmxpYyBjbGFzcyBBbGxQbGF0Zm9ybUNvbmZpZ3VyYXRpb25UZXN0cworCWV4dGVuZHMgUGxhdGZvcm1Db25maWd1cmF0aW9uVGVzdENhc2UgeworCS8qKgorCSAqIENvbnN0cnVjdG9yCisJICovCisJcHVibGljIEFsbFBsYXRmb3JtQ29uZmlndXJhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKwkKKwkvKioKKwkgKiBMaXN0IG9mIEFQSSB0ZXN0cworCSAqLworCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHRocm93cyBFeGNlcHRpb24geworCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7CisJCXN1aXRlLnNldE5hbWUoIlBsYXRmb3JtQ29uZmlndXJhdGlvbiBUZXN0cyIpOworCisJCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShUZXN0UGxhdENmZ0FQSS5jbGFzcykpOworCisJCXJldHVybiBzdWl0ZTsKKwl9CisKK30KKwpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvY29yZS9ib290L1BsYXRmb3JtQ29uZmlndXJhdGlvblRlc3RDYXNlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9jb3JlL2Jvb3QvUGxhdGZvcm1Db25maWd1cmF0aW9uVGVzdENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2FjYjNlCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvY29yZS9ib290L1BsYXRmb3JtQ29uZmlndXJhdGlvblRlc3RDYXNlLmphdmEKQEAgLTAsMCArMSw3OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlLmJvb3Q7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK3B1YmxpYyBjbGFzcyBQbGF0Zm9ybUNvbmZpZ3VyYXRpb25UZXN0Q2FzZSBleHRlbmRzIFRlc3RDYXNlIHsKKwkKKwlwcm90ZWN0ZWQgU3RyaW5nIHRlbXBEaXI7CisJCisJcHVibGljIFBsYXRmb3JtQ29uZmlndXJhdGlvblRlc3RDYXNlKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCQl0cnkgeworCQkJaW5pdCgpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJZmFpbChlLnRvU3RyaW5nKCkpOworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJfQorCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgeworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKKwkJLy8gZ2V0IG5ldyB0ZW1wIGRpcmVjdG9yeSBmb3IgdGVzdGNhc2UKKwkJU3RyaW5nIHJvb3QgPSBnZXRUZW1wRGlyZWN0b3J5TmFtZSgpOworCQlzZXR1cERpcmVjdG9yeShyb290KTsKKwkJdGVtcERpciA9IHJvb3Q7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgeworCQkvLyBjbGVhbnVwIHRlc3RjYXNlIHRlbXAgZGlyZWN0b3J5CisJCWlmICh0ZW1wRGlyICE9IG51bGwpCisJCQljbGVhbnVwRGlyZWN0b3J5KHRlbXBEaXIpOworCX0KKwkKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFRlbXBEaXJlY3RvcnlOYW1lKCkgeworCQlTdHJpbmcgdG1wID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmlvLnRtcGRpciIpOworCQlpZiAoIXRtcC5lbmRzV2l0aChGaWxlLnNlcGFyYXRvcikpCisJCQl0bXAgKz0gRmlsZS5zZXBhcmF0b3I7CisJCXJldHVybiB0bXArImVjbGlwc2UiK0ZpbGUuc2VwYXJhdG9yKyhuZXcgRGF0ZSgpLmdldFRpbWUoKStGaWxlLnNlcGFyYXRvcik7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHNldHVwRGlyZWN0b3J5KFN0cmluZyBuYW1lKSB7CisJCUZpbGUgZGlyID0gbmV3IEZpbGUobmFtZSk7CisJCWRpci5ta2RpcnMoKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgY2xlYW51cERpcmVjdG9yeShTdHJpbmcgbmFtZSkgeworCQlGaWxlIGRpciA9IG5ldyBGaWxlKG5hbWUpOworCQlkZWxldGVEaXJlY3RvcnkoZGlyKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIGRlbGV0ZURpcmVjdG9yeShGaWxlIGRpcikgeworCQlGaWxlW10gbGlzdCA9IGRpci5saXN0RmlsZXMoKTsKKwkJaWYgKGxpc3QgPT0gbnVsbCkKKwkJCXJldHVybjsKKwkJCQorCQlmb3IgKGludCBpPTA7IGk8bGlzdC5sZW5ndGg7IGkrKykgeworCQkJaWYgKGxpc3RbaV0uaXNEaXJlY3RvcnkoKSkgCisJCQkJZGVsZXRlRGlyZWN0b3J5KGxpc3RbaV0pOworCQkJaWYgKCFsaXN0W2ldLmRlbGV0ZSgpKQorCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVW5hYmxlIHRvIGRlbGV0ZSAiK2xpc3RbaV0udG9TdHJpbmcoKSk7CisJCX0KKwl9Cit9CisKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2NvcmUvYm9vdC9UZXN0UGxhdENmZ0FQSS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvY29yZS9ib290L1Rlc3RQbGF0Q2ZnQVBJLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUzY2E3YwotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2NvcmUvYm9vdC9UZXN0UGxhdENmZ0FQSS5qYXZhCkBAIC0wLDAgKzEsMjA3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUuYm9vdDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IuSVBsYXRmb3JtQ29uZmlndXJhdGlvbi4qOworCitwdWJsaWMgY2xhc3MgVGVzdFBsYXRDZmdBUEkgZXh0ZW5kcyBQbGF0Zm9ybUNvbmZpZ3VyYXRpb25UZXN0Q2FzZSB7CisJCQkKKwlwdWJsaWMgVGVzdFBsYXRDZmdBUEkoU3RyaW5nIGFyZzApIHsKKwkJc3VwZXIoYXJnMCk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RCYXNpYygpIHRocm93cyBFeGNlcHRpb24geworCQkKKwkJLy8gZ2V0IG5ldyBjb25maWcgb2JqZWN0CisJCUlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24gY2ZpZyA9IG51bGw7CisJCXRyeSB7CisJCQljZmlnID0gQ29uZmlndXJhdG9yVXRpbHMuZ2V0UGxhdGZvcm1Db25maWd1cmF0aW9uKG51bGwpOworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQlBc3NlcnQuZmFpbCgiMC4wLjAgIitlLnRvU3RyaW5nKCkpOworCQl9CisJCUlTaXRlRW50cnlbXSBkZmx0ID0gY2ZpZy5nZXRDb25maWd1cmVkU2l0ZXMoKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscygiMC4wLjEiLGRmbHQubGVuZ3RoLDApOworCQkKKwkJLy8gcG9saWN5IHRlc3RzCisJCUlTaXRlUG9saWN5IHAxID0gY2ZpZy5jcmVhdGVTaXRlUG9saWN5KElTaXRlUG9saWN5LlVTRVJfSU5DTFVERSwgbnVsbCk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIjEuMC4wIixwMS5nZXRUeXBlKCksSVNpdGVQb2xpY3kuVVNFUl9JTkNMVURFKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscygiMS4wLjEiLHAxLmdldExpc3QoKS5sZW5ndGgsMCk7CisJCXAxLnNldExpc3QobmV3IFN0cmluZ1tdIHsiZmlyc3QifSk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIjEuMC4yIixwMS5nZXRMaXN0KCkubGVuZ3RoLDEpOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCIxLjAuMyIscDEuZ2V0TGlzdCgpWzBdLCJmaXJzdCIpOworCQkKKwkJSVNpdGVQb2xpY3kgcDIgPSBjZmlnLmNyZWF0ZVNpdGVQb2xpY3koSVNpdGVQb2xpY3kuVVNFUl9FWENMVURFLCBuZXcgU3RyaW5nWzBdKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscygiMS4xLjAiLHAyLmdldFR5cGUoKSxJU2l0ZVBvbGljeS5VU0VSX0VYQ0xVREUpOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCIxLjEuMSIscDIuZ2V0TGlzdCgpLmxlbmd0aCwwKTsKKwkJcDIuc2V0TGlzdChuZXcgU3RyaW5nW10geyJmaXJzdCIsICJzZWNvbmQifSk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIjEuMS4yIixwMi5nZXRMaXN0KCkubGVuZ3RoLDIpOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCIxLjEuMyIscDIuZ2V0TGlzdCgpWzFdLCJzZWNvbmQiKTsKKwkJCisJCS8vIGNyZWF0ZSBzb21lIHVybHMKKwkJVVJMIHUxID0gbnVsbDsKKworCQlVUkwgdTQgPSBudWxsOworCQl0cnkgeworCQkJdTEgPSBuZXcgVVJMKCJmaWxlOi9kOi90ZW1wX3Rlc3RfZHVtbXkiKTsKKwkJCW5ldyBVUkwoImh0dHA6Ly9zb21lLnNlcnZlci90ZW1wLyIpOworCQkJdTQgPSBuZXcgVVJMKCJodHRwOi8vYmFkLnVybCIpOworCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworCQkJQXNzZXJ0LmZhaWwoIjIuMC4wIHVuYWJsZSB0byBjcmVhdGUgVVJMICIrZSk7CisJCX0KKwkJCQkKKwkJLy8gc2l0ZSBjcmVhdGlvbiB0ZXN0cworCQlJU2l0ZUVudHJ5IHMxID0gY2ZpZy5jcmVhdGVTaXRlRW50cnkodTEscDIpOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCIzLjAuMCIsczEuZ2V0VVJMKCksdTEpOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCIzLjAuMSIsczEuZ2V0U2l0ZVBvbGljeSgpLHAyKTsKKwkJczEuc2V0U2l0ZVBvbGljeShwMSk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIjMuMC4yIixzMS5nZXRTaXRlUG9saWN5KCkscDEpOworCQkKKy8vCQlJU2l0ZUVudHJ5IHMyID0gY2ZpZy5jcmVhdGVTaXRlRW50cnkodTIscDEpOworLy8JCUFzc2VydC5hc3NlcnRFcXVhbHMoIjMuMS4wIixzMi5nZXRVUkwoKSx1Mik7CisvLwkJQXNzZXJ0LmFzc2VydEVxdWFscygiMy4xLjEiLHMyLmdldFNpdGVQb2xpY3koKSxwMSk7CisvLwkJczIuc2V0U2l0ZVBvbGljeShwMik7CisvLwkJQXNzZXJ0LmFzc2VydEVxdWFscygiMy4xLjIiLHMyLmdldFNpdGVQb2xpY3koKSxwMik7CisJCQorCQkvLyBjb25maWd1cmUgc2l0ZSB0ZXN0cworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCIzLjMuMCIsY2ZpZy5nZXRDb25maWd1cmVkU2l0ZXMoKS5sZW5ndGgsMCk7CisJCWNmaWcuY29uZmlndXJlU2l0ZShzMSk7CisJCUFzc2VydC5hc3NlcnRFcXVhbHMoIjMuMy4xIixjZmlnLmdldENvbmZpZ3VyZWRTaXRlcygpLmxlbmd0aCwxKTsKKy8vCQljZmlnLmNvbmZpZ3VyZVNpdGUoczIpOworLy8JCUFzc2VydC5hc3NlcnRFcXVhbHMoIjMuMy4yIixjZmlnLmdldENvbmZpZ3VyZWRTaXRlcygpLmxlbmd0aCwyKTsKKy8vCQkKKwkJLy8gbG9va3VwIHNpdGUgdGVzdHMKKwkJQXNzZXJ0LmFzc2VydEVxdWFscygiMy40LjAiLGNmaWcuZmluZENvbmZpZ3VyZWRTaXRlKHUxKSxzMSk7CisvLwkJQXNzZXJ0LmFzc2VydEVxdWFscygiMy40LjEiLGNmaWcuZmluZENvbmZpZ3VyZWRTaXRlKHUyKSxzMik7CisJCUFzc2VydC5hc3NlcnROdWxsKCIzLjQuMyIsY2ZpZy5maW5kQ29uZmlndXJlZFNpdGUodTQpKTsKKwkJCisJCS8vIHVuY29uZmlndXJlIHNpdGUgdGVzdHMKKwkJY2ZpZy51bmNvbmZpZ3VyZVNpdGUoczEpOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCIzLjUuMCIsY2ZpZy5nZXRDb25maWd1cmVkU2l0ZXMoKS5sZW5ndGgsMCk7CisJCUFzc2VydC5hc3NlcnROdWxsKCIzLjUuMSIsY2ZpZy5maW5kQ29uZmlndXJlZFNpdGUodTEpKTsJCQorLy8JCWNmaWcudW5jb25maWd1cmVTaXRlKHMyKTsKKy8vCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCIzLjUuMiIsY2ZpZy5nZXRDb25maWd1cmVkU2l0ZXMoKS5sZW5ndGgsMCk7CisvLwkJQXNzZXJ0LmFzc2VydE51bGwoIjMuNS4zIixjZmlnLmZpbmRDb25maWd1cmVkU2l0ZSh1MikpOwkKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFNhdmVSZXN0b3JlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCQkJCisJCUFzc2VydC5hc3NlcnROb3ROdWxsKCIwLjAgVW5hYmxlIHRvIG9idGFpbiB0ZW1wIGRpcmVjdG9yeSIsdGVtcERpcik7CisJCQorCQkvLyBnZXQgbmV3IGNvbmZpZyBvYmplY3QKKwkJSVBsYXRmb3JtQ29uZmlndXJhdGlvbiBjZmlnID0gbnVsbDsKKwkJdHJ5IHsKKwkJCWNmaWcgPSBDb25maWd1cmF0b3JVdGlscy5nZXRQbGF0Zm9ybUNvbmZpZ3VyYXRpb24obnVsbCk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCUFzc2VydC5mYWlsKCIwLjAuMCAiK2UudG9TdHJpbmcoKSk7CisJCX0KKwkJSVNpdGVFbnRyeVtdIHNpdGVzID0gY2ZpZy5nZXRDb25maWd1cmVkU2l0ZXMoKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscygiMC4wLjEiLHNpdGVzLmxlbmd0aCwwKTsKKwkJCQkKKwkJLy8gY3JlYXRlIHBvbGljaWVzCisJCUlTaXRlUG9saWN5IHAxID0gY2ZpZy5jcmVhdGVTaXRlUG9saWN5KElTaXRlUG9saWN5LlVTRVJfSU5DTFVERSwgbnVsbCk7CisJCUlTaXRlUG9saWN5IHAyID0gY2ZpZy5jcmVhdGVTaXRlUG9saWN5KElTaXRlUG9saWN5LlVTRVJfRVhDTFVERSwgbmV3IFN0cmluZ1swXSk7CQkKKwkJSVNpdGVQb2xpY3kgcDMgPSBjZmlnLmNyZWF0ZVNpdGVQb2xpY3koSVNpdGVQb2xpY3kuVVNFUl9JTkNMVURFLCBuZXcgU3RyaW5nW10geyJmaXJzdCJ9KTsKKwkJSVNpdGVQb2xpY3kgcDQgPSBjZmlnLmNyZWF0ZVNpdGVQb2xpY3koSVNpdGVQb2xpY3kuVVNFUl9FWENMVURFLCBuZXcgU3RyaW5nW10geyJmaXJzdCIsICJzZWNvbmQifSk7CisJCQkJCQkKKwkJLy8gY3JlYXRlIHNvbWUgdXJscworCQlVUkwgdTEgPSBudWxsOworCQlVUkwgdTIgPSBudWxsOworCQlVUkwgdTMgPSBudWxsOworCQlVUkwgdTQgPSBudWxsOworCisJCXRyeSB7CisJCQl1MSA9IG5ldyBVUkwoImZpbGU6ZDovdGVtcC8iKTsKKwkJCXUyID0gbmV3IFVSTCgiZmlsZTovbG9jYWxob3N0L3RlbXAvIik7CisJCQl1MyA9IG5ldyBVUkwoImh0dHA6Ly9zb21lLnNlcnZlci90ZW1wLyIpOworCQkJdTQgPSBuZXcgVVJMKCJodHRwOi8vYW5vdGhlci5zZXJ2ZXIvdGVtcC8iKTsKKwkJCW5ldyBVUkwoImh0dHA6Ly9vbmUubW9yZS5zZXJ2ZXIvdGVtcC8iKTsKKwkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKwkJCUFzc2VydC5mYWlsKCIxLjAgdW5hYmxlIHRvIGNyZWF0ZSBVUkwgIitlKTsKKwkJfQorCQkKKwkJLy8gY3JlYXRlIGFuZCBjb25maWd1cmUgc2l0ZXMKKwkJSVNpdGVFbnRyeSBzMSA9IGNmaWcuY3JlYXRlU2l0ZUVudHJ5KHUxLHAxKTsKKwkJY2ZpZy5jb25maWd1cmVTaXRlKHMxKTsKKwkJSVNpdGVFbnRyeSBzMiA9IGNmaWcuY3JlYXRlU2l0ZUVudHJ5KHUyLHAyKTsKKwkJY2ZpZy5jb25maWd1cmVTaXRlKHMyKTsKKwkJSVNpdGVFbnRyeSBzMyA9IGNmaWcuY3JlYXRlU2l0ZUVudHJ5KHUzLHAzKTsKKwkJY2ZpZy5jb25maWd1cmVTaXRlKHMzKTsKKwkJSVNpdGVFbnRyeSBzNCA9IGNmaWcuY3JlYXRlU2l0ZUVudHJ5KHU0LHA0KTsKKwkJY2ZpZy5jb25maWd1cmVTaXRlKHM0KTsKKwkJc2l0ZXMgPSBjZmlnLmdldENvbmZpZ3VyZWRTaXRlcygpOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCIxLjEiLHNpdGVzLmxlbmd0aCw0KTsKKwkJCisJCS8vIGRvIHNhdmUKKwkJdHJ5IHsKKwkJCWNmaWcuc2F2ZSgpOworCQkJQXNzZXJ0LmZhaWwoIjIuMCB3YXMgZXhwZWN0aW5nIElPRXhjZXB0aW9uIik7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJfQorCQkKKwkJVVJMIGNmaWdVUkwgPSBudWxsOworCQl0cnkgeworCQkJY2ZpZ1VSTCA9IG5ldyBVUkwoImZpbGU6Iit0ZW1wRGlyKyAicGxhdGZvcm0ueG1sIik7CisJCX0gY2F0Y2goTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKwkJCUFzc2VydC5mYWlsKCIyLjEgdW5hYmxlIHRvIGNyZWF0ZSBVUkwgIitlKTsKKwkJfQorCQkKKwkJdHJ5IHsKKwkJCWNmaWcuc2F2ZShjZmlnVVJMKTsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJQXNzZXJ0LmZhaWwoIjIuMiAiK2UpOworCQl9CisJCQorCQkvLyByZWxvYWQgY29uZmlndXJhdGlvbgkKKwkJdHJ5IHsKKwkJCUNvbmZpZ3VyYXRvclV0aWxzLmdldFBsYXRmb3JtQ29uZmlndXJhdGlvbihjZmlnVVJMKTsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJQXNzZXJ0LmZhaWwoIjIuMyAiK2UudG9TdHJpbmcoKSk7CisJCX0KKwkJSVNpdGVFbnRyeVtdIG5ld1NpdGVzID0gY2ZpZy5nZXRDb25maWd1cmVkU2l0ZXMoKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscygiMi40IixuZXdTaXRlcy5sZW5ndGgsNCk7CisJCQorCQkvLyBjaGVjayB3aGF0IHdlJ3ZlIGdvdAorCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCIzLjAuMSIsc2l0ZXNbMF0uZ2V0VVJMKCksbmV3U2l0ZXNbMF0uZ2V0VVJMKCkpOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCIzLjAuMiIsc2l0ZXNbMF0uZ2V0U2l0ZVBvbGljeSgpLmdldFR5cGUoKSxuZXdTaXRlc1swXS5nZXRTaXRlUG9saWN5KCkuZ2V0VHlwZSgpKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscygiMy4wLjMiLHNpdGVzWzBdLmdldFNpdGVQb2xpY3koKS5nZXRMaXN0KCksbmV3U2l0ZXNbMF0uZ2V0U2l0ZVBvbGljeSgpLmdldExpc3QoKSk7CisJCQorCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCIzLjEuMSIsc2l0ZXNbMV0uZ2V0VVJMKCksbmV3U2l0ZXNbMV0uZ2V0VVJMKCkpOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCIzLjEuMiIsc2l0ZXNbMV0uZ2V0U2l0ZVBvbGljeSgpLmdldFR5cGUoKSxuZXdTaXRlc1sxXS5nZXRTaXRlUG9saWN5KCkuZ2V0VHlwZSgpKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscygiMy4xLjMiLHNpdGVzWzFdLmdldFNpdGVQb2xpY3koKS5nZXRMaXN0KCksbmV3U2l0ZXNbMV0uZ2V0U2l0ZVBvbGljeSgpLmdldExpc3QoKSk7CisJCQorCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCIzLjIuMSIsc2l0ZXNbMl0uZ2V0VVJMKCksbmV3U2l0ZXNbMl0uZ2V0VVJMKCkpOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCIzLjIuMiIsc2l0ZXNbMl0uZ2V0U2l0ZVBvbGljeSgpLmdldFR5cGUoKSxuZXdTaXRlc1syXS5nZXRTaXRlUG9saWN5KCkuZ2V0VHlwZSgpKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscygiMy4yLjMiLHNpdGVzWzJdLmdldFNpdGVQb2xpY3koKS5nZXRMaXN0KCksbmV3U2l0ZXNbMl0uZ2V0U2l0ZVBvbGljeSgpLmdldExpc3QoKSk7CisJCQorCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCIzLjMuMSIsc2l0ZXNbM10uZ2V0VVJMKCksbmV3U2l0ZXNbM10uZ2V0VVJMKCkpOworCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCIzLjMuMiIsc2l0ZXNbM10uZ2V0U2l0ZVBvbGljeSgpLmdldFR5cGUoKSxuZXdTaXRlc1szXS5nZXRTaXRlUG9saWN5KCkuZ2V0VHlwZSgpKTsKKwkJQXNzZXJ0LmFzc2VydEVxdWFscygiMy4zLjMiLHNpdGVzWzNdLmdldFNpdGVQb2xpY3koKS5nZXRMaXN0KCksbmV3U2l0ZXNbM10uZ2V0U2l0ZVBvbGljeSgpLmdldExpc3QoKSk7CisJCQorCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0Q3VycmVudENvbmZpZ3VyYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJCQkKKwkJQXNzZXJ0LmFzc2VydE5vdE51bGwoIjAuMCBVbmFibGUgdG8gb2J0YWluIHRlbXAgZGlyZWN0b3J5Iix0ZW1wRGlyKTsKKwkJCisJCS8vIGdldCBuZXcgY29uZmlnIG9iamVjdAorCQlJUGxhdGZvcm1Db25maWd1cmF0aW9uIGNmaWcgPSBudWxsOworCQljZmlnID0gQ29uZmlndXJhdG9yVXRpbHMuZ2V0Q3VycmVudFBsYXRmb3JtQ29uZmlndXJhdGlvbigpOworCQljZmlnLmdldFBsdWdpblBhdGgoKTsKKwkJY2ZpZy5zYXZlKCk7CisJfQorfQorCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9jb3JlL2Jvb3QvVGVzdFBsYXRDZmdEZWZhdWx0LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9jb3JlL2Jvb3QvVGVzdFBsYXRDZmdEZWZhdWx0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM1ZDAzMQotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2NvcmUvYm9vdC9UZXN0UGxhdENmZ0RlZmF1bHQuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUuYm9vdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IuKjsKKworCitwdWJsaWMgY2xhc3MgVGVzdFBsYXRDZmdEZWZhdWx0CisJZXh0ZW5kcyBQbGF0Zm9ybUNvbmZpZ3VyYXRpb25UZXN0Q2FzZSB7CisJCQorCXB1YmxpYyBUZXN0UGxhdENmZ0RlZmF1bHQoU3RyaW5nIGFyZzApIHsKKwkJc3VwZXIoYXJnMCk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RJbml0aWFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24gY2ZpZyA9IG51bGw7CisJCWNmaWcgPSBDb25maWd1cmF0b3JVdGlscy5nZXRDdXJyZW50UGxhdGZvcm1Db25maWd1cmF0aW9uKCk7CisJCUlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24uSVNpdGVFbnRyeSBzZSA9IGNmaWcuZ2V0Q29uZmlndXJlZFNpdGVzKClbMF07CisJCUlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24uSVNpdGVQb2xpY3kgc3AgPSBjZmlnLmNyZWF0ZVNpdGVQb2xpY3koSVBsYXRmb3JtQ29uZmlndXJhdGlvbi5JU2l0ZVBvbGljeS5VU0VSX0VYQ0xVREUsIG5ldyBTdHJpbmdbXSB7IjEiLCAiMiIsIjMiLCI0IiwiNSIsIjYiLCI3IiwiOCIsIjkiLCIxMCIsIjExIiwiMTIifSk7CisJCXNlLnNldFNpdGVQb2xpY3koc3ApOworCQljZmlnLnNhdmUoKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKCJkb25lIC4uLiIpOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvaW1wbGVtZW50YXRpb24vU2l0ZUZUUC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvaW1wbGVtZW50YXRpb24vU2l0ZUZUUC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3ZGIwYTkKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9pbXBsZW1lbnRhdGlvbi9TaXRlRlRQLmphdmEKQEAgLTAsMCArMSwyNzIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuaW1wbGVtZW50YXRpb247CisKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEubmV0LlVSTDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JUGx1Z2luRW50cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVVSTEVudHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLkluc3RhbGxBYm9ydGVkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7CisKK3B1YmxpYyBjbGFzcyBTaXRlRlRQIGltcGxlbWVudHMgSVNpdGUgeworCisJcHJpdmF0ZSBVUkwgdXJsOworCXB1YmxpYyBTaXRlRlRQKFVSTCB1cmwpeworCQl0aGlzLnVybCA9IHVybDsKKwl9CisKKwkvKgorCSAqIEBzZWUgSVNpdGUjZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKQorCSAqLworCXB1YmxpYyBJU2l0ZUZlYXR1cmVSZWZlcmVuY2VbXSBnZXRGZWF0dXJlUmVmZXJlbmNlcygpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoKKwkgKiBAc2VlIElTaXRlI2luc3RhbGwoSUZlYXR1cmUsIEZlYXR1cmVWZXJpZmljYXRpb24gdmVyaWZpZXIsSVByb2dyZXNzTW9uaXRvcikKKwkgKi8KKwlwdWJsaWMgSUZlYXR1cmVSZWZlcmVuY2UgaW5zdGFsbChJRmVhdHVyZSBmZWF0dXJlLElWZXJpZmljYXRpb25MaXN0ZW5lciB2ZXJpZmljYXRpb25MaXN0ZW5lciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qCisJICogQHNlZSBJU2l0ZSNyZW1vdmUoSUZlYXR1cmUsIElQcm9ncmVzc01vbml0b3IpCisJICovCisJcHVibGljIHZvaWQgcmVtb3ZlKElGZWF0dXJlIGZlYXR1cmUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCX0KKworCS8qCisJICogQHNlZSBJU2l0ZSNhZGRTaXRlQ2hhbmdlZExpc3RlbmVyKElDb25maWd1cmVkU2l0ZUNoYW5nZWRMaXN0ZW5lcikKKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRTaXRlQ2hhbmdlZExpc3RlbmVyKElDb25maWd1cmVkU2l0ZUNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgeworCX0KKworCS8qCisJICogQHNlZSBJU2l0ZSNyZW1vdmVTaXRlQ2hhbmdlZExpc3RlbmVyKElDb25maWd1cmVkU2l0ZUNoYW5nZWRMaXN0ZW5lcikKKwkgKi8KKwlwdWJsaWMgdm9pZCByZW1vdmVTaXRlQ2hhbmdlZExpc3RlbmVyKElDb25maWd1cmVkU2l0ZUNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgeworCX0KKworCS8qCisJICogQHNlZSBJU2l0ZSNnZXRVUkwoKQorCSAqLworCXB1YmxpYyBVUkwgZ2V0VVJMKCkgeworCQlyZXR1cm4gdXJsOworCX0KKworCS8qCisJICogQHNlZSBJU2l0ZSNnZXRUeXBlKCkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7CisJCXJldHVybiAib3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmZ0cCI7CisJfQorCisJLyoKKwkgKiBAc2VlIElTaXRlI2dldENhdGVnb3JpZXMoKQorCSAqLworCXB1YmxpYyBJQ2F0ZWdvcnlbXSBnZXRDYXRlZ29yaWVzKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKgorCSAqIEBzZWUgSVNpdGUjZ2V0QXJjaGl2ZXMoKQorCSAqLworCXB1YmxpYyBJQXJjaGl2ZVJlZmVyZW5jZVtdIGdldEFyY2hpdmVzKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisgCisJLyoKKwkgKiBAc2VlIElTaXRlI2FkZENhdGVnb3J5KElDYXRlZ29yeSkKKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRDYXRlZ29yeShJQ2F0ZWdvcnkgY2F0ZWdvcnkpIHsKKwl9CisKKwkvKgorCSAqIEBzZWUgSVNpdGUjc2F2ZSgpCisJICovCisJcHVibGljIHZvaWQgc2F2ZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwl9CisKKwkvKgorCSAqIEBzZWUgSVBsdWdpbkNvbnRhaW5lciNnZXRQbHVnaW5FbnRyaWVzKCkKKwkgKi8KKwlwdWJsaWMgSVBsdWdpbkVudHJ5W10gZ2V0UGx1Z2luRW50cmllcygpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoKKwkgKiBAc2VlIElQbHVnaW5Db250YWluZXIjZ2V0UGx1Z2luRW50cnlDb3VudCgpCisJICovCisJcHVibGljIGludCBnZXRQbHVnaW5FbnRyeUNvdW50KCkgeworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIEBzZWUgSVNpdGUjZ2V0RG93bmxvYWRTaXplRm9yKElGZWF0dXJlKQorCSAqLworCXB1YmxpYyBsb25nIGdldERvd25sb2FkU2l6ZUZvcihJRmVhdHVyZSBmZWF0dXJlKSB7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogQHNlZSBJU2l0ZSNnZXRJbnN0YWxsU2l6ZUZvcihJRmVhdHVyZSkKKwkgKi8KKwlwdWJsaWMgbG9uZyBnZXRJbnN0YWxsU2l6ZUZvcihJRmVhdHVyZSBmZWF0dXJlKSB7CisJCXJldHVybiAwOworCX0KKworCisJLyoKKwkgKiBAc2VlIElQbHVnaW5Db250YWluZXIjc3RvcmUoSVBsdWdpbkVudHJ5LCBTdHJpbmcsIElucHV0U3RyZWFtKQorCSAqLworCXB1YmxpYyB2b2lkIHN0b3JlKElQbHVnaW5FbnRyeSBlbnRyeSwgU3RyaW5nIG5hbWUsIElucHV0U3RyZWFtIGluU3RyZWFtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJfQorCisJLyoKKwkgKiBAc2VlIElBZGFwdGFibGUjZ2V0QWRhcHRlcihDbGFzcykKKwkgKi8KKwlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKgorCSAqIEBzZWUgSVBsdWdpbkNvbnRhaW5lciNyZW1vdmUoSVBsdWdpbkVudHJ5KQorCSAqLworCXB1YmxpYyB2b2lkIHJlbW92ZShJUGx1Z2luRW50cnkgZW50cnkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwl9CisKKwkvKgorCSAqIEBzZWUgSVNpdGUjc2V0U2l0ZUNvbnRlbnRDb25zdW1lcihJU2l0ZUNvbnRlbnRDb25zdW1lcikKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTaXRlQ29udGVudENvbnN1bWVyKElTaXRlQ29udGVudENvbnN1bWVyIGNvbnRlbnRDb25zdW1lcikgeworCX0KKworCS8qCisJICogQHNlZSBJU2l0ZSNzZXRTaXRlQ29udGVudFByb3ZpZGVyKElTaXRlQ29udGVudFByb3ZpZGVyKQorCSAqLworCXB1YmxpYyB2b2lkIHNldFNpdGVDb250ZW50UHJvdmlkZXIoSVNpdGVDb250ZW50UHJvdmlkZXIgc2l0ZUNvbnRlbnRQcm92aWRlcikgeworCX0KKworCS8qCisJICogQHNlZSBJU2l0ZSNnZXRTaXRlQ29udGVudFByb3ZpZGVyKCkKKwkgKi8KKwlwdWJsaWMgSVNpdGVDb250ZW50UHJvdmlkZXIgZ2V0U2l0ZUNvbnRlbnRQcm92aWRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoKKwkgKiBAc2VlIElTaXRlI2dldERlZmF1bHRQYWNrYWdlZEZlYXR1cmVUeXBlKCkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRQYWNrYWdlZEZlYXR1cmVUeXBlKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKgorCSAqIEBzZWUgSVNpdGUjc3RvcmUoSUZlYXR1cmUsIFN0cmluZywgSW5wdXRTdHJlYW0sIElQcm9ncmVzc01vbml0b3IpCisJICovCisJcHVibGljIHZvaWQgc3RvcmUoSUZlYXR1cmUgZmVhdHVyZSwgU3RyaW5nIG5hbWUsIElucHV0U3RyZWFtIGluU3RyZWFtLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwl9CisKKworCS8qCisJICogQHNlZSBJUGx1Z2luQ29udGFpbmVyI3JlbW92ZShJUGx1Z2luRW50cnksIElQcm9ncmVzc01vbml0b3IpCisJICovCisJcHVibGljIHZvaWQgcmVtb3ZlKElQbHVnaW5FbnRyeSBlbnRyeSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJfQorCisJLyoKKwkgKiBAc2VlIElTaXRlI2dldENhdGVnb3J5KFN0cmluZykKKwkgKi8KKwlwdWJsaWMgSUNhdGVnb3J5IGdldENhdGVnb3J5KFN0cmluZyBrZXkpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoKKwkgKiBAc2VlIElTaXRlI2NyZWF0ZVNpdGVDb250ZW50Q29uc3VtZXIoSUZlYXR1cmUpCisJICovCisJcHVibGljIElTaXRlQ29udGVudENvbnN1bWVyIGNyZWF0ZVNpdGVDb250ZW50Q29uc3VtZXIoSUZlYXR1cmUgZmVhdHVyZSkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKgorCSAqIEBzZWUgSVNpdGUjZ2V0RmVhdHVyZVJlZmVyZW5jZShJRmVhdHVyZSkKKwkgKi8KKwlwdWJsaWMgSVNpdGVGZWF0dXJlUmVmZXJlbmNlIGdldEZlYXR1cmVSZWZlcmVuY2UoSUZlYXR1cmUgZmVhdHVyZSkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKgorCSAqIEBzZWUgSVNpdGUjZ2V0RGVzY3JpcHRpb24oKQorCSAqLworCXB1YmxpYyBJVVJMRW50cnkgZ2V0RGVzY3JpcHRpb24oKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qCisJICogQHNlZSBJU2l0ZSNnZXRQbHVnaW5FbnRyaWVzT25seVJlZmVyZW5jZWRCeShJRmVhdHVyZSkKKwkgKi8KKwlwdWJsaWMgSVBsdWdpbkVudHJ5W10gZ2V0UGx1Z2luRW50cmllc09ubHlSZWZlcmVuY2VkQnkoSUZlYXR1cmUgZmVhdHVyZSkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElTaXRlI2FkZFBsdWdpbkVudHJ5KElQbHVnaW5FbnRyeSkKKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRQbHVnaW5FbnRyeShJUGx1Z2luRW50cnkgcGx1Z2luRW50cnkpIHsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklTaXRlI2luc3RhbGwoSUZlYXR1cmUsIElGZWF0dXJlUmVmZXJlbmNlW10sIElWZXJpZmljYXRpb25MaXN0ZW5lciwgSVByb2dyZXNzTW9uaXRvcikKKwkgKi8KKwlwdWJsaWMgSUZlYXR1cmVSZWZlcmVuY2UgaW5zdGFsbChJRmVhdHVyZSBmZWF0dXJlLCBJRmVhdHVyZVJlZmVyZW5jZVtdIG9wdGlvbmFsZmVhdHVyZXMsIElWZXJpZmljYXRpb25MaXN0ZW5lciB2ZXJpZmljYXRpb25MaXN0ZW5lciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW5zdGFsbEFib3J0ZWRFeGNlcHRpb24sIENvcmVFeGNlcHRpb24geworCQlyZXR1cm4gbnVsbDsKKwl9CisKKworCXB1YmxpYyBJQ29uZmlndXJlZFNpdGUgZ2V0Q3VycmVudENvbmZpZ3VyZWRTaXRlKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgSUZlYXR1cmUgY3JlYXRlRmVhdHVyZShTdHJpbmcgdHlwZSwgVVJMIHVybCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklTaXRlI2NyZWF0ZUZlYXR1cmUoamF2YS5sYW5nLlN0cmluZywgamF2YS5uZXQuVVJMLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKKwkgKi8KKwlwdWJsaWMgSUZlYXR1cmUgY3JlYXRlRmVhdHVyZShTdHJpbmcgdHlwZSwgVVJMIHVybCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCXJldHVybiBudWxsOworCX0KKworCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JU2l0ZSNnZXRSYXdGZWF0dXJlUmVmZXJlbmNlcygpCisJICovCisJcHVibGljIElTaXRlRmVhdHVyZVJlZmVyZW5jZVtdIGdldFJhd0ZlYXR1cmVSZWZlcmVuY2VzKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklTaXRlI2dldE1pcnJvclNpdGVFbnRyaWVzKCkKKwkgKi8KKwlwdWJsaWMgSVVSTEVudHJ5W10gZ2V0TWlycm9yU2l0ZUVudHJpZXMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCXJldHVybiBudWxsOworCX0KK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2ltcGxlbWVudGF0aW9uL1NpdGVGVFBGYWN0b3J5LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9pbXBsZW1lbnRhdGlvbi9TaXRlRlRQRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3MzRhMjQKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9pbXBsZW1lbnRhdGlvbi9TaXRlRlRQRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNjQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuaW1wbGVtZW50YXRpb247CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuVVJMRW5jb2RlcjsKKworcHVibGljIGNsYXNzIFNpdGVGVFBGYWN0b3J5IGV4dGVuZHMgU2l0ZU1vZGVsRmFjdG9yeSBpbXBsZW1lbnRzIElTaXRlRmFjdG9yeSB7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFID0gImEvYi9jLyI7CisKKwkvKgorCSAqIEBzZWUgSVNpdGVGYWN0b3J5I2NyZWF0ZVNpdGUoVVJMLCBib29sZWFuKQorCSAqLworCXB1YmxpYyBJU2l0ZSBjcmVhdGVTaXRlKFVSTCB1cmwpCisJCXRocm93cyBDb3JlRXhjZXB0aW9uLCBJbnZhbGlkU2l0ZVR5cGVFeGNlcHRpb24geworCQlJU2l0ZSBzaXRlID0gbnVsbDsKKwkJSW5wdXRTdHJlYW0gc2l0ZVN0cmVhbSA9IG51bGw7CisKKwkJdHJ5IHsKKwkJCVVSTCByZXNvbHZlZFVSTCA9IFVSTEVuY29kZXIuZW5jb2RlKHVybCk7CisJCQlzaXRlU3RyZWFtID0gcmVzb2x2ZWRVUkwub3BlblN0cmVhbSgpOworCisJCQlTaXRlTW9kZWxGYWN0b3J5IGZhY3RvcnkgPSB0aGlzOworCQkJZmFjdG9yeS5wYXJzZVNpdGUoc2l0ZVN0cmVhbSk7CisKKwkJCXNpdGUgPSBuZXcgU2l0ZUZUUChuZXcgVVJMKCJodHRwOi8vZWNsaXBzZS5vcmcvIiArIEZJTEUpKTsKKwkJCQorCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oIlVuYWJsZSB0byBjcmVhdGUgVVJMIiwgZSk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKCJVbmFibGUgdG8gYWNjZXNzIFVSTCIsSVNpdGUuU0lURV9BQ0NFU1NfRVhDRVBUSU9OLCBlKTsKKwkJfSBmaW5hbGx5IHsKKwkJCXRyeSB7CisJCQkJaWYgKHNpdGVTdHJlYW0gIT0gbnVsbCkKKwkJCQkJc2l0ZVN0cmVhbS5jbG9zZSgpOworCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCX0KKwkJfQorCQlyZXR1cm4gc2l0ZTsKKwl9CisKKwkvKgorCSAqIEBzZWUgU2l0ZU1vZGVsRmFjdG9yeSNjYW5QYXJzZVNpdGVUeXBlKFN0cmluZykKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBjYW5QYXJzZVNpdGVUeXBlKFN0cmluZyB0eXBlKSB7CisJCXJldHVybiAib3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUuZnRwIi5lcXVhbHNJZ25vcmVDYXNlKHR5cGUpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbWlycm9yL0FsbE1pcnJvclRlc3RzLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9taXJyb3IvQWxsTWlycm9yVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDVhNmE3Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbWlycm9yL0FsbE1pcnJvclRlc3RzLmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLm1pcnJvcjsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlTWFuYWdlclRlc3RDYXNlOworCitwdWJsaWMgY2xhc3MgQWxsTWlycm9yVGVzdHMgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2UgeworCQorCXB1YmxpYyBBbGxNaXJyb3JUZXN0cyhTdHJpbmcgbmFtZSl7CisJCXN1cGVyKG5hbWUpOworCX0KKwkKKwlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKXsKKwkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOworCQlzdWl0ZS5zZXROYW1lKCJNaXJyb3IgVGVzdHMiKTsKKwkJCisJCS8vIHRoZSBmb2xsb3dpbmcgd2lsbCB0YWtlIGFsbCB0aGUgdGVzdCBtZXRob2RzIGluIHRoZSBjbGFzcyB0aGF0IHN0YXJ0cyB3aXRoICJ0ZXN0IgorCQkKKwkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RSZW1vdGVGZWF0dXJlVmVyc2lvbk1pcnJvci5jbGFzcykpOworCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdFJlbW90ZUVtYmVkZGVkRmVhdHVyZU1pcnJvci5jbGFzcykpOworCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdFJlbW90ZURvdWJsZUVtYmVkZGVkRmVhdHVyZU1pcnJvci5jbGFzcykpOworCQkKKwkJLy8gb3IgeW91IGNhbiBzcGVjaWZ5IHRoZSBtZXRob2QKKwkJLy9zdWl0ZS5hZGRUZXN0KG5ldyBUZXN0R2V0RmVhdHVyZSgibWV0aG9kVGhhdERvZXNOb3RTdGFydFdpdGh0ZXN0IikpOworCQlyZXR1cm4gc3VpdGU7CQorCX0KKworfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbWlycm9yL01pcnJvck1hbmFnZXJUZXN0Q2FzZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbWlycm9yL01pcnJvck1hbmFnZXJUZXN0Q2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMGViYTIKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9taXJyb3IvTWlycm9yTWFuYWdlclRlc3RDYXNlLmphdmEKQEAgLTAsMCArMSw0OTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5taXJyb3I7CisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IuQ29uZmlndXJhdG9yVXRpbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuVXBkYXRlQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlTWFuYWdlclRlc3RDYXNlOworaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7CisKKworcHVibGljIGNsYXNzIE1pcnJvck1hbmFnZXJUZXN0Q2FzZSBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZXsKKwlwdWJsaWMgc3RhdGljIGludCBleGl0VmFsdWU9LTE7CisJcHVibGljIHN0YXRpYyBTdHJpbmdCdWZmZXIgZXJyT3V0cHV0OworCQorCXB1YmxpYyBNaXJyb3JNYW5hZ2VyVGVzdENhc2UoU3RyaW5nIGFyZzApeworCQlzdXBlcihhcmcwKTsKKwl9CisJCisJLy9XYXRjaERvZyB0aHJlYWQgdG8ga2lsbCBtaXJyb3JpbmcgcHJvY2VzcyBpZiBpdCBoYW5ncyAob3IgdGFrZXMgdG9vIGxvbmcpCisJcHVibGljIHN0YXRpYyBjbGFzcyBUaW1lciBleHRlbmRzIFRocmVhZHsKKwkJcHJpdmF0ZSBQcm9jZXNzIHByb2M7CisJCQorCQlwdWJsaWMgVGltZXIoUHJvY2VzcyBwcm9jKXsKKwkJCXN1cGVyKCk7CisJCQl0aGlzLnNldERhZW1vbih0cnVlKTsKKwkJCXRoaXMucHJvYyA9IHByb2M7CisJCX0KKwkJCisJCXB1YmxpYyB2b2lkIHJ1bigpeworCQkJdHJ5IHsKKwkJCQkvLyBOb3RlOiBub3JtYWwgdGVzdCBvbiAyLjJHaHogUDQgaXMgMi45cyAKKwkJCQkvLzouIGdpdmluZyAxMDB4IGxlZXdheSB0byBjb21wbGV0ZSBwcm9jZXNzIGJlZm9yZSBraWxsaW5nIGl0CisJCQkJc2xlZXAoMzAwMDAwKTsgCisJCQkJcHJvYy5kZXN0cm95KCk7CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQl9CisJCX0KKwl9CisJCisJLy8gc3RydWN0dXJlIHRvIGhvbGQgY2F0ZWdvcnkgZGVmaW5pdGlvbiBuYW1lcyBhbmQgZGVzY3JpcHRpb25zCisJY2xhc3MgQ2F0ZWdvcnlEZWZpbml0aW9uIHsKKwkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKwkJcHJpdmF0ZSBTdHJpbmcgZGVzYzsKKwkJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworCQkJdGhpcy5uYW1lID0gbmFtZTsKKwkJfQorCQlwdWJsaWMgdm9pZCBzZXREZXNjKFN0cmluZyBkZXNjKSB7CisJCQl0aGlzLmRlc2MgPSBkZXNjOworCQl9CisJCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJCXJldHVybiBuYW1lOworCQl9CisJCXB1YmxpYyBTdHJpbmcgZ2V0RGVzYygpIHsKKwkJCXJldHVybiBkZXNjOworCQl9CisJfQorCQorCS8vIHN0cnVjdHVyZSB0byBob2xkIGZlYXR1cmUgSURzIGFuZCB0aGVpciBjYXRlZ29yeSBuYW1lcworCXB1YmxpYyBjbGFzcyBGZWF0dXJlQ2F0ZWdvcnl7CisJCXByaXZhdGUgU3RyaW5nIGZlYXR1cmVJZDsKKwkJcHJpdmF0ZSBBcnJheUxpc3QgY2F0ZWdvcnk7CisJCQorCQlwdWJsaWMgRmVhdHVyZUNhdGVnb3J5KCl7CisJCQljYXRlZ29yeSA9IG5ldyBBcnJheUxpc3QoKTsKKwkJfQorCQkKKwkJcHVibGljIHZvaWQgc2V0RmVhdHVyZUlEKFN0cmluZyBmaWQpeworCQkJZmVhdHVyZUlkID0gZmlkOworCQl9CisJCQorCQlwdWJsaWMgdm9pZCBhZGRDYXRlZ29yeShTdHJpbmcgY2F0KXsKKwkJCWNhdGVnb3J5LmFkZChjYXQpOworCQl9CisJCQorCQlwdWJsaWMgU3RyaW5nIGdldEZlYXR1cmVJRCgpeworCQkJcmV0dXJuIGZlYXR1cmVJZDsKKwkJfQorCQkKKwkJcHVibGljIFN0cmluZ1tdIGdldENhdGVnb3JpZXMoKXsKKwkJCXJldHVybiAoU3RyaW5nW10pY2F0ZWdvcnkudG9BcnJheShuZXcgU3RyaW5nW2NhdGVnb3J5LnNpemUoKV0pOworCQl9CisJfQorCQorCS8vIFN0cmVhbUNvbnN1bWVyIHRvIGRpc3BsYXkgb3V0cHV0IHRvIG91dHB1dCBmaWxlcyBvciBjb25zb2xlCisJcHVibGljIHN0YXRpYyBjbGFzcyBTdHJlYW1Db25zdW1lciBleHRlbmRzIFRocmVhZCB7CisJCXByaXZhdGUgQnVmZmVyZWRSZWFkZXIgYlJlYWRlcjsKKworCQlwdWJsaWMgU3RyZWFtQ29uc3VtZXIoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHsKKwkJCXN1cGVyKCk7CisJCQlzZXREYWVtb24odHJ1ZSk7CisJCQliUmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbnB1dFN0cmVhbSkpOworCQl9CisKKwkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJdHJ5IHsKKwkJCQlTdHJpbmcgbGluZTsKKwkJCQl3aGlsZSAobnVsbCAhPSAobGluZSA9IGJSZWFkZXIucmVhZExpbmUoKSkpIHsKKwkJCQkJU3lzdGVtLm91dC5wcmludGxuKGxpbmUpOworCQkJCQllcnJPdXRwdXQuYXBwZW5kKGxpbmUpOworCQkJCQllcnJPdXRwdXQuYXBwZW5kKCJcbiIpOworCQkJCX0KKwkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJfQorCQl9CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgYSBzdHJpbmcgYXJyYXkgY29uc2lzdGluZyBvZiBjb21tYW5kcyBhbmQgdGhlaXIgYXJndW1lbnRzIHRvCisJICogYmUgcnVuLgorCSAqIEBwYXJhbSByZW1vdGVMb2MgLSBwYXRoIG9mIHJlbW90ZSBzaXRlIChzaXRlIGJlaW5nIG1pcnJvcmVkKQorCSAqIEBwYXJhbSB0b0xvY2FsU2l0ZVVybCAtIHBhdGggb2YgbG9jYWwgc2l0ZSAobmV3IG1pcnJvciBzaXRlKQorCSAqIEBwYXJhbSBmaWQgLSBmZWF0dXJlIGlkIG9mIGZlYXR1cmluZyBiZWluZyBtaXJyb3IgKG9wdGlvbmFsIC0gY2FuIGJlIG51bGwpCisJICogQHBhcmFtIHZlciAtIHZlcnNpb24gb2YgZmVhdHVyZSB0byBiZSBtaXJyb3JlZCAob3B0aW9uYWwgLSBjYW4gYmUgbnVsbCkKKwkgKiBAcGFyYW0gbWlyVXJsIC0gZGlyZWN0b3J5IGxvY2F0aW9uIG9mIHBvbGljeS54bWwgKG9wdGlvbmFsIC0gY2FuIGJlIG51bGwpCisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBTdHJpbmdbXSBnZXRDb21tYW5kKAorCQlTdHJpbmcgcmVtb3RlTG9jLAorCQlTdHJpbmcgdG9Mb2NhbFNpdGVVcmwsCisJCVN0cmluZyBmaWQsCisJCVN0cmluZyB2ZXIsCisJCVN0cmluZyBtaXJVcmwpIHsKKwkJZmluYWwgU3RyaW5nIGNsYXNzcGF0aCA9IGdldExhdW5jaGVyKCk7CisJCWZpbmFsIFN0cmluZyBsYXVuY2hlciA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLk1haW4iOworCQlmaW5hbCBTdHJpbmcgY29tbWFuZCA9ICJtaXJyb3IiOworCQlmaW5hbCBTdHJpbmcgYXBwbGljYXRpb24gPSAib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuc3RhbmRhbG9uZVVwZGF0ZSI7CisJCWZpbmFsIFN0cmluZyBGTEFHX0NQID0gIi1jcCI7CisJCWZpbmFsIFN0cmluZyBGTEFHX0FQUCA9ICItYXBwbGljYXRpb24iOworCQlmaW5hbCBTdHJpbmcgRkxBR19DTUQgPSAiLWNvbW1hbmQiOworCQlmaW5hbCBTdHJpbmcgRkxBR19GSUQgPSAiLWZlYXR1cmVJZCI7CisJCWZpbmFsIFN0cmluZyBGTEFHX0RBVEEgPSAiLWRhdGEiOworCQlmaW5hbCBTdHJpbmcgRkxBR19WRVJTSU9OID0gIi12ZXJzaW9uIjsKKwkJZmluYWwgU3RyaW5nIEZMQUdfRlJPTSA9ICItZnJvbSI7CisJCWZpbmFsIFN0cmluZyBGTEFHX1RPID0gIi10byI7CisJCWZpbmFsIFN0cmluZyBGTEFHX1VSTCA9ICItbWlycm9yVVJMIjsKKwkJZmluYWwgU3RyaW5nIEZMQUdfU1BMQVNIID0gIi1ub3NwbGFzaCI7CisJCWZpbmFsIFN0cmluZyBGTEFHX0NPTlNPTEVMT0cgPSAiLWNvbnNvbGVsb2ciOworCQlmaW5hbCBTdHJpbmcgZGF0YSA9CisJCQlVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldFN0YXRlTG9jYXRpb24oKS50b09TU3RyaW5nKCk7CisJCVN0cmluZ1tdIGNtZCA9CisJCQluZXcgU3RyaW5nW10geworCQkJCWdldEphdmFWTVBhdGgoKSwKKwkJCQlGTEFHX0NQLAorCQkJCWNsYXNzcGF0aCwKKwkJCQlsYXVuY2hlciwKKwkJCQlGTEFHX0FQUCwKKwkJCQlhcHBsaWNhdGlvbiwKKwkJCQlGTEFHX0NNRCwKKwkJCQljb21tYW5kLAorCQkJCUZMQUdfRlJPTSwKKwkJCQkocmVtb3RlTG9jICE9bnVsbCA/IHJlbW90ZUxvYyA6ICIiKSwKKwkJCQlGTEFHX1RPLAorCQkJCXRvTG9jYWxTaXRlVXJsLAorCQkJCShmaWQgIT0gbnVsbCA/IEZMQUdfRklEIDogIiIpLAorCQkJCShmaWQgIT0gbnVsbCA/IGZpZCA6ICIiKSwKKwkJCQkodmVyICE9IG51bGwgPyBGTEFHX1ZFUlNJT04gOiAiIiksCisJCQkJKHZlciAhPSBudWxsID8gdmVyIDogIiIpLAorCQkJCShtaXJVcmwgIT0gbnVsbCA/IEZMQUdfVVJMIDogIiIpLAorCQkJCShtaXJVcmwgIT0gbnVsbCA/IG1pclVybCA6ICIiKSwKKwkJCQlGTEFHX1NQTEFTSCwKKwkJCQlGTEFHX0RBVEEsCisJCQkJZGF0YSwKKwkJCQlGTEFHX0NPTlNPTEVMT0d9OworCQlyZXR1cm4gY21kOworCX0KKwkKKwlwcml2YXRlIFN0cmluZyBnZXRMYXVuY2hlcigpIHsKKwkJQnVuZGxlIGxhdW5jaGVyID0gUGxhdGZvcm0uZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyIik7CisJCS8vIHRvZG8KKwkJaWYgKGxhdW5jaGVyID09IG51bGwpCisJCQlyZXR1cm4gIiI7CisJCVVSTCByb290RW50cnkgPSBsYXVuY2hlci5nZXRFbnRyeSgiLyIpOworCQl0cnkgeworCQkJcm9vdEVudHJ5ID0gRmlsZUxvY2F0b3IucmVzb2x2ZShyb290RW50cnkpOworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJaWYgKCJmaWxlIi5lcXVhbHMocm9vdEVudHJ5LmdldFByb3RvY29sKCkpKQorCQkJcmV0dXJuIG5ldyBGaWxlKHJvb3RFbnRyeS5nZXRQYXRoKCkpLmdldEFic29sdXRlUGF0aCgpOworCQlpZiAoImphciIuZXF1YWxzKHJvb3RFbnRyeS5nZXRQcm90b2NvbCgpKSkgeworCQkJU3RyaW5nIHBhdGggPSByb290RW50cnkuZ2V0UGF0aCgpOwkKKwkJCS8vIHN0cmlwIG9mZiB0aGUgZmlsZTogYW5kIHRoZSAhLworCQkJcGF0aCA9IHBhdGguc3Vic3RyaW5nKDUsIHBhdGgubGVuZ3RoKCkgLSAyKTsKKwkJCXJldHVybiBuZXcgRmlsZShwYXRoKS5nZXRBYnNvbHV0ZVBhdGgoKTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gY2hlY2tGZWF0dXJlSW5TaXRlWE1MRXhpc3RzKFN0cmluZyB1cmwsIFN0cmluZyBmaWQsIFN0cmluZyB2ZXIpeworCQlGaWxlIHNpdGUgPSBuZXcgRmlsZSh1cmwgKyAiL3NpdGUueG1sIik7CisJCWFzc2VydFRydWUoc2l0ZS5leGlzdHMoKSk7CisJCUJ1ZmZlcmVkUmVhZGVyIGJyZWFkZXI7CisJCUZpbGVSZWFkZXIgZnJlYWRlcjsKKwkJU3RyaW5nIHRleHQgPSBuZXcgU3RyaW5nKCk7CisJCVN0cmluZyBqYXJOYW1lID0gZmlkICsgIl8iICsgdmVyICsgIi5qYXIiOworCQlTdHJpbmcgZmVhdHVyZSA9ICI8ZmVhdHVyZSB1cmw9XCIiICsKKwkJCSJmZWF0dXJlcy8iICsgamFyTmFtZSArIAorCQkJIlwiIGlkPVwiIiArIGZpZCArIAorCQkJIlwiIHZlcnNpb249XCIiICsgdmVyKyJcIj4iOworCQl0cnkgeworCQkJZnJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKHNpdGUpOworCQkJYnJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihmcmVhZGVyKTsKKwkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKwkJCS8vIHdvdWxkIGhhdmUgYmVlbiBjYXVnaHQgYnkgYXNzZXJ0IGFib3ZlCisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJdHJ5IHsKKwkJCXdoaWxlICgodGV4dCA9IGJyZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCkgeworCQkJCXRleHQgPSB0ZXh0LnRyaW0oKTsKKwkJCQlpZiAodGV4dC5lcXVhbHMoZmVhdHVyZSkpeworCQkJCQlicmVhZGVyLmNsb3NlKCk7CisJCQkJCWZyZWFkZXIuY2xvc2UoKTsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJfQorCisJCQlicmVhZGVyLmNsb3NlKCk7CisJCQlmcmVhZGVyLmNsb3NlKCk7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9CisKKwlwdWJsaWMgdm9pZCBjaGVja1NpdGVYTUwoU3RyaW5nIHVybCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUZpbGUgbWlycm9yID0gbmV3IEZpbGUodXJsKTsKKwkJRmlsZSBzaXRlID0gbmV3IEZpbGUodXJsICsgIi9zaXRlLnhtbCIpOworCQlhc3NlcnRUcnVlKG1pcnJvci5pc0RpcmVjdG9yeSgpKTsKKwkJYXNzZXJ0VHJ1ZShtaXJyb3IuZXhpc3RzKCkpOworCQlhc3NlcnRUcnVlKHNpdGUuZXhpc3RzKCkpOworCX0KKworCXB1YmxpYyB2b2lkIGNoZWNrUG9saWN5WE1MKFN0cmluZyB1cmwpIHRocm93cyBFeGNlcHRpb24geworCQlGaWxlIG1pcnJvciA9IG5ldyBGaWxlKHVybCk7CisJCUZpbGUgc2l0ZSA9IG5ldyBGaWxlKHVybCArICIvcG9saWN5LnhtbCIpOworCQlhc3NlcnRUcnVlKG1pcnJvci5pc0RpcmVjdG9yeSgpKTsKKwkJYXNzZXJ0VHJ1ZShtaXJyb3IuZXhpc3RzKCkpOworCQlhc3NlcnRUcnVlKHNpdGUuZXhpc3RzKCkpOworCX0KKwlwdWJsaWMgYm9vbGVhbiBjaGVja1BvbGljeVVSTChTdHJpbmcgdXJsLCBTdHJpbmcgbWlycm9yVXJsKXsKKwkJRmlsZSBzaXRlID0gbmV3IEZpbGUodXJsICsgIi9wb2xpY3kueG1sIik7CisJCWFzc2VydFRydWUoc2l0ZS5leGlzdHMoKSk7CisJCUJ1ZmZlcmVkUmVhZGVyIGJyZWFkZXI7CisJCUZpbGVSZWFkZXIgZnJlYWRlcjsKKwkJU3RyaW5nIHRleHQgPSBuZXcgU3RyaW5nKCk7CisKKwkJdHJ5IHsKKwkJCWZyZWFkZXIgPSBuZXcgRmlsZVJlYWRlcihzaXRlKTsKKwkJCWJyZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoZnJlYWRlcik7CisJCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisJCQkvLyB3b3VsZCBoYXZlIGJlZW4gY2F1Z2h0IGJ5IGFzc2VydCBhYm92ZQorCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJdHJ5IHsKKwkJCXdoaWxlICgodGV4dCA9IGJyZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCkgeworCQkJCWlmICh0ZXh0LmluZGV4T2YobWlycm9yVXJsKSE9LTEpeworCQkJCQlicmVhZGVyLmNsb3NlKCk7CisJCQkJCWZyZWFkZXIuY2xvc2UoKTsJCisJCQkJCXJldHVybiB0cnVlOworCQkJCX0KKwkJCX0KKworCQkJYnJlYWRlci5jbG9zZSgpOworCQkJZnJlYWRlci5jbG9zZSgpOworCQkJcmV0dXJuIGZhbHNlOworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfQorCisJcHVibGljIGJvb2xlYW4gZG9lc0NhdGVnb3J5RGVmaW5pdGlvbkV4aXN0KFN0cmluZyB1cmwpIHsKKwkJRmlsZSBzaXRlID0gbmV3IEZpbGUodXJsICsgIi9zaXRlLnhtbCIpOworCQlhc3NlcnRUcnVlKHNpdGUuZXhpc3RzKCkpOworCQlCdWZmZXJlZFJlYWRlciBicmVhZGVyOworCQlGaWxlUmVhZGVyIGZyZWFkZXI7CisJCVN0cmluZyB0ZXh0ID0gbmV3IFN0cmluZygpOworCisJCXRyeSB7CisJCQlmcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoc2l0ZSk7CisJCQlicmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGZyZWFkZXIpOworCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworCQkJLy8gd291bGQgaGF2ZSBiZWVuIGNhdWdodCBieSBhc3NlcnQgYWJvdmUKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCXRyeSB7CisJCQl3aGlsZSAoKHRleHQgPSBicmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKKwkJCQlpZiAodGV4dC5pbmRleE9mKCJjYXRlZ29yeS1kZWYiKSE9LTEpCisJCQkJCXJldHVybiB0cnVlOworCQkJfQorCisJCQlicmVhZGVyLmNsb3NlKCk7CisJCQlmcmVhZGVyLmNsb3NlKCk7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldEVjbGlwc2VSb290KCkgeworCQlyZXR1cm4gQ29uZmlndXJhdG9yVXRpbHMuZ2V0SW5zdGFsbFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkucmVwbGFjZUZpcnN0KAorCQkJImZpbGU6IiwKKwkJCSIiKTsKKwl9CisJCisJcHVibGljIEZlYXR1cmVDYXRlZ29yeVtdIGdldEZlYXR1cmVDYXRlZ29yaWVzKFN0cmluZyB1cmwpeworCQlGaWxlIHNpdGUgPSBuZXcgRmlsZSh1cmwgKyAiL3NpdGUueG1sIik7CisJCWFzc2VydFRydWUoc2l0ZS5leGlzdHMoKSk7CisJCUJ1ZmZlcmVkUmVhZGVyIGJyZWFkZXI7CisJCUZpbGVSZWFkZXIgZnJlYWRlcjsKKwkJU3RyaW5nIHRleHQgPSBuZXcgU3RyaW5nKCk7CisJCUFycmF5TGlzdCBmZWF0dXJlQ2F0ZWdvcmllcyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJCisJCXRyeSB7CisJCQlmcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoc2l0ZSk7CisJCQlicmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGZyZWFkZXIpOworCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworCQkJLy8gd291bGQgaGF2ZSBiZWVuIGNhdWdodCBieSBhc3NlcnQgYWJvdmUKKwkJCXJldHVybiBuZXcgRmVhdHVyZUNhdGVnb3J5WzBdOworCQl9CisKKwkJdHJ5IHsKKwkJCUZlYXR1cmVDYXRlZ29yeSBjdXJyVG9rID0gbmV3IEZlYXR1cmVDYXRlZ29yeSgpOworCQkJYm9vbGVhbiBhZGQgPSBmYWxzZTsKKwkJCXdoaWxlKCh0ZXh0ID1icmVhZGVyLnJlYWRMaW5lKCkpIT1udWxsKXsKKwkJCQlTdHJpbmdUb2tlbml6ZXIgc3RyVG9rID0gbmV3IFN0cmluZ1Rva2VuaXplcih0ZXh0KTsKKwkJCQl3aGlsZSAoc3RyVG9rLmhhc01vcmVUb2tlbnMoKSl7CisJCQkJCVN0cmluZyB0ZW1wID0gc3RyVG9rLm5leHRUb2tlbigpOworCQkJCQlpZiAodGVtcC5lcXVhbHMoIjwvZmVhdHVyZT4iKSl7CisJCQkJCQlhZGQgPSB0cnVlOworCQkJCQl9IGVsc2UgaWYgKHRlbXAuc3RhcnRzV2l0aCgiaWQiKSl7CisJCQkJCQljdXJyVG9rLnNldEZlYXR1cmVJRCh0ZW1wLnNwbGl0KCJcIiIpWzFdKTsKKwkJCQkJfSBlbHNlIGlmICh0ZW1wLnN0YXJ0c1dpdGgoIm5hbWUiKSl7CisJCQkJCQljdXJyVG9rLmFkZENhdGVnb3J5KHRlbXAuc3BsaXQoIlwiIilbMV0pOworCQkJCQl9CisJCQkJfQorCQkJCWlmIChhZGQpeworCQkJCQlmZWF0dXJlQ2F0ZWdvcmllcy5hZGQoY3VyclRvayk7CisJCQkJCWN1cnJUb2sgPSBuZXcgRmVhdHVyZUNhdGVnb3J5KCk7CisJCQkJCWFkZCA9IGZhbHNlOworCQkJCX0KKwkJCX0KKworCQkJYnJlYWRlci5jbG9zZSgpOworCQkJZnJlYWRlci5jbG9zZSgpOworCQkJcmV0dXJuIChGZWF0dXJlQ2F0ZWdvcnlbXSlmZWF0dXJlQ2F0ZWdvcmllcy50b0FycmF5KG5ldyBGZWF0dXJlQ2F0ZWdvcnlbZmVhdHVyZUNhdGVnb3JpZXMuc2l6ZSgpXSk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCVN5c3RlbS5lcnIucHJpbnRsbihlKTsKKwkJCXJldHVybiBuZXcgRmVhdHVyZUNhdGVnb3J5WzBdOworCQl9CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0SmF2YVZNUGF0aCgpIHsKKwkJLy8gQ3JlYXRlIGNvbW1hbmQgc3RyaW5nIGZvciBsYXVuY2hpbmcgdGhlIHByb2Nlc3MKKwkJU3RyaW5nIHZtID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLnZtLm5hbWUiKTsKKwkJU3RyaW5nIGV4ZWN1dGFibGUgPSAiSjkiLmVxdWFscyh2bSkgPyAiajkiIDogImphdmEiOworCQlpZiAob3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLmVudmlyb25tZW50LkNvbnN0YW50cy5PU19XSU4zMi5lcXVhbHMoUGxhdGZvcm0uZ2V0T1MoKSkpCisJCQlleGVjdXRhYmxlICs9ICJ3LmV4ZSI7CisKKwkJU3RyaW5nIGphdmFJbnN0YWxsRGlyID0KKwkJCVN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5ob21lIikgKyBGaWxlLnNlcGFyYXRvciArICJiaW4iOworCQlyZXR1cm4gamF2YUluc3RhbGxEaXIgKyBGaWxlLnNlcGFyYXRvciArIGV4ZWN1dGFibGU7CisJfQorCQorCXB1YmxpYyBDYXRlZ29yeURlZmluaXRpb25bXSBnZXRDYXRlZ29yeURlZmluaXRpb25zKFN0cmluZyB1cmwpIHsKKwkJRmlsZSBzaXRlID0gbmV3IEZpbGUodXJsICsgIi9zaXRlLnhtbCIpOworCQlhc3NlcnRUcnVlKHNpdGUuZXhpc3RzKCkpOworCQlCdWZmZXJlZFJlYWRlciBicmVhZGVyOworCQlGaWxlUmVhZGVyIGZyZWFkZXI7CisJCVN0cmluZyB0ZXh0ID0gbmV3IFN0cmluZygpOworCQlBcnJheUxpc3QgY2F0RGVmID0gbmV3IEFycmF5TGlzdCgpOworCisJCXRyeSB7CisJCQlmcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoc2l0ZSk7CisJCQlicmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGZyZWFkZXIpOworCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworCQkJLy8gd291bGQgaGF2ZSBiZWVuIGNhdWdodCBieSBhc3NlcnQgYWJvdmUKKwkJCXJldHVybiBuZXcgQ2F0ZWdvcnlEZWZpbml0aW9uWzBdOworCQl9CisKKwkJdHJ5IHsKKwkJCWJvb2xlYW4gYWRkID0gZmFsc2U7CisJCQlib29sZWFuIGlzRGVzYyA9IGZhbHNlOworCQkJQ2F0ZWdvcnlEZWZpbml0aW9uIHRlbXAgPSBuZXcgQ2F0ZWdvcnlEZWZpbml0aW9uKCk7CisJCQl3aGlsZSAoKHRleHQgPSBicmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKKwkJCQlpZiAodGV4dC50cmltKCkuc3RhcnRzV2l0aCgiPGNhdGVnb3J5LWRlZiIpCisJCQkJCSYmIHRleHQuaW5kZXhPZigibmFtZSIpICE9IC0xKSB7CisJCQkJCXRlbXAuc2V0TmFtZSh0ZXh0LnNwbGl0KCJcIiIpWzFdKTsKKwkJCQkJYWRkID0gZmFsc2U7CisJCQkJfSBlbHNlIGlmICh0ZXh0LnRyaW0oKS5lcXVhbHMoIjxkZXNjcmlwdGlvbj4iKSkgeworCQkJCQlpc0Rlc2MgPSB0cnVlOworCQkJCX0gZWxzZSBpZiAodGV4dC50cmltKCkuZXF1YWxzKCI8L2Rlc2NyaXB0aW9uPiIpKSB7CisJCQkJCWlzRGVzYyA9IGZhbHNlOworCQkJCX0gZWxzZSBpZiAoaXNEZXNjKSB7CisJCQkJCXRlbXAuc2V0RGVzYyh0ZXh0LnRyaW0oKSk7CisJCQkJfSBlbHNlIGlmICh0ZXh0LnRyaW0oKS5lcXVhbHMoIjwvY2F0ZWdvcnktZGVmPiIpKSB7CisJCQkJCWFkZCA9IHRydWU7CisJCQkJfQorCQkJCWlmIChhZGQpIHsKKwkJCQkJY2F0RGVmLmFkZCh0ZW1wKTsKKwkJCQkJYWRkID0gZmFsc2U7CisJCQkJCXRlbXAgPSBuZXcgQ2F0ZWdvcnlEZWZpbml0aW9uKCk7CisJCQkJfQorCQkJfQorCisJCQlicmVhZGVyLmNsb3NlKCk7CisJCQlmcmVhZGVyLmNsb3NlKCk7CisJCQlyZXR1cm4gKENhdGVnb3J5RGVmaW5pdGlvbltdKWNhdERlZi50b0FycmF5KG5ldyBDYXRlZ29yeURlZmluaXRpb25bY2F0RGVmLnNpemUoKV0pOworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQlTeXN0ZW0uZXJyLnByaW50bG4oZSk7CisJCQlyZXR1cm4gbmV3IENhdGVnb3J5RGVmaW5pdGlvblswXTsKKwkJfQorCisJfQorCQorCXB1YmxpYyBpbnQgcGVyZm9ybU1pcnJvcihTdHJpbmdbXSBjbWRfbWlycm9yKSB7CisJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGdldEVjbGlwc2VSb290KCkpOworCQl0cnkgeworCQkJU3lzdGVtLm91dC5wcmludGxuKCJMYXVuY2hpbmc6Iik7CisJCQlmb3IoaW50IGk9MDsgaTxjbWRfbWlycm9yLmxlbmd0aDsgaSsrKXsKKwkJCQlTeXN0ZW0ub3V0LnByaW50KGNtZF9taXJyb3JbaV0rIiAiKTsKKwkJCX0KKwkJCVN5c3RlbS5vdXQucHJpbnRsbigpOworCQkJUHJvY2VzcyBwcm9jID0KKwkJCQlSdW50aW1lLmdldFJ1bnRpbWUoKS5leGVjKGNtZF9taXJyb3IsIChTdHJpbmdbXSkgbnVsbCwgZmlsZSk7CisKKwkJCVN0cmVhbUNvbnN1bWVyIG91dHB1dHMgPSBuZXcgU3RyZWFtQ29uc3VtZXIocHJvYy5nZXRJbnB1dFN0cmVhbSgpKTsKKwkJCW91dHB1dHMuc3RhcnQoKTsKKwkJCVN0cmVhbUNvbnN1bWVyIGVycm9ycyA9IG5ldyBTdHJlYW1Db25zdW1lcihwcm9jLmdldEVycm9yU3RyZWFtKCkpOworCQkJZXJyb3JzLnN0YXJ0KCk7CisJCQlUaW1lciB0aW1lciA9IG5ldyBUaW1lcihwcm9jKTsKKwkJCXRpbWVyLnN0YXJ0KCk7CisKKwkJCXJldHVybiBwcm9jLndhaXRGb3IoKTsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJU3lzdGVtLmVyci5wcmludGxuKGUpOworCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisJCQlTeXN0ZW0uZXJyLnByaW50bG4oZSk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlTeXN0ZW0uZXJyLnByaW50bG4oZSk7CisJCX0KKwkJcmV0dXJuIC0xOworCX0KKworCS8vIGVuc3VyZSBleGl0IHdpdGhvdXQgcHJvYmxlbXMKKwlwdWJsaWMgdm9pZCB0ZXN0RXhpdFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWFzc2VydEVxdWFscygwLCBleGl0VmFsdWUpOworCX0KKwkKKwkvLyBlbnN1cmUgb3V0cHV0IHN0cmluZyBidWZmZXIgZW5kcyB3aXRoICJNaXJyb3IgY29tbWFuZCBjb21wbGV0ZWQKKwkvLyBzdWNjZXNzZnVsbHkuIgorCS8vIG5vdGU6IG91dHB1dCBtYXkgaW5zdGVhZCBieSAiQ29tbWFuZCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LiIKKwlwdWJsaWMgdm9pZCB0ZXN0TWlycm9yU3VjY2VzcygpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0KKwkJCW5ldyBTdHJpbmdUb2tlbml6ZXIoCisJCQkJZXJyT3V0cHV0LnRvU3RyaW5nKCksCisJCQkJIlxuIik7CisJCVN0cmluZyBsYXN0TGluZSA9IG5ldyBTdHJpbmcoKTsKKwkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpeworCQkJbGFzdExpbmUgPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7CisJCX0KKwkJaWYgKGxhc3RMaW5lLmVxdWFscygiTWlycm9yIGNvbW1hbmQgY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4iKSkKKwkJCXJldHVybjsKKwkJYXNzZXJ0RXF1YWxzKCJPdXRwdXQgd2FzOiAiICsgZXJyT3V0cHV0LnRvU3RyaW5nKCksICJDb21tYW5kIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuIiwgbGFzdExpbmUpOworCX0KK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL21pcnJvci9UZXN0UmVtb3RlRG91YmxlRW1iZWRkZWRGZWF0dXJlTWlycm9yLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9taXJyb3IvVGVzdFJlbW90ZURvdWJsZUVtYmVkZGVkRmVhdHVyZU1pcnJvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkOGNmNzUKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9taXJyb3IvVGVzdFJlbW90ZURvdWJsZUVtYmVkZGVkRmVhdHVyZU1pcnJvci5qYXZhCkBAIC0wLDAgKzEsMjEyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMubWlycm9yOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlVGVzdHNQbHVnaW47CisKK3B1YmxpYyBjbGFzcyBUZXN0UmVtb3RlRG91YmxlRW1iZWRkZWRGZWF0dXJlTWlycm9yIGV4dGVuZHMgTWlycm9yTWFuYWdlclRlc3RDYXNlIHsKKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTWlycm9yZWQ7CisKKwlwdWJsaWMgVGVzdFJlbW90ZURvdWJsZUVtYmVkZGVkRmVhdHVyZU1pcnJvcihTdHJpbmcgYXJnMCkgeworCQlzdXBlcihhcmcwKTsKKwkJZXJyT3V0cHV0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQlpc01pcnJvcmVkID0gZmFsc2U7CisJfQorCisJcHVibGljIHZvaWQgdW1TZXRVcCgpIHsKKwkJU3RyaW5nIGZlYXR1cmVJZCA9ICJ1cGRhdGUuZmVhdHVyZTFjIjsKKwkJU3RyaW5nIHZlcnNpb24gPSAiMy4wLjAiOworCQlTdHJpbmcgdG9Mb2NhbFNpdGVVcmwgPQorCQkJVXBkYXRlVGVzdHNQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0U3RhdGVMb2NhdGlvbigpCisJCQkJKyAiL3RlbXAvdGVzdFJlbW90ZURvdWJsZUVtYmVkZGVkRmVhdHVyZU1pcnJvciI7CisJCVN0cmluZyBtaXJyb3JVUkwgPSAiaHR0cDovL3VwZGF0ZS5lY2xpcHNlLm9yZy9teS1taXJyb3ItdXJsIjsKKwkJLy8gZmlyc3QgbWlycm9yCisJCVN0cmluZyBmcm9tUmVtb3RlU2l0ZVVybCA9CisJCQkiZmlsZToiCisJCQkJKyBkYXRhUGF0aAorCQkJCSsgIm1pcnJvcnMvdXBkYXRlLXNpdGUxIjsKKwkJaWYgKCFpc01pcnJvcmVkKSB7CisJCQlleGl0VmFsdWUgPQorCQkJCXBlcmZvcm1NaXJyb3IoCisJCQkJCWdldENvbW1hbmQoZnJvbVJlbW90ZVNpdGVVcmwsdG9Mb2NhbFNpdGVVcmwsIG51bGwsIG51bGwsIG1pcnJvclVSTCkpOworCQkKKwkJLy8gZW5kIG9mIGZpcnN0IG1pcnJvcgorCQlmcm9tUmVtb3RlU2l0ZVVybCA9CisJCQkiZmlsZToiCisJCQkrIGRhdGFQYXRoCisJCQkrICJtaXJyb3JzL3VwZGF0ZS1zaXRlNSI7CisJCQlleGl0VmFsdWUgPQorCQkJCXBlcmZvcm1NaXJyb3IoCisJCQkJCWdldENvbW1hbmQoZnJvbVJlbW90ZVNpdGVVcmwsdG9Mb2NhbFNpdGVVcmwsIGZlYXR1cmVJZCwgdmVyc2lvbiwgbWlycm9yVVJMKSk7CisJCQlpc01pcnJvcmVkID0gdHJ1ZTsKKwkJfQorCX0KKworCS8vIG1ha2Ugc3VyZSBlYWNoIGZlYXR1cmUgaXMgdW5kZXIgaXRzIGNvcnJlY3QgY2F0ZWdvcnkgbmFtZXMKKwlwdWJsaWMgdm9pZCB0ZXN0RmVhdHVyZUNhdGVnb3JpZXMoKSB0aHJvd3MgRXhjZXB0aW9ueworCQlTdHJpbmcgdG9Mb2NhbFNpdGVVcmwgPQorCQkJVXBkYXRlVGVzdHNQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0U3RhdGVMb2NhdGlvbigpCisJCQkJKyAiL3RlbXAvdGVzdFJlbW90ZURvdWJsZUVtYmVkZGVkRmVhdHVyZU1pcnJvciI7CisJCUZlYXR1cmVDYXRlZ29yeVtdIG1pcnJvckZlYXR1cmVzID0gZ2V0RmVhdHVyZUNhdGVnb3JpZXModG9Mb2NhbFNpdGVVcmwpOworCQlGZWF0dXJlQ2F0ZWdvcnlbXSByZXF1aXJlZCA9IG5ldyBGZWF0dXJlQ2F0ZWdvcnlbMV07CisJCXJlcXVpcmVkWzBdID0gbmV3IEZlYXR1cmVDYXRlZ29yeSgpOworCQlyZXF1aXJlZFswXS5zZXRGZWF0dXJlSUQoInVwZGF0ZS5mZWF0dXJlMWMiKTsKKwkJcmVxdWlyZWRbMF0uYWRkQ2F0ZWdvcnkoIlNpdGU1LUNhdGVnb3J5MSIpOworCQlhc3NlcnRUcnVlKGNoZWNrRmVhdHVyZUNhdGVnb3JpZXNDb250YWluZWQocmVxdWlyZWQsIG1pcnJvckZlYXR1cmVzKSk7CisJfQorCQorCS8vIGVuc3VyZSBleGl0IHdpdGhvdXQgcHJvYmxlbXMKKwlwdWJsaWMgdm9pZCB0ZXN0RXhpdFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXN1cGVyLnRlc3RFeGl0VmFsdWUoKTsKKwl9CisJCisJLy8gZW5zdXJlIGNhdGVnb3J5IGRlZmluaXRpb25zIGV4aXN0CisJcHVibGljIHZvaWQgdGVzdENhdGVnb3J5RGVmaW5pdGlvbnNFeGlzdCgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgdG9Mb2NhbFNpdGVVcmwgPQorCQkJVXBkYXRlVGVzdHNQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0U3RhdGVMb2NhdGlvbigpCisJCQkJKyAiL3RlbXAvdGVzdFJlbW90ZURvdWJsZUVtYmVkZGVkRmVhdHVyZU1pcnJvciI7CisJCWFzc2VydFRydWUoZG9lc0NhdGVnb3J5RGVmaW5pdGlvbkV4aXN0KHRvTG9jYWxTaXRlVXJsKSk7CisJfQorCisJLy8gZW5zdXJlIGZlYXR1cmUgZXhpc3RzIHBlciBzaXRlLnhtbAorCXB1YmxpYyB2b2lkIHRlc3RGZWF0dXJlSW5TaXRlWE1MRXhpc3RzKCkgeworCQlTdHJpbmcgdG9Mb2NhbFNpdGVVcmwgPQorCQkJVXBkYXRlVGVzdHNQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0U3RhdGVMb2NhdGlvbigpCisJCQkJKyAiL3RlbXAvdGVzdFJlbW90ZURvdWJsZUVtYmVkZGVkRmVhdHVyZU1pcnJvciI7CisJCVN0cmluZyBmZWF0dXJlSWQgPSAidXBkYXRlLmZlYXR1cmUxYyI7CisJCVN0cmluZyB2ZXJzaW9uID0gIjMuMC4wIjsKKwkJYXNzZXJ0VHJ1ZSgKKwkJCWNoZWNrRmVhdHVyZUluU2l0ZVhNTEV4aXN0cyh0b0xvY2FsU2l0ZVVybCwgZmVhdHVyZUlkLCB2ZXJzaW9uKSk7CisJfQorCisJLy8gZW5zdXJlIHNpdGUueG1sIGlzIGdlbmVyYXRlZAorCXB1YmxpYyB2b2lkIHRlc3RTaXRlWE1MRXhpc3RzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyB0b0xvY2FsU2l0ZVVybCA9CisJCQlVcGRhdGVUZXN0c1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRTdGF0ZUxvY2F0aW9uKCkKKwkJCQkrICIvdGVtcC90ZXN0UmVtb3RlRG91YmxlRW1iZWRkZWRGZWF0dXJlTWlycm9yIjsKKwkJY2hlY2tTaXRlWE1MKHRvTG9jYWxTaXRlVXJsKTsKKwl9CisKKwkvLyBlbnN1cmUgcG9saWN5LnhtbCBpcyBnZW5lcmF0ZWQKKwlwdWJsaWMgdm9pZCB0ZXN0UG9saWN5WE1MRXhpc3RzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyB0b0xvY2FsU2l0ZVVybCA9CisJCQlVcGRhdGVUZXN0c1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRTdGF0ZUxvY2F0aW9uKCkKKwkJCQkrICIvdGVtcC90ZXN0UmVtb3RlRG91YmxlRW1iZWRkZWRGZWF0dXJlTWlycm9yIjsKKwkJY2hlY2tQb2xpY3lYTUwodG9Mb2NhbFNpdGVVcmwpOworCX0KKworCS8vIGVuc3VyZSBwb2xpY3kueG1sIHJlZmVyZW5jZXMgdGhlIGNvcnJlY3QgbWlycm9yVVJMCisJcHVibGljIHZvaWQgdGVzdFBvbGljeVVSTCgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgdG9Mb2NhbFNpdGVVcmwgPQorCQkJVXBkYXRlVGVzdHNQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0U3RhdGVMb2NhdGlvbigpCisJCQkJKyAiL3RlbXAvdGVzdFJlbW90ZURvdWJsZUVtYmVkZGVkRmVhdHVyZU1pcnJvciI7CisJCVN0cmluZyBtaXJyb3JVUkwgPSAiaHR0cDovL3VwZGF0ZS5lY2xpcHNlLm9yZy9teS1taXJyb3ItdXJsIjsKKwkJYXNzZXJ0VHJ1ZShjaGVja1BvbGljeVVSTCh0b0xvY2FsU2l0ZVVybCwgbWlycm9yVVJMKSk7CisJfQorCisJLy8gZW5zdXJlIGFsbCBqYXJzIGluIGZlYXR1cmVzIGRpcmVjdG9yeSBtaXJyb3JlZAorCXB1YmxpYyB2b2lkIHRlc3RBbGxGZWF0dXJlSmFyc0V4aXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyB0b0xvY2FsU2l0ZVVybCA9CisJCQlVcGRhdGVUZXN0c1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRTdGF0ZUxvY2F0aW9uKCkKKwkJCQkrICIvdGVtcC90ZXN0UmVtb3RlRG91YmxlRW1iZWRkZWRGZWF0dXJlTWlycm9yIjsKKwkJU3RyaW5nW10gZmVhdHVyZUphcnMgPSB7ICJ1cGRhdGUuZmVhdHVyZTFiXzIuMC4wLmphciIgfTsKKwkJYXNzZXJ0VHJ1ZShjaGVja0FsbEZlYXR1cmVKYXJzKHRvTG9jYWxTaXRlVXJsLCBmZWF0dXJlSmFycykpOworCX0KKworCS8vIGVuc3VyZSBhbGwgamFycyBpbiBwbHVnaW5zIGRpcmVjdG9yeSBtaXJyb3JlZAorCXB1YmxpYyB2b2lkIHRlc3RBbGxQbHVnaW5KYXJzRXhpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIHRvTG9jYWxTaXRlVXJsID0KKwkJCVVwZGF0ZVRlc3RzUGx1Z2luLmdldFBsdWdpbigpLmdldFN0YXRlTG9jYXRpb24oKQorCQkJCSsgIi90ZW1wL3Rlc3RSZW1vdGVEb3VibGVFbWJlZGRlZEZlYXR1cmVNaXJyb3IiOworCQlTdHJpbmdbXSBwbHVnaW5KYXJzID0KKwkJCXsgImNvbS5wbHVnaW4xXzEuMC4wLmphciIsICJjb20ucGx1Z2luMWFfMS4wLjEuamFyIiB9OworCQlhc3NlcnRUcnVlKGNoZWNrQWxsUGx1Z2luSmFycyh0b0xvY2FsU2l0ZVVybCwgcGx1Z2luSmFycykpOworCX0KKworCS8vIGVuc3VyZSBvdXRwdXQgc3RyaW5nIGJ1ZmZlciBlbmRzIHdpdGggIk1pcnJvciBjb21tYW5kIGNvbXBsZXRlZAorCS8vIHN1Y2Nlc3NmdWxseS4iCisJLy8gbm90ZTogb3V0cHV0IG1heSBpbnN0ZWFkIGJ5ICJDb21tYW5kIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuIgorCXB1YmxpYyB2b2lkIHRlc3RNaXJyb3JTdWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXN1cGVyLnRlc3RNaXJyb3JTdWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBib29sZWFuIGNoZWNrQWxsRmVhdHVyZUphcnMoU3RyaW5nIHVybCwgU3RyaW5nW10gamFyTmFtZXMpIHsKKwkJRmlsZSBmZWF0dXJlc0RpciA9IG5ldyBGaWxlKHVybCArICIvZmVhdHVyZXMiKTsKKwkJYXNzZXJ0VHJ1ZShmZWF0dXJlc0Rpci5leGlzdHMoKSk7CisJCWFzc2VydFRydWUoZmVhdHVyZXNEaXIuaXNEaXJlY3RvcnkoKSk7CisJCVN0cmluZ1tdIGxpc3QgPSBmZWF0dXJlc0Rpci5saXN0KCk7CisKKwkJQXJyYXlMaXN0IGxzID0gbmV3IEFycmF5TGlzdCgpOworCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKKwkJCWxzLmFkZChsaXN0W2ldKTsKKwkJfQorCisJCWZvciAoaW50IGogPSAwOyBqIDwgamFyTmFtZXMubGVuZ3RoOyBqKyspIHsKKwkJCWFzc2VydFRydWUobHMuY29udGFpbnMoamFyTmFtZXNbal0pKTsKKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBjaGVja0FsbFBsdWdpbkphcnMoU3RyaW5nIHVybCwgU3RyaW5nW10gamFyTmFtZXMpIHsKKwkJRmlsZSBwbHVnaW5zRGlyID0gbmV3IEZpbGUodXJsICsgIi9wbHVnaW5zIik7CisJCWFzc2VydFRydWUocGx1Z2luc0Rpci5leGlzdHMoKSk7CisJCWFzc2VydFRydWUocGx1Z2luc0Rpci5pc0RpcmVjdG9yeSgpKTsKKwkJU3RyaW5nW10gbGlzdCA9IHBsdWdpbnNEaXIubGlzdCgpOworCisJCUFycmF5TGlzdCBscyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7CisJCQlscy5hZGQobGlzdFtpXSk7CisJCX0KKworCQlmb3IgKGludCBqID0gMDsgaiA8IGphck5hbWVzLmxlbmd0aDsgaisrKSB7CisJCQlhc3NlcnRUcnVlKGxzLmNvbnRhaW5zKGphck5hbWVzW2pdKSk7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCisJcHVibGljIGJvb2xlYW4gY2hlY2tGZWF0dXJlQ2F0ZWdvcmllc0NvbnRhaW5lZChGZWF0dXJlQ2F0ZWdvcnlbXSByZXF1aXJlZCxGZWF0dXJlQ2F0ZWdvcnlbXSBsb2NhbERlZnMpeworCQlib29sZWFuIGhhc01hdGNoOworCQlmb3IgKGludCBpID0gMCA7IGk8cmVxdWlyZWQubGVuZ3RoOyBpKyspeworCQkJaGFzTWF0Y2ggPSBmYWxzZTsKKwkJCWZvciAoaW50IGogPSAwOyBqPGxvY2FsRGVmcy5sZW5ndGg7IGorKyl7CisJCQkJaWYgKGxvY2FsRGVmc1tqXS5nZXRGZWF0dXJlSUQoKS5lcXVhbHMocmVxdWlyZWRbaV0uZ2V0RmVhdHVyZUlEKCkpICYmCisJCQkJCWNoZWNrQ2F0ZWdvcmllc01hdGNoKGxvY2FsRGVmc1tqXS5nZXRDYXRlZ29yaWVzKCksIHJlcXVpcmVkW2ldLmdldENhdGVnb3JpZXMoKSkpeworCQkJCQkJaGFzTWF0Y2ggPSB0cnVlOworCQkJCQkJaj1sb2NhbERlZnMubGVuZ3RoOworCQkJCX0KKwkJCX0KKwkJCWlmICghaGFzTWF0Y2gpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCXJldHVybiB0cnVlOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBjaGVja0NhdGVnb3JpZXNNYXRjaChTdHJpbmdbXSBsb2NhbENhdCwgU3RyaW5nW10gcmVtb3RlQ2F0KXsKKwkJYm9vbGVhbiBoYXNNYXRjaDsKKwkJZm9yIChpbnQgaSA9IDA7IGk8bG9jYWxDYXQubGVuZ3RoOyBpKyspeworCQkJaGFzTWF0Y2ggPSBmYWxzZTsKKwkJCWZvciAoaW50IGogPSAwOyBqPHJlbW90ZUNhdC5sZW5ndGg7IGkrKyl7CisJCQkJaWYgKGxvY2FsQ2F0W2ldLmVxdWFscyhyZW1vdGVDYXRbal0pKXsKKwkJCQkJaGFzTWF0Y2ggPSB0cnVlOworCQkJCQlqPXJlbW90ZUNhdC5sZW5ndGg7CisJCQkJfQorCQkJfQorCQkJaWYoIWhhc01hdGNoKQorCQkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL21pcnJvci9UZXN0UmVtb3RlRW1iZWRkZWRGZWF0dXJlTWlycm9yLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9taXJyb3IvVGVzdFJlbW90ZUVtYmVkZGVkRmVhdHVyZU1pcnJvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmZWRkNjkKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9taXJyb3IvVGVzdFJlbW90ZUVtYmVkZGVkRmVhdHVyZU1pcnJvci5qYXZhCkBAIC0wLDAgKzEsMTg5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMubWlycm9yOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlVGVzdHNQbHVnaW47CisKK3B1YmxpYyBjbGFzcyBUZXN0UmVtb3RlRW1iZWRkZWRGZWF0dXJlTWlycm9yIGV4dGVuZHMgTWlycm9yTWFuYWdlclRlc3RDYXNlIHsKKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTWlycm9yZWQ7CisKKwlwdWJsaWMgVGVzdFJlbW90ZUVtYmVkZGVkRmVhdHVyZU1pcnJvcihTdHJpbmcgYXJnMCkgeworCQlzdXBlcihhcmcwKTsKKwkJZXJyT3V0cHV0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQlpc01pcnJvcmVkID0gZmFsc2U7CisJfQorCisJcHVibGljIHZvaWQgdW1TZXRVcCgpIHsKKwkJU3RyaW5nIGZlYXR1cmVJZCA9ICJ1cGRhdGUuZmVhdHVyZTFjIjsKKwkJU3RyaW5nIHZlcnNpb24gPSAiMy4wLjAiOworCQlTdHJpbmcgdG9Mb2NhbFNpdGVVcmwgPQorCQkJVXBkYXRlVGVzdHNQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0U3RhdGVMb2NhdGlvbigpCisJCQkJKyAiL3RlbXAvdGVzdFJlbW90ZUVtYmVkZGVkRmVhdHVyZU1pcnJvciI7CisJCVN0cmluZyBtaXJyb3JVUkwgPSAiaHR0cDovL3VwZGF0ZS5lY2xpcHNlLm9yZy9teS1taXJyb3ItdXJsIjsKKwkJU3RyaW5nIGZyb21SZW1vdGVTaXRlVXJsID0KKwkJCQkiZmlsZToiCisJCQkJKyBkYXRhUGF0aAorCQkJCSsgIm1pcnJvcnMvdXBkYXRlLXNpdGU0IjsKKwkJaWYgKCFpc01pcnJvcmVkKSB7CisJCQlleGl0VmFsdWUgPQorCQkJCXBlcmZvcm1NaXJyb3IoCisJCQkJCWdldENvbW1hbmQoZnJvbVJlbW90ZVNpdGVVcmwsdG9Mb2NhbFNpdGVVcmwsIGZlYXR1cmVJZCwgdmVyc2lvbiwgbWlycm9yVVJMKSk7CisJCQlpc01pcnJvcmVkID0gdHJ1ZTsKKwkJfQorCX0KKworCS8vIGVuc3VyZSBleGl0IHdpdGhvdXQgcHJvYmxlbXMKKwlwdWJsaWMgdm9pZCB0ZXN0RXhpdFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXN1cGVyLnRlc3RFeGl0VmFsdWUoKTsKKwl9CisKKwkvLyBlbnN1cmUgYWxsIGNhdGVnb3J5IGRlZmluaXRpb25zIGV4aXN0CisJcHVibGljIHZvaWQgdGVzdENhdGVnb3J5RGVmaW5pdGlvbnNFeGlzdCgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmcgdG9Mb2NhbFNpdGVVcmwgPQorCQkJVXBkYXRlVGVzdHNQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0U3RhdGVMb2NhdGlvbigpCisJCQkJKyAiL3RlbXAvdGVzdFJlbW90ZUVtYmVkZGVkRmVhdHVyZU1pcnJvciI7CisJCWFzc2VydFRydWUoZG9lc0NhdGVnb3J5RGVmaW5pdGlvbkV4aXN0KHRvTG9jYWxTaXRlVXJsKSk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEZlYXR1cmVJblNpdGVYTUxFeGlzdHMoKSB7CisJCVN0cmluZyB0b0xvY2FsU2l0ZVVybCA9CisJCQlVcGRhdGVUZXN0c1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRTdGF0ZUxvY2F0aW9uKCkKKwkJCQkrICIvdGVtcC90ZXN0UmVtb3RlRW1iZWRkZWRGZWF0dXJlTWlycm9yIjsKKwkJU3RyaW5nIGZlYXR1cmVJZCA9ICJ1cGRhdGUuZmVhdHVyZTFjIjsKKwkJU3RyaW5nIHZlcnNpb24gPSAiMy4wLjAiOworCQlhc3NlcnRUcnVlKAorCQkJY2hlY2tGZWF0dXJlSW5TaXRlWE1MRXhpc3RzKHRvTG9jYWxTaXRlVXJsLCBmZWF0dXJlSWQsIHZlcnNpb24pKTsKKwl9CisKKwkvLyBlbnN1cmUgc2l0ZS54bWwgaXMgZ2VuZXJhdGVkCisJcHVibGljIHZvaWQgdGVzdFNpdGVYTUxFeGlzdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIHRvTG9jYWxTaXRlVXJsID0KKwkJCVVwZGF0ZVRlc3RzUGx1Z2luLmdldFBsdWdpbigpLmdldFN0YXRlTG9jYXRpb24oKQorCQkJCSsgIi90ZW1wL3Rlc3RSZW1vdGVFbWJlZGRlZEZlYXR1cmVNaXJyb3IiOworCQljaGVja1NpdGVYTUwodG9Mb2NhbFNpdGVVcmwpOworCX0KKworCS8vIGVuc3VyZSBwb2xpY3kueG1sIGlzIGdlbmVyYXRlZAorCXB1YmxpYyB2b2lkIHRlc3RQb2xpY3lYTUxFeGlzdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIHRvTG9jYWxTaXRlVXJsID0KKwkJCVVwZGF0ZVRlc3RzUGx1Z2luLmdldFBsdWdpbigpLmdldFN0YXRlTG9jYXRpb24oKQorCQkJCSsgIi90ZW1wL3Rlc3RSZW1vdGVFbWJlZGRlZEZlYXR1cmVNaXJyb3IiOworCQljaGVja1BvbGljeVhNTCh0b0xvY2FsU2l0ZVVybCk7CisJfQorCisJLy8gZW5zdXJlIHBvbGljeS54bWwgdXNlcyB0aGUgY29ycmVjdCBtaXJyb3JVUkwKKwlwdWJsaWMgdm9pZCB0ZXN0UG9saWN5VVJMKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyB0b0xvY2FsU2l0ZVVybCA9CisJCQlVcGRhdGVUZXN0c1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRTdGF0ZUxvY2F0aW9uKCkKKwkJCQkrICIvdGVtcC90ZXN0UmVtb3RlRW1iZWRkZWRGZWF0dXJlTWlycm9yIjsKKwkJU3RyaW5nIG1pcnJvclVSTCA9ICJodHRwOi8vdXBkYXRlLmVjbGlwc2Uub3JnL215LW1pcnJvci11cmwiOworCQlhc3NlcnRUcnVlKGNoZWNrUG9saWN5VVJMKHRvTG9jYWxTaXRlVXJsLCBtaXJyb3JVUkwpKTsKKwl9CisKKwkvLyBlbnN1cmUgYWxsIGphcnMgaW4gZmVhdHVyZXMgZGlyZWN0b3J5IG1pcnJvcmVkCisJcHVibGljIHZvaWQgdGVzdEFsbEZlYXR1cmVKYXJzRXhpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIHRvTG9jYWxTaXRlVXJsID0KKwkJCVVwZGF0ZVRlc3RzUGx1Z2luLmdldFBsdWdpbigpLmdldFN0YXRlTG9jYXRpb24oKQorCQkJCSsgIi90ZW1wL3Rlc3RSZW1vdGVFbWJlZGRlZEZlYXR1cmVNaXJyb3IiOworCQlTdHJpbmdbXSBmZWF0dXJlSmFycyA9IHsgInVwZGF0ZS5mZWF0dXJlMV8xLjAuMC5qYXIiLCAidXBkYXRlLmZlYXR1cmUxXzEuMC4xLmphciIsICJ1cGRhdGUuZmVhdHVyZTFiXzIuMC4wLmphciIsICJ1cGRhdGUuZmVhdHVyZTFjXzMuMC4wLmphciIgfTsKKwkJYXNzZXJ0VHJ1ZShjaGVja0FsbEZlYXR1cmVKYXJzKHRvTG9jYWxTaXRlVXJsLCBmZWF0dXJlSmFycykpOworCX0KKworCS8vIGVuc3VyZSBhbGwgamFycyBpbiBwbHVnaW5zIGRpcmVjdG9yeSBtaXJyb3JlZAorCXB1YmxpYyB2b2lkIHRlc3RBbGxQbHVnaW5KYXJzRXhpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIHRvTG9jYWxTaXRlVXJsID0KKwkJCVVwZGF0ZVRlc3RzUGx1Z2luLmdldFBsdWdpbigpLmdldFN0YXRlTG9jYXRpb24oKQorCQkJCSsgIi90ZW1wL3Rlc3RSZW1vdGVFbWJlZGRlZEZlYXR1cmVNaXJyb3IiOworCQlTdHJpbmdbXSBwbHVnaW5KYXJzID0KKwkJCXsgImNvbS5wbHVnaW4xXzEuMC4wLmphciIsICJjb20ucGx1Z2luMWFfMS4wLjEuamFyIiB9OworCQlhc3NlcnRUcnVlKGNoZWNrQWxsUGx1Z2luSmFycyh0b0xvY2FsU2l0ZVVybCwgcGx1Z2luSmFycykpOworCX0KKworCS8vIGVuc3VyZSBvdXRwdXQgc3RyaW5nIGJ1ZmZlciBlbmRzIHdpdGggIk1pcnJvciBjb21tYW5kIGNvbXBsZXRlZAorCS8vIHN1Y2Nlc3NmdWxseS4iCisJLy8gbm90ZTogb3V0cHV0IG1heSBpbnN0ZWFkIGJ5ICJDb21tYW5kIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuIgorCXB1YmxpYyB2b2lkIHRlc3RNaXJyb3JTdWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXN1cGVyLnRlc3RNaXJyb3JTdWNjZXNzKCk7CisJfQorCisJcHVibGljIGJvb2xlYW4gY2hlY2tBbGxGZWF0dXJlSmFycyhTdHJpbmcgdXJsLCBTdHJpbmdbXSBqYXJOYW1lcykgeworCQlGaWxlIGZlYXR1cmVzRGlyID0gbmV3IEZpbGUodXJsICsgIi9mZWF0dXJlcyIpOworCQlhc3NlcnRUcnVlKGZlYXR1cmVzRGlyLmV4aXN0cygpKTsKKwkJYXNzZXJ0VHJ1ZShmZWF0dXJlc0Rpci5pc0RpcmVjdG9yeSgpKTsKKwkJU3RyaW5nW10gbGlzdCA9IGZlYXR1cmVzRGlyLmxpc3QoKTsKKworCQlBcnJheUxpc3QgbHMgPSBuZXcgQXJyYXlMaXN0KCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgeworCQkJbHMuYWRkKGxpc3RbaV0pOworCQl9CisKKwkJYXNzZXJ0RXF1YWxzKGxpc3QubGVuZ3RoLCBqYXJOYW1lcy5sZW5ndGgpOworCQlmb3IgKGludCBqID0gMDsgaiA8IGphck5hbWVzLmxlbmd0aDsgaisrKSB7CisJCQlhc3NlcnRUcnVlKGxzLmNvbnRhaW5zKGphck5hbWVzW2pdKSk7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCisJcHVibGljIGJvb2xlYW4gY2hlY2tBbGxQbHVnaW5KYXJzKFN0cmluZyB1cmwsIFN0cmluZ1tdIGphck5hbWVzKSB7CisJCUZpbGUgcGx1Z2luc0RpciA9IG5ldyBGaWxlKHVybCArICIvcGx1Z2lucyIpOworCQlhc3NlcnRUcnVlKHBsdWdpbnNEaXIuZXhpc3RzKCkpOworCQlhc3NlcnRUcnVlKHBsdWdpbnNEaXIuaXNEaXJlY3RvcnkoKSk7CisJCVN0cmluZ1tdIGxpc3QgPSBwbHVnaW5zRGlyLmxpc3QoKTsKKworCQlBcnJheUxpc3QgbHMgPSBuZXcgQXJyYXlMaXN0KCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgeworCQkJbHMuYWRkKGxpc3RbaV0pOworCQl9CisKKwkJYXNzZXJ0RXF1YWxzKGxpc3QubGVuZ3RoLCBqYXJOYW1lcy5sZW5ndGgpOworCQlmb3IgKGludCBqID0gMDsgaiA8IGphck5hbWVzLmxlbmd0aDsgaisrKSB7CisJCQlhc3NlcnRUcnVlKGxzLmNvbnRhaW5zKGphck5hbWVzW2pdKSk7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCisJcHVibGljIGJvb2xlYW4gY2hlY2tDYXRlZ29yeURlZmluaXRpb25zQ29udGFpbmVkKENhdGVnb3J5RGVmaW5pdGlvbltdIGxvY2FsRGVmcywgQ2F0ZWdvcnlEZWZpbml0aW9uW10gcmVtb3RlRGVmcyl7CisJCWJvb2xlYW4gaGFzTWF0Y2g7CisJCWZvciAoaW50IGkgPSAwIDsgaTxsb2NhbERlZnMubGVuZ3RoOyBpKyspeworCQkJaGFzTWF0Y2ggPSBmYWxzZTsKKwkJCWZvciAoaW50IGogPSAwOyBqPHJlbW90ZURlZnMubGVuZ3RoOyBqKyspeworCQkJCWlmIChsb2NhbERlZnNbaV0uZ2V0TmFtZSgpLmVxdWFscyhyZW1vdGVEZWZzW2pdLmdldE5hbWUoKSkKKwkJCQkJCSYmIGxvY2FsRGVmc1tpXS5nZXREZXNjKCkuZXF1YWxzKHJlbW90ZURlZnNbal0uZ2V0RGVzYygpKSkKKwkJCQkJaGFzTWF0Y2ggPSB0cnVlOworCQkJfQorCQkJaWYgKCFoYXNNYXRjaCkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCQorCisKKwkvLyBzdGFydCB0ZXN0aW5nIGNhdGVnb3J5IGRlZmluaXRpb25zCisJcHVibGljIHZvaWQgdGVzdENhdGVnb3J5RGVmaW5pdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIHRvTG9jYWxTaXRlVXJsID0KKwkJCVVwZGF0ZVRlc3RzUGx1Z2luLmdldFBsdWdpbigpLmdldFN0YXRlTG9jYXRpb24oKQorCQkJCSsgIi90ZW1wL3Rlc3RSZW1vdGVFbWJlZGRlZEZlYXR1cmVNaXJyb3IiOworCQlTdHJpbmcgZnJvbVJlbW90ZVNpdGVVcmwgPQorCQkgICAgICAgIGRhdGFQYXRoCisJCQkJKyAibWlycm9ycy91cGRhdGUtc2l0ZTQiOworCQlDYXRlZ29yeURlZmluaXRpb25bXSBsb2NhbERlZnMgPSBnZXRDYXRlZ29yeURlZmluaXRpb25zKHRvTG9jYWxTaXRlVXJsKTsKKwkJQ2F0ZWdvcnlEZWZpbml0aW9uW10gcmVtb3RlRGVmcyA9IGdldENhdGVnb3J5RGVmaW5pdGlvbnMoZnJvbVJlbW90ZVNpdGVVcmwpOworCQlhc3NlcnRUcnVlKGNoZWNrQ2F0ZWdvcnlEZWZpbml0aW9uc0NvbnRhaW5lZChsb2NhbERlZnMsIHJlbW90ZURlZnMpKTsKKwl9CisKKworCit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9taXJyb3IvVGVzdFJlbW90ZUZlYXR1cmVWZXJzaW9uTWlycm9yLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9taXJyb3IvVGVzdFJlbW90ZUZlYXR1cmVWZXJzaW9uTWlycm9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJjY2IwYQotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL21pcnJvci9UZXN0UmVtb3RlRmVhdHVyZVZlcnNpb25NaXJyb3IuamF2YQpAQCAtMCwwICsxLDExMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLm1pcnJvcjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVUZXN0c1BsdWdpbjsKKworcHVibGljIGNsYXNzIFRlc3RSZW1vdGVGZWF0dXJlVmVyc2lvbk1pcnJvciBleHRlbmRzIE1pcnJvck1hbmFnZXJUZXN0Q2FzZSB7CisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc01pcnJvcmVkOworCQorCXB1YmxpYyBUZXN0UmVtb3RlRmVhdHVyZVZlcnNpb25NaXJyb3IoU3RyaW5nIGFyZzApIHsKKwkJc3VwZXIoYXJnMCk7CisJCWVyck91dHB1dCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJaXNNaXJyb3JlZCA9IGZhbHNlOworCX0KKworCXB1YmxpYyB2b2lkIHVtU2V0VXAoKSB7CisJCVN0cmluZyBmZWF0dXJlSWQgPSAidXBkYXRlLmZlYXR1cmUxIjsKKwkJU3RyaW5nIHZlcnNpb24gPSAiMS4wLjAiOworCQlTdHJpbmcgdG9Mb2NhbFNpdGVVcmwgPQorCQkJVXBkYXRlVGVzdHNQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0U3RhdGVMb2NhdGlvbigpCisJCQkJKyAiL3RlbXAvdGVzdFJlbW90ZUZlYXR1cmVWZXJzaW9uTWlycm9yIjsKKwkJU3RyaW5nIG1pcnJvclVSTCA9ICJodHRwOi8vdXBkYXRlLmVjbGlwc2Uub3JnL215LW1pcnJvci11cmwiOworCQlTdHJpbmcgZnJvbVJlbW90ZVNpdGVVcmwgPSAiZmlsZToiICsgZGF0YVBhdGggKyAibWlycm9ycy91cGRhdGUtc2l0ZTEiOworCQlpZiAoIWlzTWlycm9yZWQpIHsKKwkJCWV4aXRWYWx1ZSA9CisJCQkJcGVyZm9ybU1pcnJvcigKKwkJCQkJZ2V0Q29tbWFuZChmcm9tUmVtb3RlU2l0ZVVybCx0b0xvY2FsU2l0ZVVybCwgZmVhdHVyZUlkLCB2ZXJzaW9uLCBtaXJyb3JVUkwpKTsKKwkJCWlzTWlycm9yZWQgPSB0cnVlOworCQl9CisJfQorCisJLy8gZW5zdXJlIGV4aXQgd2l0aG91dCBwcm9ibGVtcworCXB1YmxpYyB2b2lkIHRlc3RFeGl0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc3VwZXIudGVzdEV4aXRWYWx1ZSgpOworCX0KKworCS8vIGVuc3VyZSBhbGwgY2F0ZWdvcnkgZGVmaW5pdGlvbnMgZXhpc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Q2F0ZWdvcnlEZWZpbml0aW9uc0V4aXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyB0b0xvY2FsU2l0ZVVybCA9CisJCQlVcGRhdGVUZXN0c1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRTdGF0ZUxvY2F0aW9uKCkKKwkJCQkrICIvdGVtcC90ZXN0UmVtb3RlRmVhdHVyZVZlcnNpb25NaXJyb3IiOworCQlhc3NlcnRUcnVlKGRvZXNDYXRlZ29yeURlZmluaXRpb25FeGlzdCh0b0xvY2FsU2l0ZVVybCkpOworCX0KKworCS8vIGVuc3VyZSBmZWF0dXJlIGV4aXN0cyBwZXIgc2l0ZS54bWwKKwlwdWJsaWMgdm9pZCB0ZXN0RmVhdHVyZUluU2l0ZVhNTEV4aXN0cygpeworCQlTdHJpbmcgdG9Mb2NhbFNpdGVVcmwgPQorCQkJVXBkYXRlVGVzdHNQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0U3RhdGVMb2NhdGlvbigpCisJCQkJKyAiL3RlbXAvdGVzdFJlbW90ZUZlYXR1cmVWZXJzaW9uTWlycm9yIjsKKwkJU3RyaW5nIGZlYXR1cmVJZCA9ICJ1cGRhdGUuZmVhdHVyZTEiOworCQlTdHJpbmcgdmVyc2lvbiA9ICIxLjAuMCI7CisJCWFzc2VydFRydWUoY2hlY2tGZWF0dXJlSW5TaXRlWE1MRXhpc3RzKHRvTG9jYWxTaXRlVXJsLCBmZWF0dXJlSWQsIHZlcnNpb24pKTsKKwl9CisJCisJLy8gZW5zdXJlIHNpdGUueG1sIGlzIGdlbmVyYXRlZAorCXB1YmxpYyB2b2lkIHRlc3RTaXRlWE1MRXhpc3RzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyB0b0xvY2FsU2l0ZVVybCA9CisJCQlVcGRhdGVUZXN0c1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRTdGF0ZUxvY2F0aW9uKCkKKwkJCQkrICIvdGVtcC90ZXN0UmVtb3RlRmVhdHVyZVZlcnNpb25NaXJyb3IiOworCQljaGVja1NpdGVYTUwodG9Mb2NhbFNpdGVVcmwpOworCX0KKworCS8vIGVuc3VyZSBwb2xpY3kueG1sIGlzIGdlbmVyYXRlZAorCXB1YmxpYyB2b2lkIHRlc3RQb2xpY3lYTUxFeGlzdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIHRvTG9jYWxTaXRlVXJsID0KKwkJCVVwZGF0ZVRlc3RzUGx1Z2luLmdldFBsdWdpbigpLmdldFN0YXRlTG9jYXRpb24oKQorCQkJCSsgIi90ZW1wL3Rlc3RSZW1vdGVGZWF0dXJlVmVyc2lvbk1pcnJvciI7CisJCWNoZWNrUG9saWN5WE1MKHRvTG9jYWxTaXRlVXJsKTsKKwl9CisJCisJLy8gZW5zdXJlIHBvbGljeS54bWwgdXNlcyB0aGUgY29ycmVjdCBtaXJyb3JVUkwKKwlwdWJsaWMgdm9pZCB0ZXN0UG9saWN5VVJMKCkgdGhyb3dzIEV4Y2VwdGlvbnsKKwkJU3RyaW5nIHRvTG9jYWxTaXRlVXJsID0KKwkJCVVwZGF0ZVRlc3RzUGx1Z2luLmdldFBsdWdpbigpLmdldFN0YXRlTG9jYXRpb24oKQorCQkJCSsgIi90ZW1wL3Rlc3RSZW1vdGVGZWF0dXJlVmVyc2lvbk1pcnJvciI7CisJCVN0cmluZyBtaXJyb3JVUkwgPSAiaHR0cDovL3VwZGF0ZS5lY2xpcHNlLm9yZy9teS1taXJyb3ItdXJsIjsKKwkJYXNzZXJ0VHJ1ZShjaGVja1BvbGljeVVSTCh0b0xvY2FsU2l0ZVVybCwgbWlycm9yVVJMKSk7CisJfQorCisJLy8gZW5zdXJlIGFsbCBqYXJzIGZvciBmZWF0dXJlcyBhbmQgcGx1Z2lucyBtaXJyb3JlZAorCXB1YmxpYyB2b2lkIHRlc3RBbGxKYXJzRXhpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIHRvTG9jYWxTaXRlVXJsID0KKwkJCVVwZGF0ZVRlc3RzUGx1Z2luLmdldFBsdWdpbigpLmdldFN0YXRlTG9jYXRpb24oKQorCQkJCSsgIi90ZW1wL3Rlc3RSZW1vdGVGZWF0dXJlVmVyc2lvbk1pcnJvciI7CisJCVN0cmluZyBmZWF0dXJlSWQgPSAidXBkYXRlLmZlYXR1cmUxIjsKKwkJU3RyaW5nIHZlcnNpb24gPSAiMS4wLjAiOworCQlTdHJpbmcgamFyTmFtZSA9IGZlYXR1cmVJZCArICJfIiArIHZlcnNpb24gKyAiLmphciI7CisJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHRvTG9jYWxTaXRlVXJsICsgIi9mZWF0dXJlcy8iICsgamFyTmFtZSk7CisJCWFzc2VydFRydWUoZmlsZS5leGlzdHMoKSk7CisJfQorCisJLy8gZW5zdXJlIG91dHB1dCBzdHJpbmcgYnVmZmVyIGVuZHMgd2l0aCAiTWlycm9yIGNvbW1hbmQgY29tcGxldGVkCisJLy8gc3VjY2Vzc2Z1bGx5LiIKKwkvLyBub3RlOiBvdXRwdXQgbWF5IGluc3RlYWQgYnkgIkNvbW1hbmQgY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4iCisJcHVibGljIHZvaWQgdGVzdE1pcnJvclN1Y2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc3VwZXIudGVzdE1pcnJvclN1Y2Nlc3MoKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL21vZGVsL0FsbE1vZGVsVGVzdHMuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL21vZGVsL0FsbE1vZGVsVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjEwZWY3Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbW9kZWwvQWxsTW9kZWxUZXN0cy5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMubW9kZWw7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7CisKKy8qKgorICogTWFuYWdlcyB0aGUgQVBJIHRlc3RzCisgKi8KK3B1YmxpYyBjbGFzcyBBbGxNb2RlbFRlc3RzIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsKKwkvKioKKwkgKiBDb25zdHJ1Y3RvcgorCSAqLworCXB1YmxpYyBBbGxNb2RlbFRlc3RzKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKwkKKwkvKioKKwkgKiBMaXN0IG9mIEFQSSB0ZXN0cworCSAqLworCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHRocm93cyBFeGNlcHRpb24geworCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7CisJCXN1aXRlLnNldE5hbWUoIk1vZGVsIFRlc3RzIik7CisKKwkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKEZlYXR1cmVNYWluLmNsYXNzKSk7CisJCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShTaXRlTWFpbi5jbGFzcykpOwkJCisKKwkJcmV0dXJuIHN1aXRlOworCX0KK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL21vZGVsL1NpdGVNYWluLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9tb2RlbC9TaXRlTWFpbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzOGIzNzYKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9tb2RlbC9TaXRlTWFpbi5qYXZhCkBAIC0wLDAgKzEsMTU4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLm1vZGVsOworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEubmV0LlVSTDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlNpdGVGZWF0dXJlUmVmZXJlbmNlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlTWFuYWdlclRlc3RDYXNlOworCitwdWJsaWMgY2xhc3MgU2l0ZU1haW4gZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2UgeworCQorCXB1YmxpYyBTaXRlTWFpbihTdHJpbmcgbmFtZSl7CisJCXN1cGVyKG5hbWUpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RNYWluKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCQorCQlTdHJpbmdXcml0ZXIgc3RyV3JpdGVyPW5ldyBTdHJpbmdXcml0ZXIoKTsKKwkJUHJpbnRXcml0ZXIgdyA9IG5ldyBQcmludFdyaXRlcihzdHJXcml0ZXIpOworCisJCXByb2Nlc3MoInNpdGVfb2xkX2Zvcm1hdC54bWwiLHcpOworCQlwcm9jZXNzKCJzaXRlLnhtbCIsdyk7CisJCXRyeSB7CisJCQlwcm9jZXNzKCJzaXRlX3dpdGhfdHlwZS54bWwiLHcpOworCQkJZmFpbCgiSW52YWxpZFNpdGVUeXBlRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsKKwkJfSBjYXRjaCAoSW52YWxpZFNpdGVUeXBlRXhjZXB0aW9uIGUpIHsKKwkJCWFzc2VydEVxdWFscyhlLmdldE5ld1R5cGUoKSwic29tZS5vdGhlci5zaXRlLnR5cGUiKTsKKwkJfSBmaW5hbGx5IHsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbihzdHJXcml0ZXIpOworCQkJdy5jbG9zZSgpOworCQl9CisJfQorCQorCXByaXZhdGUgc3RhdGljIHZvaWQgcHJvY2VzcyhTdHJpbmcgeG1sLCBQcmludFdyaXRlciB3KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJCisJCVNpdGVNb2RlbEZhY3RvcnkgZmFjdG9yeSA9IG5ldyBTaXRlTW9kZWxGYWN0b3J5KCk7CisJCUlucHV0U3RyZWFtIGlzID0gbnVsbDsKKwkJU2l0ZU1vZGVsIHNpdGUgPSBudWxsOworCQkKKwkJdy5wcmludGxuKCIiKTsKKwkJdy5wcmludGxuKCJQYXJzaW5nIHNpdGUgbWFwIC4uLiIpOworCQl0cnkgeworCQkJaXMgPSBTaXRlTWFpbi5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKHhtbCk7CQkKKwkJCXNpdGUgPSBmYWN0b3J5LnBhcnNlU2l0ZShpcyk7CisJCX0gIGZpbmFsbHkgeworCQkJaWYgKGlzICE9IG51bGwpIHsKKwkJCQl0cnkgeyBpcy5jbG9zZSgpO30gY2F0Y2goSU9FeGNlcHRpb24gZSkge30KKwkJCX0KKwkJfQorCQkKKwkJaWYgKHNpdGUgPT0gbnVsbCkgcmV0dXJuOworCQkKKwkJU3RyaW5nIGJhc2UgPSAiaHR0cDovL2Fub3RoZXIuc2VydmVyL3NpdGUueG1sIjsKKwkJdy5wcmludGxuKCJSZXNvbHZpbmcgc2l0ZSB1c2luZyAiK2Jhc2UrIiAuLi4iKTsKKwkJc2l0ZS5yZXNvbHZlKG5ldyBVUkwoYmFzZSksIG51bGwpOworCQkKKwkJdy5wcmludGxuKCJXcml0aW5nIHNpdGUgLi4uIik7CisJCXdyaXRlU2l0ZSh3LDAsc2l0ZSk7CisJfQorCQorCXByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVTaXRlKFByaW50V3JpdGVyIHcsIGludCBsZXZlbCwgU2l0ZU1vZGVsIHNpdGUpIHsKKwkJaWYgKHNpdGUgPT0gbnVsbCkgcmV0dXJuOworCQkKKwkJU3RyaW5nIGluID0gZ2V0SW5kZW50KGxldmVsKTsKKwkJdy5wcmludGxuKGluKyI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz4iKTsKKwkJCisJCXcucHJpbnRsbihpbisiPHNpdGUiKTsKKwkJdy5wcmludGxuKGluKyIgICAiKyJ0eXBlPVwiIitzaXRlLmdldFR5cGUoKSsiXCIiKTsKKwkJdy5wcmludGxuKGluKyIgICAiKyI+Iik7CisJCQorCQl3cml0ZURlc2NyaXB0aW9uKHcsIGxldmVsKzEsIHNpdGUuZ2V0RGVzY3JpcHRpb25Nb2RlbCgpKTsKKwkJd3JpdGVGZWF0dXJlcyh3LCBsZXZlbCsxLCBzaXRlKTsKKwkJd3JpdGVBcmNoaXZlcyh3LCBsZXZlbCsxLCBzaXRlKTsKKwkJd3JpdGVDYXRlZ29yeURlZnModywgbGV2ZWwrMSwgc2l0ZSk7CisgICAgICAgICAKKyAgICAgICAgdy5wcmludGxuKGluKyI8L2ZlYXR1cmU+Iik7CisJfQorCQorCXByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVEZXNjcmlwdGlvbihQcmludFdyaXRlciB3LCBpbnQgbGV2ZWwsIFVSTEVudHJ5TW9kZWwgdWUpIHsKKwkJaWYgKHVlID09IG51bGwpIHJldHVybjsKKwkJU3RyaW5nIGluID0gZ2V0SW5kZW50KGxldmVsKTsKKwkJdy5wcmludGxuKCIiKTsKKwkJdy5wcmludGxuKGluKyI8ZGVzY3JpcHRpb24gdXJsPVwiIit1ZS5nZXRVUkxTdHJpbmcoKSsiXCIgLT4gIit1ZS5nZXRVUkwoKSsiPiIpOworCQl3LnByaW50bG4oaW4rdWUuZ2V0QW5ub3RhdGlvbigpKTsKKwkJdy5wcmludGxuKGluKyI8L2Rlc2NyaXB0aW9uPiIpOworCX0KKwkKKwlwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlRmVhdHVyZXMoUHJpbnRXcml0ZXIgdywgaW50IGxldmVsLCBTaXRlTW9kZWwgc2l0ZSkgeworCQlTdHJpbmcgaW4gPSBnZXRJbmRlbnQobGV2ZWwpOworCQlnZXRJbmRlbnQobGV2ZWwrMSk7CisJCXcucHJpbnRsbigiIik7CisJCQorCQlTaXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsW10gZmVhdHVyZXMgPSBzaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VNb2RlbHMoKTsKKwkJZm9yIChpbnQgaT0wOyBpPGZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7CisJCQl3LnByaW50bG4oaW4rIjxmZWF0dXJlIik7CisJCQl3LnByaW50bG4oaW4rIiAgICIrInR5cGU9XCIiK2ZlYXR1cmVzW2ldLmdldFR5cGUoKSsiXCIiKTsKKwkJCXcucHJpbnRsbihpbisiICAgIisidXJsPVwiIitmZWF0dXJlc1tpXS5nZXRVUkxTdHJpbmcoKSsiXCIgLT4gIitmZWF0dXJlc1tpXS5nZXRVUkwoKSk7CisJCQl3LnByaW50bG4oaW4rIiAgICIrIj4iKTsKKwkJCXdyaXRlQ2F0ZWdvcmllcyh3LCBsZXZlbCsxLCBmZWF0dXJlc1tpXSk7CisJCQl3LnByaW50bG4oaW4rIjwvZmVhdHVyZT4iKTsKKwkJfQorCX0KKwkKKwlwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlQXJjaGl2ZXMoUHJpbnRXcml0ZXIgdywgaW50IGxldmVsLCBTaXRlTW9kZWwgc2l0ZSkgeworCQlTdHJpbmcgaW4gPSBnZXRJbmRlbnQobGV2ZWwpOworCQl3LnByaW50bG4oIiIpOworCQkKKwkJQXJjaGl2ZVJlZmVyZW5jZU1vZGVsW10gYXJjaGl2ZSA9IHNpdGUuZ2V0QXJjaGl2ZVJlZmVyZW5jZU1vZGVscygpOworCQlmb3IgKGludCBpPTA7IGk8YXJjaGl2ZS5sZW5ndGg7IGkrKykgeworCQkJdy5wcmludGxuKGluKyI8YXJjaGl2ZSIpOworCQkJdy5wcmludGxuKGluKyIgICAiKyJwYXRoPVwiIithcmNoaXZlW2ldLmdldFBhdGgoKSsiXCIiKTsKKwkJCXcucHJpbnRsbihpbisiICAgIisidXJsPVwiIithcmNoaXZlW2ldLmdldFVSTFN0cmluZygpKyJcIiAtPiAiK2FyY2hpdmVbaV0uZ2V0VVJMKCkpOworCQkJdy5wcmludGxuKGluKyIgICAiKyIvPiIpOworCQl9CisJfQorCQorCXByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVDYXRlZ29yeURlZnMoUHJpbnRXcml0ZXIgdywgaW50IGxldmVsLCBTaXRlTW9kZWwgc2l0ZSkgeworCQlTdHJpbmcgaW4gPSBnZXRJbmRlbnQobGV2ZWwpOworCQlnZXRJbmRlbnQobGV2ZWwrMSk7CisJCXcucHJpbnRsbigiIik7CisJCQorCQlDYXRlZ29yeU1vZGVsW10gY2F0ID0gc2l0ZS5nZXRDYXRlZ29yeU1vZGVscygpOworCQlmb3IgKGludCBpPTA7IGk8Y2F0Lmxlbmd0aDsgaSsrKSB7CisJCQl3LnByaW50bG4oaW4rIjxjYXRlZ29yeS1kZWYiKTsKKwkJCXcucHJpbnRsbihpbisiICAgIisibmFtZT1cIiIrY2F0W2ldLmdldE5hbWUoKSsiXCIiKTsKKwkJCXcucHJpbnRsbihpbisiICAgIisibGFiZWw9XCIiK2NhdFtpXS5nZXRMYWJlbCgpKyJcIiIpOworCQkJdy5wcmludGxuKGluKyIgICAiKyI+Iik7CisJCQl3cml0ZURlc2NyaXB0aW9uKHcsIGxldmVsKzEsIGNhdFtpXS5nZXREZXNjcmlwdGlvbk1vZGVsKCkpOworCQkJdy5wcmludGxuKGluKyI8L2NhdGVnb3J5LWRlZj4iKTsKKwkJfQorCX0KKwkKKwlwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlQ2F0ZWdvcmllcyhQcmludFdyaXRlciB3LCBpbnQgbGV2ZWwsIFNpdGVGZWF0dXJlUmVmZXJlbmNlTW9kZWwgZmVhdHVyZSkgeworCQlTdHJpbmcgaW4gPSBnZXRJbmRlbnQobGV2ZWwpOworCQlTdHJpbmdbXSBjYXQgPSBmZWF0dXJlLmdldENhdGVnb3J5TmFtZXMoKTsKKwkJZm9yIChpbnQgaT0wOyBpPGNhdC5sZW5ndGg7IGkrKykgeworCQkJdy5wcmludGxuKGluKyI8Y2F0ZWdvcnkgbmFtZT1cIiIrY2F0W2ldKyJcIiIpOworCQl9CisJfQorCQorCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRJbmRlbnQoaW50IGxldmVsKSB7CisJCVN0cmluZyBpbmRlbnQgPSAiIjsKKwkJZm9yIChpbnQgaT0wOyBpPGxldmVsOyBpKyspIAorCQkJaW5kZW50ICs9ICIgICAiOworCQlyZXR1cm4gaW5kZW50OworCX0KK30KKwpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbW9kZWwvc2l0ZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9tb2RlbC9zaXRlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Njc0ODQ1Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbW9kZWwvc2l0ZS54bWwKQEAgLTAsMCArMSwzNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKworPHNpdGU+CisKKyAgIDxkZXNjcmlwdGlvbiB1cmw9Imh0dHA6Ly93d3cudG9vbHMuY29tL3VwZGF0ZVNpdGUiPgorICAgICAgU2l0ZSBkZXNjcmlwdGlvbgorICAgPC9kZXNjcmlwdGlvbj4KKworICAgPGZlYXR1cmUgdHlwZT0ibXkuZmVhdHVyZS50eXBlIiB1cmw9ImZlYXR1cmUxLmphciI+CisgICAgICA8Y2F0ZWdvcnkgbmFtZT0idG9vbHMiLz4KKyAgICAgIDxjYXRlZ29yeSBuYW1lPSJ1dGlsaXRpZXMiLz4KKyAgICAgIDxjYXRlZ29yeSBuYW1lPSJ3aW5kb3dzLnRvb2xzIi8+CisgICA8L2ZlYXR1cmU+CisgICAKKyAgIDxmZWF0dXJlIHR5cGU9IiIgdXJsPSJmaWxlOi9mZWF0dXJlMi5qYXIiPgorICAgICAgPGNhdGVnb3J5IG5hbWU9InV0aWxpdGllcyIvPgorICAgPC9mZWF0dXJlPgorICAgCisgICAKKyAgIDxhcmNoaXZlIHBhdGg9ImZpcnN0L2FyY2hpdmUiIHVybD0iYXJjaGl2ZTEuamFyIi8+CisgICA8YXJjaGl2ZSBwYXRoPSJzZWNvbmQvYXJjaGl2ZSIgdXJsPSJhcmNoaXZlMi5qYXIiLz4KKyAgIAorICAgPGNhdGVnb3J5LWRlZiBuYW1lPSJ0b29scyIgbGFiZWw9IkRldmVsb3BtZW50IFRvb2xzIj4KKyAgICAgIDxkZXNjcmlwdGlvbiB1cmw9Imh0dHA6Ly93d3cudG9vbHMuY29tL3Rvb2xzIj4KKyAgICAgICAgIFRoaXMgaXMgZGVzY3JpcHRpb24gZm9yIHRvb2xzCisgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgPC9jYXRlZ29yeS1kZWY+CisgICAKKyAgIDxjYXRlZ29yeS1kZWYgbmFtZT0idXRpbGl0aWVzIiBsYWJlbD0iVXRpbGl0aWVzIj4KKyAgICAgIDxkZXNjcmlwdGlvbiB1cmw9InRvb2xzLmh0bWwiLz4vCisgICA8L2NhdGVnb3J5LWRlZj4KKyAgIAorICAgPGNhdGVnb3J5LWRlZiBuYW1lPSJ3aW5kb3dzLnRvb2xzIiBsYWJlbD0iV2luZG93cyBEZXZlbG9wbWVudCBUb29scyIvPgorCis8L3NpdGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbW9kZWwvc2l0ZV9vbGRfZm9ybWF0LnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL21vZGVsL3NpdGVfb2xkX2Zvcm1hdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJjOWM4MQotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL21vZGVsL3NpdGVfb2xkX2Zvcm1hdC54bWwKQEAgLTAsMCArMSwzMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKworPHNpdGUgdXJsPSJ3d3cudG9vbHMuY29tL3VwZGF0ZVNpdGUiPgorCisgICA8ZmVhdHVyZSB0eXBlPSJteS5mZWF0dXJlLnR5cGUiIHVybD0iZmVhdHVyZTEuamFyIj4KKyAgICAgIDxjYXRlZ29yeSBuYW1lPSJ0b29scyIvPgorICAgICAgPGNhdGVnb3J5IG5hbWU9InV0aWxpdGllcyIvPgorICAgICAgPGNhdGVnb3J5IG5hbWU9IndpbmRvd3MudG9vbHMiLz4KKyAgIDwvZmVhdHVyZT4KKyAgIAorICAgPGZlYXR1cmUgdHlwZT0iIiB1cmw9ImZlYXR1cmUyLmphciI+CisgICAgICA8Y2F0ZWdvcnkgbmFtZT0idXRpbGl0aWVzIi8+CisgICA8L2ZlYXR1cmU+CisgIAorICAgPGFyY2hpdmUgcGF0aD0iZmlyc3QvYXJjaGl2ZSIgdXJsPSJhcmNoaXZlMS5qYXIiLz4KKyAgIDxhcmNoaXZlIHBhdGg9InNlY29uZC9hcmNoaXZlIiB1cmw9ImFyY2hpdmUyLmphciIvPgorICAgCisgICA8Y2F0ZWdvcnktZGVmIG5hbWU9InRvb2xzIiBsYWJlbD0iRGV2ZWxvcG1lbnQgVG9vbHMiPgorICAgICAgPGRlc2NyaXB0aW9uIHVybD0iaHR0cDovL3d3dy50b29scy5jb20vdG9vbHMiPgorICAgICAgICAgVGhpcyBpcyBkZXNjcmlwdGlvbiBmb3IgdG9vbHMKKyAgICAgIDwvZGVzY3JpcHRpb24+CisgICA8L2NhdGVnb3J5LWRlZj4KKyAgIAorICAgPGNhdGVnb3J5LWRlZiBuYW1lPSJ1dGlsaXRpZXMiIGxhYmVsPSJVdGlsaXRpZXMiPgorICAgICAgPGRlc2NyaXB0aW9uIHVybD0idXRpbGl0aWVzLmh0bWwiLz4KKyAgIDwvY2F0ZWdvcnktZGVmPgorICAgCisgICA8Y2F0ZWdvcnktZGVmIG5hbWU9IndpbmRvd3MudG9vbHMiIGxhYmVsPSJXaW5kb3dzIERldmVsb3BtZW50IFRvb2xzIi8+CisKKzwvc2l0ZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9tb2RlbC9zaXRlX3dpdGhfdHlwZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9tb2RlbC9zaXRlX3dpdGhfdHlwZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk5YjRmNwotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL21vZGVsL3NpdGVfd2l0aF90eXBlLnhtbApAQCAtMCwwICsxLDUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+CisKKzxzaXRlIHVybD0iaHR0cDovL3d3dy50b29scy5jb20vdXBkYXRlU2l0ZSIgdHlwZT0ic29tZS5vdGhlci5zaXRlLnR5cGUiPgorCis8L3NpdGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbmF0aXZlVGVzdHMvVGVzdExvY2FsU3lzdGVtSW5mby5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbmF0aXZlVGVzdHMvVGVzdExvY2FsU3lzdGVtSW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MDYzNWIKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9uYXRpdmVUZXN0cy9UZXN0TG9jYWxTeXN0ZW1JbmZvLmphdmEKQEAgLTAsMCArMSw2OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5uYXRpdmVUZXN0czsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi5JVm9sdW1lOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLkxvY2FsU3lzdGVtSW5mbzsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlTWFuYWdlclRlc3RDYXNlOworCitwdWJsaWMgY2xhc3MgVGVzdExvY2FsU3lzdGVtSW5mbyBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7CisKKwkvKioKKwkgKiBUZXN0IHRoZSBuYXRpdmVzCisJICovCisJcHVibGljIFRlc3RMb2NhbFN5c3RlbUluZm8oU3RyaW5nIGFyZzApIHsKKwkJc3VwZXIoYXJnMCk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdE5hdGl2ZSgpIHRocm93cyBFeGNlcHRpb24geworCQorCQkvLyBtb3VudCBwb2ludAorICAgICAgIElWb2x1bWVbXSBhID0gTG9jYWxTeXN0ZW1JbmZvLmdldFZvbHVtZXMoKTsKKyAgICAgICAgaWYgKGE9PW51bGwpIHRocm93IG5ldyBFeGNlcHRpb24oImNhbm5vdCBmaW5kIG5hdGl2ZSBsaWJyYXJ5Iik7CisJCVN5c3RlbS5vdXQucHJpbnRsbigiRm91bmQgIithLmxlbmd0aCsiIG1vdW50IHBvaW50cy4iKTsKKwkJZm9yIChpbnQgaSA9MDsgaTxhLmxlbmd0aDtpKyspeworCQkJU3lzdGVtLm91dC5wcmludCgiIyIraSsiIC0gIithW2ldKTsKKwkJCQorCQkJRmlsZSByb290ID0gYVtpXS5nZXRGaWxlKCk7CisJCQlTdHJpbmcgbGFiZWwgPSBhW2ldLmdldExhYmVsKCk7CisJCQlpZiAobGFiZWw9PW51bGwpIGxhYmVsPSJOTyBMQUJFTCI7CisJCQlpbnQgdHlwZSA9IGFbaV0uZ2V0VHlwZSgpOworCQkJbG9uZyBzaXplID0gTG9jYWxTeXN0ZW1JbmZvLmdldEZyZWVTcGFjZShyb290KTsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiIC0+OiIrbGFiZWwrIjoiK2dldFR5cGUodHlwZSkrIjoiK2dldFNpemUoc2l6ZSkpOworCQl9CisJfQorCQorCXByaXZhdGUgU3RyaW5nIGdldFR5cGUoaW50IHR5cGUpeworCQlzd2l0Y2ggKHR5cGUpIHsKKwkJCWNhc2UgTG9jYWxTeXN0ZW1JbmZvLlZPTFVNRV9GSVhFRCA6CisJCQkJcmV0dXJuICJWT0xVTUUgRklYRUQiOworCQkJY2FzZSBMb2NhbFN5c3RlbUluZm8uVk9MVU1FX1JFTU9URSA6CisJCQkJcmV0dXJuICJWT0xVTUUgUkVNT1RFIjsKKwkJCWNhc2UgTG9jYWxTeXN0ZW1JbmZvLlZPTFVNRV9SRU1PVkFCTEUgOgorCQkJCXJldHVybiAiVk9MVU1FIFJFTU9WQUJMRSI7CisJCQljYXNlIExvY2FsU3lzdGVtSW5mby5WT0xVTUVfQ0RST00gOgorCQkJCXJldHVybiAiVk9MVU1FIENEUk9NIjsJCQkJCisJCQljYXNlIExvY2FsU3lzdGVtSW5mby5WT0xVTUVfVU5LTk9XTiA6CisJCQkJcmV0dXJuICJWT0xVTUUgVU5LTk9XTiI7CisJCQlkZWZhdWx0IDoKKwkJCQlyZXR1cm4gIldST05HIFZPTFVNRSBJTkZPIjsKKwkJfQorCX0KKwkKKwlwcml2YXRlIFN0cmluZyBnZXRTaXplKGxvbmcgc2l6ZSl7CisJCWlmIChzaXplPT1Mb2NhbFN5c3RlbUluZm8uU0laRV9VTktOT1dOKSByZXR1cm4gIlVOS05PV04gU0laRSI7CisJCQorCQlsb25nIGtiID0gc2l6ZS8oMTAyNCoxMDI0KTsKKwkJcmV0dXJuIG5ldyBTdHJpbmcoc2l6ZSsiICgiK2tiKyJNQikiKTsKKwl9Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9uZXN0ZWRmZWF0dXJlcy9BbGxOZXN0ZWRUZXN0cy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbmVzdGVkZmVhdHVyZXMvQWxsTmVzdGVkVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWU2ZmI0Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbmVzdGVkZmVhdHVyZXMvQWxsTmVzdGVkVGVzdHMuamF2YQpAQCAtMCwwICsxLDMyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLm5lc3RlZGZlYXR1cmVzOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLio7CisKK3B1YmxpYyBjbGFzcyBBbGxOZXN0ZWRUZXN0cyBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7CitwdWJsaWMgQWxsTmVzdGVkVGVzdHMoU3RyaW5nIG5hbWUpIHsKKwlzdXBlcihuYW1lKTsKK30KK3B1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKKwlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7CisJc3VpdGUuc2V0TmFtZSgiTmVzdGVkIEluc3RhbGwgVGVzdHMiKTsKKwkKKwkvLyB0aGUgZm9sbG93aW5nIHdpbGwgdGFrZSBhbGwgdGVoIHRlc3QgbWV0aG9kcyBpbiB0ZWggY2xhc3MgdGhhdCBzdGFydCB3aXRoICd0ZXN0JworCisJc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RJbnN0YWxsLmNsYXNzKSk7CisKKwkvLyBvciB5b3UgY2FuIHNwZWNpZnkgdGhlIG1ldGhvZAorCS8vc3VpdGUuYWRkVGVzdChuZXcgVGVzdEdldEZlYXR1cmUoIm1ldGhvZFRoYXREb2VzTm90U3RhcnRXaXRodGVzdCIpKTsJCisJCisJcmV0dXJuIHN1aXRlOworfQorfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbmVzdGVkZmVhdHVyZXMvVGVzdEluc3RhbGwuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL25lc3RlZGZlYXR1cmVzL1Rlc3RJbnN0YWxsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc4ZmM3ZQotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL25lc3RlZGZlYXR1cmVzL1Rlc3RJbnN0YWxsLmphdmEKQEAgLTAsMCArMSwzMDEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMubmVzdGVkZmVhdHVyZXM7CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEubmV0LlVSTDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlTWFuYWdlclRlc3RDYXNlOworCitwdWJsaWMgY2xhc3MgVGVzdEluc3RhbGwgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2UgeworCisJLyoqCisJICogQ29uc3RydWN0b3IgZm9yIFRlc3QxCisJICovCisJcHVibGljIFRlc3RJbnN0YWxsKFN0cmluZyBhcmcwKSB7CisJCXN1cGVyKGFyZzApOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RGaWxlU2l0ZSgpIHRocm93cyBFeGNlcHRpb24geworCQkKKwkJLy9jbGVhbnVwIHRhcmdldCAKKwkJRmlsZSB0YXJnZXQgPSBuZXcgRmlsZShUQVJHRVRfRklMRV9TSVRFLmdldEZpbGUoKSk7CisJCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbSh0YXJnZXQpOwkJCisJCUluc3RhbGxSZWdpc3RyeS5jbGVhbnVwKCk7CisJCQorCisJCUlTaXRlIHJlbW90ZVNpdGUgPQorCQkJU2l0ZU1hbmFnZXIuZ2V0U2l0ZShuZXcgVVJMKFNPVVJDRV9GSUxFX1NJVEUsICJuZXN0ZWRGZWF0dXJlU2l0ZVRlc3Qvc2l0ZS54bWwiKSxudWxsKTsKKwkJSUZlYXR1cmUgcmVtb3RlRmVhdHVyZSA9IHJlbW90ZVNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKVswXS5nZXRGZWF0dXJlKG51bGwpOworCQlJU2l0ZSBsb2NhbFNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKFRBUkdFVF9GSUxFX1NJVEUsbnVsbCk7CisJCWxvY2FsU2l0ZS5pbnN0YWxsKHJlbW90ZUZlYXR1cmUsIG51bGwsIG51bGwpOworCisJCS8vIHZlcmlmeSByb290IEZlYXR1cmUKKwkJU3RyaW5nIHNpdGUgPSBsb2NhbFNpdGUuZ2V0VVJMKCkuZ2V0RmlsZSgpOworCQlJUGx1Z2luRW50cnlbXSBlbnRyaWVzID0gcmVtb3RlRmVhdHVyZS5nZXRQbHVnaW5FbnRyaWVzKCk7CisJCWFzc2VydFRydWUoIm5vIHBsdWdpbnMgZW50cnkiLCAoZW50cmllcyAhPSBudWxsICYmIGVudHJpZXMubGVuZ3RoICE9IDApKTsKKwkJU3RyaW5nIHBsdWdpbk5hbWUgPSBlbnRyaWVzWzBdLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpOworCQlGaWxlIHBsdWdpbkZpbGUgPSBuZXcgRmlsZShzaXRlLCBTaXRlLkRFRkFVTFRfUExVR0lOX1BBVEggKyBwbHVnaW5OYW1lKTsKKwkJYXNzZXJ0VHJ1ZSgKKwkJCSJwbHVnaW4gZmlsZXMgbm90IGluc3RhbGxlZCBsb2NhbGx5OiIgKyBwbHVnaW5GaWxlLAorCQkJcGx1Z2luRmlsZS5leGlzdHMoKSk7CisJCUZpbGUgcGx1Z2luWE1MRmlsZSA9CisJCQluZXcgRmlsZSgKKwkJCQlzaXRlLAorCQkJCVNpdGUuREVGQVVMVF9QTFVHSU5fUEFUSCArIHBsdWdpbk5hbWUgKyBGaWxlLnNlcGFyYXRvciArICJwbHVnaW4ueG1sIik7CisJCWFzc2VydFRydWUoInBsdWdpbi54bWwgZmlsZSBub3QgaW5zdGFsbGVkIGxvY2FsbHkiLCBwbHVnaW5YTUxGaWxlLmV4aXN0cygpKTsKKworCQlGaWxlIGZlYXR1cmVGaWxlID0KKwkJCW5ldyBGaWxlKAorCQkJCXNpdGUsCisJCQkJU2l0ZS5ERUZBVUxUX0lOU1RBTExFRF9GRUFUVVJFX1BBVEgKKwkJCQkJKyByZW1vdGVGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKTsKKwkJYXNzZXJ0VHJ1ZSgKKwkJCSJmZWF0dXJlIGluZm8gbm90IGluc3RhbGxlZCBsb2NhbGx5OiIgKyBmZWF0dXJlRmlsZSwKKwkJCWZlYXR1cmVGaWxlLmV4aXN0cygpKTsKKworCQkvLyBjbGVhbiBwbHVnaW5zICYgZmVhdHVyZQorCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKKwkJCXBsdWdpbk5hbWUgPSBlbnRyaWVzW2ldLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpOworCQkJcGx1Z2luRmlsZSA9IG5ldyBGaWxlKHNpdGUsIFNpdGUuREVGQVVMVF9QTFVHSU5fUEFUSCArIHBsdWdpbk5hbWUpOworCQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKHBsdWdpbkZpbGUpOworCQkJSW5zdGFsbFJlZ2lzdHJ5LnVucmVnaXN0ZXJQbHVnaW4oZW50cmllc1tpXSk7CisJCX0KKwkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGZlYXR1cmVGaWxlKTsKKworCQkvLyB2ZXJpZnkgY2hpbGQgRmVhdHVyZQorCQlJRmVhdHVyZSBjaGlsZEZlYXR1cmUgPQorCQkJcmVtb3RlRmVhdHVyZS5nZXRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKClbMF0uZ2V0RmVhdHVyZShudWxsKTsKKwkJZW50cmllcyA9IGNoaWxkRmVhdHVyZS5nZXRQbHVnaW5FbnRyaWVzKCk7CisJCWFzc2VydFRydWUoIm5vIHBsdWdpbnMgZW50cnkiLCAoZW50cmllcyAhPSBudWxsICYmIGVudHJpZXMubGVuZ3RoICE9IDApKTsKKwkJcGx1Z2luTmFtZSA9IGVudHJpZXNbMF0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCk7CisJCXBsdWdpbkZpbGUgPSBuZXcgRmlsZShzaXRlLCBTaXRlLkRFRkFVTFRfUExVR0lOX1BBVEggKyBwbHVnaW5OYW1lKTsKKwkJYXNzZXJ0VHJ1ZSgKKwkJCSJwbHVnaW4gZmlsZXMgbm90IGluc3RhbGxlZCBsb2NhbGx5OiIgKyBwbHVnaW5GaWxlLAorCQkJcGx1Z2luRmlsZS5leGlzdHMoKSk7CisJCXBsdWdpblhNTEZpbGUgPQorCQkJbmV3IEZpbGUoCisJCQkJc2l0ZSwKKwkJCQlTaXRlLkRFRkFVTFRfUExVR0lOX1BBVEggKyBwbHVnaW5OYW1lICsgRmlsZS5zZXBhcmF0b3IgKyAicGx1Z2luLnhtbCIpOworCQlhc3NlcnRUcnVlKCJwbHVnaW4ueG1sIGZpbGUgbm90IGluc3RhbGxlZCBsb2NhbGx5IiwgcGx1Z2luWE1MRmlsZS5leGlzdHMoKSk7CisKKwkJZmVhdHVyZUZpbGUgPQorCQkJbmV3IEZpbGUoCisJCQkJc2l0ZSwKKwkJCQlTaXRlLkRFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfUEFUSAorCQkJCQkrIGNoaWxkRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSk7CisJCWFzc2VydFRydWUoCisJCQkiZmVhdHVyZSBpbmZvIG5vdCBpbnN0YWxsZWQgbG9jYWxseToiICsgZmVhdHVyZUZpbGUsCisJCQlmZWF0dXJlRmlsZS5leGlzdHMoKSk7CisKKwkJLy8gY2xlYW4gcGx1Z2lucworCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKKwkJCXBsdWdpbk5hbWUgPSBlbnRyaWVzWzBdLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpOworCQkJcGx1Z2luRmlsZSA9IG5ldyBGaWxlKHNpdGUsIFNpdGUuREVGQVVMVF9QTFVHSU5fUEFUSCArIHBsdWdpbk5hbWUpOworCQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKHBsdWdpbkZpbGUpOworCQl9CisKKwkJLy8gY2xlYW4gZmVhdHVyZXMKKwkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGZlYXR1cmVGaWxlKTsKKwkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKG5ldyBGaWxlKGxvY2FsU2l0ZS5nZXRVUkwoKS5nZXRGaWxlKCkpKTsKKwkJSW5zdGFsbFJlZ2lzdHJ5LmNsZWFudXAoKTsKKwl9CisKKwkvKioKKwkgKiAKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0SFRUUFNpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlJU2l0ZSByZW1vdGVTaXRlID0KKwkJCVNpdGVNYW5hZ2VyLmdldFNpdGUobmV3IFVSTChTT1VSQ0VfSFRUUF9TSVRFLCAibmVzdGVkRmVhdHVyZVNpdGVUZXN0LyIpLG51bGwpOworCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGZlYXR1cmVzID0gcmVtb3RlU2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpOworCQlJRmVhdHVyZSByZW1vdGVGZWF0dXJlID0gbnVsbDsKKworCQlpZiAoZmVhdHVyZXMgPT0gbnVsbCB8fCBmZWF0dXJlcy5sZW5ndGggPT0gMCkKKwkJCWZhaWwoIk5vIGZlYXR1cmVzIG9uIHRoZSBzaXRlIik7CisKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5sZW5ndGg7IGkrKykgeworCQkJaWYgKGZlYXR1cmVzW2ldLmdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkuZW5kc1dpdGgoInJvb3RmZWF0dXJlLmphciIpKSB7CisJCQkJcmVtb3RlRmVhdHVyZSA9IGZlYXR1cmVzW2ldLmdldEZlYXR1cmUobnVsbCk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlhc3NlcnROb3ROdWxsKCJDYW5ub3QgZmluZCByb290ZmVhdHVyZS5qYXIgb24gc2l0ZSIsIHJlbW90ZUZlYXR1cmUpOworCQlJU2l0ZSBsb2NhbFNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKFRBUkdFVF9GSUxFX1NJVEUsbnVsbCk7CisJCWxvY2FsU2l0ZS5pbnN0YWxsKHJlbW90ZUZlYXR1cmUsIG51bGwsIG51bGwpOworCisJCS8vIHJvb3RmZWF0dXJlLmphciBzaG91bGQgbm90IGJlIGluIHRoZSBsb2NhbCBzaXRlCisJCUlGZWF0dXJlUmVmZXJlbmNlW10gbG9jYWxGZWF0dXJlcyA9IGxvY2FsU2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpOworCQlpZiAobG9jYWxGZWF0dXJlcyA9PSBudWxsIHx8IGxvY2FsRmVhdHVyZXMubGVuZ3RoID09IDApCisJCQlmYWlsKCJObyBmZWF0dXJlcyBvbiB0aGUgdGFyZ2V0IHNpdGUiKTsKKworCQlib29sZWFuIGZvdW5kID0gZmFsc2U7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbG9jYWxGZWF0dXJlcy5sZW5ndGg7IGkrKykgeworCQkJaWYgKGxvY2FsRmVhdHVyZXNbaV0uZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKS5lbmRzV2l0aCgicm9vdGZlYXR1cmUuamFyIikpIHsKKwkJCQlmb3VuZCA9IHRydWU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlhc3NlcnRUcnVlKAorCQkJIkZvdW5kIHJvb3RmZWF0dXJlLmphciBvbiB0YXJnZXQgc2l0ZS4gVGFyZ2V0IHNpdGUgZmVhdHVyZSByZWYgc2hvdWxkbm90IGNvbnRhaW4gSkFSIGZpbGUiLAorCQkJIWZvdW5kKTsKKworCQkvLyBjaGVjayByb290CisJCVN0cmluZyBzaXRlID0gbG9jYWxTaXRlLmdldFVSTCgpLmdldEZpbGUoKTsKKwkJSVBsdWdpbkVudHJ5W10gZW50cmllcyA9IHJlbW90ZUZlYXR1cmUuZ2V0UGx1Z2luRW50cmllcygpOworCQlhc3NlcnRUcnVlKCJubyBwbHVnaW5zIGVudHJ5IiwgKGVudHJpZXMgIT0gbnVsbCAmJiBlbnRyaWVzLmxlbmd0aCAhPSAwKSk7CisKKwkJU3RyaW5nIHBsdWdpbk5hbWUgPSBlbnRyaWVzWzBdLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpOworCQlGaWxlIHBsdWdpbkZpbGUgPSBuZXcgRmlsZShzaXRlLCBTaXRlLkRFRkFVTFRfUExVR0lOX1BBVEggKyBwbHVnaW5OYW1lKTsKKwkJYXNzZXJ0VHJ1ZSgKKwkJCSJwbHVnaW4gZmlsZXMgbm90IGluc3RhbGxlZCBsb2NhbGx5OiIgKyBwbHVnaW5GaWxlLAorCQkJcGx1Z2luRmlsZS5leGlzdHMoKSk7CQkKKwkJRmlsZSBwbHVnaW5YTUxGaWxlID0gbmV3IEZpbGUoc2l0ZSwgU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRIICsgcGx1Z2luTmFtZSsgRmlsZS5zZXBhcmF0b3IgKyAicGx1Z2luLnhtbCIpOworCQlhc3NlcnRUcnVlKAorCQkJInBsdWdpbiBpbmZvIG5vdCBpbnN0YWxsZWQgbG9jYWxseToiICsgcGx1Z2luWE1MRmlsZSwKKwkJCXBsdWdpblhNTEZpbGUuZXhpc3RzKCkpOworCisJCUZpbGUgZmVhdHVyZUZpbGUgPQorCQkJbmV3IEZpbGUoCisJCQkJc2l0ZSwKKwkJCQlTaXRlLkRFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfUEFUSAorCQkJCQkrIHJlbW90ZUZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpOworCQlhc3NlcnRUcnVlKCJmZWF0dXJlIGluZm8gbm90IGluc3RhbGxlZCBsb2NhbGx5IiwgZmVhdHVyZUZpbGUuZXhpc3RzKCkpOworCisJCS8vIGNsZWFuIHBsdWdpbnMgJiBmZWF0dXJlCisJCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgeworCQkJcGx1Z2luTmFtZSA9IGVudHJpZXNbaV0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCk7CisJCQlwbHVnaW5GaWxlID0gbmV3IEZpbGUoc2l0ZSwgU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRIICsgcGx1Z2luTmFtZSk7CisJCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0ocGx1Z2luRmlsZSk7CisJCQlJbnN0YWxsUmVnaXN0cnkudW5yZWdpc3RlclBsdWdpbihlbnRyaWVzW2ldKTsKKwkJfQorCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0oZmVhdHVyZUZpbGUpOworCisJCS8vIHZlcmlmeSBjaGlsZCBGZWF0dXJlCisJCUlGZWF0dXJlIGNoaWxkRmVhdHVyZSA9CisJCQlyZW1vdGVGZWF0dXJlLmdldEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKVswXS5nZXRGZWF0dXJlKG51bGwpOworCQllbnRyaWVzID0gY2hpbGRGZWF0dXJlLmdldFBsdWdpbkVudHJpZXMoKTsKKwkJYXNzZXJ0VHJ1ZSgibm8gcGx1Z2lucyBlbnRyeSIsIChlbnRyaWVzICE9IG51bGwgJiYgZW50cmllcy5sZW5ndGggIT0gMCkpOworCQlwbHVnaW5OYW1lID0gZW50cmllc1swXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKTsKKwkJcGx1Z2luRmlsZSA9IG5ldyBGaWxlKHNpdGUsIFNpdGUuREVGQVVMVF9QTFVHSU5fUEFUSCArIHBsdWdpbk5hbWUpOworCQlhc3NlcnRUcnVlKAorCQkJInBsdWdpbiBmaWxlcyBub3QgaW5zdGFsbGVkIGxvY2FsbHk6IiArIHBsdWdpbkZpbGUsCisJCQlwbHVnaW5GaWxlLmV4aXN0cygpKTsKKwkJcGx1Z2luWE1MRmlsZSA9CisJCQluZXcgRmlsZSgKKwkJCQlzaXRlLAorCQkJCVNpdGUuREVGQVVMVF9QTFVHSU5fUEFUSCArIHBsdWdpbk5hbWUgKyBGaWxlLnNlcGFyYXRvciArICJwbHVnaW4ueG1sIik7CisJCWFzc2VydFRydWUoInBsdWdpbi54bWwgZmlsZSBub3QgaW5zdGFsbGVkIGxvY2FsbHkiLCBwbHVnaW5YTUxGaWxlLmV4aXN0cygpKTsKKworCQlmZWF0dXJlRmlsZSA9CisJCQluZXcgRmlsZSgKKwkJCQlzaXRlLAorCQkJCVNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRICisJCQkJCSsgY2hpbGRGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKTsKKwkJYXNzZXJ0VHJ1ZSgKKwkJCSJmZWF0dXJlIGluZm8gbm90IGluc3RhbGxlZCBsb2NhbGx5OiIgKyBmZWF0dXJlRmlsZSwKKwkJCWZlYXR1cmVGaWxlLmV4aXN0cygpKTsKKworCQkvLyBjbGVhbiBwbHVnaW5zCisJCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgeworCQkJcGx1Z2luTmFtZSA9IGVudHJpZXNbMF0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCk7CisJCQlwbHVnaW5GaWxlID0gbmV3IEZpbGUoc2l0ZSwgU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRIICsgcGx1Z2luTmFtZSk7CisJCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0ocGx1Z2luRmlsZSk7CisJCX0KKworCQkvLyBjbGVhbiBmZWF0dXJlcworCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0oZmVhdHVyZUZpbGUpOworCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obmV3IEZpbGUobG9jYWxTaXRlLmdldFVSTCgpLmdldEZpbGUoKSkpOworCX0KKworLy8JcHVibGljIHZvaWQgdGVzdEluc3RhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKy8vCisvLwkJLy8gY2xlYW51cCBsb2NhbCBmaWxlcy4uLgorLy8JCVVSTCBsb2NhbFVSTCA9ICgoTG9jYWxTaXRlKSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKSkuZ2V0TG9jYXRpb25VUkwoKTsKKy8vCQlGaWxlIGxvY2FsRmlsZSA9IG5ldyBGaWxlKGxvY2FsVVJMLmdldEZpbGUoKSk7CisvLwkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGxvY2FsRmlsZSk7CisvLwkJSW5zdGFsbFJlZ2lzdHJ5LmNsZWFudXAoKTsKKy8vCisvLwkJVVJMIElOU1RBTExfU0lURSA9IG51bGw7CisvLwkJdHJ5IHsKKy8vCQkJSU5TVEFMTF9TSVRFID0gbmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFLCAibmVzdGVkRmVhdHVyZVNpdGVUZXN0L3NpdGUueG1sIik7CisvLwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKy8vCQkJZmFpbChlLnRvU3RyaW5nKCkpOworLy8JCQllLnByaW50U3RhY2tUcmFjZSgpOworLy8JCX0KKy8vCisvLwkJSVNpdGUgcmVtb3RlU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoSU5TVEFMTF9TSVRFLG51bGwpOworLy8JCUlGZWF0dXJlUmVmZXJlbmNlW10gZmVhdHVyZXMgPSByZW1vdGVTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7CisvLwkJSUZlYXR1cmUgcmVtb3RlRmVhdHVyZSA9IG51bGw7CisvLworLy8JCWlmIChmZWF0dXJlcyA9PSBudWxsIHx8IGZlYXR1cmVzLmxlbmd0aCA9PSAwKQorLy8JCQlmYWlsKCJObyBmZWF0dXJlcyBvbiB0aGUgc2l0ZSIpOworLy8KKy8vCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7CisvLwkJCWlmIChmZWF0dXJlc1tpXS5nZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpLmVuZHNXaXRoKCJyb290ZmVhdHVyZS5qYXIiKSkgeworLy8JCQkJcmVtb3RlRmVhdHVyZSA9IGZlYXR1cmVzW2ldLmdldEZlYXR1cmUobnVsbCk7CisvLwkJCQlicmVhazsKKy8vCQkJfQorLy8JCX0KKy8vCisvLwkJYXNzZXJ0Tm90TnVsbCgiQ2Fubm90IGZpbmQgcm9vdGZlYXR1cmUuamFyIG9uIHNpdGUiLCByZW1vdGVGZWF0dXJlKTsKKy8vCQlJTG9jYWxTaXRlIGxvY2FsU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpOworLy8JCUlDb25maWd1cmVkU2l0ZSBzaXRlID0KKy8vCQkJbG9jYWxTaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkuZ2V0Q29uZmlndXJlZFNpdGVzKClbMF07CisvLworLy8JCSgoQ29uZmlndXJlZFNpdGUpc2l0ZSkuc2V0VXBkYXRhYmxlKHRydWUpOworLy8JCXNpdGUuaW5zdGFsbChyZW1vdGVGZWF0dXJlLCBudWxsLCBudWxsKTsKKy8vCisvLwkJSVBsdWdpbkVudHJ5W10gZW50cmllcyA9IHJlbW90ZUZlYXR1cmUuZ2V0UGx1Z2luRW50cmllcygpOworLy8JCWFzc2VydFRydWUoIm5vIHBsdWdpbnMgZW50cnkiLCAoZW50cmllcyAhPSBudWxsICYmIGVudHJpZXMubGVuZ3RoICE9IDApKTsKKy8vCisvLwkJU3RyaW5nIHNpdGVQYXRoID0gc2l0ZS5nZXRTaXRlKCkuZ2V0VVJMKCkuZ2V0RmlsZSgpOworLy8JCVN0cmluZyBwbHVnaW5OYW1lID0gZW50cmllc1swXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKTsKKy8vCQlGaWxlIHBsdWdpbkZpbGUgPSBuZXcgRmlsZShzaXRlUGF0aCwgU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRIICsgcGx1Z2luTmFtZSk7CisvLwkJYXNzZXJ0VHJ1ZSgicGx1Z2luIGluZm8gbm90IGluc3RhbGxlZCBsb2NhbGx5IitwbHVnaW5GaWxlLCBwbHVnaW5GaWxlLmV4aXN0cygpKTsKKy8vCisvLwkJRmlsZSBmZWF0dXJlRmlsZSA9CisvLwkJCW5ldyBGaWxlKAorLy8JCQkJc2l0ZVBhdGgsCisvLwkJCQlTaXRlLkRFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfUEFUSAorLy8JCQkJCSsgcmVtb3RlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSk7CisvLwkJYXNzZXJ0VHJ1ZSgiZmVhdHVyZSBpbmZvIG5vdCBpbnN0YWxsZWQgbG9jYWxseSIsIGZlYXR1cmVGaWxlLmV4aXN0cygpKTsKKy8vCisvLwkJLy9jbGVhbnVwCisvLwkJRmlsZSBmaWxlID0KKy8vCQkJbmV3IEZpbGUoCisvLwkJCQlzaXRlLmdldFNpdGUoKS5nZXRVUkwoKS5nZXRGaWxlKCkKKy8vCQkJCQkrIEZpbGUuc2VwYXJhdG9yCisvLwkJCQkJKyBTaXRlLkRFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfUEFUSAorLy8JCQkJCSsgcmVtb3RlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkpOworLy8JCS8vIGNsZWFuIHBsdWdpbnMKKy8vCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKKy8vCQkJcGx1Z2luTmFtZSA9IGVudHJpZXNbMF0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCk7CisvLwkJCXBsdWdpbkZpbGUgPQorLy8JCQkJbmV3IEZpbGUoCisvLwkJCQkJc2l0ZS5nZXRTaXRlKCkuZ2V0VVJMKCkuZ2V0RmlsZSgpLAorLy8JCQkJCVNpdGUuREVGQVVMVF9QTFVHSU5fUEFUSCArIHBsdWdpbk5hbWUpOworLy8JCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0ocGx1Z2luRmlsZSk7CisvLwkJfQorLy8KKy8vCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0oZmlsZSk7CisvLwkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKHBsdWdpbkZpbGUpOworLy8JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShsb2NhbEZpbGUpOworLy8JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbSgKKy8vCQkJbmV3IEZpbGUoCisvLwkJCQkoKEluc3RhbGxDb25maWd1cmF0aW9uKSBsb2NhbFNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKSkKKy8vCQkJCQkuZ2V0VVJMKCkKKy8vCQkJCQkuZ2V0RmlsZSgpKSk7CisvLwl9Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9wYXJzZXIvQWxsUGFyc2VyVGVzdHMuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3BhcnNlci9BbGxQYXJzZXJUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5NGIyN2QKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9wYXJzZXIvQWxsUGFyc2VyVGVzdHMuamF2YQpAQCAtMCwwICsxLDM1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnBhcnNlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLio7CisKKworcHVibGljIGNsYXNzIEFsbFBhcnNlclRlc3RzIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsKK3B1YmxpYyBBbGxQYXJzZXJUZXN0cyhTdHJpbmcgbmFtZSkgeworCXN1cGVyKG5hbWUpOworfQorcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeworCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKKwlzdWl0ZS5zZXROYW1lKCJQYXJzaW5nIFRlc3RzIik7CisJCisJLy8gdGhlIGZvbGxvd2luZyB3aWxsIHRha2UgYWxsIHRlaCB0ZXN0IG1ldGhvZHMgaW4gdGVoIGNsYXNzIHRoYXQgc3RhcnQgd2l0aCAndGVzdCcKKwlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdEZlYXR1cmVQYXJzZS5jbGFzcykpOworCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShUZXN0U2l0ZVBhcnNlLmNsYXNzKSk7CQorCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShUZXN0Q2F0ZWdvcmllcy5jbGFzcykpOwkJCisJCisJLy8gb3IgeW91IGNhbiBzcGVjaWZ5IHRoZSBtZXRob2QKKwkvL3N1aXRlLmFkZFRlc3QobmV3IFRlc3RHZXRGZWF0dXJlKCJtZXRob2RUaGF0RG9lc05vdFN0YXJ0V2l0aHRlc3QiKSk7CQorCQorCXJldHVybiBzdWl0ZTsKK30KK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3BhcnNlci9UZXN0Q2F0ZWdvcmllcy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcGFyc2VyL1Rlc3RDYXRlZ29yaWVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRiOGExMAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3BhcnNlci9UZXN0Q2F0ZWdvcmllcy5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMucGFyc2VyOworaW1wb3J0IGphdmEubmV0LlVSTDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZU1hbmFnZXJUZXN0Q2FzZTsKKworcHVibGljIGNsYXNzIFRlc3RDYXRlZ29yaWVzIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsKKwkvKioKKwkgKiBDb25zdHJ1Y3RvciBmb3IgVGVzdDEKKwkgKi8KKwlwdWJsaWMgVGVzdENhdGVnb3JpZXMoU3RyaW5nIGFyZzApIHsKKwkJc3VwZXIoYXJnMCk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdENhdGVnb3JpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlVUkwgcmVtb3RlVXJsID0gbmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFICsgInhtbHMvc2l0ZTEvIik7CisJCUlTaXRlIHJlbW90ZVNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKHJlbW90ZVVybCxudWxsKTsKKworCQlJU2l0ZUZlYXR1cmVSZWZlcmVuY2VbXSBmZWF0dXJlID0gcmVtb3RlU2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpOworCQkvL0lDYXRlZ29yeVtdIGNhdGVnb3JpZXMgPSByZW1vdGVTaXRlLmdldENhdGVnb3JpZXMoKTsKKworCQlJQ2F0ZWdvcnkgZmVhdHVyZUNhdGVnb3J5ID0gZmVhdHVyZVswXS5nZXRDYXRlZ29yaWVzKClbMF07CisKKwkJYXNzZXJ0RXF1YWxzKCJVTUwgdG9vbHMiLCBmZWF0dXJlQ2F0ZWdvcnkuZ2V0TGFiZWwoKSk7CisKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0T3JkZXJlZENhdGVnb3JpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlVUkwgcmVtb3RlVXJsID0gbmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFICsgInhtbHMvc2l0ZTEvIik7CisJCUlTaXRlIHJlbW90ZVNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKHJlbW90ZVVybCxudWxsKTsKKworCQlJQ2F0ZWdvcnlbXSBjYXRlZ29yaWVzID0gcmVtb3RlU2l0ZS5nZXRDYXRlZ29yaWVzKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgY2F0ZWdvcmllcy5sZW5ndGg7IGkrKykgeworCQkJU3lzdGVtLm91dC5wcmludGxuKCJDYXQgb3JkZXJlZC0+IiArIGNhdGVnb3JpZXNbaV0uZ2V0TmFtZSgpKTsKKwkJfQorCisJCWFzc2VydEVxdWFscygiRWNsaXBzZSB0b29scyIsIGNhdGVnb3JpZXNbMV0uZ2V0TGFiZWwoKSk7CisKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0VHJhbnNsYXRlZENhdGVnb3JpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlJU2l0ZSByZW1vdGVTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShTT1VSQ0VfSFRUUF9TSVRFLG51bGwpOworCisJCUlDYXRlZ29yeVtdIGNhdGVnb3JpZXMgPSByZW1vdGVTaXRlLmdldENhdGVnb3JpZXMoKTsKKworCQlhc3NlcnRFcXVhbHMoIlJlcXVpcmVkIERyaXZlcnMiLCBjYXRlZ29yaWVzWzBdLmdldExhYmVsKCkpOworCisJfQorfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcGFyc2VyL1Rlc3RGZWF0dXJlUGFyc2UuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3BhcnNlci9UZXN0RmVhdHVyZVBhcnNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY1MzdlNAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3BhcnNlci9UZXN0RmVhdHVyZVBhcnNlLmphdmEKQEAgLTAsMCArMSwxMzIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMucGFyc2VyOworCitpbXBvcnQgamF2YS5uZXQuVVJMOworCitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC5EZWZhdWx0RmVhdHVyZVBhcnNlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC5GZWF0dXJlTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuVVJMRW50cnlNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb247CisKK3B1YmxpYyBjbGFzcyBUZXN0RmVhdHVyZVBhcnNlIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsKKworCS8qKgorCSAqIENvbnN0cnVjdG9yIGZvciBUZXN0MQorCSAqLworCXB1YmxpYyBUZXN0RmVhdHVyZVBhcnNlKFN0cmluZyBhcmcwKSB7CisJCXN1cGVyKGFyZzApOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RQYXJzZSgpIHRocm93cyBFeGNlcHRpb24geworCisJCVN0cmluZyB4bWxGaWxlID0gInhtbHMvZmVhdHVyZV8xLjAuMC8iOworCQlJU2l0ZSByZW1vdGVTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShTT1VSQ0VfRklMRV9TSVRFLCBudWxsKTsKKwkJVVJMIHVybCA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwocmVtb3RlU2l0ZS5nZXRVUkwoKSwgeG1sRmlsZSwgbnVsbCk7CisKKwkJU2l0ZUZlYXR1cmVSZWZlcmVuY2UgcmVmID0gbmV3IFNpdGVGZWF0dXJlUmVmZXJlbmNlKCk7CisJCXJlZi5zZXRTaXRlKHJlbW90ZVNpdGUpOworCQlyZWYuc2V0VVJMKHVybCk7CisJCUlGZWF0dXJlIGZlYXR1cmUgPSByZWYuZ2V0RmVhdHVyZShudWxsKTsKKworCQlTdHJpbmcgcHJvdiA9IGZlYXR1cmUuZ2V0UHJvdmlkZXIoKTsKKwkJYXNzZXJ0RXF1YWxzKCJPYmplY3QgVGVjaG5vbG9neSBJbnRlcm5hdGlvbmFsIiwgcHJvdik7CisKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0UGFyc2VWYWxpZDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQl0cnkgeworCQkJVVJMIHJlbW90ZVVSTCA9IG5ldyBVUkwoU09VUkNFX0ZJTEVfU0lURSArICJwYXJzZXJ0ZXN0cy9mZWF0dXJlMS54bWwiKTsKKwkJCURlZmF1bHRGZWF0dXJlUGFyc2VyIHBhcnNlciA9IG5ldyBEZWZhdWx0RmVhdHVyZVBhcnNlcigpOworCQkJcGFyc2VyLmluaXQobmV3IEZlYXR1cmVFeGVjdXRhYmxlRmFjdG9yeSgpKTsKKwkJCVVSTCByZXNvbHZlZFVSTCA9IFVSTEVuY29kZXIuZW5jb2RlKHJlbW90ZVVSTCk7CisJCQlGZWF0dXJlTW9kZWwgcmVtb3RlRmVhdHVyZSA9IHBhcnNlci5wYXJzZShyZXNvbHZlZFVSTC5vcGVuU3RyZWFtKCkpOworCQkJcmVtb3RlRmVhdHVyZS5yZXNvbHZlKHJlbW90ZVVSTCwgbnVsbCk7CisKKwkJfSBjYXRjaCAoU0FYUGFyc2VFeGNlcHRpb24gZSkgeworCQkJZmFpbCgiRXhjZXB0aW9uIHNob3VsZCBOT1QgYmUgdGhyb3duIik7CisJCX0KKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0UGFyc2VWYWxpZDFiaXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQl0cnkgeworCQkJVVJMIHJlbW90ZVVSTCA9IG5ldyBVUkwoU09VUkNFX0ZJTEVfU0lURSArICJwYXJzZXJ0ZXN0cy9mZWF0dXJlMWJpcy54bWwiKTsKKwkJCURlZmF1bHRGZWF0dXJlUGFyc2VyIHBhcnNlciA9IG5ldyBEZWZhdWx0RmVhdHVyZVBhcnNlcigpOworCQkJcGFyc2VyLmluaXQobmV3IEZlYXR1cmVFeGVjdXRhYmxlRmFjdG9yeSgpKTsKKwkJCVVSTCByZXNvbHZlZFVSTCA9IFVSTEVuY29kZXIuZW5jb2RlKHJlbW90ZVVSTCk7CisJCQlGZWF0dXJlTW9kZWwgcmVtb3RlRmVhdHVyZSA9IHBhcnNlci5wYXJzZShyZXNvbHZlZFVSTC5vcGVuU3RyZWFtKCkpOworCQkJcmVtb3RlRmVhdHVyZS5yZXNvbHZlKHJlbW90ZVVSTCwgbnVsbCk7CisKKwkJfSBjYXRjaCAoU0FYUGFyc2VFeGNlcHRpb24gZSkgeworCQkJZmFpbCgiRXhjZXB0aW9uIHNob3VsZCBOT1QgYmUgdGhyb3duIik7CisJCX0KKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0UGFyc2VWYWxpZDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQl0cnkgeworCQkJVVJMIHJlbW90ZVVSTCA9IG5ldyBVUkwoU09VUkNFX0ZJTEVfU0lURSArICJwYXJzZXJ0ZXN0cy9mZWF0dXJlMi54bWwiKTsKKwkJCURlZmF1bHRGZWF0dXJlUGFyc2VyIHBhcnNlciA9IG5ldyBEZWZhdWx0RmVhdHVyZVBhcnNlcigpOworCQkJcGFyc2VyLmluaXQobmV3IEZlYXR1cmVFeGVjdXRhYmxlRmFjdG9yeSgpKTsKKwkJCVVSTCByZXNvbHZlZFVSTCA9IFVSTEVuY29kZXIuZW5jb2RlKHJlbW90ZVVSTCk7CisJCQlGZWF0dXJlTW9kZWwgcmVtb3RlRmVhdHVyZSA9IHBhcnNlci5wYXJzZShyZXNvbHZlZFVSTC5vcGVuU3RyZWFtKCkpOworCQkJcmVtb3RlRmVhdHVyZS5yZXNvbHZlKHJlbW90ZVVSTCwgbnVsbCk7CisKKwkJfSBjYXRjaCAoU0FYUGFyc2VFeGNlcHRpb24gZSkgeworCQkJZmFpbCgiRXhjZXB0aW9uIHNob3VsZCBub3QgYmUgdGhyb3duIiArIGUuZ2V0TWVzc2FnZSgpKTsKKwkJfQorCX0KKworCXB1YmxpYyB2b2lkIHRlc3RQYXJzZVZhbGlkMygpIHRocm93cyBFeGNlcHRpb24geworCisJCXRyeSB7CisJCQlVUkwgcmVtb3RlVVJMID0gbmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFICsgInBhcnNlcnRlc3RzL2ZlYXR1cmUzLnhtbCIpOworCQkJRGVmYXVsdEZlYXR1cmVQYXJzZXIgcGFyc2VyID0gbmV3IERlZmF1bHRGZWF0dXJlUGFyc2VyKCk7CisJCQlwYXJzZXIuaW5pdChuZXcgRmVhdHVyZUV4ZWN1dGFibGVGYWN0b3J5KCkpOworCQkJVVJMIHJlc29sdmVkVVJMID0gVVJMRW5jb2Rlci5lbmNvZGUocmVtb3RlVVJMKTsKKwkJCUZlYXR1cmVNb2RlbCByZW1vdGVGZWF0dXJlID0gcGFyc2VyLnBhcnNlKHJlc29sdmVkVVJMLm9wZW5TdHJlYW0oKSk7CisJCQlyZW1vdGVGZWF0dXJlLnJlc29sdmUocmVtb3RlVVJMLCBudWxsKTsKKworCQkJU3RyaW5nIGNvcHlyaWdodFN0cmluZyA9IHJlbW90ZUZlYXR1cmUuZ2V0Q29weXJpZ2h0TW9kZWwoKS5nZXRVUkwoKS5nZXRGaWxlKCk7CisJCQlib29sZWFuIHJlc29sdmVkID0gY29weXJpZ2h0U3RyaW5nLmluZGV4T2YoU2l0ZU1hbmFnZXIuZ2V0T1MoKSkgIT0gLTE7CisJCQlhc3NlcnRUcnVlKCJDb3B5cmlnaHQgVVJMIG5vdCByZXNvbHZlZDoiICsgY29weXJpZ2h0U3RyaW5nLCByZXNvbHZlZCk7CisJCX0gY2F0Y2ggKFNBWFBhcnNlRXhjZXB0aW9uIGUpIHsKKwkJCWZhaWwoIkV4Y2VwdGlvbiBzaG91bGQgbm90IGJlIHRocm93biIgKyBlLmdldE1lc3NhZ2UoKSk7CisJCX0KKwl9CisKKwkvLyBwYXJzZSB0eXBlCisJcHVibGljIHZvaWQgdGVzdFBhcnNlVmFsaWQ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJdHJ5IHsKKwkJCVVSTCByZW1vdGVVUkwgPSBuZXcgVVJMKFNPVVJDRV9GSUxFX1NJVEUgKyAicGFyc2VydGVzdHMvZmVhdHVyZTQueG1sIik7CisJCQlEZWZhdWx0RmVhdHVyZVBhcnNlciBwYXJzZXIgPSBuZXcgRGVmYXVsdEZlYXR1cmVQYXJzZXIoKTsKKwkJCXBhcnNlci5pbml0KG5ldyBGZWF0dXJlRXhlY3V0YWJsZUZhY3RvcnkoKSk7CisJCQlVUkwgcmVzb2x2ZWRVUkwgPSBVUkxFbmNvZGVyLmVuY29kZShyZW1vdGVVUkwpOworCQkJRmVhdHVyZU1vZGVsIHJlbW90ZUZlYXR1cmUgPSBwYXJzZXIucGFyc2UocmVzb2x2ZWRVUkwub3BlblN0cmVhbSgpKTsKKwkJCXJlbW90ZUZlYXR1cmUucmVzb2x2ZShyZW1vdGVVUkwsIG51bGwpOworCisJCQlVUkxFbnRyeU1vZGVsW10gbW9kZWxzID0gcmVtb3RlRmVhdHVyZS5nZXREaXNjb3ZlcnlTaXRlRW50cnlNb2RlbHMoKTsKKwkJCWFzc2VydFRydWUoIkRpc2NvdmVyeSBtb2RlbCBpcyBub3QgYSBXZWIgTW9kZWwiLCBtb2RlbHNbMF0uZ2V0VHlwZSgpPT1JVVJMRW50cnkuV0VCX1NJVEUpOworCQkJVVJMRW50cnlNb2RlbCBjb3B5cmlnaHQgPSByZW1vdGVGZWF0dXJlLmdldENvcHlyaWdodE1vZGVsKCk7CisJCQlhc3NlcnRUcnVlKCJDb3B5cmlnaHQgbW9kZWwgaXMgbm90IGFuIFVwZGF0ZSBNb2RlbCIsIGNvcHlyaWdodC5nZXRUeXBlKCk9PUlVUkxFbnRyeS5VUERBVEVfU0lURSk7CisJCQkKKwkJfSBjYXRjaCAoU0FYUGFyc2VFeGNlcHRpb24gZSkgeworCQkJZmFpbCgiRXhjZXB0aW9uIHNob3VsZCBub3QgYmUgdGhyb3duIiArIGUuZ2V0TWVzc2FnZSgpKTsKKwkJfQorCX0KKworfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcGFyc2VyL1Rlc3RTaXRlUGFyc2UuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3BhcnNlci9UZXN0U2l0ZVBhcnNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA5MGE3YwotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3BhcnNlci9UZXN0U2l0ZVBhcnNlLmphdmEKQEAgLTAsMCArMSwyODggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMucGFyc2VyOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEubmV0LlVSTDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5TaXRlRmlsZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuVVJMRW5jb2RlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlTWFuYWdlclRlc3RDYXNlOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uOworCitwdWJsaWMgY2xhc3MgVGVzdFNpdGVQYXJzZSBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RvciBmb3IgVGVzdDEKKwkgKi8KKwlwdWJsaWMgVGVzdFNpdGVQYXJzZShTdHJpbmcgYXJnMCkgeworCQlzdXBlcihhcmcwKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0UGFyc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlVUkwgcmVtb3RlVXJsID0gbmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFICsgInhtbHMvc2l0ZTEvIik7CisJCUlTaXRlIHJlbW90ZVNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKHJlbW90ZVVybCxudWxsKTsKKworCQkvL0lGZWF0dXJlUmVmZXJlbmNlW10gZmVhdHVyZSA9IHJlbW90ZVNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsKKwkJLy9JQ2F0ZWdvcnlbXSBjYXRlZ29yaWVzID0gcmVtb3RlU2l0ZS5nZXRDYXRlZ29yaWVzKCk7CisKKwkJU3RyaW5nIHBhdGggPSByZW1vdGVVcmwuZ2V0RmlsZSgpOworCQlTdHJpbmcgcGF0aDIgPSByZW1vdGVTaXRlLmdldERlc2NyaXB0aW9uKCkuZ2V0VVJMKCkuZ2V0RmlsZSgpOworCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUocGF0aCArICJpbmRleC5odG1sIiksIG5ldyBGaWxlKHBhdGgyKSk7CisKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0TnVtYmVyT2ZGZWF0dXJlcygpIHRocm93cyBFeGNlcHRpb24geworCisJCVVSTCByZW1vdGVVUkwgPSBuZXcgVVJMKCJodHRwIiwgZ2V0SHR0cEhvc3QoKSwgZ2V0SHR0cFBvcnQoKSwgYnVuZGxlLmdldFN0cmluZygiSFRUUF9QQVRIXzIiKSk7CisJCUlTaXRlIHJlbW90ZVNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKHJlbW90ZVVSTCxudWxsKTsKKworCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGZlYXR1cmUgPSByZW1vdGVTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7CisJCWFzc2VydEVxdWFscyhmZWF0dXJlLmxlbmd0aCwgMik7CisKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0UGFyc2VWYWxpZDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlVUkwgcmVtb3RlVVJMID0gbmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFICsgInBhcnNlcnRlc3RzL3NpdGUueG1sIik7CisJCURlZmF1bHRTaXRlUGFyc2VyIHBhcnNlciA9IG5ldyBEZWZhdWx0U2l0ZVBhcnNlcigpOworCQlwYXJzZXIuaW5pdChuZXcgU2l0ZUZpbGVGYWN0b3J5KCkpOworCQlVUkwgcmVzb2x2ZWRVUkwgPSBVUkxFbmNvZGVyLmVuY29kZShyZW1vdGVVUkwpOworCQlTaXRlTW9kZWwgcmVtb3RlU2l0ZSA9IHBhcnNlci5wYXJzZShyZXNvbHZlZFVSTC5vcGVuU3RyZWFtKCkpOworCQlyZW1vdGVTaXRlLnJlc29sdmUocmVtb3RlVVJMLCBudWxsKTsKKworCQlGZWF0dXJlUmVmZXJlbmNlTW9kZWxbXSBmZWF0dXJlID0gcmVtb3RlU2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlTW9kZWxzKCk7CisJCUNhdGVnb3J5TW9kZWxbXSBjYXRlZ29yaWVzID0gcmVtb3RlU2l0ZS5nZXRDYXRlZ29yeU1vZGVscygpOworCQlBcmNoaXZlUmVmZXJlbmNlTW9kZWxbXSBhcmNoaXZlcyA9IHJlbW90ZVNpdGUuZ2V0QXJjaGl2ZVJlZmVyZW5jZU1vZGVscygpOworCisJCWFzc2VydFRydWUoIldyb25nIG51bWJlciBvZiBmZWF0dXJlcyIsIGZlYXR1cmUubGVuZ3RoID09IDYpOworCQlhc3NlcnRUcnVlKCJXcm9uZyBudW1iZXIgb2YgY2F0ZWdvcmllcyIsIGNhdGVnb3JpZXMubGVuZ3RoID09IDMpOworCQlhc3NlcnRUcnVlKCJXcm9uZyBudW1iZXIgb2YgYXJjaGl2ZXMiLCBhcmNoaXZlcy5sZW5ndGggPT0gMCk7CisKKwkJU3RyaW5nIHBhdGggPSBuZXcgVVJMKFNPVVJDRV9GSUxFX1NJVEUgKyAicGFyc2VydGVzdHMvIikuZ2V0RmlsZSgpOworCQlTdHJpbmcgcGF0aDIgPSByZW1vdGVTaXRlLmdldERlc2NyaXB0aW9uTW9kZWwoKS5nZXRVUkwoKS5nZXRGaWxlKCk7CisJCWFzc2VydEVxdWFscyhwYXRoICsgImluZGV4Lmh0bWwiLCBwYXRoMik7CisKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0UGFyc2VWYWxpZDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlVUkwgcmVtb3RlVVJMID0gbmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFICsgInBhcnNlcnRlc3RzL3JlZGRvdC54bWwiKTsKKwkJRGVmYXVsdFNpdGVQYXJzZXIgcGFyc2VyID0gbmV3IERlZmF1bHRTaXRlUGFyc2VyKCk7CisJCXBhcnNlci5pbml0KG5ldyBTaXRlRmlsZUZhY3RvcnkoKSk7CisJCVVSTCByZXNvbHZlZFVSTCA9IFVSTEVuY29kZXIuZW5jb2RlKHJlbW90ZVVSTCk7CisJCVNpdGVNb2RlbCByZW1vdGVTaXRlID0gcGFyc2VyLnBhcnNlKHJlc29sdmVkVVJMLm9wZW5TdHJlYW0oKSk7CisJCXJlbW90ZVNpdGUucmVzb2x2ZShyZW1vdGVVUkwsIG51bGwpOworCisJCUZlYXR1cmVSZWZlcmVuY2VNb2RlbFtdIGZlYXR1cmUgPSByZW1vdGVTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VNb2RlbHMoKTsKKwkJQ2F0ZWdvcnlNb2RlbFtdIGNhdGVnb3JpZXMgPSByZW1vdGVTaXRlLmdldENhdGVnb3J5TW9kZWxzKCk7CisJCUFyY2hpdmVSZWZlcmVuY2VNb2RlbFtdIGFyY2hpdmVzID0gcmVtb3RlU2l0ZS5nZXRBcmNoaXZlUmVmZXJlbmNlTW9kZWxzKCk7CisKKwkJYXNzZXJ0VHJ1ZSgiV3JvbmcgbnVtYmVyIG9mIGZlYXR1cmVzIiwgZmVhdHVyZS5sZW5ndGggPT0gMik7CisJCWFzc2VydFRydWUoIldyb25nIG51bWJlciBvZiBjYXRlZ29yaWVzIiwgY2F0ZWdvcmllcy5sZW5ndGggPT0gMSk7CisJCWFzc2VydFRydWUoIldyb25nIG51bWJlciBvZiBhcmNoaXZlcyIsIGFyY2hpdmVzLmxlbmd0aCA9PSAyKTsKKworCQlTdHJpbmcgdmFsaWRlU3RyaW5nID0gIlRoaXMgY2F0ZWdvcnkgY29udGFpbnMgYWxsIG9mIHRoZSA8Y3VycmVudGx5PiBhdmFpbGFibGUgdmVyc2lvbnMgb2YgUmVkIERvdCBmZWF0dXJlLiA8Z3JlZXRpbmc+SGVsbG8sIHdvcmxkITwvZ3JlZXRpbmc+IjsKKwkJYXNzZXJ0RXF1YWxzKHZhbGlkZVN0cmluZywgcmVtb3RlU2l0ZS5nZXRDYXRlZ29yeU1vZGVscygpWzBdLmdldERlc2NyaXB0aW9uTW9kZWwoKS5nZXRBbm5vdGF0aW9uKCkpOworCisJCVN0cmluZyBwYXRoID0gbmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFICsgInBhcnNlcnRlc3RzLyIpLmdldEZpbGUoKTsKKwkJU3RyaW5nIHBhdGgyID0gcmVtb3RlU2l0ZS5nZXREZXNjcmlwdGlvbk1vZGVsKCkuZ2V0VVJMKCkuZ2V0RmlsZSgpOworCQlhc3NlcnRFcXVhbHMocGF0aCArICJpbmRleC5odG1sIiwgcGF0aDIpOworCisJfQorCisJcHVibGljIHZvaWQgdGVzdFBhcnNlVmFsaWQzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJVVJMIHJlbW90ZVVSTCA9IG5ldyBVUkwoU09VUkNFX0ZJTEVfU0lURSArICJwYXJzZXJ0ZXN0cy9yZWRkb3QxLnhtbCIpOworCQlEZWZhdWx0U2l0ZVBhcnNlciBwYXJzZXIgPSBuZXcgRGVmYXVsdFNpdGVQYXJzZXIoKTsKKwkJcGFyc2VyLmluaXQobmV3IFNpdGVGaWxlRmFjdG9yeSgpKTsKKwkJVVJMIHJlc29sdmVkVVJMID0gVVJMRW5jb2Rlci5lbmNvZGUocmVtb3RlVVJMKTsKKwkJU2l0ZU1vZGVsIHJlbW90ZVNpdGUgPSBwYXJzZXIucGFyc2UocmVzb2x2ZWRVUkwub3BlblN0cmVhbSgpKTsKKwkJcmVtb3RlU2l0ZS5yZXNvbHZlKHJlbW90ZVVSTCwgbnVsbCk7CisKKwkJRmVhdHVyZVJlZmVyZW5jZU1vZGVsW10gZmVhdHVyZSA9IHJlbW90ZVNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZU1vZGVscygpOworCQlDYXRlZ29yeU1vZGVsW10gY2F0ZWdvcmllcyA9IHJlbW90ZVNpdGUuZ2V0Q2F0ZWdvcnlNb2RlbHMoKTsKKwkJQXJjaGl2ZVJlZmVyZW5jZU1vZGVsW10gYXJjaGl2ZXMgPSByZW1vdGVTaXRlLmdldEFyY2hpdmVSZWZlcmVuY2VNb2RlbHMoKTsKKworCQlhc3NlcnRUcnVlKCJXcm9uZyBudW1iZXIgb2YgZmVhdHVyZXMiLCBmZWF0dXJlLmxlbmd0aCA9PSAyKTsKKwkJYXNzZXJ0VHJ1ZSgiV3JvbmcgbnVtYmVyIG9mIGNhdGVnb3JpZXMiLCBjYXRlZ29yaWVzLmxlbmd0aCA9PSAxKTsKKwkJYXNzZXJ0VHJ1ZSgiV3JvbmcgbnVtYmVyIG9mIGFyY2hpdmVzIiwgYXJjaGl2ZXMubGVuZ3RoID09IDIpOworCisJCVN0cmluZyB2YWxpZGVTdHJpbmcgPSAiVGhpcyBjYXRlZ29yeSBjb250YWlucyBhbGwgb2YgdGhlIDxjdXJyZW50bHk+IGF2YWlsYWJsZSB2ZXJzaW9ucyBvZiBSZWQgRG90IGZlYXR1cmUuIjsKKwkJYXNzZXJ0RXF1YWxzKHZhbGlkZVN0cmluZywgcmVtb3RlU2l0ZS5nZXRDYXRlZ29yeU1vZGVscygpWzBdLmdldERlc2NyaXB0aW9uTW9kZWwoKS5nZXRBbm5vdGF0aW9uKCkpOworCisJCVN0cmluZyBwYXRoID0gbmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFICsgInBhcnNlcnRlc3RzLyIpLmdldEZpbGUoKTsKKwkJU3RyaW5nIHBhdGgyID0gcmVtb3RlU2l0ZS5nZXREZXNjcmlwdGlvbk1vZGVsKCkuZ2V0VVJMKCkuZ2V0RmlsZSgpOworCQlhc3NlcnRFcXVhbHMocGF0aCArICJpbmRleC5odG1sIiwgcGF0aDIpOworCisJfQorCisJcHVibGljIHZvaWQgdGVzdFBhcnNlVmFsaWQ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJVVJMIHJlbW90ZVVSTCA9IG5ldyBVUkwoU09VUkNFX0ZJTEVfU0lURSArICJTaXRlVVJMVGVzdC9kYXRhL3NpdGUueG1sIik7CisJCURlZmF1bHRTaXRlUGFyc2VyIHBhcnNlciA9IG5ldyBEZWZhdWx0U2l0ZVBhcnNlcigpOworCQlwYXJzZXIuaW5pdChuZXcgU2l0ZUZpbGVGYWN0b3J5KCkpOworCQlVUkwgcmVzb2x2ZWRVUkwgPSBVUkxFbmNvZGVyLmVuY29kZShyZW1vdGVVUkwpOworCQlTaXRlTW9kZWwgcmVtb3RlU2l0ZSA9IHBhcnNlci5wYXJzZShyZXNvbHZlZFVSTC5vcGVuU3RyZWFtKCkpOworCQlyZW1vdGVTaXRlLnJlc29sdmUocmVtb3RlVVJMLCBudWxsKTsKKworCQlGZWF0dXJlUmVmZXJlbmNlTW9kZWxbXSBmZWF0dXJlID0gcmVtb3RlU2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlTW9kZWxzKCk7CisJCS8vQ2F0ZWdvcnlNb2RlbFtdIGNhdGVnb3JpZXMgPSByZW1vdGVTaXRlLmdldENhdGVnb3J5TW9kZWxzKCk7CisJCUFyY2hpdmVSZWZlcmVuY2VNb2RlbFtdIGFyY2hpdmVzID0gcmVtb3RlU2l0ZS5nZXRBcmNoaXZlUmVmZXJlbmNlTW9kZWxzKCk7CisKKwkJYXNzZXJ0VHJ1ZSgiV3JvbmcgbnVtYmVyIG9mIGZlYXR1cmVzIiwgZmVhdHVyZS5sZW5ndGggPT0gMik7CisJCWFzc2VydFRydWUoIldyb25nIG51bWJlciBvZiBhcmNoaXZlcyIsIGFyY2hpdmVzLmxlbmd0aCA9PSAzKTsKKworCQlVUkwgcGF0aDEgPSBuZXcgVVJMKFNPVVJDRV9GSUxFX1NJVEUgKyAiU2l0ZVVSTFRlc3QvZGF0YS9hcnRpZmFjdHMvZmVhdHVyZXMvaGVscEZlYXR1cmUuamFyIik7CisJCVVSTCB1cmwxID0gZmVhdHVyZVswXS5nZXRVUkwoKTsKKwkJYXNzZXJ0RXF1YWxzKHBhdGgxLCB1cmwxKTsKKwkJVVJMIHBhdGgyID0gbmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFICsgIlNpdGVVUkxUZXN0L2RhdGEvYXJ0aWZhY3RzL3BsdWdpbnMvaGVscC5qYXIiKTsKKwkJYXNzZXJ0RXF1YWxzKHBhdGgyLCBhcmNoaXZlc1swXS5nZXRVUkwoKSk7CisKKwkJU3RyaW5nIHBhdGggPSBuZXcgVVJMKFNPVVJDRV9GSUxFX1NJVEUgKyAiU2l0ZVVSTFRlc3QvZGF0YS9pbmZvLyIpLmdldEZpbGUoKTsKKwkJU3RyaW5nIHBhdGgzID0gcmVtb3RlU2l0ZS5nZXREZXNjcmlwdGlvbk1vZGVsKCkuZ2V0VVJMKCkuZ2V0RmlsZSgpOworCQlhc3NlcnRFcXVhbHMocGF0aCArICJzaXRlSW5mby5odG1sIiwgcGF0aDMpOworCisJfQorCisJcHVibGljIHZvaWQgdGVzdFBhcnNlVmFsaWQ1KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJVVJMIHJlbW90ZVVSTCA9IG5ldyBVUkwoU09VUkNFX0ZJTEVfU0lURSArICJwYXJzZXJ0ZXN0cy9zaXRlMi54bWwiKTsKKwkJRGVmYXVsdFNpdGVQYXJzZXIgcGFyc2VyID0gbmV3IERlZmF1bHRTaXRlUGFyc2VyKCk7CisJCXBhcnNlci5pbml0KG5ldyBTaXRlRmlsZUZhY3RvcnkoKSk7CisJCVVSTCByZXNvbHZlZFVSTCA9IFVSTEVuY29kZXIuZW5jb2RlKHJlbW90ZVVSTCk7CisJCVNpdGVNb2RlbCByZW1vdGVTaXRlID0gcGFyc2VyLnBhcnNlKHJlc29sdmVkVVJMLm9wZW5TdHJlYW0oKSk7CisJCXJlbW90ZVNpdGUucmVzb2x2ZShyZW1vdGVVUkwsIG51bGwpOworCisJCUZlYXR1cmVSZWZlcmVuY2VNb2RlbFtdIGZlYXR1cmVSZWYgPSByZW1vdGVTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VNb2RlbHMoKTsKKwkJLy9DYXRlZ29yeU1vZGVsW10gY2F0ZWdvcmllcyA9IHJlbW90ZVNpdGUuZ2V0Q2F0ZWdvcnlNb2RlbHMoKTsKKwkJQXJjaGl2ZVJlZmVyZW5jZU1vZGVsW10gYXJjaGl2ZXMgPSByZW1vdGVTaXRlLmdldEFyY2hpdmVSZWZlcmVuY2VNb2RlbHMoKTsKKworCQlhc3NlcnRUcnVlKCJXcm9uZyBudW1iZXIgb2YgZmVhdHVyZXMiLCBmZWF0dXJlUmVmLmxlbmd0aCA9PSAxKTsKKwkJYXNzZXJ0VHJ1ZSgiV3JvbmcgbnVtYmVyIG9mIGFyY2hpdmVzIiwgYXJjaGl2ZXMubGVuZ3RoID09IDApOworCisJCXRyeSB7CisJCQkoKEZlYXR1cmVSZWZlcmVuY2UpIGZlYXR1cmVSZWZbMF0pLmdldEZlYXR1cmUobnVsbCk7CisJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJVGhyb3dhYmxlIGUxID0gZS5nZXRTdGF0dXMoKS5nZXRFeGNlcHRpb24oKTsKKwkJCWlmIChlMS5nZXRNZXNzYWdlKCkuaW5kZXhPZigibm90LWVjbGlwc2UiKSA9PSAtMSkgeworCQkJCXRocm93IGU7CisJCQl9CisJCX0KKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0UGFyc2VWYWxpZDYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlVUkwgcmVtb3RlVVJMID0gbmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFICsgInBhcnNlcnRlc3RzL3NpdGU0LnhtbCIpOworCQlEZWZhdWx0U2l0ZVBhcnNlciBwYXJzZXIgPSBuZXcgRGVmYXVsdFNpdGVQYXJzZXIoKTsKKwkJcGFyc2VyLmluaXQobmV3IFNpdGVGaWxlRmFjdG9yeSgpKTsKKwkJVVJMIHJlc29sdmVkVVJMID0gVVJMRW5jb2Rlci5lbmNvZGUocmVtb3RlVVJMKTsKKwkJU2l0ZU1vZGVsIHJlbW90ZVNpdGUgPSBwYXJzZXIucGFyc2UocmVzb2x2ZWRVUkwub3BlblN0cmVhbSgpKTsKKwkJcmVtb3RlU2l0ZS5yZXNvbHZlKHJlbW90ZVVSTCwgbnVsbCk7CisKKwkJRmVhdHVyZVJlZmVyZW5jZU1vZGVsW10gZmVhdHVyZVJlZiA9IHJlbW90ZVNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZU1vZGVscygpOworCQkvL0NhdGVnb3J5TW9kZWxbXSBjYXRlZ29yaWVzID0gcmVtb3RlU2l0ZS5nZXRDYXRlZ29yeU1vZGVscygpOworCQlBcmNoaXZlUmVmZXJlbmNlTW9kZWxbXSBhcmNoaXZlcyA9IHJlbW90ZVNpdGUuZ2V0QXJjaGl2ZVJlZmVyZW5jZU1vZGVscygpOworCisJCWFzc2VydFRydWUoIldyb25nIG51bWJlciBvZiBmZWF0dXJlcyIsIGZlYXR1cmVSZWYubGVuZ3RoID09IDIpOworCQlhc3NlcnRUcnVlKCJXcm9uZyBudW1iZXIgb2YgYXJjaGl2ZXMiLCBhcmNoaXZlcy5sZW5ndGggPT0gMCk7CisKKwkJdHJ5IHsKKwkJCSgoRmVhdHVyZVJlZmVyZW5jZSkgZmVhdHVyZVJlZlswXSkuZ2V0RmVhdHVyZShudWxsKTsKKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQlUaHJvd2FibGUgZTEgPSBlLmdldFN0YXR1cygpLmdldEV4Y2VwdGlvbigpOworCQkJU3RyaW5nIG1zZyA9IGUxLmdldE1lc3NhZ2UoKS5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKTsKKwkJCWlmIChtc2cuaW5kZXhPZigiXzEuMC4wLmphci9mZWF0dXJlLnhtbCIpID09IC0xKSB7CisJCQkJdGhyb3cgZTsKKwkJCX0KKwkJfQorCX0KKworCXB1YmxpYyB2b2lkIHRlc3RQYXJzZVVua25vd25DYXRlZ29yeSgpIHRocm93cyBFeGNlcHRpb24geworCisJCVVSTCByZW1vdGVVUkwgPSBuZXcgVVJMKFNPVVJDRV9GSUxFX1NJVEUgKyAicGFyc2VydGVzdHMvc2l0ZTMueG1sIik7CisJCURlZmF1bHRTaXRlUGFyc2VyIHBhcnNlciA9IG5ldyBEZWZhdWx0U2l0ZVBhcnNlcigpOworCQlwYXJzZXIuaW5pdChuZXcgU2l0ZUZpbGVGYWN0b3J5KCkpOworCQlVUkwgcmVzb2x2ZWRVUkwgPSBVUkxFbmNvZGVyLmVuY29kZShyZW1vdGVVUkwpOworCQlTaXRlTW9kZWwgcmVtb3RlU2l0ZSA9IHBhcnNlci5wYXJzZShyZXNvbHZlZFVSTC5vcGVuU3RyZWFtKCkpOworCQlyZW1vdGVTaXRlLnJlc29sdmUocmVtb3RlVVJMLCBudWxsKTsKKworCQlGZWF0dXJlUmVmZXJlbmNlTW9kZWxbXSBmZWF0dXJlUmVmID0gcmVtb3RlU2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlTW9kZWxzKCk7CisJCUlDYXRlZ29yeVtdIGNhdGVnb3JpZXMgPSAoKFNpdGVGZWF0dXJlUmVmZXJlbmNlKSBmZWF0dXJlUmVmWzBdKS5nZXRDYXRlZ29yaWVzKCk7CisJCWFzc2VydFRydWUoY2F0ZWdvcmllcy5sZW5ndGggPT0gMSAmJiAiT3RoZXIiLmVxdWFscyhjYXRlZ29yaWVzWzBdLmdldE5hbWUoKSkpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RQYXJzZVZhbGlkNygpIHRocm93cyBFeGNlcHRpb24geworCisJCXRyeSB7CisJCQlVUkwgcmVtb3RlVVJMID0gbmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFICsgInBhcnNlcnRlc3RzL3NpdGU3LnhtbCIpOworCQkJRGVmYXVsdFNpdGVQYXJzZXIgcGFyc2VyID0gbmV3IERlZmF1bHRTaXRlUGFyc2VyKCk7CisJCQlwYXJzZXIuaW5pdChuZXcgU2l0ZUZpbGVGYWN0b3J5KCkpOworCQkJVVJMIHJlc29sdmVkVVJMID0gVVJMRW5jb2Rlci5lbmNvZGUocmVtb3RlVVJMKTsKKwkJCVNpdGVNb2RlbCByZW1vdGVTaXRlID0gcGFyc2VyLnBhcnNlKHJlc29sdmVkVVJMLm9wZW5TdHJlYW0oKSk7CisJCQlyZW1vdGVTaXRlLnJlc29sdmUocmVtb3RlVVJMLCBudWxsKTsKKworCQl9IGNhdGNoIChTQVhQYXJzZUV4Y2VwdGlvbiBlKSB7CisJCQlmYWlsKCJFeGNlcHRpb24gc2hvdWxkIG5vdCBiZSB0aHJvd24iICsgZS5nZXRNZXNzYWdlKCkpOworCQl9CisJfQorCisJcHVibGljIHZvaWQgdGVzdFBhcnNlVmFsaWQ4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJdHJ5IHsKKwkJCVVSTCByZW1vdGVVUkwgPSBuZXcgVVJMKFNPVVJDRV9GSUxFX1NJVEUgKyAicGFyc2VydGVzdHMvc2l0ZTgueG1sIik7CisJCQlEZWZhdWx0U2l0ZVBhcnNlciBwYXJzZXIgPSBuZXcgRGVmYXVsdFNpdGVQYXJzZXIoKTsKKwkJCXBhcnNlci5pbml0KG5ldyBTaXRlRmlsZUZhY3RvcnkoKSk7CisJCQlVUkwgcmVzb2x2ZWRVUkwgPSBVUkxFbmNvZGVyLmVuY29kZShyZW1vdGVVUkwpOworCQkJU2l0ZU1vZGVsIHJlbW90ZVNpdGUgPSBwYXJzZXIucGFyc2UocmVzb2x2ZWRVUkwub3BlblN0cmVhbSgpKTsKKwkJCXJlbW90ZVNpdGUucmVzb2x2ZShyZW1vdGVVUkwsIG51bGwpOworCisJCX0gY2F0Y2ggKFNBWFBhcnNlRXhjZXB0aW9uIGUpIHsKKwkJCWZhaWwoIkV4Y2VwdGlvbiBzaG91bGQgbm90IGJlIHRocm93biIgKyBlLmdldE1lc3NhZ2UoKSk7CisJCX0KKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0UGFyc2VWYWxpZDkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQl0cnkgeworCQkJVVJMIHJlbW90ZVVSTCA9IG5ldyBVUkwoU09VUkNFX0ZJTEVfU0lURSArICJwYXJzZXJ0ZXN0cy9zaXRlOS54bWwiKTsKKwkJCURlZmF1bHRTaXRlUGFyc2VyIHBhcnNlciA9IG5ldyBEZWZhdWx0U2l0ZVBhcnNlcigpOworCQkJcGFyc2VyLmluaXQobmV3IFNpdGVGaWxlRmFjdG9yeSgpKTsKKwkJCVVSTCByZXNvbHZlZFVSTCA9IFVSTEVuY29kZXIuZW5jb2RlKHJlbW90ZVVSTCk7CisJCQlTaXRlTW9kZWwgcmVtb3RlU2l0ZSA9IHBhcnNlci5wYXJzZShyZXNvbHZlZFVSTC5vcGVuU3RyZWFtKCkpOworCQkJcmVtb3RlU2l0ZS5yZXNvbHZlKHJlbW90ZVVSTCwgbnVsbCk7CisJCX0gY2F0Y2ggKFNBWFBhcnNlRXhjZXB0aW9uIGUpIHsKKwkJCWZhaWwoIkV4Y2VwdGlvbiBzaG91bGQgbm90IGJlIHRocm93biIgKyBlLmdldE1lc3NhZ2UoKSk7CisJCX0KKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0UGFyc2VWYWxpZDEwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJU2l0ZU1vZGVsIHJlbW90ZVNpdGUgPSBudWxsOworCQl0cnkgeworCQkJVVJMIHJlbW90ZVVSTCA9IG5ldyBVUkwoU09VUkNFX0ZJTEVfU0lURSArICJwYXJzZXJ0ZXN0cy9zaXRlMTAueG1sIik7CisJCQlEZWZhdWx0U2l0ZVBhcnNlciBwYXJzZXIgPSBuZXcgRGVmYXVsdFNpdGVQYXJzZXIoKTsKKwkJCXBhcnNlci5pbml0KG5ldyBTaXRlRmlsZUZhY3RvcnkoKSk7CisJCQlVUkwgcmVzb2x2ZWRVUkwgPSBVUkxFbmNvZGVyLmVuY29kZShyZW1vdGVVUkwpOworCQkJcmVtb3RlU2l0ZSA9IHBhcnNlci5wYXJzZShyZXNvbHZlZFVSTC5vcGVuU3RyZWFtKCkpOworCQkJcmVtb3RlU2l0ZS5yZXNvbHZlKHJlbW90ZVVSTCwgbnVsbCk7CisJCX0gY2F0Y2ggKFNBWFBhcnNlRXhjZXB0aW9uIGUpIHsKKwkJCWZhaWwoIkV4Y2VwdGlvbiBzaG91bGQgbm90IGJlIHRocm93biIgKyBlLmdldE1lc3NhZ2UoKSk7CisJCX0KKwkJRmVhdHVyZVJlZmVyZW5jZU1vZGVsW10gbW9kZWxzID0gcmVtb3RlU2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlTW9kZWxzKCk7CisJCWFzc2VydEVxdWFscygiSW52YWxpZCB2ZXJzaW9uZWQgaWRlbnRpZmllciIsIG1vZGVsc1swXS5nZXRGZWF0dXJlSWRlbnRpZmllcigpLCAib3JnLmVjbGlwc2UudGVzdC5mZWF0dXJlIik7CisJfQorCit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9wZXJmbXMvQWxsUGVyZm9ybWFuY2VUZXN0cy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcGVyZm1zL0FsbFBlcmZvcm1hbmNlVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTY5YzkxCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcGVyZm1zL0FsbFBlcmZvcm1hbmNlVGVzdHMuamF2YQpAQCAtMCwwICsxLDI5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnBlcmZtczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLio7CisKKworcHVibGljIGNsYXNzIEFsbFBlcmZvcm1hbmNlVGVzdHMgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2UgeworcHVibGljIEFsbFBlcmZvcm1hbmNlVGVzdHMoU3RyaW5nIG5hbWUpIHsKKwlzdXBlcihuYW1lKTsKK30KK3B1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKKwlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7CisJc3VpdGUuc2V0TmFtZSgiVXBkYXRlIFBlcmZvcm1hbmNlIFRlc3RzIik7CisJCisJLy8gdGhlIGZvbGxvd2luZyB3aWxsIHRha2UgYWxsIHRlaCB0ZXN0IG1ldGhvZHMgaW4gdGhlIGNsYXNzIHRoYXQgc3RhcnQgd2l0aCAndGVzdCcKKwkvL3N1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShUZXN0U3RhcnR1cC5jbGFzcykpOworCXJldHVybiBzdWl0ZTsKK30KK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3BlcmZtcy9UZXN0U3RhcnR1cC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcGVyZm1zL1Rlc3RTdGFydHVwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI3NDg2NgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3BlcmZtcy9UZXN0U3RhcnR1cC5qYXZhCkBAIC0wLDAgKzEsNzYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMucGVyZm1zOworLy9pbXBvcnQgamF2YS5uZXQuKjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworCitpbXBvcnQgb3JnLmVjbGlwc2UudGVzdC5wZXJmb3JtYW5jZS5EaW1lbnNpb247CitpbXBvcnQgb3JnLmVjbGlwc2UudGVzdC5wZXJmb3JtYW5jZS5QZXJmb3JtYW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS50ZXN0LnBlcmZvcm1hbmNlLlBlcmZvcm1hbmNlTWV0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvbmZpZ3VyYXRvci5QbGF0Zm9ybUNvbmZpZ3VyYXRpb25GYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb25maWd1cmF0b3IuU2l0ZUVudHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7CisKK3B1YmxpYyBjbGFzcyBUZXN0U3RhcnR1cCBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7CisJcHVibGljIFRlc3RTdGFydHVwKFN0cmluZyBhcmcwKSB7CisJCXN1cGVyKGFyZzApOworCX0KKwkKKworCXB1YmxpYyB2b2lkIHRlc3RDb25maWd1cmF0aW9uQ3JlYXRpb24oKSB7CisJCVBlcmZvcm1hbmNlIHBlcmY9IFBlcmZvcm1hbmNlLmdldERlZmF1bHQoKTsKKwkJUGVyZm9ybWFuY2VNZXRlciBwZXJmb3JtYW5jZU1ldGVyPSBwZXJmLmNyZWF0ZVBlcmZvcm1hbmNlTWV0ZXIocGVyZi5nZXREZWZhdWx0U2NlbmFyaW9JZCh0aGlzKSk7CisJCXBlcmYudGFnQXNHbG9iYWxTdW1tYXJ5KHBlcmZvcm1hbmNlTWV0ZXIsICJDb25maWd1cmF0aW9uIGNyZWF0aW9uIiwgRGltZW5zaW9uLkVMQVBTRURfUFJPQ0VTUyk7CisJCQorCQl0cnkgeworCQkJZm9yIChpbnQgaT0gMDsgaSA8IDEwOyBpKyspIHsKKwkJCQlwZXJmb3JtYW5jZU1ldGVyLnN0YXJ0KCk7CisJCQkJdHJ5IHsKKwkJCQkJVVJMIHBsYXRmb3JtWG1sID0gbmV3IFVSTCgiZmlsZSIsICIiLGRhdGFQYXRoICsgIi8iICsgInBlcmYvcGxhdGZvcm0ueG1sIik7CisJCQkJCW5ldyBQbGF0Zm9ybUNvbmZpZ3VyYXRpb25GYWN0b3J5KCkuZ2V0UGxhdGZvcm1Db25maWd1cmF0aW9uKHBsYXRmb3JtWG1sKTsKKwkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ2Fubm90IGNyZWF0ZSBjb25maWd1cmF0aW9uIGZvciBwZXJmb3JtYW5jZSBtZWFzdXJlbWVudCIpOworCQkJCX0KKwkJCQlwZXJmb3JtYW5jZU1ldGVyLnN0b3AoKTsKKwkgCQl9CisJCQlwZXJmb3JtYW5jZU1ldGVyLmNvbW1pdCgpOworCQkJcGVyZi5hc3NlcnRQZXJmb3JtYW5jZShwZXJmb3JtYW5jZU1ldGVyKTsKKwkgCX0gZmluYWxseSB7CisJCQlwZXJmb3JtYW5jZU1ldGVyLmRpc3Bvc2UoKTsKKwkgCX0KKwl9CisJCisJcHVibGljIHZvaWQgdGVzdENvbmZpZ3VyYXRpb25EZXRlY3Rpb24oKSB7CisJCVBlcmZvcm1hbmNlIHBlcmY9IFBlcmZvcm1hbmNlLmdldERlZmF1bHQoKTsKKwkJUGVyZm9ybWFuY2VNZXRlciBwZXJmb3JtYW5jZU1ldGVyPSBwZXJmLmNyZWF0ZVBlcmZvcm1hbmNlTWV0ZXIocGVyZi5nZXREZWZhdWx0U2NlbmFyaW9JZCh0aGlzKSk7CisJCXBlcmYudGFnQXNHbG9iYWxTdW1tYXJ5KHBlcmZvcm1hbmNlTWV0ZXIsICJDb25maWd1cmF0aW9uIGRldGVjdGlvbiIsIERpbWVuc2lvbi5FTEFQU0VEX1BST0NFU1MpOworCisJCXRyeSB7CisJCQlmb3IgKGludCBpPSAwOyBpIDwgMTA7IGkrKykgeworCQkJCXBlcmZvcm1hbmNlTWV0ZXIuc3RhcnQoKTsKKwkJCQl0cnkgeworCQkJCQlVUkwgc2l0ZVVSTCA9IG5ldyBVUkwoImZpbGUiLCAiIixkYXRhUGF0aCArICIvIiArICJwZXJmL2VjbGlwc2UiKTsKKwkJCQkJU2l0ZUVudHJ5IHNpdGUgPSBuZXcgU2l0ZUVudHJ5KHNpdGVVUkwpOworCQkJCQlzaXRlLmxvYWRGcm9tRGlzaygwKTsKKwkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNhbm5vdCBjcmVhdGUgc2l0ZSBlbnRyeSBmb3IgcGVyZm9ybWFuY2UgbWVhc3VyZW1lbnQiKTsKKwkJCQl9CisJCQkJcGVyZm9ybWFuY2VNZXRlci5zdG9wKCk7CisJIAkJfQorCQkJcGVyZm9ybWFuY2VNZXRlci5jb21taXQoKTsKKwkJCXBlcmYuYXNzZXJ0UGVyZm9ybWFuY2UocGVyZm9ybWFuY2VNZXRlcik7CisJIAl9IGZpbmFsbHkgeworCQkJcGVyZm9ybWFuY2VNZXRlci5kaXNwb3NlKCk7CisJIAl9CisJfQorfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcmVjb25jaWxpYXRpb24vQWxsUmVjb25jaWxpYXRpb25UZXN0cy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcmVjb25jaWxpYXRpb24vQWxsUmVjb25jaWxpYXRpb25UZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2OGQ3YzEKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9yZWNvbmNpbGlhdGlvbi9BbGxSZWNvbmNpbGlhdGlvblRlc3RzLmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5yZWNvbmNpbGlhdGlvbjsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworCitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZU1hbmFnZXJUZXN0Q2FzZTsKKworLyoqCisgKiBNYW5hZ2VzIHRoZSBBUEkgdGVzdHMKKyAqLworcHVibGljIGNsYXNzIEFsbFJlY29uY2lsaWF0aW9uVGVzdHMgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2UgeworCS8qKgorCSAqIENvbnN0cnVjdG9yCisJICovCisJcHVibGljIEFsbFJlY29uY2lsaWF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKKwkJc3VwZXIobmFtZSk7CisJfQorCQorCS8qKgorCSAqIExpc3Qgb2YgQVBJIHRlc3RzCisJICovCisJcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKKwkJc3VpdGUuc2V0TmFtZSgiQVBJIFRlc3RzIik7CisKKworCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdFNpdGVSZWNvbmNpbGlhdGlvbi5jbGFzcykpOworCisJCXJldHVybiBzdWl0ZTsKKwl9Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9yZWNvbmNpbGlhdGlvbi9UZXN0U2l0ZVJlY29uY2lsaWF0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9yZWNvbmNpbGlhdGlvbi9UZXN0U2l0ZVJlY29uY2lsaWF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNlMDZkOQotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3JlY29uY2lsaWF0aW9uL1Rlc3RTaXRlUmVjb25jaWxpYXRpb24uamF2YQpAQCAtMCwwICsxLDE2OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5yZWNvbmNpbGlhdGlvbjsKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS5uZXQuKjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IuSVBsYXRmb3JtQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLklQbGF0Zm9ybUNvbmZpZ3VyYXRpb24uKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLio7CisKK3B1YmxpYyBjbGFzcyBUZXN0U2l0ZVJlY29uY2lsaWF0aW9uIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsKKwkKKworCQorCisJLyoqCisJICogVGVzdCB0aGUgZ2V0RmVhdHVyZXMoKQorCSAqLworCXB1YmxpYyBUZXN0U2l0ZVJlY29uY2lsaWF0aW9uKFN0cmluZyBhcmcwKSB7CisJCXN1cGVyKGFyZzApOworCX0KKworCXByaXZhdGUgdm9pZCBhZGRDb25maWdTaXRlKGludCBwb2xpY3ksIFVSTCB1cmwsU3RyaW5nW10gbGlzdE9mUGx1Z2lucykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyB4bWxGaWxlID0gKChMb2NhbFNpdGUpU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkpLmdldExvY2F0aW9uVVJMKCkuZ2V0RmlsZSgpOworCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obmV3IEZpbGUoeG1sRmlsZSkpOwkJCisJCUludGVybmFsU2l0ZU1hbmFnZXIubG9jYWxTaXRlPW51bGw7CisJCS8vIGdldCBuZXcgY29uZmlnIG9iamVjdAorCQlJUGxhdGZvcm1Db25maWd1cmF0aW9uIGNmaWcgPSBDb25maWd1cmF0b3JVdGlscy5nZXRDdXJyZW50UGxhdGZvcm1Db25maWd1cmF0aW9uKCk7CisJCUlTaXRlUG9saWN5IHAxID0gY2ZpZy5jcmVhdGVTaXRlUG9saWN5KHBvbGljeSwgbGlzdE9mUGx1Z2lucyk7CQorCQlJU2l0ZUVudHJ5IHMxID0gY2ZpZy5jcmVhdGVTaXRlRW50cnkodXJsLHAxKTsKKwkJY2ZpZy5jb25maWd1cmVTaXRlKHMxKTsJCisJfQorCQorCXByaXZhdGUgdm9pZCByZW1vdmVDb25maWdTaXRlKFVSTCB1cmwpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBnZXQgbmV3IGNvbmZpZyBvYmplY3QKKwkJSVBsYXRmb3JtQ29uZmlndXJhdGlvbiBjZmlnID0gQ29uZmlndXJhdG9yVXRpbHMuZ2V0Q3VycmVudFBsYXRmb3JtQ29uZmlndXJhdGlvbigpOworCQlJU2l0ZUVudHJ5IHMxID0gY2ZpZy5maW5kQ29uZmlndXJlZFNpdGUodXJsKTsKKwkJYXNzZXJ0Tm90TnVsbCgiVW5hYmxlIHRvIGZpbmQgc2l0ZSBlbnRyeToiK3VybCxzMSk7CisJCWNmaWcudW5jb25maWd1cmVTaXRlKHMxKTsKKwkJY2ZpZy5zYXZlKCk7CisJfQkKKwkvKioKKwkgKiBTaXRlIDEgY29udGFpbnMgYSBmZWF0dXJlIHdoaWNoIG5lZWRzIGEgcGx1Z2luIHRhaHQgaXMgbm90IG9uIHRoZSBwYXRoIHdoZW4gd2Ugc3RhcnQKKwkgKiBpdCB3aWxsIG5ldmVyIGJlIGNvbmZpZ3VyZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0TmV3U2l0ZUluY2x1ZGUxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCisJCWludCBwb2xpY3kgID0gSVNpdGVQb2xpY3kuVVNFUl9JTkNMVURFOworCQlVUkwgdXJsID0gbmV3IFVSTCgiZmlsZSIsbnVsbCxkYXRhUGF0aCsicmVjb25jaWxpYXRpb25TaXRlcy9zaXRlMS8iKTsKKwkJU3RyaW5nW10gcGx1Z2lucyA9IG5ldyBTdHJpbmdbXXt9OworCQlhZGRDb25maWdTaXRlKHBvbGljeSx1cmwsIHBsdWdpbnMpOworCisJCUlMb2NhbFNpdGUgbG9jYWwgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsKKwkJKChMb2NhbFNpdGUpbG9jYWwpLnNldFN0YW1wKDApOworCQlJQ29uZmlndXJlZFNpdGVbXSBuZXdTaXRlcyA9IGxvY2FsLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkuZ2V0Q29uZmlndXJlZFNpdGVzKCk7CisJCUlDb25maWd1cmVkU2l0ZSBuZXdTaXRlID0gbnVsbDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXdTaXRlcy5sZW5ndGg7IGkrKykgeworCQkJaWYgKFVwZGF0ZU1hbmFnZXJVdGlscy5zYW1lVVJMKG5ld1NpdGVzW2ldLmdldFNpdGUoKS5nZXRVUkwoKSx1cmwpKXsKKwkJCQluZXdTaXRlID0gbmV3U2l0ZXNbaV07CisJCQl9CisJCX0KKwkJCisJCWlmIChuZXdTaXRlPT1udWxsKSBmYWlsKCJTaXRlIG5vdCBmb3VuZCBpbiBjb25maWd1cmF0aW9uIik7CisJCQorCQlJRmVhdHVyZVJlZmVyZW5jZVtdIHJlZiA9IG5ld1NpdGUuZ2V0Q29uZmlndXJlZEZlYXR1cmVzKCk7CisJCWFzc2VydEVxdWFscygiV3JvbmcgbnVtYmVyIG9mIGNvbmZpZ3VyZWQgZmVhdHVyZXMiLDAscmVmLmxlbmd0aCk7CQkKKwkJcmVmID0gKChDb25maWd1cmVkU2l0ZSluZXdTaXRlKS5nZXRDb25maWd1cmF0aW9uUG9saWN5KCkuZ2V0VW5jb25maWd1cmVkRmVhdHVyZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgdW5jb25maWd1cmVkIGZlYXR1cmVzIiwwLHJlZi5sZW5ndGgpOwkJCisJCQorCQlyZW1vdmVDb25maWdTaXRlKHVybCk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdE5ld1NpdGVFeGNsdWRlMSgpIHRocm93cyBFeGNlcHRpb24geworCQkKKwkJaW50IHBvbGljeSAgPSBJU2l0ZVBvbGljeS5VU0VSX0VYQ0xVREU7CisJCVVSTCB1cmwgPSBuZXcgVVJMKCJmaWxlIixudWxsLGRhdGFQYXRoKyJyZWNvbmNpbGlhdGlvblNpdGVzL3NpdGUxLyIpOworCQlTdHJpbmdbXSBwbHVnaW5zID0gbmV3IFN0cmluZ1tde307CisJCWFkZENvbmZpZ1NpdGUocG9saWN5LHVybCwgcGx1Z2lucyk7CisJCQorCQlJTG9jYWxTaXRlIGxvY2FsID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7CisJCSgoTG9jYWxTaXRlKWxvY2FsKS5zZXRTdGFtcCgwKTsJCQorCQlJQ29uZmlndXJlZFNpdGVbXSBuZXdTaXRlcyA9IGxvY2FsLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkuZ2V0Q29uZmlndXJlZFNpdGVzKCk7CisJCUlDb25maWd1cmVkU2l0ZSBuZXdTaXRlID0gbnVsbDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXdTaXRlcy5sZW5ndGg7IGkrKykgeworCQkJaWYgKFVwZGF0ZU1hbmFnZXJVdGlscy5zYW1lVVJMKG5ld1NpdGVzW2ldLmdldFNpdGUoKS5nZXRVUkwoKSx1cmwpKXsKKwkJCQluZXdTaXRlID0gbmV3U2l0ZXNbaV07CisJCQl9CisJCX0KKwkJCisJCWlmIChuZXdTaXRlPT1udWxsKSBmYWlsKCJTaXRlIG5vdCBmb3VuZCBpbiBjb25maWd1cmF0aW9uIik7CisJCQorCQlJRmVhdHVyZVJlZmVyZW5jZVtdIHJlZiA9IG5ld1NpdGUuZ2V0Q29uZmlndXJlZEZlYXR1cmVzKCk7CisJCWFzc2VydEVxdWFscygiV3JvbmcgbnVtYmVyIG9mIGNvbmZpZ3VyZWQgZmVhdHVyZXMiLDAscmVmLmxlbmd0aCk7CQkKKwkJcmVmID0gKChDb25maWd1cmVkU2l0ZSluZXdTaXRlKS5nZXRDb25maWd1cmF0aW9uUG9saWN5KCkuZ2V0VW5jb25maWd1cmVkRmVhdHVyZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgdW5jb25maWd1cmVkIGZlYXR1cmVzIiwwLHJlZi5sZW5ndGgpOwkJCQkKKwkJcmVtb3ZlQ29uZmlnU2l0ZSh1cmwpOworCX0KKworCS8qKgorCSAqIFNpdGUgMiBjb250YWlucyBhIGZlYXR1cmUgd2hpY2ggbmVlZHMgYSBwbHVnaW4gdGFodCBpcyBvbiB0aGUgcGF0aCB3aGVuIHdlIHN0YXJ0CisJICogaXQgd2lsbCBiZSBjb25maWd1cmVkCisJICovCisJcHVibGljIHZvaWQgdGVzdE5ld1NpdGVJbmNsdWRlMigpIHRocm93cyBFeGNlcHRpb24geworCQkKKwkJaW50IHBvbGljeSAgPSBJU2l0ZVBvbGljeS5VU0VSX0lOQ0xVREU7CisJCVVSTCB1cmwgPSBuZXcgVVJMKCJmaWxlIixudWxsLGRhdGFQYXRoKyJyZWNvbmNpbGlhdGlvblNpdGVzL3NpdGUyLyIpOworCQlTdHJpbmdbXSBwbHVnaW5zID0gbmV3IFN0cmluZ1tde307CisJCWFkZENvbmZpZ1NpdGUocG9saWN5LHVybCwgcGx1Z2lucyk7CisJCUlMb2NhbFNpdGUgbG9jYWwgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsKKwkJKChMb2NhbFNpdGUpbG9jYWwpLnNldFN0YW1wKDApOwkJCisJCUlDb25maWd1cmVkU2l0ZVtdIG5ld1NpdGVzID0gbG9jYWwuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5nZXRDb25maWd1cmVkU2l0ZXMoKTsKKwkJSUNvbmZpZ3VyZWRTaXRlIG5ld1NpdGUgPSBudWxsOworCQlmb3IgKGludCBpID0gMDsgaSA8IG5ld1NpdGVzLmxlbmd0aDsgaSsrKSB7CisJCQlpZiAoVXBkYXRlTWFuYWdlclV0aWxzLnNhbWVVUkwobmV3U2l0ZXNbaV0uZ2V0U2l0ZSgpLmdldFVSTCgpLHVybCkpeworCQkJCW5ld1NpdGUgPSBuZXdTaXRlc1tpXTsKKwkJCX0KKwkJfQorCQkKKwkJaWYgKG5ld1NpdGU9PW51bGwpIGZhaWwoIlNpdGUgbm90IGZvdW5kIGluIGNvbmZpZ3VyYXRpb24iKTsKKwkJCisJCUlGZWF0dXJlUmVmZXJlbmNlW10gcmVmID0gbmV3U2l0ZS5nZXRDb25maWd1cmVkRmVhdHVyZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgY29uZmlndXJlZCBmZWF0dXJlcyIsMCxyZWYubGVuZ3RoKTsKKwkJcmVmID0gKChDb25maWd1cmVkU2l0ZSluZXdTaXRlKS5nZXRDb25maWd1cmF0aW9uUG9saWN5KCkuZ2V0VW5jb25maWd1cmVkRmVhdHVyZXMoKTsKKwkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgdW5jb25maWd1cmVkIGZlYXR1cmVzIiwwLHJlZi5sZW5ndGgpOworCQkKKwkJcmVtb3ZlQ29uZmlnU2l0ZSh1cmwpOworCX0KKworCisKKwlwdWJsaWMgdm9pZCB0ZXN0TmV3U2l0ZUV4Y2x1ZGUyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCQorCQlpbnQgcG9saWN5ICA9IElTaXRlUG9saWN5LlVTRVJfRVhDTFVERTsKKwkJVVJMIHVybCA9IG5ldyBVUkwoImZpbGUiLG51bGwsZGF0YVBhdGgrInJlY29uY2lsaWF0aW9uU2l0ZXMvc2l0ZTIvIik7CisJCVN0cmluZ1tdIHBsdWdpbnMgPSBuZXcgU3RyaW5nW117fTsKKwkJYWRkQ29uZmlnU2l0ZShwb2xpY3ksdXJsLCBwbHVnaW5zKTsKKwkJSUxvY2FsU2l0ZSBsb2NhbCA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpOworCQkoKExvY2FsU2l0ZSlsb2NhbCkuc2V0U3RhbXAoMCk7CQkKKwkJSUNvbmZpZ3VyZWRTaXRlW10gbmV3U2l0ZXMgPSBsb2NhbC5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldENvbmZpZ3VyZWRTaXRlcygpOworCQlJQ29uZmlndXJlZFNpdGUgbmV3U2l0ZSA9IG51bGw7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbmV3U2l0ZXMubGVuZ3RoOyBpKyspIHsKKwkJCWlmIChVcGRhdGVNYW5hZ2VyVXRpbHMuc2FtZVVSTChuZXdTaXRlc1tpXS5nZXRTaXRlKCkuZ2V0VVJMKCksdXJsKSl7CisJCQkJbmV3U2l0ZSA9IG5ld1NpdGVzW2ldOworCQkJfQorCQl9CisJCQorCQlpZiAobmV3U2l0ZT09bnVsbCkgZmFpbCgiU2l0ZSBub3QgZm91bmQgaW4gY29uZmlndXJhdGlvbiIpOworCQkKKwkJSUZlYXR1cmVSZWZlcmVuY2VbXSByZWYgPSBuZXdTaXRlLmdldENvbmZpZ3VyZWRGZWF0dXJlcygpOworCQlhc3NlcnRFcXVhbHMoIldyb25nIG51bWJlciBvZiBjb25maWd1cmVkIGZlYXR1cmVzIiwwLHJlZi5sZW5ndGgpOworCQlyZWYgPSAoKENvbmZpZ3VyZWRTaXRlKW5ld1NpdGUpLmdldENvbmZpZ3VyYXRpb25Qb2xpY3koKS5nZXRVbmNvbmZpZ3VyZWRGZWF0dXJlcygpOworCQlhc3NlcnRFcXVhbHMoIldyb25nIG51bWJlciBvZiB1bmNvbmZpZ3VyZWQgZmVhdHVyZXMiLDAscmVmLmxlbmd0aCk7CisKKwkJcmVtb3ZlQ29uZmlnU2l0ZSh1cmwpOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcmVndWxhckluc3RhbGwvQWxsUmVndWxhckluc3RhbGxUZXN0cy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcmVndWxhckluc3RhbGwvQWxsUmVndWxhckluc3RhbGxUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlYmYxOWYKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9yZWd1bGFySW5zdGFsbC9BbGxSZWd1bGFySW5zdGFsbFRlc3RzLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5yZWd1bGFySW5zdGFsbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLio7CisKKworcHVibGljIGNsYXNzIEFsbFJlZ3VsYXJJbnN0YWxsVGVzdHMgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2UgeworcHVibGljIEFsbFJlZ3VsYXJJbnN0YWxsVGVzdHMoU3RyaW5nIG5hbWUpIHsKKwlzdXBlcihuYW1lKTsKK30KK3B1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKKwlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7CisJc3VpdGUuc2V0TmFtZSgiUmVndWxhciBJbnN0YWxsIFRlc3RzIik7CisJCisJLy8gdGhlIGZvbGxvd2luZyB3aWxsIHRha2UgYWxsIHRlaCB0ZXN0IG1ldGhvZHMgaW4gdGVoIGNsYXNzIHRoYXQgc3RhcnQgd2l0aCAndGVzdCcKKworCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShUZXN0SW5zdGFsbC5jbGFzcykpOworCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShUZXN0SW5zdGFsbFVSTFNJdGVYTUwuY2xhc3MpKTsJCisJc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RTcGFjZUluSW5zdGFsbC5jbGFzcykpOwkKKwlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdEdldEZlYXR1cmUuY2xhc3MpKTsKKwlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdEV4ZWN1dGFibGVJbnN0YWxsLmNsYXNzKSk7CQorCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShUZXN0RXhlY3V0YWJsZVBhY2thZ2VkSW5zdGFsbC5jbGFzcykpOwkJCisJc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3REYXRhRW50cnlJbnN0YWxsLmNsYXNzKSk7CisJc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RMb2NhbFNpdGUuY2xhc3MpKTsJCQorCQorCS8vIG9yIHlvdSBjYW4gc3BlY2lmeSB0aGUgbWV0aG9kCisJLy9zdWl0ZS5hZGRUZXN0KG5ldyBUZXN0R2V0RmVhdHVyZSgibWV0aG9kVGhhdERvZXNOb3RTdGFydFdpdGh0ZXN0IikpOwkKKwkKKwlyZXR1cm4gc3VpdGU7Cit9Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9yZWd1bGFySW5zdGFsbC9NdWx0aXBsZVRlc3RMb2NhbFNpdGUuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3JlZ3VsYXJJbnN0YWxsL011bHRpcGxlVGVzdExvY2FsU2l0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhNmRmOTIKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9yZWd1bGFySW5zdGFsbC9NdWx0aXBsZVRlc3RMb2NhbFNpdGUuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnJlZ3VsYXJJbnN0YWxsOworCitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZU1hbmFnZXJUZXN0Q2FzZTsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKKworCitwdWJsaWMgY2xhc3MgTXVsdGlwbGVUZXN0TG9jYWxTaXRlIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsKK3B1YmxpYyBNdWx0aXBsZVRlc3RMb2NhbFNpdGUoU3RyaW5nIG5hbWUpIHsKKwlzdXBlcihuYW1lKTsKK30KK3B1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKKwlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7CisJc3VpdGUuc2V0TmFtZSgiTXVsdGlwbGUgVGVzdCBMb2NhbCBTaXRlIik7CisJCisJLy8gdGhlIGZvbGxvd2luZyB3aWxsIHRha2UgYWxsIHRlaCB0ZXN0IG1ldGhvZHMgaW4gdGVoIGNsYXNzIHRoYXQgc3RhcnQgd2l0aCAndGVzdCcKKwkKKwlmb3IoaW50IGk9MDsgaTw1MDsgaSsrKXsKKwkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RMb2NhbFNpdGUuY2xhc3MpKTsKKwl9CisJCisJcmV0dXJuIHN1aXRlOworfQorfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcmVndWxhckluc3RhbGwvVGVzdERhdGFFbnRyeUluc3RhbGwuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3JlZ3VsYXJJbnN0YWxsL1Rlc3REYXRhRW50cnlJbnN0YWxsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzYxMDVjMQotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3JlZ3VsYXJJbnN0YWxsL1Rlc3REYXRhRW50cnlJbnN0YWxsLmphdmEKQEAgLTAsMCArMSwxMDAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMucmVndWxhckluc3RhbGw7CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEubmV0LlVSTDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuVXBkYXRlTWFuYWdlclV0aWxzOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7CisKK3B1YmxpYyBjbGFzcyBUZXN0RGF0YUVudHJ5SW5zdGFsbCBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7CisJLyoqCisJICogQ29uc3RydWN0b3IgZm9yIFRlc3QxCisJICovCisJcHVibGljIFRlc3REYXRhRW50cnlJbnN0YWxsKFN0cmluZyBhcmcwKSB7CisJCXN1cGVyKGFyZzApOworCX0KKworCS8qKgorCSAqIFdpdGggc2l0ZS54bWwKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0RGF0YUVudHJ5U2l0ZSgpIHRocm93cyBFeGNlcHRpb24geworCisJCS8vY2xlYW51cCB0YXJnZXQgCisJCUZpbGUgdGFyZ2V0ID0gbmV3IEZpbGUoVEFSR0VUX0ZJTEVfU0lURS5nZXRGaWxlKCkpOworCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0odGFyZ2V0KTsKKwkJCisJCVVSTCBuZXdVUkwgPW5ldyBGaWxlKGRhdGFQYXRoICsgImRhdGFFbnRyeVNpdGVUZXN0L3NpdGUxL3NpdGUueG1sIikudG9VUkwoKTsKKwkJSVNpdGUgcmVtb3RlU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUobmV3VVJMLG51bGwpOworCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGZlYXR1cmVzUmVmID0gcmVtb3RlU2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpOworCQlJU2l0ZSBsb2NhbFNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKFRBUkdFVF9GSUxFX1NJVEUsbnVsbCk7CisJCUlGZWF0dXJlIHJlbW90ZUZlYXR1cmUgPSBudWxsOworCQkKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlc1JlZi5sZW5ndGg7IGkrKykgeworCQkJcmVtb3RlRmVhdHVyZSA9IGZlYXR1cmVzUmVmW2ldLmdldEZlYXR1cmUobnVsbCk7CisJCQlsb2NhbFNpdGUuaW5zdGFsbChyZW1vdGVGZWF0dXJlLCBudWxsLG51bGwpOworCisJCQkvLyB2ZXJpZnkKKwkJCVN0cmluZyBzaXRlID0gbG9jYWxTaXRlLmdldFVSTCgpLmdldEZpbGUoKTsKKwkJCUlOb25QbHVnaW5FbnRyeVtdIGVudHJpZXMgPSByZW1vdGVGZWF0dXJlLmdldE5vblBsdWdpbkVudHJpZXMoKTsKKwkJCWFzc2VydFRydWUoIm5vIGRhdGEgZW50cnkiLCAoZW50cmllcyAhPSBudWxsICYmIGVudHJpZXMubGVuZ3RoICE9IDApKTsKKwkJCVN0cmluZyBwbHVnaW5OYW1lID0gZW50cmllc1swXS5nZXRJZGVudGlmaWVyKCkudG9TdHJpbmcoKTsKKwkJCUZpbGUgcGx1Z2luRmlsZSA9IG5ldyBGaWxlKHNpdGUsIFNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRIICsgcmVtb3RlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKStGaWxlLnNlcGFyYXRvcisgcGx1Z2luTmFtZSk7CisJCQlhc3NlcnRUcnVlKCJkYXRhIGZpbGVzIG5vdCBpbnN0YWxsZWQgbG9jYWxseToiK3BsdWdpbkZpbGUsIHBsdWdpbkZpbGUuZXhpc3RzKCkpOworCQl9IAorCisJCS8vY2xlYW51cCB0YXJnZXQgCisJCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbSh0YXJnZXQpOworCisKKwl9CisJCisJCisJLyoqCisJICogV2l0aCBzaXRlLnhtbAorCSAqLworCXB1YmxpYyB2b2lkIHRlc3REYXRhRW50cnlTaXRlUGFja2FnZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQkvL2NsZWFudXAgdGFyZ2V0IAorCQlGaWxlIHRhcmdldCA9IG5ldyBGaWxlKFRBUkdFVF9GSUxFX1NJVEUuZ2V0RmlsZSgpKTsKKwkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKHRhcmdldCk7CisJCQorCQlVUkwgbmV3VVJMID1uZXcgRmlsZShkYXRhUGF0aCArICJkYXRhRW50cnlTaXRlVGVzdC9zaXRlMi9zaXRlLnhtbCIpLnRvVVJMKCk7CisJCUlTaXRlIHJlbW90ZVNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKG5ld1VSTCxudWxsKTsKKwkJSUZlYXR1cmVSZWZlcmVuY2VbXSBmZWF0dXJlc1JlZiA9IHJlbW90ZVNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsKKwkJSVNpdGUgbG9jYWxTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShUQVJHRVRfRklMRV9TSVRFLG51bGwpOworCQlJRmVhdHVyZSByZW1vdGVGZWF0dXJlID0gbnVsbDsKKwkJCisJCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXNSZWYubGVuZ3RoOyBpKyspIHsKKwkJCXJlbW90ZUZlYXR1cmUgPSBmZWF0dXJlc1JlZltpXS5nZXRGZWF0dXJlKG51bGwpOworCQkJbG9jYWxTaXRlLmluc3RhbGwocmVtb3RlRmVhdHVyZSwgbnVsbCxudWxsKTsKKworCQkJLy8gdmVyaWZ5CisJCQlTdHJpbmcgc2l0ZSA9IGxvY2FsU2l0ZS5nZXRVUkwoKS5nZXRGaWxlKCk7CisJCQlJTm9uUGx1Z2luRW50cnlbXSBlbnRyaWVzID0gcmVtb3RlRmVhdHVyZS5nZXROb25QbHVnaW5FbnRyaWVzKCk7CisJCQlhc3NlcnRUcnVlKCJubyBkYXRhIGVudHJ5IiwgKGVudHJpZXMgIT0gbnVsbCAmJiBlbnRyaWVzLmxlbmd0aCAhPSAwKSk7CisJCQllbnRyaWVzWzBdLmdldElkZW50aWZpZXIoKS50b1N0cmluZygpOworCQkJRmlsZSBwbHVnaW5GaWxlID0gbmV3IEZpbGUoc2l0ZSwgU2l0ZS5ERUZBVUxUX0lOU1RBTExFRF9GRUFUVVJFX1BBVEggKyByZW1vdGVGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpK0ZpbGUuc2VwYXJhdG9yKyAibm9uZGF0YSIrRmlsZS5zZXBhcmF0b3IrImZpbGUxLnppcCIpOworCQkJYXNzZXJ0VHJ1ZSgiRGF0YSBmaWxlIGluc2lkZSB0aGUgamFyIG5vdCBpbnN0YWxsZWQgbG9jYWxseToiK3BsdWdpbkZpbGUsIHBsdWdpbkZpbGUuZXhpc3RzKCkpOworCQkJcGx1Z2luRmlsZSA9IG5ldyBGaWxlKHNpdGUsIFNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRIICsgcmVtb3RlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKStGaWxlLnNlcGFyYXRvcisgImZpbGUuemlwIik7CisJCQlhc3NlcnRUcnVlKCJEYXRhIGZpbGUgb3V0c2lkZSB0aGUgamFyIG5vdCBpbnN0YWxsZWQgbG9jYWxseToiK3BsdWdpbkZpbGUsIHBsdWdpbkZpbGUuZXhpc3RzKCkpOworCQkJCisJCX0gCisJCQorCisJCS8vY2xlYW51cCB0YXJnZXQgCisJCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbSh0YXJnZXQpOworCisKKwl9CQorCQorfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcmVndWxhckluc3RhbGwvVGVzdEV4ZWN1dGFibGVJbnN0YWxsLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9yZWd1bGFySW5zdGFsbC9UZXN0RXhlY3V0YWJsZUluc3RhbGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjlkZmU0Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcmVndWxhckluc3RhbGwvVGVzdEV4ZWN1dGFibGVJbnN0YWxsLmphdmEKQEAgLTAsMCArMSw3MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5yZWd1bGFySW5zdGFsbDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworCitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLlVwZGF0ZU1hbmFnZXJVdGlsczsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlTWFuYWdlclRlc3RDYXNlOworCisKK3B1YmxpYyBjbGFzcyBUZXN0RXhlY3V0YWJsZUluc3RhbGwgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2UgeworCisJLyoqCisJICogQ29uc3RydWN0b3IgZm9yIFRlc3QxCisJICovCisJcHVibGljIFRlc3RFeGVjdXRhYmxlSW5zdGFsbChTdHJpbmcgYXJnMCkgeworCQlzdXBlcihhcmcwKTsKKwl9CisJCisKKworCXB1YmxpYyB2b2lkIHRlc3RGaWxlU2l0ZSgpIHRocm93cyBFeGNlcHRpb257CisJCQorCQkvL2NsZWFudXAgdGFyZ2V0IAorCQlGaWxlIHRhcmdldCA9IG5ldyBGaWxlKFRBUkdFVF9GSUxFX1NJVEUuZ2V0RmlsZSgpKTsKKwkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKHRhcmdldCk7CQkKKwkJSW5zdGFsbFJlZ2lzdHJ5LmNsZWFudXAoKTsKKwkJCisJCUlTaXRlIHJlbW90ZVNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKFNPVVJDRV9GSUxFX1NJVEVfSU5TVEFMTEVELG51bGwpOworCQlJRmVhdHVyZVJlZmVyZW5jZVtdIHJlbW90ZUZlYXR1cmVSZWZlcmVuY2UgPSByZW1vdGVTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7CisJCUlGZWF0dXJlIHJlbW90ZUZlYXR1cmUgPSByZW1vdGVGZWF0dXJlUmVmZXJlbmNlWzBdLmdldEZlYXR1cmUobnVsbCk7CisJCUlTaXRlIGxvY2FsU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoVEFSR0VUX0ZJTEVfU0lURSxudWxsKTsKKwkJYXNzZXJ0Tm90TnVsbChyZW1vdGVGZWF0dXJlKTsKKwkJcmVtb3ZlKHJlbW90ZUZlYXR1cmUsbG9jYWxTaXRlKTsJCQorCQlsb2NhbFNpdGUuaW5zdGFsbChyZW1vdGVGZWF0dXJlLG51bGwsbnVsbCk7CisJCQorCQkvLyB2ZXJpZnkKKwkJU3RyaW5nIHNpdGUgPSBsb2NhbFNpdGUuZ2V0VVJMKCkuZ2V0RmlsZSgpOworCQlJUGx1Z2luRW50cnlbXSBlbnRyaWVzID0gcmVtb3RlRmVhdHVyZS5nZXRSYXdQbHVnaW5FbnRyaWVzKCk7CisJCWFzc2VydFRydWUoIm5vIHBsdWdpbnMgZW50cnkiLChlbnRyaWVzIT1udWxsICYmIGVudHJpZXMubGVuZ3RoIT0wKSk7CisJCVN0cmluZyBwbHVnaW5OYW1lPSBlbnRyaWVzWzBdLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpOworCQlGaWxlIHBsdWdpbkZpbGUgPSBuZXcgRmlsZShzaXRlLFNpdGUuREVGQVVMVF9QTFVHSU5fUEFUSCtwbHVnaW5OYW1lKTsKKwkJaWYgKExvY2FsZS5nZXREZWZhdWx0KCkudG9TdHJpbmcoKS5pbmRleE9mKCJ1cyIpICE9IC0xKQorCQkJYXNzZXJ0VHJ1ZSgicGx1Z2luIGZpbGVzIG5vdCBpbnN0YWxsZWQgbG9jYWxseSIscGx1Z2luRmlsZS5leGlzdHMoKSk7CisKKwkJRmlsZSBmZWF0dXJlRmlsZSA9IG5ldyBGaWxlKHNpdGUsU2l0ZS5ERUZBVUxUX0lOU1RBTExFRF9GRUFUVVJFX1BBVEgrcmVtb3RlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSk7CisJCWFzc2VydFRydWUoImZlYXR1cmUgaW5mbyBub3QgaW5zdGFsbGVkIGxvY2FsbHk6IitmZWF0dXJlRmlsZSxmZWF0dXJlRmlsZS5leGlzdHMoKSk7CisJCWFzc2VydFRydWUoImZlYXR1cmUgaXMgYSBmaWxlLCBub3QgYSBkaXJlY3Rvcnk6IitmZWF0dXJlRmlsZSxmZWF0dXJlRmlsZS5pc0RpcmVjdG9yeSgpKTsKKworCQkKKwkJRmlsZSBmZWF0dXJlRmlsZVhNTCA9IG5ldyBGaWxlKHNpdGUsU2l0ZS5ERUZBVUxUX0lOU1RBTExFRF9GRUFUVVJFX1BBVEgrcmVtb3RlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKStGaWxlLnNlcGFyYXRvcisiZmVhdHVyZS54bWwiKTsKKwkJYXNzZXJ0VHJ1ZSgiZmVhdHVyZSBpbmZvIG5vdCBpbnN0YWxsZWQgbG9jYWxseTogbm8gZmVhdHVyZS54bWwiLGZlYXR1cmVGaWxlWE1MLmV4aXN0cygpKTsKKworCQkvL2NsZWFudXAgdGFyZ2V0IAorCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0odGFyZ2V0KTsKKwkJCisJfQorCit9CisKKwpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcmVndWxhckluc3RhbGwvVGVzdEV4ZWN1dGFibGVQYWNrYWdlZEluc3RhbGwuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3JlZ3VsYXJJbnN0YWxsL1Rlc3RFeGVjdXRhYmxlUGFja2FnZWRJbnN0YWxsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQyMmNmYgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3JlZ3VsYXJJbnN0YWxsL1Rlc3RFeGVjdXRhYmxlUGFja2FnZWRJbnN0YWxsLmphdmEKQEAgLTAsMCArMSwxNTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMucmVndWxhckluc3RhbGw7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZU1hbmFnZXJUZXN0Q2FzZTsKKworcHVibGljIGNsYXNzIFRlc3RFeGVjdXRhYmxlUGFja2FnZWRJbnN0YWxsIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsKKwkvKioKKwkgKiBDb25zdHJ1Y3RvciBmb3IgVGVzdDEKKwkgKi8KKwlwdWJsaWMgVGVzdEV4ZWN1dGFibGVQYWNrYWdlZEluc3RhbGwoU3RyaW5nIGFyZzApIHsKKwkJc3VwZXIoYXJnMCk7CisJfQorCisJLyoqCisJICogV2l0aCBzaXRlLnhtbAorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RGaWxlUGFja2FnZUV4ZWN1dGFibGVGZWF0dXJlU2l0ZSgpIHRocm93cyBFeGNlcHRpb24geworCisJCS8vY2xlYW51cCB0YXJnZXQgIAorCQlGaWxlIHRhcmdldCA9IG5ldyBGaWxlKFRBUkdFVF9GSUxFX1NJVEUuZ2V0RmlsZSgpKTsKKwkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKHRhcmdldCk7CisJCQorCQlVUkwgbmV3VVJMID0gbmV3IEZpbGUoZGF0YVBhdGggKyAiRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvc2l0ZS54bWwiKS50b1VSTCgpOworCQlJU2l0ZSByZW1vdGVTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShuZXdVUkwsbnVsbCk7CisJCUlGZWF0dXJlUmVmZXJlbmNlW10gZmVhdHVyZXNSZWYgPSByZW1vdGVTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7CisJCUlTaXRlIGxvY2FsU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoVEFSR0VUX0ZJTEVfU0lURSxudWxsKTsKKwkJSUZlYXR1cmUgcmVtb3RlRmVhdHVyZSA9IG51bGw7CisJCQorCQkvLyBhdCBsZWFzdCBvbmUgZXhlY3V0YWJsZSBmZWF0dXJlIGFuZCBvbiBwYWNrYWdlZAorCQlib29sZWFuIGV4ZWNGZWF0dXJlID0gZmFsc2U7CisJCWJvb2xlYW4gcGFja0ZlYXR1cmUgPSBmYWxzZTsKKworCQlpZiAoZmVhdHVyZXNSZWYubGVuZ3RoPT0wKSBmYWlsICgibm8gZmVhdHVyZSBmb3VuZCIpOworCQorCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzUmVmLmxlbmd0aDsgaSsrKSB7CisJCQlyZW1vdGVGZWF0dXJlID0gZmVhdHVyZXNSZWZbaV0uZ2V0RmVhdHVyZShudWxsKTsKKwkJCXJlbW92ZShyZW1vdGVGZWF0dXJlLGxvY2FsU2l0ZSk7CQkJCisJCQlsb2NhbFNpdGUuaW5zdGFsbChyZW1vdGVGZWF0dXJlLCBudWxsLG51bGwpOworCQkJCisJCQlpZiAocmVtb3RlRmVhdHVyZS5nZXRGZWF0dXJlQ29udGVudFByb3ZpZGVyKCkgaW5zdGFuY2VvZiBGZWF0dXJlUGFja2FnZWRDb250ZW50UHJvdmlkZXIpIHBhY2tGZWF0dXJlID0gdHJ1ZTsKKwkJCWlmIChyZW1vdGVGZWF0dXJlLmdldEZlYXR1cmVDb250ZW50UHJvdmlkZXIoKSBpbnN0YW5jZW9mIEZlYXR1cmVFeGVjdXRhYmxlQ29udGVudFByb3ZpZGVyKSBleGVjRmVhdHVyZSA9IHRydWU7CisKKwkJCS8vIHZlcmlmeQorCQkJU3RyaW5nIHNpdGUgPSBsb2NhbFNpdGUuZ2V0VVJMKCkuZ2V0RmlsZSgpOworCQkJSVBsdWdpbkVudHJ5W10gZW50cmllcyA9IHJlbW90ZUZlYXR1cmUuZ2V0UmF3UGx1Z2luRW50cmllcygpOworCQkJYXNzZXJ0VHJ1ZSgibm8gcGx1Z2lucyBlbnRyeSIsIChlbnRyaWVzICE9IG51bGwgJiYgZW50cmllcy5sZW5ndGggIT0gMCkpOworCQkJU3RyaW5nIHBsdWdpbk5hbWUgPSBlbnRyaWVzWzBdLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpOworCQkJRmlsZSBwbHVnaW5GaWxlID0gbmV3IEZpbGUoc2l0ZSwgU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRIICsgcGx1Z2luTmFtZSk7CisJCQlpZiAoIXBsdWdpbkZpbGUuZXhpc3RzKCkpIHsKKwkJCQkvL3ByaW50IG91dCBtb3JlIGZhaWx1cmUgZGV0YWlscyAtIHNlZSBidWcgMjcxMTk2CisJCQkJRmlsZVtdIGV4aXN0aW5nID0gcGx1Z2luRmlsZS5nZXRQYXJlbnRGaWxlKCkubGlzdEZpbGVzKCk7CisJCQkJU3RyaW5nIGRldGFpbCA9IGV4aXN0aW5nID09IG51bGwgPyAibm8gY2hpbGRyZW4iIDogU3RyaW5nLnZhbHVlT2YoQXJyYXlzLmFzTGlzdChleGlzdGluZykpOworCQkJCWFzc2VydFRydWUoInBsdWdpbiBmaWxlcyBub3QgaW5zdGFsbGVkIGxvY2FsbHk6IitwbHVnaW5GaWxlICsgImNoaWxkcmVuIGZvdW5kOiAiICsgZGV0YWlsLCBwbHVnaW5GaWxlLmV4aXN0cygpKTsKKwkJCX0KKworCQkJRmlsZSBmZWF0dXJlRmlsZSA9IG5ldyBGaWxlKHNpdGUsIFNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRIICsgcmVtb3RlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSk7CisJCQlhc3NlcnRUcnVlKCJmZWF0dXJlIGluZm8gbm90IGluc3RhbGxlZCBsb2NhbGx5OiIrZmVhdHVyZUZpbGUsIGZlYXR1cmVGaWxlLmV4aXN0cygpKTsKKworCQkJRmlsZSBmZWF0dXJlRmlsZVhNTCA9IG5ldyBGaWxlKHNpdGUsIFNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRIICsgcmVtb3RlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSArIEZpbGUuc2VwYXJhdG9yICsgImZlYXR1cmUueG1sIik7CisJCQlhc3NlcnRUcnVlKCJmZWF0dXJlIGluZm8gbm90IGluc3RhbGxlZCBsb2NhbGx5OiBubyBmZWF0dXJlLnhtbCIsIGZlYXR1cmVGaWxlWE1MLmV4aXN0cygpKTsKKwkJfQorCisJCWlmICghZXhlY0ZlYXR1cmUgJiYgIXBhY2tGZWF0dXJlKXsKKwkJCWZhaWwoImNhbm5vdCBmaW5kIG9uZSBleGVjdXRhYmxlIGFuZCBvbmUgcGFja2FnZSBmZWF0dXJlIG9uIHRlaCBzaXRlIik7CisJCX0KKworCQkvL2NsZWFudXAgdGFyZ2V0IAorCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0odGFyZ2V0KTsKKworCisJfQorCQorCQorCS8qKgorCSAqIFdpdGhvdXQgc2l0ZS54bWwKKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0RmlsZU5vU2l0ZVhNTFNpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQkvL2NsZWFudXAgdGFyZ2V0IAorCQlGaWxlIHRhcmdldCA9IG5ldyBGaWxlKFRBUkdFVF9GSUxFX1NJVEUuZ2V0RmlsZSgpKTsKKwkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKHRhcmdldCk7CisJCQorCQlVUkwgbmV3VVJMID0gbmV3IEZpbGUoZGF0YVBhdGggKyAiRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YS8iKS50b1VSTCgpOworCQlJU2l0ZSByZW1vdGVTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShuZXdVUkwsbnVsbCk7CisJCUlGZWF0dXJlUmVmZXJlbmNlW10gZmVhdHVyZXNSZWYgPSByZW1vdGVTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7CisJCUlTaXRlIGxvY2FsU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoVEFSR0VUX0ZJTEVfU0lURSxudWxsKTsKKwkJSUZlYXR1cmUgcmVtb3RlRmVhdHVyZSA9IG51bGw7CisJCQorCQkvLyBhdCBsZWFzdCBvbmUgZXhlY3V0YWJsZSBmZWF0dXJlIGFuZCBvbiBwYWNrYWdlZAorCQlib29sZWFuIGV4ZWNGZWF0dXJlID0gZmFsc2U7CisJCWJvb2xlYW4gcGFja0ZlYXR1cmUgPSBmYWxzZTsKKworCQlpZiAoZmVhdHVyZXNSZWYubGVuZ3RoPT0wKSBmYWlsICgibm8gZmVhdHVyZSBmb3VuZCIpOworCQorCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzUmVmLmxlbmd0aDsgaSsrKSB7CisJCQl0cnkgeworCQkJCXJlbW90ZUZlYXR1cmUgPSBmZWF0dXJlc1JlZltpXS5nZXRGZWF0dXJlKG51bGwpOworCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKXsKKwkJCQlUaHJvd2FibGUgZTEgPSBlLmdldFN0YXR1cygpLmdldEV4Y2VwdGlvbigpOworCQkJCVN0cmluZyBtc2cgPSBlMS5nZXRNZXNzYWdlKCkucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsJy8nKTsKKwkJCQlpZiAobXNnLmluZGV4T2YoIkNWUy9mZWF0dXJlLnhtbCIpPT0tMSl7CisJCQkJCXRocm93IGU7CisJCQkJfQkJCQkKKwkJCX0KKwkJCWlmIChyZW1vdGVGZWF0dXJlIT1udWxsKXsKKwkJCQlyZW1vdmUocmVtb3RlRmVhdHVyZSxsb2NhbFNpdGUpOworCQkJCWxvY2FsU2l0ZS5pbnN0YWxsKHJlbW90ZUZlYXR1cmUsbnVsbCwgbnVsbCk7CisJCQkJCisJCQkJaWYgKHJlbW90ZUZlYXR1cmUuZ2V0RmVhdHVyZUNvbnRlbnRQcm92aWRlcigpIGluc3RhbmNlb2YgRmVhdHVyZVBhY2thZ2VkQ29udGVudFByb3ZpZGVyKSBwYWNrRmVhdHVyZSA9IHRydWU7CisJCQkJaWYgKHJlbW90ZUZlYXR1cmUuZ2V0RmVhdHVyZUNvbnRlbnRQcm92aWRlcigpIGluc3RhbmNlb2YgRmVhdHVyZUV4ZWN1dGFibGVDb250ZW50UHJvdmlkZXIpIGV4ZWNGZWF0dXJlID0gdHJ1ZTsKKwkKKwkJCQkvLyB2ZXJpZnkKKwkJCQlTdHJpbmcgc2l0ZSA9IGxvY2FsU2l0ZS5nZXRVUkwoKS5nZXRGaWxlKCk7CisJCQkJSVBsdWdpbkVudHJ5W10gZW50cmllcyA9IHJlbW90ZUZlYXR1cmUuZ2V0UmF3UGx1Z2luRW50cmllcygpOworCQkJCWFzc2VydFRydWUoIm5vIHBsdWdpbnMgZW50cnkiLCAoZW50cmllcyAhPSBudWxsICYmIGVudHJpZXMubGVuZ3RoICE9IDApKTsKKwkJCQlTdHJpbmcgcGx1Z2luTmFtZSA9IGVudHJpZXNbMF0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCk7CisJCQkJRmlsZSBwbHVnaW5GaWxlID0gbmV3IEZpbGUoc2l0ZSwgU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRIICsgcGx1Z2luTmFtZSk7CisJCQkJYXNzZXJ0VHJ1ZSgicGx1Z2luIGZpbGVzIG5vdCBpbnN0YWxsZWQgbG9jYWxseToiK3BsdWdpbkZpbGUsIHBsdWdpbkZpbGUuZXhpc3RzKCkpOworCQorCQkJCUZpbGUgZmVhdHVyZUZpbGUgPSBuZXcgRmlsZShzaXRlLCBTaXRlLkRFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfUEFUSCArIHJlbW90ZUZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpOworCQkJCWFzc2VydFRydWUoImZlYXR1cmUgaW5mbyBub3QgaW5zdGFsbGVkIGxvY2FsbHk6IitmZWF0dXJlRmlsZSwgZmVhdHVyZUZpbGUuZXhpc3RzKCkpOworCQorCQkJCUZpbGUgZmVhdHVyZUZpbGVYTUwgPSBuZXcgRmlsZShzaXRlLCBTaXRlLkRFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfUEFUSCArIHJlbW90ZUZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkgKyBGaWxlLnNlcGFyYXRvciArICJmZWF0dXJlLnhtbCIpOworCQkJCWFzc2VydFRydWUoImZlYXR1cmUgaW5mbyBub3QgaW5zdGFsbGVkIGxvY2FsbHk6IG5vIGZlYXR1cmUueG1sIiwgZmVhdHVyZUZpbGVYTUwuZXhpc3RzKCkpOworCQkJfQorCQl9CisKKwkJaWYgKCFleGVjRmVhdHVyZSAmJiAhcGFja0ZlYXR1cmUpeworCQkJZmFpbCgiY2Fubm90IGZpbmQgb25lIGV4ZWN1dGFibGUgYW5kIG9uZSBwYWNrYWdlIGZlYXR1cmUgb24gdGVoIHNpdGUiKTsKKwkJfQorCisJCS8vY2xlYW51cCB0YXJnZXQgCisJCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbSh0YXJnZXQpOworCisKKwl9CisJCit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9yZWd1bGFySW5zdGFsbC9UZXN0R2V0RmVhdHVyZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcmVndWxhckluc3RhbGwvVGVzdEdldEZlYXR1cmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjIwOTE0Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcmVndWxhckluc3RhbGwvVGVzdEdldEZlYXR1cmUuamF2YQpAQCAtMCwwICsxLDQ5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnJlZ3VsYXJJbnN0YWxsOworCitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlTWFuYWdlclRlc3RDYXNlOworCisKK3B1YmxpYyBjbGFzcyBUZXN0R2V0RmVhdHVyZSBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7CisKKwkvKioKKwkgKiBUZXN0IHRoZSBnZXRGZWF0dXJlcygpCisJICovCisJcHVibGljIFRlc3RHZXRGZWF0dXJlKFN0cmluZyBhcmcwKSB7CisJCXN1cGVyKGFyZzApOworCX0KKwkKKwkKKwlwdWJsaWMgdm9pZCB0ZXN0RmVhdHVyZUZpbGVTaXRlKCkgdGhyb3dzIEV4Y2VwdGlvbnsKKwkJCisJCUlTaXRlIHJlbW90ZVNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKFNPVVJDRV9GSUxFX1NJVEUsbnVsbCk7CisJCUlGZWF0dXJlUmVmZXJlbmNlW10gcmVtb3RlRmVhdHVyZXMgPSByZW1vdGVTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7CisJCWlmIChyZW1vdGVGZWF0dXJlcz09bnVsbCB8fCByZW1vdGVGZWF0dXJlcy5sZW5ndGg9PTApIGZhaWwoIk5vIGZlYXR1cmUgYXZhaWxhYmxlIGZvciB0ZXN0aW5nIik7CisJCWZvciAoaW50IGk9MDtpPHJlbW90ZUZlYXR1cmVzLmxlbmd0aDtpKyspeworCQkJU3lzdGVtLm91dC5wcmludGxuKCJmZWF0dXJlOiIrcmVtb3RlRmVhdHVyZXNbaV0uZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKSk7CisJCX0KKwl9CisKKworCXB1YmxpYyB2b2lkIHRlc3RGZWF0dXJlSFRUUFNpdGUoKSB0aHJvd3MgRXhjZXB0aW9ueyAKKwkJCisJCUlTaXRlIHJlbW90ZVNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKFNPVVJDRV9IVFRQX1NJVEUsbnVsbCk7CisJCUlGZWF0dXJlUmVmZXJlbmNlW10gcmVtb3RlRmVhdHVyZXMgPSByZW1vdGVTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7CisJCWlmIChyZW1vdGVGZWF0dXJlcz09bnVsbCB8fCByZW1vdGVGZWF0dXJlcy5sZW5ndGg9PTApIGZhaWwoIk5vIGZlYXR1cmUgYXZhaWxhYmxlIGZvciB0ZXN0aW5nIik7CQkKKwkJZm9yIChpbnQgaT0wO2k8cmVtb3RlRmVhdHVyZXMubGVuZ3RoO2krKyl7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oImZlYXR1cmU6IityZW1vdGVGZWF0dXJlc1tpXS5nZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpKTsKKwkJfQorCX0KK30KKworCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9yZWd1bGFySW5zdGFsbC9UZXN0SW5zdGFsbC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcmVndWxhckluc3RhbGwvVGVzdEluc3RhbGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTgxZjg0Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcmVndWxhckluc3RhbGwvVGVzdEluc3RhbGwuamF2YQpAQCAtMCwwICsxLDMyOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5yZWd1bGFySW5zdGFsbDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi5JQ29uZmlndXJlZFNpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uSUNvbmZpZ3VyZWRTaXRlQ2hhbmdlZExpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLklMb2NhbFNpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmVSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVBsdWdpbkVudHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklTaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlNpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuU2l0ZUZlYXR1cmVSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuU2l0ZU1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuQ29uZmlndXJlZFNpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuSW5zdGFsbENvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuSW5zdGFsbFJlZ2lzdHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLkxvY2FsU2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5VcGRhdGVDb3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLlVwZGF0ZU1hbmFnZXJVdGlsczsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlTWFuYWdlclRlc3RDYXNlOworCitwdWJsaWMgY2xhc3MgVGVzdEluc3RhbGwgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2UgeworCisJLyoqCisJICogCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFDS0FHRURfRkVBVFVSRV9UWVBFID0gInBhY2thZ2VkIjsgLy8kTk9OLU5MUy0xJAorCQorCXB1YmxpYyBTZXQgZmlsZXNUb0RlbGV0ZSA9IG5ldyBIYXNoU2V0KCk7CisJCisKKwlwdWJsaWMgY2xhc3MgTGlzdGVuZXIgaW1wbGVtZW50cyBJQ29uZmlndXJlZFNpdGVDaGFuZ2VkTGlzdGVuZXIgeworCisJCXB1YmxpYyBib29sZWFuIG5vdGlmaWVkID0gZmFsc2U7CisKKwkJcHVibGljIHZvaWQgZmVhdHVyZUluc3RhbGxlZChJRmVhdHVyZSBmZWF0dXJlKSB7CisJCQlub3RpZmllZCA9IHRydWU7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5vdGlmaWVkIERlZmF1bHRGZWF0dXJlIEluc3RhbGxlZCIpOworCQl9CisKKwkJcHVibGljIHZvaWQgZmVhdHVyZVJlbW92ZWQoSUZlYXR1cmUgZmVhdHVyZSkgeworCQl9CisKKwkJcHVibGljIHZvaWQgZmVhdHVyZUNvbmZpZ3VyZWQoSUZlYXR1cmUgZmVhdHVyZSkgeworCQl9CisJCXB1YmxpYyB2b2lkIGZlYXR1cmVVbmNvbmZpZ3VyZWQoSUZlYXR1cmUgZmVhdHVyZSkgeworCQl9CisKKwkJcHVibGljIGJvb2xlYW4gaXNOb3RpZmllZCgpIHsKKwkJCXJldHVybiBub3RpZmllZDsKKwkJfQorCX0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yIGZvciBUZXN0MQorCSAqLworCXB1YmxpYyBUZXN0SW5zdGFsbChTdHJpbmcgYXJnMCkgeworCQlzdXBlcihhcmcwKTsKKwl9CisKKwlwcml2YXRlIElGZWF0dXJlIGdldEZlYXR1cmUxKElTaXRlIHNpdGUpCisJCXRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24geworCQlTaXRlRmVhdHVyZVJlZmVyZW5jZSByZWYgPSBuZXcgU2l0ZUZlYXR1cmVSZWZlcmVuY2UoKTsKKwkJcmVmLnNldFNpdGUoc2l0ZSk7CisJCXJlZi5zZXRVUkxTdHJpbmcoImZlYXR1cmVzL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxXzEuMC40LmphciIpOworCQlyZWYuc2V0VHlwZShnZXREZWZhdWx0SW5zdGFsbGFibGVGZWF0dXJlVHlwZSgpKTsKKwkJcmVmLnJlc29sdmUoc2l0ZS5nZXRVUkwoKSwgbnVsbCk7CisJCXJldHVybiByZWYuZ2V0RmVhdHVyZShudWxsKTsKKwl9CisJCisKKworCXB1YmxpYyB2b2lkIHRlc3RGaWxlU2l0ZSgpIHRocm93cyBFeGNlcHRpb24geworCisJCUlTaXRlIHJlbW90ZVNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKFNPVVJDRV9GSUxFX1NJVEUsbnVsbCk7CisJCUlGZWF0dXJlIHJlbW90ZUZlYXR1cmUgPSBnZXRGZWF0dXJlMShyZW1vdGVTaXRlKTsKKwkJSVNpdGUgbG9jYWxTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShUQVJHRVRfRklMRV9TSVRFLCBudWxsKTsKKwkJZmlsZXNUb0RlbGV0ZS5hZGQobmV3IEZpbGUobG9jYWxTaXRlLmdldFVSTCgpLmdldEZpbGUoKSkpOworCQlsb2NhbFNpdGUuaW5zdGFsbChyZW1vdGVGZWF0dXJlLCBudWxsLCBudWxsKTsKKworCQkvLyB2ZXJpZnkKKwkJU3RyaW5nIHNpdGUgPSBsb2NhbFNpdGUuZ2V0VVJMKCkuZ2V0RmlsZSgpOworCQlJUGx1Z2luRW50cnlbXSBlbnRyaWVzID0gcmVtb3RlRmVhdHVyZS5nZXRQbHVnaW5FbnRyaWVzKCk7CisJCWFzc2VydFRydWUoIm5vIHBsdWdpbnMgZW50cnkiLCAoZW50cmllcyAhPSBudWxsICYmIGVudHJpZXMubGVuZ3RoICE9IDApKTsKKwkJU3RyaW5nIHBsdWdpbk5hbWUgPSBlbnRyaWVzWzBdLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpOworCQlGaWxlIHBsdWdpbkZpbGUgPSBuZXcgRmlsZShzaXRlLCBTaXRlLkRFRkFVTFRfUExVR0lOX1BBVEggKyBwbHVnaW5OYW1lKTsKKwkJZmlsZXNUb0RlbGV0ZS5hZGQocGx1Z2luRmlsZSk7CisJCWFzc2VydFRydWUoInBsdWdpbiBmaWxlcyBub3QgaW5zdGFsbGVkIGxvY2FsbHk6IitwbHVnaW5GaWxlLCBwbHVnaW5GaWxlLmV4aXN0cygpKTsKKwkJRmlsZSBwbHVnaW5YTUxGaWxlID0KKwkJCW5ldyBGaWxlKAorCQkJCXNpdGUsCisJCQkJU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRIICsgcGx1Z2luTmFtZSArIEZpbGUuc2VwYXJhdG9yICsgInBsdWdpbi54bWwiKTsKKwkJYXNzZXJ0VHJ1ZSgicGx1Z2luLnhtbCBmaWxlIG5vdCBpbnN0YWxsZWQgbG9jYWxseSIsIHBsdWdpblhNTEZpbGUuZXhpc3RzKCkpOworCisJCUZpbGUgZmVhdHVyZUZpbGUgPQorCQkJbmV3IEZpbGUoCisJCQkJc2l0ZSwKKwkJCQlTaXRlLkRFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfUEFUSAorCQkJCQkrIHJlbW90ZUZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpOworCQlhc3NlcnRUcnVlKAorCQkJImZlYXR1cmUgaW5mbyBub3QgaW5zdGFsbGVkIGxvY2FsbHk6IiArIGZlYXR1cmVGaWxlLAorCQkJZmVhdHVyZUZpbGUuZXhpc3RzKCkpOworCisJfQorCisJLyoqCisJICogCisJICovCisJcHVibGljIHZvaWQgdGVzdEhUVFBTaXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJSVNpdGUgcmVtb3RlU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoU09VUkNFX0hUVFBfU0lURSxudWxsKTsKKwkJSUZlYXR1cmVSZWZlcmVuY2VbXSBmZWF0dXJlcyA9IHJlbW90ZVNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsKKwkJSUZlYXR1cmUgcmVtb3RlRmVhdHVyZSA9IG51bGw7CisKKwkJaWYgKGZlYXR1cmVzID09IG51bGwgfHwgZmVhdHVyZXMubGVuZ3RoID09IDApCisJCQlmYWlsKCJObyBmZWF0dXJlcyBvbiB0aGUgc2l0ZSIpOworCisJCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXMubGVuZ3RoOyBpKyspIHsKKwkJCWlmIChmZWF0dXJlc1tpXS5nZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpLmVuZHNXaXRoKCJmZWF0dXJlczIuamFyIikpIHsKKwkJCQlyZW1vdGVGZWF0dXJlID0gZmVhdHVyZXNbaV0uZ2V0RmVhdHVyZShudWxsKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWFzc2VydE5vdE51bGwoIkNhbm5vdCBmaW5kIGZlYXR1cmUyLmphciBvbiBzaXRlIiwgcmVtb3RlRmVhdHVyZSk7CisJCUlTaXRlIGxvY2FsU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoVEFSR0VUX0ZJTEVfU0lURSwgbnVsbCk7CisJCWZpbGVzVG9EZWxldGUuYWRkKG5ldyBGaWxlKGxvY2FsU2l0ZS5nZXRVUkwoKS5nZXRGaWxlKCkpKTsKKwkJbG9jYWxTaXRlLmluc3RhbGwocmVtb3RlRmVhdHVyZSwgbnVsbCwgbnVsbCk7CisKKwkJLy8gZmVhdHVyZTIuamFyIHNob3VsZCBub3QgYmUgaW4gdGhlIGxvY2FsIHNpdGUKKwkJSUZlYXR1cmVSZWZlcmVuY2VbXSBsb2NhbEZlYXR1cmVzID0gbG9jYWxTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7CisJCWlmIChsb2NhbEZlYXR1cmVzID09IG51bGwgfHwgbG9jYWxGZWF0dXJlcy5sZW5ndGggPT0gMCkKKwkJCWZhaWwoIk5vIGZlYXR1cmVzIG9uIHRoZSB0YXJnZXQgc2l0ZSIpOworCisJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NhbEZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7CisJCQlpZiAobG9jYWxGZWF0dXJlc1tpXS5nZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpLmVuZHNXaXRoKCJmZWF0dXJlczIuamFyIikpIHsKKwkJCQlmb3VuZCA9IHRydWU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlhc3NlcnRUcnVlKAorCQkJIkZvdW5kIGZlYXR1cmUyLmphciBvbiB0YXJnZXQgc2l0ZS4gVGFyZ2V0IHNpdGUgZmVhdHVyZSByZWYgc2hvdWxkbm90IGNvbnRhaW4gSkFSIGZpbGUiLAorCQkJIWZvdW5kKTsKKworCQkvLyBjaGVjaworCQlTdHJpbmcgc2l0ZSA9IGxvY2FsU2l0ZS5nZXRVUkwoKS5nZXRGaWxlKCk7CisJCUlQbHVnaW5FbnRyeVtdIGVudHJpZXMgPSByZW1vdGVGZWF0dXJlLmdldFBsdWdpbkVudHJpZXMoKTsKKwkJYXNzZXJ0VHJ1ZSgibm8gcGx1Z2lucyBlbnRyeSIsIChlbnRyaWVzICE9IG51bGwgJiYgZW50cmllcy5sZW5ndGggIT0gMCkpOworCisJCVN0cmluZyBwbHVnaW5OYW1lID0gZW50cmllc1swXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKTsKKwkJRmlsZSBwbHVnaW5GaWxlID0gbmV3IEZpbGUoc2l0ZSwgU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRIICsgcGx1Z2luTmFtZSk7CisJCWZpbGVzVG9EZWxldGUuYWRkKHBsdWdpbkZpbGUpOworCQlhc3NlcnRUcnVlKCJwbHVnaW4gaW5mbyBub3QgaW5zdGFsbGVkIGxvY2FsbHk6IitwbHVnaW5GaWxlLCBwbHVnaW5GaWxlLmV4aXN0cygpKTsKKworCQlGaWxlIGZlYXR1cmVGaWxlID0KKwkJCW5ldyBGaWxlKAorCQkJCXNpdGUsCisJCQkJU2l0ZS5ERUZBVUxUX0lOU1RBTExFRF9GRUFUVVJFX1BBVEgKKwkJCQkJKyByZW1vdGVGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKTsKKwkJYXNzZXJ0VHJ1ZSgiZmVhdHVyZSBpbmZvIG5vdCBpbnN0YWxsZWQgbG9jYWxseSIsIGZlYXR1cmVGaWxlLmV4aXN0cygpKTsKKwkJCisJfQorCisJcHVibGljIHZvaWQgdGVzdEluc3RhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQkvLyBjbGVhbnVwIGxvY2FsIGZpbGVzLi4uCisJCUZpbGUgbG9jYWxGaWxlID0gbmV3IEZpbGUoKChMb2NhbFNpdGUpU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkpLmdldExvY2F0aW9uVVJMKCkuZ2V0RmlsZSgpKTsKKwkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGxvY2FsRmlsZSk7CisKKwkJVVJMIElOU1RBTExfU0lURSA9IG51bGw7CisJCXRyeSB7CisJCQlJTlNUQUxMX1NJVEUgPQorCQkJCW5ldyBVUkwoImh0dHAiLCBnZXRIdHRwSG9zdCgpLCBnZXRIdHRwUG9ydCgpLCBidW5kbGUuZ2V0U3RyaW5nKCJIVFRQX1BBVEhfMiIpKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCWZhaWwoZS50b1N0cmluZygpKTsKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCX0KKwkJCisJCUlTaXRlIHJlbW90ZVNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKElOU1RBTExfU0lURSxudWxsKTsKKwkJSUZlYXR1cmVSZWZlcmVuY2VbXSBmZWF0dXJlcyA9IHJlbW90ZVNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsKKwkJSUZlYXR1cmUgcmVtb3RlRmVhdHVyZSA9IG51bGw7CisKKwkJaWYgKGZlYXR1cmVzID09IG51bGwgfHwgZmVhdHVyZXMubGVuZ3RoID09IDApCisJCQlmYWlsKCJObyBmZWF0dXJlcyBvbiB0aGUgc2l0ZSIpOworCisJCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXMubGVuZ3RoOyBpKyspIHsKKwkJCWlmIChmZWF0dXJlc1tpXS5nZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpLmVuZHNXaXRoKCJoZWxwRmVhdHVyZS5qYXIiKSkgeworCQkJCXJlbW90ZUZlYXR1cmUgPSBmZWF0dXJlc1tpXS5nZXRGZWF0dXJlKG51bGwpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJYXNzZXJ0Tm90TnVsbCgiQ2Fubm90IGZpbmQgaGVscC5qYXIgb24gc2l0ZSIsIHJlbW90ZUZlYXR1cmUpOworCQlJTG9jYWxTaXRlIGxvY2FsU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpOworCQlJQ29uZmlndXJlZFNpdGUgc2l0ZSA9CisJCQlsb2NhbFNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5nZXRDb25maWd1cmVkU2l0ZXMoKVswXTsKKwkJTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKTsKKwkJc2l0ZS5hZGRDb25maWd1cmVkU2l0ZUNoYW5nZWRMaXN0ZW5lcihsaXN0ZW5lcik7CisKKwkJKChDb25maWd1cmVkU2l0ZSlzaXRlKS5zZXRVcGRhdGFibGUodHJ1ZSk7CisJCQorCQkvLyBsaXN0IG9mIGZpbGVzIHRvIGJlIGNsZWFuZWQgYXQgdGhlIGVuZAorCQlGaWxlIGZpbGUgPSBuZXcgRmlsZSggc2l0ZS5nZXRTaXRlKCkuZ2V0VVJMKCkuZ2V0RmlsZSgpICsKKwkJCQkJCQkgIEZpbGUuc2VwYXJhdG9yICsgCisJCQkJCQkJICBTaXRlLkRFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfUEFUSCArIAorCQkJCQkJCSAgcmVtb3RlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkpOworCQlmaWxlc1RvRGVsZXRlLmFkZChmaWxlKTsKKwkJZmlsZXNUb0RlbGV0ZS5hZGQobG9jYWxGaWxlKTsKKwkJZmlsZXNUb0RlbGV0ZS5hZGQoIG5ldyBGaWxlKCgoSW5zdGFsbENvbmZpZ3VyYXRpb24pIGxvY2FsU2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpKS5nZXRVUkwoKS5nZXRGaWxlKCkpKTsKKwkJCisJCXNpdGUuaW5zdGFsbChyZW1vdGVGZWF0dXJlLCBudWxsLCBudWxsKTsKKworCQlJUGx1Z2luRW50cnlbXSBlbnRyaWVzID0gcmVtb3RlRmVhdHVyZS5nZXRSYXdQbHVnaW5FbnRyaWVzKCk7CisJCWFzc2VydFRydWUoIm5vIHBsdWdpbnMgZW50cnkiLCAoZW50cmllcyAhPSBudWxsICYmIGVudHJpZXMubGVuZ3RoICE9IDApKTsKKworCQlTdHJpbmcgc2l0ZVBhdGggPSBzaXRlLmdldFNpdGUoKS5nZXRVUkwoKS5nZXRGaWxlKCk7CisJCVN0cmluZyBwbHVnaW5OYW1lID0gZW50cmllc1swXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKTsKKwkJRmlsZSBwbHVnaW5GaWxlID0gbmV3IEZpbGUoc2l0ZVBhdGgsIFNpdGUuREVGQVVMVF9QTFVHSU5fUEFUSCArIHBsdWdpbk5hbWUpOworCQlmaWxlc1RvRGVsZXRlLmFkZChwbHVnaW5GaWxlKTsKKwkJaWYgKExvY2FsZS5nZXREZWZhdWx0KCkudG9TdHJpbmcoKS5pbmRleE9mKCJmciIpICE9IC0xKSB7CisJCQlhc3NlcnRUcnVlKCJwbHVnaW4gaW5mbyBub3QgaW5zdGFsbGVkIGxvY2FsbHkiLCBwbHVnaW5GaWxlLmV4aXN0cygpKTsJCQkKKwkJfQorCisJCUZpbGUgZmVhdHVyZUZpbGUgPQorCQkJbmV3IEZpbGUoCisJCQkJc2l0ZVBhdGgsCisJCQkJU2l0ZS5ERUZBVUxUX0lOU1RBTExFRF9GRUFUVVJFX1BBVEgKKwkJCQkJKyByZW1vdGVGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKTsKKwkJYXNzZXJ0VHJ1ZSgiZmVhdHVyZSBpbmZvIG5vdCBpbnN0YWxsZWQgbG9jYWxseSIsIGZlYXR1cmVGaWxlLmV4aXN0cygpKTsKKwkJCisKKwkJCisKKwkJc2l0ZS5yZW1vdmVDb25maWd1cmVkU2l0ZUNoYW5nZWRMaXN0ZW5lcihsaXN0ZW5lcik7CisJCQorCQlhc3NlcnRUcnVlKCJMaXN0ZW5lciBoYXNuJ3QgcmVjZWl2ZWQgbm90aWZpY2F0aW9uIiwgbGlzdGVuZXIuaXNOb3RpZmllZCgpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0RmlsZVNpdGVXaXRob3V0U2l0ZVhNTCgpIHRocm93cyBFeGNlcHRpb24geworCisJCUlTaXRlIHJlbW90ZVNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKFNPVVJDRV9GSUxFX1NJVEUsbnVsbCk7CisJCUlGZWF0dXJlIHJlbW90ZUZlYXR1cmUgPSBnZXRGZWF0dXJlMShyZW1vdGVTaXRlKTsKKwkJCisJCUlTaXRlIGxvY2FsU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoVEFSR0VUX0ZJTEVfU0lURSxudWxsKTsKKwkJbG9jYWxTaXRlLmluc3RhbGwocmVtb3RlRmVhdHVyZSwgbnVsbCwgbnVsbCk7CisJCQorCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGZlYXR1cmVzID0gbG9jYWxTaXRlLmdldFJhd0ZlYXR1cmVSZWZlcmVuY2VzKCk7CisJCWludCBudW1iZXJPZkluc3RhbGxlZEZlYXR1cmVzID0gZmVhdHVyZXMubGVuZ3RoOworCisJCUZpbGUgZmlsZSA9CisJCQluZXcgRmlsZSgKKwkJCQlsb2NhbFNpdGUuZ2V0VVJMKCkuZ2V0RmlsZSgpCisJCQkJCSsgRmlsZS5zZXBhcmF0b3IKKwkJCQkJKyBTaXRlLkRFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfUEFUSAorCQkJCQkrIHJlbW90ZUZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpKTsKKwkJZmlsZXNUb0RlbGV0ZS5hZGQoZmlsZSk7CisJCWZpbGUgPQorCQkJbmV3IEZpbGUoCisJCQkJbG9jYWxTaXRlLmdldFVSTCgpLmdldEZpbGUoKQorCQkJCQkrIEZpbGUuc2VwYXJhdG9yCisJCQkJCSsgU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRICisJCQkJCSsgIm9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjFfMy41LjYiKTsKKwkJZmlsZXNUb0RlbGV0ZS5hZGQoZmlsZSk7CisJCWZpbGUgPQorCQkJbmV3IEZpbGUoCisJCQkJbG9jYWxTaXRlLmdldFVSTCgpLmdldEZpbGUoKQorCQkJCQkrIEZpbGUuc2VwYXJhdG9yCisJCQkJCSsgU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRICisJCQkJCSsgIm9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjJfNS4wLjAiKTsKKwkJZmlsZXNUb0RlbGV0ZS5hZGQoZmlsZSk7CisJCWZpbGUgPSBuZXcgRmlsZSgoKExvY2FsU2l0ZSlTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKSkuZ2V0TG9jYXRpb25VUkwoKS5nZXRGaWxlKCkpOworCQlmaWxlc1RvRGVsZXRlLmFkZChmaWxlKTsKKworCQkKKwkJaWYgKG51bWJlck9mSW5zdGFsbGVkRmVhdHVyZXMgPT0gMCkKKwkJCWZhaWwoIlRoZSBsb2NhbCBzaXRlIGRvZXMgbm90IGNvbnRhaW4gZmVhdHVyZSwgc2hvdWxkIG5vdCBjb250YWluIGFuIFhNTCBmaWxlIGJ1dCBmZWF0dXJlcyBzaG91bGQgYmUgZm91bmQgYW55d2F5IGJ5IHBhcnNpbmciKTsKKwkJaWYgKGxvY2FsU2l0ZS8qLmdldFNpdGUoKSovLmdldEFyY2hpdmVzKCkubGVuZ3RoID09IDApCisJCQlmYWlsKCJUaGUgbG9jYWwgc2l0ZSBkb2VzIG5vdCBjb250YWluIGFyY2hpdmVzLCBzaG91bGQgbm90IGNvbnRhaW4gYW4gWE1MIGZpbGUgYnV0IGFyY2hpdmVzIHNob3VsZCBiZSBmb3VuZCBhbnl3YXkgYnkgcGFyc2luZyIpOworCQkKKwkJdHJ5IHsKKwkJCVNpdGVNYW5hZ2VyLmdldFNpdGUobmV3IFVSTCgiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iKSxudWxsKTsKKwkJCWZhaWwoIlRoZSBzaXRlIGNvbnRhaW5zIHNpdGUueG1sLi4uIGl0IHNob3VsZCBiZSBhbiBIVFRQIHNpdGUgd2l0aG91dCBhbiBYTUwgZmlsZSIpOwkJCQorCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCS8vIGV4cGVjdGVkCisJCX0KKworCX0KKworCS8qCisJICogQHNlZSBJU2l0ZSNnZXREZWZhdWx0SW5zdGFsbGFibGVGZWF0dXJlVHlwZSgpCisJICovCisJcHVibGljIFN0cmluZyBnZXREZWZhdWx0SW5zdGFsbGFibGVGZWF0dXJlVHlwZSgpIHsKKwkJU3RyaW5nIHBsdWdpbklEID0KKwkJCVVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCkgKyAiLiI7CisJCXJldHVybiBwbHVnaW5JRCArIFBBQ0tBR0VEX0ZFQVRVUkVfVFlQRTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgdW1UZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworCQlJdGVyYXRvciBmaWxlcyA9IGZpbGVzVG9EZWxldGUuaXRlcmF0b3IoKTsJCQorCQl3aGlsZShmaWxlcy5oYXNOZXh0KCkpIHsKKwkJCUZpbGUgZmlsZSA9IChGaWxlKWZpbGVzLm5leHQoKTsKKwkJCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShmaWxlKTsJCQkKKwkJfQorCQlmaWxlc1RvRGVsZXRlLmNsZWFyKCk7CisJCQorCQlJbnN0YWxsUmVnaXN0cnkuY2xlYW51cCgpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcmVndWxhckluc3RhbGwvVGVzdEluc3RhbGxVUkxTSXRlWE1MLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9yZWd1bGFySW5zdGFsbC9UZXN0SW5zdGFsbFVSTFNJdGVYTUwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWVjYTBlCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcmVndWxhckluc3RhbGwvVGVzdEluc3RhbGxVUkxTSXRlWE1MLmphdmEKQEAgLTAsMCArMSwzMzIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMucmVndWxhckluc3RhbGw7CitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEubmV0Lio7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy4qOworCitwdWJsaWMgY2xhc3MgVGVzdEluc3RhbGxVUkxTSXRlWE1MIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsKKworCS8qKgorCSAqIAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBQ0tBR0VEX0ZFQVRVUkVfVFlQRSA9ICJwYWNrYWdlZCI7IC8vJE5PTi1OTFMtMSQJCisKKwlwdWJsaWMgY2xhc3MgTGlzdGVuZXIgaW1wbGVtZW50cyBJQ29uZmlndXJlZFNpdGVDaGFuZ2VkTGlzdGVuZXIgeworCisJCXB1YmxpYyBib29sZWFuIG5vdGlmaWVkID0gZmFsc2U7CisKKwkJcHVibGljIHZvaWQgZmVhdHVyZUluc3RhbGxlZChJRmVhdHVyZSBmZWF0dXJlKSB7CisJCQlub3RpZmllZCA9IHRydWU7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5vdGlmaWVkIERlZmF1bHRGZWF0dXJlIEluc3RhbGxlZCIpOworCQl9CisKKwkJcHVibGljIHZvaWQgZmVhdHVyZVJlbW92ZWQoSUZlYXR1cmUgZmVhdHVyZSkgeworCQl9CisKKwkJcHVibGljIHZvaWQgZmVhdHVyZUNvbmZpZ3VyZWQoSUZlYXR1cmUgZmVhdHVyZSkgeworCQl9CisJCXB1YmxpYyB2b2lkIGZlYXR1cmVVbmNvbmZpZ3VyZWQoSUZlYXR1cmUgZmVhdHVyZSkgeworCQl9CisKKwkJcHVibGljIGJvb2xlYW4gaXNOb3RpZmllZCgpIHsKKwkJCXJldHVybiBub3RpZmllZDsKKwkJfQorCX0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yIGZvciBUZXN0MQorCSAqLworCXB1YmxpYyBUZXN0SW5zdGFsbFVSTFNJdGVYTUwoU3RyaW5nIGFyZzApIHsKKwkJc3VwZXIoYXJnMCk7CisJfQorCisJcHJpdmF0ZSBJRmVhdHVyZSBnZXRGZWF0dXJlMShJU2l0ZSBzaXRlKQorCQl0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKKwkJU2l0ZUZlYXR1cmVSZWZlcmVuY2UgcmVmID0gbmV3IFNpdGVGZWF0dXJlUmVmZXJlbmNlKCk7CisJCXJlZi5zZXRTaXRlKHNpdGUpOworCQlyZWYuc2V0VVJMU3RyaW5nKCJmZWF0dXJlcy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMV8xLjAuNC5qYXIiKTsKKwkJcmVmLnNldFR5cGUoSVNpdGUuREVGQVVMVF9QQUNLQUdFRF9GRUFUVVJFX1RZUEUpOworCQlyZWYucmVzb2x2ZShzaXRlLmdldFVSTCgpLCBudWxsKTsKKwkJcmV0dXJuIHJlZi5nZXRGZWF0dXJlKG51bGwpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RGaWxlU2l0ZSgpIHRocm93cyBFeGNlcHRpb24geworCisJCUlTaXRlIHJlbW90ZVNpdGUgPQorCQkJU2l0ZU1hbmFnZXIuZ2V0U2l0ZShuZXcgVVJMKFNPVVJDRV9GSUxFX1NJVEUsIFNpdGUuU0lURV9YTUwpLHRydWUsbnVsbCk7CisJCUlGZWF0dXJlIHJlbW90ZUZlYXR1cmUgPSBnZXRGZWF0dXJlMShyZW1vdGVTaXRlKTsKKwkJVVJMIHVybCA9IFRBUkdFVF9GSUxFX1NJVEU7CisJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKFRBUkdFVF9GSUxFX1NJVEUuZ2V0RmlsZSgpKTsKKwkJaWYgKCFmaWxlLmV4aXN0cygpKSBmaWxlLm1rZGlycygpOworCQlJU2l0ZSBsb2NhbFNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKHVybCx0cnVlLG51bGwpOworCQlyZW1vdmUocmVtb3RlRmVhdHVyZSxsb2NhbFNpdGUpOworCQlsb2NhbFNpdGUuaW5zdGFsbChyZW1vdGVGZWF0dXJlLCBudWxsLCBudWxsKTsKKworCQkvLyB2ZXJpZnkKKwkJU3RyaW5nIHNpdGUgPSBUQVJHRVRfRklMRV9TSVRFLmdldEZpbGUoKTsKKwkJSVBsdWdpbkVudHJ5W10gZW50cmllcyA9IHJlbW90ZUZlYXR1cmUuZ2V0UGx1Z2luRW50cmllcygpOworCQlhc3NlcnRUcnVlKCJubyBwbHVnaW5zIGVudHJ5IiwgKGVudHJpZXMgIT0gbnVsbCAmJiBlbnRyaWVzLmxlbmd0aCAhPSAwKSk7CisJCVN0cmluZyBwbHVnaW5OYW1lID0gZW50cmllc1swXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKTsKKwkJRmlsZSBwbHVnaW5GaWxlID0gbmV3IEZpbGUoc2l0ZSwgU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRIICsgcGx1Z2luTmFtZSk7CisJCWFzc2VydFRydWUoInBsdWdpbiBmaWxlcyBub3QgaW5zdGFsbGVkIGxvY2FsbHkiLCBwbHVnaW5GaWxlLmV4aXN0cygpKTsKKwkJRmlsZSBwbHVnaW5YTUxGaWxlID0KKwkJCW5ldyBGaWxlKAorCQkJCXNpdGUsCisJCQkJU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRIICsgcGx1Z2luTmFtZSArIEZpbGUuc2VwYXJhdG9yICsgInBsdWdpbi54bWwiKTsKKwkJYXNzZXJ0VHJ1ZSgicGx1Z2luLnhtbCBmaWxlIG5vdCBpbnN0YWxsZWQgbG9jYWxseSIsIHBsdWdpblhNTEZpbGUuZXhpc3RzKCkpOworCisJCUZpbGUgZmVhdHVyZUZpbGUgPQorCQkJbmV3IEZpbGUoCisJCQkJc2l0ZSwKKwkJCQlTaXRlLkRFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfUEFUSAorCQkJCQkrIHJlbW90ZUZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpOworCQlhc3NlcnRUcnVlKAorCQkJImZlYXR1cmUgaW5mbyBub3QgaW5zdGFsbGVkIGxvY2FsbHk6IiArIGZlYXR1cmVGaWxlLAorCQkJZmVhdHVyZUZpbGUuZXhpc3RzKCkpOworCQkvL2NsZWFudXAKKwkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKHBsdWdpbkZpbGUpOworCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obmV3IEZpbGUobG9jYWxTaXRlLmdldFVSTCgpLmdldEZpbGUoKSkpOworCQlJbnN0YWxsUmVnaXN0cnkuY2xlYW51cCgpOworCX0KKworCS8qKgorCSAqIAorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RIVFRQU2l0ZSgpIHRocm93cyBFeGNlcHRpb24geworCisJCS8vIGNsZWFuCisJCUZpbGUgdGFyZ2V0RmlsZSAgPSBuZXcgRmlsZShUQVJHRVRfRklMRV9TSVRFLmdldEZpbGUoKSk7CisJCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbSh0YXJnZXRGaWxlKTsKKwkJSW5zdGFsbFJlZ2lzdHJ5LmNsZWFudXAoKTsKKworCQlJU2l0ZSByZW1vdGVTaXRlID0KKwkJCVNpdGVNYW5hZ2VyLmdldFNpdGUobmV3IFVSTChTT1VSQ0VfSFRUUF9TSVRFLCBTaXRlLlNJVEVfWE1MKSx0cnVlLG51bGwpOworCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGZlYXR1cmVzID0gcmVtb3RlU2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpOworCQlJRmVhdHVyZSByZW1vdGVGZWF0dXJlID0gbnVsbDsKKworCQlpZiAoZmVhdHVyZXMgPT0gbnVsbCB8fCBmZWF0dXJlcy5sZW5ndGggPT0gMCkKKwkJCWZhaWwoIk5vIGZlYXR1cmVzIG9uIHRoZSBzaXRlIik7CisKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5sZW5ndGg7IGkrKykgeworCQkJaWYgKGZlYXR1cmVzW2ldLmdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkuZW5kc1dpdGgoImZlYXR1cmVzMi5qYXIiKSkgeworCQkJCXJlbW90ZUZlYXR1cmUgPSBmZWF0dXJlc1tpXS5nZXRGZWF0dXJlKG51bGwpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJYXNzZXJ0Tm90TnVsbCgiQ2Fubm90IGZpbmQgZmVhdHVyZTIuamFyIG9uIHNpdGUiLCByZW1vdGVGZWF0dXJlKTsKKwkJVVJMIHVybCA9IFRBUkdFVF9GSUxFX1NJVEU7CisJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKFRBUkdFVF9GSUxFX1NJVEUuZ2V0RmlsZSgpKTsKKwkJaWYgKCFmaWxlLmV4aXN0cygpKSBmaWxlLm1rZGlycygpOworCQlJU2l0ZSBsb2NhbFNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKHVybCx0cnVlLG51bGwpOworCQlsb2NhbFNpdGUuaW5zdGFsbChyZW1vdGVGZWF0dXJlLCBudWxsLCBudWxsKTsKKworCQkvLyBmZWF0dXJlMi5qYXIgc2hvdWxkIG5vdCBiZSBpbiB0aGUgbG9jYWwgc2l0ZQorCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGxvY2FsRmVhdHVyZXMgPSBsb2NhbFNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsKKwkJaWYgKGxvY2FsRmVhdHVyZXMgPT0gbnVsbCB8fCBsb2NhbEZlYXR1cmVzLmxlbmd0aCA9PSAwKQorCQkJZmFpbCgiTm8gZmVhdHVyZXMgb24gdGhlIHRhcmdldCBzaXRlIik7CisKKwkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOworCQlmb3IgKGludCBpID0gMDsgaSA8IGxvY2FsRmVhdHVyZXMubGVuZ3RoOyBpKyspIHsKKwkJCWlmIChsb2NhbEZlYXR1cmVzW2ldLmdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkuZW5kc1dpdGgoImZlYXR1cmVzMi5qYXIiKSkgeworCQkJCWZvdW5kID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWFzc2VydFRydWUoCisJCQkiRm91bmQgZmVhdHVyZTIuamFyIG9uIHRhcmdldCBzaXRlLiBUYXJnZXQgc2l0ZSBmZWF0dXJlIHJlZiBzaG91bGRub3QgY29udGFpbiBKQVIgZmlsZSIsCisJCQkhZm91bmQpOworCisJCS8vIGNoZWNrCisJCVN0cmluZyBzaXRlID0gVEFSR0VUX0ZJTEVfU0lURS5nZXRGaWxlKCk7CisJCUlQbHVnaW5FbnRyeVtdIGVudHJpZXMgPSByZW1vdGVGZWF0dXJlLmdldFBsdWdpbkVudHJpZXMoKTsKKwkJYXNzZXJ0VHJ1ZSgibm8gcGx1Z2lucyBlbnRyeSIsIChlbnRyaWVzICE9IG51bGwgJiYgZW50cmllcy5sZW5ndGggIT0gMCkpOworCisJCVN0cmluZyBwbHVnaW5OYW1lID0gZW50cmllc1swXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKTsKKwkJRmlsZSBwbHVnaW5GaWxlID0gbmV3IEZpbGUoc2l0ZSwgU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRIICsgcGx1Z2luTmFtZSk7CisJCWFzc2VydFRydWUoInBsdWdpbiBpbmZvIG5vdCBpbnN0YWxsZWQgbG9jYWxseSIsIHBsdWdpbkZpbGUuZXhpc3RzKCkpOworCisJCUZpbGUgZmVhdHVyZUZpbGUgPQorCQkJbmV3IEZpbGUoCisJCQkJc2l0ZSwKKwkJCQlTaXRlLkRFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfUEFUSAorCQkJCQkrIHJlbW90ZUZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpOworCQlhc3NlcnRUcnVlKCJmZWF0dXJlIGluZm8gbm90IGluc3RhbGxlZCBsb2NhbGx5IiwgZmVhdHVyZUZpbGUuZXhpc3RzKCkpOworCisJCS8vbG9jYWxTaXRlLnNhdmUoKTsKKworCQkvL2NsZWFudXAKKwkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKHBsdWdpbkZpbGUpOworCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obmV3IEZpbGUobG9jYWxTaXRlLmdldFVSTCgpLmdldEZpbGUoKSkpOworCQlJbnN0YWxsUmVnaXN0cnkuY2xlYW51cCgpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJLy8gY2xlYW51cCBsb2NhbCBmaWxlcy4uLgorCQlMb2NhbFNpdGUgc2l0ZUxvY2FsID0gKChMb2NhbFNpdGUpIFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpKTsKKwkJRmlsZSBsb2NhbEZpbGUgPSBuZXcgRmlsZShzaXRlTG9jYWwuZ2V0TG9jYXRpb25VUkwoKS5nZXRGaWxlKCkpOworCQkvL2lmICghbG9jYWxGaWxlLmV4aXN0cygpKSBmYWlsKCJMb2NhbFNpdGUgZmlsZSBkb2Vzbid0IGV4aXN0IC0+Iitsb2NhbEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkrIjwtIik7CisJCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShsb2NhbEZpbGUpOwkJCisJCS8qCisJCWxvY2FsRmlsZSA9IG5ldyBGaWxlKGxvY2FsRmlsZSxMb2NhbFNpdGUuU0lURV9MT0NBTF9GSUxFKTsKKwkJaWYgKCFsb2NhbEZpbGUuZXhpc3RzKCkpIGZhaWwoIkxvY2FsU2l0ZS54bWwgZG9lc24ndCBleGlzdDoiK2xvY2FsRmlsZSk7CisJCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShsb2NhbEZpbGUpOworCQkqLworCQkKKwkJSW50ZXJuYWxTaXRlTWFuYWdlci5sb2NhbFNpdGUgPSBudWxsOworCisJCVVSTCBJTlNUQUxMX1NJVEUgPSBudWxsOworCQl0cnkgeworCQkJSU5TVEFMTF9TSVRFID0KKwkJCQluZXcgVVJMKCJodHRwIiwgZ2V0SHR0cEhvc3QoKSwgZ2V0SHR0cFBvcnQoKSwgYnVuZGxlLmdldFN0cmluZygiSFRUUF9QQVRIXzIiKSk7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlmYWlsKGUudG9TdHJpbmcoKSk7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQl9CisKKwkJSVNpdGUgcmVtb3RlU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoSU5TVEFMTF9TSVRFLHRydWUsbnVsbCk7CisJCUlGZWF0dXJlUmVmZXJlbmNlW10gZmVhdHVyZXMgPSByZW1vdGVTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7CisJCUlGZWF0dXJlIHJlbW90ZUZlYXR1cmUgPSBudWxsOworCisJCWlmIChmZWF0dXJlcyA9PSBudWxsIHx8IGZlYXR1cmVzLmxlbmd0aCA9PSAwKQorCQkJZmFpbCgiTm8gZmVhdHVyZXMgb24gdGhlIHNpdGUiKTsKKworCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7CisJCQlpZiAoZmVhdHVyZXNbaV0uZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKS5lbmRzV2l0aCgiaGVscEZlYXR1cmUuamFyIikpIHsKKwkJCQlyZW1vdGVGZWF0dXJlID0gZmVhdHVyZXNbaV0uZ2V0RmVhdHVyZShudWxsKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWFzc2VydE5vdE51bGwoIkNhbm5vdCBmaW5kIGhlbHAuamFyIG9uIHNpdGUiLCByZW1vdGVGZWF0dXJlKTsKKwkJSUxvY2FsU2l0ZSBsb2NhbFNpdGUgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsKKwkJSUNvbmZpZ3VyZWRTaXRlIHNpdGUgPSBsb2NhbFNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5nZXRDb25maWd1cmVkU2l0ZXMoKVswXTsKKwkJTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKTsKKwkJc2l0ZS5hZGRDb25maWd1cmVkU2l0ZUNoYW5nZWRMaXN0ZW5lcihsaXN0ZW5lcik7CisKKwkJKChDb25maWd1cmVkU2l0ZSlzaXRlKS5zZXRVcGRhdGFibGUodHJ1ZSk7CisJCXNpdGUuaW5zdGFsbChyZW1vdGVGZWF0dXJlLCBudWxsLCBudWxsKTsKKworCQlJUGx1Z2luRW50cnlbXSBlbnRyaWVzID0gcmVtb3RlRmVhdHVyZS5nZXRSYXdQbHVnaW5FbnRyaWVzKCk7CisJCWFzc2VydFRydWUoIm5vIHBsdWdpbnMgZW50cnkiLCAoZW50cmllcyAhPSBudWxsICYmIGVudHJpZXMubGVuZ3RoICE9IDApKTsKKworCQlTdHJpbmcgc2l0ZVBhdGggPSBzaXRlLmdldFNpdGUoKS5nZXRVUkwoKS5nZXRGaWxlKCk7CisJCVN0cmluZyBwbHVnaW5OYW1lID0gZW50cmllc1swXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKTsKKwkJRmlsZSBwbHVnaW5GaWxlID0gbmV3IEZpbGUoc2l0ZVBhdGgsIFNpdGUuREVGQVVMVF9QTFVHSU5fUEFUSCArIHBsdWdpbk5hbWUpOworCQlpZiAoTG9jYWxlLmdldERlZmF1bHQoKS50b1N0cmluZygpLmluZGV4T2YoImZyIikgIT0gLTEpCisJCQlhc3NlcnRUcnVlKCJwbHVnaW4gaW5mbyBub3QgaW5zdGFsbGVkIGxvY2FsbHk6IitwbHVnaW5GaWxlLCBwbHVnaW5GaWxlLmV4aXN0cygpKTsKKworCQlGaWxlIGZlYXR1cmVGaWxlID0KKwkJCW5ldyBGaWxlKAorCQkJCXNpdGVQYXRoLAorCQkJCVNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRICisJCQkJCSsgcmVtb3RlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSk7CisJCWlmIChMb2NhbGUuZ2V0RGVmYXVsdCgpLnRvU3RyaW5nKCkuaW5kZXhPZigiZnIiKSAhPSAtMSB8fAorCQkJCUxvY2FsZS5nZXREZWZhdWx0KCkudG9TdHJpbmcoKS5pbmRleE9mKCJ1cyIpICE9IC0xIHx8CisJCQkJTG9jYWxlLmdldERlZmF1bHQoKS50b1N0cmluZygpLmluZGV4T2YoImRlIikgIT0gLTEpCisJCWFzc2VydFRydWUoImZlYXR1cmUgaW5mbyBub3QgaW5zdGFsbGVkIGxvY2FsbHkiLCBmZWF0dXJlRmlsZS5leGlzdHMoKSk7CisKKwkJLy9jbGVhbnVwCisJCUZpbGUgZmlsZSA9CisJCQluZXcgRmlsZSgKKwkJCQlzaXRlLmdldFNpdGUoKS5nZXRVUkwoKS5nZXRGaWxlKCkKKwkJCQkJKyBGaWxlLnNlcGFyYXRvcgorCQkJCQkrIFNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRICisJCQkJCSsgcmVtb3RlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkpOworCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0oZmlsZSk7CisJCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShwbHVnaW5GaWxlKTsKKwkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGxvY2FsRmlsZSk7CisJCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbSgKKwkJCW5ldyBGaWxlKAorCQkJCSgoSW5zdGFsbENvbmZpZ3VyYXRpb24pIGxvY2FsU2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpKQorCQkJCQkuZ2V0VVJMKCkKKwkJCQkJLmdldEZpbGUoKSkpOworCQlJbnN0YWxsUmVnaXN0cnkuY2xlYW51cCgpOworCQkKKwkJc2l0ZS5yZW1vdmVDb25maWd1cmVkU2l0ZUNoYW5nZWRMaXN0ZW5lcihsaXN0ZW5lcik7CisJCWFzc2VydFRydWUoIkxpc3RlbmVyIGhhc24ndCByZWNlaXZlZCBub3RpZmljYXRpb24iLCBsaXN0ZW5lci5pc05vdGlmaWVkKCkpOworCX0KKworLy8JcHVibGljIHZvaWQgdGVzdEZpbGVTaXRlV2l0aG91dFNpdGVYTUwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKy8vCisvLwkJSVNpdGUgcmVtb3RlU2l0ZSA9CisvLwkJCVNpdGVNYW5hZ2VyLmdldFNpdGUobmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFLCBTaXRlLlNJVEVfWE1MKSx0cnVlLG51bGwpOworLy8JCUlGZWF0dXJlIHJlbW90ZUZlYXR1cmUgPSBnZXRGZWF0dXJlMShyZW1vdGVTaXRlKTsKKy8vCQlJQ29uZmlndXJlZFNpdGUgbG9jYWxTaXRlID0KKy8vCQkJU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5nZXRDb25maWd1cmVkU2l0ZXMoKVswXTsKKy8vCQlsb2NhbFNpdGUuZ2V0U2l0ZSgpLmluc3RhbGwocmVtb3RlRmVhdHVyZSwgbnVsbCwgbnVsbCk7CisvLworLy8JCUlGZWF0dXJlUmVmZXJlbmNlW10gZmVhdHVyZXMgPSBsb2NhbFNpdGUuZ2V0U2l0ZSgpLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7CisvLwkJaWYgKGZlYXR1cmVzLmxlbmd0aCA9PSAwKQorLy8JCQlmYWlsKCJUaGUgbG9jYWwgc2l0ZSBkb2VzIG5vdCBjb250YWluIGZlYXR1cmUsIHNob3VsZCBub3QgY29udGFpbiBhbiBYTUwgZmlsZSBidXQgZmVhdHVyZXMgc2hvdWxkIGJlIGZvdW5kIGFueXdheSBieSBwYXJzaW5nIik7CisvLwkJaWYgKGxvY2FsU2l0ZS5nZXRTaXRlKCkuZ2V0QXJjaGl2ZXMoKS5sZW5ndGggPT0gMCkKKy8vCQkJZmFpbCgiVGhlIGxvY2FsIHNpdGUgZG9lcyBub3QgY29udGFpbiBhcmNoaXZlcywgc2hvdWxkIG5vdCBjb250YWluIGFuIFhNTCBmaWxlIGJ1dCBhcmNoaXZlcyBzaG91bGQgYmUgZm91bmQgYW55d2F5IGJ5IHBhcnNpbmciKTsKKy8vCisvLwkJLy9jbGVhbnVwCisvLwkJRmlsZSBmaWxlID0KKy8vCQkJbmV3IEZpbGUoCisvLwkJCQlsb2NhbFNpdGUuZ2V0U2l0ZSgpLmdldFVSTCgpLmdldEZpbGUoKQorLy8JCQkJCSsgRmlsZS5zZXBhcmF0b3IKKy8vCQkJCQkrIFNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRICisvLwkJCQkJKyByZW1vdGVGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSk7CisvLwkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGZpbGUpOworLy8JCWZpbGUgPQorLy8JCQluZXcgRmlsZSgKKy8vCQkJCWxvY2FsU2l0ZS5nZXRTaXRlKCkuZ2V0VVJMKCkuZ2V0RmlsZSgpCisvLwkJCQkJKyBGaWxlLnNlcGFyYXRvcgorLy8JCQkJCSsgU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRICisvLwkJCQkJKyAib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMV8zLjUuNiIpOworLy8JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShmaWxlKTsKKy8vCQlmaWxlID0KKy8vCQkJbmV3IEZpbGUoCisvLwkJCQlsb2NhbFNpdGUuZ2V0U2l0ZSgpLmdldFVSTCgpLmdldEZpbGUoKQorLy8JCQkJCSsgRmlsZS5zZXBhcmF0b3IKKy8vCQkJCQkrIFNpdGUuREVGQVVMVF9QTFVHSU5fUEFUSAorLy8JCQkJCSsgIm9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjJfNS4wLjAiKTsKKy8vCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0oZmlsZSk7CisvLwkJRmlsZSBsb2NhbEZpbGUgPSBuZXcgRmlsZSgoKExvY2FsU2l0ZSlTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKSkuZ2V0TG9jYXRpb25VUkwoKS5nZXRGaWxlKCkpOworLy8JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShsb2NhbEZpbGUpOworLy8KKy8vCX0KKworCS8qKgorCSogCisJKi8KKy8vCXByaXZhdGUgRmVhdHVyZSBjcmVhdGVQYWNrYWdlZEZlYXR1cmUoVVJMIHVybCwgSVNpdGUgc2l0ZSkKKy8vCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisvLwkJU3RyaW5nIHBhY2thZ2VkRmVhdHVyZVR5cGUgPSBJU2l0ZS5ERUZBVUxUX1BBQ0tBR0VEX0ZFQVRVUkVfVFlQRTsKKy8vCQlGZWF0dXJlIHJlc3VsdCA9IG51bGw7CisvLwkJaWYgKHBhY2thZ2VkRmVhdHVyZVR5cGUgIT0gbnVsbCkgeworLy8JCQlJRmVhdHVyZUZhY3RvcnkgZmFjdG9yeSA9CisvLwkJCQlGZWF0dXJlVHlwZUZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRGYWN0b3J5KHBhY2thZ2VkRmVhdHVyZVR5cGUpOworLy8JCQlyZXN1bHQgPSAoRmVhdHVyZSkgZmFjdG9yeS5jcmVhdGVGZWF0dXJlKHVybCwgc2l0ZSk7CisvLwkJfQorLy8JCXJldHVybiByZXN1bHQ7CisvLwl9CisJLyoKKwkgKiBAc2VlIElTaXRlI2dldERlZmF1bHRJbnN0YWxsYWJsZUZlYXR1cmVUeXBlKCkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRJbnN0YWxsYWJsZUZlYXR1cmVUeXBlKCkgeworCQlTdHJpbmcgcGx1Z2luSUQgPQorCQkJVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXREZXNjcmlwdG9yKCkuZ2V0VW5pcXVlSWRlbnRpZmllcigpICsgIi4iOworCQlyZXR1cm4gcGx1Z2luSUQgKyBQQUNLQUdFRF9GRUFUVVJFX1RZUEU7CisJfQorCit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9yZWd1bGFySW5zdGFsbC9UZXN0TG9jYWxTaXRlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9yZWd1bGFySW5zdGFsbC9UZXN0TG9jYWxTaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdiMDQxMQotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3JlZ3VsYXJJbnN0YWxsL1Rlc3RMb2NhbFNpdGUuamF2YQpAQCAtMCwwICsxLDQyMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5yZWd1bGFySW5zdGFsbDsKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS5uZXQuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm1vZGVsLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLio7CisKK3B1YmxpYyBjbGFzcyBUZXN0TG9jYWxTaXRlIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsKKwkKKwkvKioKKwkgKiBUZXN0IHRoZSBnZXRGZWF0dXJlcygpCisJICovCisJcHVibGljIFRlc3RMb2NhbFNpdGUoU3RyaW5nIGFyZzApIHsKKwkJc3VwZXIoYXJnMCk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGlvbkNvbmZpZ0ZpbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQkvL2NsZWFuIHVwCisJCUZpbGUgbG9jYWxGaWxlID0gbmV3IEZpbGUoKChMb2NhbFNpdGUpU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkpLmdldExvY2F0aW9uVVJMKCkuZ2V0RmlsZSgpKTsKKwkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGxvY2FsRmlsZSk7CQorCQlJbnRlcm5hbFNpdGVNYW5hZ2VyLmxvY2FsU2l0ZT1udWxsOwkKKworCisJCUlMb2NhbFNpdGUgc2l0ZSA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpOworCQlzaXRlLnNhdmUoKTsKKwkJYXNzZXJ0VHJ1ZSgiY29uZmlnIGZpbGUgaGFzbid0IGJlZW4gc2F2ZWQgaW4gOiIrbG9jYWxGaWxlLmdldEFic29sdXRlUGF0aCgpLCBsb2NhbEZpbGUuZXhpc3RzKCkpOworCQkKKwkJLy8gY2xlYW51cAorCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obG9jYWxGaWxlKTsJCQorCQkKKworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdENvbmZpZ0ZpbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQkvL2NsZWFuIHVwCisKKwkJRmlsZSBsb2NhbEZpbGUgPSBuZXcgRmlsZSgoKExvY2FsU2l0ZSlTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKSkuZ2V0TG9jYXRpb25VUkwoKS5nZXRGaWxlKCkpOworCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obG9jYWxGaWxlKTsJCisJCUludGVybmFsU2l0ZU1hbmFnZXIubG9jYWxTaXRlPW51bGw7CisKKwkJSUxvY2FsU2l0ZSBzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7CisJCWFzc2VydFRydWUoIlRoZSBsb2NhbCBzaXRlIGRvZXMgbm90IGNvbnRhaW4gYW4gaGlzdG9yeSBvZiBpbnN0YWxsIGNvbmZpZ3VyYXRpb24iLHNpdGUuZ2V0Q29uZmlndXJhdGlvbkhpc3RvcnkoKS5sZW5ndGghPTApOworCQlhc3NlcnRUcnVlKCJUaGUgbG9jYWwgc2l0ZSBkb2VzIG5vdCBjb250YWluIGFuIGN1cnJlbnQgaW5zdGFsbCBjb25maWd1cmF0aW9uIixzaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkhPW51bGwpOworCQlhc3NlcnRUcnVlKCJUaGUgbG9jYWwgc2l0ZSBkb2VzIG5vdCBjb250YWluIGEgZGVmYXVsdCBjb25maWd1cmF0aW9uIHNpdGUgZm9yIHRoZSBjdXJyZW50IGluc3RhbGwgY29uZmlnIixzaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkuZ2V0Q29uZmlndXJlZFNpdGVzKCkubGVuZ3RoIT0wKTsKKwkJCisJCVN5c3RlbS5vdXQucHJpbnRsbigiRGVmYXVsdCBDb25maWcgU2l0ZSBpcyA6IitzaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkuZ2V0Q29uZmlndXJlZFNpdGVzKClbMF0uZ2V0U2l0ZSgpLmdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkpOworCQkKKwkJLy8gY2xlYW51cAkKKwkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGxvY2FsRmlsZSk7CQkKKwkJCisKKwl9CisJCisvKglwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbEZlYXR1cmVTYXZlQ29uZmlnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJLy9jbGVhbiB1cAorCQlMb2NhbFNpdGUgc2l0ZUxvY2FsID0gKExvY2FsU2l0ZSlTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsKKwkJVVJMIG5ld1VSTCA9IG5ldyBVUkwoc2l0ZUxvY2FsLmdldExvY2F0aW9uVVJMKCksTG9jYWxTaXRlLlNJVEVfTE9DQUxfRklMRSk7CisJCUZpbGUgbG9jYWxGaWxlID0gbmV3IEZpbGUobmV3VVJMLmdldEZpbGUoKSk7CisJCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShsb2NhbEZpbGUpOworCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obmV3IEZpbGUoKChJbnN0YWxsQ29uZmlndXJhdGlvbilzaXRlTG9jYWwuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKSkuZ2V0VVJMKCkuZ2V0RmlsZSgpKSk7CQorCQlJbnRlcm5hbFNpdGVNYW5hZ2VyLmxvY2FsU2l0ZT1udWxsOwkJCisKKwkJSUxvY2FsU2l0ZSBzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7CisJCUlTaXRlIHJlbW90ZVNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKFNPVVJDRV9GSUxFX1NJVEVfSU5TVEFMTEVEKTsKKwkJSUZlYXR1cmUgZmVhdHVyZSA9IHJlbW90ZVNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKVswXS5nZXRGZWF0dXJlKCk7CisJCWludCBvbGROdW1iZXIgPSBzaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkuZ2V0Q29uZmlndXJlZFNpdGVzKCkubGVuZ3RoOworCQkKKwkJLy8gd2UgYXJlIG5vdCBjaGVja2luZyBpZiB0aGlzIGlzIHJlYWQgb25seQorCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gbmV3Q29uZmlnID0gc2l0ZS5jbG9uZUN1cnJlbnRDb25maWd1cmF0aW9uKCk7CisJCW5ld0NvbmZpZy5zZXRMYWJlbCgibmV3IExhYmVsIik7CQkKKwkJLy9JSW5zdGFsbENvbmZpZ3VyYXRpb24gbmV3Q29uZmlnID0gc2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpOworCQlJQ29uZmlndXJlZFNpdGUgY29uZmlnU2l0ZSA9IG5ld0NvbmZpZy5nZXRDb25maWd1cmVkU2l0ZXMoKVswXTsKKwkJQ29uZmlndXJhdGlvblBvbGljeU1vZGVsIGNvbmZpZ1BvbGljeSA9IG5ldyBCYXNlU2l0ZUxvY2FsRmFjdG9yeSgpLmNyZWF0ZUNvbmZpZ3VyYXRpb25Qb2xpY3lNb2RlbCgpOworCQljb25maWdQb2xpY3kuc2V0UG9saWN5KElQbGF0Zm9ybUNvbmZpZ3VyYXRpb24uSVNpdGVQb2xpY3kuVVNFUl9JTkNMVURFKTsKKwkJKChDb25maWd1cmVkU2l0ZSljb25maWdTaXRlKS5zZXRDb25maWd1cmF0aW9uUG9saWN5KChDb25maWd1cmF0aW9uUG9saWN5KWNvbmZpZ1BvbGljeSk7CisJCWludCBvbGROdW1iZXJPZmhpc3RvcnkgPSBzaXRlLmdldENvbmZpZ3VyYXRpb25IaXN0b3J5KCkubGVuZ3RoOwkJCisJCXNpdGUuYWRkQ29uZmlndXJhdGlvbihuZXdDb25maWcpOwkKKwkJYXNzZXJ0Tm90TnVsbChmZWF0dXJlKTsJCisKKwkJKChDb25maWd1cmVkU2l0ZSljb25maWdTaXRlKS5pc1VwZGF0YWJsZSh0cnVlKTsKKwkJcmVtb3ZlKGZlYXR1cmUsY29uZmlnU2l0ZSk7CQkJCQorCQljb25maWdTaXRlLmluc3RhbGwoZmVhdHVyZSxudWxsLG51bGwpOworCQkJCQorCQkvLyB0ZWggY3VycmVudCBvbmUgcG9pbnRzIHRvIGEgcmVhbCBmYXR1cmUKKwkJLy8gZG9lcyBub3QgdGhyb3cgZXJyb3IuCisJCUlDb25maWd1cmVkU2l0ZSBjb25maWdTaXRlMiA9IHNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5nZXRDb25maWd1cmVkU2l0ZXMoKVswXTsKKwkJYXNzZXJ0VHJ1ZSgiTm8gQ29uZmlndXJlZCBmZWF0dXJlcyBmb3VuZCIsY29uZmlnU2l0ZS5nZXRDb25maWd1cmVkRmVhdHVyZXMoKS5sZW5ndGg+MCk7CisJCUlGZWF0dXJlUmVmZXJlbmNlIHJlZiA9IGNvbmZpZ1NpdGUyLmdldENvbmZpZ3VyZWRGZWF0dXJlcygpWzBdOworCQlJRmVhdHVyZSBmZWF0dXJlMiA9IHJlZi5nZXRGZWF0dXJlKCk7CisJCS8vU3RyaW5nIGNvbmZpZ3VyZWRGZWF0dXJlID0gZmVhdHVyZTIuZ2V0TGFiZWwoKTsKKworCQlhc3NlcnRFcXVhbHMoZmVhdHVyZTIuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCksIm9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUzXzEuMC4wIik7CisJCWFzc2VydFRydWUoIldyb25nIGlkICB2ZXJzaW9uIG9mIGZlYXR1cmUiLGZlYXR1cmUyLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpLmVxdWFsc0lnbm9yZUNhc2UoIm9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUzXzEuMC4wIikpOworCQkKKwkJLy8gb25seSBvbmUgZmVhdHVyZSBjb25maWd1cmVkCisJCWFzc2VydFRydWUoInRvbyBtYW55IGZlYXR1cmVzIGNvbmZpZ3VyZWQiLGNvbmZpZ1NpdGUyLmdldENvbmZpZ3VyZWRGZWF0dXJlcygpLmxlbmd0aD09MSk7CisJCQorCQkvLyBubyBmZWF0dXJlIHVuY29uZmlndXJlZAorCQlhc3NlcnRUcnVlKCJ0b28gbWFueSB1bmNvbmZpZ3VyZWQgZmVhdHVyZXMiLCgoQ29uZmlndXJlZFNpdGUpY29uZmlnU2l0ZTIpLmdldENvbmZpZ3VyYXRpb25Qb2xpY3koKS5nZXRVbmNvbmZpZ3VyZWRGZWF0dXJlcygpLmxlbmd0aD09MCk7CisJCQorCQkvLyB0ZXN0IG9ubHkgMiBpbnN0YWxsIGNvbmZpZyBpbiBsb2NhbCBzaXRlCisJCS8vYXNzZXJ0RXF1YWxzKCJ3cm9uZyBudW1iZXIgb2YgaGlzdG9yeSBpbiBMb2NhbCBzaXRlOiIsb2xkTnVtYmVyT2ZoaXN0b3J5KzEsc2l0ZS5nZXRDb25maWd1cmF0aW9uSGlzdG9yeSgpLmxlbmd0aCk7CisJCQorCQkvLyB0ZXN0IHNhbWUgIyBvZiBzaXRlcyBpbiBjdXJyZW50IGNvbmZpZworCQlhc3NlcnRUcnVlKCJXcm9uZyBudW1iZXIgb2YgY29uZmlnIHNpdGVzIGluIGN1cnJlbnQgY29uZmlnIixzaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkuZ2V0Q29uZmlndXJlZFNpdGVzKCkubGVuZ3RoPT1vbGROdW1iZXIpOworCQkKKwkJLy90ZXN0IG9ubHkgb25lIGZlYXR1cmUgZm9yIHRoZSBzaXRlCisJCWFzc2VydFRydWUoIndyb25nIG51bWJlciBvZiBjb25maWd1cmVkIGZlYXR1cmVzIGZvciBjb25maWcgc2l0ZSIsc2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldENvbmZpZ3VyZWRTaXRlcygpWzBdLmdldENvbmZpZ3VyZWRGZWF0dXJlcygpLmxlbmd0aD09MSk7CisJCQorCQkvLyB0ZXN0IG9ubHkgMiBhY3Rpdml0aWVzCisJCWFzc2VydFRydWUoIldyb25nIG51bWJlciBvZiBhY3Rpdml0aWVzIGZvciBpbnN0YWxsIGNvbmZpZyIsc2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldEFjdGl2aXRpZXMoKS5sZW5ndGg9PTIpOworCisJCXNpdGUuc2F2ZSgpOwkJCisKKwkJLy8gY2hlY2sKKwkJLy8gdGhlcmUgYXJlIDIgY29uZmlndXJhdGlvbgorCQlTdHJpbmcgdGltZSA9ICIiK3NpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5nZXRDcmVhdGlvbkRhdGUoKS5nZXRUaW1lKCk7CisJCVVSTCBsb2NhdGlvbiA9ICgoTG9jYWxTaXRlKXNpdGUpLmdldExvY2F0aW9uVVJMKCk7CisJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKG5ldyBVUkwobG9jYXRpb24sIkNvbmZpZyIrdGltZSsiLnhtbCIpLmdldEZpbGUoKSk7CisJCWFzc2VydFRydWUoIm5ldyBjb25maWd1cmF0aW9uIGRvZXMgbm90IGV4aXN0IiwgZmlsZS5leGlzdHMoKSk7CisJCQorCQkvLyBjbGVhbnVwCisJCWxvY2FsRmlsZSA9IG5ldyBGaWxlKG5ldyBVUkwobG9jYXRpb24sTG9jYWxTaXRlLlNJVEVfTE9DQUxfRklMRSkuZ2V0RmlsZSgpKTsKKwkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGxvY2FsRmlsZSk7CQkKKwkJbG9jYWxGaWxlID0gbmV3IEZpbGUobmV3IFVSTChsb2NhdGlvbixMb2NhbFNpdGUuREVGQVVMVF9DT05GSUdfRklMRSkuZ2V0RmlsZSgpKTsKKwkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGxvY2FsRmlsZSk7CQorCQlsb2NhbEZpbGUgPSBuZXcgRmlsZShuZXcgVVJMKGxvY2F0aW9uLFNpdGUuREVGQVVMVF9GRUFUVVJFX1BBVEgrRmlsZS5zZXBhcmF0b3IrZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSkuZ2V0RmlsZSgpKTsJCQorCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obG9jYWxGaWxlKTsJCisJCWxvY2FsRmlsZSA9IG5ldyBGaWxlKG5ldyBVUkwobG9jYXRpb24sU2l0ZS5ERUZBVUxUX0ZFQVRVUkVfUEFUSCtGaWxlLnNlcGFyYXRvcitmZWF0dXJlMi5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSkuZ2V0RmlsZSgpKTsJCQorCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obG9jYWxGaWxlKTsJCisJCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShmaWxlKTsJCQorCQlsb2NhbEZpbGUgPSBuZXcgRmlsZShmZWF0dXJlMi5nZXRVUkwoKS5nZXRGaWxlKCkpOworCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obG9jYWxGaWxlKTsKKwl9CisqLworCQorCXB1YmxpYyB2b2lkIHRlc3RSZXRyaXZlQ29uZmlnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJLy9jbGVhbiB1cAorCQlGaWxlIGxvY2FsRmlsZSA9IG5ldyBGaWxlKCgoTG9jYWxTaXRlKVNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpKS5nZXRMb2NhdGlvblVSTCgpLmdldEZpbGUoKSk7CisJCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShsb2NhbEZpbGUpOwkKKwkJSW50ZXJuYWxTaXRlTWFuYWdlci5sb2NhbFNpdGU9bnVsbDsJCQorCisJCUlMb2NhbFNpdGUgc2l0ZSA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpOworCQlJU2l0ZSByZW1vdGVTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShTT1VSQ0VfRklMRV9TSVRFX0lOU1RBTExFRCxudWxsKTsKKwkJSUZlYXR1cmUgZmVhdHVyZSA9IHJlbW90ZVNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKVswXS5nZXRGZWF0dXJlKG51bGwpOworCQlpbnQgb2xkTnVtYmVyID0gc2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldENvbmZpZ3VyZWRTaXRlcygpLmxlbmd0aDsJCQorCQkKKwkJLy8gd2UgYXJlIG5vdCBjaGVja2luZyBpZiB0aGlzIGlzIHJlYWQgb25seQorCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gbmV3Q29uZmlnID0gc2l0ZS5jbG9uZUN1cnJlbnRDb25maWd1cmF0aW9uKCk7CisJCW5ld0NvbmZpZy5zZXRMYWJlbCgibmV3IExhYmVsIik7CQkKKwkJSUNvbmZpZ3VyZWRTaXRlIGNvbmZpZ1NpdGUgPSBuZXdDb25maWcuZ2V0Q29uZmlndXJlZFNpdGVzKClbMF07CisJCUNvbmZpZ3VyYXRpb25Qb2xpY3lNb2RlbCBjb25maWdQb2xpY3kgPSBuZXcgQmFzZVNpdGVMb2NhbEZhY3RvcnkoKS5jcmVhdGVDb25maWd1cmF0aW9uUG9saWN5TW9kZWwoKTsKKwkJY29uZmlnUG9saWN5LnNldFBvbGljeShJUGxhdGZvcm1Db25maWd1cmF0aW9uLklTaXRlUG9saWN5LlVTRVJfSU5DTFVERSk7CisJCSgoQ29uZmlndXJlZFNpdGUpY29uZmlnU2l0ZSkuc2V0Q29uZmlndXJhdGlvblBvbGljeU1vZGVsKGNvbmZpZ1BvbGljeSk7CQorCQlzaXRlLmFkZENvbmZpZ3VyYXRpb24obmV3Q29uZmlnKTsKKwkJYXNzZXJ0Tm90TnVsbChmZWF0dXJlKTsJCQkKKwkJCisJCSgoQ29uZmlndXJlZFNpdGUpY29uZmlnU2l0ZSkuc2V0VXBkYXRhYmxlKHRydWUpOworCQlyZW1vdmUoZmVhdHVyZSxjb25maWdTaXRlKTsJCQkKKwkJY29uZmlnU2l0ZS5pbnN0YWxsKGZlYXR1cmUsbnVsbCxudWxsKTsKKwkJc2l0ZS5zYXZlKCk7CisJCQorCQkvLyB3ZSBjcmVhdGVkIHRoZSBzZWNvbmQgeG1sIGZpbGUKKworCQkvL2RvIG5vdCBjbGVhbnVwLCB3ZSB3YW50IHRvIHJldXNlIHByZXZpb3VzbHkgY3JlYXRlZCBsb2NhbCBzaXRlCisJCS8vIGJ1dCBmb3JjZSByZS1yZWFkIG9mIHhtbCBGaWxlCisJCUludGVybmFsU2l0ZU1hbmFnZXIubG9jYWxTaXRlPW51bGw7CisJCXNpdGUgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsKKwkJCisJCS8vIGNoZWNrCisJCS8vIHRoZXJlIGFyZSAyIGNvbmZpZ3VyYXRpb24KKwkJVVJMIGxvY2F0aW9uID0gKChMb2NhbFNpdGUpc2l0ZSkuZ2V0TG9jYXRpb25VUkwoKTsJCQorCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShuZXcgVVJMKGxvY2F0aW9uLCJwbGF0Zm9ybS54bWwiKS5nZXRGaWxlKCkpOworCQlhc3NlcnRUcnVlKCJuZXcgY29uZmlndXJhdGlvbiBkb2VzIG5vdCBleGlzdCIsIGZpbGUuZXhpc3RzKCkpOworCQkKKwkJLy8gdGVoIGN1cnJlbnQgb25lIHBvaW50cyB0byBhIHJlYWwgZmF0dXJlCisJCS8vIGRvZXMgbm90IHRocm93IGVycm9yLgorCQlJQ29uZmlndXJlZFNpdGUgY29uZmlnU2l0ZTIgPSBzaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkuZ2V0Q29uZmlndXJlZFNpdGVzKClbMF07CisJCUlGZWF0dXJlUmVmZXJlbmNlW10gcmVmcyA9IGNvbmZpZ1NpdGUyLmdldENvbmZpZ3VyZWRGZWF0dXJlcygpOworCQlJRmVhdHVyZSBmZWF0dXJlMiA9IG51bGw7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmcy5sZW5ndGg7IGkrKykgeworCQkJSUZlYXR1cmUgZmVhdHVyZTMgPSByZWZzW2ldLmdldEZlYXR1cmUobnVsbCk7CQkJCisJCQlpZiAoIm9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUzXzEuMC4wIi5lcXVhbHMoZmVhdHVyZTMuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpKXsKKwkJCQlmZWF0dXJlMiA9IGZlYXR1cmUzOworCQkJCWJyZWFrOworCQkJfQkJCisJCX0KKwkJYXNzZXJ0Tm90TnVsbCgiRmVhdHVyZSAyIGlzIE51bGwiLGZlYXR1cmUyKTsKKwkJYXNzZXJ0VHJ1ZSgiV3JvbmcgaWQgIHZlcnNpb24gb2YgZmVhdHVyZSIsZmVhdHVyZTIuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkuZXF1YWxzSWdub3JlQ2FzZSgib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTNfMS4wLjAiKSk7CisJCQorCQkvLyB0ZXN0IG9ubHkgMiBpbnN0YWxsIGNvbmZpZyBpbiBsb2NhbCBzaXRlCisvLwkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBudW1iZXIgb2YgaGlzdG9yeSBpbiBMb2NhbCBzaXRlOiIsb2xkTnVtYmVyT2ZoaXN0b3J5KzEsc2l0ZS5nZXRDb25maWd1cmF0aW9uSGlzdG9yeSgpLmxlbmd0aCk7CisJCQorCQkvLyB0ZXN0ICMgb2Ygc2l0ZXMgaW4gY3VycmVudCBjb25maWcKKwkJYXNzZXJ0VHJ1ZSgiV3JvbmcgbnVtYmVyIG9mIGNvbmZpZyBzaXRlcyBpbiBjdXJyZW50IGNvbmZpZyIsc2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldENvbmZpZ3VyZWRTaXRlcygpLmxlbmd0aD09b2xkTnVtYmVyKTsKKwkJCisJCS8vdGVzdCBvbmx5IG9uZSBmZWF0dXJlIGZvciB0aGUgc2l0ZQorLy8JCWFzc2VydFRydWUoIndyb25nIG51bWJlciBvZiBjb25maWd1cmVkIGZlYXR1cmVzIGZvciBjb25maWcgc2l0ZSIsc2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldENvbmZpZ3VyZWRTaXRlcygpWzBdLmdldENvbmZpZ3VyZWRGZWF0dXJlcygpLmxlbmd0aD09MSk7CisJCQorCQkvLyB0ZXN0IG9ubHkgMiBhY3Rpdml0aWVzCisvLwkJYXNzZXJ0VHJ1ZSgiV3JvbmcgbnVtYmVyIG9mIGFjdGl2aXRpZXMgZm9yIGluc3RhbGwgY29uZmlnIixzaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkuZ2V0QWN0aXZpdGllcygpLmxlbmd0aD09Mik7CisJCQorCQkKKwkJLy8gY2xlYW51cAorCQlsb2NhbEZpbGUgPSBuZXcgRmlsZSgoKExvY2FsU2l0ZSlTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKSkuZ2V0TG9jYXRpb25VUkwoKS5nZXRGaWxlKCkpOworCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obG9jYWxGaWxlKTsJCQorCQlsb2NhbEZpbGUgPSBuZXcgRmlsZShuZXcgVVJMKGxvY2F0aW9uLFNpdGUuREVGQVVMVF9GRUFUVVJFX1BBVEgrRmlsZS5zZXBhcmF0b3IrZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSkuZ2V0RmlsZSgpKTsJCQorCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obG9jYWxGaWxlKTsJCQkJCQorCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0oZmlsZSk7CQkKKwl9CisKKy8qCXB1YmxpYyB2b2lkIHRlc3RSZXRyaXZlQ29uZmlnSFRUUEluc3RhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQkvL2NsZWFuIHVwCisJCUZpbGUgbG9jYWxGaWxlID0gbmV3IEZpbGUoKChMb2NhbFNpdGUpU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkpLmdldExvY2F0aW9uVVJMKCkuZ2V0RmlsZSgpKTsKKwkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGxvY2FsRmlsZSk7CisJCUludGVybmFsU2l0ZU1hbmFnZXIubG9jYWxTaXRlPW51bGw7CQkKKworCQlJTG9jYWxTaXRlIHNpdGUgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsKKwkJSVNpdGUgcmVtb3RlU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoU09VUkNFX0hUVFBfU0lURSxudWxsKTsKKwkJSUZlYXR1cmUgZmVhdHVyZSA9IHJlbW90ZVNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKVswXS5nZXRGZWF0dXJlKG51bGwpOworCQkKKwkJLy8gd2UgYXJlIG5vdCBjaGVja2luZyBpZiB0aGlzIGlzIHJlYWQgb25seQorCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gbmV3Q29uZmlnID0gc2l0ZS5jbG9uZUN1cnJlbnRDb25maWd1cmF0aW9uKCk7CisJCW5ld0NvbmZpZy5zZXRMYWJlbCgibmV3IExhYmVsIik7CQkKKwkJSUNvbmZpZ3VyZWRTaXRlIGNvbmZpZ1NpdGUgPSBuZXdDb25maWcuZ2V0Q29uZmlndXJlZFNpdGVzKClbMF07CisJCUNvbmZpZ3VyYXRpb25Qb2xpY3lNb2RlbCBjb25maWdQb2xpY3kgPSBuZXcgQmFzZVNpdGVMb2NhbEZhY3RvcnkoKS5jcmVhdGVDb25maWd1cmF0aW9uUG9saWN5TW9kZWwoKTsKKwkJY29uZmlnUG9saWN5LnNldFBvbGljeShJUGxhdGZvcm1Db25maWd1cmF0aW9uLklTaXRlUG9saWN5LlVTRVJfSU5DTFVERSk7CisJCSgoQ29uZmlndXJlZFNpdGUpY29uZmlnU2l0ZSkuc2V0Q29uZmlndXJhdGlvblBvbGljeU1vZGVsKChDb25maWd1cmF0aW9uUG9saWN5TW9kZWwpY29uZmlnUG9saWN5KTsJCisJCWludCBvbGROdW1iZXJPZmhpc3RvcnkgPSBzaXRlLmdldENvbmZpZ3VyYXRpb25IaXN0b3J5KCkubGVuZ3RoOwkJCQorCQlzaXRlLmFkZENvbmZpZ3VyYXRpb24obmV3Q29uZmlnKTsKKwkJCisJCisJCSgoQ29uZmlndXJlZFNpdGUpY29uZmlnU2l0ZSkuc2V0VXBkYXRhYmxlKHRydWUpOwkJCQkKKwkJY29uZmlnU2l0ZS5pbnN0YWxsKGZlYXR1cmUsbnVsbCxudWxsKTsKKwkJc2l0ZS5zYXZlKCk7CisKKwkJLy9kbyBub3QgY2xlYW51cCwgd2Ugd2FudCB0byByZXVzZSBwcmV2aW91c2x5IGNyZWF0ZWQgbG9jYWwgc2l0ZQorCQkvLyBidXQgZm9yY2UgcmUtcmVhZCBvZiB4bWwgRmlsZQorCQlJbnRlcm5hbFNpdGVNYW5hZ2VyLmxvY2FsU2l0ZT1udWxsOworCQlzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7CisJCWZlYXR1cmUgPSByZW1vdGVTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKClbMF0uZ2V0RmVhdHVyZShudWxsKTsKKwkJaW50IG9sZE51bWJlciA9IHNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5nZXRDb25maWd1cmVkU2l0ZXMoKS5sZW5ndGg7CQkKKwkJCisJCS8vIGNoZWNrCisJCS8vIHRoZXJlIGFyZSAyIGNvbmZpZ3VyYXRpb24KKwkJU3RyaW5nIHRpbWUgPSAiIitzaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkuZ2V0Q3JlYXRpb25EYXRlKCkuZ2V0VGltZSgpOworCQlVUkwgbG9jYXRpb24gPSAoKExvY2FsU2l0ZSlzaXRlKS5nZXRMb2NhdGlvblVSTCgpOwkJCisJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKG5ldyBVUkwobG9jYXRpb24sInBsYXRmb3JtLnhtbCIpLmdldEZpbGUoKSk7CisJCWFzc2VydFRydWUoIm5ldyBjb25maWd1cmF0aW9uIGRvZXMgbm90IGV4aXN0IiwgZmlsZS5leGlzdHMoKSk7CisJCQorCQkvLyB0ZWggY3VycmVudCBvbmUgcG9pbnRzIHRvIGEgcmVhbCBmYXR1cmUKKwkJLy8gZG9lcyBub3QgdGhyb3cgZXJyb3IuCisJCUlDb25maWd1cmVkU2l0ZSBjb25maWdTaXRlMiA9IHNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5nZXRDb25maWd1cmVkU2l0ZXMoKVswXTsKKwkJCisJCUlGZWF0dXJlUmVmZXJlbmNlW10gcmVmcyA9IGNvbmZpZ1NpdGUyLmdldENvbmZpZ3VyZWRGZWF0dXJlcygpOworCQlib29sZWFuIGZvdW5kID0gZmFsc2U7CisJCUlGZWF0dXJlIGZlYXR1cmUyID0gbnVsbDsKKwkJZm9yIChpbnQgaSA9IDA7ICFmb3VuZCAmJiBpIDwgcmVmcy5sZW5ndGg7IGkrKykgeworCQkJSUZlYXR1cmUgZmVhdHVyZTMgPSByZWZzW2ldLmdldEZlYXR1cmUobnVsbCk7CQkJCisJCQlpZiAoIm9yZy50ZXN0MS5pZGVudDFfMS4wLjAiLmVxdWFscyhmZWF0dXJlMy5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSkpeworCQkJCWZlYXR1cmUyID0gZmVhdHVyZTM7CisJCQkJZm91bmQgPSB0cnVlOworCQkJfQkJCisJCX0KKworCQkvL1N0cmluZyBjb25maWd1cmVkRmVhdHVyZSA9IGZlYXR1cmUyLmdldExhYmVsKCk7CisJCWFzc2VydFRydWUoImNhbm5vdCBmaW5kIGZlYXR1cmUgb3JnLnRlc3QxLmlkZW50MV8xLjAuMCBpbiBjb25maWd1cmVkIFNpdGUiLGZvdW5kKTsKKwkJYXNzZXJ0VHJ1ZSgiV3JvbmcgaWQgIHZlcnNpb24gb2YgZmVhdHVyZSIsZmVhdHVyZTIuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkuZXF1YWxzSWdub3JlQ2FzZSgib3JnLnRlc3QxLmlkZW50MV8xLjAuMCIpKTsKKwkJCisJCS8vIHRlc3Qgb25seSAyIGluc3RhbGwgY29uZmlnIGluIGxvY2FsIHNpdGUKKy8vCQlhc3NlcnRFcXVhbHMoIndyb25nIG51bWJlciBvZiBoaXN0b3J5IGluIExvY2FsIHNpdGU6IixvbGROdW1iZXJPZmhpc3RvcnkrMSxzaXRlLmdldENvbmZpZ3VyYXRpb25IaXN0b3J5KCkubGVuZ3RoKTsKKwkJCisJCS8vIHRlc3Qgc2FtZSBudW1iZXIgb2Ygc2l0ZXMgaW4gY3VycmVudCBjb25maWcKKwkJYXNzZXJ0VHJ1ZSgiV3JvbmcgbnVtYmVyIG9mIGNvbmZpZyBzaXRlcyBpbiBjdXJyZW50IGNvbmZpZyIsc2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldENvbmZpZ3VyZWRTaXRlcygpLmxlbmd0aD09b2xkTnVtYmVyKTsKKwkJCisJCS8vdGVzdCBvbmx5IG9uZSBmZWF0dXJlIGZvciB0aGUgc2l0ZQorLy8JCWFzc2VydFRydWUoIndyb25nIG51bWJlciBvZiBjb25maWd1cmVkIGZlYXR1cmVzIGZvciBjb25maWcgc2l0ZSIsc2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldENvbmZpZ3VyZWRTaXRlcygpWzBdLmdldENvbmZpZ3VyZWRGZWF0dXJlcygpLmxlbmd0aD09MSk7CisJCQorCQkvLyB0ZXN0IG9ubHkgMiBhY3Rpdml0aWVzCisvLwkJYXNzZXJ0VHJ1ZSgiV3JvbmcgbnVtYmVyIG9mIGFjdGl2aXRpZXMgZm9yIGluc3RhbGwgY29uZmlnIixzaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkuZ2V0QWN0aXZpdGllcygpLmxlbmd0aD09Mik7CisJCQorCQkKKwkJLy8gY2xlYW51cAorCQlsb2NhbEZpbGUgPSBuZXcgRmlsZShsb2NhdGlvbi5nZXRGaWxlKCkpOworCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obG9jYWxGaWxlKTsJCQorCQlsb2NhbEZpbGUgPSBuZXcgRmlsZShuZXcgVVJMKGxvY2F0aW9uLFNpdGUuREVGQVVMVF9GRUFUVVJFX1BBVEgrRmlsZS5zZXBhcmF0b3IrZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSkuZ2V0RmlsZSgpKTsJCQorCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obG9jYWxGaWxlKTsJCQkJCQkJCisJCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShmaWxlKTsJCQorCQlsb2NhbEZpbGUgPSBuZXcgRmlsZShmZWF0dXJlMi5nZXRVUkwoKS5nZXRGaWxlKCkpOworCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obG9jYWxGaWxlKTsKKwl9Ki8KKwkKKy8vVE9ETyB1bmNvbW1lbnQgdGhpcyBvbmNlIHNpdGUgZGlzYWJsaW5nIGlzIHN1cHBvcnRlZAorcHVibGljIHZvaWQgdGVzdFJldHJpdmVDb25maWdIVFRQSW5zdGFsbE5vdEVuYWJsZSgpIHRocm93cyBFeGNlcHRpb24geworLyoKKwkvL2NsZWFuIHVwCisJTG9jYWxTaXRlIHNpdGVMb2NhbCA9IChMb2NhbFNpdGUpU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7CisJVVJMIG5ld1VSTCA9IG5ldyBVUkwoc2l0ZUxvY2FsLmdldExvY2F0aW9uVVJMKCksTG9jYWxTaXRlLlNJVEVfTE9DQUxfRklMRSk7CisJRmlsZSBsb2NhbEZpbGUgPSBuZXcgRmlsZShuZXdVUkwuZ2V0RmlsZSgpKTsKKwlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obG9jYWxGaWxlKTsKKwlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obmV3IEZpbGUoKChJbnN0YWxsQ29uZmlndXJhdGlvbilzaXRlTG9jYWwuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKSkuZ2V0VVJMKCkuZ2V0RmlsZSgpKSk7CQorCUludGVybmFsU2l0ZU1hbmFnZXIubG9jYWxTaXRlPW51bGw7CQkKKworCUlMb2NhbFNpdGUgc2l0ZSA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpOworCUlTaXRlIHJlbW90ZVNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKFNPVVJDRV9IVFRQX1NJVEUpOworCUlGZWF0dXJlIGZlYXR1cmUgPSByZW1vdGVTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKClbMF0uZ2V0RmVhdHVyZShudWxsKTsKKwkJCisJLy8gd2UgYXJlIG5vdCBjaGVja2luZyBpZiB0aGlzIGlzIHJlYWQgb25seQorCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBuZXdDb25maWcgPSBzaXRlLmNsb25lQ3VycmVudENvbmZpZ3VyYXRpb24oKTsKKwluZXdDb25maWcuc2V0TGFiZWwoIm5ldyBMYWJlbCIpOwkJCisJSUNvbmZpZ3VyZWRTaXRlIGNvbmZpZ1NpdGUgPSBuZXdDb25maWcuZ2V0Q29uZmlndXJlZFNpdGVzKClbMF07CisJQ29uZmlndXJhdGlvblBvbGljeU1vZGVsIGNvbmZpZ1BvbGljeSA9IG5ldyBCYXNlU2l0ZUxvY2FsRmFjdG9yeSgpLmNyZWF0ZUNvbmZpZ3VyYXRpb25Qb2xpY3lNb2RlbCgpOworCWNvbmZpZ1BvbGljeS5zZXRQb2xpY3koSVBsYXRmb3JtQ29uZmlndXJhdGlvbi5JU2l0ZVBvbGljeS5VU0VSX0lOQ0xVREUpOworCSgoQ29uZmlndXJlZFNpdGUpY29uZmlnU2l0ZSkuc2V0Q29uZmlndXJhdGlvblBvbGljeU1vZGVsKChDb25maWd1cmF0aW9uUG9saWN5TW9kZWwpY29uZmlnUG9saWN5KTsJCisJaW50IG9sZE51bWJlck9maGlzdG9yeSA9IHNpdGUuZ2V0Q29uZmlndXJhdGlvbkhpc3RvcnkoKS5sZW5ndGg7CQkJCisJc2l0ZS5hZGRDb25maWd1cmF0aW9uKG5ld0NvbmZpZyk7CisJCQorCQorCSgoQ29uZmlndXJlZFNpdGUpY29uZmlnU2l0ZSkuc2V0VXBkYXRhYmxlKHRydWUpOworCWNvbmZpZ1NpdGUuaW5zdGFsbChmZWF0dXJlLG51bGwsbnVsbCk7CisJKChDb25maWd1cmVkU2l0ZSljb25maWdTaXRlKS5zZXRFbmFibGVkKGZhbHNlKTsJCisJc2l0ZS5zYXZlKCk7CisKKwkvL2RvIG5vdCBjbGVhbnVwLCB3ZSB3YW50IHRvIHJldXNlIHByZXZpb3VzbHkgY3JlYXRlZCBsb2NhbCBzaXRlCisJLy8gYnV0IGZvcmNlIHJlLXJlYWQgb2YgeG1sIEZpbGUKKwlJbnRlcm5hbFNpdGVNYW5hZ2VyLmxvY2FsU2l0ZT1udWxsOworCXNpdGUgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsKKwlmZWF0dXJlID0gcmVtb3RlU2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpWzBdLmdldEZlYXR1cmUobnVsbCk7CisJaW50IG9sZE51bWJlciA9IHNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5nZXRDb25maWd1cmVkU2l0ZXMoKS5sZW5ndGg7CQkKKwkJCisJLy8gY2hlY2sKKwkvLyB0aGVyZSBhcmUgMiBjb25maWd1cmF0aW9uCisJU3RyaW5nIHRpbWUgPSAiIitzaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkuZ2V0Q3JlYXRpb25EYXRlKCkuZ2V0VGltZSgpOworCVVSTCBsb2NhdGlvbiA9ICgoTG9jYWxTaXRlKXNpdGUpLmdldExvY2F0aW9uVVJMKCk7CQkKKwlGaWxlIGZpbGUgPSBuZXcgRmlsZShsb2NhdGlvbi5nZXRGaWxlKCkpOworCWFzc2VydFRydWUoIm5ldyBjb25maWd1cmF0aW9uIGRvZXMgbm90IGV4aXN0IiwgZmlsZS5leGlzdHMoKSk7CisJCQorCS8vIHRlaCBjdXJyZW50IG9uZSBwb2ludHMgdG8gYSByZWFsIGZhdHVyZQorCS8vIGRvZXMgbm90IHRocm93IGVycm9yLgorCUlDb25maWd1cmVkU2l0ZSBjb25maWdTaXRlMiA9IHNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5nZXRDb25maWd1cmVkU2l0ZXMoKVswXTsKKwkJCisJSUZlYXR1cmVSZWZlcmVuY2VbXSByZWZzID0gY29uZmlnU2l0ZTIuZ2V0Q29uZmlndXJlZEZlYXR1cmVzKCk7CisJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOworCUlGZWF0dXJlIGZlYXR1cmUyID0gbnVsbDsKKwlmb3IgKGludCBpID0gMDsgIWZvdW5kICYmIGkgPCByZWZzLmxlbmd0aDsgaSsrKSB7CisJCUlGZWF0dXJlIGZlYXR1cmUzID0gcmVmc1tpXS5nZXRGZWF0dXJlKG51bGwpOwkJCQorCQlpZiAoIm9yZy50ZXN0MS5pZGVudDFfMS4wLjAiLmVxdWFscyhmZWF0dXJlMy5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSkpeworCQkJZmVhdHVyZTIgPSBmZWF0dXJlMzsKKwkJCWZvdW5kID0gdHJ1ZTsKKwkJfQkJCisJfQorCisJLy9TdHJpbmcgY29uZmlndXJlZEZlYXR1cmUgPSBmZWF0dXJlMi5nZXRMYWJlbCgpOworCWFzc2VydFRydWUoImZvdW5kIGZlYXR1cmUgb3JnLnRlc3QxLmlkZW50MV8xLjAuMCBpbiBkaXNhYmxlZCBjb25maWd1cmVkIFNpdGUiLCFmb3VuZCk7CisJCQorCS8vdGVzdCBubyBjb25maWd1cmVkIGZlYXR1cmVzCisvLwlhc3NlcnRUcnVlKCJ3cm9uZyBudW1iZXIgb2YgY29uZmlndXJlZCBmZWF0dXJlcyBmb3IgY29uZmlnIHNpdGUiLHNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5nZXRDb25maWd1cmVkU2l0ZXMoKVswXS5nZXRDb25maWd1cmVkRmVhdHVyZXMoKS5sZW5ndGg9PTApOworCQorCQorCWNvbmZpZ1NpdGUyLnNldEVuYWJsZWQodHJ1ZSk7CisJcmVmcyA9IGNvbmZpZ1NpdGUyLmdldENvbmZpZ3VyZWRGZWF0dXJlcygpOwkKKwlmb3IgKGludCBpID0gMDsgaSA8IHJlZnMubGVuZ3RoOyBpKyspIHsKKwkJSUZlYXR1cmUgZmVhdHVyZTMgPSByZWZzW2ldLmdldEZlYXR1cmUobnVsbCk7CQkJCisJCWlmICgib3JnLnRlc3QxLmlkZW50MV8xLjAuMCIuZXF1YWxzKGZlYXR1cmUzLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKSl7CisJCQlmZWF0dXJlMiA9IGZlYXR1cmUzOworCQkJZm91bmQgPSB0cnVlOworCQl9CQkKKwl9CisKKwkvL1N0cmluZyBjb25maWd1cmVkRmVhdHVyZSA9IGZlYXR1cmUyLmdldExhYmVsKCk7CisJYXNzZXJ0VHJ1ZSgiY2Fubm90IGZpbmQgZmVhdHVyZSBvcmcudGVzdDEuaWRlbnQxXzEuMC4wIGluIGNvbmZpZ3VyZWQgU2l0ZSIsZm91bmQpOworCWFzc2VydFRydWUoIldyb25nIGlkICB2ZXJzaW9uIG9mIGZlYXR1cmUiLGZlYXR1cmUyLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpLmVxdWFsc0lnbm9yZUNhc2UoIm9yZy50ZXN0MS5pZGVudDFfMS4wLjAiKSk7CisJCQorCS8vIHRlc3Qgb25seSAyIGluc3RhbGwgY29uZmlnIGluIGxvY2FsIHNpdGUKKy8vCWFzc2VydEVxdWFscygid3JvbmcgbnVtYmVyIG9mIGhpc3RvcnkgaW4gTG9jYWwgc2l0ZToiLG9sZE51bWJlck9maGlzdG9yeSsxLHNpdGUuZ2V0Q29uZmlndXJhdGlvbkhpc3RvcnkoKS5sZW5ndGgpOworCQkKKwkvLyB0ZXN0IHNhbWUgbnVtYmVyIG9mIHNpdGVzIGluIGN1cnJlbnQgY29uZmlnCisvLwlhc3NlcnRUcnVlKCJXcm9uZyBudW1iZXIgb2YgY29uZmlnIHNpdGVzIGluIGN1cnJlbnQgY29uZmlnIixzaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkuZ2V0Q29uZmlndXJlZFNpdGVzKCkubGVuZ3RoPT1vbGROdW1iZXIpOworCQkKKwkvL3Rlc3Qgb25seSBvbmUgZmVhdHVyZSBmb3IgdGhlIHNpdGUKKy8vCWFzc2VydFRydWUoIndyb25nIG51bWJlciBvZiBjb25maWd1cmVkIGZlYXR1cmVzIGZvciBjb25maWcgc2l0ZSIsc2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldENvbmZpZ3VyZWRTaXRlcygpWzBdLmdldENvbmZpZ3VyZWRGZWF0dXJlcygpLmxlbmd0aD09MSk7CisJCQorCS8vIHRlc3Qgb25seSAyIGFjdGl2aXRpZXMKKy8vCWFzc2VydFRydWUoIldyb25nIG51bWJlciBvZiBhY3Rpdml0aWVzIGZvciBpbnN0YWxsIGNvbmZpZyIsc2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldEFjdGl2aXRpZXMoKS5sZW5ndGg9PTIpOworCQkKKwkJCisJLy8gY2xlYW51cAorCWxvY2FsRmlsZSA9IG5ldyBGaWxlKG5ldyBVUkwobG9jYXRpb24sTG9jYWxTaXRlLlNJVEVfTE9DQUxfRklMRSkuZ2V0RmlsZSgpKTsKKwlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obG9jYWxGaWxlKTsJCQorCWxvY2FsRmlsZSA9IG5ldyBGaWxlKG5ldyBVUkwobG9jYXRpb24sTG9jYWxTaXRlLkRFRkFVTFRfQ09ORklHX0ZJTEUpLmdldEZpbGUoKSk7CisJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGxvY2FsRmlsZSk7CQorCWxvY2FsRmlsZSA9IG5ldyBGaWxlKG5ldyBVUkwobG9jYXRpb24sU2l0ZS5ERUZBVUxUX0ZFQVRVUkVfUEFUSCtGaWxlLnNlcGFyYXRvcitmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKS5nZXRGaWxlKCkpOwkJCisJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGxvY2FsRmlsZSk7CQorCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShuZXcgRmlsZSgoKEluc3RhbGxDb25maWd1cmF0aW9uKXNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKSkuZ2V0VVJMKCkuZ2V0RmlsZSgpKSk7CQkJCQkJCisJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGZpbGUpOwkJCisJbG9jYWxGaWxlID0gbmV3IEZpbGUoZmVhdHVyZTIuZ2V0VVJMKCkuZ2V0RmlsZSgpKTsKKwlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obG9jYWxGaWxlKTsqLworfQorCisKK30KKwpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcmVndWxhckluc3RhbGwvVGVzdFNwYWNlSW5JbnN0YWxsLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9yZWd1bGFySW5zdGFsbC9UZXN0U3BhY2VJbkluc3RhbGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWIxMTFhCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcmVndWxhckluc3RhbGwvVGVzdFNwYWNlSW5JbnN0YWxsLmphdmEKQEAgLTAsMCArMSwxNDAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMucmVndWxhckluc3RhbGw7CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEubmV0LlVSTDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlTWFuYWdlclRlc3RDYXNlOworCitwdWJsaWMgY2xhc3MgVGVzdFNwYWNlSW5JbnN0YWxsIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsKKwkvKioKKwkgKiBDb25zdHJ1Y3RvciBmb3IgVGVzdDEKKwkgKi8KKwlwdWJsaWMgVGVzdFNwYWNlSW5JbnN0YWxsKFN0cmluZyBhcmcwKSB7CisJCXN1cGVyKGFyZzApOworCX0KKworCS8qKgorCSAqCisJICovCisJcHVibGljIHZvaWQgdGVzdFNwYWNlSW5VUkwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQkvL2NsZWFudXAgdGFyZ2V0IAorCQlVUkwgdGVzdFVSTCA9IG5ldyBVUkwoVEFSR0VUX0ZJTEVfU0lURSwidGVzdCBzaXRlIHNwYWNlLyIpOyAKKwkJU3RyaW5nIHRlc3RQYXRoID0gdGVzdFVSTC5nZXRGaWxlKCk7CisJCUZpbGUgdGFyZ2V0ID0gbmV3IEZpbGUodGVzdFBhdGgpOworCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0odGFyZ2V0KTsKKwkJCisJCVVSTCBuZXdVUkwgPSBuZXcgRmlsZShkYXRhUGF0aCArICJTaXRlIHdpdGggc3BhY2Uvc2l0ZS54bWwiKS50b1VSTCgpOworCQlJU2l0ZSByZW1vdGVTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShuZXdVUkwsdHJ1ZSxudWxsKTsKKwkJSUZlYXR1cmVSZWZlcmVuY2VbXSBmZWF0dXJlc1JlZiA9IHJlbW90ZVNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsKKwkJaWYgKCF0YXJnZXQuZXhpc3RzKCkpIHRhcmdldC5ta2RpcnMoKTsKKwkJSVNpdGUgbG9jYWxTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZSh0ZXN0VVJMLHRydWUsbnVsbCk7CisJCUlGZWF0dXJlIHJlbW90ZUZlYXR1cmUgPSBudWxsOworCQkKKwkJLy8gYXQgbGVhc3Qgb25lIGV4ZWN1dGFibGUgZmVhdHVyZSBhbmQgb24gcGFja2FnZWQKKwkJYm9vbGVhbiBleGVjRmVhdHVyZSA9IGZhbHNlOworCQlib29sZWFuIHBhY2tGZWF0dXJlID0gZmFsc2U7CisKKwkJaWYgKGZlYXR1cmVzUmVmLmxlbmd0aD09MCkgZmFpbCAoIm5vIGZlYXR1cmUgZm91bmQiKTsKKwkKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlc1JlZi5sZW5ndGg7IGkrKykgeworCQkJcmVtb3RlRmVhdHVyZSA9IGZlYXR1cmVzUmVmW2ldLmdldEZlYXR1cmUobnVsbCk7CisJCQlyZW1vdmUocmVtb3RlRmVhdHVyZSxsb2NhbFNpdGUpOyAKKwkJCWxvY2FsU2l0ZS5pbnN0YWxsKHJlbW90ZUZlYXR1cmUsIG51bGwsbnVsbCk7CisJCQkKKwkJCWlmIChyZW1vdGVGZWF0dXJlLmdldEZlYXR1cmVDb250ZW50UHJvdmlkZXIoKSBpbnN0YW5jZW9mIEZlYXR1cmVQYWNrYWdlZENvbnRlbnRQcm92aWRlcikgcGFja0ZlYXR1cmUgPSB0cnVlOworCQkJaWYgKHJlbW90ZUZlYXR1cmUuZ2V0RmVhdHVyZUNvbnRlbnRQcm92aWRlcigpIGluc3RhbmNlb2YgRmVhdHVyZUV4ZWN1dGFibGVDb250ZW50UHJvdmlkZXIpIGV4ZWNGZWF0dXJlID0gdHJ1ZTsKKworCQkJLy8gdmVyaWZ5CisJCQlTdHJpbmcgc2l0ZSA9IHRlc3RQYXRoOworCQkJSVBsdWdpbkVudHJ5W10gZW50cmllcyA9IHJlbW90ZUZlYXR1cmUuZ2V0UmF3UGx1Z2luRW50cmllcygpOworCQkJYXNzZXJ0VHJ1ZSgibm8gcGx1Z2lucyBlbnRyeSIsIChlbnRyaWVzICE9IG51bGwgJiYgZW50cmllcy5sZW5ndGggIT0gMCkpOworCQkJU3RyaW5nIHBsdWdpbk5hbWUgPSBlbnRyaWVzWzBdLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpOworCQkJRmlsZSBwbHVnaW5GaWxlID0gbmV3IEZpbGUoc2l0ZSwgU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRIICsgcGx1Z2luTmFtZSk7CisJCQlhc3NlcnRUcnVlKCJwbHVnaW4gZmlsZXMgbm90IGluc3RhbGxlZCBsb2NhbGx5IChwbHVnaW5GaWxlPSIgKyBwbHVnaW5GaWxlICsgIix0YXJnZXQ9IiArIHRhcmdldCArICcpJywgcGx1Z2luRmlsZS5leGlzdHMoKSk7CisKKwkJCUZpbGUgZmVhdHVyZUZpbGUgPSBuZXcgRmlsZShzaXRlLCBTaXRlLkRFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfUEFUSCArIHJlbW90ZUZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpOworCQkJYXNzZXJ0VHJ1ZSgiZmVhdHVyZSBpbmZvIG5vdCBpbnN0YWxsZWQgbG9jYWxseToiK2ZlYXR1cmVGaWxlLCBmZWF0dXJlRmlsZS5leGlzdHMoKSk7CisKKwkJCUZpbGUgZmVhdHVyZUZpbGVYTUwgPSBuZXcgRmlsZShzaXRlLCBTaXRlLkRFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfUEFUSCArIHJlbW90ZUZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkgKyBGaWxlLnNlcGFyYXRvciArICJmZWF0dXJlLnhtbCIpOworCQkJYXNzZXJ0VHJ1ZSgiZmVhdHVyZSBpbmZvIG5vdCBpbnN0YWxsZWQgbG9jYWxseTogbm8gZmVhdHVyZS54bWwiLCBmZWF0dXJlRmlsZVhNTC5leGlzdHMoKSk7CisJCX0KKworCQlpZiAoIWV4ZWNGZWF0dXJlICYmICFwYWNrRmVhdHVyZSl7CisJCQlmYWlsKCJjYW5ub3QgZmluZCBvbmUgZXhlY3V0YWJsZSBhbmQgb25lIHBhY2thZ2UgZmVhdHVyZSBvbiB0ZWggc2l0ZSIpOworCQl9CisKKwkJLy9jbGVhbnVwIHRhcmdldCAKKwkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKHRhcmdldCk7CisKKworCX0KKwkKKwkKKwkvKioKKwkgKgorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RTcGFjZUluSFRUUFVSTCgpIHRocm93cyBFeGNlcHRpb24geworCisJCS8vY2xlYW51cCB0YXJnZXQgIAorCQlGaWxlIHRhcmdldCA9IG5ldyBGaWxlKFRBUkdFVF9GSUxFX1NJVEUuZ2V0RmlsZSgpKTsKKwkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKHRhcmdldCk7CisJCUluc3RhbGxSZWdpc3RyeS5jbGVhbnVwKCk7CisJCQorCQlTdHJpbmcgcGF0aCA9IGJ1bmRsZS5nZXRTdHJpbmcoIkhUVFBfUEFUSF8zIik7CisJCUlTaXRlIHJlbW90ZVNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKG5ldyBVUkwoImh0dHAiLGdldEh0dHBIb3N0KCksZ2V0SHR0cFBvcnQoKSxwYXRoKSx0cnVlLG51bGwpOwkJCisJCUlGZWF0dXJlUmVmZXJlbmNlW10gZmVhdHVyZXNSZWYgPSByZW1vdGVTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7CisJCUlTaXRlIGxvY2FsU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoVEFSR0VUX0ZJTEVfU0lURSx0cnVlLG51bGwpOworCQlJRmVhdHVyZSByZW1vdGVGZWF0dXJlID0gbnVsbDsKKwkJCisJCS8vIGF0IGxlYXN0IG9uZSBleGVjdXRhYmxlIGZlYXR1cmUgYW5kIG9uIHBhY2thZ2VkCisJCWJvb2xlYW4gZXhlY0ZlYXR1cmUgPSBmYWxzZTsKKwkJYm9vbGVhbiBwYWNrRmVhdHVyZSA9IGZhbHNlOworCisJCWlmIChmZWF0dXJlc1JlZi5sZW5ndGg9PTApIGZhaWwgKCJubyBmZWF0dXJlIGZvdW5kIik7CisJCisJCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXNSZWYubGVuZ3RoOyBpKyspIHsKKwkJCXJlbW90ZUZlYXR1cmUgPSBmZWF0dXJlc1JlZltpXS5nZXRGZWF0dXJlKG51bGwpOworCQkJbG9jYWxTaXRlLmluc3RhbGwocmVtb3RlRmVhdHVyZSwgbnVsbCxudWxsKTsKKwkJCQorCQkJaWYgKHJlbW90ZUZlYXR1cmUuZ2V0RmVhdHVyZUNvbnRlbnRQcm92aWRlcigpIGluc3RhbmNlb2YgRmVhdHVyZVBhY2thZ2VkQ29udGVudFByb3ZpZGVyKSBwYWNrRmVhdHVyZSA9IHRydWU7CisJCQlpZiAocmVtb3RlRmVhdHVyZS5nZXRGZWF0dXJlQ29udGVudFByb3ZpZGVyKCkgaW5zdGFuY2VvZiBGZWF0dXJlRXhlY3V0YWJsZUNvbnRlbnRQcm92aWRlcikgZXhlY0ZlYXR1cmUgPSB0cnVlOworCisJCQkvLyB2ZXJpZnkKKwkJCVN0cmluZyBzaXRlID0gVEFSR0VUX0ZJTEVfU0lURS5nZXRGaWxlKCk7CQkJCisJCQlJUGx1Z2luRW50cnlbXSBlbnRyaWVzID0gcmVtb3RlRmVhdHVyZS5nZXRSYXdQbHVnaW5FbnRyaWVzKCk7CisJCQlhc3NlcnRUcnVlKCJubyBwbHVnaW5zIGVudHJ5IiwgKGVudHJpZXMgIT0gbnVsbCAmJiBlbnRyaWVzLmxlbmd0aCAhPSAwKSk7CisJCQlTdHJpbmcgcGx1Z2luTmFtZSA9IGVudHJpZXNbMF0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCk7CisJCQlGaWxlIHBsdWdpbkZpbGUgPSBuZXcgRmlsZShzaXRlLCBTaXRlLkRFRkFVTFRfUExVR0lOX1BBVEggKyBwbHVnaW5OYW1lKTsKKwkJCWFzc2VydFRydWUoInBsdWdpbiBmaWxlcyBub3QgaW5zdGFsbGVkIGxvY2FsbHkiLCBwbHVnaW5GaWxlLmV4aXN0cygpKTsKKworCQkJRmlsZSBmZWF0dXJlRmlsZSA9IG5ldyBGaWxlKHNpdGUsIFNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRIICsgcmVtb3RlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSk7CisJCQlhc3NlcnRUcnVlKCJmZWF0dXJlIGluZm8gbm90IGluc3RhbGxlZCBsb2NhbGx5OiIrZmVhdHVyZUZpbGUsIGZlYXR1cmVGaWxlLmV4aXN0cygpKTsKKworCQkJRmlsZSBmZWF0dXJlRmlsZVhNTCA9IG5ldyBGaWxlKHNpdGUsIFNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRIICsgcmVtb3RlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSArIEZpbGUuc2VwYXJhdG9yICsgImZlYXR1cmUueG1sIik7CisJCQlhc3NlcnRUcnVlKCJmZWF0dXJlIGluZm8gbm90IGluc3RhbGxlZCBsb2NhbGx5OiBubyBmZWF0dXJlLnhtbCIsIGZlYXR1cmVGaWxlWE1MLmV4aXN0cygpKTsKKwkJfQorCisJCWlmICghZXhlY0ZlYXR1cmUgJiYgIXBhY2tGZWF0dXJlKXsKKwkJCWZhaWwoImNhbm5vdCBmaW5kIG9uZSBleGVjdXRhYmxlIGFuZCBvbmUgcGFja2FnZSBmZWF0dXJlIG9uIHRlaCBzaXRlIik7CisJCX0KKworCQkvL2NsZWFudXAgdGFyZ2V0IAorCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0odGFyZ2V0KTsKKwkJSW5zdGFsbFJlZ2lzdHJ5LmNsZWFudXAoKTsKKworCX0KKwkJCisJCQorfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcmVndWxhclJlbW92ZS9BbGxSZWd1bGFyUmVtb3ZlVGVzdHMuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3JlZ3VsYXJSZW1vdmUvQWxsUmVndWxhclJlbW92ZVRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQzOGM0MwotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3JlZ3VsYXJSZW1vdmUvQWxsUmVndWxhclJlbW92ZVRlc3RzLmphdmEKQEAgLTAsMCArMSwyOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5yZWd1bGFyUmVtb3ZlOworCitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZU1hbmFnZXJUZXN0Q2FzZTsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKKworCitwdWJsaWMgY2xhc3MgQWxsUmVndWxhclJlbW92ZVRlc3RzIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsKK3B1YmxpYyBBbGxSZWd1bGFyUmVtb3ZlVGVzdHMoU3RyaW5nIG5hbWUpIHsKKwlzdXBlcihuYW1lKTsKK30KK3B1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKKwlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7CisJc3VpdGUuc2V0TmFtZSgiUmVndWxhciBSZW1vdmUgVGVzdHMiKTsKKwkKKwlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdFJlbW92ZS5jbGFzcykpOworCQorCXJldHVybiBzdWl0ZTsKK30KK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3JlZ3VsYXJSZW1vdmUvVGVzdFJlbW92ZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcmVndWxhclJlbW92ZS9UZXN0UmVtb3ZlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhlNzVlNAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3JlZ3VsYXJSZW1vdmUvVGVzdFJlbW92ZS5qYXZhCkBAIC0wLDAgKzEsOTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMucmVndWxhclJlbW92ZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uSUNvbmZpZ3VyZWRTaXRlQ2hhbmdlZExpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZU1hbmFnZXJUZXN0Q2FzZTsKKworcHVibGljIGNsYXNzIFRlc3RSZW1vdmUgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2UgeworCisJcHVibGljIGNsYXNzIExpc3RlbmVyIGltcGxlbWVudHMgSUNvbmZpZ3VyZWRTaXRlQ2hhbmdlZExpc3RlbmVyIHsKKworCQlwdWJsaWMgYm9vbGVhbiBub3RpZmllZCA9IGZhbHNlOworCisJCXB1YmxpYyB2b2lkIGZlYXR1cmVJbnN0YWxsZWQoSUZlYXR1cmUgZmVhdHVyZSkgeworCQkJbm90aWZpZWQgPSB0cnVlOworCQkJU3lzdGVtLm91dC5wcmludGxuKCJOb3RpZmllZCBEZWZhdWx0RmVhdHVyZSBJbnN0YWxsZWQiKTsKKwkJfQorCisJCXB1YmxpYyB2b2lkIGZlYXR1cmVSZW1vdmVkKElGZWF0dXJlIGZlYXR1cmUpIHsKKwkJfQorCQlwdWJsaWMgdm9pZCBmZWF0dXJlQ29uZmlndXJlZChJRmVhdHVyZSBmZWF0dXJlKSB7CisJCX0KKwkJcHVibGljIHZvaWQgZmVhdHVyZVVuY29uZmlndXJlZChJRmVhdHVyZSBmZWF0dXJlKSB7CisJCX0KKworCQlwdWJsaWMgYm9vbGVhbiBpc05vdGlmaWVkKCkgeworCQkJcmV0dXJuIG5vdGlmaWVkOworCQl9CisJfQorCisJLyoqCisJICogQ29uc3RydWN0b3IgZm9yIFRlc3QxCisJICovCisJcHVibGljIFRlc3RSZW1vdmUoU3RyaW5nIGFyZzApIHsKKwkJc3VwZXIoYXJnMCk7CisJfQorCisJcHJpdmF0ZSBJRmVhdHVyZSBnZXRGZWF0dXJlMShJU2l0ZSBzaXRlKQorCQl0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKKwkJLy9VUkwgdXJsID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTChzaXRlLmdldFVSTCgpLCAiZmVhdHVyZXMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTFfMS4wLjQuamFyIiwgbnVsbCk7CisJCVNpdGVGZWF0dXJlUmVmZXJlbmNlIHJlZiA9IG5ldyBTaXRlRmVhdHVyZVJlZmVyZW5jZSgpOworCQlyZWYuc2V0U2l0ZShzaXRlKTsKKwkJcmVmLnNldFVSTFN0cmluZygiZmVhdHVyZXMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTFfMS4wLjQuamFyIik7CisJCXJlZi5zZXRUeXBlKElTaXRlLkRFRkFVTFRfUEFDS0FHRURfRkVBVFVSRV9UWVBFKTsKKwkJcmVmLnJlc29sdmUoc2l0ZS5nZXRVUkwoKSwgbnVsbCk7CisJCXJldHVybiByZWYuZ2V0RmVhdHVyZShudWxsKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRmVhdHVyZSgpIHRocm93cyBFeGNlcHRpb24geworCisJCS8vIGluc3RhbGwgZmVhdHVyZQorCQlJU2l0ZSByZW1vdGVTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShTT1VSQ0VfRklMRV9TSVRFLG51bGwpOworCQlJRmVhdHVyZSByZW1vdGVGZWF0dXJlID0gZ2V0RmVhdHVyZTEocmVtb3RlU2l0ZSk7CisJCUlTaXRlIGxvY2FsU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoVEFSR0VUX0ZJTEVfU0lURSxudWxsKTsKKwkJSUZlYXR1cmVSZWZlcmVuY2UgcmVmID0gbG9jYWxTaXRlLmluc3RhbGwocmVtb3RlRmVhdHVyZSwgbnVsbCwgbnVsbCk7CisKKwkJLy8gdGhlbiByZW1vdmUgaXQKKwkJYXNzZXJ0Tm90TnVsbCgiRmVhdHVyZSBpcyBudWxsIixyZWYuZ2V0RmVhdHVyZShudWxsKSk7CisJCVN0cmluZyBmZWF0dXJlUmVmID0gcmVmLmdldEZlYXR1cmUobnVsbCkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCk7CisJCWxvY2FsU2l0ZS5yZW1vdmUocmVmLmdldEZlYXR1cmUobnVsbCksIG51bGwpOworCisJCS8vIHZlcmlmeQorCQlTdHJpbmcgc2l0ZSA9IFRBUkdFVF9GSUxFX1NJVEUuZ2V0RmlsZSgpOworCQlJUGx1Z2luRW50cnlbXSBlbnRyaWVzID0gcmVtb3RlRmVhdHVyZS5nZXRQbHVnaW5FbnRyaWVzKCk7CisJCWFzc2VydFRydWUoIm5vIHBsdWdpbnMgZW50cnkiLCAoZW50cmllcyAhPSBudWxsICYmIGVudHJpZXMubGVuZ3RoICE9IDApKTsKKwkJU3RyaW5nIHBsdWdpbk5hbWUgPSBlbnRyaWVzWzBdLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpOworCisJCUZpbGUgcGx1Z2luRmlsZSA9IG5ldyBGaWxlKHNpdGUsIFNpdGUuREVGQVVMVF9QTFVHSU5fUEFUSCArIHBsdWdpbk5hbWUpOworCQlhc3NlcnRUcnVlKCJwbHVnaW4gZmlsZXMgaW5zdGFsbGVkIGxvY2FsbHkiLCAhcGx1Z2luRmlsZS5leGlzdHMoKSk7CisKKwkJRmlsZSBmZWF0dXJlRmlsZSA9CisJCQluZXcgRmlsZShzaXRlLCBTaXRlLkRFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfUEFUSCArIGZlYXR1cmVSZWYpOworCQlhc3NlcnRUcnVlKAorCQkJImZlYXR1cmUgaW5mbyBpbnN0YWxsZWQgbG9jYWxseToiICsgZmVhdHVyZUZpbGUsCisJCQkhZmVhdHVyZUZpbGUuZXhpc3RzKCkpOworCisJfQorCit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9zaXRldmFsaWRhdGlvbi9BbGxTaXRlVmFsaWRhdGlvblRlc3RzLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9zaXRldmFsaWRhdGlvbi9BbGxTaXRlVmFsaWRhdGlvblRlc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJmMzYzNwotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3NpdGV2YWxpZGF0aW9uL0FsbFNpdGVWYWxpZGF0aW9uVGVzdHMuamF2YQpAQCAtMCwwICsxLDMwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnNpdGV2YWxpZGF0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZU1hbmFnZXJUZXN0Q2FzZTsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKKworcHVibGljIGNsYXNzIEFsbFNpdGVWYWxpZGF0aW9uVGVzdHMgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2UgeworCXB1YmxpYyBBbGxTaXRlVmFsaWRhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7CisJCXN1cGVyKG5hbWUpOworCX0KKwlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7CisJCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKKwkJc3VpdGUuc2V0TmFtZSgiU2l0ZSBWYWxpZGF0aW9uIFRlc3RzIik7CisKKwkJLy8gdGhlIGZvbGxvd2luZyB3aWxsIHRha2UgYWxsIHRlaCB0ZXN0IG1ldGhvZHMgaW4gdGVoIGNsYXNzIHRoYXQgc3RhcnQgd2l0aCAndGVzdCcKKworCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdFNpdGVWYWxpZGF0aW9uLmNsYXNzKSk7CisKKwkJcmV0dXJuIHN1aXRlOworCX0KK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3NpdGV2YWxpZGF0aW9uL1Rlc3RTaXRlVmFsaWRhdGlvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvc2l0ZXZhbGlkYXRpb24vVGVzdFNpdGVWYWxpZGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY5ZDViMAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3NpdGV2YWxpZGF0aW9uL1Rlc3RTaXRlVmFsaWRhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTYzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnNpdGV2YWxpZGF0aW9uOworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLm5ldC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IuSVBsYXRmb3JtQ29uZmlndXJhdGlvbi4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLio7CisKK3B1YmxpYyBjbGFzcyBUZXN0U2l0ZVZhbGlkYXRpb24gZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2UgeworCisKKwkvKioKKwkgKiBDb25zdHJ1Y3RvciAKKwkgKi8KKwlwdWJsaWMgVGVzdFNpdGVWYWxpZGF0aW9uKFN0cmluZyBhcmcwKSB7CisJCXN1cGVyKGFyZzApOworCX0KKworCXByaXZhdGUgdm9pZCByZW1vdmVDb25maWdTaXRlKFVSTCB1cmwpIHRocm93cyBFeGNlcHRpb24geworCQkvLyBnZXQgbmV3IGNvbmZpZyBvYmplY3QKKwkJSVBsYXRmb3JtQ29uZmlndXJhdGlvbiBjZmlnID0gQ29uZmlndXJhdG9yVXRpbHMuZ2V0Q3VycmVudFBsYXRmb3JtQ29uZmlndXJhdGlvbigpOworCQlJU2l0ZUVudHJ5IHMxID0gY2ZpZy5maW5kQ29uZmlndXJlZFNpdGUodXJsKTsKKwkJYXNzZXJ0Tm90TnVsbCgiVW5hYmxlIHRvIGZpbmQgc2l0ZSBlbnRyeToiK3VybCxzMSk7CisJCWNmaWcudW5jb25maWd1cmVTaXRlKHMxKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0U2l0ZTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlVUkwgcmVtb3RlVXJsID0gbmV3IFVSTChUQVJHRVRfRklMRV9TSVRFICsgInZhbGlkYXRpb24vc2l0ZTEvZWNsaXBzZSIpOworCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShyZW1vdGVVcmwuZ2V0RmlsZSgpKTsKKwkJSUxvY2FsU2l0ZSBsb2NhbCA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpOworCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY3VycmVudENvbmZpZyA9IGxvY2FsLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCk7CisJCWZpbGUubWtkaXJzKCk7CisJCUlDb25maWd1cmVkU2l0ZSBjb25maWd1cmVkU2l0ZSA9IGN1cnJlbnRDb25maWcuY3JlYXRlQ29uZmlndXJlZFNpdGUoZmlsZSk7CisJCUlTdGF0dXMgc3RhdHVzID0gY29uZmlndXJlZFNpdGUudmVyaWZ5VXBkYXRhYmxlU3RhdHVzKCk7CisKKwkJU3RyaW5nIG1zZyA9ICJUaGUgc2l0ZSAiK2ZpbGUrIiBzaG91bGQgYmUgdXBkYXRhYmxlLiI7CisJCWlmICghc3RhdHVzLmlzT0soKSl7CisJCQlmYWlsKG1zZytzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKKwkJfQorCQljdXJyZW50Q29uZmlnLnJlbW92ZUNvbmZpZ3VyZWRTaXRlKGNvbmZpZ3VyZWRTaXRlKTsKKwkJcmVtb3ZlQ29uZmlnU2l0ZShjb25maWd1cmVkU2l0ZS5nZXRTaXRlKCkuZ2V0VVJMKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0U2l0ZTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlVUkwgcmVtb3RlVXJsID0gbmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFICsgInZhbGlkYXRpb24vc2l0ZTIvZWNsaXBzZS8iKTsKKwkJRmlsZSBmaWxlID0gbmV3IEZpbGUocmVtb3RlVXJsLmdldEZpbGUoKSk7CisJCUlMb2NhbFNpdGUgbG9jYWwgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsKKwkJSUluc3RhbGxDb25maWd1cmF0aW9uIGN1cnJlbnRDb25maWcgPSBsb2NhbC5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpOworCQlJQ29uZmlndXJlZFNpdGUgY29uZmlndXJlZFNpdGU7CisJCXRyeSB7CisJCSBjb25maWd1cmVkU2l0ZSA9IGN1cnJlbnRDb25maWcuY3JlYXRlQ29uZmlndXJlZFNpdGUoZmlsZSk7CisJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSl7CisJCQlyZXR1cm47CisJCX0KKwkJSVN0YXR1cyBzdGF0dXMgPSBjb25maWd1cmVkU2l0ZS52ZXJpZnlVcGRhdGFibGVTdGF0dXMoKTsKKworLy8JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShuZXcgRmlsZShmaWxlLCIuZWNsaXBzZVVNIikpOworCisJCVN0cmluZyBtc2cgPSAiVGhlIHNpdGUgIitmaWxlKyIgc2hvdWxkIG5vdCBiZSB1cGRhdGFibGUuIjsKKwkJaWYgKHN0YXR1cy5pc09LKCkpeworCQkJZmFpbChtc2crc3RhdHVzLmdldE1lc3NhZ2UoKSk7CisJCX0KKwkJaWYgKHN0YXR1cy5nZXRNZXNzYWdlKCkuaW5kZXhPZigiVGhpcyBzaXRlIGlzIGNvbnRhaW5lZCBpbiBhbm90aGVyIHNpdGU6Iik9PS0xKXsKKwkJCWZhaWwoIldyb25nIHZhbGlkYXRpb246IitzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKKwkJfQorCX0JCisKKwlwdWJsaWMgdm9pZCB0ZXN0U2l0ZTMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlVUkwgcmVtb3RlVXJsID0gbmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFICsgInZhbGlkYXRpb24vc2l0ZTMvZWNsaXBzZS8iKTsKKwkJRmlsZSBmaWxlID0gbmV3IEZpbGUocmVtb3RlVXJsLmdldEZpbGUoKSk7CisJCUlMb2NhbFNpdGUgbG9jYWwgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsKKwkJSUluc3RhbGxDb25maWd1cmF0aW9uIGN1cnJlbnRDb25maWcgPSBsb2NhbC5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpOworCQlJQ29uZmlndXJlZFNpdGUgY29uZmlndXJlZFNpdGUgPSBjdXJyZW50Q29uZmlnLmNyZWF0ZUNvbmZpZ3VyZWRTaXRlKGZpbGUpOworCQlJU3RhdHVzIHN0YXR1cyA9IGNvbmZpZ3VyZWRTaXRlLnZlcmlmeVVwZGF0YWJsZVN0YXR1cygpOworCisvLwkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKG5ldyBGaWxlKGZpbGUsIi5lY2xpcHNlVU0iKSk7CisKKwkJU3RyaW5nIG1zZyA9ICJUaGUgc2l0ZSAiK2ZpbGUrIiBzaG91bGQgbm90IGJlIHVwZGF0YWJsZS4iOworCQlpZiAoc3RhdHVzLmlzT0soKSl7CisJCQlmYWlsKG1zZytzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKKwkJfQorLy8JCWlmIChzdGF0dXMuZ2V0TWVzc2FnZSgpLmluZGV4T2YoIlRoaXMgc2l0ZSBpcyBjb250YWluZWQgaW4gYW5vdGhlciBzaXRlOiIpPT0tMSl7CisvLwkJCWZhaWwoIldyb25nIHZhbGlkYXRpb246IitzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKKy8vCQl9CisJfQkKKworCXB1YmxpYyB2b2lkIHRlc3RTaXRlNCgpIHRocm93cyBFeGNlcHRpb24geworCisJCVVSTCByZW1vdGVVcmwgPSBuZXcgVVJMKFNPVVJDRV9GSUxFX1NJVEUgKyAidmFsaWRhdGlvbi9zaXRlNC9lY2xpcHNlLyIpOworCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShyZW1vdGVVcmwuZ2V0RmlsZSgpKTsKKwkJSUxvY2FsU2l0ZSBsb2NhbCA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpOworCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY3VycmVudENvbmZpZyA9IGxvY2FsLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCk7CisJCUlDb25maWd1cmVkU2l0ZSBjb25maWd1cmVkU2l0ZSA9IGN1cnJlbnRDb25maWcuY3JlYXRlQ29uZmlndXJlZFNpdGUoZmlsZSk7CisJCUlTdGF0dXMgc3RhdHVzID0gY29uZmlndXJlZFNpdGUudmVyaWZ5VXBkYXRhYmxlU3RhdHVzKCk7CisKKwkJU3RyaW5nIG1zZyA9ICJUaGUgc2l0ZSAiK2ZpbGUrIiBzaG91bGQgbm90IGJlIHVwZGF0YWJsZS4iOworCQlpZiAoc3RhdHVzLmlzT0soKSl7CisJCQlmYWlsKG1zZytzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKKwkJfQorCQlpZiAoc3RhdHVzLmdldE1lc3NhZ2UoKS5pbmRleE9mKCJUaGUgc2l0ZSBjYW5ub3QgYmUgbW9kaWZpZWQgYnkgdGhpcyBwcm9kdWN0LiBJdCBpcyBhbHJlYWR5IGFzc29jaWF0ZWQgd2l0aCBwcm9kdWN0OiIpPT0tMSl7CisJCQlmYWlsKCJXcm9uZyB2YWxpZGF0aW9uOiIrc3RhdHVzLmdldE1lc3NhZ2UoKSk7CisJCX0KKwl9CQorCisJcHVibGljIHZvaWQgdGVzdFNpdGU1KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJVVJMIHJlbW90ZVVybCA9IG5ldyBVUkwoU09VUkNFX0ZJTEVfU0lURSArICJ2YWxpZGF0aW9uL3NpdGU1LyIpOworCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShyZW1vdGVVcmwuZ2V0RmlsZSgpKTsKKwkJSUxvY2FsU2l0ZSBsb2NhbCA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpOworCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY3VycmVudENvbmZpZyA9IGxvY2FsLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCk7CisJCUlDb25maWd1cmVkU2l0ZSBjb25maWd1cmVkU2l0ZSA9IGN1cnJlbnRDb25maWcuY3JlYXRlQ29uZmlndXJlZFNpdGUoZmlsZSk7CisJCUlTdGF0dXMgc3RhdHVzID0gY29uZmlndXJlZFNpdGUudmVyaWZ5VXBkYXRhYmxlU3RhdHVzKCk7CisKKwkJU3RyaW5nIG1zZyA9ICJUaGUgc2l0ZSAiK2ZpbGUrIiBzaG91bGQgYmUgdXBkYXRhYmxlLiI7CisJCWlmICghc3RhdHVzLmlzT0soKSl7CisJCQlmYWlsKG1zZytzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKKwkJfQorCQkKKwkJCS8vIGdldCBuZXcgY29uZmlnIG9iamVjdAorCQlVUkwgdXJsID0gY29uZmlndXJlZFNpdGUuZ2V0U2l0ZSgpLmdldFVSTCgpOworCQlJUGxhdGZvcm1Db25maWd1cmF0aW9uIGNmaWcgPSBDb25maWd1cmF0b3JVdGlscy5nZXRDdXJyZW50UGxhdGZvcm1Db25maWd1cmF0aW9uKCk7CisJCUlTaXRlRW50cnkgczEgPSBjZmlnLmZpbmRDb25maWd1cmVkU2l0ZSh1cmwpOworCQlhc3NlcnROb3ROdWxsKCJTaXRlIGVudHJ5IG5vdCBmb3VuZDoiK3VybCxzMSk7CisJCWNmaWcudW5jb25maWd1cmVTaXRlKHMxKTsKKwkJY2ZpZy5zYXZlKCk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRlc3RTaXRlNigpIHRocm93cyBFeGNlcHRpb24geworCisJCVVSTCByZW1vdGVVcmwgPSBuZXcgVVJMKFNPVVJDRV9GSUxFX1NJVEUgKyAidmFsaWRhdGlvbi9zaXRlNi9jaGlsZHJlbi9jaGlsZHJlbi9lY2xpcHNlLyIpOworCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShyZW1vdGVVcmwuZ2V0RmlsZSgpKTsKKwkJaWYgKCFmaWxlLmV4aXN0cygpKSBmaWxlLm1rZGlycygpOworCQlJTG9jYWxTaXRlIGxvY2FsID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7CisJCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjdXJyZW50Q29uZmlnID0gbG9jYWwuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKTsKKwkJSUNvbmZpZ3VyZWRTaXRlIGNvbmZpZ3VyZWRTaXRlID0gY3VycmVudENvbmZpZy5jcmVhdGVDb25maWd1cmVkU2l0ZShmaWxlKTsKKwkJSVN0YXR1cyBzdGF0dXMgPSBjb25maWd1cmVkU2l0ZS52ZXJpZnlVcGRhdGFibGVTdGF0dXMoKTsKKworLy8JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShuZXcgRmlsZShmaWxlLCIuZWNsaXBzZVVNIikpOworCisJCVN0cmluZyBtc2cgPSAiVGhlIHNpdGUgIitmaWxlKyIgc2hvdWxkIG5vdCBiZSB1cGRhdGFibGUuIjsKKwkJaWYgKHN0YXR1cy5pc09LKCkpeworCQkJZmFpbChtc2crc3RhdHVzLmdldE1lc3NhZ2UoKSk7CisJCX0KKy8vCQlpZiAoc3RhdHVzLmdldE1lc3NhZ2UoKS5pbmRleE9mKCJUaGlzIHNpdGUgaXMgY29udGFpbmVkIGluIGFub3RoZXIgc2l0ZToiKT09LTEpeworLy8JCQlmYWlsKCJXcm9uZyB2YWxpZGF0aW9uOiIrc3RhdHVzLmdldE1lc3NhZ2UoKSk7CisvLwkJfQorCX0JCit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9zdGFuZGFsb25lL0FsbFN0YW5kYWxvbmVUZXN0cy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvc3RhbmRhbG9uZS9BbGxTdGFuZGFsb25lVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTdjYzJmCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvc3RhbmRhbG9uZS9BbGxTdGFuZGFsb25lVGVzdHMuamF2YQpAQCAtMCwwICsxLDQzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuc3RhbmRhbG9uZTsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlTWFuYWdlclRlc3RDYXNlOworCisKK3B1YmxpYyBjbGFzcyBBbGxTdGFuZGFsb25lVGVzdHMgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2V7CisKKwlwdWJsaWMgQWxsU3RhbmRhbG9uZVRlc3RzKFN0cmluZyBuYW1lKXsKKwkJc3VwZXIobmFtZSk7CisJfQorCQorCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpeworCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7CisJCXN1aXRlLnNldE5hbWUoIlN0YW5kYWxvbmUgVGVzdHMiKTsKKwkJCisJCS8vIHRoZSBmb2xsb3dpbmcgd2lsbCB0YWtlIGFsbCB0aGUgdGVzdCBtZXRob2RzIGluIAorCQkvLyB0aGUgY2xhc3MgdGhhdCBzdGFydCB3aXRoICJ0ZXN0IgorCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdEZlYXR1cmVJbnN0YWxsLmNsYXNzKSk7CisJCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShUZXN0RmVhdHVyZVVwZGF0ZS5jbGFzcykpOworCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdEZlYXR1cmVFbmFibGUuY2xhc3MpKTsKKwkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RGZWF0dXJlRGlzYWJsZS5jbGFzcykpOworCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdEZlYXR1cmVVbmluc3RhbGwuY2xhc3MpKTsKKwkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RCdW5kbGVzSW5zdGFsbC5jbGFzcykpOworCQkvL2FuZCB0aGlzIG9uZSdzIGZvciBmdW4gOikKKy8vCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdFNpdGVTZWFyY2guY2xhc3MpKTsKKwkJCisJCXJldHVybiBzdWl0ZTsKKwl9Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9zdGFuZGFsb25lL1N0YW5kYWxvbmVNYW5hZ2VyVGVzdENhc2UuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3N0YW5kYWxvbmUvU3RhbmRhbG9uZU1hbmFnZXJUZXN0Q2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwYWViZmUKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9zdGFuZGFsb25lL1N0YW5kYWxvbmVNYW5hZ2VyVGVzdENhc2UuamF2YQpAQCAtMCwwICsxLDMyMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnN0YW5kYWxvbmU7CisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS5uZXQuKjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy4qOworCitwdWJsaWMgY2xhc3MgU3RhbmRhbG9uZU1hbmFnZXJUZXN0Q2FzZSBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7CisJcHVibGljIHN0YXRpYyBTdHJpbmdCdWZmZXIgZXJyT3V0cHV0OworCXB1YmxpYyBzdGF0aWMgSW50ZWdlciBleGl0VmFsdWU9IG5ldyBJbnRlZ2VyKC0xKTsKKwlwdWJsaWMgc3RhdGljIFVSTCBUQVJHRVRfRklMRV9TSVRFOworCXByaXZhdGUgYm9vbGVhbiBvbGRDYWNoZSA9IGZhbHNlOworCQorCXN0YXRpYyB7CisJCUZpbGUgdGFyZ2V0RGlyID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmlvLnRtcGRpciIpKTsKKwkJdGFyZ2V0RGlyID0gbmV3IEZpbGUodGFyZ2V0RGlyLCAic3RhbmRhbG9uZSIpOworCQl0YXJnZXREaXIgPSBuZXcgRmlsZSh0YXJnZXREaXIsICJteXRhcmdldCIpOworCQlpZiAodGFyZ2V0RGlyLmV4aXN0cygpKQorCQkJZGVsZXRlRGlyZWN0b3J5KHRhcmdldERpcik7CisJCXRyeSB7CisJCQlUQVJHRVRfRklMRV9TSVRFID0gdGFyZ2V0RGlyLnRvVVJMKCk7CisJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQl9CisJfQorCQorCXB1YmxpYyBTdGFuZGFsb25lTWFuYWdlclRlc3RDYXNlIChTdHJpbmcgYXJnMCl7CisJCXN1cGVyKGFyZzApOworCX0KKwkKKwkvKioKKwkgKiBTZXRzIHVwIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgb3BlbiBhIG5ldHdvcmsgY29ubmVjdGlvbi4KKwkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYmVmb3JlIGEgdGVzdCBpcyBleGVjdXRlZC4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCB1bVNldFVwKCkgeworCQkvLyBzZXR1cCBjYWNoZSBzaXRlIHRvIHRydWUKKwkJb2xkQ2FjaGUgPSBJbnRlcm5hbFNpdGVNYW5hZ2VyLmdsb2JhbFVzZUNhY2hlOworCQlJbnRlcm5hbFNpdGVNYW5hZ2VyLmdsb2JhbFVzZUNhY2hlID0gdHJ1ZTsKKwl9CisJCisJLyoqCisJICogVGVhcnMgZG93biB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIGNsb3NlIGEgbmV0d29yayBjb25uZWN0aW9uLgorCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhZnRlciBhIHRlc3QgaXMgZXhlY3V0ZWQuCisJICovCisJcHJvdGVjdGVkIHZvaWQgdW1UZWFyRG93bigpIHsKKwkJLy8gZG8gbm90aGluZy4KKwkJSW50ZXJuYWxTaXRlTWFuYWdlci5nbG9iYWxVc2VDYWNoZSA9IG9sZENhY2hlOworCX0KKwkKKwlwdWJsaWMgdm9pZCBjaGVja0NvbmZpZ3VyZWRTaXRlcygpeworCQlJTG9jYWxTaXRlIGxvY2FsU2l0ZTsKKwkJU3lzdGVtLm91dC5wcmludGxuKCJ+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Iik7CisJCXRyeSB7CisJCQlsb2NhbFNpdGUgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiTG9jYWxTaXRlOiAiICsgbG9jYWxTaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkuZ2V0TGFiZWwoKSk7CisJCQorCQkvL0dldCBzaXRlIHRvIGluc3RhbGwgdG8KKwkJSUluc3RhbGxDb25maWd1cmF0aW9uIGN1cnJlbnRDb25maWcgPSBsb2NhbFNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKTsKKwkJSUNvbmZpZ3VyZWRTaXRlW10gc2l0ZXMgPSBjdXJyZW50Q29uZmlnLmdldENvbmZpZ3VyZWRTaXRlcygpOworLy8JCisvLwkJCS8vIHN0YXJ0IG9mIGNvbmZpZyBzaXRlIHByaW50CisJCVN5c3RlbS5vdXQucHJpbnRsbigiR0VUVElORyBDT05GSUdVUkVEIFNJVEVTLi4uIik7CisJCWZvciAoaW50IGkgPSAwOyBpPHNpdGVzLmxlbmd0aDsgaSsrKXsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigic2l0ZSAjIiArIGkgKyAiOiAiICsgc2l0ZXNbaV0uZ2V0U2l0ZSgpLmdldFVSTCgpLmdldEZpbGUoKSk7CisJCX0KKwkJU3lzdGVtLm91dC5wcmludGxuKCJ+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Iik7CisJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJU3lzdGVtLmVyci5wcmludGxuKGUpOworCQl9CisJfQorCQorCS8vIGdldCB0aGUgZmlyc3QgY29uZmlndXJlZCBzaXRlIGZvdW5kIGJlY2F1c2UgdGhpcyBpcyB0aGUgb25lIHdlJ3JlIG1vc3QgbGlrZWx5IHRvIAorCS8vIGhhdmUgaW5zdGFsbGVkIGludG8KKwlwdWJsaWMgSVNpdGUgZ2V0Q29uZmlndXJlZFNpdGUoVVJMIHRhcmdldCl7CisJCXRyeSB7CisJCQlJTG9jYWxTaXRlIGxvY2FsID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7CisJCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY3VycmVudENvbmZpZyA9IGxvY2FsLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCk7CisJCQlJQ29uZmlndXJlZFNpdGVbXSBzaXRlcyA9IGN1cnJlbnRDb25maWcuZ2V0Q29uZmlndXJlZFNpdGVzKCk7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlxucmV0cmlldmluZyBjb25maWd1cmVkIHNpdGVzLi4uIik7CisJCQlTdHJpbmcgdGFyZ2V0RmlsZSA9IG5ldyBGaWxlKHRhcmdldC5nZXRGaWxlKCkpLmdldEFic29sdXRlUGF0aCgpOworCQkJZm9yIChpbnQgaSA9IDA7IGk8c2l0ZXMubGVuZ3RoIDsgaSsrKXsKKwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInNpdGVbIitpKyJdOiAiICsgc2l0ZXNbaV0uZ2V0U2l0ZSgpLmdldFVSTCgpKTsKKwkJCQlTdHJpbmcgc2l0ZUZpbGUgPSBuZXcgRmlsZShzaXRlc1tpXS5nZXRTaXRlKCkuZ2V0VVJMKCkuZ2V0RmlsZSgpKS5nZXRBYnNvbHV0ZVBhdGgoKTsKKwkJCQlpZiAodGFyZ2V0RmlsZS5lcXVhbHMoc2l0ZUZpbGUpKQorCQkJCQlyZXR1cm4gc2l0ZXNbaV0uZ2V0U2l0ZSgpOworCQkJfQorCQkJaWYgKHNpdGVzLmxlbmd0aCA9PSAwKQorCQkJCXJldHVybiBudWxsOworCQkJcmV0dXJuIHNpdGVzWzBdLmdldFNpdGUoKTsKKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQlTeXN0ZW0uZXJyLnByaW50bG4oZSk7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCX0KKwkvL1dhdGNoRG9nIHRocmVhZCB0byBraWxsIG1pcnJvcmluZyBwcm9jZXNzIGlmIGl0IGhhbmdzIChvciB0YWtlcyB0b28gbG9uZykKKwlwdWJsaWMgc3RhdGljIGNsYXNzIFRpbWVyIGV4dGVuZHMgVGhyZWFkeworCQlwcml2YXRlIFByb2Nlc3MgcHJvYzsKKwkJCisJCXB1YmxpYyBUaW1lcihQcm9jZXNzIHByb2MpeworCQkJc3VwZXIoKTsKKwkJCXRoaXMuc2V0RGFlbW9uKHRydWUpOworCQkJdGhpcy5wcm9jID0gcHJvYzsKKwkJfQorCQkKKwkJcHVibGljIHZvaWQgcnVuKCl7CisJCQl0cnkgeworCQkJCS8vIHNsZWVwIHRpbWUgNW1pbgorCQkJCXNsZWVwKDMwMDAwMCk7IAorCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZGVzdHJveWluZyBwcm9jZXNzIik7CisJCQkJcHJvYy5kZXN0cm95KCk7CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCVN5c3RlbS5lcnIucHJpbnRsbihlKTsKKwkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJfQorCQl9CisJfQorCQorCS8vIFN0cmVhbUNvbnN1bWVyIHRvIGRpc3BsYXkgb3V0cHV0IHRvIG91dHB1dCBmaWxlcyBvciBjb25zb2xlCisJcHVibGljIHN0YXRpYyBjbGFzcyBTdHJlYW1Db25zdW1lciBleHRlbmRzIFRocmVhZCB7CisJCXByaXZhdGUgQnVmZmVyZWRSZWFkZXIgYlJlYWRlcjsKKworCQlwdWJsaWMgU3RyZWFtQ29uc3VtZXIoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHsKKwkJCXN1cGVyKCk7CisJCQlzZXREYWVtb24odHJ1ZSk7CisJCQliUmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbnB1dFN0cmVhbSkpOworCQkJZXJyT3V0cHV0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQl9CisKKwkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJdHJ5IHsKKwkJCQlTdHJpbmcgbGluZTsKKwkJCQl3aGlsZSAobnVsbCAhPSAobGluZSA9IGJSZWFkZXIucmVhZExpbmUoKSkpIHsKKwkJCQkJU3lzdGVtLmVyci5wcmludGxuKGxpbmUpOworCQkJCQllcnJPdXRwdXQuYXBwZW5kKGxpbmUpOworCQkJCQllcnJPdXRwdXQuYXBwZW5kKCJcbiIpOworCQkJCX0KKwkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQlTeXN0ZW0uZXJyLnByaW50bG4oZSk7CisJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCX0KKwkJfQorCX0KKwkKKwkvKioKKwkgKiBAcGFyYW0gY29tbWFuZCA6IGNvbW1hbmQgYXJndW1lbnQgdG8gcnVuIG9uIHNpdGUvZmVhdHVyZSAKKwkgKiAoaS5lLiAnaW5zdGFsbCcsICdlbmFibGUnLCAnZGlzYWJsZScsICd1cGRhdGUnKSAqPGk+cmVxdWlyZWQ8L2k+KgorCSAqIEBwYXJhbSBmaWQgOiBmZWF0dXJlIGlkIG9mIHRoZSBmZWF0dXJlIGJlaW5nIGluc3RhbGxlZCwgZW5hYmxlZCwgZXRjLgorCSAqIChvcHRpb25hbCAtIGNhbiBiZSBudWxsKQorCSAqIEBwYXJhbSB2ZXIgOiB2ZXJzaW9uIG9mIGZlYXR1cmUgYmVpbmcgaW5zdGFsbGVkLCBlbmFibGVkLCBldGMuIChvcHRpb25hbCAtIGNhbiBiZSBudWxsKQorCSAqIEBwYXJhbSBjb25maWcgOiBsb2NhdGlvbiBvZiBjb25maWd1cmF0aW9uIGluZm8gKGkuZS4gZmlsZTpEOlx0ZW1wXC5jb25maWdcKQorCSAqIEBwYXJhbSByZW1vdGVMb2MgOiByZW1vdGUgc2l0ZSB1cmwgKHJlcXVpcmVkIGZvciBpbnN0YWxsaW5nL3NlYXJjaGluZyBmcm9tIHJlbW90ZSBzaXRlKQorCSAqIEBwYXJhbSBsb2NhbExvYyA6IHRhcmdldCBzaXRlIGRpcmVjdG9yeSAocmVxdWlyZWQgdW5sZXNzIHVwZGF0aW5nL3NlYXJjaGluZykKKwkgKiBAcmV0dXJuIGEgc3RyaW5nIGFycmF5IGNvbnNpc3Rpbmcgb2YgY29tbWFuZHMgYW5kIHRoZWlyIGFyZ3VtZW50cyB0bworCSAqIGJlIHJ1bgorCSAqLworCXB1YmxpYyBTdHJpbmdbXSBnZXRDb21tYW5kKAorCQlTdHJpbmcgY29tbWFuZCwKKwkJU3RyaW5nIGZpZCwKKwkJU3RyaW5nIHZlciwKKwkJU3RyaW5nIGNvbmZpZywKKwkJU3RyaW5nIHJlbW90ZUxvYywKKwkJU3RyaW5nIGxvY2FsTG9jKXsKKwkJZmluYWwgU3RyaW5nIGNsYXNzcGF0aCA9ICJzdGFydHVwLmphciI7CisJCWZpbmFsIFN0cmluZyBsYXVuY2hlciA9ICJvcmcuZWNsaXBzZS5jb3JlLmxhdW5jaGVyLk1haW4iOworCQlmaW5hbCBTdHJpbmcgYXBwbGljYXRpb24gPSAib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuc3RhbmRhbG9uZVVwZGF0ZSI7CisJCWZpbmFsIFN0cmluZyBGTEFHX0NQID0gIi1jcCI7CisJCWZpbmFsIFN0cmluZyBGTEFHX0FQUCA9ICItYXBwbGljYXRpb24iOworCQlmaW5hbCBTdHJpbmcgRkxBR19DTUQgPSAiLWNvbW1hbmQiOworCQlmaW5hbCBTdHJpbmcgRkxBR19GSUQgPSAiLWZlYXR1cmVJZCI7CisJCWZpbmFsIFN0cmluZyBGTEFHX0RBVEEgPSAiLWRhdGEiOworCQlmaW5hbCBTdHJpbmcgRkxBR19WRVJTSU9OID0gIi12ZXJzaW9uIjsKKwkJZmluYWwgU3RyaW5nIEZMQUdfRlJPTSA9ICItZnJvbSI7CisJCWZpbmFsIFN0cmluZyBGTEFHX1RPID0gIi10byI7CisJCWZpbmFsIFN0cmluZyBGTEFHX0NPTkZJRyA9ICItY29uZmlndXJhdGlvbiI7CisvLwkJZmluYWwgU3RyaW5nIEZMQUdfVVJMID0gIi1taXJyb3JVUkwiOworCQlmaW5hbCBTdHJpbmcgRkxBR19TUExBU0ggPSAiLW5vc3BsYXNoIjsKKwkJZmluYWwgU3RyaW5nIEZMQUdfQ09OU09MRUxPRyA9ICItY29uc29sZWxvZyI7CisJCWZpbmFsIFN0cmluZyBkYXRhID0KKwkJCVVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0U3RhdGVMb2NhdGlvbigpLnRvT1NTdHJpbmcoKTsKKwkJU3RyaW5nW10gY21kID0KKwkJCW5ldyBTdHJpbmdbXSB7CisJCQkJZ2V0SmF2YVZNUGF0aCgpLAorCQkJCUZMQUdfQ1AsCisJCQkJY2xhc3NwYXRoLAorCQkJCWxhdW5jaGVyLAorCQkJCUZMQUdfQVBQLAorCQkJCWFwcGxpY2F0aW9uLAorCQkJCUZMQUdfQ01ELAorCQkJCWNvbW1hbmQsCisJCQkJKHJlbW90ZUxvYyAhPW51bGwgPyBGTEFHX0ZST00gOiAiIiksCisJCQkJKHJlbW90ZUxvYyAhPW51bGwgPyByZW1vdGVMb2MgOiAiIiksCisJCQkJKGxvY2FsTG9jICE9bnVsbCA/IEZMQUdfVE8gOiAiIiksCisJCQkJKGxvY2FsTG9jICE9bnVsbCA/bG9jYWxMb2MucmVwbGFjZUZpcnN0KCJmaWxlOiIsICIiKSA6ICIiKSwKKwkJCQkoZmlkICE9IG51bGwgPyBGTEFHX0ZJRCA6ICIiKSwKKwkJCQkoZmlkICE9IG51bGwgPyBmaWQgOiAiIiksCisJCQkJKHZlciAhPSBudWxsID8gRkxBR19WRVJTSU9OIDogIiIpLAorCQkJCSh2ZXIgIT0gbnVsbCA/IHZlciA6ICIiKSwKKwkJCQkoY29uZmlnICE9IG51bGwgPyBGTEFHX0NPTkZJRyA6ICIiKSwKKwkJCQkoY29uZmlnICE9IG51bGwgPyBjb25maWcgOiAiIiksCisJCQkJRkxBR19TUExBU0gsCisJCQkJRkxBR19EQVRBLAorCQkJCWRhdGEsCisJCQkJRkxBR19DT05TT0xFTE9HfTsKKwkJZm9yIChpbnQgaSA9IDAgO2k8Y21kLmxlbmd0aDsgaSsrKXsKKwkJCVN5c3RlbS5vdXQucHJpbnQoY21kW2ldICsgIiAiKTsJCQkKKwkJfVN5c3RlbS5vdXQucHJpbnRsbigpOworCQlyZXR1cm4gY21kOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldEphdmFWTVBhdGgoKSB7CisJCS8vIENyZWF0ZSBjb21tYW5kIHN0cmluZyBmb3IgbGF1bmNoaW5nIHRoZSBwcm9jZXNzCisJCVN0cmluZyB2bSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS52bS5uYW1lIik7CisJCVN0cmluZyBleGVjdXRhYmxlID0gIko5Ii5lcXVhbHModm0pID8gImo5IiA6ICJqYXZhIjsKKwkJaWYgKG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5lbnZpcm9ubWVudC5Db25zdGFudHMuT1NfV0lOMzIuZXF1YWxzKFBsYXRmb3JtLmdldE9TKCkpKQorCQkJZXhlY3V0YWJsZSArPSAidy5leGUiOworCisJCVN0cmluZyBqYXZhSW5zdGFsbERpciA9CisJCQlTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaG9tZSIpICsgRmlsZS5zZXBhcmF0b3IgKyAiYmluIjsKKwkJcmV0dXJuIGphdmFJbnN0YWxsRGlyICsgRmlsZS5zZXBhcmF0b3IgKyBleGVjdXRhYmxlOworCX0KKwkKKwlwdWJsaWMgaW50IHBlcmZvcm1BY3Rpb24oU3RyaW5nW10gY21kKSB7CisJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGdldEVjbGlwc2VSb290KCkpOworCQl0cnkgeworCisJCQlQcm9jZXNzIHByb2MgPQorCQkJCVJ1bnRpbWUuZ2V0UnVudGltZSgpLmV4ZWMoY21kLCAoU3RyaW5nW10pIG51bGwsIGZpbGUpOworCisJCQlTdHJlYW1Db25zdW1lciBvdXRwdXRzID0gbmV3IFN0cmVhbUNvbnN1bWVyKHByb2MuZ2V0SW5wdXRTdHJlYW0oKSk7CisJCQlvdXRwdXRzLnN0YXJ0KCk7CisJCQlTdHJlYW1Db25zdW1lciBlcnJvcnMgPSBuZXcgU3RyZWFtQ29uc3VtZXIocHJvYy5nZXRFcnJvclN0cmVhbSgpKTsKKwkJCWVycm9ycy5zdGFydCgpOworCQkJVGltZXIgdGltZXIgPSBuZXcgVGltZXIocHJvYyk7CisJCQl0aW1lci5zdGFydCgpOworCisJCQlyZXR1cm4gcHJvYy53YWl0Rm9yKCk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCVN5c3RlbS5lcnIucHJpbnRsbihlKTsKKwkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworCQkJU3lzdGVtLmVyci5wcmludGxuKGUpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJU3lzdGVtLmVyci5wcmludGxuKGUpOworCQl9CisJCXJldHVybiAtMTsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRFY2xpcHNlUm9vdCgpIHsKKwkJcmV0dXJuIENvbmZpZ3VyYXRvclV0aWxzLmdldEluc3RhbGxVUkwoKS50b0V4dGVybmFsRm9ybSgpLnJlcGxhY2VGaXJzdCgKKwkJCSJmaWxlOiIsCisJCQkiIik7CisJfQorCQorCXB1YmxpYyBBcnJheUxpc3QgZ2V0QXJyYXlMaXN0KFN0cmluZ1tdIGxpc3QpeworCQlBcnJheUxpc3QgdGVtcCA9IG5ldyBBcnJheUxpc3QoKTsKKwkJZm9yKGludCBpID0gMDsgaTwgbGlzdC5sZW5ndGg7IGkrKyl7CisJCQl0ZW1wLmFkZChsaXN0W2ldKTsKKwkJfQorCQlyZXR1cm4gdGVtcDsKKwl9CisJCisJcHVibGljIEZpbGUgZ2V0TGF0ZXN0Q29uZmlndXJhdGlvbkZpbGUoRmlsZSBsb2NhbEZpbGUpIHsKKworCQl0cnkgeworCQkJU3lzdGVtLm91dC5wcmludGxuKCJyZWFkaW5nIGZyb20gOiAiICsgbG9jYWxGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKKwkJCQlGaWxlUmVhZGVyIGZyZWFkZXIgPSBuZXcgRmlsZVJlYWRlcihsb2NhbEZpbGUpOworCQkJCUJ1ZmZlcmVkUmVhZGVyIGJyZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoZnJlYWRlcik7CisJCQkJd2hpbGUgKGJyZWFkZXIucmVhZHkoKSkgeworCQkJCQlicmVhZGVyLnJlYWRMaW5lKCk7CisvLwkJCQkJU3lzdGVtLm91dC5wcmludGxuKGxpbmUpOworCQkJCX0KKwkJCQkvLyByZWFkIGNvbmZpZyBmaWxlCisJCQkJRmlsZSBwYXJlbnQgPSBuZXcgRmlsZShsb2NhbEZpbGUuZ2V0UGFyZW50KCkpOworCQkJCVN5c3RlbS5vdXQucHJpbnRsbigicGFyZW50OiAiICsgcGFyZW50LmdldEFic29sdXRlUGF0aCgpKTsKKwkJCQlTdHJpbmdbXSBwYXJMaXN0ID0gcGFyZW50Lmxpc3QoKTsKKwkJCQlpbnQgbGF0ZXN0ID0gMDsgCisJCQkJZm9yIChpbnQgaSA9IHBhckxpc3QubGVuZ3RoLTE7IGk+PTA7IGktLSl7CisJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigicGFyTGlzdFsiICsgaSArICJdOiAiICsgcGFyTGlzdFtpXSk7CisJCQkJCWlmIChwYXJMaXN0W2ldLnN0YXJ0c1dpdGgoInBsYXRmb3JtIikpeworCQkJCQkJbGF0ZXN0ID0gaTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJCUZpbGUgY29uZmlnRmlsZSA9IG5ldyBGaWxlKHBhcmVudC5nZXRBYnNvbHV0ZVBhdGgoKSArIEZpbGUuc2VwYXJhdG9yICsgcGFyTGlzdFtsYXRlc3RdKTsKKwkJCQlyZXR1cm4gY29uZmlnRmlsZTsKKwkJCQkvLyBlbmQgb2YgY29uZmlnIGZpbGUgcmVhZAorCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJU3lzdGVtLmVyci5wcmludGxuKGUpOworCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJfQorCQlyZXR1cm4gbG9jYWxGaWxlOworCX0KKwkKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGRlbGV0ZURpcmVjdG9yeShGaWxlIGRpcikgeworCQlGaWxlW10gbGlzdCA9IGRpci5saXN0RmlsZXMoKTsKKwkJaWYgKGxpc3QgPT0gbnVsbCkKKwkJCXJldHVybjsKKwkJCQorCQlmb3IgKGludCBpPTA7IGk8bGlzdC5sZW5ndGg7IGkrKykgeworCQkJaWYgKGxpc3RbaV0uaXNEaXJlY3RvcnkoKSkgCisJCQkJZGVsZXRlRGlyZWN0b3J5KGxpc3RbaV0pOworCQkJaWYgKCFsaXN0W2ldLmRlbGV0ZSgpKQorCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVW5hYmxlIHRvIGRlbGV0ZSAiK2xpc3RbaV0udG9TdHJpbmcoKSk7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9zdGFuZGFsb25lL1Rlc3RCdW5kbGVzSW5zdGFsbC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvc3RhbmRhbG9uZS9UZXN0QnVuZGxlc0luc3RhbGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDI5NmNjCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvc3RhbmRhbG9uZS9UZXN0QnVuZGxlc0luc3RhbGwuamF2YQpAQCAtMCwwICsxLDEyNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnN0YW5kYWxvbmU7CisKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnN0YW5kYWxvbmUuKjsKKworCitwdWJsaWMgY2xhc3MgVGVzdEJ1bmRsZXNJbnN0YWxsIGV4dGVuZHMgU3RhbmRhbG9uZU1hbmFnZXJUZXN0Q2FzZSB7CisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luc3RhbGxlZDsKKworCXB1YmxpYyBUZXN0QnVuZGxlc0luc3RhbGwoU3RyaW5nIGFyZzApIHsKKwkJc3VwZXIoYXJnMCk7CisJCWlzSW5zdGFsbGVkID0gZmFsc2U7CisJfQorCisJcHVibGljIHZvaWQgdW1TZXRVcCgpIHsKKwkJc3VwZXIudW1TZXRVcCgpOworCQkvL1N5c3RlbS5vdXQucHJpbnRsbigibG9va2luZyBhdCBjb25maWd1cmVkIHNpdGVzIGF2YWlsYWJsZS4uLi4iKTsKKwkJLy9jaGVja0NvbmZpZ3VyZWRTaXRlcygpOworCQkKKwkJU3RyaW5nIGZlYXR1cmVJZCA9ICJjb20uZXhhbXBsZS5idW5kbGUuZmVhdHVyZSI7CisJCVN0cmluZyB2ZXJzaW9uID0gIjEuMC4wIjsKKworCQlTdHJpbmcgZnJvbVJlbW90ZVNpdGVVcmwgPSAiaHR0cDovLyIrZ2V0SHR0cEhvc3QoKSsiOiIrIGdldEh0dHBQb3J0KCkrICIvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUudXBkYXRldGVzdHMvYnVuZGxlU2l0ZS8iOworCQlpZiAoIWlzSW5zdGFsbGVkKSB7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oCisJCQkJIj09PT09PT09PT09PT09IiArIHRoaXMuZ2V0Q2xhc3MoKSArICI9PT09PT09PT09PT09Iik7CisJCQlTdGFuZGFsb25lVXBkYXRlQXBwbGljYXRpb24gYXBwID0gbmV3IFN0YW5kYWxvbmVVcGRhdGVBcHBsaWNhdGlvbigpOworCQkJdHJ5IHsKKwkJCQlleGl0VmFsdWUgPSAoSW50ZWdlcilhcHAucnVuKGdldENvbW1hbmQoCisJCQkJCSJpbnN0YWxsIiwKKwkJCQkJZmVhdHVyZUlkLAorCQkJCQl2ZXJzaW9uLAorCQkJCQludWxsLAorCQkJCQlmcm9tUmVtb3RlU2l0ZVVybCwKKwkJCQkJVEFSR0VUX0ZJTEVfU0lURS5nZXRGaWxlKCkpKTsKKwkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCX0KKwkJCWlzSW5zdGFsbGVkID0gdHJ1ZTsKKwkJfQorCQkKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0UGx1Z2luc0V4aXN0KCkgeworCQlJU2l0ZSBsb2NhbFNpdGUgPSBnZXRDb25maWd1cmVkU2l0ZShUQVJHRVRfRklMRV9TSVRFKTsKKwkJCisJCVN5c3RlbS5vdXQucHJpbnRsbigibG9jYWxTaXRlOiAiICsgbG9jYWxTaXRlLmdldFVSTCgpLmdldEZpbGUoKSk7CisJCUlQbHVnaW5FbnRyeVtdIHBsdWdpbkVudHJpZXMgPSBsb2NhbFNpdGUuZ2V0UGx1Z2luRW50cmllcygpOworCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKwkJaWYgKHBsdWdpbkVudHJpZXMgPT0gbnVsbCB8fCBwbHVnaW5FbnRyaWVzLmxlbmd0aCA9PSAwKXsKKwkJCVN5c3RlbS5lcnIucHJpbnRsbigiTm8gcGx1Z2luIGVudHJpZXMgb24gdGhlIHRhcmdldCBzaXRlIik7CisJCQlmYWlsKCJObyBwbHVnaW4gZW50cmllcyBvbiB0aGUgdGFyZ2V0IHNpdGUiKTsKKwkJfSBlbHNleworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwbHVnaW5FbnRyaWVzLmxlbmd0aDsgaSsrKXsKKwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImZvdW5kIHBsdWdpbjogIiArIHBsdWdpbkVudHJpZXNbaV0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpOworCQkJCWxpc3QuYWRkKHBsdWdpbkVudHJpZXNbaV0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpOworCQkJfQorCQl9CisKKwkJU3RyaW5nW10gcGx1Z2luTmFtZXMgPQorCQkJewkiY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbl8xLjAuMCIsCisJCQkJImNvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4udWlfMi4wLjAiLAorCQkJCSJjb20uZXhhbXBsZS5idW5kbGUuZnJhZ21lbnRfMS4wLjAiLAorCQkJCSJjb20uZXhhbXBsZS5idWRsZS5mcmFnbWVudC51aV8xLjAuMCJ9OworCQlhc3NlcnRUcnVlKGNoZWNrRmlsZXNJbkxpc3QocGx1Z2luTmFtZXMsIGxpc3QpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0RmVhdHVyZXNFeGlzdCgpIHsKKwkJdHJ5IHsKKwkJCUlTaXRlIGxvY2FsU2l0ZSA9ICBnZXRDb25maWd1cmVkU2l0ZShUQVJHRVRfRklMRV9TSVRFKTsKKworCQkJU3lzdGVtLm91dC5wcmludGxuKCJsb2NhbFNpdGU6ICIgKyBsb2NhbFNpdGUuZ2V0VVJMKCkuZ2V0RmlsZSgpKTsKKwkJCS8vIGdldCBmZWF0dXJlIHJlZmVyZW5jZXMgCisJCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGxvY2FsRmVhdHVyZXMgPQorCQkJCWxvY2FsU2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpOworCQkJU3lzdGVtLm91dC5wcmludGxuKCJsb2NhbCBjdXJyZW50Q09uZmlnU2l0ZTogIiArIGxvY2FsU2l0ZS5nZXRDdXJyZW50Q29uZmlndXJlZFNpdGUoKSk7CisJCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKwkJCWlmIChsb2NhbEZlYXR1cmVzID09IG51bGwgfHwgbG9jYWxGZWF0dXJlcy5sZW5ndGggPT0gMCl7CisJCQkJU3lzdGVtLmVyci5wcmludGxuKCJObyBmZWF0dXJlcyBvbiB0aGUgdGFyZ2V0IHNpdGUiKTsKKwkJCQlmYWlsKCJObyBmZWF0dXJlcyBvbiB0aGUgdGFyZ2V0IHNpdGUiKTsKKwkJCX0gZWxzZSB7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NhbEZlYXR1cmVzLmxlbmd0aDsgaSsrKQorCQkJCQlsaXN0LmFkZChsb2NhbEZlYXR1cmVzW2ldLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKTsKKwkJCX0KKwkJCVN0cmluZ1tdIGZlYXR1cmVOYW1lcyA9CisJCQkJeworCQkJCQkiY29tLmV4YW1wbGUuYnVuZGxlLmZlYXR1cmVfMS4wLjAifTsKKwkJCWFzc2VydFRydWUoY2hlY2tGaWxlc0luTGlzdChmZWF0dXJlTmFtZXMsIGxpc3QpKTsKKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQlTeXN0ZW0uZXJyLnByaW50bG4oZSk7CisJCX0KKwl9CisKKwkvLyBtYWtlcyBzdXJlIGFsbCBmaWxlcy9kaXJlY3RvcmllcyBpbiAibmFtZXMiIGFyZSBpbiB0aGUgZGlyZWN0b3J5IGxpc3RpbmcgImxpc3QiCisJcHVibGljIGJvb2xlYW4gY2hlY2tGaWxlc0luTGlzdCgKKwkJU3RyaW5nW10gbmFtZXMsCisJCUFycmF5TGlzdCBsaXN0KSB7CisJCQorCQlmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4obmFtZXNbaV0pOworCQkJaWYgKCFsaXN0LmNvbnRhaW5zKG5hbWVzW2ldKSl7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQl9CisJCXJldHVybiB0cnVlOworCX0KKworCS8vIGVuc3VyZSBleGl0IHdpdGhvdXQgcHJvYmxlbXMKKwlwdWJsaWMgdm9pZCB0ZXN0RXhpdFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN5c3RlbS5vdXQucHJpbnRsbigiZXhpdFZhbHVlOiAiICsgZXhpdFZhbHVlKTsKKwkJYXNzZXJ0RXF1YWxzKGV4aXRWYWx1ZSwgSVBsYXRmb3JtUnVubmFibGUuRVhJVF9PSyk7CisJfQorfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvc3RhbmRhbG9uZS9UZXN0RmVhdHVyZURpc2FibGUuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3N0YW5kYWxvbmUvVGVzdEZlYXR1cmVEaXNhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYzMjc1MwotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3N0YW5kYWxvbmUvVGVzdEZlYXR1cmVEaXNhYmxlLmphdmEKQEAgLTAsMCArMSwxMDMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5zdGFuZGFsb25lOworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEudXRpbC4qOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQbGF0Zm9ybVJ1bm5hYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuc3RhbmRhbG9uZS4qOworCitwdWJsaWMgY2xhc3MgVGVzdEZlYXR1cmVEaXNhYmxlIGV4dGVuZHMgU3RhbmRhbG9uZU1hbmFnZXJUZXN0Q2FzZSB7CisJcHVibGljIHN0YXRpYyBib29sZWFuIGlzRGlzYWJsZWQ7CisJCisJcHVibGljIFRlc3RGZWF0dXJlRGlzYWJsZShTdHJpbmcgYXJnMCkgeworCQlzdXBlcihhcmcwKTsKKwkJaXNEaXNhYmxlZCA9IGZhbHNlOworCX0KKworCXB1YmxpYyB2b2lkIHVtU2V0VXAoKSB7CisJCXN1cGVyLnVtU2V0VXAoKTsKKwkJCisJCVN0cmluZyBmZWF0dXJlSWQgPSAibXkuYWxwaGFiZXQiOworCQlTdHJpbmcgdmVyc2lvbiA9ICIxLjAuMCI7CisKKwkJY2hlY2tDb25maWd1cmVkU2l0ZXMoKTsKKwkJaWYgKCFpc0Rpc2FibGVkKSB7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oCisJCQkJIj09PT09PT09PT09PT09IiArIHRoaXMuZ2V0Q2xhc3MoKSArICI9PT09PT09PT09PT09Iik7CisJCQlTdGFuZGFsb25lVXBkYXRlQXBwbGljYXRpb24gYXBwID0gbmV3IFN0YW5kYWxvbmVVcGRhdGVBcHBsaWNhdGlvbigpOworCQkJdHJ5IHsKKwkJCQlleGl0VmFsdWUgPSAoSW50ZWdlcilhcHAucnVuKGdldENvbW1hbmQoCisJCQkJCSJkaXNhYmxlIiwKKwkJCQkJZmVhdHVyZUlkLAorCQkJCQl2ZXJzaW9uLAorCQkJCQludWxsLAorCQkJCQludWxsLAorCQkJCQlUQVJHRVRfRklMRV9TSVRFLmdldEZpbGUoKSkpOworCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJfQorCQkJaXNEaXNhYmxlZCA9IHRydWU7CisJCQljaGVja0NvbmZpZ3VyZWRTaXRlcygpOworCQl9CisJfQorCQorCS8vIGVuc3VyZSBleGl0IHdpdGhvdXQgcHJvYmxlbXMKKwlwdWJsaWMgdm9pZCB0ZXN0RXhpdFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN5c3RlbS5vdXQucHJpbnRsbigiZXhpdFZhbHVlOiAiICsgZXhpdFZhbHVlKTsKKwkJYXNzZXJ0RXF1YWxzKGV4aXRWYWx1ZSwgSVBsYXRmb3JtUnVubmFibGUuRVhJVF9PSyk7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEZlYXR1cmVTdGF0dXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJRmlsZSBsb2NhbEZpbGUgPSBuZXcgRmlsZSgoKExvY2FsU2l0ZSlTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKSkuZ2V0TG9jYXRpb25VUkwoKS5nZXRGaWxlKCkpOworCQlTeXN0ZW0ub3V0LnByaW50bG4obG9jYWxGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKKwkJYXNzZXJ0VHJ1ZShsb2NhbEZpbGUuZXhpc3RzKCkpOworCQlGaWxlIGNvbmZpZ0ZpbGUgPSBnZXRMYXRlc3RDb25maWd1cmF0aW9uRmlsZShsb2NhbEZpbGUpOworCQorCQlTdHJpbmdbXSBuYW1lcyA9CisJCQl7CisJCQkJImZlYXR1cmVzL215LmFscGhhYmV0LnJvdW5kLmxldHRlcnNfMS4wLjAvIiwKKwkJCQkiZmVhdHVyZXMvbXkuYWxwaGFiZXQuc3RyYWlnaHQubGV0dGVyc18xLjAuMC8iLAorCQkJCSJmZWF0dXJlcy9teS5hbHBoYWJldF8xLjAuMC8iIH07CisJCWFzc2VydFRydWUoY29uZmlnRmlsZS5leGlzdHMoKSk7CisJCWFzc2VydFRydWUoY2hlY2tGZWF0dXJlc0Rpc2FibGVkKGdldEFycmF5TGlzdChuYW1lcyksY29uZmlnRmlsZSwgVEFSR0VUX0ZJTEVfU0lURS5nZXRGaWxlKCkpKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBjaGVja0ZlYXR1cmVzRGlzYWJsZWQoQXJyYXlMaXN0IGZlYXR1cmVOYW1lcywgRmlsZSBjb25maWdGaWxlLCBTdHJpbmcgc2l0ZUxvY2F0aW9uKXsKKwkJdHJ5IHsKKwkJCUZpbGVSZWFkZXIgZnJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKGNvbmZpZ0ZpbGUpOworCQkJQnVmZmVyZWRSZWFkZXIgYnJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihmcmVhZGVyKTsKKwkJCVN0cmluZyBsaW5lOworCQkJU3lzdGVtLm91dC5wcmludGxuKCJub3cgcmVhZGluZy4uLiIgKyBjb25maWdGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKKwkJCWJvb2xlYW4gaXNTaXRlVG9DaGVjayA9IGZhbHNlOworCQkJd2hpbGUgKGJyZWFkZXIucmVhZHkoKSkgeworCQkJCWxpbmUgPSBicmVhZGVyLnJlYWRMaW5lKCk7CisJCQkJaWYgKGxpbmUudHJpbSgpLnN0YXJ0c1dpdGgoIjxzaXRlIHVybCIpKXsKKwkJCQkJaXNTaXRlVG9DaGVjayA9IGxpbmUudHJpbSgpLnNwbGl0KCJcIiIpWzFdLnJlcGxhY2VGaXJzdCgiZmlsZToiLCIiKS5lcXVhbHMoc2l0ZUxvY2F0aW9uKTsKKwkJCQl9IGVsc2UgaWYgKGlzU2l0ZVRvQ2hlY2sgJiYgbGluZS50cmltKCkuc3RhcnRzV2l0aCgiPGZlYXR1cmUgY29uZmlndXJlZCIpKXsKKwkJCQkJU3lzdGVtLmVyci5wcmludGxuKGxpbmUpOworCQkJCQlTdHJpbmdbXSBjb25maWdMaW5lID0gbGluZS5zcGxpdCgiXCIiKTsKKwkJCQkJaWYgKGZlYXR1cmVOYW1lcy5jb250YWlucyhjb25maWdMaW5lWzNdKSAmJiBjb25maWdMaW5lWzFdLmVxdWFscygidHJ1ZSIpKXsKKwkJCQkJCWZhaWwoY29uZmlnTGluZVszXSArICIgaGFzIG5vdCBiZWVuIGRpc2FibGVkLiIpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJU3lzdGVtLmVyci5wcmludGxuKGUpOworCQl9IAorCQlyZXR1cm4gdHJ1ZTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3N0YW5kYWxvbmUvVGVzdEZlYXR1cmVFbmFibGUuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3N0YW5kYWxvbmUvVGVzdEZlYXR1cmVFbmFibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmM0MDdjCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvc3RhbmRhbG9uZS9UZXN0RmVhdHVyZUVuYWJsZS5qYXZhCkBAIC0wLDAgKzEsMTA5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuc3RhbmRhbG9uZTsKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGxhdGZvcm1SdW5uYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnN0YW5kYWxvbmUuKjsKKworcHVibGljIGNsYXNzIFRlc3RGZWF0dXJlRW5hYmxlIGV4dGVuZHMgU3RhbmRhbG9uZU1hbmFnZXJUZXN0Q2FzZSB7CisJcHVibGljIHN0YXRpYyBib29sZWFuIGlzRW5hYmxlZDsKKwkKKwlwdWJsaWMgVGVzdEZlYXR1cmVFbmFibGUoU3RyaW5nIGFyZzApIHsKKwkJc3VwZXIoYXJnMCk7CisJCWlzRW5hYmxlZCA9IGZhbHNlOworCX0KKworCXB1YmxpYyB2b2lkIHVtU2V0VXAoKSB7CisKKwkJc3VwZXIudW1TZXRVcCgpOworCQkKKwkJU3RyaW5nIGZlYXR1cmVJZCA9ICJteS5hbHBoYWJldCI7CisJCVN0cmluZyB2ZXJzaW9uID0gIjEuMC4wIjsKKworCQljaGVja0NvbmZpZ3VyZWRTaXRlcygpOworCQlpZiAoIWlzRW5hYmxlZCkgeworCQkJU3lzdGVtLm91dC5wcmludGxuKAorCQkJCSI9PT09PT09PT09PT09PSIgKyB0aGlzLmdldENsYXNzKCkgKyAiPT09PT09PT09PT09PSIpOworCQkJU3RhbmRhbG9uZVVwZGF0ZUFwcGxpY2F0aW9uIGFwcCA9IG5ldyBTdGFuZGFsb25lVXBkYXRlQXBwbGljYXRpb24oKTsKKwkJCXRyeSB7CisJCQkJZXhpdFZhbHVlID0gKEludGVnZXIpYXBwLnJ1bihnZXRDb21tYW5kKAorCQkJCQkiZW5hYmxlIiwKKwkJCQkJZmVhdHVyZUlkLAorCQkJCQl2ZXJzaW9uLAorCQkJCQludWxsLAorCQkJCQludWxsLAorCQkJCQlUQVJHRVRfRklMRV9TSVRFLmdldEZpbGUoKSkpOworCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJfQorCQkJaXNFbmFibGVkID0gdHJ1ZTsKKwkJCWNoZWNrQ29uZmlndXJlZFNpdGVzKCk7CisJCX0KKwl9CisJCisJLy8gZW5zdXJlIGV4aXQgd2l0aG91dCBwcm9ibGVtcworCXB1YmxpYyB2b2lkIHRlc3RFeGl0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3lzdGVtLm91dC5wcmludGxuKCJleGl0VmFsdWU6ICIgKyBleGl0VmFsdWUpOworCQlhc3NlcnRFcXVhbHMoZXhpdFZhbHVlLCBJUGxhdGZvcm1SdW5uYWJsZS5FWElUX09LKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0RmVhdHVyZVN0YXR1cygpIHRocm93cyBFeGNlcHRpb24geworCQorCQlGaWxlIGxvY2FsRmlsZSA9IG5ldyBGaWxlKCgoTG9jYWxTaXRlKVNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpKS5nZXRMb2NhdGlvblVSTCgpLmdldEZpbGUoKSk7CisJCVN5c3RlbS5vdXQucHJpbnRsbihsb2NhbEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworCQlhc3NlcnRUcnVlKGxvY2FsRmlsZS5leGlzdHMoKSk7CisJCUZpbGUgY29uZmlnRmlsZSA9IGdldExhdGVzdENvbmZpZ3VyYXRpb25GaWxlKGxvY2FsRmlsZSk7CisJCQorCQlTdHJpbmdbXSBuYW1lcyA9CisJCQl7CisJCQkJImZlYXR1cmVzL215LmFscGhhYmV0LnJvdW5kLmxldHRlcnNfMS4wLjAvIiwKKwkJCQkiZmVhdHVyZXMvbXkuYWxwaGFiZXQuc3RyYWlnaHQubGV0dGVyc18xLjAuMC8iLAorCQkJCSJmZWF0dXJlcy9teS5hbHBoYWJldF8xLjAuMC8iIH07CisJCWFzc2VydFRydWUoY29uZmlnRmlsZS5leGlzdHMoKSk7CisJCWFzc2VydFRydWUoY2hlY2tGZWF0dXJlc0VuYWJsZWQoZ2V0QXJyYXlMaXN0KG5hbWVzKSxjb25maWdGaWxlLCBUQVJHRVRfRklMRV9TSVRFLmdldEZpbGUoKSkpOworCX0KKworCXB1YmxpYyBib29sZWFuIGNoZWNrRmVhdHVyZXNFbmFibGVkKEFycmF5TGlzdCBmZWF0dXJlTmFtZXMsIEZpbGUgY29uZmlnRmlsZSwgU3RyaW5nIHNpdGVMb2NhdGlvbil7CisJCXRyeSB7CisJCQlGaWxlUmVhZGVyIGZyZWFkZXIgPSBuZXcgRmlsZVJlYWRlcihjb25maWdGaWxlKTsKKwkJCUJ1ZmZlcmVkUmVhZGVyIGJyZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoZnJlYWRlcik7CisJCQlTdHJpbmcgbGluZTsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigibm93IHJlYWRpbmcuLi4iICsgY29uZmlnRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisJCQlib29sZWFuIGlzU2l0ZVRvQ2hlY2sgPSBmYWxzZTsKKwkJCXdoaWxlIChicmVhZGVyLnJlYWR5KCkpIHsKKwkJCQlsaW5lID0gYnJlYWRlci5yZWFkTGluZSgpOworCQkJCWlmIChsaW5lLnRyaW0oKS5zdGFydHNXaXRoKCI8c2l0ZSB1cmwiKSl7CisJCQkJCWlzU2l0ZVRvQ2hlY2sgPSBsaW5lLnRyaW0oKS5zcGxpdCgiXCIiKVsxXS5yZXBsYWNlRmlyc3QoImZpbGU6IiwiIikuZXF1YWxzKHNpdGVMb2NhdGlvbik7CisJCQkJfSBlbHNlIGlmIChpc1NpdGVUb0NoZWNrICYmIGxpbmUudHJpbSgpLnN0YXJ0c1dpdGgoIjxmZWF0dXJlIGNvbmZpZ3VyZWQiKSl7CisJCQkJCVN5c3RlbS5lcnIucHJpbnRsbihsaW5lKTsKKwkJCQkJU3RyaW5nW10gY29uZmlnTGluZSA9IGxpbmUuc3BsaXQoIlwiIik7CisJCQkJCWlmIChmZWF0dXJlTmFtZXMuY29udGFpbnMoY29uZmlnTGluZVszXSkgJiYgY29uZmlnTGluZVsxXS5lcXVhbHMoImZhbHNlIikpeworCQkJCQkJZmFpbChjb25maWdMaW5lWzNdICsgIiBoYXMgbm90IGJlZW4gZW5hYmxlZC4iKTsKKwkJCQkJfQorCQkJCQkvLyB0ZW1wIC0gZGVsZXRlIGxhdGVyCisJCQkJCWlmIChmZWF0dXJlTmFtZXMuY29udGFpbnMoY29uZmlnTGluZVszXSkpCisJCQkJCQlTeXN0ZW0uZXJyLnByaW50bG4obGluZSk7CisJCQkJCS8vIGVuZCBvZiB0ZW1wIGRlbGV0ZQorCQkJCX0KKwkJCX0KKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCVN5c3RlbS5lcnIucHJpbnRsbihlKTsKKwkJfSAKKwkJcmV0dXJuIHRydWU7CisJfQorCit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9zdGFuZGFsb25lL1Rlc3RGZWF0dXJlSW5zdGFsbC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvc3RhbmRhbG9uZS9UZXN0RmVhdHVyZUluc3RhbGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTczY2I0Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvc3RhbmRhbG9uZS9UZXN0RmVhdHVyZUluc3RhbGwuamF2YQpAQCAtMCwwICsxLDEzNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnN0YW5kYWxvbmU7CisKKworaW1wb3J0IGphdmEudXRpbC4qOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuc3RhbmRhbG9uZS4qOworCisKK3B1YmxpYyBjbGFzcyBUZXN0RmVhdHVyZUluc3RhbGwgZXh0ZW5kcyBTdGFuZGFsb25lTWFuYWdlclRlc3RDYXNlIHsKKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5zdGFsbGVkOworCisJcHVibGljIFRlc3RGZWF0dXJlSW5zdGFsbChTdHJpbmcgYXJnMCkgeworCQlzdXBlcihhcmcwKTsKKwkJaXNJbnN0YWxsZWQgPSBmYWxzZTsKKwl9CisKKwlwdWJsaWMgdm9pZCB1bVNldFVwKCkgeworCQlzdXBlci51bVNldFVwKCk7CisJCS8vU3lzdGVtLm91dC5wcmludGxuKCJsb29raW5nIGF0IGNvbmZpZ3VyZWQgc2l0ZXMgYXZhaWxhYmxlLi4uLiIpOworCQkvL2NoZWNrQ29uZmlndXJlZFNpdGVzKCk7CisJCQorCQlTdHJpbmcgZmVhdHVyZUlkID0gIm15LmFscGhhYmV0IjsKKwkJU3RyaW5nIHZlcnNpb24gPSAiMS4wLjAiOworCisJCVN0cmluZyBmcm9tUmVtb3RlU2l0ZVVybCA9CisJCQkiaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS8lN0VjaGVja291dCU3RS9wbGF0Zm9ybS11cGRhdGUtaG9tZS8zLjAvc2l0ZS8iOworCQlpZiAoIWlzSW5zdGFsbGVkKSB7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oCisJCQkJIj09PT09PT09PT09PT09IiArIHRoaXMuZ2V0Q2xhc3MoKSArICI9PT09PT09PT09PT09Iik7CisJCQlTdGFuZGFsb25lVXBkYXRlQXBwbGljYXRpb24gYXBwID0gbmV3IFN0YW5kYWxvbmVVcGRhdGVBcHBsaWNhdGlvbigpOworCQkJdHJ5IHsKKwkJCQlleGl0VmFsdWUgPSAoSW50ZWdlcilhcHAucnVuKGdldENvbW1hbmQoCisJCQkJCSJpbnN0YWxsIiwKKwkJCQkJZmVhdHVyZUlkLAorCQkJCQl2ZXJzaW9uLAorCQkJCQludWxsLAorCQkJCQlmcm9tUmVtb3RlU2l0ZVVybCwKKwkJCQkJVEFSR0VUX0ZJTEVfU0lURS5nZXRGaWxlKCkpKTsKKwkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCX0KKwkJCWlzSW5zdGFsbGVkID0gdHJ1ZTsKKwkJfQorCQkKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0UGx1Z2luc0V4aXN0KCkgeworCQlJU2l0ZSBsb2NhbFNpdGUgPSBnZXRDb25maWd1cmVkU2l0ZShUQVJHRVRfRklMRV9TSVRFKTsKKwkJCisJCVN5c3RlbS5vdXQucHJpbnRsbigibG9jYWxTaXRlOiAiICsgbG9jYWxTaXRlLmdldFVSTCgpLmdldEZpbGUoKSk7CisJCUlQbHVnaW5FbnRyeVtdIHBsdWdpbkVudHJpZXMgPSBsb2NhbFNpdGUuZ2V0UGx1Z2luRW50cmllcygpOworCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKwkJaWYgKHBsdWdpbkVudHJpZXMgPT0gbnVsbCB8fCBwbHVnaW5FbnRyaWVzLmxlbmd0aCA9PSAwKXsKKwkJCVN5c3RlbS5lcnIucHJpbnRsbigiTm8gcGx1Z2luIGVudHJpZXMgb24gdGhlIHRhcmdldCBzaXRlIik7CisJCQlmYWlsKCJObyBwbHVnaW4gZW50cmllcyBvbiB0aGUgdGFyZ2V0IHNpdGUiKTsKKwkJfSBlbHNleworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwbHVnaW5FbnRyaWVzLmxlbmd0aDsgaSsrKXsKKwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImZvdW5kIHBsdWdpbjogIiArIHBsdWdpbkVudHJpZXNbaV0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpOworCQkJCWxpc3QuYWRkKHBsdWdpbkVudHJpZXNbaV0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpOworCQkJfQorCQl9CisKKwkJU3RyaW5nW10gcGx1Z2luTmFtZXMgPQorCQkJewkibXkuYWxwaGFiZXQubGV0dGVyLmFfMS4wLjAiLAorCQkJCSJteS5hbHBoYWJldC5sZXR0ZXIuYl8xLjAuMCIsCisJCQkJIm15LmFscGhhYmV0LmxldHRlci5jXzEuMC4wIiwKKwkJCQkibXkuYWxwaGFiZXQubGV0dGVyLmVfMS4wLjAiLAorCQkJCSJteS5hbHBoYWJldC5yb3VuZC5sZXR0ZXJzXzEuMC4wIiwKKwkJCQkibXkuYWxwaGFiZXQuc3RyYWlnaHQubGV0dGVyc18xLjAuMCIsCisJCQkJIm15LmFscGhhYmV0XzEuMC4wIiB9OworCQlhc3NlcnRUcnVlKGNoZWNrRmlsZXNJbkxpc3QocGx1Z2luTmFtZXMsIGxpc3QpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0RmVhdHVyZXNFeGlzdCgpIHsKKwkJdHJ5IHsKKwkJCUlTaXRlIGxvY2FsU2l0ZSA9ICBnZXRDb25maWd1cmVkU2l0ZShUQVJHRVRfRklMRV9TSVRFKTsKKworCQkJU3lzdGVtLm91dC5wcmludGxuKCJsb2NhbFNpdGU6ICIgKyBsb2NhbFNpdGUuZ2V0VVJMKCkuZ2V0RmlsZSgpKTsKKwkJCS8vIGdldCBmZWF0dXJlIHJlZmVyZW5jZXMgCisJCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGxvY2FsRmVhdHVyZXMgPQorCQkJCWxvY2FsU2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpOworCQkJU3lzdGVtLm91dC5wcmludGxuKCJsb2NhbCBjdXJyZW50Q09uZmlnU2l0ZTogIiArIGxvY2FsU2l0ZS5nZXRDdXJyZW50Q29uZmlndXJlZFNpdGUoKSk7CisJCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKwkJCWlmIChsb2NhbEZlYXR1cmVzID09IG51bGwgfHwgbG9jYWxGZWF0dXJlcy5sZW5ndGggPT0gMCl7CisJCQkJU3lzdGVtLmVyci5wcmludGxuKCJObyBmZWF0dXJlcyBvbiB0aGUgdGFyZ2V0IHNpdGUiKTsKKwkJCQlmYWlsKCJObyBmZWF0dXJlcyBvbiB0aGUgdGFyZ2V0IHNpdGUiKTsKKwkJCX0gZWxzZSB7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NhbEZlYXR1cmVzLmxlbmd0aDsgaSsrKQorCQkJCQlsaXN0LmFkZChsb2NhbEZlYXR1cmVzW2ldLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKTsKKwkJCX0KKwkJCVN0cmluZ1tdIGZlYXR1cmVOYW1lcyA9CisJCQkJeworCQkJCQkibXkuYWxwaGFiZXQucm91bmQubGV0dGVyc18xLjAuMCIsCisJCQkJCSJteS5hbHBoYWJldC5zdHJhaWdodC5sZXR0ZXJzXzEuMC4wIiwKKwkJCQkJIm15LmFscGhhYmV0XzEuMC4wIiB9OworCQkJYXNzZXJ0VHJ1ZShjaGVja0ZpbGVzSW5MaXN0KGZlYXR1cmVOYW1lcywgbGlzdCkpOworCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCVN5c3RlbS5lcnIucHJpbnRsbihlKTsKKwkJfQorCX0KKworCS8vIG1ha2VzIHN1cmUgYWxsIGZpbGVzL2RpcmVjdG9yaWVzIGluICJuYW1lcyIgYXJlIGluIHRoZSBkaXJlY3RvcnkgbGlzdGluZyAibGlzdCIKKwlwdWJsaWMgYm9vbGVhbiBjaGVja0ZpbGVzSW5MaXN0KAorCQlTdHJpbmdbXSBuYW1lcywKKwkJQXJyYXlMaXN0IGxpc3QpIHsKKwkJCisJCWZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbihuYW1lc1tpXSk7CisJCQlpZiAoIWxpc3QuY29udGFpbnMobmFtZXNbaV0pKXsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCisJLy8gZW5zdXJlIGV4aXQgd2l0aG91dCBwcm9ibGVtcworCXB1YmxpYyB2b2lkIHRlc3RFeGl0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3lzdGVtLm91dC5wcmludGxuKCJleGl0VmFsdWU6ICIgKyBleGl0VmFsdWUpOworCQlhc3NlcnRFcXVhbHMoZXhpdFZhbHVlLCBJUGxhdGZvcm1SdW5uYWJsZS5FWElUX09LKTsKKwl9Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9zdGFuZGFsb25lL1Rlc3RGZWF0dXJlVW5pbnN0YWxsLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9zdGFuZGFsb25lL1Rlc3RGZWF0dXJlVW5pbnN0YWxsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmEwZDA3OQotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3N0YW5kYWxvbmUvVGVzdEZlYXR1cmVVbmluc3RhbGwuamF2YQpAQCAtMCwwICsxLDEyMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnN0YW5kYWxvbmU7CisKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnN0YW5kYWxvbmUuKjsKKworCitwdWJsaWMgY2xhc3MgVGVzdEZlYXR1cmVVbmluc3RhbGwgZXh0ZW5kcyBTdGFuZGFsb25lTWFuYWdlclRlc3RDYXNlIHsKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNVbmluc3RhbGxlZDsKKwkKKwlwdWJsaWMgVGVzdEZlYXR1cmVVbmluc3RhbGwoU3RyaW5nIGFyZzApeworCQlzdXBlcihhcmcwKTsKKwkJaXNVbmluc3RhbGxlZCA9IGZhbHNlOworCX0KKwkKKwlwdWJsaWMgdm9pZCB1bVNldFVwKCkgeworCQlzdXBlci51bVNldFVwKCk7CisJCVN5c3RlbS5vdXQucHJpbnRsbigibG9va2luZyBhdCBjb25maWd1cmVkIHNpdGVzIGF2YWlsYWJsZS4uLi4iKTsKKwkJY2hlY2tDb25maWd1cmVkU2l0ZXMoKTsKKwkJCisJCVN0cmluZyBmZWF0dXJlSWQgPSAibXkuYWxwaGFiZXQiOworCQlTdHJpbmcgdmVyc2lvbiA9ICIxLjAuMCI7CisKKwkJaWYoIWlzVW5pbnN0YWxsZWQpeworCQkJU3lzdGVtLm91dC5wcmludGxuKAorCQkJCSI9PT09PT09PT09PT09PSIgKyB0aGlzLmdldENsYXNzKCkgKyAiPT09PT09PT09PT09PSIpOworCQkJU3RhbmRhbG9uZVVwZGF0ZUFwcGxpY2F0aW9uIGFwcCA9IG5ldyBTdGFuZGFsb25lVXBkYXRlQXBwbGljYXRpb24oKTsKKwkJCXRyeSB7CisJCQkJZXhpdFZhbHVlID0gKEludGVnZXIpYXBwLnJ1bihnZXRDb21tYW5kKAorCQkJCQkidW5pbnN0YWxsIiwKKwkJCQkJZmVhdHVyZUlkLAorCQkJCQl2ZXJzaW9uLAorCQkJCQludWxsLAorCQkJCQludWxsLAorCQkJCQlUQVJHRVRfRklMRV9TSVRFLmdldEZpbGUoKSkpOworCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJfQorCQkJaXNVbmluc3RhbGxlZCA9IHRydWU7CisJCX0KKwl9CisJCisJLy8gZW5zdXJlIGV4aXQgd2l0aG91dCBwcm9ibGVtcworCXB1YmxpYyB2b2lkIHRlc3RFeGl0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3lzdGVtLm91dC5wcmludGxuKCJleGl0VmFsdWU6ICIgKyBleGl0VmFsdWUpOworCQlhc3NlcnRFcXVhbHMoZXhpdFZhbHVlLCBJUGxhdGZvcm1SdW5uYWJsZS5FWElUX09LKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdEZlYXR1cmVzVW5pbnN0YWxsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCUlTaXRlIGxvY2FsU2l0ZSA9IGdldENvbmZpZ3VyZWRTaXRlKFRBUkdFVF9GSUxFX1NJVEUpOworCQkJCisJCQkvLyBnZXQgZmVhdHVyZSByZWZlcmVuY2VzIAorCQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBsb2NhbEZlYXR1cmVzID0KKwkJCQlsb2NhbFNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsKKwkJCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOworCQkJaWYgKGxvY2FsRmVhdHVyZXMgPT0gbnVsbCB8fCBsb2NhbEZlYXR1cmVzLmxlbmd0aCA9PSAwKXsKKwkJCQlmYWlsKCJObyBmZWF0dXJlcyBvbiB0aGUgdGFyZ2V0IHNpdGUiKTsKKwkJCX0gZWxzZSB7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NhbEZlYXR1cmVzLmxlbmd0aDsgaSsrKQorCQkJCQlsaXN0LmFkZChsb2NhbEZlYXR1cmVzW2ldLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKTsKKwkJCX0KKwkJCVN0cmluZ1tdIGZlYXR1cmVOYW1lcyA9CisJCQkJeworCQkJCQkibXkuYWxwaGFiZXQucm91bmQubGV0dGVyc18xLjAuMCIsCisJCQkJCSJteS5hbHBoYWJldC5zdHJhaWdodC5sZXR0ZXJzXzEuMC4wIiwKKwkJCQkJIm15LmFscGhhYmV0XzEuMC4wIiB9OworCQkJYXNzZXJ0VHJ1ZShjaGVja0ZpbGVzTm90SW5MaXN0KGZlYXR1cmVOYW1lcywgbGlzdCkpOworCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCVN5c3RlbS5lcnIucHJpbnRsbihlKTsKKwkJfQorCX0KKwkKKwlwdWJsaWMgdm9pZCB0ZXN0UGx1Z2luc1VuaW5zdGFsbGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCQlJU2l0ZSBsb2NhbFNpdGUgPSBnZXRDb25maWd1cmVkU2l0ZShUQVJHRVRfRklMRV9TSVRFKTsKKwkJCQorCQkJSVBsdWdpbkVudHJ5W10gcGx1Z2luRW50cmllcyA9IGxvY2FsU2l0ZS5nZXRQbHVnaW5FbnRyaWVzKCk7CisJCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKwkJCWlmIChwbHVnaW5FbnRyaWVzID09IG51bGwgfHwgcGx1Z2luRW50cmllcy5sZW5ndGggPT0gMCkKKwkJCQlmYWlsKCJObyBwbHVnaW4gZW50cmllcyBvbiB0aGUgdGFyZ2V0IHNpdGUiKTsKKwkJCWVsc2UKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IHBsdWdpbkVudHJpZXMubGVuZ3RoOyBpKyspeworCQkJCQlsaXN0LmFkZChwbHVnaW5FbnRyaWVzW2ldLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKTsKKwkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJwbHVnaW4gZm91bmQ6ICIgKyBwbHVnaW5FbnRyaWVzW2ldLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKTsKKwkJCQl9CisKKwkJCVN0cmluZ1tdIHBsdWdpbk5hbWVzID0KKwkJCQl7CSJteS5hbHBoYWJldC5sZXR0ZXIuYV8xLjAuMCIsCisJCQkJCSJteS5hbHBoYWJldC5sZXR0ZXIuYl8xLjAuMCIsCisJCQkJCSJteS5hbHBoYWJldC5sZXR0ZXIuY18xLjAuMCIsCisJCQkJCSJteS5hbHBoYWJldC5sZXR0ZXIuZV8xLjAuMCIsCisJCQkJCSJteS5hbHBoYWJldC5yb3VuZC5sZXR0ZXJzXzEuMC4wIiwKKwkJCQkJIm15LmFscGhhYmV0LnN0cmFpZ2h0LmxldHRlcnNfMS4wLjAiLAorCQkJCQkibXkuYWxwaGFiZXRfMS4wLjAiIH07CisJCQlhc3NlcnRUcnVlKGNoZWNrRmlsZXNOb3RJbkxpc3QocGx1Z2luTmFtZXMsIGxpc3QpKTsJCisJfQorCQorCS8vIG1ha2VzIHN1cmUgYWxsIGZpbGVzL2RpcmVjdG9yaWVzIGluICJuYW1lcyIgYXJlIE5PVCBpbiB0aGUgZGlyZWN0b3J5IGxpc3RpbmcgImxpc3QiCisJcHVibGljIGJvb2xlYW4gY2hlY2tGaWxlc05vdEluTGlzdCgKKwkJU3RyaW5nW10gbmFtZXMsCisJCUFycmF5TGlzdCBsaXN0KSB7CisJCQorCQlmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oInNlYXJjaGluZyBmb3IgIiArIG5hbWVzW2ldICsgIi4uLiIpOworCQkJaWYgKGxpc3QuY29udGFpbnMobmFtZXNbaV0pKQorCQkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9zdGFuZGFsb25lL1Rlc3RGZWF0dXJlVXBkYXRlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9zdGFuZGFsb25lL1Rlc3RGZWF0dXJlVXBkYXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU4OWI2OQotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3N0YW5kYWxvbmUvVGVzdEZlYXR1cmVVcGRhdGUuamF2YQpAQCAtMCwwICsxLDEzOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnN0YW5kYWxvbmU7CisKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnN0YW5kYWxvbmUuKjsKKworcHVibGljIGNsYXNzIFRlc3RGZWF0dXJlVXBkYXRlIGV4dGVuZHMgU3RhbmRhbG9uZU1hbmFnZXJUZXN0Q2FzZSB7CisJcHVibGljIHN0YXRpYyBib29sZWFuIGlzVXBkYXRlZDsKKwkKKwlwdWJsaWMgVGVzdEZlYXR1cmVVcGRhdGUoU3RyaW5nIGFyZzApIHsKKwkJc3VwZXIoYXJnMCk7CisJCWlzVXBkYXRlZCA9IGZhbHNlOworCX0KKworCXB1YmxpYyB2b2lkIHVtU2V0VXAoKSB7CisJCXN1cGVyLnVtU2V0VXAoKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKCJsb29raW5nIGF0IGNvbmZpZ3VyZWQgc2l0ZXMgYXZhaWxhYmxlLi4uLiIpOworCQljaGVja0NvbmZpZ3VyZWRTaXRlcygpOworCQkKKwkJU3RyaW5nIGZlYXR1cmVJZCA9ICJteS5hbHBoYWJldCI7CisJCVN0cmluZyB2ZXJzaW9uID0gIjEuMC4xIjsKKworCQlpZiAoIWlzVXBkYXRlZCkgeworCQkJU3lzdGVtLm91dC5wcmludGxuKAorCQkJCSI9PT09PT09PT09PT09PSIgKyB0aGlzLmdldENsYXNzKCkgKyAiPT09PT09PT09PT09PSIpOworCQkJU3RhbmRhbG9uZVVwZGF0ZUFwcGxpY2F0aW9uIGFwcCA9IG5ldyBTdGFuZGFsb25lVXBkYXRlQXBwbGljYXRpb24oKTsKKwkJCXRyeSB7CisJCQkJZXhpdFZhbHVlID0gKEludGVnZXIpYXBwLnJ1bihnZXRDb21tYW5kKAorCQkJCQkJInVwZGF0ZSIsCisJCQkJCQlmZWF0dXJlSWQsCisJCQkJCQl2ZXJzaW9uLAorCQkJCQkJbnVsbCwKKwkJCQkJCW51bGwsCisJCQkJCQlUQVJHRVRfRklMRV9TSVRFLmdldEZpbGUoKSkpOworCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJfQorCQkJaXNVcGRhdGVkID0gdHJ1ZTsKKwkJfQorCX0KKworCisJLy8gZW5zdXJlIGV4aXQgd2l0aG91dCBwcm9ibGVtcworCXB1YmxpYyB2b2lkIHRlc3RFeGl0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3lzdGVtLm91dC5wcmludGxuKCJleGl0VmFsdWU6ICIgKyBleGl0VmFsdWUpOworCQlhc3NlcnRFcXVhbHMoZXhpdFZhbHVlLCBJUGxhdGZvcm1SdW5uYWJsZS5FWElUX09LKTsKKwl9CisJCisJcHVibGljIHZvaWQgdGVzdFBsdWdpbnNFeGlzdCgpIHsKKworCQkJSVNpdGUgbG9jYWxTaXRlID0gIGdldENvbmZpZ3VyZWRTaXRlKFRBUkdFVF9GSUxFX1NJVEUpOworCisJCQlJUGx1Z2luRW50cnlbXSBwbHVnaW5FbnRyaWVzID0gbG9jYWxTaXRlLmdldFBsdWdpbkVudHJpZXMoKTsKKwkJCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOworCQkJaWYgKHBsdWdpbkVudHJpZXMgPT0gbnVsbCB8fCBwbHVnaW5FbnRyaWVzLmxlbmd0aCA9PSAwKQorCQkJCWZhaWwoIk5vIHBsdWdpbiBlbnRyaWVzIG9uIHRoZSB0YXJnZXQgc2l0ZSIpOworCQkJZWxzZQorCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGx1Z2luRW50cmllcy5sZW5ndGg7IGkrKykgeworCQkJCQlsaXN0LmFkZCgKKwkJCQkJCXBsdWdpbkVudHJpZXNbaV0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpOworCQkJCX0KKworCQkJU3RyaW5nW10gcGx1Z2luTmFtZXMgPQorCQkJCXsKKwkJCQkJIm15LmFscGhhYmV0LmxldHRlci5hXzEuMC4wIiwKKwkJCQkJIm15LmFscGhhYmV0LmxldHRlci5iXzEuMC4wIiwKKwkJCQkJIm15LmFscGhhYmV0LmxldHRlci5jXzEuMC4wIiwKKwkJCQkJIm15LmFscGhhYmV0LmxldHRlci5lXzEuMC4wIiwKKwkJCQkJIm15LmFscGhhYmV0LnJvdW5kLmxldHRlcnNfMS4wLjAiLAorCQkJCQkibXkuYWxwaGFiZXQuc3RyYWlnaHQubGV0dGVyc18xLjAuMCIsCisJCQkJCSJteS5hbHBoYWJldF8xLjAuMCIsCisJCQkJCSJteS5hbHBoYWJldC5sZXR0ZXIuYV8xLjAuMSIsCisJCQkJCSJteS5hbHBoYWJldC5sZXR0ZXIuYl8xLjAuMSIsCisJCQkJCSJteS5hbHBoYWJldC5sZXR0ZXIuY18xLjAuMSIsCisJCQkJCSJteS5hbHBoYWJldC5sZXR0ZXIuZV8xLjAuMSIsCisJCQkJCSJteS5hbHBoYWJldC5yb3VuZC5sZXR0ZXJzXzEuMC4xIiwKKwkJCQkJIm15LmFscGhhYmV0LnN0cmFpZ2h0LmxldHRlcnNfMS4wLjEiLAorCQkJCQkibXkuYWxwaGFiZXRfMS4wLjEiIH07CisJCQlhc3NlcnRUcnVlKGNoZWNrRmlsZXNJbkxpc3QocGx1Z2luTmFtZXMsIGxpc3QpKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0RmVhdHVyZXNFeGlzdCgpIHsKKwkJdHJ5IHsKKwkJCUlTaXRlIGxvY2FsU2l0ZSA9IGdldENvbmZpZ3VyZWRTaXRlKFRBUkdFVF9GSUxFX1NJVEUpOworCisJCQkvLyBnZXQgZmVhdHVyZSByZWZlcmVuY2VzCisJCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGxvY2FsRmVhdHVyZXMgPQorCQkJCWxvY2FsU2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpOworCQkJQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisJCQlpZiAobG9jYWxGZWF0dXJlcyA9PSBudWxsIHx8IGxvY2FsRmVhdHVyZXMubGVuZ3RoID09IDApIHsKKwkJCQlmYWlsKCJObyBmZWF0dXJlcyBvbiB0aGUgdGFyZ2V0IHNpdGUiKTsKKwkJCX0gZWxzZSB7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NhbEZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7CisJCQkJCWxpc3QuYWRkKAorCQkJCQkJbG9jYWxGZWF0dXJlc1tpXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSk7CisJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigKKwkJCQkJCWxvY2FsRmVhdHVyZXNbaV0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpOworCQkJCX0KKwkJCX0KKwkJCVN0cmluZ1tdIGZlYXR1cmVOYW1lcyA9CisJCQkJeworCQkJCQkibXkuYWxwaGFiZXQucm91bmQubGV0dGVyc18xLjAuMCIsCisJCQkJCSJteS5hbHBoYWJldC5zdHJhaWdodC5sZXR0ZXJzXzEuMC4wIiwKKwkJCQkJIm15LmFscGhhYmV0XzEuMC4wIiwKKwkJCQkJIm15LmFscGhhYmV0LnJvdW5kLmxldHRlcnNfMS4wLjEiLAorCQkJCQkibXkuYWxwaGFiZXQuc3RyYWlnaHQubGV0dGVyc18xLjAuMSIsCisJCQkJCSJteS5hbHBoYWJldF8xLjAuMSIgfTsKKwkJCWFzc2VydFRydWUoY2hlY2tGaWxlc0luTGlzdChmZWF0dXJlTmFtZXMsIGxpc3QpKTsKKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQlTeXN0ZW0uZXJyLnByaW50bG4oZSk7CisJCX0KKwl9CisKKwkvLyBtYWtlcyBzdXJlIGFsbCBmaWxlcy9kaXJlY3RvcmllcyBpbiAibmFtZXMiIGFyZSBpbiB0aGUgZGlyZWN0b3J5IGxpc3RpbmcKKwkvLyAibGlzdCIKKwlwdWJsaWMgYm9vbGVhbiBjaGVja0ZpbGVzSW5MaXN0KFN0cmluZ1tdIG5hbWVzLCBBcnJheUxpc3QgbGlzdCkgeworCisJCWZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHsKKwkJCWlmICghbGlzdC5jb250YWlucyhuYW1lc1tpXSkpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCXJldHVybiB0cnVlOworCX0KKworfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvdHlwZXMvQWxsVHlwZXNUZXN0cy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvdHlwZXMvQWxsVHlwZXNUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlOGM0NWUKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy90eXBlcy9BbGxUeXBlc1Rlc3RzLmphdmEKQEAgLTAsMCArMSwzNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy50eXBlczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLio7CisKKworcHVibGljIGNsYXNzIEFsbFR5cGVzVGVzdHMgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2UgeworcHVibGljIEFsbFR5cGVzVGVzdHMoU3RyaW5nIG5hbWUpIHsKKwlzdXBlcihuYW1lKTsKK30KK3B1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKKwlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7CisJc3VpdGUuc2V0TmFtZSgiUmVndWxhciBJbnN0YWxsIFRlc3RzIik7CisJCisJLy8gdGhlIGZvbGxvd2luZyB3aWxsIHRha2UgYWxsIHRlaCB0ZXN0IG1ldGhvZHMgaW4gdGVoIGNsYXNzIHRoYXQgc3RhcnQgd2l0aCAndGVzdCcKKwlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdEZlYXR1cmVUeXBlLmNsYXNzKSk7CisJc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RTaXRlVHlwZS5jbGFzcykpOwkKKwkKKwkvLyBvciB5b3UgY2FuIHNwZWNpZnkgdGhlIG1ldGhvZAorCS8vc3VpdGUuYWRkVGVzdChuZXcgVGVzdEdldEZlYXR1cmUoIm1ldGhvZFRoYXREb2VzTm90U3RhcnRXaXRodGVzdCIpKTsJCisJCisJcmV0dXJuIHN1aXRlOworfQorfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvdHlwZXMvVGVzdEZlYXR1cmVUeXBlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy90eXBlcy9UZXN0RmVhdHVyZVR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDI3MDViCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvdHlwZXMvVGVzdEZlYXR1cmVUeXBlLmphdmEKQEAgLTAsMCArMSwxNTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMudHlwZXM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5uZXQuVVJMOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7CisKKworcHVibGljIGNsYXNzIFRlc3RGZWF0dXJlVHlwZSBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7CisKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLQUdFRF9GRUFUVVJFX1RZUEUgPSAicGFja2FnZWQiOyAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOU1RBTExFRF9GRUFUVVJFX1RZUEUgPSAiaW5zdGFsbGVkIjsgLy8kTk9OLU5MUy0xJAkKKwkKKwkvKioKKwkgKiBUZXN0IHRoZSBnZXRGZWF0dXJlcygpCisJICovCisJcHVibGljIFRlc3RGZWF0dXJlVHlwZShTdHJpbmcgYXJnMCkgeworCQlzdXBlcihhcmcwKTsKKwl9CisJCisJCisJcHVibGljIFN0cmluZyBnZXREZWZhdWx0SW5zdGFsbGFibGVGZWF0dXJlVHlwZSgpIHsKKwkJU3RyaW5nIHBsdWdpbklEID0gVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXREZXNjcmlwdG9yKCkuZ2V0VW5pcXVlSWRlbnRpZmllcigpICsgIi4iOyAvLyROT04tTkxTLTEkCisJCXJldHVybiBwbHVnaW5JRCArIFBBQ0tBR0VEX0ZFQVRVUkVfVFlQRTsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXREZWZhdWx0RXhlY3V0YWJsZUZlYXR1cmVUeXBlKCkgeworCQlTdHJpbmcgcGx1Z2luSUQgPSBVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldERlc2NyaXB0b3IoKS5nZXRVbmlxdWVJZGVudGlmaWVyKCkgKyAiLiI7IC8vJE5PTi1OTFMtMSQKKwkJcmV0dXJuIHBsdWdpbklEICsgSU5TVEFMTEVEX0ZFQVRVUkVfVFlQRTsKKwl9CQkKKwkKKwkvKioKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCXB1YmxpYyB2b2lkIHRlc3RTaW1wbGVQYWNrYWdlZEZlYXR1cmVUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbnsgCisJCUZlYXR1cmVUeXBlRmFjdG9yeSBmYWN0b3JpZXMgPSBGZWF0dXJlVHlwZUZhY3RvcnkuZ2V0SW5zdGFuY2UoKTsKKwkJSUZlYXR1cmVGYWN0b3J5IGZhY3RvcnkgPSBmYWN0b3JpZXMuZ2V0RmFjdG9yeShnZXREZWZhdWx0SW5zdGFsbGFibGVGZWF0dXJlVHlwZSgpKTsKKwkJCisJCUlTaXRlIHNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKFNPVVJDRV9GSUxFX1NJVEUsbnVsbCk7CisJCVVSTCBmZWF0dXJlVVJMID0gbmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFLCJmZWF0dXJlcy9mZWF0dXJlczIuamFyICIpOworCQkKKwkJSUZlYXR1cmUgYW5vdGhlckZlYXR1cmUgPSBmYWN0b3J5LmNyZWF0ZUZlYXR1cmUoZmVhdHVyZVVSTCxzaXRlLG51bGwpOworCQkKKwkJYXNzZXJ0VHJ1ZSgiRmFjdG9yeSBkb2Vzbid0IGNyZWF0ZSBzYW1lIGZlYXR1cmUiLGFub3RoZXJGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5lcXVhbHMoYW5vdGhlckZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpKSk7CisJfQkKKwkKKwkJLyoqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlRXhlY3V0YWJsZUZlYXR1cmVUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbnsgCisJCUZlYXR1cmVUeXBlRmFjdG9yeSBmYWN0b3JpZXMgPSBGZWF0dXJlVHlwZUZhY3RvcnkuZ2V0SW5zdGFuY2UoKTsKKwkJSUZlYXR1cmVGYWN0b3J5IGZhY3RvcnkgPSBmYWN0b3JpZXMuZ2V0RmFjdG9yeShnZXREZWZhdWx0RXhlY3V0YWJsZUZlYXR1cmVUeXBlKCkpOworCQkKKwkJSVNpdGUgc2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoU09VUkNFX0ZJTEVfU0lURSxudWxsKTsKKwkJVVJMIGZlYXR1cmVVUkwgPSBuZXcgVVJMKFNPVVJDRV9GSUxFX1NJVEUsInRlc3RBUEkvIitTaXRlLkRFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfUEFUSCsiZmVhdHVyZTMvIik7CisJCQorCQlJRmVhdHVyZSBhbm90aGVyRmVhdHVyZSA9IGZhY3RvcnkuY3JlYXRlRmVhdHVyZShmZWF0dXJlVVJMLHNpdGUsbnVsbCk7CisJCQorCQlhc3NlcnRUcnVlKCJGYWN0b3J5IGRvZXNuJ3QgY3JlYXRlIHNhbWUgZmVhdHVyZSIsYW5vdGhlckZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmVxdWFscyhhbm90aGVyRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkpKTsKKwl9CQorCQorCS8qKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJcHVibGljIHZvaWQgdGVzdEZlYXR1cmVUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbnsgCisJCUZlYXR1cmVUeXBlRmFjdG9yeSBmYWN0b3JpZXMgPSBGZWF0dXJlVHlwZUZhY3RvcnkuZ2V0SW5zdGFuY2UoKTsKKwkJSUZlYXR1cmVGYWN0b3J5IGZhY3RvcnkgPSBmYWN0b3JpZXMuZ2V0RmFjdG9yeShnZXREZWZhdWx0SW5zdGFsbGFibGVGZWF0dXJlVHlwZSgpKTsKKwkJCisJCUlTaXRlIHNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKFNPVVJDRV9IVFRQX1NJVEUsbnVsbCk7CisJCUlGZWF0dXJlIGZlYXR1cmUgPSBzaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKClbMF0uZ2V0RmVhdHVyZShudWxsKTsKKwkJCisJCUlGZWF0dXJlIGFub3RoZXJGZWF0dXJlID0gZmFjdG9yeS5jcmVhdGVGZWF0dXJlKGZlYXR1cmUuZ2V0VVJMKCksc2l0ZSxudWxsKTsKKwkJCisJCWFzc2VydFRydWUoIkZhY3RvcnkgZG9lc24ndCBjcmVhdGUgc2FtZSBmZWF0dXJlIixmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5lcXVhbHMoYW5vdGhlckZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpKSk7CisJfQorCQorCQorCS8qKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJcHVibGljIHZvaWQgdGVzdEZlYXR1cmVOZXdUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbnsgCisJCUZlYXR1cmVUeXBlRmFjdG9yeSBmYWN0b3JpZXMgPSBGZWF0dXJlVHlwZUZhY3RvcnkuZ2V0SW5zdGFuY2UoKTsKKwkJSUZlYXR1cmVGYWN0b3J5IGZhY3RvcnkgPSBmYWN0b3JpZXMuZ2V0RmFjdG9yeShnZXREZWZhdWx0RXhlY3V0YWJsZUZlYXR1cmVUeXBlKCkpOworCQkKKwkJU3RyaW5nIGZlYXR1cmVQYXRoID0gZGF0YVBhdGgrIkZlYXR1cmVUeXBlRXhhbXBsZXMvc2l0ZTEvc2l0ZS54bWwiOworCQlJU2l0ZSBzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShuZXcgRmlsZShmZWF0dXJlUGF0aCkudG9VUkwoKSxudWxsKTsKKwkJSUZlYXR1cmVSZWZlcmVuY2UgcmVmID0gc2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpWzBdOworCQlJRmVhdHVyZSBmZWF0dXJlID0gcmVmLmdldEZlYXR1cmUobnVsbCk7CisJCQorCQlJRmVhdHVyZSBhbm90aGVyRmVhdHVyZSA9IGZhY3RvcnkuY3JlYXRlRmVhdHVyZShmZWF0dXJlLmdldFVSTCgpLHNpdGUsbnVsbCk7CisKKwkJYXNzZXJ0VHJ1ZShmZWF0dXJlLmdldEZlYXR1cmVDb250ZW50UHJvdmlkZXIoKSBpbnN0YW5jZW9mIEZlYXR1cmVFeGVjdXRhYmxlQ29udGVudFByb3ZpZGVyKTsJCQorCQlhc3NlcnRUcnVlKCgoRmVhdHVyZVJlZmVyZW5jZSlyZWYpLmdldFR5cGUoKS5lcXVhbHMoIm9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlLmZlYXR1cmUxIikpOwkJCisJCWFzc2VydFRydWUoIkZhY3RvcnkgZG9lc24ndCBjcmVhdGUgc2FtZSBmZWF0dXJlIixmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5lcXVhbHMoYW5vdGhlckZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpKSk7CisKKworCX0KKwkKKwkKKwkJLyoqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0RmVhdHVyZUFub3RoZXJUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbnsgCisJCUZlYXR1cmVUeXBlRmFjdG9yeSBmYWN0b3JpZXMgPSBGZWF0dXJlVHlwZUZhY3RvcnkuZ2V0SW5zdGFuY2UoKTsKKwkJSUZlYXR1cmVGYWN0b3J5IGZhY3RvcnkgPSBmYWN0b3JpZXMuZ2V0RmFjdG9yeShnZXREZWZhdWx0SW5zdGFsbGFibGVGZWF0dXJlVHlwZSgpKTsKKwkJCisJCVN0cmluZyBmZWF0dXJlUGF0aCA9IGRhdGFQYXRoKyJGZWF0dXJlVHlwZUV4YW1wbGVzL3NpdGUyL3NpdGUueG1sIjsKKwkJSVNpdGUgc2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUobmV3IEZpbGUoZmVhdHVyZVBhdGgpLnRvVVJMKCksbnVsbCk7CisJCUlGZWF0dXJlUmVmZXJlbmNlIHJlZiA9IHNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKVswXTsJCQorCQlJRmVhdHVyZSBmZWF0dXJlID0gcmVmLmdldEZlYXR1cmUobnVsbCk7CisJCQorCQlJRmVhdHVyZSBhbm90aGVyRmVhdHVyZSA9IGZhY3RvcnkuY3JlYXRlRmVhdHVyZShmZWF0dXJlLmdldFVSTCgpLHNpdGUsbnVsbCk7CisJCQorCQlhc3NlcnRUcnVlKCJGYWN0b3J5IGRvZXNuJ3QgY3JlYXRlIHNhbWUgZmVhdHVyZSIsZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZXF1YWxzKGFub3RoZXJGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSkpOworCQlhc3NlcnRUcnVlKGZlYXR1cmUuZ2V0RmVhdHVyZUNvbnRlbnRQcm92aWRlcigpIGluc3RhbmNlb2YgRmVhdHVyZVBhY2thZ2VkQ29udGVudFByb3ZpZGVyKTsKKwkJYXNzZXJ0VHJ1ZSgoKEZlYXR1cmVSZWZlcmVuY2UpcmVmKS5nZXRUeXBlKCkuZXF1YWxzKCJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5wYWNrYWdlZCIpKTsKKwkJCisJfQorCQkKKwkJCisJLyoqCisJICogQHRocm93cyBFeGNlcHRpb24KKwkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0RmVhdHVyZVVua25vd25UeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbnsgCisJCVN0cmluZyBmZWF0dXJlUGF0aCA9IGRhdGFQYXRoKyJGZWF0dXJlVHlwZUV4YW1wbGVzL3NpdGUzL3NpdGUueG1sIjsKKwkJSVNpdGUgc2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUobmV3IEZpbGUoZmVhdHVyZVBhdGgpLnRvVVJMKCksbnVsbCk7CisJCUlGZWF0dXJlUmVmZXJlbmNlIHJlZiA9IHNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKVswXTsJCQorCQl0cnkgeworCQkJcmVmLmdldEZlYXR1cmUobnVsbCk7CisJCQlhc3NlcnRUcnVlKCJpZCBmb3VuZCwgc2hvdWxkIG5vdCBiZSBmb3VuZCIsZmFsc2UpOworCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpeworCQkJaWYgKGUuZ2V0TWVzc2FnZSgpLmluZGV4T2YoIm9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnVua25vd250eXBlLmphciIpPT0tMSl7CisJCQkJdGhyb3cgZTsKKwkJCX0KKwkJfQorCQkKKwl9CQkKKwkJCit9CisKKwpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvdHlwZXMvVGVzdFNpdGVUeXBlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy90eXBlcy9UZXN0U2l0ZVR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGM3NDU1Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvdHlwZXMvVGVzdFNpdGVUeXBlLmphdmEKQEAgLTAsMCArMSw4NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy50eXBlczsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JU2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5TaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlNpdGVNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLkZlYXR1cmVQYWNrYWdlZENvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5TaXRlVVJMQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmltcGxlbWVudGF0aW9uLlNpdGVGVFBGYWN0b3J5OworCitwdWJsaWMgY2xhc3MgVGVzdFNpdGVUeXBlIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsKKworCS8qKgorCSAqIFRlc3QgdGhlIGdldEZlYXR1cmVzKCkKKwkgKi8KKwlwdWJsaWMgVGVzdFNpdGVUeXBlKFN0cmluZyBhcmcwKSB7CisJCXN1cGVyKGFyZzApOworCX0KKworCS8qKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJcHVibGljIHZvaWQgdGVzdFNpdGVUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJU3RyaW5nIGZlYXR1cmVQYXRoID0gZGF0YVBhdGggKyAiU2l0ZVR5cGVFeGFtcGxlcy9zaXRlMS9zaXRlLnhtbCI7CisJCUlTaXRlIHNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKG5ldyBGaWxlKGZlYXR1cmVQYXRoKS50b1VSTCgpLG51bGwpOworCQlJRmVhdHVyZVJlZmVyZW5jZSByZWYgPSBzaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKClbMF07CisJCUlGZWF0dXJlIGZlYXR1cmUgPSByZWYuZ2V0RmVhdHVyZShudWxsKTsKKworCQlhc3NlcnRUcnVlKHNpdGUuZ2V0U2l0ZUNvbnRlbnRQcm92aWRlcigpIGluc3RhbmNlb2YgU2l0ZVVSTENvbnRlbnRQcm92aWRlcik7CisJCWFzc2VydFRydWUoKChTaXRlKSBzaXRlKS5nZXRUeXBlKCkuZXF1YWxzKCJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5odHRwIikpOworCQlhc3NlcnRUcnVlKGZlYXR1cmUuZ2V0RmVhdHVyZUNvbnRlbnRQcm92aWRlcigpIGluc3RhbmNlb2YgRmVhdHVyZVBhY2thZ2VkQ29udGVudFByb3ZpZGVyKTsKKworCX0KKworCS8qKgorCQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCQkgKi8KKwlwdWJsaWMgdm9pZCB0ZXN0RlRQU2l0ZVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworCQlJU2l0ZSBzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShuZXcgVVJMKFNPVVJDRV9GSUxFX1NJVEUgKyAiRlRQTGlrZVNpdGUvIiksbnVsbCk7CisKKwkJLy8gc2hvdWxkIG5vdCBmaW5kIHRoZSBtYXBwaW5nCisJCS8vIGJ1dCB0aGVuIHNob3VsZCBhdHRlbXB0IHRvIHJlYWQgdGhlIFhNTCBmaWxlCisJCS8vIGZvdW5kIGEgbmV3IHR5cGUKKwkJLy8gY2FsbCB0aGUgbmV3IHR5cGUKKwkJYXNzZXJ0VHJ1ZSgKKwkJCSJXcm9uZyBzaXRlIHR5cGUiLAorCQkJc2l0ZS5nZXRUeXBlKCkuZXF1YWxzKCJvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuZnRwIikpOworCQlhc3NlcnRUcnVlKAorCQkJIldyb25nIGZpbGUiLAorCQkJc2l0ZS5nZXRVUkwoKS5nZXRGaWxlKCkuZXF1YWxzKCIvIiArIFNpdGVGVFBGYWN0b3J5LkZJTEUpKTsKKworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RQYXJzZVZhbGlkMSgpIHRocm93cyBFeGNlcHRpb24geworCQl0cnkgeworCQkJVVJMIHJlbW90ZVVSTCA9IG5ldyBVUkwoU09VUkNFX0ZJTEVfU0lURSArICJwYXJzZXJ0ZXN0cy9zaXRlZnRwLnhtbCIpOworCQkJSVNpdGUgc2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUocmVtb3RlVVJMLG51bGwpOworCQkJc2l0ZS5nZXRBcmNoaXZlcygpOworCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCWlmIChlLmdldE1lc3NhZ2UoKS5pbmRleE9mKCI8L2ZlYXR1cmU+IikgPT0gLTEpIHsKKwkJCQl0aHJvdyBlOworCQkJfQorCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy91aXZhbHVlcy9BbGxDb3JlVUlUZXN0cy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvdWl2YWx1ZXMvQWxsQ29yZVVJVGVzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDFlNTk5Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvdWl2YWx1ZXMvQWxsQ29yZVVJVGVzdHMuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnVpdmFsdWVzOworCitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZU1hbmFnZXJUZXN0Q2FzZTsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKKworCitwdWJsaWMgY2xhc3MgQWxsQ29yZVVJVGVzdHMgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2UgeworcHVibGljIEFsbENvcmVVSVRlc3RzKFN0cmluZyBuYW1lKSB7CisJc3VwZXIobmFtZSk7Cit9CitwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7CisJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOworCXN1aXRlLnNldE5hbWUoIlJlZ3VsYXIgSW5zdGFsbCBUZXN0cyIpOworCQorCS8vIHRoZSBmb2xsb3dpbmcgd2lsbCB0YWtlIGFsbCB0ZWggdGVzdCBtZXRob2RzIGluIHRlaCBjbGFzcyB0aGF0IHN0YXJ0IHdpdGggJ3Rlc3QnCisJc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RVSUxhYmVsLmNsYXNzKSk7CisJCisJLy8gb3IgeW91IGNhbiBzcGVjaWZ5IHRoZSBtZXRob2QKKwkvL3N1aXRlLmFkZFRlc3QobmV3IFRlc3RHZXRGZWF0dXJlKCJtZXRob2RUaGF0RG9lc05vdFN0YXJ0V2l0aHRlc3QiKSk7CQorCQorCXJldHVybiBzdWl0ZTsKK30KK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3VpdmFsdWVzL1Rlc3RVSUxhYmVsLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy91aXZhbHVlcy9UZXN0VUlMYWJlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjZWY3ZGQKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy91aXZhbHVlcy9UZXN0VUlMYWJlbC5qYXZhCkBAIC0wLDAgKzEsODcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMudWl2YWx1ZXM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5uZXQuVVJMOworCitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlTWFuYWdlclRlc3RDYXNlOworCisKK3B1YmxpYyBjbGFzcyBUZXN0VUlMYWJlbCBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7CisKKwkvKioKKwkgKiBUZXN0IHRoZSBnZXRGZWF0dXJlcygpCisJICovCisJcHVibGljIFRlc3RVSUxhYmVsKFN0cmluZyBhcmcwKSB7CisJCXN1cGVyKGFyZzApOworCX0KKwkKKwkKKwkvKioKKwkgKiBNZXRob2QgdGVzdEhUVFBTaXRlLgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJcHVibGljIHZvaWQgdGVzdFVwZGF0ZU1hbmFnZXJTaXRlKCkgdGhyb3dzIEV4Y2VwdGlvbnsgCisJCQorCQlJU2l0ZSByZW1vdGVTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShuZXcgVVJMKCJodHRwIixnZXRIdHRwSG9zdCgpLGdldEh0dHBQb3J0KCksYnVuZGxlLmdldFN0cmluZygiSFRUUF9QQVRIXzIiKSksbnVsbCk7CisJCUlDYXRlZ29yeVtdIGNhdGVnb3JpZXMgPSByZW1vdGVTaXRlLmdldENhdGVnb3JpZXMoKTsKKwkJZm9yIChpbnQgaSA9MDsgaTxjYXRlZ29yaWVzLmxlbmd0aDsgaSsrKXsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ2F0ZWdvcnkgLT4iK2NhdGVnb3JpZXNbaV0uZ2V0TGFiZWwoKSsiOiIrY2F0ZWdvcmllc1tpXS5nZXROYW1lKCkpOworCQl9CisJCVN5c3RlbS5vdXQucHJpbnRsbihyZW1vdGVTaXRlLmdldERlc2NyaXB0aW9uKCkuZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKSk7CisJCUlGZWF0dXJlUmVmZXJlbmNlW10gcmVtb3RlRmVhdHVyZXMgPSByZW1vdGVTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7CisJCWlmIChyZW1vdGVGZWF0dXJlcz09bnVsbCB8fCByZW1vdGVGZWF0dXJlcy5sZW5ndGg9PTApIGZhaWwoIk5vIGZlYXR1cmUgYXZhaWxhYmxlIGZvciB0ZXN0aW5nIik7CQkKKwkJZm9yIChpbnQgaT0wO2k8cmVtb3RlRmVhdHVyZXMubGVuZ3RoO2krKyl7CisJCQlJRmVhdHVyZSBmZWF0dXJlID0gcmVtb3RlRmVhdHVyZXNbaV0uZ2V0RmVhdHVyZShudWxsKTsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiZmVhdHVyZToiK2ZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpKyItPiIrZmVhdHVyZS5nZXRMYWJlbCgpKTsKKwkJCXByaW50KGZlYXR1cmUuZ2V0TGljZW5zZSgpLCJMaWNlbnNlIik7CisJCQlwcmludChmZWF0dXJlLmdldENvcHlyaWdodCgpLCJDb3B5cmlnaHQiKTsJCQkKKwkJCXByaW50KGZlYXR1cmUuZ2V0RGVzY3JpcHRpb24oKSwiRGVzY3JpcHRpb24iKTsJCQkJCisJCQkKKwkJCS8vIGNoZWNrIHRoYXQgaXQgZG93bmxvYWRzIHRoZSBmZWF0dXJlLmphciB1bmRlciB0aGUgY292ZXIKKwkJCS8vIGFuZCB1bnBhY2sgaXQKKwkJCQorCQkJVVJMIHVybCA9IGZlYXR1cmUuZ2V0TGljZW5zZSgpLmdldFVSTCgpOworCQkJaWYgKHVybCE9bnVsbCl7CisJCQkJYXNzZXJ0VHJ1ZSgobmV3IEZpbGUodXJsLmdldEZpbGUoKSkpLmV4aXN0cygpKTsKKwkJCX0KKworCQkJdXJsID0gZmVhdHVyZS5nZXRDb3B5cmlnaHQoKS5nZXRVUkwoKTsKKwkJCWlmICh1cmwhPW51bGwpeworCQkJCWFzc2VydFRydWUoKG5ldyBGaWxlKHVybC5nZXRGaWxlKCkpKS5leGlzdHMoKSk7CisJCQl9CisJCQkKKwkJCXVybCA9IGZlYXR1cmUuZ2V0RGVzY3JpcHRpb24oKS5nZXRVUkwoKTsKKwkJCWlmICh1cmwhPW51bGwpeworCQkJCWFzc2VydFRydWUoKG5ldyBGaWxlKHVybC5nZXRGaWxlKCkpKS5leGlzdHMoKSk7CisJCQl9CisJCQkKKwkJfQorCX0KKwkKKwkKKwkvKioKKwkgKiBNZXRob2QgcHJpbnQuCisJICogQHBhcmFtIGluZm8KKwkgKiBAcGFyYW0gdGV4dAorCSAqLworCXByaXZhdGUgdm9pZCBwcmludChJVVJMRW50cnkgaW5mbywgU3RyaW5nIHRleHQpeworCQlTeXN0ZW0ub3V0LnByaW50KCItPiIrdGV4dCsiOiIpOworCQlpZiAoaW5mby5nZXRVUkwoKSE9bnVsbCkgCisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIjwiK2luZm8uZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKSsiPiIpOworCQllbHNlIAorCQkJU3lzdGVtLm91dC5wcmludGxuKGluZm8uZ2V0QW5ub3RhdGlvbigpKTsKKwl9Cit9IAorCisKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvU2l0ZSB3aXRoIHNwYWNlL2ZlYXR1cmVzIHNwYWNlL2hlbHBGZWF0dXJlLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvU2l0ZSB3aXRoIHNwYWNlL2ZlYXR1cmVzIHNwYWNlL2hlbHBGZWF0dXJlLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTllMDJjCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9TaXRlIHdpdGggc3BhY2UvZmVhdHVyZXMgc3BhY2UvaGVscEZlYXR1cmUuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvU2l0ZSB3aXRoIHNwYWNlL2ZlYXR1cmVzIHNwYWNlL3NwYWNlIGZlYXR1cmUuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9TaXRlIHdpdGggc3BhY2UvZmVhdHVyZXMgc3BhY2Uvc3BhY2UgZmVhdHVyZS5qYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFhNmQ1NQotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvU2l0ZSB3aXRoIHNwYWNlL2ZlYXR1cmVzIHNwYWNlL3NwYWNlIGZlYXR1cmUuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvU2l0ZSB3aXRoIHNwYWNlL2luZm8vaW1nL3RvcF90aXRsc20uZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9TaXRlIHdpdGggc3BhY2UvaW5mby9pbWcvdG9wX3RpdGxzbS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkxN2JiNgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvU2l0ZSB3aXRoIHNwYWNlL2luZm8vaW1nL3RvcF90aXRsc20uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvU2l0ZSB3aXRoIHNwYWNlL2luZm8vaW1nL3dlbF9tbC5qcGcgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1NpdGUgd2l0aCBzcGFjZS9pbmZvL2ltZy93ZWxfbWwuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxZTMzZGYKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1NpdGUgd2l0aCBzcGFjZS9pbmZvL2ltZy93ZWxfbWwuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvU2l0ZSB3aXRoIHNwYWNlL2luZm8vc2l0ZUluZm8uaHRtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvU2l0ZSB3aXRoIHNwYWNlL2luZm8vc2l0ZUluZm8uaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDY1YWEzCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9TaXRlIHdpdGggc3BhY2UvaW5mby9zaXRlSW5mby5odG1sCkBAIC0wLDAgKzEsNjMgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPg0KKzxoZWFkPg0KKzwvaGVhZD4NCisgIDxib2R5Pg0KKzxpbWcgc3JjPSJpbWcvdG9wX3RpdGxzbS5naWYiIGFsdD0iIiB3aWR0aD0iNDYwIiBoZWlnaHQ9IjUwIj4NCis8YnI+DQorPGJyPg0KKyAgICAgSXQgc3RhcnRlZCB3aXRoIFNtYWxsdGFsazxicj4NCisgICAgT1RJIGhhcyBiZWVuIGJ1aWxkaW5nIHRvb2xzIGZvciBwbGF0Zm9ybS1pbmRlcGVuZGVudCBPTyBkZXZlbG9wbWVudCBzaW5jZQ0KKyAgMTk4OC4gT3VyIEVOVlkmcmVnOyB0ZWNobm9sb2d5IGZpcnN0IGJyb3VnaHQgY29sbGFib3JhdGl2ZSBzb2Z0d2FyZSBkZXZlbG9wbWVudCwNCisgIHZlcnNpb24gbWFuYWdlbWVudCBhbmQgc2hhcmVkIHJlcG9zaXRvcmllcyB0byBTbWFsbHRhbGsuIElCTSBpcyBvbmUgb2YNCittYW55ICAgY29tcGFuaWVzIHRvIGxpY2Vuc2UgRU5WWSwgd2hpY2ggY29udGludWVzIHRvIGJlIHRoZSBmb3VuZGF0aW9uIG9mDQorVmlzdWFsQWdlJnJlZzsgICBTbWFsbHRhbGsuPGJyPg0KKzxicj4NCis8YnI+DQorPGJyPg0KKyAgICAgIE5leHQgY2FtZSBKYXZhJiM4NDgyOzxicj4NCisgICAgQmVjYXVzZSBvZiBvdXIgZXhwZXJ0aXNlIGluIE9PIHRlY2hub2xvZ3ksIElCTSB0dXJuZWQgdG8gT1RJIGZvciBhIG5leHQtZ2VuZXJhdGlvbg0KKyAgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgZm9yIEphdmEuIFRoZSByZXN1bHQgaXMgVmlzdWFsQWdlIGZvciBKYXZhLCB3aGljaA0KKyAgY29udGludWVzIHRvIHdpbiBhd2FyZHMgZm9yIGl0cyBpbm5vdmF0aXZlIElERSBhbmQgdGVhbSBzdXBwb3J0LiBJbmZvV29ybGQNCisgIGhhcyBjaG9zZW4gVmlzdWFsQWdlIGZvciBKYXZhIGFzIGRldmVsb3BtZW50IHRvb2wgb2YgdGhlIHllYXIgLSB5ZWFyIGFmdGVyDQorICB5ZWFyIGFmdGVyIHllYXIhPGJyPg0KKzxicj4NCis8YnI+DQorPGJyPg0KKyAgICAgIFRoZW4gcGVydmFzaXZlIGNvbXB1dGluZzxicj4NCisgICAgT1RJIGNvbnRpbnVlcyBpdHMgZGV2ZWxvcG1lbnQgb2YgSUJNJ3MgVmlzdWFsQWdlIE1pY3JvIEVkaXRpb24sIGEgc3RhdGUtb2YtdGhlLWFydA0KKyAgcGxhdGZvcm0gZm9yIGNvbGxhYm9yYXRpdmUgZGV2ZWxvcG1lbnQgb2YgZW1iZWRkZWQgYXBwbGljYXRpb25zIGFuZCBzeXN0ZW1zDQorICB0aGF0IGFyZSB2ZXJ5IGxlYW4uIEFzIHRoZSBzdGVhZHkgc3RyZWFtIG9mIHByZXNzIHJlbGVhc2VzIGF0dGVzdHMsIFZpc3VhbEFnZQ0KKyAgTWljcm8gRWRpdGlvbiBpcyBhbHJlYWR5IGxpY2Vuc2VkIHRvIHRoZSBsZWFkaW5nIG1pY3JvY2hpcCBtYW51ZmFjdHVyZXJzLA0KKyAgbWljcm9rZXJuZWwgZGV2ZWxvcGVycywgYW5kIHByb2R1Y2VycyBvZiBoYW5kaGVsZCBhbmQgY29uc3VtZXIgZGV2aWNlcy48YnI+DQorPGJyPg0KKzxicj4NCis8YnI+DQorICAgICAgTm93IGl0J3MgRWNsaXBzZTxicj4NCisgICAgT1RJIGhhcyBidWlsdCB0aGUgbmV4dCBnZW5lcmF0aW9uIElCTSBhcHBsaWNhdGlvbiBkZXZlbG9wbWVudCB0b29scyBwbGF0Zm9ybS4NCisgIEVjbGlwc2UgaXMgYSBraW5kIG9mIHVuaXZlcnNhbCB0b29sIHBsYXRmb3JtIC0gYW4gb3BlbiBleHRlbnNpYmxlIElERSBmb3INCisgIGFueXRoaW5nIGFuZCBub3RoaW5nIGluIHBhcnRpY3VsYXIuIFRoZSByZWFsIHZhbHVlIGNvbWVzIGZyb20gdG9vbCBwbHVnLWlucw0KKyAgdGhhdCAidGVhY2giIEVjbGlwc2UgaG93IHRvIHdvcmsgd2l0aCB0aGluZ3MgLSBqYXZhIGZpbGVzLCB3ZWIgY29udGVudCwNCitncmFwaGljcywgIHZpZGVvIC0gYWxtb3N0IGFueXRoaW5nIHlvdSBjYW4gaW1hZ2luZS4gRWNsaXBzZSBhbGxvd3MgeW91IHRvDQoraW5kZXBlbmRlbnRseSAgZGV2ZWxvcCB0b29scyB0aGF0IGludGVncmF0ZSB3aXRoIG90aGVyIHBlb3BsZSdzIHRvb2xzIHNvDQorc2VhbWxlc3NseSB5b3Ugd29uJ3Qga25vdyB3aGVyZSBvbmUgdG9vbCBlbmRzIGFuZCBhbm90aGVyIHN0YXJ0cy4gVGhlIElCTQ0KK3N1cHBvcnRlZCB2ZXJzaW9uIG9mIHRoaXMgdGVjaG5vbG9neSwgV2ViU3BoZXJlIFN0dWRpbyBXb3JrYmVuY2gsIHdpbGwgYmUNCit0aGUgY29yZSBvZiB0aGUgbmV4dCAgZ2VuZXJhdGlvbiBvZiBJQk0gYW5kIElCTSBCdXNpbmVzcyBQYXJ0bmVyIGUtYnVzaW5lc3MNCit0b29scyBvcHRpbWl6ZWQgZm9yICB0aGUgV2ViU3BoZXJlIHNvZnR3YXJlIHBsYXRmb3JtLjxicj4NCis8YnI+DQorPGJyPg0KKzxicj4NCisgICAgICBTbyB3aGF0J3MgbmV4dD88YnI+DQorICAgIE9USSBjb250aW51ZXMgdG8gZGVsaXZlciBvYmplY3Qtb3JpZW50ZWQgdGVjaG5vbG9neSB0aGF0IHNjYWxlcyBhY3Jvc3MNCisgcGxhdGZvcm1zLCAgYWNyb3NzIHRlYW1zIGFuZCBhY3Jvc3MgcHJvamVjdCBzaXplLiBGcm9tIGEgbWFpbmZyYW1lIHRvIGENCit3YXRjaCAgLSB3ZSdyZSAgY2xvc2luZyBpbiBvbiB0aGF0IHZpc2lvbi48YnI+DQorPGJyPg0KKzxpbWcgc3JjPSJpbWcvd2VsX21sLmpwZyIgd2lkdGg9IjQ2MCIgaGVpZ2h0PSI0NjAiIGFsdD0iIj4NCis8YnI+DQorPGJyPg0KKzxicj4NCis8YnI+DQorPGJyPg0KKzxicj4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvU2l0ZSB3aXRoIHNwYWNlL2luc3RhbGwvZmVhdHVyZXMgc3BhY2UvZmVhdHVyZTMvZmVhdHVyZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1NpdGUgd2l0aCBzcGFjZS9pbnN0YWxsL2ZlYXR1cmVzIHNwYWNlL2ZlYXR1cmUzL2ZlYXR1cmUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3NzQxZDkKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1NpdGUgd2l0aCBzcGFjZS9pbnN0YWxsL2ZlYXR1cmVzIHNwYWNlL2ZlYXR1cmUzL2ZlYXR1cmUueG1sCkBAIC0wLDAgKzEsMTEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQorPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUzIiBpbWFnZT0iZmVhdHVyZTEuZ2lmIiBsYWJlbD0iVGhpcmQgRmVhdHVyZSIgcHJvdmlkZXItbmFtZT0iU21hcnQgQ29tcGFueSIgdmVyc2lvbj0iMS4wLjAiID4NCisgIDxkZXNjcmlwdGlvbj5EZXNjcmlwdGlvbjwvZGVzY3JpcHRpb24+DQorICA8Y29weXJpZ2h0PmNvcHlyaWdodDwvY29weXJpZ2h0Pg0KKyAgPGxpY2Vuc2U+bGljZW5zZTwvbGljZW5zZT4NCisgIDx1cmw+DQorICAgIDx1cGRhdGUgbGFiZWw9IlVSTCB0byB1cGRhdGUgdGhlIGZlYXR1cmUiIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9wYXRoL2ZlYXR1cmUxLyIvPg0KKyAgICA8ZGlzY292ZXJ5IGxhYmVsPSJEaXNjb3ZlcnkgMSIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIi8+DQorICAgIDxkaXNjb3ZlcnkgbGFiZWw9IkRpc2NvdmVyeSAyIiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciLz4NCisgIDwvdXJsPg0KKzwvZmVhdHVyZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1NpdGUgd2l0aCBzcGFjZS9wbHVnaW5zIHNwYWNlL1BkZV9jb3JlLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvU2l0ZSB3aXRoIHNwYWNlL3BsdWdpbnMgc3BhY2UvUGRlX2NvcmUuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMDcyMTcKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1NpdGUgd2l0aCBzcGFjZS9wbHVnaW5zIHNwYWNlL1BkZV9jb3JlLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1NpdGUgd2l0aCBzcGFjZS9wbHVnaW5zIHNwYWNlL2hlbHAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9TaXRlIHdpdGggc3BhY2UvcGx1Z2lucyBzcGFjZS9oZWxwLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTg0ZjY2Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9TaXRlIHdpdGggc3BhY2UvcGx1Z2lucyBzcGFjZS9oZWxwLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1NpdGUgd2l0aCBzcGFjZS9wbHVnaW5zIHNwYWNlL2p1bml0XzMuNy5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1NpdGUgd2l0aCBzcGFjZS9wbHVnaW5zIHNwYWNlL2p1bml0XzMuNy5qYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc1ODdiMgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvU2l0ZSB3aXRoIHNwYWNlL3BsdWdpbnMgc3BhY2UvanVuaXRfMy43LmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1NpdGUgd2l0aCBzcGFjZS9zaXRlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvU2l0ZSB3aXRoIHNwYWNlL3NpdGUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1ZDRiYmYKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1NpdGUgd2l0aCBzcGFjZS9zaXRlLnhtbApAQCAtMCwwICsxLDIwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KKzxzaXRlPg0KKzxkZXNjcmlwdGlvbiB1cmw9ImluZm8vc2l0ZUluZm8uaHRtbCIvPg0KKyAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcyBzcGFjZS9oZWxwRmVhdHVyZS5qYXIiPg0KKyAgICA8Y2F0ZWdvcnkgbmFtZT0iZWNsaXBzZS9VTUwiLz4NCisgIDwvZmVhdHVyZT4NCisgIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMgc3BhY2Uvc3BhY2UgZmVhdHVyZS5qYXIiPg0KKyAgICA8Y2F0ZWdvcnkgbmFtZT0iZWNsaXBzZS9KMkVFIi8+DQorICA8L2ZlYXR1cmU+DQorDQorICA8YXJjaGl2ZSBwYXRoPSJwbHVnaW5zL29yZy5lY2xpcHNlLmhlbHBfMS4wLjAuamFyIiB1cmw9InBsdWdpbnMgc3BhY2UvaGVscC5qYXIiLz4NCisgIDxhcmNoaXZlIHBhdGg9InBsdWdpbnMvb3JnLmVjbGlwc2UucGRlLmNvcmVfMS4wLjAuamFyIiB1cmw9InBsdWdpbnMgc3BhY2UvUGRlX2NvcmUuamFyIi8+DQorICA8YXJjaGl2ZSBwYXRoPSJwbHVnaW5zL29yZy5qdW5pdF8zLjUuMC5qYXIiIHVybD0icGx1Z2lucyBzcGFjZS9qdW5pdF8zLjcuamFyIi8+DQorICA8YXJjaGl2ZSBwYXRoPSJwbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xIiB1cmw9InBsdWdpbnMgc3BhY2Uvb3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjFfMS4xLjEiLz4gIA0KKyAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iSUJNIFdTQUQgVG9vbHMiIG5hbWU9ImVjbGlwc2UiLz4NCisgIDxjYXRlZ29yeS1kZWYgbGFiZWw9IkoyRUUgdG9vbHMiIG5hbWU9ImVjbGlwc2UvSjJFRSIvPg0KKyAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iRUpCIFRvb2xzIiBuYW1lPSJlY2xpcHNlL0oyRUUvRUpCIi8+DQorICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJVTUwgdG9vbHMiIG5hbWU9ImVjbGlwc2UvVU1MIi8+DQorICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJNZXNzYWdpbmcgVG9vbHMiIG5hbWU9IkIyQiIvPiAgDQorPC9zaXRlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlci9mZWF0dXJlcy9oZWxwRmVhdHVyZS5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIvZmVhdHVyZXMvaGVscEZlYXR1cmUuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlYzY3ZDQKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIvZmVhdHVyZXMvaGVscEZlYXR1cmUuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wZGUuZmVhdHVyZV8xLjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGRlLmZlYXR1cmVfMS4wLjAuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3MGI0MGEKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGRlLmZlYXR1cmVfMS4wLjAuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlci9pbmZvL2ltZy90b3BfdGl0bHNtLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlci9pbmZvL2ltZy90b3BfdGl0bHNtLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTE3YmI2Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyL2luZm8vaW1nL3RvcF90aXRsc20uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlci9pbmZvL2ltZy93ZWxfbWwuanBnIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyL2luZm8vaW1nL3dlbF9tbC5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFlMzNkZgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlci9pbmZvL2ltZy93ZWxfbWwuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlci9pbmZvL3NpdGVJbmZvLmh0bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIvaW5mby9zaXRlSW5mby5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNjVhYTMKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIvaW5mby9zaXRlSW5mby5odG1sCkBAIC0wLDAgKzEsNjMgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KKzxodG1sPg0KKzxoZWFkPg0KKzwvaGVhZD4NCisgIDxib2R5Pg0KKzxpbWcgc3JjPSJpbWcvdG9wX3RpdGxzbS5naWYiIGFsdD0iIiB3aWR0aD0iNDYwIiBoZWlnaHQ9IjUwIj4NCis8YnI+DQorPGJyPg0KKyAgICAgSXQgc3RhcnRlZCB3aXRoIFNtYWxsdGFsazxicj4NCisgICAgT1RJIGhhcyBiZWVuIGJ1aWxkaW5nIHRvb2xzIGZvciBwbGF0Zm9ybS1pbmRlcGVuZGVudCBPTyBkZXZlbG9wbWVudCBzaW5jZQ0KKyAgMTk4OC4gT3VyIEVOVlkmcmVnOyB0ZWNobm9sb2d5IGZpcnN0IGJyb3VnaHQgY29sbGFib3JhdGl2ZSBzb2Z0d2FyZSBkZXZlbG9wbWVudCwNCisgIHZlcnNpb24gbWFuYWdlbWVudCBhbmQgc2hhcmVkIHJlcG9zaXRvcmllcyB0byBTbWFsbHRhbGsuIElCTSBpcyBvbmUgb2YNCittYW55ICAgY29tcGFuaWVzIHRvIGxpY2Vuc2UgRU5WWSwgd2hpY2ggY29udGludWVzIHRvIGJlIHRoZSBmb3VuZGF0aW9uIG9mDQorVmlzdWFsQWdlJnJlZzsgICBTbWFsbHRhbGsuPGJyPg0KKzxicj4NCis8YnI+DQorPGJyPg0KKyAgICAgIE5leHQgY2FtZSBKYXZhJiM4NDgyOzxicj4NCisgICAgQmVjYXVzZSBvZiBvdXIgZXhwZXJ0aXNlIGluIE9PIHRlY2hub2xvZ3ksIElCTSB0dXJuZWQgdG8gT1RJIGZvciBhIG5leHQtZ2VuZXJhdGlvbg0KKyAgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgZm9yIEphdmEuIFRoZSByZXN1bHQgaXMgVmlzdWFsQWdlIGZvciBKYXZhLCB3aGljaA0KKyAgY29udGludWVzIHRvIHdpbiBhd2FyZHMgZm9yIGl0cyBpbm5vdmF0aXZlIElERSBhbmQgdGVhbSBzdXBwb3J0LiBJbmZvV29ybGQNCisgIGhhcyBjaG9zZW4gVmlzdWFsQWdlIGZvciBKYXZhIGFzIGRldmVsb3BtZW50IHRvb2wgb2YgdGhlIHllYXIgLSB5ZWFyIGFmdGVyDQorICB5ZWFyIGFmdGVyIHllYXIhPGJyPg0KKzxicj4NCis8YnI+DQorPGJyPg0KKyAgICAgIFRoZW4gcGVydmFzaXZlIGNvbXB1dGluZzxicj4NCisgICAgT1RJIGNvbnRpbnVlcyBpdHMgZGV2ZWxvcG1lbnQgb2YgSUJNJ3MgVmlzdWFsQWdlIE1pY3JvIEVkaXRpb24sIGEgc3RhdGUtb2YtdGhlLWFydA0KKyAgcGxhdGZvcm0gZm9yIGNvbGxhYm9yYXRpdmUgZGV2ZWxvcG1lbnQgb2YgZW1iZWRkZWQgYXBwbGljYXRpb25zIGFuZCBzeXN0ZW1zDQorICB0aGF0IGFyZSB2ZXJ5IGxlYW4uIEFzIHRoZSBzdGVhZHkgc3RyZWFtIG9mIHByZXNzIHJlbGVhc2VzIGF0dGVzdHMsIFZpc3VhbEFnZQ0KKyAgTWljcm8gRWRpdGlvbiBpcyBhbHJlYWR5IGxpY2Vuc2VkIHRvIHRoZSBsZWFkaW5nIG1pY3JvY2hpcCBtYW51ZmFjdHVyZXJzLA0KKyAgbWljcm9rZXJuZWwgZGV2ZWxvcGVycywgYW5kIHByb2R1Y2VycyBvZiBoYW5kaGVsZCBhbmQgY29uc3VtZXIgZGV2aWNlcy48YnI+DQorPGJyPg0KKzxicj4NCis8YnI+DQorICAgICAgTm93IGl0J3MgRWNsaXBzZTxicj4NCisgICAgT1RJIGhhcyBidWlsdCB0aGUgbmV4dCBnZW5lcmF0aW9uIElCTSBhcHBsaWNhdGlvbiBkZXZlbG9wbWVudCB0b29scyBwbGF0Zm9ybS4NCisgIEVjbGlwc2UgaXMgYSBraW5kIG9mIHVuaXZlcnNhbCB0b29sIHBsYXRmb3JtIC0gYW4gb3BlbiBleHRlbnNpYmxlIElERSBmb3INCisgIGFueXRoaW5nIGFuZCBub3RoaW5nIGluIHBhcnRpY3VsYXIuIFRoZSByZWFsIHZhbHVlIGNvbWVzIGZyb20gdG9vbCBwbHVnLWlucw0KKyAgdGhhdCAidGVhY2giIEVjbGlwc2UgaG93IHRvIHdvcmsgd2l0aCB0aGluZ3MgLSBqYXZhIGZpbGVzLCB3ZWIgY29udGVudCwNCitncmFwaGljcywgIHZpZGVvIC0gYWxtb3N0IGFueXRoaW5nIHlvdSBjYW4gaW1hZ2luZS4gRWNsaXBzZSBhbGxvd3MgeW91IHRvDQoraW5kZXBlbmRlbnRseSAgZGV2ZWxvcCB0b29scyB0aGF0IGludGVncmF0ZSB3aXRoIG90aGVyIHBlb3BsZSdzIHRvb2xzIHNvDQorc2VhbWxlc3NseSB5b3Ugd29uJ3Qga25vdyB3aGVyZSBvbmUgdG9vbCBlbmRzIGFuZCBhbm90aGVyIHN0YXJ0cy4gVGhlIElCTQ0KK3N1cHBvcnRlZCB2ZXJzaW9uIG9mIHRoaXMgdGVjaG5vbG9neSwgV2ViU3BoZXJlIFN0dWRpbyBXb3JrYmVuY2gsIHdpbGwgYmUNCit0aGUgY29yZSBvZiB0aGUgbmV4dCAgZ2VuZXJhdGlvbiBvZiBJQk0gYW5kIElCTSBCdXNpbmVzcyBQYXJ0bmVyIGUtYnVzaW5lc3MNCit0b29scyBvcHRpbWl6ZWQgZm9yICB0aGUgV2ViU3BoZXJlIHNvZnR3YXJlIHBsYXRmb3JtLjxicj4NCis8YnI+DQorPGJyPg0KKzxicj4NCisgICAgICBTbyB3aGF0J3MgbmV4dD88YnI+DQorICAgIE9USSBjb250aW51ZXMgdG8gZGVsaXZlciBvYmplY3Qtb3JpZW50ZWQgdGVjaG5vbG9neSB0aGF0IHNjYWxlcyBhY3Jvc3MNCisgcGxhdGZvcm1zLCAgYWNyb3NzIHRlYW1zIGFuZCBhY3Jvc3MgcHJvamVjdCBzaXplLiBGcm9tIGEgbWFpbmZyYW1lIHRvIGENCit3YXRjaCAgLSB3ZSdyZSAgY2xvc2luZyBpbiBvbiB0aGF0IHZpc2lvbi48YnI+DQorPGJyPg0KKzxpbWcgc3JjPSJpbWcvd2VsX21sLmpwZyIgd2lkdGg9IjQ2MCIgaGVpZ2h0PSI0NjAiIGFsdD0iIj4NCis8YnI+DQorPGJyPg0KKzxicj4NCis8YnI+DQorPGJyPg0KKzxicj4NCis8L2JvZHk+DQorPC9odG1sPg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlci9wbHVnaW5zL1BkZV9jb3JlLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlci9wbHVnaW5zL1BkZV9jb3JlLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTA3MjE3Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyL3BsdWdpbnMvUGRlX2NvcmUuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlci9wbHVnaW5zL2hlbHAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyL3BsdWdpbnMvaGVscC5qYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU4NGY2NgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlci9wbHVnaW5zL2hlbHAuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlci9wbHVnaW5zL2p1bml0XzMuNy5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIvcGx1Z2lucy9qdW5pdF8zLjcuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3NTg3YjIKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIvcGx1Z2lucy9qdW5pdF8zLjcuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlci9zaXRlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlci9zaXRlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTVmZGE3Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyL3NpdGUueG1sCkBAIC0wLDAgKzEsMTggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQorPHNpdGUgPg0KKzxkZXNjcmlwdGlvbiB1cmw9ImluZm8vc2l0ZUluZm8uaHRtbCIvPg0KKyAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9oZWxwRmVhdHVyZS5qYXIiPg0KKyAgICA8Y2F0ZWdvcnkgbmFtZT0iZWNsaXBzZS9VTUwiLz4NCisgIDwvZmVhdHVyZT4NCisgIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UucGRlLmZlYXR1cmVfMS4wLjAuamFyIj4NCisgICAgPGNhdGVnb3J5IG5hbWU9ImVjbGlwc2UvSjJFRSIvPg0KKyAgPC9mZWF0dXJlPg0KKyAgPGFyY2hpdmUgcGF0aD0icGx1Z2lucy9vcmcuZWNsaXBzZS5oZWxwXzEuMC4wLmphciIgdXJsPSJwbHVnaW5zL2hlbHAuamFyIi8+DQorICA8YXJjaGl2ZSBwYXRoPSJwbHVnaW5zL29yZy5lY2xpcHNlLnBkZS5jb3JlXzEuMC4wLmphciIgdXJsPSJwbHVnaW5zL1BkZV9jb3JlLmphciIvPg0KKyAgPGFyY2hpdmUgcGF0aD0icGx1Z2lucy9vcmcuanVuaXRfMy41LjAuamFyIiB1cmw9InBsdWdpbnMvanVuaXRfMy43LmphciIvPg0KKyAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iSUJNIFdTQUQgVG9vbHMiIG5hbWU9ImVjbGlwc2UiLz4NCisgIDxjYXRlZ29yeS1kZWYgbGFiZWw9IkoyRUUgdG9vbHMiIG5hbWU9ImVjbGlwc2UvSjJFRSIvPg0KKyAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iRUpCIFRvb2xzIiBuYW1lPSJlY2xpcHNlL0oyRUUvRUpCIi8+DQorICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJVTUwgdG9vbHMiIG5hbWU9ImVjbGlwc2UvVU1MIi8+DQorICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJNZXNzYWdpbmcgVG9vbHMiIG5hbWU9IkIyQiIvPiAgDQorPC9zaXRlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvZmVhdHVyZXMvZmVhdHVyZXMyLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvZmVhdHVyZXMvZmVhdHVyZXMyLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWRmNzJjCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyMi9mZWF0dXJlcy9mZWF0dXJlczIuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvZmVhdHVyZXMvb3JnLmVjbGlwc2UudGVzdC5mZWF0dXJlXzEuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvZmVhdHVyZXMvb3JnLmVjbGlwc2UudGVzdC5mZWF0dXJlXzEuMC4wLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWFlZTNmCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyMi9mZWF0dXJlcy9vcmcuZWNsaXBzZS50ZXN0LmZlYXR1cmVfMS4wLjAuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvZmVhdHVyZXMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTFfMS4wLjQuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyMi9mZWF0dXJlcy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMV8xLjAuNC5qYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjUxNWZmNAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvZmVhdHVyZXMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTFfMS4wLjQuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvZmVhdHVyZXMvb3JnLmVjbGlwc2VfdGVzdF9mZWF0dXJlLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvZmVhdHVyZXMvb3JnLmVjbGlwc2VfdGVzdF9mZWF0dXJlLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmUzOGQzCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyMi9mZWF0dXJlcy9vcmcuZWNsaXBzZV90ZXN0X2ZlYXR1cmUuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvbmVzdGVkRmVhdHVyZVNpdGVUZXN0L2ZlYXR1cmVzL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmNoaWxkcmVuZmVhdHVyZV8yLjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL25lc3RlZEZlYXR1cmVTaXRlVGVzdC9mZWF0dXJlcy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5jaGlsZHJlbmZlYXR1cmVfMi4wLjAuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyMjY2NWMKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL25lc3RlZEZlYXR1cmVTaXRlVGVzdC9mZWF0dXJlcy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5jaGlsZHJlbmZlYXR1cmVfMi4wLjAuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvbmVzdGVkRmVhdHVyZVNpdGVUZXN0L2ZlYXR1cmVzL3Jvb3RmZWF0dXJlLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvbmVzdGVkRmVhdHVyZVNpdGVUZXN0L2ZlYXR1cmVzL3Jvb3RmZWF0dXJlLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTE5ODAzCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyMi9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QvZmVhdHVyZXMvcm9vdGZlYXR1cmUuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvbmVzdGVkRmVhdHVyZVNpdGVUZXN0L3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMV8zLjUuNi5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL25lc3RlZEZlYXR1cmVTaXRlVGVzdC9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjFfMy41LjYuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkOWY1YmMKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL25lc3RlZEZlYXR1cmVTaXRlVGVzdC9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjFfMy41LjYuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvbmVzdGVkRmVhdHVyZVNpdGVUZXN0L3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMl81LjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL25lc3RlZEZlYXR1cmVTaXRlVGVzdC9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjJfNS4wLjAuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiNGIwNGEKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL25lc3RlZEZlYXR1cmVTaXRlVGVzdC9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjJfNS4wLjAuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvbmVzdGVkRmVhdHVyZVNpdGVUZXN0L3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMl81LjAuMS5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL25lc3RlZEZlYXR1cmVTaXRlVGVzdC9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjJfNS4wLjEuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyMjA4ZmUKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL25lc3RlZEZlYXR1cmVTaXRlVGVzdC9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjJfNS4wLjEuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvbmVzdGVkRmVhdHVyZVNpdGVUZXN0L3NpdGUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyMi9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3Qvc2l0ZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IwOWM4NgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvbmVzdGVkRmVhdHVyZVNpdGVUZXN0L3NpdGUueG1sCkBAIC0wLDAgKzEsNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxzaXRlPgorICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL3Jvb3RmZWF0dXJlLmphciIgb3M9IioiLz4KKzwvc2l0ZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUyXzEuMC4wL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUyXzIuMi4yLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmVhdHVyZTJfMS4wLjAvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmVhdHVyZTJfMi4yLjIuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMGQ4ODIKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUyXzEuMC4wL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUyXzIuMi4yLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmVhdHVyZTEucGx1Z2luMV8xLjEuMS5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmVhdHVyZTEucGx1Z2luMV8xLjEuMS5qYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM5OTVkNQotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5mZWF0dXJlMS5wbHVnaW4xXzEuMS4xLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmVhdHVyZTIucGx1Z2luMl8yLjIuMi5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmVhdHVyZTIucGx1Z2luMl8yLjIuMi5qYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM5OTVkNQotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5mZWF0dXJlMi5wbHVnaW4yXzIuMi4yLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZHVtbXlfNy45LjguamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyMi9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmR1bW15XzcuOS44LmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjczN2Y2Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyMi9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmR1bW15XzcuOS44LmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMV8zLjUuNi5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMV8zLjUuNi5qYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI4NjkwZgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4xXzMuNS42LmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMl81LjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMl81LjAuMC5qYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBhNjEyZgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4yXzUuMC4wLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL3NpdGUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyMi9zaXRlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTdkOWIyCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyMi9zaXRlLnhtbApAQCAtMCwwICsxLDI0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KKzxzaXRlIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cyIgbmFtZT0iVGVzdHMiIHZlcnNpb249IjAuMC4xIj4NCisgIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UudGVzdC5mZWF0dXJlXzEuMC4wLmphciI+DQorICAgIDxjYXRlZ29yeSBuYW1lPSJjYXRlZ29yeTEiLz4NCisgIDwvZmVhdHVyZT4NCisgIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvZmVhdHVyZXMyLmphciI+DQorICAgIDxjYXRlZ29yeSBuYW1lPSJjYXRlZ29yeTEvc3ViY2F0MSIvPg0KKyAgICA8Y2F0ZWdvcnkgbmFtZT0iY2F0ZWdvcnkyIi8+DQorICA8L2ZlYXR1cmU+DQorICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxXzEuMC40LmphciI+DQorICAgIDxjYXRlZ29yeSBuYW1lPSJjYXRlZ29yeTEiLz4NCisgICAgPGNhdGVnb3J5IG5hbWU9ImNhdGVnb3J5MiIvPg0KKyAgPC9mZWF0dXJlPg0KKyAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZV90ZXN0X2ZlYXR1cmUuamFyIi8+DQorICA8ZmVhdHVyZSB1cmw9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUyXzEuMC4wL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUyXzIuMi4yLmphciI+DQorICAgIDxjYXRlZ29yeSBuYW1lPSJjYXRlZ29yeTEiLz4NCisgIDwvZmVhdHVyZT4NCisgIDxmZWF0dXJlIHVybD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmVhdHVyZTJfMS4wLjAvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmVhdHVyZTJfMi4yLjIuamFyIj4NCisgIDwvZmVhdHVyZT4NCisNCisgIDxjYXRlZ29yeS1kZWYgbmFtZT0iY2F0ZWdvcnkxL3N1YmNhdDEiIGxhYmVsPSJTcGVjaWFsIEZpeCIvPg0KKyAgPGNhdGVnb3J5LWRlZiBuYW1lPSJjYXRlZ29yeTEiIGxhYmVsPSIlZHJpdmVycyIvPg0KKyAgPGNhdGVnb3J5LWRlZiBuYW1lPSJjYXRlZ29yeTIiIGxhYmVsPSIlc2VjdXJpdHkiLz4NCis8L3NpdGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlL2ZlYXR1cmVzL2NvbS5leGFtcGxlLmJ1bmRsZS5mZWF0dXJlXzEuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZS9mZWF0dXJlcy9jb20uZXhhbXBsZS5idW5kbGUuZmVhdHVyZV8xLjAuMC5qYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBkMzU4OQotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZS9mZWF0dXJlcy9jb20uZXhhbXBsZS5idW5kbGUuZmVhdHVyZV8xLjAuMC5qYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlL3BsdWdpbnMvY29tLmV4YW1wbGUuYnVkbGUuZnJhZ21lbnQudWlfMS4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlL3BsdWdpbnMvY29tLmV4YW1wbGUuYnVkbGUuZnJhZ21lbnQudWlfMS4wLjAuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3OWQyY2QKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGUvcGx1Z2lucy9jb20uZXhhbXBsZS5idWRsZS5mcmFnbWVudC51aV8xLjAuMC5qYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlL3BsdWdpbnMvY29tLmV4YW1wbGUuYnVuZGxlLmZyYWdtZW50XzEuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZS9wbHVnaW5zL2NvbS5leGFtcGxlLmJ1bmRsZS5mcmFnbWVudF8xLjAuMC5qYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRiMDJiYgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZS9wbHVnaW5zL2NvbS5leGFtcGxlLmJ1bmRsZS5mcmFnbWVudF8xLjAuMC5qYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlL3BsdWdpbnMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi51aV8yLjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGUvcGx1Z2lucy9jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luLnVpXzIuMC4wLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmVjMDJjCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlL3BsdWdpbnMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi51aV8yLjAuMC5qYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlL3BsdWdpbnMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbl8xLjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGUvcGx1Z2lucy9jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luXzEuMC4wLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjFiNjkzCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlL3BsdWdpbnMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbl8xLjAuMC5qYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlL3NpdGUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlL3NpdGUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhYjEzMzIKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGUvc2l0ZS54bWwKQEAgLTAsMCArMSw3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHNpdGU+CisgICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL2NvbS5leGFtcGxlLmJ1bmRsZS5mZWF0dXJlXzEuMC4wLmphciIgaWQ9ImNvbS5leGFtcGxlLmJ1bmRsZS5mZWF0dXJlIiB2ZXJzaW9uPSIxLjAuMCI+CisgICAgICA8Y2F0ZWdvcnkgbmFtZT0iQnVuZGxlRmVhdHVyZSIvPgorICAgPC9mZWF0dXJlPgorICAgPGNhdGVnb3J5LWRlZiBuYW1lPSJCdW5kbGVGZWF0dXJlIiBsYWJlbD0iRmVhdHVyZSB3aXRoIEJ1bmRsZXMiLz4KKzwvc2l0ZT4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idWRsZS5mcmFnbWVudC51aS8uY2xhc3NwYXRoIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1ZGxlLmZyYWdtZW50LnVpLy5jbGFzc3BhdGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY1YWMwNgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idWRsZS5mcmFnbWVudC51aS8uY2xhc3NwYXRoCkBAIC0wLDAgKzEsNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxjbGFzc3BhdGg+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Cis8L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idWRsZS5mcmFnbWVudC51aS8ucHJvamVjdCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idWRsZS5mcmFnbWVudC51aS8ucHJvamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTIwOTAzCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1ZGxlLmZyYWdtZW50LnVpLy5wcm9qZWN0CkBAIC0wLDAgKzEsMzIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdERlc2NyaXB0aW9uPgorCTxuYW1lPmNvbS5leGFtcGxlLmJ1ZGxlLmZyYWdtZW50LnVpPC9uYW1lPgorCTxjb21tZW50PjwvY29tbWVudD4KKwk8cHJvamVjdHM+CisJCTxwcm9qZWN0PmNvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW48L3Byb2plY3Q+CisJCTxwcm9qZWN0PmNvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4udWk8L3Byb2plY3Q+CisJCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmNvcmUucnVudGltZTwvcHJvamVjdD4KKwkJPHByb2plY3Q+b3JnLmVjbGlwc2UudWk8L3Byb2plY3Q+CisJPC9wcm9qZWN0cz4KKwk8YnVpbGRTcGVjPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJPC9idWlsZFNwZWM+CisJPG5hdHVyZXM+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KKwk8L25hdHVyZXM+Cis8L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idWRsZS5mcmFnbWVudC51aS8udGVtcGxhdGUgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVkbGUuZnJhZ21lbnQudWkvLnRlbXBsYXRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzYmNkNDEKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVkbGUuZnJhZ21lbnQudWkvLnRlbXBsYXRlCkBAIC0wLDAgKzEsNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCis8Zm9ybT4NCisgICA8cC8+PHA+PGI+VGlwcyBvbiB3b3JraW5nIHdpdGggdGhpcyBwbHVnLWluIHByb2plY3Q8L2I+PC9wPjxsaT5Gb3IgdGhlIHZpZXcgb2YgdGhlIG5ldyBwbHVnLWluIGF0IGEgZ2xhbmNlLCBnbyB0byB0aGUgPGltZyBocmVmPSJwYWdlSW1hZ2UiLz48YSBocmVmPSJPdmVydmlld1BhZ2UiPk92ZXJ2aWV3PC9hPi48L2xpPjxsaT5Zb3UgY2FuIHRlc3QgdGhlIGNvbnRyaWJ1dGlvbnMgb2YgdGhpcyBwbHVnLWluIGJ5IGxhdW5jaGluZyBhbm90aGVyIGluc3RhbmNlIG9mIHRoZSB3b3JrYmVuY2guIE9uIHRoZSA8Yj5SdW48L2I+IG1lbnUsIGNsaWNrIDxiPlJ1biBBczwvYj4gYW5kIGNob29zZSA8aW1nIGhyZWY9InJ1blRpbWVXb3JrYmVuY2hJbWFnZSIvPjxhIGhyZWY9ImFjdGlvbi5ydW4iPlJ1bi10aW1lIFdvcmtiZW5jaDwvYT4gZnJvbSB0aGUgYXZhaWxhYmxlIGNob2ljZXMuPC9saT48bGk+WW91IGNhbiBhZGQgbW9yZSBmdW5jdGlvbmFsaXR5IHRvIHRoaXMgcGx1Zy1pbiBieSBhZGRpbmcgZXh0ZW5zaW9ucyB1c2luZyB0aGUgPGEgaHJlZj0iYWN0aW9uLm5ld0V4dGVuc2lvbiI+TmV3IEV4dGVuc2lvbiBXaXphcmQ8L2E+LjwvbGk+PGxpPlRoZSBwbHVnLWluIHByb2plY3QgY29udGFpbnMgSmF2YSBjb2RlIHRoYXQgeW91IGNhbiBkZWJ1Zy4gUGxhY2UgYnJlYWtwb2ludHMgaW4gSmF2YSBjbGFzc2VzLiBPbiB0aGUgPGI+UnVuPC9iPiBtZW51LCBzZWxlY3QgPGI+RGVidWcgQXM8L2I+IGFuZCBjaG9vc2UgPGltZyBocmVmPSJydW5UaW1lV29ya2JlbmNoSW1hZ2UiLz48YSBocmVmPSJhY3Rpb24uZGVidWciPlJ1bi10aW1lIFdvcmtiZW5jaDwvYT4gZnJvbSB0aGUgYXZhaWxhYmxlIGNob2ljZXMuPC9saT4NCis8L2Zvcm0+DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1ZGxlLmZyYWdtZW50LnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1ZGxlLmZyYWdtZW50LnVpL01FVEEtSU5GL01BTklGRVNULk1GCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhZDY4NmYKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVkbGUuZnJhZ21lbnQudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTAsMCArMSw4IEBACitHZW5lcmF0ZWQtZnJvbTogMTA3NzA2Mjk3NDQ1MQ0KK0J1bmRsZS1OYW1lOiBVaSBGcmFnbWVudA0KK0J1bmRsZS1WZXJzaW9uOiAxLjAuMA0KK0J1bmRsZS1TeW1ib2xpY05hbWU6IGNvbS5leGFtcGxlLmJ1ZGxlLmZyYWdtZW50LnVpDQorQnVuZGxlLVZlbmRvcjogRWNsaXBzZS5vcmcNCitCdW5kbGUtQ2xhc3NQYXRoOiB1aS5qYXINCitMZWdhY3k6IHRydWUNCitGcmFnbWVudC1Ib3N0OiBjb20uZXhhbXBsZS5idW5kbGUucGx1Z2luLnVpOyBidW5kbGUtdmVyc2lvbj0yLjAuMA0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idWRsZS5mcmFnbWVudC51aS9mcmFnbWVudC54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVkbGUuZnJhZ21lbnQudWkvZnJhZ21lbnQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjNDg0YjMKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVkbGUuZnJhZ21lbnQudWkvZnJhZ21lbnQueG1sCkBAIC0wLDAgKzEsMTggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Cis8ZnJhZ21lbnQKKyAgIGlkPSJjb20uZXhhbXBsZS5idWRsZS5mcmFnbWVudC51aSIKKyAgIG5hbWU9IlVpIEZyYWdtZW50IgorICAgdmVyc2lvbj0iMS4wLjAiCisgICBwcm92aWRlci1uYW1lPSJFY2xpcHNlLm9yZyIKKyAgIHBsdWdpbi1pZD0iY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi51aSIKKyAgIHBsdWdpbi12ZXJzaW9uPSIyLjAuMCIKKyAgIG1hdGNoPSJncmVhdGVyT3JFcXVhbCI+CisKKyAgIDxydW50aW1lPgorICAgICAgPGxpYnJhcnkgbmFtZT0idWkuamFyIj4KKyAgICAgICAgIDxleHBvcnQgbmFtZT0iKiIvPgorICAgICAgPC9saWJyYXJ5PgorICAgPC9ydW50aW1lPgorCis8L2ZyYWdtZW50PgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5mZWF0dXJlLy5wcm9qZWN0IGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5mZWF0dXJlLy5wcm9qZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmM2U0YmMKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLmZlYXR1cmUvLnByb2plY3QKQEAgLTAsMCArMSwxNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxwcm9qZWN0RGVzY3JpcHRpb24+CisJPG5hbWU+Y29tLmV4YW1wbGUuYnVuZGxlLmZlYXR1cmU8L25hbWU+CisJPGNvbW1lbnQ+PC9jb21tZW50PgorCTxwcm9qZWN0cz4KKwk8L3Byb2plY3RzPgorCTxidWlsZFNwZWM+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCTwvYnVpbGRTcGVjPgorCTxuYXR1cmVzPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+CisJPC9uYXR1cmVzPgorPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLmZlYXR1cmUvZmVhdHVyZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLmZlYXR1cmUvZmVhdHVyZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI0MTA0MwotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUuZmVhdHVyZS9mZWF0dXJlLnhtbApAQCAtMCwwICsxLDQ1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGZlYXR1cmUKKyAgICAgIGlkPSJjb20uZXhhbXBsZS5idW5kbGUuZmVhdHVyZSIKKyAgICAgIGxhYmVsPSJjb20uZXhhbXBsZS5idW5kbGUuZmVhdHVyZSIKKyAgICAgIHZlcnNpb249IjEuMC4wIgorICAgICAgcHJvdmlkZXItbmFtZT0iRWNsaXBzZS5vcmciPgorCisgICA8bGljZW5zZT4KKyAgICAgIEEgcGxhY2Vob2xkZXIgbGljZW5zZSBmb3IgdGhlIGZlYXR1cmUuCisgICA8L2xpY2Vuc2U+CisKKyAgIDxpbnN0YWxsLWhhbmRsZXIvPgorCisgICA8cmVxdWlyZXM+CisgICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4KKyAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4KKyAgIDwvcmVxdWlyZXM+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJjb20uZXhhbXBsZS5idW5kbGUucGx1Z2luIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjEuMC4wIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJjb20uZXhhbXBsZS5idWRsZS5mcmFnbWVudC51aSIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIxLjAuMCIKKyAgICAgICAgIGZyYWdtZW50PSJ0cnVlIi8+CisKKyAgIDxwbHVnaW4KKyAgICAgICAgIGlkPSJjb20uZXhhbXBsZS5idW5kbGUuZnJhZ21lbnQiCisgICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICAgdmVyc2lvbj0iMS4wLjAiCisgICAgICAgICBmcmFnbWVudD0idHJ1ZSIvPgorCisgICA8cGx1Z2luCisgICAgICAgICBpZD0iY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi51aSIKKyAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgICB2ZXJzaW9uPSIyLjAuMCIvPgorCis8L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLmZyYWdtZW50Ly5jbGFzc3BhdGggYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLmZyYWdtZW50Ly5jbGFzc3BhdGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY1YWMwNgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUuZnJhZ21lbnQvLmNsYXNzcGF0aApAQCAtMCwwICsxLDcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8Y2xhc3NwYXRoPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgorPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLmZyYWdtZW50Ly5wcm9qZWN0IGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5mcmFnbWVudC8ucHJvamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmQwYzIxCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5mcmFnbWVudC8ucHJvamVjdApAQCAtMCwwICsxLDMxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHByb2plY3REZXNjcmlwdGlvbj4KKwk8bmFtZT5jb20uZXhhbXBsZS5idW5kbGUuZnJhZ21lbnQ8L25hbWU+CisJPGNvbW1lbnQ+PC9jb21tZW50PgorCTxwcm9qZWN0cz4KKwkJPHByb2plY3Q+Y29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbjwvcHJvamVjdD4KKwkJPHByb2plY3Q+b3JnLmVjbGlwc2UuY29yZS5ydW50aW1lPC9wcm9qZWN0PgorCQk8cHJvamVjdD5vcmcuZWNsaXBzZS51aTwvcHJvamVjdD4KKwk8L3Byb2plY3RzPgorCTxidWlsZFNwZWM+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwk8L2J1aWxkU3BlYz4KKwk8bmF0dXJlcz4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgorCTwvbmF0dXJlcz4KKzwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5mcmFnbWVudC8udGVtcGxhdGUgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLmZyYWdtZW50Ly50ZW1wbGF0ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2JjZDQxCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5mcmFnbWVudC8udGVtcGxhdGUKQEAgLTAsMCArMSw0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KKzxmb3JtPg0KKyAgIDxwLz48cD48Yj5UaXBzIG9uIHdvcmtpbmcgd2l0aCB0aGlzIHBsdWctaW4gcHJvamVjdDwvYj48L3A+PGxpPkZvciB0aGUgdmlldyBvZiB0aGUgbmV3IHBsdWctaW4gYXQgYSBnbGFuY2UsIGdvIHRvIHRoZSA8aW1nIGhyZWY9InBhZ2VJbWFnZSIvPjxhIGhyZWY9Ik92ZXJ2aWV3UGFnZSI+T3ZlcnZpZXc8L2E+LjwvbGk+PGxpPllvdSBjYW4gdGVzdCB0aGUgY29udHJpYnV0aW9ucyBvZiB0aGlzIHBsdWctaW4gYnkgbGF1bmNoaW5nIGFub3RoZXIgaW5zdGFuY2Ugb2YgdGhlIHdvcmtiZW5jaC4gT24gdGhlIDxiPlJ1bjwvYj4gbWVudSwgY2xpY2sgPGI+UnVuIEFzPC9iPiBhbmQgY2hvb3NlIDxpbWcgaHJlZj0icnVuVGltZVdvcmtiZW5jaEltYWdlIi8+PGEgaHJlZj0iYWN0aW9uLnJ1biI+UnVuLXRpbWUgV29ya2JlbmNoPC9hPiBmcm9tIHRoZSBhdmFpbGFibGUgY2hvaWNlcy48L2xpPjxsaT5Zb3UgY2FuIGFkZCBtb3JlIGZ1bmN0aW9uYWxpdHkgdG8gdGhpcyBwbHVnLWluIGJ5IGFkZGluZyBleHRlbnNpb25zIHVzaW5nIHRoZSA8YSBocmVmPSJhY3Rpb24ubmV3RXh0ZW5zaW9uIj5OZXcgRXh0ZW5zaW9uIFdpemFyZDwvYT4uPC9saT48bGk+VGhlIHBsdWctaW4gcHJvamVjdCBjb250YWlucyBKYXZhIGNvZGUgdGhhdCB5b3UgY2FuIGRlYnVnLiBQbGFjZSBicmVha3BvaW50cyBpbiBKYXZhIGNsYXNzZXMuIE9uIHRoZSA8Yj5SdW48L2I+IG1lbnUsIHNlbGVjdCA8Yj5EZWJ1ZyBBczwvYj4gYW5kIGNob29zZSA8aW1nIGhyZWY9InJ1blRpbWVXb3JrYmVuY2hJbWFnZSIvPjxhIGhyZWY9ImFjdGlvbi5kZWJ1ZyI+UnVuLXRpbWUgV29ya2JlbmNoPC9hPiBmcm9tIHRoZSBhdmFpbGFibGUgY2hvaWNlcy48L2xpPg0KKzwvZm9ybT4NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLmZyYWdtZW50L01FVEEtSU5GL01BTklGRVNULk1GIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5mcmFnbWVudC9NRVRBLUlORi9NQU5JRkVTVC5NRgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDY2NDgwCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5mcmFnbWVudC9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMCwwICsxLDggQEAKK0dlbmVyYXRlZC1mcm9tOiAxMDc3MDYyOTA5NDg3DQorQnVuZGxlLU5hbWU6IEZyYWdtZW50IEZyYWdtZW50DQorQnVuZGxlLVZlcnNpb246IDEuMC4wDQorQnVuZGxlLVN5bWJvbGljTmFtZTogY29tLmV4YW1wbGUuYnVuZGxlLmZyYWdtZW50DQorQnVuZGxlLVZlbmRvcjogRWNsaXBzZS5vcmcNCitCdW5kbGUtQ2xhc3NQYXRoOiBmcmFnbWVudC5qYXINCitMZWdhY3k6IHRydWUNCitGcmFnbWVudC1Ib3N0OiBjb20uZXhhbXBsZS5idW5kbGUucGx1Z2luOyBidW5kbGUtdmVyc2lvbj0xLjAuMA0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUuZnJhZ21lbnQvZnJhZ21lbnQueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5mcmFnbWVudC9mcmFnbWVudC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE1Y2Q2ZQotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUuZnJhZ21lbnQvZnJhZ21lbnQueG1sCkBAIC0wLDAgKzEsMTcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Cis8ZnJhZ21lbnQKKyAgIGlkPSJjb20uZXhhbXBsZS5idW5kbGUuZnJhZ21lbnQiCisgICBuYW1lPSJGcmFnbWVudCBGcmFnbWVudCIKKyAgIHZlcnNpb249IjEuMC4wIgorICAgcHJvdmlkZXItbmFtZT0iRWNsaXBzZS5vcmciCisgICBwbHVnaW4taWQ9ImNvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4iCisgICBwbHVnaW4tdmVyc2lvbj0iMS4wLjAiPgorCisgICA8cnVudGltZT4KKyAgICAgIDxsaWJyYXJ5IG5hbWU9ImZyYWdtZW50LmphciI+CisgICAgICAgICA8ZXhwb3J0IG5hbWU9IioiLz4KKyAgICAgIDwvbGlicmFyeT4KKyAgIDwvcnVudGltZT4KKworPC9mcmFnbWVudD4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luLnVpLy5jbGFzc3BhdGggYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi51aS8uY2xhc3NwYXRoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2NWFjMDYKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi51aS8uY2xhc3NwYXRoCkBAIC0wLDAgKzEsNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxjbGFzc3BhdGg+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Cis8L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luLnVpLy5wcm9qZWN0IGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4udWkvLnByb2plY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNjMzU1MwotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luLnVpLy5wcm9qZWN0CkBAIC0wLDAgKzEsMzEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdERlc2NyaXB0aW9uPgorCTxuYW1lPmNvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4udWk8L25hbWU+CisJPGNvbW1lbnQ+PC9jb21tZW50PgorCTxwcm9qZWN0cz4KKwkJPHByb2plY3Q+Y29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbjwvcHJvamVjdD4KKwkJPHByb2plY3Q+b3JnLmVjbGlwc2UuY29yZS5ydW50aW1lPC9wcm9qZWN0PgorCQk8cHJvamVjdD5vcmcuZWNsaXBzZS51aTwvcHJvamVjdD4KKwk8L3Byb2plY3RzPgorCTxidWlsZFNwZWM+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwk8L2J1aWxkU3BlYz4KKwk8bmF0dXJlcz4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgorCTwvbmF0dXJlcz4KKzwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4udWkvLnRlbXBsYXRlIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4udWkvLnRlbXBsYXRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzYmNkNDEKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi51aS8udGVtcGxhdGUKQEAgLTAsMCArMSw0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KKzxmb3JtPg0KKyAgIDxwLz48cD48Yj5UaXBzIG9uIHdvcmtpbmcgd2l0aCB0aGlzIHBsdWctaW4gcHJvamVjdDwvYj48L3A+PGxpPkZvciB0aGUgdmlldyBvZiB0aGUgbmV3IHBsdWctaW4gYXQgYSBnbGFuY2UsIGdvIHRvIHRoZSA8aW1nIGhyZWY9InBhZ2VJbWFnZSIvPjxhIGhyZWY9Ik92ZXJ2aWV3UGFnZSI+T3ZlcnZpZXc8L2E+LjwvbGk+PGxpPllvdSBjYW4gdGVzdCB0aGUgY29udHJpYnV0aW9ucyBvZiB0aGlzIHBsdWctaW4gYnkgbGF1bmNoaW5nIGFub3RoZXIgaW5zdGFuY2Ugb2YgdGhlIHdvcmtiZW5jaC4gT24gdGhlIDxiPlJ1bjwvYj4gbWVudSwgY2xpY2sgPGI+UnVuIEFzPC9iPiBhbmQgY2hvb3NlIDxpbWcgaHJlZj0icnVuVGltZVdvcmtiZW5jaEltYWdlIi8+PGEgaHJlZj0iYWN0aW9uLnJ1biI+UnVuLXRpbWUgV29ya2JlbmNoPC9hPiBmcm9tIHRoZSBhdmFpbGFibGUgY2hvaWNlcy48L2xpPjxsaT5Zb3UgY2FuIGFkZCBtb3JlIGZ1bmN0aW9uYWxpdHkgdG8gdGhpcyBwbHVnLWluIGJ5IGFkZGluZyBleHRlbnNpb25zIHVzaW5nIHRoZSA8YSBocmVmPSJhY3Rpb24ubmV3RXh0ZW5zaW9uIj5OZXcgRXh0ZW5zaW9uIFdpemFyZDwvYT4uPC9saT48bGk+VGhlIHBsdWctaW4gcHJvamVjdCBjb250YWlucyBKYXZhIGNvZGUgdGhhdCB5b3UgY2FuIGRlYnVnLiBQbGFjZSBicmVha3BvaW50cyBpbiBKYXZhIGNsYXNzZXMuIE9uIHRoZSA8Yj5SdW48L2I+IG1lbnUsIHNlbGVjdCA8Yj5EZWJ1ZyBBczwvYj4gYW5kIGNob29zZSA8aW1nIGhyZWY9InJ1blRpbWVXb3JrYmVuY2hJbWFnZSIvPjxhIGhyZWY9ImFjdGlvbi5kZWJ1ZyI+UnVuLXRpbWUgV29ya2JlbmNoPC9hPiBmcm9tIHRoZSBhdmFpbGFibGUgY2hvaWNlcy48L2xpPg0KKzwvZm9ybT4NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luLnVpL01FVEEtSU5GL01BTklGRVNULk1GCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNTA3YTkKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMCwwICsxLDEyIEBACitHZW5lcmF0ZWQtZnJvbTogMTA3NzA2Mjk5OTgyNw0KK0J1bmRsZS1OYW1lOiBVaSBQbHVnLWluDQorQnVuZGxlLVZlcnNpb246IDIuMC4wDQorQnVuZGxlLVN5bWJvbGljTmFtZTogY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi51aQ0KK0J1bmRsZS1WZW5kb3I6IEVjbGlwc2Uub3JnDQorQnVuZGxlLUNsYXNzUGF0aDogdWkuamFyDQorTGVnYWN5OiB0cnVlDQorQnVuZGxlLUFjdGl2YXRvcjogY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi51aS5VaVBsdWdpbg0KK1JlcXVpcmUtQnVuZGxlOiANCisgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLA0KKyBvcmcuZWNsaXBzZS51aSwNCisgY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbjsgYnVuZGxlLXZlcnNpb249MS4wLjA7dmVyc2lvbi1tYXRjaD1wZXJmZWN0DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4udWkvYmluL2NvbS9leGFtcGxlL2J1bmRsZS9wbHVnaW4vdWkvVWlQbHVnaW4uY2xhc3MgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi51aS9iaW4vY29tL2V4YW1wbGUvYnVuZGxlL3BsdWdpbi91aS9VaVBsdWdpbi5jbGFzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjczMTg5Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4udWkvYmluL2NvbS9leGFtcGxlL2J1bmRsZS9wbHVnaW4vdWkvVWlQbHVnaW4uY2xhc3MKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4udWkvcGx1Z2luLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luLnVpL3BsdWdpbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVmZmRlZgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luLnVpL3BsdWdpbi54bWwKQEAgLTAsMCArMSwyMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KKzxwbHVnaW4KKyAgIGlkPSJjb20uZXhhbXBsZS5idW5kbGUucGx1Z2luLnVpIgorICAgbmFtZT0iVWkgUGx1Zy1pbiIKKyAgIHZlcnNpb249IjIuMC4wIgorICAgcHJvdmlkZXItbmFtZT0iRWNsaXBzZS5vcmciCisgICBjbGFzcz0iY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi51aS5VaVBsdWdpbiI+CisKKyAgIDxydW50aW1lPgorICAgICAgPGxpYnJhcnkgbmFtZT0idWkuamFyIj4KKyAgICAgICAgIDxleHBvcnQgbmFtZT0iKiIvPgorICAgICAgPC9saWJyYXJ5PgorICAgPC9ydW50aW1lPgorICAgPHJlcXVpcmVzPgorICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIi8+CisgICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+CisgICAgICA8aW1wb3J0IHBsdWdpbj0iY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbiIgdmVyc2lvbj0iMS4wLjAiIG1hdGNoPSJwZXJmZWN0Ii8+CisgICA8L3JlcXVpcmVzPgorCisKKzwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4vLmNsYXNzcGF0aCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luLy5jbGFzc3BhdGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY1YWMwNgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luLy5jbGFzc3BhdGgKQEAgLTAsMCArMSw3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGNsYXNzcGF0aD4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KKzwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4vLnByb2plY3QgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi8ucHJvamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzE5ZDczCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4vLnByb2plY3QKQEAgLTAsMCArMSwzMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxwcm9qZWN0RGVzY3JpcHRpb24+CisJPG5hbWU+Y29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbjwvbmFtZT4KKwk8Y29tbWVudD48L2NvbW1lbnQ+CisJPHByb2plY3RzPgorCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU8L3Byb2plY3Q+CisJCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLnVpPC9wcm9qZWN0PgorCTwvcHJvamVjdHM+CisJPGJ1aWxkU3BlYz4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCTwvYnVpbGRTcGVjPgorCTxuYXR1cmVzPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+CisJPC9uYXR1cmVzPgorPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi8udGVtcGxhdGUgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi8udGVtcGxhdGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNiY2Q0MQotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luLy50ZW1wbGF0ZQpAQCAtMCwwICsxLDQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQorPGZvcm0+DQorICAgPHAvPjxwPjxiPlRpcHMgb24gd29ya2luZyB3aXRoIHRoaXMgcGx1Zy1pbiBwcm9qZWN0PC9iPjwvcD48bGk+Rm9yIHRoZSB2aWV3IG9mIHRoZSBuZXcgcGx1Zy1pbiBhdCBhIGdsYW5jZSwgZ28gdG8gdGhlIDxpbWcgaHJlZj0icGFnZUltYWdlIi8+PGEgaHJlZj0iT3ZlcnZpZXdQYWdlIj5PdmVydmlldzwvYT4uPC9saT48bGk+WW91IGNhbiB0ZXN0IHRoZSBjb250cmlidXRpb25zIG9mIHRoaXMgcGx1Zy1pbiBieSBsYXVuY2hpbmcgYW5vdGhlciBpbnN0YW5jZSBvZiB0aGUgd29ya2JlbmNoLiBPbiB0aGUgPGI+UnVuPC9iPiBtZW51LCBjbGljayA8Yj5SdW4gQXM8L2I+IGFuZCBjaG9vc2UgPGltZyBocmVmPSJydW5UaW1lV29ya2JlbmNoSW1hZ2UiLz48YSBocmVmPSJhY3Rpb24ucnVuIj5SdW4tdGltZSBXb3JrYmVuY2g8L2E+IGZyb20gdGhlIGF2YWlsYWJsZSBjaG9pY2VzLjwvbGk+PGxpPllvdSBjYW4gYWRkIG1vcmUgZnVuY3Rpb25hbGl0eSB0byB0aGlzIHBsdWctaW4gYnkgYWRkaW5nIGV4dGVuc2lvbnMgdXNpbmcgdGhlIDxhIGhyZWY9ImFjdGlvbi5uZXdFeHRlbnNpb24iPk5ldyBFeHRlbnNpb24gV2l6YXJkPC9hPi48L2xpPjxsaT5UaGUgcGx1Zy1pbiBwcm9qZWN0IGNvbnRhaW5zIEphdmEgY29kZSB0aGF0IHlvdSBjYW4gZGVidWcuIFBsYWNlIGJyZWFrcG9pbnRzIGluIEphdmEgY2xhc3Nlcy4gT24gdGhlIDxiPlJ1bjwvYj4gbWVudSwgc2VsZWN0IDxiPkRlYnVnIEFzPC9iPiBhbmQgY2hvb3NlIDxpbWcgaHJlZj0icnVuVGltZVdvcmtiZW5jaEltYWdlIi8+PGEgaHJlZj0iYWN0aW9uLmRlYnVnIj5SdW4tdGltZSBXb3JrYmVuY2g8L2E+IGZyb20gdGhlIGF2YWlsYWJsZSBjaG9pY2VzLjwvbGk+DQorPC9mb3JtPg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luL01FVEEtSU5GL01BTklGRVNULk1GIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4vTUVUQS1JTkYvTUFOSUZFU1QuTUYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmMxYWRhZgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0wLDAgKzEsMTEgQEAKK0dlbmVyYXRlZC1mcm9tOiAxMDc3MDYyNjAzNzA4DQorQnVuZGxlLU5hbWU6IFBsdWdpbiBQbHVnLWluDQorQnVuZGxlLVZlcnNpb246IDEuMC4wDQorQnVuZGxlLVN5bWJvbGljTmFtZTogY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbg0KK0J1bmRsZS1WZW5kb3I6IEVYQU1QTEUNCitCdW5kbGUtQ2xhc3NQYXRoOiBwbHVnaW4uamFyDQorTGVnYWN5OiB0cnVlDQorQnVuZGxlLUFjdGl2YXRvcjogY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi5QbHVnaW5QbHVnaW4NCitSZXF1aXJlLUJ1bmRsZTogDQorIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwNCisgb3JnLmVjbGlwc2UudWkNCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi9iaW4vY29tL2V4YW1wbGUvYnVuZGxlL3BsdWdpbi9QbHVnaW5QbHVnaW4uY2xhc3MgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi9iaW4vY29tL2V4YW1wbGUvYnVuZGxlL3BsdWdpbi9QbHVnaW5QbHVnaW4uY2xhc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZjYWYwMwotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luL2Jpbi9jb20vZXhhbXBsZS9idW5kbGUvcGx1Z2luL1BsdWdpblBsdWdpbi5jbGFzcwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi9wbHVnaW4ueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4vcGx1Z2luLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTdiYzc2Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4vcGx1Z2luLnhtbApAQCAtMCwwICsxLDIxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgorPHBsdWdpbgorICAgaWQ9ImNvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4iCisgICBuYW1lPSJQbHVnaW4gUGx1Zy1pbiIKKyAgIHZlcnNpb249IjEuMC4wIgorICAgcHJvdmlkZXItbmFtZT0iRWNsaXBzZS5vcmciCisgICBjbGFzcz0iY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi5QbHVnaW5QbHVnaW4iPgorCisgICA8cnVudGltZT4KKyAgICAgIDxsaWJyYXJ5IG5hbWU9InBsdWdpbi5qYXIiPgorICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+CisgICAgICA8L2xpYnJhcnk+CisgICA8L3J1bnRpbWU+CisgICA8cmVxdWlyZXM+CisgICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4KKyAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4KKyAgIDwvcmVxdWlyZXM+CisKKworPC9wbHVnaW4+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLy5wcm9qZWN0IGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy8ucHJvamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDk2YjUxCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy8ucHJvamVjdApAQCAtMCwwICsxLDExIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KKzxwcm9qZWN0RGVzY3JpcHRpb24+DQorCTxuYW1lPm9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3JtczwvbmFtZT4NCisJPGNvbW1lbnQ+PC9jb21tZW50Pg0KKwk8cHJvamVjdHM+DQorCTwvcHJvamVjdHM+DQorCTxidWlsZFNwZWM+DQorCTwvYnVpbGRTcGVjPg0KKwk8bmF0dXJlcz4NCisJPC9uYXR1cmVzPg0KKzwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvUkVBRE1FLlRYVCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvUkVBRE1FLlRYVApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTlhOGE0Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9SRUFETUUuVFhUCkBAIC0wLDAgKzEsMiBAQAorVGhpcyBidW5kbGUgaXMgb2Jzb2xldGUuIEZ1bmN0aW9uYWxpdHkgZnJvbSB0aGlzIGJ1bmRsZSB3YXMgbW92ZWQgdG8gb3JnLmVjbGlwc2UudWkuZm9ybXMKK2luIHRoZSBFY2xpcHNlIDMuMCByZWxlYXNlLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvLnByb2plY3QgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyLy5wcm9qZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjNjRhMDgKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyLy5wcm9qZWN0CkBAIC0wLDAgKzEsMTEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQorPHByb2plY3REZXNjcmlwdGlvbj4NCisJPG5hbWU+b3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyPC9uYW1lPg0KKwk8Y29tbWVudD48L2NvbW1lbnQ+DQorCTxwcm9qZWN0cz4NCisJPC9wcm9qZWN0cz4NCisJPGJ1aWxkU3BlYz4NCisJPC9idWlsZFNwZWM+DQorCTxuYXR1cmVzPg0KKwk8L25hdHVyZXM+DQorPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9SRUFETUUuVFhUIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9SRUFETUUuVFhUCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxM2NkYjcKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL1JFQURNRS5UWFQKQEAgLTAsMCArMSwyIEBACitUaGlzIGJ1bmRsZSBpcyBvYnNvbGV0ZS4gSXQgY29udGFpbmVkIHdlbGNvbWUgY29udGVudCB0aGF0IGlzIG5vdyBpbiBvcmcuZWNsaXBzZS51aS5pZGUuIFRoaXMKK2J1bmRsZSB3YXMgcmVtb3ZlZCBmcm9tIHRoZSBFY2xpcHNlIFNESyBhZnRlciB0aGUgRWNsaXBzZSAyLjEgcmVsZWFzZS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLy5jbGFzc3BhdGggYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLy5jbGFzc3BhdGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFiM2FkOAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvLmNsYXNzcGF0aApAQCAtMCwwICsxLDcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQorPGNsYXNzcGF0aD4NCisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+DQorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjQiLz4NCisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KKzwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvLmN2c2lnbm9yZSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvLmN2c2lnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTA3N2E0Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS8uY3ZzaWdub3JlCkBAIC0wLDAgKzEgQEAKK2JpbgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS8ucHJvamVjdCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvLnByb2plY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA4NTg1MQotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvLnByb2plY3QKQEAgLTAsMCArMSwyNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCis8cHJvamVjdERlc2NyaXB0aW9uPg0KKwk8bmFtZT5vcmcuZWNsaXBzZS51cGRhdGUudWk8L25hbWU+DQorCTxjb21tZW50PjwvY29tbWVudD4NCisJPGJ1aWxkU3BlYz4NCisJCTxidWlsZENvbW1hbmQ+DQorCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+DQorCQkJPGFyZ3VtZW50cz4NCisJCQk8L2FyZ3VtZW50cz4NCisJCTwvYnVpbGRDb21tYW5kPg0KKwkJPGJ1aWxkQ29tbWFuZD4NCisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPg0KKwkJCTxhcmd1bWVudHM+DQorCQkJPC9hcmd1bWVudHM+DQorCQk8L2J1aWxkQ29tbWFuZD4NCisJCTxidWlsZENvbW1hbmQ+DQorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+DQorCQkJPGFyZ3VtZW50cz4NCisJCQk8L2FyZ3VtZW50cz4NCisJCTwvYnVpbGRDb21tYW5kPg0KKwk8L2J1aWxkU3BlYz4NCisJPG5hdHVyZXM+DQorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCisJCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KKwk8L25hdHVyZXM+DQorPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTUzNGNkCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKQEAgLTAsMCArMSw2OSBAQAorI1R1ZSBEZWMgMDkgMTE6MTE6MjMgRVNUIDIwMDgKK2VjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmNvbXBhcmluZ0lkZW50aWNhbD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlYWRDb2RlPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmFsbHRocm91Z2hDYXNlPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYXRhbE9wdGlvbmFsRXJyb3I9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSGFzaENvZGVNZXRob2Q9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1N5bmNocm9uaXplZE9uSW5oZXJpdGVkTWV0aG9kPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsUmVmZXJlbmNlPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wYXJhbWV0ZXJBc3NpZ25tZW50PWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG90ZW50aWFsTnVsbFJlZmVyZW5jZT1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50TnVsbENoZWNrPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZWR1bmRhbnRTdXBlcmludGVyZmFjZT1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25FeGVtcHRFeGNlcHRpb25BbmRUaHJvd2FibGU9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbkluY2x1ZGVEb2NDb21tZW50UmVmZXJlbmNlPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlckluY2x1ZGVEb2NDb21tZW50UmVmZXJlbmNlPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRXYXJuaW5nVG9rZW49d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL0dyYXBoaWNzX3VwZGF0ZS5odG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9HcmFwaGljc191cGRhdGUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGFlMWEzCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9HcmFwaGljc191cGRhdGUuaHRtbApAQCAtMCwwICsxLDk1NSBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KKzwhLS0gc2F2ZWQgZnJvbSB1cmw9KDAxMTApaHR0cDovL2Rlc2lnbi50b3JvbGFiLmlibS5jb20vYWltL1dTV0ItZWNsaXBzZS8xMDIwX1BERS9pbXBsZW1lbnRhdGlvbl9pY29ucy9vcmcuZWNsaXBzZS5wZGUvR3JhcGhpY3NfcGRlLmh0bWwgLS0+Cis8SFRNTD48SEVBRD48VElUTEU+Z3JhcGhpY3M8L1RJVExFPgorPE1FVEEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorPE1FVEEgY29udGVudD0iR3JlZyBBZGFtcyIgbmFtZT1BdXRob3I+Cis8TUVUQSBjb250ZW50PSJNaWNyb3NvZnQgRnJvbnRQYWdlIDQuMCIgbmFtZT1HRU5FUkFUT1I+PC9IRUFEPgorPEJPRFkgYmdDb2xvcj13aGl0ZT4KKzxIMj5vcmcuZWNsaXBzZS51cGRhdGUudWkgLSBHcmFwaGljcyBTdW1tYXJ5PC9IMj48Rk9OVCBzaXplPS0xPjxTVFJPTkc+Q29tcGV0ZW5jeSAKK2xlYWQ6IDwvU1RST05HPlZsYWQgS2xpY25payAvIFRPTCA8QlI+PFNUUk9ORz5UZWNobmljYWwgbGVhZDogPC9TVFJPTkc+RGVqYW4gCitHbG96aWMgLyBUT0wgPEJSPjxTVFJPTkc+VUNEIGRlc2lnbmVyOiA8L1NUUk9ORz5KdWxpYW4gSm9uZXMgLyBUT0wgCis8QlI+PFNUUk9ORz5VSSBkZXNpZ25lcjogPC9TVFJPTkc+QW5kcullIFByb3VseCAvIFRPTCA8QlI+PFNUUk9ORz5JRCB3cml0ZXI6IAorPC9TVFJPTkc+LTwvRk9OVD4gCis8SFIgd2lkdGg9IjEwMCUiIFNJWkU9MT4KKzxCPjxGT05UIHNpemU9LTE+SGlzdG9yeTo8L0ZPTlQ+PC9CPiAKKzxwPjxmb250IHNpemU9Ii0xIj5BcHJpbCAxOSwgMjAwMiA6IFRlbXBsYXRlIFN1Ym1pc3Npb248L2ZvbnQ+PC9wPgorPEhSIHdpZHRoPSIxMDAlIiBTSVpFPTE+Cis8IS0tLSBTdGFydCBIZXJlIC0tLT4KKzxUQUJMRSBjZWxsU3BhY2luZz0wIGNlbGxQYWRkaW5nPTMgd2lkdGg9IjEwMCUiIGJvcmRlcj0wIGhlaWdodD0iMzE0NyI+CisgIAorICA8VFIgYmdDb2xvcj0jYmZiZjdmPgorICAgIDxURCBjb2xTcGFuPTc+PEI+PEZPTlQgc2l6ZT0rMj5WaWV3PC9GT05UPjwvQj48L1REPjwvVFI+CisgIDxUUiBiZ0NvbG9yPSNkZmRmOWY+CisgICAgPFREPiZuYnNwOzwvVEQ+CisgICAgPFREPjxCPjxGT05UIHNpemU9LTE+SXRlbTwvRk9OVD48L0I+PC9URD4KKyAgICA8VEQ+PEI+PEZPTlQgc2l6ZT0tMT5GaWxlIE5hbWUmbmJzcDsgKC5naWYpPC9GT05UPjwvQj48L1REPgorICAgIDxURD48Qj48Rk9OVCBzaXplPS0xPkRlc2NyaXB0aW9uL0hvb3ZlciBIZWxwPC9GT05UPjwvQj48L1REPgorICAgIDxURD4KKyAgICAgIDxDRU5URVI+PEI+PEZPTlQgc2l6ZT0tMT5PbGQ8L0ZPTlQ+PC9CPiA8L0NFTlRFUj48L1REPgorICAgIDxURD4KKyAgICAgIDxDRU5URVI+PEI+PEZPTlQgc2l6ZT0tMT5OZXcgRnVsbDwvRk9OVD48L0I+IDwvQ0VOVEVSPjwvVEQ+CisgICAgPFREPjxCPjxGT05UIHNpemU9LTE+U3RhdHVzPC9GT05UPjwvQj48L1REPjwvVFI+CisgIDxUUiBiZ0NvbG9yPSNmZmZmZmY+CisgICAgPFREPjE8L1REPgorICAgIDxURD5Db25maWd1cmF0aW9uczwvVEQ+CisgICAgPFREPjxGT05UIHNpemU9LTE+Y29uZmlnczwvRk9OVD48L1REPgorICAgIDxURD48Rk9OVCBzaXplPS0xPiBzaG93cyB0aGUgY29uZmlndXJhdGlvbnMgb2YgdGhlIEVjbGlwc2UtYmFzZWQgYXBwbGljYXRpb248L0ZPTlQ+PC9URD4KKyAgICA8VEQ+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAorICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC92aWV3MTYvY29uZmlncy5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPjwvVEQ+CisgICAgPFREPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKKyAgICAgIHNyYz0iaWNvbnMvZnVsbC9jdmlldzE2L2NvbmZpZ3MuZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4mbmJzcDs8SU1HIGhlaWdodD0xNiAKKyAgICAgIGFsdD0iIiBzcmM9Imljb25zL2Z1bGwvZXZpZXcxNi9jb25maWdzLmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Jm5ic3A7PC9URD4KKyAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4gPC9GT05UPjwvVEQ+PC9UUj4KKyAgPFRSIGJnQ29sb3I9I2RmZGZiPgorICAgIDxURD4yPC9URD4KKyAgICA8VEQ+VXBkYXRlczwvVEQ+CisgICAgPFREPjxGT05UIHNpemU9LTE+dXBkYXRlczwvRk9OVD48L1REPgorICAgIDxURD48Rk9OVCBzaXplPS0xPnNob3dzIHNpdGVzIGFuIEVjbGlwc2UgYXBwIGNhbiBiZSB1cGRhdGVkIGZyb208L0ZPTlQ+PC9URD4KKyAgICA8VEQ+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAorICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC92aWV3MTYvdXBkYXRlcy5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPjwvVEQ+CisgICAgPFREPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKKyAgICAgIHNyYz0iaWNvbnMvZnVsbC9jdmlldzE2L3VwZGF0ZXMuZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4mbmJzcDs8SU1HIGhlaWdodD0xNiAKKyAgICAgIGFsdD0iIiBzcmM9Imljb25zL2Z1bGwvZXZpZXcxNi91cGRhdGVzLmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Jm5ic3A7PC9URD4KKyAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4gPC9GT05UPjwvVEQ+PC9UUj4KKyAgPFRSIGJnQ29sb3I9I2ZmZmZmZj4KKyAgICA8VEQ+MzwvVEQ+CisgICAgPFREPlByZXZpZXc8L1REPgorICAgIDxURD48Zm9udCBzaXplPSItMSI+cHJldmlldzwvZm9udD48L1REPgorICAgIDxURD48Zm9udCBzaXplPSItMSI+c2hvd3MgZGV0YWlscyBvZiB0aGUgc2VsZWN0ZWQgb2JqZWN0PC9mb250PjwvVEQ+CisgICAgPFREPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKKyAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvdmlldzE2L3ByZXZpZXcuZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD48L1REPgorICAgIDxURD48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCisgICAgICBzcmM9Imljb25zL2Z1bGwvY3ZpZXcxNi9wcmV2aWV3LmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Jm5ic3A7PElNRyBoZWlnaHQ9MTYgCisgICAgICBhbHQ9IiIgc3JjPSJpY29ucy9mdWxsL2V2aWV3MTYvcHJldmlldy5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiZuYnNwOzwvVEQ+CisgICAgPFREPjxGT05UIHNpemU9LTE+IDwvRk9OVD48L1REPjwvVFI+CisgIDxUUiBiZ0NvbG9yPSNkZmRmYj4KKyAgICA8VEQ+NDwvVEQ+CisgICAgPFREPldlYiBCcm93c2VyPC9URD4KKyAgICA8VEQ+PGZvbnQgc2l6ZT0iLTEiPmJyb3dzZXI8L2ZvbnQ+PC9URD4KKyAgICA8VEQ+PGZvbnQgc2l6ZT0iLTEiPmEgZnVsbHktZnVuY3Rpb25pbmcgV2ViIGJyb3dzZXIgKGhvc3RzIElFNSAtIFdpbmRvd3Mgb25seSk8L2ZvbnQ+PC9URD4KKyAgICA8VEQ+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAorICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC92aWV3MTYvYnJvd3Nlci5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPjwvVEQ+CisgICAgPFREPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKKyAgICAgIHNyYz0iaWNvbnMvZnVsbC9jdmlldzE2L2Jyb3dzZXIuZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4mbmJzcDs8SU1HIGhlaWdodD0xNiAKKyAgICAgIGFsdD0iIiBzcmM9Imljb25zL2Z1bGwvZXZpZXcxNi9icm93c2VyLmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Jm5ic3A7PC9URD4KKyAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4gPC9GT05UPjwvVEQ+PC9UUj4KKyAgIDxUUiBiZ0NvbG9yPSNmZmZmZmY+CisgICAgPFREPjU8L1REPgorICAgIDxURD5VcGRhdGUgUGVyc3BlY3RpdmU8L1REPgorICAgIDxURD48Zm9udCBzaXplPSItMSI+dXBkYXRlX3BlcnM8L2ZvbnQ+PC9URD4KKyAgICA8VEQ+PGZvbnQgc2l6ZT0iLTEiPlJlcHJlc2VudHMgSW5zdGFsbC9VcGRhdGUKKyAgICAgIHBlcnNwZWN0aXZlIGluIHRoZSBVSTwvZm9udD48L1REPgorICAgIDxURD48L1REPgorICAgIDxURD48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCisgICAgICBzcmM9Imljb25zL2Z1bGwvY3ZpZXcxNi91cGRhdGVfcGVycy5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiZuYnNwOzxJTUcgaGVpZ2h0PTE2IAorICAgICAgYWx0PSIiIHNyYz0iaWNvbnMvZnVsbC9ldmlldzE2L3VwZGF0ZV9wZXJzLmdpZiIgd2lkdGg9MTYgCitib3JkZXI9MD4mbmJzcDs8L1REPgorICAgIDxURD48Rk9OVCBzaXplPS0xPiA8L0ZPTlQ+PC9URD4KKyAgPC9UUj4KKyAgCisgIDxUUiBiZ0NvbG9yPSNiZmJmN2Y+CisgICAgPFREIGNvbFNwYW49Nz48Qj48Rk9OVCBzaXplPSsyPlRvb2xiYXIgV2l6YXJkPC9GT05UPjwvQj48L1REPjwvVFI+CisgIDxUUiBiZ0NvbG9yPSNmZmZmZmY+CisgICAgPFREPjE8L1REPgorICAgIDxURD4gPC9URD4KKyAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4mbmJzcDs8L0ZPTlQ+PC9URD4KKyAgICA8VEQ+CisgICAgICA8VEFCTEUgY2VsbFNwYWNpbmc9MiBjZWxsUGFkZGluZz0wIHdpZHRoPSIxMDAlIiBib3JkZXI9MD4KKyAgICAgICAgCisgICAgICAgIDxUUj4KKyAgICAgICAgICA8VEQgdkFsaWduPXRvcD48Zm9udCBzaXplPSItMSI+ICAgIGRlc2NyaXB0aW9uPC9mb250PjwvVEQ+CisgICAgICAgICAgPFREIHZBbGlnbj1jZW50ZXIgYWxpZ249cmlnaHQ+CisgICAgICAgICAgICA8VEFCTEU+CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICA8VFI+CisgICAgICAgICAgICAgICAgPFREIAorICAgICAgICAgICAgICAgIHN0eWxlPSJCT1JERVItUklHSFQ6IGJsYWNrIDFweCBzb2xpZDsgQk9SREVSLVRPUDogYmxhY2sgMXB4IHNvbGlkOyBCT1JERVItTEVGVDogYmxhY2sgMXB4IHNvbGlkOyBCT1JERVItQk9UVE9NOiBibGFjayAxcHggc29saWQiIAorICAgICAgICAgICAgICAgIGFsaWduPW1pZGRsZSBiZ0NvbG9yPSNmZmZmZTE+PEZPTlQgCisgICAgICAgICAgICAgICAgICBzaXplPS0yPiZuYnNwO3Rvb2wgdGlwJm5ic3A7PC9GT05UPjwvVEQ+PC9UUj48L1RBQkxFPjwvVEQ+PC9UUj48L1RBQkxFPjwvVEQ+CisgICAgPFREPjwvVEQ+CisgICAgPFREIGJnQ29sb3I9I2NjY2NjYz48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCisgICAgICBzcmM9Imljb25zL2Z1bGwvY3Rvb2wxNi9jb25maWdfd2l6LmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Jm5ic3A7PElNRyAKKyAgICAgIGhlaWdodD0xNiBhbHQ9IiIgc3JjPSJpY29ucy9mdWxsL2V0b29sMTYvY29uZmlnX3dpei5naWYiIHdpZHRoPTE2IAorICAgICAgYm9yZGVyPTA+Jm5ic3A7PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAorICAgICAgc3JjPSJpY29ucy9mdWxsL2R0b29sMTYvY29uZmlnX3dpei5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiZuYnNwOzwvVEQ+CisgICAgPFREPjxGT05UIHNpemU9LTE+IDwvRk9OVD48L1REPjwvVFI+CisJCisgIDxUUiBiZ0NvbG9yPSNkZmRmOWY+CisgICAgPFREPjI8L1REPgorICAgIDxURD4gPC9URD4KKyAgICA8VEQ+PEZPTlQgc2l6ZT0tMT48L0ZPTlQ+PC9URD4KKyAgICA8VEQ+CisgICAgICA8VEFCTEUgY2VsbFNwYWNpbmc9MiBjZWxsUGFkZGluZz0wIHdpZHRoPSIxMDAlIiBib3JkZXI9MD4KKyAgICAgICAgCisgICAgICAgIDxUUj4KKyAgICAgICAgICA8VEQgdkFsaWduPXRvcD48Zm9udCBzaXplPSItMSI+ICAgIGRlc2NyaXB0aW9uPC9mb250PjwvVEQ+CisgICAgICAgICAgPFREIHZBbGlnbj1jZW50ZXIgYWxpZ249cmlnaHQ+CisgICAgICAgICAgICA8VEFCTEU+CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICA8VFI+CisgICAgICAgICAgICAgICAgPFREIAorICAgICAgICAgICAgICAgIHN0eWxlPSJCT1JERVItUklHSFQ6IGJsYWNrIDFweCBzb2xpZDsgQk9SREVSLVRPUDogYmxhY2sgMXB4IHNvbGlkOyBCT1JERVItTEVGVDogYmxhY2sgMXB4IHNvbGlkOyBCT1JERVItQk9UVE9NOiBibGFjayAxcHggc29saWQiIAorICAgICAgICAgICAgICAgIGFsaWduPW1pZGRsZSBiZ0NvbG9yPSNmZmZmZTE+PEZPTlQgCisgICAgICAgICAgICAgICAgICBzaXplPS0yPiZuYnNwO3Rvb2wgdGlwJm5ic3A7PC9GT05UPjwvVEQ+PC9UUj48L1RBQkxFPjwvVEQ+PC9UUj48L1RBQkxFPjwvVEQ+CisgICAgPFREPjwvVEQ+CisgICAgPFREIGJnQ29sb3I9I2NjY2NjYz48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCisgICAgICBzcmM9Imljb25zL2Z1bGwvY3Rvb2wxNi9pbnN0YWxsX3dpei5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiZuYnNwOzxJTUcgCisgICAgICBoZWlnaHQ9MTYgYWx0PSIiIHNyYz0iaWNvbnMvZnVsbC9ldG9vbDE2L2luc3RhbGxfd2l6LmdpZiIgd2lkdGg9MTYgCisgICAgICBib3JkZXI9MD4mbmJzcDs8SU1HIGhlaWdodD0xNiBhbHQ9IiIgCisgICAgICBzcmM9Imljb25zL2Z1bGwvZHRvb2wxNi9pbnN0YWxsX3dpei5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiZuYnNwOzwvVEQ+CisgICAgPFREPjxGT05UIHNpemU9LTE+IDwvRk9OVD48L1REPjwvVFI+CisgIAorICA8VFIgYmdDb2xvcj0jZmZmZmZmPgorICAgIDxURD4zPC9URD4KKyAgICA8VEQ+IDwvVEQ+CisgICAgPFREPjxGT05UIHNpemU9LTE+Jm5ic3A7PC9GT05UPjwvVEQ+CisgICAgPFREPgorICAgICAgPFRBQkxFIGNlbGxTcGFjaW5nPTIgY2VsbFBhZGRpbmc9MCB3aWR0aD0iMTAwJSIgYm9yZGVyPTA+CisgICAgICAgIAorICAgICAgICA8VFI+CisgICAgICAgICAgPFREIHZBbGlnbj10b3A+PGZvbnQgc2l6ZT0iLTEiPiAgICBkZXNjcmlwdGlvbjwvZm9udD48L1REPgorICAgICAgICAgIDxURCB2QWxpZ249Y2VudGVyIGFsaWduPXJpZ2h0PgorICAgICAgICAgICAgPFRBQkxFPgorICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgPFRSPgorICAgICAgICAgICAgICAgIDxURCAKKyAgICAgICAgICAgICAgICBzdHlsZT0iQk9SREVSLVJJR0hUOiBibGFjayAxcHggc29saWQ7IEJPUkRFUi1UT1A6IGJsYWNrIDFweCBzb2xpZDsgQk9SREVSLUxFRlQ6IGJsYWNrIDFweCBzb2xpZDsgQk9SREVSLUJPVFRPTTogYmxhY2sgMXB4IHNvbGlkIiAKKyAgICAgICAgICAgICAgICBhbGlnbj1taWRkbGUgYmdDb2xvcj0jZmZmZmUxPjxGT05UIAorICAgICAgICAgICAgICAgICAgc2l6ZT0tMj4mbmJzcDt0b29sIHRpcCZuYnNwOzwvRk9OVD48L1REPjwvVFI+PC9UQUJMRT48L1REPjwvVFI+PC9UQUJMRT48L1REPgorICAgIDxURD48L1REPgorICAgIDxURCBiZ0NvbG9yPSNjY2NjY2M+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAorICAgICAgc3JjPSJpY29ucy9mdWxsL2N0b29sMTYvbmV3X2Jvb2ttYXJrX3dpei5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiZuYnNwOzxJTUcgCisgICAgICBoZWlnaHQ9MTYgYWx0PSIiIHNyYz0iaWNvbnMvZnVsbC9ldG9vbDE2L25ld19ib29rbWFya193aXouZ2lmIiB3aWR0aD0xNiAKKyAgICAgIGJvcmRlcj0wPiZuYnNwOzxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKKyAgICAgIHNyYz0iaWNvbnMvZnVsbC9kdG9vbDE2L25ld19ib29rbWFya193aXouZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4mbmJzcDs8L1REPgorICAgIDxURD48Rk9OVCBzaXplPS0xPiA8L0ZPTlQ+PC9URD48L1RSPgorCQorICA8VFIgYmdDb2xvcj0jZGZkZjlmPgorICAgIDxURD40PC9URD4KKyAgICA8VEQ+IDwvVEQ+CisgICAgPFREPjxGT05UIHNpemU9LTE+Jm5ic3A7PC9GT05UPjwvVEQ+CisgICAgPFREPgorICAgICAgPFRBQkxFIGNlbGxTcGFjaW5nPTIgY2VsbFBhZGRpbmc9MCB3aWR0aD0iMTAwJSIgYm9yZGVyPTA+CisgICAgICAgIAorICAgICAgICA8VFI+CisgICAgICAgICAgPFREIHZBbGlnbj10b3A+PGZvbnQgc2l6ZT0iLTEiPiAgICBkZXNjcmlwdGlvbjwvZm9udD48L1REPgorICAgICAgICAgIDxURCB2QWxpZ249Y2VudGVyIGFsaWduPXJpZ2h0PgorICAgICAgICAgICAgPFRBQkxFPgorICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgPFRSPgorICAgICAgICAgICAgICAgIDxURCAKKyAgICAgICAgICAgICAgICBzdHlsZT0iQk9SREVSLVJJR0hUOiBibGFjayAxcHggc29saWQ7IEJPUkRFUi1UT1A6IGJsYWNrIDFweCBzb2xpZDsgQk9SREVSLUxFRlQ6IGJsYWNrIDFweCBzb2xpZDsgQk9SREVSLUJPVFRPTTogYmxhY2sgMXB4IHNvbGlkIiAKKyAgICAgICAgICAgICAgICBhbGlnbj1taWRkbGUgYmdDb2xvcj0jZmZmZmUxPjxGT05UIAorICAgICAgICAgICAgICAgICAgc2l6ZT0tMj4mbmJzcDt0b29sIHRpcCZuYnNwOzwvRk9OVD48L1REPjwvVFI+PC9UQUJMRT48L1REPjwvVFI+PC9UQUJMRT48L1REPgorICAgIDxURD48L1REPgorICAgIDxURCBiZ0NvbG9yPSNjY2NjY2M+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAorICAgICAgc3JjPSJpY29ucy9mdWxsL2N0b29sMTYvbmV3X2ZvbGRlcl93aXouZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4mbmJzcDs8SU1HIAorICAgICAgaGVpZ2h0PTE2IGFsdD0iIiBzcmM9Imljb25zL2Z1bGwvZXRvb2wxNi9uZXdfZm9sZGVyX3dpei5naWYiIHdpZHRoPTE2IAorICAgICAgYm9yZGVyPTA+Jm5ic3A7PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAorICAgICAgc3JjPSJpY29ucy9mdWxsL2R0b29sMTYvbmV3X2ZvbGRlcl93aXouZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4mbmJzcDs8L1REPgorICAgIDxURD48Rk9OVCBzaXplPS0xPiA8L0ZPTlQ+PC9URD48L1RSPgorICA8VFIgYmdDb2xvcj0jZmZmZmZmPgorICAgIDxURD41PC9URD4KKyAgICA8VEQ+IDwvVEQ+CisgICAgPFREPjxGT05UIHNpemU9LTE+Jm5ic3A7PC9GT05UPjwvVEQ+CisgICAgPFREPgorICAgICAgPFRBQkxFIGNlbGxTcGFjaW5nPTIgY2VsbFBhZGRpbmc9MCB3aWR0aD0iMTAwJSIgYm9yZGVyPTA+CisgICAgICAgIAorICAgICAgICA8VFI+CisgICAgICAgICAgPFREIHZBbGlnbj10b3A+PGZvbnQgc2l6ZT0iLTEiPiAgICBkZXNjcmlwdGlvbjwvZm9udD48L1REPgorICAgICAgICAgIDxURCB2QWxpZ249Y2VudGVyIGFsaWduPXJpZ2h0PgorICAgICAgICAgICAgPFRBQkxFPgorICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgPFRSPgorICAgICAgICAgICAgICAgIDxURCAKKyAgICAgICAgICAgICAgICBzdHlsZT0iQk9SREVSLVJJR0hUOiBibGFjayAxcHggc29saWQ7IEJPUkRFUi1UT1A6IGJsYWNrIDFweCBzb2xpZDsgQk9SREVSLUxFRlQ6IGJsYWNrIDFweCBzb2xpZDsgQk9SREVSLUJPVFRPTTogYmxhY2sgMXB4IHNvbGlkIiAKKyAgICAgICAgICAgICAgICBhbGlnbj1taWRkbGUgYmdDb2xvcj0jZmZmZmUxPjxGT05UIAorICAgICAgICAgICAgICAgICAgc2l6ZT0tMj4mbmJzcDt0b29sIHRpcCZuYnNwOzwvRk9OVD48L1REPjwvVFI+PC9UQUJMRT48L1REPjwvVFI+PC9UQUJMRT48L1REPgorICAgIDxURD48L1REPgorICAgIDxURCBiZ0NvbG9yPSNjY2NjY2M+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAorICAgICAgc3JjPSJpY29ucy9mdWxsL2N0b29sMTYvbmV3X3NlYXJjaF93aXouZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4mbmJzcDs8SU1HIAorICAgICAgaGVpZ2h0PTE2IGFsdD0iIiBzcmM9Imljb25zL2Z1bGwvZXRvb2wxNi9uZXdfc2VhcmNoX3dpei5naWYiIHdpZHRoPTE2IAorICAgICAgYm9yZGVyPTA+Jm5ic3A7PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAorICAgICAgc3JjPSJpY29ucy9mdWxsL2R0b29sMTYvbmV3X3NlYXJjaF93aXouZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4mbmJzcDs8L1REPgorICAgIDxURD48Rk9OVCBzaXplPS0xPiA8L0ZPTlQ+PC9URD48L1RSPgorCQorICA8VFIgYmdDb2xvcj0jZGZkZjlmPgorICAgIDxURD42PC9URD4KKyAgICA8VEQ+IDwvVEQ+CisgICAgPFREPjxGT05UIHNpemU9LTE+Jm5ic3A7PC9GT05UPjwvVEQ+CisgICAgPFREPgorICAgICAgPFRBQkxFIGNlbGxTcGFjaW5nPTIgY2VsbFBhZGRpbmc9MCB3aWR0aD0iMTAwJSIgYm9yZGVyPTA+CisgICAgICAgIAorICAgICAgICA8VFI+CisgICAgICAgICAgPFREIHZBbGlnbj10b3A+PGZvbnQgc2l6ZT0iLTEiPiAgICBkZXNjcmlwdGlvbjwvZm9udD48L1REPgorICAgICAgICAgIDxURCB2QWxpZ249Y2VudGVyIGFsaWduPXJpZ2h0PgorICAgICAgICAgICAgPFRBQkxFPgorICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgPFRSPgorICAgICAgICAgICAgICAgIDxURCAKKyAgICAgICAgICAgICAgICBzdHlsZT0iQk9SREVSLVJJR0hUOiBibGFjayAxcHggc29saWQ7IEJPUkRFUi1UT1A6IGJsYWNrIDFweCBzb2xpZDsgQk9SREVSLUxFRlQ6IGJsYWNrIDFweCBzb2xpZDsgQk9SREVSLUJPVFRPTTogYmxhY2sgMXB4IHNvbGlkIiAKKyAgICAgICAgICAgICAgICBhbGlnbj1taWRkbGUgYmdDb2xvcj0jZmZmZmUxPjxGT05UIAorICAgICAgICAgICAgICAgICAgc2l6ZT0tMj4mbmJzcDt0b29sIHRpcCZuYnNwOzwvRk9OVD48L1REPjwvVFI+PC9UQUJMRT48L1REPjwvVFI+PC9UQUJMRT48L1REPgorICAgIDxURD48L1REPgorICAgIDxURCBiZ0NvbG9yPSNjY2NjY2M+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAorICAgICAgc3JjPSJpY29ucy9mdWxsL2N0b29sMTYvdW5pbnN0YWxsX3dpei5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiZuYnNwOzxJTUcgCisgICAgICBoZWlnaHQ9MTYgYWx0PSIiIHNyYz0iaWNvbnMvZnVsbC9ldG9vbDE2L3VuaW5zdGFsbF93aXouZ2lmIiB3aWR0aD0xNiAKKyAgICAgIGJvcmRlcj0wPiZuYnNwOzxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKKyAgICAgIHNyYz0iaWNvbnMvZnVsbC9kdG9vbDE2L3VuaW5zdGFsbF93aXouZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4mbmJzcDs8L1REPgorICAgIDxURD48Rk9OVCBzaXplPS0xPiA8L0ZPTlQ+PC9URD48L1RSPgorCTxUUiBiZ0NvbG9yPSNmZmZmZmY+CisgICAgPFREPjc8L1REPgorICAgIDxURD4gPC9URD4KKyAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4mbmJzcDs8L0ZPTlQ+PC9URD4KKyAgICA8VEQ+CisgICAgICA8VEFCTEUgY2VsbFNwYWNpbmc9MiBjZWxsUGFkZGluZz0wIHdpZHRoPSIxMDAlIiBib3JkZXI9MD4KKyAgICAgICAgCisgICAgICAgIDxUUj4KKyAgICAgICAgICA8VEQgdkFsaWduPXRvcD48Zm9udCBzaXplPSItMSI+ICAgIGRlc2NyaXB0aW9uPC9mb250PjwvVEQ+CisgICAgICAgICAgPFREIHZBbGlnbj1jZW50ZXIgYWxpZ249cmlnaHQ+CisgICAgICAgICAgICA8VEFCTEU+CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICA8VFI+CisgICAgICAgICAgICAgICAgPFREIAorICAgICAgICAgICAgICAgIHN0eWxlPSJCT1JERVItUklHSFQ6IGJsYWNrIDFweCBzb2xpZDsgQk9SREVSLVRPUDogYmxhY2sgMXB4IHNvbGlkOyBCT1JERVItTEVGVDogYmxhY2sgMXB4IHNvbGlkOyBCT1JERVItQk9UVE9NOiBibGFjayAxcHggc29saWQiIAorICAgICAgICAgICAgICAgIGFsaWduPW1pZGRsZSBiZ0NvbG9yPSNmZmZmZTE+PEZPTlQgCisgICAgICAgICAgICAgICAgICBzaXplPS0yPiZuYnNwO3Rvb2wgdGlwJm5ic3A7PC9GT05UPjwvVEQ+PC9UUj48L1RBQkxFPjwvVEQ+PC9UUj48L1RBQkxFPjwvVEQ+CisgICAgPFREPjwvVEQ+CisgICAgPFREIGJnQ29sb3I9I2NjY2NjYz48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCisgICAgICBzcmM9Imljb25zL2Z1bGwvY3Rvb2wxNi91cGRhdGVfd2l6LmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Jm5ic3A7PElNRyAKKyAgICAgIGhlaWdodD0xNiBhbHQ9IiIgc3JjPSJpY29ucy9mdWxsL2V0b29sMTYvdXBkYXRlX3dpei5naWYiIHdpZHRoPTE2IAorICAgICAgYm9yZGVyPTA+Jm5ic3A7PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAorICAgICAgc3JjPSJpY29ucy9mdWxsL2R0b29sMTYvdXBkYXRlX3dpei5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiZuYnNwOzwvVEQ+CisgICAgPFREPjxGT05UIHNpemU9LTE+IDwvRk9OVD48L1REPjwvVFI+CisgIAorICAKKyAgPFRSIGJnQ29sb3I9I2JmYmY3Zj4KKyAgICA8VEQgY29sU3Bhbj03PjxCPjxGT05UIHNpemU9KzI+TG9jYWwgVG9vbGJhcjwvRk9OVD48L0I+PC9URD48L1RSPgorICA8VFIgYmdDb2xvcj0jZmZmZmZmPgorICAgIDxURD4xPC9URD4KKyAgICA8VEQ+R28gQmFja3dhcmQ8L1REPgorICAgIDxURD48Rk9OVCBzaXplPS0xPiZuYnNwO2JhY2t3YXJkX25hdjwvRk9OVD48L1REPgorICAgIDxURD4KKyAgICAgIDxUQUJMRSBjZWxsU3BhY2luZz0yIGNlbGxQYWRkaW5nPTAgd2lkdGg9IjEwMCUiIGJvcmRlcj0wPgorICAgICAgICAKKyAgICAgICAgPFRSPgorICAgICAgICAgIDxURCB2QWxpZ249dG9wPjxmb250IHNpemU9Ii0xIj5BIHN0YW5kYXJkIGJyb3dzZXIgJ2JhY2t3YXJkJyBidXR0b248L2ZvbnQ+PC9URD4KKyAgICAgICAgICA8VEQgdkFsaWduPWNlbnRlciBhbGlnbj1yaWdodD4KKyAgICAgICAgICAgIDxUQUJMRT4KKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIDxUUj4KKyAgICAgICAgICAgICAgICA8VEQgCisgICAgICAgICAgICAgICAgc3R5bGU9IkJPUkRFUi1SSUdIVDogYmxhY2sgMXB4IHNvbGlkOyBCT1JERVItVE9QOiBibGFjayAxcHggc29saWQ7IEJPUkRFUi1MRUZUOiBibGFjayAxcHggc29saWQ7IEJPUkRFUi1CT1RUT006IGJsYWNrIDFweCBzb2xpZCIgCisgICAgICAgICAgICAgICAgYWxpZ249bWlkZGxlIGJnQ29sb3I9I2ZmZmZlMT48Rk9OVCAKKyAgICAgICAgICAgICAgICAgIHNpemU9LTI+Jm5ic3A7R28gQmFja3dhcmQmbmJzcDs8L0ZPTlQ+PC9URD48L1RSPjwvVEFCTEU+PC9URD48L1RSPjwvVEFCTEU+PC9URD4KKyAgICA8VEQ+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAorICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9jbGNsMTYvYmFja3dhcmRfbmF2LmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+IDxJTUcgCisgICAgICBoZWlnaHQ9MTYgYWx0PSIiIAorICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9lbGNsMTYvYmFja3dhcmRfbmF2LmdpZiIgCisgICAgICB3aWR0aD0xNiBib3JkZXI9MD4gPElNRyBoZWlnaHQ9MTYgYWx0PSIiIAorICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9kbGNsMTYvYmFja3dhcmRfbmF2LmdpZiIgCisgICAgICB3aWR0aD0xNiBib3JkZXI9MD48L1REPgorICAgIDxURCBiZ0NvbG9yPSNjY2NjY2M+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAorICAgICAgc3JjPSJpY29ucy9mdWxsL2NsY2wxNi9iYWNrd2FyZF9uYXYuZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4mbmJzcDs8SU1HIAorICAgICAgaGVpZ2h0PTE2IGFsdD0iIiBzcmM9Imljb25zL2Z1bGwvZWxjbDE2L2JhY2t3YXJkX25hdi5naWYiIHdpZHRoPTE2IAorICAgICAgYm9yZGVyPTA+Jm5ic3A7PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAorICAgICAgc3JjPSJpY29ucy9mdWxsL2RsY2wxNi9iYWNrd2FyZF9uYXYuZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4mbmJzcDs8L1REPgorICAgIDxURD48Rk9OVCBzaXplPS0xPiA8L0ZPTlQ+PC9URD48L1RSPgorCQorICA8VFIgYmdDb2xvcj0jZGZkZjlmPgorICAgIDxURD4yPC9URD4KKyAgICA8VEQ+R28gRm9yd2FyZDwvVEQ+CisgICAgPFREPjxGT05UIHNpemU9LTE+Jm5ic3A7Zm9yd2FyZF9uYXY8L0ZPTlQ+PC9URD4KKyAgICA8VEQ+CisgICAgICA8VEFCTEUgY2VsbFNwYWNpbmc9MiBjZWxsUGFkZGluZz0wIHdpZHRoPSIxMDAlIiBib3JkZXI9MD4KKyAgICAgICAgCisgICAgICAgIDxUUj4KKyAgICAgICAgICA8VEQgdkFsaWduPXRvcD48Zm9udCBzaXplPSItMSI+QSBzdGFuZGFyZCBicm93c2VyICdmb3J3YXJkJyBidXR0b248L2ZvbnQ+PC9URD4KKyAgICAgICAgICA8VEQgdkFsaWduPWNlbnRlciBhbGlnbj1yaWdodD4KKyAgICAgICAgICAgIDxUQUJMRT4KKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIDxUUj4KKyAgICAgICAgICAgICAgICA8VEQgCisgICAgICAgICAgICAgICAgc3R5bGU9IkJPUkRFUi1SSUdIVDogYmxhY2sgMXB4IHNvbGlkOyBCT1JERVItVE9QOiBibGFjayAxcHggc29saWQ7IEJPUkRFUi1MRUZUOiBibGFjayAxcHggc29saWQ7IEJPUkRFUi1CT1RUT006IGJsYWNrIDFweCBzb2xpZCIgCisgICAgICAgICAgICAgICAgYWxpZ249bWlkZGxlIGJnQ29sb3I9I2ZmZmZlMT48Rk9OVCAKKyAgICAgICAgICAgICAgICAgIHNpemU9LTI+Jm5ic3A7R28gRm9yd2FyZCZuYnNwOzwvRk9OVD48L1REPjwvVFI+PC9UQUJMRT48L1REPjwvVFI+PC9UQUJMRT48L1REPgorICAgIDxURD48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCisgICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL2NsY2wxNi9mb3J3YXJkX25hdi5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiA8SU1HIGhlaWdodD0xNiBhbHQ9IiIgCisgICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL2VsY2wxNi9mb3J3YXJkX25hdi5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiA8SU1HIGhlaWdodD0xNiBhbHQ9IiIgCisgICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL2RsY2wxNi9mb3J3YXJkX25hdi5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPjwvVEQ+CisgICAgPFREIGJnQ29sb3I9I2NjY2NjYz48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCisgICAgICBzcmM9Imljb25zL2Z1bGwvY2xjbDE2L2ZvcndhcmRfbmF2LmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Jm5ic3A7PElNRyAKKyAgICAgIGhlaWdodD0xNiBhbHQ9IiIgc3JjPSJpY29ucy9mdWxsL2VsY2wxNi9mb3J3YXJkX25hdi5naWYiIHdpZHRoPTE2IAorICAgICAgYm9yZGVyPTA+Jm5ic3A7PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAorICAgICAgc3JjPSJpY29ucy9mdWxsL2RsY2wxNi9mb3J3YXJkX25hdi5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiZuYnNwOzwvVEQ+CisgICAgPFREPjxGT05UIHNpemU9LTE+IDwvRk9OVD48L1REPjwvVFI+CisgIDxUUiBiZ0NvbG9yPSNmZmZmZmY+CisgICAgPFREPjM8L1REPgorICAgIDxURD5HbzwvVEQ+CisgICAgPFREPjxGT05UIHNpemU9LTE+Jm5ic3A7Z29fbmF2PC9GT05UPjwvVEQ+CisgICAgPFREPgorICAgICAgPFRBQkxFIGNlbGxTcGFjaW5nPTIgY2VsbFBhZGRpbmc9MCB3aWR0aD0iMTAwJSIgYm9yZGVyPTA+CisgICAgICAgIAorICAgICAgICA8VFI+CisgICAgICAgICAgPFREIHZBbGlnbj10b3A+PGZvbnQgc2l6ZT0iLTEiPkEgc3RhbmRhcmQgYnJvd3NlciBidXR0b24gZm9yCisgICAgICAgICAgICBuYXZpZ2F0aW5nIHRvIGEgVVJMLjwvZm9udD48L1REPgorICAgICAgICAgIDxURCB2QWxpZ249Y2VudGVyIGFsaWduPXJpZ2h0PgorICAgICAgICAgICAgPFRBQkxFPgorICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgPFRSPgorICAgICAgICAgICAgICAgIDxURCAKKyAgICAgICAgICAgICAgICBzdHlsZT0iQk9SREVSLVJJR0hUOiBibGFjayAxcHggc29saWQ7IEJPUkRFUi1UT1A6IGJsYWNrIDFweCBzb2xpZDsgQk9SREVSLUxFRlQ6IGJsYWNrIDFweCBzb2xpZDsgQk9SREVSLUJPVFRPTTogYmxhY2sgMXB4IHNvbGlkIiAKKyAgICAgICAgICAgICAgICBhbGlnbj1taWRkbGUgYmdDb2xvcj0jZmZmZmUxPjxGT05UIAorICAgICAgICAgICAgICAgICAgc2l6ZT0tMj4mbmJzcDtHbyZuYnNwOzwvRk9OVD48L1REPjwvVFI+PC9UQUJMRT48L1REPjwvVFI+PC9UQUJMRT48L1REPgorICAgIDxURD48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCisgICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL2NsY2wxNi9nb19uYXYuZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4gPElNRyBoZWlnaHQ9MTYgYWx0PSIiIAorICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9lbGNsMTYvZ29fbmF2LmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+IDxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKKyAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvZGxjbDE2L2dvX25hdi5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPjwvVEQ+CisgICAgPFREIGJnQ29sb3I9I2NjY2NjYz48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCisgICAgICBzcmM9Imljb25zL2Z1bGwvY2xjbDE2L2dvX25hdi5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiZuYnNwOzxJTUcgaGVpZ2h0PTE2IAorICAgICAgYWx0PSIiIHNyYz0iaWNvbnMvZnVsbC9lbGNsMTYvZ29fbmF2LmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Jm5ic3A7PElNRyAKKyAgICAgIGhlaWdodD0xNiBhbHQ9IiIgc3JjPSJpY29ucy9mdWxsL2RsY2wxNi9nb19uYXYuZ2lmIiB3aWR0aD0xNiAKKyAgICBib3JkZXI9MD4mbmJzcDs8L1REPgorICAgIDxURD48Rk9OVCBzaXplPS0xPiA8L0ZPTlQ+PC9URD48L1RSPgorCQorICA8VFIgYmdDb2xvcj0jZGZkZjlmPgorICAgIDxURD40PC9URD4KKyAgICA8VEQ+R28gSG9tZTwvVEQ+CisgICAgPFREPjxGT05UIHNpemU9LTE+Jm5ic3A7aG9tZV9uYXY8L0ZPTlQ+PC9URD4KKyAgICA8VEQgPgorICAgICAgPFRBQkxFIGNlbGxTcGFjaW5nPTIgY2VsbFBhZGRpbmc9MCBib3JkZXI9MD4KKyAgICAgICAgCisgICAgICAgIDxUUj4KKyAgICAgICAgICA8VEQgdkFsaWduPXRvcD48Zm9udCBzaXplPSItMSI+QSBzdGFuZGFyZCBicm93c2VyIGJ1dHRvbgorICAgICAgICAgICAgZm9yIGdvaW5nIHRvIHRoZSBob21lIGxvY2F0aW9uPC9mb250PjwvVEQ+CisgICAgICAgICAgPFREPgorICAgICAgICAgICAgPFRBQkxFPgorICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgPFRSPgorICAgICAgICAgICAgICAgIDxURCAKKyAgICAgICAgICAgICAgICBzdHlsZT0iQk9SREVSLVJJR0hUOiBibGFjayAxcHggc29saWQ7IEJPUkRFUi1UT1A6IGJsYWNrIDFweCBzb2xpZDsgQk9SREVSLUxFRlQ6IGJsYWNrIDFweCBzb2xpZDsgQk9SREVSLUJPVFRPTTogYmxhY2sgMXB4IHNvbGlkIiAKKyAgICAgICAgICAgICAgICBhbGlnbj1taWRkbGUgYmdDb2xvcj0jZmZmZmUxPjxGT05UIAorICAgICAgICAgICAgICAgICAgc2l6ZT0tMj4mbmJzcDtHbyBIb21lJm5ic3A7PC9GT05UPjwvVEQ+PC9UUj48L1RBQkxFPjwvVEQ+PC9UUj48L1RBQkxFPjwvVEQ+CisgICAgPFREPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKKyAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvY2xjbDE2L2hvbWVfbmF2LmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+IDxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKKyAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvZWxjbDE2L2hvbWVfbmF2LmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+IDxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKKyAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvZGxjbDE2L2hvbWVfbmF2LmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+PC9URD4KKyAgICA8VEQgYmdDb2xvcj0jY2NjY2NjPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKKyAgICAgIHNyYz0iaWNvbnMvZnVsbC9jbGNsMTYvaG9tZV9uYXYuZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4mbmJzcDs8SU1HIAorICAgICAgaGVpZ2h0PTE2IGFsdD0iIiBzcmM9Imljb25zL2Z1bGwvZWxjbDE2L2hvbWVfbmF2LmdpZiIgd2lkdGg9MTYgCisgICAgICBib3JkZXI9MD4mbmJzcDs8SU1HIGhlaWdodD0xNiBhbHQ9IiIgc3JjPSJpY29ucy9mdWxsL2RsY2wxNi9ob21lX25hdi5naWYiIAorICAgICAgd2lkdGg9MTYgYm9yZGVyPTA+Jm5ic3A7PC9URD4KKyAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4gPC9GT05UPjwvVEQ+PC9UUj4KKyAgPFRSIGJnQ29sb3I9I2ZmZmZmZj4KKyAgICA8VEQ+NTwvVEQ+CisgICAgPFREPlJlZnJlc2g8L1REPgorICAgIDxURD48Rk9OVCBzaXplPS0xPiZuYnNwO3JlZnJlc2hfbmF2PC9GT05UPjwvVEQ+CisgICAgPFREPgorICAgICAgPFRBQkxFIGNlbGxTcGFjaW5nPTIgY2VsbFBhZGRpbmc9MCB3aWR0aD0iMTAwJSIgYm9yZGVyPTA+CisgICAgICAgIAorICAgICAgICA8VFI+CisgICAgICAgICAgPFREIHZBbGlnbj10b3A+PGZvbnQgc2l6ZT0iLTEiPlJlZnJlc2ggdGhlIGNvbnRlbnRzIG9mIHRoZSB2aWV3PC9mb250PjwvVEQ+CisgICAgICAgICAgPFREIHZBbGlnbj1jZW50ZXIgYWxpZ249cmlnaHQ+CisgICAgICAgICAgICA8VEFCTEU+CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICA8VFI+CisgICAgICAgICAgICAgICAgPFREIAorICAgICAgICAgICAgICAgIHN0eWxlPSJCT1JERVItUklHSFQ6IGJsYWNrIDFweCBzb2xpZDsgQk9SREVSLVRPUDogYmxhY2sgMXB4IHNvbGlkOyBCT1JERVItTEVGVDogYmxhY2sgMXB4IHNvbGlkOyBCT1JERVItQk9UVE9NOiBibGFjayAxcHggc29saWQiIAorICAgICAgICAgICAgICAgIGFsaWduPW1pZGRsZSBiZ0NvbG9yPSNmZmZmZTE+PEZPTlQgCisgICAgICAgICAgICAgICAgICBzaXplPS0yPiZuYnNwO1JlZnJlc2gmbmJzcDs8L0ZPTlQ+PC9URD48L1RSPjwvVEFCTEU+PC9URD48L1RSPjwvVEFCTEU+PC9URD4KKyAgICA8VEQ+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAorICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9jbGNsMTYvcmVmcmVzaF9uYXYuZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4gPElNRyBoZWlnaHQ9MTYgYWx0PSIiIAorICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9lbGNsMTYvcmVmcmVzaF9uYXYuZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4gPElNRyBoZWlnaHQ9MTYgYWx0PSIiIAorICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9kbGNsMTYvcmVmcmVzaF9uYXYuZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD48L1REPgorICAgIDxURCBiZ0NvbG9yPSNjY2NjY2M+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAorICAgICAgc3JjPSJpY29ucy9mdWxsL2NsY2wxNi9yZWZyZXNoX25hdi5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiZuYnNwOzxJTUcgCisgICAgICBoZWlnaHQ9MTYgYWx0PSIiIHNyYz0iaWNvbnMvZnVsbC9lbGNsMTYvcmVmcmVzaF9uYXYuZ2lmIiB3aWR0aD0xNiAKKyAgICAgIGJvcmRlcj0wPiZuYnNwOzxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKKyAgICAgIHNyYz0iaWNvbnMvZnVsbC9kbGNsMTYvcmVmcmVzaF9uYXYuZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4mbmJzcDs8L1REPgorICAgIDxURD48Rk9OVCBzaXplPS0xPiA8L0ZPTlQ+PC9URD48L1RSPgorICA8VFIgYmdDb2xvcj0jZGZkZjlmPgorICAgIDxURD42PC9URD4KKyAgICA8VEQ+U3RvcDwvVEQ+CisgICAgPFREPjxmb250IHNpemU9Ii0xIj5zdG9wX25hdjwvZm9udD48L1REPgorICAgIDxURD4KKyAgICAgIDxUQUJMRSBjZWxsU3BhY2luZz0yIGNlbGxQYWRkaW5nPTAgd2lkdGg9IjEwMCUiIGJvcmRlcj0wPgorICAgICAgICAKKyAgICAgICAgPFRSPgorICAgICAgICAgIDxURCB2QWxpZ249dG9wPjxmb250IHNpemU9Ii0xIj5BIHN0YW5kYXJkIGJyb3dzZXIgYnV0dG9uIGZvciBzdG9wcGluZworICAgICAgICAgICAgdGhlIG5hdmlnYXRpb24gaW4gcHJvZ3Jlc3M8L2ZvbnQ+PC9URD4KKyAgICAgICAgICA8VEQgdkFsaWduPWNlbnRlciBhbGlnbj1yaWdodD4KKyAgICAgICAgICAgIDxUQUJMRT4KKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIDxUUj4KKyAgICAgICAgICAgICAgICA8VEQgCisgICAgICAgICAgICAgICAgc3R5bGU9IkJPUkRFUi1SSUdIVDogYmxhY2sgMXB4IHNvbGlkOyBCT1JERVItVE9QOiBibGFjayAxcHggc29saWQ7IEJPUkRFUi1MRUZUOiBibGFjayAxcHggc29saWQ7IEJPUkRFUi1CT1RUT006IGJsYWNrIDFweCBzb2xpZCIgCisgICAgICAgICAgICAgICAgYWxpZ249bWlkZGxlIGJnQ29sb3I9I2ZmZmZlMT48Rk9OVCAKKyAgICAgICAgICAgICAgICAgIHNpemU9LTI+Jm5ic3A7U3RvcCZuYnNwOyZuYnNwOzwvRk9OVD48L1REPjwvVFI+PC9UQUJMRT48L1REPjwvVFI+PC9UQUJMRT48L1REPgorICAgIDxURD48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCisgICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL2NsY2wxNi9zdG9wX25hdi5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiA8SU1HIGhlaWdodD0xNiBhbHQ9IiIgCisgICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL2VsY2wxNi9zdG9wX25hdi5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiA8SU1HIGhlaWdodD0xNiBhbHQ9IiIgCisgICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL2RsY2wxNi9zdG9wX25hdi5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPjwvVEQ+CisgICAgPFREIGJnQ29sb3I9I2NjY2NjYz48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCisgICAgICBzcmM9Imljb25zL2Z1bGwvY2xjbDE2L3N0b3BfbmF2LmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Jm5ic3A7PElNRyAKKyAgICAgIGhlaWdodD0xNiBhbHQ9IiIgc3JjPSJpY29ucy9mdWxsL2VsY2wxNi9zdG9wX25hdi5naWYiIHdpZHRoPTE2IAorICAgICAgYm9yZGVyPTA+Jm5ic3A7PElNRyBoZWlnaHQ9MTYgYWx0PSIiIHNyYz0iaWNvbnMvZnVsbC9kbGNsMTYvc3RvcF9uYXYuZ2lmIiAKKyAgICAgIHdpZHRoPTE2IGJvcmRlcj0wPiZuYnNwOzwvVEQ+CisgICAgPFREPjxGT05UIHNpemU9LTE+IDwvRk9OVD48L1REPjwvVFI+CisgIDxUUj4KKyAgICA8VEQ+NzwvVEQ+CisgICAgPFREPlNob3cgVW5jb25maWd1cmVkIEZlYXR1cmVzPC9URD4KKyAgICA8VEQ+c2hvd191bmNvbmY8L1REPgorICAgIDxURD4KKyAgICAgIDxUQUJMRSBjZWxsU3BhY2luZz0yIGNlbGxQYWRkaW5nPTAgd2lkdGg9IjEwMCUiIGJvcmRlcj0wPgorICAgICAgICAKKyAgICAgICAgPFRSPgorICAgICAgICAgIDxURCB2QWxpZ249dG9wPjxmb250IHNpemU9Ii0xIj5BIHRvZ2dsZSBidXR0b24gdGhhdCBhbGxvd3MKKyAgICAgICAgICAgIHVuY29uZmlndXJlZCBmZWF0dXJlcyB0byBzaG93IGluIHRoZSB2aWV3PC9mb250PjwvVEQ+CisgICAgICAgICAgPFREIHZBbGlnbj1jZW50ZXIgYWxpZ249cmlnaHQ+CisgICAgICAgICAgICA8VEFCTEU+CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICA8VFI+CisgICAgICAgICAgICAgICAgPFREIAorICAgICAgICAgICAgICAgIHN0eWxlPSJCT1JERVItUklHSFQ6IGJsYWNrIDFweCBzb2xpZDsgQk9SREVSLVRPUDogYmxhY2sgMXB4IHNvbGlkOyBCT1JERVItTEVGVDogYmxhY2sgMXB4IHNvbGlkOyBCT1JERVItQk9UVE9NOiBibGFjayAxcHggc29saWQiIAorICAgICAgICAgICAgICAgIGFsaWduPW1pZGRsZSBiZ0NvbG9yPSNmZmZmZTE+PEZPTlQgCisgICAgICAgICAgICAgICAgICBzaXplPS0yPiZuYnNwO1Nob3cgVW5jb25maWd1cmVkIEZlYXR1cmVzJm5ic3A7PC9GT05UPjwvVEQ+PC9UUj48L1RBQkxFPjwvVEQ+PC9UUj48L1RBQkxFPjwvVEQ+CisgICAgPFREPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKKyAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvY2xjbDE2L3Nob3dfdW5jb25mLmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+IDwvVEQ+CisgICAgPFREIEJHQ09MT1I9I2NjY2NjYz48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCisgICAgICBzcmM9Imljb25zL2Z1bGwvY2xjbDE2L3Nob3dfdW5jb25mLmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Jm5ic3A7PElNRyAKKyAgICAgIGhlaWdodD0xNiBhbHQ9IiIgc3JjPSJpY29ucy9mdWxsL2VsY2wxNi9zaG93X3VuY29uZi5naWYiIHdpZHRoPTE2IAorICAgICAgYm9yZGVyPTA+Jm5ic3A7PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAorICAgICAgc3JjPSJpY29ucy9mdWxsL2RsY2wxNi9zaG93X3VuY29uZi5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPjwvVEQ+CisgICAgPFREPjwvVEQ+PC9UUj4KKwkKKyAgPFRSIGJnQ29sb3I9I2JmYmY3Zj4KKyAgICA8VEQgY29sU3Bhbj03PjxCPjxGT05UIHNpemU9KzI+TW9kZWwgT2JqZWN0PC9GT05UPjwvQj48L1REPjwvVFI+CisgIDxUUiBiZ0NvbG9yPSNmZmZmZmY+CisgICAgPFREPjE8L1REPgorICAgIDxURD4mbmJzcDtBcHBsaWNhdGlvbiBDb25maWd1cmF0aW9uPC9URD4KKyAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4mbmJzcDthcHBfb2JqPC9GT05UPjwvVEQ+CisgICAgPFREPjxmb250IHNpemU9Ii0xIj50aGUgY3VycmVudCBjb25maWd1cmF0aW9uIHVzZWQgdG8gbG9hZCB0aGUgY3VycmVudAorICAgICAgYXBwbGljYXRpb248L2ZvbnQ+PC9URD4KKyAgICA8VEQ+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAorICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9vYmoxNi9hcHBfb2JqLmdpZiIgd2lkdGg9MTYgCisgICAgYWxpZ249bGVmdCBib3JkZXI9MD48L1REPgorICAgIDxURD48SU1HIGhlaWdodD0xNiBhbHQ9IiIgc3JjPSJpY29ucy9mdWxsL29iajE2L2FwcF9vYmouZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD48L1REPgorICAgIDxURD48Rk9OVCBzaXplPS0xPiA8L0ZPTlQ+PC9URD48L1RSPgorCQorICA8VFIgYmdDb2xvcj0jZGZkZmI+CisgICAgPFREPjI8L1REPgorICAgIDxURD5NeSBDb21wdXRlcjwvVEQ+CisgICAgPFREPjxGT05UIHNpemU9LTE+Jm5ic3A7Y29tcHV0ZXJfb2JqPC9GT05UPjwvVEQ+CisgICAgPFREPjxmb250IHNpemU9Ii0xIj50aGUgZmlsZSBzeXN0ZW0gcm9vdDwvZm9udD48L1REPgorICAgIDxURD48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCisgICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL29iajE2L2NvbXB1dGVyX29iai5naWYiIHdpZHRoPTE2IAorICAgIGFsaWduPWxlZnQgYm9yZGVyPTA+PC9URD4KKyAgICA8VEQgYmdDb2xvcj0jZmZmZmZmPgorICAgICAgPElNRyBoZWlnaHQ9MTYgYWx0PSIiIAorICAgICAgc3JjPSJpY29ucy9mdWxsL29iajE2L2NvbXB1dGVyX29iai5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPgorICAgICAgPFA+PC9QPjwvVEQ+CisgICAgPFREPjxGT05UIHNpemU9LTE+IDwvRk9OVD48L1REPjwvVFI+CisgIDxUUiBiZ0NvbG9yPSNmZmZmZmY+CisgICAgPFREPjM8L1REPgorICAgIDxURD4mbmJzcDtGZWF0dXJlPC9URD4KKyAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4mbmJzcDtmZWF0dXJlX29iajwvRk9OVD48L1REPgorICAgIDxURD48Zm9udCBzaXplPSItMSI+ZmVhdHVyZSBvYmplY3Q8L2ZvbnQ+PC9URD4KKyAgICA8VEQ+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAorICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9vYmoxNi9mZWF0dXJlX29iai5naWYiIHdpZHRoPTE2IAorYWxpZ249bGVmdCBib3JkZXI9MD48L1REPgorICAgIDxURCBiZ0NvbG9yPSNmZmZmZmY+CisgICAgICA8SU1HIGhlaWdodD0xNiBhbHQ9IiIgCisgICAgICBzcmM9Imljb25zL2Z1bGwvb2JqMTYvZmVhdHVyZV9vYmouZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4KKyAgICAgIDxQPjwvUD48L1REPgorICAgIDxURD48Rk9OVCBzaXplPS0xPiA8L0ZPTlQ+PC9URD48L1RSPgorICA8VFIgYmdDb2xvcj0jZGZkZmI+CisgICAgPFREPjQ8L1REPgorICAgIDxURD5VbmNvbmZpZ3VyZWQgRmVhdHVyZTwvVEQ+CisgICAgPFREPjxGT05UIHNpemU9LTE+Jm5ic3A7dW5jb25mX2ZlYXR1cmVfb2JqPC9GT05UPjwvVEQ+CisgICAgPFREPjxmb250IHNpemU9Ii0xIj5mZWF0dXJlIHRoYXQgaXMgY3VycmVudGx5IHVuY29uZmlndXJlZCAoaS5lLiBzdGlsbAorICAgICAgcHJlc2VudCBidXQgZGlzYWJsZWQgaW4gdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbik8L2ZvbnQ+PC9URD4KKyAgICA8VEQ+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAorICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9vYmoxNi91bmNvbmZfZmVhdHVyZV9vYmouZ2lmIiB3aWR0aD0xNiAKKyAgICBhbGlnbj1sZWZ0IGJvcmRlcj0wPjwvVEQ+CisgICAgPFREIGJnQ29sb3I9I2ZmZmZmZj4KKyAgICAgIDxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKKyAgICAgIHNyYz0iaWNvbnMvZnVsbC9vYmoxNi91bmNvbmZfZmVhdHVyZV9vYmouZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4KKyAgICAgIDxQPjwvUD48L1REPgorICAgIDxURD48Rk9OVCBzaXplPS0xPiA8L0ZPTlQ+PC9URD48L1RSPgorICA8VFIgYmdDb2xvcj0jZmZmZmZmPgorICAgIDxURD41PC9URD4KKyAgICA8VEQ+UGxhY2VzIHRvIFZpc2l0PC9URD4KKyAgICA8VEQ+cGxhY2VzX29iajwvVEQ+CisgICAgPFREPmEgZm9sZGVyIHRoYXQgY29udGFpbnMgYm9va21hcmtzIHRvIHJlbW90ZSBzaXRlcyB0aGF0CisgICAgICBjb250YWluIGNvb2wgZmVhdHVyZXM8L1REPgorICAgIDxURD48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCisgICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL29iajE2L3BsYWNlc19vYmouZ2lmIiB3aWR0aD0xNiAKK2FsaWduPWxlZnQgYm9yZGVyPTA+PC9URD4KKyAgICA8VEQgYmdDb2xvcj0jZmZmZmZmPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKKyAgICAgIHNyYz0iaWNvbnMvZnVsbC9vYmoxNi9wbGFjZXNfb2JqLmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+CisgICAgICAmbmJzcDs8L1REPgorICAgIDxURD48L1REPjwvVFI+CisgIDxUUiBiZ0NvbG9yPSNkZmRmYj4KKyAgICA8VEQ+NjwvVEQ+CisgICAgPFREPlNpdGU8L1REPgorICAgIDxURD48Zm9udCBzaXplPSItMSI+c2l0ZV9vYmombmJzcDs8L2ZvbnQ+PC9URD4KKyAgICA8VEQ+PGZvbnQgc2l6ZT0iLTEiPnVwZGF0ZSBzaXRlIG9iamVjdCB0aGF0IHJlcHJlc2VudCBhIHByb3ZpZGVyCisgICAgICBzaXRlIChzaXRlIHRoYXQgaXMgc2V0IHVwIHRvIGFjdCBhcyBhIHNvdXJjZSBvZiBmZWF0dXJlcyk8L2ZvbnQ+PC9URD4KKyAgICA8VEQ+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAorICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9vYmoxNi9zaXRlX29iai5naWYiIHdpZHRoPTE2IAorYWxpZ249bGVmdCBib3JkZXI9MD48L1REPgorICAgIDxURCBiZ0NvbG9yPSNmZmZmZmY+CisgICAgICA8SU1HIGhlaWdodD0xNiBhbHQ9IiIgCisgICAgICBzcmM9Imljb25zL2Z1bGwvb2JqMTYvc2l0ZV9vYmouZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4KKyAgICAgIDxQPjwvUD48L1REPgorICAgIDxURD48Rk9OVCBzaXplPS0xPiA8L0ZPTlQ+PC9URD48L1RSPgorICA8VFI+CisgICAgPFREPjc8L1REPgorICAgIDxURD48Zm9udCBzaXplPSItMSI+TG9jYWwgU2l0ZTwvZm9udD48L1REPgorICAgIDxURD48Zm9udCBzaXplPSItMSI+bHNpdGVfb2JqPC9mb250PjwvVEQ+CisgICAgPFREPnVwZGF0ZSBzaXRlIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgYSByZWNlaXZlciBzaXRlIChzaXRlCisgICAgICB0aGF0IGlzIHNldCB1cCB0byBhY3QgYXMgYSB0YXJnZXQgb2YgdGhlIGZlYXR1cmUgaW5zdGFsbGF0aW9uKTwvVEQ+CisgICAgPFREPjxJTUcgaGVpZ2h0PTE2IAorICAgICAgYWx0PSIiIAorc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9vYmoxNi9sc2l0ZV9vYmouZ2lmIiB3aWR0aD0xNiBhbGlnbj1sZWZ0IGJvcmRlcj0wPjwvVEQ+CisgICAgPFREIGJnQ29sb3I9I2ZmZmZmZj48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCisgICAgICBzcmM9Imljb25zL2Z1bGwvb2JqMTYvbHNpdGVfb2JqLmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+CisgICAgICAmbmJzcDs8L1REPgorICAgIDxURD48L1REPjwvVFI+CisgIDxUUiBiZ0NvbG9yPSNkZmRmYj4KKyAgICA8VEQ+ODwvVEQ+CisgICAgPFREPjxmb250IHNpemU9Ii0xIj5GZWF0dXJlIENhdGVnb3J5PC9mb250PjwvVEQ+CisgICAgPFREPjxmb250IHNpemU9Ii0xIj5jYXRlZ29yeV9vYmo8L2ZvbnQ+PC9URD4KKyAgICA8VEQ+c2l0ZXMgY2FuIGNsYXNzaWZ5IGZlYXR1cmVzIHRoZXkgaG9zdCBpbnRvIGhpZXJhcmNoaWNhbAorICAgICAgY2F0ZWdvcmllczwvVEQ+CisgICAgPFREPgorICAgICAgPFAgYWxpZ249bGVmdD48SU1HIGhlaWdodD0xNiBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL29iajE2L2NhdGVnb3J5X29iai5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPjwvUD48L1REPgorICAgIDxURCBiZ0NvbG9yPSNmZmZmZmY+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAorICAgICAgc3JjPSJpY29ucy9mdWxsL29iajE2L2NhdGVnb3J5X29iai5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPgorICAgICAgJm5ic3A7PC9URD4KKyAgICA8VEQ+PC9URD48L1RSPgorICA8VFI+CisgICAgPFREPjk8L1REPgorICAgIDxURD48Zm9udCBzaXplPSItMSI+Qm9va21hcmsgRm9sZGVyPC9mb250PjwvVEQ+CisgICAgPFREPjxmb250IHNpemU9Ii0xIj5iZm9sZGVyX29iajwvZm9udD48L1REPgorICAgIDxURD5mb2xkZXIgb2JqZWN0IGluIHRoZSB2aWV3IHRoYXQgcHJvdmlkZXMgZm9yCisgICAgICBvcmdhbml6aW5nIHNpdGUgYm9va21hcmtzIGFuZCBzZWFyY2ggb2JqZWN0czwvVEQ+CisgICAgPFREPgorICAgICAgPFAgYWxpZ249bGVmdD48SU1HIGhlaWdodD0xNiBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL29iajE2L2Jmb2xkZXJfb2JqLmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+PC9QPjwvVEQ+CisgICAgPFREIGJnQ29sb3I9I2ZmZmZmZiA+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAorICAgICAgc3JjPSJpY29ucy9mdWxsL29iajE2L2Jmb2xkZXJfb2JqLmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+CisgICAgICAmbmJzcDs8L1REPgorICAgIDxURD48L1REPjwvVFI+CisgIDxUUiBiZ0NvbG9yPSNkZmRmYj4KKyAgICA8VEQ+MTA8L1REPgorICAgIDxURD5UZXh0IFNlYXJjaDwvVEQ+CisgICAgPFREPjxmb250IHNpemU9Ii0xIj50c2VhcmNoX29iajwvZm9udD48L1REPgorICAgIDxURD48Zm9udCBzaXplPSItMSI+VGV4dCBzZWFyY2ggb2JqZWN0Jm5ic3A7PC9mb250PjwvVEQ+CisgICAgPFREPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKKyAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvb2JqMTYvdHNlYXJjaF9vYmouZ2lmIiB3aWR0aD0xNiBhbGlnbj1sZWZ0IGJvcmRlcj0wPjwvVEQ+CisgICAgPFREIGJnQ29sb3I9I2ZmZmZmZj4KKyAgICAgIDxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKKyAgICAgIHNyYz0iaWNvbnMvZnVsbC9vYmoxNi90c2VhcmNoX29iai5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPgorICAgICAgPFA+PC9QPjwvVEQ+CisgICAgPFREPjxGT05UIHNpemU9LTE+IDwvRk9OVD48L1REPjwvVFI+CisgIDxUUj4KKyAgICA8VEQ+MTE8L1REPgorICAgIDxURD5VcGRhdGUgU2VhcmNoPC9URD4KKyAgICA8VEQ+dXNlYXJjaF9vYmo8L1REPgorICAgIDxURD5BdmFpbGFibGUgVXBkYXRlcyBzZWFyY2ggb2JqZWN0PC9URD4KKyAgICA8VEQ+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAorICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9vYmoxNi91c2VhcmNoX29iai5naWYiIHdpZHRoPTE2IGFsaWduPWxlZnQgYm9yZGVyPTA+PC9URD4KKyAgICA8VEQgYmdDb2xvcj0jZmZmZmZmPgorICAgICAgPElNRyBoZWlnaHQ9MTYgYWx0PSIiIAorICAgICAgc3JjPSJpY29ucy9mdWxsL29iajE2L3VzZWFyY2hfb2JqLmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+CisgICAgICA8UD48L1A+CisgICAgPC9URD4KKyAgICA8VEQ+PC9URD48L1RSPgorICA8VFIgYmdDb2xvcj0jZGZkZmI+CisgICAgPFREPjEyPC9URD4KKyAgICA8VEQ+UGx1Zy1pbiBTZWFyY2g8L1REPgorICAgIDxURD5wc2VhcmNoX29iajwvVEQ+CisgICAgPFREPlBsdWctaW4gc2VhcmNoIG9iamVjdDwvVEQ+CisgICAgPFREPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKKyAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvb2JqMTYvcHNlYXJjaF9vYmouZ2lmIiB3aWR0aD0xNiBhbGlnbj1sZWZ0IGJvcmRlcj0wPjwvVEQ+CisgICAgPFREIGJnQ29sb3I9I2ZmZmZmZj4KKyAgICAgIDxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKKyAgICAgIHNyYz0iaWNvbnMvZnVsbC9vYmoxNi9wc2VhcmNoX29iai5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPgorICAgICAgPFA+PC9QPgorICAgIDwvVEQ+CisgICAgPFREPjwvVEQ+PC9UUj4KKyAgPFRSPgorICAgIDxURD4xMzwvVEQ+CisgICAgPFREPkZpeGVkIFZvbHVtZTwvVEQ+CisgICAgPFREPnZmaXhlZF9vYmo8L1REPgorICAgIDxURD5Mb2NhbCBmaWxlIHN5c3RlbSB2b2x1bWUgdGhhdCByZXByZXNlbnRzIGEgZml4ZWQgZHJpdmUgKFdpbmRvd3MpIG9yCisgICAgICBmb2xkZXIgKExpbnV4KTwvVEQ+CisgICAgPFREPjxJTUcgaGVpZ2h0PTE2IAorICAgICAgYWx0PSIiIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvb2JqMTYvdmZpeGVkX29iai5naWYiIHdpZHRoPTE2IGFsaWduPWxlZnQgYm9yZGVyPTA+CisgICAgPC9URD4KKyAgICA8VEQgYmdDb2xvcj0jZmZmZmZmPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKKyAgICAgIHNyYz0iaWNvbnMvZnVsbC9vYmoxNi92Zml4ZWRfb2JqLmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+CisgICAgICAKKyAgICA8L1REPgorICAgIDxURD48L1REPjwvVFI+CisgIDxUUiBiZ0NvbG9yPSNkZmRmYj4KKyAgICA8VEQ+MTQ8L1REPgorICAgIDxURD5SZW1vdGUgVm9sdW1lPC9URD4KKyAgICA8VEQ+dnJlbW90ZV9vYmo8L1REPgorICAgIDxURD5SZW1vdGUgZmlsZSBzeXN0ZW0gdm9sdW1lIHRoYXQgcmVwcmVzZW50cyBhIHNoYXJlZCBkcml2ZSAoV2luZG93KSBvcgorICAgICAgbW91bnRlZCB2b2x1bWUgKExpbnV4KTwvVEQ+CisgICAgPFREIGhlaWdodCA9MTYgCisgICAgICBhbHQ9IiIgPElNRyBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL29iajE2L3ZyZW1vdGVfb2JqLmdpZiIgd2lkdGg9MTYgYWxpZ249bGVmdCBib3JkZXI9IjEiIAorICAgPgorICAgIDwvVEQ+CisgICAgPFREIGJnQ29sb3I9I2ZmZmZmZj48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCisgICAgICBzcmM9Imljb25zL2Z1bGwvb2JqMTYvdnJlbW90ZV9vYmouZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4KKyAgICAgICZuYnNwOworICAgIDwvVEQ+CisgICAgPFREPjwvVEQ+PC9UUj4KKyAgPFRSPgorICAgIDxURD4xNTwvVEQ+CisgICAgPFREPlJlbW92YWJsZSBWb2x1bWU8L1REPgorICAgIDxURD52cmVtb3ZhYmxlX29iajwvVEQ+CisgICAgPFREPlJlbW92YWJsZSBmaWxlIHN5c3RlbSB2b2x1bWUgdGhhdCBpcyBuZWl0aGVyIENELVJPTSBub3IgRmxvcHB5IERpc2suCisgICAgICBUaGlzIGltYWdlIGlzIHVzZWQgZm9yIGFsbCBvdGhlciByZW1vdmFibGUgdm9sdW1lcyBsaWtlIERWRC1ST00sIHZhcmlvdXMKKyAgICAgIFBDTUNJQSBjYXJkcyBldGMuPC9URD4KKyAgICA8VEQ+PElNRyBoZWlnaHQ9MTYgCisgICAgICBhbHQ9IiIgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9vYmoxNi92cmVtb3ZhYmxlX29iai5naWYiIHdpZHRoPTE2IGFsaWduPWxlZnQgYm9yZGVyPTA+CisgICAgPC9URD4KKyAgICA8VEQgYmdDb2xvcj0jZmZmZmZmPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKKyAgICAgIHNyYz0iaWNvbnMvZnVsbC9vYmoxNi92cmVtb3ZhYmxlX29iai5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPgorICAgICAgJm5ic3A7CisgICAgPC9URD4KKyAgICA8VEQ+PC9URD48L1RSPgorICA8VFIgYmdDb2xvcj0jZGZkZmI+CisgICAgPFREPjE2PC9URD4KKyAgICA8VEQ+Q0QtUk9NPC9URD4KKyAgICA8VEQ+Y2Rfb2JqPC9URD4KKyAgICA8VEQ+RmlsZSBzeXN0ZW0gdm9sdW1lIHRoYXQgcmVwcmVzZW50IGEgQ0QtUk9NIGRyaXZlPC9URD4KKyAgICA8VEQ+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAorICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9vYmoxNi9jZF9vYmouZ2lmIiB3aWR0aD0xNiBhbGlnbj1sZWZ0IGJvcmRlcj0wPjwvVEQ+CisgICAgPFREIGJnQ29sb3I9I2ZmZmZmZj4KKyAgICAgIDxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKKyAgICAgIHNyYz0iaWNvbnMvZnVsbC9vYmoxNi9jZF9vYmouZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4KKyAgICAgIDxQPjwvUD4KKyAgICA8L1REPgorICAgIDxURD48L1REPjwvVFI+CisgIDxUUj4KKyAgICA8VEQ+MTc8L1REPgorICAgIDxURD5GbG9wcHkgRGlzazwvVEQ+CisgICAgPFREPjxmb250IHNpemU9Ii0xIj5mbG9wcHlfb2JqPC9mb250PjwvVEQ+CisgICAgPFREPjxmb250IHNpemU9Ii0xIj5GaWxlIHN5c3RlbSB2b2x1bWUgdGhhdCByZXByZXNlbnRzIGEgMyAxLzIgaW5jaCBmbG9wcHkKKyAgICAgIGRpc2sgZHJpdmU8L2ZvbnQ+PC9URD4KKyAgICA8VEQ+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAorICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9vYmoxNi9mbG9wcHlfb2JqLmdpZiIgd2lkdGg9MTYgYWxpZ249bGVmdCBib3JkZXI9MD48L1REPgorICAgIDxURCBiZ0NvbG9yPSNmZmZmZmY+CisgICAgICA8SU1HIGhlaWdodD0xNiBhbHQ9IiIgCisgICAgICBzcmM9Imljb25zL2Z1bGwvb2JqMTYvZmxvcHB5X29iai5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPgorICAgICAgPFA+PC9QPjwvVEQ+CisgICAgPFREPjxGT05UIHNpemU9LTE+IDwvRk9OVD48L1REPjwvVFI+CisgIDxUUiBiZ0NvbG9yPSNkZmRmYj4KKyAgICA8VEQ+MTg8L1REPgorICAgIDxURD5TYXZlZCBDb25maWd1cmF0aW9uczwvVEQ+CisgICAgPFREPnNhdmVkX29iajwvVEQ+CisgICAgPFREPjxmb250IHNpemU9IjIiPkZvbGRlciB0aGF0IGhvbGRzIHBhc3QgY29uZmlndXJhdGlvbnMgdGhhdCBoYXZlIGJlZW4gcHJlc2VydmVkIGFuZC9vcgorICAgICAgcmVuYW1lZDwvZm9udD48L1REPgorICAgIDxURD48SU1HIGhlaWdodD0xNiAKKyAgICAgIGFsdD0iIiBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL29iajE2L3NhdmVkX29iai5naWYiIHdpZHRoPTE2IGFsaWduPWxlZnQgYm9yZGVyPTA+PC9URD4KKyAgICA8VEQgYmdDb2xvcj0jZmZmZmZmID48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCisgICAgICBzcmM9Imljb25zL2Z1bGwvb2JqMTYvc2F2ZWRfb2JqLmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+PC9URD4KKyAgICA8VEQ+PC9URD48L1RSPgorICA8VFI+CisgICAgPFREPjE5PC9URD4KKyAgICA8VEQ+Q29uZmlndXJhdGlvbiBIaXN0b3J5PC9URD4KKyAgICA8VEQ+aGlzdG9yeV9vYmo8L1REPgorICAgIDxURD5Gb2xkZXIgdGhhdCBob2xkcyBwYXN0IGNvbmZpZ3VyYXRpb25zPC9URD4KKyAgICA8VEQ+PElNRyBoZWlnaHQ9MTYgCisgICAgICBhbHQ9IiIgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9vYmoxNi9oaXN0b3J5X29iai5naWYiIHdpZHRoPTE2IGFsaWduPWxlZnQgYm9yZGVyPTA+PC9URD4KKyAgICA8VEQgYmdDb2xvcj0jZmZmZmZmID48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCisgICAgICBzcmM9Imljb25zL2Z1bGwvb2JqMTYvaGlzdG9yeV9vYmouZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD48L1REPgorICAgIDxURD48L1REPjwvVFI+CisgIDxUUiBiZ0NvbG9yPSNkZmRmYj4KKyAgICA8VEQ+MjA8L1REPgorICAgIDxURD5BdmFpbGFibGUgVXBkYXRlczwvVEQ+CisgICAgPFREPnVwZGF0ZXNfb2JqPC9URD4KKyAgICA8VEQ+VXBkYXRlIFNlYXJjaCBvYmplY3QgdGhhdCBpcyBwcmUtY29uZmlndXJlZCB0byBsb29rIGZvcgorICAgICAgYXZhaWxhYmxlIHVwZGF0ZXMgb2YgYWxsIHRoZSBpbnN0YWxsZWQgZmVhdHVyZXMuIEl0IGNhbm5vdCBiZSByZW1vdmVkIGZyb20KKyAgICAgIHRoZSB2aWV3LjwvVEQ+CisgICAgPFREPjxJTUcgaGVpZ2h0PTE2IAorICAgICAgYWx0PSIiIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvb2JqMTYvdXBkYXRlc19vYmouZ2lmIiB3aWR0aD0xNiBhbGlnbj1sZWZ0IGJvcmRlcj0wPjwvVEQ+CisgICAgPFREIGJnQ29sb3I9I2ZmZmZmZiA+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAorICAgICAgc3JjPSJpY29ucy9mdWxsL29iajE2L3VwZGF0ZXNfb2JqLmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+PC9URD4KKyAgICA8VEQ+PC9URD48L1RSPgorICA8VFI+CisgICAgPFREPjIxPC9URD4KKyAgICA8VEQ+Q29uZmlndXJhdGlvbjwvVEQ+CisgICAgPFREPmNvbmZpZ19vYmo8L1REPgorICAgIDxURD5BIGNvbmZpZ3VyYXRpb24gaGlzdG9yeSBlbnRyeSB0aGF0IHJlcHJlc2VudHMgb25lCisgICAgICBjb25maWd1cmF0aW9uPC9URD4KKyAgICA8VEQ+PElNRyBoZWlnaHQ9MTYgCisgICAgICBhbHQ9IiIgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9vYmoxNi9jb25maWdfb2JqLmdpZiIgd2lkdGg9MTYgYWxpZ249bGVmdCBib3JkZXI9MD48L1REPgorICAgIDxURCBiZ0NvbG9yPSNmZmZmZmYgPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKKyAgICAgIHNyYz0iaWNvbnMvZnVsbC9vYmoxNi9jb25maWdfb2JqLmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+PC9URD4KKyAgICA8VEQ+PC9URD48L1RSPgorCQorCQorCQorICA8VFIgYmdDb2xvcj0jY2NjY2NjPgorICAgIDxURCBjb2xTcGFuPTc+PEI+PEZPTlQgc2l6ZT0rMj5PYmplY3QgT3ZlcmxheSA8L0ZPTlQ+PC9CPjwvVEQ+PC9UUj4KKyAgPFRSIGJnQ29sb3I9I2ZmZmZmZj4KKyAgICA8VEQ+MTwvVEQ+CisgICAgPFREPiZuYnNwO2N1cnJlbnQ8L1REPgorICAgIDxURD48Zm9udCBzaXplPSItMSI+Y3VycmVudF9jbyZuYnNwOzwvZm9udD48L1REPgorICAgIDxURD48Rk9OVCBzaXplPS0xPiZuYnNwO2luZGljYXRlcyB0aGF0IHRoZSBjb25maWd1cmF0aW9uIGlzIGN1cnJlbnQgaS5lLiBpbgorICAgICAgZWZmZWN0PC9GT05UPjwvVEQ+CisgICAgPFREPjxJTUcgaGVpZ2h0PTggYWx0PSIiIAorICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9vdnIxNi9jdXJyZW50X2NvLmdpZiIgd2lkdGg9NyBib3JkZXI9MD48L1REPgorICAgIDxURCBiZ0NvbG9yPSNmZmZmZmY+CisgICAgICA8SU1HIGhlaWdodD04IGFsdD0iIiAKKyAgICAgIHNyYz0iaWNvbnMvZnVsbC9vdnIxNi9jdXJyZW50X2NvLmdpZiIgd2lkdGg9NyBib3JkZXI9MD4KKyAgICAgIDxQPjwvUD48L1REPgorICAgIDxURD4gPC9URD48L1RSPgorICA8VFIgYmdDb2xvcj0jZGZkZmI+CisgICAgPFREPjI8L1REPgorICAgIDxURD4mbmJzcDtlcnJvcjwvVEQ+CisgICAgPFREPjxGT05UIHNpemU9LTE+ZXJyb3JfY28mbmJzcDs8L0ZPTlQ+PC9URD4KKyAgICA8VEQ+PEZPTlQgc2l6ZT0tMT53aWxsIGJlIG92ZXJsYXllZCBvdmVyIFBERSBlZGl0b3Igb2JqZWN0cyB0aGF0IGFyZSAKKyAgICAgIHNvbWVob3cgYXNzb2NpYXRlZCB3aXRoIFhNTCBzeW50YXggb3IgdmFsaWRhdGlvbiBlcnJvcnMmbmJzcDs8L0ZPTlQ+PC9URD4KKyAgICA8VEQ+PElNRyBoZWlnaHQ9OCBhbHQ9IiIgCisgICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL292cjE2L2Vycm9yX2NvLmdpZiIgd2lkdGg9NyBib3JkZXI9MD48L1REPgorICAgIDxURCBiZ0NvbG9yPSNmZmZmZmY+CisgICAgICA8SU1HIGhlaWdodD04IGFsdD0iIiAKKyAgICAgIHNyYz0iaWNvbnMvZnVsbC9vdnIxNi9lcnJvcl9jby5naWYiIHdpZHRoPTcgYm9yZGVyPTA+CisgICAgICA8UD48L1A+PC9URD4KKyAgICA8VEQ+IDwvVEQ+PC9UUj4KKyAgPFRSIGJnQ29sb3I9I2ZmZmZmZj4KKyAgICA8VEQ+MzwvVEQ+CisgICAgPFREPiZuYnNwO2luc3RhbGxhYmxlPC9URD4KKyAgICA8VEQ+PGZvbnQgc2l6ZT0iLTEiPmluc3RhbGxhYmxlX2NvJm5ic3A7PC9mb250PjwvVEQ+CisgICAgPFREPjxmb250IHNpemU9Ii0xIj5pbmRpY2F0ZXMgdGhhdCBzaXRlIGNhbiBhY2NlcHQgZmVhdHVyZXMgZHVyaW5nCisgICAgICBpbnN0YWxsYXRpb248L2ZvbnQ+PC9URD4KKyAgICA8VEQ+PElNRyBoZWlnaHQ9OCBhbHQ9IiIgCisgICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL292cjE2L2luc3RhbGxhYmxlX2NvLmdpZiIgd2lkdGg9NyBib3JkZXI9MD48L1REPgorICAgIDxURCBiZ0NvbG9yPSNmZmZmZmY+CisgICAgICA8SU1HIGhlaWdodD04IGFsdD0iIiAKKyAgICAgIHNyYz0iaWNvbnMvZnVsbC9vdnIxNi9pbnN0YWxsYWJsZV9jby5naWYiIHdpZHRoPTcgYm9yZGVyPTA+CisgICAgICA8UD48L1A+PC9URD4KKyAgICA8VEQ+IDwvVEQ+PC9UUj4KKyAgPFRSIGJnQ29sb3I9I2RmZGZiPgorICAgIDxURD40PC9URD4KKyAgICA8VEQ+Jm5ic3A7bGlua2VkPC9URD4KKyAgICA8VEQ+PGZvbnQgc2l6ZT0iLTEiPmxpbmtlZF9jbyZuYnNwOzwvZm9udD48L1REPgorICAgIDxURD48Zm9udCBzaXplPSItMSI+aW5kaWNhdGVzIHRoYXQgdGhlIHNpdGUgaXMgb25seSBsaW5rZWQgdG8gdGhlCisgICAgICBjb25maWd1cmF0aW9uPC9mb250PjwvVEQ+CisgICAgPFREPjxJTUcgaGVpZ2h0PTEwIGFsdD0iIiAKKyAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvb3ZyMTYvbGlua2VkX2NvLmdpZiIgd2lkdGg9MTEgYm9yZGVyPTA+PC9URD4KKyAgICA8VEQgYmdDb2xvcj0jZmZmZmZmPgorICAgICAgPElNRyBoZWlnaHQ9OCBhbHQ9IiIgCisgICAgICBzcmM9Imljb25zL2Z1bGwvb3ZyMTYvbGlua2VkX2NvLmdpZiIgd2lkdGg9NyBib3JkZXI9MD4KKyAgICAgIDxQPjwvUD48L1REPgorICAgIDxURD4gPC9URD48L1RSPgorICAgIDxUUiBiZ0NvbG9yPSNmZmZmZmY+CisgICAgPFREPjU8L1REPgorICAgIDxURD51bmNvbmZpZ3VyZWQ8L1REPgorICAgIDxURD48Zm9udCBzaXplPSItMSI+dW5jb25maWd1cmVkX2NvJm5ic3A7PC9mb250PjwvVEQ+CisgICAgPFREPjxmb250IHNpemU9Ii0xIj4gICAgICAKKyAgICAgIDwvZm9udD48L1REPgorICAgIDxURD48L1REPgorICAgIDxURCBiZ0NvbG9yPSNmZmZmZmY+CisgICAgICA8UD48L1A+PElNRyBoZWlnaHQ9OCBhbHQ9IiIgc3JjPSJpY29ucy9mdWxsL292cjE2L3VuY29uZmlndXJlZF9jby5naWYiIAorICAgICAgd2lkdGg9NyBib3JkZXI9MD48L1REPgorICAgIDxURD4gPC9URD48L1RSPgorCQorICAKKyAgCisgIDx0ciBiZ0NvbG9yPSNjY2NjY2M+CisgICAgPFREIGNvbFNwYW49Nz48Yj48Zm9udCBzaXplPSIrMiI+Rm9ybXMgQXJ0d29yazwvZm9udD48L2I+PC9URD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDxURD4xPC9URD4KKyAgICA8VEQ+Jm5ic3A7VG9waWM8L1REPgorICAgIDxURD48Zm9udCBzaXplPSItMSI+dG9waWMmbmJzcDs8L2ZvbnQ+PC9URD4KKyAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4mbmJzcDthbiBpbWFnZSB0byBiZSB1c2VkIGFzIGEgY3VzdG9tIGJ1bGxldCBmb3IgaXRlbXMgaW4KKyAgICAgIGEgJ1dlbGNvbWUnIHBhZ2U8L0ZPTlQ+PC9URD4KKyAgICA8VEQ+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAorICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9mb3Jtcy90b3BpYy5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPjwvVEQ+CisgICAgPFREIGJnQ29sb3I9I2ZmZmZmZj48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCisgICAgICBzcmM9Imljb25zL2Z1bGwvZm9ybXMvdG9waWMuZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD48L1REPgorICAgIDxURD4gPC9URD4KKyAgPC90cj4KKyAgPHRyIGJnQ29sb3I9I2RmZGZiPgorICAgIDxURD4yPC9URD4KKyAgICA8VEQ+RGVmYXVsdCBQcm92aWRlcjwvVEQ+CisgICAgPFREPjxmb250IHNpemU9Ii0xIj5kZWZfcHJvdmlkZXImbmJzcDs8L2ZvbnQ+PC9URD4KKyAgICA8VEQ+PGZvbnQgc2l6ZT0iLTEiPmFuIGltYWdlIHRvIGJlIHVzZWQgaW4gYSBmZWF0dXJlIGRlc2NyaXB0aW9uIHBhZ2UgaW4gCisgICAgICBjYXNlcyB3aGVyZSBvbmUgd2FzIG5vdCBzdXBwbGllZCBieSBmZWF0dXJlIHByb3ZpZGVyIChzaG91bGQgYmUgSlBFRyk8SU1HIAorICAgICAgaGVpZ2h0PTQ4IGFsdD0iIiBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL2Zvcm1zL2RlZl9wcm92aWRlci5naWYiIHdpZHRoPTEwOSAKKyAgICAgIGJvcmRlcj0wPiAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgPC9mb250PjwvVEQ+CisgICAgPFREPjwvVEQ+CisgICAgPFREIGJnQ29sb3I9I2ZmZmZmZj48SU1HIGhlaWdodD0xNTAgYWx0PSIiIAorICAgICAgc3JjPSJpY29ucy9mdWxsL2Zvcm1zL2RlZl9wcm92aWRlci5naWYiIHdpZHRoPTE5MCBib3JkZXI9MD4mbmJzcDs8L1REPgorICAgIDxURD4gPC9URD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDxURD4zPC9URD4KKyAgICA8VEQ+Jm5ic3A7Rm9ybSBCYW5uZXI8L1REPgorICAgIDxURD48Zm9udCBzaXplPSItMSI+Zm9ybV9iYW5uZXImbmJzcDs8L2ZvbnQ+PC9URD4KKyAgICA8VEQ+PGZvbnQgc2l6ZT0iLTEiPmEgYmFubmVyIGltYWdlIHVzZWQgaW4gYWxsIGZvcm0gcGFnZXMgYmVoaW5kIHRoZSBoZWFkaW5nCisgICAgICAoc2hvd24gaGVyZSBpbiAxOjEwIHpvb20gb3V0KTwvZm9udD48L1REPgorICAgIDxURD48SU1HIGhlaWdodD0zIGFsdD0iIiAKKyAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvZm9ybXMvZm9ybV9iYW5uZXIuZ2lmIiB3aWR0aD02MCBib3JkZXI9MD48L1REPgorICAgIDxURCBiZ0NvbG9yPSNmZmZmZmY+Jm5ic3A7CisgICAgICA8UD48L1A+PC9URD4KKyAgICA8VEQ+IDwvVEQ+CisgIDwvdHI+CisgIDx0ciBiZ0NvbG9yPSNkZmRmYj4KKyAgICA8VEQ+NDwvVEQ+CisgICAgPFREPiZuYnNwO0Zvcm0gQmFubmVyIFVuZGVybGluZTwvVEQ+CisgICAgPFREPjxmb250IHNpemU9Ii0xIj5mb3JtX3VuZGVybGluZSZuYnNwOzwvZm9udD48L1REPgorICAgIDxURD48Zm9udCBzaXplPSItMSI+YSBzZWNvbmQgcG9ydGlvbiBvZiB0aGUgYmFubmVyIHVzZWQgdW5kZXIgdGhlIGhlYWRpbmcKKyAgICAgIHRleHQgKHNob3duIGhlcmUgaW4gMToxMCB6b29tIG91dCk8L2ZvbnQ+PC9URD4KKyAgICA8VEQ+PElNRyBoZWlnaHQ9MSBhbHQ9IiIgCisgICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL2Zvcm1zL2Zvcm1fdW5kZXJsaW5lLmdpZiIgd2lkdGg9NjAgYm9yZGVyPTA+PC9URD4KKyAgICA8VEQgYmdDb2xvcj0jZmZmZmZmPiZuYnNwOworICAgICAgPFA+PC9QPjwvVEQ+CisgICAgPFREPiA8L1REPgorICA8L3RyPgorICAKKyAgCisgIAorICAKKyAgPFRSIGJnQ29sb3I9I2NjY2NjYz4KKyAgICA8VEQgY29sU3Bhbj03PjxCPjxGT05UIHNpemU9KzI+V2l6YXJkIEdyYXBoaWM8L0ZPTlQ+PC9CPjwvVEQ+PC9UUj4KKyAgPFRSIGJnQ29sb3I9I2ZmZmZmZj4KKyAgICA8VEQ+MTwvVEQ+CisgICAgPFREPk5ldyBCb29rbWFyayB3aXphcmQ8L1REPgorICAgIDxURD48Rk9OVCBzaXplPS0xPiZuYnNwO25ld19ib29rbWFya193aXo8L0ZPTlQ+PC9URD4KKyAgICA8VEQ+PGZvbnQgc2l6ZT0iLTEiPmNyZWF0ZXMgYSBuZXcgdXBkYXRlIHNpdGUgYm9va21hcms8L2ZvbnQ+PC9URD4KKyAgICA8VEQ+PElNRyBoZWlnaHQ9NTggYWx0PSIiIAorICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC93aXpiYW4vbmV3X2Jvb2ttYXJrX3dpei5naWYiIAorICAgICAgd2lkdGg9NzUgYm9yZGVyPTA+PC9URD4KKyAgICA8VEQgYmdDb2xvcj0jZmZmZmZmPjxJTUcgaGVpZ2h0PTU4IGFsdD0iIiAKKyAgICAgIHNyYz0iaWNvbnMvZnVsbC93aXpiYW4vbmV3X2Jvb2ttYXJrX3dpei5naWYiIHdpZHRoPTc1IGJvcmRlcj0wPiZuYnNwOzwvVEQ+CisgICAgPFREPiA8L1REPjwvVFI+CisgIDxUUiBiZ0NvbG9yPSNkZmRmYj4KKyAgICA8VEQ+MjwvVEQ+CisgICAgPFREPk5ldyBGb2xkZXIgd2l6YXJkPC9URD4KKyAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4mbmJzcDtuZXdfZm9sZGVyX3dpejwvRk9OVD48L1REPgorICAgIDxURD48Zm9udCBzaXplPSItMSI+Y3JlYXRlcyBhIG5ldyBib29rbWFyayBmb2xkZXI8L2ZvbnQ+PC9URD4KKyAgICA8VEQ+PElNRyBoZWlnaHQ9NTggYWx0PSIiIAorICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC93aXpiYW4vbmV3X2ZvbGRlcl93aXouZ2lmIiAKKyAgICAgIHdpZHRoPTc1IGJvcmRlcj0wPjwvVEQ+CisgICAgPFREIGJnQ29sb3I9I2ZmZmZmZj48SU1HIGhlaWdodD01OCBhbHQ9IiIgCisgICAgICBzcmM9Imljb25zL2Z1bGwvd2l6YmFuL25ld19mb2xkZXJfd2l6LmdpZiIgd2lkdGg9NzUgYm9yZGVyPTA+Jm5ic3A7PC9URD4KKyAgICA8VEQ+IDwvVEQ+PC9UUj4KKyAgPFRSIGJnQ29sb3I9I2ZmZmZmZj4KKyAgICA8VEQ+MzwvVEQ+CisgICAgPFREPk5ldyBTZWFyY2ggd2l6YXJkPC9URD4KKyAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4mbmJzcDtuZXdfc2VhcmNoX3dpejwvRk9OVD48L1REPgorICAgIDxURD48Rk9OVCBzaXplPS0xPmNyZWF0ZXMgYSBuZXcgc2VhcmNoIG9iamVjdDwvRk9OVD48L1REPgorICAgIDxURD48SU1HIGhlaWdodD01OCBhbHQ9IiIgCisgICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL3dpemJhbi9uZXdfc2VhcmNoX3dpei5naWYiIAorICAgICAgd2lkdGg9NzUgYm9yZGVyPTA+PC9URD4KKyAgICA8VEQgYmdDb2xvcj0jZmZmZmZmPjxJTUcgaGVpZ2h0PTU4IGFsdD0iIiAKKyAgICAgIHNyYz0iaWNvbnMvZnVsbC93aXpiYW4vbmV3X3NlYXJjaF93aXouZ2lmIiB3aWR0aD03NSBib3JkZXI9MD4mbmJzcDs8L1REPgorICAgIDxURD4gPC9URD48L1RSPgorICA8VFIgYmdDb2xvcj0jZGZkZmI+CisgICAgPFREPjQ8L1REPgorICAgIDxURD5JbnN0YWxsIEZlYXR1cmUgd2l6YXJkPC9URD4KKyAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4mbmJzcDtpbnN0YWxsX3dpejwvRk9OVD48L1REPgorICAgIDxURD48Zm9udCBzaXplPSItMSI+aW5zdGFsbHMgYSBuZXcgZmVhdHVyZSBpbnRvIHRoZSBwbGF0Zm9ybTwvZm9udD48L1REPgorICAgIDxURD48SU1HIGhlaWdodD01OCBhbHQ9IiIgCisgICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL3dpemJhbi9pbnN0YWxsX3dpei5naWYiIAorICAgICAgd2lkdGg9NzUgYm9yZGVyPTA+PC9URD4KKyAgICA8VEQgYmdDb2xvcj0jZmZmZmZmPjxJTUcgaGVpZ2h0PTU4IGFsdD0iIiAKKyAgICAgIHNyYz0iaWNvbnMvZnVsbC93aXpiYW4vaW5zdGFsbF93aXouZ2lmIiB3aWR0aD03NSBib3JkZXI9MD4mbmJzcDs8L1REPgorICAgIDxURD4gPC9URD48L1RSPgorICA8VFIgYmdDb2xvcj0jZmZmZmZmPgorICAgIDxURCA+NTwvVEQ+CisgICAgPFREPlVwZGF0ZSBGZWF0dXJlIHdpemFyZDwvVEQ+CisgICAgPFREPjxGT05UIHNpemU9LTE+Jm5ic3A7dXBkYXRlX3dpejwvRk9OVD48L1REPgorICAgIDxURD48Zm9udCBzaXplPSItMSI+aW5zdGFsbHMgYSBuZXdlciB2ZXJzaW9uIG9mIGFuIGFscmVhZHkgaW5zdGFsbGVkIGZlYXR1cmU8L2ZvbnQ+PC9URD4KKyAgICA8VEQ+PElNRyBoZWlnaHQ9NTggYWx0PSIiIAorICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC93aXpiYW4vdXBkYXRlX3dpei5naWYiIAorICAgICAgd2lkdGg9NzUgYm9yZGVyPTA+PC9URD4KKyAgICA8VEQgYmdDb2xvcj0jZmZmZmZmPjxJTUcgaGVpZ2h0PTU4IGFsdD0iIiAKKyAgICAgIHNyYz0iaWNvbnMvZnVsbC93aXpiYW4vdXBkYXRlX3dpei5naWYiIHdpZHRoPTc1IGJvcmRlcj0wPiZuYnNwOzwvVEQ+CisgICAgPFREPiA8L1REPjwvVFI+CisgIDxUUiBiZ0NvbG9yPSNkZmRmYj4KKyAgICA8VEQgPjY8L1REPgorICAgIDxURD5Db25maWd1cmUgRmVhdHVyZSB3aXphcmQ8L1REPgorICAgIDxURD48Rk9OVCBzaXplPS0xPiZuYnNwO2NvbmZpZ193aXo8L0ZPTlQ+PC9URD4KKyAgICA8VEQ+PGZvbnQgc2l6ZT0iLTEiPmNvbmZpZ3VyZXMgb3IgdW5jb25maWd1cmVzIGFuIGluc3RhbGxlZCBmZWF0dXJlPC9mb250PjwvVEQ+CisgICAgPFREPjxJTUcgaGVpZ2h0PTU4IGFsdD0iIiAKKyAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvd2l6YmFuL2NvbmZpZ193aXouZ2lmIiAKKyAgICAgIHdpZHRoPTc1IGJvcmRlcj0wPjwvVEQ+CisgICAgPFREIGJnQ29sb3I9I2ZmZmZmZj48SU1HIGhlaWdodD01OCBhbHQ9IiIgCisgICAgICBzcmM9Imljb25zL2Z1bGwvd2l6YmFuL2NvbmZpZ193aXouZ2lmIiB3aWR0aD03NSBib3JkZXI9MD4mbmJzcDs8L1REPgorICAgIDxURD4gPC9URD48L1RSPgorICA8VFI+CisgICAgPFREPjc8L1REPgorICAgIDxURD5Vbmluc3RhbGwgRmVhdHVyZSB3aXphcmQ8L1REPgorICAgIDxURD48Rk9OVCBzaXplPS0xPiZuYnNwO3VuaW5zdGFsbF93aXo8L0ZPTlQ+PC9URD4KKyAgICA8VEQ+PGZvbnQgc2l6ZT0iLTEiPnBlcm1hbmVudGx5IHJlbW92ZXMgYSBmZWF0dXJlIGZyb20gdGhlIHBsYXRmb3JtPC9mb250PjwvVEQ+CisgICAgPFREPjxJTUcgaGVpZ2h0PTU4IGFsdD0iIiAKKyAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvd2l6YmFuL3VuaW5zdGFsbF93aXouZ2lmIiAKKyAgICAgIHdpZHRoPTc1IGJvcmRlcj0wPjwvVEQ+CisgICAgPFREIGJnQ29sb3I9I2ZmZmZmZj48SU1HIGhlaWdodD01OCBhbHQ9IiIgCisgICAgICBzcmM9Imljb25zL2Z1bGwvd2l6YmFuL3VuaW5zdGFsbF93aXouZ2lmIiB3aWR0aD03NSBib3JkZXI9MD4mbmJzcDs8L1REPgorICAgIDxURD4gPC9URD48L1RSPgorICA8VFIgYmdDb2xvcj0jZGZkZmI+CisgICAgPFREPjg8L1REPgorICAgIDxURD5EZWZhdWx0IEluc3RhbGwgV2l6YXJkIGJhbm5lcjwvVEQ+CisgICAgPFREPjxGT05UIHNpemU9LTE+Jm5ic3A7ZGVmX3dpemJhbjwvRk9OVD48L1REPgorICAgIDxURD48Zm9udCBzaXplPSItMSI+YSBkZWZhdWx0IGltYWdlIHNob3duIGluIGluc3RhbGwgd2l6YXJkIHBhZ2VzIHdoZW4gCisgICAgICBvbmUgaXMgbm90IHN1cHBsaWVkIGJ5IGZlYXR1cmUgcHJvdmlkZXJzPElNRyBoZWlnaHQ9MjU4IGFsdD0iIiAKKyAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvd2l6YmFuL2RlZl93aXpiYW4uanBnIiB3aWR0aD0xMTggCitib3JkZXI9MD4gICAgICAgICAKKyAgICAgICAgICAgPC9mb250PjwvVEQ+CisgICAgPFREPjwvVEQ+CisgICAgPFREIGJnQ29sb3I9I2ZmZmZmZj48SU1HIGhlaWdodD0yNTggYWx0PSIiIAorICAgICAgc3JjPSJpY29ucy9mdWxsL3dpemJhbi9kZWZfd2l6YmFuLmpwZyIgd2lkdGg9MTE4IGJvcmRlcj0wPiZuYnNwOzwvVEQ+CisgICAgPFREPiA8L1REPjwvVFI+PC9UQUJMRT4KKzxQPjwvUD48L0JPRFk+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9hYm91dC5odG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9hYm91dC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MDIzMzAKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2Fib3V0Lmh0bWwKQEAgLTAsMCArMSwyOCBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKKyAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KKzx0aXRsZT5BYm91dDwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keSBsYW5nPSJFTi1VUyI+Cis8aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KKyAKKzxwPkp1bmUgMiwgMjAwNjwvcD4JCis8aDM+TGljZW5zZTwvaDM+CisKKzxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAoraW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQorRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKK2F0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCitGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgorCis8cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAorYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQorYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAorcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCitpbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAorYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KKworPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvYnVpbGQucHJvcGVydGllcyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvYnVpbGQucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjdjMzczCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9idWlsZC5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTkgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCisjIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCisjIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KKyMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQorIw0KKyMgQ29udHJpYnV0b3JzOg0KKyMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCitiaW4uaW5jbHVkZXMgPSBwbHVnaW4ucHJvcGVydGllcyxcDQorICAgICAgICAgICAgICAgaWNvbnMvLFwNCisgICAgICAgICAgICAgICAuLFwNCisgICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwNCisgICAgICAgICAgICAgICBhYm91dC5odG1sLFwNCisgICAgICAgICAgICAgICBNRVRBLUlORi8NCitzcmMuaW5jbHVkZXMgPSBhYm91dC5odG1sDQorc291cmNlLi4gPSBzcmMvDQorI2phcnMuZXh0cmEuY2xhc3NwYXRoID0gLi4vb3JnLmVjbGlwc2UudG9tY2F0L3NlcnZsZXQuamFyDQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9kbGNsMTYvY29sbGFwc2VhbGwuZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9kbGNsMTYvY29sbGFwc2VhbGwuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkYzBkZTUKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2RsY2wxNi9jb2xsYXBzZWFsbC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9kbGNsMTYvaGllcmFyY2hpY2FsTGF5b3V0LmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZGxjbDE2L2hpZXJhcmNoaWNhbExheW91dC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJlZWI2ZAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZGxjbDE2L2hpZXJhcmNoaWNhbExheW91dC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9kbGNsMTYvc2hvd191bmNvbmYuZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9kbGNsMTYvc2hvd191bmNvbmYuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4Y2Y5NmIKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2RsY2wxNi9zaG93X3VuY29uZi5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9kdG9vbDE2L2NvbmZpZ193aXouZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9kdG9vbDE2L2NvbmZpZ193aXouZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlOGFjZWMKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2R0b29sMTYvY29uZmlnX3dpei5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9kdG9vbDE2L2luc3RhbGxfd2l6LmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZHRvb2wxNi9pbnN0YWxsX3dpei5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg5ZmYyOQotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZHRvb2wxNi9pbnN0YWxsX3dpei5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9kdG9vbDE2L3VuaW5zdGFsbF93aXouZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9kdG9vbDE2L3VuaW5zdGFsbF93aXouZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3NWZjZDIKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2R0b29sMTYvdW5pbnN0YWxsX3dpei5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9kdG9vbDE2L3VwZGF0ZV93aXouZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9kdG9vbDE2L3VwZGF0ZV93aXouZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1OWQ0NDkKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2R0b29sMTYvdXBkYXRlX3dpei5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9lbGNsMTYvY29sbGFwc2VhbGwuZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9lbGNsMTYvY29sbGFwc2VhbGwuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyZDgwYTkKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2VsY2wxNi9jb2xsYXBzZWFsbC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9lbGNsMTYvaGllcmFyY2hpY2FsTGF5b3V0LmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZWxjbDE2L2hpZXJhcmNoaWNhbExheW91dC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM0NDg2MQotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZWxjbDE2L2hpZXJhcmNoaWNhbExheW91dC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9lbGNsMTYvc2hvd191bmNvbmYuZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9lbGNsMTYvc2hvd191bmNvbmYuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5NWI3MDUKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2VsY2wxNi9zaG93X3VuY29uZi5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9ldG9vbDE2L2NvbmZpZ193aXouZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9ldG9vbDE2L2NvbmZpZ193aXouZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1YWM3MjAKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2V0b29sMTYvY29uZmlnX3dpei5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9ldG9vbDE2L2luc3RhbGxfd2l6LmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZXRvb2wxNi9pbnN0YWxsX3dpei5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI0YzYzZgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZXRvb2wxNi9pbnN0YWxsX3dpei5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9ldG9vbDE2L3VuaW5zdGFsbF93aXouZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9ldG9vbDE2L3VuaW5zdGFsbF93aXouZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzMzMxMjgKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2V0b29sMTYvdW5pbnN0YWxsX3dpei5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9ldG9vbDE2L3VwZGF0ZV93aXouZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9ldG9vbDE2L3VwZGF0ZV93aXouZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhODRlYmUKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2V0b29sMTYvdXBkYXRlX3dpei5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9ldmlldzE2L2NvbmZpZ3MuZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9ldmlldzE2L2NvbmZpZ3MuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5ODRmYmEKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2V2aWV3MTYvY29uZmlncy5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9ldmlldzE2L3ByZXZpZXcuZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9ldmlldzE2L3ByZXZpZXcuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2YmY5Y2YKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2V2aWV3MTYvcHJldmlldy5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mb3Jtcy9kZWZfcHJvdmlkZXIuanBnIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mb3Jtcy9kZWZfcHJvdmlkZXIuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiYjAzZmQKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Zvcm1zL2RlZl9wcm92aWRlci5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mb3Jtcy9mb3JtX2Jhbm5lci5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Zvcm1zL2Zvcm1fYmFubmVyLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWJjMGIyCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mb3Jtcy9mb3JtX2Jhbm5lci5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mb3Jtcy9mb3JtX2Jhbm5lci5qcGcgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Zvcm1zL2Zvcm1fYmFubmVyLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTNlMmQyCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mb3Jtcy9mb3JtX2Jhbm5lci5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mb3Jtcy9mb3JtX3VuZGVybGluZS5qcGcgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Zvcm1zL2Zvcm1fdW5kZXJsaW5lLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmYzZDBiCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mb3Jtcy9mb3JtX3VuZGVybGluZS5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mb3Jtcy90b3BpYy5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Zvcm1zL3RvcGljLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWRkNGVjCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mb3Jtcy90b3BpYy5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi9hcHBfb2JqLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb2JqMTYvYXBwX29iai5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzUzY2FkNwotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb2JqMTYvYXBwX29iai5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi9iZm9sZGVyX29iai5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL29iajE2L2Jmb2xkZXJfb2JqLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDI3M2U0Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi9iZm9sZGVyX29iai5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi9jYXRlZ29yeV9vYmouZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi9jYXRlZ29yeV9vYmouZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ODdkMDcKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL29iajE2L2NhdGVnb3J5X29iai5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi9jb25maWdfb2JqLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb2JqMTYvY29uZmlnX29iai5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk4NGZiYQotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb2JqMTYvY29uZmlnX29iai5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi9lZml4Ml9vYmouZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi9lZml4Ml9vYmouZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMzg5NTcKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL29iajE2L2VmaXgyX29iai5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi9lZml4X29iai5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL29iajE2L2VmaXhfb2JqLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2ZjNDk5Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi9lZml4X29iai5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi9lcnJvcl9zdF9vYmouZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi9lcnJvcl9zdF9vYmouZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiYzYwNjgKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL29iajE2L2Vycm9yX3N0X29iai5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi9lc2l0ZV9vYmouZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi9lc2l0ZV9vYmouZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1ZmQwN2IKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL29iajE2L2VzaXRlX29iai5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi9mZWF0dXJlX29iai5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL29iajE2L2ZlYXR1cmVfb2JqLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzA2NjgwCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi9mZWF0dXJlX29iai5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi9oaXN0b3J5X29iai5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL29iajE2L2hpc3Rvcnlfb2JqLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODlkNDNhCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi9oaXN0b3J5X29iai5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi9sc2l0ZV9vYmouZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi9sc2l0ZV9vYmouZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2NTBiZGIKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL29iajE2L2xzaXRlX29iai5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi9ub3RpbnN0YWxsZWRfZmVhdHVyZV9vYmouZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi9ub3RpbnN0YWxsZWRfZmVhdHVyZV9vYmouZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxOTJiODQKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL29iajE2L25vdGluc3RhbGxlZF9mZWF0dXJlX29iai5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi9va19zdF9vYmouZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi9va19zdF9vYmouZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljYWNiOTYKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL29iajE2L29rX3N0X29iai5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi9wc2l0ZV9vYmouZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi9wc2l0ZV9vYmouZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4ODk3ZjEKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL29iajE2L3BzaXRlX29iai5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi9zaXRlX29iai5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL29iajE2L3NpdGVfb2JqLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODU2OGY0Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi9zaXRlX29iai5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi91bmNvbmZfZmVhdHVyZV9vYmouZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi91bmNvbmZfZmVhdHVyZV9vYmouZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2ODgxZmQKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL29iajE2L3VuY29uZl9mZWF0dXJlX29iai5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi91cGRhdGVzX29iai5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL29iajE2L3VwZGF0ZXNfb2JqLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmY0ZjdjCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi91cGRhdGVzX29iai5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi91c2VhcmNoX29iai5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL29iajE2L3VzZWFyY2hfb2JqLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDgwNTk5Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi91c2VhcmNoX29iai5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi93ZWJfYmttcmtfb2JqLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb2JqMTYvd2ViX2JrbXJrX29iai5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RiYzUyOAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb2JqMTYvd2ViX2JrbXJrX29iai5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vdnIxNi9hZGRfc3RhdC5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL292cjE2L2FkZF9zdGF0LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTIzYTJiCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vdnIxNi9hZGRfc3RhdC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vdnIxNi9jdXJyZW50X2NvLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb3ZyMTYvY3VycmVudF9jby5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTMwNzdmOQotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb3ZyMTYvY3VycmVudF9jby5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vdnIxNi9kZWxfc3RhdC5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL292cjE2L2RlbF9zdGF0LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjAyMDdjCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vdnIxNi9kZWxfc3RhdC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vdnIxNi9lcnJvcl9jby5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL292cjE2L2Vycm9yX2NvLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTlkY2NjCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vdnIxNi9lcnJvcl9jby5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vdnIxNi9pbnN0YWxsYWJsZV9jby5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL292cjE2L2luc3RhbGxhYmxlX2NvLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTk5OWI2Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vdnIxNi9pbnN0YWxsYWJsZV9jby5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vdnIxNi9saW5rZWRfY28uZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vdnIxNi9saW5rZWRfY28uZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmNDBlMWIKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL292cjE2L2xpbmtlZF9jby5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vdnIxNi9tb2RfY28uZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vdnIxNi9tb2RfY28uZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMWI4ZDYKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL292cjE2L21vZF9jby5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vdnIxNi91bmNvbmZpZ3VyZWRfY28uZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vdnIxNi91bmNvbmZpZ3VyZWRfY28uZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNTg5Y2UKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL292cjE2L3VuY29uZmlndXJlZF9jby5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vdnIxNi91cGRhdGVkX2NvLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb3ZyMTYvdXBkYXRlZF9jby5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ2ODZhYgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb3ZyMTYvdXBkYXRlZF9jby5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vdnIxNi93YXJuaW5nX2NvLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb3ZyMTYvd2FybmluZ19jby5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWUyZGFjNAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb3ZyMTYvd2FybmluZ19jby5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy93aXpiYW4vY29uZmlnX3dpei5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL3dpemJhbi9jb25maWdfd2l6LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTE5ZmJmCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy93aXpiYW4vY29uZmlnX3dpei5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy93aXpiYW4vZGVmX3dpemJhbi5qcGcgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL3dpemJhbi9kZWZfd2l6YmFuLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDdlYmE2Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy93aXpiYW4vZGVmX3dpemJhbi5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy93aXpiYW4vaW5zdGFsbF93aXouZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy93aXpiYW4vaW5zdGFsbF93aXouZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlZWU3YzMKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL3dpemJhbi9pbnN0YWxsX3dpei5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy93aXpiYW4vdW5pbnN0YWxsX3dpei5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL3dpemJhbi91bmluc3RhbGxfd2l6LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjIzMzc4Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy93aXpiYW4vdW5pbnN0YWxsX3dpei5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy93aXpiYW4vdXBkYXRlX3dpei5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL3dpemJhbi91cGRhdGVfd2l6LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjM2NDg3Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy93aXpiYW4vdXBkYXRlX3dpei5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL0NvbmZpZ3VyYXRpb25NYW5hZ2VyV2luZG93LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvQ29uZmlndXJhdGlvbk1hbmFnZXJXaW5kb3cuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTIzNTNiCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL0NvbmZpZ3VyYXRpb25NYW5hZ2VyV2luZG93LmphdmEKQEAgLTAsMCArMSwyOTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWk7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSUpvYkNoYW5nZUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklKb2JDaGFuZ2VMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5BcHBsaWNhdGlvbldpbmRvdzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS52aWV3cy5Db25maWd1cmF0aW9uVmlldzsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudWkuVXBkYXRlSm9iOworCisvKioKKyAqIENvbmZpZ3VyYXRpb24gTWFuYWdlciB3aW5kb3cuCisgKi8KK3B1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uTWFuYWdlcldpbmRvdyBleHRlbmRzIEFwcGxpY2F0aW9uV2luZG93IHsKKwlwcml2YXRlIENvbmZpZ3VyYXRpb25WaWV3IHZpZXc7CisKKwlwcml2YXRlIEdsb2JhbEFjdGlvbiBwcm9wZXJ0aWVzQWN0aW9uOworCisJcHJpdmF0ZSBJQWN0aW9uIHByb3BlcnRpZXNBY3Rpb25IYW5kbGVyOworCisJcHJpdmF0ZSBJSm9iQ2hhbmdlTGlzdGVuZXIgam9iTGlzdGVuZXI7CisJCisJcHJpdmF0ZSBIYXNodGFibGUgam9iTmFtZXM7CisKKwljbGFzcyBHbG9iYWxBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gaW1wbGVtZW50cyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB7CisJCXByaXZhdGUgSUFjdGlvbiBoYW5kbGVyOworCisJCXB1YmxpYyBHbG9iYWxBY3Rpb24oKSB7CisJCX0KKworCQlwdWJsaWMgdm9pZCBzZXRBY3Rpb25IYW5kbGVyKElBY3Rpb24gYWN0aW9uKSB7CisJCQlpZiAoaGFuZGxlciAhPSBudWxsKSB7CisJCQkJaGFuZGxlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRoaXMpOworCQkJCWhhbmRsZXIgPSBudWxsOworCQkJfQorCQkJaWYgKGFjdGlvbiAhPSBudWxsKSB7CisJCQkJdGhpcy5oYW5kbGVyID0gYWN0aW9uOworCQkJCWFjdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRoaXMpOworCQkJfQorCQkJaWYgKGhhbmRsZXIgIT0gbnVsbCkgeworCQkJCXNldEVuYWJsZWQoaGFuZGxlci5pc0VuYWJsZWQoKSk7CisJCQkJc2V0Q2hlY2tlZChoYW5kbGVyLmlzQ2hlY2tlZCgpKTsKKwkJCX0KKwkJfQorCisJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKKwkJCWlmIChldmVudC5nZXRQcm9wZXJ0eSgpLmVxdWFscyhBY3Rpb24uRU5BQkxFRCkpIHsKKwkJCQlCb29sZWFuIGJvb2wgPSAoQm9vbGVhbikgZXZlbnQuZ2V0TmV3VmFsdWUoKTsKKwkJCQlzZXRFbmFibGVkKGJvb2wuYm9vbGVhblZhbHVlKCkpOworCQkJfSBlbHNlIGlmIChldmVudC5nZXRQcm9wZXJ0eSgpLmVxdWFscyhBY3Rpb24uQ0hFQ0tFRCkpIHsKKwkJCQlCb29sZWFuIGJvb2wgPSAoQm9vbGVhbikgZXZlbnQuZ2V0TmV3VmFsdWUoKTsKKwkJCQlzZXRDaGVja2VkKGJvb2wuYm9vbGVhblZhbHVlKCkpOworCQkJfQorCQl9CisKKwkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJaWYgKGhhbmRsZXIgIT0gbnVsbCkKKwkJCQloYW5kbGVyLnJ1bigpOworCQl9CisJfQorCisJLyoqCisJICogQHBhcmFtIHBhcmVudFNoZWxsCisJICovCisJcHVibGljIENvbmZpZ3VyYXRpb25NYW5hZ2VyV2luZG93KFNoZWxsIHBhcmVudFNoZWxsKSB7CisJCXN1cGVyKHBhcmVudFNoZWxsKTsKKwkJc2V0U2hlbGxTdHlsZShnZXRTaGVsbFN0eWxlKCkgfCBTV1QuQVBQTElDQVRJT05fTU9EQUwpOworCQkvLyBTZXR1cCB3aW5kb3cuCisJCWFkZE1lbnVCYXIoKTsKKwkJYWRkQWN0aW9ucygpOworCQlhZGRUb29sQmFyKFNXVC5GTEFUKTsKKwkJYWRkU3RhdHVzTGluZSgpOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBpc1Byb2dyZXNzQ2FuY2VsZWQoKSB7CisJCXJldHVybiBnZXRTdGF0dXNMaW5lTWFuYWdlcigpLmdldFByb2dyZXNzTW9uaXRvcigpLmlzQ2FuY2VsZWQoKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgYWRkQWN0aW9ucygpIHsKKwkJSU1lbnVNYW5hZ2VyIG1lbnVCYXIgPSBnZXRNZW51QmFyTWFuYWdlcigpOworCQlJTWVudU1hbmFnZXIgZmlsZU1lbnUgPSBuZXcgTWVudU1hbmFnZXIoCisJCQkJVXBkYXRlVUlNZXNzYWdlcy5Db25maWd1cmF0aW9uTWFuYWdlcldpbmRvd19maWxlTWVudSk7CisJCW1lbnVCYXIuYWRkKGZpbGVNZW51KTsKKworCQlwcm9wZXJ0aWVzQWN0aW9uID0gbmV3IEdsb2JhbEFjdGlvbigpOworCQlwcm9wZXJ0aWVzQWN0aW9uCisJCQkJLnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5Db25maWd1cmF0aW9uTWFuYWdlcldpbmRvd19wcm9wZXJ0aWVzKTsKKwkJcHJvcGVydGllc0FjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKKworCQlmaWxlTWVudS5hZGQocHJvcGVydGllc0FjdGlvbik7CisJCWZpbGVNZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOworCisJCUFjdGlvbiBjbG9zZUFjdGlvbiA9IG5ldyBBY3Rpb24oKSB7CisJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJY2xvc2UoKTsKKwkJCX0KKwkJfTsKKwkJY2xvc2VBY3Rpb24uc2V0VGV4dChVcGRhdGVVSU1lc3NhZ2VzLkNvbmZpZ3VyYXRpb25NYW5hZ2VyV2luZG93X2Nsb3NlKTsKKwkJZmlsZU1lbnUuYWRkKGNsb3NlQWN0aW9uKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgaG9va0dsb2JhbEFjdGlvbnMoKSB7CisJCWlmIChwcm9wZXJ0aWVzQWN0aW9uSGFuZGxlciAhPSBudWxsKQorCQkJcHJvcGVydGllc0FjdGlvbi5zZXRBY3Rpb25IYW5kbGVyKHByb3BlcnRpZXNBY3Rpb25IYW5kbGVyKTsKKwl9CisKKwlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7CisJCXZpZXcgPSBuZXcgQ29uZmlndXJhdGlvblZpZXcodGhpcyk7CisJCUNvbXBvc2l0ZSBjb250YWluZXIgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOworCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7CisJCWxheW91dC5tYXJnaW5XaWR0aCA9IGxheW91dC5tYXJnaW5IZWlnaHQgPSAwOworCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMDsKKwkJY29udGFpbmVyLnNldExheW91dChsYXlvdXQpOworCisJCWFkZFNlcGFyYXRvcihjb250YWluZXIpOworCQlHcmlkRGF0YSBnZDsKKworCQl2aWV3LmNyZWF0ZVBhcnRDb250cm9sKGNvbnRhaW5lcik7CisJCUNvbnRyb2wgdmlld0NvbnRyb2wgPSB2aWV3LmdldENvbnRyb2woKTsKKwkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKKwkJdmlld0NvbnRyb2wuc2V0TGF5b3V0RGF0YShnZCk7CisKKwkJYWRkU2VwYXJhdG9yKGNvbnRhaW5lcik7CisKKwkJaG9va0dsb2JhbEFjdGlvbnMoKTsKKworCQl1cGRhdGVBY3Rpb25CYXJzKCk7CisKKwkJVXBkYXRlTGFiZWxQcm92aWRlciBwcm92aWRlciA9IFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRMYWJlbFByb3ZpZGVyKCk7CisJCWdldFNoZWxsKCkuc2V0SW1hZ2UocHJvdmlkZXIuZ2V0KFVwZGF0ZVVJSW1hZ2VzLkRFU0NfQ09ORklHU19WSUVXLCAwKSk7CisKKwkJcmV0dXJuIGNvbnRhaW5lcjsKKwl9CisKKwlwdWJsaWMgdm9pZCB1cGRhdGVTdGF0dXNMaW5lKFN0cmluZyBtZXNzYWdlLCBJbWFnZSBpbWFnZSkgeworCQlnZXRTdGF0dXNMaW5lTWFuYWdlcigpLnNldE1lc3NhZ2UoaW1hZ2UsIG1lc3NhZ2UpOworCQlnZXRTdGF0dXNMaW5lTWFuYWdlcigpLnVwZGF0ZSh0cnVlKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0cmFja1VwZGF0ZUpvYihKb2Igam9iLCBTdHJpbmcgbmFtZSkgeworCQlpZiAoam9iTGlzdGVuZXIgPT0gbnVsbCkgeworCQkJam9iTmFtZXMgPSBuZXcgSGFzaHRhYmxlKCk7CisJCQlqb2JMaXN0ZW5lciA9IG5ldyBJSm9iQ2hhbmdlTGlzdGVuZXIoKSB7CisJCQkJcHVibGljIHZvaWQgYWJvdXRUb1J1bihJSm9iQ2hhbmdlRXZlbnQgZXZlbnQpIHsKKwkJCQl9CisKKwkJCQlwdWJsaWMgdm9pZCBhd2FrZShJSm9iQ2hhbmdlRXZlbnQgZXZlbnQpIHsKKwkJCQl9CisKKwkJCQlwdWJsaWMgdm9pZCBkb25lKElKb2JDaGFuZ2VFdmVudCBldmVudCkgeworCQkJCQlKb2Igam9iID0gZXZlbnQuZ2V0Sm9iKCk7CisJCQkJCWlmIChqb2IuYmVsb25nc1RvKFVwZGF0ZUpvYi5GQU1JTFkpKSB7CisJCQkJCQlKb2IgW10gcmVtYWluaW5nID0gSm9iLmdldEpvYk1hbmFnZXIoKS5maW5kKFVwZGF0ZUpvYi5GQU1JTFkpOworCQkJCQkJdXBkYXRlUHJvZ3Jlc3MoZmFsc2UsIHJlbWFpbmluZyk7CisJCQkJCQlqb2JOYW1lcy5yZW1vdmUoam9iKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCXB1YmxpYyB2b2lkIHJ1bm5pbmcoSUpvYkNoYW5nZUV2ZW50IGV2ZW50KSB7CisJCQkJCUpvYiBqb2IgPSBldmVudC5nZXRKb2IoKTsKKwkJCQkJaWYgKGpvYi5iZWxvbmdzVG8oVXBkYXRlSm9iLkZBTUlMWSkpIHsKKwkJCQkJCUpvYiBbXSBleGlzdGluZyA9IEpvYi5nZXRKb2JNYW5hZ2VyKCkuZmluZChVcGRhdGVKb2IuRkFNSUxZKTsKKwkJCQkJCXVwZGF0ZVByb2dyZXNzKHRydWUsIGV4aXN0aW5nKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCXB1YmxpYyB2b2lkIHNjaGVkdWxlZChJSm9iQ2hhbmdlRXZlbnQgZXZlbnQpIHsKKwkJCQl9CisKKwkJCQlwdWJsaWMgdm9pZCBzbGVlcGluZyhJSm9iQ2hhbmdlRXZlbnQgZXZlbnQpIHsKKwkJCQl9CisJCQl9OworCQkJSm9iLmdldEpvYk1hbmFnZXIoKS5hZGRKb2JDaGFuZ2VMaXN0ZW5lcihqb2JMaXN0ZW5lcik7CisJCX0KKwkJam9iTmFtZXMucHV0KGpvYiwgbmFtZSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHVwZGF0ZVByb2dyZXNzKGZpbmFsIGJvb2xlYW4gYmVnaW4sIGZpbmFsIEpvYltdIGpvYnMpIHsKKwkJZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKKwkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgPSBnZXRTdGF0dXNMaW5lTWFuYWdlcigpCisJCQkJCQkuZ2V0UHJvZ3Jlc3NNb25pdG9yKCk7CisJCQkJaWYgKGJlZ2luKSB7CisJCQkJCWlmIChqb2JzLmxlbmd0aCA9PSAxKQorCQkJCQkJbW9uaXRvci5iZWdpblRhc2soIiIsIElQcm9ncmVzc01vbml0b3IuVU5LTk9XTik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJdXBkYXRlVGFza05hbWUobW9uaXRvciwgam9icyk7CisJCQkJCWdldFN0YXR1c0xpbmVNYW5hZ2VyKCkuc2V0Q2FuY2VsRW5hYmxlZCh0cnVlKTsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoam9icy5sZW5ndGggPT0gMCkgeworCQkJCQkJZ2V0U3RhdHVzTGluZU1hbmFnZXIoKS5zZXRDYW5jZWxFbmFibGVkKGZhbHNlKTsKKwkJCQkJCW1vbml0b3IuZG9uZSgpOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJCXVwZGF0ZVRhc2tOYW1lKG1vbml0b3IsIGpvYnMpOworCQkJCX0KKwkJCQlnZXRTdGF0dXNMaW5lTWFuYWdlcigpLnVwZGF0ZSh0cnVlKTsKKwkJCX0KKwkJfSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHVwZGF0ZVRhc2tOYW1lKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSm9iIFtdIGpvYnMpIHsKKwkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJZm9yIChpbnQgaT0wOyBpPGpvYnMubGVuZ3RoOyBpKyspIHsKKwkJCVN0cmluZyBuYW1lID0gKFN0cmluZylqb2JOYW1lcy5nZXQoam9ic1tpXSk7CisJCQlpZiAobmFtZSE9bnVsbCkgeworCQkJCWlmIChidWYubGVuZ3RoKCk+MCkKKwkJCQkJYnVmLmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJAorCQkJCWJ1Zi5hcHBlbmQobmFtZSk7CisJCQl9CisJCX0KKwkJbW9uaXRvci5zdWJUYXNrKE5MUy5iaW5kKAorCQkJCVVwZGF0ZVVJTWVzc2FnZXMuQ29uZmlndXJhdGlvbk1hbmFnZXJXaW5kb3dfc2VhcmNoVGFza05hbWUsCisJCQkJYnVmLnRvU3RyaW5nKCkpKTsgCisJfQorCisJcHJpdmF0ZSB2b2lkIGFkZFNlcGFyYXRvcihDb21wb3NpdGUgcGFyZW50KSB7CisJCUdyaWREYXRhIGdkOworCQlMYWJlbCBzZXBhcmF0b3IgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwpOworCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOworCQlnZC5oZWlnaHRIaW50ID0gMTsKKwkJc2VwYXJhdG9yLnNldExheW91dERhdGEoZ2QpOworCX0KKworCXByaXZhdGUgdm9pZCB1cGRhdGVBY3Rpb25CYXJzKCkgeworCQlnZXRNZW51QmFyTWFuYWdlcigpLnVwZGF0ZUFsbChmYWxzZSk7CisJCWdldFRvb2xCYXJNYW5hZ2VyKCkudXBkYXRlKGZhbHNlKTsKKwkJZ2V0U3RhdHVzTGluZU1hbmFnZXIoKS51cGRhdGUoZmFsc2UpOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdyNjbG9zZSgpCisJICovCisJcHVibGljIGJvb2xlYW4gY2xvc2UoKSB7CisJCWlmIChqb2JMaXN0ZW5lciAhPSBudWxsKQorCQkJSm9iLmdldEpvYk1hbmFnZXIoKS5yZW1vdmVKb2JDaGFuZ2VMaXN0ZW5lcihqb2JMaXN0ZW5lcik7CisJCWlmICh2aWV3ICE9IG51bGwpCisJCQl2aWV3LmRpc3Bvc2UoKTsKKwkJcmV0dXJuIHN1cGVyLmNsb3NlKCk7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93I2NyZWF0ZSgpCisJICovCisJcHVibGljIHZvaWQgY3JlYXRlKCkgeworCQlzdXBlci5jcmVhdGUoKTsKKwkJLy8gc2V0IHRoZSB0aXRsZQorCQlnZXRTaGVsbCgpLnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5Db25maWd1cmF0aW9uTWFuYWdlckFjdGlvbl90aXRsZSk7CisJCWdldFNoZWxsKCkuc2V0U2l6ZSg4MDAsIDYwMCk7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93I29wZW4oKQorCSAqLworCXB1YmxpYyBpbnQgb3BlbigpIHsKKwkJLy8gdXBkYXRlIGFjdGlvbiBiYXJzCisJCXVwZGF0ZUFjdGlvbkJhcnMoKTsKKwkJcmV0dXJuIHN1cGVyLm9wZW4oKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0aWVzQWN0aW9uSGFuZGxlcihJQWN0aW9uIGhhbmRsZXIpIHsKKwkJcHJvcGVydGllc0FjdGlvbkhhbmRsZXIgPSBoYW5kbGVyOworCX0KK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9SZXN0YXJ0RGlhbG9nLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvUmVzdGFydERpYWxvZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1ODA5MWEKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvUmVzdGFydERpYWxvZy5qYXZhCkBAIC0wLDAgKzEsODggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2R1Y3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy4qOworCisvKioKKyAqIEEgZGlhbG9nIHdoaWNoIHByb21wdHMgdGhlIHVzZXIgdG8gcmVzdGFydCBhZnRlciBhbiB1cGRhdGUgb3BlcmF0aW9uCisgKiBhbmQgcHJvdmlkZXMgWWVzLCBObywgQ29udGludWUgYnV0dG9ucy4gCisgKi8KK3B1YmxpYyBjbGFzcyBSZXN0YXJ0RGlhbG9nIGV4dGVuZHMgTWVzc2FnZURpYWxvZyB7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTlRJTlVFID0gMjsKKwlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmdbXSB5ZXNObyA9IG5ldyBTdHJpbmdbXSB7SURpYWxvZ0NvbnN0YW50cy5ZRVNfTEFCRUwsIElEaWFsb2dDb25zdGFudHMuTk9fTEFCRUx9OworCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZ1tdIHllc05vQXBwbHkgPSBuZXcgU3RyaW5nW10ge0lEaWFsb2dDb25zdGFudHMuWUVTX0xBQkVMLCBJRGlhbG9nQ29uc3RhbnRzLk5PX0xBQkVMLCBVcGRhdGVVSU1lc3NhZ2VzLkFwcGx5Q2hhbmdlc307IAorCQorCXByaXZhdGUgaW50IGJ1dHRvbklkID0gMDsKKwkKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGRpYWxvZworCSAqIEBzZWUgTWVzc2FnZURpYWxvZyNNZXNzYWdlRGlhbG9nKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsLCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2UsIGphdmEubGFuZy5TdHJpbmcsIGludCwgamF2YS5sYW5nLlN0cmluZ1tdLCBpbnQpCisJICovCisJcHVibGljIFJlc3RhcnREaWFsb2coU2hlbGwgcGFyZW50LCBTdHJpbmcgdGl0bGUsIFN0cmluZyBtZXNzYWdlLCBib29sZWFuIHJlc3RhcnROZWVkZWQpIHsKKwkJc3VwZXIocGFyZW50LAorCQkJCXRpdGxlLAorCQkJCW51bGwsCS8vIGFjY2VwdCB0aGUgZGVmYXVsdCB3aW5kb3cgaWNvbgorCQkJCW1lc3NhZ2UsCisJCQkJUVVFU1RJT04sCisJCQkJcmVzdGFydE5lZWRlZCA/IHllc05vIDogeWVzTm9BcHBseSwgCisJCQkJMCk7CQkvLyB5ZXMgaXMgdGhlIGRlZmF1bHQKKwl9CisKKwkvKioKKwkgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gb3BlbiB0aGUgWWVzL05vL0NvbnRpbnVlIHF1ZXN0aW9uIGRpYWxvZy4KKwkgKgorCSAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBzaGVsbCBvZiB0aGUgZGlhbG9nLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCisJICogQHBhcmFtIHJlc3RhcnRJc1JlYWxseU5lZWRlZCB3aGVuIGZhbHNlLCB0aGUgY2hhbmdlcyBhcmUgYXBwbGllZCB0byB0aGUgY3VycmVudCBjb25maWcKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB1c2VyIHByZXNzZXMgIFlFUworCSAqICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlblF1ZXN0aW9uKFNoZWxsIHBhcmVudCwgYm9vbGVhbiByZXN0YXJ0SXNSZWFsbHlOZWVkZWQpIHsKKwkJU3RyaW5nIHRpdGxlID0gVXBkYXRlVUlNZXNzYWdlcy5SZXN0YXJ0VGl0bGU7IAorCQlJUHJvZHVjdCBwcm9kdWN0ID0gUGxhdGZvcm0uZ2V0UHJvZHVjdCgpOworCQlTdHJpbmcgcHJvZHVjdE5hbWUgPSBwcm9kdWN0ICE9IG51bGwgJiYgcHJvZHVjdC5nZXROYW1lKCkgIT0gbnVsbCA/IHByb2R1Y3QuZ2V0TmFtZSgpIDogVXBkYXRlVUlNZXNzYWdlcy5BcHBsaWNhdGlvbkluUmVzdGFydERpYWxvZzsKKwkJU3RyaW5nIG1lc3NhZ2UgPSBOTFMuYmluZChyZXN0YXJ0SXNSZWFsbHlOZWVkZWQgPyBVcGRhdGVVSU1lc3NhZ2VzLlJlc3RhcnRNZXNzYWdlOiBVcGRhdGVVSU1lc3NhZ2VzLk9wdGlvbmFsUmVzdGFydE1lc3NhZ2UsIHByb2R1Y3ROYW1lKTsKKwkJUmVzdGFydERpYWxvZyBkaWFsb2cgPSBuZXcgUmVzdGFydERpYWxvZyhwYXJlbnQsIHRpdGxlLAltZXNzYWdlLCByZXN0YXJ0SXNSZWFsbHlOZWVkZWQpOworCQlpbnQgYnV0dG9uPSBkaWFsb2cub3BlbigpOworCQlpZiAoYnV0dG9uID09IDIpCisJCQlPcGVyYXRpb25zTWFuYWdlci5hcHBseUNoYW5nZXNOb3coKTsKKwkJcmV0dXJuIGJ1dHRvbiA9PSAwOyAvLyBZZXMKKwl9CisJCisJLyoqCisJICogV2hlbiBhIGJ1dHRvbiBpcyBwcmVzc2VkLCBzdG9yZSB0aGUgcHJlZmVyZW5jZS4KKwkgKiAKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nI2J1dHRvblByZXNzZWQoaW50KQorCSAqLworCXByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGlkKSB7CisJCWlmIChpZCA9PSAyKSB7IAorCQkJYnV0dG9uSWQ9IENPTlRJTlVFOworCQl9IAorCQkKKwkJc3VwZXIuYnV0dG9uUHJlc3NlZChpZCk7CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgdGhlIHVzZXIncyBzZWxlY3Rpb24sCisJICogPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHVzZXIgaGFzbid0IGNob3NlbiB5ZXQuCisJICogCisJICogQHJldHVybiB0aGUgdXNlcidzIHNlbGVjdGlvbiBvciA8Y29kZT5udWxsPC9jb2RlPgorCSAqLworCXB1YmxpYyBpbnQgZ2V0UmVzdWx0KCkgeworCQlyZXR1cm4gYnV0dG9uSWQ7CisJfQorfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VSTENvZGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVVJMQ29kZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGI4NGUwCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VSTENvZGVyLmphdmEKQEAgLTAsMCArMSw1OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aTsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKKworcHVibGljIGNsYXNzIFVSTENvZGVyIHsKKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVuY29kZShTdHJpbmcgcykgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24geworCQlyZXR1cm4gdXJsRW5jb2RlKHMuZ2V0Qnl0ZXMoIlVURjgiKSk7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWNvZGUoU3RyaW5nIHMpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKKwkJcmV0dXJuIG5ldyBTdHJpbmcodXJsRGVjb2RlKHMpLCAiVVRGOCIpOyAvLyROT04tTkxTLTEkCisJfQorCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHVybEVuY29kZShieXRlW10gZGF0YSkgeworCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcihkYXRhLmxlbmd0aCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykgeworCQkJYnVmLmFwcGVuZCgnJScpOworCQkJYnVmLmFwcGVuZChDaGFyYWN0ZXIuZm9yRGlnaXQoKGRhdGFbaV0gJiAyNDApID4+PiA0LCAxNikpOworCQkJYnVmLmFwcGVuZChDaGFyYWN0ZXIuZm9yRGlnaXQoZGF0YVtpXSAmIDE1LCAxNikpOworCQl9CisJCXJldHVybiBidWYudG9TdHJpbmcoKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBieXRlW10gdXJsRGVjb2RlKFN0cmluZyBlbmNvZGVkVVJMKSB7CisJCWludCBsZW4gPSBlbmNvZGVkVVJMLmxlbmd0aCgpOworCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKGxlbik7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOykgeworCQkJc3dpdGNoIChlbmNvZGVkVVJMLmNoYXJBdChpKSkgeworCQkJY2FzZSAnJSc6CisJCQkJaWYgKGxlbiA+PSBpICsgMykgeworCQkJCQlvcy53cml0ZShJbnRlZ2VyLnBhcnNlSW50KGVuY29kZWRVUkwuc3Vic3RyaW5nKGkgKyAxLCBpICsgMyksIDE2KSk7CisJCQkJfQorCQkJCWkgKz0gMzsKKwkJCQlicmVhazsKKwkJCWNhc2UgJysnOiAvLyBleGNlcHRpb24gZnJvbSBzdGFuZGFyZAorCQkJCW9zLndyaXRlKCcgJyk7CisJCQkJaSsrOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlvcy53cml0ZShlbmNvZGVkVVJMLmNoYXJBdChpKyspKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQl9CisJCXJldHVybiBvcy50b0J5dGVBcnJheSgpOworCX0KK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9VcGRhdGVMYWJlbFByb3ZpZGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVXBkYXRlTGFiZWxQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMTk1OWIKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVXBkYXRlTGFiZWxQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnBhcnRzLio7CisKKy8qKgorICogCisgKi8KKworcHVibGljIGNsYXNzIFVwZGF0ZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBTaGFyZWRMYWJlbFByb3ZpZGVyIHsKKwkvKioKKwkgKiBDb25zdHJ1Y3RvciBmb3IgVXBkYXRlTGFiZWxQcm92aWRlci4KKwkgKi8KKwlwdWJsaWMgVXBkYXRlTGFiZWxQcm92aWRlcigpIHsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmopIHsKKwkJcmV0dXJuIHN1cGVyLmdldFRleHQob2JqKTsKKwl9CisJCisJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBvYmopIHsKKwkJcmV0dXJuIHN1cGVyLmdldEltYWdlKG9iaik7CisJfQorCQorCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0TG9jYWxTaXRlRGVzY3JpcHRvcihJQ29uZmlndXJlZFNpdGUgY3NpdGUpIHsKKwkJaWYgKGNzaXRlLmlzUHJvZHVjdFNpdGUoKSkKKwkJCXJldHVybiBVcGRhdGVVSUltYWdlcy5ERVNDX1BTSVRFX09CSjsKKwkJaWYgKGNzaXRlLmlzRXh0ZW5zaW9uU2l0ZSgpKQorCQkJcmV0dXJuIFVwZGF0ZVVJSW1hZ2VzLkRFU0NfRVNJVEVfT0JKOworCQlyZXR1cm4gVXBkYXRlVUlJbWFnZXMuREVTQ19MU0lURV9PQko7CisJfQorCQorCXB1YmxpYyBJbWFnZSBnZXRMb2NhbFNpdGVJbWFnZShJQ29uZmlndXJlZFNpdGUgY3NpdGUpIHsKKwkJSW1hZ2VEZXNjcmlwdG9yIGRlc2MgPSBnZXRMb2NhbFNpdGVEZXNjcmlwdG9yKGNzaXRlKTsKKwkJcmV0dXJuIGdldChkZXNjKTsKKwl9Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVXBkYXRlVUkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9VcGRhdGVVSS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3MWMzOGYKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVXBkYXRlVUkuamF2YQpAQCAtMCwwICsxLDI3MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aTsKKworaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5icm93c2VyLklXZWJCcm93c2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmJyb3dzZXIuSVdvcmtiZW5jaEJyb3dzZXJTdXBwb3J0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLlVwZGF0ZUNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsLlVwZGF0ZU1vZGVsOworaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7CitpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7CisKKy8qKgorICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCisgKi8KK3B1YmxpYyBjbGFzcyBVcGRhdGVVSSBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4geworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS51cGRhdGUudWkiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX0FQUF9JRCA9ICJvcmcuZWNsaXBzZS51cGRhdGUiOyAvLyROT04tTkxTLTEkCisJLy8gcHJlZmVyZW5jZSBrZXkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX0RJU0NPVkVSWV9TSVRFU19FTkFCTEVEID0gImRpc2NvdmVyeVNpdGVzRW5hYmxlZCI7IC8vJE5PTi1OTFMtMSQKKwkvL1RoZSBzaGFyZWQgaW5zdGFuY2UuCisJcHJpdmF0ZSBzdGF0aWMgVXBkYXRlVUkgcGx1Z2luOworCXByaXZhdGUgVXBkYXRlTW9kZWwgbW9kZWw7CisJcHJpdmF0ZSBTdHJpbmcgYXBwU2VydmVySG9zdDsKKwlwcml2YXRlIGludCBhcHBTZXJ2ZXJQb3J0OworCXByaXZhdGUgVXBkYXRlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyOworCisJLyoqCisJICogVGhlIGNvbnN0cnVjdG9yLgorCSAqLworCXB1YmxpYyBVcGRhdGVVSSgpIHsKKworCQlwbHVnaW4gPSB0aGlzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFVwZGF0ZVVJIGdldERlZmF1bHQoKSB7CisJCXJldHVybiBwbHVnaW47CisJfQorCisJcHVibGljIHN0YXRpYyBTaGVsbCBnZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpIHsKKwkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBnZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKKwkJcmV0dXJuIHdpbmRvdyAhPSBudWxsID8gd2luZG93LmdldFNoZWxsKCkgOiBnZXRTdGFuZGFyZERpc3BsYXkoKS5nZXRBY3RpdmVTaGVsbCgpOworCX0KKworCXB1YmxpYyBzdGF0aWMgSVdvcmtiZW5jaFdpbmRvdyBnZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKSB7CisJCXJldHVybiBnZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7CisJfQorCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGx1Z2luSWQoKSB7CisJCXJldHVybiBnZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCk7CisJfQorCisJcHVibGljIFVwZGF0ZUxhYmVsUHJvdmlkZXIgZ2V0TGFiZWxQcm92aWRlcigpIHsKKwkJaWYgKGxhYmVsUHJvdmlkZXIgPT0gbnVsbCkKKwkJCWxhYmVsUHJvdmlkZXIgPSBuZXcgVXBkYXRlTGFiZWxQcm92aWRlcigpOworCQlyZXR1cm4gbGFiZWxQcm92aWRlcjsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQWN0aXZhdG9yI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQorCSAqLworCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXN1cGVyLnN0YXJ0KGNvbnRleHQpOworCQltb2RlbCA9IG5ldyBVcGRhdGVNb2RlbCgpOworCQlpbnQgaGlzdG9yeVByZWYgPQorCQkJZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRJbnQoVXBkYXRlQ29yZS5QX0hJU1RPUllfU0laRSk7CisJCWlmIChoaXN0b3J5UHJlZiA+IDApIHsKKwkJCVVwZGF0ZUNvcmUuREVGQVVMVF9ISVNUT1JZID0gaGlzdG9yeVByZWY7CisJCX0KKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRBcHBTZXJ2ZXJIb3N0KCkgeworCQlyZXR1cm4gYXBwU2VydmVySG9zdDsKKwl9CisKKwlwdWJsaWMgaW50IGdldEFwcFNlcnZlclBvcnQoKSB7CisJCXJldHVybiBhcHBTZXJ2ZXJQb3J0OworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVBY3RpdmF0b3Ijc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWlmIChtb2RlbCAhPSBudWxsKQorCQkJbW9kZWwuc2h1dGRvd24oKTsKKworCQlpZiAobGFiZWxQcm92aWRlciAhPSBudWxsKQorCQkJbGFiZWxQcm92aWRlci5kaXNwb3NlKCk7CisJCXN1cGVyLnN0b3AoY29udGV4dCk7CisKKwl9CisKKwlwdWJsaWMgVXBkYXRlTW9kZWwgZ2V0VXBkYXRlTW9kZWwoKSB7CisJCXJldHVybiBtb2RlbDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXhjZXB0aW9uKFRocm93YWJsZSBlKSB7CisJCWxvZ0V4Y2VwdGlvbihlLCB0cnVlKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXhjZXB0aW9uKFRocm93YWJsZSBlLCBib29sZWFuIHNob3dFcnJvckRpYWxvZykgeworCQlpZiAoZSBpbnN0YW5jZW9mIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24pIHsKKwkJCWUgPSAoKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24pIGUpLmdldFRhcmdldEV4Y2VwdGlvbigpOworCQl9CisKKwkJSVN0YXR1cyBzdGF0dXMgPSBudWxsOworCQlpZiAoZSBpbnN0YW5jZW9mIENvcmVFeGNlcHRpb24pIHsKKwkJCXN0YXR1cyA9ICgoQ29yZUV4Y2VwdGlvbikgZSkuZ2V0U3RhdHVzKCk7CisJCX0gZWxzZSB7CisJCQlTdHJpbmcgbWVzc2FnZSA9IGUuZ2V0TWVzc2FnZSgpOworCQkJaWYgKG1lc3NhZ2UgPT0gbnVsbCkKKwkJCQltZXNzYWdlID0gZS50b1N0cmluZygpOworCQkJc3RhdHVzID0KKwkJCQluZXcgU3RhdHVzKAorCQkJCQlJU3RhdHVzLkVSUk9SLAorCQkJCQlnZXRQbHVnaW5JZCgpLAorCQkJCQlJU3RhdHVzLk9LLAorCQkJCQltZXNzYWdlLAorCQkJCQllKTsKKwkJfQorCQlsb2coc3RhdHVzLCBzaG93RXJyb3JEaWFsb2cpOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coSVN0YXR1cyBzdGF0dXMsIGJvb2xlYW4gc2hvd0Vycm9yRGlhbG9nKSB7CisJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLnVwZGF0ZS51aSIpOyAvLyROT04tTkxTLTEkCisJCVBsYXRmb3JtLmdldExvZyhidW5kbGUpLmxvZyhzdGF0dXMpOworCQlpZiAoRGlzcGxheS5nZXRDdXJyZW50KCkgPT0gbnVsbCB8fCAhc2hvd0Vycm9yRGlhbG9nKQorCQkJcmV0dXJuOworCQlpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgIT0gSVN0YXR1cy5JTkZPKSB7CisJCQlFcnJvckRpYWxvZy5vcGVuRXJyb3IoZ2V0QWN0aXZlV29ya2JlbmNoU2hlbGwoKSwgbnVsbCwgbnVsbCwgc3RhdHVzKTsKKwkJfSBlbHNlIHsKKwkJCU1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKGdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCksIG51bGwsIHN0YXR1cy5nZXRNZXNzYWdlKCkpOworCQl9CisJfQorCisJcHVibGljIHN0YXRpYyBVUkwgZ2V0T3JpZ2luYXRpbmdVUkwoU3RyaW5nIGlkKSB7CisJCUlEaWFsb2dTZXR0aW5ncyBzZWN0aW9uID0gZ2V0T3JpZ2luYXRpbmdVUkxTZWN0aW9uKCk7CisJCVN0cmluZyB2YWx1ZSA9IHNlY3Rpb24uZ2V0KGlkKTsKKwkJaWYgKHZhbHVlICE9IG51bGwpIHsKKwkJCXRyeSB7CisJCQkJcmV0dXJuIG5ldyBVUkwodmFsdWUpOworCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgc2V0T3JpZ2luYXRpbmdVUkwoU3RyaW5nIGlkLCBVUkwgdXJsKSB7CisJCUlEaWFsb2dTZXR0aW5ncyBzZWN0aW9uID0gZ2V0T3JpZ2luYXRpbmdVUkxTZWN0aW9uKCk7CisJCXNlY3Rpb24ucHV0KGlkLCB1cmwudG9TdHJpbmcoKSk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgSURpYWxvZ1NldHRpbmdzIGdldE9yaWdpbmF0aW5nVVJMU2VjdGlvbigpIHsKKwkJSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzID0gZ2V0RGVmYXVsdCgpLmdldERpYWxvZ1NldHRpbmdzKCk7CisJCUlEaWFsb2dTZXR0aW5ncyBzZWN0aW9uID0gc2V0dGluZ3MuZ2V0U2VjdGlvbigib3JpZ2luYXRpbmdVUkxzIik7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKHNlY3Rpb24gPT0gbnVsbCkKKwkJCXNlY3Rpb24gPSBzZXR0aW5ncy5hZGROZXdTZWN0aW9uKCJvcmlnaW5hdGluZ1VSTHMiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXR1cm4gc2VjdGlvbjsKKwl9CisKKwkKKwkvKioKKwkgKiBQcm9tcHRzIHRoZSB1c2VyIHRvIHJlc3RhcnQsIGFuZCBwZXJmb3JtcyB0aGUgcmVzdGFydCBpZiB0aGUgdXNlciBnaXZlcyB0aGUgb2suCisJICogCisJICogQHBhcmFtIHJlc3RhcnRJc1JlYWxseU5lZWRlZCB0cnVlIHdoZW4gYSByZXN0YXJ0IGlzIG5lZWRlZCwgZmFsc2UgaWYgdGhlIHVzZXIgZmVlbHMgbHVja3kgKHRtKSBhbmQgd2FudHMgdGhlIGNoYW5nZXMKKwkgKiBhcHBsaWVkIHRvIHRoZSBjdXJyZW50IGNvbmZpZworCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN5c3RlbSBpcyByZXN0YXJ0aW5nLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQorCSAqLworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiByZXF1ZXN0UmVzdGFydChib29sZWFuIHJlc3RhcnRJc1JlYWxseU5lZWRlZCkgeworCQlib29sZWFuIHJlc3RhcnQgPQorCQkJUmVzdGFydERpYWxvZy5vcGVuUXVlc3Rpb24oCisJCQkJZ2V0QWN0aXZlV29ya2JlbmNoU2hlbGwoKSwKKwkJCQlyZXN0YXJ0SXNSZWFsbHlOZWVkZWQpOworCQlpZiAocmVzdGFydCkKKwkJCXJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLnJlc3RhcnQoKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBzaG93VVJMKFN0cmluZyB1cmwpIHsKKwkJc2hvd1VSTCh1cmwsIGZhbHNlKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgc2hvd1VSTChTdHJpbmcgdXJsLCBib29sZWFuIGVuY29kZUhvc3RBbmRQb3J0KSB7CisJCWlmIChlbmNvZGVIb3N0QW5kUG9ydCkKKwkJCXVybCA9IGVuY29kZUhvc3RBbmRQb3J0KHVybCk7CisKKwkJSVdvcmtiZW5jaEJyb3dzZXJTdXBwb3J0IHN1cHBvcnQgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEJyb3dzZXJTdXBwb3J0KCk7CisJCXRyeSB7CisJCQlJV2ViQnJvd3NlciBicm93c2VyID0gc3VwcG9ydC5nZXRFeHRlcm5hbEJyb3dzZXIoKTsKKwkJCWJyb3dzZXIub3BlblVSTChuZXcgVVJMKHVybCkpOworCQl9CisJCWNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworCQkJVXBkYXRlVUkubG9nRXhjZXB0aW9uKGUpOworCQl9CisJCWNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7CisJCQlVcGRhdGVVSS5sb2dFeGNlcHRpb24oZSk7CisJCX0KKwl9CisKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZW5jb2RlSG9zdEFuZFBvcnQoU3RyaW5nIHVybE5hbWUpIHsKKwkJU3RyaW5nIGNhbGxiYWNrVVJMID0gZ2V0Q2FsbGJhY2tVUkxBc1N0cmluZygpOworCQlpZiAoY2FsbGJhY2tVUkwgPT0gbnVsbCkKKwkJCXJldHVybiB1cmxOYW1lOworCQlTdHJpbmcgY2FsbGJhY2tQYXJhbWV0ZXIgPSAidXBkYXRlVVJMPSIgKyBjYWxsYmFja1VSTDsgLy8kTk9OLU5MUy0xJAorCQlpZiAodXJsTmFtZS5pbmRleE9mKCc/JykgIT0gLTEpCisJCQlyZXR1cm4gdXJsTmFtZSArICImIiArIGNhbGxiYWNrUGFyYW1ldGVyOyAvLyROT04tTkxTLTEkCisJCWVsc2UKKwkJCXJldHVybiB1cmxOYW1lICsgIj8iICsgY2FsbGJhY2tQYXJhbWV0ZXI7IC8vJE5PTi1OTFMtMSQKKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldENhbGxiYWNrVVJMQXNTdHJpbmcoKSB7CisJCVN0cmluZyBob3N0ID0gZ2V0RGVmYXVsdCgpLmdldEFwcFNlcnZlckhvc3QoKTsKKwkJaW50IHBvcnQgPSBnZXREZWZhdWx0KCkuZ2V0QXBwU2VydmVyUG9ydCgpOworCQlpZiAoaG9zdCA9PSBudWxsIHx8IHBvcnQgPT0gMCkKKwkJCXJldHVybiBudWxsOworCQllbHNlIHsKKwkJCVN0cmluZyB2YWx1ZSA9CisJCQkJImh0dHA6Ly8iIC8vJE5PTi1OTFMtMSQKKwkJCQkJKyBob3N0CisJCQkJCSsgIjoiIC8vJE5PTi1OTFMtMSQKKwkJCQkJKyBwb3J0CisJCQkJCSsgIi8iIC8vJE5PTi1OTFMtMSQKKwkJCQkJKyBXRUJfQVBQX0lECisJCQkJCSsgIi9pbnN0YWxsIjsgLy8kTk9OLU5MUy0xJAorCQkJdHJ5IHsKKwkJCQl2YWx1ZSA9IFVSTENvZGVyLmVuY29kZSh2YWx1ZSk7CisJCQl9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKKwkJCX0KKwkJCXJldHVybiB2YWx1ZTsKKwkJfQorCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzdGFuZGFyZCBkaXNwbGF5IHRvIGJlIHVzZWQuIFRoZSBtZXRob2QgZmlyc3QgY2hlY2tzLCBpZgorCSAqIHRoZSB0aHJlYWQgY2FsbGluZyB0aGlzIG1ldGhvZCBoYXMgYW4gYXNzb2NpYXRlZCBkaXNhcGx5LiBJZiBzbywgdGhpcworCSAqIGRpc3BsYXkgaXMgcmV0dXJuZWQuIE90aGVyd2lzZSB0aGUgbWV0aG9kIHJldHVybnMgdGhlIGRlZmF1bHQgZGlzcGxheS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIERpc3BsYXkgZ2V0U3RhbmRhcmREaXNwbGF5KCkgeworCQlEaXNwbGF5IGRpc3BsYXk7CisJCWRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKKwkJaWYgKGRpc3BsYXkgPT0gbnVsbCkKKwkJCWRpc3BsYXkgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsKKwkJcmV0dXJuIGRpc3BsYXk7CisJfQorCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW4jaW5pdGlhbGl6ZURlZmF1bHRQbHVnaW5QcmVmZXJlbmNlcygpCisJICovCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQbHVnaW5QcmVmZXJlbmNlcygpIHsKKwkJUHJlZmVyZW5jZXMgc3RvcmUgPSBnZXRQbHVnaW5QcmVmZXJlbmNlcygpOworCQlzdG9yZS5zZXREZWZhdWx0KFBfRElTQ09WRVJZX1NJVEVTX0VOQUJMRUQsIHRydWUpOworCX0KK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9VcGRhdGVVSUltYWdlcy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VwZGF0ZVVJSW1hZ2VzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJjMmE0YQotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9VcGRhdGVVSUltYWdlcy5qYXZhCkBAIC0wLDAgKzEsMTA1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpOworCitpbXBvcnQgamF2YS5uZXQuVVJMOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKKworLyoqCisgKiBCdW5kbGUgb2YgYWxsIGltYWdlcyB1c2VkIGJ5IHRoZSBQREUgcGx1Z2luLgorICovCitwdWJsaWMgY2xhc3MgVXBkYXRlVUlJbWFnZXMgeworCisJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSUNPTlNfUEFUSCA9ICJpY29ucy8iOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBTZXQgb2YgcHJlZGVmaW5lZCBJbWFnZSBEZXNjcmlwdG9ycy4KKwkgKi8KKwkKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUSF9PQko9IElDT05TX1BBVEgrIm9iajE2LyI7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUSF9WSUVXID0gSUNPTlNfUEFUSCsiZXZpZXcxNi8iOyAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEhfTENMPSBJQ09OU19QQVRIKyJlbGNsMTYvIjsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRIX0xDTF9ESVNBQkxFRD0gSUNPTlNfUEFUSCsiZGxjbDE2LyI7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUSF9PVlIgPSBJQ09OU19QQVRIICsgIm92cjE2LyI7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUSF9XSVpCQU4gPSBJQ09OU19QQVRIICsgIndpemJhbi8iOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUSF9GT1JNUyA9IElDT05TX1BBVEggKyAiZm9ybXMvIjsgLy8kTk9OLU5MUy0xJAorCisKKwkvKioKKwkgKiBGcmVxdWVudGx5IHVzZWQgaW1hZ2VzCisJICovCisKKwkvKioKKwkgKiBPQkoxNgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfQVBQX09CSiA9IGNyZWF0ZShQQVRIX09CSiwgImFwcF9vYmouZ2lmIik7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0NBVEVHT1JZX09CSiA9IGNyZWF0ZShQQVRIX09CSiwgImNhdGVnb3J5X29iai5naWYiKTsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfQ09ORklHX09CSiA9IGNyZWF0ZShQQVRIX09CSiwgImNvbmZpZ19vYmouZ2lmIik7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0ZFQVRVUkVfT0JKID0gY3JlYXRlKFBBVEhfT0JKLCAiZmVhdHVyZV9vYmouZ2lmIik7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0VGSVhfT0JKID0gY3JlYXRlKFBBVEhfT0JKLCAiZWZpeDJfb2JqLmdpZiIpOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19ISVNUT1JZX09CSiA9IGNyZWF0ZShQQVRIX09CSiwgImhpc3Rvcnlfb2JqLmdpZiIpOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19MU0lURV9PQkogPSBjcmVhdGUoUEFUSF9PQkosICJsc2l0ZV9vYmouZ2lmIik7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX1BTSVRFX09CSiA9IGNyZWF0ZShQQVRIX09CSiwgInBzaXRlX29iai5naWYiKTsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfRVNJVEVfT0JKID0gY3JlYXRlKFBBVEhfT0JKLCAiZXNpdGVfb2JqLmdpZiIpOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19TSVRFX09CSiA9IGNyZWF0ZShQQVRIX09CSiwgInNpdGVfb2JqLmdpZiIpOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19VTkNPTkZfRkVBVFVSRV9PQkogPSBjcmVhdGUoUEFUSF9PQkosICJ1bmNvbmZfZmVhdHVyZV9vYmouZ2lmIik7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX05PVElOU1RfRkVBVFVSRV9PQkogPSBjcmVhdGUoUEFUSF9PQkosICJub3RpbnN0YWxsZWRfZmVhdHVyZV9vYmouZ2lmIik7CSAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19FUlJfU1RfT0JKID0gY3JlYXRlKFBBVEhfT0JKLCAiZXJyb3Jfc3Rfb2JqLmdpZiIpOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19PS19TVF9PQkogPSBjcmVhdGUoUEFUSF9PQkosICJva19zdF9vYmouZ2lmIik7IC8vJE5PTi1OTFMtMSQKKworCQorCS8qKgorCSAqIE9WUjE2CisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19MSU5LRURfQ08gICA9IGNyZWF0ZShQQVRIX09WUiwgImxpbmtlZF9jby5naWYiKTsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfVVBEQVRFRF9DTyAgID0gY3JlYXRlKFBBVEhfT1ZSLCAidXBkYXRlZF9jby5naWYiKTsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfQ1VSUkVOVF9DTyA9IGNyZWF0ZShQQVRIX09WUiwgImN1cnJlbnRfY28uZ2lmIik7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0VSUk9SX0NPID0gY3JlYXRlKFBBVEhfT1ZSLCAiZXJyb3JfY28uZ2lmIik7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX1dBUk5JTkdfQ08gPSBjcmVhdGUoUEFUSF9PVlIsICJ3YXJuaW5nX2NvLmdpZiIpOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19NT0RfQ08gPSBjcmVhdGUoUEFUSF9PVlIsICJtb2RfY28uZ2lmIik7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0FERF9DTyA9IGNyZWF0ZShQQVRIX09WUiwgImFkZF9zdGF0LmdpZiIpOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19ERUxfQ08gPSBjcmVhdGUoUEFUSF9PVlIsICJkZWxfc3RhdC5naWYiKTsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfVU5DT05GX0NPID0gY3JlYXRlKFBBVEhfT1ZSLCAidW5jb25maWd1cmVkX2NvLmdpZiIpOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBWSUVXMTYKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0NPTkZJR1NfVklFVyA9IGNyZWF0ZShQQVRIX1ZJRVcsICJjb25maWdzLmdpZiIpOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBMQ0wKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0NPTExBUFNFX0FMTCA9IGNyZWF0ZShQQVRIX0xDTCwgImNvbGxhcHNlYWxsLmdpZiIpOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19TSE9XX0hJRVJBUkNIWSA9IGNyZWF0ZShQQVRIX0xDTCwgImhpZXJhcmNoaWNhbExheW91dC5naWYiKTsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfU0hPV19ISUVSQVJDSFlfRCA9IGNyZWF0ZShQQVRIX0xDTF9ESVNBQkxFRCwgImhpZXJhcmNoaWNhbExheW91dC5naWYiKTsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogV0laCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19VUERBVEVfV0laICA9IGNyZWF0ZShQQVRIX1dJWkJBTiwgInVwZGF0ZV93aXouZ2lmIik7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0NPTkZJR19XSVogID0gY3JlYXRlKFBBVEhfV0laQkFOLCAiY29uZmlnX3dpei5naWYiKTsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfSU5TVEFMTF9CQU5ORVIgID0gY3JlYXRlKFBBVEhfV0laQkFOLCAiZGVmX3dpemJhbi5qcGciKTsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfUFJPVklERVIgPSBjcmVhdGUoUEFUSF9GT1JNUywgImRlZl9wcm92aWRlci5qcGciKTsgLy8kTk9OLU5MUy0xJAorCisJcHJpdmF0ZSBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGNyZWF0ZShTdHJpbmcgcHJlZml4LCBTdHJpbmcgbmFtZSkgeworCQlyZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwobWFrZUltYWdlVVJMKHByZWZpeCwgbmFtZSkpOworCX0KKworCisJcHJpdmF0ZSBzdGF0aWMgVVJMIG1ha2VJbWFnZVVSTChTdHJpbmcgcHJlZml4LCBTdHJpbmcgbmFtZSkgeworCQlTdHJpbmcgcGF0aCA9ICIkbmwkLyIgKyBwcmVmaXggKyBuYW1lOyAvLyROT04tTkxTLTEkCisJCXJldHVybiBGaWxlTG9jYXRvci5maW5kKFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKSwgbmV3IFBhdGgocGF0aCksIG51bGwpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VwZGF0ZVVJTWVzc2FnZXMuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9VcGRhdGVVSU1lc3NhZ2VzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzExYmNiYgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9VcGRhdGVVSU1lc3NhZ2VzLmphdmEKQEAgLTAsMCArMSwzNTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworCitwdWJsaWMgZmluYWwgY2xhc3MgVXBkYXRlVUlNZXNzYWdlcyBleHRlbmRzIE5MUyB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJUGx1Z2luUmVzb3VyY2VzIjsvLyROT04tTkxTLTEkCisKKwlwcml2YXRlIFVwZGF0ZVVJTWVzc2FnZXMoKSB7CisJCS8vIERvIG5vdCBpbnN0YW50aWF0ZQorCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlc3RhcnRUaXRsZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBSZXN0YXJ0TWVzc2FnZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBPcHRpb25hbFJlc3RhcnRNZXNzYWdlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFwcGxpY2F0aW9uSW5SZXN0YXJ0RGlhbG9nOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFwcGx5Q2hhbmdlczsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uTWFuYWdlckFjdGlvbl90aXRsZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uTWFuYWdlcldpbmRvd19maWxlTWVudTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uTWFuYWdlcldpbmRvd19wcm9wZXJ0aWVzOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25NYW5hZ2VyV2luZG93X2Nsb3NlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbGxXaXphcmRBY3Rpb25fdGl0bGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zdGFsbFdpemFyZF9yZXRyeVRpdGxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbGxXaXphcmRfcmV0cnk7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgVGFyZ2V0UGFnZV9GZWF0dXJlX1NpemU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgVGFyZ2V0UGFnZV9GZWF0dXJlX1ZlcnNpb247CisJcHVibGljIHN0YXRpYyBTdHJpbmcgVGFyZ2V0UGFnZV9GZWF0dXJlTmFtZUNvbHVtbjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXRQYWdlX0luc3RhbGxhdGlvbkRpcmVjdG9yeUNvbHVtbjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBEaXNjb3ZlcnlGb2xkZXJfbmFtZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBGZWF0dXJlQWRhcHRlcl9mYWlsdXJlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNpdGVCb29rbWFya19jb25uZWN0aW5nOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNpdGVCb29rbWFya19kb3dubG9hZGluZzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBNYWluUHJlZmVyZW5jZVBhZ2VfY2hlY2tTaWduYXR1cmU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgTWFpblByZWZlcmVuY2VQYWdlX2F1dG9tYXRpY2FsbHlDaG9vc2VNaXJyb3I7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgTWFpblByZWZlcmVuY2VQYWdlX2hpc3RvcnlTaXplOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1haW5QcmVmZXJlbmNlUGFnZV9pbnZhbGlkSGlzdG9yeVNpemU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgTWFpblByZWZlcmVuY2VQYWdlX3VwZGF0ZVZlcnNpb25zOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1haW5QcmVmZXJlbmNlUGFnZV91cGRhdGVWZXJzaW9uc19lcXVpdmFsZW50OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1haW5QcmVmZXJlbmNlUGFnZV91cGRhdGVWZXJzaW9uc19jb21wYXRpYmxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1haW5QcmVmZXJlbmNlUGFnZV91cGRhdGVQb2xpY3k7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgTWFpblByZWZlcmVuY2VQYWdlX3VwZGF0ZVBvbGljeVVSTDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBNYWluUHJlZmVyZW5jZVBhZ2VfcHJveHlHcm91cDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBNYWluUHJlZmVyZW5jZVBhZ2VfZGlnaXRhbFNpZ25hdHVyZV90aXRsZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBNYWluUHJlZmVyZW5jZVBhZ2VfZGlnaXRhbFNpZ25hdHVyZV9tZXNzYWdlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVwZGF0ZVNldHRpbmdzUHJlZmVyZW5jZVBhZ2VfZGVzY3JpcHRpb247CisJcHVibGljIHN0YXRpYyBTdHJpbmcgVXBkYXRlU2V0dGluZ3NQcmVmZXJlbmNlUGFnZV9sYWJlbDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBVcGRhdGVTZXR0aW5nc1ByZWZlcmVuY2VQYWdlX2ludmFsaWQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJlZFNpdGVQcm9wZXJ0eVBhZ2VfcGF0aDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmVkU2l0ZVByb3BlcnR5UGFnZV90eXBlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyZWRTaXRlUHJvcGVydHlQYWdlX2VuYWJsZWQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJlZFNpdGVQcm9wZXJ0eVBhZ2VfeWVzOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyZWRTaXRlUHJvcGVydHlQYWdlX25vOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyZWRTaXRlUHJvcGVydHlQYWdlX2V4dGVuc2lvbjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmVkU2l0ZVByb3BlcnR5UGFnZV9wcm9kdWN0OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyZWRTaXRlUHJvcGVydHlQYWdlX3Vua25vd247CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRmVhdHVyZUNvcHlyaWdodFByb3BlcnR5UGFnZV9zaG93SW5Ccm93c2VyOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZlYXR1cmVDb3B5cmlnaHRQcm9wZXJ0eVBhZ2Vfbm9Db3B5cmlnaHQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRmVhdHVyZUdlbmVyYWxQcm9wZXJ0eVBhZ2VfbmFtZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBGZWF0dXJlR2VuZXJhbFByb3BlcnR5UGFnZV9pZDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBGZWF0dXJlR2VuZXJhbFByb3BlcnR5UGFnZV92ZXJzaW9uOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZlYXR1cmVHZW5lcmFsUHJvcGVydHlQYWdlX3Byb3ZpZGVyOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZlYXR1cmVHZW5lcmFsUHJvcGVydHlQYWdlX3NpemU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRmVhdHVyZUdlbmVyYWxQcm9wZXJ0eVBhZ2VfcGxhdGZvcm1zOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZlYXR1cmVHZW5lcmFsUHJvcGVydHlQYWdlX3dzOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZlYXR1cmVHZW5lcmFsUHJvcGVydHlQYWdlX2FyY2g7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRmVhdHVyZUdlbmVyYWxQcm9wZXJ0eVBhZ2Vfbmw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRmVhdHVyZUdlbmVyYWxQcm9wZXJ0eVBhZ2VfYWxsOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZlYXR1cmVHZW5lcmFsUHJvcGVydHlQYWdlX29zOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZlYXR1cmVHZW5lcmFsUHJvcGVydHlQYWdlX2Rlc2M7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRmVhdHVyZUdlbmVyYWxQcm9wZXJ0eVBhZ2VfS2lsb2J5dGVzOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZlYXR1cmVMaWNlbnNlUHJvcGVydHlQYWdlX3Nob3dJbkJyb3dzZXI7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRmVhdHVyZUxpY2Vuc2VQcm9wZXJ0eVBhZ2Vfbm9MaWNlbnNlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZlYXR1cmVTdGF0dXNQcm9wZXJ0eVBhZ2VfcGVuZGluZ0NoYW5nZXM7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRmVhdHVyZVN0YXR1c1Byb3BlcnR5UGFnZV9yZWFzb247CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRmVhdHVyZVN0YXR1c1Byb3BlcnR5UGFnZV9taXNzaW5nT3B0aW9uYWw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRmVhdHVyZVN0YXR1c1Byb3BlcnR5UGFnZV9taXNzaW5nOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZlYXR1cmVTdGF0dXNQcm9wZXJ0eVBhZ2VfZ29vZENvbmZpZ3VyYXRpb247CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSmFyVmVyaWZpY2F0aW9uRGlhbG9nX3d0aXRsZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBKYXJWZXJpZmljYXRpb25EaWFsb2dfVGl0bGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSmFyVmVyaWZpY2F0aW9uRGlhbG9nX1ZlcmlmaWNhdGlvbjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBKYXJWZXJpZmljYXRpb25EaWFsb2dfQ29tcG9uZW50Tm90SW5zdGFsbGVkOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEphclZlcmlmaWNhdGlvbkRpYWxvZ19BYm91dFRvSW5zdGFsbF9GaWxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEphclZlcmlmaWNhdGlvbkRpYWxvZ19Ob3REaWdpdGFsbHlTaWduZWRfRmlsZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBKYXJWZXJpZmljYXRpb25EaWFsb2dfQ2Fubm90VmVyaWZ5UHJvdmlkZXJfRmlsZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBKYXJWZXJpZmljYXRpb25EaWFsb2dfQ29ycnVwdGVkQ29udGVudF9GaWxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEphclZlcmlmaWNhdGlvbkRpYWxvZ19TaWduZWRDb21wb25lbnRfRmlsZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBKYXJWZXJpZmljYXRpb25EaWFsb2dfVW5rbm93bkNlcnRpZmljYXRlX0ZpbGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSmFyVmVyaWZpY2F0aW9uRGlhbG9nX1VuYWJsZVRvVmVyaWZ5UHJvdmlkZXJfRmlsZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBKYXJWZXJpZmljYXRpb25EaWFsb2dfUHJvdmlkZXJLbm93bl9GaWxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEphclZlcmlmaWNhdGlvbkRpYWxvZ19Lbm93bkNlcnRpZmljYXRlX0ZpbGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSmFyVmVyaWZpY2F0aW9uRGlhbG9nX0Fib3V0VG9JbnN0YWxsX0ZlYXR1cmU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSmFyVmVyaWZpY2F0aW9uRGlhbG9nX05vdERpZ2l0YWxseVNpZ25lZF9GZWF0dXJlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEphclZlcmlmaWNhdGlvbkRpYWxvZ19DYW5ub3RWZXJpZnlQcm92aWRlcl9GZWF0dXJlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEphclZlcmlmaWNhdGlvbkRpYWxvZ19Db3JydXB0ZWRDb250ZW50X0ZlYXR1cmU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSmFyVmVyaWZpY2F0aW9uRGlhbG9nX1NpZ25lZENvbXBvbmVudF9GZWF0dXJlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEphclZlcmlmaWNhdGlvbkRpYWxvZ19Vbmtub3duQ2VydGlmaWNhdGVfRmVhdHVyZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBKYXJWZXJpZmljYXRpb25EaWFsb2dfVW5hYmxlVG9WZXJpZnlQcm92aWRlcl9GZWF0dXJlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEphclZlcmlmaWNhdGlvbkRpYWxvZ19Qcm92aWRlcktub3duX0ZlYXR1cmU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSmFyVmVyaWZpY2F0aW9uRGlhbG9nX0tub3duQ2VydGlmaWNhdGVfRmVhdHVyZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBKYXJWZXJpZmljYXRpb25EaWFsb2dfRmlsZU5hbWU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSmFyVmVyaWZpY2F0aW9uRGlhbG9nX0ZlYXR1cmVOYW1lOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEphclZlcmlmaWNhdGlvbkRpYWxvZ19GZWF0dXJlSWRlbnRpZmllcjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBKYXJWZXJpZmljYXRpb25EaWFsb2dfUHJvdmlkZXI7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSmFyVmVyaWZpY2F0aW9uRGlhbG9nX01heUNob29zZVRvSW5zdGFsbDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBKYXJWZXJpZmljYXRpb25EaWFsb2dfTWF5Q2hvb3NlVG9Db250aW51ZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBKYXJWZXJpZmljYXRpb25EaWFsb2dfSW5zdGFsbDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBKYXJWZXJpZmljYXRpb25EaWFsb2dfSW5zdGFsbEFsbDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBKYXJWZXJpZmljYXRpb25EaWFsb2dfQ29udGludWU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSmFyVmVyaWZpY2F0aW9uRGlhbG9nX0NhbmNlbDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBKYXJWZXJpZmljYXRpb25EaWFsb2dfUm9vdENBOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEphclZlcmlmaWNhdGlvbkRpYWxvZ19TdWJqZWN0Q0E7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSmFyVmVyaWZpY2F0aW9uRGlhbG9nX0NlcnRpZmljYXRlSW5mbzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBVc2VyVmVyaWZpY2F0aW9uRGlhbG9nX1Bhc3N3b3JkUmVxdWlyZWQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgVXNlclZlcmlmaWNhdGlvbkRpYWxvZ19Db25uZWN0VG87CisJcHVibGljIHN0YXRpYyBTdHJpbmcgVXNlclZlcmlmaWNhdGlvbkRpYWxvZ19QYXNzd29yZDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBVc2VyVmVyaWZpY2F0aW9uRGlhbG9nX1VzZXJOYW1lOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25QcmV2aWV3Rm9ybV9jb25maWdEZXNjcmlwdGlvbjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uUHJldmlld0Zvcm1faW5zdGFsbDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uUHJldmlld0Zvcm1fQXZhaWxhYmxlVGFza3M7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvblZpZXdfbWlzc2luZ0ZlYXR1cmU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvblZpZXdfY3VycmVudDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uVmlld19wZW5kaW5nOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25WaWV3X2Vycm9yOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25WaWV3X2NvbGxhcHNlTGFiZWw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvblZpZXdfY29sbGFwc2VUb29sdGlwOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25WaWV3X3JldmVydExhYmVsOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25WaWV3X2luc3RhbGxIaXN0b3J5OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25WaWV3X2V4dExvY2F0aW9uOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25WaWV3X3VuaW5zdGFsbDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uVmlld191bmNvbmZpZ3VyZUFuZFVuaW5zdGFsbDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uVmlld19pbnN0YWxsOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25WaWV3X2Fub3RoZXJWZXJzaW9uOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25WaWV3X2ZpbmRVcGRhdGVzOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25WaWV3X3Nob3dOZXN0ZWRGZWF0dXJlczsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uVmlld19zaG93TmVzdGVkVG9vbHRpcDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uVmlld19zaG93SW5zdGFsbDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uVmlld19zaG93SW5zdGFsbFRvb2x0aXA7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvblZpZXdfc2hvd0Rpc2FibGVkOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25WaWV3X3Nob3dEaXNhYmxlZFRvb2x0aXA7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvblZpZXdfc2hvd0FjdGl2aXRpZXNMYWJlbDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uVmlld19uZXc7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvblZpZXdfcmVwbGFjZVdpdGg7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvblZpZXdfcmV2ZXJ0UHJldmlvdXNMYWJlbDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uVmlld19yZXZlcnRQcmV2aW91c0Rlc2M7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvblZpZXdfdXBkYXRlTGFiZWw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvblZpZXdfdXBkYXRlRGVzYzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uVmlld19pbnN0YWxsSGlzdExhYmVsOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25WaWV3X2luc3RhbGxIaXN0RGVzYzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uVmlld19hY3Rpdml0aWVzTGFiZWw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvblZpZXdfYWN0aXZpdGllc0Rlc2M7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvblZpZXdfZW5hYmxlTG9jRGVzYzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uVmlld19leHRMb2NMYWJlbDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uVmlld19leHRMb2NEZXNjOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25WaWV3X3Byb3BlcnRpZXNMYWJlbDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uVmlld19pbnN0YWxsUHJvcERlc2M7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvblZpZXdfcmVwbGFjZVZlcnNpb25MYWJlbDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uVmlld19yZXBsYWNlVmVyc2lvbkRlc2M7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvblZpZXdfZW5hYmxlRmVhdHVyZURlc2M7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvblZpZXdfaW5zdGFsbE9wdGlvbmFsTGFiZWw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvblZpZXdfaW5zdGFsbE9wdGlvbmFsRGVzYzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uVmlld191bmluc3RhbGxMYWJlbDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uVmlld191bmluc3RhbGxEZXNjOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25WaWV3X3VuaW5zdGFsbERlc2MyOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25WaWV3X3NjYW5MYWJlbDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uVmlld19zY2FuRGVzYzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uVmlld19mZWF0dXJlUHJvcExhYmVsOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25WaWV3X2ZlYXR1cmVQcm9wRGVzYzsKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uVmlld19sb2FkaW5nOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGlvbnNfYnJva2VuQ29uZmlnUXVlc3Rpb247CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRmVhdHVyZVN0YXRlQWN0aW9uX2Rpc2FibGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRmVhdHVyZVN0YXRlQWN0aW9uX2VuYWJsZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBGZWF0dXJlU3RhdGVBY3Rpb25fZGlzYWJsZVF1ZXN0aW9uOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZlYXR1cmVTdGF0ZUFjdGlvbl9FbmFibGVRdWVzdGlvbjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBGZWF0dXJlU3RhdGVBY3Rpb25fZGlhbG9nVGl0bGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRmVhdHVyZVVuaW5zdGFsbEFjdGlvbl91bmluc3RhbGw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRmVhdHVyZVVuaW5zdGFsbEFjdGlvbl91bmluc3RhbGxRdWVzdGlvbjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBGZWF0dXJlVW5pbnN0YWxsQWN0aW9uX2RpYWxvZ1RpdGxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZlYXR1cmVVbmNvbmZpZ3VyZUFuZFVuaW5zdGFsbEFjdGlvbl91bmluc3RhbGw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRmVhdHVyZVVuY29uZmlndXJlQW5kVW5pbnN0YWxsQWN0aW9uX3F1ZXN0aW9uOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZlYXR1cmVVbmNvbmZpZ3VyZUFuZFVuaW5zdGFsbEFjdGlvbl9kaWFsb2dUaXRsZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTaXRlU3RhdGVBY3Rpb25fZGlhbG9nVGl0bGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2l0ZVN0YXRlQWN0aW9uX2Rpc2FibGVMYWJlbDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTaXRlU3RhdGVBY3Rpb25fZGlzYWJsZU1lc3NhZ2U7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2l0ZVN0YXRlQWN0aW9uX2VuYWJsZUxhYmVsOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNpdGVTdGF0ZUFjdGlvbl9lbmFibGVNZXNzYWdlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbGxhdGlvbkhpc3RvcnlBY3Rpb25fdGl0bGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zdGFsbGF0aW9uSGlzdG9yeUFjdGlvbl9kZXNjOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbGxhdGlvbkhpc3RvcnlBY3Rpb25fZGF0ZVRpbWU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zdGFsbGF0aW9uSGlzdG9yeUFjdGlvbl90YXJnZXQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zdGFsbGF0aW9uSGlzdG9yeUFjdGlvbl9hY3Rpb247CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zdGFsbGF0aW9uSGlzdG9yeUFjdGlvbl9zdGF0dXM7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zdGFsbGF0aW9uSGlzdG9yeUFjdGlvbl9lcnJvcnM7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3RXh0ZW5zaW9uTG9jYXRpb25BY3Rpb25fc2VsZWN0RXh0TG9jYXRpb247CisJcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3RXh0ZW5zaW9uTG9jYXRpb25BY3Rpb25fZXh0SW5mb1RpdGxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0V4dGVuc2lvbkxvY2F0aW9uQWN0aW9uX2V4dEluZm9NZXNzYWdlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXRpZXNUYWJsZVZpZXdlcl9lbmFibGVkOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXRpZXNUYWJsZVZpZXdlcl9mZWF0dXJlSW5zdGFsbGVkOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXRpZXNUYWJsZVZpZXdlcl9mZWF0dXJlUmVtb3ZlZDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0aWVzVGFibGVWaWV3ZXJfc2l0ZUluc3RhbGxlZDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0aWVzVGFibGVWaWV3ZXJfc2l0ZVJlbW92ZWQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdGllc1RhYmxlVmlld2VyX2Rpc2FibGVkOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXRpZXNUYWJsZVZpZXdlcl9yZXZlcnQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdGllc1RhYmxlVmlld2VyX3JlY29uY2lsZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0aWVzVGFibGVWaWV3ZXJfdW5rbm93bjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0aWVzVGFibGVWaWV3ZXJfZGF0ZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0aWVzVGFibGVWaWV3ZXJfdGFyZ2V0OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXRpZXNUYWJsZVZpZXdlcl9hY3Rpb247CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRHVwbGljYXRlQ29uZmxpY3RzRGlhbG9nX3RpdGxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIER1cGxpY2F0ZUNvbmZsaWN0c0RpYWxvZ19tZXNzYWdlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIER1cGxpY2F0ZUNvbmZsaWN0c0RpYWxvZ190cmVlTGFiZWw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgTW9kZVNlbGVjdGlvblBhZ2VfdGl0bGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgTW9kZVNlbGVjdGlvblBhZ2VfZGVzYzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBNb2RlU2VsZWN0aW9uUGFnZV91cGRhdGVzOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1vZGVTZWxlY3Rpb25QYWdlX3VwZGF0ZXNUZXh0OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1vZGVTZWxlY3Rpb25QYWdlX25ld0ZlYXR1cmVzOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1vZGVTZWxlY3Rpb25QYWdlX25ld0ZlYXR1cmVzVGV4dDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBNb3JlSW5mb0dlbmVyYXRvcl9tb3JlSW5mbzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdVcGRhdGVTaXRlRGlhbG9nX25hbWU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3VXBkYXRlU2l0ZURpYWxvZ191cmw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3VXBkYXRlU2l0ZURpYWxvZ19lcnJvcl9uYW1lT3JVcmxOb3RTcGVjaWZpZWQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3VXBkYXRlU2l0ZURpYWxvZ19lcnJvcl9kdXBsaWNhdGVOYW1lOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld1VwZGF0ZVNpdGVEaWFsb2dfZXJyb3JfZHVwbGljYXRlVXJsOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld1VwZGF0ZVNpdGVEaWFsb2dfZXJyb3JfaW5jb3JyZWN0VXJsOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbGxXaXphcmRfaXNSdW5uaW5nVGl0bGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zdGFsbFdpemFyZF9pc1J1bm5pbmdJbmZvOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbGxXaXphcmRfam9iTmFtZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnN0YWxsV2l6YXJkX2Rvd25sb2FkOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbGxXaXphcmRfZG93bmxvYWRpbmdGZWF0dXJlSmFyOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbGxXaXphcmRfYW5vdGhlckpvYjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnN0YWxsV2l6YXJkX2Fub3RoZXJKb2JUaXRsZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnN0YWxsV2l6YXJkX3d0aXRsZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnN0YWxsV2l6YXJkX09wdGlvbmFsRmVhdHVyZXNQYWdlX3RpdGxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbGxXaXphcmRfT3B0aW9uYWxGZWF0dXJlc1BhZ2VfZGVzYzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnN0YWxsV2l6YXJkX09wdGlvbmFsRmVhdHVyZXNQYWdlX3RyZWVMYWJlbDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnN0YWxsV2l6YXJkX09wdGlvbmFsRmVhdHVyZXNQYWdlX3NlbGVjdEFsbDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnN0YWxsV2l6YXJkX09wdGlvbmFsRmVhdHVyZXNQYWdlX2Rlc2VsZWN0QWxsOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbGxXaXphcmRfUmV2aWV3UGFnZV9jb3VudGVyOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbGxXaXphcmRfUmV2aWV3UGFnZV90aXRsZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnN0YWxsV2l6YXJkX1Jldmlld1BhZ2VfZGVzYzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnN0YWxsV2l6YXJkX1Jldmlld1BhZ2VfemVyb1VwZGF0ZXM7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zdGFsbFdpemFyZF9SZXZpZXdQYWdlX3plcm9GZWF0dXJlczsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnN0YWxsV2l6YXJkX1Jldmlld1BhZ2VfbGFiZWw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zdGFsbFdpemFyZF9SZXZpZXdQYWdlX2Rlc2VsZWN0QWxsOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbGxXaXphcmRfUmV2aWV3UGFnZV9tb3JlSW5mbzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnN0YWxsV2l6YXJkX1Jldmlld1BhZ2VfcHJvcGVydGllczsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnN0YWxsV2l6YXJkX1Jldmlld1BhZ2Vfc2VsZWN0UmVxdWlyZWQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zdGFsbFdpemFyZF9SZXZpZXdQYWdlX3Nob3dTdGF0dXM7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zdGFsbFdpemFyZF9SZXZpZXdQYWdlX2ZpbHRlckZlYXR1cmVzOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbGxXaXphcmRfUmV2aWV3UGFnZV9maWx0ZXJQYXRjaGVzOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbGxXaXphcmRfUmV2aWV3UGFnZV9maWx0ZXJPbGRlckZlYXR1cmVzOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbGxXaXphcmRfUmV2aWV3UGFnZV9pbnZhbGlkX2xvbmc7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zdGFsbFdpemFyZF9SZXZpZXdQYWdlX2ludmFsaWRfc2hvcnQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zdGFsbFdpemFyZF9SZXZpZXdQYWdlX2N5Y2xlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbGxXaXphcmRfTGljZW5zZVBhZ2VfYWNjZXB0OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbGxXaXphcmRfTGljZW5zZVBhZ2VfYWNjZXB0MjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnN0YWxsV2l6YXJkX0xpY2Vuc2VQYWdlX2RlY2xpbmU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zdGFsbFdpemFyZF9MaWNlbnNlUGFnZV9kZWNsaW5lMjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnN0YWxsV2l6YXJkX0xpY2Vuc2VQYWdlX2Rlc2M7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zdGFsbFdpemFyZF9MaWNlbnNlUGFnZV9kZXNjMjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnN0YWxsV2l6YXJkX0xpY2Vuc2VQYWdlX3RpdGxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbGxXaXphcmRfVGFyZ2V0UGFnZV90aXRsZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnN0YWxsV2l6YXJkX1RhcmdldFBhZ2VfZGVzYzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnN0YWxsV2l6YXJkX1RhcmdldFBhZ2Vfam9ic0xhYmVsOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbGxXaXphcmRfVGFyZ2V0UGFnZV9zaXRlTGFiZWw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zdGFsbFdpemFyZF9UYXJnZXRQYWdlX25ldzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnN0YWxsV2l6YXJkX1RhcmdldFBhZ2VfZGVsZXRlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbGxXaXphcmRfVGFyZ2V0UGFnZV9yZXF1aXJlZFNwYWNlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbGxXaXphcmRfVGFyZ2V0UGFnZV9hdmFpbGFibGVTcGFjZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnN0YWxsV2l6YXJkX1RhcmdldFBhZ2VfbG9jYXRpb247CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zdGFsbFdpemFyZF9UYXJnZXRQYWdlX2xvY2F0aW9uX2NoYW5nZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnN0YWxsV2l6YXJkX1RhcmdldFBhZ2VfbG9jYXRpb25fbWVzc2FnZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnN0YWxsV2l6YXJkX1RhcmdldFBhZ2VfbG9jYXRpb25fZW1wdHk7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zdGFsbFdpemFyZF9UYXJnZXRQYWdlX2xvY2F0aW9uX2Vycm9yX3RpdGxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbGxXaXphcmRfVGFyZ2V0UGFnZV9zaXplX0tCOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbGxXaXphcmRfVGFyZ2V0UGFnZV9zaXplX01COworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbGxXaXphcmRfVGFyZ2V0UGFnZV9zaXplX0dCOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbGxXaXphcmRfVGFyZ2V0UGFnZV91bmtub3duU2l6ZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnN0YWxsV2l6YXJkX1RhcmdldFBhZ2VfcGF0Y2hFcnJvcjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnN0YWxsV2l6YXJkX1RhcmdldFBhZ2VfcGF0Y2hFcnJvcjI7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zdGFsbFdpemFyZDJfdXBkYXRlT3BlcmF0aW9uSGFzRmFpbGVkOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJldmVydENvbmZpZ3VyYXRpb25XaXphcmRfd3RpdGxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJldmVydENvbmZpZ3VyYXRpb25XaXphcmRQYWdlX3RpdGxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJldmVydENvbmZpZ3VyYXRpb25XaXphcmRQYWdlX2Rlc2M7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgUmV2ZXJ0Q29uZmlndXJhdGlvbldpemFyZFBhZ2VfbGFiZWw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgUmV2ZXJ0Q29uZmlndXJhdGlvbldpemFyZFBhZ2VfYWN0aXZpdGllczsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBSZXZlcnRDb25maWd1cmF0aW9uV2l6YXJkUGFnZV9xdWVzdGlvbjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBSZXZlcnRfUHJvYmxlbURpYWxvZ190aXRsZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTaG93QWN0aXZpdGllc0RpYWxvZ190aXRsZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTaG93QWN0aXZpdGllc0RpYWxvZ19kYXRlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNob3dBY3Rpdml0aWVzRGlhbG9nX2xvYzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTaG93QWN0aXZpdGllc0RpYWxvZ19sYWJlbDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTaXRlUGFnZV90aXRsZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTaXRlUGFnZV9kZXNjOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNpdGVQYWdlX2xhYmVsOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNpdGVQYWdlX2FkZFVwZGF0ZVNpdGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2l0ZVBhZ2VfYWRkTG9jYWxTaXRlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNpdGVQYWdlX2FkZExvY2FsWmlwcGVkU2l0ZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTaXRlUGFnZV9lZGl0OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNpdGVQYWdlX3JlbW92ZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTaXRlUGFnZV9pbXBvcnQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2l0ZVBhZ2VfZXhwb3J0OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNpdGVQYWdlX2lnbm9yZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTaXRlUGFnZV9hdXRvbWF0aWNhbGx5U2VsZWN0TWlycm9yczsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTaXRlUGFnZV9uZXc7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgU2l0ZVBhZ2VfZGlhbG9nRWRpdExvY2FsOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNpdGVQYWdlX2RpYWxvZ0VkaXRVcGRhdGVTaXRlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNpdGVQYWdlX3JlbW92ZV9sb2NhdGlvbl9jb25mX3RpdGxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNpdGVQYWdlX3JlbW92ZV9sb2NhdGlvbl9jb25mOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExvY2FsU2l0ZVNlbGVjdG9yX2RpYWxvZ01lc3NhZ2U7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgTG9jYWxTaXRlU2VsZWN0b3JfZGlySW5mb1RpdGxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExvY2FsU2l0ZVNlbGVjdG9yX2RpckluZm9NZXNzYWdlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExvY2FsU2l0ZVNlbGVjdG9yX2RpckR1cGxpY2F0ZURlZmluaXRpb247CisJcHVibGljIHN0YXRpYyBTdHJpbmcgTG9jYWxTaXRlU2VsZWN0b3JfZGlhbG9nTWVzc2FnZXppcDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBMb2NhbFNpdGVTZWxlY3Rvcl96aXBJbmZvVGl0bGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgTG9jYWxTaXRlU2VsZWN0b3JfemlwSW5mb01lc3NhZ2U7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgTG9jYWxTaXRlU2VsZWN0b3JfemlwRHVwbGljYXRlRGVmaW5pdGlvbjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBMb2NhbFNpdGVTZWxlY3Rvcl9kaWFsb2dNZXNzYWdlSW1wb3J0OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExvY2FsU2l0ZVNlbGVjdG9yX2ltcG9ydEluZm9UaXRsZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBMb2NhbFNpdGVTZWxlY3Rvcl9pbXBvcnRJbmZvTWVzc2FnZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBMb2NhbFNpdGVTZWxlY3Rvcl9kaWFsb2dNZXNzYWdlRXhwb3J0OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1pc3NpbmdGZWF0dXJlX3Byb3ZpZGVyOworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1pc3NpbmdGZWF0dXJlX2lkOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1pc3NpbmdGZWF0dXJlX2Rlc2NfdW5rbm93bjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBNaXNzaW5nRmVhdHVyZV9kZXNjX29wdGlvbmFsOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN3YXBGZWF0dXJlV2l6YXJkX3RpdGxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN3YXBGZWF0dXJlV2l6YXJkUGFnZV90aXRsZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTd2FwRmVhdHVyZVdpemFyZFBhZ2VfZGVzYzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBTd2FwRmVhdHVyZVdpemFyZFBhZ2VfbGFiZWw7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgTWlycm9yc0RpYWxvZ190ZXh0OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1pcnJvcnNEaWFsb2dfdGl0bGU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0b21hdGljVXBkYXRlc0pvYl9VcGRhdGVzOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dG9tYXRpY1VwZGF0ZXNKb2JfRWNsaXBzZVVwZGF0ZXMxOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dG9tYXRpY1VwZGF0ZXNKb2JfVXBkYXRlc0F2YWlsYWJsZTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRvbWF0aWNVcGRhdGVzSm9iX0VjbGlwc2VVcGRhdGVzMjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRvbWF0aWNVcGRhdGVzSm9iX1VwZGF0ZXNEb3dubG9hZGVkOworICAgIAorICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEZlYXR1cmVQYWdlX29wdGlvbmFsSW5zdGFsbF90aXRsZTsKKworCXN0YXRpYyB7CisJCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIFVwZGF0ZVVJTWVzc2FnZXMuY2xhc3MpOworCX0KKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25NYW5hZ2VyV2luZG93X3NlYXJjaFRhc2tOYW1lOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbmRVcGRhdGVzQWN0aW9uX3RyYWNrZWRQcm9ncmVzczsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBGaW5kVXBkYXRlc0FjdGlvbl9hbGxGZWF0dXJlc1NlYXJjaDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBSZXZpZXdQYWdlX3ZhbGlkYXRpbmc7Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVXBkYXRlVUlQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9VcGRhdGVVSVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3MmRkMjgKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVXBkYXRlVUlQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcwpAQCAtMCwwICsxLDQwOSBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisjIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjCisjIENvbnRyaWJ1dG9yczoKKyMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIworIworUmVzdGFydFRpdGxlID0gSW5zdGFsbC9VcGRhdGUKK1Jlc3RhcnRNZXNzYWdlID0gWW91IHdpbGwgbmVlZCB0byByZXN0YXJ0IHRoZSB7MH0gZm9yIHRoZSBjaGFuZ2VzIHRvIHRha2UgZWZmZWN0LiBcCitXb3VsZCB5b3UgbGlrZSB0byByZXN0YXJ0IG5vdz8KKworT3B0aW9uYWxSZXN0YXJ0TWVzc2FnZSA9IEl0IGlzIHJlY29tbWVuZGVkIHlvdSByZXN0YXJ0IHRoZSB7MH0gZm9yIHRoZSBjaGFuZ2VzIHRvIHRha2UgZWZmZWN0LCBcCitidXQgaXQgbWF5IGJlIHBvc3NpYmxlIHRvIGFwcGx5IHRoZSBjaGFuZ2VzIHRvIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gd2l0aG91dCByZXN0YXJ0aW5nLiBcCitXb3VsZCB5b3UgbGlrZSB0byByZXN0YXJ0IG5vdz8KKworQXBwbGljYXRpb25JblJlc3RhcnREaWFsb2cgPWFwcGxpY2F0aW9uCisKK0FwcGx5Q2hhbmdlcz1BcHBseSBDaGFuZ2VzCisKKworQ29uZmlndXJhdGlvbk1hbmFnZXJBY3Rpb25fdGl0bGU9UHJvZHVjdCBDb25maWd1cmF0aW9uCitDb25maWd1cmF0aW9uTWFuYWdlcldpbmRvd19maWxlTWVudT0mRmlsZQorQ29uZmlndXJhdGlvbk1hbmFnZXJXaW5kb3dfcHJvcGVydGllcz0mUHJvcGVydGllcworQ29uZmlndXJhdGlvbk1hbmFnZXJXaW5kb3dfc2VhcmNoVGFza05hbWU9U2VhcmNoaW5nIGZvciB1cGRhdGVzOiB7MH0KK0NvbmZpZ3VyYXRpb25NYW5hZ2VyV2luZG93X2Nsb3NlPSZDbG9zZQorCisKK0luc3RhbGxXaXphcmRBY3Rpb25fdGl0bGU9SW5zdGFsbC9VcGRhdGUKK0luc3RhbGxXaXphcmRfcmV0cnlUaXRsZSA9IFByb2JsZW0gb2NjdXJyZWQKK0luc3RhbGxXaXphcmRfcmV0cnkgPSBEbyB5b3Ugd2FudCB0byByZXRyeT8KKworCitEaXNjb3ZlcnlGb2xkZXJfbmFtZT1TaXRlcyB0byBWaXNpdAorRmVhdHVyZUFkYXB0ZXJfZmFpbHVyZT08ZmFpbHVyZT4KK1NpdGVCb29rbWFya19jb25uZWN0aW5nID0gQ29ubmVjdGluZyB0byAiezB9Ii4uLgorU2l0ZUJvb2ttYXJrX2Rvd25sb2FkaW5nID0gRG93bmxvYWRpbmc6XAorCitNYWluUHJlZmVyZW5jZVBhZ2VfY2hlY2tTaWduYXR1cmUgPSBDaGVjayBkaWdpdGFsICZzaWduYXR1cmVzIG9mIGRvd25sb2FkZWQgYXJjaGl2ZXMKK01haW5QcmVmZXJlbmNlUGFnZV9hdXRvbWF0aWNhbGx5Q2hvb3NlTWlycm9yID0gQXV0b21hdGljYWxseSBzZWxlY3QgJm1pcnJvcnMKK01haW5QcmVmZXJlbmNlUGFnZV9oaXN0b3J5U2l6ZSA9ICZNYXhpbXVtIG51bWJlciBvZiAnSGlzdG9yeScgY29uZmlndXJhdGlvbnM6CitNYWluUHJlZmVyZW5jZVBhZ2VfaW52YWxpZEhpc3RvcnlTaXplID0gVGhlIG1heGltdW0gbnVtYmVyIG9mICdIaXN0b3J5JyBjb25maWd1cmF0aW9ucyBtdXN0IGJlIDAgb3IgbW9yZS4KK01haW5QcmVmZXJlbmNlUGFnZV91cGRhdGVWZXJzaW9ucyA9IFZhbGlkIHVwZGF0ZXMKK01haW5QcmVmZXJlbmNlUGFnZV91cGRhdGVWZXJzaW9uc19lcXVpdmFsZW50ID0gZSZxdWl2YWxlbnQgKDEuMC4xIC0+IDEuMC4yIC0gb25seSBzZXJ2aWNlIGluY3JlbWVudHMpCitNYWluUHJlZmVyZW5jZVBhZ2VfdXBkYXRlVmVyc2lvbnNfY29tcGF0aWJsZSA9ICZjb21wYXRpYmxlICgxLjAuOSAtPiAxLjEuMCAtIHNlcnZpY2UgYW5kIG1pbm9yIGluY3JlbWVudHMpCitNYWluUHJlZmVyZW5jZVBhZ2VfdXBkYXRlUG9saWN5ID0gJlVwZGF0ZSBQb2xpY3kKK01haW5QcmVmZXJlbmNlUGFnZV91cGRhdGVQb2xpY3lVUkwgPSBQbyZsaWN5IFVSTDoKK01haW5QcmVmZXJlbmNlUGFnZV9wcm94eUdyb3VwID0gUHJveHkgc2V0dGluZ3MKK01haW5QcmVmZXJlbmNlUGFnZV9kaWdpdGFsU2lnbmF0dXJlX3RpdGxlID0gRGlnaXRhbCBTaWduYXR1cmUgQ2hlY2sKK01haW5QcmVmZXJlbmNlUGFnZV9kaWdpdGFsU2lnbmF0dXJlX21lc3NhZ2UgPSBZb3UgaGF2ZSBjaG9zZW4gdG8gZGlzYWJsZSBkaWdpdGFsIHNpZ25hdHVyZSBcCitjaGVja3MgZm9yIGRvd25sb2FkZWQgYXJjaGl2ZXMuIE5vdGUgdGhhdCB1bnNpZ25lZCBhcmNoaXZlcyBtYXkgXAorY29udGFpbiBzb2Z0d2FyZSB0aGF0IGNhbiBoYXJtIHlvdXIgY29tcHV0ZXIuCisKK1VwZGF0ZVNldHRpbmdzUHJlZmVyZW5jZVBhZ2VfZGVzY3JpcHRpb249U2V0dGluZ3MgZm9yIGF1dG9tYXRpYyBmZWF0dXJlIHVwZGF0ZQorVXBkYXRlU2V0dGluZ3NQcmVmZXJlbmNlUGFnZV9sYWJlbD1BZGRyZXNzICZNYXBwaW5ncyBVUkw6CitVcGRhdGVTZXR0aW5nc1ByZWZlcmVuY2VQYWdlX2ludmFsaWQ9SW52YWxpZCBtYXBwaW5ncyBVUkwKKworCitDb25maWd1cmVkU2l0ZVByb3BlcnR5UGFnZV9wYXRoPUxvY2F0aW9uIHBhdGg6CitDb25maWd1cmVkU2l0ZVByb3BlcnR5UGFnZV90eXBlPUxvY2F0aW9uIHR5cGU6CitDb25maWd1cmVkU2l0ZVByb3BlcnR5UGFnZV9lbmFibGVkPUVuYWJsZWQ6CitDb25maWd1cmVkU2l0ZVByb3BlcnR5UGFnZV95ZXM9eWVzCitDb25maWd1cmVkU2l0ZVByb3BlcnR5UGFnZV9ubz1ubworQ29uZmlndXJlZFNpdGVQcm9wZXJ0eVBhZ2VfZXh0ZW5zaW9uPXByb2R1Y3QgZXh0ZW5zaW9uCitDb25maWd1cmVkU2l0ZVByb3BlcnR5UGFnZV9wcm9kdWN0PXByb2R1Y3QKK0NvbmZpZ3VyZWRTaXRlUHJvcGVydHlQYWdlX3Vua25vd249dW5rbm93bgorCitGZWF0dXJlQ29weXJpZ2h0UHJvcGVydHlQYWdlX3Nob3dJbkJyb3dzZXI9JlNob3cgaW4gQnJvd3NlcgorRmVhdHVyZUNvcHlyaWdodFByb3BlcnR5UGFnZV9ub0NvcHlyaWdodD1GZWF0dXJlIGRvZXMgbm90IGNvbnRhaW4gYSBjb3B5cmlnaHQgc3RhdGVtZW50CisKK0ZlYXR1cmVHZW5lcmFsUHJvcGVydHlQYWdlX25hbWU9TmFtZToKK0ZlYXR1cmVHZW5lcmFsUHJvcGVydHlQYWdlX2lkPUlkZW50aWZpZXI6CitGZWF0dXJlR2VuZXJhbFByb3BlcnR5UGFnZV92ZXJzaW9uPVZlcnNpb246CitGZWF0dXJlR2VuZXJhbFByb3BlcnR5UGFnZV9wcm92aWRlcj1Qcm92aWRlcjoKK0ZlYXR1cmVHZW5lcmFsUHJvcGVydHlQYWdlX3NpemU9U2l6ZToKK0ZlYXR1cmVHZW5lcmFsUHJvcGVydHlQYWdlX3BsYXRmb3Jtcz1TdXBwb3J0ZWQgUGxhdGZvcm1zCitGZWF0dXJlR2VuZXJhbFByb3BlcnR5UGFnZV93cz1XaW5kb3dpbmcgU3lzdGVtOiB7MH0KK0ZlYXR1cmVHZW5lcmFsUHJvcGVydHlQYWdlX2FyY2g9Q1BVIEFyY2hpdGVjdHVyZTogezB9CitGZWF0dXJlR2VuZXJhbFByb3BlcnR5UGFnZV9ubD1MYW5ndWFnZXM6IHswfQorRmVhdHVyZUdlbmVyYWxQcm9wZXJ0eVBhZ2VfYWxsPWFsbAorRmVhdHVyZUdlbmVyYWxQcm9wZXJ0eVBhZ2Vfb3M9T3BlcmF0aW5nIFN5c3RlbTogezB9CitGZWF0dXJlR2VuZXJhbFByb3BlcnR5UGFnZV9kZXNjPURlc2NyaXB0aW9uCitGZWF0dXJlR2VuZXJhbFByb3BlcnR5UGFnZV9LaWxvYnl0ZXMgPSBLQgorCitGZWF0dXJlTGljZW5zZVByb3BlcnR5UGFnZV9zaG93SW5Ccm93c2VyPSZTaG93IGluIEJyb3dzZXIKK0ZlYXR1cmVMaWNlbnNlUHJvcGVydHlQYWdlX25vTGljZW5zZT1GZWF0dXJlIGRvZXMgbm90IGNvbnRhaW4gYSBsaWNlbnNlLgorCitGZWF0dXJlU3RhdHVzUHJvcGVydHlQYWdlX3BlbmRpbmdDaGFuZ2VzPVRoZSBmZWF0dXJlIGhhcyBwZW5kaW5nIGNoYW5nZXMuICBUaGVyZWZvcmUsIGl0cyBzdGF0dXMgY2Fubm90IGJlIGRldGVybWluZWQgdW50aWwgeW91IHJlc3RhcnQgdGhlIHdvcmtiZW5jaC4KK0ZlYXR1cmVTdGF0dXNQcm9wZXJ0eVBhZ2VfcmVhc29uPVJlYXNvbjoKK0ZlYXR1cmVTdGF0dXNQcm9wZXJ0eVBhZ2VfbWlzc2luZ09wdGlvbmFsPVRoaXMgb3B0aW9uYWwgZmVhdHVyZSBpcyBjdXJyZW50bHkgbm90IGluc3RhbGxlZC4KK0ZlYXR1cmVTdGF0dXNQcm9wZXJ0eVBhZ2VfbWlzc2luZz1SZWZlcmVuY2VkIGZlYXR1cmUgbm90IGZvdW5kLgorRmVhdHVyZVN0YXR1c1Byb3BlcnR5UGFnZV9nb29kQ29uZmlndXJhdGlvbj1UaGUgZmVhdHVyZSBpcyBjb25maWd1cmVkIHByb3Blcmx5LgorCitKYXJWZXJpZmljYXRpb25EaWFsb2dfd3RpdGxlID0gVmVyaWZpY2F0aW9uCitKYXJWZXJpZmljYXRpb25EaWFsb2dfVGl0bGU9IEZlYXR1cmUgVmVyaWZpY2F0aW9uCitKYXJWZXJpZmljYXRpb25EaWFsb2dfVmVyaWZpY2F0aW9uPVZlcmlmaWNhdGlvbgorSmFyVmVyaWZpY2F0aW9uRGlhbG9nX0NvbXBvbmVudE5vdEluc3RhbGxlZD1UaGlzIGZlYXR1cmUgd2lsbCBub3QgYmUgaW5zdGFsbGVkLgorCitKYXJWZXJpZmljYXRpb25EaWFsb2dfQWJvdXRUb0luc3RhbGxfRmlsZT1XYXJuaW5nOiBZb3UgYXJlIGFib3V0IHRvIGluc3RhbGwgYW4gdW5zaWduZWQgZmVhdHVyZSBmaWxlLgorSmFyVmVyaWZpY2F0aW9uRGlhbG9nX05vdERpZ2l0YWxseVNpZ25lZF9GaWxlPSBUaGlzIGZlYXR1cmUgZmlsZSBoYXMgbm90IGJlZW4gZGlnaXRhbGx5IHNpZ25lZC4KK0phclZlcmlmaWNhdGlvbkRpYWxvZ19DYW5ub3RWZXJpZnlQcm92aWRlcl9GaWxlPVRoZSBwcm92aWRlciBvZiB0aGlzIGZlYXR1cmUgZmlsZSBjYW5ub3QgYmUgdmVyaWZpZWQuCitKYXJWZXJpZmljYXRpb25EaWFsb2dfQ29ycnVwdGVkQ29udGVudF9GaWxlPVRoZSBjb250ZW50IG9mIHRoaXMgZmVhdHVyZSBmaWxlIGhhcyBiZWVuIGNvcnJ1cHRlZAorSmFyVmVyaWZpY2F0aW9uRGlhbG9nX1NpZ25lZENvbXBvbmVudF9GaWxlPVlvdSBhcmUgYWJvdXQgdG8gaW5zdGFsbCBhIHNpZ25lZCBmZWF0dXJlIGZpbGUuCitKYXJWZXJpZmljYXRpb25EaWFsb2dfVW5rbm93bkNlcnRpZmljYXRlX0ZpbGU9VGhlIGNlcnRpZmljYXRlcyB1c2VkIHRvIGF1dGhlbnRpY2F0ZSB0aGlzIGZlYXR1cmUgZmlsZSBhcmUgbm90IHJlY29nbml6ZWQuCitKYXJWZXJpZmljYXRpb25EaWFsb2dfVW5hYmxlVG9WZXJpZnlQcm92aWRlcl9GaWxlPVRoZSBwcm92aWRlciBvZiB0aGlzIGZlYXR1cmUgZmlsZSBjYW5ub3QgYmUgdmVyaWZpZWQuCitKYXJWZXJpZmljYXRpb25EaWFsb2dfUHJvdmlkZXJLbm93bl9GaWxlPVRoZSBwcm92aWRlciBvZiB0aGlzIGZlYXR1cmUgZmlsZSBoYXMgYmVlbiB2YWxpZGF0ZWQgYnkgYSB0cnVzdGVkIHRoaXJkIHBhcnR5LgorSmFyVmVyaWZpY2F0aW9uRGlhbG9nX0tub3duQ2VydGlmaWNhdGVfRmlsZT1PbmUgb2YgdGhlIGNlcnRpZmljYXRlcyB1c2VkIHRvIGF1dGhlbnRpY2F0ZSB0aGlzIGZlYXR1cmUgZmlsZSB3YXMgcmVjb2duaXplZC4KKworSmFyVmVyaWZpY2F0aW9uRGlhbG9nX0Fib3V0VG9JbnN0YWxsX0ZlYXR1cmU9V2FybmluZzogWW91IGFyZSBhYm91dCB0byBpbnN0YWxsIGFuIHVuc2lnbmVkIGZlYXR1cmUuCitKYXJWZXJpZmljYXRpb25EaWFsb2dfTm90RGlnaXRhbGx5U2lnbmVkX0ZlYXR1cmU9IFRoaXMgZmVhdHVyZSBoYXMgbm90IGJlZW4gZGlnaXRhbGx5IHNpZ25lZC4KK0phclZlcmlmaWNhdGlvbkRpYWxvZ19DYW5ub3RWZXJpZnlQcm92aWRlcl9GZWF0dXJlPVRoZSBwcm92aWRlciBvZiB0aGlzIGZlYXR1cmUgY2Fubm90IGJlIHZlcmlmaWVkLgorSmFyVmVyaWZpY2F0aW9uRGlhbG9nX0NvcnJ1cHRlZENvbnRlbnRfRmVhdHVyZT1UaGUgY29udGVudCBvZiB0aGlzIGZlYXR1cmUgaGFzIGJlZW4gY29ycnVwdGVkCitKYXJWZXJpZmljYXRpb25EaWFsb2dfU2lnbmVkQ29tcG9uZW50X0ZlYXR1cmU9WW91IGFyZSBhYm91dCB0byBpbnN0YWxsIGEgc2lnbmVkIGZlYXR1cmUuCitKYXJWZXJpZmljYXRpb25EaWFsb2dfVW5rbm93bkNlcnRpZmljYXRlX0ZlYXR1cmU9VGhlIGNlcnRpZmljYXRlcyB1c2VkIHRvIGF1dGhlbnRpY2F0ZSB0aGlzIGZlYXR1cmUgYXJlIG5vdCByZWNvZ25pemVkLgorSmFyVmVyaWZpY2F0aW9uRGlhbG9nX1VuYWJsZVRvVmVyaWZ5UHJvdmlkZXJfRmVhdHVyZT1UaGUgcHJvdmlkZXIgb2YgdGhpcyBmZWF0dXJlIGNhbm5vdCBiZSB2ZXJpZmllZC4KK0phclZlcmlmaWNhdGlvbkRpYWxvZ19Qcm92aWRlcktub3duX0ZlYXR1cmU9VGhlIHByb3ZpZGVyIG9mIHRoaXMgZmVhdHVyZSBoYXMgYmVlbiB2YWxpZGF0ZWQgYnkgYSB0cnVzdGVkIHRoaXJkIHBhcnR5LgorSmFyVmVyaWZpY2F0aW9uRGlhbG9nX0tub3duQ2VydGlmaWNhdGVfRmVhdHVyZT1PbmUgb2YgdGhlIGNlcnRpZmljYXRlcyB1c2VkIHRvIGF1dGhlbnRpY2F0ZSB0aGlzIGZlYXR1cmUgd2FzIHJlY29nbml6ZWQuCisKK0phclZlcmlmaWNhdGlvbkRpYWxvZ19GaWxlTmFtZT1GaWxlIElkZW50aWZpZXI6CitKYXJWZXJpZmljYXRpb25EaWFsb2dfRmVhdHVyZU5hbWU9RmVhdHVyZSBuYW1lOgorSmFyVmVyaWZpY2F0aW9uRGlhbG9nX0ZlYXR1cmVJZGVudGlmaWVyPUZlYXR1cmUgSWRlbnRpZmllcjoKK0phclZlcmlmaWNhdGlvbkRpYWxvZ19Qcm92aWRlcj0JUHJvdmlkZXI6CitKYXJWZXJpZmljYXRpb25EaWFsb2dfTWF5Q2hvb3NlVG9JbnN0YWxsPVlvdSBtYXkgY2hvb3NlIHRvIGluc3RhbGwgdGhlIGZlYXR1cmUgb3IgY2FuY2VsIGl0cyBpbnN0YWxsYXRpb24uCitKYXJWZXJpZmljYXRpb25EaWFsb2dfTWF5Q2hvb3NlVG9Db250aW51ZT1Zb3UgbWF5IGNob29zZSB0byBjb250aW51ZSB0byBpbnN0YWxsIHRoZSBmZWF0dXJlIG9yIGNhbmNlbCBpdHMgaW5zdGFsbGF0aW9uLgorSmFyVmVyaWZpY2F0aW9uRGlhbG9nX0luc3RhbGw9Jkluc3RhbGwKK0phclZlcmlmaWNhdGlvbkRpYWxvZ19JbnN0YWxsQWxsPUluc3RhbGwgJkFsbAorSmFyVmVyaWZpY2F0aW9uRGlhbG9nX0NvbnRpbnVlPUMmb250aW51ZQorSmFyVmVyaWZpY2F0aW9uRGlhbG9nX0NhbmNlbD0mQ2FuY2VsCitKYXJWZXJpZmljYXRpb25EaWFsb2dfUm9vdENBPSBBY2NvcmRpbmcgdG86CitKYXJWZXJpZmljYXRpb25EaWFsb2dfU3ViamVjdENBPSBGaWxlIHNpZ25lZCBieToKK0phclZlcmlmaWNhdGlvbkRpYWxvZ19DZXJ0aWZpY2F0ZUluZm89IENlcnRpZmljYXRlOgorCitVc2VyVmVyaWZpY2F0aW9uRGlhbG9nX1Bhc3N3b3JkUmVxdWlyZWQ9UGFzc3dvcmQgUmVxdWlyZWQKK1VzZXJWZXJpZmljYXRpb25EaWFsb2dfQ29ubmVjdFRvPUNvbm5lY3QgdG86CitVc2VyVmVyaWZpY2F0aW9uRGlhbG9nX1Bhc3N3b3JkPVBhc3N3b3JkOgorVXNlclZlcmlmaWNhdGlvbkRpYWxvZ19Vc2VyTmFtZT1Vc2VyIG5hbWU6CisKK0NvbmZpZ3VyYXRpb25QcmV2aWV3Rm9ybV9jb25maWdEZXNjcmlwdGlvbj1UaGlzIGlzIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgorQ29uZmlndXJhdGlvblByZXZpZXdGb3JtX2luc3RhbGw9SW5zdGFsbCBMb2NhdGlvbgorQ29uZmlndXJhdGlvblByZXZpZXdGb3JtX0F2YWlsYWJsZVRhc2tzPUF2YWlsYWJsZSBUYXNrcworCitDb25maWd1cmF0aW9uVmlld19taXNzaW5nRmVhdHVyZSA9IHswfSAobm90IGluc3RhbGxlZCkKK0NvbmZpZ3VyYXRpb25WaWV3X2N1cnJlbnQ9Q3VycmVudCBDb25maWd1cmF0aW9uCitDb25maWd1cmF0aW9uVmlld19wZW5kaW5nPVwgKHBlbmRpbmcgY2hhbmdlcykKK0NvbmZpZ3VyYXRpb25WaWV3X2Vycm9yPUVycm9yCitDb25maWd1cmF0aW9uVmlld19jb2xsYXBzZUxhYmVsPUNvbGxhcHNlIEFsbAorQ29uZmlndXJhdGlvblZpZXdfY29sbGFwc2VUb29sdGlwPUNvbGxhcHNlIEFsbAorQ29uZmlndXJhdGlvblZpZXdfcmV2ZXJ0TGFiZWw9UmV2ZXJ0Li4uCitDb25maWd1cmF0aW9uVmlld19pbnN0YWxsSGlzdG9yeSA9SW5zdGFsbGF0aW9uIEhpc3RvcnkKK0NvbmZpZ3VyYXRpb25WaWV3X2V4dExvY2F0aW9uPUV4dGVuc2lvbiBMb2NhdGlvbi4uLgorQ29uZmlndXJhdGlvblZpZXdfdW5pbnN0YWxsPVVuaW5zdGFsbAorQ29uZmlndXJhdGlvblZpZXdfdW5jb25maWd1cmVBbmRVbmluc3RhbGw9VW5pbnN0YWxsCitDb25maWd1cmF0aW9uVmlld19pbnN0YWxsPUluc3RhbGwKK0NvbmZpZ3VyYXRpb25WaWV3X2Fub3RoZXJWZXJzaW9uPSZBbm90aGVyIFZlcnNpb24uLi4KK0NvbmZpZ3VyYXRpb25WaWV3X2ZpbmRVcGRhdGVzPUZpbmQgVXBkYXRlcy4uLgorQ29uZmlndXJhdGlvblZpZXdfc2hvd05lc3RlZEZlYXR1cmVzPVNob3cgTmVzdGVkIEZlYXR1cmVzCitDb25maWd1cmF0aW9uVmlld19zaG93TmVzdGVkVG9vbHRpcD1TaG93IE5lc3RlZCBGZWF0dXJlcworQ29uZmlndXJhdGlvblZpZXdfc2hvd0luc3RhbGw9U2hvdyBJbnN0YWxsIExvY2F0aW9ucworQ29uZmlndXJhdGlvblZpZXdfc2hvd0luc3RhbGxUb29sdGlwPVNob3cgSW5zdGFsbCBMb2NhdGlvbnMKK0NvbmZpZ3VyYXRpb25WaWV3X3Nob3dEaXNhYmxlZD1TaG93IERpc2FibGVkIEZlYXR1cmVzCitDb25maWd1cmF0aW9uVmlld19zaG93RGlzYWJsZWRUb29sdGlwPVNob3cgRGlzYWJsZWQgRmVhdHVyZXMKK0NvbmZpZ3VyYXRpb25WaWV3X3Nob3dBY3Rpdml0aWVzTGFiZWwgPSBTaG93IEFjdGl2aXRpZXMKKworQ29uZmlndXJhdGlvblZpZXdfbmV3PUFkZAorQ29uZmlndXJhdGlvblZpZXdfcmVwbGFjZVdpdGg9UmVwbGFjZSB3aXRoCitDb25maWd1cmF0aW9uVmlld19yZXZlcnRQcmV2aW91c0xhYmVsPVJldmVydCB0byBQcmV2aW91cworQ29uZmlndXJhdGlvblZpZXdfcmV2ZXJ0UHJldmlvdXNEZXNjPVlvdSBjYW4gcmV2ZXJ0IHRvIG9uZSBvZiB0aGUgcHJldmlvdXMgY29uZmlndXJhdGlvbnMgaWYgeW91IGFyZSBoYXZpbmcgcHJvYmxlbXMgd2l0aCB0aGUgY3VycmVudCBvbmUuCitDb25maWd1cmF0aW9uVmlld191cGRhdGVMYWJlbD1TY2FuIGZvciBVcGRhdGVzCitDb25maWd1cmF0aW9uVmlld191cGRhdGVEZXNjPVNlYXJjaCBmb3IgdXBkYXRlcyBmb3IgYWxsIHRoZSBpbnN0YWxsZWQgZmVhdHVyZXMuCitDb25maWd1cmF0aW9uVmlld19pbnN0YWxsSGlzdExhYmVsPVZpZXcgSW5zdGFsbGF0aW9uIEhpc3RvcnkKK0NvbmZpZ3VyYXRpb25WaWV3X2luc3RhbGxIaXN0RGVzYz1WaWV3IGFsbCBhY3Rpdml0aWVzIHNpbmNlIHRoZSBpbnN0YWxsYXRpb24gb2YgdGhlIHByb2R1Y3QuCitDb25maWd1cmF0aW9uVmlld19hY3Rpdml0aWVzTGFiZWw9U2hvdyBBY3Rpdml0aWVzCitDb25maWd1cmF0aW9uVmlld19hY3Rpdml0aWVzRGVzYz1WaWV3IHRoZSBhY3Rpdml0aWVzIHRoYXQgY2F1c2VkIHRoZSBjcmVhdGlvbiBvZiB0aGlzIGNvbmZpZ3VyYXRpb24uCitDb25maWd1cmF0aW9uVmlld19lbmFibGVMb2NEZXNjPVlvdSBjYW4gZW5hYmxlIG9yIGRpc2FibGUgYW4gZW50aXJlIGluc3RhbGwgbG9jYXRpb24uIERpc2FibGluZyBhIGxvY2F0aW9uIGlzIGVxdWl2YWxlbnQgdG8gZGlzYWJsaW5nIGV2ZXJ5IGZlYXR1cmUgaW4gaXQuCitDb25maWd1cmF0aW9uVmlld19leHRMb2NMYWJlbD1BZGQgYW4gRXh0ZW5zaW9uIExvY2F0aW9uCitDb25maWd1cmF0aW9uVmlld19leHRMb2NEZXNjPUxvY2F0ZSBhbmQgYWRkIGFuIGV4dGVuc2lvbiBsb2NhdGlvbiB0byB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLiBBbiBleHRlbnNpb24gbG9jYXRpb24gY29udGFpbnMgZmVhdHVyZXMgYW5kIHBsdWdpbnMgcHJldmlvdXNseSBpbnN0YWxsZWQuCitDb25maWd1cmF0aW9uVmlld19wcm9wZXJ0aWVzTGFiZWw9U2hvdyBQcm9wZXJ0aWVzCitDb25maWd1cmF0aW9uVmlld19pbnN0YWxsUHJvcERlc2M9VmlldyB0aGUgcHJvcGVydGllcyBvZiB0aGUgaW5zdGFsbCBsb2NhdGlvbi4KK0NvbmZpZ3VyYXRpb25WaWV3X3JlcGxhY2VWZXJzaW9uTGFiZWw9UmVwbGFjZSBXaXRoIEFub3RoZXIgVmVyc2lvbgorQ29uZmlndXJhdGlvblZpZXdfcmVwbGFjZVZlcnNpb25EZXNjPURpc2FibGVzIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlIGZlYXR1cmUgYW5kIHJlcGxhY2VzIGl0IHdpdGggYW5vdGhlciB2ZXJzaW9uIGZyb20gdGhlIGxpc3Qgb2YgdGhlIGN1cnJlbnRseSBkaXNhYmxlZCBmZWF0dXJlcy4KK0NvbmZpZ3VyYXRpb25WaWV3X2VuYWJsZUZlYXR1cmVEZXNjPVlvdSBjYW4gZW5hYmxlIG9yIGRpc2FibGUgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYSBmZWF0dXJlLiBUaGUgZmVhdHVyZSBpcyBub3QgcmVtb3ZlZCBieSB0aGlzIGFjdGlvbi4KK0NvbmZpZ3VyYXRpb25WaWV3X2luc3RhbGxPcHRpb25hbExhYmVsPUluc3RhbGwgZnJvbSBPcmlnaW5hdGluZyBTZXJ2ZXIKK0NvbmZpZ3VyYXRpb25WaWV3X2luc3RhbGxPcHRpb25hbERlc2M9VGhpcyBvcHRpb25hbCBmZWF0dXJlIHdhcyBub3Qgb3JpZ2luYWxseSBpbnN0YWxsZWQuIFlvdSBjYW4gaW5zdGFsbCBpdCBub3cgYnkgY29ubmVjdGluZyB0byB0aGUgb3JpZ2luYXRpbmcgc2VydmVyIG9mIHRoZSBwYXJlbnQuCitDb25maWd1cmF0aW9uVmlld191bmluc3RhbGxMYWJlbD1Vbmluc3RhbGwKK0NvbmZpZ3VyYXRpb25WaWV3X3VuaW5zdGFsbERlc2M9VGhpcyBmZWF0dXJlIGlzIGN1cnJlbnRseSBub3QgdXNlZCBhbmQgY2FuIGJlIHVuaW5zdGFsbGVkIGZyb20gdGhlIHByb2R1Y3QuCitDb25maWd1cmF0aW9uVmlld191bmluc3RhbGxEZXNjMj1Vbmluc3RhbGwgdGhlIGZlYXR1cmUgZnJvbSB0aGUgcHJvZHVjdC4gVGhpcyB3aWxsIGRpc2FibGUgdGhlIGZlYXR1cmUgZnJvbSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uIGFuZCByZW1vdmUgaXQgZnJvbSB0aGUgZGlzay4KK0NvbmZpZ3VyYXRpb25WaWV3X3NjYW5MYWJlbD1TY2FuIGZvciBVcGRhdGVzCitDb25maWd1cmF0aW9uVmlld19zY2FuRGVzYz1TZWFyY2ggZm9yIHVwZGF0ZXMgZm9yIHRoaXMgZmVhdHVyZS4KK0NvbmZpZ3VyYXRpb25WaWV3X2ZlYXR1cmVQcm9wTGFiZWw9U2hvdyBQcm9wZXJ0aWVzCitDb25maWd1cmF0aW9uVmlld19mZWF0dXJlUHJvcERlc2M9VmlldyBwcm9wZXJ0aWVzIG9mIHRoZSBmZWF0dXJlIHN1Y2ggYXMgdmVyc2lvbiwgcHJvdmlkZXIgbmFtZSwgbGljZW5zZSBhZ3JlZW1lbnQgZXRjLgorQ29uZmlndXJhdGlvblZpZXdfbG9hZGluZyA9IExvYWRpbmcuLi4KKworQWN0aW9uc19icm9rZW5Db25maWdRdWVzdGlvbj1UaGUgY3VycmVudCBjb25maWd1cmF0aW9uIGNvbnRhaW5zIGVycm9ycyBhbmQgdGhpcyBvcGVyYXRpb24gY2FuIGhhdmUgdW5wcmVkaWN0YWJsZSByZXN1bHRzLiBEbyB5b3Ugd2FudCB0byBjb250aW51ZSA/CisKK0ZlYXR1cmVTdGF0ZUFjdGlvbl9kaXNhYmxlPURpc2FibGUKK0ZlYXR1cmVTdGF0ZUFjdGlvbl9lbmFibGU9RW5hYmxlCitGZWF0dXJlU3RhdGVBY3Rpb25fZGlzYWJsZVF1ZXN0aW9uPURvIHlvdSB3YW50IHRvIGRpc2FibGUgdGhpcyBmZWF0dXJlPworRmVhdHVyZVN0YXRlQWN0aW9uX0VuYWJsZVF1ZXN0aW9uPURvIHlvdSB3YW50IHRvIGVuYWJsZSB0aGlzIGZlYXR1cmU/CitGZWF0dXJlU3RhdGVBY3Rpb25fZGlhbG9nVGl0bGU9Q3VycmVudCBDb25maWd1cmF0aW9uCisKK0ZlYXR1cmVVbmluc3RhbGxBY3Rpb25fdW5pbnN0YWxsPVVuaW5zdGFsbAorRmVhdHVyZVVuaW5zdGFsbEFjdGlvbl91bmluc3RhbGxRdWVzdGlvbj1EbyB5b3Ugd2FudCB0byB1bmluc3RhbGwgdGhpcyBmZWF0dXJlPworRmVhdHVyZVVuaW5zdGFsbEFjdGlvbl9kaWFsb2dUaXRsZT1DdXJyZW50IENvbmZpZ3VyYXRpb24KKworRmVhdHVyZVVuY29uZmlndXJlQW5kVW5pbnN0YWxsQWN0aW9uX3VuaW5zdGFsbD1Vbmluc3RhbGwKK0ZlYXR1cmVVbmNvbmZpZ3VyZUFuZFVuaW5zdGFsbEFjdGlvbl9xdWVzdGlvbj1EbyB5b3Ugd2FudCB0byBkaXNhYmxlIGFuZCB1bmluc3RhbGwgdGhpcyBmZWF0dXJlPworRmVhdHVyZVVuY29uZmlndXJlQW5kVW5pbnN0YWxsQWN0aW9uX2RpYWxvZ1RpdGxlPVVuaW5zdGFsbAorCitTaXRlU3RhdGVBY3Rpb25fZGlhbG9nVGl0bGU9Q3VycmVudCBDb25maWd1cmF0aW9uCitTaXRlU3RhdGVBY3Rpb25fZGlzYWJsZUxhYmVsPURpc2FibGUKK1NpdGVTdGF0ZUFjdGlvbl9kaXNhYmxlTWVzc2FnZT1EbyB5b3Ugd2FudCB0byBkaXNhYmxlIGFsbCB0aGUgZmVhdHVyZXMgaW4gInswfSI/CitTaXRlU3RhdGVBY3Rpb25fZW5hYmxlTGFiZWw9RW5hYmxlCitTaXRlU3RhdGVBY3Rpb25fZW5hYmxlTWVzc2FnZT1EbyB5b3Ugd2FudCB0byBlbmFibGUgZmVhdHVyZXMgaW4gInswfSI/CisKK0ZpbmRVcGRhdGVzQWN0aW9uX3RyYWNrZWRQcm9ncmVzcz17MH0gezF9OiAoezJ9JSkKK0ZpbmRVcGRhdGVzQWN0aW9uX2FsbEZlYXR1cmVzU2VhcmNoPUFsbCBGZWF0dXJlcworCitJbnN0YWxsYXRpb25IaXN0b3J5QWN0aW9uX3RpdGxlPUluc3RhbGxhdGlvbiBIaXN0b3J5CitJbnN0YWxsYXRpb25IaXN0b3J5QWN0aW9uX2Rlc2M9VGhlIGxpc3QgYmVsb3cgcmVwcmVzZW50cyB0aGUgaGlzdG9yeSBvZiB5b3VyIHVwZGF0ZSBhY3Rpdml0aWVzIGZyb20gdGhlIHByb2R1Y3QgaW5zdGFsbGF0aW9uIHRvIGRhdGUuIEVhY2ggb3BlcmF0aW9uIGNhcnJpZXMgYSBkYXRlIGl0IGNvbW1lbmNlZCwgYXMgd2VsbCBhcyBhY3Rpdml0aWVzIHBlcmZvcm1lZC4gT3BlcmF0aW9ucyBhcmUgc29ydGVkIGJ5IGRhdGUgaW4gYXNjZW5kaW5nIG9yZGVyLgorSW5zdGFsbGF0aW9uSGlzdG9yeUFjdGlvbl9kYXRlVGltZT1EYXRlIC8gVGltZQorSW5zdGFsbGF0aW9uSGlzdG9yeUFjdGlvbl90YXJnZXQ9VGFyZ2V0CitJbnN0YWxsYXRpb25IaXN0b3J5QWN0aW9uX2FjdGlvbj1BY3Rpb24KK0luc3RhbGxhdGlvbkhpc3RvcnlBY3Rpb25fc3RhdHVzPVN0YXR1cworSW5zdGFsbGF0aW9uSGlzdG9yeUFjdGlvbl9lcnJvcnM9RXJyb3JzIHdoaWxlIGNyZWF0aW5nIGluc3RhbGxhdGlvbiBoaXN0b3J5IGZpbGUuCisKK05ld0V4dGVuc2lvbkxvY2F0aW9uQWN0aW9uX3NlbGVjdEV4dExvY2F0aW9uPVNlbGVjdCBhbiBleHRlbnNpb24gbG9jYXRpb24uIEFuIGV4dGVuc2lvbiBsb2NhdGlvbiBpcyBhIGRpcmVjdG9yeSBuYW1lZCBlY2xpcHNlLCB3aGljaCBjb250YWlucyB0aGUgLmVjbGlwc2VleHRlbnNpb24gbWFya2VyIGZpbGUsIGFzIHdlbGwgYXMgdGhlIGZlYXR1cmVzIGFuZCBwbHVnaW5zIGZvbGRlcnMuCitOZXdFeHRlbnNpb25Mb2NhdGlvbkFjdGlvbl9leHRJbmZvVGl0bGU9SW52YWxpZCBFeHRlbnNpb24KK05ld0V4dGVuc2lvbkxvY2F0aW9uQWN0aW9uX2V4dEluZm9NZXNzYWdlPVNlbGVjdGVkIGxvY2F0aW9uIGRvZXMgbm90IGNvbnRhaW4gYSBwcm9kdWN0IGV4dGVuc2lvbi4gQW4gZXh0ZW5zaW9uIHNob3VsZCBjb25zaXN0IG9mIGEgZGlyZWN0b3J5IG5hbWVkIGVjbGlwc2UsIHdoaWNoIGNvbnRhaW5zIGEgbWFya2VyIGZpbGUgY2FsbGVkIC5lY2xpcHNlZXh0ZW5zaW9uIGFuZCB0aGUgZmVhdHVyZXMgYW5kIHBsdWdpbnMgZm9sZGVycy4gIFBsZWFzZSBzZWxlY3QgYW5vdGhlciBsb2NhdGlvbi4KKworQWN0aXZpdGllc1RhYmxlVmlld2VyX2VuYWJsZWQ9RW5hYmxlZAorQWN0aXZpdGllc1RhYmxlVmlld2VyX2ZlYXR1cmVJbnN0YWxsZWQ9RmVhdHVyZSBJbnN0YWxsZWQKK0FjdGl2aXRpZXNUYWJsZVZpZXdlcl9mZWF0dXJlUmVtb3ZlZD1GZWF0dXJlIFJlbW92ZWQKK0FjdGl2aXRpZXNUYWJsZVZpZXdlcl9zaXRlSW5zdGFsbGVkPVNpdGUgSW5zdGFsbGVkCitBY3Rpdml0aWVzVGFibGVWaWV3ZXJfc2l0ZVJlbW92ZWQ9U2l0ZSBSZW1vdmVkCitBY3Rpdml0aWVzVGFibGVWaWV3ZXJfZGlzYWJsZWQ9RGlzYWJsZWQKK0FjdGl2aXRpZXNUYWJsZVZpZXdlcl9yZXZlcnQ9UmV2ZXJ0CitBY3Rpdml0aWVzVGFibGVWaWV3ZXJfcmVjb25jaWxlPVJlY29uY2lsZQorQWN0aXZpdGllc1RhYmxlVmlld2VyX3Vua25vd249dW5rbm93bgorQWN0aXZpdGllc1RhYmxlVmlld2VyX2RhdGU9RGF0ZQorQWN0aXZpdGllc1RhYmxlVmlld2VyX3RhcmdldD1UYXJnZXQKK0FjdGl2aXRpZXNUYWJsZVZpZXdlcl9hY3Rpb249QWN0aW9uCisKKworRHVwbGljYXRlQ29uZmxpY3RzRGlhbG9nX3RpdGxlID0gRHVwbGljYXRlIENvbmZsaWN0cworRHVwbGljYXRlQ29uZmxpY3RzRGlhbG9nX21lc3NhZ2UgPSBJZiB5b3UgY29udGludWUgd2l0aCB0aGUgdXBkYXRlL2luc3RhbGwsIFwKK3RoZSByZXN1bHRpbmcgY29uZmlndXJhdGlvbiB3aWxsIGNvbnRhaW4gZHVwbGljYXRpb24gY29uZmxpY3RzIFwKK3RoYXQgbWF5IGNhdXNlIHBhcnRzIG9mIHRoZSBwcm9kdWN0IHRvIGJlIHVudXNhYmxlLiBEbyB5b3Ugd2FudCB0byBcCitjb250aW51ZT8KK0R1cGxpY2F0ZUNvbmZsaWN0c0RpYWxvZ190cmVlTGFiZWwgPSAmRGV0ZWN0ZWQgY29uZmxpY3RzOgorCisKK01vZGVTZWxlY3Rpb25QYWdlX3RpdGxlPUZlYXR1cmUgVXBkYXRlcworTW9kZVNlbGVjdGlvblBhZ2VfZGVzYz1DaG9vc2UgdGhlIHdheSB5b3Ugd2FudCB0byBzZWFyY2ggZm9yIGZlYXR1cmVzIHRvIGluc3RhbGwKK01vZGVTZWxlY3Rpb25QYWdlX3VwZGF0ZXM9U2VhcmNoIGZvciAmdXBkYXRlcyBvZiB0aGUgY3VycmVudGx5IGluc3RhbGxlZCBmZWF0dXJlcworTW9kZVNlbGVjdGlvblBhZ2VfdXBkYXRlc1RleHQ9U2VsZWN0IHRoaXMgb3B0aW9uIGlmIHlvdSB3YW50IHRvIHNlYXJjaCBmb3IgdXBkYXRlcyBvZiB0aGUgZmVhdHVyZXMgeW91IGFscmVhZHkgaGF2ZSBpbnN0YWxsZWQuCitNb2RlU2VsZWN0aW9uUGFnZV9uZXdGZWF0dXJlcz0mU2VhcmNoIGZvciBuZXcgZmVhdHVyZXMgdG8gaW5zdGFsbAorTW9kZVNlbGVjdGlvblBhZ2VfbmV3RmVhdHVyZXNUZXh0PVNlbGVjdCB0aGlzIG9wdGlvbiBpZiB5b3Ugd2FudCB0byBpbnN0YWxsIG5ldyBmZWF0dXJlcyBmcm9tIGV4aXN0aW5nIG9yIG5ldyB1cGRhdGUgc2l0ZXMuIFwKK1NvbWUgc2l0ZXMgbWF5IGFscmVhZHkgYmUgYXZhaWxhYmxlLiBZb3UgY2FuIGFkZCBuZXcgdXBkYXRlIHNpdGUgVVJMcyB0byB0aGUgc2VhcmNoLgorCitNb3JlSW5mb0dlbmVyYXRvcl9tb3JlSW5mbz1Nb3JlIGluZm8uLi4KKworTmV3VXBkYXRlU2l0ZURpYWxvZ19uYW1lPU5hbWU6CitOZXdVcGRhdGVTaXRlRGlhbG9nX3VybD1VUkw6CitOZXdVcGRhdGVTaXRlRGlhbG9nX2Vycm9yX25hbWVPclVybE5vdFNwZWNpZmllZD1Cb3RoIG5hbWUgYW5kIHVybCBoYXZlIHRvIGJlIHNwZWNpZmllZAorTmV3VXBkYXRlU2l0ZURpYWxvZ19lcnJvcl9kdXBsaWNhdGVOYW1lPVRoaXMgbmFtZSBpcyBhbHJlYWR5IGluIHVzZQorTmV3VXBkYXRlU2l0ZURpYWxvZ19lcnJvcl9kdXBsaWNhdGVVcmw9VGhpcyBVUkwgaXMgYWxyZWFkeSBkZWZpbmVkIHVuZGVyIG5hbWUgezB9CitOZXdVcGRhdGVTaXRlRGlhbG9nX2Vycm9yX2luY29ycmVjdFVybD1VUkwgaXMgbm90IGNvcnJlY3QKKworSW5zdGFsbFdpemFyZF9pc1J1bm5pbmdUaXRsZT1JbnN0YWxsL1VwZGF0ZSBpbiBwcm9ncmVzcworSW5zdGFsbFdpemFyZF9pc1J1bm5pbmdJbmZvPUFub3RoZXIgaW5zdGFsbC91cGRhdGUgam9iIGlzIGluIHByb2dyZXNzLiBQbGVhc2UgY2FuY2VsIGl0IGFuZCB0aGVuIHJlLWxhdW5jaCB0aGlzIGFjdGlvbi4KK0luc3RhbGxXaXphcmRfam9iTmFtZT1VcGRhdGUgTWFuYWdlcgorSW5zdGFsbFdpemFyZF9kb3dubG9hZD1Eb3dubG9hZCBhbmQgaW5zdGFsbCBzZWxlY3RlZCBmZWF0dXJlcy4KK0luc3RhbGxXaXphcmRfZG93bmxvYWRpbmdGZWF0dXJlSmFyPURvd25sb2FkaW5nIGZlYXR1cmUgamFyIGZvciB7MH0KK0luc3RhbGxXaXphcmRfYW5vdGhlckpvYiA9IFRoZXJlIGlzIGFub3RoZXIgdXBkYXRlL2luc3RhbGwgdGFzayBydW5uaW5nIGluIHRoZSBiYWNrZ3JvdW5kLiBEbyB5b3Ugd2FudCB0byBraWxsIGl0IGFuZCBjb250aW51ZSB0aGUgY3VycmVudCB0YXNrcyBpbnN0ZWFkPworSW5zdGFsbFdpemFyZF9hbm90aGVySm9iVGl0bGU9SW5zdGFsbGVyIGlzIHJ1bm5pbmcKK0luc3RhbGxXaXphcmRfd3RpdGxlPUluc3RhbGwKK0luc3RhbGxXaXphcmRfT3B0aW9uYWxGZWF0dXJlc1BhZ2VfdGl0bGU9IE9wdGlvbmFsIEZlYXR1cmVzCitJbnN0YWxsV2l6YXJkX09wdGlvbmFsRmVhdHVyZXNQYWdlX2Rlc2MgPSBTb21lIG9mIHRoZSBmZWF0dXJlcyB0aGF0IGFyZSBpbmNsdWRlZCBpbiB0aGlzIGZlYXR1cmUgYXJlIG9wdGlvbmFsLgorSW5zdGFsbFdpemFyZF9PcHRpb25hbEZlYXR1cmVzUGFnZV90cmVlTGFiZWwgPSAmQXZhaWxhYmxlIG9wdGlvbmFsIGZlYXR1cmVzOgorSW5zdGFsbFdpemFyZF9PcHRpb25hbEZlYXR1cmVzUGFnZV9zZWxlY3RBbGwgPSAmU2VsZWN0IEFsbAorSW5zdGFsbFdpemFyZF9PcHRpb25hbEZlYXR1cmVzUGFnZV9kZXNlbGVjdEFsbCA9ICZEZXNlbGVjdCBBbGwKKworSW5zdGFsbFdpemFyZF9SZXZpZXdQYWdlX2NvdW50ZXIgPSB7MH0gb2YgezF9IHNlbGVjdGVkLgorSW5zdGFsbFdpemFyZF9SZXZpZXdQYWdlX3RpdGxlPVNlYXJjaCBSZXN1bHRzCitJbnN0YWxsV2l6YXJkX1Jldmlld1BhZ2VfZGVzYz1TZWxlY3QgZmVhdHVyZXMgdG8gaW5zdGFsbCBmcm9tIHRoZSBzZWFyY2ggcmVzdWx0IGxpc3QuCitJbnN0YWxsV2l6YXJkX1Jldmlld1BhZ2VfemVyb1VwZGF0ZXM9Tm8gdXBkYXRlcyBmb3IgdGhlIGN1cnJlbnRseSBpbnN0YWxsZWQgZmVhdHVyZShzKSBmb3VuZCwgdHJ5IGFnYWluIGxhdGVyLgorSW5zdGFsbFdpemFyZF9SZXZpZXdQYWdlX3plcm9GZWF0dXJlcz1ObyBmZWF0dXJlcyBmb3VuZCBvbiB0aGUgc2VsZWN0ZWQgc2l0ZShzKS4gQ2hvb3NlIGEgZGlmZmVyZW50IHNpdGUgb3Igc2l0ZSBjYXRlZ29yeS4KK0luc3RhbGxXaXphcmRfUmV2aWV3UGFnZV9sYWJlbD1TZWxlY3QgdGhlIGZlYXR1cmVzIHRvICZpbnN0YWxsOgorSW5zdGFsbFdpemFyZF9SZXZpZXdQYWdlX2Rlc2VsZWN0QWxsPSZEZXNlbGVjdCBBbGwKK0luc3RhbGxXaXphcmRfUmV2aWV3UGFnZV9tb3JlSW5mbz0mTW9yZSBJbmZvCitJbnN0YWxsV2l6YXJkX1Jldmlld1BhZ2VfcHJvcGVydGllcz0mUHJvcGVydGllcworSW5zdGFsbFdpemFyZF9SZXZpZXdQYWdlX3NlbGVjdFJlcXVpcmVkPSZTZWxlY3QgUmVxdWlyZWQKK0luc3RhbGxXaXphcmRfUmV2aWV3UGFnZV9zaG93U3RhdHVzPSZFcnJvciBEZXRhaWxzLi4uCitJbnN0YWxsV2l6YXJkX1Jldmlld1BhZ2VfZmlsdGVyRmVhdHVyZXM9XCBGaWwmdGVyIGZlYXR1cmVzIGluY2x1ZGVkIGluIG90aGVyIGZlYXR1cmVzIG9uIHRoZSBsaXN0CitJbnN0YWxsV2l6YXJkX1Jldmlld1BhZ2VfZmlsdGVyUGF0Y2hlcz1cIEZpbCZ0ZXIgcGF0Y2hlcyBpbmNsdWRlZCBpbiBvdGhlciBwYXRjaGVzIG9uIHRoZSBsaXN0CitJbnN0YWxsV2l6YXJkX1Jldmlld1BhZ2VfZmlsdGVyT2xkZXJGZWF0dXJlcz1cIFNob3cgdGhlIGxhdGVzdCAmdmVyc2lvbiBvZiBhIGZlYXR1cmUgb25seQorSW5zdGFsbFdpemFyZF9SZXZpZXdQYWdlX2ludmFsaWRfbG9uZz1JbnZhbGlkIGNvbWJpbmF0aW9uIC0gc2VsZWN0IFwiU2hvdyBTdGF0dXMuLi5cIiBmb3IgZGV0YWlscy4KK0luc3RhbGxXaXphcmRfUmV2aWV3UGFnZV9pbnZhbGlkX3Nob3J0PUludmFsaWQgY29tYmluYXRpb24KK0luc3RhbGxXaXphcmRfUmV2aWV3UGFnZV9jeWNsZT1DeWNsZSBzdGFydGluZyBhdCB7MH0KKworSW5zdGFsbFdpemFyZF9MaWNlbnNlUGFnZV9hY2NlcHQgPSBJICZhY2NlcHQgdGhlIHRlcm1zIGluIHRoZSBsaWNlbnNlIGFncmVlbWVudAorSW5zdGFsbFdpemFyZF9MaWNlbnNlUGFnZV9hY2NlcHQyID0gSSAmYWNjZXB0IHRoZSB0ZXJtcyBpbiB0aGUgbGljZW5zZSBhZ3JlZW1lbnRzCitJbnN0YWxsV2l6YXJkX0xpY2Vuc2VQYWdlX2RlY2xpbmUgPSBJICZkbyBub3QgYWNjZXB0IHRoZSB0ZXJtcyBpbiB0aGUgbGljZW5zZSBhZ3JlZW1lbnQKK0luc3RhbGxXaXphcmRfTGljZW5zZVBhZ2VfZGVjbGluZTIgPSBJICZkbyBub3QgYWNjZXB0IHRoZSB0ZXJtcyBpbiB0aGUgbGljZW5zZSBhZ3JlZW1lbnRzCitJbnN0YWxsV2l6YXJkX0xpY2Vuc2VQYWdlX2Rlc2MgPSBUaGlzIGZlYXR1cmUgaGFzIGEgbGljZW5zZSBcCithZ3JlZW1lbnQgdGhhdCB5b3UgbmVlZCB0byBhY2NlcHQgYmVmb3JlIHByb2NlZWRpbmcgd2l0aCBcCit0aGUgaW5zdGFsbGF0aW9uLgorSW5zdGFsbFdpemFyZF9MaWNlbnNlUGFnZV9kZXNjMiA9IFNvbWUgb2YgdGhlIGZlYXR1cmVzIGhhdmUgbGljZW5zZSBcCithZ3JlZW1lbnRzIHRoYXQgeW91IG5lZWQgdG8gYWNjZXB0IGJlZm9yZSBwcm9jZWVkaW5nIHdpdGggXAordGhlIGluc3RhbGxhdGlvbi4KK0luc3RhbGxXaXphcmRfTGljZW5zZVBhZ2VfdGl0bGUgPSBGZWF0dXJlIExpY2Vuc2UKKworSW5zdGFsbFdpemFyZF9UYXJnZXRQYWdlX3RpdGxlID0gSW5zdGFsbGF0aW9uCitJbnN0YWxsV2l6YXJkX1RhcmdldFBhZ2VfZGVzYyA9IFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgd2lsbCBiZSBpbnN0YWxsZWQuIFlvdSBjYW4gc2VsZWN0IGEgZmVhdHVyZSBhbmQgY2hhbmdlIHRoZSBsb2NhdGlvbiB3aGVyZSB0aGUgZmVhdHVyZSB3aWxsIGJlIGluc3RhbGxlZC4KK0luc3RhbGxXaXphcmRfVGFyZ2V0UGFnZV9qb2JzTGFiZWwgPSBGZWF0dXJlcyB0byAmaW5zdGFsbDoKK0luc3RhbGxXaXphcmRfVGFyZ2V0UGFnZV9zaXRlTGFiZWwgPSBBJnZhaWxhYmxlIGluc3RhbGxhdGlvbiBsb2NhdGlvbnM6CitJbnN0YWxsV2l6YXJkX1RhcmdldFBhZ2VfbmV3ID0gJkFkZCBMb2NhdGlvbi4uLgorSW5zdGFsbFdpemFyZF9UYXJnZXRQYWdlX2RlbGV0ZSA9ICZSZW1vdmUgTG9jYXRpb24KK0luc3RhbGxXaXphcmRfVGFyZ2V0UGFnZV9yZXF1aXJlZFNwYWNlID0gUmVxdWlyZWQgc3BhY2U6CitJbnN0YWxsV2l6YXJkX1RhcmdldFBhZ2VfYXZhaWxhYmxlU3BhY2UgPSBGcmVlIHNwYWNlOgorSW5zdGFsbFdpemFyZF9UYXJnZXRQYWdlX2xvY2F0aW9uID0gSW5zdGFsbCBMb2NhdGlvbjoKK0luc3RhbGxXaXphcmRfVGFyZ2V0UGFnZV9sb2NhdGlvbl9jaGFuZ2UgPSBDaGFuZ2UgTG9jYXRpb24gLi4uCitJbnN0YWxsV2l6YXJkX1RhcmdldFBhZ2VfbG9jYXRpb25fbWVzc2FnZSA9IFNlbGVjdCBhIG5ldyBpbnN0YWxsIGxvY2F0aW9uCitJbnN0YWxsV2l6YXJkX1RhcmdldFBhZ2VfbG9jYXRpb25fZW1wdHkgPSBUYXJnZXQgaW5zdGFsbCBsb2NhdGlvbiBtdXN0IGJlIHNlbGVjdGVkLiBJZiBub25lIGlzIGF2YWlsYWJsZSwgY3JlYXRlIGEgbmV3IG9uZS4KK0luc3RhbGxXaXphcmRfVGFyZ2V0UGFnZV9sb2NhdGlvbl9lcnJvcl90aXRsZSA9IEludmFsaWQgTG9jYXRpb24KK0luc3RhbGxXaXphcmRfVGFyZ2V0UGFnZV9zaXplX0tCID0gezB9IEtCCitJbnN0YWxsV2l6YXJkX1RhcmdldFBhZ2Vfc2l6ZV9NQiA9IHswfSBNQgorSW5zdGFsbFdpemFyZF9UYXJnZXRQYWdlX3NpemVfR0IgPSB7MH0gR0IKK0luc3RhbGxXaXphcmRfVGFyZ2V0UGFnZV91bmtub3duU2l6ZSA9IFVua25vd24KK0luc3RhbGxXaXphcmRfVGFyZ2V0UGFnZV9wYXRjaEVycm9yID0gUGF0Y2ggInswfSIgbXVzdCBiZSBpbnN0YWxsZWQgaW4gdGhlIHNhbWUgbG9jYXRpb24gYXMgInsxfSIKK0luc3RhbGxXaXphcmRfVGFyZ2V0UGFnZV9wYXRjaEVycm9yMiA9IFBhdGNoICJ7MH0iIG11c3QgYmUgaW5zdGFsbGVkIGluIHRoZSBzYW1lIGxvY2F0aW9uIGFzICJ7MX0iIDogezJ9CitJbnN0YWxsV2l6YXJkMl91cGRhdGVPcGVyYXRpb25IYXNGYWlsZWQ9IFVwZGF0ZSBvcGVyYXRpb24gaGFzIGZhaWxlZAorCitSZXZlcnRDb25maWd1cmF0aW9uV2l6YXJkX3d0aXRsZT1SZXZlcnQgdG8gYSBQcmV2aW91cyBDb25maWd1cmF0aW9uCitSZXZlcnRDb25maWd1cmF0aW9uV2l6YXJkUGFnZV90aXRsZT1SZXZlcnQgdG8gYSBQcmV2aW91cyBDb25maWd1cmF0aW9uCitSZXZlcnRDb25maWd1cmF0aW9uV2l6YXJkUGFnZV9kZXNjPUNob29zZSBhIHN0YWJsZSBjb25maWd1cmF0aW9uIHRvIHdoaWNoIHlvdSB3b3VsZCBsaWtlIHRvIHJldmVydAorUmV2ZXJ0Q29uZmlndXJhdGlvbldpemFyZFBhZ2VfbGFiZWw9JlBhc3QgY29uZmlndXJhdGlvbnM6CitSZXZlcnRDb25maWd1cmF0aW9uV2l6YXJkUGFnZV9hY3Rpdml0aWVzPSZBY3Rpdml0aWVzIHRoYXQgY2F1c2VkIHRoZSBjcmVhdGlvbiBvZiB0aGlzIGNvbmZpZ3VyYXRpb246CitSZXZlcnRDb25maWd1cmF0aW9uV2l6YXJkUGFnZV9xdWVzdGlvbj1UaGlzIG9wZXJhdGlvbiByZXF1aXJlcyByZXN0YXJ0aW5nIHRoZSB3b3JrYmVuY2guICBXb3VsZCB5b3UgbGlrZSB0byBwcm9jZWVkPworCitSZXZlcnRfUHJvYmxlbURpYWxvZ190aXRsZSA9IFJlc3RvcmUgUHJvYmxlbXMKKworU2hvd0FjdGl2aXRpZXNEaWFsb2dfdGl0bGUgPSBDdXJyZW50IENvbmZpZ3VyYXRpb24KK1Nob3dBY3Rpdml0aWVzRGlhbG9nX2RhdGUgPSBEYXRlOgorU2hvd0FjdGl2aXRpZXNEaWFsb2dfbG9jID0gTG9jYXRpb246CitTaG93QWN0aXZpdGllc0RpYWxvZ19sYWJlbCA9IEFjdGl2aXRpZXMgdGhhdCBjYXVzZWQgdGhlIGNyZWF0aW9uIG9mIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb246CisKK1NpdGVQYWdlX3RpdGxlPVVwZGF0ZSBzaXRlcyB0byB2aXNpdAorU2l0ZVBhZ2VfZGVzYz1TZWxlY3QgdXBkYXRlIHNpdGVzIHRvIHZpc2l0IHdoaWxlIGxvb2tpbmcgZm9yIG5ldyBmZWF0dXJlcy4KK1NpdGVQYWdlX2xhYmVsPSZTaXRlcyB0byBpbmNsdWRlIGluIHNlYXJjaDoKK1NpdGVQYWdlX2FkZFVwZGF0ZVNpdGU9TmV3IFJlbW8mdGUgU2l0ZS4uLgorU2l0ZVBhZ2VfYWRkTG9jYWxTaXRlPU5ldyAmTG9jYWwgU2l0ZS4uLgorU2l0ZVBhZ2VfYWRkTG9jYWxaaXBwZWRTaXRlPU5ldyAmQXJjaGl2ZWQgU2l0ZS4uLgorU2l0ZVBhZ2VfZWRpdD0mRWRpdC4uLgorU2l0ZVBhZ2VfcmVtb3ZlPSZSZW1vdmUKK1NpdGVQYWdlX2ltcG9ydD1JJm1wb3J0IHNpdGVzLi4uCitTaXRlUGFnZV9leHBvcnQ9RSZ4cG9ydCBzaXRlcy4uLgorU2l0ZVBhZ2VfaWdub3JlPSZJZ25vcmUgZmVhdHVyZXMgbm90IGFwcGxpY2FibGUgdG8gdGhpcyBlbnZpcm9ubWVudAorU2l0ZVBhZ2VfYXV0b21hdGljYWxseVNlbGVjdE1pcnJvcnM9QXV0b21hdGljYWxseSBzZWxlY3QgJm1pcnJvcnMKK1NpdGVQYWdlX25ldz1OZXcgVXBkYXRlIFNpdGUKK1NpdGVQYWdlX2RpYWxvZ0VkaXRMb2NhbD1FZGl0IExvY2FsIFNpdGUKK1NpdGVQYWdlX2RpYWxvZ0VkaXRVcGRhdGVTaXRlPUVkaXQgUmVtb3RlIFNpdGUKK1NpdGVQYWdlX3JlbW92ZV9sb2NhdGlvbl9jb25mX3RpdGxlPVJlbW92ZSBMb2NhdGlvbgorU2l0ZVBhZ2VfcmVtb3ZlX2xvY2F0aW9uX2NvbmY9QXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIHJlbW92ZSB0aGlzIGxvY2F0aW9uPworCisKK0xvY2FsU2l0ZVNlbGVjdG9yX2RpYWxvZ01lc3NhZ2U9U2VsZWN0IGEgbG9jYWwgdXBkYXRlIHNpdGUuCitMb2NhbFNpdGVTZWxlY3Rvcl9kaXJJbmZvVGl0bGU9SW52YWxpZCBTaXRlCitMb2NhbFNpdGVTZWxlY3Rvcl9kaXJJbmZvTWVzc2FnZT1TZWxlY3RlZCBsb2NhdGlvbiBkb2VzIG5vdCBjb250YWluIGFuIHVwZGF0ZSBzaXRlLiAgUGxlYXNlIHNlbGVjdCBhbm90aGVyIGxvY2F0aW9uLgorTG9jYWxTaXRlU2VsZWN0b3JfZGlyRHVwbGljYXRlRGVmaW5pdGlvbj1TZWxlY3RlZCBsb2NhdGlvbiBpcyBhbHJlYWR5IGRlZmluZWQgdW5kZXIgYW5vdGhlciBuYW1lLiAgUGxlYXNlIHNlbGVjdCBhbm90aGVyIGxvY2F0aW9uLgorTG9jYWxTaXRlU2VsZWN0b3JfZGlhbG9nTWVzc2FnZXppcD1TZWxlY3QgTG9jYWwgU2l0ZSBBcmNoaXZlCitMb2NhbFNpdGVTZWxlY3Rvcl96aXBJbmZvVGl0bGU9SW52YWxpZCBTaXRlCitMb2NhbFNpdGVTZWxlY3Rvcl96aXBJbmZvTWVzc2FnZT1TZWxlY3RlZCBhcmNoaXZlIGRvZXMgbm90IGNvbnRhaW4gYW4gdXBkYXRlIHNpdGUuICBQbGVhc2Ugc2VsZWN0IGFub3RoZXIgYXJjaGl2ZS4KK0xvY2FsU2l0ZVNlbGVjdG9yX3ppcER1cGxpY2F0ZURlZmluaXRpb249U2VsZWN0ZWQgYXJjaGl2ZSBpcyBhbHJlYWR5IGRlZmluZWQgdW5kZXIgYW5vdGhlciBuYW1lLiAgUGxlYXNlIHNlbGVjdCBhbm90aGVyIGFyY2hpdmUuCitMb2NhbFNpdGVTZWxlY3Rvcl9kaWFsb2dNZXNzYWdlSW1wb3J0PUltcG9ydCBTaXRlcyBCb29rbWFya3MKK0xvY2FsU2l0ZVNlbGVjdG9yX2ltcG9ydEluZm9UaXRsZT1JbnZhbGlkIEJvb2ttYXJrcyBGaWxlCitMb2NhbFNpdGVTZWxlY3Rvcl9pbXBvcnRJbmZvTWVzc2FnZT1TZWxlY3RlZCBmaWxlIGRvZXMgbm90IGNvbnRhaW4gdXBkYXRlIHNpdGVzIGJvb2ttYXJrcy4gIFBsZWFzZSBzZWxlY3QgYW5vdGhlciBmaWxlLgorTG9jYWxTaXRlU2VsZWN0b3JfZGlhbG9nTWVzc2FnZUV4cG9ydD1FeHBvcnQgU2l0ZXMgQm9va21hcmtzCisKKworTWlzc2luZ0ZlYXR1cmVfaWQgPSB1bmtub3duCitNaXNzaW5nRmVhdHVyZV9wcm92aWRlciA9IE4vQQorTWlzc2luZ0ZlYXR1cmVfZGVzY191bmtub3duID0gVGhlIGZlYXR1cmUgd2FzIG5vdCBsb2FkZWQgZHVlIHRvIGVycm9ycy4gT3BlbiBmZWF0dXJlIHByb3BlcnRpZXMgZm9yIGRldGFpbHMuCitNaXNzaW5nRmVhdHVyZV9kZXNjX29wdGlvbmFsID0gVGhpcyBvcHRpb25hbCBmZWF0dXJlIGhhcyBub3QgYmVlbiBpbnN0YWxsZWQuCitTd2FwRmVhdHVyZVdpemFyZF90aXRsZT1SZXBsYWNlIFdpdGggQW5vdGhlciBWZXJzaW9uCitTd2FwRmVhdHVyZVdpemFyZFBhZ2VfdGl0bGU9UmVwbGFjZSBXaXRoIEFub3RoZXIgVmVyc2lvbgorU3dhcEZlYXR1cmVXaXphcmRQYWdlX2Rlc2M9RGlzYWJsZSB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSBmZWF0dXJlIGFuZCByZXBsYWNlIGl0IHdpdGggb25lIG9mIHRoZSB2ZXJzaW9ucyBmcm9tIHRoZSBsaXN0CitTd2FwRmVhdHVyZVdpemFyZFBhZ2VfbGFiZWw9JkF2YWlsYWJsZSBkaXNhYmxlZCB2ZXJzaW9uczoKKworTWlycm9yc0RpYWxvZ190ZXh0PVRoZSBjb250ZW50IG9mIHRoZSB1cGRhdGUgc2l0ZSAiezB9IiBpcyBhbHNvIGF2YWlsYWJsZSBvbiB0aGUgbWlycm9ycyBsaXN0ZWQgYmVsb3cuIFlvdSBtYXkgY2hvb3NlIHRvIHNlbGVjdCBhIG1pcnJvciBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IHVwZGF0ZSBzaXRlLgorTWlycm9yc0RpYWxvZ190aXRsZT1VcGRhdGUgU2l0ZSBNaXJyb3JzCisKK0F1dG9tYXRpY1VwZGF0ZXNKb2JfVXBkYXRlcz1VcGRhdGVzCitBdXRvbWF0aWNVcGRhdGVzSm9iX0VjbGlwc2VVcGRhdGVzMT1BdXRvbWF0aWMgVXBkYXRlcworQXV0b21hdGljVXBkYXRlc0pvYl9VcGRhdGVzQXZhaWxhYmxlPU5ldyB1cGRhdGVzIGFyZSBhdmFpbGFibGUuIERvIHlvdSB3YW50IHRvIHJldmlldyBhbmQgaW5zdGFsbCB0aGVtIG5vdz8KK0F1dG9tYXRpY1VwZGF0ZXNKb2JfRWNsaXBzZVVwZGF0ZXMyPUF1dG9tYXRpYyBVcGRhdGVzCitBdXRvbWF0aWNVcGRhdGVzSm9iX1VwZGF0ZXNEb3dubG9hZGVkPU5ldyB1cGRhdGVzIGFyZSBhdmFpbGFibGUgYW5kIGRvd25sb2FkZWQuIERvIHlvdSB3YW50IHRvIHJldmlldyBhbmQgaW5zdGFsbCB0aGVtIG5vdz8KKworRmVhdHVyZVBhZ2Vfb3B0aW9uYWxJbnN0YWxsX3RpdGxlID0gT3B0aW9uYWwgSW5zdGFsbAorUmV2aWV3UGFnZV92YWxpZGF0aW5nPVZhbGlkYXRpbmcgc2VsZWN0aW9uLi4uCitUYXJnZXRQYWdlX0ZlYXR1cmVOYW1lQ29sdW1uPUZlYXR1cmUgTmFtZQorVGFyZ2V0UGFnZV9GZWF0dXJlX1ZlcnNpb249RmVhdHVyZSBWZXJzaW9uCitUYXJnZXRQYWdlX0ZlYXR1cmVfU2l6ZT1GZWF0dXJlIFNpemUKK1RhcmdldFBhZ2VfSW5zdGFsbGF0aW9uRGlyZWN0b3J5Q29sdW1uPUluc3RhbGxhdGlvbiBEaXJlY3RvcnkKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9Cb29rbWFya0ZvbGRlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL0Jvb2ttYXJrRm9sZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY2NWY5ZQotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9Cb29rbWFya0ZvbGRlci5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitwdWJsaWMgY2xhc3MgQm9va21hcmtGb2xkZXIgZXh0ZW5kcyBOYW1lZE1vZGVsT2JqZWN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworICAgIHByb3RlY3RlZCBBcnJheUxpc3QgY2hpbGRyZW49IG5ldyBBcnJheUxpc3QoKTsKKwlwdWJsaWMgQm9va21hcmtGb2xkZXIoKSB7CisJfQorCQorCXB1YmxpYyBCb29rbWFya0ZvbGRlcihTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisJCisJcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnQpIHsKKwkJcmV0dXJuIGNoaWxkcmVuLnRvQXJyYXkoKTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oKSB7CisJCXJldHVybiBjaGlsZHJlbi5zaXplKCk+MDsKKwl9IAorCQorCXB1YmxpYyB2b2lkIGFkZENoaWxkKE5hbWVkTW9kZWxPYmplY3Qgb2JqZWN0KSB7CisJCWludGVybmFsQWRkKG9iamVjdCk7CisJCW5vdGlmeU9iamVjdHNBZGRlZCh0aGlzLCBuZXcgT2JqZWN0W10ge29iamVjdH0pOworCX0KKworCXB1YmxpYyB2b2lkIGFkZENoaWxkcmVuKE5hbWVkTW9kZWxPYmplY3QgW10gb2JqZWN0cykgeworCQlmb3IgKGludCBpPTA7IGk8b2JqZWN0cy5sZW5ndGg7IGkrKykgeworCQkJaW50ZXJuYWxBZGQob2JqZWN0c1tpXSk7CisJCX0KKwkJbm90aWZ5T2JqZWN0c0FkZGVkKHRoaXMsIG9iamVjdHMpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBpbnRlcm5hbEFkZChOYW1lZE1vZGVsT2JqZWN0IGNoaWxkKSB7CisJCWNoaWxkcmVuLmFkZChjaGlsZCk7CisJCWNoaWxkLnNldE1vZGVsKGdldE1vZGVsKCkpOworCQljaGlsZC5zZXRQYXJlbnQodGhpcyk7CisJfQorCQorCXB1YmxpYyB2b2lkIHJlbW92ZUNoaWxkcmVuKE5hbWVkTW9kZWxPYmplY3QgW10gb2JqZWN0cykgeworCQlmb3IgKGludCBpPTA7IGk8b2JqZWN0cy5sZW5ndGg7IGkrKykgeworCQkJY2hpbGRyZW4ucmVtb3ZlKG9iamVjdHNbaV0pOworCQkJb2JqZWN0c1tpXS5zZXRQYXJlbnQobnVsbCk7CisJCX0KKwkJbm90aWZ5T2JqZWN0c1JlbW92ZWQodGhpcywgb2JqZWN0cyk7CisJfQorfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL0Jvb2ttYXJrVXRpbC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL0Jvb2ttYXJrVXRpbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzZjQ2MDUKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvQm9va21hcmtVdGlsLmphdmEKQEAgLTAsMCArMSwyODAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWw7CisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS5uZXQuKjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLio7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS4qOworaW1wb3J0IG9yZy53M2MuZG9tLio7CitpbXBvcnQgb3JnLnhtbC5zYXguKjsKKworcHVibGljIGNsYXNzIEJvb2ttYXJrVXRpbCB7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkb2N1bWVudEJ1aWxkZXJGYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworCisJcHVibGljIHN0YXRpYyB2b2lkIHBhcnNlKFN0cmluZyBmaWxlTmFtZSwgVmVjdG9yIGJvb2ttYXJrcykgeworCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShmaWxlTmFtZSk7CisJCWlmICghZmlsZS5leGlzdHMoKSkKKwkJCXJldHVybjsKKworCQl0cnkgeworCQkJZG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKKwkJCURvY3VtZW50QnVpbGRlciBwYXJzZXIgPSBkb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOworCQkJRG9jdW1lbnQgZG9jID0gcGFyc2VyLnBhcnNlKGZpbGUpOworCQkJTm9kZSByb290ID0gZG9jLmdldERvY3VtZW50RWxlbWVudCgpOworCQkJcHJvY2Vzc1Jvb3Qocm9vdCwgYm9va21hcmtzKTsKKwkJfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7CisJCQlVcGRhdGVVSS5sb2dFeGNlcHRpb24oZSk7CisJCX0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7CisJCQlVcGRhdGVVSS5sb2dFeGNlcHRpb24oZSk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCVVwZGF0ZVVJLmxvZ0V4Y2VwdGlvbihlKTsKKwkJfQorCX0KKworCXB1YmxpYyBzdGF0aWMgU2l0ZUJvb2ttYXJrW10gZ2V0Qm9va21hcmtzKFZlY3RvciBib29rbWFya3MpIHsKKwkJQXJyYXlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBib29rbWFya3Muc2l6ZSgpOyBpKyspIHsKKwkJCXByb2Nlc3NFbnRyeShib29rbWFya3MuZ2V0KGkpLCByZXN1bHQpOworCQl9CisJCXJldHVybiAoU2l0ZUJvb2ttYXJrW10pIHJlc3VsdC50b0FycmF5KG5ldyBTaXRlQm9va21hcmtbcmVzdWx0LnNpemUoKV0pOworCX0KKworCXB1YmxpYyBzdGF0aWMgQm9va21hcmtGb2xkZXIgZ2V0Rm9sZGVyKFZlY3RvciBib29rbWFya3MsIElQYXRoIHBhdGgpIHsKKwkJTmFtZWRNb2RlbE9iamVjdCBvYmplY3QgPSBmaW5kKGJvb2ttYXJrcywgcGF0aCk7CisJCWlmIChvYmplY3QgIT0gbnVsbCAmJiBvYmplY3QgaW5zdGFuY2VvZiBCb29rbWFya0ZvbGRlcikKKwkJCXJldHVybiAoQm9va21hcmtGb2xkZXIpIG9iamVjdDsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIHN0YXRpYyBOYW1lZE1vZGVsT2JqZWN0IGZpbmQoVmVjdG9yIGJvb2ttYXJrcywgSVBhdGggcGF0aCkgeworCQlPYmplY3RbXSBhcnJheSA9IGJvb2ttYXJrcy50b0FycmF5KCk7CisJCXJldHVybiBmaW5kKGFycmF5LCBwYXRoKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBOYW1lZE1vZGVsT2JqZWN0IGZpbmQoT2JqZWN0W10gYXJyYXksIElQYXRoIHBhdGgpIHsKKwkJU3RyaW5nIG5hbWUgPSBwYXRoLnNlZ21lbnQoMCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHsKKwkJCU5hbWVkTW9kZWxPYmplY3Qgb2JqID0gKE5hbWVkTW9kZWxPYmplY3QpIGFycmF5W2ldOworCQkJaWYgKG9iai5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7CisJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEJvb2ttYXJrRm9sZGVyKSB7CisJCQkJCWlmIChwYXRoLnNlZ21lbnRDb3VudCgpID4gMSkgeworCQkJCQkJSVBhdGggY2hpbGRQYXRoID0gcGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpOworCQkJCQkJQm9va21hcmtGb2xkZXIgZm9sZGVyID0gKEJvb2ttYXJrRm9sZGVyKSBvYmo7CisJCQkJCQlyZXR1cm4gZmluZChmb2xkZXIuZ2V0Q2hpbGRyZW4obnVsbCksIGNoaWxkUGF0aCk7CisJCQkJCX0KKwkJCQl9CisJCQkJcmV0dXJuIG9iajsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyB2b2lkIHByb2Nlc3NSb290KE5vZGUgcm9vdCwgVmVjdG9yIGJvb2ttYXJrcykgeworCQlpZiAocm9vdC5nZXROb2RlTmFtZSgpLmVxdWFscygiYm9va21hcmtzIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJTm9kZUxpc3QgY2hpbGRyZW4gPSByb290LmdldENoaWxkTm9kZXMoKTsKKwkJCXByb2Nlc3NDaGlsZHJlbihjaGlsZHJlbiwgbnVsbCwgYm9va21hcmtzKTsKKwkJfQorCX0KKwlwcml2YXRlIHN0YXRpYyB2b2lkIHByb2Nlc3NDaGlsZHJlbigKKwkJTm9kZUxpc3QgY2hpbGRyZW4sCisJCUJvb2ttYXJrRm9sZGVyIGZvbGRlciwKKwkJVmVjdG9yIGJvb2ttYXJrcykgeworCQlVcGRhdGVNb2RlbCBtb2RlbCA9IFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRVcGRhdGVNb2RlbCgpOworCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspIHsKKwkJCU5vZGUgY2hpbGQgPSBjaGlsZHJlbi5pdGVtKGkpOworCQkJTmFtZWRNb2RlbE9iamVjdCBvYmplY3QgPSBudWxsOworCQkJaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKKwkJCQlpZiAoY2hpbGQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoInNpdGUiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJCW9iamVjdCA9IGNyZWF0ZVNpdGUoY2hpbGQpOworCQkJCX0gZWxzZSBpZiAoY2hpbGQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoImZvbGRlciIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQkJb2JqZWN0ID0gY3JlYXRlRm9sZGVyKGNoaWxkKTsKKwkJCQl9IAorCQkJfQorCQkJaWYgKG9iamVjdCAhPSBudWxsKSB7CisJCQkJaWYgKGZvbGRlciAhPSBudWxsKSB7CisJCQkJCWZvbGRlci5hZGRDaGlsZChvYmplY3QpOworCQkJCX0gZWxzZSB7CisJCQkJCWJvb2ttYXJrcy5hZGQob2JqZWN0KTsKKwkJCQl9CisJCQkJb2JqZWN0LnNldE1vZGVsKG1vZGVsKTsKKwkJCX0KKwkJfQorCX0KKworCXByaXZhdGUgc3RhdGljIFNpdGVCb29rbWFyayBjcmVhdGVTaXRlKE5vZGUgY2hpbGQpIHsKKwkJU3RyaW5nIG5hbWUgPSBnZXRBdHRyaWJ1dGUoY2hpbGQsICJuYW1lIik7IC8vJE5PTi1OTFMtMSQKKwkJVVJMIHVybCA9IG51bGw7CisJCXRyeSB7CisJCQl1cmwgPSBuZXcgVVJMKGdldEF0dHJpYnV0ZShjaGlsZCwgInVybCIpKTsgLy8kTk9OLU5MUy0xJAorCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworCQl9CisKKwkJU3RyaW5nIHdlYiA9IGdldEF0dHJpYnV0ZShjaGlsZCwgIndlYiIpOyAvLyROT04tTkxTLTEkCisJCWJvb2xlYW4gd2ViQm9va21hcmsgPSAod2ViICE9IG51bGwgJiYgd2ViLmVxdWFscygidHJ1ZSIpKTsgLy8kTk9OLU5MUy0xJAorCisJCVN0cmluZyBzZWwgPSBnZXRBdHRyaWJ1dGUoY2hpbGQsICJzZWxlY3RlZCIpOyAvLyROT04tTkxTLTEkCisJCWJvb2xlYW4gc2VsZWN0ZWQgPSAoc2VsICE9IG51bGwgJiYgc2VsLmVxdWFscygidHJ1ZSIpKTsgLy8kTk9OLU5MUy0xJAorCisJCVNpdGVCb29rbWFyayBib29rbWFyayA9IG5ldyBTaXRlQm9va21hcmsobmFtZSwgdXJsLCB3ZWJCb29rbWFyaywgc2VsZWN0ZWQpOworCisJCVN0cmluZyBsb2NhbCA9IGdldEF0dHJpYnV0ZShjaGlsZCwgImxvY2FsIik7IC8vJE5PTi1OTFMtMSQKKwkJYm9va21hcmsuc2V0TG9jYWwobG9jYWwgIT0gbnVsbCAmJiBsb2NhbC5lcXVhbHMoInRydWUiKSk7IC8vJE5PTi1OTFMtMSQKKworCQlTdHJpbmcgaWduID0gZ2V0QXR0cmlidXRlKGNoaWxkLCAiaWdub3JlZC1jYXRlZ29yaWVzIik7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKGlnbiAhPSBudWxsKSB7CisJCQlTdHJpbmdUb2tlbml6ZXIgc3RvayA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoaWduLCAiLCIpOyAvLyROT04tTkxTLTEkCisJCQlBcnJheUxpc3QgYXJyYXkgPSBuZXcgQXJyYXlMaXN0KCk7CisJCQl3aGlsZSAoc3Rvay5oYXNNb3JlVG9rZW5zKCkpIHsKKwkJCQlTdHJpbmcgdG9rID0gc3Rvay5uZXh0VG9rZW4oKTsKKwkJCQlhcnJheS5hZGQodG9rKTsKKwkJCX0KKwkJCWJvb2ttYXJrLnNldElnbm9yZWRDYXRlZ29yaWVzKChTdHJpbmdbXSkgYXJyYXkudG9BcnJheShuZXcgU3RyaW5nW2FycmF5LnNpemUoKV0pKTsKKwkJfQorCQkvLyByZWFkIGRlc2NyaXB0aW9uCisJCU5vZGVMaXN0IGNoaWxkcmVuID0gY2hpbGQuZ2V0Q2hpbGROb2RlcygpOworCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspIHsKKwkJCU5vZGUgbm9kZSA9IGNoaWxkcmVuLml0ZW0oaSk7CisJCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7CisJCQkJYm9va21hcmsuc2V0RGVzY3JpcHRpb24oY3JlYXRlRGVzY3JpcHRpb24obm9kZSkpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXJldHVybiBib29rbWFyazsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgY3JlYXRlRGVzY3JpcHRpb24oTm9kZSBjaGlsZCkgeworCQlTdHJpbmcgZGVzY3JpcHRpb24gPSAiIjsgLy8kTk9OLU5MUy0xJAorCQlOb2RlTGlzdCBjaGlsZHJlbiA9IGNoaWxkLmdldENoaWxkTm9kZXMoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKSB7CisJCQlOb2RlIG5vZGUgPSBjaGlsZHJlbi5pdGVtKGkpOworCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgCisJCQkJZGVzY3JpcHRpb24gKz0gbm9kZS5nZXROb2RlVmFsdWUoKTsKKwkJfQorCQlyZXR1cm4gZGVzY3JpcHRpb247CisJfQorCisJCQorCXByaXZhdGUgc3RhdGljIEJvb2ttYXJrRm9sZGVyIGNyZWF0ZUZvbGRlcihOb2RlIGNoaWxkKSB7CisJCUJvb2ttYXJrRm9sZGVyIGZvbGRlciA9IG5ldyBCb29rbWFya0ZvbGRlcigpOworCQlTdHJpbmcgbmFtZSA9IGdldEF0dHJpYnV0ZShjaGlsZCwgIm5hbWUiKTsgLy8kTk9OLU5MUy0xJAorCQlmb2xkZXIuc2V0TmFtZShuYW1lKTsKKwkJaWYgKGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkKKwkJCXByb2Nlc3NDaGlsZHJlbihjaGlsZC5nZXRDaGlsZE5vZGVzKCksIGZvbGRlciwgbnVsbCk7CisJCXJldHVybiBmb2xkZXI7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIHN0b3JlKFN0cmluZyBmaWxlTmFtZSwgVmVjdG9yIGJvb2ttYXJrcykgeworCQlGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG51bGw7CisJCU91dHB1dFN0cmVhbVdyaXRlciBvc3cgPSBudWxsOworCQlQcmludFdyaXRlciB3cml0ZXIgPSBudWxsOworCQl0cnkgeworCQkJZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZU5hbWUpOworCQkJb3N3ID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihmb3MsICJVVEY4Iik7IC8vJE5PTi1OTFMtMSQKKwkJCXdyaXRlciA9IG5ldyBQcmludFdyaXRlcihvc3cpOworCQkJd3JpdGVyLnByaW50bG4oIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PiIpOyAvLyROT04tTkxTLTEkCisJCQl3cml0ZXIucHJpbnRsbigiPGJvb2ttYXJrcz4iKTsgLy8kTk9OLU5MUy0xJAorCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBib29rbWFya3Muc2l6ZSgpOyBpKyspIHsKKwkJCQlPYmplY3Qgb2JqID0gYm9va21hcmtzLmdldChpKTsKKwkJCQl3cml0ZU9iamVjdCgiICAgIiwgb2JqLCB3cml0ZXIpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCVVwZGF0ZVVJLmxvZ0V4Y2VwdGlvbihlLCBmYWxzZSk7CisJCX0gZmluYWxseSB7CisJCQl3cml0ZXIucHJpbnRsbigiPC9ib29rbWFya3M+Iik7IC8vJE5PTi1OTFMtMSQKKwkJCXdyaXRlci5mbHVzaCgpOworCQkJd3JpdGVyLmNsb3NlKCk7CisJCQl0cnkgeworCQkJCWlmIChvc3cgIT0gbnVsbCkKKwkJCQkJb3N3LmNsb3NlKCk7CisJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMSkgeworCQkJCVVwZGF0ZVVJLmxvZ0V4Y2VwdGlvbihlMSwgZmFsc2UpOworCQkJfQorCQkJdHJ5IHsKKwkJCQlpZiAoZm9zICE9IG51bGwpCisJCQkJCWZvcy5jbG9zZSgpOworCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZTIpIHsKKwkJCQlVcGRhdGVVSS5sb2dFeGNlcHRpb24oZTIsIGZhbHNlKTsKKwkJCX0KKwkJfQorCX0KKwlwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlT2JqZWN0KAorCQlTdHJpbmcgaW5kZW50LAorCQlPYmplY3Qgb2JqLAorCQlQcmludFdyaXRlciB3cml0ZXIpIHsKKwkJaWYgKG9iaiBpbnN0YW5jZW9mIFNpdGVCb29rbWFyaykgeworCQkJU2l0ZUJvb2ttYXJrIGJvb2ttYXJrID0gKFNpdGVCb29rbWFyaykgb2JqOworCQkJU3RyaW5nIG5hbWUgPSBib29rbWFyay5nZXROYW1lKCk7CisJCQlTdHJpbmcgdXJsID0gYm9va21hcmsuZ2V0VVJMKCkudG9TdHJpbmcoKTsKKwkJCVN0cmluZyB3ZWIgPSBib29rbWFyay5pc1dlYkJvb2ttYXJrKCk/InRydWUiOiJmYWxzZSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJU3RyaW5nIHNlbCA9IGJvb2ttYXJrLmlzU2VsZWN0ZWQoKT8idHJ1ZSI6ImZhbHNlIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQlTdHJpbmcgbG9jYWwgPSBib29rbWFyay5pc0xvY2FsKCkgPyAidHJ1ZSIgOiAiZmFsc2UiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCVN0cmluZyBbXSBpZ24gPSBib29rbWFyay5nZXRJZ25vcmVkQ2F0ZWdvcmllcygpOworCQkJU3RyaW5nQnVmZmVyIHdpZ24gPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGlnbi5sZW5ndGg7IGkrKykgeworCQkJCWlmIChpID4gMCkKKwkJCQkJd2lnbi5hcHBlbmQoJywnKTsKKwkJCQl3aWduLmFwcGVuZChpZ25baV0pOworCQkJfQorCQkJd3JpdGVyLnByaW50KGluZGVudCArICI8c2l0ZSBuYW1lPVwiIiArIFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRXcml0YWJsZVhNTFN0cmluZyhuYW1lKSArICJcIiB1cmw9XCIiICsgdXJsICsgIlwiIHdlYj1cIiIgKyB3ZWIgKyAiXCIgc2VsZWN0ZWQ9XCIiICsgc2VsICsgIlwiIGxvY2FsPVwiIiArIGxvY2FsICsgIlwiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkCisJCQlpZiAod2lnbi5sZW5ndGgoKSA+IDApCisJCQkJd3JpdGVyLnByaW50KCIgaWdub3JlZC1jYXRlZ29yaWVzPVwiIit3aWduLnRvU3RyaW5nKCkrIlwiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJaWYgKGJvb2ttYXJrLmdldERlc2NyaXB0aW9uKCkgIT0gbnVsbCkgeworCQkJCXdyaXRlci5wcmludGxuKCI+Iik7IC8vJE5PTi1OTFMtMSQKKwkJCQl3cml0ZXIucHJpbnQoaW5kZW50KyIgIDxkZXNjcmlwdGlvbj4iKTsgLy8kTk9OLU5MUy0xJAorCQkJCXdyaXRlci5wcmludChVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0V3JpdGFibGVYTUxTdHJpbmcoYm9va21hcmsuZ2V0RGVzY3JpcHRpb24oKSkpOworCQkJCXdyaXRlci5wcmludGxuKCI8L2Rlc2NyaXB0aW9uPiIpOyAvLyROT04tTkxTLTEkCisJCQkJd3JpdGVyLnByaW50bG4oaW5kZW50ICsiPC9zaXRlPiIpOyAvLyROT04tTkxTLTEkCisJCQl9IGVsc2UgeworCQkJCXdyaXRlci5wcmludGxuKCIvPiIpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgQm9va21hcmtGb2xkZXIpIHsKKwkJCUJvb2ttYXJrRm9sZGVyIGZvbGRlciA9IChCb29rbWFya0ZvbGRlcikgb2JqOworCQkJU3RyaW5nIG5hbWUgPSBmb2xkZXIuZ2V0TmFtZSgpOworCQkJd3JpdGVyLnByaW50bG4oaW5kZW50ICsgIjxmb2xkZXIgbmFtZT1cIiIgKyBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0V3JpdGFibGVYTUxTdHJpbmcobmFtZSkgKyAiXCI+Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJT2JqZWN0W10gY2hpbGRyZW4gPSBmb2xkZXIuZ2V0Q2hpbGRyZW4oZm9sZGVyKTsKKwkJCVN0cmluZyBpbmRlbnQyID0gaW5kZW50ICsgIiAgICI7IC8vJE5PTi1OTFMtMSQKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKKwkJCQl3cml0ZU9iamVjdChpbmRlbnQyLCBjaGlsZHJlbltpXSwgd3JpdGVyKTsKKwkJCX0KKwkJCXdyaXRlci5wcmludGxuKGluZGVudCArICI8L2ZvbGRlcj4iKTsgLy8kTk9OLU5MUy0xJAorCQl9CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEF0dHJpYnV0ZShOb2RlIG5vZGUsIFN0cmluZyBuYW1lKSB7CisJCU5hbWVkTm9kZU1hcCBhdHRzID0gbm9kZS5nZXRBdHRyaWJ1dGVzKCk7CisJCU5vZGUgYXR0ID0gYXR0cy5nZXROYW1lZEl0ZW0obmFtZSk7CisJCWlmIChhdHQgIT0gbnVsbCkgeworCQkJcmV0dXJuIGF0dC5nZXROb2RlVmFsdWUoKTsKKwkJfQorCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKKwl9CisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcm9jZXNzRm9sZGVyKEJvb2ttYXJrRm9sZGVyIGZvbGRlciwgQXJyYXlMaXN0IHJlc3VsdCkgeworCQlPYmplY3RbXSBjaGlsZHJlbiA9IGZvbGRlci5nZXRDaGlsZHJlbihmb2xkZXIpOworCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CisJCQlwcm9jZXNzRW50cnkoY2hpbGRyZW5baV0sIHJlc3VsdCk7CisJCX0KKwl9CisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcm9jZXNzRW50cnkoT2JqZWN0IG9iaiwgQXJyYXlMaXN0IHJlc3VsdCkgeworCQlpZiAob2JqIGluc3RhbmNlb2YgU2l0ZUJvb2ttYXJrKQorCQkJcmVzdWx0LmFkZChvYmopOworCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBCb29rbWFya0ZvbGRlcikgeworCQkJcHJvY2Vzc0ZvbGRlcigoQm9va21hcmtGb2xkZXIpIG9iaiwgcmVzdWx0KTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9Db25maWd1cmVkRmVhdHVyZUFkYXB0ZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9Db25maWd1cmVkRmVhdHVyZUFkYXB0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzM2ZTVhCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL0NvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlci5qYXZhCkBAIC0wLDAgKzEsMTE2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOworCisvKioKKyAqIEB2ZXJzaW9uIAkxLjAKKyAqIEBhdXRob3IKKyAqLworcHVibGljIGNsYXNzIENvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlcgorCWV4dGVuZHMgU2ltcGxlRmVhdHVyZUFkYXB0ZXIKKwlpbXBsZW1lbnRzIElDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXIgeworCXByaXZhdGUgSUNvbmZpZ3VyZWRTaXRlQWRhcHRlciBhZGFwdGVyOworCXByaXZhdGUgYm9vbGVhbiBjb25maWd1cmVkOworCXByaXZhdGUgYm9vbGVhbiB1cGRhdGVkOworCisJcHVibGljIENvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlcigKKwkJSUNvbmZpZ3VyZWRTaXRlQWRhcHRlciBhZGFwdGVyLAorCQlJRmVhdHVyZSBmZWF0dXJlLAorCQlib29sZWFuIGNvbmZpZ3VyZWQsCisJCWJvb2xlYW4gdXBkYXRlZCwKKwkJYm9vbGVhbiBvcHRpb25hbCkgeworCQlzdXBlcihmZWF0dXJlLCBvcHRpb25hbCk7CisJCXRoaXMuYWRhcHRlciA9IGFkYXB0ZXI7CisJCXRoaXMuY29uZmlndXJlZCA9IGNvbmZpZ3VyZWQ7CisJCXRoaXMudXBkYXRlZCA9IHVwZGF0ZWQ7CisJfQorCisJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKG9iamVjdCA9PSBudWxsKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAob2JqZWN0ID09IHRoaXMpCisJCQlyZXR1cm4gdHJ1ZTsKKwkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIENvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlcikgeworCQkJdHJ5IHsKKwkJCQlDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXIgYWQgPSAoQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyKSBvYmplY3Q7CisJCQkJcmV0dXJuIGFkLmdldENvbmZpZ3VyZWRTaXRlKCkuZXF1YWxzKGdldENvbmZpZ3VyZWRTaXRlKCkpCisJCQkJCSYmIGFkLmdldEZlYXR1cmUobnVsbCkuZXF1YWxzKGdldEZlYXR1cmUobnVsbCkpOworCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQl9CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXB1YmxpYyBJQ29uZmlndXJlZFNpdGUgZ2V0Q29uZmlndXJlZFNpdGUoKSB7CisJCXJldHVybiBhZGFwdGVyLmdldENvbmZpZ3VyZWRTaXRlKCk7CisJfQorCXB1YmxpYyBJSW5zdGFsbENvbmZpZ3VyYXRpb24gZ2V0SW5zdGFsbENvbmZpZ3VyYXRpb24oKSB7CisJCXJldHVybiBhZGFwdGVyLmdldEluc3RhbGxDb25maWd1cmF0aW9uKCk7CisJfQorCXB1YmxpYyBib29sZWFuIGlzQ29uZmlndXJlZCgpIHsKKwkJcmV0dXJuIGNvbmZpZ3VyZWQ7CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNVcGRhdGVkKCkgeworCQlyZXR1cm4gdXBkYXRlZDsKKwl9CisJcHVibGljIElGZWF0dXJlQWRhcHRlcltdIGdldEluY2x1ZGVkRmVhdHVyZXMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJCXRyeSB7CisJCQlJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlW10gaW5jbHVkZWQgPQorCQkJCWdldEZlYXR1cmUobnVsbCkuZ2V0SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpOworCQkJQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyW10gcmVzdWx0ID0KKwkJCQluZXcgQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyW2luY2x1ZGVkLmxlbmd0aF07CisJCQlpZiAobW9uaXRvciA9PSBudWxsKQorCQkJCW1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOworCQkJU3ViUHJvZ3Jlc3NNb25pdG9yIHN1Yk1vbml0b3IgPSBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEpOworCQkJc3ViTW9uaXRvci5iZWdpblRhc2soIiIsIGluY2x1ZGVkLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKKworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmNsdWRlZC5sZW5ndGg7IGkrKykgeworCQkJCUlJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UgZnJlZiA9IGluY2x1ZGVkW2ldOworCQkJCUlGZWF0dXJlIGZlYXR1cmU7CisJCQkJYm9vbGVhbiBjaGlsZENvbmZpZ3VyZWQgPSBjb25maWd1cmVkOworCQkJCWJvb2xlYW4gdXBkYXRlZCA9IGZhbHNlOworCQkJCXRyeSB7CisJCQkJCWZlYXR1cmUgPSBmcmVmLmdldEZlYXR1cmUoCisJCQkJCQkJbmV3IFN1YlByb2dyZXNzTW9uaXRvcihzdWJNb25pdG9yLCAxKSk7CisJCQkJCWNoaWxkQ29uZmlndXJlZCA9CisJCQkJCQlhZGFwdGVyLmdldENvbmZpZ3VyZWRTaXRlKCkuaXNDb25maWd1cmVkKGZlYXR1cmUpOworCQkJCQkvLy8qCisJCQkJCVBsdWdpblZlcnNpb25JZGVudGlmaWVyIHJlZnBpZCA9CisJCQkJCQlmcmVmLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRWZXJzaW9uKCk7CisJCQkJCVBsdWdpblZlcnNpb25JZGVudGlmaWVyIGZwaWQgPQorCQkJCQkJZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0VmVyc2lvbigpOworCQkJCQl1cGRhdGVkID0gIXJlZnBpZC5lcXVhbHMoZnBpZCk7CisJCQkJCS8vKi8KKwkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCQkJZmVhdHVyZSA9IG5ldyBNaXNzaW5nRmVhdHVyZShnZXRGZWF0dXJlKG51bGwpLCBmcmVmKTsKKwkJCQkJY2hpbGRDb25maWd1cmVkID0gZmFsc2U7CisJCQkJfQorCisJCQkJcmVzdWx0W2ldID0KKwkJCQkJbmV3IENvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlcigKKwkJCQkJCWFkYXB0ZXIsCisJCQkJCQlmZWF0dXJlLAorCQkJCQkJY2hpbGRDb25maWd1cmVkLAorCQkJCQkJdXBkYXRlZCwKKwkJCQkJCWZyZWYuaXNPcHRpb25hbCgpKTsKKwkJCQlyZXN1bHRbaV0uc2V0SW5jbHVkZWQodHJ1ZSk7CisJCQl9CisJCQlyZXR1cm4gcmVzdWx0OworCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiBuZXcgSUZlYXR1cmVBZGFwdGVyWzBdOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL0NvbmZpZ3VyZWRTaXRlQWRhcHRlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL0NvbmZpZ3VyZWRTaXRlQWRhcHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2NTVjYjAKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvQ29uZmlndXJlZFNpdGVBZGFwdGVyLmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7CisKKy8qKgorICogQHZlcnNpb24gCTEuMAorICogQGF1dGhvcgorICovCitwdWJsaWMgY2xhc3MgQ29uZmlndXJlZFNpdGVBZGFwdGVyCisJZXh0ZW5kcyBVSU1vZGVsT2JqZWN0CisJaW1wbGVtZW50cyBJQ29uZmlndXJlZFNpdGVBZGFwdGVyIHsKKwlwcml2YXRlIElJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWc7CisJcHJpdmF0ZSBJQ29uZmlndXJlZFNpdGUgY3NpdGU7CisJCQorCXB1YmxpYyBDb25maWd1cmVkU2l0ZUFkYXB0ZXIoSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZywgSUNvbmZpZ3VyZWRTaXRlIGNzaXRlKSB7CisJCXRoaXMuY3NpdGUgPSBjc2l0ZTsKKwkJdGhpcy5jb25maWcgPSBjb25maWc7CisJfQorCQorCXB1YmxpYyBJQ29uZmlndXJlZFNpdGUgZ2V0Q29uZmlndXJlZFNpdGUoKSB7CisJCXJldHVybiBjc2l0ZTsKKwl9CisKKwlwdWJsaWMgSUluc3RhbGxDb25maWd1cmF0aW9uIGdldEluc3RhbGxDb25maWd1cmF0aW9uKCkgeworCQlyZXR1cm4gY29uZmlnOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCkgeworCQlpZiAob2JqZWN0PT1udWxsKSByZXR1cm4gZmFsc2U7CisJCWlmIChvYmplY3QgPT0gdGhpcykgcmV0dXJuIHRydWU7CisJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBDb25maWd1cmVkU2l0ZUFkYXB0ZXIpIHsKKwkJCUNvbmZpZ3VyZWRTaXRlQWRhcHRlciBhZGFwdGVyID0gKENvbmZpZ3VyZWRTaXRlQWRhcHRlcilvYmplY3Q7CisJCQlyZXR1cm4gY3NpdGUhPW51bGwgJiYgY3NpdGUuZ2V0U2l0ZSgpLmVxdWFscyhhZGFwdGVyLmdldENvbmZpZ3VyZWRTaXRlKCkuZ2V0U2l0ZSgpKTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiBnZXRDb25maWd1cmVkU2l0ZSgpLmdldFNpdGUoKS5nZXRVUkwoKS50b1N0cmluZygpOworCX0KK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9EaXNjb3ZlcnlGb2xkZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9EaXNjb3ZlcnlGb2xkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGU0OGMxCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL0Rpc2NvdmVyeUZvbGRlci5qYXZhCkBAIC0wLDAgKzEsMTUwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsOworCitpbXBvcnQgamF2YS5uZXQuKjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwub3BlcmF0aW9ucy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5zZWFyY2guKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUk7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnNlYXJjaC4qOworCitwdWJsaWMgY2xhc3MgRGlzY292ZXJ5Rm9sZGVyIGV4dGVuZHMgQm9va21hcmtGb2xkZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisgICAgVXBkYXRlUG9saWN5IHVwZGF0ZVBvbGljeSA9IG5ldyBVcGRhdGVQb2xpY3koKTsKKwkKKwlwdWJsaWMgRGlzY292ZXJ5Rm9sZGVyKCkgeworCQlzdXBlcihVcGRhdGVVSU1lc3NhZ2VzLkRpc2NvdmVyeUZvbGRlcl9uYW1lKTsgCisJCXNldE1vZGVsKFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRVcGRhdGVNb2RlbCgpKTsKKwl9CisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpIHsKKwkJY2hpbGRyZW4uY2xlYXIoKTsKKwkJLy8gY2hlY2sgaWYgZGlzY292ZXJ5IHNpdGVzIGRlZmluZWQgYnkgZmVhdHVyZXMgc2hvdWxkIGJlIGV4cG9zZWQgdG8gdGhlIHVzZXIKKwkJaWYgKCFVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKFVwZGF0ZVVJLlBfRElTQ09WRVJZX1NJVEVTX0VOQUJMRUQpKQorCQkJcmV0dXJuOworCQkKKwkJdHJ5IHsKKwkJCVVSTCB1cGRhdGVNYXBVUkwgPSBVcGRhdGVVdGlscy5nZXRVcGRhdGVNYXBVUkwoKTsKKwkJCWlmICh1cGRhdGVNYXBVUkwhPW51bGwpIHsKKwkJCQl1cGRhdGVQb2xpY3kgPSBuZXcgVXBkYXRlUG9saWN5KCk7CisJCQkJLy8gVE9ETyBtYXkgbmVlZCB0byB1c2UgYSBwcm9wZXIgbW9uaXRvciB0byBiZSBhYmxlIHRvIGNhbmNlbCBjb25uZWN0aW9ucworCQkJCUlTdGF0dXMgc3RhdHVzID0gVXBkYXRlVXRpbHMubG9hZFVwZGF0ZVBvbGljeSh1cGRhdGVQb2xpY3ksIHVwZGF0ZU1hcFVSTCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7CisJCQkJaWYgKHN0YXR1cyAhPSBudWxsKSB7CisJCQkJCS8vIGxvZyBhbmQgY29udGludWUKKwkJCQkJVXBkYXRlVXRpbHMubG9nKHN0YXR1cyk7CisJCQkJfQorCQkJfQorCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCS8vIGxvZyBhbmQgY29udGludWUKKwkJCVVwZGF0ZVV0aWxzLmxvZyhlLmdldFN0YXR1cygpKTsKKwkJfQorCQkKKwkJdHJ5IHsKKwkJCUlMb2NhbFNpdGUgc2l0ZSA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpOworCQkJSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZyA9IHNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKTsKKwkJCUlDb25maWd1cmVkU2l0ZVtdIGNzaXRlcyA9IGNvbmZpZy5nZXRDb25maWd1cmVkU2l0ZXMoKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgY3NpdGVzLmxlbmd0aDsgaSsrKSB7CisJCQkJSUNvbmZpZ3VyZWRTaXRlIGNzaXRlID0gY3NpdGVzW2ldOworCQkJCUlGZWF0dXJlUmVmZXJlbmNlW10gcmVmcyA9IGNzaXRlLmdldENvbmZpZ3VyZWRGZWF0dXJlcygpOworCQkJCWZvciAoaW50IGogPSAwOyBqIDwgcmVmcy5sZW5ndGg7IGorKykgeworCQkJCQlJRmVhdHVyZVJlZmVyZW5jZSByZWYgPSByZWZzW2pdOworCQkJCQlJRmVhdHVyZSBmZWF0dXJlID0gcmVmLmdldEZlYXR1cmUobnVsbCk7CisJCQkJCUlVUkxFbnRyeVtdIGVudHJpZXMgPSBmZWF0dXJlLmdldERpc2NvdmVyeVNpdGVFbnRyaWVzKCk7CisJCQkJCWlmIChlbnRyaWVzLmxlbmd0aCA+IDApIHsKKwkJCQkJCS8vIE9ubHkgYWRkIGRpc2NvdmVyeSBzaXRlcyBvZiByb290IGZlYXR1cmVzCisJCQkJCQlpZiAoaXNJbmNsdWRlZChyZWYsIHJlZnMpKQorCQkJCQkJCWNvbnRpbnVlOworCQkJCQkJYWRkQm9va21hcmtzKGZlYXR1cmUpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCVVwZGF0ZVVJLmxvZ0V4Y2VwdGlvbihlKTsKKwkJfQorCX0KKwlwcml2YXRlIGJvb2xlYW4gaXNJbmNsdWRlZCgKKwkJSUZlYXR1cmVSZWZlcmVuY2UgcmVmLAorCQlJRmVhdHVyZVJlZmVyZW5jZVtdIHJlZnMpIHsKKwkJdHJ5IHsKKwkJCVZlcnNpb25lZElkZW50aWZpZXIgdmlkID0gcmVmLmdldFZlcnNpb25lZElkZW50aWZpZXIoKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmcy5sZW5ndGg7IGkrKykgeworCQkJCUlGZWF0dXJlUmVmZXJlbmNlIGNhbmRpZGF0ZSA9IHJlZnNbaV07CisJCQkJLy8gSWdub3JlIHNlbGYKKwkJCQlpZiAoY2FuZGlkYXRlLmVxdWFscyhyZWYpKQorCQkJCQljb250aW51ZTsKKwkJCQlJRmVhdHVyZSBjZmVhdHVyZSA9IGNhbmRpZGF0ZS5nZXRGZWF0dXJlKG51bGwpOworCQkJCUlGZWF0dXJlUmVmZXJlbmNlW10gaXJlZnMgPQorCQkJCQljZmVhdHVyZS5nZXRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCk7CisJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBpcmVmcy5sZW5ndGg7IGorKykgeworCQkJCQlJRmVhdHVyZVJlZmVyZW5jZSBpcmVmID0gaXJlZnNbal07CisJCQkJCVZlcnNpb25lZElkZW50aWZpZXIgaXZpZCA9IGlyZWYuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOworCQkJCQlpZiAoaXZpZC5lcXVhbHModmlkKSkgeworCQkJCQkJLy8gYmluZ28gLSBpbmNsdWRlZCBpbiBhdCBsZWFzdCBvbmUgZmVhdHVyZQorCQkJCQkJcmV0dXJuIHRydWU7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisJcHJpdmF0ZSB2b2lkIGFkZEJvb2ttYXJrcyhJRmVhdHVyZSBmZWF0dXJlKSB7CisJCS8vIFNlZSBpZiB0aGlzIHF1ZXJ5IHNpdGUgYWRhcHRlciBpcyBtYXBwZWQgaW4gdGhlIG1hcCBmaWxlCisJCS8vIHRvIGEgZGlmZmVyZW50IFVSTC4KKwkJaWYgKHVwZGF0ZVBvbGljeSAhPSBudWxsICYmIHVwZGF0ZVBvbGljeS5pc0xvYWRlZCgpKSB7CisJCQlJVXBkYXRlU2l0ZUFkYXB0ZXIgbWFwcGVkU2l0ZSA9IHVwZGF0ZVBvbGljeS5nZXRNYXBwZWREaXNjb3ZlcnlTaXRlKGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldElkZW50aWZpZXIoKSk7CisJCQlpZiAobWFwcGVkU2l0ZSAhPSBudWxsKSB7CisJCQkJU2l0ZUJvb2ttYXJrIGJvb2ttYXJrID0KKwkJCQkJbmV3IFNpdGVCb29rbWFyayhtYXBwZWRTaXRlLmdldExhYmVsKCksCW1hcHBlZFNpdGUuZ2V0VVJMKCksIGZhbHNlKTsKKwkJCQlib29rbWFyay5zZXRSZWFkT25seSh0cnVlKTsKKwkJCQlpZiAoIWNvbnRhaW5zKGJvb2ttYXJrKSkKKwkJCQkJaW50ZXJuYWxBZGQoYm9va21hcmspOworCQkJCXJldHVybjsKKwkJCX0gZWxzZSBpZiAoIXVwZGF0ZVBvbGljeS5pc0ZhbGxiYWNrQWxsb3dlZCgpKSB7CisJCQkJLy8gbm8gbWF0Y2ggLSB1c2Ugb3JpZ2luYWwgc2l0ZXMgaWYgZmFsbGJhY2sgYWxsb3dlZCwgb3Igbm90aGluZy4KKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwkJSVVSTEVudHJ5W10gZW50cmllcyA9IGZlYXR1cmUuZ2V0RGlzY292ZXJ5U2l0ZUVudHJpZXMoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7CisJCQlJVVJMRW50cnkgZW50cnkgPSBlbnRyaWVzW2ldOworCQkJU2l0ZUJvb2ttYXJrIGJvb2ttYXJrID0KKwkJCQluZXcgU2l0ZUJvb2ttYXJrKAorCQkJCQllbnRyeS5nZXRBbm5vdGF0aW9uKCksCisJCQkJCWVudHJ5LmdldFVSTCgpLAorCQkJCQllbnRyeS5nZXRUeXBlKCkgPT0gSVVSTEVudHJ5LldFQl9TSVRFKTsKKwkJCWJvb2ttYXJrLnNldFJlYWRPbmx5KGVudHJ5LmdldFR5cGUoKSAhPSBJVVJMRW50cnkuV0VCX1NJVEUpOworCQkJaWYgKCFjb250YWlucyhib29rbWFyaykpCisJCQkJaW50ZXJuYWxBZGQoYm9va21hcmspOworCQl9CisJfQorCXByaXZhdGUgYm9vbGVhbiBjb250YWlucyhTaXRlQm9va21hcmsgYm9va21hcmspIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5zaXplKCk7IGkrKykgeworCQkJT2JqZWN0IG8gPSBjaGlsZHJlbi5nZXQoaSk7CisJCQlpZiAobyBpbnN0YW5jZW9mIFNpdGVCb29rbWFyaykgeworCQkJCS8vIG5vdGU6IG1hdGNoIG9uIFVSTCwgbm90IHRoZSBsYWJlbAorCQkJCWlmIChib29rbWFyay5nZXRVUkwoKS5lcXVhbHMoKChTaXRlQm9va21hcmspIG8pLmdldFVSTCgpKSkKKwkJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKwlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudCkgeworCQlpZiAoaGFzQ2hpbGRyZW4oKSA9PSBmYWxzZSkKKwkJCWluaXRpYWxpemUoKTsKKwkJcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuKHBhcmVudCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL0ZlYXR1cmVBZGFwdGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvRmVhdHVyZUFkYXB0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTg5ZDI3Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL0ZlYXR1cmVBZGFwdGVyLmphdmEKQEAgLTAsMCArMSw1OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUlNZXNzYWdlczsKKworLyoqCisgKiBAdmVyc2lvbiAJMS4wCisgKiBAYXV0aG9yCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBGZWF0dXJlQWRhcHRlciBleHRlbmRzIFVJTW9kZWxPYmplY3QgaW1wbGVtZW50cyBJRmVhdHVyZUFkYXB0ZXIgeworCXByaXZhdGUgYm9vbGVhbiBpbmNsdWRlZD1mYWxzZTsKKworCS8qCisJICogQHNlZSBJRmVhdHVyZUFkYXB0ZXIjZ2V0SW5zdGFsbENvbmZpZ3VyYXRpb24oKQorCSAqLworCXB1YmxpYyBJSW5zdGFsbENvbmZpZ3VyYXRpb24gZ2V0SW5zdGFsbENvbmZpZ3VyYXRpb24oKSB7CisJCXJldHVybiBudWxsOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBpc0luY2x1ZGVkKCkgeworCQlyZXR1cm4gaW5jbHVkZWQ7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHNldEluY2x1ZGVkKGJvb2xlYW4gaW5jbHVkZWQpIHsKKwkJdGhpcy5pbmNsdWRlZCA9IGluY2x1ZGVkOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQl0cnkgeworCQkJSUZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmUobnVsbCk7CisJCQlyZXR1cm4gZmVhdHVyZS5nZXRMYWJlbCgpOworCQl9CisJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiBVcGRhdGVVSU1lc3NhZ2VzLkZlYXR1cmVBZGFwdGVyX2ZhaWx1cmU7IAorCQl9CisJfQorCXB1YmxpYyBib29sZWFuIGhhc0luY2x1ZGVkRmVhdHVyZXMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJCXRyeSB7CisJCQlJRmVhdHVyZVJlZmVyZW5jZSBbXSBpbmNsdWRlZCA9IGdldEZlYXR1cmUobW9uaXRvcikuZ2V0SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpOworCQkJcmV0dXJuIGluY2x1ZGVkLmxlbmd0aD4wOworCQl9CisJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9GZWF0dXJlUmVmZXJlbmNlQWRhcHRlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL0ZlYXR1cmVSZWZlcmVuY2VBZGFwdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI1ZGMxZgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9GZWF0dXJlUmVmZXJlbmNlQWRhcHRlci5qYXZhCkBAIC0wLDAgKzEsMTA1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7CitpbXBvcnQgamF2YS5uZXQuKjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLio7CisKK3B1YmxpYyBjbGFzcyBGZWF0dXJlUmVmZXJlbmNlQWRhcHRlciBleHRlbmRzIEZlYXR1cmVBZGFwdGVyIHsKKwlwcml2YXRlIElGZWF0dXJlUmVmZXJlbmNlIGZlYXR1cmVSZWY7CisJcHJpdmF0ZSBib29sZWFuIHRvdWNoZWQ7CisKKwlwdWJsaWMgRmVhdHVyZVJlZmVyZW5jZUFkYXB0ZXIoSUZlYXR1cmVSZWZlcmVuY2UgZmVhdHVyZVJlZikgeworCQl0aGlzLmZlYXR1cmVSZWYgPSBmZWF0dXJlUmVmOworCQlzZXRJbmNsdWRlZChmZWF0dXJlUmVmIGluc3RhbmNlb2YgSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZSk7CisJfQorCQorCXB1YmxpYyBJRmVhdHVyZSBnZXRGZWF0dXJlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlyZXR1cm4gZmVhdHVyZVJlZi5nZXRGZWF0dXJlKG1vbml0b3IpOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldEZhc3RMYWJlbCgpIHsKKwkJcmV0dXJuIGZlYXR1cmVSZWYuZ2V0VVJMKCkudG9TdHJpbmcoKTsKKwl9CisJCisJcHVibGljIElTaXRlIGdldFNpdGUoKSB7CisJCXJldHVybiBmZWF0dXJlUmVmLmdldFNpdGUoKTsKKwl9CisJCisJcHVibGljIFVSTCBnZXRVUkwoKSB7CisJCXJldHVybiBmZWF0dXJlUmVmLmdldFVSTCgpOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBpc09wdGlvbmFsKCkgeworCQlyZXR1cm4gZmVhdHVyZVJlZiBpbnN0YW5jZW9mIElJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UgPyAKKwkJCSgoSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZSlmZWF0dXJlUmVmKS5pc09wdGlvbmFsKCk6ZmFsc2U7CisJfQorCQorCXB1YmxpYyB2b2lkIHRvdWNoSW5jbHVkZWRGZWF0dXJlcyhJUnVubmFibGVDb250ZXh0IGNvbnRleHQpIHsKKwkJaWYgKHRvdWNoZWQpIHJldHVybjsKKwkJZmluYWwgSUZlYXR1cmVSZWZlcmVuY2UgW10gaW5jbHVkZWQ7CisJCQorCQl0cnkgeworCQkJaW5jbHVkZWQgPSAJZ2V0RmVhdHVyZShudWxsKS5nZXRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCk7CisJCX0KKwkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJcmV0dXJuOworCQl9CisJCWlmIChpbmNsdWRlZC5sZW5ndGggPT0gMCkgcmV0dXJuOworCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3Mgb3AgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzICgpIHsKKwkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKwkJCQltb25pdG9yLmJlZ2luVGFzayhVcGRhdGVVSU1lc3NhZ2VzLlNpdGVCb29rbWFya19kb3dubG9hZGluZywgaW5jbHVkZWQubGVuZ3RoKTsgCisJCQkJZm9yIChpbnQgaT0wOyBpPGluY2x1ZGVkLmxlbmd0aDsgaSsrKSB7CisJCQkJCUlGZWF0dXJlUmVmZXJlbmNlIHJlZiA9IGluY2x1ZGVkW2ldOworCQkJCQl0cnkgeworCQkJCQkJbW9uaXRvci5zdWJUYXNrKHJlZi5nZXRVUkwoKS50b1N0cmluZygpKTsKKwkJCQkJCXJlZi5nZXRGZWF0dXJlKG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMSkpOworCQkJCQkJLy9tb25pdG9yLndvcmtlZCgxKTsKKwkJCQkJfQorCQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkJCX0KKwkJCQl9CisJCQkJbW9uaXRvci5kb25lKCk7CisJCQl9CisJCX07CisJCXRyeSB7CisJCQljb250ZXh0LnJ1bih0cnVlLCBmYWxzZSwgb3ApOworCQkJdG91Y2hlZD10cnVlOworCQl9CisJCWNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKKwkJfQorCQljYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworCQl9CisJfQorCisJcHVibGljIElGZWF0dXJlQWRhcHRlcltdIGdldEluY2x1ZGVkRmVhdHVyZXMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJCXRyeSB7CisJCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGluY2x1ZGVkID0KKwkJCQlnZXRGZWF0dXJlKG1vbml0b3IpLmdldEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKTsKKwkJCUZlYXR1cmVSZWZlcmVuY2VBZGFwdGVyW10gcmVzdWx0ID0KKwkJCQluZXcgRmVhdHVyZVJlZmVyZW5jZUFkYXB0ZXJbaW5jbHVkZWQubGVuZ3RoXTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5jbHVkZWQubGVuZ3RoOyBpKyspIHsKKwkJCQlyZXN1bHRbaV0gPSBuZXcgRmVhdHVyZVJlZmVyZW5jZUFkYXB0ZXIoaW5jbHVkZWRbaV0pOworCQkJfQorCQkJcmV0dXJuIHJlc3VsdDsKKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm4gbmV3IElGZWF0dXJlQWRhcHRlclswXTsKKwkJfQorCX0KKworCXB1YmxpYyBJRmVhdHVyZVJlZmVyZW5jZSBnZXRGZWF0dXJlUmVmZXJlbmNlKCkgeworCQlyZXR1cm4gZmVhdHVyZVJlZjsKKwl9Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvSUNvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL0lDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWVjZjFjCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL0lDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXIuamF2YQpAQCAtMCwwICsxLDIxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsOworCisKKy8qKgorICogQHZlcnNpb24gCTEuMAorICogQGF1dGhvcgorICovCitwdWJsaWMgaW50ZXJmYWNlIElDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXIgZXh0ZW5kcyBJRmVhdHVyZUFkYXB0ZXIsIElDb25maWd1cmVkU2l0ZUNvbnRleHQgeworCXB1YmxpYyBib29sZWFuIGlzQ29uZmlndXJlZCgpOworCXB1YmxpYyBib29sZWFuIGlzVXBkYXRlZCgpOworfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL0lDb25maWd1cmVkU2l0ZUFkYXB0ZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9JQ29uZmlndXJlZFNpdGVBZGFwdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZmYzhiNAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9JQ29uZmlndXJlZFNpdGVBZGFwdGVyLmphdmEKQEAgLTAsMCArMSwxOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbDsKKworCisvKioKKyAqIEB2ZXJzaW9uIAkxLjAKKyAqIEBhdXRob3IKKyAqLworcHVibGljIGludGVyZmFjZSBJQ29uZmlndXJlZFNpdGVBZGFwdGVyIGV4dGVuZHMgSUNvbmZpZ3VyZWRTaXRlQ29udGV4dCB7Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvSUNvbmZpZ3VyZWRTaXRlQ29udGV4dC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL0lDb25maWd1cmVkU2l0ZUNvbnRleHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDVkZDU4Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL0lDb25maWd1cmVkU2l0ZUNvbnRleHQuamF2YQpAQCAtMCwwICsxLDIyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsOworCitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsKKworLyoqCisgKiBAdmVyc2lvbiAJMS4wCisgKiBAYXV0aG9yCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSUNvbmZpZ3VyZWRTaXRlQ29udGV4dCB7CisJcHVibGljIElJbnN0YWxsQ29uZmlndXJhdGlvbiBnZXRJbnN0YWxsQ29uZmlndXJhdGlvbigpOworCXB1YmxpYyBJQ29uZmlndXJlZFNpdGUgZ2V0Q29uZmlndXJlZFNpdGUoKTsKK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9JRmVhdHVyZUFkYXB0ZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9JRmVhdHVyZUFkYXB0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjg2OTQyCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL0lGZWF0dXJlQWRhcHRlci5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWw7CisKK2ltcG9ydCBqYXZhLm5ldC4qOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKKworLyoqCisgKiBAdmVyc2lvbiAJMS4wCisgKiBAYXV0aG9yCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSUZlYXR1cmVBZGFwdGVyIHsKKwlwdWJsaWMgVVJMIGdldFVSTCgpOworCXB1YmxpYyBJU2l0ZSBnZXRTaXRlKCk7CisJcHVibGljIElGZWF0dXJlIGdldEZlYXR1cmUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKKwlwdWJsaWMgSUZlYXR1cmVBZGFwdGVyIFtdIGdldEluY2x1ZGVkRmVhdHVyZXMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKTsKKwlwdWJsaWMgYm9vbGVhbiBoYXNJbmNsdWRlZEZlYXR1cmVzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcik7CisJcHVibGljIGJvb2xlYW4gaXNJbmNsdWRlZCgpOworCXB1YmxpYyBib29sZWFuIGlzT3B0aW9uYWwoKTsKKwlwdWJsaWMgU3RyaW5nIGdldEZhc3RMYWJlbCgpOworfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL0lTaXRlQWRhcHRlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL0lTaXRlQWRhcHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4MjA4YWQKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvSVNpdGVBZGFwdGVyLmphdmEKQEAgLTAsMCArMSwyNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbDsKKworaW1wb3J0IGphdmEubmV0Lio7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOworCitwdWJsaWMgaW50ZXJmYWNlIElTaXRlQWRhcHRlciB7CisJCisJcHVibGljIFN0cmluZyBnZXRMYWJlbCgpOworCXB1YmxpYyBVUkwgZ2V0VVJMKCk7CisJcHVibGljIElTaXRlIGdldFNpdGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKTsKKworfQorCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvTWlzc2luZ0ZlYXR1cmUuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9NaXNzaW5nRmVhdHVyZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MDZkYTgKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvTWlzc2luZ0ZlYXR1cmUuamF2YQpAQCAtMCwwICsxLDQ1NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbDsKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLm5ldC4qOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS4qOworCitwdWJsaWMgY2xhc3MgTWlzc2luZ0ZlYXR1cmUgaW1wbGVtZW50cyBJRmVhdHVyZSB7CisKKwlwcml2YXRlIFVSTCB1cmw7CisJcHJpdmF0ZSBJU2l0ZSBzaXRlOworCXByaXZhdGUgSUZlYXR1cmVSZWZlcmVuY2UgcmVmZXJlbmNlOworCXByaXZhdGUgSUZlYXR1cmUgcGFyZW50OworCXByaXZhdGUgSVVSTEVudHJ5IGRlc2M7CisJcHJpdmF0ZSBWZXJzaW9uZWRJZGVudGlmaWVyIGlkID0gbmV3IFZlcnNpb25lZElkZW50aWZpZXIoVXBkYXRlVUlNZXNzYWdlcy5NaXNzaW5nRmVhdHVyZV9pZCwgIjAuMC4wIik7ICAvLyROT04tTkxTLTEkCisJcHVibGljIE1pc3NpbmdGZWF0dXJlKElTaXRlIHNpdGUsIFVSTCB1cmwpIHsKKwkJdGhpcy5zaXRlID0gc2l0ZTsKKwkJdGhpcy51cmwgPSB1cmw7CisJCWRlc2MgPSBuZXcgSVVSTEVudHJ5KCkgeworCQkJcHVibGljIFVSTCBnZXRVUkwoKSB7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb24oKSB7CisJCQkJcmV0dXJuIFVwZGF0ZVVJTWVzc2FnZXMuTWlzc2luZ0ZlYXR1cmVfZGVzY191bmtub3duOyAKKwkJCX0KKwkJCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBrZXkpIHsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJCXB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKKwkJCQlyZXR1cm4gSVVSTEVudHJ5LlVQREFURV9TSVRFOworCQkJfQorCQl9OworCX0KKwlwdWJsaWMgTWlzc2luZ0ZlYXR1cmUoSUZlYXR1cmVSZWZlcmVuY2UgcmVmKSB7CisJCXRoaXMobnVsbCwgcmVmKTsKKwl9CisKKwlwdWJsaWMgTWlzc2luZ0ZlYXR1cmUoSUZlYXR1cmUgcGFyZW50LCBJRmVhdHVyZVJlZmVyZW5jZSByZWYpIHsKKwkJdGhpcyhyZWYuZ2V0U2l0ZSgpLCByZWYuZ2V0VVJMKCkpOworCQl0aGlzLnJlZmVyZW5jZSA9IHJlZjsKKwkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CisKKwkJaWYgKGlzT3B0aW9uYWwoKSkgeworCQkJZGVzYyA9IG5ldyBJVVJMRW50cnkoKSB7CisJCQkJcHVibGljIFVSTCBnZXRVUkwoKSB7CisJCQkJCXJldHVybiBudWxsOworCQkJCX0KKwkJCQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb24oKSB7CisJCQkJCXJldHVybiBVcGRhdGVVSU1lc3NhZ2VzLk1pc3NpbmdGZWF0dXJlX2Rlc2Nfb3B0aW9uYWw7IAorCQkJCX0KKwkJCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3Mga2V5KSB7CisJCQkJCXJldHVybiBudWxsOworCQkJCX0KKwkJCQlwdWJsaWMgaW50IGdldFR5cGUoKSB7CisJCQkJCXJldHVybiBJVVJMRW50cnkuVVBEQVRFX1NJVEU7CisJCQkJfQorCQkJfTsKKwkJfQorCX0KKworCXB1YmxpYyBib29sZWFuIGlzT3B0aW9uYWwoKSB7CisJCXJldHVybiByZWZlcmVuY2UgIT0gbnVsbAorCQkJJiYgcmVmZXJlbmNlIGluc3RhbmNlb2YgSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZQorCQkJJiYgKChJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlKSByZWZlcmVuY2UpLmlzT3B0aW9uYWwoKTsKKwl9CisKKwlwdWJsaWMgSUZlYXR1cmUgZ2V0UGFyZW50KCkgeworCQlyZXR1cm4gcGFyZW50OworCX0KKworCXB1YmxpYyBVUkwgZ2V0T3JpZ2luYXRpbmdTaXRlVVJMKCkgeworCQlWZXJzaW9uZWRJZGVudGlmaWVyIHZpZCA9IGdldFZlcnNpb25lZElkZW50aWZpZXIoKTsKKwkJaWYgKHZpZCA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisJCVN0cmluZyBrZXkgPSB2aWQuZ2V0SWRlbnRpZmllcigpOworCQlyZXR1cm4gVXBkYXRlVUkuZ2V0T3JpZ2luYXRpbmdVUkwoa2V5KTsKKwl9CisKKwkvKgorCSAqIEBzZWUgSUZlYXR1cmUjZ2V0SWRlbnRpZmllcigpCisJICovCisJcHVibGljIFZlcnNpb25lZElkZW50aWZpZXIgZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpIHsKKwkJaWYgKHJlZmVyZW5jZSAhPSBudWxsKSB7CisJCQl0cnkgeworCQkJCXJldHVybiByZWZlcmVuY2UuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOworCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQl9CisJCX0KKwkJcmV0dXJuIGlkOworCX0KKworCS8qCisJICogQHNlZSBJRmVhdHVyZSNnZXRTaXRlKCkKKwkgKi8KKwlwdWJsaWMgSVNpdGUgZ2V0U2l0ZSgpIHsKKwkJcmV0dXJuIHNpdGU7CisJfQorCisJLyoKKwkgKiBAc2VlIElGZWF0dXJlI2dldExhYmVsKCkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgeworCQlpZiAocmVmZXJlbmNlICE9IG51bGwKKwkJCSYmIHJlZmVyZW5jZSBpbnN0YW5jZW9mIElJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UpIHsKKwkJCVN0cmluZyBuYW1lID0gKChJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlKSByZWZlcmVuY2UpLmdldE5hbWUoKTsKKwkJCWlmIChuYW1lICE9IG51bGwpCisJCQkJcmV0dXJuIG5hbWU7CisJCX0KKwkJcmV0dXJuIHVybC50b1N0cmluZygpOworCX0KKworCS8qCisJICogQHNlZSBJRmVhdHVyZSNnZXRVUkwoKQorCSAqLworCXB1YmxpYyBVUkwgZ2V0VVJMKCkgeworCQlyZXR1cm4gdXJsOworCX0KKworCS8qCisJICogQHNlZSBJRmVhdHVyZSNnZXRVcGRhdGVJbmZvKCkKKwkgKi8KKwlwdWJsaWMgSVVSTEVudHJ5IGdldFVwZGF0ZVNpdGVFbnRyeSgpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoKKwkgKiBAc2VlIElGZWF0dXJlI2dldERpc2NvdmVyeUluZm9zKCkKKwkgKi8KKwlwdWJsaWMgSVVSTEVudHJ5W10gZ2V0RGlzY292ZXJ5U2l0ZUVudHJpZXMoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qCisJICogQHNlZSBJRmVhdHVyZSNnZXRQcm92aWRlcigpCisJICovCisJcHVibGljIFN0cmluZyBnZXRQcm92aWRlcigpIHsKKwkJcmV0dXJuIFVwZGF0ZVVJTWVzc2FnZXMuTWlzc2luZ0ZlYXR1cmVfcHJvdmlkZXI7IAorCX0KKworCS8qCisJICogQHNlZSBJRmVhdHVyZSNnZXREZXNjcmlwdGlvbigpCisJICovCisJcHVibGljIElVUkxFbnRyeSBnZXREZXNjcmlwdGlvbigpIHsKKwkJcmV0dXJuIGRlc2M7CisJfQorCisJLyoKKwkgKiBAc2VlIElGZWF0dXJlI2dldENvcHlyaWdodCgpCisJICovCisJcHVibGljIElVUkxFbnRyeSBnZXRDb3B5cmlnaHQoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qCisJICogQHNlZSBJRmVhdHVyZSNnZXRMaWNlbnNlKCkKKwkgKi8KKwlwdWJsaWMgSVVSTEVudHJ5IGdldExpY2Vuc2UoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qCisJICogQHNlZSBJRmVhdHVyZSNnZXRPUygpCisJICovCisJcHVibGljIFN0cmluZyBnZXRPUygpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoKKwkgKiBAc2VlIElGZWF0dXJlI2dldFdTKCkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFdTKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKgorCSAqIEBzZWUgSUZlYXR1cmUjZ2V0TkwoKQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TkwoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qCisJICogQHNlZSBJRmVhdHVyZSNnZXRBcmNoKCkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE9TQXJjaCgpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoKKwkgKiBAc2VlIElGZWF0dXJlI2dldEltYWdlKCkKKwkgKi8KKwlwdWJsaWMgVVJMIGdldEltYWdlKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKgorCSAqIEBzZWUgSUZlYXR1cmUjZ2V0SW1wb3J0cygpCisJICovCisJcHVibGljIElJbXBvcnRbXSBnZXRJbXBvcnRzKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKgorCSAqIEBzZWUgSUZlYXR1cmUjZ2V0QXJjaGl2ZXMoKQorCSAqLworCXB1YmxpYyBTdHJpbmdbXSBnZXRBcmNoaXZlcygpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoKKwkgKiBAc2VlIElGZWF0dXJlI2dldERhdGFFbnRyaWVzKCkKKwkgKi8KKwlwdWJsaWMgSU5vblBsdWdpbkVudHJ5W10gZ2V0Tm9uUGx1Z2luRW50cmllcygpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoKKwkgKiBAc2VlIElGZWF0dXJlI2FkZERhdGFFbnRyeShJRGF0YUVudHJ5KQorCSAqLworCXB1YmxpYyB2b2lkIGFkZE5vblBsdWdpbkVudHJ5KElOb25QbHVnaW5FbnRyeSBkYXRhRW50cnkpIHsKKwl9CisKKwkvKgorCSAqIEBzZWUgSUZlYXR1cmUjZ2V0RG93bmxvYWRTaXplKCkKKwkgKi8KKwlwdWJsaWMgbG9uZyBnZXREb3dubG9hZFNpemUoKSB7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogQHNlZSBJRmVhdHVyZSNnZXRJbnN0YWxsU2l6ZShJU2l0ZSkKKwkgKi8KKwlwdWJsaWMgbG9uZyBnZXRJbnN0YWxsU2l6ZSgpIHsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBAc2VlIElGZWF0dXJlI2lzUHJpbWFyeSgpCisJICovCisJcHVibGljIGJvb2xlYW4gaXNQcmltYXJ5KCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoKKwkgKiBAc2VlIElGZWF0dXJlI2dldEFwcGxpY2F0aW9uKCkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldEFwcGxpY2F0aW9uKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKgorCSAqIEBzZWUgSVBsdWdpbkNvbnRhaW5lciNnZXRQbHVnaW5FbnRyaWVzKCkKKwkgKi8KKwlwdWJsaWMgSVBsdWdpbkVudHJ5W10gZ2V0UGx1Z2luRW50cmllcygpIHsKKwkJcmV0dXJuIG5ldyBJUGx1Z2luRW50cnlbMF07CisJfQorCisJLyoKKwkgKiBAc2VlIElQbHVnaW5Db250YWluZXIjZ2V0UGx1Z2luRW50cnlDb3VudCgpCisJICovCisJcHVibGljIGludCBnZXRQbHVnaW5FbnRyeUNvdW50KCkgeworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIEBzZWUgSVBsdWdpbkNvbnRhaW5lciNnZXREb3dubG9hZFNpemUoSVBsdWdpbkVudHJ5KQorCSAqLworCXB1YmxpYyBsb25nIGdldERvd25sb2FkU2l6ZShJUGx1Z2luRW50cnkgZW50cnkpIHsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBAc2VlIElQbHVnaW5Db250YWluZXIjZ2V0SW5zdGFsbFNpemUoSVBsdWdpbkVudHJ5KQorCSAqLworCXB1YmxpYyBsb25nIGdldEluc3RhbGxTaXplKElQbHVnaW5FbnRyeSBlbnRyeSkgeworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIEBzZWUgSVBsdWdpbkNvbnRhaW5lciNhZGRQbHVnaW5FbnRyeShJUGx1Z2luRW50cnkpCisJICovCisJcHVibGljIHZvaWQgYWRkUGx1Z2luRW50cnkoSVBsdWdpbkVudHJ5IHBsdWdpbkVudHJ5KSB7CisJfQorCisJLyoKKwkgKiBAc2VlIElQbHVnaW5Db250YWluZXIjc3RvcmUoSVBsdWdpbkVudHJ5LCBTdHJpbmcsIElucHV0U3RyZWFtKQorCSAqLworCXB1YmxpYyB2b2lkIHN0b3JlKElQbHVnaW5FbnRyeSBlbnRyeSwgU3RyaW5nIG5hbWUsIElucHV0U3RyZWFtIGluU3RyZWFtKQorCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJfQorCisJLyoKKwkgKiBAc2VlIElBZGFwdGFibGUjZ2V0QWRhcHRlcihDbGFzcykKKwkgKi8KKwlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKgorCSAqIEBzZWUgSVBsdWdpbkNvbnRhaW5lciNyZW1vdmUoSVBsdWdpbkVudHJ5KQorCSAqLworCXB1YmxpYyB2b2lkIHJlbW92ZShJUGx1Z2luRW50cnkgZW50cnkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwl9CisKKwkvKgorCSAqIEBzZWUgSUZlYXR1cmUjc2V0RmVhdHVyZUNvbnRlbnRQcm92aWRlcihJRmVhdHVyZUNvbnRlbnRQcm92aWRlcikKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRGZWF0dXJlQ29udGVudFByb3ZpZGVyKElGZWF0dXJlQ29udGVudFByb3ZpZGVyIGZlYXR1cmVDb250ZW50UHJvdmlkZXIpIHsKKwl9CisKKwkvKgorCSAqIEBzZWUgSUZlYXR1cmUjZ2V0RmVhdHVyZUNvbnRlbnRDb25zdW1lcigpCisJICovCisJcHVibGljIElGZWF0dXJlQ29udGVudENvbnN1bWVyIGdldEZlYXR1cmVDb250ZW50Q29uc3VtZXIoKQorCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qCisJICogQHNlZSBJRmVhdHVyZSNzZXRTaXRlKElTaXRlKQorCSAqLworCXB1YmxpYyB2b2lkIHNldFNpdGUoSVNpdGUgc2l0ZSkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQl0aGlzLnNpdGUgPSBzaXRlOworCX0KKworCS8qCisJICogQHNlZSBJRmVhdHVyZSNnZXRGZWF0dXJlQ29udGVudFByb3ZpZGVyKCkKKwkgKi8KKwlwdWJsaWMgSUZlYXR1cmVDb250ZW50UHJvdmlkZXIgZ2V0RmVhdHVyZUNvbnRlbnRQcm92aWRlcigpCisJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoKKwkgKiBAc2VlIElGZWF0dXJlI2luc3RhbGwoSUZlYXR1cmUsSVZlcmlmaWVyLCBJUHJvZ3Jlc3NNb25pdG9yKQorCSAqLworCXB1YmxpYyBJRmVhdHVyZVJlZmVyZW5jZSBpbnN0YWxsKAorCQlJRmVhdHVyZSB0YXJnZXRGZWF0dXJlLAorCQlJVmVyaWZpY2F0aW9uTGlzdGVuZXIgdmVyaWZpY2F0aW9uTGlzdGVuZXIsCisJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKKwkJdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmUjaW5zdGFsbChJRmVhdHVyZSwgSUZlYXR1cmVSZWZlcmVuY2VbXSwgSVZlcmlmaWNhdGlvbkxpc3RlbmVyLCBJUHJvZ3Jlc3NNb25pdG9yKQorCSAqLworCXB1YmxpYyBJRmVhdHVyZVJlZmVyZW5jZSBpbnN0YWxsKAorCQlJRmVhdHVyZSB0YXJnZXRGZWF0dXJlLAorCQlJRmVhdHVyZVJlZmVyZW5jZVtdIG9wdGlvbmFsRmVhdHVyZXMsCisJCUlWZXJpZmljYXRpb25MaXN0ZW5lciB2ZXJpZmljYXRpb25MaXN0ZW5lciwKKwkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQorCQl0aHJvd3MgSW5zdGFsbEFib3J0ZWRFeGNlcHRpb24sIENvcmVFeGNlcHRpb24geworCQlyZXR1cm4gbnVsbDsKKwl9CisJLyoKKwkgKiBAc2VlIElGZWF0dXJlI3JlbW92ZShJUHJvZ3Jlc3NNb25pdG9yKQorCSAqLworCXB1YmxpYyB2b2lkIHJlbW92ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwl9CisKKwkvKgorCSAqIEBzZWUgSVBsdWdpbkNvbnRhaW5lciNyZW1vdmUoSVBsdWdpbkVudHJ5LCBJUHJvZ3Jlc3NNb25pdG9yKQorCSAqLworCXB1YmxpYyB2b2lkIHJlbW92ZShJUGx1Z2luRW50cnkgZW50cnksIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKKwkJdGhyb3dzIENvcmVFeGNlcHRpb24geworCX0KKworCS8qCisJICogQHNlZSBJRmVhdHVyZSNnZXROb25QbHVnaW5FbnRyeUNvdW50KCkKKwkgKi8KKwlwdWJsaWMgaW50IGdldE5vblBsdWdpbkVudHJ5Q291bnQoKSB7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogQHNlZSBJRmVhdHVyZSNnZXRJbnN0YWxsSGFuZGxlckVudHJ5KCkKKwkgKi8KKwlwdWJsaWMgSUluc3RhbGxIYW5kbGVyRW50cnkgZ2V0SW5zdGFsbEhhbmRsZXJFbnRyeSgpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCS8qCisJICogQHNlZSBJRmVhdHVyZSNnZXRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCkKKwkgKi8KKwlwdWJsaWMgSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZVtdIGdldEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKQorCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCXJldHVybiBuZXcgSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZVswXTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIElGZWF0dXJlI2dldEFmZmluaXR5RmVhdHVyZSgpCisJICovCisJcHVibGljIFN0cmluZyBnZXRBZmZpbml0eUZlYXR1cmUoKSB7CisJCXJldHVybiBudWxsOworCX0KKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlI2dldFJhd0luY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKQorCSAqLworCXB1YmxpYyBJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlW10gZ2V0UmF3SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpCisJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGdldEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKTsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlI2dldFJhd05vblBsdWdpbkVudHJpZXMoKQorCSAqLworCXB1YmxpYyBJTm9uUGx1Z2luRW50cnlbXSBnZXRSYXdOb25QbHVnaW5FbnRyaWVzKCkgeworCQlyZXR1cm4gZ2V0Tm9uUGx1Z2luRW50cmllcygpOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmUjZ2V0UmF3UGx1Z2luRW50cmllcygpCisJICovCisJcHVibGljIElQbHVnaW5FbnRyeVtdIGdldFJhd1BsdWdpbkVudHJpZXMoKSB7CisJCXJldHVybiBnZXRQbHVnaW5FbnRyaWVzKCk7CisJfQorCisJLyoqCisJICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZSNnZXRQcmltYXJ5UGx1Z2luSUQoKQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0UHJpbWFyeVBsdWdpbklEKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlI2dldFJhd0ltcG9ydHMoKQorCSAqLworCXB1YmxpYyBJSW1wb3J0W10gZ2V0UmF3SW1wb3J0cygpIHsKKwkJcmV0dXJuIG5ldyBJSW1wb3J0WzBdOworCX0KKworCS8qKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmUjaXNQYXRjaCgpCisJICovCisJcHVibGljIGJvb2xlYW4gaXNQYXRjaCgpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBpc0V4Y2x1c2l2ZSgpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL05hbWVkTW9kZWxPYmplY3QuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9OYW1lZE1vZGVsT2JqZWN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNhYjk2NQotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9OYW1lZE1vZGVsT2JqZWN0LmphdmEKQEAgLTAsMCArMSw5NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbDsKKworaW1wb3J0IGphdmEuaW8uKjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuKjsKKworcHVibGljIGNsYXNzIE5hbWVkTW9kZWxPYmplY3QgZXh0ZW5kcyBVSU1vZGVsT2JqZWN0IAorCQkJCQkJCWltcGxlbWVudHMgSVdvcmtiZW5jaEFkYXB0ZXIsIFNlcmlhbGl6YWJsZSAgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKwl0cmFuc2llbnQgcHJpdmF0ZSBOYW1lZE1vZGVsT2JqZWN0IHBhcmVudDsKKwkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX05BTUU9InBfbmFtZSI7IC8vJE5PTi1OTFMtMSQKKwkKKwlwdWJsaWMgTmFtZWRNb2RlbE9iamVjdCgpIHsKKwl9CisJCisJcHVibGljIE5hbWVkTW9kZWxPYmplY3QoU3RyaW5nIG5hbWUpIHsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwl9CisJCisJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKKwkJaWYgKGFkYXB0ZXIuZXF1YWxzKElXb3JrYmVuY2hBZGFwdGVyLmNsYXNzKSkgeworCQkJcmV0dXJuIHRoaXM7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoYWRhcHRlcik7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIG5hbWU7CisJfQorCQorCXB1YmxpYyBJUGF0aCBnZXRQYXRoKCkgeworCQlPYmplY3QgcGFyZW50ID0gZ2V0UGFyZW50KG51bGwpOworCQlpZiAocGFyZW50IT1udWxsICYmIHBhcmVudCBpbnN0YW5jZW9mIE5hbWVkTW9kZWxPYmplY3QpCisJCQlyZXR1cm4gKChOYW1lZE1vZGVsT2JqZWN0KXBhcmVudCkuZ2V0UGF0aCgpLmFwcGVuZChnZXROYW1lKCkpOworCQllbHNlCisJCQlyZXR1cm4gbmV3IFBhdGgoZ2V0TmFtZSgpKTsKKwl9CisJCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuIGdldE5hbWUoKTsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworCQl0aGlzLm5hbWUgPSBuYW1lOworCQlub3RpZnlPYmplY3RDaGFuZ2VkKFBfTkFNRSk7CisJfQorCQorCS8qKgorCSAqIEBzZWUgSVdvcmtiZW5jaEFkYXB0ZXIjZ2V0Q2hpbGRyZW4oT2JqZWN0KQorCSAqLworCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50KSB7CisJCXJldHVybiBudWxsOworCX0KKworCisJLyoqCisJICogQHNlZSBJV29ya2JlbmNoQWRhcHRlciNnZXRJbWFnZURlc2NyaXB0b3IoT2JqZWN0KQorCSAqLworCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKE9iamVjdCBvYmopIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisKKwkvKioKKwkgKiBAc2VlIElXb3JrYmVuY2hBZGFwdGVyI2dldExhYmVsKE9iamVjdCkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldExhYmVsKE9iamVjdCBvYmopIHsKKwkJcmV0dXJuIGdldE5hbWUoKTsKKwl9CisKKworCS8qKgorCSAqIEBzZWUgSVdvcmtiZW5jaEFkYXB0ZXIjZ2V0UGFyZW50KE9iamVjdCkKKwkgKi8KKwlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgYXJnMCkgeworCQlyZXR1cm4gcGFyZW50OworCX0KKwlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoTmFtZWRNb2RlbE9iamVjdCBwYXJlbnQpIHsKKwkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CisJfQorfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL1NpbXBsZUZlYXR1cmVBZGFwdGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvU2ltcGxlRmVhdHVyZUFkYXB0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODBmNzlkCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL1NpbXBsZUZlYXR1cmVBZGFwdGVyLmphdmEKQEAgLTAsMCArMSw2NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbDsKKworaW1wb3J0IGphdmEubmV0Lio7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOworCisvKioKKyAqIEB2ZXJzaW9uIAkxLjAKKyAqIEBhdXRob3IKKyAqLworcHVibGljIGNsYXNzIFNpbXBsZUZlYXR1cmVBZGFwdGVyIGV4dGVuZHMgRmVhdHVyZUFkYXB0ZXIgeworCXByb3RlY3RlZCBJRmVhdHVyZSBmZWF0dXJlOworCXByaXZhdGUgYm9vbGVhbiBvcHRpb25hbDsKKwlwdWJsaWMgU2ltcGxlRmVhdHVyZUFkYXB0ZXIoSUZlYXR1cmUgZmVhdHVyZSkgeworCQl0aGlzKGZlYXR1cmUsIGZhbHNlKTsKKwl9CisJcHVibGljIFNpbXBsZUZlYXR1cmVBZGFwdGVyKElGZWF0dXJlIGZlYXR1cmUsIGJvb2xlYW4gb3B0aW9uYWwpIHsKKwkJdGhpcy5mZWF0dXJlID0gZmVhdHVyZTsKKwkJdGhpcy5vcHRpb25hbCA9IG9wdGlvbmFsOworCX0KKwkKKwlwdWJsaWMgSUZlYXR1cmUgZ2V0RmVhdHVyZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGZlYXR1cmU7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0RmFzdExhYmVsKCkgeworCQlyZXR1cm4gZmVhdHVyZS5nZXRMYWJlbCgpOworCX0KKwkKKwlwdWJsaWMgVVJMIGdldFVSTCgpIHsKKwkJcmV0dXJuIGZlYXR1cmUuZ2V0VVJMKCk7CisJfQorCQorCXB1YmxpYyBJU2l0ZSBnZXRTaXRlKCkgeworCQlyZXR1cm4gZmVhdHVyZS5nZXRTaXRlKCk7CisJfQorCQorCXB1YmxpYyBJRmVhdHVyZUFkYXB0ZXJbXSBnZXRJbmNsdWRlZEZlYXR1cmVzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgeworCQl0cnkgeworCQkJSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZVtdIGluY2x1ZGVkID0gZ2V0RmVhdHVyZShtb25pdG9yKS5nZXRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCk7CisJCQlTaW1wbGVGZWF0dXJlQWRhcHRlcltdIHJlc3VsdCA9CisJCQkJbmV3IFNpbXBsZUZlYXR1cmVBZGFwdGVyW2luY2x1ZGVkLmxlbmd0aF07CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGluY2x1ZGVkLmxlbmd0aDsgaSsrKSB7CisJCQkJcmVzdWx0W2ldID0KKwkJCQkJbmV3IFNpbXBsZUZlYXR1cmVBZGFwdGVyKGluY2x1ZGVkW2ldLmdldEZlYXR1cmUobnVsbCksIGluY2x1ZGVkW2ldLmlzT3B0aW9uYWwoKSk7CisJCQkJcmVzdWx0W2ldLnNldEluY2x1ZGVkKHRydWUpOworCQkJfQorCQkJcmV0dXJuIHJlc3VsdDsKKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm4gbmV3IElGZWF0dXJlQWRhcHRlclswXTsKKwkJfQorCX0KKwlwdWJsaWMgYm9vbGVhbiBpc09wdGlvbmFsKCkgeworCQlyZXR1cm4gb3B0aW9uYWw7CisJfQorfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL1NpdGVCb29rbWFyay5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL1NpdGVCb29rbWFyay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5MmQ2NWQKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvU2l0ZUJvb2ttYXJrLmphdmEKQEAgLTAsMCArMSwyOTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWw7CisKK2ltcG9ydCBqYXZhLm5ldC4qOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLio7CisKK3B1YmxpYyBjbGFzcyBTaXRlQm9va21hcmsgZXh0ZW5kcyBOYW1lZE1vZGVsT2JqZWN0IAorCQkJCQkJCWltcGxlbWVudHMgSVNpdGVBZGFwdGVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBfVVJMPSJwX3VybCI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX1RZUEU9InBfdHlwZSI7IC8vJE5PTi1OTFMtMSQKKwkKKwlwcml2YXRlIFVSTCB1cmw7CisJdHJhbnNpZW50IHByaXZhdGUgSVNpdGUgc2l0ZTsKKwl0cmFuc2llbnQgcHJpdmF0ZSBWZWN0b3IgY2F0YWxvZyA9IG5ldyBWZWN0b3IoKTsKKwl0cmFuc2llbnQgcHJpdmF0ZSBTaXRlQ2F0ZWdvcnkgb3RoZXJDYXRlZ29yeTsKKwlwcml2YXRlIGJvb2xlYW4gd2ViQm9va21hcms7CisJcHJpdmF0ZSBib29sZWFuIHNlbGVjdGVkOworCXByaXZhdGUgU3RyaW5nIFtdIGlnbm9yZWRDYXRlZ29yaWVzID0gbmV3IFN0cmluZ1swXTsKKwlwcml2YXRlIGJvb2xlYW4gcmVhZE9ubHkgPSBmYWxzZTsKKwlwcml2YXRlIGJvb2xlYW4gbG9jYWwgPSBmYWxzZTsKKwlwcml2YXRlIGJvb2xlYW4gdW5hdmFpbGFibGUgPSBmYWxzZTsKKwlwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKKworCXB1YmxpYyBTaXRlQm9va21hcmsoKSB7CisJfQorCQorCXB1YmxpYyBTaXRlQm9va21hcmsoU3RyaW5nIG5hbWUsIFVSTCB1cmwsIGJvb2xlYW4gd2ViQm9va21hcmspIHsKKwkJdGhpcyhuYW1lLCB1cmwsIHdlYkJvb2ttYXJrLCBmYWxzZSk7CisJfQorCQorCXB1YmxpYyBTaXRlQm9va21hcmsoU3RyaW5nIG5hbWUsIFVSTCB1cmwsIGJvb2xlYW4gd2ViQm9va21hcmssIGJvb2xlYW4gc2VsZWN0ZWQpIHsKKwkJc3VwZXIobmFtZSk7CisJCXRoaXMudXJsID0gdXJsOworCQl0aGlzLndlYkJvb2ttYXJrID0gd2ViQm9va21hcms7CisJCXRoaXMuc2VsZWN0ZWQgPSBzZWxlY3RlZDsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICBpZiAob2JqID09IHRoaXMpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgU2l0ZUJvb2ttYXJrKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgU2l0ZUJvb2ttYXJrIGIgPSAoU2l0ZUJvb2ttYXJrKW9iajsKKyAgICAgICAgaWYgKHVybCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdXJsLmVxdWFscyhiLnVybCk7CisgICAgfQorCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgaWYgKHVybCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmhhc2hDb2RlKCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiB1cmwuaGFzaENvZGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZChib29sZWFuIHNlbGVjdGVkKSB7CisJCXRoaXMuc2VsZWN0ZWQgPSBzZWxlY3RlZDsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gaXNTZWxlY3RlZCgpIHsKKwkJcmV0dXJuIHNlbGVjdGVkOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIFtdIGdldElnbm9yZWRDYXRlZ29yaWVzKCkgeworCQlyZXR1cm4gaWdub3JlZENhdGVnb3JpZXM7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldElnbm9yZWRDYXRlZ29yaWVzKFN0cmluZyBbXSBjYXRlZ29yaWVzKSB7CisJCXRoaXMuaWdub3JlZENhdGVnb3JpZXMgPSBjYXRlZ29yaWVzOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRXZWJCb29rbWFyayhib29sZWFuIHZhbHVlKSB7CisJCWlmIChpc0xvY2FsKCkpIHJldHVybjsKKwkJdGhpcy53ZWJCb29rbWFyayA9IHZhbHVlOworCQlub3RpZnlPYmplY3RDaGFuZ2VkKFBfVFlQRSk7CisJfQorCQorCXB1YmxpYyBib29sZWFuIGlzV2ViQm9va21hcmsoKSB7CisJCXJldHVybiB3ZWJCb29rbWFyazsKKwl9CisJCisJcHVibGljIFVSTCBnZXRVUkwoKSB7CisJCXJldHVybiB1cmw7CisJfQorCisKKwlwdWJsaWMgdm9pZCBzZXRVUkwoVVJMIHVybCkgeworCQl0aGlzLnVybCA9IHVybDsKKwkJc2l0ZSA9IG51bGw7CisJCW5vdGlmeU9iamVjdENoYW5nZWQoUF9VUkwpOworCX0KKwkKKwlwdWJsaWMgSVNpdGUgZ2V0U2l0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKwkJcmV0dXJuIGdldFNpdGUodHJ1ZSwgbW9uaXRvcik7CisJfQorCQorCXB1YmxpYyBJU2l0ZSBnZXRTaXRlKGJvb2xlYW4gc2hvd0RpYWxvZ0lmRmFpbGVkLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKwkJaWYgKHNpdGU9PW51bGwpIHsKKwkJCXRyeSB7CisJCQkJY29ubmVjdChtb25pdG9yKTsKKwkJCX0KKwkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCQlVcGRhdGVVSS5sb2dFeGNlcHRpb24oZSwgc2hvd0RpYWxvZ0lmRmFpbGVkKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gc2l0ZTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gaXNTaXRlQ29ubmVjdGVkKCkgeworCQlyZXR1cm4gc2l0ZSE9bnVsbDsKKwl9CisJCisJcHVibGljIHZvaWQgY29ubmVjdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJY29ubmVjdCh0cnVlLCBtb25pdG9yKTsKKwl9CisJCisJcHVibGljIHZvaWQgY29ubmVjdChib29sZWFuIHVzZUNhY2hlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCWlmIChtb25pdG9yPT1udWxsKSBtb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKKwkJCW1vbml0b3IuYmVnaW5UYXNrKCIiLCAyKTsgLy8kTk9OLU5MUy0xJAorCQkJbW9uaXRvci5zdWJUYXNrKE5MUy5iaW5kKFVwZGF0ZVVJTWVzc2FnZXMuU2l0ZUJvb2ttYXJrX2Nvbm5lY3RpbmcsIHVybC50b1N0cmluZygpKSk7CisJCQlzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZSh1cmwsIHVzZUNhY2hlLCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEpKTsKKwkJCWlmIChzaXRlIT1udWxsKSB7CisJCQkJY3JlYXRlQ2F0YWxvZyhuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEpKTsKKwkJCQl1bmF2YWlsYWJsZSA9IGZhbHNlOworCQkJfSBlbHNlIHsKKwkJCQljYXRhbG9nID0gbmV3IFZlY3RvcigpOworCQkJCXVuYXZhaWxhYmxlID0gdHJ1ZTsKKwkJCX0KKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQl1bmF2YWlsYWJsZSA9IHRydWU7CisJCQl0aHJvdyBlOworCQl9CisJfQorCQorCXB1YmxpYyBib29sZWFuIGlzVW5hdmFpbGFibGUoKSB7CisJCXJldHVybiB1bmF2YWlsYWJsZTsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0VW5hdmFpbGFibGUoYm9vbGVhbiB2YWx1ZSkgeworCQl1bmF2YWlsYWJsZSA9IHZhbHVlOworCX0KKwkKKwlwcml2YXRlIHZvaWQgY3JlYXRlQ2F0YWxvZyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKwkJY2F0YWxvZyA9IG5ldyBWZWN0b3IoKTsKKwkJb3RoZXJDYXRlZ29yeSA9IG5ldyBTaXRlQ2F0ZWdvcnkodGhpcywgbnVsbCwgbnVsbCk7CisJCS8vIEFkZCBhbGwgdGhlIGNhdGVnb3JpZXMKKwkJSUNhdGVnb3J5IFtdIGNhdGVnb3JpZXMgPSBzaXRlLmdldENhdGVnb3JpZXMoKTsKKwkJCisJCUlTaXRlRmVhdHVyZVJlZmVyZW5jZSBbXSBmZWF0dXJlUmVmczsKKwkJZmVhdHVyZVJlZnMgPSBzaXRlLmdldFJhd0ZlYXR1cmVSZWZlcmVuY2VzKCk7CisJCQorCQltb25pdG9yLmJlZ2luVGFzaygiIiwgZmVhdHVyZVJlZnMubGVuZ3RoICsgY2F0ZWdvcmllcy5sZW5ndGgpOyAvLyROT04tTkxTLTEkCisKKwkJZm9yIChpbnQgaT0wOyBpPGNhdGVnb3JpZXMubGVuZ3RoOyBpKyspIHsKKwkJCUlDYXRlZ29yeSBjYXRlZ29yeSA9IGNhdGVnb3JpZXNbaV07CisJCQlhZGRDYXRlZ29yeVRvQ2F0YWxvZyhjYXRlZ29yeSk7CisJCQltb25pdG9yLndvcmtlZCgxKTsKKwkJfQorCQkvLyBBZGQgZmVhdHVyZXMgdG8gY2F0ZWdvcmllcworCisJCWZvciAoaW50IGk9MDsgaTxmZWF0dXJlUmVmcy5sZW5ndGg7IGkrKykgeworCQkJSVNpdGVGZWF0dXJlUmVmZXJlbmNlIGZlYXR1cmVSZWYgPSBmZWF0dXJlUmVmc1tpXTsKKwkJCWFkZEZlYXR1cmVUb0NhdGFsb2coZmVhdHVyZVJlZik7CisJCQltb25pdG9yLndvcmtlZCgxKTsKKwkJfQorCQlpZiAob3RoZXJDYXRlZ29yeS5nZXRDaGlsZENvdW50KCk+MCkKKwkJICAgY2F0YWxvZy5hZGQob3RoZXJDYXRlZ29yeSk7CisJCQorCQkvLyBzZXQgdGhlIHNpdGUgZGVzY3JpcHRpb24KKwkJSVVSTEVudHJ5IGRlc2NVUkwgPSBzaXRlLmdldERlc2NyaXB0aW9uKCk7CisJCWlmIChkZXNjVVJMICE9IG51bGwpCisJCQlkZXNjcmlwdGlvbiA9IGRlc2NVUkwuZ2V0QW5ub3RhdGlvbigpOworCX0KKworCXB1YmxpYyBPYmplY3QgW10gZ2V0Q2F0YWxvZyhib29sZWFuIHdpdGhDYXRlZ29yaWVzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKwkJaWYgKHdpdGhDYXRlZ29yaWVzKQorCQkJcmV0dXJuIGNhdGFsb2cudG9BcnJheSgpOworCQllbHNlIHsKKwkJCS8vIE1ha2UgYSBmbGF0IGNhdGFsb2cKKwkJCVZlY3RvciBmbGF0Q2F0YWxvZyA9IG5ldyBWZWN0b3IoKTsKKwkJCWZvciAoaW50IGk9MDsgaTxjYXRhbG9nLnNpemUoKTsgaSsrKSB7CisJCQkJU2l0ZUNhdGVnb3J5IGNhdGVnb3J5ID0gKFNpdGVDYXRlZ29yeSljYXRhbG9nLmdldChpKTsKKwkJCQljYXRlZ29yeS5hZGRGZWF0dXJlc1RvKGZsYXRDYXRhbG9nKTsKKwkJCX0KKwkJCXJldHVybiBmbGF0Q2F0YWxvZy50b0FycmF5KCk7CisJCX0KKwl9CisJCisJcHJpdmF0ZSB2b2lkIGFkZENhdGVnb3J5VG9DYXRhbG9nKElDYXRlZ29yeSBjYXRlZ29yeSkgeworCQlTdHJpbmcgbmFtZSA9IGNhdGVnb3J5LmdldE5hbWUoKTsKKwkJaW50IGxvYyA9IG5hbWUuaW5kZXhPZignLycpOworCQlpZiAobG9jID09IC0xKSB7CisJCQkvLyBmaXJzdCBsZXZlbAorCQkJY2F0YWxvZy5hZGQobmV3IFNpdGVDYXRlZ29yeSh0aGlzLCBuYW1lLCBjYXRlZ29yeSkpOworCQl9CisJCWVsc2UgeworCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKG5hbWUpOworCQkJbmFtZSA9IHBhdGgubGFzdFNlZ21lbnQoKS50b1N0cmluZygpOworCQkJcGF0aCA9IHBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDEpOworCQkJU2l0ZUNhdGVnb3J5IHBhcmVudENhdGVnb3J5ID0gZmluZENhdGVnb3J5KHBhdGgsIGNhdGFsb2cudG9BcnJheSgpKTsKKwkJCWlmIChwYXJlbnRDYXRlZ29yeSE9bnVsbCkgeworCQkJCXBhcmVudENhdGVnb3J5LmFkZChuZXcgU2l0ZUNhdGVnb3J5KHRoaXMsIG5hbWUsIGNhdGVnb3J5KSk7CisJCQl9CisJCX0KKwl9CisJcHJpdmF0ZSB2b2lkIGFkZEZlYXR1cmVUb0NhdGFsb2coSVNpdGVGZWF0dXJlUmVmZXJlbmNlIGZlYXR1cmUpIHsKKwkJSUNhdGVnb3J5IFtdIGNhdGVnb3JpZXMgPSBmZWF0dXJlLmdldENhdGVnb3JpZXMoKTsKKwkJYm9vbGVhbiBvcnBoYW4gPSB0cnVlOworCisJCWZvciAoaW50IGk9MDsgaTxjYXRlZ29yaWVzLmxlbmd0aDsgaSsrKSB7CisJCQlJQ2F0ZWdvcnkgY2F0ZWdvcnkgPSBjYXRlZ29yaWVzW2ldOworCQkJU3RyaW5nIG5hbWUgPSBjYXRlZ29yeS5nZXROYW1lKCk7CisJCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgobmFtZSk7CisJCQlTaXRlQ2F0ZWdvcnkgcGFyZW50Q2F0ZWdvcnkgPSBmaW5kQ2F0ZWdvcnkocGF0aCwgY2F0YWxvZy50b0FycmF5KCkpOworCQkJaWYgKHBhcmVudENhdGVnb3J5IT1udWxsKSB7CisJCSAgIAkJcGFyZW50Q2F0ZWdvcnkuYWRkKG5ldyBGZWF0dXJlUmVmZXJlbmNlQWRhcHRlcihmZWF0dXJlKSk7CisJCSAgIAkJb3JwaGFuID0gZmFsc2U7CisJCQl9CisJCX0KKwkJaWYgKG9ycGhhbikKKwkJCW90aGVyQ2F0ZWdvcnkuYWRkKG5ldyBGZWF0dXJlUmVmZXJlbmNlQWRhcHRlcihmZWF0dXJlKSk7CisJfQorCQorCXByaXZhdGUgU2l0ZUNhdGVnb3J5IGZpbmRDYXRlZ29yeShJUGF0aCBwYXRoLCBPYmplY3QgW10gY2hpbGRyZW4pIHsKKwkJZm9yIChpbnQgaT0wOyBpPGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CisJCQlPYmplY3QgY2hpbGQgPSBjaGlsZHJlbltpXTsKKwkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIFNpdGVDYXRlZ29yeSkgeworCQkJCVNpdGVDYXRlZ29yeSBzYyA9IChTaXRlQ2F0ZWdvcnkpY2hpbGQ7CisJCQkJaWYgKHNjLmdldE5hbWUoKS5lcXVhbHMocGF0aC5zZWdtZW50KDApKSkgeworCQkJCSAgIGlmIChwYXRoLnNlZ21lbnRDb3VudCgpPT0xKSByZXR1cm4gc2M7CisJCQkJCWVsc2UgeworCQkJCQkJcGF0aCA9IHBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cygxKTsKKwkJCQkJCXJldHVybiBmaW5kQ2F0ZWdvcnkocGF0aCwgc2MuZ2V0Q2hpbGRyZW4oKSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCQorCS8qKgorCSAqIEBzZWUgSVNpdGVBZGFwdGVyI2dldExhYmVsKCkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgeworCQlyZXR1cm4gZ2V0TmFtZSgpOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRSZWFkT25seShib29sZWFuIHJlYWRPbmx5KSB7CisJCXRoaXMucmVhZE9ubHkgPSByZWFkT25seTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpIHsKKwkJcmV0dXJuIHJlYWRPbmx5OworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRMb2NhbChib29sZWFuIGxvY2FsKSB7CisJCXRoaXMubG9jYWwgPSBsb2NhbDsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gaXNMb2NhbCgpIHsKKwkJcmV0dXJuIGxvY2FsOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBkZXNjcmlwdGlvbiBUaGUgZGVzY3JpcHRpb24gdG8gc2V0LgorCSAqLworCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgeworCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisJfQorCisJLyoqCisJICogQHJldHVybiBSZXR1cm5zIHRoZSBkZXNjcmlwdGlvbi4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworCQlpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCAmJiBpc1NpdGVDb25uZWN0ZWQoKSkgeworCQkJSVVSTEVudHJ5IGRlc2NVUkwgPSBzaXRlLmdldERlc2NyaXB0aW9uKCk7CisJCQlpZiAoZGVzY1VSTCAhPSBudWxsKQorCQkJCWRlc2NyaXB0aW9uID0gZGVzY1VSTC5nZXRBbm5vdGF0aW9uKCk7CisJCX0KKwkJcmV0dXJuIGRlc2NyaXB0aW9uOworCX0KK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9TaXRlQ2F0ZWdvcnkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9TaXRlQ2F0ZWdvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTNiMDk0Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL1NpdGVDYXRlZ29yeS5qYXZhCkBAIC0wLDAgKzEsMjAzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZUNvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JQ2F0ZWdvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmVSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVVSTEVudHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLk1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSU1lc3NhZ2VzOworCitwdWJsaWMgY2xhc3MgU2l0ZUNhdGVnb3J5IGV4dGVuZHMgVUlNb2RlbE9iamVjdCB7CisKKwlWZWN0b3IgY2hpbGRyZW47CisJcHJpdmF0ZSBJQ2F0ZWdvcnkgY2F0ZWdvcnk7CisJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKwlwcml2YXRlIGJvb2xlYW4gdG91Y2hlZDsKKwlwcml2YXRlIGludCBmZWF0dXJlQ291bnQ7CisJcHJpdmF0ZSBib29sZWFuIGNhbmNlbGVkOworCXByaXZhdGUgU2l0ZUJvb2ttYXJrIGJvb2ttYXJrOworCisJY2xhc3MgT3RoZXJDYXRlZ29yeSBpbXBsZW1lbnRzIElDYXRlZ29yeSB7CisJCUlVUkxFbnRyeSBlbnRyeTsKKwkJcHVibGljIE90aGVyQ2F0ZWdvcnkoKSB7CisJCQllbnRyeSA9IG5ldyBJVVJMRW50cnkoKSB7CisJCQkJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uKCkgeworCQkJCQlyZXR1cm4gTWVzc2FnZXMuU2l0ZUNhdGVnb3J5X290aGVyX2Rlc2NyaXB0aW9uOyAKKwkJCQl9CisJCQkJcHVibGljIFVSTCBnZXRVUkwoKSB7CisJCQkJCXJldHVybiBudWxsOworCQkJCX0KKwkJCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgY2xhenopIHsKKwkJCQkJcmV0dXJuIG51bGw7CisJCQkJfQorCQkJCXB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKKwkJCQkJcmV0dXJuIElVUkxFbnRyeS5VUERBVEVfU0lURTsKKwkJCQl9CisJCQl9OworCQl9CisJCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJCXJldHVybiBTaXRlQ2F0ZWdvcnkudGhpcy5nZXROYW1lKCk7CisJCX0KKwkJcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKKwkJCXJldHVybiBTaXRlQ2F0ZWdvcnkudGhpcy5nZXROYW1lKCk7CisJCX0KKwkJcHVibGljIElVUkxFbnRyeSBnZXREZXNjcmlwdGlvbigpIHsKKwkJCXJldHVybiBlbnRyeTsKKwkJfQorCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgY2xhenopIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJfQorCisJcHVibGljIFNpdGVDYXRlZ29yeShTaXRlQm9va21hcmsgYm9va21hcmssIFN0cmluZyBuYW1lLCBJQ2F0ZWdvcnkgY2F0ZWdvcnkpIHsKKwkJdGhpcy5ib29rbWFyayA9IGJvb2ttYXJrOworCQlpZiAoY2F0ZWdvcnkgPT0gbnVsbCkgeworCQkJdGhpcy5uYW1lID0gTWVzc2FnZXMuU2l0ZUNhdGVnb3J5X290aGVyX2xhYmVsOyAKKwkJCXRoaXMuY2F0ZWdvcnkgPSBuZXcgT3RoZXJDYXRlZ29yeSgpOworCQl9IGVsc2UgeworCQkJdGhpcy5uYW1lID0gbmFtZTsKKwkJCXRoaXMuY2F0ZWdvcnkgPSBjYXRlZ29yeTsKKwkJfQorCQljaGlsZHJlbiA9IG5ldyBWZWN0b3IoKTsKKwl9CisJCisJcHVibGljIFNpdGVCb29rbWFyayBnZXRCb29rbWFyaygpIHsKKwkJcmV0dXJuIGJvb2ttYXJrOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzT3RoZXJDYXRlZ29yeSgpIHsKKwkJcmV0dXJuIGNhdGVnb3J5IGluc3RhbmNlb2YgT3RoZXJDYXRlZ29yeTsKKwl9CisKKwlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oKSB7CisJCXJldHVybiBjYW5jZWxlZCA/IG5ldyBPYmplY3RbMF0gOiBjaGlsZHJlbi50b0FycmF5KCk7CisJfQorCisJcHVibGljIGludCBnZXRDaGlsZENvdW50KCkgeworCQlyZXR1cm4gY2FuY2VsZWQgPyAwIDogY2hpbGRyZW4uc2l6ZSgpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIG5hbWU7CisJfQorCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbE5hbWUoKSB7CisJCXJldHVybiBjYXRlZ29yeS5nZXROYW1lKCk7CisJfQorCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuIGNhdGVnb3J5LmdldExhYmVsKCk7CisJfQorCisJcHVibGljIElDYXRlZ29yeSBnZXRDYXRlZ29yeSgpIHsKKwkJcmV0dXJuIGNhdGVnb3J5OworCX0KKworCXZvaWQgYWRkKE9iamVjdCBjaGlsZCkgeworCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBJRmVhdHVyZUFkYXB0ZXIpCisJCQlmZWF0dXJlQ291bnQrKzsKKwkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0b3VjaEZlYXR1cmVzKElSdW5uYWJsZUNvbnRleHQgY29udGV4dCkgeworCQlpZiAoY2hpbGRyZW4uc2l6ZSgpID09IDAgfHwgdG91Y2hlZCB8fCBmZWF0dXJlQ291bnQgPT0gMCkKKwkJCXJldHVybjsKKworCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3Mgb3AgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgeworCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgeworCQkJCW1vbml0b3IuYmVnaW5UYXNrKAorCQkJCQlVcGRhdGVVSU1lc3NhZ2VzLlNpdGVCb29rbWFya19kb3dubG9hZGluZywgCisJCQkJCWZlYXR1cmVDb3VudCk7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5zaXplKCk7IGkrKykgeworCQkJCQlPYmplY3QgY2hpbGQgPSBjaGlsZHJlbi5nZXQoaSk7CisJCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKKwkJCQkJCWJyZWFrOworCQkJCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBJRmVhdHVyZUFkYXB0ZXIpIHsKKwkJCQkJCUlGZWF0dXJlQWRhcHRlciBhZGFwdGVyID0gKElGZWF0dXJlQWRhcHRlcikgY2hpbGQ7CisJCQkJCQltb25pdG9yLnN1YlRhc2soYWRhcHRlci5nZXRGYXN0TGFiZWwoKSk7CisJCQkJCQl0cnkgeworCQkJCQkJCWFkYXB0ZXIuZ2V0RmVhdHVyZSgKKwkJCQkJCQkJbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxKSk7CisJCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQltb25pdG9yLmRvbmUoKTsKKwkJCX0KKwkJfTsKKworCQl0cnkgeworCQkJY29udGV4dC5ydW4odHJ1ZSwgdHJ1ZSwgb3ApOworCQkJdG91Y2hlZCA9IHRydWU7CisJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKwkJCWNhbmNlbGVkID0gdHJ1ZTsKKwkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7CisJCX0KKwl9CisKKwlwdWJsaWMgdm9pZCBhZGRGZWF0dXJlc1RvKFZlY3RvciBmbGF0TGlzdCkgeworCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLnNpemUoKTsgaSsrKSB7CisJCQlPYmplY3QgY2hpbGQgPSBjaGlsZHJlbi5nZXQoaSk7CisJCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBGZWF0dXJlUmVmZXJlbmNlQWRhcHRlcikgeworCQkJCUZlYXR1cmVSZWZlcmVuY2VBZGFwdGVyIGNmZWF0dXJlID0KKwkJCQkJKEZlYXR1cmVSZWZlcmVuY2VBZGFwdGVyKSBjaGlsZDsKKwkJCQkvLyBEb24ndCBhZGQgZHVwbGljYXRlcyAtIHRoZXJlIG1heSBiZSB0aGUgc2FtZQorCQkJCS8vIGZlYXR1cmUgcHJlc2VudCBpbiBzZXZlcmFsIGNhdGVnb3JpZXMKKwkJCQlpZiAoZmluZEZlYXR1cmUoZmxhdExpc3QsIGNmZWF0dXJlLmdldEZlYXR1cmVSZWZlcmVuY2UoKSkKKwkJCQkJPT0gbnVsbCkgeworCQkJCQlmbGF0TGlzdC5hZGQoY2hpbGQpOworCQkJCX0KKwkJCX0gZWxzZSBpZiAoY2hpbGQgaW5zdGFuY2VvZiBTaXRlQ2F0ZWdvcnkpIHsKKwkJCQkoKFNpdGVDYXRlZ29yeSkgY2hpbGQpLmFkZEZlYXR1cmVzVG8oZmxhdExpc3QpOworCQkJfQorCQl9CisJfQorCisJcHJpdmF0ZSBGZWF0dXJlUmVmZXJlbmNlQWRhcHRlciBmaW5kRmVhdHVyZSgKKwkJVmVjdG9yIGZsYXRMaXN0LAorCQlJRmVhdHVyZVJlZmVyZW5jZSBmZWF0dXJlUmVmKSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgZmxhdExpc3Quc2l6ZSgpOyBpKyspIHsKKwkJCUZlYXR1cmVSZWZlcmVuY2VBZGFwdGVyIGNmZWF0dXJlID0KKwkJCQkoRmVhdHVyZVJlZmVyZW5jZUFkYXB0ZXIpIGZsYXRMaXN0LmdldChpKTsKKwkJCWlmIChjZmVhdHVyZS5nZXRGZWF0dXJlUmVmZXJlbmNlKCkuZXF1YWxzKGZlYXR1cmVSZWYpKQorCQkJCXJldHVybiBjZmVhdHVyZTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCkgeworCisJCWlmICggKG9iamVjdCA9PSBudWxsKSB8fCAhKCBvYmplY3QgaW5zdGFuY2VvZiBTaXRlQ2F0ZWdvcnkpKQorCQkJcmV0dXJuIGZhbHNlOworCQkKKwkJaWYgKCB0aGlzID09IG9iamVjdCkKKwkJCXJldHVybiB0cnVlOworCQkKKwkJcmV0dXJuIGdldE5hbWUoKS5lcXVhbHMoKChTaXRlQ2F0ZWdvcnkpb2JqZWN0KS5nZXROYW1lKCkpICYmIGJvb2ttYXJrLmVxdWFscygoKFNpdGVDYXRlZ29yeSlvYmplY3QpLmdldEJvb2ttYXJrKCkpOworCisJfQorCisJcHVibGljIGludCBoYXNoQ29kZSgpIHsKKworCQlyZXR1cm4gZ2V0TmFtZSgpLmhhc2hDb2RlKCkgKiAoIChib29rbWFyayA9PSBudWxsKT8gMTogYm9va21hcmsuaGFzaENvZGUoKSk7CisJfQorCQorCQorfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL1VJTW9kZWxPYmplY3QuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9VSU1vZGVsT2JqZWN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg3NDk3OAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9VSU1vZGVsT2JqZWN0LmphdmEKQEAgLTAsMCArMSw1NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuKjsKKworCitwdWJsaWMgY2xhc3MgVUlNb2RlbE9iamVjdCBleHRlbmRzIFBsYXRmb3JtT2JqZWN0IGltcGxlbWVudHMgSVdvcmtiZW5jaEFkYXB0ZXIgeworCVVwZGF0ZU1vZGVsIG1vZGVsOworCQorCXB1YmxpYyB2b2lkIHNldE1vZGVsKFVwZGF0ZU1vZGVsIG1vZGVsKSB7CisJCXRoaXMubW9kZWwgPSBtb2RlbDsKKwl9CisJCisJcHVibGljIFVwZGF0ZU1vZGVsIGdldE1vZGVsKCkgeworCQlyZXR1cm4gbW9kZWw7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIG5vdGlmeU9iamVjdENoYW5nZWQoU3RyaW5nIHByb3BlcnR5KSB7CisJCWlmIChtb2RlbD09bnVsbCkgcmV0dXJuOworCQltb2RlbC5maXJlT2JqZWN0Q2hhbmdlZCh0aGlzLCBwcm9wZXJ0eSk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIG5vdGlmeU9iamVjdHNBZGRlZChPYmplY3QgcGFyZW50LCBPYmplY3QgW10gb2JqZWN0cykgeworCQlpZiAobW9kZWw9PW51bGwpIHJldHVybjsKKwkJbW9kZWwuZmlyZU9iamVjdHNBZGRlZChwYXJlbnQsIG9iamVjdHMpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBub3RpZnlPYmplY3RzUmVtb3ZlZChPYmplY3QgcGFyZW50LCBPYmplY3QgW10gb2JqZWN0cykgeworCQlpZiAobW9kZWw9PW51bGwpIHJldHVybjsKKwkJbW9kZWwuZmlyZU9iamVjdHNSZW1vdmVkKHBhcmVudCwgb2JqZWN0cyk7CisJfQorCQorCXB1YmxpYyBPYmplY3QgW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iaikgeworCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKKwl9CisJCisJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iaikgeworCQlyZXR1cm4gbnVsbDsKKwl9CisJcHVibGljIFN0cmluZyBnZXRMYWJlbChPYmplY3Qgb2JqKSB7CisJCXJldHVybiB0b1N0cmluZygpOworCX0KKwlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihPYmplY3Qgb2JqKSB7CisJCXJldHVybiBudWxsOworCX0KK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9VcGRhdGVNb2RlbC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL1VwZGF0ZU1vZGVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM1OTFiNwotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9VcGRhdGVNb2RlbC5qYXZhCkBAIC0wLDAgKzEsMTIyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsOworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEubmV0Lio7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuKjsKKworcHVibGljIGNsYXNzIFVwZGF0ZU1vZGVsIGltcGxlbWVudHMgSUFkYXB0YWJsZSB7CisJcHJpdmF0ZSBWZWN0b3IgYm9va21hcmtzID0gbmV3IFZlY3RvcigpOworCXByaXZhdGUgVmVjdG9yIGxpc3RlbmVycyA9IG5ldyBWZWN0b3IoKTsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQk9PS01BUktfRklMRSA9ICJib29rbWFya3MueG1sIjsgLy8kTk9OLU5MUy0xJAorCQorCXB1YmxpYyBVcGRhdGVNb2RlbCgpIHsKKwkJcmVzZXQoKTsKKwl9CisJCisJcHVibGljIHZvaWQgcmVzZXQoKSB7CisJCS8vIGxvYWQgYm9va21hcmtzCisJCWJvb2ttYXJrcy5jbGVhcigpOworCQlCb29rbWFya1V0aWwucGFyc2UoZ2V0Qm9va21hcmtzRmlsZU5hbWUoKSwgYm9va21hcmtzKTsKKwl9CisJCisJcHJpdmF0ZSBTdHJpbmcgZ2V0Qm9va21hcmtzRmlsZU5hbWUoKSB7CisJCVVSTCBwbGF0Zm9ybVhNTCA9IENvbmZpZ3VyYXRvclV0aWxzLmdldEN1cnJlbnRQbGF0Zm9ybUNvbmZpZ3VyYXRpb24oKS5nZXRDb25maWd1cmF0aW9uTG9jYXRpb24oKTsKKwkJaWYgKCEiZmlsZSIuZXF1YWxzKHBsYXRmb3JtWE1MLmdldFByb3RvY29sKCkpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCUlQYXRoIHBhdGggPSBVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0U3RhdGVMb2NhdGlvbigpOworCQkJcGF0aCA9IHBhdGguYXBwZW5kKEJPT0tNQVJLX0ZJTEUpOworCQkJcmV0dXJuIHBhdGgudG9PU1N0cmluZygpOworCQl9IGVsc2UgeworCQkJRmlsZSBmID0gbmV3IEZpbGUocGxhdGZvcm1YTUwuZ2V0RmlsZSgpKTsKKwkJCWYgPSBuZXcgRmlsZShmLmdldFBhcmVudEZpbGUoKSwgQk9PS01BUktfRklMRSk7CisJCQlyZXR1cm4gZi5nZXRBYnNvbHV0ZVBhdGgoKTsKKwkJfQorCX0KKwkKKwlwdWJsaWMgdm9pZCBzaHV0ZG93bigpIHsKKwkJc2F2ZUJvb2ttYXJrcygpOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzYXZlQm9va21hcmtzKCkgeworCQlCb29rbWFya1V0aWwuc3RvcmUoZ2V0Qm9va21hcmtzRmlsZU5hbWUoKSwgYm9va21hcmtzKTsKKwl9CisJCisJCisJcHVibGljIHZvaWQgYWRkQm9va21hcmsoTmFtZWRNb2RlbE9iamVjdCBib29rbWFyaykgeworCQlib29rbWFya3MuYWRkKGJvb2ttYXJrKTsKKwkJYm9va21hcmsuc2V0TW9kZWwodGhpcyk7CisJCWZpcmVPYmplY3RzQWRkZWQobnVsbCwgbmV3IE9iamVjdCBbXXtib29rbWFya30pOworCX0KKwkKKwlwdWJsaWMgdm9pZCByZW1vdmVCb29rbWFyayhOYW1lZE1vZGVsT2JqZWN0IGJvb2ttYXJrKSB7CisJCWJvb2ttYXJrcy5yZW1vdmUoYm9va21hcmspOworCQlib29rbWFyay5zZXRNb2RlbChudWxsKTsKKwkJZmlyZU9iamVjdHNSZW1vdmVkKG51bGwsIG5ldyBPYmplY3QgW117Ym9va21hcmt9KTsKKwl9CisJCisJcHVibGljIE5hbWVkTW9kZWxPYmplY3QgW10gZ2V0Qm9va21hcmtzKCkgeworCQlyZXR1cm4gKE5hbWVkTW9kZWxPYmplY3RbXSlib29rbWFya3MudG9BcnJheShuZXcgTmFtZWRNb2RlbE9iamVjdFtib29rbWFya3Muc2l6ZSgpXSk7CisJfQorCQorCXB1YmxpYyBTaXRlQm9va21hcmsgW10gZ2V0Qm9va21hcmtMZWFmcygpIHsKKwkJcmV0dXJuIEJvb2ttYXJrVXRpbC5nZXRCb29rbWFya3MoYm9va21hcmtzKTsKKwl9CisJCisJcHVibGljIEJvb2ttYXJrRm9sZGVyIGdldEZvbGRlcihJUGF0aCBwYXRoKSB7CisJCXJldHVybiBCb29rbWFya1V0aWwuZ2V0Rm9sZGVyKGJvb2ttYXJrcywgcGF0aCk7CisJfQorCQorCXB1YmxpYyB2b2lkIGFkZFVwZGF0ZU1vZGVsQ2hhbmdlZExpc3RlbmVyKElVcGRhdGVNb2RlbENoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgeworCQlpZiAoIWxpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpIAorCQkgICBsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKKwl9CisKKworCXB1YmxpYyB2b2lkIHJlbW92ZVVwZGF0ZU1vZGVsQ2hhbmdlZExpc3RlbmVyKElVcGRhdGVNb2RlbENoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgeworCQlpZiAobGlzdGVuZXJzLmNvbnRhaW5zKGxpc3RlbmVyKSkKKwkJCWxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOworCX0KKwkKKwlwdWJsaWMgdm9pZCBmaXJlT2JqZWN0c0FkZGVkKE9iamVjdCBwYXJlbnQsIE9iamVjdCBbXSBjaGlsZHJlbikgeworCQlmb3IgKEl0ZXJhdG9yIGl0ZXI9bGlzdGVuZXJzLml0ZXJhdG9yKCk7CisJCQkJaXRlci5oYXNOZXh0KCk7KSB7CisJCQlJVXBkYXRlTW9kZWxDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIgPSAoSVVwZGF0ZU1vZGVsQ2hhbmdlZExpc3RlbmVyKWl0ZXIubmV4dCgpOworCQkJbGlzdGVuZXIub2JqZWN0c0FkZGVkKHBhcmVudCwgY2hpbGRyZW4pOworCQl9CisJfQorCisKKwlwdWJsaWMgdm9pZCBmaXJlT2JqZWN0c1JlbW92ZWQoT2JqZWN0IHBhcmVudCwgT2JqZWN0IFtdIGNoaWxkcmVuKSB7CisJCWZvciAoSXRlcmF0b3IgaXRlcj1saXN0ZW5lcnMuaXRlcmF0b3IoKTsKKwkJCQlpdGVyLmhhc05leHQoKTspIHsKKwkJCUlVcGRhdGVNb2RlbENoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lciA9IChJVXBkYXRlTW9kZWxDaGFuZ2VkTGlzdGVuZXIpaXRlci5uZXh0KCk7CisJCQlsaXN0ZW5lci5vYmplY3RzUmVtb3ZlZChwYXJlbnQsIGNoaWxkcmVuKTsKKwkJfQorCX0KKwkKKwlwdWJsaWMgdm9pZCBmaXJlT2JqZWN0Q2hhbmdlZChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpIHsKKwkJZm9yIChJdGVyYXRvciBpdGVyPWxpc3RlbmVycy5pdGVyYXRvcigpOworCQkJaXRlci5oYXNOZXh0KCk7KSB7CisJCQlJVXBkYXRlTW9kZWxDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIgPSAoSVVwZGF0ZU1vZGVsQ2hhbmdlZExpc3RlbmVyKWl0ZXIubmV4dCgpOworCQkJbGlzdGVuZXIub2JqZWN0Q2hhbmdlZChvYmplY3QsIHByb3BlcnR5KTsKKwkJfQorCX0KKwlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3Mga2V5KSB7CisJCXJldHVybiBudWxsOworCX0KK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wYXJ0cy9BYnN0cmFjdE92ZXJsYXlJY29uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcGFydHMvQWJzdHJhY3RPdmVybGF5SWNvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyZTUwYjkKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcGFydHMvQWJzdHJhY3RPdmVybGF5SWNvbi5qYXZhCkBAIC0wLDAgKzEsMTE1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnBhcnRzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKKworLyoqCisgKiBBbiBPdmVybGF5SWNvbiBjb25zaXN0cyBvZiBhIG1haW4gaWNvbiBhbmQgc2V2ZXJhbCBhZG9ybm1lbnRzLgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RPdmVybGF5SWNvbiBleHRlbmRzIENvbXBvc2l0ZUltYWdlRGVzY3JpcHRvciB7CisKKwlzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfV0lEVEggPSAxNjsKKwlzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfSEVJR0hUID0gMTY7CisKKwlwcml2YXRlIFBvaW50IGZTaXplID0gbnVsbDsKKworCXByaXZhdGUgSW1hZ2VEZXNjcmlwdG9yIGZPdmVybGF5c1tdW107CisKKwlwdWJsaWMgQWJzdHJhY3RPdmVybGF5SWNvbihJbWFnZURlc2NyaXB0b3JbXVtdIG92ZXJsYXlzKSB7CisJCXRoaXMob3ZlcmxheXMsIG51bGwpOworCX0KKworCXB1YmxpYyBBYnN0cmFjdE92ZXJsYXlJY29uKEltYWdlRGVzY3JpcHRvcltdW10gb3ZlcmxheXMsIFBvaW50IHNpemUpIHsKKwkJZk92ZXJsYXlzID0gb3ZlcmxheXM7CisJCWlmIChzaXplICE9IG51bGwpCisJCQlmU2l6ZSA9IHNpemU7CisJCWVsc2UKKwkJCWZTaXplID0gbmV3IFBvaW50KERFRkFVTFRfV0lEVEgsIERFRkFVTFRfSEVJR0hUKTsKKwl9CisJcHJvdGVjdGVkIHZvaWQgZHJhd0JvdHRvbUxlZnQoSW1hZ2VEZXNjcmlwdG9yW10gb3ZlcmxheXMpIHsKKwkJaWYgKG92ZXJsYXlzID09IG51bGwpCisJCQlyZXR1cm47CisJCWludCBsZW5ndGggPSBvdmVybGF5cy5sZW5ndGg7CisJCWludCB4ID0gMDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJCWlmIChpIDwgbGVuZ3RoICYmIG92ZXJsYXlzW2ldICE9IG51bGwpIHsKKwkJCQlJbWFnZURhdGEgaWQgPSBvdmVybGF5c1tpXS5nZXRJbWFnZURhdGEoKTsKKwkJCQlkcmF3SW1hZ2UoaWQsIHgsIGdldFNpemUoKS55IC0gaWQuaGVpZ2h0KTsKKwkJCQl4ICs9IGlkLndpZHRoOworCQkJfQorCQl9CisJfQorCXByb3RlY3RlZCB2b2lkIGRyYXdCb3R0b21SaWdodChJbWFnZURlc2NyaXB0b3JbXSBvdmVybGF5cykgeworCQlpZiAob3ZlcmxheXMgPT0gbnVsbCkKKwkJCXJldHVybjsKKwkJaW50IGxlbmd0aCA9IG92ZXJsYXlzLmxlbmd0aDsKKwkJaW50IHggPSBnZXRTaXplKCkueDsKKwkJZm9yIChpbnQgaSA9IDI7IGkgPj0gMDsgaS0tKSB7CisJCQlpZiAoaSA8IGxlbmd0aCAmJiBvdmVybGF5c1tpXSAhPSBudWxsKSB7CisJCQkJSW1hZ2VEYXRhIGlkID0gb3ZlcmxheXNbaV0uZ2V0SW1hZ2VEYXRhKCk7CisJCQkJeCAtPSBpZC53aWR0aDsKKwkJCQlkcmF3SW1hZ2UoaWQsIHgsIGdldFNpemUoKS55IC0gaWQuaGVpZ2h0KTsKKwkJCX0KKwkJfQorCX0KKworCXByb3RlY3RlZCBhYnN0cmFjdCBJbWFnZURhdGEgZ2V0QmFzZUltYWdlRGF0YSgpOworCisJcHJvdGVjdGVkIHZvaWQgZHJhd0NvbXBvc2l0ZUltYWdlKGludCB3aWR0aCwgaW50IGhlaWdodCkgeworCQlJbWFnZURhdGEgYmFzZSA9IGdldEJhc2VJbWFnZURhdGEoKTsKKwkJZHJhd0ltYWdlKGJhc2UsIDAsIDApOworCQlpZiAoZk92ZXJsYXlzICE9IG51bGwpIHsKKwkJCWlmIChmT3ZlcmxheXMubGVuZ3RoID4gMCkKKwkJCQlkcmF3VG9wUmlnaHQoZk92ZXJsYXlzWzBdKTsKKworCQkJaWYgKGZPdmVybGF5cy5sZW5ndGggPiAxKQorCQkJCWRyYXdCb3R0b21SaWdodChmT3ZlcmxheXNbMV0pOworCisJCQlpZiAoZk92ZXJsYXlzLmxlbmd0aCA+IDIpCisJCQkJZHJhd0JvdHRvbUxlZnQoZk92ZXJsYXlzWzJdKTsKKworCQkJaWYgKGZPdmVybGF5cy5sZW5ndGggPiAzKQorCQkJCWRyYXdUb3BMZWZ0KGZPdmVybGF5c1szXSk7CisJCX0KKwl9CisJcHJvdGVjdGVkIHZvaWQgZHJhd1RvcExlZnQoSW1hZ2VEZXNjcmlwdG9yW10gb3ZlcmxheXMpIHsKKwkJaWYgKG92ZXJsYXlzID09IG51bGwpCisJCQlyZXR1cm47CisJCWludCBsZW5ndGggPSBvdmVybGF5cy5sZW5ndGg7CisJCWludCB4ID0gMDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJCWlmIChpIDwgbGVuZ3RoICYmIG92ZXJsYXlzW2ldICE9IG51bGwpIHsKKwkJCQlJbWFnZURhdGEgaWQgPSBvdmVybGF5c1tpXS5nZXRJbWFnZURhdGEoKTsKKwkJCQlkcmF3SW1hZ2UoaWQsIHgsIDApOworCQkJCXggKz0gaWQud2lkdGg7CisJCQl9CisJCX0KKwl9CisJcHJvdGVjdGVkIHZvaWQgZHJhd1RvcFJpZ2h0KEltYWdlRGVzY3JpcHRvcltdIG92ZXJsYXlzKSB7CisJCWlmIChvdmVybGF5cyA9PSBudWxsKQorCQkJcmV0dXJuOworCQlpbnQgbGVuZ3RoID0gb3ZlcmxheXMubGVuZ3RoOworCQlpbnQgeCA9IGdldFNpemUoKS54OworCQlmb3IgKGludCBpID0gMjsgaSA+PSAwOyBpLS0pIHsKKwkJCWlmIChpIDwgbGVuZ3RoICYmIG92ZXJsYXlzW2ldICE9IG51bGwpIHsKKwkJCQlJbWFnZURhdGEgaWQgPSBvdmVybGF5c1tpXS5nZXRJbWFnZURhdGEoKTsKKwkJCQl4IC09IGlkLndpZHRoOworCQkJCWRyYXdJbWFnZShpZCwgeCwgMCk7CisJCQl9CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgUG9pbnQgZ2V0U2l6ZSgpIHsKKwkJcmV0dXJuIGZTaXplOworCX0KK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wYXJ0cy9EZWZhdWx0Q29udGVudFByb3ZpZGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcGFydHMvRGVmYXVsdENvbnRlbnRQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMWMxZjMKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcGFydHMvRGVmYXVsdENvbnRlbnRQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMjIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkucGFydHM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLio7CisKK3B1YmxpYyBjbGFzcyBEZWZhdWx0Q29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSUNvbnRlbnRQcm92aWRlciB7CisKK3B1YmxpYyBEZWZhdWx0Q29udGVudFByb3ZpZGVyKCkgeworCXN1cGVyKCk7Cit9CitwdWJsaWMgdm9pZCBkaXNwb3NlKCkge30KK3B1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkge30KK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wYXJ0cy9JbWFnZU92ZXJsYXlJY29uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcGFydHMvSW1hZ2VPdmVybGF5SWNvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4NzkxOGIKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcGFydHMvSW1hZ2VPdmVybGF5SWNvbi5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkucGFydHM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOworCisvKioKKyAqIEFuIE92ZXJsYXlJY29uIGNvbnNpc3RzIG9mIGEgbWFpbiBpY29uIGFuZCBzZXZlcmFsIGFkb3JubWVudHMuCisgKi8KK3B1YmxpYyBjbGFzcyBJbWFnZU92ZXJsYXlJY29uIGV4dGVuZHMgQWJzdHJhY3RPdmVybGF5SWNvbiB7CisJcHJpdmF0ZSBJbWFnZSBiYXNlOworCisJcHVibGljIEltYWdlT3ZlcmxheUljb24oSW1hZ2UgYmFzZSwgSW1hZ2VEZXNjcmlwdG9yW11bXSBvdmVybGF5cykgeworCQl0aGlzKGJhc2UsIG92ZXJsYXlzLCBudWxsKTsKKwl9CisJCisJcHVibGljIEltYWdlT3ZlcmxheUljb24oSW1hZ2UgYmFzZSwgSW1hZ2VEZXNjcmlwdG9yW11bXSBvdmVybGF5cywgUG9pbnQgc2l6ZSkgeworCQlzdXBlcihvdmVybGF5cywgc2l6ZSk7CisJCXRoaXMuYmFzZSA9IGJhc2U7CisJfQorCQorCXByb3RlY3RlZCBJbWFnZURhdGEgZ2V0QmFzZUltYWdlRGF0YSgpIHsKKwkJcmV0dXJuIGJhc2UuZ2V0SW1hZ2VEYXRhKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3BhcnRzL092ZXJsYXlJY29uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcGFydHMvT3ZlcmxheUljb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjA1YjljCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3BhcnRzL092ZXJsYXlJY29uLmphdmEKQEAgLTAsMCArMSwxMTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkucGFydHM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOworCisvKioKKyAqIEFuIE92ZXJsYXlJY29uIGNvbnNpc3RzIG9mIGEgbWFpbiBpY29uIGFuZCBzZXZlcmFsIGFkb3JubWVudHMuCisgKi8KK3B1YmxpYyBjbGFzcyBPdmVybGF5SWNvbiBleHRlbmRzIENvbXBvc2l0ZUltYWdlRGVzY3JpcHRvciB7CisJCisJc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1dJRFRIPSAxNjsKKwlzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfSEVJR0hUPSAxNjsKKwkKKwlwcml2YXRlIFBvaW50IGZTaXplPSBudWxsOworCQkKKwlwcml2YXRlIEltYWdlRGVzY3JpcHRvciBmQmFzZTsKKwlwcml2YXRlIEltYWdlRGVzY3JpcHRvciBmT3ZlcmxheXNbXVtdOworCisJcHVibGljIE92ZXJsYXlJY29uKEltYWdlRGVzY3JpcHRvciBiYXNlLCBJbWFnZURlc2NyaXB0b3JbXVtdIG92ZXJsYXlzKSB7CisJCWZCYXNlPSBiYXNlOworCQlpZiAoZkJhc2UgPT0gbnVsbCkKKwkJCWZCYXNlPSBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpOworCQlmT3ZlcmxheXM9IG92ZXJsYXlzOworCQlmU2l6ZT0gbmV3IFBvaW50KERFRkFVTFRfV0lEVEgsIERFRkFVTFRfSEVJR0hUKTsKKwl9CisJcHVibGljIE92ZXJsYXlJY29uKEltYWdlRGVzY3JpcHRvciBiYXNlLCBJbWFnZURlc2NyaXB0b3JbXVtdIG92ZXJsYXlzLCBQb2ludCBzaXplKSB7CisJCWZCYXNlPSBiYXNlOworCQlpZiAoZkJhc2UgPT0gbnVsbCkKKwkJCWZCYXNlPSBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpOworCQlmT3ZlcmxheXM9IG92ZXJsYXlzOworCQlmU2l6ZT0gc2l6ZTsKKwl9CisJcHJvdGVjdGVkIHZvaWQgZHJhd0JvdHRvbUxlZnQoSW1hZ2VEZXNjcmlwdG9yW10gb3ZlcmxheXMpIHsKKwkJaWYgKG92ZXJsYXlzID09IG51bGwpCisJCQlyZXR1cm47CisJCWludCBsZW5ndGg9IG92ZXJsYXlzLmxlbmd0aDsKKwkJaW50IHg9IDA7CisJCWZvciAoaW50IGk9IDA7IGkgPCAzOyBpKyspIHsKKwkJCWlmIChpIDwgbGVuZ3RoICYmIG92ZXJsYXlzW2ldICE9IG51bGwpIHsKKwkJCQlJbWFnZURhdGEgaWQ9IG92ZXJsYXlzW2ldLmdldEltYWdlRGF0YSgpOworCQkJCWRyYXdJbWFnZShpZCwgeCwgZ2V0U2l6ZSgpLnktaWQuaGVpZ2h0KTsKKwkJCQl4Kz0gaWQud2lkdGg7CisJCQl9CisJCX0KKwl9CisJcHJvdGVjdGVkIHZvaWQgZHJhd0JvdHRvbVJpZ2h0KEltYWdlRGVzY3JpcHRvcltdIG92ZXJsYXlzKSB7CisJCWlmIChvdmVybGF5cyA9PSBudWxsKQorCQkJcmV0dXJuOworCQlpbnQgbGVuZ3RoPSBvdmVybGF5cy5sZW5ndGg7CisJCWludCB4PSBnZXRTaXplKCkueDsKKwkJZm9yIChpbnQgaT0gMjsgaSA+PSAwOyBpLS0pIHsKKwkJCWlmIChpIDwgbGVuZ3RoICYmIG92ZXJsYXlzW2ldICE9IG51bGwpIHsKKwkJCQlJbWFnZURhdGEgaWQ9IG92ZXJsYXlzW2ldLmdldEltYWdlRGF0YSgpOworCQkJCXgtPSBpZC53aWR0aDsKKwkJCQlkcmF3SW1hZ2UoaWQsIHgsIGdldFNpemUoKS55LWlkLmhlaWdodCk7CisJCQl9CisJCX0KKwl9CisJcHJvdGVjdGVkIHZvaWQgZHJhd0NvbXBvc2l0ZUltYWdlKGludCB3aWR0aCwgaW50IGhlaWdodCkgeworCQlJbWFnZURhdGEgYmc9IGZCYXNlLmdldEltYWdlRGF0YSgpOworCQlkcmF3SW1hZ2UoYmcsIDAsIDApOworCQkKKwkJaWYgKGZPdmVybGF5cyAhPSBudWxsKSB7CisJCQlpZiAoZk92ZXJsYXlzLmxlbmd0aCA+IDApCisJCQkJZHJhd1RvcFJpZ2h0KCBmT3ZlcmxheXNbMF0pOworCQkJCQorCQkJaWYgKGZPdmVybGF5cy5sZW5ndGggPiAxKQorCQkJCWRyYXdCb3R0b21SaWdodChmT3ZlcmxheXNbMV0pOworCQkJCQorCQkJaWYgKGZPdmVybGF5cy5sZW5ndGggPiAyKQorCQkJCWRyYXdCb3R0b21MZWZ0KGZPdmVybGF5c1syXSk7CisJCQkJCisJCQlpZiAoZk92ZXJsYXlzLmxlbmd0aCA+IDMpCisJCQkJZHJhd1RvcExlZnQoZk92ZXJsYXlzWzNdKTsKKwkJfQkKKwl9CisJcHJvdGVjdGVkIHZvaWQgZHJhd1RvcExlZnQoSW1hZ2VEZXNjcmlwdG9yW10gb3ZlcmxheXMpIHsKKwkJaWYgKG92ZXJsYXlzID09IG51bGwpCisJCQlyZXR1cm47CisJCWludCBsZW5ndGg9IG92ZXJsYXlzLmxlbmd0aDsKKwkJaW50IHg9IDA7CisJCWZvciAoaW50IGk9IDA7IGkgPCAzOyBpKyspIHsKKwkJCWlmIChpIDwgbGVuZ3RoICYmIG92ZXJsYXlzW2ldICE9IG51bGwpIHsKKwkJCQlJbWFnZURhdGEgaWQ9IG92ZXJsYXlzW2ldLmdldEltYWdlRGF0YSgpOworCQkJCWRyYXdJbWFnZShpZCwgeCwgMCk7CisJCQkJeCs9IGlkLndpZHRoOworCQkJfQorCQl9CisJfQorCXByb3RlY3RlZCB2b2lkIGRyYXdUb3BSaWdodChJbWFnZURlc2NyaXB0b3JbXSBvdmVybGF5cykgeworCQlpZiAob3ZlcmxheXMgPT0gbnVsbCkKKwkJCXJldHVybjsKKwkJaW50IGxlbmd0aD0gb3ZlcmxheXMubGVuZ3RoOworCQlpbnQgeD0gZ2V0U2l6ZSgpLng7CisJCWZvciAoaW50IGk9IDI7IGkgPj0gMDsgaS0tKSB7CisJCQlpZiAoaSA8IGxlbmd0aCAmJiBvdmVybGF5c1tpXSAhPSBudWxsKSB7CisJCQkJSW1hZ2VEYXRhIGlkPSBvdmVybGF5c1tpXS5nZXRJbWFnZURhdGEoKTsKKwkJCQl4LT0gaWQud2lkdGg7CisJCQkJZHJhd0ltYWdlKGlkLCB4LCAwKTsKKwkJCX0KKwkJfQorCX0KKworCXByb3RlY3RlZCBQb2ludCBnZXRTaXplKCkgeworCQlyZXR1cm4gZlNpemU7CisJfQorfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3BhcnRzL1BpeGVsQ29udmVydGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcGFydHMvUGl4ZWxDb252ZXJ0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTdiNjA4Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3BhcnRzL1BpeGVsQ29udmVydGVyLmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wYXJ0czsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7CisKK3B1YmxpYyBjbGFzcyBQaXhlbENvbnZlcnRlciB7CisJCisJcHJpdmF0ZSBGb250TWV0cmljcyBmRm9udE1ldHJpY3M7CisJCisJcHVibGljIFBpeGVsQ29udmVydGVyKENvbnRyb2wgY29udHJvbCkgeworCQlHQyBnYyA9IG5ldyBHQyhjb250cm9sKTsKKwkJZ2Muc2V0Rm9udChjb250cm9sLmdldEZvbnQoKSk7CisJCWZGb250TWV0cmljcz0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsKKwkJZ2MuZGlzcG9zZSgpOworCX0KKwkKKwlwdWJsaWMgaW50IGNvbnZlcnRIZWlnaHRJbkNoYXJzVG9QaXhlbHMoaW50IGNoYXJzKSB7CisJCXJldHVybiBEaWFsb2cuY29udmVydEhlaWdodEluQ2hhcnNUb1BpeGVscyhmRm9udE1ldHJpY3MsIGNoYXJzKTsKKwl9CisKKwlwdWJsaWMgaW50IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKGludCBkbHVzKSB7CisJCXJldHVybiBEaWFsb2cuY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoZkZvbnRNZXRyaWNzLCBkbHVzKTsKKwl9CisKKwlwdWJsaWMgaW50IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhpbnQgZGx1cykgeworCQlyZXR1cm4gRGlhbG9nLmNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhmRm9udE1ldHJpY3MsIGRsdXMpOworCX0KKwkKKwlwdWJsaWMgaW50IGNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscyhpbnQgY2hhcnMpIHsKKwkJcmV0dXJuIERpYWxvZy5jb252ZXJ0V2lkdGhJbkNoYXJzVG9QaXhlbHMoZkZvbnRNZXRyaWNzLCBjaGFycyk7CisJfQkKKworfQorCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcGFydHMvU1dUVXRpbC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3BhcnRzL1NXVFV0aWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmE0MDMwCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3BhcnRzL1NXVFV0aWwuamF2YQpAQCAtMCwwICsxLDEwMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wYXJ0czsKKy8qKgorICogQHZlcnNpb24gCTEuMAorICogQGF1dGhvcgorICovCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLio7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7CisKKy8qKgorICogVXRpbGl0eSBjbGFzcyB0byBzaW1wbGlmeSBhY2Nlc3MgdG8gc29tZSBTV1QgcmVzb3VyY2VzLiAKKyAqLworcHVibGljIGNsYXNzIFNXVFV0aWwgeworCisJLyoqCisJICogUmV0dXJucyB0aGUgc3RhbmRhcmQgZGlzcGxheSB0byBiZSB1c2VkLiBUaGUgbWV0aG9kIGZpcnN0IGNoZWNrcywgaWYKKwkgKiB0aGUgdGhyZWFkIGNhbGxpbmcgdGhpcyBtZXRob2QgaGFzIGFuIGFzc29jaWF0ZWQgZGlzYXBseS4gSWYgc28sIHRoaXMKKwkgKiBkaXNwbGF5IGlzIHJldHVybmVkLiBPdGhlcndpc2UgdGhlIG1ldGhvZCByZXR1cm5zIHRoZSBkZWZhdWx0IGRpc3BsYXkuCisJICovCisJcHVibGljIHN0YXRpYyBEaXNwbGF5IGdldFN0YW5kYXJkRGlzcGxheSgpIHsKKwkJRGlzcGxheSBkaXNwbGF5OworCQlkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7CisJCWlmIChkaXNwbGF5ID09IG51bGwpCisJCQlkaXNwbGF5ID0gRGlzcGxheS5nZXREZWZhdWx0KCk7CisJCXJldHVybiBkaXNwbGF5OworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHNoZWxsIGZvciB0aGUgZ2l2ZW4gd2lkZ2V0LiBJZiB0aGUgd2lkZ2V0IGRvZXNuJ3QgcmVwcmVzZW50CisJICogYSBTV1Qgb2JqZWN0IHRoYXQgbWFuYWdlIGEgc2hlbGwsIDxjb2RlPm51bGw8L2NvZGU+IGlzIHJldHVybmVkLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIHNoZWxsIGZvciB0aGUgZ2l2ZW4gd2lkZ2V0CisJICovCisJcHVibGljIHN0YXRpYyBTaGVsbCBnZXRTaGVsbChXaWRnZXQgd2lkZ2V0KSB7CisJCWlmICh3aWRnZXQgaW5zdGFuY2VvZiBDb250cm9sKQorCQkJcmV0dXJuICgoQ29udHJvbCkgd2lkZ2V0KS5nZXRTaGVsbCgpOworCQlpZiAod2lkZ2V0IGluc3RhbmNlb2YgQ2FyZXQpCisJCQlyZXR1cm4gKChDYXJldCkgd2lkZ2V0KS5nZXRQYXJlbnQoKS5nZXRTaGVsbCgpOworCQlpZiAod2lkZ2V0IGluc3RhbmNlb2YgRHJhZ1NvdXJjZSkKKwkJCXJldHVybiAoKERyYWdTb3VyY2UpIHdpZGdldCkuZ2V0Q29udHJvbCgpLmdldFNoZWxsKCk7CisJCWlmICh3aWRnZXQgaW5zdGFuY2VvZiBEcm9wVGFyZ2V0KQorCQkJcmV0dXJuICgoRHJvcFRhcmdldCkgd2lkZ2V0KS5nZXRDb250cm9sKCkuZ2V0U2hlbGwoKTsKKwkJaWYgKHdpZGdldCBpbnN0YW5jZW9mIE1lbnUpCisJCQlyZXR1cm4gKChNZW51KSB3aWRnZXQpLmdldFBhcmVudCgpLmdldFNoZWxsKCk7CisJCWlmICh3aWRnZXQgaW5zdGFuY2VvZiBTY3JvbGxCYXIpCisJCQlyZXR1cm4gKChTY3JvbGxCYXIpIHdpZGdldCkuZ2V0UGFyZW50KCkuZ2V0U2hlbGwoKTsKKworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgd2lkdGggaGludCBmb3IgYSBidXR0b24gY29udHJvbC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGludCBnZXRCdXR0b25XaWR0aEhpbnQoQnV0dG9uIGJ1dHRvbikgeworCQlpZiAoYnV0dG9uLmdldEZvbnQoKS5lcXVhbHMoSkZhY2VSZXNvdXJjZXMuZ2V0RGVmYXVsdEZvbnQoKSkpCisJCQlidXR0b24uc2V0Rm9udChKRmFjZVJlc291cmNlcy5nZXREaWFsb2dGb250KCkpOworCQlQaXhlbENvbnZlcnRlciBjb252ZXJ0ZXI9IG5ldyBQaXhlbENvbnZlcnRlcihidXR0b24pOworCQlpbnQgd2lkdGhIaW50PSBjb252ZXJ0ZXIuY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5CVVRUT05fV0lEVEgpOworCQlyZXR1cm4gTWF0aC5tYXgod2lkdGhIaW50LCBidXR0b24uY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCB0cnVlKS54KTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHdpZHRoIGFuZCBoZWlnaHQgaGludCBmb3IgdGhlIGJ1dHRvbiBjb250cm9sLgorCSAqIDxiPk5vdGU6PC9iPiBUaGlzIGlzIGEgTk9QIGlmIHRoZSBidXR0b24ncyBsYXlvdXQgZGF0YSBpcyBub3QKKwkgKiBhbiBpbnN0YW5jZSBvZiA8Y29kZT5HcmlkRGF0YTwvY29kZT4uCisJICogCisJICogQHBhcmFtIGJ1dHRvbgl0aGUgYnV0dG9uIGZvciB3aGljaCB0byBzZXQgdGhlIGRpbWVuc2lvbiBoaW50CisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIHNldEJ1dHRvbkRpbWVuc2lvbkhpbnQoQnV0dG9uIGJ1dHRvbikgeworCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KGJ1dHRvbik7CisJCUFzc2VydC5pc05vdE51bGwoYnV0dG9uKTsKKwkJT2JqZWN0IGdkID0gYnV0dG9uLmdldExheW91dERhdGEoKTsKKwkJaWYgKGdkIGluc3RhbmNlb2YgR3JpZERhdGEpIHsKKwkJCSgoR3JpZERhdGEpIGdkKS53aWR0aEhpbnQgPSBnZXRCdXR0b25XaWR0aEhpbnQoYnV0dG9uKTsKKwkJfQorCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXREaWFsb2dTaXplKERpYWxvZyBkaWFsb2csIGludCB3aWR0aCwgaW50IGhlaWdodCkgeworCQlQb2ludCBjb21wdXRlZFNpemUgPQorCQkJZGlhbG9nLmdldFNoZWxsKCkuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKKwkJd2lkdGggPSBNYXRoLm1heChjb21wdXRlZFNpemUueCwgd2lkdGgpOworCQloZWlnaHQgPSBNYXRoLm1heChjb21wdXRlZFNpemUueSwgaGVpZ2h0KTsKKwkJZGlhbG9nLmdldFNoZWxsKCkuc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTsKKwl9Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcGFydHMvU2hhcmVkTGFiZWxQcm92aWRlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3BhcnRzL1NoYXJlZExhYmVsUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGU0OGIzCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3BhcnRzL1NoYXJlZExhYmVsUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDIwMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wYXJ0czsKKworaW1wb3J0IGphdmEubmV0Lio7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS4qOworCisvKioKKyAqIEB2ZXJzaW9uIAkxLjAKKyAqIEBhdXRob3IKKyAqLworcHVibGljIGNsYXNzIFNoYXJlZExhYmVsUHJvdmlkZXIKKwlleHRlbmRzIExhYmVsUHJvdmlkZXIKKwlpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZfRVJST1IgPSAxOworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZfV0FSTklORyA9IDI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRl9DVVJSRU5UID0gNDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGX0lOU1RBTExBQkxFID0gODsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGX0xJTktFRCA9IDE2OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZfTU9EID0gMzI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRl9VUERBVEVEID0gNjQ7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRl9VTkNPTkZJR1VSRUQgPSAxMjg7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRl9BREQgPSAyNTY7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRl9ERUwgPSA1MTI7CisKKwlIYXNodGFibGUgaW1hZ2VzID0gbmV3IEhhc2h0YWJsZSgpOworCUFycmF5TGlzdCBjb25zdW1lcnMgPSBuZXcgQXJyYXlMaXN0KCk7CisKKwlwdWJsaWMgU2hhcmVkTGFiZWxQcm92aWRlcigpIHsKKwl9CisKKwlwdWJsaWMgdm9pZCBjb25uZWN0KE9iamVjdCBjb25zdW1lcikgeworCQlpZiAoIWNvbnN1bWVycy5jb250YWlucyhjb25zdW1lcikpCisJCQljb25zdW1lcnMuYWRkKGNvbnN1bWVyKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBkaXNjb25uZWN0KE9iamVjdCBjb25zdW1lcikgeworCQljb25zdW1lcnMucmVtb3ZlKGNvbnN1bWVyKTsKKwkJaWYgKGNvbnN1bWVycy5zaXplKCkgPT0gMCkgeworCQkJcmVzZXQoKTsKKwkJfQorCX0KKwkKKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQlyZXNldCgpOworCQlzdXBlci5kaXNwb3NlKCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHJlc2V0KCkgeworCQlmb3IgKEVudW1lcmF0aW9uIGl0ZXJhdG9yID0gaW1hZ2VzLmVsZW1lbnRzKCk7IGl0ZXJhdG9yLmhhc01vcmVFbGVtZW50cygpOykgeworCQkJSW1hZ2UgaW1hZ2UgPSAoSW1hZ2UpIGl0ZXJhdG9yLm5leHRFbGVtZW50KCk7CisJCQlpbWFnZS5kaXNwb3NlKCk7CisJCX0KKwkJaW1hZ2VzLmNsZWFyKCk7CisJfQorCisJcHVibGljIEltYWdlIGdldChJbWFnZURlc2NyaXB0b3IgZGVzYykgeworCQlyZXR1cm4gZ2V0KGRlc2MsIDApOworCX0KKworCXB1YmxpYyBJbWFnZSBnZXQoSW1hZ2VEZXNjcmlwdG9yIGRlc2MsIGludCBmbGFncykgeworCQlPYmplY3Qga2V5ID0gZGVzYzsKKworCQlpZiAoZmxhZ3MgIT0gMCkgeworCQkJa2V5ID0gZ2V0S2V5KGRlc2MuaGFzaENvZGUoKSwgZmxhZ3MpOworCQl9CisJCUltYWdlIGltYWdlID0gKEltYWdlKSBpbWFnZXMuZ2V0KGtleSk7CisJCWlmIChpbWFnZSA9PSBudWxsKSB7CisJCQlpbWFnZSA9IGNyZWF0ZUltYWdlKGRlc2MsIGZsYWdzKTsKKwkJCWltYWdlcy5wdXQoa2V5LCBpbWFnZSk7CisJCX0KKwkJcmV0dXJuIGltYWdlOworCX0KKwkKKwlwdWJsaWMgSW1hZ2UgZ2V0KEltYWdlIGltYWdlLCBpbnQgZmxhZ3MpIHsKKwkJaWYgKGZsYWdzPT0wKSByZXR1cm4gaW1hZ2U7CisJCVN0cmluZyBrZXkgPSBnZXRLZXkoaW1hZ2UuaGFzaENvZGUoKSwgZmxhZ3MpOworCQlJbWFnZSByZXN1bHRJbWFnZSA9IChJbWFnZSlpbWFnZXMuZ2V0KGtleSk7CisJCWlmIChyZXN1bHRJbWFnZSA9PSBudWxsKSB7CisJCQlyZXN1bHRJbWFnZSA9IGNyZWF0ZUltYWdlKGltYWdlLCBmbGFncyk7CisJCQlpbWFnZXMucHV0KGtleSwgcmVzdWx0SW1hZ2UpOworCQl9CisJCXJldHVybiByZXN1bHRJbWFnZTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBnZXRLZXkobG9uZyBoYXNoQ29kZSwgaW50IGZsYWdzKSB7CisJCXJldHVybiAoIiIraGFzaENvZGUpICsgIjoiK2ZsYWdzOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwl9CisKKwlwcml2YXRlIEltYWdlIGNyZWF0ZUltYWdlKEltYWdlRGVzY3JpcHRvciBiYXNlRGVzYywgaW50IGZsYWdzKSB7CisJCWlmIChmbGFncyA9PSAwKSB7CisJCQlyZXR1cm4gYmFzZURlc2MuY3JlYXRlSW1hZ2UoKTsKKwkJfQorCQlJbWFnZURlc2NyaXB0b3JbXSBsb3dlckxlZnQgPSBnZXRMb3dlckxlZnRPdmVybGF5cyhmbGFncyk7CisJCUltYWdlRGVzY3JpcHRvcltdIHVwcGVyUmlnaHQgPSBnZXRVcHBlclJpZ2h0T3ZlcmxheXMoZmxhZ3MpOworCQlJbWFnZURlc2NyaXB0b3JbXSBsb3dlclJpZ2h0ID0gZ2V0TG93ZXJSaWdodE92ZXJsYXlzKGZsYWdzKTsKKwkJSW1hZ2VEZXNjcmlwdG9yW10gdXBwZXJMZWZ0ID0gZ2V0VXBwZXJMZWZ0T3ZlcmxheXMoZmxhZ3MpOworCQlPdmVybGF5SWNvbiBjb21wRGVzYyA9CisJCQluZXcgT3ZlcmxheUljb24oCisJCQkJYmFzZURlc2MsCisJCQkJbmV3IEltYWdlRGVzY3JpcHRvcltdW10geyB1cHBlclJpZ2h0LCBsb3dlclJpZ2h0LCBsb3dlckxlZnQsIHVwcGVyTGVmdCB9KTsKKwkJcmV0dXJuIGNvbXBEZXNjLmNyZWF0ZUltYWdlKCk7CisJfQorCQorCXByaXZhdGUgSW1hZ2UgY3JlYXRlSW1hZ2UoSW1hZ2UgYmFzZUltYWdlLCBpbnQgZmxhZ3MpIHsKKwkJaWYgKGZsYWdzID09IDApIHsKKwkJCXJldHVybiBiYXNlSW1hZ2U7CisJCX0KKwkJSW1hZ2VEZXNjcmlwdG9yW10gbG93ZXJMZWZ0ID0gZ2V0TG93ZXJMZWZ0T3ZlcmxheXMoZmxhZ3MpOworCQlJbWFnZURlc2NyaXB0b3JbXSB1cHBlclJpZ2h0ID0gZ2V0VXBwZXJSaWdodE92ZXJsYXlzKGZsYWdzKTsKKwkJSW1hZ2VEZXNjcmlwdG9yW10gbG93ZXJSaWdodCA9IGdldExvd2VyUmlnaHRPdmVybGF5cyhmbGFncyk7CisJCUltYWdlRGVzY3JpcHRvcltdIHVwcGVyTGVmdCA9IGdldFVwcGVyTGVmdE92ZXJsYXlzKGZsYWdzKTsKKwkJSW1hZ2VPdmVybGF5SWNvbiBjb21wRGVzYyA9CisJCQluZXcgSW1hZ2VPdmVybGF5SWNvbigKKwkJCQliYXNlSW1hZ2UsCisJCQkJbmV3IEltYWdlRGVzY3JpcHRvcltdW10geyB1cHBlclJpZ2h0LCBsb3dlclJpZ2h0LCBsb3dlckxlZnQsIHVwcGVyTGVmdCB9KTsKKwkJcmV0dXJuIGNvbXBEZXNjLmNyZWF0ZUltYWdlKCk7CisJfQorCisJcHJpdmF0ZSBJbWFnZURlc2NyaXB0b3JbXSBnZXRMb3dlckxlZnRPdmVybGF5cyhpbnQgZmxhZ3MpIHsKKwkJaWYgKChmbGFncyAmIEZfRVJST1IpICE9IDApCisJCQlyZXR1cm4gbmV3IEltYWdlRGVzY3JpcHRvcltdIHsgVXBkYXRlVUlJbWFnZXMuREVTQ19FUlJPUl9DTyB9OworCQlpZiAoKGZsYWdzICYgRl9XQVJOSU5HKSAhPSAwKQorCQkJcmV0dXJuIG5ldyBJbWFnZURlc2NyaXB0b3JbXSB7IFVwZGF0ZVVJSW1hZ2VzLkRFU0NfV0FSTklOR19DTyB9OworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwcml2YXRlIEltYWdlRGVzY3JpcHRvcltdIGdldFVwcGVyUmlnaHRPdmVybGF5cyhpbnQgZmxhZ3MpIHsKKwkJaWYgKChmbGFncyAmIEZfQUREKSAhPSAwKQorCQkJcmV0dXJuIG5ldyBJbWFnZURlc2NyaXB0b3JbXSB7IFVwZGF0ZVVJSW1hZ2VzLkRFU0NfQUREX0NPIH07CisJCWlmICgoZmxhZ3MgJiBGX0RFTCkgIT0gMCkKKwkJCXJldHVybiBuZXcgSW1hZ2VEZXNjcmlwdG9yW10geyBVcGRhdGVVSUltYWdlcy5ERVNDX0RFTF9DTyB9OworCQlpZiAoKGZsYWdzICYgRl9VTkNPTkZJR1VSRUQpICE9IDApCisJCQlyZXR1cm4gbmV3IEltYWdlRGVzY3JpcHRvcltdIHsgVXBkYXRlVUlJbWFnZXMuREVTQ19VTkNPTkZfQ08gfTsKKwkJaWYgKChmbGFncyAmIEZfTElOS0VEKSAhPSAwKQorCQkJcmV0dXJuIG5ldyBJbWFnZURlc2NyaXB0b3JbXSB7IFVwZGF0ZVVJSW1hZ2VzLkRFU0NfTElOS0VEX0NPIH07CisJCXJldHVybiBudWxsOworCX0KKwkKKwlwcml2YXRlIEltYWdlRGVzY3JpcHRvcltdIGdldExvd2VyUmlnaHRPdmVybGF5cyhpbnQgZmxhZ3MpIHsKKwkJaWYgKChmbGFncyAmIEZfQ1VSUkVOVCkgIT0gMCkKKwkJCXJldHVybiBuZXcgSW1hZ2VEZXNjcmlwdG9yW10geyBVcGRhdGVVSUltYWdlcy5ERVNDX0NVUlJFTlRfQ08gfTsKKwkJaWYgKChmbGFncyAmIEZfTU9EKSAhPSAwKQorCQkJcmV0dXJuIG5ldyBJbWFnZURlc2NyaXB0b3JbXSB7IFVwZGF0ZVVJSW1hZ2VzLkRFU0NfTU9EX0NPIH07CisJCS8qCisJCWlmICgoZmxhZ3MgJiBGX0FERCkgIT0gMCkKKwkJCXJldHVybiBuZXcgSW1hZ2VEZXNjcmlwdG9yW10geyBVcGRhdGVVSUltYWdlcy5ERVNDX0FERF9DTyB9OworCQlpZiAoKGZsYWdzICYgRl9ERUwpICE9IDApCisJCQlyZXR1cm4gbmV3IEltYWdlRGVzY3JpcHRvcltdIHsgVXBkYXRlVUlJbWFnZXMuREVTQ19ERUxfQ08gfTsKKwkJaWYgKChmbGFncyAmIEZfVU5DT05GSUdVUkVEKSAhPSAwKQorCQkJcmV0dXJuIG5ldyBJbWFnZURlc2NyaXB0b3JbXSB7IFVwZGF0ZVVJSW1hZ2VzLkRFU0NfVU5DT05GX0NPIH07CisJCSovCisJCXJldHVybiBudWxsOworCX0KKwkKKwlwcml2YXRlIEltYWdlRGVzY3JpcHRvcltdIGdldFVwcGVyTGVmdE92ZXJsYXlzKGludCBmbGFncykgeworCQlpZiAoKGZsYWdzICYgRl9VUERBVEVEKSAhPSAwKQorCQkJcmV0dXJuIG5ldyBJbWFnZURlc2NyaXB0b3JbXSB7IFVwZGF0ZVVJSW1hZ2VzLkRFU0NfVVBEQVRFRF9DTyB9OworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iaiwgaW50IGluZGV4KSB7CisJCXJldHVybiBnZXRUZXh0KG9iaik7CisJfQorCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3Qgb2JqLCBpbnQgaW5kZXgpIHsKKwkJcmV0dXJuIGdldEltYWdlKG9iaik7CisJfQorCisJcHVibGljIEltYWdlIGdldEltYWdlRnJvbVVSTCgKKwkJVVJMIGluc3RhbGxVUkwsCisJCVN0cmluZyBzdWJkaXJlY3RvcnlBbmRGaWxlbmFtZSkgeworCQlJbWFnZSBpbWFnZSA9IG51bGw7CisJCXRyeSB7CisJCQlVUkwgbmV3VVJMID0gbmV3IFVSTChpbnN0YWxsVVJMLCBzdWJkaXJlY3RvcnlBbmRGaWxlbmFtZSk7CisJCQlTdHJpbmcga2V5ID0gbmV3VVJMLnRvU3RyaW5nKCk7CisJCQlpbWFnZSA9IChJbWFnZSlpbWFnZXMuZ2V0KGtleSk7CisJCQlpZiAoaW1hZ2UgPT0gbnVsbCkgeworCQkJCUltYWdlRGVzY3JpcHRvciBkZXNjID0gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwobmV3VVJMKTsKKwkJCQlpbWFnZSA9IGRlc2MuY3JlYXRlSW1hZ2UoKTsKKwkJCQlpbWFnZXMucHV0KGtleSwgaW1hZ2UpOworCQkJfQorCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworCQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZSkgeworCQl9CisJCXJldHVybiBpbWFnZTsKKwl9Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvTWFpblByZWZlcmVuY2VQYWdlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvTWFpblByZWZlcmVuY2VQYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI1OWEyMAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9NYWluUHJlZmVyZW5jZVBhZ2UuamF2YQpAQCAtMCwwICsxLDI5MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wcmVmZXJlbmNlczsKKworaW1wb3J0IGphdmEubmV0Lio7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5TaXRlTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5VcGRhdGVDb3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zLlVwZGF0ZVV0aWxzOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUlNZXNzYWdlczsKKworLyoqCisgKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgorICogQHNlZSBQcmVmZXJlbmNlUGFnZQorICovCitwdWJsaWMgY2xhc3MgTWFpblByZWZlcmVuY2VQYWdlCisJZXh0ZW5kcyBQcmVmZXJlbmNlUGFnZQorCWltcGxlbWVudHMgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlIHsKKworCS8vcHJpdmF0ZSBMYWJlbCBoaXN0b3J5U2l6ZUxhYmVsOworCXByaXZhdGUgVGV4dCBoaXN0b3J5U2l6ZVRleHQ7CisJcHJpdmF0ZSBCdXR0b24gY2hlY2tTaWduYXR1cmVDaGVja2JveDsKKwlwcml2YXRlIEJ1dHRvbiBhdXRvbWF0aWNhbGx5Q2hvb3NlTWlycm9yQ2hlY2tib3g7CisJcHJpdmF0ZSBCdXR0b24gZXF1aXZhbGVudEJ1dHRvbjsKKwlwcml2YXRlIEJ1dHRvbiBjb21wYXRpYmxlQnV0dG9uOworCXByaXZhdGUgVGV4dCB1cGRhdGVQb2xpY3lUZXh0OworCisJLy8gdGhlc2UgdHdvIHZhbHVlcyBhcmUgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvbGQgY29kZQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVRVUlWQUxFTlRfVkFMVUUgPSAiZXF1aXZhbGVudCI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QQVRJQkxFX1ZBTFVFID0gImNvbXBhdGlibGUiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBUaGUgY29uc3RydWN0b3IuCisJICovCisJcHVibGljIE1haW5QcmVmZXJlbmNlUGFnZSgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuCisJICovCisJcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgeworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gUHJlZmVyZW5jZVBhZ2UuCisJICovCisJcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgeworICAgICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhcmVudCwgIm9yZy5lY2xpcHNlLnVwZGF0ZS51aS5NYWluUHJlZmVyZW5jZVBhZ2UiKTsgLy8kTk9OLU5MUy0xJAorCisJCUNvbXBvc2l0ZSBtYWluQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKKwkJbWFpbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKKwkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOworCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKKwkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKKwkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOworCQltYWluQ29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOworCisJCUxhYmVsIGhpc3RvcnlTaXplTGFiZWwgPSBuZXcgTGFiZWwobWFpbkNvbXBvc2l0ZSwgU1dULk5PTkUpOworCQloaXN0b3J5U2l6ZUxhYmVsLnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5NYWluUHJlZmVyZW5jZVBhZ2VfaGlzdG9yeVNpemUpOyAKKwkJaGlzdG9yeVNpemVUZXh0ID0gbmV3IFRleHQobWFpbkNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOworCQloaXN0b3J5U2l6ZVRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7CisJCWhpc3RvcnlTaXplVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKKwkJCQloaXN0b3J5U2l6ZUNoYW5nZWQoKTsKKwkJCX0KKwkJfSk7CisKKwkJY2hlY2tTaWduYXR1cmVDaGVja2JveCA9CisJCQluZXcgQnV0dG9uKG1haW5Db21wb3NpdGUsIFNXVC5DSEVDSyB8IFNXVC5MRUZUKTsKKwkJY2hlY2tTaWduYXR1cmVDaGVja2JveC5zZXRUZXh0KFVwZGF0ZVVJTWVzc2FnZXMuTWFpblByZWZlcmVuY2VQYWdlX2NoZWNrU2lnbmF0dXJlKTsgCisJCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7CisJCWdkLmhvcml6b250YWxTcGFuID0gMjsKKwkJY2hlY2tTaWduYXR1cmVDaGVja2JveC5zZXRMYXlvdXREYXRhKGdkKTsKKwkJY2hlY2tTaWduYXR1cmVDaGVja2JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQlpZiAoY2hlY2tTaWduYXR1cmVDaGVja2JveC5nZXRTZWxlY3Rpb24oKSA9PSBmYWxzZSkgeworCQkJCQl3YXJuU2lnbmF0dXJlQ2hlY2soZ2V0U2hlbGwoKSk7CisJCQkJfQorCQkJfQorCQl9KTsKKwkJCisJCWF1dG9tYXRpY2FsbHlDaG9vc2VNaXJyb3JDaGVja2JveCA9CisJCQluZXcgQnV0dG9uKG1haW5Db21wb3NpdGUsIFNXVC5DSEVDSyB8IFNXVC5MRUZUKTsKKwkJYXV0b21hdGljYWxseUNob29zZU1pcnJvckNoZWNrYm94LnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5NYWluUHJlZmVyZW5jZVBhZ2VfYXV0b21hdGljYWxseUNob29zZU1pcnJvcik7CisJCWdkID0gbmV3IEdyaWREYXRhKCk7CisJCWdkLmhvcml6b250YWxTcGFuID0gMjsKKwkJYXV0b21hdGljYWxseUNob29zZU1pcnJvckNoZWNrYm94LnNldExheW91dERhdGEoZ2QpOworCisJCWNyZWF0ZVNwYWNlcihtYWluQ29tcG9zaXRlLCAyKTsKKworCQlHcm91cCBncm91cCA9IG5ldyBHcm91cChtYWluQ29tcG9zaXRlLCBTV1QuTk9ORSk7CisJCWdyb3VwLnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5NYWluUHJlZmVyZW5jZVBhZ2VfdXBkYXRlVmVyc2lvbnMpOyAKKwkJZ3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOworCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOworCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7CisJCWdyb3VwLnNldExheW91dERhdGEoZ2QpOworCisJCWVxdWl2YWxlbnRCdXR0b24gPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuUkFESU8pOworCQllcXVpdmFsZW50QnV0dG9uLnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5NYWluUHJlZmVyZW5jZVBhZ2VfdXBkYXRlVmVyc2lvbnNfZXF1aXZhbGVudCk7IAorCisJCWNvbXBhdGlibGVCdXR0b24gPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuUkFESU8pOworCQljb21wYXRpYmxlQnV0dG9uLnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5NYWluUHJlZmVyZW5jZVBhZ2VfdXBkYXRlVmVyc2lvbnNfY29tcGF0aWJsZSk7IAorCisJCWNyZWF0ZVNwYWNlcihtYWluQ29tcG9zaXRlLCAyKTsKKworCQlncm91cCA9IG5ldyBHcm91cChtYWluQ29tcG9zaXRlLCBTV1QuTk9ORSk7CisJCWdyb3VwLnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5NYWluUHJlZmVyZW5jZVBhZ2VfdXBkYXRlUG9saWN5KTsgCisJCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7CisJCWxheW91dC5udW1Db2x1bW5zID0gMjsKKwkJZ3JvdXAuc2V0TGF5b3V0KGxheW91dCk7CisJCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7CisJCWdkLmhvcml6b250YWxTcGFuID0gMjsKKwkJZ3JvdXAuc2V0TGF5b3V0RGF0YShnZCk7CisKKwkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoZ3JvdXAsIFNXVC5OVUxMKTsKKwkJbGFiZWwuc2V0VGV4dChVcGRhdGVVSU1lc3NhZ2VzLk1haW5QcmVmZXJlbmNlUGFnZV91cGRhdGVQb2xpY3lVUkwpOyAKKwkJdXBkYXRlUG9saWN5VGV4dCA9IG5ldyBUZXh0KGdyb3VwLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7CisKKwkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKKwkJdXBkYXRlUG9saWN5VGV4dC5zZXRMYXlvdXREYXRhKGdkKTsKKworCQkvL2NyZWF0ZVNwYWNlcihtYWluQ29tcG9zaXRlLCAyKTsKKwkJLy9jcmVhdGVIdHRwUHJveHkobWFpbkNvbXBvc2l0ZSwgMik7CisJCWluaXRpYWxpemUoKTsKKwkJdXBkYXRlUG9saWN5VGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKKwkJCQl0ZXh0Q2hhbmdlZCgpOworCQkJfQorCQl9KTsKKwkJcmV0dXJuIG1haW5Db21wb3NpdGU7CisJfQorCisJcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7CisJCXN1cGVyLmNyZWF0ZUNvbnRyb2wocGFyZW50KTsKKwkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChnZXRDb250cm9sKCkpOworCX0KKworCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVNwYWNlcihDb21wb3NpdGUgY29tcG9zaXRlLCBpbnQgY29sdW1uU3BhbikgeworCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKKwkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKKwkJZ2QuaG9yaXpvbnRhbFNwYW4gPSBjb2x1bW5TcGFuOworCQlsYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVIdHRwUHJveHkoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgaW50IGNvbHVtblNwYW4pIHsKKwkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7CisJCWdyb3VwLnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5NYWluUHJlZmVyZW5jZVBhZ2VfcHJveHlHcm91cCk7IAorCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7CisJCWxheW91dC5udW1Db2x1bW5zID0gMjsKKwkJZ3JvdXAuc2V0TGF5b3V0KGxheW91dCk7CisJCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7CisJCWdkLmhvcml6b250YWxTcGFuID0gY29sdW1uU3BhbjsKKwkJZ3JvdXAuc2V0TGF5b3V0RGF0YShnZCk7CisJfQorCisJcHJpdmF0ZSBpbnQgZ2V0SGlzdG9yeUNvdW50KCkgeworCQl0cnkgeworCQkJSW50ZWdlciBjb3VudCA9IG5ldyBJbnRlZ2VyKGhpc3RvcnlTaXplVGV4dC5nZXRUZXh0KCkpOworCQkJcmV0dXJuIGNvdW50LmludFZhbHVlKCk7CisJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisJCX0KKwkJcmV0dXJuIFVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXREZWZhdWx0SW50KAorCQkJVXBkYXRlQ29yZS5QX0hJU1RPUllfU0laRSk7CisJfQorCQorCXByaXZhdGUgdm9pZCBoaXN0b3J5U2l6ZUNoYW5nZWQoKSB7CisJCQorCQl0cnkgeworCQkJaW50IGhpc3RvcnlTaXplID0gSW50ZWdlci5wYXJzZUludChoaXN0b3J5U2l6ZVRleHQuZ2V0VGV4dCgpKTsKKwkJCWlmIChoaXN0b3J5U2l6ZSA8IDApIHsKKwkJCQlzZXRWYWxpZChmYWxzZSk7CisJCQkJc2V0RXJyb3JNZXNzYWdlKFVwZGF0ZVVJTWVzc2FnZXMuTWFpblByZWZlcmVuY2VQYWdlX2ludmFsaWRIaXN0b3J5U2l6ZSk7IAorCQkJCXJldHVybjsKKwkJCX0KKwkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKwkJCXNldFZhbGlkKGZhbHNlKTsKKwkJCXNldEVycm9yTWVzc2FnZShVcGRhdGVVSU1lc3NhZ2VzLk1haW5QcmVmZXJlbmNlUGFnZV9pbnZhbGlkSGlzdG9yeVNpemUpOyAKKwkJCXJldHVybjsKKwkJfQorCQlzZXRWYWxpZCh0cnVlKTsKKwkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwkKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7CisJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGdldENvbnRyb2woKS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKKwkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQl0cnkgeworCQkJCQlTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKS5zZXRNYXhpbXVtSGlzdG9yeUNvdW50KAorCQkJCQkJZ2V0SGlzdG9yeUNvdW50KCkpOworCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJCQlVcGRhdGVVSS5sb2dFeGNlcHRpb24oZSk7CisJCQkJfQorCQkJfQorCQl9KTsKKworCQlQcmVmZXJlbmNlcyBwcmVmcyA9IFVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKKwkJcHJlZnMuc2V0VmFsdWUoCisJCQlVcGRhdGVDb3JlLlBfQ0hFQ0tfU0lHTkFUVVJFLAorCQkJY2hlY2tTaWduYXR1cmVDaGVja2JveC5nZXRTZWxlY3Rpb24oKSk7CisJCXByZWZzLnNldFZhbHVlKFVwZGF0ZUNvcmUuUF9BVVRPTUFUSUNBTExZX0NIT09TRV9NSVJST1IsIGF1dG9tYXRpY2FsbHlDaG9vc2VNaXJyb3JDaGVja2JveC5nZXRTZWxlY3Rpb24oKSk7CisJCXByZWZzLnNldFZhbHVlKFVwZGF0ZUNvcmUuUF9ISVNUT1JZX1NJWkUsIGhpc3RvcnlTaXplVGV4dC5nZXRUZXh0KCkpOworCQlwcmVmcy5zZXRWYWx1ZSgKKwkJCVVwZGF0ZUNvcmUuUF9VUERBVEVfVkVSU0lPTlMsCisJCQllcXVpdmFsZW50QnV0dG9uLmdldFNlbGVjdGlvbigpCisJCQkJPyBFUVVJVkFMRU5UX1ZBTFVFCisJCQkJOiBDT01QQVRJQkxFX1ZBTFVFKTsKKwkJcHJlZnMuc2V0VmFsdWUoCisJCQlVcGRhdGVVdGlscy5QX1VQREFURV9QT0xJQ1lfVVJMLAorCQkJdXBkYXRlUG9saWN5VGV4dC5nZXRUZXh0KCkpOworCisJCVVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7CisJCXJldHVybiBzdXBlci5wZXJmb3JtT2soKTsKKwl9CisKKworCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgeworCQlQcmVmZXJlbmNlcyBwcmVmcyA9IFVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKKworCQljaGVja1NpZ25hdHVyZUNoZWNrYm94LnNldFNlbGVjdGlvbigKKwkJCXByZWZzLmdldEJvb2xlYW4oVXBkYXRlQ29yZS5QX0NIRUNLX1NJR05BVFVSRSkpOworCQlhdXRvbWF0aWNhbGx5Q2hvb3NlTWlycm9yQ2hlY2tib3guc2V0U2VsZWN0aW9uKAorCQkJCXByZWZzLmdldEJvb2xlYW4oVXBkYXRlQ29yZS5QX0FVVE9NQVRJQ0FMTFlfQ0hPT1NFX01JUlJPUikpOworCisJCWhpc3RvcnlTaXplVGV4dC5zZXRUZXh0KHByZWZzLmdldFN0cmluZyhVcGRhdGVDb3JlLlBfSElTVE9SWV9TSVpFKSk7CisKKwkJYm9vbGVhbiBpc0NvbXBhdGlibGUgPQorCQkJVXBkYXRlQ29yZS5DT01QQVRJQkxFX1ZBTFVFLmVxdWFscygKKwkJCQlwcmVmcy5nZXRTdHJpbmcoVXBkYXRlQ29yZS5QX1VQREFURV9WRVJTSU9OUykpOworCQllcXVpdmFsZW50QnV0dG9uLnNldFNlbGVjdGlvbighaXNDb21wYXRpYmxlKTsKKwkJY29tcGF0aWJsZUJ1dHRvbi5zZXRTZWxlY3Rpb24oaXNDb21wYXRpYmxlKTsKKworCQlTdHJpbmcgdGV4dCA9IHByZWZzLmdldFN0cmluZyhVcGRhdGVVdGlscy5QX1VQREFURV9QT0xJQ1lfVVJMKTsKKwkJdXBkYXRlUG9saWN5VGV4dC5zZXRUZXh0KHRleHQpOworCX0KKworCXByaXZhdGUgdm9pZCB0ZXh0Q2hhbmdlZCgpIHsKKwkJU3RyaW5nIHRleHQgPSB1cGRhdGVQb2xpY3lUZXh0LmdldFRleHQoKTsKKwkJaWYgKHRleHQubGVuZ3RoKCkgPiAwKSB7CisJCQl0cnkgeworCQkJCW5ldyBVUkwodGV4dCk7CisJCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworCQkJCXNldFZhbGlkKGZhbHNlKTsKKwkJCQlzZXRFcnJvck1lc3NhZ2UoVXBkYXRlVUlNZXNzYWdlcy5VcGRhdGVTZXR0aW5nc1ByZWZlcmVuY2VQYWdlX2ludmFsaWQpOyAKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwkJc2V0VmFsaWQodHJ1ZSk7CisJCXNldEVycm9yTWVzc2FnZShudWxsKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7CisJCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOworCQlQcmVmZXJlbmNlcyBwcmVmcyA9IFVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKKworCQl1cGRhdGVQb2xpY3lUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCisKKwkJY2hlY2tTaWduYXR1cmVDaGVja2JveC5zZXRTZWxlY3Rpb24odHJ1ZSk7CisJCWF1dG9tYXRpY2FsbHlDaG9vc2VNaXJyb3JDaGVja2JveC5zZXRTZWxlY3Rpb24oZmFsc2UpOworCQloaXN0b3J5U2l6ZVRleHQuc2V0VGV4dCgKKwkJCXByZWZzLmdldERlZmF1bHRTdHJpbmcoVXBkYXRlQ29yZS5QX0hJU1RPUllfU0laRSkpOworCQkKKwkJZXF1aXZhbGVudEJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7CisJCWNvbXBhdGlibGVCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgd2FyblNpZ25hdHVyZUNoZWNrKFNoZWxsIHNoZWxsKSB7CisJCU1lc3NhZ2VEaWFsb2cub3Blbldhcm5pbmcoc2hlbGwsIFVwZGF0ZVVJTWVzc2FnZXMuTWFpblByZWZlcmVuY2VQYWdlX2RpZ2l0YWxTaWduYXR1cmVfdGl0bGUsIAorCQlVcGRhdGVVSU1lc3NhZ2VzLk1haW5QcmVmZXJlbmNlUGFnZV9kaWdpdGFsU2lnbmF0dXJlX21lc3NhZ2UpOyAKKwl9Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvVXBkYXRlU2V0dGluZ3NQcmVmZXJlbmNlUGFnZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL1VwZGF0ZVNldHRpbmdzUHJlZmVyZW5jZVBhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODA4NDg4Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL1VwZGF0ZVNldHRpbmdzUHJlZmVyZW5jZVBhZ2UuamF2YQpAQCAtMCwwICsxLDExNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wcmVmZXJlbmNlczsKKworaW1wb3J0IGphdmEubmV0Lio7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLio7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwub3BlcmF0aW9ucy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSU1lc3NhZ2VzOworCisvKioKKyAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCisgKiBAc2VlIFByZWZlcmVuY2VQYWdlCisgKi8KK3B1YmxpYyBjbGFzcyBVcGRhdGVTZXR0aW5nc1ByZWZlcmVuY2VQYWdlCisJZXh0ZW5kcyBQcmVmZXJlbmNlUGFnZQorCWltcGxlbWVudHMgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlIHsKKwlwcml2YXRlIFRleHQgbWFwcGluZ3NGaWxlOworCisJLyoqCisJICogVGhlIGNvbnN0cnVjdG9yLgorCSAqLworCXB1YmxpYyBVcGRhdGVTZXR0aW5nc1ByZWZlcmVuY2VQYWdlKCkgeworCQlzZXREZXNjcmlwdGlvbihVcGRhdGVVSU1lc3NhZ2VzLlVwZGF0ZVNldHRpbmdzUHJlZmVyZW5jZVBhZ2VfZGVzY3JpcHRpb24pOyAKKwl9CisKKwkvKioKKwkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuCisJICovCisJcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgeworCX0KKworCXB1YmxpYyBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7CisJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKKwkJY29udGFpbmVyLnNldExheW91dChsYXlvdXQpOworCQlsYXlvdXQubWFyZ2luV2lkdGggPSBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKKwkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOworCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb250YWluZXIsIFNXVC5OVUxMKTsKKwkJbGFiZWwuc2V0VGV4dChVcGRhdGVVSU1lc3NhZ2VzLlVwZGF0ZVNldHRpbmdzUHJlZmVyZW5jZVBhZ2VfbGFiZWwpOyAKKwkJbWFwcGluZ3NGaWxlID0gbmV3IFRleHQoY29udGFpbmVyLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7CisKKwkJaW5pdGlhbGl6ZSgpOworCQltYXBwaW5nc0ZpbGUuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7CisJCQkJdGV4dENoYW5nZWQoKTsKKwkJCX0KKwkJfSk7CisJCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7CisJCW1hcHBpbmdzRmlsZS5zZXRMYXlvdXREYXRhKGdkKTsKKwkJcmV0dXJuIGNvbnRhaW5lcjsKKwl9CisKKwlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgpIHsKKwkJUHJlZmVyZW5jZXMgcHJlZiA9IFVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKKwkJU3RyaW5nIHRleHQgPSBwcmVmLmdldFN0cmluZyhVcGRhdGVVdGlscy5QX1VQREFURV9QT0xJQ1lfVVJMKTsKKwkJbWFwcGluZ3NGaWxlLnNldFRleHQodGV4dCk7CisJCXRleHRDaGFuZ2VkKCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHRleHRDaGFuZ2VkKCkgeworCQlTdHJpbmcgdGV4dCA9IG1hcHBpbmdzRmlsZS5nZXRUZXh0KCk7CisJCWlmICh0ZXh0Lmxlbmd0aCgpID4gMCkgeworCQkJdHJ5IHsKKwkJCQluZXcgVVJMKHRleHQpOworCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKwkJCQlzZXRWYWxpZChmYWxzZSk7CisJCQkJc2V0RXJyb3JNZXNzYWdlKFVwZGF0ZVVJTWVzc2FnZXMuVXBkYXRlU2V0dGluZ3NQcmVmZXJlbmNlUGFnZV9pbnZhbGlkKTsgCisJCQkJcmV0dXJuOworCQkJfQorCQl9CisJCXNldFZhbGlkKHRydWUpOworCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7CisJfQorCisJcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgeworCQlQcmVmZXJlbmNlcyBwcmVmID0gVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOworCQlTdHJpbmcgdGV4dCA9IG1hcHBpbmdzRmlsZS5nZXRUZXh0KCk7CisJCWlmICh0ZXh0Lmxlbmd0aCgpID4gMCkKKwkJCXByZWYuc2V0VmFsdWUoVXBkYXRlVXRpbHMuUF9VUERBVEVfUE9MSUNZX1VSTCwgdGV4dCk7CisJCWVsc2UKKwkJCXByZWYuc2V0VG9EZWZhdWx0KFVwZGF0ZVV0aWxzLlBfVVBEQVRFX1BPTElDWV9VUkwpOworCQlVcGRhdGVDb3JlLmdldFBsdWdpbigpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7CisJCW1hcHBpbmdzRmlsZS5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAorCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJc3VwZXIuY3JlYXRlQ29udHJvbChwYXJlbnQpOworCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KGdldENvbnRyb2woKSk7CisJCS8qCisJCVdvcmtiZW5jaEhlbHAuc2V0SGVscCgKKwkJCXBhcmVudCwib3JnLmVjbGlwc2UudXBkYXRlLnVpLkFwcFNlcnZlclByZWZlcmVuY2VQYWdlIik7CisJCSovCisJfQorfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3Byb3BlcnRpZXMvQ29uZmlndXJlZFNpdGVQcm9wZXJ0eVBhZ2UuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wcm9wZXJ0aWVzL0NvbmZpZ3VyZWRTaXRlUHJvcGVydHlQYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzlhZWIyYgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wcm9wZXJ0aWVzL0NvbmZpZ3VyZWRTaXRlUHJvcGVydHlQYWdlLmphdmEKQEAgLTAsMCArMSw2MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wcm9wZXJ0aWVzOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWwuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUlNZXNzYWdlczsKKworLyoqCisgKiBAc2VlIFByb3BlcnR5UGFnZQorICovCitwdWJsaWMgY2xhc3MgQ29uZmlndXJlZFNpdGVQcm9wZXJ0eVBhZ2UgZXh0ZW5kcyBQcm9wZXJ0eVBhZ2UgaW1wbGVtZW50cyBJV29ya2JlbmNoUHJvcGVydHlQYWdlIHsKKwkvKioKKwkgKgorCSAqLworCXB1YmxpYyBDb25maWd1cmVkU2l0ZVByb3BlcnR5UGFnZSgpIHsKKwkJbm9EZWZhdWx0QW5kQXBwbHlCdXR0b24oKTsKKwl9CisKKwlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSAgeworCQlJQ29uZmlndXJlZFNpdGVBZGFwdGVyIGFkYXB0ZXIgPSAoSUNvbmZpZ3VyZWRTaXRlQWRhcHRlcilnZXRFbGVtZW50KCk7CisJCUlDb25maWd1cmVkU2l0ZSBjc2l0ZSA9IGFkYXB0ZXIuZ2V0Q29uZmlndXJlZFNpdGUoKTsKKwkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LFNXVC5OT05FKTsKKwkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOworCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7CisJCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKKwkJYWRkUHJvcGVydHkoY29tcG9zaXRlLCBVcGRhdGVVSU1lc3NhZ2VzLkNvbmZpZ3VyZWRTaXRlUHJvcGVydHlQYWdlX3BhdGgsIGNzaXRlLmdldFNpdGUoKS5nZXRVUkwoKS50b1N0cmluZygpKTsgCisJCWFkZFByb3BlcnR5KGNvbXBvc2l0ZSwgVXBkYXRlVUlNZXNzYWdlcy5Db25maWd1cmVkU2l0ZVByb3BlcnR5UGFnZV90eXBlLCBnZXRMb2NhdGlvblR5cGUoY3NpdGUpKTsgCisJCWFkZFByb3BlcnR5KGNvbXBvc2l0ZSwgVXBkYXRlVUlNZXNzYWdlcy5Db25maWd1cmVkU2l0ZVByb3BlcnR5UGFnZV9lbmFibGVkLCBjc2l0ZS5pc0VuYWJsZWQoKT9VcGRhdGVVSU1lc3NhZ2VzLkNvbmZpZ3VyZWRTaXRlUHJvcGVydHlQYWdlX3llczpVcGRhdGVVSU1lc3NhZ2VzLkNvbmZpZ3VyZWRTaXRlUHJvcGVydHlQYWdlX25vKTsgCisJCXJldHVybiBjb21wb3NpdGU7CisJfQorCQorCXByaXZhdGUgU3RyaW5nIGdldExvY2F0aW9uVHlwZShJQ29uZmlndXJlZFNpdGUgY3NpdGUpIHsKKwkJaWYgKGNzaXRlLmlzRXh0ZW5zaW9uU2l0ZSgpKQorCQkJcmV0dXJuIFVwZGF0ZVVJTWVzc2FnZXMuQ29uZmlndXJlZFNpdGVQcm9wZXJ0eVBhZ2VfZXh0ZW5zaW9uOyAKKwkJaWYgKGNzaXRlLmlzUHJvZHVjdFNpdGUoKSkKKwkJCXJldHVybiBVcGRhdGVVSU1lc3NhZ2VzLkNvbmZpZ3VyZWRTaXRlUHJvcGVydHlQYWdlX3Byb2R1Y3Q7IAorCQlyZXR1cm4gVXBkYXRlVUlNZXNzYWdlcy5Db25maWd1cmVkU2l0ZVByb3BlcnR5UGFnZV91bmtub3duOyAKKwl9CisJCisJcHJpdmF0ZSB2b2lkIGFkZFByb3BlcnR5KENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgeworCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OVUxMKTsKKwkJbGFiZWwuc2V0VGV4dChrZXkpOworCQkKKwkJbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTlVMTCk7CisJCWxhYmVsLnNldFRleHQodmFsdWUpOworCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOworCQlsYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKKwl9Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcHJvcGVydGllcy9GZWF0dXJlQ29weXJpZ2h0UHJvcGVydHlQYWdlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcHJvcGVydGllcy9GZWF0dXJlQ29weXJpZ2h0UHJvcGVydHlQYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU1YzJhNgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wcm9wZXJ0aWVzL0ZlYXR1cmVDb3B5cmlnaHRQcm9wZXJ0eVBhZ2UuamF2YQpAQCAtMCwwICsxLDkyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnByb3BlcnRpZXM7CisKK2ltcG9ydCBqYXZhLm5ldC4qOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnBhcnRzLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSU1lc3NhZ2VzOworCisvKioKKyAqIEBzZWUgUHJvcGVydHlQYWdlCisgKi8KK3B1YmxpYyBjbGFzcyBGZWF0dXJlQ29weXJpZ2h0UHJvcGVydHlQYWdlIGV4dGVuZHMgUHJvcGVydHlQYWdlIGltcGxlbWVudHMgSVdvcmtiZW5jaFByb3BlcnR5UGFnZSB7CisJLyoqCisJICoKKwkgKi8KKwlwdWJsaWMgRmVhdHVyZUNvcHlyaWdodFByb3BlcnR5UGFnZSgpIHsKKwkJbm9EZWZhdWx0QW5kQXBwbHlCdXR0b24oKTsKKwl9CisKKwlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7CisJCXRyeSB7CisJCQlJRmVhdHVyZUFkYXB0ZXIgYWRhcHRlciA9IChJRmVhdHVyZUFkYXB0ZXIpIGdldEVsZW1lbnQoKTsKKwkJCUlGZWF0dXJlIGZlYXR1cmUgPSBhZGFwdGVyLmdldEZlYXR1cmUobnVsbCk7CisKKwkJCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOworCQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKKworCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuV1JBUCk7CisJCQlHcmlkRGF0YSBnZCA9CisJCQkJbmV3IEdyaWREYXRhKAorCQkJCQlHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpOworCQkJZ2Qud2lkdGhIaW50ID0gY29tcHV0ZVdpZHRoTGltaXQobGFiZWwsIDgwKTsKKwkJCWxhYmVsLnNldExheW91dERhdGEoZ2QpOworCisJCQlJVVJMRW50cnkgY29weXJpZ2h0ID0gZmVhdHVyZS5nZXRDb3B5cmlnaHQoKTsKKwkJCVN0cmluZyBhbm5vdGF0aW9uID0gKGNvcHlyaWdodCAhPSBudWxsKSA/IGNvcHlyaWdodC5nZXRBbm5vdGF0aW9uKCkgOiBudWxsOworCisJCQlpZiAoYW5ub3RhdGlvbiAhPSBudWxsICYmIGFubm90YXRpb24ubGVuZ3RoKCkgPiAwKSB7CisJCQkJbGFiZWwuc2V0VGV4dChhbm5vdGF0aW9uKTsKKwkJCQlmaW5hbCBVUkwgdXJsID0gY29weXJpZ2h0LmdldFVSTCgpOworCQkJCVN0cmluZyBmaWxlbmFtZSA9ICh1cmwgIT0gbnVsbCkgPyB1cmwuZ2V0RmlsZSgpIDogbnVsbDsKKwkJCQlpZiAoZmlsZW5hbWUgIT0gbnVsbAorCQkJCQkmJiAoZmlsZW5hbWUuZW5kc1dpdGgoIi5odG0iKSB8fCBmaWxlbmFtZS5lbmRzV2l0aCgiLmh0bWwiKSkpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULlBVU0gpOworCQkJCQlidXR0b24uc2V0VGV4dChVcGRhdGVVSU1lc3NhZ2VzLkZlYXR1cmVDb3B5cmlnaHRQcm9wZXJ0eVBhZ2Vfc2hvd0luQnJvd3Nlcik7IAorCQkJCQlidXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpKTsKKwkJCQkJU1dUVXRpbC5zZXRCdXR0b25EaW1lbnNpb25IaW50KGJ1dHRvbik7CisJCQkJCWJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQkJCQlVcGRhdGVVSS5zaG93VVJMKHVybC50b0V4dGVybmFsRm9ybSgpKTsKKwkJCQkJCX0KKwkJCQkJfSk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlsYWJlbC5zZXRUZXh0KFVwZGF0ZVVJTWVzc2FnZXMuRmVhdHVyZUNvcHlyaWdodFByb3BlcnR5UGFnZV9ub0NvcHlyaWdodCk7IAorCQkJfQorCQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOworCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJcHJpdmF0ZSBpbnQgY29tcHV0ZVdpZHRoTGltaXQoTGFiZWwgbGFiZWwsIGludCBuY2hhcnMpIHsKKwkJR0MgZ2MgPSBuZXcgR0MobGFiZWwpOworCQlnYy5zZXRGb250KGxhYmVsLmdldEZvbnQoKSk7CisJCUZvbnRNZXRyaWNzIGZvbnRNZXRyaWNzPSBnYy5nZXRGb250TWV0cmljcygpOworCQlnYy5kaXNwb3NlKCk7CisJCXJldHVybiBEaWFsb2cuY29udmVydFdpZHRoSW5DaGFyc1RvUGl4ZWxzKGZvbnRNZXRyaWNzLCBuY2hhcnMpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3Byb3BlcnRpZXMvRmVhdHVyZUdlbmVyYWxQcm9wZXJ0eVBhZ2UuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wcm9wZXJ0aWVzL0ZlYXR1cmVHZW5lcmFsUHJvcGVydHlQYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FjYmExMQotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wcm9wZXJ0aWVzL0ZlYXR1cmVHZW5lcmFsUHJvcGVydHlQYWdlLmphdmEKQEAgLTAsMCArMSwxNzUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkucHJvcGVydGllczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJvcGVydHlQYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJvcGVydHlQYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklVUkxFbnRyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC5Db250ZW50RW50cnlNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWwuSUZlYXR1cmVBZGFwdGVyOworCitwdWJsaWMgY2xhc3MgRmVhdHVyZUdlbmVyYWxQcm9wZXJ0eVBhZ2UKKwlleHRlbmRzIFByb3BlcnR5UGFnZQorCWltcGxlbWVudHMgSVdvcmtiZW5jaFByb3BlcnR5UGFnZSB7CisJCQorCXB1YmxpYyBGZWF0dXJlR2VuZXJhbFByb3BlcnR5UGFnZSgpIHsKKwkJbm9EZWZhdWx0QW5kQXBwbHlCdXR0b24oKTsKKwl9CisKKwlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7CisJCXRyeSB7CisJCQlJRmVhdHVyZUFkYXB0ZXIgYWRhcHRlciA9IChJRmVhdHVyZUFkYXB0ZXIpIGdldEVsZW1lbnQoKTsKKwkJCUlGZWF0dXJlIGZlYXR1cmUgPSBhZGFwdGVyLmdldEZlYXR1cmUobnVsbCk7CisKKwkJCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOworCQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOworCQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKKwkJCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOworCQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDE1OworCQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOworCQkJCisJCQlhZGRHZW5lcmFsU2VjdGlvbihmZWF0dXJlLCBjb21wb3NpdGUpOworCQkJYWRkU3VwcG9ydGVkUGxhdGZvcm1zU2VjdGlvbihmZWF0dXJlLCBjb21wb3NpdGUpOworCQkJYWRkRGVzY3JpcHRpb24oZmVhdHVyZSwgY29tcG9zaXRlKTsKKwkJCQorCQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOworCQkJCisJCQlyZXR1cm4gY29tcG9zaXRlOworCisJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQl9CisKKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHJpdmF0ZSB2b2lkIGFkZEdlbmVyYWxTZWN0aW9uKElGZWF0dXJlIGZlYXR1cmUsIENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7CisJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKKwkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOworCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOworCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKKwkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOworCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7CisJCUNvbXBvc2l0ZSBmaWVsZENvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7CisJCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7CisJCWxheW91dC5udW1Db2x1bW5zID0gMjsKKwkJZmllbGRDb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7CisJCQorCQlMYWJlbCBpbWFnZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULlJJR0hUKTsKKwkJaW1hZ2VMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKKwkJaWYgKGZlYXR1cmUuZ2V0SW1hZ2UoKSE9bnVsbCkgeworCQkJSW1hZ2VEZXNjcmlwdG9yIGRlc2MgPSBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTChmZWF0dXJlLmdldEltYWdlKCkpOworCQkJaW1hZ2VMYWJlbC5zZXRJbWFnZShVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0TGFiZWxQcm92aWRlcigpLmdldChkZXNjKSk7CisJCX0KKwkJZWxzZSB7CisJCQlpbWFnZUxhYmVsLnNldEltYWdlKFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRMYWJlbFByb3ZpZGVyKCkuZ2V0KFVwZGF0ZVVJSW1hZ2VzLkRFU0NfUFJPVklERVIpKTsKKwkJfQorCQlhZGRGaWVsZChmaWVsZENvbXBvc2l0ZSwgVXBkYXRlVUlNZXNzYWdlcy5GZWF0dXJlR2VuZXJhbFByb3BlcnR5UGFnZV9uYW1lLCBmZWF0dXJlLmdldExhYmVsKCkpOworCisJCWFkZEZpZWxkKAorCQkJCWZpZWxkQ29tcG9zaXRlLAorCQkJVXBkYXRlVUlNZXNzYWdlcy5GZWF0dXJlR2VuZXJhbFByb3BlcnR5UGFnZV9pZCwgCisJCQlmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRJZGVudGlmaWVyKCkpOworCQlhZGRGaWVsZCgKKwkJCQlmaWVsZENvbXBvc2l0ZSwKKwkJCVVwZGF0ZVVJTWVzc2FnZXMuRmVhdHVyZUdlbmVyYWxQcm9wZXJ0eVBhZ2VfdmVyc2lvbiwgCisJCQlmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRWZXJzaW9uKCkudG9TdHJpbmcoKSk7CisJCWFkZEZpZWxkKGZpZWxkQ29tcG9zaXRlLCBVcGRhdGVVSU1lc3NhZ2VzLkZlYXR1cmVHZW5lcmFsUHJvcGVydHlQYWdlX3Byb3ZpZGVyLCBmZWF0dXJlLmdldFByb3ZpZGVyKCkpOyAKKwkJbG9uZyBzaXplID0gZmVhdHVyZS5nZXRJbnN0YWxsU2l6ZSgpOworCQlpZiAoc2l6ZSAhPSBDb250ZW50RW50cnlNb2RlbC5VTktOT1dOX1NJWkUpIHsKKwkJCWFkZEZpZWxkKGZpZWxkQ29tcG9zaXRlLCBVcGRhdGVVSU1lc3NhZ2VzLkZlYXR1cmVHZW5lcmFsUHJvcGVydHlQYWdlX3NpemUsIG5ldyBMb25nKHNpemUpLnRvU3RyaW5nKCkgKyAiICIgKyBVcGRhdGVVSU1lc3NhZ2VzLkZlYXR1cmVHZW5lcmFsUHJvcGVydHlQYWdlX0tpbG9ieXRlcyk7ICAvLyROT04tTkxTLTEkCisJCX0KKwl9CisJCisJcHJpdmF0ZSB2b2lkIGFkZFN1cHBvcnRlZFBsYXRmb3Jtc1NlY3Rpb24oSUZlYXR1cmUgZmVhdHVyZSwgQ29tcG9zaXRlIHBhcmVudCkgeworCQlHcm91cCBncm91cCA9IG5ldyBHcm91cChwYXJlbnQsIFNXVC5OT05FKTsKKwkJZ3JvdXAuc2V0VGV4dChVcGRhdGVVSU1lc3NhZ2VzLkZlYXR1cmVHZW5lcmFsUHJvcGVydHlQYWdlX3BsYXRmb3Jtcyk7IAorCisJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKKwkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOworCQlsYXlvdXQubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gdHJ1ZTsKKwkJZ3JvdXAuc2V0TGF5b3V0KGxheW91dCk7CisJCWdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOworCisJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGdyb3VwLCBTV1QuTk9ORSk7CisJCWxhYmVsLnNldFRleHQoTkxTLmJpbmQoVXBkYXRlVUlNZXNzYWdlcy5GZWF0dXJlR2VuZXJhbFByb3BlcnR5UGFnZV9vcyxleHRyYWN0VmFsdWUoZmVhdHVyZS5nZXRPUygpKSkpOyAKKworCQlsYWJlbCA9IG5ldyBMYWJlbChncm91cCwgU1dULk5PTkUpOworCQlsYWJlbC5zZXRUZXh0KE5MUy5iaW5kKFVwZGF0ZVVJTWVzc2FnZXMuRmVhdHVyZUdlbmVyYWxQcm9wZXJ0eVBhZ2Vfd3MsIGV4dHJhY3RWYWx1ZShmZWF0dXJlLmdldFdTKCkpKSk7IAorCisJCWxhYmVsID0gbmV3IExhYmVsKGdyb3VwLCBTV1QuTk9ORSk7CisJCWxhYmVsLnNldFRleHQoTkxTLmJpbmQoVXBkYXRlVUlNZXNzYWdlcy5GZWF0dXJlR2VuZXJhbFByb3BlcnR5UGFnZV9hcmNoLCBleHRyYWN0VmFsdWUoZmVhdHVyZS5nZXRPU0FyY2goKSkpKTsgCisKKwkJbGFiZWwgPSBuZXcgTGFiZWwoZ3JvdXAsIFNXVC5OT05FKTsKKwkJbGFiZWwuc2V0VGV4dChOTFMuYmluZChVcGRhdGVVSU1lc3NhZ2VzLkZlYXR1cmVHZW5lcmFsUHJvcGVydHlQYWdlX25sLCBleHRyYWN0VmFsdWUoZmVhdHVyZS5nZXROTCgpKSkpOyAKKwl9CisKKwlwcml2YXRlIHZvaWQgYWRkRmllbGQoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHByb3BlcnR5LCBTdHJpbmcgdmFsdWUpIHsKKworCQlpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5sZW5ndGgoKSA+IDApIHsKKwkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOworCQkJbGFiZWwuc2V0VGV4dChwcm9wZXJ0eSk7CisKKwkJCWxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOworCQkJbGFiZWwuc2V0VGV4dChnZXRFc2NhcGVkU3RyaW5nKHZhbHVlKSk7CisJCX0KKwl9CisJCisJcHJpdmF0ZSBTdHJpbmcgZXh0cmFjdFZhbHVlKFN0cmluZyB2YWx1ZSkgeworCQlpZiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZS5lcXVhbHMoIioiKSkgLy8kTk9OLU5MUy0xJAorCQkJcmV0dXJuIFVwZGF0ZVVJTWVzc2FnZXMuRmVhdHVyZUdlbmVyYWxQcm9wZXJ0eVBhZ2VfYWxsOyAKKwkJcmV0dXJuIHZhbHVlOworCX0KKworCXByaXZhdGUgdm9pZCBhZGREZXNjcmlwdGlvbihJRmVhdHVyZSBmZWF0dXJlLCBDb21wb3NpdGUgcGFyZW50KSB7CisJCUlVUkxFbnRyeSBkZXNjcmlwdGlvbiA9IGZlYXR1cmUuZ2V0RGVzY3JpcHRpb24oKTsKKwkJaWYgKGRlc2NyaXB0aW9uICE9IG51bGwpIHsKKwkJCVN0cmluZyBhbm5vdGF0aW9uID0gZGVzY3JpcHRpb24uZ2V0QW5ub3RhdGlvbigpOworCQkJaWYgKGFubm90YXRpb24gIT0gbnVsbCAmJiBhbm5vdGF0aW9uLmxlbmd0aCgpID4gMCkgeworCQkJCUdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5PTkUpOworCQkJCWdyb3VwLnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5GZWF0dXJlR2VuZXJhbFByb3BlcnR5UGFnZV9kZXNjKTsgCisJCQkJZ3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOworCQkJCWdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOworCisJCQkJVGV4dCB0ZXh0ID0gbmV3IFRleHQoZ3JvdXAsIFNXVC5NVUxUSSB8IFNXVC5XUkFQKTsKKwkJCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOworCQkJCWdkLmhlaWdodEhpbnQgPSAyMDA7CisJCQkJZ2Qud2lkdGhIaW50ID0gMzUwOworCQkJCXRleHQuc2V0RWRpdGFibGUoZmFsc2UpOworCQkJCXRleHQuc2V0VGV4dChhbm5vdGF0aW9uKTsKKwkJCQl0ZXh0LnNldExheW91dERhdGEoZ2QpOworCQkJfQorCQl9CisJfQorCQorCXByaXZhdGUgU3RyaW5nIGdldEVzY2FwZWRTdHJpbmcoU3RyaW5nIHZhbHVlKSB7CisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHZhbHVlLmxlbmd0aCgpICsgMTApOworCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aCgpOyArK2kpIHsKKwkJCWNoYXIgYyA9IHZhbHVlLmNoYXJBdChpKTsKKwkJCWlmICgnJicgPT0gYykgeworCQkJCXJlc3VsdC5hcHBlbmQoIiYmIik7IC8vJE5PTi1OTFMtMSQKKwkJCX0gZWxzZSB7CisJCQkJcmVzdWx0LmFwcGVuZChjKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3Byb3BlcnRpZXMvRmVhdHVyZUxpY2Vuc2VQcm9wZXJ0eVBhZ2UuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wcm9wZXJ0aWVzL0ZlYXR1cmVMaWNlbnNlUHJvcGVydHlQYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI2ZTgzYgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wcm9wZXJ0aWVzL0ZlYXR1cmVMaWNlbnNlUHJvcGVydHlQYWdlLmphdmEKQEAgLTAsMCArMSw3OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wcm9wZXJ0aWVzOworCitpbXBvcnQgamF2YS5uZXQuKjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wYXJ0cy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUlNZXNzYWdlczsKKworCitwdWJsaWMgY2xhc3MgRmVhdHVyZUxpY2Vuc2VQcm9wZXJ0eVBhZ2UgZXh0ZW5kcyBQcm9wZXJ0eVBhZ2UgaW1wbGVtZW50cyBJV29ya2JlbmNoUHJvcGVydHlQYWdlIHsKKwlwdWJsaWMgRmVhdHVyZUxpY2Vuc2VQcm9wZXJ0eVBhZ2UoKSB7CisJCW5vRGVmYXVsdEFuZEFwcGx5QnV0dG9uKCk7CisJfQorCisJcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgIHsKKwkJdHJ5IHsKKwkJCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOworCQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKKworCQkJSUZlYXR1cmVBZGFwdGVyIGFkYXB0ZXIgPSAoSUZlYXR1cmVBZGFwdGVyKWdldEVsZW1lbnQoKTsKKwkJCUlGZWF0dXJlIGZlYXR1cmUgPSBhZGFwdGVyLmdldEZlYXR1cmUobnVsbCk7CQkJCisJCQlJVVJMRW50cnkgbGljZW5zZSA9IGZlYXR1cmUuZ2V0TGljZW5zZSgpOworCQkJU3RyaW5nIGFubm90YXRpb24gPSAobGljZW5zZSAhPSBudWxsKSA/IGxpY2Vuc2UuZ2V0QW5ub3RhdGlvbigpIDogbnVsbDsKKwkJCQorCQkJaWYgKGFubm90YXRpb24gIT0gbnVsbCAmJiBhbm5vdGF0aW9uLmxlbmd0aCgpID4gMCkgeworCQkJCVRleHQgdGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULk1VTFRJIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULkJPUkRFUiB8IFNXVC5XUkFQKTsKKwkJCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOworCQkJCWdkLmhlaWdodEhpbnQgPSAyMDA7CisJCQkJZ2Qud2lkdGhIaW50ID0gMzUwOworCQkJCXRleHQuc2V0TGF5b3V0RGF0YShnZCk7CisJCQkJdGV4dC5zZXRUZXh0KGFubm90YXRpb24pOworCQkJCXRleHQuc2V0RWRpdGFibGUoZmFsc2UpOworCQkJCWZpbmFsIFVSTCB1cmwgPSBsaWNlbnNlLmdldFVSTCgpOworCQkJCVN0cmluZyBmaWxlbmFtZSA9ICh1cmwgIT0gbnVsbCkgPyB1cmwuZ2V0RmlsZSgpIDogbnVsbDsKKwkJCQlpZiAoZmlsZW5hbWUgIT0gbnVsbCAmJiAoZmlsZW5hbWUuZW5kc1dpdGgoIi5odG0iKSB8fCB1cmwuZ2V0RmlsZSgpLmVuZHNXaXRoKCIuaHRtbCIpKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuUFVTSCk7CisJCQkJCWJ1dHRvbi5zZXRUZXh0KFVwZGF0ZVVJTWVzc2FnZXMuRmVhdHVyZUxpY2Vuc2VQcm9wZXJ0eVBhZ2Vfc2hvd0luQnJvd3Nlcik7IAorCQkJCQlidXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpKTsKKwkJCQkJU1dUVXRpbC5zZXRCdXR0b25EaW1lbnNpb25IaW50KGJ1dHRvbik7CisJCQkJCWJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQkJCQlVcGRhdGVVSS5zaG93VVJMKHVybC50b0V4dGVybmFsRm9ybSgpKTsKKwkJCQkJCX0KKwkJCQkJfSk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OVUxMKTsKKwkJCQlsYWJlbC5zZXRUZXh0KFVwZGF0ZVVJTWVzc2FnZXMuRmVhdHVyZUxpY2Vuc2VQcm9wZXJ0eVBhZ2Vfbm9MaWNlbnNlKTsgCisJCQl9CisJCQkKKwkJCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKKwkJCQorCQkJcmV0dXJuIGNvbXBvc2l0ZTsKKwkJCQorCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcHJvcGVydGllcy9GZWF0dXJlU3RhdHVzUHJvcGVydHlQYWdlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcHJvcGVydGllcy9GZWF0dXJlU3RhdHVzUHJvcGVydHlQYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI5MDg4NwotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wcm9wZXJ0aWVzL0ZlYXR1cmVTdGF0dXNQcm9wZXJ0eVBhZ2UuamF2YQpAQCAtMCwwICsxLDE2MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wcm9wZXJ0aWVzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwub3BlcmF0aW9ucy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUlNZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy4qOworCisvKioKKyAqIEBzZWUgUHJvcGVydHlQYWdlCisgKi8KK3B1YmxpYyBjbGFzcyBGZWF0dXJlU3RhdHVzUHJvcGVydHlQYWdlCisJZXh0ZW5kcyBQcm9wZXJ0eVBhZ2UKKwlpbXBsZW1lbnRzIElXb3JrYmVuY2hQcm9wZXJ0eVBhZ2UgeworCS8qKgorCSAqCisJICovCisJcHVibGljIEZlYXR1cmVTdGF0dXNQcm9wZXJ0eVBhZ2UoKSB7CisJCW5vRGVmYXVsdEFuZEFwcGx5QnV0dG9uKCk7CisJfQorCisJcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgeworCQl0cnkgeworCisJCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKKwkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKKwkJCWxheW91dC5udW1Db2x1bW5zID0gMTsKKwkJCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAyMDsKKwkJCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKKworCQkJVGV4dCBtZXNzYWdlID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuTVVMVEkgfCBTV1QuV1JBUCk7CisJCQltZXNzYWdlLnNldEVkaXRhYmxlKGZhbHNlKTsKKwkJCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7CisJCQlnZC53aWR0aEhpbnQgPSAzNTA7CisJCQltZXNzYWdlLnNldExheW91dERhdGEoZ2QpOworCQkJCisJCQlDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXIgYWRhcHRlciA9IChDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXIpIGdldEVsZW1lbnQoKTsKKwkJCUlGZWF0dXJlIGZlYXR1cmUgPSBhZGFwdGVyLmdldEZlYXR1cmUobnVsbCk7CisJCQkKKwkJCWlmIChPcGVyYXRpb25zTWFuYWdlci5maW5kUGVuZGluZ09wZXJhdGlvbihmZWF0dXJlKSAhPSBudWxsKSB7CisJCQkJbWVzc2FnZS5zZXRUZXh0KFVwZGF0ZVVJTWVzc2FnZXMuRmVhdHVyZVN0YXR1c1Byb3BlcnR5UGFnZV9wZW5kaW5nQ2hhbmdlcyk7IAorCQkJCXJldHVybiBjb21wb3NpdGU7CisJCQl9CisJCQkKKwkJCUlTdGF0dXMgc3RhdHVzID0gZ2V0U3RhdHVzKGZlYXR1cmUpOworCQkJaW50IHNldmVyaXR5ID0gc3RhdHVzLmdldFNldmVyaXR5KCk7CisJCQlpZiAoc2V2ZXJpdHkgPT0gSVN0YXR1cy5FUlJPUgorCQkJCSYmIGdldFN0YXR1c0NvZGUoZmVhdHVyZSwgc3RhdHVzKSA9PSBJRmVhdHVyZS5TVEFUVVNfSEFQUFkpIHsKKwkJCQlzZXZlcml0eSA9IElTdGF0dXMuT0s7CisJCQkJbWVzc2FnZS5zZXRUZXh0KFVwZGF0ZVVJTWVzc2FnZXMuRmVhdHVyZVN0YXR1c1Byb3BlcnR5UGFnZV9nb29kQ29uZmlndXJhdGlvbik7IAorCQkJfSBlbHNlIHsKKwkJCQltZXNzYWdlLnNldFRleHQoc3RhdHVzLmdldE1lc3NhZ2UoKSk7CisJCQl9CisJCQlpZiAoc2V2ZXJpdHkgIT0gSVN0YXR1cy5PSyAmJiBzdGF0dXMuaXNNdWx0aVN0YXR1cygpKSB7CisJCQkJU3RyaW5nIHJlYXNvbiA9IGdldFJlYXNvbihzdGF0dXMpOworCQkJCWlmIChyZWFzb24ubGVuZ3RoKCkgPiAwKSB7CisJCQkJCUNvbXBvc2l0ZSBjb21wID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKKwkJCQkJY29tcC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7CisJCQkJCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7CisJCQkJCWNvbXAuc2V0TGF5b3V0RGF0YShnZCk7CisKKwkJCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcCwgU1dULk5PTkUpOworCQkJCQlsYWJlbC5zZXRUZXh0KFVwZGF0ZVVJTWVzc2FnZXMuRmVhdHVyZVN0YXR1c1Byb3BlcnR5UGFnZV9yZWFzb24pOyAKKworCQkJCQlUZXh0IHRleHQgPQorCQkJCQkJbmV3IFRleHQoY29tcCwgU1dULk1VTFRJIHwgU1dULkJPUkRFUiB8IFNXVC5XUkFQIHwgU1dULlZfU0NST0xMKTsKKwkJCQkJdGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7CisJCQkJCXRleHQuc2V0VGV4dChyZWFzb24pOworCQkJCQlnZC53aWR0aEhpbnQgPSAzNTA7CisJCQkJCXRleHQuc2V0TGF5b3V0RGF0YShnZCk7CisJCQkJfQorCisJCQl9CisJCQkKKwkJCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKKwkJCQorCQkJcmV0dXJuIGNvbXBvc2l0ZTsKKworCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJfQorCisJCXJldHVybiBudWxsOworCX0KKworCXByaXZhdGUgU3RyaW5nIGdldFJlYXNvbihJU3RhdHVzIHN0YXR1cykgeworCQlJU3RhdHVzW10gY2hpbGRyZW4gPSBzdGF0dXMuZ2V0Q2hpbGRyZW4oKTsKKwkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgeworCQkJU3RyaW5nIG1lc3NhZ2UgPSBjaGlsZHJlbltpXS5nZXRNZXNzYWdlKCk7CisJCQlpZiAobWVzc2FnZSAhPSBudWxsICYmIG1lc3NhZ2UubGVuZ3RoKCkgPiAwKSB7CisJCQkJYnVmZmVyLmFwcGVuZCgKKwkJCQkJbWVzc2FnZQorCQkJCQkJKyBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIikgLy8kTk9OLU5MUy0xJAorCQkJCQkJKyBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIikpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCX0KKwkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOworCX0KKworCXByaXZhdGUgSVN0YXR1cyBnZXRTdGF0dXMoSUZlYXR1cmUgZmVhdHVyZSkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlpZiAoZmVhdHVyZSBpbnN0YW5jZW9mIE1pc3NpbmdGZWF0dXJlKSB7CisJCQlpbnQgc2V2ZXJpdHk7CisJCQlTdHJpbmcgbWVzc2FnZSA9ICIiOyAvLyROT04tTkxTLTEkCisJCQlpZiAoKChNaXNzaW5nRmVhdHVyZSkgZmVhdHVyZSkuaXNPcHRpb25hbCgpKSB7CisJCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLk9LOworCQkJCW1lc3NhZ2UgPSBVcGRhdGVVSU1lc3NhZ2VzLkZlYXR1cmVTdGF0dXNQcm9wZXJ0eVBhZ2VfbWlzc2luZ09wdGlvbmFsOyAKKwkJCX0gZWxzZSB7CisJCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLkVSUk9SOworCQkJCW1lc3NhZ2UgPSBVcGRhdGVVSU1lc3NhZ2VzLkZlYXR1cmVTdGF0dXNQcm9wZXJ0eVBhZ2VfbWlzc2luZzsgCisJCQl9CisJCQlyZXR1cm4gbmV3IFN0YXR1cyhzZXZlcml0eSwgVXBkYXRlVUkuUExVR0lOX0lELCBJU3RhdHVzLk9LLCBtZXNzYWdlLCBudWxsKTsKKwkJfQorCQlyZXR1cm4gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkuZ2V0RmVhdHVyZVN0YXR1cyhmZWF0dXJlKTsKKwl9CisKKwlwcml2YXRlIGludCBnZXRTdGF0dXNDb2RlKElGZWF0dXJlIGZlYXR1cmUsIElTdGF0dXMgc3RhdHVzKSB7CisJCWludCBjb2RlID0gc3RhdHVzLmdldENvZGUoKTsKKwkJaWYgKGNvZGUgPT0gSUZlYXR1cmUuU1RBVFVTX1VOSEFQUFkpIHsKKwkJCWlmIChzdGF0dXMuaXNNdWx0aVN0YXR1cygpKSB7CisJCQkJSVN0YXR1c1tdIGNoaWxkcmVuID0gc3RhdHVzLmdldENoaWxkcmVuKCk7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgeworCQkJCQlJU3RhdHVzIGNoaWxkID0gY2hpbGRyZW5baV07CisJCQkJCWlmIChjaGlsZC5pc011bHRpU3RhdHVzKCkKKwkJCQkJCXx8IGNoaWxkLmdldENvZGUoKSAhPSBJRmVhdHVyZS5TVEFUVVNfRElTQUJMRUQpCisJCQkJCQlyZXR1cm4gY29kZTsKKwkJCQl9CisJCQkJLy8gSWYgd2UgYXJlIGhlcmUsIGdsb2JhbCBzdGF0dXMgaXMgdW5oYXBweQorCQkJCS8vIGJlY2F1c2Ugb25lIG9yIG1vcmUgaW5jbHVkZWQgZmVhdHVyZXMKKwkJCQkvLyBpcyBkaXNhYmxlZC4KKwkJCQlpZiAoVXBkYXRlVXRpbHMuaGFzT2Jzb2xldGVQYXRjaGVzKGZlYXR1cmUpKSB7CisJCQkJCS8vIFRoZSBkaXNhYmxlZCBpbmNsdWRlZCBmZWF0dXJlcworCQkJCQkvLyBhcmUgb2xkIHBhdGNoZXMgdGhhdCBhcmUgbm93CisJCQkJCS8vIHN1YnN1bWVkIGJ5IGJldHRlciB2ZXJzaW9ucyBvZgorCQkJCQkvLyB0aGUgZmVhdHVyZXMgdGhleSB3ZXJlIGRlc2lnbmVkIHRvCisJCQkJCS8vIHBhdGNoLgorCQkJCQlyZXR1cm4gSUZlYXR1cmUuU1RBVFVTX0hBUFBZOworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gY29kZTsKKwl9Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcHJvcGVydGllcy9JbnN0YWxsQ29uZmlndXJhdGlvblByb3BlcnR5UGFnZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3Byb3BlcnRpZXMvSW5zdGFsbENvbmZpZ3VyYXRpb25Qcm9wZXJ0eVBhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWY1N2JjCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3Byb3BlcnRpZXMvSW5zdGFsbENvbmZpZ3VyYXRpb25Qcm9wZXJ0eVBhZ2UuamF2YQpAQCAtMCwwICsxLDUxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnByb3BlcnRpZXM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJTWVzc2FnZXM7CisKKy8qKgorICogQHNlZSBQcm9wZXJ0eVBhZ2UKKyAqLworcHVibGljIGNsYXNzIEluc3RhbGxDb25maWd1cmF0aW9uUHJvcGVydHlQYWdlIGV4dGVuZHMgUHJvcGVydHlQYWdlIGltcGxlbWVudHMgSVdvcmtiZW5jaFByb3BlcnR5UGFnZSB7CisJLyoqCisJICoKKwkgKi8KKwlwdWJsaWMgSW5zdGFsbENvbmZpZ3VyYXRpb25Qcm9wZXJ0eVBhZ2UoKSB7CisJCW5vRGVmYXVsdEFuZEFwcGx5QnV0dG9uKCk7CisJfQorCisJcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgIHsKKwkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LFNXVC5OT05FKTsKKwkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOworCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7CisJCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKKwkJYWRkUHJvcGVydHkoY29tcG9zaXRlLCBVcGRhdGVVSU1lc3NhZ2VzLkNvbmZpZ3VyZWRTaXRlUHJvcGVydHlQYWdlX3BhdGgsIENvbmZpZ3VyYXRvclV0aWxzLmdldEluc3RhbGxVUkwoKS50b1N0cmluZygpKTsgCisJCXJldHVybiBjb21wb3NpdGU7CisJfQorCQorCisJcHJpdmF0ZSB2b2lkIGFkZFByb3BlcnR5KENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgeworCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OVUxMKTsKKwkJbGFiZWwuc2V0VGV4dChrZXkpOworCQkKKwkJbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTlVMTCk7CisJCWxhYmVsLnNldFRleHQodmFsdWUpOworCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOworCQlsYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKKwl9Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvc2VjdXJpdHkvQXV0aGVudGljYXRpb24uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9zZWN1cml0eS9BdXRoZW50aWNhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZmI5YTcKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvc2VjdXJpdHkvQXV0aGVudGljYXRpb24uamF2YQpAQCAtMCwwICsxLDM2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnNlY3VyaXR5OworCisvKioKKyAqIEtlZXBzIHVzZXIgYW5kIHBhc3N3b3JkIHN0cmluZ3MuCisgKi8KK3B1YmxpYyBjbGFzcyBBdXRoZW50aWNhdGlvbiB7CisJcHJvdGVjdGVkIFN0cmluZyB1c2VyOworCXByb3RlY3RlZCBTdHJpbmcgcGFzc3dvcmQ7CisJcHVibGljIEF1dGhlbnRpY2F0aW9uKFN0cmluZyB1c2VyLCBTdHJpbmcgcGFzc3dvcmQpeworCQl0aGlzLnVzZXIgPSB1c2VyOworCQl0aGlzLnBhc3N3b3JkID0gcGFzc3dvcmQ7CisJfQorCisJLyoqCisJICogQHJldHVybiBSZXR1cm5zIHRoZSBwYXNzd29yZC4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFBhc3N3b3JkKCkgeworCQlyZXR1cm4gcGFzc3dvcmQ7CisJfQorCS8qKgorCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgdXNlci4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFVzZXIoKSB7CisJCXJldHVybiB1c2VyOworCX0KK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9zZWN1cml0eS9KYXJWZXJpZmljYXRpb25EaWFsb2cuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9zZWN1cml0eS9KYXJWZXJpZmljYXRpb25EaWFsb2cuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmU5MjhhCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3NlY3VyaXR5L0phclZlcmlmaWNhdGlvbkRpYWxvZy5qYXZhCkBAIC0wLDAgKzEsMTQ1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnNlY3VyaXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLio7CisKKy8qKgorICogCisgKi8KK3B1YmxpYyBjbGFzcyBKYXJWZXJpZmljYXRpb25EaWFsb2cgZXh0ZW5kcyBUaXRsZUFyZWFEaWFsb2cgeworCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IElOU1RBTExfQUxMID0gQ0FOQ0VMICsgT0sgKyAxOworCXByaXZhdGUgSVZlcmlmaWNhdGlvblJlc3VsdCBfVmVyaWZpY2F0aW9uUmVzdWx0ID0gbnVsbDsKKwlwcml2YXRlIElEaWFsb2dQYWdlIF9EaWFsb2dQYWdlOworCXByaXZhdGUgQ29tcG9zaXRlIHBhZ2VDb250YWluZXI7CisJcHJpdmF0ZSBJbWFnZSBkZWZhdWx0SW1hZ2UgPSBudWxsOworCXByaXZhdGUgSW1hZ2VEZXNjcmlwdG9yIGRlZmF1bHRJbWFnZURlc2NyaXB0b3IgPQorCQlVcGRhdGVVSUltYWdlcy5ERVNDX1VQREFURV9XSVo7CisJCisJLyoqCisJICogQ29uc3RydWN0b3IgZm9yIEphclZlcmlmaWNhdGlvbkRpYWxvZy4KKwkgKiBAcGFyYW0gcGFyZW50U2hlbGwKKwkgKi8KKwlwdWJsaWMgSmFyVmVyaWZpY2F0aW9uRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLElEaWFsb2dQYWdlIGRpYWxvZ1BhZ2UsIElWZXJpZmljYXRpb25SZXN1bHQgdmVyaWZpY2F0aW9uUmVzdWx0KSB7CisJCXN1cGVyKHBhcmVudFNoZWxsKTsKKwkJc2V0U2hlbGxTdHlsZShTV1QuVElUTEUgfCBTV1QuQk9SREVSIHwgU1dULkFQUExJQ0FUSU9OX01PREFMIHwgU1dULlJFU0laRSk7CQkKKwkJX1ZlcmlmaWNhdGlvblJlc3VsdCA9IHZlcmlmaWNhdGlvblJlc3VsdDsKKwkJX0RpYWxvZ1BhZ2UgPSBkaWFsb2dQYWdlOworCQlpZiAoZGlhbG9nUGFnZSBpbnN0YW5jZW9mIEphclZlcmlmaWNhdGlvblBhZ2UpeworCQkJKChKYXJWZXJpZmljYXRpb25QYWdlKV9EaWFsb2dQYWdlKS5zZXRUaXRsZUFyZWFEaWFsb2codGhpcyk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBBZGQgYnV0dG9ucyB0byB0aGUgZGlhbG9nJ3MgYnV0dG9uIGJhci4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJaWYgKF9WZXJpZmljYXRpb25SZXN1bHQuZ2V0VmVyaWZpY2F0aW9uQ29kZSgpCisJCQkhPSBJVmVyaWZpY2F0aW9uUmVzdWx0LlRZUEVfRU5UUllfQ09SUlVQVEVEKSB7CisKKwkJCWlmIChfVmVyaWZpY2F0aW9uUmVzdWx0LmlzRmVhdHVyZVZlcmlmaWNhdGlvbigpKSB7CisJCQkJY3JlYXRlQnV0dG9uKAorCQkJCQlwYXJlbnQsCisJCQkJCUlEaWFsb2dDb25zdGFudHMuT0tfSUQsCisJCQkJCVVwZGF0ZVVJTWVzc2FnZXMuSmFyVmVyaWZpY2F0aW9uRGlhbG9nX0luc3RhbGwsIAorCQkJCQlmYWxzZSk7CisJCQl9IGVsc2UgeworCQkJCWNyZWF0ZUJ1dHRvbigKKwkJCQkJcGFyZW50LAorCQkJCQlJRGlhbG9nQ29uc3RhbnRzLk9LX0lELAorCQkJCQlVcGRhdGVVSU1lc3NhZ2VzLkphclZlcmlmaWNhdGlvbkRpYWxvZ19Db250aW51ZSwgCisJCQkJCWZhbHNlKTsJCQkJCisJCQl9CisJCQkvLyBSYWRpbyBidXR0b246IEluc3RhbGwgYWxsIHdpdGhvdXQgcHJvbXB0aW5nCisJCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCWNyZWF0ZUJ1dHRvbigKKwkJCQlwYXJlbnQsCisJCQkJSURpYWxvZ0NvbnN0YW50cy5ZRVNfVE9fQUxMX0lELAorCQkJCVVwZGF0ZVVJTWVzc2FnZXMuSmFyVmVyaWZpY2F0aW9uRGlhbG9nX0luc3RhbGxBbGwsIAorCQkJCWZhbHNlKTsJCQorCQkJCisJCQkvLyBSYWRpbyBidXR0b246IENhbmNlbCBpbnN0YWxsYXRpb24KKwkJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJY3JlYXRlQnV0dG9uKAorCQkJCXBhcmVudCwKKwkJCQlJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCwKKwkJCQlVcGRhdGVVSU1lc3NhZ2VzLkphclZlcmlmaWNhdGlvbkRpYWxvZ19DYW5jZWwsIAorCQkJCXRydWUpOwkJCQkJCQkKKwkJfSBlbHNlIHsKKwkJCWNyZWF0ZUJ1dHRvbigKKwkJCQlwYXJlbnQsCisJCQkJSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQsCisJCQkJVXBkYXRlVUlNZXNzYWdlcy5KYXJWZXJpZmljYXRpb25EaWFsb2dfQ2FuY2VsLCAKKwkJCQl0cnVlKTsKKwkJfQorCQlnZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQpLnNldEZvY3VzKCk7CisJfQorCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBNZXRob2QgZGVjbGFyZWQgb24gRGlhbG9nLgorCSAqLworCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgeworCQlDb21wb3NpdGUgY29tcG9zaXRlUGFyZW50ID0gKENvbXBvc2l0ZSlzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7CisJCXNldFRpdGxlSW1hZ2UodGhpcy5nZXRJbWFnZSgpKTsKKwkJc2V0VGl0bGUoVXBkYXRlVUlNZXNzYWdlcy5KYXJWZXJpZmljYXRpb25EaWFsb2dfVGl0bGUpOyAKKwkJCisJCV9EaWFsb2dQYWdlLmNyZWF0ZUNvbnRyb2woY29tcG9zaXRlUGFyZW50KTsKKwkJcGFnZUNvbnRhaW5lcj0oQ29tcG9zaXRlKV9EaWFsb2dQYWdlLmdldENvbnRyb2woKTsKKwkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKKwkJcGFnZUNvbnRhaW5lci5zZXRMYXlvdXREYXRhKGdkKTsKKwkJcGFnZUNvbnRhaW5lci5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwkJCisJCQorCQkvLyBCdWlsZCB0aGUgc2VwYXJhdG9yIGxpbmUKKwkJTGFiZWwgc2VwYXJhdG9yPSBuZXcgTGFiZWwoY29tcG9zaXRlUGFyZW50LCBTV1QuSE9SSVpPTlRBTCB8IFNXVC5TRVBBUkFUT1IpOworCQlzZXBhcmF0b3Iuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7CisJCQorCQlyZXR1cm4gY29tcG9zaXRlUGFyZW50OworCX0KKwkKKwkJLyoqCisJICogQHNlZSBJRGlhbG9nUGFnZSNnZXRJbWFnZSgpCisJICovCisJcHVibGljIEltYWdlIGdldEltYWdlKCkgeworCQlpZiAoZGVmYXVsdEltYWdlID09IG51bGwpCisJCQlkZWZhdWx0SW1hZ2UgPSBkZWZhdWx0SW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUltYWdlKCk7CisKKwkJcmV0dXJuIGRlZmF1bHRJbWFnZTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBjbG9zZSgpIHsKKwkJLy8gZGlzcG9zZSBvZiBpbWFnZQorCQlpZiAoZGVmYXVsdEltYWdlICE9IG51bGwpIHsKKwkJCWRlZmF1bHRJbWFnZS5kaXNwb3NlKCk7CisJCQlkZWZhdWx0SW1hZ2UgPSBudWxsOworCQl9CisJCXJldHVybiBzdXBlci5jbG9zZSgpOwkJCisJfQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nI2J1dHRvblByZXNzZWQoaW50KQorCSAqLworCXByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGJ1dHRvbklkKSB7CisJCWlmIChJRGlhbG9nQ29uc3RhbnRzLllFU19UT19BTExfSUQgPT0gYnV0dG9uSWQpCisJCQlpbnN0YWxsQWxsUHJlc3NlZCgpOworCQllbHNlCisJCQlzdXBlci5idXR0b25QcmVzc2VkKGJ1dHRvbklkKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIGluc3RhbGxBbGxQcmVzc2VkKCkgeworICAgICAgICBzZXRSZXR1cm5Db2RlKEphclZlcmlmaWNhdGlvbkRpYWxvZy5JTlNUQUxMX0FMTCk7CisgICAgICAgIGNsb3NlKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3NlY3VyaXR5L0phclZlcmlmaWNhdGlvblBhZ2UuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9zZWN1cml0eS9KYXJWZXJpZmljYXRpb25QYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk1M2JlZgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9zZWN1cml0eS9KYXJWZXJpZmljYXRpb25QYWdlLmphdmEKQEAgLTAsMCArMSwzMzMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuc2VjdXJpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5UaXRsZUFyZWFEaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuRm9udFJlZ2lzdHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklWZXJpZmljYXRpb25SZXN1bHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLndpemFyZHMuQmFubmVyUGFnZTsKKworLyoqCisgKiAKKyAqLworcHVibGljIGNsYXNzIEphclZlcmlmaWNhdGlvblBhZ2UgZXh0ZW5kcyBCYW5uZXJQYWdlIHsKKworCXByaXZhdGUgSVZlcmlmaWNhdGlvblJlc3VsdCBfVmVyaWZpY2F0aW9uUmVzdWx0ID0gbnVsbDsKKwlwcml2YXRlIFN0cmluZyBfZmlsZU5hbWUgPSBudWxsOworCXByaXZhdGUgU3RyaW5nIF9zdHJGZWF0dXJlTmFtZSA9IG51bGw7CisJcHJpdmF0ZSBTdHJpbmcgX3N0cklkID0gbnVsbDsKKwlwcml2YXRlIFN0cmluZyBfc3RyUHJvdmlkZXJOYW1lID0gbnVsbDsKKwlwcml2YXRlIFRpdGxlQXJlYURpYWxvZyBfRGlhbG9nOworCisJLyoKKwkgKiBDb25zdHJ1Y3RvciBmb3IgSmFyVmVyaWZpY2F0aW9uUGFnZS4KKwkgKi8KKwlwdWJsaWMgSmFyVmVyaWZpY2F0aW9uUGFnZShJVmVyaWZpY2F0aW9uUmVzdWx0IHZlcmlmaWNhdGlvblJlc3VsdCkgeworCQlzdXBlcihVcGRhdGVVSU1lc3NhZ2VzLkphclZlcmlmaWNhdGlvbkRpYWxvZ19WZXJpZmljYXRpb24pOyAKKwkJX2ZpbGVOYW1lID0gdmVyaWZpY2F0aW9uUmVzdWx0LmdldENvbnRlbnRSZWZlcmVuY2UoKS5nZXRJZGVudGlmaWVyKCk7CisJCV9WZXJpZmljYXRpb25SZXN1bHQgPSB2ZXJpZmljYXRpb25SZXN1bHQ7CisJCV9zdHJJZCA9IHZlcmlmaWNhdGlvblJlc3VsdC5nZXRGZWF0dXJlKCkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCk7CisJCV9zdHJGZWF0dXJlTmFtZSA9IHZlcmlmaWNhdGlvblJlc3VsdC5nZXRGZWF0dXJlKCkuZ2V0TGFiZWwoKTsKKwkJX3N0clByb3ZpZGVyTmFtZSA9IHZlcmlmaWNhdGlvblJlc3VsdC5nZXRGZWF0dXJlKCkuZ2V0UHJvdmlkZXIoKTsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogTWV0aG9kIGRlY2xhcmVkIG9uIERpYWxvZy4KKwkgKi8KKwlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgY29tcG9zaXRlUGFyZW50KSB7CisgICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY29tcG9zaXRlUGFyZW50LCAib3JnLmVjbGlwc2UudXBkYXRlLnVpLkphclZlcmlmaWNhdGlvblBhZ2UiKTsgLy8kTk9OLU5MUy0xJAorCQkvLyBDb21wb3NpdGU6IENsaWVudAorCQkvLy0tLS0tLS0tLS0tLS0tLS0tLQorCQlDb21wb3NpdGUgY29tcG9zaXRlQ2xpZW50ID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGVQYXJlbnQsIFNXVC5OVUxMKTsKKwkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOworCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKKwkJY29tcG9zaXRlQ2xpZW50LnNldExheW91dChsYXlvdXQpOworCQljb21wb3NpdGVDbGllbnQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7CisKKwkJLy8gVGV4dCBJbmZvcm1hdGlvbgorCQkvLy0tLS0tLS0tLS0tLS0tLS0tLQkJCisJCWNyZWF0ZVRleHRBcmVhKGNvbXBvc2l0ZUNsaWVudCk7CisKKwkJLy8gQ2VydGlmaWNhdGUgQXJlYQorCQkvLy0tLS0tLS0tLS0tLS0tLS0tLQorCQljcmVhdGVDZXJ0aWZpY2F0ZUFyZWEoY29tcG9zaXRlQ2xpZW50KTsKKworCQkvLyBGaWxlIGFuZCBGZWF0dXJlIEluZm9ybWF0aW9uCisJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0JCQorCQljcmVhdGVJbmZvcm1hdGlvbkFyZWEoY29tcG9zaXRlQ2xpZW50KTsKKworCQkvLyBDaG9pY2UgQXJlYQorCQkvLy0tLS0tLS0tLS0tLQkJCisJCS8vY3JlYXRlQ2hvaWNlQXJlYShjb21wb3NpdGVDbGllbnQpOworCisJCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQoY29tcG9zaXRlUGFyZW50KTsKKwkJcmV0dXJuIGNvbXBvc2l0ZUNsaWVudDsKKworCX0KKworCS8qCisJICogQ3JlYXRlcyB0aGUgSW5mb3JtYXRpb24gdGV4dAorCSAqLworCXByaXZhdGUgdm9pZCBjcmVhdGVUZXh0QXJlYShDb21wb3NpdGUgY29tcG9zaXRlQ2xpZW50KSB7CisKKwkJLy8gTGFiZWw6IEluZm9ybWF0aW9uCisJCS8vLS0tLS0tLS0tLS0tLS0tLS0tCisJCUxhYmVsIGxhYmVsSW5mb3JtYXRpb24gPQorCQkJbmV3IExhYmVsKGNvbXBvc2l0ZUNsaWVudCwgU1dULldSQVApOworCQlsYWJlbEluZm9ybWF0aW9uLnNldExheW91dERhdGEoCisJCQluZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HIHwgR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7CisKKyAgICAgICAgU3RyaW5nIGFjdGlvbk1zZyA9IG51bGw7CisgICAgICAgIGlmIChfVmVyaWZpY2F0aW9uUmVzdWx0LmlzRmVhdHVyZVZlcmlmaWNhdGlvbigpKSB7CisgICAgICAgICAgICBhY3Rpb25Nc2cgPSBVcGRhdGVVSU1lc3NhZ2VzLkphclZlcmlmaWNhdGlvbkRpYWxvZ19NYXlDaG9vc2VUb0luc3RhbGw7IAorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYWN0aW9uTXNnID0gVXBkYXRlVUlNZXNzYWdlcy5KYXJWZXJpZmljYXRpb25EaWFsb2dfTWF5Q2hvb3NlVG9Db250aW51ZTsgCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIFN0cmluZ0J1ZmZlciBzdHJiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQlzd2l0Y2ggKF9WZXJpZmljYXRpb25SZXN1bHQuZ2V0VmVyaWZpY2F0aW9uQ29kZSgpKSB7CisKKwkJCWNhc2UgSVZlcmlmaWNhdGlvblJlc3VsdC5UWVBFX0VOVFJZX05PVF9TSUdORUQgOgorCQkJCVN0cmluZyBtc2cgPSAoX1ZlcmlmaWNhdGlvblJlc3VsdC5pc0ZlYXR1cmVWZXJpZmljYXRpb24oKT8KKwkJCQkJVXBkYXRlVUlNZXNzYWdlcy5KYXJWZXJpZmljYXRpb25EaWFsb2dfQWJvdXRUb0luc3RhbGxfRmVhdHVyZToKKwkJCQkJCVVwZGF0ZVVJTWVzc2FnZXMuSmFyVmVyaWZpY2F0aW9uRGlhbG9nX0Fib3V0VG9JbnN0YWxsX0ZpbGUpKworICAgICAgICAgICAgICAgICAgICAgICAgIlxyXG4iICsgYWN0aW9uTXNnOyAvLyROT04tTkxTLTEkCisJCQkJc2V0TWVzc2FnZShtc2csIFdBUk5JTkcpOworCQkJCXN0cmIuYXBwZW5kKF9WZXJpZmljYXRpb25SZXN1bHQuaXNGZWF0dXJlVmVyaWZpY2F0aW9uKCk/CisJCQkJCQkJVXBkYXRlVUlNZXNzYWdlcy5KYXJWZXJpZmljYXRpb25EaWFsb2dfTm90RGlnaXRhbGx5U2lnbmVkX0ZlYXR1cmU6CisJCQkJCQkJCVVwZGF0ZVVJTWVzc2FnZXMuSmFyVmVyaWZpY2F0aW9uRGlhbG9nX05vdERpZ2l0YWxseVNpZ25lZF9GaWxlKTsKKwkJCQlzdHJiLmFwcGVuZCgiXHJcbiIpOyAvLyROT04tTkxTLTEkCisJCQkJc3RyYi5hcHBlbmQoX1ZlcmlmaWNhdGlvblJlc3VsdC5pc0ZlYXR1cmVWZXJpZmljYXRpb24oKT8KKwkJCQkJCVVwZGF0ZVVJTWVzc2FnZXMuSmFyVmVyaWZpY2F0aW9uRGlhbG9nX0Nhbm5vdFZlcmlmeVByb3ZpZGVyX0ZlYXR1cmU6CisJCQkJCQkJVXBkYXRlVUlNZXNzYWdlcy5KYXJWZXJpZmljYXRpb25EaWFsb2dfQ2Fubm90VmVyaWZ5UHJvdmlkZXJfRmlsZSk7CisgICAgICAgICAgICAgICAgCisvKgkJCQlzdHJiLmFwcGVuZCgiXHJcbiIpOyAvLyROT04tTkxTLTEkCisJCQkJaWYgKF9WZXJpZmljYXRpb25SZXN1bHQuaXNGZWF0dXJlVmVyaWZpY2F0aW9uKCkpIHsKKwkJCQkJc3RyYi5hcHBlbmQoCisJCQkJCQlVcGRhdGVVSS5nZXRSZXNvdXJjZVN0cmluZygiSmFyVmVyaWZpY2F0aW9uRGlhbG9nLkluc3RhbGxNYXlDb3JydXB0IikpOy8vJE5PTi1OTFMtMSQKKwkJCQl9IGVsc2UgeworCQkJCQlzdHJiLmFwcGVuZCgKKwkJCQkJCVVwZGF0ZVVJLmdldFJlc291cmNlU3RyaW5nKCJKYXJWZXJpZmljYXRpb25EaWFsb2cuQ29udGludWVNYXlDb3JydXB0IikpOy8vJE5PTi1OTFMtMSQgCQkJCQkKKwkJCQl9CisJCQkJKi8KKwkJCQlsYWJlbEluZm9ybWF0aW9uLnNldFRleHQoc3RyYi50b1N0cmluZygpKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBJVmVyaWZpY2F0aW9uUmVzdWx0LlRZUEVfRU5UUllfQ09SUlVQVEVEIDoKKwkJCQltc2cgPSBfVmVyaWZpY2F0aW9uUmVzdWx0LmlzRmVhdHVyZVZlcmlmaWNhdGlvbigpPworCQkJCQkJCVVwZGF0ZVVJTWVzc2FnZXMuSmFyVmVyaWZpY2F0aW9uRGlhbG9nX0NvcnJ1cHRlZENvbnRlbnRfRmVhdHVyZToKKwkJCQkJCQkJVXBkYXRlVUlNZXNzYWdlcy5KYXJWZXJpZmljYXRpb25EaWFsb2dfQ29ycnVwdGVkQ29udGVudF9GaWxlOworCQkJCXNldE1lc3NhZ2UobXNnLCBFUlJPUik7CisJCQkJc3RyYi5hcHBlbmQoCisJCQkJCVVwZGF0ZVVJTWVzc2FnZXMuSmFyVmVyaWZpY2F0aW9uRGlhbG9nX0NvbXBvbmVudE5vdEluc3RhbGxlZCk7IAorCQkJCWxhYmVsSW5mb3JtYXRpb24uc2V0VGV4dChzdHJiLnRvU3RyaW5nKCkpOworCQkJCWJyZWFrOworCisJCQljYXNlIElWZXJpZmljYXRpb25SZXN1bHQuVFlQRV9FTlRSWV9TSUdORURfVU5SRUNPR05JWkVEIDoKKwkJCQltc2cgPSAoX1ZlcmlmaWNhdGlvblJlc3VsdC5pc0ZlYXR1cmVWZXJpZmljYXRpb24oKT8KKwkJCQkJCVVwZGF0ZVVJTWVzc2FnZXMuSmFyVmVyaWZpY2F0aW9uRGlhbG9nX1NpZ25lZENvbXBvbmVudF9GZWF0dXJlOgorCQkJCQkJCVVwZGF0ZVVJTWVzc2FnZXMuSmFyVmVyaWZpY2F0aW9uRGlhbG9nX1NpZ25lZENvbXBvbmVudF9GZWF0dXJlKSArICAKKyAgICAgICAgICAgICAgICAgICAgICAgICJcclxuIiArIGFjdGlvbk1zZzsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgICAgIAorCQkJCXNldE1lc3NhZ2UobXNnLCBXQVJOSU5HKTsKKwkJCQlzdHJiLmFwcGVuZChfVmVyaWZpY2F0aW9uUmVzdWx0LmlzRmVhdHVyZVZlcmlmaWNhdGlvbigpPworCQkJCQlVcGRhdGVVSU1lc3NhZ2VzLkphclZlcmlmaWNhdGlvbkRpYWxvZ19Vbmtub3duQ2VydGlmaWNhdGVfRmVhdHVyZToKKwkJCQkJCVVwZGF0ZVVJTWVzc2FnZXMuSmFyVmVyaWZpY2F0aW9uRGlhbG9nX1Vua25vd25DZXJ0aWZpY2F0ZV9GaWxlKTsKKwkJCQlzdHJiLmFwcGVuZCgiXHJcbiIpOyAvLyROT04tTkxTLTEkCisJCQkJc3RyYi5hcHBlbmQoX1ZlcmlmaWNhdGlvblJlc3VsdC5pc0ZlYXR1cmVWZXJpZmljYXRpb24oKT8KKwkJCQkJCVVwZGF0ZVVJTWVzc2FnZXMuSmFyVmVyaWZpY2F0aW9uRGlhbG9nX1VuYWJsZVRvVmVyaWZ5UHJvdmlkZXJfRmVhdHVyZToKKwkJCQkJCQlVcGRhdGVVSU1lc3NhZ2VzLkphclZlcmlmaWNhdGlvbkRpYWxvZ19VbmFibGVUb1ZlcmlmeVByb3ZpZGVyX0ZpbGUpOworLyoJCQkJc3RyYi5hcHBlbmQoIlxyXG4iKTsgLy8kTk9OLU5MUy0xJAorCQkJCWlmIChfVmVyaWZpY2F0aW9uUmVzdWx0LmlzRmVhdHVyZVZlcmlmaWNhdGlvbigpKSB7CisJCQkJCXN0cmIuYXBwZW5kKAorCQkJCQkJVXBkYXRlVUkuZ2V0UmVzb3VyY2VTdHJpbmcoIkphclZlcmlmaWNhdGlvbkRpYWxvZy5JbnN0YWxsTWF5Q29ycnVwdCIpKTsgLy8kTk9OLU5MUy0xJAorCQkJCX0gZWxzZSB7CisJCQkJCXN0cmIuYXBwZW5kKAorCQkJCQkJVXBkYXRlVUkuZ2V0UmVzb3VyY2VTdHJpbmcoIkphclZlcmlmaWNhdGlvbkRpYWxvZy5Db250aW51ZU1heUNvcnJ1cHQiKSk7Ly8kTk9OLU5MUy0xJCAJCQkJCQorCQkJCX0KKwkJCQkqLworCQkJCWxhYmVsSW5mb3JtYXRpb24uc2V0VGV4dChzdHJiLnRvU3RyaW5nKCkpOworCQkJCWJyZWFrOworCisJCQljYXNlIElWZXJpZmljYXRpb25SZXN1bHQuVFlQRV9FTlRSWV9TSUdORURfUkVDT0dOSVpFRCA6CisJCQkJbXNnID0gKF9WZXJpZmljYXRpb25SZXN1bHQuaXNGZWF0dXJlVmVyaWZpY2F0aW9uKCk/CisJCQkJCQlVcGRhdGVVSU1lc3NhZ2VzLkphclZlcmlmaWNhdGlvbkRpYWxvZ19TaWduZWRDb21wb25lbnRfRmVhdHVyZToKKwkJCQkJCQlVcGRhdGVVSU1lc3NhZ2VzLkphclZlcmlmaWNhdGlvbkRpYWxvZ19TaWduZWRDb21wb25lbnRfRmlsZSkgKworICAgICAgICAgICAgICAgICAgICAgICAgIlxyXG4iICsgYWN0aW9uTXNnOyAvLyROT04tTkxTLTEkCisJCQkJc2V0TWVzc2FnZShtc2csIFdBUk5JTkcpOworCQkJCXN0cmIuYXBwZW5kKF9WZXJpZmljYXRpb25SZXN1bHQuaXNGZWF0dXJlVmVyaWZpY2F0aW9uKCk/CisJCQkJCVVwZGF0ZVVJTWVzc2FnZXMuSmFyVmVyaWZpY2F0aW9uRGlhbG9nX0tub3duQ2VydGlmaWNhdGVfRmVhdHVyZToKKwkJCQkJCVVwZGF0ZVVJTWVzc2FnZXMuSmFyVmVyaWZpY2F0aW9uRGlhbG9nX0tub3duQ2VydGlmaWNhdGVfRmlsZSk7CisJCQkJc3RyYi5hcHBlbmQoIlxyXG4iKTsgLy8kTk9OLU5MUy0xJAorCQkJCXN0cmIuYXBwZW5kKF9WZXJpZmljYXRpb25SZXN1bHQuaXNGZWF0dXJlVmVyaWZpY2F0aW9uKCk/CisJCQkJCVVwZGF0ZVVJTWVzc2FnZXMuSmFyVmVyaWZpY2F0aW9uRGlhbG9nX1Byb3ZpZGVyS25vd25fRmVhdHVyZToKKwkJCQkJCVVwZGF0ZVVJTWVzc2FnZXMuSmFyVmVyaWZpY2F0aW9uRGlhbG9nX1Byb3ZpZGVyS25vd25fRmlsZSk7CisJCQkJc3RyYi5hcHBlbmQoIlxyXG4iKTsgLy8kTk9OLU5MUy0xJAorCisJCQkJbGFiZWxJbmZvcm1hdGlvbi5zZXRUZXh0KHN0cmIudG9TdHJpbmcoKSk7CisKKy8vCQkJCWNyZWF0ZUNhdXRpb25BcmVhKGNvbXBvc2l0ZUNsaWVudCk7CisJCQkJYnJlYWs7CisJCX0KKwl9CisJCisKKwkvKgorCSAqIFByZXNlbnRzIEZpbGUgJiBGZWF0dXJlIGluZm9ybWF0aW9uCisJICovCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZUluZm9ybWF0aW9uQXJlYShDb21wb3NpdGUgY29tcG9zaXRlQ2xpZW50KSB7CisKKwkJLy8gQ29tcG9zaXRlOiBJbmZvcm1hdGlvbiBsYWJlbHMKKwkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJQ29tcG9zaXRlIGNvbXBvc2l0ZUluZm9ybWF0aW9uID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGVDbGllbnQsIFNXVC5OVUxMKTsKKwkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOworCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7CisJCWxheW91dC5tYXJnaW5XaWR0aCA9IGxheW91dC5tYXJnaW5IZWlnaHQgPSAwOworCQljb21wb3NpdGVJbmZvcm1hdGlvbi5zZXRMYXlvdXQobGF5b3V0KTsKKwkJY29tcG9zaXRlSW5mb3JtYXRpb24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7CisKKwkJLy8gZ2V0IGJvbGQgZmFjZQorCQlGb250UmVnaXN0cnkgZnJlZ2lzdHJ5ID0gSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udFJlZ2lzdHJ5KCk7CisJCUZvbnQgYm9sZEZvbnQgPSBmcmVnaXN0cnkuZ2V0Qm9sZChKRmFjZVJlc291cmNlcy5ESUFMT0dfRk9OVCk7CisJCQorCQkvLyBGZWF0dXJlIG5hbWUKKwkJLy8tLS0tLS0tLS0tLS0tLS0KKwkJTGFiZWwga2V5TGFiZWwgPSBudWxsOworCQlDTGFiZWwgdmFsdWVMYWJlbCA9IG51bGw7CisJCWlmIChfc3RyRmVhdHVyZU5hbWUgIT0gbnVsbCAmJiBfc3RyRmVhdHVyZU5hbWUubGVuZ3RoKCkgPiAwKSB7CisJCQlrZXlMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGVJbmZvcm1hdGlvbiwgU1dULk5VTEwpOworCQkJa2V5TGFiZWwuc2V0VGV4dCgKKwkJCQlVcGRhdGVVSU1lc3NhZ2VzLkphclZlcmlmaWNhdGlvbkRpYWxvZ19GZWF0dXJlTmFtZSk7IAorCisJCQl2YWx1ZUxhYmVsID0gbmV3IENMYWJlbChjb21wb3NpdGVJbmZvcm1hdGlvbiwgU1dULk5VTEwpOworCQkJdmFsdWVMYWJlbC5zZXRGb250KGJvbGRGb250KTsKKwkJCXZhbHVlTGFiZWwuc2V0VGV4dChfc3RyRmVhdHVyZU5hbWUpOworCQkJdmFsdWVMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKKwkJfQorCQkvLyBGZWF0dXJlIGlkZW50aWZpZXIKKwkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJaWYgKF9zdHJJZCAhPSBudWxsICYmIF9zdHJJZC5sZW5ndGgoKSA+IDApIHsKKwkJCWtleUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZUluZm9ybWF0aW9uLCBTV1QuTlVMTCk7CisJCQlrZXlMYWJlbC5zZXRUZXh0KAorCQkJCVVwZGF0ZVVJTWVzc2FnZXMuSmFyVmVyaWZpY2F0aW9uRGlhbG9nX0ZlYXR1cmVJZGVudGlmaWVyKTsgCisKKwkJCXZhbHVlTGFiZWwgPSBuZXcgQ0xhYmVsKGNvbXBvc2l0ZUluZm9ybWF0aW9uLCBTV1QuTlVMTCk7CisJCQl2YWx1ZUxhYmVsLnNldEZvbnQoYm9sZEZvbnQpOworCQkJdmFsdWVMYWJlbC5zZXRUZXh0KF9zdHJJZCk7CisJCQl2YWx1ZUxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOworCQl9CisJCS8vIFByb3ZpZGVyIG5hbWUKKwkJLy8tLS0tLS0tLS0tLS0tLQorCQlpZiAoX3N0clByb3ZpZGVyTmFtZSAhPSBudWxsICYmIF9zdHJQcm92aWRlck5hbWUubGVuZ3RoKCkgPiAwKSB7CisJCQlrZXlMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGVJbmZvcm1hdGlvbiwgU1dULk5VTEwpOworCQkJa2V5TGFiZWwuc2V0VGV4dCgKKwkJCQlVcGRhdGVVSU1lc3NhZ2VzLkphclZlcmlmaWNhdGlvbkRpYWxvZ19Qcm92aWRlcik7IAorCisJCQl2YWx1ZUxhYmVsID0gbmV3IENMYWJlbChjb21wb3NpdGVJbmZvcm1hdGlvbiwgU1dULk5VTEwpOworCQkJdmFsdWVMYWJlbC5zZXRGb250KGJvbGRGb250KTsKKwkJCXZhbHVlTGFiZWwuc2V0VGV4dChfc3RyUHJvdmlkZXJOYW1lKTsKKwkJCXZhbHVlTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7CisJCX0KKwkJLy8gTGFiZWw6IEZpbGUgbmFtZQorCQkvLy0tLS0tLS0tLS0tLS0tLS0tCisJCWtleUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZUluZm9ybWF0aW9uLCBTV1QuTlVMTCk7CisJCWtleUxhYmVsLnNldFRleHQoCisJCQlVcGRhdGVVSU1lc3NhZ2VzLkphclZlcmlmaWNhdGlvbkRpYWxvZ19GaWxlTmFtZSk7IAorCisJCXZhbHVlTGFiZWwgPSBuZXcgQ0xhYmVsKGNvbXBvc2l0ZUluZm9ybWF0aW9uLCBTV1QuTlVMTCk7CisJCXZhbHVlTGFiZWwuc2V0Rm9udChib2xkRm9udCk7CisJCXZhbHVlTGFiZWwuc2V0VGV4dChfZmlsZU5hbWUpOworCQl2YWx1ZUxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOworCX0KKworCS8qCisJICogU2hvdyBjZXJ0aWZpY2F0ZSBpbmZvcm1hdGlvbgorCSAqLworCXByaXZhdGUgdm9pZCBjcmVhdGVDZXJ0aWZpY2F0ZUFyZWEoQ29tcG9zaXRlIGNvbXBvc2l0ZUNsaWVudCkgeworCisJCWlmIChfVmVyaWZpY2F0aW9uUmVzdWx0LmdldFZlcmlmaWNhdGlvbkNvZGUoKQorCQkJPT0gSVZlcmlmaWNhdGlvblJlc3VsdC5UWVBFX0VOVFJZX1NJR05FRF9VTlJFQ09HTklaRUQKKwkJCXx8IF9WZXJpZmljYXRpb25SZXN1bHQuZ2V0VmVyaWZpY2F0aW9uQ29kZSgpCisJCQkJPT0gSVZlcmlmaWNhdGlvblJlc3VsdC5UWVBFX0VOVFJZX1NJR05FRF9SRUNPR05JWkVEKSB7CisJCQkvLyBHcm91cCBib3gKKwkJCS8vLS0tLS0tLS0tLQorCQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlQ2xpZW50LCBTV1QuU0hBRE9XX0VUQ0hFRF9JTik7CisJCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7CisJCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7CisJCQlsYXlvdXQubWFyZ2luV2lkdGggPSBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKKwkJCWdyb3VwLnNldExheW91dChsYXlvdXQpOworCQkJZ3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7CisJCQlncm91cC5zZXRUZXh0KFVwZGF0ZVVJTWVzc2FnZXMuSmFyVmVyaWZpY2F0aW9uRGlhbG9nX0NlcnRpZmljYXRlSW5mbyk7IAorCisJCQkvLyBTaWduZXIKKwkJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJTGFiZWwga2V5TGFiZWwgPSBudWxsOworCQkJVGV4dCB2YWx1ZVRleHQgPSBudWxsOworCQkJLy9kYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7CisJCQkvL2RhdGEuaG9yaXpvbnRhbEluZGVudCA9IDA7CisJCQkvL3RleHRJbmZvcm1hdGlvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwkJCQorCQkJaWYgKF9WZXJpZmljYXRpb25SZXN1bHQuZ2V0U2lnbmVySW5mbygpICE9IG51bGwpIHsKKwkJCQlrZXlMYWJlbCA9IG5ldyBMYWJlbChncm91cCwgU1dULk5VTEwpOworCQkJCWtleUxhYmVsLnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5KYXJWZXJpZmljYXRpb25EaWFsb2dfU3ViamVjdENBKTsgCisJCQkJa2V5TGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKSk7CisKKwkJCQl2YWx1ZVRleHQgPSBuZXcgVGV4dChncm91cCwgU1dULk1VTFRJfFNXVC5CT1JERVJ8U1dULldSQVB8U1dULlZfU0NST0xMKTsKKwkJCQl2YWx1ZVRleHQuc2V0VGV4dChfVmVyaWZpY2F0aW9uUmVzdWx0LmdldFNpZ25lckluZm8oKSk7CisJCQkJdmFsdWVUZXh0LnNldEVkaXRhYmxlKGZhbHNlKTsKKwkJCQl2YWx1ZVRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7CisJCQl9CisJCQkKKwkJCS8vIEF1dGhlbnRpY2F0b3IKKwkJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQlpZiAoX1ZlcmlmaWNhdGlvblJlc3VsdC5nZXRWZXJpZmllckluZm8oKSAhPSBudWxsKSB7CisJCQkJa2V5TGFiZWwgPSBuZXcgTGFiZWwoZ3JvdXAsIFNXVC5OVUxMKTsKKwkJCQlrZXlMYWJlbC5zZXRUZXh0KFVwZGF0ZVVJTWVzc2FnZXMuSmFyVmVyaWZpY2F0aW9uRGlhbG9nX1Jvb3RDQSk7IAorCQkJCWtleUxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORykpOwkJCQkKKworCQkJCXZhbHVlVGV4dCA9IG5ldyBUZXh0KGdyb3VwLCBTV1QuTVVMVEl8U1dULkJPUkRFUnxTV1QuV1JBUHxTV1QuVl9TQ1JPTEwpOworCQkJCXZhbHVlVGV4dC5zZXRUZXh0KF9WZXJpZmljYXRpb25SZXN1bHQuZ2V0VmVyaWZpZXJJbmZvKCkpOworCQkJCXZhbHVlVGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7CisJCQkJdmFsdWVUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOworCQkJfQorCQl9CisJfQorCisJLyoKKwkgKiBTZXRzIHRoZSBEaWFsb2cKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRUaXRsZUFyZWFEaWFsb2coVGl0bGVBcmVhRGlhbG9nIGRpYWxvZykgeworCQlfRGlhbG9nID0gZGlhbG9nOworCX0KKworCS8qCisJICogCisJICovCisJcHVibGljIHZvaWQgc2V0TWVzc2FnZShTdHJpbmcgbmV3TWVzc2FnZSwgaW50IG5ld1R5cGUpIHsKKwkJc3VwZXIuc2V0TWVzc2FnZShuZXdNZXNzYWdlLCBuZXdUeXBlKTsKKwkJaWYgKF9EaWFsb2cgIT0gbnVsbCkgeworCQkJX0RpYWxvZy5zZXRNZXNzYWdlKG5ld01lc3NhZ2UsIG5ld1R5cGUpOworCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvc2VjdXJpdHkvSmFyVmVyaWZpY2F0aW9uU2VydmljZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3NlY3VyaXR5L0phclZlcmlmaWNhdGlvblNlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODFiYzMzCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3NlY3VyaXR5L0phclZlcmlmaWNhdGlvblNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDE0NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5zZWN1cml0eTsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLio7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLio7CisvKioKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBKYXJWZXJpZmljYXRpb25TZXJ2aWNlIGltcGxlbWVudHMgSVZlcmlmaWNhdGlvbkxpc3RlbmVyIHsKKworCS8qCisJICogVGhlIEphclZlcmlmaWVyIGlzIGEgaW5zdGFuY2UgdmFyaWFibGUKKwkgKiBiYWNhdXNlIHdlIHdhbnQgdG8gcmV1c2UgaXQgdXBvbiBtdWx0aXBsZSBjYWxscworCSAqLworCisJcHJpdmF0ZSBTaGVsbCBzaGVsbDsKKwkvLyBrZWVwIHRyYWNrIG9mIHRoZSBsYXN0IHZlcmlmeSBjb2RlLgorCXByaXZhdGUgaW50IGxhc3RWZXJpZnlDb2RlID0gLTE7CisJCisJLyoqCisJICogUHJvY2Vzc2VkIENvbnRlbnRSZWZlcm5jZXMuICBUaGV5IHdpbGwgYmUgc2tpcHBlZCBpZiBwcm9tcHRlZAorCSAqIHRvIHZlcmlmeSB0aGUgc2FtZSByZWZlcmVuY2UgYWdhaW4uCisJICovCisJcHJpdmF0ZSBNYXAgcHJvY2Vzc2VkPW5ldyBIYXNoTWFwKCk7CisKKwkvKgorCSAqIElmIG5vIHNoZWxsLCBjcmVhdGUgYSBuZXcgc2hlbGwgCisJICovCisJcHVibGljIEphclZlcmlmaWNhdGlvblNlcnZpY2UoKSB7CisJCXRoaXMobnVsbCk7CisJfQorCQorCS8qCisJICogCisJICovCisJcHVibGljIEphclZlcmlmaWNhdGlvblNlcnZpY2UoU2hlbGwgYVNoZWxsKSB7CisJCXNoZWxsID0gYVNoZWxsOworCisJCS8vIGZpbmQgdGhlIGRlZmF1bHQgZGlzcGxheSBhbmQgZ2V0IHRoZSBhY3RpdmUgc2hlbGwKKwkJaWYgKHNoZWxsID09IG51bGwpIHsKKwkJCWZpbmFsIERpc3BsYXkgZGlzcCA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOworCQkJaWYgKGRpc3AgPT0gbnVsbCkgeworCQkJCXNoZWxsID0gbmV3IFNoZWxsKG5ldyBEaXNwbGF5KCkpOworCQkJfSBlbHNlIHsKKwkJCQlkaXNwLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKKwkJCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkJc2hlbGwgPSBkaXNwLmdldEFjdGl2ZVNoZWxsKCk7CisJCQkJCX0KKwkJCQl9KTsKKwkJCX0KKwkJfQorCX0KKworCS8qCisJICogCisJICovCisJcHJpdmF0ZSBpbnQgb3BlbldpemFyZChJVmVyaWZpY2F0aW9uUmVzdWx0IHJlc3VsdCkgeworCQlpbnQgY29kZTsKKwkJSURpYWxvZ1BhZ2UgcGFnZSA9IG5ldyBKYXJWZXJpZmljYXRpb25QYWdlKHJlc3VsdCk7CisJCUphclZlcmlmaWNhdGlvbkRpYWxvZyBkaWFsb2cgPQorCQkJCW5ldyBKYXJWZXJpZmljYXRpb25EaWFsb2coc2hlbGwscGFnZSxyZXN1bHQpOworCQlkaWFsb2cuY3JlYXRlKCk7CisJCWRpYWxvZy5nZXRTaGVsbCgpLnNldFNpemUoNjAwLCA1MDApOworCQlkaWFsb2cuZ2V0U2hlbGwoKS5zZXRUZXh0KFVwZGF0ZVVJTWVzc2FnZXMuSmFyVmVyaWZpY2F0aW9uRGlhbG9nX3d0aXRsZSk7IAorCQlkaWFsb2cub3BlbigpOworCQlpZiAoZGlhbG9nLmdldFJldHVybkNvZGUoKSA9PSBKYXJWZXJpZmljYXRpb25EaWFsb2cuT0spIHsKKwkJCWNvZGUgPSBDSE9JQ0VfSU5TVEFMTF9UUlVTVF9PTkNFOworCQl9IGVsc2UgaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gSmFyVmVyaWZpY2F0aW9uRGlhbG9nLklOU1RBTExfQUxMKSB7CisJCQljb2RlID0gQ0hPSUNFX0lOU1RBTExfVFJVU1RfQUxXQVlTOworCQl9IGVsc2UgeyAKKwkJCWNvZGUgPSBDSE9JQ0VfQUJPUlQ7CisJCX0KKwkJcmV0dXJuIGNvZGU7CisKKwl9CisKKwkvKgorCSAqIAorCSAqLworCXB1YmxpYyBpbnQgcHJvbXB0KGZpbmFsIElWZXJpZmljYXRpb25SZXN1bHQgdmVyaWZpY2F0aW9uUmVzdWx0KXsKKwkJaWYgKCFVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihVcGRhdGVDb3JlLlBfQ0hFQ0tfU0lHTkFUVVJFKSkgCisJCQlyZXR1cm4gQ0hPSUNFX0lOU1RBTExfVFJVU1RfQUxXQVlTOworCisJCWlmICh2ZXJpZmljYXRpb25SZXN1bHQuYWxyZWFkeVNlZW4oKSkgcmV0dXJuIENIT0lDRV9JTlNUQUxMX1RSVVNUX0FMV0FZUzsKKwkJCisJCWlmKHNlZSh2ZXJpZmljYXRpb25SZXN1bHQpKSByZXR1cm4gQ0hPSUNFX0lOU1RBTExfVFJVU1RfQUxXQVlTOworCQkKKwkJaWYgKGxhc3RWZXJpZnlDb2RlID09IENIT0lDRV9JTlNUQUxMX1RSVVNUX0FMV0FZUykgcmV0dXJuIENIT0lDRV9JTlNUQUxMX1RSVVNUX0FMV0FZUzsKKworCQlzd2l0Y2ggKHZlcmlmaWNhdGlvblJlc3VsdC5nZXRWZXJpZmljYXRpb25Db2RlKCkpIHsKKwkJCWNhc2UgSVZlcmlmaWNhdGlvblJlc3VsdC5VTktOT1dOX0VSUk9SIDoKKwkJCQkJcmV0dXJuIENIT0lDRV9FUlJPUjsKKworCQkJY2FzZSBJVmVyaWZpY2F0aW9uUmVzdWx0LlZFUklGSUNBVElPTl9DQU5DRUxMRUQ6CisJCQkJCXJldHVybiBDSE9JQ0VfQUJPUlQ7CisKKwkJCS8vIGNhbm5vdCB2ZXJpZnkgaXQ6IGRvIG5vdCBwcm9tcHQgdXNlci4KKwkJCWNhc2UgSVZlcmlmaWNhdGlvblJlc3VsdC5UWVBFX0VOVFJZX1VOUkVDT0dOSVpFRDogCisJCQkJcmV0dXJuIENIT0lDRV9JTlNUQUxMX1RSVVNUX0FMV0FZUzsJCQkJCisJCQkKKwkJCWRlZmF1bHQgOgorCQkJCXsJCQkJCisJCQkJCXNoZWxsLmdldERpc3BsYXkoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7CisJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQkJbGFzdFZlcmlmeUNvZGUgPSBvcGVuV2l6YXJkKHZlcmlmaWNhdGlvblJlc3VsdCk7CisJCQkJCQl9CisJCQkJCX0pOworCQkJCQlyZXR1cm4gbGFzdFZlcmlmeUNvZGU7CisJCQkJfQorCQl9CisJfQorCisJLyoqCisJICogQ2hlY2tzIHdoZXRoZXIgZmVhdHVyZSBhcmNoaXZlIGhhcyBiZWVuIHNlZW4gYWxyZWFkeS4KKwkgKiBSZW1lbWJlcnMgdGhlIGZhY3QgdGhhdCBhcmNoaXZlIGlzIGJlaW5nIHNlZW4gbm93LgorCSAqIEBwYXJhbSB2ZXJpZmljYXRpb25SZXN1bHQKKwkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGFyY2hpdmUgaGFzIGJlZW4gc2VlbiBiZWZvcmUsIGZhbHNlIGlmIGZpcnN0IHRpbWUKKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gc2VlKGZpbmFsIElWZXJpZmljYXRpb25SZXN1bHQgdmVyaWZpY2F0aW9uUmVzdWx0KSB7CisJCVN0cmluZyBrZXkgPSB2ZXJpZmljYXRpb25SZXN1bHQuZ2V0RmVhdHVyZSgpLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpCisJCQkrIi8iK3ZlcmlmaWNhdGlvblJlc3VsdC5nZXRDb250ZW50UmVmZXJlbmNlKCkuZ2V0SWRlbnRpZmllcigpOyAvLyROT04tTkxTLTEkCisJCUxvbmcgdmFsdWUgPSBuZXcgTG9uZyh2ZXJpZmljYXRpb25SZXN1bHQuZ2V0Q29udGVudFJlZmVyZW5jZSgpLmdldExhc3RNb2RpZmllZCgpKTsKKwkJTG9uZyBjYWNoZWRWYWx1ZSA9IChMb25nKXByb2Nlc3NlZC5nZXQoa2V5KTsKKwkJaWYodmFsdWUuZXF1YWxzKGNhY2hlZFZhbHVlKSl7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfWVsc2V7CisJCQlwcm9jZXNzZWQucHV0KGtleSwgdmFsdWUpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3NlY3VyaXR5L1VzZXJWYWxpZGF0aW9uRGlhbG9nLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvc2VjdXJpdHkvVXNlclZhbGlkYXRpb25EaWFsb2cuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjYxNzI4Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3NlY3VyaXR5L1VzZXJWYWxpZGF0aW9uRGlhbG9nLmphdmEKQEAgLTAsMCArMSwxNTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuc2VjdXJpdHk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuKjsKKworLyoqCisgKiBVc2VyIGF1dGhlbnRpY2F0aW9uIGRpYWxvZworICovCitwdWJsaWMgY2xhc3MgVXNlclZhbGlkYXRpb25EaWFsb2cgZXh0ZW5kcyBEaWFsb2cgeworCXByb3RlY3RlZCBUZXh0IHVzZXJuYW1lRmllbGQ7CisJcHJvdGVjdGVkIFRleHQgcGFzc3dvcmRGaWVsZDsKKworCXByb3RlY3RlZCBTdHJpbmcgaG9zdDsKKwlwcm90ZWN0ZWQgU3RyaW5nIG1lc3NhZ2U7CisJcHJvdGVjdGVkIEF1dGhlbnRpY2F0aW9uIHVzZXJBdXRoZW50aWNhdGlvbiA9IG51bGw7CisJLyoqCisJICogR2V0cyB1c2VyIGFuZCBwYXNzd29yZCBmcm9tIGEgdXNlci4gTWF5IGJlIGNhbGxlZCBmcm9tIGFueSB0aHJlYWQKKwkgKiAKKwkgKiBAcmV0dXJuIFVzZXJBdXRoZW50aWNhdGlvbiB0aGF0IGNvbnRhaW5zIHRoZSB1c2VyaWQgYW5kIHRoZSBwYXNzd29yZCBvcgorCSAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGRpYWxvZyBoYXMgYmVlbiBjYW5jZWxsZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIEF1dGhlbnRpY2F0aW9uIGdldEF1dGhlbnRpY2F0aW9uKGZpbmFsIFN0cmluZyBob3N0LAorCQkJZmluYWwgU3RyaW5nIG1lc3NhZ2UpIHsKKwkJY2xhc3MgVUlPcGVyYXRpb24gaW1wbGVtZW50cyBSdW5uYWJsZSB7CisJCQlwdWJsaWMgQXV0aGVudGljYXRpb24gYXV0aGVudGljYXRpb247CisJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJYXV0aGVudGljYXRpb24gPSBVc2VyVmFsaWRhdGlvbkRpYWxvZy5hc2tGb3JBdXRoZW50aWNhdGlvbigKKwkJCQkJCWhvc3QsIG1lc3NhZ2UpOworCQkJfQorCQl9CisKKwkJVUlPcGVyYXRpb24gdWlvID0gbmV3IFVJT3BlcmF0aW9uKCk7CisJCWlmIChEaXNwbGF5LmdldEN1cnJlbnQoKSAhPSBudWxsKSB7CisJCQl1aW8ucnVuKCk7CisJCX0gZWxzZSB7CisJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyh1aW8pOworCQl9CisJCXJldHVybiB1aW8uYXV0aGVudGljYXRpb247CisJfQorCS8qKgorCSAqIEdldHMgdXNlciBhbmQgcGFzc3dvcmQgZnJvbSBhIHVzZXIgTXVzdCBiZSBjYWxsZWQgZnJvbSBVSSB0aHJlYWQKKwkgKiAKKwkgKiBAcmV0dXJuIFVzZXJBdXRoZW50aWNhdGlvbiB0aGF0IGNvbnRhaW5zIHRoZSB1c2VyaWQgYW5kIHRoZSBwYXNzd29yZCBvcgorCSAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGRpYWxvZyBoYXMgYmVlbiBjYW5jZWxsZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIEF1dGhlbnRpY2F0aW9uIGFza0ZvckF1dGhlbnRpY2F0aW9uKFN0cmluZyBob3N0LAorCQkJU3RyaW5nIG1lc3NhZ2UpIHsKKwkJVXNlclZhbGlkYXRpb25EaWFsb2cgdWkgPSBuZXcgVXNlclZhbGlkYXRpb25EaWFsb2cobnVsbCwgaG9zdCwgbWVzc2FnZSk7IAorCQl1aS5vcGVuKCk7CisJCXJldHVybiB1aS5nZXRBdXRoZW50aWNhdGlvbigpOworCX0KKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IFVzZXJWYWxpZGF0aW9uRGlhbG9nLgorCSAqIAorCSAqIEBwYXJhbSBwYXJlbnRTaGVsbAorCSAqICAgICAgICAgICAgcGFyZW50IFNoZWxsIG9yIG51bGwKKwkgKi8KKwlwcm90ZWN0ZWQgVXNlclZhbGlkYXRpb25EaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZyBob3N0LAorCQkJU3RyaW5nIG1lc3NhZ2UpIHsKKwkJc3VwZXIocGFyZW50U2hlbGwpOworCQl0aGlzLmhvc3QgPSBob3N0OworCQl0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOworCQlzZXRCbG9ja09uT3Blbih0cnVlKTsKKwl9CisJLyoqCisJICovCisJcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgbmV3U2hlbGwpIHsKKwkJc3VwZXIuY29uZmlndXJlU2hlbGwobmV3U2hlbGwpOworCQluZXdTaGVsbC5zZXRUZXh0KFVwZGF0ZVVJTWVzc2FnZXMuVXNlclZlcmlmaWNhdGlvbkRpYWxvZ19QYXNzd29yZFJlcXVpcmVkKTsgCisJfQorCS8qKgorCSAqLworCXB1YmxpYyB2b2lkIGNyZWF0ZSgpIHsKKwkJc3VwZXIuY3JlYXRlKCk7CisJCS8vZ2l2ZSBmb2N1cyB0byB1c2VybmFtZSBmaWVsZAorCQl1c2VybmFtZUZpZWxkLnNlbGVjdEFsbCgpOworCQl1c2VybmFtZUZpZWxkLnNldEZvY3VzKCk7CisJfQorCS8qKgorCSAqLworCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgeworCQlDb21wb3NpdGUgbWFpbiA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7CisJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKKwkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOworCQltYWluLnNldExheW91dChsYXlvdXQpOworCQltYWluLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOworCisJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKG1haW4sIFNXVC5XUkFQKTsKKwkJU3RyaW5nIHRleHQgPSBVcGRhdGVVSU1lc3NhZ2VzLlVzZXJWZXJpZmljYXRpb25EaWFsb2dfQ29ubmVjdFRvICsgaG9zdDsgCisJCXRleHQgKz0gIlxuXG4iICsgbWVzc2FnZTsgLy8kTk9OLU5MUy0xJCAKKwkJbGFiZWwuc2V0VGV4dCh0ZXh0KTsKKwkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOworCQlkYXRhLmhvcml6b250YWxTcGFuID0gMzsKKwkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKKworCQljcmVhdGVVc2VybmFtZUZpZWxkcyhtYWluKTsKKwkJY3JlYXRlUGFzc3dvcmRGaWVsZHMobWFpbik7CisgICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAobWFpbiwKKwkJCQkib3JnLmVjbGlwc2UudXBkYXRlLnVpLlVzZXJWYWxpZGF0aW9uRGlhbG9nIik7IC8vJE5PTi1OTFMtMSQKKwkJcmV0dXJuIG1haW47CisJfQorCS8qKgorCSAqIENyZWF0ZXMgdGhlIHRocmVlIHdpZGdldHMgdGhhdCByZXByZXNlbnQgdGhlIHVzZXIgbmFtZSBlbnRyeSBhcmVhLgorCSAqLworCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVBhc3N3b3JkRmllbGRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpLnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5Vc2VyVmVyaWZpY2F0aW9uRGlhbG9nX1Bhc3N3b3JkKTsgCisKKwkJcGFzc3dvcmRGaWVsZCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5QQVNTV09SRCk7CisJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKKwkJZGF0YS53aWR0aEhpbnQgPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLkVOVFJZX0ZJRUxEX1dJRFRIKTsKKwkJcGFzc3dvcmRGaWVsZC5zZXRMYXlvdXREYXRhKGRhdGEpOworCisJCW5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsgLy9zcGFjZXIKKwl9CisJLyoqCisJICogQ3JlYXRlcyB0aGUgdGhyZWUgd2lkZ2V0cyB0aGF0IHJlcHJlc2VudCB0aGUgdXNlciBuYW1lIGVudHJ5IGFyZWEuCisJICovCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlVXNlcm5hbWVGaWVsZHMoQ29tcG9zaXRlIHBhcmVudCkgeworCQluZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSkuc2V0VGV4dChVcGRhdGVVSU1lc3NhZ2VzLlVzZXJWZXJpZmljYXRpb25EaWFsb2dfVXNlck5hbWUpOyAKKworCQl1c2VybmFtZUZpZWxkID0gbmV3IFRleHQocGFyZW50LCBTV1QuQk9SREVSKTsKKwkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOworCQlkYXRhLndpZHRoSGludCA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuRU5UUllfRklFTERfV0lEVEgpOworCQl1c2VybmFtZUZpZWxkLnNldExheW91dERhdGEoZGF0YSk7CisKKwkJbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOyAvL3NwYWNlcgorCX0KKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBVc2VyQXV0aGVudGljYXRpb24gZW50ZXJlZCBieSB0aGUgdXNlciwgb3IgbnVsbCBpZiB0aGUgdXNlcgorCSAqIGNhbmNlbGVkLgorCSAqLworCXB1YmxpYyBBdXRoZW50aWNhdGlvbiBnZXRBdXRoZW50aWNhdGlvbigpIHsKKwkJcmV0dXJuIHVzZXJBdXRoZW50aWNhdGlvbjsKKwl9CisJLyoqCisJICogTm90aWZpZXMgdGhhdCB0aGUgb2sgYnV0dG9uIG9mIHRoaXMgZGlhbG9nIGhhcyBiZWVuIHByZXNzZWQuCisJICovCisJcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgeworCQl1c2VyQXV0aGVudGljYXRpb24gPSBuZXcgQXV0aGVudGljYXRpb24odXNlcm5hbWVGaWVsZC5nZXRUZXh0KCksCisJCQkJcGFzc3dvcmRGaWVsZC5nZXRUZXh0KCkpOworCQlzdXBlci5va1ByZXNzZWQoKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9Db25maWd1cmF0aW9uUHJldmlldy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL0NvbmZpZ3VyYXRpb25QcmV2aWV3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg0Y2JlOAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9Db25maWd1cmF0aW9uUHJldmlldy5qYXZhCkBAIC0wLDAgKzEsMTk2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnZpZXdzOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLklMb2NhbFNpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWwuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy4qOworCitwdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvblByZXZpZXcgaW1wbGVtZW50cyBJVXBkYXRlTW9kZWxDaGFuZ2VkTGlzdGVuZXIgeworCXByaXZhdGUgU2Nyb2xsZWRGb3JtIGZvcm07CisJcHJpdmF0ZSBDb25maWd1cmF0aW9uVmlldyB2aWV3OworCXByaXZhdGUgRm9ybVRvb2xraXQgdG9vbGtpdDsKKwlwcml2YXRlIEZvcm1UZXh0IGRlc2M7CisJcHJpdmF0ZSBGb3JtVGV4dCB0YXNrTGlzdDsKKwlwcml2YXRlIElQcmV2aWV3VGFza1tdIHRhc2tzOworCQorCXB1YmxpYyBDb25maWd1cmF0aW9uUHJldmlldyhDb25maWd1cmF0aW9uVmlldyB2aWV3KSB7CisJCXRoaXMudmlldyA9IHZpZXc7CisJCVVwZGF0ZU1vZGVsIG1vZGVsID0gVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldFVwZGF0ZU1vZGVsKCk7CisJCW1vZGVsLmFkZFVwZGF0ZU1vZGVsQ2hhbmdlZExpc3RlbmVyKHRoaXMpOworCX0KKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQlVcGRhdGVNb2RlbCBtb2RlbCA9IFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRVcGRhdGVNb2RlbCgpOworCQltb2RlbC5yZW1vdmVVcGRhdGVNb2RlbENoYW5nZWRMaXN0ZW5lcih0aGlzKTsKKwkJdG9vbGtpdC5kaXNwb3NlKCk7CisJfQorCisJcHVibGljIHZvaWQgb2JqZWN0c0FkZGVkKE9iamVjdCBwYXJlbnQsIE9iamVjdFtdIGNoaWxkcmVuKSB7CisJfQorCXB1YmxpYyB2b2lkIG9iamVjdHNSZW1vdmVkKE9iamVjdCBwYXJlbnQsIE9iamVjdFtdIGNoaWxkcmVuKSB7CisJfQorCXB1YmxpYyB2b2lkIG9iamVjdENoYW5nZWQoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KSB7CisJfQorCisJcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpIHsKKwkJcmV0dXJuIGZvcm07CisJfQorCisJcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7CisJCXRvb2xraXQgPSBuZXcgRm9ybVRvb2xraXQocGFyZW50LmdldERpc3BsYXkoKSk7CisJCWZvcm0gPSB0b29sa2l0LmNyZWF0ZVNjcm9sbGVkRm9ybShwYXJlbnQpOworCQlUYWJsZVdyYXBMYXlvdXQgbGF5b3V0ID0gbmV3IFRhYmxlV3JhcExheW91dCgpOworCQlmb3JtLmdldEJvZHkoKS5zZXRMYXlvdXQobGF5b3V0KTsKKwkJbGF5b3V0LmxlZnRNYXJnaW4gPSAxMDsKKwkJbGF5b3V0LnJpZ2h0TWFyZ2luID0gNTsKKwkJbGF5b3V0LnRvcE1hcmdpbiA9IDEwOworCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSAwOworCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMjA7CisJCUlIeXBlcmxpbmtMaXN0ZW5lciB1cmxBY3Rpb24gPSBuZXcgSHlwZXJsaW5rQWRhcHRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIGxpbmtBY3RpdmF0ZWQoSHlwZXJsaW5rRXZlbnQgZSkgeworCQkJCVN0cmluZyB1cmwgPSAoU3RyaW5nKSBlLmdldEhyZWYoKTsKKwkJCQlpZiAodXJsICE9IG51bGwpCisJCQkJCVVwZGF0ZVVJLnNob3dVUkwodXJsKTsKKwkJCX0KKwkJfTsKKwkJSUh5cGVybGlua0xpc3RlbmVyIHRhc2tBY3Rpb24gPSBuZXcgSHlwZXJsaW5rQWRhcHRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIGxpbmtBY3RpdmF0ZWQoSHlwZXJsaW5rRXZlbnQgZSkgeworCQkJCVN0cmluZyBpbmRleEFyZyA9IChTdHJpbmcpIGUuZ2V0SHJlZigpOworCQkJCXRyeSB7CisJCQkJCWludCBpbmRleCA9IEludGVnZXIucGFyc2VJbnQoaW5kZXhBcmcpOworCQkJCQlpZiAodGFza3MgIT0gbnVsbCkKKwkJCQkJCXRhc2tzW2luZGV4XS5ydW4oKTsKKwkJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXgpIHsKKwkJCQl9CisJCQl9CisJCX07CisJCS8vdGFza0FjdGlvbi5zZXRTdGF0dXNMaW5lTWFuYWdlcih2aWV3LmdldENvbmZpZ3VyYXRpb25XaW5kb3coKS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpKTsKKwkJZGVzYyA9IHRvb2xraXQuY3JlYXRlRm9ybVRleHQoZm9ybS5nZXRCb2R5KCksIHRydWUpOworCQlkZXNjLnNldEh5cGVybGlua1NldHRpbmdzKHRvb2xraXQuZ2V0SHlwZXJsaW5rR3JvdXAoKSk7CisJCWRlc2MuYWRkSHlwZXJsaW5rTGlzdGVuZXIodXJsQWN0aW9uKTsKKwkJZGVzYy5zZXRUZXh0KCIiLCBmYWxzZSwgZmFsc2UpOyAvLyROT04tTkxTLTEkCisJCVRhYmxlV3JhcERhdGEgdGQgPSBuZXcgVGFibGVXcmFwRGF0YShUYWJsZVdyYXBEYXRhLkZJTExfR1JBQik7CisJCWRlc2Muc2V0TGF5b3V0RGF0YSh0ZCk7CisJCXRhc2tMaXN0ID0gdG9vbGtpdC5jcmVhdGVGb3JtVGV4dChmb3JtLmdldEJvZHkoKSwgZmFsc2UpOworCQl0YXNrTGlzdC5zZXRIeXBlcmxpbmtTZXR0aW5ncyh0b29sa2l0LmdldEh5cGVybGlua0dyb3VwKCkpOworCQl0YXNrTGlzdC5hZGRIeXBlcmxpbmtMaXN0ZW5lcih0YXNrQWN0aW9uKTsgCisJCXRhc2tMaXN0LnNldFRleHQoIiIsIGZhbHNlLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKKwkJLy9mYWN0b3J5LnNldEh5cGVybGlua1VuZGVybGluZU1vZGUoSHlwZXJsaW5rU2V0dGluZ3MuVU5ERVJMSU5FX1JPTExPVkVSKTsKKwkJdGQgPSBuZXcgVGFibGVXcmFwRGF0YShUYWJsZVdyYXBEYXRhLkZJTExfR1JBQik7CisJCXRhc2tMaXN0LnNldExheW91dERhdGEodGQpOworICAgICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhcmVudCwgIm9yZy5lY2xpcHNlLnVwZGF0ZS51aS5TaXRlRm9ybSIpOyAvLyROT04tTkxTLTEkCisJfQorCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKwkJT2JqZWN0IG9iamVjdCA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKKwkJdGFza3MgPSB2aWV3LmdldFByZXZpZXdUYXNrcyhvYmplY3QpOworCQlTdHJpbmcgdGl0bGUgPSBnZXRPYmplY3RMYWJlbChzZWxlY3Rpb24uc2l6ZSgpPjE/c2VsZWN0aW9uOm9iamVjdCk7CisJCWZvcm0uc2V0VGV4dCh0aXRsZSk7CisJCVN0cmluZyBkZXNjcmlwdGlvbiA9IGdldE9iamVjdERlc2NyaXB0aW9uKHNlbGVjdGlvbi5zaXplKCk+MT9zZWxlY3Rpb246b2JqZWN0KTsKKwkJYm9vbGVhbiB0YWdzID0gZGVzY3JpcHRpb24uc3RhcnRzV2l0aCgiPGZvcm0+Iik7IC8vJE5PTi1OTFMtMSQKKwkJZGVzYy5zZXRUZXh0KGRlc2NyaXB0aW9uLCB0YWdzLCAhdGFncyk7CisJCVN0cmluZyB0YXNrVGV4dCA9IGdldFRhc2tzVGV4dCgpOworCQl0YXNrTGlzdC5zZXRUZXh0KHRhc2tUZXh0LCB0cnVlLCBmYWxzZSk7CisJCWZvcm0ucmVmbG93KHRydWUpOworCX0KKwlwcml2YXRlIFN0cmluZyBnZXRPYmplY3RMYWJlbChPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChvYmplY3QgPT0gbnVsbCkKKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAorCQlUcmVlVmlld2VyIHZpZXdlciA9IHZpZXcuZ2V0VHJlZVZpZXdlcigpOworCQlMYWJlbFByb3ZpZGVyIHByb3ZpZGVyID0gKExhYmVsUHJvdmlkZXIpIHZpZXdlci5nZXRMYWJlbFByb3ZpZGVyKCk7CisJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgeworCQkJU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOworCQkJUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIoc3cpOworCQkJaW50IGNvdW50ZXI9MTsKKwkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pb2JqZWN0KS5pdGVyYXRvcigpOworCQkJCWl0ZXIuaGFzTmV4dCgpOykgeworCQkJCXB3LnByaW50bG4oY291bnRlcisiLiAiK3Byb3ZpZGVyLmdldFRleHQoaXRlci5uZXh0KCkpKTsgLy8kTk9OLU5MUy0xJAorCQkJCWNvdW50ZXIrKzsKKwkJCX0KKwkJCXJldHVybiBzdy50b1N0cmluZygpOworCQl9CisJCXJldHVybiBwcm92aWRlci5nZXRUZXh0KG9iamVjdCk7CisJfQorCXByaXZhdGUgU3RyaW5nIGdldE9iamVjdERlc2NyaXB0aW9uKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElGZWF0dXJlQWRhcHRlcikgeworCQkJcmV0dXJuIGdldEZlYXR1cmVEZXNjcmlwdGlvbigoSUZlYXR1cmVBZGFwdGVyKSBvYmplY3QpOworCQl9CisJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBJQ29uZmlndXJlZFNpdGVBZGFwdGVyKSB7CisJCQlyZXR1cm4gVXBkYXRlVUlNZXNzYWdlcy5Db25maWd1cmF0aW9uUHJldmlld0Zvcm1faW5zdGFsbDsgCisJCX0KKwkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElMb2NhbFNpdGUpIHsKKwkJCXJldHVybiBVcGRhdGVVSU1lc3NhZ2VzLkNvbmZpZ3VyYXRpb25QcmV2aWV3Rm9ybV9jb25maWdEZXNjcmlwdGlvbjsgCisJCX0KKwkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCisJfQorCXByaXZhdGUgU3RyaW5nIGdldEZlYXR1cmVEZXNjcmlwdGlvbihJRmVhdHVyZUFkYXB0ZXIgYWRhcHRlcikgeworCQl0cnkgeworCQkJSUZlYXR1cmUgZmVhdHVyZSA9IGFkYXB0ZXIuZ2V0RmVhdHVyZShudWxsKTsKKwkJCUlVUkxFbnRyeSBlbnRyeSA9IGZlYXR1cmUuZ2V0RGVzY3JpcHRpb24oKTsKKwkJCWlmIChlbnRyeSAhPSBudWxsKSB7CisJCQkJU3RyaW5nIHRleHQgPSBlbnRyeS5nZXRBbm5vdGF0aW9uKCk7CisJCQkJaWYgKHRleHQgIT0gbnVsbCkgeworCQkJCQlVUkwgdXJsID0gZW50cnkuZ2V0VVJMKCk7CisJCQkJCWlmICh1cmwgPT0gbnVsbCkKKwkJCQkJCXJldHVybiB0ZXh0OworCQkJCQllbHNlIHsKKwkJCQkJCVN0cmluZyBsaW5rID0gIiA8YSBocmVmPVwiIiArIHVybCAvLyROT04tTkxTLTEkCisJCQkJCQkJCSsgIlwiPiIrVXBkYXRlVUlNZXNzYWdlcy5Nb3JlSW5mb0dlbmVyYXRvcl9tb3JlSW5mbysiPC9hPiI7ICAgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKKwkJCQkJCVN0cmluZyBmdWxsVGV4dCA9ICI8Zm9ybT48cD4iICsgdGV4dCArIGxpbmsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkrICI8L3A+PC9mb3JtPiI7IC8vJE5PTi1OTFMtMSQgCisJCQkJCQlyZXR1cm4gZnVsbFRleHQ7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQl9CisJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAorCX0KKwlwcml2YXRlIFN0cmluZyBnZXRUYXNrc1RleHQoKSB7CisJCWlmICh0YXNrcyA9PSBudWxsIHx8IHRhc2tzLmxlbmd0aCA9PSAwKQorCQkJcmV0dXJuICI8Zm9ybS8+IjsgLy8kTk9OLU5MUy0xJAorCQlib29sZWFuIGhhc0VuYWJsZWRUYXNrcyA9IGZhbHNlOworCQlmb3IgKGludCBpID0gMDsgaSA8IHRhc2tzLmxlbmd0aDsgaSsrKSB7CisJCQlpZiAodGFza3NbaV0uaXNFbmFibGVkKCkpIHsKKwkJCQloYXNFbmFibGVkVGFza3MgPSB0cnVlOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmICghaGFzRW5hYmxlZFRhc2tzKQorCQkJcmV0dXJuICI8Zm9ybS8+IjsgLy8kTk9OLU5MUy0xJAorCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQlidWYuYXBwZW5kKCI8Zm9ybT48cD48Yj4iKTsgLy8kTk9OLU5MUy0xJAorCQlidWYuYXBwZW5kKFVwZGF0ZVVJTWVzc2FnZXMuQ29uZmlndXJhdGlvblByZXZpZXdGb3JtX0F2YWlsYWJsZVRhc2tzKTsgCisJCWJ1Zi5hcHBlbmQoIjwvYj48L3A+Iik7IC8vJE5PTi1OTFMtMSQKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCB0YXNrcy5sZW5ndGg7IGkrKykgeworCQkJSVByZXZpZXdUYXNrIHRhc2sgPSB0YXNrc1tpXTsKKwkJCWlmICh0YXNrLmlzRW5hYmxlZCgpID09IGZhbHNlKQorCQkJCWNvbnRpbnVlOworCQkJYnVmLmFwcGVuZCgiPGxpIHN0eWxlPVwidGV4dFwiIGluZGVudD1cIjBcIj48YSBocmVmPVwiIiArIGkgKyAiXCI+IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkJKyB0YXNrLmdldE5hbWUoKSArICI8L2E+PC9saT4iKTsgLy8kTk9OLU5MUy0xJCAgCisJCQlidWYuYXBwZW5kKCI8bGkgc3R5bGU9XCJ0ZXh0XCIgaW5kZW50PVwiMTBcIiB2c3BhY2U9XCJmYWxzZVwiPiIgLy8kTk9OLU5MUy0xJAorCQkJCQkrIHRhc2suZ2V0RGVzY3JpcHRpb24oKSArICI8L2xpPiIpOyAvLyROT04tTkxTLTEkIAorCQl9CisJCWJ1Zi5hcHBlbmQoIjwvZm9ybT4iKTsgLy8kTk9OLU5MUy0xJAorCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL0NvbmZpZ3VyYXRpb25WaWV3LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvQ29uZmlndXJhdGlvblZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGU3ZGEwCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL0NvbmZpZ3VyYXRpb25WaWV3LmphdmEKQEAgLTAsMCArMSwxMzg3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnZpZXdzOworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOworaW1wb3J0IGphdmEubmV0Lio7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmJyYW5kaW5nLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLklXb3JrYmVuY2hBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuTG9jYWxTaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnBhcnRzLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuKjsKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKKworCisvKioKKyAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCisgKiBAc2VlIFZpZXdQYXJ0CisgKi8KK3B1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uVmlldworCWltcGxlbWVudHMKKwkJSUluc3RhbGxDb25maWd1cmF0aW9uQ2hhbmdlZExpc3RlbmVyLAorCQlJQ29uZmlndXJlZFNpdGVDaGFuZ2VkTGlzdGVuZXIsCisJCUlMb2NhbFNpdGVDaGFuZ2VkTGlzdGVuZXIgeworCXByaXZhdGUgVHJlZVZpZXdlciB0cmVlVmlld2VyOworCXByaXZhdGUgRHJpbGxEb3duQWRhcHRlciBkcmlsbERvd25BZGFwdGVyOworCXByaXZhdGUgQWN0aW9uIGNvbGxhcHNlQWxsQWN0aW9uOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFURV9TSE9XX1VOQ09ORiA9ICJDb25maWd1cmF0aW9uVmlldy5zaG93VW5jb25mIjsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFURV9TSE9XX1NJVEVTID0gIkNvbmZpZ3VyYXRpb25WaWV3LnNob3dTaXRlcyI7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBVEVfU0hPV19ORVNURURfRkVBVFVSRVMgPQorCQkiQ29uZmlndXJhdGlvblZpZXcuc2hvd05lc3RlZEZlYXR1cmVzIjsgLy8kTk9OLU5MUy0xJAorCisJcHJpdmF0ZSBBY3Rpb24gc2hvd1NpdGVzQWN0aW9uOworCXByaXZhdGUgQWN0aW9uIHNob3dOZXN0ZWRGZWF0dXJlc0FjdGlvbjsKKwlwcml2YXRlIFJlcGxhY2VWZXJzaW9uQWN0aW9uIHN3YXBWZXJzaW9uQWN0aW9uOworCXByaXZhdGUgRmVhdHVyZVN0YXRlQWN0aW9uIGZlYXR1cmVTdGF0ZUFjdGlvbjsKKwlwcml2YXRlIFVuaW5zdGFsbEZlYXR1cmVBY3Rpb24gdW5pbnN0YWxsRmVhdHVyZUFjdGlvbjsKKwlwcml2YXRlIFVuY29uZmlndXJlQW5kVW5pbnN0YWxsRmVhdHVyZUFjdGlvbiB1bmNvbmZpZ3VyZUFuZFVuaW5zdGFsbEZlYXR1cmVBY3Rpb247CisJcHJpdmF0ZSBGZWF0dXJlc1N0YXRlQWN0aW9uIGZlYXR1cmVzU3RhdGVBY3Rpb247CisJcHJpdmF0ZSBVbmluc3RhbGxGZWF0dXJlc0FjdGlvbiB1bmluc3RhbGxGZWF0dXJlc0FjdGlvbjsKKwlwcml2YXRlIFVuY29uZmlndXJlQW5kVW5pbnN0YWxsRmVhdHVyZXNBY3Rpb24gdW5jb25maWd1cmVBbmRVbmluc3RhbGxGZWF0dXJlc0FjdGlvbjsKKwlwcml2YXRlIEluc3RhbGxPcHRpb25hbEZlYXR1cmVBY3Rpb24gaW5zdGFsbE9wdEZlYXR1cmVBY3Rpb247CisJcHJpdmF0ZSBBY3Rpb24gc2hvd1VuY29uZkZlYXR1cmVzQWN0aW9uOworCXByaXZhdGUgUmV2ZXJ0Q29uZmlndXJhdGlvbkFjdGlvbiByZXZlcnRBY3Rpb247CisJcHJpdmF0ZSBTaG93QWN0aXZpdGllc0FjdGlvbiBzaG93QWN0aXZpdGllc0FjdGlvbjsKKwlwcml2YXRlIEFjdGlvbiBwcm9wZXJ0aWVzQWN0aW9uOworCXByaXZhdGUgU2l0ZVN0YXRlQWN0aW9uIHNpdGVTdGF0ZUFjdGlvbjsKKwlwcml2YXRlIEFjdGlvbiBpbnN0YWxsYXRpb25IaXN0b3J5QWN0aW9uOworCXByaXZhdGUgQWN0aW9uIG5ld0V4dGVuc2lvbkxvY2F0aW9uQWN0aW9uOworCXByaXZhdGUgRmluZFVwZGF0ZXNBY3Rpb24gZmluZFVwZGF0ZXNBY3Rpb247CisJcHJpdmF0ZSBTYXNoRm9ybSBzcGxpdHRlcjsKKwlwcml2YXRlIENvbmZpZ3VyYXRpb25QcmV2aWV3IHByZXZpZXc7CisJcHJpdmF0ZSBIYXNodGFibGUgcHJldmlld1Rhc2tzOworCQorCXByaXZhdGUgSVVwZGF0ZU1vZGVsQ2hhbmdlZExpc3RlbmVyIG1vZGVsTGlzdGVuZXI7CisJcHJpdmF0ZSBib29sZWFuIHJlZnJlc2hMb2NrID0gZmFsc2U7CisJcHJpdmF0ZSBJbWFnZSBlY2xpcHNlSW1hZ2U7CisJcHJpdmF0ZSBib29sZWFuIGluaXRpYWxpemVkOworCXByaXZhdGUgQ29uZmlndXJhdGlvbk1hbmFnZXJXaW5kb3cgY29uZmlndXJhdGlvbldpbmRvdzsKKworCWNsYXNzIENvbmZpZ3VyYXRpb25Tb3J0ZXIgZXh0ZW5kcyBWaWV3ZXJTb3J0ZXIgeworCQlwdWJsaWMgaW50IGNhdGVnb3J5KE9iamVjdCBvYmopIHsKKwkJCS8vIHNpdGVzCisJCQlpZiAob2JqIGluc3RhbmNlb2YgSUNvbmZpZ3VyZWRTaXRlQWRhcHRlcikgeworCQkJCUlDb25maWd1cmVkU2l0ZSBjc2l0ZSA9CisJCQkJCSgoSUNvbmZpZ3VyZWRTaXRlQWRhcHRlcikgb2JqKS5nZXRDb25maWd1cmVkU2l0ZSgpOworCQkJCWlmIChjc2l0ZS5pc1Byb2R1Y3RTaXRlKCkpCisJCQkJCXJldHVybiAxOworCQkJCWlmIChjc2l0ZS5pc0V4dGVuc2lvblNpdGUoKSkKKwkJCQkJcmV0dXJuIDI7CisJCQkJcmV0dXJuIDM7CisJCQl9CisJCQlyZXR1cm4gc3VwZXIuY2F0ZWdvcnkob2JqKTsKKwkJfQorCX0KKworCWNsYXNzIExvY2FsU2l0ZVByb3ZpZGVyCisJCWV4dGVuZHMgRGVmYXVsdENvbnRlbnRQcm92aWRlcgorCQlpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyIHsKKwkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKAorCQkJVmlld2VyIHZpZXdlciwKKwkJCU9iamVjdCBvbGRJbnB1dCwKKwkJCU9iamVjdCBuZXdJbnB1dCkgeworCQkJaWYgKG5ld0lucHV0ID09IG51bGwpCisJCQkJcmV0dXJuOworCQl9CisKKwkJcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnQpIHsKKwkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBVcGRhdGVNb2RlbCkgeworCQkJCUxvY2FsU2l0ZVdvcmtiZW5jaEFkYXB0ZXIgbG9jYWxTaXRlID0gZ2V0VUlSZWFkeUxvY2FsU2l0ZShnZXRMb2NhbFNpdGUoKSk7CisJCQkJcmV0dXJuIChsb2NhbFNpdGUgIT0gbnVsbCkgPyBuZXcgT2JqZWN0W10geyBsb2NhbFNpdGUgfQorCQkJCTogbmV3IE9iamVjdFswXTsKKwkJCX0KKworCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIElMb2NhbFNpdGUpIHsKKwkJCQlPYmplY3RbXSBjc2l0ZXMgPSBvcGVuTG9jYWxTaXRlKCk7CisJCQkJaWYgKHNob3dTaXRlc0FjdGlvbi5pc0NoZWNrZWQoKSkKKwkJCQkJcmV0dXJuIGNzaXRlczsKKwkJCQlBcnJheUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOworCQkJCWJvb2xlYW4gc2hvd1VuY29uZiA9IHNob3dVbmNvbmZGZWF0dXJlc0FjdGlvbi5pc0NoZWNrZWQoKTsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNzaXRlcy5sZW5ndGg7IGkrKykgeworCQkJCQlJQ29uZmlndXJlZFNpdGVBZGFwdGVyIGFkYXB0ZXIgPQorCQkJCQkJKElDb25maWd1cmVkU2l0ZUFkYXB0ZXIpIGNzaXRlc1tpXTsKKwkJCQkJT2JqZWN0W10gcm9vdHMgPSBnZXRGZWF0dXJlcyhhZGFwdGVyLCAhc2hvd1VuY29uZik7CisJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgcm9vdHMubGVuZ3RoOyBqKyspIHsKKwkJCQkJCXJlc3VsdC5hZGQocm9vdHNbal0pOworCQkJCQl9CisJCQkJfQorCQkJCXJldHVybiByZXN1bHQudG9BcnJheSgpOworCQkJfQorCisJCQlpZiAocGFyZW50IGluc3RhbmNlb2YgSUNvbmZpZ3VyZWRTaXRlQWRhcHRlcikgeworCQkJCXJldHVybiBnZXRGZWF0dXJlcygKKwkJCQkJKElDb25maWd1cmVkU2l0ZUFkYXB0ZXIpIHBhcmVudCwKKwkJCQkJIXNob3dVbmNvbmZGZWF0dXJlc0FjdGlvbi5pc0NoZWNrZWQoKSk7CisJCQl9CisJCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyCisJCQkJJiYgc2hvd05lc3RlZEZlYXR1cmVzQWN0aW9uLmlzQ2hlY2tlZCgpKSB7CisJCQkJSUZlYXR1cmVBZGFwdGVyW10gbmVzdGVkID0KKwkJCQkJKChDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXIpIHBhcmVudCkuZ2V0SW5jbHVkZWRGZWF0dXJlcygKKwkJCQkJCW51bGwpOworCQkJCWlmIChzaG93VW5jb25mRmVhdHVyZXNBY3Rpb24uaXNDaGVja2VkKCkpCisJCQkJCXJldHVybiBuZXN0ZWQ7CisJCQkJQXJyYXlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IG5lc3RlZC5sZW5ndGg7IGkrKykgeworCQkJCQlpZiAoKChDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXIpIG5lc3RlZFtpXSkuaXNDb25maWd1cmVkKCkpCisJCQkJCQlyZXN1bHQuYWRkKG5lc3RlZFtpXSk7CisJCQkJfQorCQkJCXJldHVybiAoSUZlYXR1cmVBZGFwdGVyW10pIHJlc3VsdC50b0FycmF5KAorCQkJCQluZXcgSUZlYXR1cmVBZGFwdGVyW3Jlc3VsdC5zaXplKCldKTsKKwkJCX0KKwkJCXJldHVybiBuZXcgT2JqZWN0WzBdOworCQl9CisKKwkJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGNoaWxkKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgcGFyZW50KSB7CisJCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyKSB7CisJCQkJaWYgKCFzaG93TmVzdGVkRmVhdHVyZXNBY3Rpb24uaXNDaGVja2VkKCkpCisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQlJRmVhdHVyZUFkYXB0ZXJbXSBmZWF0dXJlcyA9CisJCQkJCSgoQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyKSBwYXJlbnQpLmdldEluY2x1ZGVkRmVhdHVyZXMoCisJCQkJCQludWxsKTsKKworCQkJCWlmIChzaG93VW5jb25mRmVhdHVyZXNBY3Rpb24uaXNDaGVja2VkKCkpCisJCQkJCXJldHVybiBmZWF0dXJlcy5sZW5ndGggPiAwOworCisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5sZW5ndGg7IGkrKykgeworCQkJCQlpZiAoKChDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXIpIGZlYXR1cmVzW2ldKQorCQkJCQkJLmlzQ29uZmlndXJlZCgpKQorCQkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBDb25maWd1cmVkU2l0ZUFkYXB0ZXIpIHsKKwkJCQlJQ29uZmlndXJlZFNpdGUgc2l0ZSA9CisJCQkJCSgoQ29uZmlndXJlZFNpdGVBZGFwdGVyKSBwYXJlbnQpLmdldENvbmZpZ3VyZWRTaXRlKCk7CisJCQkJaWYgKHNpdGUuaXNFbmFibGVkKCkpIHsKKwkJCQkJaWYgKCFzaG93VW5jb25mRmVhdHVyZXNBY3Rpb24uaXNDaGVja2VkKCkpCisJCQkJCQlyZXR1cm4gc2l0ZS5nZXRDb25maWd1cmVkRmVhdHVyZXMoKS5sZW5ndGggPiAwOworCQkJCQlyZXR1cm4gc2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpLmxlbmd0aCA+IDA7CisJCQkJfQorCQkJCXJldHVybiAoc2hvd1VuY29uZkZlYXR1cmVzQWN0aW9uLmlzQ2hlY2tlZCgpKTsKKwkJCX0KKwkJCXJldHVybiB0cnVlOworCQl9CisKKwkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dCkgeworCQkJcmV0dXJuIGdldENoaWxkcmVuKGlucHV0KTsKKwkJfQorCX0KKworCWNsYXNzIExvY2FsU2l0ZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIHsKKwkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmopIHsKKwkJCWlmIChvYmogaW5zdGFuY2VvZiBJTG9jYWxTaXRlKSB7CisJCQkJSVByb2R1Y3QgcHJvZHVjdCA9IFBsYXRmb3JtLmdldFByb2R1Y3QoKTsKKwkJCQlpZiAocHJvZHVjdCAhPSBudWxsKQorCQkJCQlyZXR1cm4gcHJvZHVjdC5nZXROYW1lKCk7CisJCQkJcmV0dXJuIFVwZGF0ZVVJTWVzc2FnZXMuQ29uZmlndXJhdGlvblZpZXdfY3VycmVudDsgCisJCQl9CisKKwkJCWlmIChvYmogaW5zdGFuY2VvZiBJQ29uZmlndXJlZFNpdGVBZGFwdGVyKSB7CisJCQkJSUNvbmZpZ3VyZWRTaXRlIGNzaXRlID0KKwkJCQkJKChJQ29uZmlndXJlZFNpdGVBZGFwdGVyKSBvYmopLmdldENvbmZpZ3VyZWRTaXRlKCk7CisJCQkJSVNpdGUgc2l0ZSA9IGNzaXRlLmdldFNpdGUoKTsKKwkJCQlyZXR1cm4gbmV3IEZpbGUoc2l0ZS5nZXRVUkwoKS5nZXRGaWxlKCkpLnRvU3RyaW5nKCk7CisJCQl9CisJCQlpZiAob2JqIGluc3RhbmNlb2YgSUZlYXR1cmVBZGFwdGVyKSB7CisJCQkJdHJ5IHsKKwkJCQkJSUZlYXR1cmUgZmVhdHVyZSA9ICgoSUZlYXR1cmVBZGFwdGVyKSBvYmopLmdldEZlYXR1cmUobnVsbCk7CisJCQkJCWlmIChmZWF0dXJlIGluc3RhbmNlb2YgTWlzc2luZ0ZlYXR1cmUpIHsKKwkJCQkJCXJldHVybiBOTFMuYmluZChVcGRhdGVVSU1lc3NhZ2VzLkNvbmZpZ3VyYXRpb25WaWV3X21pc3NpbmdGZWF0dXJlLCBmZWF0dXJlLmdldExhYmVsKCkpOworCQkJCQl9CisJCQkJCVN0cmluZyB2ZXJzaW9uID0gZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0VmVyc2lvbigpLnRvU3RyaW5nKCk7CisJCQkJCVN0cmluZyBwZW5kaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKKwkJCQkJaWYgKE9wZXJhdGlvbnNNYW5hZ2VyLmZpbmRQZW5kaW5nT3BlcmF0aW9uKGZlYXR1cmUpCisJCQkJCQkhPSBudWxsKQorCQkJCQkJcGVuZGluZyA9IFVwZGF0ZVVJTWVzc2FnZXMuQ29uZmlndXJhdGlvblZpZXdfcGVuZGluZzsgCisJCQkJCXJldHVybiBmZWF0dXJlLmdldExhYmVsKCkgKyAiICIgKyB2ZXJzaW9uICsgcGVuZGluZzsgLy8kTk9OLU5MUy0xJAorCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJCQlyZXR1cm4gVXBkYXRlVUlNZXNzYWdlcy5Db25maWd1cmF0aW9uVmlld19lcnJvcjsgCisJCQkJfQorCQkJfQorCQkJcmV0dXJuIHN1cGVyLmdldFRleHQob2JqKTsKKwkJfQorCisJCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3Qgb2JqKSB7CisJCQlVcGRhdGVMYWJlbFByb3ZpZGVyIHByb3ZpZGVyID0KKwkJCQlVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0TGFiZWxQcm92aWRlcigpOworCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElMb2NhbFNpdGUpCisJCQkJcmV0dXJuIGVjbGlwc2VJbWFnZTsKKworCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlcikKKwkJCQlyZXR1cm4gZ2V0RmVhdHVyZUltYWdlKAorCQkJCQlwcm92aWRlciwKKwkJCQkJKENvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlcikgb2JqKTsKKworCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElDb25maWd1cmVkU2l0ZUFkYXB0ZXIpIHsKKwkJCQlJQ29uZmlndXJlZFNpdGUgY3NpdGUgPQorCQkJCQkoKElDb25maWd1cmVkU2l0ZUFkYXB0ZXIpIG9iaikuZ2V0Q29uZmlndXJlZFNpdGUoKTsKKwkJCQlpbnQgZmxhZ3MgPQorCQkJCQljc2l0ZS5pc1VwZGF0YWJsZSgpID8gMCA6IFVwZGF0ZUxhYmVsUHJvdmlkZXIuRl9MSU5LRUQ7CisJCQkJaWYgKCFjc2l0ZS5pc0VuYWJsZWQoKSkKKwkJCQkJZmxhZ3MgfD0gVXBkYXRlTGFiZWxQcm92aWRlci5GX1VOQ09ORklHVVJFRDsKKwkJCQlyZXR1cm4gcHJvdmlkZXIuZ2V0KAorCQkJCQlwcm92aWRlci5nZXRMb2NhbFNpdGVEZXNjcmlwdG9yKGNzaXRlKSwKKwkJCQkJZmxhZ3MpOworCQkJfQorCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlwcml2YXRlIEltYWdlIGdldEZlYXR1cmVJbWFnZSgKKwkJCVVwZGF0ZUxhYmVsUHJvdmlkZXIgcHJvdmlkZXIsCisJCQlDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXIgYWRhcHRlcikgeworCQkJdHJ5IHsKKwkJCQlJRmVhdHVyZSBmZWF0dXJlID0gYWRhcHRlci5nZXRGZWF0dXJlKG51bGwpOworCQkJCWlmIChmZWF0dXJlIGluc3RhbmNlb2YgTWlzc2luZ0ZlYXR1cmUpIHsKKwkJCQkJaWYgKCgoTWlzc2luZ0ZlYXR1cmUpIGZlYXR1cmUpLmlzT3B0aW9uYWwoKSkKKwkJCQkJCXJldHVybiBwcm92aWRlci5nZXQoCisJCQkJCQkJVXBkYXRlVUlJbWFnZXMuREVTQ19OT1RJTlNUX0ZFQVRVUkVfT0JKKTsKKwkJCQkJcmV0dXJuIHByb3ZpZGVyLmdldCgKKwkJCQkJCVVwZGF0ZVVJSW1hZ2VzLkRFU0NfRkVBVFVSRV9PQkosCisJCQkJCQlVcGRhdGVMYWJlbFByb3ZpZGVyLkZfRVJST1IpOworCQkJCX0KKworCQkJCWJvb2xlYW4gZWZpeCA9IGZlYXR1cmUuaXNQYXRjaCgpOworCQkJCUltYWdlRGVzY3JpcHRvciBiYXNlRGVzYyA9CisJCQkJCWVmaXgKKwkJCQkJCT8gVXBkYXRlVUlJbWFnZXMuREVTQ19FRklYX09CSgorCQkJCQkJOiAoYWRhcHRlci5pc0NvbmZpZ3VyZWQoKQorCQkJCQkJCT8gVXBkYXRlVUlJbWFnZXMuREVTQ19GRUFUVVJFX09CSgorCQkJCQkJCTogVXBkYXRlVUlJbWFnZXMuREVTQ19VTkNPTkZfRkVBVFVSRV9PQkopOworCisJCQkJaW50IGZsYWdzID0gMDsKKwkJCQlpZiAoZWZpeCAmJiAhYWRhcHRlci5pc0NvbmZpZ3VyZWQoKSkKKwkJCQkJZmxhZ3MgfD0gVXBkYXRlTGFiZWxQcm92aWRlci5GX1VOQ09ORklHVVJFRDsKKwkJCQlpZiAoT3BlcmF0aW9uc01hbmFnZXIuZmluZFBlbmRpbmdPcGVyYXRpb24oZmVhdHVyZSkgPT0gbnVsbCkgeworCQkJCQlJTG9jYWxTaXRlIGxvY2FsU2l0ZSA9IGdldExvY2FsU2l0ZSgpOworCQkJCQlpZiAobG9jYWxTaXRlICE9IG51bGwpIHsKKwkJCQkJCWludCBjb2RlID0KKwkJCQkJCQlnZXRTdGF0dXNDb2RlKAorCQkJCQkJCQlmZWF0dXJlLAorCQkJCQkJCQlsb2NhbFNpdGUuZ2V0RmVhdHVyZVN0YXR1cyhmZWF0dXJlKSk7CisJCQkJCQlzd2l0Y2ggKGNvZGUpIHsKKwkJCQkJCQljYXNlIElGZWF0dXJlLlNUQVRVU19VTkhBUFBZIDoKKwkJCQkJCQkJZmxhZ3MgfD0gVXBkYXRlTGFiZWxQcm92aWRlci5GX0VSUk9SOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIElGZWF0dXJlLlNUQVRVU19BTUJJR1VPVVMgOgorCQkJCQkJCQlmbGFncyB8PSBVcGRhdGVMYWJlbFByb3ZpZGVyLkZfV0FSTklORzsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJZGVmYXVsdCA6CisJCQkJCQkJCWlmIChhZGFwdGVyLmlzQ29uZmlndXJlZCgpCisJCQkJCQkJCQkmJiBhZGFwdGVyLmlzVXBkYXRlZCgpKQorCQkJCQkJCQkJZmxhZ3MgfD0gVXBkYXRlTGFiZWxQcm92aWRlci5GX1VQREFURUQ7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCXJldHVybiBwcm92aWRlci5nZXQoYmFzZURlc2MsIGZsYWdzKTsKKwkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJCXJldHVybiBwcm92aWRlci5nZXQoCisJCQkJCVVwZGF0ZVVJSW1hZ2VzLkRFU0NfRkVBVFVSRV9PQkosCisJCQkJCVVwZGF0ZUxhYmVsUHJvdmlkZXIuRl9FUlJPUik7CisJCQl9CisJCX0KKwl9CisKKwljbGFzcyBQcmV2aWV3VGFzayBpbXBsZW1lbnRzIElQcmV2aWV3VGFzayB7CisJCXByaXZhdGUgU3RyaW5nIG5hbWU7CisJCXByaXZhdGUgU3RyaW5nIGRlc2M7CisJCXByaXZhdGUgSUFjdGlvbiBhY3Rpb247CisJCXB1YmxpYyBQcmV2aWV3VGFzayhTdHJpbmcgbmFtZSwgU3RyaW5nIGRlc2MsIElBY3Rpb24gYWN0aW9uKSB7CisJCQl0aGlzLm5hbWUgPSBuYW1lOworCQkJdGhpcy5kZXNjID0gZGVzYzsKKwkJCXRoaXMuYWN0aW9uID0gYWN0aW9uOworCQl9CisJCXB1YmxpYyBJQWN0aW9uIGdldEFjdGlvbigpIHsKKwkJCXJldHVybiBhY3Rpb247CisJCX0KKwkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQkJaWYgKG5hbWUgIT0gbnVsbCkKKwkJCQlyZXR1cm4gbmFtZTsKKwkJCXJldHVybiBhY3Rpb24uZ2V0VGV4dCgpOworCQl9CisJCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisJCQlyZXR1cm4gZGVzYzsKKwkJfQorCQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzYykgeworCQkJdGhpcy5kZXNjID0gZGVzYzsKKwkJfQorCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQlhY3Rpb24ucnVuKCk7CisJCX0KKwkJcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgeworCQkJcmV0dXJuIGFjdGlvbi5pc0VuYWJsZWQoKTsKKwkJfQorCX0KKworCXB1YmxpYyBDb25maWd1cmF0aW9uVmlldyhDb25maWd1cmF0aW9uTWFuYWdlcldpbmRvdyB3aW5kb3cpIHsKKwkJVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldExhYmVsUHJvdmlkZXIoKS5jb25uZWN0KHRoaXMpOworCQljb25maWd1cmF0aW9uV2luZG93PXdpbmRvdzsKKwkJaW5pdGlhbGl6ZUltYWdlcygpOworCX0KKworCXByaXZhdGUgdm9pZCBpbml0aWFsaXplSW1hZ2VzKCkgeworCQlJUHJvZHVjdCBwcm9kdWN0ID0gUGxhdGZvcm0uZ2V0UHJvZHVjdCgpOworCQlpZiAocHJvZHVjdCAhPSBudWxsKSB7CisJCQllY2xpcHNlSW1hZ2UgPSBnZXRQcm9kdWN0SW1hZ2UxNihwcm9kdWN0KTsKKwkJfQorCQlpZiAoZWNsaXBzZUltYWdlPT1udWxsKSB7CisJCQlJbWFnZURlc2NyaXB0b3IgZWRlc2MgPSBVcGRhdGVVSUltYWdlcy5ERVNDX0FQUF9PQko7CisJCQllY2xpcHNlSW1hZ2UgPSBVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0TGFiZWxQcm92aWRlcigpLmdldChlZGVzYyk7CisJCX0KKwl9CisJCisJcHJpdmF0ZSBJbWFnZSBnZXRQcm9kdWN0SW1hZ2UxNihJUHJvZHVjdCBwcm9kdWN0KSB7CisJCS8vIExvb3AgdGhyb3VnaCB0aGUgcHJvZHVjdCB3aW5kb3cgaW1hZ2VzIGFuZAorCQkvLyBwaWNrIHRoZSBmaXJzdCB3aG9zZSBzaXplIGlzIDE2eDE2IGFuZCBkb2VzIG5vdAorCQkvLyBhbHBoYSB0cmFuc3BhcmVuY3kgdHlwZS4KKwkJU3RyaW5nIHdpbmRvd0ltYWdlc1VybHMgPSBwcm9kdWN0LmdldFByb3BlcnR5KElQcm9kdWN0Q29uc3RhbnRzLldJTkRPV19JTUFHRVMpOworCQlJbWFnZSBwbmc9bnVsbCwgZ2lmPW51bGwsIG90aGVyID0gbnVsbDsKKwkJaWYgKHdpbmRvd0ltYWdlc1VybHMgIT0gbnVsbCApIHsKKwkJCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIod2luZG93SW1hZ2VzVXJscywgIiwiKTsgLy8kTk9OLU5MUy0xJAorCQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgeworCQkJCVN0cmluZyB3aW5kb3dJbWFnZVVSTCA9IHN0Lm5leHRUb2tlbigpOworCQkJCUltYWdlRGVzY3JpcHRvciBlZGVzYz1udWxsOworCQkJCXRyeSB7CisJCQkJCWVkZXNjID0gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwobmV3IFVSTCh3aW5kb3dJbWFnZVVSTCkpOworCQkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisJCQkJCS8vIG11c3QgYmUgYSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBwcm9kdWN0IGJ1bmRsZQorCQkJCQlCdW5kbGUgcHJvZHVjdEJ1bmRsZSA9IHByb2R1Y3QuZ2V0RGVmaW5pbmdCdW5kbGUoKTsKKwkJCQkJaWYgKHByb2R1Y3RCdW5kbGUgIT0gbnVsbCkgeyAKKwkJCQkJCVVSTCB1cmwgPSBGaWxlTG9jYXRvci5maW5kKHByb2R1Y3RCdW5kbGUsIG5ldyBQYXRoKHdpbmRvd0ltYWdlVVJMKSwgbnVsbCk7CisJCQkJCQlpZiAodXJsICE9IG51bGwpCisJCQkJCQkJZWRlc2MgPSBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTCh1cmwpOworCQkJCQl9CisJCQkJfQorCQkJCWlmIChlZGVzYyE9bnVsbCkgeworCQkJCQlJbWFnZSBpbWFnZSA9IFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRMYWJlbFByb3ZpZGVyKCkuZ2V0KGVkZXNjKTsKKwkJCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGltYWdlLmdldEJvdW5kcygpOworCQkJCQlpZiAoYm91bmRzLndpZHRoPT0xNiAmJiBib3VuZHMuaGVpZ2h0PT0xNikgeworCQkJCQkJLy8gYXZvaWQgaW1hZ2VzIHdpdGggVFJBTlNQQVJFTkNZX0FMUEhBCisJCQkJCQkvL2lmIChpbWFnZS5nZXRJbWFnZURhdGEoKS5nZXRUcmFuc3BhcmVuY3lUeXBlKCkhPVNXVC5UUkFOU1BBUkVOQ1lfQUxQSEEpCisJCQkJCQkvLwlyZXR1cm4gaW1hZ2U7CisJCQkJCQkvL0luc3RlYWQgb2YgcmV0dXJuaW5nLCBqdXN0IHN0b3JlIHRoZSBpbWFnZSBiYXNlZCBvbiB0aGUKKwkJCQkJCS8vIGV4dGVuc2lvbi4KKwkJCQkJCWlmICh3aW5kb3dJbWFnZVVSTC50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCIuZ2lmIikpIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQlnaWYgPSBpbWFnZTsKKwkJCQkJCWVsc2UgaWYgKHdpbmRvd0ltYWdlVVJMLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIi5wbmciKSkgLy8kTk9OLU5MUy0xJAorCQkJCQkJCXBuZyA9IGltYWdlOworCQkJCQkJZWxzZQorCQkJCQkJCW90aGVyID0gaW1hZ2U7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJSW1hZ2UgY2hvaWNlID0gbnVsbDsKKwkJLy8gUGljayBwbmcgZmlyc3QgYmVjYXVzZSBvZiB0cmFuc3BhcmVuY3kKKwkJaWYgKHBuZyE9bnVsbCkgeworCQkJY2hvaWNlID0gcG5nOworCQl9CisJCS8vIFBpY2sgb3RoZXIgZm9ybWF0CisJCWVsc2UgaWYgKG90aGVyIT1udWxsKQorCQkJY2hvaWNlID0gb3RoZXI7CisJCS8vIFBpY2sgZ2lmCisJCWVsc2UgaWYgKGdpZiE9bnVsbCkKKwkJCWNob2ljZSA9IGdpZjsKKwkJcmV0dXJuIGNob2ljZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBpbml0UHJvdmlkZXJzKCkgeworCQl0cmVlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgTG9jYWxTaXRlUHJvdmlkZXIoKSk7CisJCXRyZWVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgTG9jYWxTaXRlTGFiZWxQcm92aWRlcigpKTsKKwkJdHJlZVZpZXdlci5zZXRJbnB1dChVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0VXBkYXRlTW9kZWwoKSk7CisJCXRyZWVWaWV3ZXIuc2V0U29ydGVyKG5ldyBDb25maWd1cmF0aW9uU29ydGVyKCkpOworCQlJTG9jYWxTaXRlIGxvY2FsU2l0ZSA9IGdldExvY2FsU2l0ZSgpOworCQlpZiAobG9jYWxTaXRlICE9IG51bGwpCisJCQlsb2NhbFNpdGUuYWRkTG9jYWxTaXRlQ2hhbmdlZExpc3RlbmVyKHRoaXMpOworCisJCW1vZGVsTGlzdGVuZXIgPSBuZXcgSVVwZGF0ZU1vZGVsQ2hhbmdlZExpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgb2JqZWN0c0FkZGVkKE9iamVjdCBwYXJlbnQsIE9iamVjdFtdIGNoaWxkcmVuKSB7CisJCQl9CisJCQlwdWJsaWMgdm9pZCBvYmplY3RzUmVtb3ZlZChPYmplY3QgcGFyZW50LCBPYmplY3RbXSBjaGlsZHJlbikgeworCQkJfQorCQkJcHVibGljIHZvaWQgb2JqZWN0Q2hhbmdlZChmaW5hbCBPYmplY3Qgb2JqLCBTdHJpbmcgcHJvcGVydHkpIHsKKwkJCQlpZiAocmVmcmVzaExvY2spCisJCQkJCXJldHVybjsKKwkJCQlDb250cm9sIGNvbnRyb2wgPSBnZXRDb250cm9sKCk7CisJCQkJaWYgKCFjb250cm9sLmlzRGlzcG9zZWQoKSkgeworCQkJCQljb250cm9sLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgeworCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkJCXRyZWVWaWV3ZXIucmVmcmVzaCgpOworCQkJCQkJCWhhbmRsZVNlbGVjdGlvbkNoYW5nZWQoCisJCQkJCQkJCShJU3RydWN0dXJlZFNlbGVjdGlvbikgdHJlZVZpZXdlcgorCQkJCQkJCQkJLmdldFNlbGVjdGlvbigpKTsKKwkJCQkJCX0KKwkJCQkJfSk7CisJCQkJfQorCQkJfQorCQl9OworCQlPcGVyYXRpb25zTWFuYWdlci5hZGRVcGRhdGVNb2RlbENoYW5nZWRMaXN0ZW5lcihtb2RlbExpc3RlbmVyKTsKKyAgICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCgKKwkJCWdldENvbnRyb2woKSwKKwkJCSJvcmcuZWNsaXBzZS51cGRhdGUudWkuQ29uZmlndXJhdGlvblZpZXciKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCXByaXZhdGUgSUxvY2FsU2l0ZSBnZXRMb2NhbFNpdGUoKSB7CisJCXRyeSB7CisJCQlyZXR1cm4gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7CisJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJVXBkYXRlVUkubG9nRXhjZXB0aW9uKGUpOworCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9CisKKwlwcml2YXRlIE9iamVjdFtdIG9wZW5Mb2NhbFNpdGUoKSB7CisJCWZpbmFsIE9iamVjdFtdW10gYmFnID0gbmV3IE9iamVjdFsxXVtdOworCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShnZXRDb250cm9sKCkuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7CisJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJSUxvY2FsU2l0ZSBsb2NhbFNpdGUgPSBnZXRMb2NhbFNpdGUoKTsKKwkJCQlpZiAobG9jYWxTaXRlID09IG51bGwpCisJCQkJCXJldHVybjsKKwkJCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnID0KKwkJCQkJZ2V0TG9jYWxTaXRlKCkuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKTsKKwkJCQlJQ29uZmlndXJlZFNpdGVbXSBzaXRlcyA9IGNvbmZpZy5nZXRDb25maWd1cmVkU2l0ZXMoKTsKKwkJCQlPYmplY3RbXSByZXN1bHQgPSBuZXcgT2JqZWN0W3NpdGVzLmxlbmd0aF07CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXRlcy5sZW5ndGg7IGkrKykgeworCQkJCQlyZXN1bHRbaV0gPSBuZXcgQ29uZmlndXJlZFNpdGVBZGFwdGVyKGNvbmZpZywgc2l0ZXNbaV0pOworCQkJCX0KKwkJCQlpZiAoIWluaXRpYWxpemVkKSB7CisJCQkJCWNvbmZpZy5hZGRJbnN0YWxsQ29uZmlndXJhdGlvbkNoYW5nZWRMaXN0ZW5lcigKKwkJCQkJCUNvbmZpZ3VyYXRpb25WaWV3LnRoaXMpOworCQkJCQlpbml0aWFsaXplZCA9IHRydWU7CisJCQkJfQorCQkJCWJhZ1swXSA9IHJlc3VsdDsKKwkJCX0KKwkJfSk7CisJCXJldHVybiBiYWdbMF07CisJfQorCisJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKwkJVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldExhYmVsUHJvdmlkZXIoKS5kaXNjb25uZWN0KHRoaXMpOworCQlpZiAoaW5pdGlhbGl6ZWQpIHsKKwkJCUlMb2NhbFNpdGUgbG9jYWxTaXRlID0gZ2V0TG9jYWxTaXRlKCk7CisJCQlpZiAobG9jYWxTaXRlICE9IG51bGwpIHsKKwkJCQlsb2NhbFNpdGUucmVtb3ZlTG9jYWxTaXRlQ2hhbmdlZExpc3RlbmVyKHRoaXMpOworCQkJCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcgPQorCQkJCQlsb2NhbFNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKTsKKwkJCQljb25maWcucmVtb3ZlSW5zdGFsbENvbmZpZ3VyYXRpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7CisJCQl9CisJCQlpbml0aWFsaXplZCA9IGZhbHNlOworCQl9CisJCU9wZXJhdGlvbnNNYW5hZ2VyLnJlbW92ZVVwZGF0ZU1vZGVsQ2hhbmdlZExpc3RlbmVyKG1vZGVsTGlzdGVuZXIpOworCQlpZiAocHJldmlldyAhPSBudWxsKQorCQkJcHJldmlldy5kaXNwb3NlKCk7CisJCS8vc3VwZXIuZGlzcG9zZSgpOworCX0KKworCXByb3RlY3RlZCB2b2lkIG1ha2VBY3Rpb25zKCkgeworCQljb2xsYXBzZUFsbEFjdGlvbiA9IG5ldyBBY3Rpb24oKSB7CisJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJdHJlZVZpZXdlci5nZXRDb250cm9sKCkuc2V0UmVkcmF3KGZhbHNlKTsKKwkJCQl0cmVlVmlld2VyLmNvbGxhcHNlVG9MZXZlbCgKKwkJCQkJdHJlZVZpZXdlci5nZXRJbnB1dCgpLAorCQkJCQlUcmVlVmlld2VyLkFMTF9MRVZFTFMpOworCQkJCXRyZWVWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldFJlZHJhdyh0cnVlKTsKKwkJCX0KKwkJfTsKKwkJY29sbGFwc2VBbGxBY3Rpb24uc2V0VGV4dChVcGRhdGVVSU1lc3NhZ2VzLkNvbmZpZ3VyYXRpb25WaWV3X2NvbGxhcHNlTGFiZWwpOyAKKwkJY29sbGFwc2VBbGxBY3Rpb24uc2V0VG9vbFRpcFRleHQoVXBkYXRlVUlNZXNzYWdlcy5Db25maWd1cmF0aW9uVmlld19jb2xsYXBzZVRvb2x0aXApOyAKKwkJY29sbGFwc2VBbGxBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKFVwZGF0ZVVJSW1hZ2VzLkRFU0NfQ09MTEFQU0VfQUxMKTsKKworCQlkcmlsbERvd25BZGFwdGVyID0gbmV3IERyaWxsRG93bkFkYXB0ZXIodHJlZVZpZXdlcik7CisKKwkJZmVhdHVyZVN0YXRlQWN0aW9uID0gbmV3IEZlYXR1cmVTdGF0ZUFjdGlvbih0aGlzLmdldENvbmZpZ3VyYXRpb25XaW5kb3coKS5nZXRTaGVsbCgpLCAiIik7IC8vJE5PTi1OTFMtMSQKKwkJZmVhdHVyZXNTdGF0ZUFjdGlvbiA9IG5ldyBGZWF0dXJlc1N0YXRlQWN0aW9uKHRoaXMuZ2V0Q29uZmlndXJhdGlvbldpbmRvdygpLmdldFNoZWxsKCksICIiKTsgLy8kTk9OLU5MUy0xJAorCisJCXNpdGVTdGF0ZUFjdGlvbiA9IG5ldyBTaXRlU3RhdGVBY3Rpb24oZ2V0Q29uZmlndXJhdGlvbldpbmRvdygpLmdldFNoZWxsKCkpOworCisJCXJldmVydEFjdGlvbiA9IG5ldyBSZXZlcnRDb25maWd1cmF0aW9uQWN0aW9uKGdldENvbmZpZ3VyYXRpb25XaW5kb3coKS5nZXRTaGVsbCgpLFVwZGF0ZVVJTWVzc2FnZXMuQ29uZmlndXJhdGlvblZpZXdfcmV2ZXJ0TGFiZWwpOyAKKyAgICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCgKKwkJCXJldmVydEFjdGlvbiwKKwkJCSJvcmcuZWNsaXBzZS51cGRhdGUudWkuQ29maWd1cmF0aW9uVmlld19yZXZlcnRBY3Rpb24iKTsgLy8kTk9OLU5MUy0xJAorCisJCWluc3RhbGxhdGlvbkhpc3RvcnlBY3Rpb24gPQorCQkJbmV3IEluc3RhbGxhdGlvbkhpc3RvcnlBY3Rpb24oZ2V0Q29uZmlndXJhdGlvbldpbmRvdygpLmdldFNoZWxsKCksCisJCQkJVXBkYXRlVUlNZXNzYWdlcy5Db25maWd1cmF0aW9uVmlld19pbnN0YWxsSGlzdG9yeSwgCisJCQkJVXBkYXRlVUlJbWFnZXMuREVTQ19ISVNUT1JZX09CSik7CisJCWluc3RhbGxhdGlvbkhpc3RvcnlBY3Rpb24uc2V0VG9vbFRpcFRleHQoaW5zdGFsbGF0aW9uSGlzdG9yeUFjdGlvbi5nZXRUZXh0KCkpOworCQkKKwkJbmV3RXh0ZW5zaW9uTG9jYXRpb25BY3Rpb24gPQorCQkJbmV3IE5ld0V4dGVuc2lvbkxvY2F0aW9uQWN0aW9uKGdldENvbmZpZ3VyYXRpb25XaW5kb3coKS5nZXRTaGVsbCgpLAorCQkJCVVwZGF0ZVVJTWVzc2FnZXMuQ29uZmlndXJhdGlvblZpZXdfZXh0TG9jYXRpb24sIAorCQkJCVVwZGF0ZVVJSW1hZ2VzLkRFU0NfRVNJVEVfT0JKKTsKKwkJCisJCXByb3BlcnRpZXNBY3Rpb24gPQorCQkJbmV3IFByb3BlcnR5RGlhbG9nQWN0aW9uKAorCQkJCWdldENvbmZpZ3VyYXRpb25XaW5kb3coKSwKKwkJCQl0cmVlVmlld2VyKTsKKyAgICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCgKKwkJCXByb3BlcnRpZXNBY3Rpb24sCisJCQkib3JnLmVjbGlwc2UudXBkYXRlLnVpLkNvZmlndXJhdGlvblZpZXdfcHJvcGVydGllc0FjdGlvbiIpOyAvLyROT04tTkxTLTEkCisKKwkJdW5pbnN0YWxsRmVhdHVyZUFjdGlvbiA9IG5ldyBVbmluc3RhbGxGZWF0dXJlQWN0aW9uKGdldENvbmZpZ3VyYXRpb25XaW5kb3coKS5nZXRTaGVsbCgpLCBVcGRhdGVVSU1lc3NhZ2VzLkNvbmZpZ3VyYXRpb25WaWV3X3VuaW5zdGFsbCk7IAorCQl1bmNvbmZpZ3VyZUFuZFVuaW5zdGFsbEZlYXR1cmVBY3Rpb24gPSBuZXcgVW5jb25maWd1cmVBbmRVbmluc3RhbGxGZWF0dXJlQWN0aW9uKGdldENvbmZpZ3VyYXRpb25XaW5kb3coKS5nZXRTaGVsbCgpLCBVcGRhdGVVSU1lc3NhZ2VzLkNvbmZpZ3VyYXRpb25WaWV3X3VuaW5zdGFsbCk7IAorCQkKKwkJdW5pbnN0YWxsRmVhdHVyZXNBY3Rpb24gPSBuZXcgVW5pbnN0YWxsRmVhdHVyZXNBY3Rpb24oZ2V0Q29uZmlndXJhdGlvbldpbmRvdygpLmdldFNoZWxsKCksIFVwZGF0ZVVJTWVzc2FnZXMuQ29uZmlndXJhdGlvblZpZXdfdW5pbnN0YWxsKTsgCisJCXVuY29uZmlndXJlQW5kVW5pbnN0YWxsRmVhdHVyZXNBY3Rpb24gPSBuZXcgVW5jb25maWd1cmVBbmRVbmluc3RhbGxGZWF0dXJlc0FjdGlvbihnZXRDb25maWd1cmF0aW9uV2luZG93KCkuZ2V0U2hlbGwoKSwgVXBkYXRlVUlNZXNzYWdlcy5Db25maWd1cmF0aW9uVmlld191bmNvbmZpZ3VyZUFuZFVuaW5zdGFsbCk7IAorCisJCQorCQlpbnN0YWxsT3B0RmVhdHVyZUFjdGlvbiA9CisJCQluZXcgSW5zdGFsbE9wdGlvbmFsRmVhdHVyZUFjdGlvbigKKwkJCQlnZXRDb250cm9sKCkuZ2V0U2hlbGwoKSwKKwkJCQlVcGRhdGVVSU1lc3NhZ2VzLkNvbmZpZ3VyYXRpb25WaWV3X2luc3RhbGwpOyAKKworCQlzd2FwVmVyc2lvbkFjdGlvbiA9IG5ldyBSZXBsYWNlVmVyc2lvbkFjdGlvbihnZXRDb25maWd1cmF0aW9uV2luZG93KCkuZ2V0U2hlbGwoKSwgVXBkYXRlVUlNZXNzYWdlcy5Db25maWd1cmF0aW9uVmlld19hbm90aGVyVmVyc2lvbik7IAorCisJCWZpbmRVcGRhdGVzQWN0aW9uID0KKwkJCW5ldyBGaW5kVXBkYXRlc0FjdGlvbihjb25maWd1cmF0aW9uV2luZG93LCBVcGRhdGVVSU1lc3NhZ2VzLkNvbmZpZ3VyYXRpb25WaWV3X2ZpbmRVcGRhdGVzKTsgCisKKwkJc2hvd0FjdGl2aXRpZXNBY3Rpb24gPSBuZXcgU2hvd0FjdGl2aXRpZXNBY3Rpb24oZ2V0Q29udHJvbCgpLmdldFNoZWxsKCksIFVwZGF0ZVVJTWVzc2FnZXMuQ29uZmlndXJhdGlvblZpZXdfc2hvd0FjdGl2aXRpZXNMYWJlbCk7IAorICAgICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKAorCQkJc2hvd0FjdGl2aXRpZXNBY3Rpb24sCisJCQkib3JnLmVjbGlwc2UudXBkYXRlLnVpLkNvbmZpZ3VyYXRpb25WaWV3X3Nob3dBY3Rpdml0aWVzQWN0aW9uIik7IC8vJE5PTi1OTFMtMSQKKworCQltYWtlU2hvd1VuY29uZmlndXJlZEZlYXR1cmVzQWN0aW9uKCk7CisJCW1ha2VTaG93U2l0ZXNBY3Rpb24oKTsKKwkJbWFrZVNob3dOZXN0ZWRGZWF0dXJlc0FjdGlvbigpOworCQltYWtlUHJldmlld1Rhc2tzKCk7CisJCWNvbmZpZ3VyYXRpb25XaW5kb3cuc2V0UHJvcGVydGllc0FjdGlvbkhhbmRsZXIocHJvcGVydGllc0FjdGlvbik7CisJfQorCisJcHJpdmF0ZSB2b2lkIG1ha2VTaG93TmVzdGVkRmVhdHVyZXNBY3Rpb24oKSB7CisJCWZpbmFsIFByZWZlcmVuY2VzIHByZWYgPSBVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKKwkJcHJlZi5zZXREZWZhdWx0KFNUQVRFX1NIT1dfTkVTVEVEX0ZFQVRVUkVTLCB0cnVlKTsKKwkJc2hvd05lc3RlZEZlYXR1cmVzQWN0aW9uID0gbmV3IEFjdGlvbigpIHsKKwkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQl0cmVlVmlld2VyLnJlZnJlc2goKTsKKwkJCQlwcmVmLnNldFZhbHVlKAorCQkJCQlTVEFURV9TSE9XX05FU1RFRF9GRUFUVVJFUywKKwkJCQkJc2hvd05lc3RlZEZlYXR1cmVzQWN0aW9uLmlzQ2hlY2tlZCgpKTsKKwkJCX0KKwkJfTsKKwkJc2hvd05lc3RlZEZlYXR1cmVzQWN0aW9uLnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5Db25maWd1cmF0aW9uVmlld19zaG93TmVzdGVkRmVhdHVyZXMpOyAKKwkJc2hvd05lc3RlZEZlYXR1cmVzQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcigKKwkJCVVwZGF0ZVVJSW1hZ2VzLkRFU0NfU0hPV19ISUVSQVJDSFkpOworCQlzaG93TmVzdGVkRmVhdHVyZXNBY3Rpb24uc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoCisJCQlVcGRhdGVVSUltYWdlcy5ERVNDX1NIT1dfSElFUkFSQ0hZX0QpOworCisJCXNob3dOZXN0ZWRGZWF0dXJlc0FjdGlvbi5zZXRDaGVja2VkKAorCQkJcHJlZi5nZXRCb29sZWFuKFNUQVRFX1NIT1dfTkVTVEVEX0ZFQVRVUkVTKSk7CisJCXNob3dOZXN0ZWRGZWF0dXJlc0FjdGlvbi5zZXRUb29sVGlwVGV4dChVcGRhdGVVSU1lc3NhZ2VzLkNvbmZpZ3VyYXRpb25WaWV3X3Nob3dOZXN0ZWRUb29sdGlwKTsgCisJfQorCisJcHJpdmF0ZSB2b2lkIG1ha2VTaG93U2l0ZXNBY3Rpb24oKSB7CisJCWZpbmFsIFByZWZlcmVuY2VzIHByZWYgPSBVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKKwkJcHJlZi5zZXREZWZhdWx0KFNUQVRFX1NIT1dfU0lURVMsIHRydWUpOworCQlzaG93U2l0ZXNBY3Rpb24gPSBuZXcgQWN0aW9uKCkgeworCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCXRyZWVWaWV3ZXIucmVmcmVzaCgpOworCQkJCXByZWYuc2V0VmFsdWUoU1RBVEVfU0hPV19TSVRFUywgc2hvd1NpdGVzQWN0aW9uLmlzQ2hlY2tlZCgpKTsKKwkJCQlVcGRhdGVVSS5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7CisJCQl9CisJCX07CisJCXNob3dTaXRlc0FjdGlvbi5zZXRUZXh0KFVwZGF0ZVVJTWVzc2FnZXMuQ29uZmlndXJhdGlvblZpZXdfc2hvd0luc3RhbGwpOyAKKwkJc2hvd1NpdGVzQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihVcGRhdGVVSUltYWdlcy5ERVNDX0xTSVRFX09CSik7CisJCXNob3dTaXRlc0FjdGlvbi5zZXRDaGVja2VkKHByZWYuZ2V0Qm9vbGVhbihTVEFURV9TSE9XX1NJVEVTKSk7CisJCXNob3dTaXRlc0FjdGlvbi5zZXRUb29sVGlwVGV4dChVcGRhdGVVSU1lc3NhZ2VzLkNvbmZpZ3VyYXRpb25WaWV3X3Nob3dJbnN0YWxsVG9vbHRpcCk7IAorCX0KKworCXByaXZhdGUgdm9pZCBtYWtlU2hvd1VuY29uZmlndXJlZEZlYXR1cmVzQWN0aW9uKCkgeworCQlmaW5hbCBQcmVmZXJlbmNlcyBwcmVmID0gVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7CisJCXByZWYuc2V0RGVmYXVsdChTVEFURV9TSE9XX1VOQ09ORiwgZmFsc2UpOworCQlzaG93VW5jb25mRmVhdHVyZXNBY3Rpb24gPSBuZXcgQWN0aW9uKCkgeworCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCXByZWYuc2V0VmFsdWUoCisJCQkJCVNUQVRFX1NIT1dfVU5DT05GLAorCQkJCQlzaG93VW5jb25mRmVhdHVyZXNBY3Rpb24uaXNDaGVja2VkKCkpOworCQkJCVVwZGF0ZVVJLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKKwkJCQl0cmVlVmlld2VyLnJlZnJlc2goKTsKKwkJCX0KKwkJfTsKKyAgICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCgKKwkJCXNob3dVbmNvbmZGZWF0dXJlc0FjdGlvbiwKKwkJCSJvcmcuZWNsaXBzZS51cGRhdGUudWkuQ29maWd1cmF0aW9uVmlld19zaG93VW5jb25mRmVhdHVyZXNBY3Rpb24iKTsgLy8kTk9OLU5MUy0xJAorCQlzaG93VW5jb25mRmVhdHVyZXNBY3Rpb24uc2V0VGV4dChVcGRhdGVVSU1lc3NhZ2VzLkNvbmZpZ3VyYXRpb25WaWV3X3Nob3dEaXNhYmxlZCk7IAorCQlzaG93VW5jb25mRmVhdHVyZXNBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKAorCQkJVXBkYXRlVUlJbWFnZXMuREVTQ19VTkNPTkZfRkVBVFVSRV9PQkopOworCQlzaG93VW5jb25mRmVhdHVyZXNBY3Rpb24uc2V0Q2hlY2tlZChwcmVmLmdldEJvb2xlYW4oU1RBVEVfU0hPV19VTkNPTkYpKTsKKwkJc2hvd1VuY29uZkZlYXR1cmVzQWN0aW9uLnNldFRvb2xUaXBUZXh0KFVwZGF0ZVVJTWVzc2FnZXMuQ29uZmlndXJhdGlvblZpZXdfc2hvd0Rpc2FibGVkVG9vbHRpcCk7IAorCX0KKworCXByb3RlY3RlZCB2b2lkIGZpbGxBY3Rpb25CYXJzKFRvb2xCYXJNYW5hZ2VyIHRibSkgeworCQl0Ym0uYWRkKHNob3dTaXRlc0FjdGlvbik7CisJCXRibS5hZGQoc2hvd05lc3RlZEZlYXR1cmVzQWN0aW9uKTsKKwkJdGJtLmFkZChzaG93VW5jb25mRmVhdHVyZXNBY3Rpb24pOworCQl0Ym0uYWRkKG5ldyBTZXBhcmF0b3IoKSk7CisJCWRyaWxsRG93bkFkYXB0ZXIuYWRkTmF2aWdhdGlvbkFjdGlvbnModGJtKTsKKwkJdGJtLmFkZChuZXcgU2VwYXJhdG9yKCkpOworCQl0Ym0uYWRkKGNvbGxhcHNlQWxsQWN0aW9uKTsKKwkJdGJtLmFkZChuZXcgU2VwYXJhdG9yKCkpOworCQl0Ym0uYWRkKGluc3RhbGxhdGlvbkhpc3RvcnlBY3Rpb24pOworCX0KKworCXByb3RlY3RlZCBPYmplY3QgZ2V0U2VsZWN0ZWRPYmplY3QoKSB7CisJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gdHJlZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKKwkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uCisJCQkmJiAhc2VsZWN0aW9uLmlzRW1wdHkoKSkgeworCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3NlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOworCQkJCisJCQlpZiAoc3NlbC5zaXplKCkgPT0gMSkKKwkJCQlyZXR1cm4gc3NlbC5nZXRGaXJzdEVsZW1lbnQoKTsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gc3NlbC50b0FycmF5KCk7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgZmlsbENvbnRleHRNZW51KElNZW51TWFuYWdlciBtYW5hZ2VyKSB7CisJCU9iamVjdCBvYmogPSBnZXRTZWxlY3RlZE9iamVjdCgpOworCQlib29sZWFuIGFyZU11bHRpcGxlRmVhdHVyZXNTZWxlY3RlZCA9IHRydWU7CisJCQorCQlpZiAoIG9iaiBpbnN0YW5jZW9mIE9iamVjdFtdKSB7CisJCQlPYmplY3RbXSBhcnJheSA9IChPYmplY3RbXSlvYmo7CisJCQlmb3IoIGludCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7CisJCQkJaWYgKCEoYXJyYXlbaV0gaW5zdGFuY2VvZiBDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXIpKSB7CisJCQkJCWFyZU11bHRpcGxlRmVhdHVyZXNTZWxlY3RlZCA9IGZhbHNlOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWFyZU11bHRpcGxlRmVhdHVyZXNTZWxlY3RlZCA9IGZhbHNlOworCQl9CisKKwkJaWYgKG9iaiBpbnN0YW5jZW9mIElMb2NhbFNpdGUpIHsKKwkJCW1hbmFnZXIuYWRkKGZpbmRVcGRhdGVzQWN0aW9uKTsKKwkJCW1hbmFnZXIuYWRkKHJldmVydEFjdGlvbik7CisJCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgSUNvbmZpZ3VyZWRTaXRlQWRhcHRlcikgeworCQkJbWFuYWdlci5hZGQoc2l0ZVN0YXRlQWN0aW9uKTsKKwkJfQorCisJCWlmIChvYmogaW5zdGFuY2VvZiBJTG9jYWxTaXRlCisJCQl8fCBvYmogaW5zdGFuY2VvZiBJQ29uZmlndXJlZFNpdGVBZGFwdGVyKSB7CisJCQltYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOworCQkJTWVudU1hbmFnZXIgbWdyID0gbmV3IE1lbnVNYW5hZ2VyKFVwZGF0ZVVJTWVzc2FnZXMuQ29uZmlndXJhdGlvblZpZXdfbmV3KTsgCisJCQltZ3IuYWRkKG5ld0V4dGVuc2lvbkxvY2F0aW9uQWN0aW9uKTsKKwkJCW1hbmFnZXIuYWRkKG1ncik7CisJCQltYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOworCQl9IGVsc2UgaWYgKCAob2JqIGluc3RhbmNlb2YgQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyKSAmJiAhYXJlTXVsdGlwbGVGZWF0dXJlc1NlbGVjdGVkKXsKKwkJCXRyeSB7CisJCQkJCisJCQkJTWVudU1hbmFnZXIgbWdyID0gbmV3IE1lbnVNYW5hZ2VyKFVwZGF0ZVVJTWVzc2FnZXMuQ29uZmlndXJhdGlvblZpZXdfcmVwbGFjZVdpdGgpOyAKKwkJCQkKKwkJCQltYW5hZ2VyLmFkZChmaW5kVXBkYXRlc0FjdGlvbik7CisJCQkJbWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKKwkJCQkKKwkJCQltZ3IuYWRkKHN3YXBWZXJzaW9uQWN0aW9uKTsKKwkJCQltYW5hZ2VyLmFkZChtZ3IpOworCisJCQkJbWFuYWdlci5hZGQoZmVhdHVyZVN0YXRlQWN0aW9uKTsKKwkJCQkKKworCQkJCUlGZWF0dXJlIGZlYXR1cmUgPQorCQkJCQkoKENvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlcikgb2JqKS5nZXRGZWF0dXJlKG51bGwpOworCQkJCWlmIChmZWF0dXJlIGluc3RhbmNlb2YgTWlzc2luZ0ZlYXR1cmUpIHsKKwkJCQkJbWFuYWdlci5hZGQoaW5zdGFsbE9wdEZlYXR1cmVBY3Rpb24pOworCQkJCX0gZWxzZSB7CisJCQkJCWJvb2xlYW4gY29uZmlndXJlZCA9ICgoQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyKW9iaikuaXNDb25maWd1cmVkKCk7CisJCQkJCWlmICghY29uZmlndXJlZCkKKwkJCQkJCW1hbmFnZXIuYWRkKHVuaW5zdGFsbEZlYXR1cmVBY3Rpb24pOworCQkJCQllbHNlCisJCQkJCQltYW5hZ2VyLmFkZCh1bmNvbmZpZ3VyZUFuZFVuaW5zdGFsbEZlYXR1cmVBY3Rpb24pOworCQkJCX0KKwkJCQltYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOworCisJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCX0KKwkJfSBlbHNlIGlmIChhcmVNdWx0aXBsZUZlYXR1cmVzU2VsZWN0ZWQpIHsKKworCQkJCW1hbmFnZXIuYWRkKGZpbmRVcGRhdGVzQWN0aW9uKTsKKwkJCQltYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOworCisJCQkJbWFuYWdlci5hZGQoZmVhdHVyZXNTdGF0ZUFjdGlvbik7CisJCQkJCisJCQkJbWFuYWdlci5hZGQodW5pbnN0YWxsRmVhdHVyZXNBY3Rpb24pOworCQkJCW1hbmFnZXIuYWRkKHVuY29uZmlndXJlQW5kVW5pbnN0YWxsRmVhdHVyZXNBY3Rpb24pOworCQkJCQorCQkJCW1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7CisKKwkJfQorCisJCWRyaWxsRG93bkFkYXB0ZXIuYWRkTmF2aWdhdGlvbkFjdGlvbnMobWFuYWdlcik7CisKKwkJaWYgKG9iaiBpbnN0YW5jZW9mIElMb2NhbFNpdGUpIHsKKwkJCW1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7CisJCQltYW5hZ2VyLmFkZChpbnN0YWxsYXRpb25IaXN0b3J5QWN0aW9uKTsKKwkJfQorCisJCWlmIChvYmogaW5zdGFuY2VvZiBJRmVhdHVyZUFkYXB0ZXIKKwkJCXx8IG9iaiBpbnN0YW5jZW9mIElMb2NhbFNpdGUKKwkJCXx8IG9iaiBpbnN0YW5jZW9mIElDb25maWd1cmVkU2l0ZUFkYXB0ZXIpIHsKKwkJCW1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7CisJCQltYW5hZ2VyLmFkZChwcm9wZXJ0aWVzQWN0aW9uKTsKKwkJfQorCX0KKworCXB1YmxpYyB2b2lkIGluc3RhbGxTaXRlQWRkZWQoSUNvbmZpZ3VyZWRTaXRlIGNzaXRlKSB7CisJCWFzeW5jUmVmcmVzaCgpOworCX0KKwlwdWJsaWMgdm9pZCBpbnN0YWxsU2l0ZVJlbW92ZWQoSUNvbmZpZ3VyZWRTaXRlIHNpdGUpIHsKKwkJYXN5bmNSZWZyZXNoKCk7CisJfQorCXB1YmxpYyB2b2lkIGZlYXR1cmVJbnN0YWxsZWQoSUZlYXR1cmUgZmVhdHVyZSkgeworCQlhc3luY1JlZnJlc2goKTsKKwl9CisJcHVibGljIHZvaWQgZmVhdHVyZVJlbW92ZWQoSUZlYXR1cmUgZmVhdHVyZSkgeworCQlhc3luY1JlZnJlc2goKTsKKwl9CisJcHVibGljIHZvaWQgZmVhdHVyZUNvbmZpZ3VyZWQoSUZlYXR1cmUgZmVhdHVyZSkgeworCX0KKworCXB1YmxpYyB2b2lkIGZlYXR1cmVVbmNvbmZpZ3VyZWQoSUZlYXR1cmUgZmVhdHVyZSkgeworCX0KKworCXB1YmxpYyB2b2lkIGN1cnJlbnRJbnN0YWxsQ29uZmlndXJhdGlvbkNoYW5nZWQoSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKKwkJYXN5bmNSZWZyZXNoKCk7CisJfQorCisJcHVibGljIHZvaWQgaW5zdGFsbENvbmZpZ3VyYXRpb25SZW1vdmVkKElJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7CisJCWFzeW5jUmVmcmVzaCgpOworCX0KKworCXByaXZhdGUgdm9pZCBhc3luY1JlZnJlc2goKSB7CisJCURpc3BsYXkgZGlzcGxheSA9IFNXVFV0aWwuZ2V0U3RhbmRhcmREaXNwbGF5KCk7CisJCWlmIChkaXNwbGF5ID09IG51bGwpCisJCQlyZXR1cm47CisJCWlmIChnZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKQorCQkJcmV0dXJuOworCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7CisJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJaWYgKCFnZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKQorCQkJCQl0cmVlVmlld2VyLnJlZnJlc2goKTsKKwkJCX0KKwkJfSk7CisJfQorCisJcHJpdmF0ZSBPYmplY3RbXSBnZXRGZWF0dXJlcygKKwkJZmluYWwgSUNvbmZpZ3VyZWRTaXRlQWRhcHRlciBzaXRlQWRhcHRlciwKKwkJZmluYWwgYm9vbGVhbiBjb25maWd1cmVkT25seSkgeworCQlmaW5hbCBJQ29uZmlndXJlZFNpdGUgY3NpdGUgPSBzaXRlQWRhcHRlci5nZXRDb25maWd1cmVkU2l0ZSgpOworCQlmaW5hbCBPYmplY3RbXVtdIGJhZyA9IG5ldyBPYmplY3RbMV1bXTsKKwkJcmVmcmVzaExvY2sgPSB0cnVlOworCisJCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBvcCA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7CisJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJCQkJQXJyYXlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKKwkJCQlJRmVhdHVyZVJlZmVyZW5jZVtdIHJlZnM7CisKKwkJCQlpZiAoY29uZmlndXJlZE9ubHkpCisJCQkJCXJlZnMgPSBjc2l0ZS5nZXRDb25maWd1cmVkRmVhdHVyZXMoKTsKKwkJCQllbHNlIHsKKwkJCQkJSVNpdGUgc2l0ZSA9IGNzaXRlLmdldFNpdGUoKTsKKwkJCQkJcmVmcyA9IHNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsKKwkJCQl9CisJCQkJbW9uaXRvci5iZWdpblRhc2soCisJCQkJCVVwZGF0ZVVJTWVzc2FnZXMuQ29uZmlndXJhdGlvblZpZXdfbG9hZGluZywgCisJCQkJCXJlZnMubGVuZ3RoKTsKKworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmcy5sZW5ndGg7IGkrKykgeworCQkJCQlJRmVhdHVyZVJlZmVyZW5jZSByZWYgPSByZWZzW2ldOworCQkJCQlJRmVhdHVyZSBmZWF0dXJlOworCQkJCQl0cnkgeworCQkJCQkJbW9uaXRvci5zdWJUYXNrKHJlZi5nZXRVUkwoKS50b1N0cmluZygpKTsKKwkJCQkJCWZlYXR1cmUgPSByZWYuZ2V0RmVhdHVyZShudWxsKTsKKwkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkJCQlmZWF0dXJlID0KKwkJCQkJCQluZXcgTWlzc2luZ0ZlYXR1cmUocmVmLmdldFNpdGUoKSwgcmVmLmdldFVSTCgpKTsKKwkJCQkJfQorCQkJCQltb25pdG9yLndvcmtlZCgxKTsKKwkJCQkJcmVzdWx0LmFkZCgKKwkJCQkJCW5ldyBDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXIoCisJCQkJCQkJc2l0ZUFkYXB0ZXIsCisJCQkJCQkJZmVhdHVyZSwKKwkJCQkJCQljc2l0ZS5pc0NvbmZpZ3VyZWQoZmVhdHVyZSksCisJCQkJCQkJZmFsc2UsCisJCQkJCQkJZmFsc2UpKTsKKwkJCQl9CisJCQkJbW9uaXRvci5kb25lKCk7CisJCQkJYmFnWzBdID0gZ2V0Um9vdEZlYXR1cmVzKHJlc3VsdCk7CisJCQl9CisJCX07CisKKwkJdHJ5IHsKKwkJCWlmIChjb25maWd1cmF0aW9uV2luZG93LmdldFNoZWxsKCkuaXNWaXNpYmxlKCkpCisJCQkJY29uZmlndXJhdGlvbldpbmRvdy5ydW4odHJ1ZSwgZmFsc2UsIG9wKTsKKwkJCWVsc2UKKwkJCQlvcC5ydW4obmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7CisJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKwkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7CisJCX0gZmluYWxseSB7CisJCQlyZWZyZXNoTG9jayA9IGZhbHNlOworCQl9CisJCXJldHVybiBiYWdbMF07CisJfQorCisJcHJpdmF0ZSBPYmplY3RbXSBnZXRSb290RmVhdHVyZXMoQXJyYXlMaXN0IGxpc3QpIHsKKwkJQXJyYXlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOworCQlBcnJheUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOworCQl0cnkgeworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7CisJCQkJQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyIGNmID0KKwkJCQkJKENvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlcikgbGlzdC5nZXQoaSk7CisJCQkJSUZlYXR1cmUgZmVhdHVyZSA9IGNmLmdldEZlYXR1cmUobnVsbCk7CisJCQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkKKwkJCQkJYWRkQ2hpbGRGZWF0dXJlcygKKwkJCQkJCWZlYXR1cmUsCisJCQkJCQljaGlsZHJlbiwKKwkJCQkJCWNmLmlzQ29uZmlndXJlZCgpKTsKKwkJCX0KKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgeworCQkJCUNvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlciBjZiA9CisJCQkJCShDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXIpIGxpc3QuZ2V0KGkpOworCQkJCUlGZWF0dXJlIGZlYXR1cmUgPSBjZi5nZXRGZWF0dXJlKG51bGwpOworCQkJCWlmIChmZWF0dXJlICE9IG51bGwKKwkJCQkJJiYgaXNDaGlsZEZlYXR1cmUoZmVhdHVyZSwgY2hpbGRyZW4pID09IGZhbHNlKQorCQkJCQlyZXN1bHQuYWRkKGNmKTsKKwkJCX0KKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm4gbGlzdC50b0FycmF5KCk7CisJCX0KKwkJcmV0dXJuIHJlc3VsdC50b0FycmF5KCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGFkZENoaWxkRmVhdHVyZXMoCisJCUlGZWF0dXJlIGZlYXR1cmUsCisJCUFycmF5TGlzdCBjaGlsZHJlbiwKKwkJYm9vbGVhbiBjb25maWd1cmVkKSB7CisJCXRyeSB7CisJCQlJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlW10gaW5jbHVkZWQgPQorCQkJCWZlYXR1cmUuZ2V0SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmNsdWRlZC5sZW5ndGg7IGkrKykgeworCQkJCUlGZWF0dXJlIGNoaWxkRmVhdHVyZTsKKwkJCQl0cnkgeworCQkJCQljaGlsZEZlYXR1cmUgPQorCQkJCQkJaW5jbHVkZWRbaV0uZ2V0RmVhdHVyZShudWxsKTsKKwkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCQkJY2hpbGRGZWF0dXJlID0gbmV3IE1pc3NpbmdGZWF0dXJlKGluY2x1ZGVkW2ldKTsKKwkJCQl9CisJCQkJY2hpbGRyZW4uYWRkKGNoaWxkRmVhdHVyZSk7CisJCQl9CisJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJVXBkYXRlVUkubG9nRXhjZXB0aW9uKGUpOworCQl9CisJfQorCisJcHJpdmF0ZSBib29sZWFuIGlzQ2hpbGRGZWF0dXJlKElGZWF0dXJlIGZlYXR1cmUsIEFycmF5TGlzdCBjaGlsZHJlbikgeworCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLnNpemUoKTsgaSsrKSB7CisJCQlJRmVhdHVyZSBjaGlsZCA9IChJRmVhdHVyZSkgY2hpbGRyZW4uZ2V0KGkpOworCQkJaWYgKGZlYXR1cmUKKwkJCQkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpCisJCQkJLmVxdWFscyhjaGlsZC5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkpKQorCQkJCXJldHVybiB0cnVlOworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVEb3VibGVDbGljayhEb3VibGVDbGlja0V2ZW50IGUpIHsKKwkJaWYgKGUuZ2V0U2VsZWN0aW9uKCkgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgeworCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3NlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZS5nZXRTZWxlY3Rpb24oKTsKKwkJCQorCQkJT2JqZWN0IG9iaiA9IHNzZWwuZ2V0Rmlyc3RFbGVtZW50KCk7CisJCQlpZiAob2JqIT1udWxsKQorCQkJCXByb3BlcnRpZXNBY3Rpb24ucnVuKCk7CisJCX0KKwl9CisKKwlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7CisJCXNwbGl0dGVyID0gbmV3IFNhc2hGb3JtKHBhcmVudCwgU1dULkhPUklaT05UQUwpOworCQlzcGxpdHRlci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKKwkJQ29tcG9zaXRlIGxlZnRDb250YWluZXIgPSBjcmVhdGVMaW5lQ29udGFpbmVyKHNwbGl0dGVyKTsKKwkJQ29tcG9zaXRlIHJpZ2h0Q29udGFpbmVyID0gY3JlYXRlTGluZUNvbnRhaW5lcihzcGxpdHRlcik7CisJCWNyZWF0ZVRyZWVWaWV3ZXIobGVmdENvbnRhaW5lcik7CisJCW1ha2VBY3Rpb25zKCk7CisJCWNyZWF0ZVZlcnRpY2FsTGluZShsZWZ0Q29udGFpbmVyKTsKKwkJY3JlYXRlVmVydGljYWxMaW5lKHJpZ2h0Q29udGFpbmVyKTsKKwkJcHJldmlldyA9IG5ldyBDb25maWd1cmF0aW9uUHJldmlldyh0aGlzKTsKKwkJcHJldmlldy5jcmVhdGVDb250cm9sKHJpZ2h0Q29udGFpbmVyKTsKKwkJcHJldmlldy5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YSgKKwkJCW5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKKwkJc3BsaXR0ZXIuc2V0V2VpZ2h0cyhuZXcgaW50W10geyAyLCAzIH0pOworCQlmaWxsQWN0aW9uQmFycyhnZXRDb25maWd1cmF0aW9uV2luZG93KCkuZ2V0VG9vbEJhck1hbmFnZXIoKSk7CisKKwkJdHJlZVZpZXdlci5leHBhbmRUb0xldmVsKDIpOworCisJCWlmICh0cmVlVmlld2VyLmdldFRyZWUoKS5nZXRJdGVtQ291bnQoKSA+IDApIHsKKwkJCVRyZWVJdGVtW10gaXRlbXMgPSB0cmVlVmlld2VyLmdldFRyZWUoKS5nZXRJdGVtcygpOworCQkJdHJlZVZpZXdlci5nZXRUcmVlKCkuc2V0U2VsZWN0aW9uKG5ldyBUcmVlSXRlbVtdIHsgaXRlbXNbMF0gfSk7CisJCQloYW5kbGVTZWxlY3Rpb25DaGFuZ2VkKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGl0ZW1zWzBdLmdldERhdGEoKSkpOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZVRyZWVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgeworCQl0cmVlVmlld2VyID0KKwkJCW5ldyBUcmVlVmlld2VyKHBhcmVudCwgU1dULk1VTFRJIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKKwkJdHJlZVZpZXdlci5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7CisJCXRyZWVWaWV3ZXIuc2V0VXNlSGFzaGxvb2t1cCh0cnVlKTsKKwkJaW5pdFByb3ZpZGVycygpOworCisJCU1lbnVNYW5hZ2VyIG1lbnVNZ3IgPSBuZXcgTWVudU1hbmFnZXIoIiNQb3B1cE1lbnUiKTsgLy8kTk9OLU5MUy0xJAorCQltZW51TWdyLnNldFJlbW92ZUFsbFdoZW5TaG93bih0cnVlKTsKKwkJbWVudU1nci5hZGRNZW51TGlzdGVuZXIobmV3IElNZW51TGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1hbmFnZXIpIHsKKwkJCQltYW5hZ2VyLmFkZChuZXcgR3JvdXBNYXJrZXIoImFkZGl0aW9ucyIpKTsgLy8kTk9OLU5MUy0xJAorCQkJCWZpbGxDb250ZXh0TWVudShtYW5hZ2VyKTsKKwkJCX0KKwkJfSk7CisKKwkJdHJlZVZpZXdlci5nZXRDb250cm9sKCkuc2V0TWVudSgKKwkJCW1lbnVNZ3IuY3JlYXRlQ29udGV4dE1lbnUodHJlZVZpZXdlci5nZXRDb250cm9sKCkpKTsKKworCQl0cmVlVmlld2VyCisJCQkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKKwkJCQloYW5kbGVTZWxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKKwkJCX0KKwkJfSk7CisKKwkJdHJlZVZpZXdlci5hZGREb3VibGVDbGlja0xpc3RlbmVyKG5ldyBJRG91YmxlQ2xpY2tMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIGRvdWJsZUNsaWNrKERvdWJsZUNsaWNrRXZlbnQgZXZlbnQpIHsKKwkJCQloYW5kbGVEb3VibGVDbGljayhldmVudCk7CisJCQl9CisJCX0pOworCisJfQorCisJcHVibGljIFRyZWVWaWV3ZXIgZ2V0VHJlZVZpZXdlcigpIHsKKwkJcmV0dXJuIHRyZWVWaWV3ZXI7CisJfQorCisJcHJpdmF0ZSBDb21wb3NpdGUgY3JlYXRlTGluZUNvbnRhaW5lcihDb21wb3NpdGUgcGFyZW50KSB7CisJCUNvbXBvc2l0ZSBjb250YWluZXIgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOworCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7CisJCWxheW91dC5udW1Db2x1bW5zID0gMjsKKwkJbGF5b3V0Lm1hcmdpbldpZHRoID0gbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7CisJCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDA7CisJCWNvbnRhaW5lci5zZXRMYXlvdXQobGF5b3V0KTsKKwkJcmV0dXJuIGNvbnRhaW5lcjsKKwl9CisKKwlwcml2YXRlIHZvaWQgY3JlYXRlVmVydGljYWxMaW5lKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJTGFiZWwgbGluZSA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5TRVBBUkFUT1IgfCBTV1QuVkVSVElDQUwpOworCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKTsKKwkJZ2Qud2lkdGhIaW50ID0gMTsKKwkJbGluZS5zZXRMYXlvdXREYXRhKGdkKTsKKwl9CisKKwlwdWJsaWMgQ29udHJvbCBnZXRDb250cm9sKCkgeworCQlyZXR1cm4gc3BsaXR0ZXI7CisJfQorCisJcHJpdmF0ZSBpbnQgZ2V0U3RhdHVzQ29kZShJRmVhdHVyZSBmZWF0dXJlLCBJU3RhdHVzIHN0YXR1cykgeworCQlpbnQgY29kZSA9IHN0YXR1cy5nZXRDb2RlKCk7CisJCWlmIChjb2RlID09IElGZWF0dXJlLlNUQVRVU19VTkhBUFBZKSB7CisJCQlpZiAoc3RhdHVzLmlzTXVsdGlTdGF0dXMoKSkgeworCQkJCUlTdGF0dXNbXSBjaGlsZHJlbiA9IHN0YXR1cy5nZXRDaGlsZHJlbigpOworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKKwkJCQkJSVN0YXR1cyBjaGlsZCA9IGNoaWxkcmVuW2ldOworCQkJCQlpZiAoY2hpbGQuaXNNdWx0aVN0YXR1cygpCisJCQkJCQl8fCBjaGlsZC5nZXRDb2RlKCkgIT0gSUZlYXR1cmUuU1RBVFVTX0RJU0FCTEVEKQorCQkJCQkJcmV0dXJuIGNvZGU7CisJCQkJfQorCQkJCS8vIElmIHdlIGFyZSBoZXJlLCBnbG9iYWwgc3RhdHVzIGlzIHVuaGFwcHkKKwkJCQkvLyBiZWNhdXNlIG9uZSBvciBtb3JlIGluY2x1ZGVkIGZlYXR1cmVzCisJCQkJLy8gaXMgZGlzYWJsZWQuCisJCQkJaWYgKFVwZGF0ZVV0aWxzLmhhc09ic29sZXRlUGF0Y2hlcyhmZWF0dXJlKSkgeworCQkJCQkvLyBUaGUgZGlzYWJsZWQgaW5jbHVkZWQgZmVhdHVyZXMKKwkJCQkJLy8gYXJlIG9sZCBwYXRjaGVzIHRoYXQgYXJlIG5vdworCQkJCQkvLyBzdWJzdW1lZCBieSBiZXR0ZXIgdmVyc2lvbnMgb2YKKwkJCQkJLy8gdGhlIGZlYXR1cmVzIHRoZXkgd2VyZSBkZXNpZ25lZCB0bworCQkJCQkvLyBwYXRjaC4KKwkJCQkJcmV0dXJuIElGZWF0dXJlLlNUQVRVU19IQVBQWTsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIGNvZGU7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgaGFuZGxlU2VsZWN0aW9uQ2hhbmdlZChJU3RydWN0dXJlZFNlbGVjdGlvbiBzc2VsKSB7CisJCU9iamVjdCBvYmogPSBzc2VsLmdldEZpcnN0RWxlbWVudCgpOworCQkKKwkJYm9vbGVhbiBhcmVNdWx0aXBsZUZlYXR1cmVzU2VsZWN0ZWQgPSB0cnVlOworCQkKKwkJaWYgKHNzZWwuc2l6ZSgpID4gMSkgeworCQkJT2JqZWN0W10gYXJyYXkgPSBzc2VsLnRvQXJyYXkoKTsKKwkJCWZvciggaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHsKKwkJCQlpZiAoIShhcnJheVtpXSBpbnN0YW5jZW9mIENvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlcikpIHsKKwkJCQkJYXJlTXVsdGlwbGVGZWF0dXJlc1NlbGVjdGVkID0gZmFsc2U7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJYXJlTXVsdGlwbGVGZWF0dXJlc1NlbGVjdGVkID0gZmFsc2U7CisJCX0KKwkJCisJCWlmIChzc2VsLnNpemUoKT4xKQorCQkJb2JqID0gbnVsbDsKKwkJCisJCWlmIChvYmohPW51bGwpIHsKKwkJCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSAoSUxhYmVsUHJvdmlkZXIpdHJlZVZpZXdlci5nZXRMYWJlbFByb3ZpZGVyKCk7CisJCQlTdHJpbmcgdGV4dCA9IGxhYmVsUHJvdmlkZXIuZ2V0VGV4dChvYmopOworCQkJLy9JbWFnZSBpbWcgPSBsYWJlbFByb3ZpZGVyLmdldEltYWdlKG9iaik7CisJCQlJbWFnZSBpbWcgPSBudWxsOworCQkJY29uZmlndXJhdGlvbldpbmRvdy51cGRhdGVTdGF0dXNMaW5lKHRleHQsIGltZyk7CisJCX0KKwkJZWxzZQorCQkJY29uZmlndXJhdGlvbldpbmRvdy51cGRhdGVTdGF0dXNMaW5lKG51bGwsIG51bGwpOworCQkKKwkJaWYgKGFyZU11bHRpcGxlRmVhdHVyZXNTZWxlY3RlZCAmJiAoc3NlbC5zaXplKCkgPiAxKSkgeworCQkJCisJCQl1bmluc3RhbGxGZWF0dXJlc0FjdGlvbi5zZXRTZWxlY3Rpb24oc3NlbCk7CisJCQl1bmluc3RhbGxGZWF0dXJlc0FjdGlvbi5zZXRFbmFibGVkKHVuaW5zdGFsbEZlYXR1cmVBY3Rpb24uY2FuRXhlY3V0ZUFjdGlvbigpKTsKKwkJCXVuY29uZmlndXJlQW5kVW5pbnN0YWxsRmVhdHVyZXNBY3Rpb24uc2V0U2VsZWN0aW9uKHNzZWwpOworCQkJdW5jb25maWd1cmVBbmRVbmluc3RhbGxGZWF0dXJlc0FjdGlvbi5zZXRFbmFibGVkKHVuY29uZmlndXJlQW5kVW5pbnN0YWxsRmVhdHVyZUFjdGlvbi5jYW5FeGVjdXRlQWN0aW9uKCkpOworCQkJZmVhdHVyZXNTdGF0ZUFjdGlvbi5zZXRTZWxlY3Rpb24oc3NlbCk7CisJCQlmZWF0dXJlc1N0YXRlQWN0aW9uLnNldEVuYWJsZWQoZmVhdHVyZXNTdGF0ZUFjdGlvbi5jYW5FeGVjdXRlQWN0aW9uKCkpOworCQkJcHJvcGVydGllc0FjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKKwkJCXByZXZpZXcuc2V0U2VsZWN0aW9uKHNzZWwpOworCQkJcmV0dXJuOworCQl9CisJCQorCQlpZiAob2JqIGluc3RhbmNlb2YgSUZlYXR1cmVBZGFwdGVyKSB7CisJCQl0cnkgeworCQkJCXByb3BlcnRpZXNBY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKKwkJCQlDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXIgYWRhcHRlciA9IChDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXIpIG9iajsKKwkJCQlJRmVhdHVyZSBmZWF0dXJlID0gYWRhcHRlci5nZXRGZWF0dXJlKG51bGwpOworCisJCQkJYm9vbGVhbiBtaXNzaW5nID0gZmVhdHVyZSBpbnN0YW5jZW9mIE1pc3NpbmdGZWF0dXJlOworCQkJCWJvb2xlYW4gZW5hYmxlID0gIW1pc3NpbmcKKwkJCQkJCSYmICgoYWRhcHRlci5pc09wdGlvbmFsKCkgfHwgIWFkYXB0ZXIuaXNJbmNsdWRlZCgpKSk7CisKKwkJCQl1bmluc3RhbGxGZWF0dXJlQWN0aW9uLnNldFNlbGVjdGlvbihzc2VsKTsKKwkJCQl1bmluc3RhbGxGZWF0dXJlQWN0aW9uLnNldEVuYWJsZWQoZW5hYmxlCisJCQkJCQkmJiB1bmluc3RhbGxGZWF0dXJlQWN0aW9uLmNhbkV4ZWN1dGVBY3Rpb24oKSk7CisJCQkJdW5jb25maWd1cmVBbmRVbmluc3RhbGxGZWF0dXJlQWN0aW9uLnNldFNlbGVjdGlvbihzc2VsKTsKKwkJCQl1bmNvbmZpZ3VyZUFuZFVuaW5zdGFsbEZlYXR1cmVBY3Rpb24uc2V0RW5hYmxlZChlbmFibGUgJiYgdW5jb25maWd1cmVBbmRVbmluc3RhbGxGZWF0dXJlQWN0aW9uLmNhbkV4ZWN1dGVBY3Rpb24oKSk7CisJCQkJaWYgKGFkYXB0ZXIuaXNDb25maWd1cmVkKCkpCisJCQkJCXNldERlc2NyaXB0aW9uT25UYXNrKAorCQkJCQkJCXVuaW5zdGFsbEZlYXR1cmVBY3Rpb24sCisJCQkJCQkJYWRhcHRlciwKKwkJCQkJCQlVcGRhdGVVSU1lc3NhZ2VzLkNvbmZpZ3VyYXRpb25WaWV3X3VuaW5zdGFsbERlc2MyKTsKKwkJCQllbHNlCisJCQkJCXNldERlc2NyaXB0aW9uT25UYXNrKAorCQkJCQkJCXVuaW5zdGFsbEZlYXR1cmVBY3Rpb24sCisJCQkJCQkJYWRhcHRlciwKKwkJCQkJCQlVcGRhdGVVSU1lc3NhZ2VzLkNvbmZpZ3VyYXRpb25WaWV3X3VuaW5zdGFsbERlc2MpOworCisJCQkJZmVhdHVyZVN0YXRlQWN0aW9uLnNldFNlbGVjdGlvbihzc2VsKTsKKwkJCQlmZWF0dXJlU3RhdGVBY3Rpb24uc2V0RW5hYmxlZChlbmFibGUpOworCQkJCXN3YXBWZXJzaW9uQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOworCQkJCWlmIChlbmFibGUpIHsKKwkJCQkJSUZlYXR1cmVbXSBmZWF0dXJlcyA9IFVwZGF0ZVV0aWxzLmdldEluc3RhbGxlZEZlYXR1cmVzKAorCQkJCQkJCWZlYXR1cmUsIGZhbHNlKTsKKwkJCQkJaWYgKGZlYXR1cmVzLmxlbmd0aCA+IDEpIHsKKwkJCQkJCWlmIChhZGFwdGVyLmlzQ29uZmlndXJlZCgpKSB7CisJCQkJCQkJLy8gV2Ugb25seSBlbmFibGUgcmVwbGFjZSBhY3Rpb24gaWYgY29uZmlndXJlZAorCQkJCQkJCS8vIGFuZCBzZWxlY3RlZC4gYnVnIDc0MDE5CisJCQkJCQkJc3dhcFZlcnNpb25BY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKKwkJCQkJCQlzd2FwVmVyc2lvbkFjdGlvbi5zZXRDdXJyZW50RmVhdHVyZShmZWF0dXJlKTsKKwkJCQkJCQlzd2FwVmVyc2lvbkFjdGlvbi5zZXRGZWF0dXJlcyhmZWF0dXJlcyk7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCS8vIElmIHdlIGFyZSBub3QgY29uZmlndXJlZCBhbmQgYW5vdGhlciB2ZXJzaW9uIGlzCisJCQkJCQkJLy8gd2Ugd2FudCB0byBkaXNhYmxlIFN0YXRlQWN0aW9uLiBidWcgNzQwMTkKKwkJCQkJCQlmZWF0dXJlcyA9IFVwZGF0ZVV0aWxzLmdldEluc3RhbGxlZEZlYXR1cmVzKAorCQkJCQkJCQkJZmVhdHVyZSwgdHJ1ZSk7CisJCQkJCQkJaWYgKGZlYXR1cmVzLmxlbmd0aCA+IDApIHsKKwkJCQkJCQkJZmVhdHVyZVN0YXRlQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKworCQkJCWZpbmRVcGRhdGVzQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOworCQkJCWlmIChlbmFibGUgJiYgYWRhcHRlci5pc0NvbmZpZ3VyZWQoKSkgeworCQkJCQlpZiAoZmVhdHVyZS5nZXRVcGRhdGVTaXRlRW50cnkoKSAhPSBudWxsKSB7CisJCQkJCQlmaW5kVXBkYXRlc0FjdGlvbi5zZXRGZWF0dXJlKGZlYXR1cmUpOworCQkJCQkJZmluZFVwZGF0ZXNBY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKKwkJCQkJfQorCQkJCX0KKwkJCQkKKwkJCQlpZiAobWlzc2luZykgeworCQkJCQlNaXNzaW5nRmVhdHVyZSBtZiA9IChNaXNzaW5nRmVhdHVyZSkgZmVhdHVyZTsKKwkJCQkJaW5zdGFsbE9wdEZlYXR1cmVBY3Rpb24uc2V0RW5hYmxlZChtZi5pc09wdGlvbmFsKCkKKwkJCQkJCQkmJiBtZi5nZXRPcmlnaW5hdGluZ1NpdGVVUkwoKSAhPSBudWxsKTsKKwkJCQkJaW5zdGFsbE9wdEZlYXR1cmVBY3Rpb24uc2V0RmVhdHVyZShtZik7CisJCQkJfSBlbHNlIHsKKwkJCQkJaW5zdGFsbE9wdEZlYXR1cmVBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7CisJCQkJfQorCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgeworCQkJCVVwZGF0ZVVJLmxvZ0V4Y2VwdGlvbihleCk7CisJCQl9CisJCX0KKwkJaWYgKG9iaiBpbnN0YW5jZW9mIElMb2NhbFNpdGUpIHsKKwkJCXByb3BlcnRpZXNBY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKKwkJCWZpbmRVcGRhdGVzQWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7CisJCQlmaW5kVXBkYXRlc0FjdGlvbi5zZXRGZWF0dXJlKG51bGwpOworCQkJSUxvY2FsU2l0ZSBzaXRlID0gZ2V0TG9jYWxTaXRlKCk7CisJCQlyZXZlcnRBY3Rpb24uc2V0RW5hYmxlZChzaXRlICE9IG51bGwKKwkJCQkJJiYgc2l0ZS5nZXRDb25maWd1cmF0aW9uSGlzdG9yeSgpLmxlbmd0aCA+IDEpOworCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIElDb25maWd1cmVkU2l0ZUFkYXB0ZXIpIHsKKwkJCXNpdGVTdGF0ZUFjdGlvbi5zZXRTaXRlKCgoSUNvbmZpZ3VyZWRTaXRlQWRhcHRlcikgb2JqKQorCQkJCQkuZ2V0Q29uZmlndXJlZFNpdGUoKSk7CisJCQlzaXRlU3RhdGVBY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKKwkJfQorCQkKKwkJaWYgKGFyZU11bHRpcGxlRmVhdHVyZXNTZWxlY3RlZCkgeworCQkJdW5pbnN0YWxsRmVhdHVyZXNBY3Rpb24uc2V0U2VsZWN0aW9uKHNzZWwpOworCQkJdW5pbnN0YWxsRmVhdHVyZXNBY3Rpb24uc2V0RW5hYmxlZCh1bmluc3RhbGxGZWF0dXJlQWN0aW9uLmNhbkV4ZWN1dGVBY3Rpb24oKSk7CisJCQl1bmNvbmZpZ3VyZUFuZFVuaW5zdGFsbEZlYXR1cmVzQWN0aW9uLnNldFNlbGVjdGlvbihzc2VsKTsKKwkJCXVuY29uZmlndXJlQW5kVW5pbnN0YWxsRmVhdHVyZXNBY3Rpb24uc2V0RW5hYmxlZCh1bmNvbmZpZ3VyZUFuZFVuaW5zdGFsbEZlYXR1cmVBY3Rpb24uY2FuRXhlY3V0ZUFjdGlvbigpKTsKKwkJCWZlYXR1cmVzU3RhdGVBY3Rpb24uc2V0U2VsZWN0aW9uKHNzZWwpOworCQkJZmVhdHVyZXNTdGF0ZUFjdGlvbi5zZXRFbmFibGVkKGZlYXR1cmVzU3RhdGVBY3Rpb24uY2FuRXhlY3V0ZUFjdGlvbigpKTsKKwkJfQorCQkKKwkJcHJldmlldy5zZXRTZWxlY3Rpb24oc3NlbCk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgaGFuZGxlU2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZSkgeworCQloYW5kbGVTZWxlY3Rpb25DaGFuZ2VkKCgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGUuZ2V0U2VsZWN0aW9uKCkpKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2V0RGVzY3JpcHRpb25PblRhc2soSUFjdGlvbiBhY3Rpb24sIENvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlciBhZGFwdGVyLCBTdHJpbmcgZGVzYykgeworCQlJUHJldmlld1Rhc2tbXSB0YXNrcyA9IGdldFByZXZpZXdUYXNrcyhhZGFwdGVyKTsKKwkJaWYgKHRhc2tzID09IG51bGwpCisJCQlyZXR1cm47CisJCWZvciAoaW50IGk9MDsgaTx0YXNrcy5sZW5ndGg7IGkrKykKKwkJCWlmICh0YXNrc1tpXS5nZXRBY3Rpb24oKSA9PSBhY3Rpb24pCisJCQkJdGFza3NbaV0uc2V0RGVzY3JpcHRpb24oZGVzYyk7CisJfQorCQorCXByaXZhdGUgdm9pZCBtYWtlUHJldmlld1Rhc2tzKCkgeworCQlwcmV2aWV3VGFza3MgPSBuZXcgSGFzaHRhYmxlKCk7CisJCUNsYXNzIGtleTsKKwkJQXJyYXlMaXN0IGFycmF5ID0gbmV3IEFycmF5TGlzdCgpOworCQkvLyBsb2NhbCBzaXRlIHRhc2tzCisJCWtleSA9IElMb2NhbFNpdGUuY2xhc3M7CisJCWFycmF5LmFkZCgKKwkJCW5ldyBQcmV2aWV3VGFzaygKKwkJCQlVcGRhdGVVSU1lc3NhZ2VzLkNvbmZpZ3VyYXRpb25WaWV3X3VwZGF0ZUxhYmVsLCAKKwkJCQlVcGRhdGVVSU1lc3NhZ2VzLkNvbmZpZ3VyYXRpb25WaWV3X3VwZGF0ZURlc2MsIAorCQkJCWZpbmRVcGRhdGVzQWN0aW9uKSk7CisJCWFycmF5LmFkZCgKKwkJCW5ldyBQcmV2aWV3VGFzaygKKwkJCQlVcGRhdGVVSU1lc3NhZ2VzLkNvbmZpZ3VyYXRpb25WaWV3X2luc3RhbGxIaXN0TGFiZWwsIAorCQkJCVVwZGF0ZVVJTWVzc2FnZXMuQ29uZmlndXJhdGlvblZpZXdfaW5zdGFsbEhpc3REZXNjLCAKKwkJCQlpbnN0YWxsYXRpb25IaXN0b3J5QWN0aW9uKSk7CisJCWFycmF5LmFkZCgKKwkJCW5ldyBQcmV2aWV3VGFzaygKKwkJCQlVcGRhdGVVSU1lc3NhZ2VzLkNvbmZpZ3VyYXRpb25WaWV3X2FjdGl2aXRpZXNMYWJlbCwgCisJCQkJVXBkYXRlVUlNZXNzYWdlcy5Db25maWd1cmF0aW9uVmlld19hY3Rpdml0aWVzRGVzYywgCisJCQkJc2hvd0FjdGl2aXRpZXNBY3Rpb24pKTsKKwkJYXJyYXkuYWRkKAorCQkJCW5ldyBQcmV2aWV3VGFzaygKKwkJCQkJVXBkYXRlVUlNZXNzYWdlcy5Db25maWd1cmF0aW9uVmlld19leHRMb2NMYWJlbCwgCisJCQkJCVVwZGF0ZVVJTWVzc2FnZXMuQ29uZmlndXJhdGlvblZpZXdfZXh0TG9jRGVzYywgCisJCQkJCW5ld0V4dGVuc2lvbkxvY2F0aW9uQWN0aW9uKSk7CisJCWFycmF5LmFkZCgKKwkJCQluZXcgUHJldmlld1Rhc2soCisJCQkJCVVwZGF0ZVVJTWVzc2FnZXMuQ29uZmlndXJhdGlvblZpZXdfcmV2ZXJ0UHJldmlvdXNMYWJlbCwgCisJCQkJCVVwZGF0ZVVJTWVzc2FnZXMuQ29uZmlndXJhdGlvblZpZXdfcmV2ZXJ0UHJldmlvdXNEZXNjLCAKKwkJCQkJcmV2ZXJ0QWN0aW9uKSk7CisKKwkJcHJldmlld1Rhc2tzLnB1dChrZXksIGFycmF5LnRvQXJyYXkobmV3IElQcmV2aWV3VGFza1thcnJheS5zaXplKCldKSk7CisKKwkJLy8gY29uZmlndXJlZCBzaXRlIHRhc2tzCisJCWFycmF5LmNsZWFyKCk7CisJCWtleSA9IElDb25maWd1cmVkU2l0ZUFkYXB0ZXIuY2xhc3M7CisJCWFycmF5LmFkZCgKKwkJCW5ldyBQcmV2aWV3VGFzaygKKwkJCQludWxsLAorCQkJCVVwZGF0ZVVJTWVzc2FnZXMuQ29uZmlndXJhdGlvblZpZXdfZW5hYmxlTG9jRGVzYywgCisJCQkJc2l0ZVN0YXRlQWN0aW9uKSk7CisJCWFycmF5LmFkZCgKKwkJCW5ldyBQcmV2aWV3VGFzaygKKwkJCQlVcGRhdGVVSU1lc3NhZ2VzLkNvbmZpZ3VyYXRpb25WaWV3X2V4dExvY0xhYmVsLCAKKwkJCQlVcGRhdGVVSU1lc3NhZ2VzLkNvbmZpZ3VyYXRpb25WaWV3X2V4dExvY0Rlc2MsIAorCQkJCW5ld0V4dGVuc2lvbkxvY2F0aW9uQWN0aW9uKSk7CisJCWFycmF5LmFkZCgKKwkJCW5ldyBQcmV2aWV3VGFzaygKKwkJCQlVcGRhdGVVSU1lc3NhZ2VzLkNvbmZpZ3VyYXRpb25WaWV3X3Byb3BlcnRpZXNMYWJlbCwgCisJCQkJVXBkYXRlVUlNZXNzYWdlcy5Db25maWd1cmF0aW9uVmlld19pbnN0YWxsUHJvcERlc2MsIAorCQkJCXByb3BlcnRpZXNBY3Rpb24pKTsKKwkJcHJldmlld1Rhc2tzLnB1dChrZXksIGFycmF5LnRvQXJyYXkobmV3IElQcmV2aWV3VGFza1thcnJheS5zaXplKCldKSk7CisKKwkJLy8gZmVhdHVyZSBhZGFwdGVyIHRhc2tzCisJCWFycmF5LmNsZWFyKCk7CisJCWtleSA9IElGZWF0dXJlQWRhcHRlci5jbGFzczsKKwkJYXJyYXkuYWRkKAorCQkJCW5ldyBQcmV2aWV3VGFzaygKKwkJCQkJVXBkYXRlVUlNZXNzYWdlcy5Db25maWd1cmF0aW9uVmlld19zY2FuTGFiZWwsIAorCQkJCQlVcGRhdGVVSU1lc3NhZ2VzLkNvbmZpZ3VyYXRpb25WaWV3X3NjYW5EZXNjLCAKKwkJCQkJZmluZFVwZGF0ZXNBY3Rpb24pKTsKKwkJYXJyYXkuYWRkKAorCQkJbmV3IFByZXZpZXdUYXNrKAorCQkJCVVwZGF0ZVVJTWVzc2FnZXMuQ29uZmlndXJhdGlvblZpZXdfcmVwbGFjZVZlcnNpb25MYWJlbCwgCisJCQkJVXBkYXRlVUlNZXNzYWdlcy5Db25maWd1cmF0aW9uVmlld19yZXBsYWNlVmVyc2lvbkRlc2MsIAorCQkJCXN3YXBWZXJzaW9uQWN0aW9uKSk7CisJCWFycmF5LmFkZCgKKwkJCW5ldyBQcmV2aWV3VGFzaygKKwkJCQludWxsLAorCQkJCVVwZGF0ZVVJTWVzc2FnZXMuQ29uZmlndXJhdGlvblZpZXdfZW5hYmxlRmVhdHVyZURlc2MsIAorCQkJCWZlYXR1cmVTdGF0ZUFjdGlvbikpOworCQlhcnJheS5hZGQoCisJCQluZXcgUHJldmlld1Rhc2soCisJCQkJVXBkYXRlVUlNZXNzYWdlcy5Db25maWd1cmF0aW9uVmlld19pbnN0YWxsT3B0aW9uYWxMYWJlbCwgCisJCQkJVXBkYXRlVUlNZXNzYWdlcy5Db25maWd1cmF0aW9uVmlld19pbnN0YWxsT3B0aW9uYWxEZXNjLCAKKwkJCQlpbnN0YWxsT3B0RmVhdHVyZUFjdGlvbikpOworCQlhcnJheS5hZGQoCisJCQluZXcgUHJldmlld1Rhc2soCisJCQkJVXBkYXRlVUlNZXNzYWdlcy5Db25maWd1cmF0aW9uVmlld191bmluc3RhbGxMYWJlbCwgCisJCQkJVXBkYXRlVUlNZXNzYWdlcy5Db25maWd1cmF0aW9uVmlld191bmluc3RhbGxEZXNjLCAKKwkJCQl1bmluc3RhbGxGZWF0dXJlQWN0aW9uKSk7CisJCWFycmF5LmFkZCgKKwkJCW5ldyBQcmV2aWV3VGFzaygKKwkJCQlVcGRhdGVVSU1lc3NhZ2VzLkNvbmZpZ3VyYXRpb25WaWV3X2ZlYXR1cmVQcm9wTGFiZWwsIAorCQkJCVVwZGF0ZVVJTWVzc2FnZXMuQ29uZmlndXJhdGlvblZpZXdfZmVhdHVyZVByb3BEZXNjLCAKKwkJCQlwcm9wZXJ0aWVzQWN0aW9uKSk7CisJCXByZXZpZXdUYXNrcy5wdXQoa2V5LCBhcnJheS50b0FycmF5KG5ldyBJUHJldmlld1Rhc2tbYXJyYXkuc2l6ZSgpXSkpOworCX0KKworCXB1YmxpYyBJUHJldmlld1Rhc2tbXSBnZXRQcmV2aWV3VGFza3MoT2JqZWN0IG9iamVjdCkgeworCQlJUHJldmlld1Rhc2tbXSB0YXNrcyA9IG51bGw7CisKKwkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElGZWF0dXJlQWRhcHRlcikKKwkJCXRhc2tzID0gKElQcmV2aWV3VGFza1tdKSBwcmV2aWV3VGFza3MuZ2V0KElGZWF0dXJlQWRhcHRlci5jbGFzcyk7CisJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBJTG9jYWxTaXRlKQorCQkJdGFza3MgPSAoSVByZXZpZXdUYXNrW10pIHByZXZpZXdUYXNrcy5nZXQoSUxvY2FsU2l0ZS5jbGFzcyk7CisJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBJQ29uZmlndXJlZFNpdGVBZGFwdGVyKQorCQkJdGFza3MgPQorCQkJCShJUHJldmlld1Rhc2tbXSkgcHJldmlld1Rhc2tzLmdldChJQ29uZmlndXJlZFNpdGVBZGFwdGVyLmNsYXNzKTsKKwkJcmV0dXJuICh0YXNrcyAhPSBudWxsKSA/IHRhc2tzIDogbmV3IElQcmV2aWV3VGFza1swXTsKKwl9CisKKwlDb25maWd1cmF0aW9uTWFuYWdlcldpbmRvdyBnZXRDb25maWd1cmF0aW9uV2luZG93KCl7CisJCXJldHVybiBjb25maWd1cmF0aW9uV2luZG93OworCX0KKwkKKwlwcml2YXRlIExvY2FsU2l0ZVdvcmtiZW5jaEFkYXB0ZXIgZ2V0VUlSZWFkeUxvY2FsU2l0ZShJTG9jYWxTaXRlIGxvY2FsU2l0ZSkgeworCQkJCisJCXJldHVybiBuZXcgTG9jYWxTaXRlV29ya2JlbmNoQWRhcHRlcihsb2NhbFNpdGUpOworCQkJCisJfQorCQorCQorCit9CisKK2NsYXNzIExvY2FsU2l0ZVdvcmtiZW5jaEFkYXB0ZXIgZXh0ZW5kcyBMb2NhbFNpdGUgaW1wbGVtZW50cyBJV29ya2JlbmNoQWRhcHRlciB7CisJCisJcHJpdmF0ZSBJTG9jYWxTaXRlIGxvY2FsU2l0ZTsKKwkKKwlwdWJsaWMgTG9jYWxTaXRlV29ya2JlbmNoQWRhcHRlcihJTG9jYWxTaXRlIGxvY2FsU2l0ZSkgeworCQl0aGlzLmxvY2FsU2l0ZSA9IGxvY2FsU2l0ZTsKKwl9CisJCisJcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBvKSB7CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRMYWJlbChPYmplY3QgbykgeworCQlyZXR1cm4gUGxhdGZvcm0uZ2V0UHJvZHVjdCgpLmdldE5hbWUoKTsKKwl9CisKKwlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgbykgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlwdWJsaWMgdm9pZCBhZGRDb25maWd1cmF0aW9uKElJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcpIHsKKwkJbG9jYWxTaXRlLmFkZENvbmZpZ3VyYXRpb24oY29uZmlnKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBhZGRMb2NhbFNpdGVDaGFuZ2VkTGlzdGVuZXIoSUxvY2FsU2l0ZUNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgeworCQlsb2NhbFNpdGUuYWRkTG9jYWxTaXRlQ2hhbmdlZExpc3RlbmVyKGxpc3RlbmVyKTsKKwl9CisKKwlwdWJsaWMgSUluc3RhbGxDb25maWd1cmF0aW9uIGFkZFRvUHJlc2VydmVkQ29uZmlndXJhdGlvbnMoSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGxvY2FsU2l0ZS5hZGRUb1ByZXNlcnZlZENvbmZpZ3VyYXRpb25zKGNvbmZpZ3VyYXRpb24pOworCX0KKworCXB1YmxpYyBJSW5zdGFsbENvbmZpZ3VyYXRpb24gY2xvbmVDdXJyZW50Q29uZmlndXJhdGlvbigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGxvY2FsU2l0ZS5jbG9uZUN1cnJlbnRDb25maWd1cmF0aW9uKCk7CisJfQorCisJcHVibGljIElJbnN0YWxsQ29uZmlndXJhdGlvbltdIGdldENvbmZpZ3VyYXRpb25IaXN0b3J5KCkgeworCQlyZXR1cm4gbG9jYWxTaXRlLmdldENvbmZpZ3VyYXRpb25IaXN0b3J5KCk7CisJfQorCisJcHVibGljIElJbnN0YWxsQ29uZmlndXJhdGlvbiBnZXRDdXJyZW50Q29uZmlndXJhdGlvbigpIHsKKwkJcmV0dXJuIGxvY2FsU2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpOworCX0KKworCXB1YmxpYyBJU3RhdHVzIGdldEZlYXR1cmVTdGF0dXMoSUZlYXR1cmUgZmVhdHVyZSkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlyZXR1cm4gbG9jYWxTaXRlLmdldEZlYXR1cmVTdGF0dXMoZmVhdHVyZSk7CisJfQorCisJcHVibGljIGludCBnZXRNYXhpbXVtSGlzdG9yeUNvdW50KCkgeworCQlyZXR1cm4gbG9jYWxTaXRlLmdldE1heGltdW1IaXN0b3J5Q291bnQoKTsKKwl9CisKKwlwdWJsaWMgSUluc3RhbGxDb25maWd1cmF0aW9uW10gZ2V0UHJlc2VydmVkQ29uZmlndXJhdGlvbnMoKSB7CisJCXJldHVybiBsb2NhbFNpdGUuZ2V0UHJlc2VydmVkQ29uZmlndXJhdGlvbnMoKTsKKwl9CisKKwlwdWJsaWMgdm9pZCByZW1vdmVGcm9tUHJlc2VydmVkQ29uZmlndXJhdGlvbnMoSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKKwkJbG9jYWxTaXRlLnJlbW92ZUZyb21QcmVzZXJ2ZWRDb25maWd1cmF0aW9ucyhjb25maWd1cmF0aW9uKTsKKwl9CisKKwlwdWJsaWMgdm9pZCByZW1vdmVMb2NhbFNpdGVDaGFuZ2VkTGlzdGVuZXIoSUxvY2FsU2l0ZUNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgeworCQlsb2NhbFNpdGUucmVtb3ZlTG9jYWxTaXRlQ2hhbmdlZExpc3RlbmVyKGxpc3RlbmVyKTsKKwl9CisKKwlwdWJsaWMgdm9pZCByZXZlcnRUbyhJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJUHJvYmxlbUhhbmRsZXIgaGFuZGxlcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlsb2NhbFNpdGUucmV2ZXJ0VG8oY29uZmlndXJhdGlvbiwgbW9uaXRvciwgaGFuZGxlcik7CisJfQorCisJcHVibGljIGJvb2xlYW4gc2F2ZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGxvY2FsU2l0ZS5zYXZlKCk7CisJfQorCisJcHVibGljIHZvaWQgc2V0TWF4aW11bUhpc3RvcnlDb3VudChpbnQgaGlzdG9yeSkgeworCQlsb2NhbFNpdGUuc2V0TWF4aW11bUhpc3RvcnlDb3VudChoaXN0b3J5KTsKKwl9CisJCit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvRmVhdHVyZUFjdGlvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL0ZlYXR1cmVBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDk2YTQyCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL0ZlYXR1cmVBY3Rpb24uamF2YQpAQCAtMCwwICsxLDM3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnZpZXdzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBGZWF0dXJlQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKKwkKKwlwcm90ZWN0ZWQgU3RyaW5nIHdpbmRvd1RpdGxlOworCQorICAgIHByb3RlY3RlZCBTaGVsbCBzaGVsbDsKKworCXB1YmxpYyBGZWF0dXJlQWN0aW9uKFNoZWxsIHNoZWxsLCBTdHJpbmcgdGV4dCkgeworCQlzdXBlcih0ZXh0KTsKKyAgICAgICAgdGhpcy5zaGVsbCA9IHNoZWxsOworCX0KKworCXByb3RlY3RlZCBib29sZWFuIGNvbmZpcm0oU3RyaW5nIG1lc3NhZ2UpIHsKKwkJcmV0dXJuIE1lc3NhZ2VEaWFsb2cub3BlbkNvbmZpcm0oIHNoZWxsLCB3aW5kb3dUaXRsZSwgbWVzc2FnZSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldFdpbmRvd1RpdGxlKCBTdHJpbmcgd2luZG93VGl0bGUpIHsKKwkJdGhpcy53aW5kb3dUaXRsZSA9IHdpbmRvd1RpdGxlOworCX0KKwkKKwlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBjYW5FeGVjdXRlQWN0aW9uKCk7Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvRmVhdHVyZVN0YXRlQWN0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvRmVhdHVyZVN0YXRlQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MzODY2MAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9GZWF0dXJlU3RhdGVBY3Rpb24uamF2YQpAQCAtMCwwICsxLDk5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnZpZXdzOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwub3BlcmF0aW9ucy5VcGRhdGVVdGlsczsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUk7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsLkNvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy5JT3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLk9wZXJhdGlvbnNNYW5hZ2VyOworCitwdWJsaWMgY2xhc3MgRmVhdHVyZVN0YXRlQWN0aW9uIGV4dGVuZHMgRmVhdHVyZUFjdGlvbiB7CisKKwlwcml2YXRlIENvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlciBhZGFwdGVyOworCisgICAgcHVibGljIEZlYXR1cmVTdGF0ZUFjdGlvbihTaGVsbCBzaGVsbCwgU3RyaW5nIHRleHQpIHsKKyAgICAgICAgc3VwZXIoc2hlbGwsIHRleHQpOworICAgICAgICBzZXRXaW5kb3dUaXRsZShVcGRhdGVVSU1lc3NhZ2VzLkZlYXR1cmVTdGF0ZUFjdGlvbl9kaWFsb2dUaXRsZSk7CisgICAgfQorICAgIAorCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKwkJCisJCXRoaXMuYWRhcHRlciA9IChDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXIpIHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKKwkJaWYgKGFkYXB0ZXIuaXNDb25maWd1cmVkKCkpIHsKKwkJCXNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5GZWF0dXJlU3RhdGVBY3Rpb25fZGlzYWJsZSk7IAorCQl9IGVsc2UgeworCQkJc2V0VGV4dChVcGRhdGVVSU1lc3NhZ2VzLkZlYXR1cmVTdGF0ZUFjdGlvbl9lbmFibGUpOyAKKwkJfQorCX0KKworCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJdHJ5IHsKKwkJCWlmIChhZGFwdGVyID09IG51bGwpCisJCQkJcmV0dXJuOworCQkJCisJCQlJU3RhdHVzIHN0YXR1cyA9IE9wZXJhdGlvbnNNYW5hZ2VyLmdldFZhbGlkYXRvcigpLnZhbGlkYXRlUGxhdGZvcm1Db25maWdWYWxpZCgpOworCQkJaWYgKHN0YXR1cyAhPSBudWxsKQorCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1cyk7CisJCQkKKwkJCWJvb2xlYW4gaXNDb25maWd1cmVkID0gYWRhcHRlci5pc0NvbmZpZ3VyZWQoKTsKKwkJCS8vIEFzayB1c2VyIHRvIGNvbmZpcm0gdGhlIG9wZXJhdGlvbgorCQkJU3RyaW5nIG1lc3NhZ2UgPQorCQkJCWlzQ29uZmlndXJlZAorCQkJCQk/IFVwZGF0ZVVJTWVzc2FnZXMuRmVhdHVyZVN0YXRlQWN0aW9uX2Rpc2FibGVRdWVzdGlvbgorCQkJCQk6IFVwZGF0ZVVJTWVzc2FnZXMuRmVhdHVyZVN0YXRlQWN0aW9uX0VuYWJsZVF1ZXN0aW9uOyAKKworCQkJaWYgKCFjb25maXJtKG1lc3NhZ2UpKQorCQkJCXJldHVybjsKKworCQkJLy8gSWYgY3VycmVudCBjb25maWcgaXMgYnJva2VuLCBjb25maXJtIHdpdGggdGhlIHVzZXIgdG8gY29udGludWUKKwkJCWlmIChPcGVyYXRpb25zTWFuYWdlci5nZXRWYWxpZGF0b3IoKS52YWxpZGF0ZUN1cnJlbnRTdGF0ZSgpICE9IG51bGwgJiYKKwkJCQkJIWNvbmZpcm0oVXBkYXRlVUlNZXNzYWdlcy5BY3Rpb25zX2Jyb2tlbkNvbmZpZ1F1ZXN0aW9uKSkgCisJCQkJcmV0dXJuOworCQkJCisJCQlJT3BlcmF0aW9uIHRvZ2dsZU9wZXJhdGlvbiA9CisJCQkJaXNDb25maWd1cmVkCisJCQkJCT8gKElPcGVyYXRpb24pT3BlcmF0aW9uc01hbmFnZXIKKwkJCQkJCS5nZXRPcGVyYXRpb25GYWN0b3J5KCkKKwkJCQkJCS5jcmVhdGVVbmNvbmZpZ09wZXJhdGlvbigKKwkJCQkJCWFkYXB0ZXIuZ2V0Q29uZmlndXJlZFNpdGUoKSwKKwkJCQkJCWFkYXB0ZXIuZ2V0RmVhdHVyZShudWxsKSkKKwkJCQkJOiBPcGVyYXRpb25zTWFuYWdlcgorCQkJCQkJLmdldE9wZXJhdGlvbkZhY3RvcnkoKQorCQkJCQkJLmNyZWF0ZUNvbmZpZ09wZXJhdGlvbigKKwkJCQkJCWFkYXB0ZXIuZ2V0Q29uZmlndXJlZFNpdGUoKSwKKwkJCQkJCWFkYXB0ZXIuZ2V0RmVhdHVyZShudWxsKSk7CisKKwkJCWJvb2xlYW4gcmVzdGFydE5lZWRlZCA9IHRvZ2dsZU9wZXJhdGlvbi5leGVjdXRlKG51bGwsIG51bGwpOworCQkJVXBkYXRlVUkucmVxdWVzdFJlc3RhcnQocmVzdGFydE5lZWRlZCk7CisKKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQlFcnJvckRpYWxvZy5vcGVuRXJyb3Ioc2hlbGwsCisgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIGUuZ2V0U3RhdHVzKCkpOworCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKKwkJCS8vIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4KKwkJCVVwZGF0ZVV0aWxzLmxvZ0V4Y2VwdGlvbihlLmdldFRhcmdldEV4Y2VwdGlvbigpKTsKKwkJfQorCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlQWN0aW9uKCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9GZWF0dXJlc1N0YXRlQWN0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvRmVhdHVyZXNTdGF0ZUFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwM2EyNWYKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvRmVhdHVyZXNTdGF0ZUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTYzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnZpZXdzOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi5JQ29uZmlndXJlZFNpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuSW5zdGFsbFJlZ2lzdHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zLk9wZXJhdGlvbkZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm9wZXJhdGlvbnMuVXBkYXRlVXRpbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSU1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbC5Db25maWd1cmVkRmVhdHVyZUFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuSUZlYXR1cmVPcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuSU9wZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy5PcGVyYXRpb25zTWFuYWdlcjsKKworcHVibGljIGNsYXNzIEZlYXR1cmVzU3RhdGVBY3Rpb24gZXh0ZW5kcyBGZWF0dXJlQWN0aW9uIHsKKworCQorCXByaXZhdGUgQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyW10gYWRhcHRlcnM7CisKKyAgICBwdWJsaWMgRmVhdHVyZXNTdGF0ZUFjdGlvbihTaGVsbCBzaGVsbCwgU3RyaW5nIHRleHQpIHsKKyAgICAgICAgc3VwZXIoc2hlbGwsIHRleHQpOworICAgICAgICBzZXRXaW5kb3dUaXRsZShVcGRhdGVVSU1lc3NhZ2VzLkZlYXR1cmVTdGF0ZUFjdGlvbl9kaWFsb2dUaXRsZSk7CisgICAgfQorICAgIAorCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKworCQl0aGlzLmFkYXB0ZXJzID0gKENvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlcltdKSBzZWxlY3Rpb24udG9MaXN0KCkudG9BcnJheShuZXcgQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyW3NlbGVjdGlvbi5zaXplKCldKTsKKwkJaWYgKGNhblVuY29uZmlndXJlKCkpIHsKKwkJCXNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5GZWF0dXJlU3RhdGVBY3Rpb25fZGlzYWJsZSk7IAorCQl9IGVsc2UgeworCQkJc2V0VGV4dChVcGRhdGVVSU1lc3NhZ2VzLkZlYXR1cmVTdGF0ZUFjdGlvbl9lbmFibGUpOyAKKwkJfQorCisJfQorCQorCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJdHJ5IHsKKwkJCWlmICggKGFkYXB0ZXJzID09IG51bGwpICYmIChhZGFwdGVycy5sZW5ndGggPT0gMCkpCisJCQkJcmV0dXJuOworCQkJCisJCQlJU3RhdHVzIHN0YXR1cyA9IE9wZXJhdGlvbnNNYW5hZ2VyLmdldFZhbGlkYXRvcigpLnZhbGlkYXRlUGxhdGZvcm1Db25maWdWYWxpZCgpOworCQkJaWYgKHN0YXR1cyAhPSBudWxsKQorCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1cyk7CisJCQkKKwkJCWJvb2xlYW4gaXNDb25maWd1cmVkID0gY2FuVW5jb25maWd1cmUoKTsKKwkJCS8vIEFzayB1c2VyIHRvIGNvbmZpcm0gdGhlIG9wZXJhdGlvbgorCQkJU3RyaW5nIG1lc3NhZ2UgPQorCQkJCWlzQ29uZmlndXJlZAorCQkJCQk/IFVwZGF0ZVVJTWVzc2FnZXMuRmVhdHVyZVN0YXRlQWN0aW9uX2Rpc2FibGVRdWVzdGlvbgorCQkJCQk6IFVwZGF0ZVVJTWVzc2FnZXMuRmVhdHVyZVN0YXRlQWN0aW9uX0VuYWJsZVF1ZXN0aW9uOyAKKworCQkJaWYgKCFjb25maXJtKG1lc3NhZ2UpKQorCQkJCXJldHVybjsKKworCQkJLy8gSWYgY3VycmVudCBjb25maWcgaXMgYnJva2VuLCBjb25maXJtIHdpdGggdGhlIHVzZXIgdG8gY29udGludWUKKwkJCWlmIChPcGVyYXRpb25zTWFuYWdlci5nZXRWYWxpZGF0b3IoKS52YWxpZGF0ZUN1cnJlbnRTdGF0ZSgpICE9IG51bGwgJiYKKwkJCQkJIWNvbmZpcm0oVXBkYXRlVUlNZXNzYWdlcy5BY3Rpb25zX2Jyb2tlbkNvbmZpZ1F1ZXN0aW9uKSkgCisJCQkJcmV0dXJuOworCQkJCisJCQlJT3BlcmF0aW9uIHRvZ2dsZU9wZXJhdGlvbiA9IG51bGw7CisJCQkKKwkJCUlGZWF0dXJlW10gZmVhdHVyZXMgPSBuZXcgSUZlYXR1cmVbYWRhcHRlcnMubGVuZ3RoXTsKKwkJCUlDb25maWd1cmVkU2l0ZVtdIGNvbmZpZ3VyZWRTaXRlcyA9IG5ldyBJQ29uZmlndXJlZFNpdGVbYWRhcHRlcnMubGVuZ3RoXTsKKwkJCWZvciggaW50IGkgPSAwOyBpIDwgYWRhcHRlcnMubGVuZ3RoOyBpKyspIHsKKwkJCQlmZWF0dXJlc1tpXSA9IGFkYXB0ZXJzW2ldLmdldEZlYXR1cmUobnVsbCk7CisJCQkJY29uZmlndXJlZFNpdGVzW2ldID0gYWRhcHRlcnNbaV0uZ2V0Q29uZmlndXJlZFNpdGUoKTsKKwkJCX0KKwkJCQorCQkJaWYgKGlzQ29uZmlndXJlZCkgeworCQkJCXRvZ2dsZU9wZXJhdGlvbiA9ICgoT3BlcmF0aW9uRmFjdG9yeSlPcGVyYXRpb25zTWFuYWdlci5nZXRPcGVyYXRpb25GYWN0b3J5KCkpLmNyZWF0ZVVuY29uZmlndXJlRmVhdHVyZXNPcGVyYXRpb24oIGNvbmZpZ3VyZWRTaXRlcywgZmVhdHVyZXMpOworCQkJfSBlbHNlIGlmIChjYW5Db25maWd1cmUoKSl7CisJCQkJdG9nZ2xlT3BlcmF0aW9uID0gKChPcGVyYXRpb25GYWN0b3J5KU9wZXJhdGlvbnNNYW5hZ2VyLmdldE9wZXJhdGlvbkZhY3RvcnkoKSkuY3JlYXRlQ29uZmlndXJlRmVhdHVyZXNPcGVyYXRpb24oIGNvbmZpZ3VyZWRTaXRlcywgZmVhdHVyZXMpOworCQkJfQorCQkJCisJCQlpZiAodG9nZ2xlT3BlcmF0aW9uICE9IG51bGwpIHsKKwkJCQlib29sZWFuIHJlc3RhcnROZWVkZWQgPSB0b2dnbGVPcGVyYXRpb24uZXhlY3V0ZShudWxsLCBudWxsKTsKKwkJCQlVcGRhdGVVSS5yZXF1ZXN0UmVzdGFydChyZXN0YXJ0TmVlZGVkKTsKKwkJCX0KKworCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwKKyAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgZS5nZXRTdGF0dXMoKSk7CisJCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgeworCQkJLy8gVGhpcyBzaG91bGQgbm90IGhhcHBlbgorCQkJVXBkYXRlVXRpbHMubG9nRXhjZXB0aW9uKGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpOworCQl9CisJfQorCQorCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGVBY3Rpb24oKSB7CisJCXJldHVybiBjYW5Db25maWd1cmUoKSB8fCBjYW5VbmNvbmZpZ3VyZSgpOworCX0KKwkKKwlwcml2YXRlIGJvb2xlYW4gY2FuQ29uZmlndXJlKCkgeworCQkKKwkJaWYgKGFkYXB0ZXJzID09IG51bGwgfHwgYWRhcHRlcnMubGVuZ3RoID09IDApCisJCQlyZXR1cm4gZmFsc2U7CisJCQorCQlmb3IoIGludCBpID0gMDsgaSA8IGFkYXB0ZXJzLmxlbmd0aDsgaSsrKSB7CisJCQkKKwkJCWlmIChhZGFwdGVyc1tpXS5pc0NvbmZpZ3VyZWQoKSkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQorCQkJdHJ5IHsKKwkJCQkvLyBjaGVjayBmb3IgcGVuZGluZyBjaGFuZ2VzIChlLmcuIGlmIHRoZSBmZWF0dXJlIGhhcyBqdXN0IGJlZW4gZGlzYWJsZWQpCisJCQkJSUZlYXR1cmVPcGVyYXRpb24gcGVuZGluZ09wZXJhdGlvbiA9IE9wZXJhdGlvbnNNYW5hZ2VyLmZpbmRQZW5kaW5nT3BlcmF0aW9uKGFkYXB0ZXJzW2ldLmdldEZlYXR1cmUobnVsbCkpOworCQkJCWlmIChwZW5kaW5nT3BlcmF0aW9uICE9IG51bGwpCisJCQkJCXJldHVybiBmYWxzZTsKKworCQkJCWlmIChJbnN0YWxsUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXQoImZlYXR1cmVfIithZGFwdGVyc1tpXS5nZXRGZWF0dXJlKG51bGwpLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSkgPT0gbnVsbCkgLy8kTk9OLU5MUy0xJAorCQkJCQlyZXR1cm4gZmFsc2U7CisJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCX0KKwkJCQkKKwkJcmV0dXJuIHRydWU7CQorCX0KKwkKKwlwcml2YXRlIGJvb2xlYW4gY2FuVW5jb25maWd1cmUoKSB7CisJCQorCQlpZiAoYWRhcHRlcnMgPT0gbnVsbCB8fCBhZGFwdGVycy5sZW5ndGggPT0gMCkKKwkJCXJldHVybiBmYWxzZTsKKwkJCisJCWZvciggaW50IGkgPSAwOyBpIDwgYWRhcHRlcnMubGVuZ3RoOyBpKyspIHsKKwkJCQorCQkJaWYgKCFhZGFwdGVyc1tpXS5pc0NvbmZpZ3VyZWQoKSkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQorCQkJdHJ5IHsKKwkJCQkvLyBjaGVjayBmb3IgcGVuZGluZyBjaGFuZ2VzIChlLmcuIGlmIHRoZSBmZWF0dXJlIGhhcyBqdXN0IGJlZW4gZGlzYWJsZWQpCisJCQkJSUZlYXR1cmVPcGVyYXRpb24gcGVuZGluZ09wZXJhdGlvbiA9IE9wZXJhdGlvbnNNYW5hZ2VyLmZpbmRQZW5kaW5nT3BlcmF0aW9uKGFkYXB0ZXJzW2ldLmdldEZlYXR1cmUobnVsbCkpOworCQkJCWlmIChwZW5kaW5nT3BlcmF0aW9uICE9IG51bGwpCisJCQkJCXJldHVybiBmYWxzZTsKKworCQkJCWlmIChJbnN0YWxsUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXQoImZlYXR1cmVfIithZGFwdGVyc1tpXS5nZXRGZWF0dXJlKG51bGwpLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSkgPT0gbnVsbCkgLy8kTk9OLU5MUy0xJAorCQkJCQlyZXR1cm4gZmFsc2U7CisJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCX0KKwkJCQkKKwkJcmV0dXJuIHRydWU7CQorCX0KKwkKKworfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL0ZpbmRBbmRJbnN0YWxsSGFuZGxlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL0ZpbmRBbmRJbnN0YWxsSGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkNDQyNzEKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvRmluZEFuZEluc3RhbGxIYW5kbGVyLmphdmEKQEAgLTAsMCArMSwzMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS52aWV3czsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5oYW5kbGVycy5IYW5kbGVyVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudWkuVXBkYXRlTWFuYWdlclVJOworCisvKioKKyAqIFRoaXMgaGFuZGxlciBpcyBob29rZWQgdG8gYSBjb21tYW5kIHByb3ZpZGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiAoc3VjaAorICogYXMgb3JnLmVjbGlwc2UudWkuaWRlKS4gVGhpcyBhbGxvd3MgUkNQIGFwcGxpY2F0aW9ucyB0byBjb250cm9sIGhvdyB1cGRhdGUKKyAqIGZ1bmN0aW9uYWxpdHkgaXMgc3VyZmFjZWQuCisgKi8KK3B1YmxpYyBjbGFzcyBGaW5kQW5kSW5zdGFsbEhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgeworCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5BYnN0cmFjdEhhbmRsZXIjZXhlY3V0ZShvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV2ZW50KQorCSAqLworCXB1YmxpYyBPYmplY3QgZXhlY3V0ZShFeGVjdXRpb25FdmVudCBldmVudCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7CisJCVVwZGF0ZU1hbmFnZXJVSS5vcGVuSW5zdGFsbGVyKEhhbmRsZXJVdGlsLmdldEFjdGl2ZVNoZWxsKGV2ZW50KSk7CisJCXJldHVybiBudWxsOworCX0KKworfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL0ZpbmRVcGRhdGVzQWN0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvRmluZFVwZGF0ZXNBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2M3YWI3Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL0ZpbmRVcGRhdGVzQWN0aW9uLmphdmEKQEAgLTAsMCArMSwxNTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqICBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnZpZXdzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByb2dyZXNzTW9uaXRvcldyYXBwZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuQ29uZmlndXJhdGlvbk1hbmFnZXJXaW5kb3c7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLndpemFyZHMuSW5zdGFsbFdpemFyZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkud2l6YXJkcy5JbnN0YWxsV2l6YXJkT3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLk9wZXJhdGlvbnNNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5VcGRhdGVKb2I7CisKK3B1YmxpYyBjbGFzcyBGaW5kVXBkYXRlc0FjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisKKwlwcml2YXRlIElGZWF0dXJlIGZlYXR1cmU7CisKKwlwcml2YXRlIENvbmZpZ3VyYXRpb25NYW5hZ2VyV2luZG93IHdpbmRvdzsKKworCXByaXZhdGUgY2xhc3MgVHJhY2tpbmdQcm9ncmVzc01vbml0b3IgZXh0ZW5kcyBQcm9ncmVzc01vbml0b3JXcmFwcGVyIHsKKwkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKworCQlwcml2YXRlIFN0cmluZyBzdWJuYW1lOworCisJCXByaXZhdGUgaW50IHRvdGFsV29yazsKKworCQlwcml2YXRlIGRvdWJsZSB3b3JrU29GYXI7CisKKwkJcHJvdGVjdGVkIFRyYWNraW5nUHJvZ3Jlc3NNb25pdG9yKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgeworCQkJc3VwZXIobW9uaXRvcik7CisJCX0KKworCQlwdWJsaWMgdm9pZCBiZWdpblRhc2soU3RyaW5nIG5hbWUsIGludCB0b3RhbFdvcmspIHsKKwkJCXRoaXMubmFtZSA9IG5hbWU7CisJCQl0aGlzLnRvdGFsV29yayA9IHRvdGFsV29yazsKKwkJCXN1cGVyLmJlZ2luVGFzayhuYW1lLCB0b3RhbFdvcmspOworCQkJdXBkYXRlU3RhdHVzKCk7CisJCX0KKworCQlwdWJsaWMgdm9pZCBpbnRlcm5hbFdvcmtlZChkb3VibGUgdGlja3MpIHsKKwkJCXN1cGVyLmludGVybmFsV29ya2VkKHRpY2tzKTsKKwkJCXdvcmtTb0ZhciArPSB0aWNrczsKKwkJCXVwZGF0ZVN0YXR1cygpOworCQl9CisKKwkJcHVibGljIHZvaWQgc3ViVGFzayhTdHJpbmcgc3ViVGFzaykgeworCQkJc3VibmFtZSA9IHN1YlRhc2s7CisJCQlzdXBlci5zdWJUYXNrKHN1YlRhc2spOworCQkJdXBkYXRlU3RhdHVzKCk7CisJCX0KKworCQlwcml2YXRlIHZvaWQgdXBkYXRlU3RhdHVzKCkgeworCQkJaWYgKHdpbmRvdy5nZXRTaGVsbCgpPT1udWxsIHx8IHdpbmRvdy5nZXRTaGVsbCgpLmlzRGlzcG9zZWQoKSkKKwkJCQlyZXR1cm47CisJCQlpZiAod2luZG93LmlzUHJvZ3Jlc3NDYW5jZWxlZCgpKQorCQkJCXNldENhbmNlbGVkKHRydWUpOworCQkJaWYgKHRvdGFsV29yayA8PSAwKQorCQkJCXJldHVybjsKKwkJCVN0cmluZyBwZXJjID0gKChpbnQpICh3b3JrU29GYXIgKiAxMDAuMCkgLyB0b3RhbFdvcmspICsgIiI7IC8vJE5PTi1OTFMtMSQKKwkJCWZpbmFsIFN0cmluZyBtZXNzYWdlID0gTkxTLmJpbmQoVXBkYXRlVUlNZXNzYWdlcy5GaW5kVXBkYXRlc0FjdGlvbl90cmFja2VkUHJvZ3Jlc3MsIG5ldyBTdHJpbmdbXSB7CisJCQkJCW5hbWUsIHN1Ym5hbWUsIHBlcmMgfSk7CisJCQlTaGVsbCBzaGVsbCA9IHdpbmRvdy5nZXRTaGVsbCgpOworCQkJaWYgKHNoZWxsPT1udWxsIHx8IHNoZWxsLmlzRGlzcG9zZWQoKSkgcmV0dXJuOworCQkJd2luZG93LmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7CisJCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQl3aW5kb3cudXBkYXRlU3RhdHVzTGluZShtZXNzYWdlLCBudWxsKTsKKwkJCQl9CisJCQl9KTsKKwkJfQorCX0KKworCXByaXZhdGUgY2xhc3MgVHJhY2tlZFVwZGF0ZUpvYiBleHRlbmRzIFVwZGF0ZUpvYiB7CisJCXB1YmxpYyBUcmFja2VkVXBkYXRlSm9iKFN0cmluZyBuYW1lLCBib29sZWFuIGlzQXV0b21hdGljLAorCQkJCWJvb2xlYW4gZG93bmxvYWQsIElGZWF0dXJlW10gZmVhdHVyZXMpIHsKKwkJCXN1cGVyKG5hbWUsIGlzQXV0b21hdGljLCBkb3dubG9hZCwgZmVhdHVyZXMpOworCQl9CisKKwkJcHVibGljIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgeworCQkJcmV0dXJuIHN1cGVyLnJ1bihuZXcgVHJhY2tpbmdQcm9ncmVzc01vbml0b3IobW9uaXRvcikpOworCQl9CisJfQorCisJcHVibGljIEZpbmRVcGRhdGVzQWN0aW9uKENvbmZpZ3VyYXRpb25NYW5hZ2VyV2luZG93IHdpbmRvdywgU3RyaW5nIHRleHQpIHsKKwkJc3VwZXIodGV4dCk7CisJCXRoaXMud2luZG93ID0gd2luZG93OworCX0KKworCXB1YmxpYyB2b2lkIHNldEZlYXR1cmUoSUZlYXR1cmUgZmVhdHVyZSkgeworCQl0aGlzLmZlYXR1cmUgPSBmZWF0dXJlOworCX0KKworCXB1YmxpYyB2b2lkIHJ1bigpIHsKKworCQlJU3RhdHVzIHN0YXR1cyA9IE9wZXJhdGlvbnNNYW5hZ2VyLmdldFZhbGlkYXRvcigpCisJCQkJLnZhbGlkYXRlUGxhdGZvcm1Db25maWdWYWxpZCgpOworCQlpZiAoc3RhdHVzICE9IG51bGwpIHsKKwkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcih3aW5kb3cuZ2V0U2hlbGwoKSwgbnVsbCwgbnVsbCwgc3RhdHVzKTsKKwkJCXJldHVybjsKKwkJfQorCisJCS8vIElmIGN1cnJlbnQgY29uZmlnIGlzIGJyb2tlbiwgY29uZmlybSB3aXRoIHRoZSB1c2VyIHRvIGNvbnRpbnVlCisJCWlmIChPcGVyYXRpb25zTWFuYWdlci5nZXRWYWxpZGF0b3IoKS52YWxpZGF0ZUN1cnJlbnRTdGF0ZSgpICE9IG51bGwKKwkJCQkmJiAhY29uZmlybShVcGRhdGVVSU1lc3NhZ2VzLkFjdGlvbnNfYnJva2VuQ29uZmlnUXVlc3Rpb24pKQorCQkJcmV0dXJuOworCisJCWlmIChJbnN0YWxsV2l6YXJkLmlzUnVubmluZygpKSB7CisJCQlNZXNzYWdlRGlhbG9nLm9wZW5JbmZvcm1hdGlvbih3aW5kb3cuZ2V0U2hlbGwoKSwKKwkJCQkJVXBkYXRlVUlNZXNzYWdlcy5JbnN0YWxsV2l6YXJkX2lzUnVubmluZ1RpdGxlLAorCQkJCQlVcGRhdGVVSU1lc3NhZ2VzLkluc3RhbGxXaXphcmRfaXNSdW5uaW5nSW5mbyk7CisJCQlyZXR1cm47CisJCX0KKworCQlJRmVhdHVyZVtdIGZlYXR1cmVzID0gbnVsbDsKKwkJaWYgKGZlYXR1cmUgIT0gbnVsbCkKKwkJCWZlYXR1cmVzID0gbmV3IElGZWF0dXJlW10geyBmZWF0dXJlIH07CisKKwkJVXBkYXRlSm9iIGpvYiA9IG5ldyBUcmFja2VkVXBkYXRlSm9iKAorCQkJCVVwZGF0ZVVJTWVzc2FnZXMuSW5zdGFsbFdpemFyZF9qb2JOYW1lLCBmYWxzZSwgZmFsc2UsIGZlYXR1cmVzKTsKKworCQlqb2Iuc2V0VXNlcih0cnVlKTsKKwkJam9iLnNldFByaW9yaXR5KEpvYi5JTlRFUkFDVElWRSk7CisKKwkJU3RyaW5nIG5hbWUgPSBmZWF0dXJlIT1udWxsP2ZlYXR1cmUuZ2V0TGFiZWwoKTpVcGRhdGVVSU1lc3NhZ2VzLkZpbmRVcGRhdGVzQWN0aW9uX2FsbEZlYXR1cmVzU2VhcmNoOworCQl3aW5kb3cudHJhY2tVcGRhdGVKb2Ioam9iLCBuYW1lKTsKKwkJSW5zdGFsbFdpemFyZE9wZXJhdGlvbiBvcGVyYXRpb24gPSBuZXcgSW5zdGFsbFdpemFyZE9wZXJhdGlvbigpOworCisJCW9wZXJhdGlvbi5ydW4od2luZG93LmdldFNoZWxsKCksIGpvYik7CisKKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gY29uZmlybShTdHJpbmcgbWVzc2FnZSkgeworCQlyZXR1cm4gTWVzc2FnZURpYWxvZy5vcGVuQ29uZmlybSh3aW5kb3cuZ2V0U2hlbGwoKSwKKwkJCQlVcGRhdGVVSU1lc3NhZ2VzLkZlYXR1cmVTdGF0ZUFjdGlvbl9kaWFsb2dUaXRsZSwgbWVzc2FnZSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL0lQcmV2aWV3VGFzay5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL0lQcmV2aWV3VGFzay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5NTcxNDAKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvSVByZXZpZXdUYXNrLmphdmEKQEAgLTAsMCArMSwyMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS52aWV3czsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi4qOworCitwdWJsaWMgaW50ZXJmYWNlIElQcmV2aWV3VGFzayB7CisJU3RyaW5nIGdldE5hbWUoKTsKKwlTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKKwl2b2lkIHJ1bigpOworCWJvb2xlYW4gaXNFbmFibGVkKCk7CisJdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzYyk7CisJSUFjdGlvbiBnZXRBY3Rpb24oKTsKK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9JbnN0YWxsT3B0aW9uYWxGZWF0dXJlQWN0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvSW5zdGFsbE9wdGlvbmFsRmVhdHVyZUFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5NDQ2NzEKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvSW5zdGFsbE9wdGlvbmFsRmVhdHVyZUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsOTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkudmlld3M7CisKK2ltcG9ydCBqYXZhLm5ldC4qOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnNlYXJjaC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS53aXphcmRzLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuc2VhcmNoLio7CisKKworcHVibGljIGNsYXNzIEluc3RhbGxPcHRpb25hbEZlYXR1cmVBY3Rpb24gZXh0ZW5kcyBBY3Rpb24geworCXByaXZhdGUgTWlzc2luZ0ZlYXR1cmUgbWlzc2luZ0ZlYXR1cmU7CisJcHJpdmF0ZSBTaGVsbCBzaGVsbDsKKworCXB1YmxpYyBJbnN0YWxsT3B0aW9uYWxGZWF0dXJlQWN0aW9uKFNoZWxsIHNoZWxsLCBTdHJpbmcgdGV4dCkgeworCQlzdXBlcih0ZXh0KTsKKwkJdGhpcy5zaGVsbCA9IHNoZWxsOworCX0KKworCXB1YmxpYyB2b2lkIHNldEZlYXR1cmUoTWlzc2luZ0ZlYXR1cmUgZmVhdHVyZSkgeworCQl0aGlzLm1pc3NpbmdGZWF0dXJlID0gZmVhdHVyZTsKKwl9CisKKwlwdWJsaWMgdm9pZCBydW4oKSB7CisJCWlmIChtaXNzaW5nRmVhdHVyZSA9PSBudWxsKQorCQkJcmV0dXJuOworCQkKKwkJSVN0YXR1cyBzdGF0dXMgPSBPcGVyYXRpb25zTWFuYWdlci5nZXRWYWxpZGF0b3IoKS52YWxpZGF0ZVBsYXRmb3JtQ29uZmlnVmFsaWQoKTsKKwkJaWYgKHN0YXR1cyAhPSBudWxsKSB7CisJCQlFcnJvckRpYWxvZy5vcGVuRXJyb3Ioc2hlbGwsIG51bGwsIG51bGwsIHN0YXR1cyk7CisJCQlyZXR1cm47CisJCX0KKwkJCisJCS8vIElmIGN1cnJlbnQgY29uZmlnIGlzIGJyb2tlbiwgY29uZmlybSB3aXRoIHRoZSB1c2VyIHRvIGNvbnRpbnVlCisJCWlmIChPcGVyYXRpb25zTWFuYWdlci5nZXRWYWxpZGF0b3IoKS52YWxpZGF0ZUN1cnJlbnRTdGF0ZSgpICE9IG51bGwgJiYKKwkJCQkhY29uZmlybShVcGRhdGVVSU1lc3NhZ2VzLkFjdGlvbnNfYnJva2VuQ29uZmlnUXVlc3Rpb24pKSAKKwkJCXJldHVybjsKKwkJCQorCQkKKwkJVmVyc2lvbmVkSWRlbnRpZmllciB2aWQgPSBtaXNzaW5nRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7CisJCVVSTCBvcmlnaW5hdGluZ1VSTCA9IG1pc3NpbmdGZWF0dXJlLmdldE9yaWdpbmF0aW5nU2l0ZVVSTCgpOworCisJCVVwZGF0ZVNlYXJjaFNjb3BlIHNjb3BlID0gbmV3IFVwZGF0ZVNlYXJjaFNjb3BlKCk7CisJCXNjb3BlLmFkZFNlYXJjaFNpdGUob3JpZ2luYXRpbmdVUkwudG9TdHJpbmcoKSwgb3JpZ2luYXRpbmdVUkwsIG51bGwpOworCisJCU9wdGlvbmFsRmVhdHVyZVNlYXJjaENhdGVnb3J5IGNhdGVnb3J5ID0gbmV3IE9wdGlvbmFsRmVhdHVyZVNlYXJjaENhdGVnb3J5KCk7CisJCWNhdGVnb3J5LmFkZFZlcnNpb25lZElkZW50aWZpZXIodmlkKTsKKwkJZmluYWwgVXBkYXRlU2VhcmNoUmVxdWVzdCBzZWFyY2hSZXF1ZXN0ID0KKwkJCW5ldyBVcGRhdGVTZWFyY2hSZXF1ZXN0KGNhdGVnb3J5LCBzY29wZSk7CisKKwkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoc2hlbGwuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7CisJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJb3BlbldpemFyZChzZWFyY2hSZXF1ZXN0KTsKKwkJCX0KKwkJfSk7CisJfQorCXByaXZhdGUgdm9pZCBvcGVuV2l6YXJkKFVwZGF0ZVNlYXJjaFJlcXVlc3Qgc2VhcmNoUmVxdWVzdCkgeworCQlpZiAoSW5zdGFsbFdpemFyZC5pc1J1bm5pbmcoKSkgeworCQkJTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24oc2hlbGwsIFVwZGF0ZVVJTWVzc2FnZXMuSW5zdGFsbFdpemFyZF9pc1J1bm5pbmdUaXRsZSwgVXBkYXRlVUlNZXNzYWdlcy5JbnN0YWxsV2l6YXJkX2lzUnVubmluZ0luZm8pOworCQkJcmV0dXJuOworCQl9CisJCUluc3RhbGxXaXphcmQgd2l6YXJkID0gbmV3IEluc3RhbGxXaXphcmQoc2VhcmNoUmVxdWVzdCk7CisJCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgUmVzaXphYmxlSW5zdGFsbFdpemFyZERpYWxvZyhzaGVsbCwgd2l6YXJkLCBVcGRhdGVVSU1lc3NhZ2VzLkZlYXR1cmVQYWdlX29wdGlvbmFsSW5zdGFsbF90aXRsZSk7CisJCWRpYWxvZy5jcmVhdGUoKTsKKwkJZGlhbG9nLm9wZW4oKTsKKwl9CisJCisJcHJpdmF0ZSBib29sZWFuIGNvbmZpcm0oU3RyaW5nIG1lc3NhZ2UpIHsKKwkJcmV0dXJuIE1lc3NhZ2VEaWFsb2cub3BlbkNvbmZpcm0oCisJCQlzaGVsbCwKKwkJCVVwZGF0ZVVJTWVzc2FnZXMuRmVhdHVyZVN0YXRlQWN0aW9uX2RpYWxvZ1RpdGxlLCAKKwkJCW1lc3NhZ2UpOworCX0KK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9JbnN0YWxsYXRpb25IaXN0b3J5QWN0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvSW5zdGFsbGF0aW9uSGlzdG9yeUFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmYjcxNGEKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvSW5zdGFsbGF0aW9uSGlzdG9yeUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjc0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnZpZXdzOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLnRleHQuRGF0ZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci5Db25maWd1cmF0b3JVdGlsczsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUk7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJTWVzc2FnZXM7CisKK3B1YmxpYyBjbGFzcyBJbnN0YWxsYXRpb25IaXN0b3J5QWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKKyAgICAvL3ByaXZhdGUgU2hlbGwgc2hlbGw7CisJcHJpdmF0ZSBCdWZmZXJlZFJlYWRlciBidWZmUmVhZDsKKwlwcml2YXRlIFByaW50V3JpdGVyIGh0bWxMb2c7CisJcHJpdmF0ZSBGaWxlIHRlbXBGaWxlOworCXByaXZhdGUgU3RyaW5nIHJvd1R5cGU7CisJcHJpdmF0ZSBJUGF0aCBwYXRoOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBsaWdodEJsdWUgPSAiI0VFRUVGRiI7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgd2hpdGUgPSAiI0ZGRkZGRiI7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGFya0JsdWUgPSAiIzk5QUFERCI7IC8vJE5PTi1OTFMtMSQKKy8vCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdVUkFUSU9OID0gIkNPTkZJR1VSQVRJT04iOyAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElWSVRZID0gIkFDVElWSVRZIjsgLy8kTk9OLU5MUy0xJAorCisJcHVibGljIEluc3RhbGxhdGlvbkhpc3RvcnlBY3Rpb24oU2hlbGwgc2hlbGwsIFN0cmluZyB0ZXh0LCBJbWFnZURlc2NyaXB0b3IgZGVzYykgeworCQlzdXBlcih0ZXh0LCBkZXNjKTsKKyAgICAgICAgLy90aGlzLnNoZWxsID0gc2hlbGw7CisJCVN0cmluZyBsb2NhdGlvbiA9CisJCQlDb25maWd1cmF0b3JVdGlscworCQkJCS5nZXRDdXJyZW50UGxhdGZvcm1Db25maWd1cmF0aW9uKCkKKwkJCQkuZ2V0Q29uZmlndXJhdGlvbkxvY2F0aW9uKCkKKwkJCQkuZ2V0RmlsZSgpOworCQlwYXRoID0gbmV3IFBhdGgobG9jYXRpb24pLnJlbW92ZUxhc3RTZWdtZW50cygxKS5hcHBlbmQoImluc3RhbGwubG9nIik7IC8vJE5PTi1OTFMtMSQKKwkJcm93VHlwZSA9ICJsaWdodC1yb3ciOyAvLyROT04tTkxTLTEkCisJfQorCisJcHVibGljIHZvaWQgcnVuKCkgeworCQl0cnkgeworCQkJb3BlbkxvZygpOworCQkJcGFyc2VMb2coKTsKKwkJCVVwZGF0ZVVJLnNob3dVUkwoImZpbGU6IiArIGdldFRlbXBGaWxlKCkuZ2V0UGF0aCgpLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCisJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJVXBkYXRlVUkubG9nRXhjZXB0aW9uKGUpOworCQl9IGZpbmFsbHkgeworCQkJY2xvc2VMb2coKTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBvcGVuTG9nKCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQl0cnkgeworCQkgICAgLy8gdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KKwkJICAgIElucHV0U3RyZWFtIGlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShwYXRoLnRvT1NTdHJpbmcoKSk7CisJCSAgICAvLyB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbgorCQkgICAgSW5wdXRTdHJlYW1SZWFkZXIgaXNyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGlzLCJVVEYtOCIpOyAvLyROT04tTkxTLTEkCisJCSAgICBidWZmUmVhZCA9IG5ldyBCdWZmZXJlZFJlYWRlcihpc3IpOworCQkJaHRtbExvZyA9IG5ldyBQcmludFdyaXRlcihuZXcgQnVmZmVyZWRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihuZXcgRmlsZU91dHB1dFN0cmVhbShnZXRUZW1wRmlsZSgpKSwgIlVURi04IikpKTsgLy8kTk9OLU5MUy0xJAorCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJdGhyb3dDb3JlRXhjZXB0aW9uKGUpOworCQl9CisJfQorCisJcHJpdmF0ZSBGaWxlIGdldFRlbXBGaWxlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlpZiAodGVtcEZpbGUgPT0gbnVsbCkgeworCQkJdHJ5IHsKKwkJCQl0ZW1wRmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoImluc3RhbGwtbG9nIiwgIi5odG1sIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCXRlbXBGaWxlLmRlbGV0ZU9uRXhpdCgpOworCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCXRocm93Q29yZUV4Y2VwdGlvbihlKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gdGVtcEZpbGU7CisJfQorCisJcHJpdmF0ZSB2b2lkIHBhcnNlTG9nKCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQkvLwkJIUNPTkZJR1VSQVRJT04gPGNvbmZpZ3VyYXRpb24tZGF0ZT4KKwkJLy8JCSFBQ1RJVklUWSA8ZGF0ZT4gPHRhcmdldD4gPGFjdGlvbj4gPHN0YXR1cz4KKworCQl0cnkgeworCQkJU3RyaW5nIHR5cGUsIGRhdGUsIHN0YXR1cywgdGFyZ2V0LCBhY3Rpb247CisJCQlTdHJpbmdUb2tlbml6ZXIgaHRtbENvZGU7CisKKwkJCWh0bWxMb2cucHJpbnRsbigiPGh0bWw+Iik7IC8vJE5PTi1OTFMtMSQKKwkJCWh0bWxMb2cucHJpbnRsbigiPGhlYWQ+Iik7IC8vJE5PTi1OTFMtMSQKKwkJCWh0bWxMb2cucHJpbnRsbigiPG1ldGEgaHR0cC1lcXVpdj1cIkNvbnRlbnQtVHlwZVwiIGNvbnRlbnQ9XCJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLThcIj4iKTsgLy8kTk9OLU5MUy0xJAorCQkJaHRtbExvZy5wcmludGxuKCI8dGl0bGU+SW5zdGFsbC1Mb2c8L3RpdGxlPiIpOyAvLyROT04tTkxTLTEkCisJCQlhZGRDU1MoKTsKKwkJCWh0bWxMb2cucHJpbnRsbigiPC9oZWFkPiIpOyAvLyROT04tTkxTLTEkCisJCQlodG1sTG9nLnByaW50bG4oIjxib2R5PiIpOyAvLyROT04tTkxTLTEkCisJCQlTdHJpbmcgdGl0bGUgPSBVcGRhdGVVSU1lc3NhZ2VzLkluc3RhbGxhdGlvbkhpc3RvcnlBY3Rpb25fdGl0bGU7IAorCQkJU3RyaW5nIGRlc2MgPSBVcGRhdGVVSU1lc3NhZ2VzLkluc3RhbGxhdGlvbkhpc3RvcnlBY3Rpb25fZGVzYzsgCisJCQlodG1sTG9nLnByaW50bG4oIjxoMSBjbGFzcz10aXRsZT4iK3RpdGxlKyI8L2gxPiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCWh0bWxMb2cucHJpbnRsbigiPHAgY2xhc3M9Ym9keVRleHQ+IitkZXNjKyI8L3A+Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCisJCQlodG1sTG9nLnByaW50bG4oIjxjZW50ZXI+Iik7IC8vJE5PTi1OTFMtMSQKKworCQkJaHRtbExvZy5wcmludGxuKCI8dGFibGUgd2lkdGggPTEwMCUgYm9yZGVyPTAgY2VsbHNwYWNpbmc9MSBjZWxscGFkZGluZz0yPiIpOyAvLyROT04tTkxTLTEkCisKKwkJCXdoaWxlIChidWZmUmVhZC5yZWFkeSgpKSB7CisKKwkJCQlodG1sQ29kZSA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoYnVmZlJlYWQucmVhZExpbmUoKSk7CisJCQkJd2hpbGUgKCEoaHRtbENvZGUuaGFzTW9yZUVsZW1lbnRzKCkpKSB7CisJCQkJCWlmICghYnVmZlJlYWQucmVhZHkoKSkKKwkJCQkJCXJldHVybjsKKwkJCQkJaHRtbENvZGUgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGJ1ZmZSZWFkLnJlYWRMaW5lKCkpOworCQkJCX0KKworCQkJCXR5cGUgPSBodG1sQ29kZS5uZXh0VG9rZW4oKTsKKwkJCQl0eXBlID0gdHlwZS5zdWJzdHJpbmcodHlwZS5pbmRleE9mKCIhIikgKyAxLCB0eXBlLmxlbmd0aCgpKTsgLy8kTk9OLU5MUy0xJAorCisJCQkJaWYgKHR5cGUuZXF1YWxzKEFDVElWSVRZKSkgeworCQkJCQl0YXJnZXQgPSAiIjsgLy8kTk9OLU5MUy0xJAorCQkJCQlEYXRlIGQgPSBuZXcgRGF0ZShuZXcgTG9uZyhodG1sQ29kZS5uZXh0VG9rZW4oKSkubG9uZ1ZhbHVlKCkpOworCQkJCQlEYXRlRm9ybWF0IGRmID0gRGF0ZUZvcm1hdC5nZXREYXRlVGltZUluc3RhbmNlKCk7CisJCQkJCWRhdGUgPSBkZi5mb3JtYXQoZCk7CisJCQkJCS8vIGlnbm9yZSBzdHJpbmcgZGF0ZQorCQkJCQlodG1sQ29kZS5uZXh0VG9rZW4oIi4iKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlodG1sQ29kZS5uZXh0VG9rZW4oIiAiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQl3aGlsZSAoaHRtbENvZGUuY291bnRUb2tlbnMoKSA+IDIpCisJCQkJCQl0YXJnZXQgPSB0YXJnZXQgKyAiICIgKyBodG1sQ29kZS5uZXh0VG9rZW4oKTsgLy8kTk9OLU5MUy0xJAorCisJCQkJCWFjdGlvbiA9IGh0bWxDb2RlLm5leHRUb2tlbigpOworCQkJCQlzdGF0dXMgPSBodG1sQ29kZS5uZXh0VG9rZW4oKTsKKworCQkJCQlhZGRBY3Rpdml0eShhY3Rpb24sIGRhdGUsIHN0YXR1cywgdGFyZ2V0KTsKKworCQkJCX0gZWxzZSB7CisJCQkJCWh0bWxMb2cucHJpbnRsbigpOworCQkJCQlodG1sTG9nLnByaW50bG4oCisJCQkJCQkiPHRyIGlkPXNlcGFyYXRvcj48dGQgY29sc3Bhbj00PjwvdGQ+PC90cj4iKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlodG1sTG9nLnByaW50bG4oKTsKKwkJCQkJRGF0ZSBkID0gbmV3IERhdGUobmV3IExvbmcoaHRtbENvZGUubmV4dFRva2VuKCkpLmxvbmdWYWx1ZSgpKTsKKwkJCQkJRGF0ZUZvcm1hdCBkZiA9IERhdGVGb3JtYXQuZ2V0RGF0ZVRpbWVJbnN0YW5jZSgpOworCQkJCQlkYXRlID0gZGYuZm9ybWF0KGQpOworLy8JCQkJCWRhdGUgPSAiIjsgLy8kTk9OLU5MUy0xJAorLy8JCQkJCXdoaWxlIChodG1sQ29kZS5jb3VudFRva2VucygpID4gMCkKKy8vCQkJCQkJZGF0ZSA9IGRhdGUgKyAiICIgKyBodG1sQ29kZS5uZXh0VG9rZW4oKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlhZGRDb25maWd1cmF0aW9uSGVhZGVyKGRhdGUpOworCQkJCQlhZGRBY3Rpdml0eUhlYWRlcigpOworCQkJCX0KKworCQkJfQorCQkJaHRtbExvZy5wcmludGxuKCI8L3RhYmxlPiIpOyAvLyROT04tTkxTLTEkCisJCQlodG1sTG9nLnByaW50bG4oIjwvYm9keT4iKTsgLy8kTk9OLU5MUy0xJAorCQkJaHRtbExvZy5wcmludGxuKCI8L2h0bWw+Iik7IC8vJE5PTi1OTFMtMSQKKwkJCWh0bWxMb2cuZmx1c2goKTsKKworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJdGhyb3dDb3JlRXhjZXB0aW9uKGUpOworCQl9CisKKwl9CisKKwlwcml2YXRlIHZvaWQgYWRkQWN0aXZpdHkoCisJCVN0cmluZyB0eXBlLAorCQlTdHJpbmcgZGF0ZSwKKwkJU3RyaW5nIHN0YXR1cywKKwkJU3RyaW5nIHRhcmdldCkgeworCQlodG1sTG9nLnByaW50KCI8dHIgY2xhc3M9IiArIHJvd1R5cGUgKyAiPiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJaHRtbExvZy5wcmludCgiPHRkIGNsYXNzPWxvZy10ZXh0IHdpZHRoPTMwJT4iKTsgLy8kTk9OLU5MUy0xJAorCQlodG1sTG9nLnByaW50KGRhdGUpOworCQlodG1sTG9nLnByaW50bG4oIjwvdGQ+Iik7IC8vJE5PTi1OTFMtMSQKKwkJaHRtbExvZy5wcmludCgiPHRkIGNsYXNzPWxvZy10ZXh0IHdpZHRoPTQwJT4iKTsgLy8kTk9OLU5MUy0xJAorCQlodG1sTG9nLnByaW50KHRhcmdldCk7CisJCWh0bWxMb2cucHJpbnRsbigiPC90ZD4iKTsgLy8kTk9OLU5MUy0xJAorCQlodG1sTG9nLnByaW50KCI8dGQgY2xhc3M9bG9nLXRleHQgd2lkdGg9MjAlPiIpOyAvLyROT04tTkxTLTEkCisJCWh0bWxMb2cucHJpbnQodHlwZSk7CisJCWh0bWxMb2cucHJpbnRsbigiPC90ZD4iKTsgLy8kTk9OLU5MUy0xJAorCQlodG1sTG9nLnByaW50KCI8dGQgY2xhc3M9bG9nLXRleHQgd2lkdGg9MTAlPiIpOyAvLyROT04tTkxTLTEkCisJCWh0bWxMb2cucHJpbnQoc3RhdHVzKTsKKwkJaHRtbExvZy5wcmludGxuKCI8L3RkPjwvdHI+Iik7IC8vJE5PTi1OTFMtMSQKKwkJdG9nZ2xlUm93Q29sb3IoKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgYWRkQ1NTKCkgeworCQlodG1sTG9nLnByaW50bG4oIjxTVFlMRSB0eXBlPVwidGV4dC9jc3NcIj4iKTsgLy8kTk9OLU5MUy0xJAorCQlodG1sTG9nLnByaW50bG4oIkgxLnRpdGxlIHsgZm9udC1mYW1pbHk6IHNhbnMtc2VyaWY7IGNvbG9yOiAjOTlBQUNDIH0iKTsgLy8kTk9OLU5MUy0xJAorCQlodG1sTG9nLnByaW50bG4oIlAuYm9keVRleHQgeyBmb250LWZhbWlseTogc2Fucy1zZXJpZjsgZm9udC1zaXplOiA5cHQ7IH0iKTsgLy8kTk9OLU5MUy0xJAorCQlodG1sTG9nLnByaW50bG4oCisJCQkiVEQubG9nLWhlYWRlciB7IGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmOyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBib2xkOyBmb250LXNpemU6IDlwdDsgY29sb3I6IHdoaXRlfSIpOyAvLyROT04tTkxTLTEkCisJCWh0bWxMb2cucHJpbnRsbigKKwkJCSJURC5sb2ctdGV4dCB7IGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmOyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBsaWdodGVyOyBmb250LXNpemU6IDhwdDsgY29sb3I6YmxhY2t9Iik7IC8vJE5PTi1OTFMtMSQKKwkJaHRtbExvZy5wcmludGxuKAorCQkvLwkiVEQuY29uZmlnLWxvZy1oZWFkZXIgeyBmb250LWZhbWlseTogc2Fucy1zZXJpZjsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXdlaWdodDogYm9sZDsgZm9udC1zaXplOiA5cHQ7IGNvbG9yOiB3aGl0ZTsgO3RleHQtYWxpZ246IHJpZ2h0OyBib3JkZXItdG9wOjEwcHggc29saWQgd2hpdGV9Iik7CisJCSJURC5jb25maWctbG9nLWhlYWRlciB7IGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmOyBmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBib2xkOyBmb250LXNpemU6IDlwdDsgY29sb3I6IHdoaXRlOyBib3JkZXItdG9wOjEwcHggc29saWQgd2hpdGV9Iik7IC8vJE5PTi1OTFMtMSQKKwkJaHRtbExvZy5wcmludGxuKCJUUi5saWdodC1yb3cge2JhY2tncm91bmQ6IiArIHdoaXRlICsgIn0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCWh0bWxMb2cucHJpbnRsbigiVFIuZGFyay1yb3cge2JhY2tncm91bmQ6IiArIGxpZ2h0Qmx1ZSArICJ9Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQlodG1sTG9nLnByaW50bG4oIlRSLmhlYWRlciB7YmFja2dyb3VuZDoiICsgZGFya0JsdWUgKyAifSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJaHRtbExvZy5wcmludGxuKCI8L1NUWUxFPiIpOyAvLyROT04tTkxTLTEkCisJfQorCisJcHJpdmF0ZSB2b2lkIGFkZEFjdGl2aXR5SGVhZGVyKCkgeworCQlodG1sTG9nLnByaW50KCI8dHIgY2xhc3M9aGVhZGVyPiIpOyAvLyROT04tTkxTLTEkCisJCWh0bWxMb2cucHJpbnQoIjx0ZCBjbGFzcz1sb2ctaGVhZGVyPiIpOyAvLyROT04tTkxTLTEkCisJCWh0bWxMb2cucHJpbnQoVXBkYXRlVUlNZXNzYWdlcy5JbnN0YWxsYXRpb25IaXN0b3J5QWN0aW9uX2RhdGVUaW1lKTsgCisJCWh0bWxMb2cucHJpbnQoIjwvdGQ+Iik7IC8vJE5PTi1OTFMtMSQKKwkJaHRtbExvZy5wcmludCgiPHRkIGNsYXNzPWxvZy1oZWFkZXI+Iik7IC8vJE5PTi1OTFMtMSQKKwkJaHRtbExvZy5wcmludChVcGRhdGVVSU1lc3NhZ2VzLkluc3RhbGxhdGlvbkhpc3RvcnlBY3Rpb25fdGFyZ2V0KTsgCisJCWh0bWxMb2cucHJpbnQoIjwvdGQ+Iik7IC8vJE5PTi1OTFMtMSQKKwkJaHRtbExvZy5wcmludCgiPHRkIGNsYXNzPWxvZy1oZWFkZXI+Iik7IC8vJE5PTi1OTFMtMSQKKwkJaHRtbExvZy5wcmludChVcGRhdGVVSU1lc3NhZ2VzLkluc3RhbGxhdGlvbkhpc3RvcnlBY3Rpb25fYWN0aW9uKTsgCisJCWh0bWxMb2cucHJpbnQoIjwvdGQ+Iik7IC8vJE5PTi1OTFMtMSQKKwkJaHRtbExvZy5wcmludCgiPHRkIGNsYXNzPWxvZy1oZWFkZXI+Iik7IC8vJE5PTi1OTFMtMSQKKwkJaHRtbExvZy5wcmludChVcGRhdGVVSU1lc3NhZ2VzLkluc3RhbGxhdGlvbkhpc3RvcnlBY3Rpb25fc3RhdHVzKTsgCisJCWh0bWxMb2cucHJpbnRsbigiPC90ZD48L3RyPiIpOyAvLyROT04tTkxTLTEkCisJfQorCisJcHJpdmF0ZSB2b2lkIGFkZENvbmZpZ3VyYXRpb25IZWFkZXIoU3RyaW5nIGRhdGUpIHsKKwkJaWYgKGRhdGUgPT0gbnVsbCkKKwkJCXJldHVybjsKKworCQlodG1sTG9nLnByaW50KCI8dHIgY2xhc3M9aGVhZGVyPiIpOyAvLyROT04tTkxTLTEkCisJCWh0bWxMb2cucHJpbnQoIjx0ZCBjbGFzcz1jb25maWctbG9nLWhlYWRlciBjb2xzcGFuPTQ+Iik7IC8vJE5PTi1OTFMtMSQKKwkJaHRtbExvZy5wcmludChkYXRlKTsKKwkJaHRtbExvZy5wcmludGxuKCI8L3RkPjwvdHI+Iik7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwlwcml2YXRlIHZvaWQgdG9nZ2xlUm93Q29sb3IoKSB7CisJCWlmIChyb3dUeXBlLmVxdWFscygibGlnaHQtcm93IikpIC8vJE5PTi1OTFMtMSQKKwkJCXJvd1R5cGUgPSAiZGFyay1yb3ciOyAvLyROT04tTkxTLTEkCisJCWVsc2UKKwkJCXJvd1R5cGUgPSAibGlnaHQtcm93IjsgLy8kTk9OLU5MUy0xJAorCX0KKworCXByaXZhdGUgdm9pZCB0aHJvd0NvcmVFeGNlcHRpb24oVGhyb3dhYmxlIGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oCisJCQluZXcgU3RhdHVzKAorCQkJCUlTdGF0dXMuRVJST1IsCisJCQkJVXBkYXRlVUkuZ2V0UGx1Z2luSWQoKSwKKwkJCQlJU3RhdHVzLkVSUk9SLAorCQkJCVVwZGF0ZVVJTWVzc2FnZXMuSW5zdGFsbGF0aW9uSGlzdG9yeUFjdGlvbl9lcnJvcnMsIAorCQkJCWUpKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgY2xvc2VMb2coKSB7CisJCXRyeSB7CisJCQlpZiAoYnVmZlJlYWQgIT0gbnVsbCkKKwkJCQlidWZmUmVhZC5jbG9zZSgpOworCQkJaWYgKGh0bWxMb2cgIT0gbnVsbCkKKwkJCQlodG1sTG9nLmNsb3NlKCk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJfSBmaW5hbGx5IHsKKwkJCWJ1ZmZSZWFkID0gbnVsbDsKKwkJCWh0bWxMb2cgPSBudWxsOworCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvTWFuYWdlQ29uZmlndXJhdGlvbkhhbmRsZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9NYW5hZ2VDb25maWd1cmF0aW9uSGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViYjI3MzYKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvTWFuYWdlQ29uZmlndXJhdGlvbkhhbmRsZXIuamF2YQpAQCAtMCwwICsxLDMyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnZpZXdzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhhbmRsZXJzLkhhbmRsZXJVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5VcGRhdGVNYW5hZ2VyVUk7CisKKy8qKgorICogVGhpcyBoYW5kbGVyIGlzIGhvb2tlZCB0byBhIGNvbW1hbmQgcHJvdmlkZWQgYnkgdGhlIGFwcGxpY2F0aW9uIChzdWNoCisgKiBhcyBvcmcuZWNsaXBzZS51aS5pZGUpLiBUaGlzIGFsbG93cyBSQ1AgYXBwbGljYXRpb25zIHRvIGNvbnRyb2wgaG93IHVwZGF0ZQorICogZnVuY3Rpb25hbGl0eSBpcyBzdXJmYWNlZC4KKyAqLworcHVibGljIGNsYXNzIE1hbmFnZUNvbmZpZ3VyYXRpb25IYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIHsKKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuQWJzdHJhY3RIYW5kbGVyI2V4ZWN1dGUob3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FdmVudCkKKwkgKi8KKwlwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoRXhlY3V0aW9uRXZlbnQgZXZlbnQpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24geworCQlVcGRhdGVNYW5hZ2VyVUkub3BlbkNvbmZpZ3VyYXRpb25NYW5hZ2VyKEhhbmRsZXJVdGlsLmdldEFjdGl2ZVNoZWxsKGV2ZW50KSk7CisJCXJldHVybiBudWxsOworCX0KKworfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL05ld0V4dGVuc2lvbkxvY2F0aW9uQWN0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvTmV3RXh0ZW5zaW9uTG9jYXRpb25BY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDIxZWNkCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL05ld0V4dGVuc2lvbkxvY2F0aW9uQWN0aW9uLmphdmEKQEAgLTAsMCArMSwxMTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkudmlld3M7CisKK2ltcG9ydCBqYXZhLmlvLio7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy4qOworCitwdWJsaWMgY2xhc3MgTmV3RXh0ZW5zaW9uTG9jYXRpb25BY3Rpb24gZXh0ZW5kcyBBY3Rpb24geworICAgIHByaXZhdGUgU2hlbGwgc2hlbGw7CisgICAgCisJcHVibGljIE5ld0V4dGVuc2lvbkxvY2F0aW9uQWN0aW9uKFNoZWxsIHNoZWxsLCBTdHJpbmcgdGV4dCwgSW1hZ2VEZXNjcmlwdG9yIGRlc2MpIHsKKwkJc3VwZXIodGV4dCwgZGVzYyk7CisgICAgICAgIHRoaXMuc2hlbGwgPSBzaGVsbDsKKwl9CisKKwlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQorCQlJU3RhdHVzIHN0YXR1cyA9IE9wZXJhdGlvbnNNYW5hZ2VyLmdldFZhbGlkYXRvcigpLnZhbGlkYXRlUGxhdGZvcm1Db25maWdWYWxpZCgpOworCQlpZiAoc3RhdHVzICE9IG51bGwpIHsKKwkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgbnVsbCwgbnVsbCwgc3RhdHVzKTsKKwkJCXJldHVybjsKKwkJfQorCQkKKwkJRGlyZWN0b3J5RGlhbG9nIGRpYWxvZyA9CisJCQluZXcgRGlyZWN0b3J5RGlhbG9nKHNoZWxsLCBTV1QuQVBQTElDQVRJT05fTU9EQUwpOworCQlkaWFsb2cuc2V0TWVzc2FnZShVcGRhdGVVSU1lc3NhZ2VzLk5ld0V4dGVuc2lvbkxvY2F0aW9uQWN0aW9uX3NlbGVjdEV4dExvY2F0aW9uKTsgCisKKwkJU3RyaW5nIGRpciA9IGRpYWxvZy5vcGVuKCk7CisJCXdoaWxlIChkaXIgIT0gbnVsbCkgeworCQkJRmlsZSBkaXJGaWxlID0gZ2V0RXh0ZW5zaW9uU2l0ZShuZXcgRmlsZShkaXIpKTsKKwkJCWlmIChkaXJGaWxlICE9IG51bGwpIHsKKwkJCQlpZiAoYWRkRXh0ZW5zaW9uTG9jYXRpb24oZGlyRmlsZSkpCisJCQkJCXJldHVybjsKKwkJCQllbHNlIHsKKwkJCQkJLy8gcmUtb3BlbiB0aGUgZGlyZWN0b3J5IGRpYWxvZworCQkJCQlkaWFsb2cuc2V0RmlsdGVyUGF0aChkaXIpOworCQkJCQlkaXIgPSBkaWFsb2cub3BlbigpOworCQkJCX0JCisJCQl9IGVsc2UgeworCQkJCU1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKAorCQkJCQlzaGVsbCwKKwkJCQkJVXBkYXRlVUlNZXNzYWdlcy5OZXdFeHRlbnNpb25Mb2NhdGlvbkFjdGlvbl9leHRJbmZvVGl0bGUsIAorCQkJCQlVcGRhdGVVSU1lc3NhZ2VzLk5ld0V4dGVuc2lvbkxvY2F0aW9uQWN0aW9uX2V4dEluZm9NZXNzYWdlKTsgCisJCQkJLy8gcmUtb3BlbiB0aGUgZGlyZWN0b3J5IGRpYWxvZworCQkJCWRpYWxvZy5zZXRGaWx0ZXJQYXRoKGRpcik7CisJCQkJZGlyID0gZGlhbG9nLm9wZW4oKTsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIEBwYXJhbSBkaXJlY3RvcnkKKwkgKiBAcmV0dXJuIHRoZSBzaXRlIGZpbGUgKGluY2x1ZGluZyAiZWNsaXBzZSIgcGF0aCkgd2hlbiBkaXJlY3RvcnkgaXMgYW4gZWNsaXBzZSBleHN0ZW5zaW9uLCBudWxsIG90aGVyd2lzZQorCSAqLworCXN0YXRpYyBGaWxlIGdldEV4dGVuc2lvblNpdGUoRmlsZSBkaXJlY3RvcnkpIHsKKwkJLy8gQ2hlY2sgdGhlIGVjbGlwc2UgZm9sZGVyCisJCWlmIChkaXJlY3RvcnkuZ2V0TmFtZSgpLmVxdWFscygiZWNsaXBzZSIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCS8vIGlmIHdlIHBpY2tlZCB1cCB0aGUgZWNsaXBzZSBkaXJlY3RvcnksIGNoZWNrIGlmIGl0cyBwYXJlbnQgaXMgYSBzaXRlCisJCQlGaWxlIHNpdGUgPSBnZXRFeHRlbnNpb25TaXRlKGRpcmVjdG9yeS5nZXRQYXJlbnRGaWxlKCkpOworCQkJaWYgKHNpdGUgIT0gbnVsbCkKKwkJCQlyZXR1cm4gZGlyZWN0b3J5OworCQkJLy8gb3RoZXJ3aXNlLCBmYWxsIHRocm91Z2gKKwkJfQorCQkKKwkJRmlsZSBlY2xpcHNlID0gbmV3IEZpbGUoZGlyZWN0b3J5LCAiZWNsaXBzZSIpOyAvLyROT04tTkxTLTEkCisJCWlmICghZWNsaXBzZS5leGlzdHMoKSB8fCAhZWNsaXBzZS5pc0RpcmVjdG9yeSgpKQorCQkJcmV0dXJuIG51bGw7CisKKwkJLy8gY2hlY2sgdGhlIG1hcmtlcgorCQlGaWxlIG1hcmtlciA9IG5ldyBGaWxlKGVjbGlwc2UsICIuZWNsaXBzZWV4dGVuc2lvbiIpOyAvLyROT04tTkxTLTEkCisJCWlmICghbWFya2VyLmV4aXN0cygpIHx8IG1hcmtlci5pc0RpcmVjdG9yeSgpKQorCQkJcmV0dXJuIG51bGw7CisJCXJldHVybiBlY2xpcHNlOworCX0KKworCXByaXZhdGUgYm9vbGVhbiBhZGRFeHRlbnNpb25Mb2NhdGlvbihGaWxlIGRpcikgeworCQl0cnkgeworCQkJSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZyA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCk7CisJCQlJQ29uZmlndXJlZFNpdGUgY3NpdGUgPSBjb25maWcuY3JlYXRlTGlua2VkQ29uZmlndXJlZFNpdGUoZGlyKTsKKwkJCWNzaXRlLnZlcmlmeVVwZGF0YWJsZVN0YXR1cygpOworCQkJY29uZmlnLmFkZENvbmZpZ3VyZWRTaXRlKGNzaXRlKTsKKwkJCWJvb2xlYW4gcmVzdGFydE5lZWRlZCA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpLnNhdmUoKTsKKwkJCVVwZGF0ZVVJLnJlcXVlc3RSZXN0YXJ0KHJlc3RhcnROZWVkZWQpOworCQkJcmV0dXJuIHRydWU7CisJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJU3RyaW5nIHRpdGxlID0gVXBkYXRlVUlNZXNzYWdlcy5JbnN0YWxsV2l6YXJkX1RhcmdldFBhZ2VfbG9jYXRpb25fZXJyb3JfdGl0bGU7IAorCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKHNoZWxsLCB0aXRsZSwgbnVsbCwgZS5nZXRTdGF0dXMoKSk7CisJCQlVcGRhdGVVSS5sb2dFeGNlcHRpb24oZSxmYWxzZSk7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9CisKK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9SZXBsYWNlVmVyc2lvbkFjdGlvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL1JlcGxhY2VWZXJzaW9uQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdiMGM4ZQotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9SZXBsYWNlVmVyc2lvbkFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkudmlld3M7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLndpemFyZHMuUmVwbGFjZUZlYXR1cmVWZXJzaW9uV2l6YXJkOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLio7CisKK3B1YmxpYyBjbGFzcyBSZXBsYWNlVmVyc2lvbkFjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisJCisJcHJpdmF0ZSBJRmVhdHVyZSBjdXJyZW50RmVhdHVyZTsKKwlwcml2YXRlIElGZWF0dXJlW10gZmVhdHVyZXM7CisJcHJpdmF0ZSBTaGVsbCBzaGVsbDsKKyAgICAKKwlwdWJsaWMgUmVwbGFjZVZlcnNpb25BY3Rpb24oU2hlbGwgc2hlbGwsIFN0cmluZyB0ZXh0KSB7CisJCXN1cGVyKHRleHQpOworICAgICAgICB0aGlzLnNoZWxsID0gc2hlbGw7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldEN1cnJlbnRGZWF0dXJlKElGZWF0dXJlIGZlYXR1cmUpIHsKKwkJY3VycmVudEZlYXR1cmUgPSBmZWF0dXJlOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRGZWF0dXJlcyhJRmVhdHVyZVtdIGZlYXR1cmVzKSB7CisJCXRoaXMuZmVhdHVyZXMgPSBmZWF0dXJlczsKKwl9CisJCQorCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJaWYgKGN1cnJlbnRGZWF0dXJlID09IG51bGwgfHwgZmVhdHVyZXMgPT0gbnVsbCB8fCBmZWF0dXJlcy5sZW5ndGggPCAyKQorCQkJcmV0dXJuOworCQkJCisJCUlTdGF0dXMgc3RhdHVzID0gT3BlcmF0aW9uc01hbmFnZXIuZ2V0VmFsaWRhdG9yKCkudmFsaWRhdGVQbGF0Zm9ybUNvbmZpZ1ZhbGlkKCk7CisJCWlmIChzdGF0dXMgIT0gbnVsbCkgeworCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKHNoZWxsLCBudWxsLCBudWxsLCBzdGF0dXMpOworCQkJcmV0dXJuOworCQl9CisJCQorCQlSZXBsYWNlRmVhdHVyZVZlcnNpb25XaXphcmQgd2l6YXJkID0gbmV3IFJlcGxhY2VGZWF0dXJlVmVyc2lvbldpemFyZChjdXJyZW50RmVhdHVyZSwgZmVhdHVyZXMpOworCQlXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhzaGVsbCwgd2l6YXJkKTsKKwkJZGlhbG9nLmNyZWF0ZSgpOworCQlkaWFsb2cuZ2V0U2hlbGwoKS5zZXRUZXh0KHNoZWxsLmdldFRleHQoKSk7CisJCWRpYWxvZy5nZXRTaGVsbCgpLnNldFNpemUoNDAwLDQwMCk7CisJCWRpYWxvZy5vcGVuKCk7CisJfQorCisKK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9SZXZlcnRDb25maWd1cmF0aW9uQWN0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvUmV2ZXJ0Q29uZmlndXJhdGlvbkFjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwZDQwODAKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvUmV2ZXJ0Q29uZmlndXJhdGlvbkFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkudmlld3M7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLio7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkud2l6YXJkcy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLio7CisKK3B1YmxpYyBjbGFzcyBSZXZlcnRDb25maWd1cmF0aW9uQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKKyAgICBwcml2YXRlIFNoZWxsIHNoZWxsOworICAgIAorCXB1YmxpYyBSZXZlcnRDb25maWd1cmF0aW9uQWN0aW9uKFNoZWxsIHNoZWxsLCBTdHJpbmcgdGV4dCkgeworCQlzdXBlcih0ZXh0KTsKKyAgICAgICAgdGhpcy5zaGVsbCA9IHNoZWxsOworCX0KKwkKKwlwdWJsaWMgdm9pZCBydW4oKSB7CisJCUlTdGF0dXMgc3RhdHVzID0gT3BlcmF0aW9uc01hbmFnZXIuZ2V0VmFsaWRhdG9yKCkudmFsaWRhdGVQbGF0Zm9ybUNvbmZpZ1ZhbGlkKCk7CisJCWlmIChzdGF0dXMgIT0gbnVsbCkgeworCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKHNoZWxsLCBudWxsLCBudWxsLCBzdGF0dXMpOworCQkJcmV0dXJuOworCQl9CisJCQorCQlSZXZlcnRDb25maWd1cmF0aW9uV2l6YXJkIHdpemFyZCA9IG5ldyBSZXZlcnRDb25maWd1cmF0aW9uV2l6YXJkKCk7CisJCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKHNoZWxsLCB3aXphcmQpOworCQlkaWFsb2cuY3JlYXRlKCk7CisJCWRpYWxvZy5nZXRTaGVsbCgpLnNldFRleHQoc2hlbGwuZ2V0VGV4dCgpKTsKKwkJZGlhbG9nLmdldFNoZWxsKCkuc2V0U2l6ZSg2MDAsNTAwKTsKKwkJZGlhbG9nLm9wZW4oKTsKKwl9Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvU2hvd0FjdGl2aXRpZXNBY3Rpb24uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9TaG93QWN0aXZpdGllc0FjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwZjQ3YmMKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvU2hvd0FjdGl2aXRpZXNBY3Rpb24uamF2YQpAQCAtMCwwICsxLDMyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnZpZXdzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUlNZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkud2l6YXJkcy5TaG93QWN0aXZpdGllc0RpYWxvZzsKKworcHVibGljIGNsYXNzIFNob3dBY3Rpdml0aWVzQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKKwlTaGVsbCBzaGVsbDsKKwkKKwlwdWJsaWMgU2hvd0FjdGl2aXRpZXNBY3Rpb24oU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZyB0ZXh0KSB7CisJCXN1cGVyKHRleHQpOworCQl0aGlzLnNoZWxsID0gcGFyZW50U2hlbGw7CisJfQorCQorCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJU2hvd0FjdGl2aXRpZXNEaWFsb2cgZGlhbG9nID0gbmV3IFNob3dBY3Rpdml0aWVzRGlhbG9nKHNoZWxsKTsKKwkJZGlhbG9nLmNyZWF0ZSgpOworCQlkaWFsb2cuZ2V0U2hlbGwoKS5zZXRUZXh0KFVwZGF0ZVVJTWVzc2FnZXMuU2hvd0FjdGl2aXRpZXNEaWFsb2dfdGl0bGUpOyAKKwkJZGlhbG9nLm9wZW4oKTsKKwl9Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvU2l0ZVN0YXRlQWN0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvU2l0ZVN0YXRlQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY1ZjAwNgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9TaXRlU3RhdGVBY3Rpb24uamF2YQpAQCAtMCwwICsxLDc3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnZpZXdzOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuKjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy4qOworCisvKioKKyAqIFRvZ2dsZXMgYSBzaXRlJ3MgZW5hYmxlZCBzdGF0ZQorICovCisKK3B1YmxpYyBjbGFzcyBTaXRlU3RhdGVBY3Rpb24gZXh0ZW5kcyBBY3Rpb24geworCXByaXZhdGUgSUNvbmZpZ3VyZWRTaXRlIHNpdGU7CisgICAgcHJpdmF0ZSBTaGVsbCBzaGVsbDsKKworCXB1YmxpYyBTaXRlU3RhdGVBY3Rpb24oU2hlbGwgc2hlbGwpIHsKKyAgICAgICAgdGhpcy5zaGVsbCA9IHNoZWxsOworCX0KKworCXB1YmxpYyB2b2lkIHNldFNpdGUoSUNvbmZpZ3VyZWRTaXRlIHNpdGUpIHsKKwkJdGhpcy5zaXRlID0gc2l0ZTsKKwkJYm9vbGVhbiBzdGF0ZSA9IHNpdGUuaXNFbmFibGVkKCk7CisJCXNldFRleHQoc3RhdGUgPyBVcGRhdGVVSU1lc3NhZ2VzLlNpdGVTdGF0ZUFjdGlvbl9kaXNhYmxlTGFiZWwgOiBVcGRhdGVVSU1lc3NhZ2VzLlNpdGVTdGF0ZUFjdGlvbl9lbmFibGVMYWJlbCk7IAorCX0KKworCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJdHJ5IHsKKwkJCWlmIChzaXRlID09IG51bGwpCisJCQkJcmV0dXJuOworCQkJCisJCQlJU3RhdHVzIHN0YXR1cyA9IE9wZXJhdGlvbnNNYW5hZ2VyLmdldFZhbGlkYXRvcigpLnZhbGlkYXRlUGxhdGZvcm1Db25maWdWYWxpZCgpOworCQkJaWYgKHN0YXR1cyAhPSBudWxsKSB7CisJCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKHNoZWxsLCBudWxsLCBudWxsLCBzdGF0dXMpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCQorCQkJYm9vbGVhbiBvbGRWYWx1ZSA9IHNpdGUuaXNFbmFibGVkKCk7CisJCQlpZiAoIWNvbmZpcm0oIW9sZFZhbHVlKSkKKwkJCQlyZXR1cm47CisJCQkKKwkJCUlPcGVyYXRpb24gdG9nZ2xlU2l0ZU9wZXJhdGlvbiA9IE9wZXJhdGlvbnNNYW5hZ2VyLmdldE9wZXJhdGlvbkZhY3RvcnkoKS5jcmVhdGVUb2dnbGVTaXRlT3BlcmF0aW9uKHNpdGUpOworCQkJYm9vbGVhbiByZXN0YXJ0TmVlZGVkID0gdG9nZ2xlU2l0ZU9wZXJhdGlvbi5leGVjdXRlKG51bGwsIG51bGwpOworCQkJCQkKKwkJCVVwZGF0ZVVJLnJlcXVlc3RSZXN0YXJ0KHJlc3RhcnROZWVkZWQpOworCisJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgRXJyb3JEaWFsb2cub3BlbkVycm9yKHNoZWxsLCBudWxsLCBudWxsLCBlLmdldFN0YXR1cygpKTsKKwkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7CisJCQlVcGRhdGVVSS5sb2dFeGNlcHRpb24oZSk7CisJCX0KKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gY29uZmlybShib29sZWFuIG5ld1N0YXRlKSB7CisJCVN0cmluZyBuYW1lID0gc2l0ZS5nZXRTaXRlKCkuZ2V0VVJMKCkudG9TdHJpbmcoKTsKKwkJU3RyaW5nIGVuYWJsZU1lc3NhZ2UgPSBOTFMuYmluZChVcGRhdGVVSU1lc3NhZ2VzLlNpdGVTdGF0ZUFjdGlvbl9lbmFibGVNZXNzYWdlLCBuYW1lKTsKKwkJU3RyaW5nIGRpc2FibGVNZXNzYWdlID0gTkxTLmJpbmQoVXBkYXRlVUlNZXNzYWdlcy5TaXRlU3RhdGVBY3Rpb25fZGlzYWJsZU1lc3NhZ2UsIG5hbWUpOworCisJCVN0cmluZyBtZXNzYWdlID0gbmV3U3RhdGUgPyBlbmFibGVNZXNzYWdlIDogZGlzYWJsZU1lc3NhZ2U7CisJCXJldHVybiBNZXNzYWdlRGlhbG9nLm9wZW5Db25maXJtKHNoZWxsLCBVcGRhdGVVSU1lc3NhZ2VzLlNpdGVTdGF0ZUFjdGlvbl9kaWFsb2dUaXRsZSwgbWVzc2FnZSk7IAorCX0KK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9VbmNvbmZpZ3VyZUFuZFVuaW5zdGFsbEZlYXR1cmVBY3Rpb24uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9VbmNvbmZpZ3VyZUFuZFVuaW5zdGFsbEZlYXR1cmVBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODU1M2Q1Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL1VuY29uZmlndXJlQW5kVW5pbnN0YWxsRmVhdHVyZUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsOTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkudmlld3M7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLkluc3RhbGxSZWdpc3RyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwub3BlcmF0aW9ucy5PcGVyYXRpb25GYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zLlVwZGF0ZVV0aWxzOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUlNZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWwuQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLklGZWF0dXJlT3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLklPcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuT3BlcmF0aW9uc01hbmFnZXI7CisKK3B1YmxpYyBjbGFzcyBVbmNvbmZpZ3VyZUFuZFVuaW5zdGFsbEZlYXR1cmVBY3Rpb24gZXh0ZW5kcyBGZWF0dXJlQWN0aW9uIHsKKworCXByaXZhdGUgQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyIGFkYXB0ZXI7CisKKwlwdWJsaWMgVW5jb25maWd1cmVBbmRVbmluc3RhbGxGZWF0dXJlQWN0aW9uKFNoZWxsIHNoZWxsLCBTdHJpbmcgdGV4dCkgeworCQlzdXBlcihzaGVsbCwgdGV4dCk7CisJCXNldFdpbmRvd1RpdGxlKFVwZGF0ZVVJTWVzc2FnZXMuRmVhdHVyZVVuY29uZmlndXJlQW5kVW5pbnN0YWxsQWN0aW9uX2RpYWxvZ1RpdGxlKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBydW4oKSB7CisJCXRyeSB7CisJCQlJU3RhdHVzIHN0YXR1cyA9IE9wZXJhdGlvbnNNYW5hZ2VyLmdldFZhbGlkYXRvcigpLnZhbGlkYXRlUGxhdGZvcm1Db25maWdWYWxpZCgpOworCQkJaWYgKHN0YXR1cyAhPSBudWxsKQorCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1cyk7CisJCQkKKwkJCWlmIChhZGFwdGVyID09IG51bGwgfHwgIWNvbmZpcm0oVXBkYXRlVUlNZXNzYWdlcy5GZWF0dXJlVW5jb25maWd1cmVBbmRVbmluc3RhbGxBY3Rpb25fcXVlc3Rpb24pKSAKKwkJCQlyZXR1cm47CisKKwkJCS8vIElmIGN1cnJlbnQgY29uZmlnIGlzIGJyb2tlbiwgY29uZmlybSB3aXRoIHRoZSB1c2VyIHRvIGNvbnRpbnVlCisJCQlpZiAoT3BlcmF0aW9uc01hbmFnZXIuZ2V0VmFsaWRhdG9yKCkudmFsaWRhdGVDdXJyZW50U3RhdGUoKSAhPSBudWxsICYmCisJCQkJCSFjb25maXJtKFVwZGF0ZVVJTWVzc2FnZXMuQWN0aW9uc19icm9rZW5Db25maWdRdWVzdGlvbikpIAorCQkJCXJldHVybjsKKworCQkJSU9wZXJhdGlvbiBvcGVyYXRpb24gPQorCQkJCSgoT3BlcmF0aW9uRmFjdG9yeSlPcGVyYXRpb25zTWFuYWdlci5nZXRPcGVyYXRpb25GYWN0b3J5KCkpLmNyZWF0ZVVuY29uZmlndXJlQW5kVW5pbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiggYWRhcHRlci5nZXRDb25maWd1cmVkU2l0ZSgpLCBhZGFwdGVyLmdldEZlYXR1cmUobnVsbCkpOworCisJCQlib29sZWFuIHJlc3RhcnROZWVkZWQgPSBvcGVyYXRpb24uZXhlY3V0ZShudWxsLCBudWxsKTsKKwkJCVVwZGF0ZVVJLnJlcXVlc3RSZXN0YXJ0KHJlc3RhcnROZWVkZWQpOworCisJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKHNoZWxsLCBudWxsLCBudWxsLCBlLmdldFN0YXR1cygpKTsKKwkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7CisJCQkvLyBUaGlzIHNob3VsZCBub3QgaGFwcGVuCisJCQlVcGRhdGVVdGlscy5sb2dFeGNlcHRpb24oZS5nZXRUYXJnZXRFeGNlcHRpb24oKSk7CisJCX0KKwl9CisKKworCisJcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgeworCQkKKwkJdGhpcy5hZGFwdGVyID0gKENvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlcikgc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOworCQlzZXRUZXh0KFVwZGF0ZVVJTWVzc2FnZXMuRmVhdHVyZVVuY29uZmlndXJlQW5kVW5pbnN0YWxsQWN0aW9uX3VuaW5zdGFsbCk7IAorCX0KKwkKKwkKKwlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlQWN0aW9uKCkgeworCQlpZiAoYWRhcHRlciA9PSBudWxsKQorCQkJcmV0dXJuIGZhbHNlOworCQkKKwkJaWYgKCFhZGFwdGVyLmlzQ29uZmlndXJlZCgpKQorCQkJcmV0dXJuIGZhbHNlOworCQkKKwkJdHJ5IHsKKwkJCS8vIGNoZWNrIGZvciBwZW5kaW5nIGNoYW5nZXMgKGUuZy4gaWYgdGhlIGZlYXR1cmUgaGFzIGp1c3QgYmVlbiBkaXNhYmxlZCkKKwkJCUlGZWF0dXJlT3BlcmF0aW9uIHBlbmRpbmdPcGVyYXRpb24gPSBPcGVyYXRpb25zTWFuYWdlci5maW5kUGVuZGluZ09wZXJhdGlvbihhZGFwdGVyLmdldEZlYXR1cmUobnVsbCkpOworCQkJaWYgKHBlbmRpbmdPcGVyYXRpb24gIT0gbnVsbCkKKwkJCQlyZXR1cm4gZmFsc2U7CisKKwkJCWlmIChJbnN0YWxsUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXQoImZlYXR1cmVfIithZGFwdGVyLmdldEZlYXR1cmUobnVsbCkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpKSA9PSBudWxsKSAvLyROT04tTkxTLTEkCisJCQkJcmV0dXJuIGZhbHNlOworCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQkJCQorCQlyZXR1cm4gdHJ1ZTsJCisJfQorfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL1VuY29uZmlndXJlQW5kVW5pbnN0YWxsRmVhdHVyZXNBY3Rpb24uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9VbmNvbmZpZ3VyZUFuZFVuaW5zdGFsbEZlYXR1cmVzQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q1YTc1OAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9VbmNvbmZpZ3VyZUFuZFVuaW5zdGFsbEZlYXR1cmVzQWN0aW9uLmphdmEKQEAgLTAsMCArMSwxMDkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkudmlld3M7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLklDb25maWd1cmVkU2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5JbnN0YWxsUmVnaXN0cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm9wZXJhdGlvbnMuT3BlcmF0aW9uRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwub3BlcmF0aW9ucy5VcGRhdGVVdGlsczsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUk7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsLkNvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy5JRmVhdHVyZU9wZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy5JT3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLk9wZXJhdGlvbnNNYW5hZ2VyOworCitwdWJsaWMgY2xhc3MgVW5jb25maWd1cmVBbmRVbmluc3RhbGxGZWF0dXJlc0FjdGlvbiBleHRlbmRzIEZlYXR1cmVBY3Rpb24geworCisJcHJpdmF0ZSBDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXJbXSBhZGFwdGVyczsKKworCXB1YmxpYyBVbmNvbmZpZ3VyZUFuZFVuaW5zdGFsbEZlYXR1cmVzQWN0aW9uKCBTaGVsbCBzaGVsbCwgU3RyaW5nIHRleHQpIHsKKwkJc3VwZXIoc2hlbGwsIHRleHQpOworCQlzZXRXaW5kb3dUaXRsZShVcGRhdGVVSU1lc3NhZ2VzLkZlYXR1cmVVbmNvbmZpZ3VyZUFuZFVuaW5zdGFsbEFjdGlvbl9kaWFsb2dUaXRsZSk7CisJfQorCisJCisJcHVibGljIHZvaWQgcnVuKCkgeworCQl0cnkgeworCQkJSVN0YXR1cyBzdGF0dXMgPSBPcGVyYXRpb25zTWFuYWdlci5nZXRWYWxpZGF0b3IoKS52YWxpZGF0ZVBsYXRmb3JtQ29uZmlnVmFsaWQoKTsKKwkJCWlmIChzdGF0dXMgIT0gbnVsbCkKKwkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXMpOworCQkJCisJCQlpZiAoYWRhcHRlcnMgPT0gbnVsbCB8fCAhY29uZmlybShVcGRhdGVVSU1lc3NhZ2VzLkZlYXR1cmVVbmNvbmZpZ3VyZUFuZFVuaW5zdGFsbEFjdGlvbl9xdWVzdGlvbikpIAorCQkJCXJldHVybjsKKworCQkJLy8gSWYgY3VycmVudCBjb25maWcgaXMgYnJva2VuLCBjb25maXJtIHdpdGggdGhlIHVzZXIgdG8gY29udGludWUKKwkJCWlmIChPcGVyYXRpb25zTWFuYWdlci5nZXRWYWxpZGF0b3IoKS52YWxpZGF0ZUN1cnJlbnRTdGF0ZSgpICE9IG51bGwgJiYKKwkJCQkJIWNvbmZpcm0oVXBkYXRlVUlNZXNzYWdlcy5BY3Rpb25zX2Jyb2tlbkNvbmZpZ1F1ZXN0aW9uKSkgCisJCQkJcmV0dXJuOworCQkJCisJCQlJRmVhdHVyZVtdIGZlYXR1cmVzID0gbmV3IElGZWF0dXJlW2FkYXB0ZXJzLmxlbmd0aF07CisJCQlJQ29uZmlndXJlZFNpdGVbXSBjb25maWd1cmVkU2l0ZXMgPSBuZXcgSUNvbmZpZ3VyZWRTaXRlW2FkYXB0ZXJzLmxlbmd0aF07CisJCQlmb3IoIGludCBpID0gMDsgaSA8IGFkYXB0ZXJzLmxlbmd0aDsgaSsrKSB7CisJCQkJZmVhdHVyZXNbaV0gPSBhZGFwdGVyc1tpXS5nZXRGZWF0dXJlKG51bGwpOworCQkJCWNvbmZpZ3VyZWRTaXRlc1tpXSA9IGFkYXB0ZXJzW2ldLmdldENvbmZpZ3VyZWRTaXRlKCk7CisJCQl9CisKKwkJCUlPcGVyYXRpb24gdW5pbnN0YWxsRmVhdHVyZXNPcGVyYXRpb24gPQorCQkJCSgoT3BlcmF0aW9uRmFjdG9yeSlPcGVyYXRpb25zTWFuYWdlci5nZXRPcGVyYXRpb25GYWN0b3J5KCkpLmNyZWF0ZVVuY29uZmlndXJlQW5kVW5pbnN0YWxsRmVhdHVyZXNPcGVyYXRpb24oIGNvbmZpZ3VyZWRTaXRlcywgZmVhdHVyZXMpOworCisJCQlib29sZWFuIHJlc3RhcnROZWVkZWQgPSB1bmluc3RhbGxGZWF0dXJlc09wZXJhdGlvbi5leGVjdXRlKG51bGwsIG51bGwpOworCQkJVXBkYXRlVUkucmVxdWVzdFJlc3RhcnQocmVzdGFydE5lZWRlZCk7CisKKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQlFcnJvckRpYWxvZy5vcGVuRXJyb3Ioc2hlbGwsIG51bGwsIG51bGwsIGUuZ2V0U3RhdHVzKCkpOworCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKKwkJCS8vIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4KKwkJCVVwZGF0ZVV0aWxzLmxvZ0V4Y2VwdGlvbihlLmdldFRhcmdldEV4Y2VwdGlvbigpKTsKKwkJfQorCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7CisJCQorCQl0aGlzLmFkYXB0ZXJzID0gKENvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlcltdKSBzZWxlY3Rpb24udG9MaXN0KCkudG9BcnJheShuZXcgQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyW3NlbGVjdGlvbi5zaXplKCldKTsKKwkJc2V0VGV4dChVcGRhdGVVSU1lc3NhZ2VzLkZlYXR1cmVVbmNvbmZpZ3VyZUFuZFVuaW5zdGFsbEFjdGlvbl91bmluc3RhbGwpOyAKKwl9CisJCisJcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZUFjdGlvbigpIHsKKwkJCisJCWlmIChhZGFwdGVycyA9PSBudWxsIHx8IGFkYXB0ZXJzLmxlbmd0aCA9PSAwKQorCQkJcmV0dXJuIGZhbHNlOworCQkKKwkJZm9yKCBpbnQgaSA9IDA7IGkgPCBhZGFwdGVycy5sZW5ndGg7IGkrKykgeworCQkJCisJCQlpZiAoIWFkYXB0ZXJzW2ldLmlzQ29uZmlndXJlZCgpKQorCQkJCXJldHVybiBmYWxzZTsKKwkJCisJCQl0cnkgeworCQkJCS8vIGNoZWNrIGZvciBwZW5kaW5nIGNoYW5nZXMgKGUuZy4gaWYgdGhlIGZlYXR1cmUgaGFzIGp1c3QgYmVlbiBkaXNhYmxlZCkKKwkJCQlJRmVhdHVyZU9wZXJhdGlvbiBwZW5kaW5nT3BlcmF0aW9uID0gT3BlcmF0aW9uc01hbmFnZXIuZmluZFBlbmRpbmdPcGVyYXRpb24oYWRhcHRlcnNbaV0uZ2V0RmVhdHVyZShudWxsKSk7CisJCQkJaWYgKHBlbmRpbmdPcGVyYXRpb24gIT0gbnVsbCkKKwkJCQkJcmV0dXJuIGZhbHNlOworCisJCQkJaWYgKEluc3RhbGxSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldCgiZmVhdHVyZV8iK2FkYXB0ZXJzW2ldLmdldEZlYXR1cmUobnVsbCkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpKSA9PSBudWxsKSAvLyROT04tTkxTLTEkCisJCQkJCXJldHVybiBmYWxzZTsKKwkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfQorCQkJCQorCQlyZXR1cm4gdHJ1ZTsJCisJfQorCit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvVW5pbnN0YWxsRmVhdHVyZUFjdGlvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL1VuaW5zdGFsbEZlYXR1cmVBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDdiNWMxCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL1VuaW5zdGFsbEZlYXR1cmVBY3Rpb24uamF2YQpAQCAtMCwwICsxLDk5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnZpZXdzOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5JbnN0YWxsUmVnaXN0cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm9wZXJhdGlvbnMuVXBkYXRlVXRpbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSU1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbC5Db25maWd1cmVkRmVhdHVyZUFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuSUZlYXR1cmVPcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuSU9wZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy5PcGVyYXRpb25zTWFuYWdlcjsKKworcHVibGljIGNsYXNzIFVuaW5zdGFsbEZlYXR1cmVBY3Rpb24gZXh0ZW5kcyBGZWF0dXJlQWN0aW9uIHsKKwkKKwlwcml2YXRlIENvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlciBhZGFwdGVyOworCisJcHVibGljIFVuaW5zdGFsbEZlYXR1cmVBY3Rpb24oU2hlbGwgc2hlbGwsIFN0cmluZyB0ZXh0KSB7CisJCXN1cGVyKHNoZWxsLCB0ZXh0KTsKKwkJc2V0V2luZG93VGl0bGUoVXBkYXRlVUlNZXNzYWdlcy5GZWF0dXJlVW5pbnN0YWxsQWN0aW9uX2RpYWxvZ1RpdGxlKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBydW4oKSB7CisJCXRyeSB7CisJCQlJU3RhdHVzIHN0YXR1cyA9IE9wZXJhdGlvbnNNYW5hZ2VyLmdldFZhbGlkYXRvcigpLnZhbGlkYXRlUGxhdGZvcm1Db25maWdWYWxpZCgpOworCQkJaWYgKHN0YXR1cyAhPSBudWxsKQorCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1cyk7CisJCQkKKwkJCWlmIChhZGFwdGVyID09IG51bGwgfHwgIWNvbmZpcm0oVXBkYXRlVUlNZXNzYWdlcy5GZWF0dXJlVW5pbnN0YWxsQWN0aW9uX3VuaW5zdGFsbFF1ZXN0aW9uKSkgCisJCQkJcmV0dXJuOworCisJCQkvLyBJZiBjdXJyZW50IGNvbmZpZyBpcyBicm9rZW4sIGNvbmZpcm0gd2l0aCB0aGUgdXNlciB0byBjb250aW51ZQorCQkJaWYgKE9wZXJhdGlvbnNNYW5hZ2VyLmdldFZhbGlkYXRvcigpLnZhbGlkYXRlQ3VycmVudFN0YXRlKCkgIT0gbnVsbCAmJgorCQkJCQkhY29uZmlybShVcGRhdGVVSU1lc3NhZ2VzLkFjdGlvbnNfYnJva2VuQ29uZmlnUXVlc3Rpb24pKSAKKwkJCQlyZXR1cm47CisKKwkJCUlPcGVyYXRpb24gdW5pbnN0YWxsT3BlcmF0aW9uID0KKwkJCQlPcGVyYXRpb25zTWFuYWdlcgorCQkJCQkuZ2V0T3BlcmF0aW9uRmFjdG9yeSgpCisJCQkJCS5jcmVhdGVVbmluc3RhbGxPcGVyYXRpb24oCisJCQkJCWFkYXB0ZXIuZ2V0Q29uZmlndXJlZFNpdGUoKSwKKwkJCQkJYWRhcHRlci5nZXRGZWF0dXJlKG51bGwpKTsKKworCQkJYm9vbGVhbiByZXN0YXJ0TmVlZGVkID0gdW5pbnN0YWxsT3BlcmF0aW9uLmV4ZWN1dGUobnVsbCwgbnVsbCk7CisJCQlVcGRhdGVVSS5yZXF1ZXN0UmVzdGFydChyZXN0YXJ0TmVlZGVkKTsKKworCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgbnVsbCwgbnVsbCwgZS5nZXRTdGF0dXMoKSk7CisJCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgeworCQkJLy8gVGhpcyBzaG91bGQgbm90IGhhcHBlbgorCQkJVXBkYXRlVXRpbHMubG9nRXhjZXB0aW9uKGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpOworCQl9CisJfQorCisKKworCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKwkJCisJCXRoaXMuYWRhcHRlciA9IChDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXIpIHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKKwkJc2V0VGV4dChVcGRhdGVVSU1lc3NhZ2VzLkZlYXR1cmVVbmluc3RhbGxBY3Rpb25fdW5pbnN0YWxsKTsgCisJfQorCisJcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZUFjdGlvbigpIHsKKwkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkKKwkJCXJldHVybiBmYWxzZTsKKwkJCisJCWlmIChhZGFwdGVyLmlzQ29uZmlndXJlZCgpKQorCQkJcmV0dXJuIGZhbHNlOworCQkKKwkJdHJ5IHsKKwkJCS8vIGNoZWNrIGZvciBwZW5kaW5nIGNoYW5nZXMgKGUuZy4gaWYgdGhlIGZlYXR1cmUgaGFzIGp1c3QgYmVlbiBkaXNhYmxlZCkKKwkJCUlGZWF0dXJlT3BlcmF0aW9uIHBlbmRpbmdPcGVyYXRpb24gPSBPcGVyYXRpb25zTWFuYWdlci5maW5kUGVuZGluZ09wZXJhdGlvbihhZGFwdGVyLmdldEZlYXR1cmUobnVsbCkpOworCQkJaWYgKHBlbmRpbmdPcGVyYXRpb24gIT0gbnVsbCkKKwkJCQlyZXR1cm4gZmFsc2U7CisKKwkJCWlmIChJbnN0YWxsUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXQoImZlYXR1cmVfIithZGFwdGVyLmdldEZlYXR1cmUobnVsbCkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpKSA9PSBudWxsKSAvLyROT04tTkxTLTEkCisJCQkJcmV0dXJuIGZhbHNlOworCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQkJCQorCQlyZXR1cm4gdHJ1ZTsJCisJfQorfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL1VuaW5zdGFsbEZlYXR1cmVzQWN0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvVW5pbnN0YWxsRmVhdHVyZXNBY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTBmOWE5Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL1VuaW5zdGFsbEZlYXR1cmVzQWN0aW9uLmphdmEKQEAgLTAsMCArMSwxMDggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkudmlld3M7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLklDb25maWd1cmVkU2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5JbnN0YWxsUmVnaXN0cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm9wZXJhdGlvbnMuT3BlcmF0aW9uRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwub3BlcmF0aW9ucy5VcGRhdGVVdGlsczsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUk7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsLkNvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy5JRmVhdHVyZU9wZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy5JT3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLk9wZXJhdGlvbnNNYW5hZ2VyOworCitwdWJsaWMgY2xhc3MgVW5pbnN0YWxsRmVhdHVyZXNBY3Rpb24gZXh0ZW5kcyBGZWF0dXJlQWN0aW9uIHsKKworCXByaXZhdGUgQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyW10gYWRhcHRlcnM7CisKKwlwdWJsaWMgVW5pbnN0YWxsRmVhdHVyZXNBY3Rpb24oIFNoZWxsIHNoZWxsLCBTdHJpbmcgdGV4dCkgeworCQlzdXBlcihzaGVsbCwgdGV4dCk7CisJCXNldFdpbmRvd1RpdGxlKFVwZGF0ZVVJTWVzc2FnZXMuRmVhdHVyZVVuaW5zdGFsbEFjdGlvbl9kaWFsb2dUaXRsZSk7CisJfQorCisJCisJcHVibGljIHZvaWQgcnVuKCkgeworCQl0cnkgeworCQkJSVN0YXR1cyBzdGF0dXMgPSBPcGVyYXRpb25zTWFuYWdlci5nZXRWYWxpZGF0b3IoKS52YWxpZGF0ZVBsYXRmb3JtQ29uZmlnVmFsaWQoKTsKKwkJCWlmIChzdGF0dXMgIT0gbnVsbCkKKwkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXMpOworCQkJCisJCQlpZiAoYWRhcHRlcnMgPT0gbnVsbCB8fCAhY29uZmlybShVcGRhdGVVSU1lc3NhZ2VzLkZlYXR1cmVVbmluc3RhbGxBY3Rpb25fdW5pbnN0YWxsUXVlc3Rpb24pKSAKKwkJCQlyZXR1cm47CisKKwkJCS8vIElmIGN1cnJlbnQgY29uZmlnIGlzIGJyb2tlbiwgY29uZmlybSB3aXRoIHRoZSB1c2VyIHRvIGNvbnRpbnVlCisJCQlpZiAoT3BlcmF0aW9uc01hbmFnZXIuZ2V0VmFsaWRhdG9yKCkudmFsaWRhdGVDdXJyZW50U3RhdGUoKSAhPSBudWxsICYmCisJCQkJCSFjb25maXJtKFVwZGF0ZVVJTWVzc2FnZXMuQWN0aW9uc19icm9rZW5Db25maWdRdWVzdGlvbikpIAorCQkJCXJldHVybjsKKwkJCQorCQkJSUZlYXR1cmVbXSBmZWF0dXJlcyA9IG5ldyBJRmVhdHVyZVthZGFwdGVycy5sZW5ndGhdOworCQkJSUNvbmZpZ3VyZWRTaXRlW10gY29uZmlndXJlZFNpdGVzID0gbmV3IElDb25maWd1cmVkU2l0ZVthZGFwdGVycy5sZW5ndGhdOworCQkJZm9yKCBpbnQgaSA9IDA7IGkgPCBhZGFwdGVycy5sZW5ndGg7IGkrKykgeworCQkJCWZlYXR1cmVzW2ldID0gYWRhcHRlcnNbaV0uZ2V0RmVhdHVyZShudWxsKTsKKwkJCQljb25maWd1cmVkU2l0ZXNbaV0gPSBhZGFwdGVyc1tpXS5nZXRDb25maWd1cmVkU2l0ZSgpOworCQkJfQorCisJCQlJT3BlcmF0aW9uIHVuaW5zdGFsbEZlYXR1cmVzT3BlcmF0aW9uID0KKwkJCQkoKE9wZXJhdGlvbkZhY3RvcnkpT3BlcmF0aW9uc01hbmFnZXIuZ2V0T3BlcmF0aW9uRmFjdG9yeSgpKS5jcmVhdGVVbmluc3RhbGxGZWF0dXJlc09wZXJhdGlvbiggY29uZmlndXJlZFNpdGVzLCBmZWF0dXJlcyk7CisKKwkJCWJvb2xlYW4gcmVzdGFydE5lZWRlZCA9IHVuaW5zdGFsbEZlYXR1cmVzT3BlcmF0aW9uLmV4ZWN1dGUobnVsbCwgbnVsbCk7CisJCQlVcGRhdGVVSS5yZXF1ZXN0UmVzdGFydChyZXN0YXJ0TmVlZGVkKTsKKworCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgbnVsbCwgbnVsbCwgZS5nZXRTdGF0dXMoKSk7CisJCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgeworCQkJLy8gVGhpcyBzaG91bGQgbm90IGhhcHBlbgorCQkJVXBkYXRlVXRpbHMubG9nRXhjZXB0aW9uKGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpOworCQl9CisJfQorCisKKwlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7CisJCQorCQl0aGlzLmFkYXB0ZXJzID0gKENvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlcltdKSBzZWxlY3Rpb24udG9MaXN0KCkudG9BcnJheShuZXcgQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyW3NlbGVjdGlvbi5zaXplKCldKTsKKwkJc2V0VGV4dChVcGRhdGVVSU1lc3NhZ2VzLkZlYXR1cmVVbmluc3RhbGxBY3Rpb25fdW5pbnN0YWxsKTsgCisJfQorCQorCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGVBY3Rpb24oKSB7CisJCQorCQlpZiAoYWRhcHRlcnMgPT0gbnVsbCB8fCBhZGFwdGVycy5sZW5ndGggPT0gMCkKKwkJCXJldHVybiBmYWxzZTsKKwkJCisJCWZvciggaW50IGkgPSAwOyBpIDwgYWRhcHRlcnMubGVuZ3RoOyBpKyspIHsKKwkJCWlmIChhZGFwdGVyc1tpXS5pc0NvbmZpZ3VyZWQoKSkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQorCQkJdHJ5IHsKKwkJCQkvLyBjaGVjayBmb3IgcGVuZGluZyBjaGFuZ2VzIChlLmcuIGlmIHRoZSBmZWF0dXJlIGhhcyBqdXN0IGJlZW4gZGlzYWJsZWQpCisJCQkJSUZlYXR1cmVPcGVyYXRpb24gcGVuZGluZ09wZXJhdGlvbiA9IE9wZXJhdGlvbnNNYW5hZ2VyLmZpbmRQZW5kaW5nT3BlcmF0aW9uKGFkYXB0ZXJzW2ldLmdldEZlYXR1cmUobnVsbCkpOworCQkJCWlmIChwZW5kaW5nT3BlcmF0aW9uICE9IG51bGwpCisJCQkJCXJldHVybiBmYWxzZTsKKworCQkJCWlmIChJbnN0YWxsUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXQoImZlYXR1cmVfIithZGFwdGVyc1tpXS5nZXRGZWF0dXJlKG51bGwpLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSkgPT0gbnVsbCkgLy8kTk9OLU5MUy0xJAorCQkJCQlyZXR1cm4gZmFsc2U7CisJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCX0KKwkJCQkKKwkJcmV0dXJuIHRydWU7CQorCX0KK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL0FjdGl2aXRpZXNUYWJsZVZpZXdlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvQWN0aXZpdGllc1RhYmxlVmlld2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE3ODk0ZgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL0FjdGl2aXRpZXNUYWJsZVZpZXdlci5qYXZhCkBAIC0wLDAgKzEsMTQ1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLndpemFyZHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wYXJ0cy4qOworCisKKy8qKgorICogVmlld2VyIGZvciBjb25maWd1cmF0aW9uIGFjdGl2aXRpZXMKKyAqLworcHVibGljIGNsYXNzIEFjdGl2aXRpZXNUYWJsZVZpZXdlcnsKKworCXByaXZhdGUgc3RhdGljIEluc3RhbGxMb2dQYXJzZXIgcGFyc2VyOyAKKwkKKwlzdGF0aWMgY2xhc3MgQWN0aXZpdGllc0NvbnRlbnRQcm92aWRlcgorCQlleHRlbmRzIERlZmF1bHRDb250ZW50UHJvdmlkZXIKKwkJaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB7CisJCQorCQlwcml2YXRlIGJvb2xlYW4gc2hvd0N1cnJlbnRPbmx5OworCQkKKwkJcHVibGljIEFjdGl2aXRpZXNDb250ZW50UHJvdmlkZXIoYm9vbGVhbiBzaG93Q3VycmVudE9ubHkpeworCQkJdGhpcy5zaG93Q3VycmVudE9ubHkgPSBzaG93Q3VycmVudE9ubHk7CisJCX0KKwkJCisJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgZWxlbWVudCkgeworCQkJSW5zdGFsbENvbmZpZ3VyYXRpb24gY3VycmVudENvbmZpZyA9IChJbnN0YWxsQ29uZmlndXJhdGlvbillbGVtZW50OworCQkJSW5zdGFsbENvbmZpZ3VyYXRpb25bXSBjb25maWdzID0gcGFyc2VyLmdldENvbmZpZ3VyYXRpb25zKCk7CisJCQlib29sZWFuIGhpdEN1cnJlbnRDb25maWcgPSBmYWxzZTsKKwkJCUFycmF5TGlzdCBhY3Rpdml0aWVzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpPGNvbmZpZ3MubGVuZ3RoOyBpKyspeworCQkJCWlmIChjb25maWdzW2ldLmVxdWFscyhjdXJyZW50Q29uZmlnKSAmJiAhaGl0Q3VycmVudENvbmZpZykKKwkJCQkJaGl0Q3VycmVudENvbmZpZyA9IHRydWU7CisJCQkJaWYgKGhpdEN1cnJlbnRDb25maWcgJiYgc2hvd0N1cnJlbnRPbmx5KQorCQkJCQlyZXR1cm4gY29uZmlnc1tpXS5nZXRBY3Rpdml0aWVzKCk7CisJCQkJZWxzZSBpZiAoaGl0Q3VycmVudENvbmZpZyl7CisJCQkJCUlBY3Rpdml0eVtdIGFjdGl2aXRpZXMgPSBjb25maWdzW2ldLmdldEFjdGl2aXRpZXMoKTsKKwkJCQkJZm9yIChpbnQgaiA9IDA7IGo8YWN0aXZpdGllcy5sZW5ndGg7IGorKykKKwkJCQkJCWFjdGl2aXRpZXNMaXN0LmFkZChhY3Rpdml0aWVzW2pdKTsJCisJCQkJfQorCQkJCQorCQkJfQorCQkJcmV0dXJuIChJQWN0aXZpdHlbXSlhY3Rpdml0aWVzTGlzdC50b0FycmF5KG5ldyBJQWN0aXZpdHlbYWN0aXZpdGllc0xpc3Quc2l6ZSgpXSk7CisJCX0KKwkJCisJfQorCisJc3RhdGljIGNsYXNzIEFjdGl2aXRpZXNMYWJlbFByb3ZpZGVyCisJCWV4dGVuZHMgTGFiZWxQcm92aWRlcgorCQlpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgeworCQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgeworCQkJaWYgKGNvbHVtbkluZGV4ID09IDApIHsKKwkJCQlVcGRhdGVMYWJlbFByb3ZpZGVyIHByb3ZpZGVyID0KKwkJCQkJVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldExhYmVsUHJvdmlkZXIoKTsKKwkJCQlzd2l0Y2ggKCgoSUFjdGl2aXR5KSBlbGVtZW50KS5nZXRTdGF0dXMoKSkgeworCQkJCQljYXNlIElBY3Rpdml0eS5TVEFUVVNfT0sgOgorCQkJCQkJcmV0dXJuIHByb3ZpZGVyLmdldChVcGRhdGVVSUltYWdlcy5ERVNDX09LX1NUX09CSiwgMCk7CisJCQkJCWNhc2UgSUFjdGl2aXR5LlNUQVRVU19OT0sgOgorCQkJCQkJcmV0dXJuIHByb3ZpZGVyLmdldChVcGRhdGVVSUltYWdlcy5ERVNDX0VSUl9TVF9PQkosIDApOworCQkJCX0KKwkJCX0KKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKKwkJCUlBY3Rpdml0eSBhY3Rpdml0eSA9IChJQWN0aXZpdHkpIGVsZW1lbnQ7CisJCQlzd2l0Y2ggKGNvbHVtbkluZGV4KSB7CisJCQkJY2FzZSAxIDoKKwkJCQkJcmV0dXJuIFV0aWxpdGllcy5mb3JtYXQoYWN0aXZpdHkuZ2V0RGF0ZSgpKTsKKwkJCQljYXNlIDIgOgorCQkJCQlyZXR1cm4gYWN0aXZpdHkuZ2V0TGFiZWwoKTsKKwkJCQljYXNlIDMgOgorCQkJCQlyZXR1cm4gZ2V0QWN0aW9uTGFiZWwoYWN0aXZpdHkpOworCQkJfQorCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCisJCX0KKworCQlwcml2YXRlIFN0cmluZyBnZXRBY3Rpb25MYWJlbChJQWN0aXZpdHkgYWN0aXZpdHkpIHsKKwkJCWludCBhY3Rpb24gPSBhY3Rpdml0eS5nZXRBY3Rpb24oKTsKKwkJCXN3aXRjaCAoYWN0aW9uKSB7CisJCQkJY2FzZSBJQWN0aXZpdHkuQUNUSU9OX0NPTkZJR1VSRSA6CisJCQkJCXJldHVybiBVcGRhdGVVSU1lc3NhZ2VzLkFjdGl2aXRpZXNUYWJsZVZpZXdlcl9lbmFibGVkOyAKKwkJCQljYXNlIElBY3Rpdml0eS5BQ1RJT05fRkVBVFVSRV9JTlNUQUxMIDoKKwkJCQkJcmV0dXJuIFVwZGF0ZVVJTWVzc2FnZXMuQWN0aXZpdGllc1RhYmxlVmlld2VyX2ZlYXR1cmVJbnN0YWxsZWQ7IAorCQkJCWNhc2UgSUFjdGl2aXR5LkFDVElPTl9GRUFUVVJFX1JFTU9WRSA6CisJCQkJCXJldHVybiBVcGRhdGVVSU1lc3NhZ2VzLkFjdGl2aXRpZXNUYWJsZVZpZXdlcl9mZWF0dXJlUmVtb3ZlZDsgCisJCQkJY2FzZSBJQWN0aXZpdHkuQUNUSU9OX1NJVEVfSU5TVEFMTCA6CisJCQkJCXJldHVybiBVcGRhdGVVSU1lc3NhZ2VzLkFjdGl2aXRpZXNUYWJsZVZpZXdlcl9zaXRlSW5zdGFsbGVkOyAKKwkJCQljYXNlIElBY3Rpdml0eS5BQ1RJT05fU0lURV9SRU1PVkUgOgorCQkJCQlyZXR1cm4gVXBkYXRlVUlNZXNzYWdlcy5BY3Rpdml0aWVzVGFibGVWaWV3ZXJfc2l0ZVJlbW92ZWQ7IAorCQkJCWNhc2UgSUFjdGl2aXR5LkFDVElPTl9VTkNPTkZJR1VSRSA6CisJCQkJCXJldHVybiBVcGRhdGVVSU1lc3NhZ2VzLkFjdGl2aXRpZXNUYWJsZVZpZXdlcl9kaXNhYmxlZDsgCisJCQkJY2FzZSBJQWN0aXZpdHkuQUNUSU9OX1JFVkVSVCA6CisJCQkJCXJldHVybiBVcGRhdGVVSU1lc3NhZ2VzLkFjdGl2aXRpZXNUYWJsZVZpZXdlcl9yZXZlcnQ7IAorCQkJCWNhc2UgSUFjdGl2aXR5LkFDVElPTl9SRUNPTkNJTElBVElPTiA6CisJCQkJCXJldHVybiBVcGRhdGVVSU1lc3NhZ2VzLkFjdGl2aXRpZXNUYWJsZVZpZXdlcl9yZWNvbmNpbGU7IAorCQkJCWRlZmF1bHQgOgorCQkJCQlyZXR1cm4gVXBkYXRlVUlNZXNzYWdlcy5BY3Rpdml0aWVzVGFibGVWaWV3ZXJfdW5rbm93bjsgCisJCQl9CisJCX0KKwl9CisKKwlwdWJsaWMgc3RhdGljIFRhYmxlVmlld2VyIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBib29sZWFuIHNob3dDdXJyZW50T25seSkgeworCQlwYXJzZXIgPSBuZXcgSW5zdGFsbExvZ1BhcnNlcigpOworCQlwYXJzZXIucGFyc2VJbnN0YWxsYXRpb25Mb2coKTsKKwkJVGFibGUgdGFibGUgPSBuZXcgVGFibGUocGFyZW50LCBTV1QuQk9SREVSKTsKKwkJdGFibGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7CisJCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7CisKKwkJVGFibGVDb2x1bW4gY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7CisKKwkJY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7CisJCWNvbHVtbi5zZXRUZXh0KFVwZGF0ZVVJTWVzc2FnZXMuQWN0aXZpdGllc1RhYmxlVmlld2VyX2RhdGUpOyAKKworCQljb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKKwkJY29sdW1uLnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5BY3Rpdml0aWVzVGFibGVWaWV3ZXJfdGFyZ2V0KTsgCisKKwkJY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7CisJCWNvbHVtbi5zZXRUZXh0KFVwZGF0ZVVJTWVzc2FnZXMuQWN0aXZpdGllc1RhYmxlVmlld2VyX2FjdGlvbik7IAorCisJCVRhYmxlVmlld2VyIGFjdGl2aXRpZXNWaWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIodGFibGUpOworCQlhY3Rpdml0aWVzVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IEFjdGl2aXRpZXNMYWJlbFByb3ZpZGVyKCkpOworCQlhY3Rpdml0aWVzVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQWN0aXZpdGllc0NvbnRlbnRQcm92aWRlcihzaG93Q3VycmVudE9ubHkpKTsKKwkJcmV0dXJuIGFjdGl2aXRpZXNWaWV3ZXI7CisJfQorCit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9CYW5uZXJQYWdlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9CYW5uZXJQYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQxZGQwNAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL0Jhbm5lclBhZ2UuamF2YQpAQCAtMCwwICsxLDc2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLndpemFyZHM7CitpbXBvcnQgamF2YS5uZXQuKjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS4qOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFubmVyUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgeworCXByaXZhdGUgSW1hZ2UgYmFubmVySW1hZ2U7CisJcHJpdmF0ZSBib29sZWFuIGJhbm5lclZpc2libGUgPSBmYWxzZTsKKwlwdWJsaWMgQmFubmVyUGFnZShTdHJpbmcgbmFtZSkgeworCQlzdXBlcihuYW1lKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJQ29tcG9zaXRlIGNsaWVudCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7CisJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKKwkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOworCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSAxMDsKKwkJY2xpZW50LnNldExheW91dChsYXlvdXQpOworCisJCWlmIChiYW5uZXJWaXNpYmxlKSB7CisJCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjbGllbnQsIFNXVC5OVUxMKTsKKwkJCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORykpOworCQkJbGFiZWwuc2V0SW1hZ2UoZ2V0QmFubmVySW1hZ2UoKSk7CisJCX0KKworCQlDb250cm9sIGNvbnRlbnRzID0gY3JlYXRlQ29udGVudHMoY2xpZW50KTsKKwkJY29udGVudHMuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7CisJCXNldENvbnRyb2woY2xpZW50KTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRCYW5uZXJWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgeworCQl0aGlzLmJhbm5lclZpc2libGUgPSB2aXNpYmxlOworCX0KKwlwdWJsaWMgYm9vbGVhbiBpc0Jhbm5lZFZpc2libGUoKSB7CisJCXJldHVybiBiYW5uZXJWaXNpYmxlOworCX0KKworCXByb3RlY3RlZCBVUkwgZ2V0QmFubmVySW1hZ2VVUkwoKSB7CisJCXJldHVybiBudWxsOworCX0KKwlwcml2YXRlIEltYWdlIGdldEJhbm5lckltYWdlKCkgeworCQlVUkwgaW1hZ2VVUkwgPSBnZXRCYW5uZXJJbWFnZVVSTCgpOworCQlJbWFnZSBpbWFnZSA9IG51bGw7CisJCWlmIChpbWFnZVVSTCA9PSBudWxsKSB7CisJCQkvLyB1c2UgZGVmYXVsdAorCQkJYmFubmVySW1hZ2UgPQorCQkJCVVwZGF0ZVVJSW1hZ2VzLkRFU0NfSU5TVEFMTF9CQU5ORVIuY3JlYXRlSW1hZ2UoKTsKKwkJCWltYWdlID0gYmFubmVySW1hZ2U7CisJCX0KKwkJcmV0dXJuIGltYWdlOworCX0KKworCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCWlmIChiYW5uZXJJbWFnZSAhPSBudWxsKSB7CisJCQliYW5uZXJJbWFnZS5kaXNwb3NlKCk7CisJCX0KKwkJc3VwZXIuZGlzcG9zZSgpOworCX0KKworCXByb3RlY3RlZCBhYnN0cmFjdCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpOworfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvQ29udGFpbmVyQ2hlY2tlZFRyZWVWaWV3ZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL0NvbnRhaW5lckNoZWNrZWRUcmVlVmlld2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBmMDY1NgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL0NvbnRhaW5lckNoZWNrZWRUcmVlVmlld2VyLmphdmEKQEAgLTAsMCArMSwxODcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkud2l6YXJkczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRyZWVWaWV3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVWaWV3ZXJMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVFeHBhbnNpb25FdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuSXRlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlSXRlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7CisKKy8qKgorICogQ29waWVkIGZyb20gdWkgaW50ZXJuYWwgcGFja2FnZS4KKyAqIAorICogQ2hlY2tib3hUcmVlVmlld2VyIHdpdGggc3BlY2lhbCBiZWhhdmlvdXIgb2YgdGhlIGNoZWNrZWQgLyBncmF5IHN0YXRlIG9uIAorICogY29udGFpbmVyIChub24tbGVhZikgbm9kZXM6CisgKiBUaGUgZ3JheWVkIHN0YXRlIGlzIHVzZWQgdG8gdmlzdWFsaXplIHRoZSBjaGVja2VkIHN0YXRlIG9mIGl0cyBjaGlsZHJlbi4KKyAqIENvbnRhaW5lcnMgYXJlIGNoZWNrZWQgYW5kIG5vbi1nYXJ5IGlmIGFsbCBjb250YWluZWQgbGVhZnMgYXJlIGNoZWNrZWQuIFRoZQorICogY29udGFpbmVyIGlzIGdyYXllZCBpZiBzb21lIGJ1dCBub3QgYWxsIGxlYWZzIGFyZSBjaGVja2VkLgorICogCisgKi8KK3B1YmxpYyBjbGFzcyBDb250YWluZXJDaGVja2VkVHJlZVZpZXdlciBleHRlbmRzIENoZWNrYm94VHJlZVZpZXdlciB7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgQ29udGFpbmVyQ2hlY2tlZFRyZWVWaWV3ZXIuCisgICAgICogQHNlZSBDaGVja2JveFRyZWVWaWV3ZXIjQ2hlY2tib3hUcmVlVmlld2VyKENvbXBvc2l0ZSxpbnQpCisgICAgICovCisgICAgcHVibGljIENvbnRhaW5lckNoZWNrZWRUcmVlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgeworICAgICAgICBzdXBlcihwYXJlbnQsIHN0eWxlKTsKKyAgICAgICAgaW5pdFZpZXdlcigpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0Vmlld2VyKCkgeworICAgICAgICBzZXRVc2VIYXNobG9va3VwKHRydWUpOworICAgICAgICBhZGRDaGVja1N0YXRlTGlzdGVuZXIobmV3IElDaGVja1N0YXRlTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGV2ZW50KSB7CisgICAgICAgICAgICAgICAgZG9DaGVja1N0YXRlQ2hhbmdlZChldmVudC5nZXRFbGVtZW50KCkpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgYWRkVHJlZUxpc3RlbmVyKG5ldyBJVHJlZVZpZXdlckxpc3RlbmVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgdHJlZUNvbGxhcHNlZChUcmVlRXhwYW5zaW9uRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgdHJlZUV4cGFuZGVkKFRyZWVFeHBhbnNpb25FdmVudCBldmVudCkgeworICAgICAgICAgICAgICAgIFdpZGdldCBpdGVtID0gZmluZEl0ZW0oZXZlbnQuZ2V0RWxlbWVudCgpKTsKKyAgICAgICAgICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIFRyZWVJdGVtKSB7CisgICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemVJdGVtKChUcmVlSXRlbSkgaXRlbSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBkb0NoZWNrU3RhdGVDaGFuZ2VkKE9iamVjdCBlbGVtZW50KSB7CisgICAgICAgIFdpZGdldCBpdGVtID0gZmluZEl0ZW0oZWxlbWVudCk7CisgICAgICAgIGlmIChpdGVtIGluc3RhbmNlb2YgVHJlZUl0ZW0pIHsKKyAgICAgICAgICAgIFRyZWVJdGVtIHRyZWVJdGVtID0gKFRyZWVJdGVtKSBpdGVtOworICAgICAgICAgICAgdHJlZUl0ZW0uc2V0R3JheWVkKGZhbHNlKTsKKyAgICAgICAgICAgIHVwZGF0ZUNoaWxkcmVuSXRlbXModHJlZUl0ZW0pOworICAgICAgICAgICAgdXBkYXRlUGFyZW50SXRlbXModHJlZUl0ZW0uZ2V0UGFyZW50SXRlbSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBpdGVtIGhhcyBleHBhbmRlZC4gVXBkYXRlcyB0aGUgY2hlY2tlZCBzdGF0ZSBvZiBpdHMgY2hpbGRyZW4uIAorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplSXRlbShUcmVlSXRlbSBpdGVtKSB7CisgICAgICAgIGlmIChpdGVtLmdldENoZWNrZWQoKSAmJiAhaXRlbS5nZXRHcmF5ZWQoKSkgeworICAgICAgICAgICAgdXBkYXRlQ2hpbGRyZW5JdGVtcyhpdGVtKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFVwZGF0ZXMgdGhlIGNoZWNrIHN0YXRlIG9mIGFsbCBjcmVhdGVkIGNoaWxkcmVuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ2hpbGRyZW5JdGVtcyhUcmVlSXRlbSBwYXJlbnQpIHsKKyAgICAgICAgSXRlbVtdIGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4ocGFyZW50KTsKKyAgICAgICAgYm9vbGVhbiBzdGF0ZSA9IHBhcmVudC5nZXRDaGVja2VkKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIFRyZWVJdGVtIGN1cnIgPSAoVHJlZUl0ZW0pIGNoaWxkcmVuW2ldOworICAgICAgICAgICAgaWYgKGN1cnIuZ2V0RGF0YSgpICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgJiYgKChjdXJyLmdldENoZWNrZWQoKSAhPSBzdGF0ZSkgfHwgY3Vyci5nZXRHcmF5ZWQoKSkpIHsKKyAgICAgICAgICAgICAgICBjdXJyLnNldENoZWNrZWQoc3RhdGUpOworICAgICAgICAgICAgICAgIGN1cnIuc2V0R3JheWVkKGZhbHNlKTsKKyAgICAgICAgICAgICAgICB1cGRhdGVDaGlsZHJlbkl0ZW1zKGN1cnIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVXBkYXRlcyB0aGUgY2hlY2sgLyBncmF5IHN0YXRlIG9mIGFsbCBwYXJlbnQgaXRlbXMKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgdXBkYXRlUGFyZW50SXRlbXMoVHJlZUl0ZW0gaXRlbSkgeworICAgICAgICBpZiAoaXRlbSAhPSBudWxsKSB7CisgICAgICAgICAgICBJdGVtW10gY2hpbGRyZW4gPSBnZXRDaGlsZHJlbihpdGVtKTsKKyAgICAgICAgICAgIGJvb2xlYW4gY29udGFpbnNDaGVja2VkID0gZmFsc2U7CisgICAgICAgICAgICBib29sZWFuIGNvbnRhaW5zVW5jaGVja2VkID0gZmFsc2U7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgVHJlZUl0ZW0gY3VyciA9IChUcmVlSXRlbSkgY2hpbGRyZW5baV07CisgICAgICAgICAgICAgICAgY29udGFpbnNDaGVja2VkIHw9IGN1cnIuZ2V0Q2hlY2tlZCgpOworICAgICAgICAgICAgICAgIGNvbnRhaW5zVW5jaGVja2VkIHw9ICghY3Vyci5nZXRDaGVja2VkKCkgfHwgY3Vyci5nZXRHcmF5ZWQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpdGVtLnNldENoZWNrZWQoY29udGFpbnNDaGVja2VkKTsKKyAgICAgICAgICAgIGl0ZW0uc2V0R3JheWVkKGNvbnRhaW5zQ2hlY2tlZCAmJiBjb250YWluc1VuY2hlY2tlZCk7CisgICAgICAgICAgICB1cGRhdGVQYXJlbnRJdGVtcyhpdGVtLmdldFBhcmVudEl0ZW0oKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIEBzZWUgSUNoZWNrYWJsZSNzZXRDaGVja2VkKE9iamVjdCwgYm9vbGVhbikKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBzZXRDaGVja2VkKE9iamVjdCBlbGVtZW50LCBib29sZWFuIHN0YXRlKSB7CisgICAgICAgIGlmIChzdXBlci5zZXRDaGVja2VkKGVsZW1lbnQsIHN0YXRlKSkgeworICAgICAgICAgICAgZG9DaGVja1N0YXRlQ2hhbmdlZChlbGVtZW50KTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEBzZWUgQ2hlY2tib3hUcmVlVmlld2VyI3NldENoZWNrZWRFbGVtZW50cyhPYmplY3RbXSkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDaGVja2VkRWxlbWVudHMoT2JqZWN0W10gZWxlbWVudHMpIHsKKyAgICAgICAgc3VwZXIuc2V0Q2hlY2tlZEVsZW1lbnRzKGVsZW1lbnRzKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgZG9DaGVja1N0YXRlQ2hhbmdlZChlbGVtZW50c1tpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIEBzZWUgQWJzdHJhY3RUcmVlVmlld2VyI3NldEV4cGFuZGVkKEl0ZW0sIGJvb2xlYW4pCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0RXhwYW5kZWQoSXRlbSBpdGVtLCBib29sZWFuIGV4cGFuZCkgeworICAgICAgICBzdXBlci5zZXRFeHBhbmRlZChpdGVtLCBleHBhbmQpOworICAgICAgICBpZiAoZXhwYW5kICYmIGl0ZW0gaW5zdGFuY2VvZiBUcmVlSXRlbSkgeworICAgICAgICAgICAgaW5pdGlhbGl6ZUl0ZW0oKFRyZWVJdGVtKSBpdGVtKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogQHNlZSBDaGVja2JveFRyZWVWaWV3ZXIjZ2V0Q2hlY2tlZEVsZW1lbnRzKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0W10gZ2V0Q2hlY2tlZEVsZW1lbnRzKCkgeworICAgICAgICBPYmplY3RbXSBjaGVja2VkID0gc3VwZXIuZ2V0Q2hlY2tlZEVsZW1lbnRzKCk7CisgICAgICAgIC8vIGFkZCBhbGwgaXRlbXMgdGhhdCBhcmUgY2hpbGRyZW4gb2YgYSBjaGVja2VkIG5vZGUgYnV0IG5vdCBjcmVhdGVkIHlldAorICAgICAgICBBcnJheUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoZWNrZWQubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIE9iamVjdCBjdXJyID0gY2hlY2tlZFtpXTsKKyAgICAgICAgICAgIHJlc3VsdC5hZGQoY3Vycik7CisgICAgICAgICAgICBXaWRnZXQgaXRlbSA9IGZpbmRJdGVtKGN1cnIpOworICAgICAgICAgICAgaWYgKGl0ZW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEl0ZW1bXSBjaGlsZHJlbiA9IGdldENoaWxkcmVuKGl0ZW0pOworICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIGNvbnRhaW5zIHRoZSBkdW1teSBub2RlCisgICAgICAgICAgICAgICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA9PSAxICYmIGNoaWxkcmVuWzBdLmdldERhdGEoKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIG5vdCB5ZXQgY3JlYXRlZAorICAgICAgICAgICAgICAgICAgICBjb2xsZWN0Q2hpbGRyZW4oY3VyciwgcmVzdWx0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC50b0FycmF5KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNvbGxlY3RDaGlsZHJlbihPYmplY3QgZWxlbWVudCwgQXJyYXlMaXN0IHJlc3VsdCkgeworICAgICAgICBPYmplY3RbXSBmaWx0ZXJlZENoaWxkcmVuID0gZ2V0RmlsdGVyZWRDaGlsZHJlbihlbGVtZW50KTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWx0ZXJlZENoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBPYmplY3QgY3VyciA9IGZpbHRlcmVkQ2hpbGRyZW5baV07CisgICAgICAgICAgICByZXN1bHQuYWRkKGN1cnIpOworICAgICAgICAgICAgY29sbGVjdENoaWxkcmVuKGN1cnIsIHJlc3VsdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDaGlsZHJlbihmaW5hbCBXaWRnZXQgd2lkZ2V0KSB7CisgICAgCXN1cGVyLmNyZWF0ZUNoaWxkcmVuKHdpZGdldCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvRHVwbGljYXRlQ29uZmxpY3RzRGlhbG9nLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9EdXBsaWNhdGVDb25mbGljdHNEaWFsb2cuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjM4NThhCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvRHVwbGljYXRlQ29uZmxpY3RzRGlhbG9nLmphdmEKQEAgLTAsMCArMSwxMjMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkud2l6YXJkczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnBhcnRzLio7CisKKy8qKgorICogCisgKi8KK3B1YmxpYyBjbGFzcyBEdXBsaWNhdGVDb25mbGljdHNEaWFsb2cgZXh0ZW5kcyBNZXNzYWdlRGlhbG9nIHsKKworCXByaXZhdGUgVHJlZVZpZXdlciB0cmVlVmlld2VyOworCXByaXZhdGUgQXJyYXlMaXN0IGNvbmZsaWN0czsKKworCWNsYXNzIENvbmZsaWN0Q29udGVudFByb3ZpZGVyCisJCWV4dGVuZHMgRGVmYXVsdENvbnRlbnRQcm92aWRlcgorCQlpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyLCBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB7CisJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXQpIHsKKwkJCXJldHVybiBnZXRDaGlsZHJlbihpbnB1dCk7CisJCX0KKwkJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGNoaWxkKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgcGFyZW50KSB7CisJCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQXJyYXlMaXN0KQorCQkJCXJldHVybiB0cnVlOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50KSB7CisJCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQXJyYXlMaXN0KQorCQkJCXJldHVybiAoKEFycmF5TGlzdCkgcGFyZW50KS50b0FycmF5KCk7CisJCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKKwkJfQorCX0KKworCWNsYXNzIENvbmZsaWN0TGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgeworCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iaikgeworCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFycmF5TGlzdCkgeworCQkJCUFycmF5TGlzdCBsaXN0ID0gKEFycmF5TGlzdCkgb2JqOworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgeworCQkJCQlEdXBsaWNhdGVDb25mbGljdHNWYWxpZGF0b3IuSWRFbnRyeSBlbnRyeSA9CisJCQkJCQkoRHVwbGljYXRlQ29uZmxpY3RzVmFsaWRhdG9yLklkRW50cnkpIChsaXN0KS5nZXQoaSk7CisJCQkJCWlmIChlbnRyeS5pc0luc3RhbGxDYW5kaWRhdGUoKSkKKwkJCQkJCXJldHVybiBlbnRyeS5nZXRGZWF0dXJlKCkuZ2V0TGFiZWwoKTsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChvYmopOworCQl9CisJCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3Qgb2JqKSB7CisJCQlpbnQgZmxhZ3MgPSAwOworCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFycmF5TGlzdCkKKwkJCQlmbGFncyA9IFVwZGF0ZUxhYmVsUHJvdmlkZXIuRl9XQVJOSU5HOworCQkJaWYgKG9iaiBpbnN0YW5jZW9mIER1cGxpY2F0ZUNvbmZsaWN0c1ZhbGlkYXRvci5JZEVudHJ5CisJCQkJfHwgb2JqIGluc3RhbmNlb2YgQXJyYXlMaXN0KQorCQkJCXJldHVybiBVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0TGFiZWxQcm92aWRlcigpLmdldCgKKwkJCQkJVXBkYXRlVUlJbWFnZXMuREVTQ19GRUFUVVJFX09CSiwKKwkJCQkJZmxhZ3MpOworCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9CisKKwlwdWJsaWMgRHVwbGljYXRlQ29uZmxpY3RzRGlhbG9nKFNoZWxsIHNoZWxsLCBBcnJheUxpc3QgY29uZmxpY3RzKSB7CisJCXN1cGVyKAorCQkJc2hlbGwsCisJCQlVcGRhdGVVSU1lc3NhZ2VzLkR1cGxpY2F0ZUNvbmZsaWN0c0RpYWxvZ190aXRsZSwgCisJCQludWxsLAorCQkJVXBkYXRlVUlNZXNzYWdlcy5EdXBsaWNhdGVDb25mbGljdHNEaWFsb2dfbWVzc2FnZSwgCisJCQlXQVJOSU5HLAorCQkJbmV3IFN0cmluZ1tdIHsKKwkJCQlJRGlhbG9nQ29uc3RhbnRzLllFU19MQUJFTCwKKwkJCQlJRGlhbG9nQ29uc3RhbnRzLk5PX0xBQkVMIH0sCisJCQkwKTsKKwkJdGhpcy5jb25mbGljdHMgPSBjb25mbGljdHM7CisJCVVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRMYWJlbFByb3ZpZGVyKCkuY29ubmVjdCh0aGlzKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBjbG9zZSgpIHsKKwkJVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldExhYmVsUHJvdmlkZXIoKS5kaXNjb25uZWN0KHRoaXMpOworCQlyZXR1cm4gc3VwZXIuY2xvc2UoKTsKKwl9CisKKwlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDdXN0b21BcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJQ29tcG9zaXRlIGNsaWVudCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7CisJCWNsaWVudC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKKwkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOworCQljbGllbnQuc2V0TGF5b3V0KGxheW91dCk7CisKKwkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY2xpZW50LCBTV1QuTlVMTCk7CisJCWxhYmVsLnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5EdXBsaWNhdGVDb25mbGljdHNEaWFsb2dfdHJlZUxhYmVsKTsgCisKKwkJdHJlZVZpZXdlciA9IG5ldyBUcmVlVmlld2VyKGNsaWVudCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOworCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOworCQlnZC5oZWlnaHRIaW50ID0gMjAwOworCQlnZC53aWR0aEhpbnQgPSAzMDA7CisJCXRyZWVWaWV3ZXIuZ2V0VHJlZSgpLnNldExheW91dERhdGEoZ2QpOworCQl0cmVlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQ29uZmxpY3RDb250ZW50UHJvdmlkZXIoKSk7CisJCXRyZWVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgQ29uZmxpY3RMYWJlbFByb3ZpZGVyKCkpOworCQl0cmVlVmlld2VyLnNldEF1dG9FeHBhbmRMZXZlbCgxMCk7CisJCXRyZWVWaWV3ZXIuc2V0U29ydGVyKG5ldyBWaWV3ZXJTb3J0ZXIoKSB7CisJCX0pOworCQl0cmVlVmlld2VyLnNldElucHV0KGNvbmZsaWN0cyk7CisJCXJldHVybiBjbGllbnQ7CisJfQorCit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9FZGl0U2l0ZURpYWxvZy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvRWRpdFNpdGVEaWFsb2cuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzdhNjliCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvRWRpdFNpdGVEaWFsb2cuamF2YQpAQCAtMCwwICsxLDY5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLndpemFyZHM7CisKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworCitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbC5TaXRlQm9va21hcms7CisKKworcHVibGljIGNsYXNzIEVkaXRTaXRlRGlhbG9nIGV4dGVuZHMgTmV3VXBkYXRlU2l0ZURpYWxvZyB7CisJU2l0ZUJvb2ttYXJrIGJvb2ttYXJrOworCXByaXZhdGUgaW50IGlnbm9yZUJvb2ttYXJrID0gLTE7CisKKwlwdWJsaWMgRWRpdFNpdGVEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFNpdGVCb29rbWFyayBib29rbWFyaywgU2l0ZUJvb2ttYXJrW10gc2l0ZUJvb2ttYXJrcykgeworCQlzdXBlcihwYXJlbnRTaGVsbCwgc2l0ZUJvb2ttYXJrcyk7CisJCXRoaXMuYm9va21hcmsgPSBib29rbWFyazsKKwkJaWdub3JlQm9va21hcmsoc2l0ZUJvb2ttYXJrcyk7CisJfQorCisJcHVibGljIEVkaXRTaXRlRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBTaXRlQm9va21hcmsgYm9va21hcmssIFNpdGVCb29rbWFya1tdIHNpdGVCb29rbWFya3MsIGJvb2xlYW4gZW5hYmxlT0spIHsKKwkJc3VwZXIocGFyZW50U2hlbGwsIGVuYWJsZU9LLCBzaXRlQm9va21hcmtzKTsKKwkJdGhpcy5ib29rbWFyayA9IGJvb2ttYXJrOworCQlpZ25vcmVCb29rbWFyayhzaXRlQm9va21hcmtzKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRmllbGRzKCkgeworCQluYW1lLnNldFRleHQoYm9va21hcmsuZ2V0TmFtZSgpKTsKKwkJdXJsLnNldFRleHQoYm9va21hcmsuZ2V0VVJMKCkudG9TdHJpbmcoKSk7CisJCXVybC5zZXRFZGl0YWJsZSghYm9va21hcmsuaXNMb2NhbCgpKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoKSB7CisJCXRyeSB7CisJCQlib29rbWFyay5zZXROYW1lKG5hbWUuZ2V0VGV4dCgpKTsKKwkJCWJvb2ttYXJrLnNldFVSTChuZXcgVVJMKHVybC5nZXRUZXh0KCkpKTsKKwkJCVVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRVcGRhdGVNb2RlbCgpLmZpcmVPYmplY3RDaGFuZ2VkKGJvb2ttYXJrLCBudWxsKTsKKwkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKwkJfQorCX0KKwkKKwlwcml2YXRlIHZvaWQgaWdub3JlQm9va21hcmsoIFNpdGVCb29rbWFya1tdIHNpdGVCb29rbWFya3MpIHsKKwkJCisJCWZvciggaW50IGkgPSAwOyBpIDwgc2l0ZUJvb2ttYXJrcy5sZW5ndGg7IGkrKykgeworCisJCQlpZiAoc2l0ZUJvb2ttYXJrc1tpXS5nZXRMYWJlbCgpLmVxdWFscyhib29rbWFyay5nZXRMYWJlbCgpLnRyaW0oKSkgJiYKKwkJCQlzaXRlQm9va21hcmtzW2ldLmdldFVSTCgpLmVxdWFscyhib29rbWFyay5nZXRVUkwoKSkpIHsJCisJCQkJaWdub3JlQm9va21hcmsgPSBpOwkKKwkJCQlyZXR1cm47CisJCQl9CisJCQkKKwkJfQorCX0KKwkKKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc0N1cnJlbnRseUVkaXRlZFNpdGVCb29rbWFyayggaW50IGluZGV4KSB7CisJCQorCQlyZXR1cm4gaW5kZXggPT0gaWdub3JlQm9va21hcms7CisJfQorfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvRmVhdHVyZVNvcnRlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvRmVhdHVyZVNvcnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllYWIyZWIKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9GZWF0dXJlU29ydGVyLmphdmEKQEAgLTAsMCArMSw4OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS53aXphcmRzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuKjsKKworcHVibGljIGNsYXNzIEZlYXR1cmVTb3J0ZXIgZXh0ZW5kcyBWaWV3ZXJTb3J0ZXIgeworCQorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZFQVRVUkVfVkVSU0lPTiA9IDE7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkVBVFVSRV9MQUJFTCA9IDI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkVBVFVSRV9QUk9WSURFUiA9IDM7CisJCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVNDRU5ESU5HID0gMTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVNDRU5ESU5HID0gLTE7CisJCisJcHJpdmF0ZSBpbnQga2V5ID0gRkVBVFVSRV9MQUJFTDsKKwlwcml2YXRlIGludCBsYWJlbE9yZGVyOworCXByaXZhdGUgaW50IHZlcnNpb25PcmRlcjsKKwlwcml2YXRlIGludCBwcm92aWRlck9yZGVyOworCQorCXB1YmxpYyBGZWF0dXJlU29ydGVyKGludCBrZXksIGludCBsYWJlbE9yZGVyLCBpbnQgdmVyc2lvbk9yZGVyLCBpbnQgcHJvdmlkZXJPcmRlcikgeworCQl0aGlzLmtleSA9IGtleTsKKwkJdGhpcy5sYWJlbE9yZGVyID0gbGFiZWxPcmRlcjsKKwkJdGhpcy52ZXJzaW9uT3JkZXIgPSB2ZXJzaW9uT3JkZXI7CisJCXRoaXMucHJvdmlkZXJPcmRlciA9IHByb3ZpZGVyT3JkZXI7CisJfQorCisJcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBlMSwgT2JqZWN0IGUyKSB7CisJCWlmICghKGUxIGluc3RhbmNlb2YgSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uKQorCQkJfHwgIShlMiBpbnN0YW5jZW9mIElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbikpCisJCQlyZXR1cm4gc3VwZXIuY29tcGFyZSh2aWV3ZXIsIGUxLCBlMik7CisJCQkKKwkJSUZlYXR1cmUgZjEgPSAoKElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbillMSkuZ2V0RmVhdHVyZSgpOworCQlJRmVhdHVyZSBmMiA9ICgoSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uKWUyKS5nZXRGZWF0dXJlKCk7CisJCQorCQlQbHVnaW5WZXJzaW9uSWRlbnRpZmllciB2MSA9IGYxLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRWZXJzaW9uKCk7CisJCVBsdWdpblZlcnNpb25JZGVudGlmaWVyIHYyID0gZjIuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldFZlcnNpb24oKTsKKwkJCisJCVN0cmluZyBsYWJlbDEgPSBmMS5nZXRMYWJlbCgpID09IG51bGwgPyAiIiA6IGYxLmdldExhYmVsKCk7IC8vJE5PTi1OTFMtMSQKKwkJU3RyaW5nIGxhYmVsMiA9IGYyLmdldExhYmVsKCkgPT0gbnVsbCA/ICIiIDogZjIuZ2V0TGFiZWwoKTsgLy8kTk9OLU5MUy0xJAorCQkKKwkJU3RyaW5nIHByb3ZpZGVyMSA9IGYxLmdldFByb3ZpZGVyKCkgPT0gbnVsbCA/ICIiIDogZjEuZ2V0UHJvdmlkZXIoKTsgLy8kTk9OLU5MUy0xJAorCQlTdHJpbmcgcHJvdmlkZXIyID0gZjIuZ2V0UHJvdmlkZXIoKSA9PSBudWxsID8gIiIgOiBmMi5nZXRQcm92aWRlcigpOyAvLyROT04tTkxTLTEkCisJCQorCQlpbnQgcmVzdWx0ID0gMDsKKwkJaWYgKGtleSA9PSBGRUFUVVJFX1ZFUlNJT04pIHsKKwkJCXJlc3VsdCA9IGNvbXBhcmVWZXJzaW9ucyh2MSwgdjIpICogdmVyc2lvbk9yZGVyOworCQkJaWYgKHJlc3VsdCA9PSAwKSB7CisJCQkJcmVzdWx0ID0gY29sbGF0b3IuY29tcGFyZShsYWJlbDEsIGxhYmVsMikgKiBsYWJlbE9yZGVyOworCQkJCWlmIChyZXN1bHQgPT0gMCkKKwkJCQkJcmVzdWx0ID0gY29sbGF0b3IuY29tcGFyZShwcm92aWRlcjEsIHByb3ZpZGVyMikgKiBwcm92aWRlck9yZGVyOworCQkJfQorCQl9IGVsc2UgaWYgKGtleSA9PSBGRUFUVVJFX0xBQkVMKSB7CisJCQlyZXN1bHQgPSBjb2xsYXRvci5jb21wYXJlKGxhYmVsMSwgbGFiZWwyKSAqIGxhYmVsT3JkZXI7CisJCQlpZiAocmVzdWx0ID09IDApIHsKKwkJCQlyZXN1bHQgPSBjb21wYXJlVmVyc2lvbnModjEsIHYyKSAqIHZlcnNpb25PcmRlcjsKKwkJCQlpZiAocmVzdWx0ID09IDApCisJCQkJCXJlc3VsdCA9IGNvbGxhdG9yLmNvbXBhcmUocHJvdmlkZXIxLCBwcm92aWRlcjIpICogcHJvdmlkZXJPcmRlcjsKKwkJCX0KKwkJfSBlbHNlIGlmIChrZXkgPT0gRkVBVFVSRV9QUk9WSURFUikgeworCQkJcmVzdWx0ID0gY29sbGF0b3IuY29tcGFyZShwcm92aWRlcjEsIHByb3ZpZGVyMikgKiBwcm92aWRlck9yZGVyOworCQkJaWYgKHJlc3VsdCA9PSAwKSB7CisJCQkJcmVzdWx0ID0gY29sbGF0b3IuY29tcGFyZShsYWJlbDEsIGxhYmVsMikgKiBsYWJlbE9yZGVyOworCQkJCWlmIChyZXN1bHQgPT0gMCkKKwkJCQkJcmVzdWx0ID0gY29tcGFyZVZlcnNpb25zKHYxLCB2MikgKiB2ZXJzaW9uT3JkZXI7CisJCQl9CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisJCisJcHJpdmF0ZSBpbnQgY29tcGFyZVZlcnNpb25zKFBsdWdpblZlcnNpb25JZGVudGlmaWVyIHYxLCBQbHVnaW5WZXJzaW9uSWRlbnRpZmllciB2MikgeworCQlpZiAodjEuZXF1YWxzKHYyKSkKKwkJCXJldHVybiAwOworCQlyZXR1cm4gdjIuaXNHcmVhdGVyVGhhbih2MSkgPyAtMSA6IDE7CisJfQorCQorfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvSUR5bmFtaWNQYWdlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9JRHluYW1pY1BhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYThiYWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvSUR5bmFtaWNQYWdlLmphdmEKQEAgLTAsMCArMSwyMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS53aXphcmRzOworCisKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy4qOworCisvKioKKyAqICBBIGR5bmFtaWMgcGFnZSBpbiB0aGUgaW5zdGFsbCB3aXphcmQKKyAqLworcHVibGljIGludGVyZmFjZSBJRHluYW1pY1BhZ2UgeworCXB1YmxpYyB2b2lkIHNldEpvYnMoSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIFtdIGpvYnMpOworCit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9JU2VhcmNoUHJvdmlkZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL0lTZWFyY2hQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2ZjMyY2QKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9JU2VhcmNoUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDIwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLndpemFyZHM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuc2VhcmNoLlVwZGF0ZVNlYXJjaFJlcXVlc3Q7CisKKy8qKgorICogQSBzZWFyY2ggcmVxdWVzdCBwcm92aWRlcgorICovCitwdWJsaWMgaW50ZXJmYWNlIElTZWFyY2hQcm92aWRlciB7CisJVXBkYXRlU2VhcmNoUmVxdWVzdCBnZXRTZWFyY2hSZXF1ZXN0KCk7Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9JbnN0YWxsV2l6YXJkLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9JbnN0YWxsV2l6YXJkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FlMDk5MwotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL0luc3RhbGxXaXphcmQuamF2YQpAQCAtMCwwICsxLDE1NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS53aXphcmRzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5VcGRhdGVDb3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5zZWFyY2guU2l0ZVNlYXJjaENhdGVnb3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUlJbWFnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnNlYXJjaC5CYWNrTGV2ZWxGaWx0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnNlYXJjaC5VcGRhdGVTZWFyY2hSZXF1ZXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5zZWFyY2guVXBkYXRlU2VhcmNoU2NvcGU7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnVpLlVwZGF0ZUpvYjsKKworcHVibGljIGNsYXNzIEluc3RhbGxXaXphcmQKKwlleHRlbmRzIFdpemFyZAorCWltcGxlbWVudHMgSVNlYXJjaFByb3ZpZGVyIHsKKwlwcml2YXRlIE1vZGVTZWxlY3Rpb25QYWdlIG1vZGVQYWdlOworCXByaXZhdGUgU2l0ZVBhZ2Ugc2l0ZVBhZ2U7CisJcHJpdmF0ZSBpbnQgaW5zdGFsbENvdW50ID0gMDsKKwlwcml2YXRlIFVwZGF0ZVNlYXJjaFJlcXVlc3Qgc2VhcmNoUmVxdWVzdDsKKwlwcml2YXRlIGJvb2xlYW4gbmVlZHNSZXN0YXJ0OworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNSdW5uaW5nOworCXByaXZhdGUgVXBkYXRlSm9iIGpvYjsKKwlwcml2YXRlIEluc3RhbGxXaXphcmRPcGVyYXRpb24gb3BlcmF0aW9uOworCisKKwlwdWJsaWMgSW5zdGFsbFdpemFyZChVcGRhdGVTZWFyY2hSZXF1ZXN0IHNlYXJjaFJlcXVlc3QpIHsKKwkJaXNSdW5uaW5nID0gdHJ1ZTsKKyAgICAgICAgaWYgKHNlYXJjaFJlcXVlc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgc2VhcmNoUmVxdWVzdCA9CisgICAgICAgICAgICAgICAgbmV3IFVwZGF0ZVNlYXJjaFJlcXVlc3QoCisgICAgICAgICAgICAgICAgICAgIG5ldyBTaXRlU2VhcmNoQ2F0ZWdvcnkodHJ1ZSksCisgICAgICAgICAgICAgICAgICAgIG5ldyBVcGRhdGVTZWFyY2hTY29wZSgpKTsKKyAgICAgICAgICAgIHNlYXJjaFJlcXVlc3QuYWRkRmlsdGVyKG5ldyBCYWNrTGV2ZWxGaWx0ZXIoKSk7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5zZWFyY2hSZXF1ZXN0ID0gc2VhcmNoUmVxdWVzdDsKKwkJc2V0RGlhbG9nU2V0dGluZ3MoVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldERpYWxvZ1NldHRpbmdzKCkpOworCQlzZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihVcGRhdGVVSUltYWdlcy5ERVNDX1VQREFURV9XSVopOworCQlzZXRGb3JjZVByZXZpb3VzQW5kTmV4dEJ1dHRvbnModHJ1ZSk7CisJCXNldE5lZWRzUHJvZ3Jlc3NNb25pdG9yKHRydWUpOworCQlzZXRXaW5kb3dUaXRsZShVcGRhdGVVSU1lc3NhZ2VzLkluc3RhbGxXaXphcmRfd3RpdGxlKTsgCisJfQorCisJcHVibGljIGJvb2xlYW4gaXNSZXN0YXJ0TmVlZGVkKCkgeworCQlyZXR1cm4gaW5zdGFsbENvdW50ID4gMCAmJiBuZWVkc1Jlc3RhcnQ7IC8vIG9yID09IHNlbGVjdGVkSm9icy5sZW5ndGgKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtQ2FuY2VsKCkgeworCQlpc1J1bm5pbmcgPSBmYWxzZTsKKwkJcmV0dXJuIHN1cGVyLnBlcmZvcm1DYW5jZWwoKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKKwkJbW9kZVBhZ2UgPSBuZXcgTW9kZVNlbGVjdGlvblBhZ2Uoc2VhcmNoUmVxdWVzdCk7CisJCWFkZFBhZ2UobW9kZVBhZ2UpOworCQlzaXRlUGFnZSA9IG5ldyBTaXRlUGFnZShzZWFyY2hSZXF1ZXN0KTsKKwkJYWRkUGFnZShzaXRlUGFnZSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHNhdmVTZXR0aW5ncygpIHsKKwkJaWYgKG1vZGVQYWdlICE9IG51bGwpCisJCQltb2RlUGFnZS5zYXZlU2V0dGluZ3MoKTsKKwl9CisKKwlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0TmV4dFBhZ2UoSVdpemFyZFBhZ2UgcGFnZSkgeworCisJCWlmIChtb2RlUGFnZSAhPSBudWxsICYmIHBhZ2UuZXF1YWxzKG1vZGVQYWdlKSkgeworCQkJYm9vbGVhbiB1cGRhdGUgPSBtb2RlUGFnZS5pc1VwZGF0ZU1vZGUoKTsKKwkJCWlmICghdXBkYXRlKQorCQkJCXJldHVybiBzaXRlUGFnZTsKKwkJfQorICAgICAgICByZXR1cm4gbnVsbDsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkud2l6YXJkcy5JU2VhcmNoUHJvdmlkZXIyI2dldFNlYXJjaFJlcXVlc3QoKQorCSAqLworCXB1YmxpYyBVcGRhdGVTZWFyY2hSZXF1ZXN0IGdldFNlYXJjaFJlcXVlc3QoKSB7CisJCXJldHVybiBzZWFyY2hSZXF1ZXN0OworCX0KKworCXB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNSdW5uaW5nKCkgeworCQlyZXR1cm4gaXNSdW5uaW5nIHx8IEpvYi5nZXRKb2JNYW5hZ2VyKCkuZmluZChVcGRhdGVKb2IuRkFNSUxZKS5sZW5ndGggPiAwOworCX0KKworICAgIC8qKgorICAgICAqIEBzZWUgV2l6YXJkI3BlcmZvcm1GaW5pc2goKQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7CisKKyAgICAgICAgc2F2ZVNldHRpbmdzKCk7CisgICAgICAgIAorICAgICAgICBpZiAoSm9iLmdldEpvYk1hbmFnZXIoKS5maW5kKFVwZGF0ZUpvYi5GQU1JTFkpLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgIC8vIGFub3RoZXIgdXBkYXRlL2luc3RhbGwgam9iIGlzIHJ1bm5pbmcsIG5lZWQgdG8gd2FpdCB0byBmaW5pc2ggb3IgY2FuY2VsIG9sZCBqb2IKKyAgICAgICAgICAgIGJvb2xlYW4gcHJvY2VlZCA9IE1lc3NhZ2VEaWFsb2cub3BlblF1ZXN0aW9uKAorICAgICAgICAgICAgICAgICAgICBVcGRhdGVVSS5nZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpLAorICAgICAgICAgICAgICAgICAgICBVcGRhdGVVSU1lc3NhZ2VzLkluc3RhbGxXaXphcmRfYW5vdGhlckpvYlRpdGxlLAorICAgICAgICAgICAgICAgICAgICBVcGRhdGVVSU1lc3NhZ2VzLkluc3RhbGxXaXphcmRfYW5vdGhlckpvYik7IAorICAgICAgICAgICAgaWYgKCFwcm9jZWVkKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gY2FuY2VsIHRoaXMgam9iLCBhbmQgbGV0IHRoZSBvbGQgb25lIGdvIG9uCisgICAgICAgIH0KKyAgICAgICAgVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXRVcGRhdGVTZXNzaW9uKCkucmVzZXQoKTsKKyAgICAgICAgbGF1bmNoSW5CYWNrZ3JvdW5kKCk7CisgICAgICAgIGlzUnVubmluZyA9IGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgCisJcHJpdmF0ZSB2b2lkIGxhdW5jaEluQmFja2dyb3VuZCgpIHsKKwkJLy8gRG93bmxvYWRzIHRoZSBmZWF0dXJlIGNvbnRlbnQgaW4gdGhlIGJhY2tncm91bmQuCisJCS8vIFRoZSBqb2IgbGlzdGVuZXIgd2lsbCB0aGVuIGluc3RhbGwgdGhlIGZlYXR1cmUgd2hlbiBkb3dubG9hZCBpcyBmaW5pc2hlZC4KKworICAgICAgICBpZiAoaXNVcGRhdGUoKSkKKyAgICAgICAgICAgIGpvYiA9IG5ldyBVcGRhdGVKb2IoVXBkYXRlVUlNZXNzYWdlcy5JbnN0YWxsV2l6YXJkX2pvYk5hbWUsIGZhbHNlLCBmYWxzZSk7ICAKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgam9iID0gbmV3IFVwZGF0ZUpvYihVcGRhdGVVSU1lc3NhZ2VzLkluc3RhbGxXaXphcmRfam9iTmFtZSwgc2VhcmNoUmVxdWVzdCk7ICAKKwkJam9iLnNldFVzZXIodHJ1ZSk7CisJCWpvYi5zZXRQcmlvcml0eShKb2IuSU5URVJBQ1RJVkUpOworLy8JCWlmICh3YWl0KSB7CisvLwkJCXByb2dyZXNzU2VydmljZS5zaG93SW5EaWFsb2cod29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksIGpvYik7IAorLy8JCX0KKwkJZ2V0T3BlcmF0aW9uKCkucnVuKFVwZGF0ZVVJLmdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCksIGpvYik7CisJfQorICAgIAorICAgIHByaXZhdGUgSW5zdGFsbFdpemFyZE9wZXJhdGlvbiBnZXRPcGVyYXRpb24oKSB7CisJCWlmIChvcGVyYXRpb24gPT0gbnVsbCkKKwkJCW9wZXJhdGlvbiA9IG5ldyBJbnN0YWxsV2l6YXJkT3BlcmF0aW9uKCk7CisJCXJldHVybiBvcGVyYXRpb247CisJfQorCisgICAgcHVibGljIGJvb2xlYW4gY2FuRmluaXNoKCkgeworICAgIAkgICAgICAKKyAgICAJaWYgKCBtb2RlUGFnZS5pc0N1cnJlbnRQYWdlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBpc1VwZGF0ZSgpOworICAgIAl9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHNpdGVQYWdlLmlzUGFnZUNvbXBsZXRlKCk7CisgICAgCX0gICAJCisgICAgfQorICAgIAorICAgIHByaXZhdGUgYm9vbGVhbiBpc1VwZGF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIChtb2RlUGFnZSAhPSBudWxsICYmIG1vZGVQYWdlLmlzVXBkYXRlTW9kZSgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9JbnN0YWxsV2l6YXJkMi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvSW5zdGFsbFdpemFyZDIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmQyNDZmCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvSW5zdGFsbFdpemFyZDIuamF2YQpAQCAtMCwwICsxLDU1MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS53aXphcmRzOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JSm9iQ2hhbmdlRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSUpvYkNoYW5nZUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2JDaGFuZ2VBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi5JSW5zdGFsbENvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmVSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JU2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JU2l0ZUZlYXR1cmVSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVZlcmlmaWNhdGlvbkxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlNpdGVNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLkluc3RhbGxBYm9ydGVkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLkZlYXR1cmVEb3dubG9hZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5MaXRlRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5VcGRhdGVDb3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zLkR1cGxpY2F0ZUNvbmZsaWN0c1ZhbGlkYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwub3BlcmF0aW9ucy5JbnN0YWxsT3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zLlVwZGF0ZVV0aWxzOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUlJbWFnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnNlY3VyaXR5LkphclZlcmlmaWNhdGlvblNlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuSUJhdGNoT3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLklGZWF0dXJlT3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLklJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy5JT3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLklPcGVyYXRpb25MaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy5PcGVyYXRpb25zTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuc2VhcmNoLlVwZGF0ZVNlYXJjaFJlcXVlc3Q7CisKKworcHVibGljIGNsYXNzIEluc3RhbGxXaXphcmQyCisJZXh0ZW5kcyBXaXphcmQKKwlpbXBsZW1lbnRzIElPcGVyYXRpb25MaXN0ZW5lciwgSVNlYXJjaFByb3ZpZGVyIHsKKwlwcml2YXRlIFJldmlld1BhZ2UgcmV2aWV3UGFnZTsKKwlwcml2YXRlIExpY2Vuc2VQYWdlIGxpY2Vuc2VQYWdlOworCXByaXZhdGUgT3B0aW9uYWxGZWF0dXJlc1BhZ2Ugb3B0aW9uYWxGZWF0dXJlc1BhZ2U7CisJcHJpdmF0ZSBUYXJnZXRQYWdlIHRhcmdldFBhZ2U7CisJcHJpdmF0ZSBJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnOworCXByaXZhdGUgaW50IGluc3RhbGxDb3VudCA9IDA7CisJcHJpdmF0ZSBVcGRhdGVTZWFyY2hSZXF1ZXN0IHNlYXJjaFJlcXVlc3Q7CisJcHJpdmF0ZSBBcnJheUxpc3Qgam9iczsKKwlwcml2YXRlIGJvb2xlYW4gbmVlZHNSZXN0YXJ0OworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNSdW5uaW5nOworCXByaXZhdGUgSUJhdGNoT3BlcmF0aW9uIGluc3RhbGxPcGVyYXRpb247CisJcHJpdmF0ZSBKb2Igam9iOworCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IGpvYkZhbWlseSA9IG5ldyBPYmplY3QoKTsKKwlwcml2YXRlIElKb2JDaGFuZ2VMaXN0ZW5lciBqb2JMaXN0ZW5lcjsKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNVcGRhdGU7CisKKwlwdWJsaWMgSW5zdGFsbFdpemFyZDIoVXBkYXRlU2VhcmNoUmVxdWVzdCBzZWFyY2hSZXF1ZXN0LCBJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb25bXSBqb2JzLCBib29sZWFuIGlzVXBkYXRlKSB7CisJCXRoaXMgKHNlYXJjaFJlcXVlc3QsIG5ldyBBcnJheUxpc3QoQXJyYXlzLmFzTGlzdChqb2JzKSksIGlzVXBkYXRlKTsKKwl9CisKKwlwdWJsaWMgSW5zdGFsbFdpemFyZDIoVXBkYXRlU2VhcmNoUmVxdWVzdCBzZWFyY2hSZXF1ZXN0LCBBcnJheUxpc3Qgam9icywgYm9vbGVhbiBpc1VwZGF0ZSkgeworCQl0aGlzLmlzVXBkYXRlID0gaXNVcGRhdGU7CisgICAgICAgIHRoaXMuc2VhcmNoUmVxdWVzdCA9IHNlYXJjaFJlcXVlc3Q7CisgICAgICAgIHRoaXMuam9icyA9IGpvYnM7CisgICAgICAgIGlzUnVubmluZyA9IHRydWU7CisgICAgICAgIHNldERpYWxvZ1NldHRpbmdzKFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXREaWFsb2dTZXR0aW5ncygpKTsKKyAgICAgICAgc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoVXBkYXRlVUlJbWFnZXMuREVTQ19VUERBVEVfV0laKTsKKyAgICAgICAgc2V0Rm9yY2VQcmV2aW91c0FuZE5leHRCdXR0b25zKHRydWUpOworICAgICAgICBzZXROZWVkc1Byb2dyZXNzTW9uaXRvcih0cnVlKTsKKyAgICAgICAgc2V0V2luZG93VGl0bGUoVXBkYXRlVUlNZXNzYWdlcy5JbnN0YWxsV2l6YXJkX3d0aXRsZSk7IAorCX0KKyAgICAKKwlwdWJsaWMgaW50IGdldEluc3RhbGxDb3VudCgpIHsKKwkJcmV0dXJuIGluc3RhbGxDb3VudDsKKwl9CisJcHVibGljIGJvb2xlYW4gaXNSZXN0YXJ0TmVlZGVkKCkgeworCQlyZXR1cm4gaW5zdGFsbENvdW50ID4gMCAmJiBuZWVkc1Jlc3RhcnQ7IC8vIG9yID09IHNlbGVjdGVkSm9icy5sZW5ndGgKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtQ2FuY2VsKCkgeworCQlpc1J1bm5pbmcgPSBmYWxzZTsKKwkJaWYgKHRhcmdldFBhZ2UgIT0gbnVsbCkKKwkJCXRhcmdldFBhZ2UucmVtb3ZlQWRkZWRTaXRlcygpOworCQlyZXR1cm4gc3VwZXIucGVyZm9ybUNhbmNlbCgpOworCX0KKwkvKioKKwkgKiBAc2VlIFdpemFyZCNwZXJmb3JtRmluaXNoKCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgeworCQlJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb25bXSBzZWxlY3RlZEpvYnMgPSByZXZpZXdQYWdlLmdldFNlbGVjdGVkSm9icygpOworCQkKKwkJLy8gQ2hlY2sgZm9yIGR1cGxpY2F0aW9uIGNvbmZsaWN0cworCQlBcnJheUxpc3QgY29uZmxpY3RzID0gRHVwbGljYXRlQ29uZmxpY3RzVmFsaWRhdG9yLmNvbXB1dGVEdXBsaWNhdGVDb25mbGljdHMoc2VsZWN0ZWRKb2JzLCBjb25maWcpOworCQlpZiAoY29uZmxpY3RzICE9IG51bGwpIHsKKwkJCUR1cGxpY2F0ZUNvbmZsaWN0c0RpYWxvZyBkaWFsb2cgPSBuZXcgRHVwbGljYXRlQ29uZmxpY3RzRGlhbG9nKGdldFNoZWxsKCksIGNvbmZsaWN0cyk7CisJCQlpZiAoZGlhbG9nLm9wZW4oKSAhPSAwKQorCQkJCXJldHVybiBmYWxzZTsKKwkJfQorCQkKKwkJaWYgKEpvYi5nZXRKb2JNYW5hZ2VyKCkuZmluZChqb2JGYW1pbHkpLmxlbmd0aCA+IDApIHsKKwkJCS8vIGFub3RoZXIgdXBkYXRlL2luc3RhbGwgam9iIGlzIHJ1bm5pbmcsIG5lZWQgdG8gd2FpdCB0byBmaW5pc2ggb3IgY2FuY2VsIG9sZCBqb2IKKwkJCWJvb2xlYW4gcHJvY2VlZCA9IE1lc3NhZ2VEaWFsb2cub3BlblF1ZXN0aW9uKAorCQkJCQlVcGRhdGVVSS5nZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpLAorCQkJCQlVcGRhdGVVSU1lc3NhZ2VzLkluc3RhbGxXaXphcmRfYW5vdGhlckpvYlRpdGxlLAorCQkJCQlVcGRhdGVVSU1lc3NhZ2VzLkluc3RhbGxXaXphcmRfYW5vdGhlckpvYik7IAorCQkJaWYgKCFwcm9jZWVkKQorCQkJCXJldHVybiBmYWxzZTsgLy8gY2FuY2VsIHRoaXMgam9iLCBhbmQgbGV0IHRoZSBvbGQgb25lIGdvIG9uCisJCX0KKwkJCisJCS8vIHNldCB0aGUgaW5zdGFsbCBvcGVyYXRpb24KKwkJaW5zdGFsbE9wZXJhdGlvbiA9IGdldEJhdGNoSW5zdGFsbE9wZXJhdGlvbihzZWxlY3RlZEpvYnMpOworCQlpZiAoaW5zdGFsbE9wZXJhdGlvbiAhPSBudWxsKQorCQkJbGF1bmNoSW5CYWNrZ3JvdW5kKCk7CisJCXJldHVybiB0cnVlOworCX0KKworCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgeworCQlyZXZpZXdQYWdlID0gbmV3IFJldmlld1BhZ2UoaXNVcGRhdGUsIHNlYXJjaFJlcXVlc3QsIGpvYnMpOworCQlhZGRQYWdlKHJldmlld1BhZ2UpOworCisJCXRyeSB7CisvLwkJCWNvbmZpZyA9IFVwZGF0ZVV0aWxzLmNyZWF0ZUluc3RhbGxDb25maWd1cmF0aW9uKCk7CisJCQljb25maWcgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpOworCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCVVwZGF0ZVVJLmxvZ0V4Y2VwdGlvbihlKTsKKwkJfQorCisJCWxpY2Vuc2VQYWdlID0gbmV3IExpY2Vuc2VQYWdlKHRydWUpOworCQlhZGRQYWdlKGxpY2Vuc2VQYWdlKTsKKwkJb3B0aW9uYWxGZWF0dXJlc1BhZ2UgPSBuZXcgT3B0aW9uYWxGZWF0dXJlc1BhZ2UoY29uZmlnKTsKKwkJYWRkUGFnZShvcHRpb25hbEZlYXR1cmVzUGFnZSk7CisJCXRhcmdldFBhZ2UgPSBuZXcgVGFyZ2V0UGFnZShjb25maWcsIGlzVXBkYXRlKTsKKwkJYWRkUGFnZSh0YXJnZXRQYWdlKTsKKwl9CisKKworCXByaXZhdGUgYm9vbGVhbiBpc1BhZ2VSZXF1aXJlZChJV2l6YXJkUGFnZSBwYWdlKSB7CisJCWlmIChwYWdlID09IG51bGwpCisJCQlyZXR1cm4gZmFsc2U7CisJCQkKKwkJaWYgKHBhZ2UuZXF1YWxzKGxpY2Vuc2VQYWdlKSkgeworCQkJcmV0dXJuIE9wZXJhdGlvbnNNYW5hZ2VyLmhhc1NlbGVjdGVkSm9ic1dpdGhMaWNlbnNlcygKKwkJCQlyZXZpZXdQYWdlLmdldFNlbGVjdGVkSm9icygpKTsKKwkJfQorCQlpZiAocGFnZS5lcXVhbHMob3B0aW9uYWxGZWF0dXJlc1BhZ2UpKSB7CisJCQlyZXR1cm4gT3BlcmF0aW9uc01hbmFnZXIuaGFzU2VsZWN0ZWRKb2JzV2l0aE9wdGlvbmFsRmVhdHVyZXMoCisJCQkJcmV2aWV3UGFnZS5nZXRTZWxlY3RlZEpvYnMoKSk7CisJCX0KKwkJaWYgKHBhZ2UuZXF1YWxzKHRhcmdldFBhZ2UpKSB7CisJCQlyZXR1cm4gcmV2aWV3UGFnZS5nZXRTZWxlY3RlZEpvYnMoKS5sZW5ndGggPiAwOworCQl9CisJCXJldHVybiB0cnVlOworCX0KKworCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZShJV2l6YXJkUGFnZSBwYWdlKSB7CisJCUlXaXphcmRQYWdlW10gcGFnZXMgPSBnZXRQYWdlcygpOworCQlib29sZWFuIHN0YXJ0ID0gZmFsc2U7CisJCUlXaXphcmRQYWdlIG5leHRQYWdlID0gbnVsbDsKKworCQlpZiAocGFnZS5lcXVhbHMocmV2aWV3UGFnZSkpIHsKKwkJCXVwZGF0ZUR5bmFtaWNQYWdlcygpOworCQl9CisKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYWdlcy5sZW5ndGg7IGkrKykgeworCQkJaWYgKHBhZ2VzW2ldLmVxdWFscyhwYWdlKSkgeworCQkJCXN0YXJ0ID0gdHJ1ZTsKKwkJCX0gZWxzZSBpZiAoc3RhcnQpIHsKKwkJCQlpZiAoaXNQYWdlUmVxdWlyZWQocGFnZXNbaV0pKSB7CisJCQkJCW5leHRQYWdlID0gcGFnZXNbaV07CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gbmV4dFBhZ2U7CisJfQorCisJcHJpdmF0ZSB2b2lkIHVwZGF0ZUR5bmFtaWNQYWdlcygpIHsKKwkJaWYgKGxpY2Vuc2VQYWdlICE9IG51bGwpIHsKKwkJCUlJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbltdIGxpY2Vuc2VKb2JzID0KKwkJCQlPcGVyYXRpb25zTWFuYWdlci5nZXRTZWxlY3RlZEpvYnNXaXRoTGljZW5zZXMoCisJCQkJCXJldmlld1BhZ2UuZ2V0U2VsZWN0ZWRKb2JzKCkpOworCQkJbGljZW5zZVBhZ2Uuc2V0Sm9icyhsaWNlbnNlSm9icyk7CisJCX0KKwkJaWYgKG9wdGlvbmFsRmVhdHVyZXNQYWdlICE9IG51bGwpIHsKKwkJCUlJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbltdIG9wdGlvbmFsSm9icyA9CisJCQkJT3BlcmF0aW9uc01hbmFnZXIuZ2V0U2VsZWN0ZWRKb2JzV2l0aE9wdGlvbmFsRmVhdHVyZXMoCisJCQkJCXJldmlld1BhZ2UuZ2V0U2VsZWN0ZWRKb2JzKCkpOworCQkJb3B0aW9uYWxGZWF0dXJlc1BhZ2Uuc2V0Sm9icyhvcHRpb25hbEpvYnMpOworCQl9CisJCWlmICh0YXJnZXRQYWdlICE9IG51bGwpIHsKKwkJCUlJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbltdIGluc3RhbGxKb2JzID0KKwkJCQlyZXZpZXdQYWdlLmdldFNlbGVjdGVkSm9icygpOworCQkJdGFyZ2V0UGFnZS5zZXRKb2JzKGluc3RhbGxKb2JzKTsKKwkJfQorCX0KKworCXB1YmxpYyBib29sZWFuIGNhbkZpbmlzaCgpIHsKKwkJSVdpemFyZFBhZ2UgcGFnZSA9IGdldENvbnRhaW5lcigpLmdldEN1cnJlbnRQYWdlKCk7CisJCXJldHVybiBwYWdlLmVxdWFscyh0YXJnZXRQYWdlKSAmJiBwYWdlLmlzUGFnZUNvbXBsZXRlKCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHByZXNlcnZlT3JpZ2luYXRpbmdVUkxzKAorCQlJRmVhdHVyZSBmZWF0dXJlLAorCQlJRmVhdHVyZVJlZmVyZW5jZVtdIG9wdGlvbmFsRmVhdHVyZXMpIHsKKwkJLy8gd2FsayB0aGUgaGllcmFyY2h5IGFuZCBwcmVzZXJ2ZSB0aGUgb3JpZ2luYXRpbmcgVVJMCisJCS8vIGZvciBhbGwgdGhlIG9wdGlvbmFsIGZlYXR1cmVzIHRoYXQgYXJlIG5vdCBjaG9zZW4gdG8KKwkJLy8gYmUgaW5zdGFsbGVkLgorCQlVUkwgdXJsID0gZmVhdHVyZS5nZXRTaXRlKCkuZ2V0VVJMKCk7CisJCXRyeSB7CisJCQlJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlW10gaXJlZnMgPQorCQkJCWZlYXR1cmUuZ2V0SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpcmVmcy5sZW5ndGg7IGkrKykgeworCQkJCUlJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UgaXJlZiA9IGlyZWZzW2ldOworCQkJCWJvb2xlYW4gcHJlc2VydmUgPSBmYWxzZTsKKwkJCQlpZiAoaXJlZi5pc09wdGlvbmFsKCkpIHsKKwkJCQkJYm9vbGVhbiBvblRoZUxpc3QgPSBmYWxzZTsKKwkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBvcHRpb25hbEZlYXR1cmVzLmxlbmd0aDsgaisrKSB7CisJCQkJCQlpZiAob3B0aW9uYWxGZWF0dXJlc1tqXS5lcXVhbHMoaXJlZikpIHsKKwkJCQkJCQkvL3dhcyBvbiB0aGUgbGlzdAorCQkJCQkJCW9uVGhlTGlzdCA9IHRydWU7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJaWYgKCFvblRoZUxpc3QpCisJCQkJCQlwcmVzZXJ2ZSA9IHRydWU7CisJCQkJfQorCQkJCWlmIChwcmVzZXJ2ZSkgeworCQkJCQl0cnkgeworCQkJCQkJU3RyaW5nIGlkID0KKwkJCQkJCQlpcmVmLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRJZGVudGlmaWVyKCk7CisJCQkJCQlVcGRhdGVVSS5zZXRPcmlnaW5hdGluZ1VSTChpZCwgdXJsKTsKKwkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkJCQkvLyBTaWxlbnRseSBpZ25vcmUKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCXRyeSB7CisJCQkJCQlJRmVhdHVyZSBpZmVhdHVyZSA9IGlyZWYuZ2V0RmVhdHVyZShudWxsKTsKKwkJCQkJCXByZXNlcnZlT3JpZ2luYXRpbmdVUkxzKGlmZWF0dXJlLCBvcHRpb25hbEZlYXR1cmVzKTsKKwkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkJCQkvLyBTaWxlbnRseSBpZ25vcmUKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkvLyBTaWxlbnRseSBpZ25vcmUKKwkJfQorCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLklPcGVyYXRpb25MaXN0ZW5lciNhZnRlckV4ZWN1dGUob3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuSU9wZXJhdGlvbikKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBhZnRlckV4ZWN1dGUoSU9wZXJhdGlvbiBvcGVyYXRpb24sIE9iamVjdCBkYXRhKSB7CisJCWlmICghKG9wZXJhdGlvbiBpbnN0YW5jZW9mIElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbikpCisJCQlyZXR1cm4gdHJ1ZTsKKwkJSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIGpvYiA9IChJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24pIG9wZXJhdGlvbjsKKwkJSUZlYXR1cmUgb2xkRmVhdHVyZSA9IGpvYi5nZXRPbGRGZWF0dXJlKCk7CisJCWlmIChvbGRGZWF0dXJlID09IG51bGwgJiYgam9iLmdldE9wdGlvbmFsRmVhdHVyZXMoKSAhPSBudWxsKQorCQkJcHJlc2VydmVPcmlnaW5hdGluZ1VSTHMoCisJCQkJam9iLmdldEZlYXR1cmUoKSwKKwkJCQlqb2IuZ2V0T3B0aW9uYWxGZWF0dXJlcygpKTsKKworCQlpbnN0YWxsQ291bnQrKzsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuSU9wZXJhdGlvbkxpc3RlbmVyI2JlZm9yZUV4ZWN1dGUob3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuSU9wZXJhdGlvbikKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBiZWZvcmVFeGVjdXRlKElPcGVyYXRpb24gb3BlcmF0aW9uLCBPYmplY3QgZGF0YSkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLndpemFyZHMuSVNlYXJjaFByb3ZpZGVyMiNnZXRTZWFyY2hSZXF1ZXN0KCkKKwkgKi8KKwlwdWJsaWMgVXBkYXRlU2VhcmNoUmVxdWVzdCBnZXRTZWFyY2hSZXF1ZXN0KCkgeworCQlyZXR1cm4gc2VhcmNoUmVxdWVzdDsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzUnVubmluZygpIHsKKwkJcmV0dXJuIGlzUnVubmluZyB8fCBKb2IuZ2V0Sm9iTWFuYWdlcigpLmZpbmQoam9iRmFtaWx5KS5sZW5ndGggPiAwOworCX0KKwkKKwlwcml2YXRlIElCYXRjaE9wZXJhdGlvbiBnZXRCYXRjaEluc3RhbGxPcGVyYXRpb24oZmluYWwgSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uW10gc2VsZWN0ZWRKb2JzKSB7CisJCWZpbmFsIElWZXJpZmljYXRpb25MaXN0ZW5lciB2ZXJpZmljYXRpb25MaXN0ZW5lciA9bmV3IEphclZlcmlmaWNhdGlvblNlcnZpY2UoCisJCQkJLy9JbnN0YWxsV2l6YXJkLnRoaXMuZ2V0U2hlbGwoKSk7CisJCQkJVXBkYXRlVUkuZ2V0QWN0aXZlV29ya2JlbmNoU2hlbGwoKSk7CisJCQorCQkvLyBzZXR1cCBqb2JzIHdpdGggdGhlIGNvcnJlY3QgZW52aXJvbm1lbnQKKwkJSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uW10gb3BlcmF0aW9ucyA9CW5ldyBJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb25bc2VsZWN0ZWRKb2JzLmxlbmd0aF07CisJCWZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0ZWRKb2JzLmxlbmd0aDsgaSsrKSB7CisJCQlJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gam9iID0gc2VsZWN0ZWRKb2JzW2ldOworCQkJSUZlYXR1cmVbXSB1bmNvbmZpZ3VyZWRPcHRpb25hbEZlYXR1cmVzID0gbnVsbDsKKwkJCUlGZWF0dXJlUmVmZXJlbmNlW10gb3B0aW9uYWxGZWF0dXJlcyA9IG51bGw7CisJCQlpZiAoVXBkYXRlVXRpbHMuaGFzT3B0aW9uYWxGZWF0dXJlcyhqb2IuZ2V0RmVhdHVyZSgpKSkgeworCQkJCW9wdGlvbmFsRmVhdHVyZXMgPSBvcHRpb25hbEZlYXR1cmVzUGFnZS5nZXRDaGVja2VkT3B0aW9uYWxGZWF0dXJlcyhqb2IpOworCQkJCXVuY29uZmlndXJlZE9wdGlvbmFsRmVhdHVyZXMgPSBvcHRpb25hbEZlYXR1cmVzUGFnZS5nZXRVbmNvbmZpZ3VyZWRPcHRpb25hbEZlYXR1cmVzKGpvYiwgam9iLmdldFRhcmdldFNpdGUoKSk7CisJCQl9CisJCQlJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gb3AgPQorCQkJCU9wZXJhdGlvbnNNYW5hZ2VyCisJCQkJCS5nZXRPcGVyYXRpb25GYWN0b3J5KCkKKwkJCQkJLmNyZWF0ZUluc3RhbGxPcGVyYXRpb24oCisJCQkJCWpvYi5nZXRUYXJnZXRTaXRlKCksCisJCQkJCWpvYi5nZXRGZWF0dXJlKCksCisJCQkJCW9wdGlvbmFsRmVhdHVyZXMsCisJCQkJCXVuY29uZmlndXJlZE9wdGlvbmFsRmVhdHVyZXMsCisJCQkJCXZlcmlmaWNhdGlvbkxpc3RlbmVyKTsKKwkJCW9wZXJhdGlvbnNbaV0gPSBvcDsKKwkJfQorCQlyZXR1cm4gT3BlcmF0aW9uc01hbmFnZXIuZ2V0T3BlcmF0aW9uRmFjdG9yeSgpLmNyZWF0ZUJhdGNoSW5zdGFsbE9wZXJhdGlvbihvcGVyYXRpb25zKTsKKwl9CisKKworCisJcHJpdmF0ZSB2b2lkIGxhdW5jaEluQmFja2dyb3VuZCgpIHsKKwkJLy8gRG93bmxvYWRzIHRoZSBmZWF0dXJlIGNvbnRlbnQgaW4gdGhlIGJhY2tncm91bmQuCisJCS8vIFRoZSBqb2IgbGlzdGVuZXIgd2lsbCB0aGVuIGluc3RhbGwgdGhlIGZlYXR1cmUgd2hlbiBkb3dubG9hZCBpcyBmaW5pc2hlZC4KKwkJCisJCS8vIFRPRE86IHNob3VsZCB3ZSBjYW5jZWwgZXhpc3Rpbmcgam9icz8KKwkJaWYgKGpvYkxpc3RlbmVyICE9IG51bGwpCisJCQlKb2IuZ2V0Sm9iTWFuYWdlcigpLnJlbW92ZUpvYkNoYW5nZUxpc3RlbmVyKGpvYkxpc3RlbmVyKTsKKwkJaWYgKGpvYiAhPSBudWxsKQorCQkJSm9iLmdldEpvYk1hbmFnZXIoKS5jYW5jZWwoam9iKTsKKwkJam9iTGlzdGVuZXIgPSBuZXcgVXBkYXRlSm9iQ2hhbmdlTGlzdGVuZXIoKTsKKwkJSm9iLmdldEpvYk1hbmFnZXIoKS5hZGRKb2JDaGFuZ2VMaXN0ZW5lcihqb2JMaXN0ZW5lcik7CisJCQorCQlqb2IgPSBuZXcgSm9iKFVwZGF0ZVVJTWVzc2FnZXMuSW5zdGFsbFdpemFyZF9qb2JOYW1lKSB7IAorCQkJcHVibGljIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgeworCQkJCWlmIChkb3dubG9hZChtb25pdG9yKSkKKwkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7CisJCQkJZWxzZSB7CisJCQkJCWlzUnVubmluZyA9IGZhbHNlOworCQkJCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7CisJCQkJfQorCQkJfQorCQkJcHVibGljIGJvb2xlYW4gYmVsb25nc1RvKE9iamVjdCBmYW1pbHkpIHsKKwkJCQlyZXR1cm4gSW5zdGFsbFdpemFyZDIuam9iRmFtaWx5ID09IGZhbWlseTsKKwkJCX0KKwkJfTsKKworCQlqb2Iuc2V0VXNlcih0cnVlKTsKKwkJam9iLnNldFByaW9yaXR5KEpvYi5JTlRFUkFDVElWRSk7CisvLwkJaWYgKHdhaXQpIHsKKy8vCQkJcHJvZ3Jlc3NTZXJ2aWNlLnNob3dJbkRpYWxvZyh3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSwgam9iKTsgCisvLwkJfQorCQlqb2Iuc2NoZWR1bGUoKTsKKwl9CisJCisJcHJpdmF0ZSBib29sZWFuIGluc3RhbGwoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJCS8vIEluc3RhbGxzIHRoZSAoYWxyZWFkeSBkb3dubG9hZGVkKSBmZWF0dXJlcyBhbmQgcHJvbXB0cyBmb3IgcmVzdGFydAorCQl0cnkgeworCQkJbmVlZHNSZXN0YXJ0ID0gaW5zdGFsbE9wZXJhdGlvbi5leGVjdXRlKG1vbml0b3IsIEluc3RhbGxXaXphcmQyLnRoaXMpOworCQkJVXBkYXRlVUkuZ2V0U3RhbmRhcmREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKKwkJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCVVwZGF0ZVVJLnJlcXVlc3RSZXN0YXJ0KEluc3RhbGxXaXphcmQyLnRoaXMuaXNSZXN0YXJ0TmVlZGVkKCkpOworCQkJCX0KKwkJCX0pOworCQl9IGNhdGNoIChmaW5hbCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKKwkJCWZpbmFsIFRocm93YWJsZSB0YXJnZXRFeGNlcHRpb24gPSBlLmdldFRhcmdldEV4Y2VwdGlvbigpOworCQkJaWYgKCEodGFyZ2V0RXhjZXB0aW9uIGluc3RhbmNlb2YgSW5zdGFsbEFib3J0ZWRFeGNlcHRpb24pKXsKKwkJCQlVcGRhdGVVSS5nZXRTdGFuZGFyZERpc3BsYXkoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7CisJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJCVVwZGF0ZVVJLmxvZ0V4Y2VwdGlvbih0YXJnZXRFeGNlcHRpb24pOworCQkJCQl9CisJCQkJfSk7CisJCQl9CisJCQlyZXR1cm4gZmFsc2U7CisJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9IGZpbmFsbHkgeworCQkJaXNSdW5uaW5nID0gZmFsc2U7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCQorCXByaXZhdGUgYm9vbGVhbiBkb3dubG9hZChmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKwkJLy8gRG93bmxvYWRzIHRoZSBmZWF0dXJlIGNvbnRlbnQuCisJCS8vIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBmcm9tIGEgYmFja2dyb3VuZCBqb2IuCisJCS8vIElmIGRvd25sb2FkIGZhaWxzLCB0aGUgdXNlciBpcyBwcm9tcHRlZCB0byByZXRyeS4KKwkJdHJ5IHsKKwkJCUlGZWF0dXJlT3BlcmF0aW9uW10gb3BzID0gaW5zdGFsbE9wZXJhdGlvbi5nZXRPcGVyYXRpb25zKCk7CisJCQltb25pdG9yLmJlZ2luVGFzayhVcGRhdGVVSU1lc3NhZ2VzLkluc3RhbGxXaXphcmRfZG93bmxvYWQsIDUgKiBvcHMubGVuZ3RoKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgb3BzLmxlbmd0aDsgaSsrKSB7CisJCQkJSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIG9wID0gKElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbilvcHNbaV07CisJCQkJCisJCQkJdHJ5IHsKKwkJCQkJU3RyaW5nIGZlYXR1cmVOYW1lID0gb3AuZ2V0RmVhdHVyZSgpLmdldExhYmVsKCk7CisJCQkJCWlmICgoZmVhdHVyZU5hbWUgPT0gbnVsbCApIHx8IChmZWF0dXJlTmFtZS50cmltKCkgPT0gIiIpICkgeyAvLyROT04tTkxTLTEkCisJCQkJCQlmZWF0dXJlTmFtZSA9IG9wLmdldEZlYXR1cmUoKS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0SWRlbnRpZmllcigpOworCQkJCQl9CisJCQkJCVN1YlByb2dyZXNzTW9uaXRvciBmZWF0dXJlRG93bmxvYWRNb25pdG9yID0gbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAyKTsKKwkJCQkJCisJCQkJCWZlYXR1cmVEb3dubG9hZE1vbml0b3IuYmVnaW5UYXNrKGZlYXR1cmVOYW1lLCAyKTsKKwkJCQkJZmVhdHVyZURvd25sb2FkTW9uaXRvci5zdWJUYXNrKE5MUy5iaW5kKFVwZGF0ZVVJTWVzc2FnZXMuSW5zdGFsbFdpemFyZF9kb3dubG9hZGluZ0ZlYXR1cmVKYXIsIGZlYXR1cmVOYW1lKSk7CisJCQkJCQorCQkJCQlpZiAob3AuZ2V0RmVhdHVyZSgpIGluc3RhbmNlb2YgTGl0ZUZlYXR1cmUpIHsKKwkJCQkJCUlTaXRlRmVhdHVyZVJlZmVyZW5jZSBmZWF0dXJlUmVmZXJlbmNlID0gZ2V0RmVhdHVyZVJlZmVyZW5jZShvcC5nZXRGZWF0dXJlKCkpOworCQkJCQkJSUZlYXR1cmUgZmVhdHVyZSA9IGZlYXR1cmVSZWZlcmVuY2UuZ2V0RmVhdHVyZShmZWF0dXJlRG93bmxvYWRNb25pdG9yKTsKKwkJCQkJCWlmIChvcCBpbnN0YW5jZW9mIEluc3RhbGxPcGVyYXRpb24pIHsKKwkJCQkJCQkoKEluc3RhbGxPcGVyYXRpb24pb3ApLnNldEZlYXR1cmUoZmVhdHVyZSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJLy9mZWF0dXJlRG93bmxvYWRNb25pdG9yLndvcmtlZCgxKTsKKwkJCQkJU3ViUHJvZ3Jlc3NNb25pdG9yIHN1Yk1vbml0b3IgPSBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDMpOworCQkJCQlVcGRhdGVVdGlscy5kb3dubG9hZEZlYXR1cmVDb250ZW50KG9wLmdldFRhcmdldFNpdGUoKSwgb3AuZ2V0RmVhdHVyZSgpLCBvcC5nZXRPcHRpb25hbEZlYXR1cmVzKCksIHN1Yk1vbml0b3IpOworCQkJCX0gY2F0Y2ggKGZpbmFsIENvcmVFeGNlcHRpb24gZSkgeworCQkJCQlpZihlIGluc3RhbmNlb2YgRmVhdHVyZURvd25sb2FkRXhjZXB0aW9uKXsKKwkJCQkJCWJvb2xlYW4gcmV0cnkgPSByZXRyeURvd25sb2FkKChGZWF0dXJlRG93bmxvYWRFeGNlcHRpb24pZSk7CisJCQkJCQlpZiAocmV0cnkpIHsKKwkJCQkJCQkvLyByZWRvd25sb2FkIGN1cnJlbnQgZmVhdHVyZQorCQkJCQkJCWktLTsKKwkJCQkJCQljb250aW51ZTsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCVVwZGF0ZUNvcmUubG9nKGUpOworCQkJCQkJaWYgKCAhbW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKKwkJCQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyggbmV3IFJ1bm5hYmxlICgpIHsKKwkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkJCQkJSVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKCBJU3RhdHVzLkVSUk9SLCBVcGRhdGVVSS5nZXRQbHVnaW5JZCgpLCBJU3RhdHVzLk9LLCBVcGRhdGVVSU1lc3NhZ2VzLkluc3RhbGxXaXphcmQyX3VwZGF0ZU9wZXJhdGlvbkhhc0ZhaWxlZCwgZSk7CisJCQkJCQkJCQlFcnJvckRpYWxvZy5vcGVuRXJyb3IobnVsbCwgbnVsbCwgbnVsbCwgc3RhdHVzKTsKKwkJCQkJCQkJCisJCQkJCQkJCX0JCQkJCQkJCisJCQkJCQkJfSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJCX0KKwkJCXJldHVybiB0cnVlOworCQl9IGZpbmFsbHkgeworCQkJbW9uaXRvci5kb25lKCk7CisJCX0KKwl9CisJCisJcHJpdmF0ZSBib29sZWFuIHJldHJ5RG93bmxvYWQoZmluYWwgRmVhdHVyZURvd25sb2FkRXhjZXB0aW9uIGUpIHsKKworCQlmaW5hbCBib29sZWFuIHJldHJ5W10gPSBuZXcgYm9vbGVhblsxXTsKKwkJVXBkYXRlVUkuZ2V0U3RhbmRhcmREaXNwbGF5KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgeworCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCXJldHJ5WzBdID0JTWVzc2FnZURpYWxvZy5vcGVuUXVlc3Rpb24oCisJCQkJCVVwZGF0ZVVJLmdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCksCisJCQkJCVVwZGF0ZVVJTWVzc2FnZXMuSW5zdGFsbFdpemFyZF9yZXRyeVRpdGxlLCAKKwkJCQkJZS5nZXRNZXNzYWdlKCkrIlxuIiAvLyROT04tTkxTLTEkCisJCQkJCQkrIFVwZGF0ZVVJTWVzc2FnZXMuSW5zdGFsbFdpemFyZF9yZXRyeSk7IAorCQkJfQorCQl9KTsKKwkJcmV0dXJuIHJldHJ5WzBdOworCX0KKyAgICAKKworICAgIHByaXZhdGUgY2xhc3MgVXBkYXRlSm9iQ2hhbmdlTGlzdGVuZXIgZXh0ZW5kcyBKb2JDaGFuZ2VBZGFwdGVyIHsKKyAgICAgICAgcHVibGljIHZvaWQgZG9uZShmaW5hbCBJSm9iQ2hhbmdlRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgICAgIC8vIHRoZSBqb2IgbGlzdGVuZXIgaXMgdHJpZ2dlcmVkIHdoZW4gdGhlIGRvd25sb2FkIGpvYiBpcyBkb25lLCBhbmQgaXQgcHJvY2VlZHMKKyAgICAgICAgICAgIC8vIHdpdGggdGhlIGFjdHVhbCBpbnN0YWxsCisgICAgICAgICAgICBpZiAoZXZlbnQuZ2V0Sm9iKCkgPT0gSW5zdGFsbFdpemFyZDIudGhpcy5qb2IgJiYgZXZlbnQuZ2V0UmVzdWx0KCkgPT0gU3RhdHVzLk9LX1NUQVRVUykgeworICAgICAgICAgICAgICAgIEpvYi5nZXRKb2JNYW5hZ2VyKCkucmVtb3ZlSm9iQ2hhbmdlTGlzdGVuZXIodGhpcyk7CisgICAgICAgICAgICAgICAgSm9iLmdldEpvYk1hbmFnZXIoKS5jYW5jZWwoam9iKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBKb2IgaW5zdGFsbEpvYiA9IG5ldyBKb2IoVXBkYXRlVUlNZXNzYWdlcy5JbnN0YWxsV2l6YXJkX2pvYk5hbWUpIHsgCisgICAgICAgIAkJCXB1YmxpYyBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKyAgICAgICAgCQkJCS8vaW5zdGFsbChtb25pdG9yKTsKKyAgICAgICAgCQkJCWlmIChpbnN0YWxsKG1vbml0b3IpKSB7CisgICAgICAgIAkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7CisgICAgICAgIAkJCQl9IGVsc2UgeworICAgICAgICAJCQkJCWlzUnVubmluZyA9IGZhbHNlOworICAgICAgICAJCQkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKKyAgICAgICAgCQkJCX0KKyAgICAgICAgCQkJfQorICAgICAgICAJCQlwdWJsaWMgYm9vbGVhbiBiZWxvbmdzVG8oT2JqZWN0IGZhbWlseSkgeworICAgICAgICAJCQkJcmV0dXJuIEluc3RhbGxXaXphcmQyLmpvYkZhbWlseSA9PSBmYW1pbHk7CisgICAgICAgIAkJCX0KKyAgICAgICAgCQl9OworCisgICAgICAgIAkJaW5zdGFsbEpvYi5zZXRVc2VyKHRydWUpOworICAgICAgICAJCWluc3RhbGxKb2Iuc2V0UHJpb3JpdHkoSm9iLklOVEVSQUNUSVZFKTsKKy8vICAgICAgICAJCWlmICh3YWl0KSB7CisvLyAgICAgICAgCQkJcHJvZ3Jlc3NTZXJ2aWNlLnNob3dJbkRpYWxvZyh3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSwgam9iKTsgCisvLyAgICAgICAgCQl9CisgICAgICAgIAkJaW5zdGFsbEpvYi5zY2hlZHVsZSgpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8qZmluYWwgSVByb2dyZXNzU2VydmljZSBwcm9ncmVzc1NlcnZpY2U9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0UHJvZ3Jlc3NTZXJ2aWNlKCk7CisgICAgICAgICAgICAgICAgVXBkYXRlVUkuZ2V0U3RhbmRhcmREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmVzc1NlcnZpY2UuYnVzeUN1cnNvcldoaWxlKCBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbGwobW9uaXRvcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVwZGF0ZVVJLmxvZ0V4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVcGRhdGVVSS5sb2dFeGNlcHRpb24oZSwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7ICovCisgICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmdldEpvYigpID09IEluc3RhbGxXaXphcmQyLnRoaXMuam9iICYmIGV2ZW50LmdldFJlc3VsdCgpICE9IFN0YXR1cy5PS19TVEFUVVMpIHsKKyAgICAgICAgICAgICAgICBpc1J1bm5pbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBKb2IuZ2V0Sm9iTWFuYWdlcigpLnJlbW92ZUpvYkNoYW5nZUxpc3RlbmVyKHRoaXMpOworICAgICAgICAgICAgICAgIEpvYi5nZXRKb2JNYW5hZ2VyKCkuY2FuY2VsKGpvYik7CisgICAgICAgICAgICAgICAgVXBkYXRlVUkuZ2V0U3RhbmRhcmREaXNwbGF5KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBVcGRhdGVVSS5sb2coZXZlbnQuZ2V0UmVzdWx0KCksIHRydWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCisJCisJcHVibGljIElTaXRlRmVhdHVyZVJlZmVyZW5jZSBnZXRGZWF0dXJlUmVmZXJlbmNlKElGZWF0dXJlIGZlYXR1cmUpIHsKKworCQlJU2l0ZSBzaXRlID0gZmVhdHVyZS5nZXRTaXRlKCk7CisJCUlTaXRlRmVhdHVyZVJlZmVyZW5jZVtdIHJlZmVyZW5jZXMgPSBzaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7CisJCUlTaXRlRmVhdHVyZVJlZmVyZW5jZSBjdXJyZW50UmVmZXJlbmNlID0gbnVsbDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZlcmVuY2VzLmxlbmd0aDsgaSsrKSB7CisJCQljdXJyZW50UmVmZXJlbmNlID0gcmVmZXJlbmNlc1tpXTsKKwkJCXRyeSB7CisJCQkJaWYgKGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmVxdWFscyhjdXJyZW50UmVmZXJlbmNlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSkpCisJCQkJCXJldHVybiBjdXJyZW50UmVmZXJlbmNlOworCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jaworCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQl9CisJCX0KKworCQlVcGRhdGVDb3JlLndhcm4oIkZlYXR1cmUgIiArIGZlYXR1cmUgKyAiIG5vdCBmb3VuZCBvbiBzaXRlIiArIHNpdGUuZ2V0VVJMKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJcmV0dXJuIG51bGw7CisJfQorCit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9JbnN0YWxsV2l6YXJkT3BlcmF0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9JbnN0YWxsV2l6YXJkT3BlcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNmNGJlMgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL0luc3RhbGxXaXphcmRPcGVyYXRpb24uamF2YQpAQCAtMCwwICsxLDEwNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS53aXphcmRzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JSm9iQ2hhbmdlRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSUpvYkNoYW5nZUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2JDaGFuZ2VBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUk7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnVpLlVwZGF0ZUpvYjsKKworcHVibGljIGNsYXNzIEluc3RhbGxXaXphcmRPcGVyYXRpb24geworCXByaXZhdGUgVXBkYXRlSm9iIGpvYjsKKwlwcml2YXRlIElKb2JDaGFuZ2VMaXN0ZW5lciBqb2JMaXN0ZW5lcjsKKwlwcml2YXRlIFNoZWxsIHNoZWxsOworCXByaXZhdGUgU2hlbGwgcGFyZW50U2hlbGw7CisKKwlwdWJsaWMgSW5zdGFsbFdpemFyZE9wZXJhdGlvbigpIHsKKwl9CisKKwlwdWJsaWMgdm9pZCBydW4oU2hlbGwgcGFyZW50LCBVcGRhdGVKb2IgdGFzaykgeworCQlzaGVsbCA9IHBhcmVudDsKKwkJaWYgKHNoZWxsLmdldFBhcmVudCgpIT1udWxsICYmIHNoZWxsLmdldFBhcmVudCgpIGluc3RhbmNlb2YgU2hlbGwpCisJCQlwYXJlbnRTaGVsbCA9IChTaGVsbClzaGVsbC5nZXRQYXJlbnQoKTsKKwkJLy8gY2FuY2VsIGFueSBleGlzdGluZyBqb2JzIGFuZCByZW1vdmUgbGlzdGVuZXJzCisJCWlmIChqb2JMaXN0ZW5lciAhPSBudWxsKQorCQkJSm9iLmdldEpvYk1hbmFnZXIoKS5yZW1vdmVKb2JDaGFuZ2VMaXN0ZW5lcihqb2JMaXN0ZW5lcik7CisJCWlmIChqb2IgIT0gbnVsbCkKKwkJCUpvYi5nZXRKb2JNYW5hZ2VyKCkuY2FuY2VsKGpvYik7CisJCQorCQkvLyB0aGVuIHNldHVwIHRoZSBuZXcgam9iIGFuZCBsaXN0ZW5lciBhbmQgc2NoZWR1bGUgdGhlIGpvYgorCQlqb2IgPSB0YXNrOworCQlqb2JMaXN0ZW5lciA9IG5ldyBVcGRhdGVKb2JDaGFuZ2VMaXN0ZW5lcigpOworCQlKb2IuZ2V0Sm9iTWFuYWdlcigpLmFkZEpvYkNoYW5nZUxpc3RlbmVyKGpvYkxpc3RlbmVyKTsKKwkJam9iLnNjaGVkdWxlKCk7CisJfQorCQorCXByaXZhdGUgU2hlbGwgZ2V0VmFsaWRTaGVsbCgpIHsKKwkJaWYgKHNoZWxsLmlzRGlzcG9zZWQoKSkKKwkJCXJldHVybiBwYXJlbnRTaGVsbDsKKwkJcmV0dXJuIHNoZWxsOworCX0KKworCXByaXZhdGUgY2xhc3MgVXBkYXRlSm9iQ2hhbmdlTGlzdGVuZXIgZXh0ZW5kcyBKb2JDaGFuZ2VBZGFwdGVyIHsKKwkJcHVibGljIHZvaWQgZG9uZShmaW5hbCBJSm9iQ2hhbmdlRXZlbnQgZXZlbnQpIHsKKwkJCWZpbmFsIFNoZWxsIHZhbGlkU2hlbGwgPSBnZXRWYWxpZFNoZWxsKCk7CisJCQkvLyB0aGUgam9iIGxpc3RlbmVyIGlzIHRyaWdnZXJlZCB3aGVuIHRoZSBzZWFyY2ggam9iIGlzIGRvbmUsIGFuZCBwcm9jZWVkcyB0byBuZXh0IHdpemFyZAorCQkJaWYgKGV2ZW50LmdldEpvYigpID09IGpvYikgeworCQkJCUpvYi5nZXRKb2JNYW5hZ2VyKCkucmVtb3ZlSm9iQ2hhbmdlTGlzdGVuZXIodGhpcyk7CisJCQkJSm9iLmdldEpvYk1hbmFnZXIoKS5jYW5jZWwoam9iKTsKKwkJCQlpZiAoam9iLmdldFN0YXR1cygpID09IFN0YXR1cy5DQU5DRUxfU1RBVFVTKQorCQkJCQlyZXR1cm47CisJCQkJaWYgKGpvYi5nZXRTdGF0dXMoKSAhPSBTdGF0dXMuT0tfU1RBVFVTKQorCQkJCQlnZXRWYWxpZFNoZWxsKCkuZ2V0RGlzcGxheSgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKKwkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJCQlVcGRhdGVVSS5sb2coam9iLmdldFN0YXR1cygpLCB0cnVlKTsKKwkJCQkJCX0KKwkJCQkJfSk7CisKKwkJCQl2YWxpZFNoZWxsLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgeworCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQl2YWxpZFNoZWxsLmdldERpc3BsYXkoKS5iZWVwKCk7CisJCQkJCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZSh2YWxpZFNoZWxsLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgeworCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJCQkJb3Blbkluc3RhbGxXaXphcmQyKCk7CisJCQkJCQkJfQorCQkJCQkJfSk7CisJCQkJCX0KKwkJCQl9KTsKKwkJCX0KKwkJfQorCisJCXByaXZhdGUgdm9pZCBvcGVuSW5zdGFsbFdpemFyZDIoKSB7CisJCQlpZiAoSW5zdGFsbFdpemFyZDIuaXNSdW5uaW5nKCkpIHsKKwkJCQlNZXNzYWdlRGlhbG9nLm9wZW5JbmZvcm1hdGlvbihnZXRWYWxpZFNoZWxsKCksIFVwZGF0ZVVJTWVzc2FnZXMuSW5zdGFsbFdpemFyZF9pc1J1bm5pbmdUaXRsZSwgVXBkYXRlVUlNZXNzYWdlcy5JbnN0YWxsV2l6YXJkX2lzUnVubmluZ0luZm8pOworCQkJCXJldHVybjsKKwkJCX0KKyAgICAgICAgICAgIGlmIChqb2IuZ2V0VXBkYXRlcygpID09IG51bGwgfHwgam9iLmdldFVwZGF0ZXMoKS5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChqb2IuaXNVcGRhdGUoKSkKKyAgICAgICAgICAgICAgICAgICAgTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24oZ2V0VmFsaWRTaGVsbCgpLCBVcGRhdGVVSU1lc3NhZ2VzLkluc3RhbGxXaXphcmRfUmV2aWV3UGFnZV96ZXJvVXBkYXRlcywgVXBkYXRlVUlNZXNzYWdlcy5JbnN0YWxsV2l6YXJkX1Jldmlld1BhZ2VfemVyb1VwZGF0ZXMpOyAKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKGdldFZhbGlkU2hlbGwoKSwgVXBkYXRlVUlNZXNzYWdlcy5JbnN0YWxsV2l6YXJkX1Jldmlld1BhZ2VfemVyb0ZlYXR1cmVzLCBVcGRhdGVVSU1lc3NhZ2VzLkluc3RhbGxXaXphcmRfUmV2aWV3UGFnZV96ZXJvRmVhdHVyZXMpOyAKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisJCQlJbnN0YWxsV2l6YXJkMiB3aXphcmQgPSBuZXcgSW5zdGFsbFdpemFyZDIoam9iLmdldFNlYXJjaFJlcXVlc3QoKSwgam9iLmdldFVwZGF0ZXMoKSwgam9iLmlzVXBkYXRlKCkpOworCQkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBSZXNpemFibGVJbnN0YWxsV2l6YXJkRGlhbG9nKGdldFZhbGlkU2hlbGwoKSwgd2l6YXJkLCBVcGRhdGVVSU1lc3NhZ2VzLkF1dG9tYXRpY1VwZGF0ZXNKb2JfVXBkYXRlcyk7IAorCQkJZGlhbG9nLmNyZWF0ZSgpOworCQkJZGlhbG9nLm9wZW4oKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL0xpY2Vuc2VQYWdlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9MaWNlbnNlUGFnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZDBiZGQKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9MaWNlbnNlUGFnZS5qYXZhCkBAIC0wLDAgKzEsMjEzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLndpemFyZHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSUltYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUlNZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy5JSW5zdGFsbEZlYXR1cmVPcGVyYXRpb247CisKK3B1YmxpYyBjbGFzcyBMaWNlbnNlUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgaW1wbGVtZW50cyBJRHluYW1pY1BhZ2UgeworCXByaXZhdGUgYm9vbGVhbiBtdWx0aUxpY2Vuc2VNb2RlID0gZmFsc2U7CisJcHJpdmF0ZSBJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb25bXSBqb2JzOworCXByaXZhdGUgSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uW10gb2xkakpvYnM7CisJcHJpdmF0ZSBUZXh0IHRleHQ7CisJcHJpdmF0ZSBUYWJsZSB0YWJsZTsKKwlwcml2YXRlIEJ1dHRvbiBhY2NlcHRCdXR0b247CisJcHJpdmF0ZSBCdXR0b24gZGVjbGluZUJ1dHRvbjsKKworCS8qKgorCSAqIENvbnN0cnVjdG9yIGZvciBMaWNlbnNlUGFnZTIKKwkgKi8KKwlwdWJsaWMgTGljZW5zZVBhZ2UoYm9vbGVhbiBtdWx0aUxpY2Vuc2VNb2RlKSB7CisJCXN1cGVyKCJMaWNlbnNlIik7IC8vJE5PTi1OTFMtMSQKKwkJc2V0VGl0bGUoVXBkYXRlVUlNZXNzYWdlcy5JbnN0YWxsV2l6YXJkX0xpY2Vuc2VQYWdlX3RpdGxlKTsKKwkJc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKKwkJdGhpcy5tdWx0aUxpY2Vuc2VNb2RlID0gbXVsdGlMaWNlbnNlTW9kZTsKKwkJVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldExhYmVsUHJvdmlkZXIoKS5jb25uZWN0KHRoaXMpOworCQlzZXREZXNjcmlwdGlvbihtdWx0aUxpY2Vuc2VNb2RlID9VcGRhdGVVSU1lc3NhZ2VzLkluc3RhbGxXaXphcmRfTGljZW5zZVBhZ2VfZGVzYzIgOiAKKyAgICAgICAgICAgIFVwZGF0ZVVJTWVzc2FnZXMuSW5zdGFsbFdpemFyZF9MaWNlbnNlUGFnZV9kZXNjKTsKKwl9CisJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKwkJVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldExhYmVsUHJvdmlkZXIoKS5kaXNjb25uZWN0KHRoaXMpOworCQlzdXBlci5kaXNwb3NlKCk7CisJfQorCisJcHVibGljIHZvaWQgc2V0Sm9icyhJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb25bXSBqb2JzKSB7CQkKKwkJdGhpcy5qb2JzID0gam9iczsJCQorCX0KKworCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgeworCQlDb21wb3NpdGUgY2xpZW50ID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKKwkJY2xpZW50LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOworCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7CisJCWNsaWVudC5zZXRMYXlvdXQobGF5b3V0KTsKKwkJCisgICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY2xpZW50LCAib3JnLmVjbGlwc2UudXBkYXRlLnVpLkxpY2Vuc2VQYWdlMiIpOyAvLyROT04tTkxTLTEkCisKKwkJaWYgKG11bHRpTGljZW5zZU1vZGUpIHsKKwkJCWxheW91dC5udW1Db2x1bW5zID0gMzsKKwkJCWxheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSB0cnVlOworCisJCQl0YWJsZSA9IG5ldyBUYWJsZShjbGllbnQsIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOworCisJCQl0YWJsZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJCWlmIChlLml0ZW0gIT0gbnVsbCkgeworCQkJCQkJT2JqZWN0IGRhdGEgPSBlLml0ZW0uZ2V0RGF0YSgpOworCQkJCQkJdGV4dC5zZXRUZXh0KChkYXRhID09IG51bGwpID8gIiIgOiAoU3RyaW5nKSBkYXRhKTsgLy8kTk9OLU5MUy0xJAorCQkJCQl9CisJCQkJfQorCQkJfSk7CisJCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOworCQkJZ2QuaGVpZ2h0SGludCA9IDIwMDsKKwkJCXRhYmxlLnNldExheW91dERhdGEoZ2QpOworCQl9CisJCXRleHQgPQorCQkJbmV3IFRleHQoCisJCQkJY2xpZW50LAorCQkJCVNXVC5NVUxUSSB8IFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuV1JBUCB8IFNXVC5SRUFEX09OTFkpOworCisJCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7CisJCWdkLmhlaWdodEhpbnQgPSAyMDA7CisJCWlmIChtdWx0aUxpY2Vuc2VNb2RlKQorCQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOworCQl0ZXh0LnNldExheW91dERhdGEoZ2QpOworCQl0ZXh0LnNldEJhY2tncm91bmQodGV4dC5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfQkFDS0dST1VORCkpOworCisJCUNvbXBvc2l0ZSBidXR0b25Db250YWluZXIgPSBuZXcgQ29tcG9zaXRlKGNsaWVudCwgU1dULk5VTEwpOworCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOworCQlpZiAobXVsdGlMaWNlbnNlTW9kZSkKKwkJCWdkLmhvcml6b250YWxTcGFuID0gMzsKKwkJYnV0dG9uQ29udGFpbmVyLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKKwkJYnV0dG9uQ29udGFpbmVyLnNldExheW91dERhdGEoZ2QpOworCisJCWFjY2VwdEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29udGFpbmVyLCBTV1QuUkFESU8pOworCQlhY2NlcHRCdXR0b24uc2V0VGV4dChtdWx0aUxpY2Vuc2VNb2RlP1VwZGF0ZVVJTWVzc2FnZXMuSW5zdGFsbFdpemFyZF9MaWNlbnNlUGFnZV9hY2NlcHQyCisgICAgICAgICAgICAgICAgOiBVcGRhdGVVSU1lc3NhZ2VzLkluc3RhbGxXaXphcmRfTGljZW5zZVBhZ2VfYWNjZXB0KTsKKwkJYWNjZXB0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCXNldFBhZ2VDb21wbGV0ZShhY2NlcHRCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOworCQkJfQorCQl9KTsKKwkJZGVjbGluZUJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29udGFpbmVyLCBTV1QuUkFESU8pOworCQlkZWNsaW5lQnV0dG9uLnNldFRleHQobXVsdGlMaWNlbnNlTW9kZT9VcGRhdGVVSU1lc3NhZ2VzLkluc3RhbGxXaXphcmRfTGljZW5zZVBhZ2VfZGVjbGluZTIKKyAgICAgICAgICAgICAgICA6IFVwZGF0ZVVJTWVzc2FnZXMuSW5zdGFsbFdpemFyZF9MaWNlbnNlUGFnZV9kZWNsaW5lKTsKKwkJZGVjbGluZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQlzZXRQYWdlQ29tcGxldGUoYWNjZXB0QnV0dG9uLmdldFNlbGVjdGlvbigpKTsKKwkJCX0KKwkJfSk7CisJCXNldENvbnRyb2woY2xpZW50KTsKKworCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KHBhcmVudCk7CisJfQorCisJcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsgLy8gVE8gRE86IE9wdGltaXplIG91dCB0aGUgY2FzZSB3aGVyZSBhIGZlYXR1cmUgZG9lcyBub3QgaGF2ZSBhIGxpY2Vuc2U/CisKKwkJYm9vbGVhbiBqb2JzQ2hhbmdlZCA9IGRpZEpvYnNDaGFuZ2Uoam9icyk7CisJCWRlY2xpbmVCdXR0b24uc2V0U2VsZWN0aW9uKCFqb2JzQ2hhbmdlZCAmJiBkZWNsaW5lQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKKwkJYWNjZXB0QnV0dG9uLnNldFNlbGVjdGlvbigham9ic0NoYW5nZWQgJiYgYWNjZXB0QnV0dG9uLmdldFNlbGVjdGlvbigpKTsKKwkJCisJCWlmIChqb2JzLmxlbmd0aCA9PSAxKSB7CisJCQlhY2NlcHRCdXR0b24uc2V0VGV4dChVcGRhdGVVSU1lc3NhZ2VzLkluc3RhbGxXaXphcmRfTGljZW5zZVBhZ2VfYWNjZXB0KTsKKwkJCWRlY2xpbmVCdXR0b24uc2V0VGV4dChVcGRhdGVVSU1lc3NhZ2VzLkluc3RhbGxXaXphcmRfTGljZW5zZVBhZ2VfZGVjbGluZSk7CisJCX0gZWxzZSBpZiAoam9icy5sZW5ndGggPiAxKSB7CisJCQlhY2NlcHRCdXR0b24uc2V0VGV4dChVcGRhdGVVSU1lc3NhZ2VzLkluc3RhbGxXaXphcmRfTGljZW5zZVBhZ2VfYWNjZXB0Mik7CisJCQlkZWNsaW5lQnV0dG9uLnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5JbnN0YWxsV2l6YXJkX0xpY2Vuc2VQYWdlX2RlY2xpbmUyKTsKKwkJfQorCQkKKwkJaWYgKHZpc2libGUpIHsKKwkJCWlmIChtdWx0aUxpY2Vuc2VNb2RlKSB7CisJCQkJVGFibGVJdGVtIGl0ZW07CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBqb2JzLmxlbmd0aDsgaSsrKSB7CisJCQkJCUlGZWF0dXJlIGZlYXR1cmUgPSBqb2JzW2ldLmdldEZlYXR1cmUoKTsKKwkJCQkJaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKKwkJCQkJU3RyaW5nIGxhYmVsID0KKwkJCQkJCWZlYXR1cmUuZ2V0TGFiZWwoKQorCQkJCQkJCSsgIiAiIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkrIGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldFZlcnNpb24oKS50b1N0cmluZygpOworCQkJCQlpdGVtLnNldFRleHQobGFiZWwpOworCQkJCQlpdGVtLnNldEltYWdlKAorCQkJCQkJVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldExhYmVsUHJvdmlkZXIoKS5nZXQoCisJCQkJCQkJZmVhdHVyZS5pc1BhdGNoKCkKKwkJCQkJCQkJPyBVcGRhdGVVSUltYWdlcy5ERVNDX0VGSVhfT0JKCisJCQkJCQkJCTogVXBkYXRlVUlJbWFnZXMuREVTQ19GRUFUVVJFX09CSikpOworCQkJCQlTdHJpbmcgbGljZW5zZSA9IGZlYXR1cmUuZ2V0TGljZW5zZSgpLmdldEFubm90YXRpb24oKTsKKwkJCQkJLy8gUXVlc3Rpb246IENhbiB0aGlzIGV2ZXIgYmUgbnVsbD8gV2hhdCBpcyB0aGUgcnVudGltZSBjb3N0PworCQkJCQlpdGVtLnNldERhdGEobGljZW5zZSk7CisJCQkJfQorCisJCQkJdGFibGUuc2V0U2VsZWN0aW9uKDApOworCQkJfQorCQkJc2hvd0xpY2Vuc2VUZXh0KCk7CisJCX0gZWxzZSB7CisJCQlpZiAobXVsdGlMaWNlbnNlTW9kZSkgeworCQkJCVRhYmxlSXRlbSBpdGVtc1tdID0gdGFibGUuZ2V0SXRlbXMoKTsKKwkJCQlmb3IgKGludCBpID0gaXRlbXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKKwkJCQkJdGFibGUuZ2V0SXRlbShpKS5kaXNwb3NlKCk7CisJCQkJfQorCQkJfQorCQl9CisJCXN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7CisJCW9sZGpKb2JzID0gam9iczsKKwkJCisJfQorCisJcHJpdmF0ZSB2b2lkIHNob3dMaWNlbnNlVGV4dCgpIHsKKwkJaWYgKCFtdWx0aUxpY2Vuc2VNb2RlKSB7CisJCQl0ZXh0LnNldFRleHQoam9ic1swXS5nZXRGZWF0dXJlKCkuZ2V0TGljZW5zZSgpLmdldEFubm90YXRpb24oKSk7CisJCQlyZXR1cm47CisJCX0KKwkJVGFibGVJdGVtW10gc2VsZWN0ZWRJdGVtcyA9IHRhYmxlLmdldFNlbGVjdGlvbigpOworCQlpZiAoc2VsZWN0ZWRJdGVtcy5sZW5ndGggPT0gMCkgeworCQkJdGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAorCQl9IGVsc2UgeworCQkJT2JqZWN0IGRhdGEgPSBzZWxlY3RlZEl0ZW1zWzBdLmdldERhdGEoKTsKKwkJCXRleHQuc2V0VGV4dCgoZGF0YSA9PSBudWxsKSA/ICIiIDogKFN0cmluZykgZGF0YSk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCX0KKwkKKwlwcml2YXRlIGJvb2xlYW4gZGlkSm9ic0NoYW5nZShJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb25bXSBqb2JzKXsKKwkJCisJCWlmICggKGpvYnMgPT0gbnVsbCkgfHwgKG9sZGpKb2JzID09IG51bGwpIHx8IChqb2JzLmxlbmd0aCA9PSAwKSB8fCAob2xkakpvYnMubGVuZ3RoID09IDApICkKKwkJCXJldHVybiB0cnVlOworCQkJCQorCQlib29sZWFuIGZvdW5kSXQgPSBmYWxzZTsKKwkJCisJCWZvciAoIGludCBpID0gMDsgaSA8IGpvYnMubGVuZ3RoOyBpKyspIHsKKwkJCWZvdW5kSXQgPSBmYWxzZTsKKwkJCWZvciAoIGludCBqID0gMDsgaiA8IG9sZGpKb2JzLmxlbmd0aDsgaisrKSB7CisJCQkJaWYgKGpvYnNbaV0uZ2V0RmVhdHVyZSgpLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5lcXVhbHMob2xkakpvYnNbal0uZ2V0RmVhdHVyZSgpLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSkgKSB7CisJCQkJCWZvdW5kSXQgPSB0cnVlOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlpZiAoIWZvdW5kSXQpIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvTG9jYWxTaXRlU2VsZWN0b3IuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL0xvY2FsU2l0ZVNlbGVjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM5ODI5OAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL0xvY2FsU2l0ZVNlbGVjdG9yLmphdmEKQEAgLTAsMCArMSwyNjQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkud2l6YXJkczsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7CitpbXBvcnQgamF2YS51dGlsLnppcC5aaXBGaWxlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRmlsZURpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUk7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsLlNpdGVCb29rbWFyazsKKworLyoqCisgKi8KK3B1YmxpYyBjbGFzcyBMb2NhbFNpdGVTZWxlY3RvciB7CisKKwkvKioKKwkgKiAKKwkgKi8KKwlzdGF0aWMgU3RyaW5nIGxhc3RMb2NhdGlvbiA9IG51bGw7CisJcHVibGljIExvY2FsU2l0ZVNlbGVjdG9yKCkgeworCQlzdXBlcigpOworCX0KKwlwdWJsaWMgc3RhdGljIFNpdGVCb29rbWFyayBnZXRMb2NhTFNpdGUoU2hlbGwgcGFyZW50LCBTaXRlQm9va21hcmtbXSBzaXRlQm9va21hcmtzKSB7CisJCURpcmVjdG9yeURpYWxvZyBkaWFsb2cgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKHBhcmVudCk7CisJCWRpYWxvZy5zZXRNZXNzYWdlKAorCQkJVXBkYXRlVUlNZXNzYWdlcy5Mb2NhbFNpdGVTZWxlY3Rvcl9kaWFsb2dNZXNzYWdlKTsgCisJCWRpYWxvZy5zZXRGaWx0ZXJQYXRoKGxhc3RMb2NhdGlvbik7CisJCVN0cmluZyBkaXIgPSBkaWFsb2cub3BlbigpOworCisJCVNpdGVCb29rbWFyayBzaXRlQm9va21hcmsgPSBudWxsOworCQl3aGlsZSAoZGlyICE9IG51bGwgJiYgc2l0ZUJvb2ttYXJrID09IG51bGwpIHsKKwkJCUZpbGUgZGlyRmlsZSA9IG5ldyBGaWxlKGRpcik7CisJCQlpZiAoaXNEaXJTaXRlKGRpckZpbGUpKSB7CisJCQkJaWYgKCFpc0R1cGxpY2F0ZSggZGlyRmlsZSwgc2l0ZUJvb2ttYXJrcykpIHsKKwkJCQkJc2l0ZUJvb2ttYXJrID0gY3JlYXRlRGlyU2l0ZShkaXJGaWxlKTsKKwkJCQkJbGFzdExvY2F0aW9uID0gZGlyOworCQkJCX0gZWxzZSB7CisJCQkJCU1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKHBhcmVudCwKKwkJCQkJCQkJCQkJCSAgVXBkYXRlVUlNZXNzYWdlcy5Mb2NhbFNpdGVTZWxlY3Rvcl9kaXJJbmZvVGl0bGUsIAorCQkJCQkJCQkJCQkJICBVcGRhdGVVSU1lc3NhZ2VzLkxvY2FsU2l0ZVNlbGVjdG9yX2RpckR1cGxpY2F0ZURlZmluaXRpb24pOyAKKwkJCQkJZGlhbG9nLnNldEZpbHRlclBhdGgoZGlyKTsKKwkJCQkJZGlyID0gZGlhbG9nLm9wZW4oKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCU1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKAorCQkJCQlwYXJlbnQsCisJCQkJCVVwZGF0ZVVJTWVzc2FnZXMuTG9jYWxTaXRlU2VsZWN0b3JfZGlySW5mb1RpdGxlLCAKKwkJCQkJVXBkYXRlVUlNZXNzYWdlcy5Mb2NhbFNpdGVTZWxlY3Rvcl9kaXJJbmZvTWVzc2FnZSk7IAorCQkJCWRpYWxvZy5zZXRGaWx0ZXJQYXRoKGRpcik7CisJCQkJZGlyID0gZGlhbG9nLm9wZW4oKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gc2l0ZUJvb2ttYXJrOworCX0KKwlwdWJsaWMgc3RhdGljIFNpdGVCb29rbWFyayBnZXRMb2NhTFppcHBlZFNpdGUoU2hlbGwgcGFyZW50LCBTaXRlQm9va21hcmtbXSBzaXRlQm9va21hcmtzKSB7CisJCUZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IEZpbGVEaWFsb2cocGFyZW50KTsKKwkJZGlhbG9nLnNldFRleHQoCisJCQlVcGRhdGVVSU1lc3NhZ2VzLkxvY2FsU2l0ZVNlbGVjdG9yX2RpYWxvZ01lc3NhZ2V6aXApOyAKKwkJLy9kaWFsb2cuc2V0RmlsdGVyRXh0ZW5zaW9ucyhuZXcgU3RyaW5nW10geyAiKi56aXAiLCAiKi5qYXIiIH0pOworCQkvLyAvLyROT04tTkxTLTEkCisJCWRpYWxvZy5zZXRGaWx0ZXJFeHRlbnNpb25zKG5ldyBTdHJpbmdbXSB7ICIqLmphcjsqLnppcCIgfSk7IC8vJE5PTi1OTFMtMSQKKworCQlTaXRlQm9va21hcmsgc2l0ZUJvb2ttYXJrID0gbnVsbDsKKworCQlTdHJpbmcgemlwID0gZGlhbG9nLm9wZW4oKTsKKwkJd2hpbGUgKHppcCAhPSBudWxsICYmIHNpdGVCb29rbWFyayA9PSBudWxsKSB7CisJCQlGaWxlIHppcEYgPSBuZXcgRmlsZSh6aXApOworCQkJaWYgKGlzWmlwU2l0ZSh6aXBGKSkgeworCQkJCXNpdGVCb29rbWFyayA9IGNyZWF0ZVppcFNpdGUoemlwRik7CisJCQkJaWYgKGlzRHVwbGljYXRlKCBzaXRlQm9va21hcmsuZ2V0VVJMKCksIHNpdGVCb29rbWFya3MpKSB7CisJCQkJCU1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKHBhcmVudCwKKwkJCQkJCQkgIFVwZGF0ZVVJTWVzc2FnZXMuTG9jYWxTaXRlU2VsZWN0b3JfemlwSW5mb1RpdGxlLCAKKwkJCQkJCQkgIFVwZGF0ZVVJTWVzc2FnZXMuTG9jYWxTaXRlU2VsZWN0b3JfemlwRHVwbGljYXRlRGVmaW5pdGlvbik7CisJCQkJCXNpdGVCb29rbWFyayA9IG51bGw7CisJCQkJCXppcCA9IGRpYWxvZy5vcGVuKCk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlNZXNzYWdlRGlhbG9nLm9wZW5JbmZvcm1hdGlvbigKKwkJCQkJcGFyZW50LAorCQkJCQlVcGRhdGVVSU1lc3NhZ2VzLkxvY2FsU2l0ZVNlbGVjdG9yX3ppcEluZm9UaXRsZSwgCisJCQkJCVVwZGF0ZVVJTWVzc2FnZXMuTG9jYWxTaXRlU2VsZWN0b3JfemlwSW5mb01lc3NhZ2UpOyAKKwkJCQl6aXAgPSBkaWFsb2cub3BlbigpOworCQkJfQorCQl9CisJCXJldHVybiBzaXRlQm9va21hcms7CisJfQorCS8qKgorCSAqIFJldHVybnMgdHJ1ZSB0aGUgemlwIGZpbGUgY29udGFpbnMgYW4gdXBkYXRlIHNpdGUKKwkgKiAKKwkgKiBAcGFyYW0gZmlsZQorCSAqIEByZXR1cm4KKwkgKi8KKwlzdGF0aWMgYm9vbGVhbiBpc1ppcFNpdGUoRmlsZSBmaWxlKSB7CisJCWlmICghZmlsZS5nZXROYW1lKCkudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLnppcCIpIC8vJE5PTi1OTFMtMSQKKwkJCSYmICFmaWxlLmdldE5hbWUoKS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCIuamFyIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJWmlwcGVkU2l0ZVZhbGlkYXRvciB2YWxpZGF0b3IgPSBuZXcgWmlwcGVkU2l0ZVZhbGlkYXRvcihmaWxlKTsKKwkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoCisJCQlVcGRhdGVVSS5nZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpLmdldERpc3BsYXkoKSwKKwkJCXZhbGlkYXRvcik7CisJCXJldHVybiB2YWxpZGF0b3IuaXNWYWxpZCgpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGRpciBjb250YWlucyBhbiB1cGRhdGUgc2l0ZQorCSAqIAorCSAqIEBwYXJhbSBkaXIKKwkgKiBAcmV0dXJuCisJICovCisJc3RhdGljIGJvb2xlYW4gaXNEaXJTaXRlKEZpbGUgZGlyKSB7CisJCUZpbGUgc2l0ZVhNTCA9IG5ldyBGaWxlKGRpciwgInNpdGUueG1sIik7IC8vJE5PTi1OTFMtMSQKKwkJRmlsZSBmZWF0dXJlc0RpciA9IG5ldyBGaWxlKGRpciwgImZlYXR1cmVzIik7IC8vJE5PTi1OTFMtMSQKKwkJRmlsZSBwbHVnaW5zRGlyID0gbmV3IEZpbGUoZGlyLCAicGx1Z2lucyIpOyAvLyROT04tTkxTLTEkCisJCXJldHVybiBzaXRlWE1MLmV4aXN0cygpCisJCQl8fCBmZWF0dXJlc0Rpci5leGlzdHMoKQorCQkJJiYgZmVhdHVyZXNEaXIuaXNEaXJlY3RvcnkoKQorCQkJJiYgcGx1Z2luc0Rpci5leGlzdHMoKQorCQkJJiYgcGx1Z2luc0Rpci5pc0RpcmVjdG9yeSgpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBib29rbWFyayB0byBhIHppcHBlZCBzaXRlCisJICogCisJICogQHBhcmFtIGZpbGUKKwkgKiBAcmV0dXJuCisJICovCisJc3RhdGljIFNpdGVCb29rbWFyayBjcmVhdGVaaXBTaXRlKEZpbGUgZmlsZSkgeworCQl0cnkgeworCQkJVVJMIGZpbGVVUkwgPSBuZXcgVVJMKCJmaWxlIiwgbnVsbCwgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7IC8vJE5PTi1OTFMtMSQKKwkJCVVSTCB1cmwgPQorCQkJCW5ldyBVUkwoCisJCQkJCSJqYXI6IiAvLyROT04tTkxTLTEkCisJCQkJCQkrIGZpbGVVUkwudG9FeHRlcm5hbEZvcm0oKS5yZXBsYWNlKCdcXCcsICcvJykKKwkJCQkJCSsgIiEvIik7IC8vJE5PTi1OTFMtMSQKKwkJCVNpdGVCb29rbWFyayBzaXRlID0gbmV3IFNpdGVCb29rbWFyayhmaWxlLmdldE5hbWUoKSwgdXJsLCBmYWxzZSk7CisJCQlzaXRlLnNldExvY2FsKHRydWUpOworCQkJcmV0dXJuIHNpdGU7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBib29rbWFyayB0byBhIHNpdGUgb24gdGhlIGZpbGUgc3lzdGVtCisJICogCisJICogQHBhcmFtIGZpbGUKKwkgKiBAcmV0dXJuCisJICovCisJc3RhdGljIFNpdGVCb29rbWFyayBjcmVhdGVEaXJTaXRlKEZpbGUgZmlsZSkgeworCQl0cnkgeworCQkJVVJMIHVybCA9IGZpbGUudG9VUkwoKTsKKwkJCVN0cmluZyBwYXJlbnQgPSBmaWxlLmdldFBhcmVudCgpOworCQkJaWYocGFyZW50ID09IG51bGwpCisJCQkJcGFyZW50ID0gIiI7IC8vJE5PTi1OTFMtMSQKKwkJCWVsc2UKKwkJCQlwYXJlbnQgPSBuZXcgRmlsZShwYXJlbnQpLmdldE5hbWUoKTsKKwkJCVN0cmluZyBzaXRlTmFtZSA9IHBhcmVudCArICIvIiArIGZpbGUuZ2V0TmFtZSgpOyAvLyROT04tTkxTLTEkCisJCQlTaXRlQm9va21hcmsgc2l0ZSA9IG5ldyBTaXRlQm9va21hcmsoc2l0ZU5hbWUsIHVybCwgZmFsc2UpOworCQkJc2l0ZS5zZXRMb2NhbCh0cnVlKTsKKwkJCXJldHVybiBzaXRlOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9CisJc3RhdGljIGNsYXNzIFppcHBlZFNpdGVWYWxpZGF0b3IgaW1wbGVtZW50cyBSdW5uYWJsZSB7CisJCUZpbGUgZmlsZTsKKwkJYm9vbGVhbiB2YWxpZCA9IGZhbHNlOworCQlwdWJsaWMgWmlwcGVkU2l0ZVZhbGlkYXRvcihGaWxlIGZpbGUpIHsKKwkJCXRoaXMuZmlsZSA9IGZpbGU7CisJCX0KKwkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJWmlwRmlsZSBzaXRlWmlwID0gbnVsbDsKKwkJCXRyeSB7CisJCQkJLy8gY2hlY2sgaWYgdGhlIHppcCBmaWxlIGNvbnRhaW5zIHNpdGUueG1sCisJCQkJc2l0ZVppcCA9IG5ldyBaaXBGaWxlKGZpbGUpOworCQkJCWlmIChzaXRlWmlwLmdldEVudHJ5KCJzaXRlLnhtbCIpICE9IG51bGwpIHsgLy8kTk9OLU5MUy0xJAorCQkJCQl2YWxpZCA9IHRydWU7CisJCQkJCXJldHVybjsKKwkJCQl9CisKKwkJCQlib29sZWFuIGhhc0ZlYXR1cmVzID0gZmFsc2U7CisJCQkJYm9vbGVhbiBoYXNQbHVnaW5zID0gZmFsc2U7CisJCQkJZm9yIChFbnVtZXJhdGlvbiBpdGVyYXRvciA9IHNpdGVaaXAuZW50cmllcygpOworCQkJCQlpdGVyYXRvci5oYXNNb3JlRWxlbWVudHMoKTsKKwkJCQkJKSB7CisJCQkJCVppcEVudHJ5IHpFbnRyeSA9IChaaXBFbnRyeSkgaXRlcmF0b3IubmV4dEVsZW1lbnQoKTsKKwkJCQkJaWYgKCFoYXNGZWF0dXJlcworCQkJCQkJJiYgekVudHJ5LmdldE5hbWUoKS5zdGFydHNXaXRoKCJmZWF0dXJlcyIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCWhhc0ZlYXR1cmVzID0gdHJ1ZTsKKwkJCQkJfQorCQkJCQlpZiAoIWhhc1BsdWdpbnMKKwkJCQkJCSYmIHpFbnRyeS5nZXROYW1lKCkuc3RhcnRzV2l0aCgicGx1Z2lucyIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCWhhc1BsdWdpbnMgPSB0cnVlOworCQkJCQl9CisJCQkJCWlmIChoYXNGZWF0dXJlcyAmJiBoYXNQbHVnaW5zKSB7CisJCQkJCQl2YWxpZCA9IHRydWU7CisJCQkJCQlyZXR1cm47CisJCQkJCX0KKwkJCQl9CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJfSBmaW5hbGx5IHsKKwkJCQl0cnkgeworCQkJCQlpZiAoc2l0ZVppcCAhPSBudWxsKSB7CisJCQkJCQlzaXRlWmlwLmNsb3NlKCk7CisJCQkJCX0KKwkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKwkJCQl9CisJCQl9CisKKwkJfQorCQkvKioKKwkJICogQHJldHVybiBSZXR1cm5zIHRoZSB2YWxpZC4gKi8KKwkJcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpIHsKKwkJCXJldHVybiB2YWxpZDsKKwkJfQorCX0KKwkKKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRHVwbGljYXRlKCBGaWxlIGZpbGUsIFNpdGVCb29rbWFya1tdIHNpdGVCb29rbWFya3MpIHsKKwkJCisJCXRyeSB7CisJCQlyZXR1cm4gaXNEdXBsaWNhdGUoZmlsZS50b1VSTCgpLCBzaXRlQm9va21hcmtzKTsKKwkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG11ZSkgeworCQkJLy8gdGhpcyBzaG91bGQgbm90IGV2ZXIgaGFwcGVuCisJCQlVcGRhdGVVSS5sb2dFeGNlcHRpb24obXVlKTsKKwkJfQorCQkKKwkJcmV0dXJuIGZhbHNlOworCX0KKwkKKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRHVwbGljYXRlKCBVUkwgdXJsLCBTaXRlQm9va21hcmtbXSBzaXRlQm9va21hcmtzKSB7CisJCQorCQlpZiAoIHNpdGVCb29rbWFya3MgPT0gbnVsbCkKKwkJCXJldHVybiBmYWxzZTsKKworCQlmb3IoIGludCBpID0gMDsgaSA8IHNpdGVCb29rbWFya3MubGVuZ3RoOyBpKyspIHsKKwkJCWlmIChzaXRlQm9va21hcmtzW2ldLmdldFVSTCgpLmVxdWFscyh1cmwpKQorCQkJCXJldHVybiB0cnVlOworCisJCX0KKwkJcmV0dXJuIGZhbHNlOworCQkKKwl9CQorCit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9NaXJyb3JzRGlhbG9nLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9NaXJyb3JzRGlhbG9nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFlNTc1NgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL01pcnJvcnNEaWFsb2cuamF2YQpAQCAtMCwwICsxLDE1NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS53aXphcmRzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0FkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0V2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JU2l0ZVdpdGhNaXJyb3JzOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklVUkxFbnRyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5VcGRhdGVDb3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSU1lc3NhZ2VzOworCisKK3B1YmxpYyBjbGFzcyBNaXJyb3JzRGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKKwkvL3ByaXZhdGUgSVNpdGVXaXRoTWlycm9ycyBzaXRlOworCXByaXZhdGUgU3RyaW5nIHNpdGVOYW1lOworCXByaXZhdGUgSVVSTEVudHJ5W10gbWlycm9yczsKKwlwcml2YXRlIExpc3QgbWlycm9yc0xpc3Q7CisJcHJpdmF0ZSBJVVJMRW50cnkgbWlycm9yU2VsZWN0ZWQ7CisJcHJpdmF0ZSBCdXR0b24gYXV0b21hdGljYWxseUNob29zZU1pcnJvckNoZWNrYm94OworCS8vcHJpdmF0ZSBCdXR0b24gb2tCdXR0b247CisJLyoqCisJICogQHBhcmFtIHBhcmVudFNoZWxsCisJICovCisJcHVibGljIE1pcnJvcnNEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIElTaXRlV2l0aE1pcnJvcnMgc2l0ZSwgU3RyaW5nIHNpdGVOYW1lKSB7CisJCXN1cGVyKHBhcmVudFNoZWxsKTsKKwkJc2V0U2hlbGxTdHlsZShnZXRTaGVsbFN0eWxlKCl8U1dULlJFU0laRSk7CisJCS8vdGhpcy5zaXRlID0gc2l0ZTsKKwkJdGhpcy5zaXRlTmFtZSA9IHNpdGVOYW1lOworCQl0cnkgeworCQkJdGhpcy5taXJyb3JzID0gc2l0ZS5nZXRNaXJyb3JTaXRlRW50cmllcygpOworCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCS8vIGlnbm9yZSwgYXMgdGhlIG1pcnJvcnMgaGF2ZSBhbHJlYWR5IGJlZW4gcXVlcmllZCBlYXJsaWVyLCBzbyB3ZSBkb24ndCBleHBlY3QgZXJyb3IgaGVyZQorCQl9CisJfQorCQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgeworCQljcmVhdGVCdXR0b24oCisJCQkJcGFyZW50LAorCQkJCUlEaWFsb2dDb25zdGFudHMuT0tfSUQsCisJCQkJSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwKKwkJCQl0cnVlKTsKKwkJY3JlYXRlQnV0dG9uKAorCQkJcGFyZW50LAorCQkJSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQsCisJCQlJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCwKKwkJCWZhbHNlKTsKKwl9CisJCisJcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7CisJCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOworCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7CisJCWxheW91dC5udW1Db2x1bW5zID0gMjsKKwkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDEwOworCQlsYXlvdXQubWFyZ2luV2lkdGggPSAxMDsKKwkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDEwOworCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7CisJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKKwkJZGF0YS53aWR0aEhpbnQgPSA0NTA7CisJCWRhdGEuaGVpZ2h0SGludCA9IDMwMDsKKwkJY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7CisJCQorCQlUZXh0IHRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5XUkFQICk7CisJCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKKwkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7CisJCXRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKKwkJdGV4dC5zZXRUZXh0KE5MUy5iaW5kKFVwZGF0ZVVJTWVzc2FnZXMuTWlycm9yc0RpYWxvZ190ZXh0LCBzaXRlTmFtZSkpOworCQl0ZXh0LnNldEJhY2tncm91bmQocGFyZW50LmdldEJhY2tncm91bmQoKSk7CisJCXRleHQuc2V0RWRpdGFibGUoZmFsc2UpOworCQkvLyB0aGUgdGV4dCBzaG91bGQgbm90IHJlY2VpdmUgZm9jdXMKKwkJdGV4dC5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKKwkJCQltaXJyb3JzTGlzdC5zZXRGb2N1cygpOworCQkJfQorCQl9KTsKKwkJCisJCW1pcnJvcnNMaXN0ID0gbmV3IExpc3QoY29tcG9zaXRlLCBTV1QuQk9SREVSIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKKwkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOworCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKKwkJbWlycm9yc0xpc3Quc2V0TGF5b3V0RGF0YShkYXRhKTsKKwkJCisJCWZvciAoaW50IGk9MDsgaTxtaXJyb3JzLmxlbmd0aDsgaSsrKQorCQkJbWlycm9yc0xpc3QuYWRkKG1pcnJvcnNbaV0uZ2V0QW5ub3RhdGlvbigpKTsKKwkJbWlycm9yc0xpc3QuYWRkKHNpdGVOYW1lKTsKKworCQltaXJyb3JzTGlzdC5zZWxlY3QoMCk7CisJCQorCQlhdXRvbWF0aWNhbGx5Q2hvb3NlTWlycm9yQ2hlY2tib3ggPQorCQkJbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyB8IFNXVC5MRUZUKTsKKwkJYXV0b21hdGljYWxseUNob29zZU1pcnJvckNoZWNrYm94LnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5NYWluUHJlZmVyZW5jZVBhZ2VfYXV0b21hdGljYWxseUNob29zZU1pcnJvcik7CisJCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKKwkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7CisJCWF1dG9tYXRpY2FsbHlDaG9vc2VNaXJyb3JDaGVja2JveC5zZXRMYXlvdXREYXRhKGRhdGEpOwkJCisJCQorCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KGNvbXBvc2l0ZSk7CisJCQorCQltaXJyb3JzTGlzdC5hZGRNb3VzZUxpc3RlbmVyKCBuZXcgTW91c2VMaXN0ZW5lcigpIHsKKwkJCQlwdWJsaWMgdm9pZCBtb3VzZURvdWJsZUNsaWNrKE1vdXNlRXZlbnQgZSkgeworCQkJCQlva1ByZXNzZWQoKTsJCQkKKwkJCQl9CQorCQkJCXB1YmxpYyB2b2lkIG1vdXNlRG93bihNb3VzZUV2ZW50IGUpIHsKKwkJCQkJLy8gZG8gbm90aGluZwkJCQorCQkJCX0KKwkJCQlwdWJsaWMgdm9pZCBtb3VzZVVwKE1vdXNlRXZlbnQgZSkgeworCQkJCQkvLwlkbyBub3RoaW5nCQkJCQorCQkJCX0JCQkKKwkJCX0KKwkJKTsKKwkJcmV0dXJuIGNvbXBvc2l0ZTsKKwl9CisJCQorCXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKKwkJaW50IGkgPSBtaXJyb3JzTGlzdC5nZXRTZWxlY3Rpb25JbmRleCgpOworCQkvLyBmaXJzdCBlbnRyeSBpcyB0aGUgc2l0ZSBpdHNlbGYKKwkJaWYgKGkgPG1pcnJvcnMubGVuZ3RoKQorCQkJbWlycm9yU2VsZWN0ZWQgPSBtaXJyb3JzW2ldOworCQlpZiAoYXV0b21hdGljYWxseUNob29zZU1pcnJvckNoZWNrYm94LmdldFNlbGVjdGlvbigpKSB7CisJCQlQcmVmZXJlbmNlcyBwcmVmcyA9IFVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKKwkJCXByZWZzLnNldFZhbHVlKFVwZGF0ZUNvcmUuUF9BVVRPTUFUSUNBTExZX0NIT09TRV9NSVJST1IsIHRydWUpOworCQkJVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKKwkJfQorCQlzdXBlci5va1ByZXNzZWQoKTsKKwl9CisJCisJcHVibGljIElVUkxFbnRyeSBnZXRNaXJyb3IoKSB7CisJCXJldHVybiBtaXJyb3JTZWxlY3RlZDsKKwl9CisKKyAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIHNoZWxsKSB7CisgICAgICAgc3VwZXIuY29uZmlndXJlU2hlbGwoc2hlbGwpOworICAgICAgIHNoZWxsLnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5NaXJyb3JzRGlhbG9nX3RpdGxlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9Nb2RlU2VsZWN0aW9uUGFnZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvTW9kZVNlbGVjdGlvblBhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTYzZDU5Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvTW9kZVNlbGVjdGlvblBhZ2UuamF2YQpAQCAtMCwwICsxLDE1MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS53aXphcmRzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwub3BlcmF0aW9ucy5VcGRhdGVVdGlsczsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUk7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnNlYXJjaC5VcGRhdGVTZWFyY2hSZXF1ZXN0OworCisvKioKKyAqLworcHVibGljIGNsYXNzIE1vZGVTZWxlY3Rpb25QYWdlIGV4dGVuZHMgQmFubmVyUGFnZSBpbXBsZW1lbnRzIElTZWFyY2hQcm92aWRlciB7CisJcHJpdmF0ZSBib29sZWFuIHVwZGF0ZU1vZGU9dHJ1ZTsKKwlwcml2YXRlIEJ1dHRvbiB1cGRhdGVzQnV0dG9uOworCXByaXZhdGUgQnV0dG9uIG5ld0ZlYXR1cmVzQnV0dG9uOworCXByaXZhdGUgVXBkYXRlU2VhcmNoUmVxdWVzdCBzZWFyY2hSZXF1ZXN0OworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRUNUSU9OX0lEID0gIk1vZGVTZWxlY3Rpb25QYWdlIjsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQX05FV19GRUFUVVJFU19NT0RFID0gIm5ldy1mZWF0dXJlcy1tb2RlIjsgLy8kTk9OLU5MUy0xJAorCQorCXB1YmxpYyBNb2RlU2VsZWN0aW9uUGFnZShVcGRhdGVTZWFyY2hSZXF1ZXN0IHNlYXJjaFJlcXVlc3QpIHsKKwkJc3VwZXIoIm1vZGVTZWxlY3Rpb24iKTsgLy8kTk9OLU5MUy0xJAorCQlzZXRUaXRsZShVcGRhdGVVSU1lc3NhZ2VzLk1vZGVTZWxlY3Rpb25QYWdlX3RpdGxlKTsgCisJCXNldERlc2NyaXB0aW9uKFVwZGF0ZVVJTWVzc2FnZXMuTW9kZVNlbGVjdGlvblBhZ2VfZGVzYyk7IAorCQl0aGlzLnNlYXJjaFJlcXVlc3QgPSBzZWFyY2hSZXF1ZXN0OworCX0KKwkKKwlwdWJsaWMgVXBkYXRlU2VhcmNoUmVxdWVzdCBnZXRTZWFyY2hSZXF1ZXN0KCkgeworCQlpbml0aWFsaXplU2VhcmNoKCk7CisJCXJldHVybiBzZWFyY2hSZXF1ZXN0OworCX0KKwkKKwlwcml2YXRlIElEaWFsb2dTZXR0aW5ncyBnZXRTZXR0aW5ncygpIHsKKwkJSURpYWxvZ1NldHRpbmdzIG1hc3RlciA9IFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXREaWFsb2dTZXR0aW5ncygpOworCQlJRGlhbG9nU2V0dGluZ3Mgc2VjdGlvbiA9IG1hc3Rlci5nZXRTZWN0aW9uKFNFQ1RJT05fSUQpOworCQlpZiAoc2VjdGlvbj09bnVsbCkKKwkJCXNlY3Rpb24gPSBtYXN0ZXIuYWRkTmV3U2VjdGlvbihTRUNUSU9OX0lEKTsKKwkJcmV0dXJuIHNlY3Rpb247CisJfQorCisJcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVTZWFyY2goKSB7CisJCWlmIChzZWFyY2hSZXF1ZXN0IT1udWxsKSByZXR1cm47CisJCXNlYXJjaFJlcXVlc3QgPSBVcGRhdGVVdGlscy5jcmVhdGVOZXdVcGRhdGVzUmVxdWVzdChudWxsLCBmYWxzZSk7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLndpemFyZHMuQmFubmVyUGFnZSNjcmVhdGVDb250ZW50cyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCisJICovCisJcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgeworCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKKwkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOworCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7CisJCXVwZGF0ZXNCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULlJBRElPKTsKKwkJdXBkYXRlc0J1dHRvbi5zZXRUZXh0KFVwZGF0ZVVJTWVzc2FnZXMuTW9kZVNlbGVjdGlvblBhZ2VfdXBkYXRlcyk7IAorCQl1cGRhdGVNb2RlID0gIWdldFNldHRpbmdzKCkuZ2V0Qm9vbGVhbihQX05FV19GRUFUVVJFU19NT0RFKTsKKwkJdXBkYXRlc0J1dHRvbi5zZXRTZWxlY3Rpb24odXBkYXRlTW9kZSk7CisJCQorCQlmaW5hbCBMYWJlbCB1cGRhdGVzVGV4dCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5XUkFQKTsKKwkJdXBkYXRlc1RleHQuc2V0VGV4dChVcGRhdGVVSU1lc3NhZ2VzLk1vZGVTZWxlY3Rpb25QYWdlX3VwZGF0ZXNUZXh0KTsKKwkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKKwkJZ2Qud2lkdGhIaW50ID0gMTAwOworCQl1cGRhdGVzVGV4dC5zZXRMYXlvdXREYXRhKGdkKTsKKwkJCisJCXVwZGF0ZXNCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CisJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJdXBkYXRlTW9kZSA9IHRydWU7CisgICAgICAgICAgICAgICAgZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOworCQkJfQorCQl9KTsKKwkJLy8gc3BhY2VyCisJCW5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OVUxMKTsKKwkJbmV3RmVhdHVyZXNCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULlJBRElPKTsKKwkJbmV3RmVhdHVyZXNCdXR0b24uc2V0U2VsZWN0aW9uKCF1cGRhdGVNb2RlKTsKKwkJbmV3RmVhdHVyZXNCdXR0b24uc2V0VGV4dChVcGRhdGVVSU1lc3NhZ2VzLk1vZGVTZWxlY3Rpb25QYWdlX25ld0ZlYXR1cmVzKTsgCisJCW5ld0ZlYXR1cmVzQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCXVwZGF0ZU1vZGUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7CisJCQl9CisJCX0pOwkJCisKKwkJZmluYWwgTGFiZWwgbmV3RmVhdHVyZXNUZXh0ID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULldSQVApOworCQluZXdGZWF0dXJlc1RleHQuc2V0VGV4dChVcGRhdGVVSU1lc3NhZ2VzLk1vZGVTZWxlY3Rpb25QYWdlX25ld0ZlYXR1cmVzVGV4dCk7CisJCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7CisJCWdkLndpZHRoSGludCA9IDEwMDsKKwkJbmV3RmVhdHVyZXNUZXh0LnNldExheW91dERhdGEoZ2QpOworCisJCS8qCisJCWNvbXBvc2l0ZS5hZGRDb250cm9sTGlzdGVuZXIobmV3IENvbnRyb2xBZGFwdGVyKCkgeworCQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpIHsKKwkJCQlDb21wb3NpdGUgcGFyZW50ID0gKENvbXBvc2l0ZSllLndpZGdldDsKKwkJCQlSZWN0YW5nbGUgY2FyZWEgPSBwYXJlbnQuZ2V0Q2xpZW50QXJlYSgpOworCQkJCUdyaWREYXRhIGdkID0gKEdyaWREYXRhKXVwZGF0ZXNUZXh0LmdldExheW91dERhdGEoKTsKKwkJCQlnZC53aWR0aEhpbnQgPSBjYXJlYS53aWR0aDsgCisJCQkJZ2QgPSAoR3JpZERhdGEpbmV3RmVhdHVyZXNUZXh0LmdldExheW91dERhdGEoKTsKKwkJCQlnZC53aWR0aEhpbnQgPSBjYXJlYS53aWR0aDsgCisJCQl9CisJCX0pOworCQkqLworCQkKKwkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOworCQkKKwkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb21wb3NpdGUsICJvcmcuZWNsaXBzZS51cGRhdGUudWkuTW9kZVNlbGVjdGlvblBhZ2UiKTsgLy8kTk9OLU5MUy0xJAorCisJCXJldHVybiBjb21wb3NpdGU7CisJfQorCQorCXB1YmxpYyB2b2lkIHNhdmVTZXR0aW5ncygpIHsKKwkJYm9vbGVhbiB1cGRhdGVNb2RlID0gdXBkYXRlc0J1dHRvbi5nZXRTZWxlY3Rpb24oKTsKKwkJZ2V0U2V0dGluZ3MoKS5wdXQoUF9ORVdfRkVBVFVSRVNfTU9ERSwgIXVwZGF0ZU1vZGUpOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBpc1VwZGF0ZU1vZGUoKSB7CisJCXJldHVybiB1cGRhdGVNb2RlOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgeworCQlyZXR1cm4gdXBkYXRlTW9kZSAmJiBzdXBlci5pc1BhZ2VDb21wbGV0ZSgpOworCX0KKworCXByb3RlY3RlZCBib29sZWFuIGlzQ3VycmVudFBhZ2UoKSB7CisJCXJldHVybiBzdXBlci5pc0N1cnJlbnRQYWdlKCk7CisJfQorCisJcHVibGljIGJvb2xlYW4gY2FuRmxpcFRvTmV4dFBhZ2UoKSB7CisJCXJldHVybiAhdXBkYXRlTW9kZTsKKwl9CisJCisJCisgICAgCit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9OZXdVcGRhdGVTaXRlRGlhbG9nLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9OZXdVcGRhdGVTaXRlRGlhbG9nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE1ODA3NwotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL05ld1VwZGF0ZVNpdGVEaWFsb2cuamF2YQpAQCAtMCwwICsxLDIxNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS53aXphcmRzOworCitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuU3RhdHVzRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVSTENvZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUlNZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWwuU2l0ZUJvb2ttYXJrOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbC5VcGRhdGVNb2RlbDsKKworCitwdWJsaWMgY2xhc3MgTmV3VXBkYXRlU2l0ZURpYWxvZyBleHRlbmRzIFN0YXR1c0RpYWxvZyB7CisJCisJcHJvdGVjdGVkIFRleHQgbmFtZTsKKwlwcm90ZWN0ZWQgVGV4dCB1cmw7CisJcHJpdmF0ZSBCdXR0b24gb2tCdXR0b247CisJcHJpdmF0ZSBib29sZWFuIGVuYWJsZU9LID0gZmFsc2U7CisJcHJpdmF0ZSBTaXRlQm9va21hcmtbXSBzaXRlQm9va21hcmtzOworCS8qKgorCSAqIEBwYXJhbSBwYXJlbnRTaGVsbAorCSAqLworCXB1YmxpYyBOZXdVcGRhdGVTaXRlRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsKSB7CisJCXN1cGVyKHBhcmVudFNoZWxsKTsKKwkJZW5hYmxlT0sgPSBmYWxzZTsKKwl9CisJCisJcHVibGljIE5ld1VwZGF0ZVNpdGVEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFNpdGVCb29rbWFya1tdIHNpdGVCb29rbWFya3MpIHsKKwkJCisJCXRoaXMocGFyZW50U2hlbGwpOwkJCisJCXRoaXMuc2l0ZUJvb2ttYXJrcyA9IHNpdGVCb29rbWFya3M7CisJfQorCQorCXB1YmxpYyBOZXdVcGRhdGVTaXRlRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBib29sZWFuIGVuYWJsZU9rQnV0dG9ucykgeworCQlzdXBlcihwYXJlbnRTaGVsbCk7CisJCWVuYWJsZU9LID0gZW5hYmxlT2tCdXR0b25zOworCX0KKwkKKwlwdWJsaWMgTmV3VXBkYXRlU2l0ZURpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgYm9vbGVhbiBlbmFibGVPa0J1dHRvbnMsIFNpdGVCb29rbWFya1tdIHNpdGVCb29rbWFya3MpIHsKKwkJdGhpcyhwYXJlbnRTaGVsbCwgZW5hYmxlT2tCdXR0b25zKTsKKwkJdGhpcy5zaXRlQm9va21hcmtzID0gc2l0ZUJvb2ttYXJrczsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7CisJCQorCQkvL3N1cGVyLmNyZWF0ZUJ1dHRvbkJhcihwYXJlbnQpOworCQlva0J1dHRvbiA9IGNyZWF0ZUJ1dHRvbigKKwkJCQlwYXJlbnQsCisJCQkJSURpYWxvZ0NvbnN0YW50cy5PS19JRCwKKwkJCQlJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLAorCQkJCXRydWUpOworCQljcmVhdGVCdXR0b24oCisJCQlwYXJlbnQsCisJCQlJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCwKKwkJCUlEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMLAorCQkJZmFsc2UpOworCQkKKwkJb2tCdXR0b24uc2V0RW5hYmxlZChlbmFibGVPSyk7CisJCQorCX0KKwkKKwlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7CisJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKKwkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOworCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7CisJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKKwkJZGF0YS53aWR0aEhpbnQgPSAzNTA7CisJCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOworCQkKKwkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7CisJCWxhYmVsLnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5OZXdVcGRhdGVTaXRlRGlhbG9nX25hbWUpOyAKKwkJCisJCW5hbWUgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOworCQluYW1lLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOworCQluYW1lLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgeworCQkJCXZlcmlmeUNvbXBsZXRlKCk7CisJCQl9CisJCX0pOworCQkKKwkJbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7CisJCWxhYmVsLnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5OZXdVcGRhdGVTaXRlRGlhbG9nX3VybCk7IAorCQkKKwkJdXJsID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKKwkJdXJsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOworCQl1cmwuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7CisJCQkJdmVyaWZ5Q29tcGxldGUoKTsKKwkJCX0KKwkJfSk7CisJCQorCQlpbml0aWFsaXplRmllbGRzKCk7CisJCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQoY29tcG9zaXRlKTsKKwkJcmV0dXJuIGNvbXBvc2l0ZTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUZpZWxkcygpIHsKKwkJdXJsLnNldFRleHQoImh0dHA6Ly8iKTsgLy8kTk9OLU5MUy0xJAorCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7CisJCXVwZGF0ZSgpOworCQlzdXBlci5va1ByZXNzZWQoKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoKSB7CisJCXRyeSB7CisJCQlVcGRhdGVNb2RlbCBtb2RlbCA9IFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRVcGRhdGVNb2RlbCgpOworCQkJU2l0ZUJvb2ttYXJrIGJvb2ttYXJrID0gbmV3IFNpdGVCb29rbWFyayhuYW1lLmdldFRleHQoKSwgbmV3IFVSTCh1cmwuZ2V0VGV4dCgpKSwgZmFsc2UpOworICAgICAgICAgICAgYm9va21hcmsuc2V0U2VsZWN0ZWQodHJ1ZSk7CisJCQltb2RlbC5hZGRCb29rbWFyayhib29rbWFyayk7CisJCQltb2RlbC5zYXZlQm9va21hcmtzKCk7CisJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisJCX0KKwl9CisJCisJcHJpdmF0ZSB2b2lkIHZlcmlmeUNvbXBsZXRlKCkgeworCQkJCisJCWlmIChva0J1dHRvbiA9PSBudWxsKSB7CisJCQlyZXR1cm47CQkKKwkJfQorCQkKKwkJaWYgKG5hbWUuZ2V0VGV4dCgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwIHx8IHVybC5nZXRUZXh0KCkudHJpbSgpLmxlbmd0aCgpID09IDApIHsKKwkJCW9rQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOworCQkJdGhpcy51cGRhdGVTdGF0dXMoIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVXBkYXRlVUkuZ2V0UGx1Z2luSWQoKSwgSVN0YXR1cy5PSywgVXBkYXRlVUlNZXNzYWdlcy5OZXdVcGRhdGVTaXRlRGlhbG9nX2Vycm9yX25hbWVPclVybE5vdFNwZWNpZmllZCwgbnVsbCkpOyAKKwkJCXJldHVybjsKKwkJfQorCQorCQl0cnkgeworCQkJVVJMIG5ld1VSTCA9IG5ldyBVUkwoVVJMQ29kZXIuZGVjb2RlKHVybC5nZXRUZXh0KCkudHJpbSgpKSk7CisJCQlpZiAodXJsLmdldEVkaXRhYmxlKCkpIHsKKwkJCQlva0J1dHRvbi5zZXRFbmFibGVkKCFuZXdVUkwuZ2V0UHJvdG9jb2woKS5lcXVhbHMoImZpbGUiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQlpZiAobmV3VVJMLmdldFByb3RvY29sKCkuZXF1YWxzKCJmaWxlIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCQlva0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKKwkJCQkJdGhpcy51cGRhdGVTdGF0dXMoIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVXBkYXRlVUkuZ2V0UGx1Z2luSWQoKSwgSVN0YXR1cy5PSywgVXBkYXRlVUlNZXNzYWdlcy5OZXdVcGRhdGVTaXRlRGlhbG9nX2Vycm9yX2luY29ycmVjdFVybCwgbnVsbCkpOyAKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCX0KKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCW9rQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOworCQkJdGhpcy51cGRhdGVTdGF0dXMoIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVXBkYXRlVUkuZ2V0UGx1Z2luSWQoKSwgSVN0YXR1cy5PSywgVXBkYXRlVUlNZXNzYWdlcy5OZXdVcGRhdGVTaXRlRGlhbG9nX2Vycm9yX2luY29ycmVjdFVybCwgbnVsbCkpOyAKKwkJCXJldHVybjsKKwkJfQorCQkKKwkJaWYgKGlzRHVwbGljYXRlKCkpIHsKKwkJCXJldHVybjsKKwkJfSBlbHNlIHsKKwkJCW9rQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7CisJCQl0aGlzLnVwZGF0ZVN0YXR1cyggbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBVcGRhdGVVSS5nZXRQbHVnaW5JZCgpLCBJU3RhdHVzLk9LLCAiIiwgbnVsbCkpOyAgLy8kTk9OLU5MUy0xJAorCQl9CisJCQorCQkKKwl9CisJCisJcHJpdmF0ZSBib29sZWFuIGlzRHVwbGljYXRlKCkgeworCQkKKwkJaWYgKCBzaXRlQm9va21hcmtzID09IG51bGwpCisJCQlyZXR1cm4gZmFsc2U7CisJCQorCQlmb3IoIGludCBpID0gMDsgaSA8IHRoaXMuc2l0ZUJvb2ttYXJrcy5sZW5ndGg7IGkrKykgeworCQkJaWYgKCAhaXNDdXJyZW50bHlFZGl0ZWRTaXRlQm9va21hcmsoaSkpIHsKKwkJCQlpZiAoc2l0ZUJvb2ttYXJrc1tpXS5nZXRMYWJlbCgpLmVxdWFscyhuYW1lLmdldFRleHQoKS50cmltKCkpKSB7CisJCQkJCW9rQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOworCQkJCQl0aGlzLnVwZGF0ZVN0YXR1cyggbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBVcGRhdGVVSS5nZXRQbHVnaW5JZCgpLCBJU3RhdHVzLk9LLCBVcGRhdGVVSU1lc3NhZ2VzLk5ld1VwZGF0ZVNpdGVEaWFsb2dfZXJyb3JfZHVwbGljYXRlTmFtZSwgbnVsbCkpOyAKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfSBlbHNlIGlmIChzaXRlQm9va21hcmtzW2ldLmdldFVSTCgpLnRvU3RyaW5nKCkudHJpbSgpLmVxdWFscyh1cmwuZ2V0VGV4dCgpLnRyaW0oKSkpIHsKKwkJCQkJb2tCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7CisJCQkJCXRoaXMudXBkYXRlU3RhdHVzKCBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFVwZGF0ZVVJLmdldFBsdWdpbklkKCksIElTdGF0dXMuT0ssIE5MUy5iaW5kKFVwZGF0ZVVJTWVzc2FnZXMuTmV3VXBkYXRlU2l0ZURpYWxvZ19lcnJvcl9kdXBsaWNhdGVVcmwsIHNpdGVCb29rbWFya3NbaV0uZ2V0TGFiZWwoKSksIG51bGwpKTsgCisJCQkJCXJldHVybiB0cnVlOworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCQorCXByb3RlY3RlZCBib29sZWFuIGlzQ3VycmVudGx5RWRpdGVkU2l0ZUJvb2ttYXJrKCBpbnQgaW5kZXgpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwkKKwkKKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVCdXR0b25zRW5hYmxlU3RhdGUoSVN0YXR1cyBzdGF0dXMpIHsKKwkJaWYgKG9rQnV0dG9uICE9IG51bGwgJiYgIW9rQnV0dG9uLmlzRGlzcG9zZWQoKSkKKwkJCW9rQnV0dG9uLnNldEVuYWJsZWQoIXN0YXR1cy5tYXRjaGVzKElTdGF0dXMuRVJST1IpKTsKKwl9CisJCisKKworfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvT3B0aW9uYWxGZWF0dXJlc1BhZ2UuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL09wdGlvbmFsRmVhdHVyZXNQYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQwZjc2MAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL09wdGlvbmFsRmVhdHVyZXNQYWdlLmphdmEKQEAgLTAsMCArMSwzMzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkud2l6YXJkczsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5BYnN0cmFjdFRyZWVWaWV3ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja1N0YXRlQ2hhbmdlZEV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUcmVlVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNoZWNrU3RhdGVMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi5JQ29uZmlndXJlZFNpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uSUluc3RhbGxDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zLkZlYXR1cmVIaWVyYXJjaHlFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zLkpvYlJvb3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm9wZXJhdGlvbnMuVXBkYXRlVXRpbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSUltYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUlNZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkucGFydHMuRGVmYXVsdENvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkucGFydHMuU1dUVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy5JSW5zdGFsbEZlYXR1cmVPcGVyYXRpb247CisKK3B1YmxpYyBjbGFzcyBPcHRpb25hbEZlYXR1cmVzUGFnZSBleHRlbmRzIEJhbm5lclBhZ2UgaW1wbGVtZW50cyBJRHluYW1pY1BhZ2UgeworCXByaXZhdGUgQ2hlY2tib3hUcmVlVmlld2VyIHRyZWVWaWV3ZXI7CisJcHJpdmF0ZSBCdXR0b24gc2VsZWN0QWxsQnV0dG9uOworCXByaXZhdGUgQnV0dG9uIGRlc2VsZWN0QWxsQnV0dG9uOworCXByaXZhdGUgSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZzsKKwlwcml2YXRlIEpvYlJvb3RbXSBqb2JSb290czsKKworCWNsYXNzIFRyZWVDb250ZW50UHJvdmlkZXIKKwkJZXh0ZW5kcyBEZWZhdWx0Q29udGVudFByb3ZpZGVyCisJCWltcGxlbWVudHMgSVRyZWVDb250ZW50UHJvdmlkZXIgeworCisJCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50KSB7CisJCQlpZiAocGFyZW50IGluc3RhbmNlb2YgSm9iUm9vdCkgeworCQkJCXJldHVybiAoKEpvYlJvb3QpIHBhcmVudCkuZ2V0RWxlbWVudHMoKTsKKwkJCX0KKwkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBGZWF0dXJlSGllcmFyY2h5RWxlbWVudCkgeworCQkJCUZlYXR1cmVIaWVyYXJjaHlFbGVtZW50IGZlID0gKEZlYXR1cmVIaWVyYXJjaHlFbGVtZW50KSBwYXJlbnQ7CisJCQkJT2JqZWN0IHJvb3QgPSBmZS5nZXRSb290KCk7CisJCQkJYm9vbGVhbiBvbGRGZWF0dXJlID0gZmFsc2U7CisJCQkJaWYgKHJvb3QgaW5zdGFuY2VvZiBKb2JSb290KSB7CisJCQkJCUlJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiBqb2IgPSAoKEpvYlJvb3Qpcm9vdCkuZ2V0Sm9iKCk7CisJCQkJCWJvb2xlYW4gcGF0Y2ggPSBVcGRhdGVVdGlscy5pc1BhdGNoKGpvYi5nZXRGZWF0dXJlKCkpOworCQkJCQlvbGRGZWF0dXJlID0gam9iLmdldE9sZEZlYXR1cmUoKSAhPSBudWxsOworCQkJCQlyZXR1cm4gZmUuZ2V0Q2hpbGRyZW4ob2xkRmVhdHVyZSwgcGF0Y2gsIGNvbmZpZyk7CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIG5ldyBPYmplY3RbMF07CisJCX0KKworCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgY2hpbGQpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IHBhcmVudCkgeworCQkJcmV0dXJuIGdldENoaWxkcmVuKHBhcmVudCkubGVuZ3RoID4gMDsKKwkJfQorCisJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXQpIHsKKwkJCWlmIChqb2JSb290cyA9PSBudWxsKQorCQkJCXJldHVybiBuZXcgT2JqZWN0WzBdOworCQkJcmV0dXJuIGpvYlJvb3RzOworCQl9CisJfQorCisJY2xhc3MgVHJlZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIHsKKwkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmopIHsKKwkJCWlmIChvYmogaW5zdGFuY2VvZiBKb2JSb290KSB7CisJCQkJSUZlYXR1cmUgZmVhdHVyZSA9ICgoSm9iUm9vdCkgb2JqKS5nZXRKb2IoKS5nZXRGZWF0dXJlKCk7CisJCQkJcmV0dXJuIGZlYXR1cmUuZ2V0TGFiZWwoKQorCQkJCQkrICIgIiAvLyROT04tTkxTLTEkCisJCQkJCSsgZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0VmVyc2lvbigpLnRvU3RyaW5nKCk7CisJCQl9CisJCQlpZiAob2JqIGluc3RhbmNlb2YgRmVhdHVyZUhpZXJhcmNoeUVsZW1lbnQpIHsKKwkJCQlTdHJpbmcgbmFtZSA9ICgoRmVhdHVyZUhpZXJhcmNoeUVsZW1lbnQpIG9iaikuZ2V0TGFiZWwoKTsKKwkJCQlpZiAobmFtZSAhPSBudWxsKQorCQkJCQlyZXR1cm4gbmFtZTsKKwkJCX0KKworCQkJcmV0dXJuIHN1cGVyLmdldFRleHQob2JqKTsKKwkJfQorCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IG9iaikgeworCQkJcmV0dXJuIFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRMYWJlbFByb3ZpZGVyKCkuZ2V0KAorCQkJCVVwZGF0ZVVJSW1hZ2VzLkRFU0NfRkVBVFVSRV9PQkopOworCQl9CisJfQorCisJLyoqCisJICogQ29uc3RydWN0b3IgZm9yIFJldmlld1BhZ2UyCisJICovCisJcHVibGljIE9wdGlvbmFsRmVhdHVyZXNQYWdlKElJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcpIHsKKwkJc3VwZXIoIk9wdGlvbmFsRmVhdHVyZXMiKTsgLy8kTk9OLU5MUy0xJAorCQlzZXRUaXRsZShVcGRhdGVVSU1lc3NhZ2VzLkluc3RhbGxXaXphcmRfT3B0aW9uYWxGZWF0dXJlc1BhZ2VfdGl0bGUpOworCQlzZXREZXNjcmlwdGlvbihVcGRhdGVVSU1lc3NhZ2VzLkluc3RhbGxXaXphcmRfT3B0aW9uYWxGZWF0dXJlc1BhZ2VfZGVzYyk7CisJCXRoaXMuY29uZmlnID0gY29uZmlnOworCQlVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0TGFiZWxQcm92aWRlcigpLmNvbm5lY3QodGhpcyk7CisJfQorCisJcHVibGljIHZvaWQgc2V0Sm9icyhJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb25bXSBqb2JzKSB7CisJCWpvYlJvb3RzID0gbmV3IEpvYlJvb3Rbam9icy5sZW5ndGhdOworCQlmb3IgKGludCBpID0gMDsgaSA8IGpvYnMubGVuZ3RoOyBpKyspIHsKKwkJCWpvYlJvb3RzW2ldID0gbmV3IEpvYlJvb3Qoam9ic1tpXSk7CisJCX0KKwl9CisKKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQlVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0TGFiZWxQcm92aWRlcigpLmRpc2Nvbm5lY3QodGhpcyk7CisJCXN1cGVyLmRpc3Bvc2UoKTsKKwl9CisKKworCXB1YmxpYyBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJQ29tcG9zaXRlIGNsaWVudCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7CisJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKKwkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOworCQlsYXlvdXQubWFyZ2luV2lkdGggPSBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKKwkJY2xpZW50LnNldExheW91dChsYXlvdXQpOworCisJCWNyZWF0ZUNoZWNrYm94VHJlZVZpZXdlcihjbGllbnQpOworCisJCXNlbGVjdEFsbEJ1dHRvbiA9IG5ldyBCdXR0b24oY2xpZW50LCBTV1QuUFVTSCk7CisJCXNlbGVjdEFsbEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQlzZWxlY3RBbGwodHJ1ZSk7CisJCQl9CisJCX0pOworCQlzZWxlY3RBbGxCdXR0b24uc2V0VGV4dChVcGRhdGVVSU1lc3NhZ2VzLkluc3RhbGxXaXphcmRfT3B0aW9uYWxGZWF0dXJlc1BhZ2Vfc2VsZWN0QWxsKTsKKwkJR3JpZERhdGEgZ2QgPQorCQkJbmV3IEdyaWREYXRhKAorCQkJCUdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7CisJCXNlbGVjdEFsbEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKKwkJU1dUVXRpbC5zZXRCdXR0b25EaW1lbnNpb25IaW50KHNlbGVjdEFsbEJ1dHRvbik7CisKKwkJZGVzZWxlY3RBbGxCdXR0b24gPSBuZXcgQnV0dG9uKGNsaWVudCwgU1dULlBVU0gpOworCQlkZXNlbGVjdEFsbEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQlzZWxlY3RBbGwoZmFsc2UpOworCQkJfQorCQl9KTsKKwkJZGVzZWxlY3RBbGxCdXR0b24uc2V0VGV4dChVcGRhdGVVSU1lc3NhZ2VzLkluc3RhbGxXaXphcmRfT3B0aW9uYWxGZWF0dXJlc1BhZ2VfZGVzZWxlY3RBbGwpOworCQlnZCA9CisJCQluZXcgR3JpZERhdGEoCisJCQkJR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsKKwkJZGVzZWxlY3RBbGxCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7CisJCVNXVFV0aWwuc2V0QnV0dG9uRGltZW5zaW9uSGludChkZXNlbGVjdEFsbEJ1dHRvbik7CisJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY2xpZW50LCAib3JnLmVjbGlwc2UudXBkYXRlLnVpLk11bHRpT3B0aW9uYWxGZWF0dXJlc1BhZ2UyIik7IC8vJE5PTi1OTFMtMSQKKwkJCisJCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKKwkJCisJCXJldHVybiBjbGllbnQ7CisJfQorCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNoZWNrYm94VHJlZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7CisJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5VTEwpOworCQlsYWJlbC5zZXRUZXh0KFVwZGF0ZVVJTWVzc2FnZXMuSW5zdGFsbFdpemFyZF9PcHRpb25hbEZlYXR1cmVzUGFnZV90cmVlTGFiZWwpOworCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOworCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7CisJCWxhYmVsLnNldExheW91dERhdGEoZ2QpOworCQl0cmVlVmlld2VyID0KKwkJCW5ldyBDaGVja2JveFRyZWVWaWV3ZXIocGFyZW50LCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKKwkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKKwkJZ2QudmVydGljYWxTcGFuID0gMjsKKwkJdHJlZVZpZXdlci5nZXRUcmVlKCkuc2V0TGF5b3V0RGF0YShnZCk7CisJCXRyZWVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBUcmVlQ29udGVudFByb3ZpZGVyKCkpOworCQl0cmVlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IFRyZWVMYWJlbFByb3ZpZGVyKCkpOworCQl0cmVlVmlld2VyLmFkZENoZWNrU3RhdGVMaXN0ZW5lcihuZXcgSUNoZWNrU3RhdGVMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIGNoZWNrU3RhdGVDaGFuZ2VkKENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQgZSkgeworCQkJCWhhbmRsZUNoZWNrZWQoZS5nZXRFbGVtZW50KCksIGUuZ2V0Q2hlY2tlZCgpKTsKKwkJCX0KKwkJfSk7CisJCXRyZWVWaWV3ZXIuc2V0QXV0b0V4cGFuZExldmVsKEFic3RyYWN0VHJlZVZpZXdlci5BTExfTEVWRUxTKTsKKwkJdHJlZVZpZXdlci5zZXRJbnB1dCh0aGlzKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgeworCQlpZiAodmlzaWJsZSkgeworCQkJdHJlZVZpZXdlci5zZXRJbnB1dChqb2JSb290cyk7CisJCQlpbml0aWFsaXplU3RhdGVzKCk7CisJCX0KKwkJc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsKKwkJaWYgKHZpc2libGUpIHsKKwkJCXRyZWVWaWV3ZXIuZ2V0VHJlZSgpLnNldEZvY3VzKCk7CisJCX0JCQorCX0KKworCXByaXZhdGUgdm9pZCBpbml0aWFsaXplU3RhdGVzKCkgeworCQlBcnJheUxpc3QgY2hlY2tlZCA9IG5ldyBBcnJheUxpc3QoKTsKKwkJQXJyYXlMaXN0IGdyYXllZCA9IG5ldyBBcnJheUxpc3QoKTsKKwkJQXJyYXlMaXN0IGVkaXRhYmxlID0gbmV3IEFycmF5TGlzdCgpOworCisJCWZvciAoaW50IGkgPSAwOyBpIDwgam9iUm9vdHMubGVuZ3RoOyBpKyspIHsKKwkJCWNoZWNrZWQuYWRkKGpvYlJvb3RzW2ldKTsKKwkJCWdyYXllZC5hZGQoam9iUm9vdHNbaV0pOworCQkJYm9vbGVhbiB1cGRhdGUgPSBqb2JSb290c1tpXS5nZXRKb2IoKS5nZXRPbGRGZWF0dXJlKCkgIT0gbnVsbDsKKwkJCWluaXRpYWxpemVTdGF0ZXModXBkYXRlLCBqb2JSb290c1tpXS5nZXRFbGVtZW50cygpLCBjaGVja2VkLCBncmF5ZWQsIGVkaXRhYmxlKTsKKwkJfQorCQl0cmVlVmlld2VyLnNldENoZWNrZWRFbGVtZW50cyhjaGVja2VkLnRvQXJyYXkoKSk7CisJCXRyZWVWaWV3ZXIuc2V0R3JheWVkRWxlbWVudHMoZ3JheWVkLnRvQXJyYXkoKSk7CisJCXNlbGVjdEFsbEJ1dHRvbi5zZXRFbmFibGVkKGVkaXRhYmxlLnNpemUoKT4wKTsKKwkJZGVzZWxlY3RBbGxCdXR0b24uc2V0RW5hYmxlZChlZGl0YWJsZS5zaXplKCk+MCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVTdGF0ZXMoCisJCWJvb2xlYW4gdXBkYXRlLAorCQlPYmplY3RbXSBlbGVtZW50cywKKwkJQXJyYXlMaXN0IGNoZWNrZWQsCisJCUFycmF5TGlzdCBncmF5ZWQsCisJCUFycmF5TGlzdCBlZGl0YWJsZSkgeworCisJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKKwkJCUZlYXR1cmVIaWVyYXJjaHlFbGVtZW50IGVsZW1lbnQgPQorCQkJCShGZWF0dXJlSGllcmFyY2h5RWxlbWVudCkgZWxlbWVudHNbaV07CisJCQlpZiAoZWxlbWVudC5pc0NoZWNrZWQoKSkKKwkJCQljaGVja2VkLmFkZChlbGVtZW50KTsKKwkJCWlmICghZWxlbWVudC5pc0VkaXRhYmxlKCkpCisJCQkJZ3JheWVkLmFkZChlbGVtZW50KTsKKwkJCWVsc2UKKwkJCQllZGl0YWJsZS5hZGQoZWxlbWVudCk7CisJCQlpbml0aWFsaXplU3RhdGVzKHVwZGF0ZSwgZWxlbWVudC5nZXRDaGlsZHJlbigpLCBjaGVja2VkLCBncmF5ZWQsIGVkaXRhYmxlKTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBzZWxlY3RBbGwoYm9vbGVhbiB2YWx1ZSkgeworCQlBcnJheUxpc3Qgc2VsZWN0ZWQgPSBuZXcgQXJyYXlMaXN0KCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgam9iUm9vdHMubGVuZ3RoOyBpKyspIHsKKwkJCUlJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiBqb2IgPSBqb2JSb290c1tpXS5nZXRKb2IoKTsKKwkJCXNlbGVjdGVkLmFkZChqb2IpOworCQkJT2JqZWN0W10gZWxlbWVudHMgPSBqb2JSb290c1tpXS5nZXRFbGVtZW50cygpOworCQkJZm9yIChpbnQgaiA9IDA7IGogPCBlbGVtZW50cy5sZW5ndGg7IGorKykgeworCQkJCUZlYXR1cmVIaWVyYXJjaHlFbGVtZW50IGVsZW1lbnQgPSAoRmVhdHVyZUhpZXJhcmNoeUVsZW1lbnQpIGVsZW1lbnRzW2pdOworCQkJCXNlbGVjdEFsbChqb2IuZ2V0T2xkRmVhdHVyZSgpICE9IG51bGwsIGVsZW1lbnQsIHNlbGVjdGVkLCB2YWx1ZSk7CisJCQl9CisJCX0KKwkJdHJlZVZpZXdlci5zZXRDaGVja2VkRWxlbWVudHMoc2VsZWN0ZWQudG9BcnJheSgpKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2VsZWN0QWxsKAorCQlib29sZWFuIHVwZGF0ZSwKKwkJRmVhdHVyZUhpZXJhcmNoeUVsZW1lbnQgcmVmLAorCQlBcnJheUxpc3Qgc2VsZWN0ZWQsCisJCWJvb2xlYW4gdmFsdWUpIHsKKworCQlpZiAoIXJlZi5pc09wdGlvbmFsKCkpIHsKKwkJCXNlbGVjdGVkLmFkZChyZWYpOworCQl9IGVsc2UgeworCQkJaWYgKHJlZi5pc0VkaXRhYmxlKCkpIHsKKwkJCQlyZWYuc2V0Q2hlY2tlZCh2YWx1ZSk7CisJCQkJaWYgKHZhbHVlKQorCQkJCQlzZWxlY3RlZC5hZGQocmVmKTsKKwkJCX0gZWxzZSBpZiAocmVmLmlzQ2hlY2tlZCgpKSB7CisJCQkJc2VsZWN0ZWQuYWRkKHJlZik7CisJCQl9CisJCX0KKwkJT2JqZWN0W10gaW5jbHVkZWQgPSByZWYuZ2V0Q2hpbGRyZW4oKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmNsdWRlZC5sZW5ndGg7IGkrKykgeworCQkJc2VsZWN0QWxsKHVwZGF0ZSwgKEZlYXR1cmVIaWVyYXJjaHlFbGVtZW50KSBpbmNsdWRlZFtpXSwgc2VsZWN0ZWQsIHZhbHVlKTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBoYW5kbGVDaGVja2VkKE9iamVjdCBlbGVtZW50LCBib29sZWFuIGNoZWNrZWQpIHsKKwkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBKb2JSb290KSB7CisJCQl0cmVlVmlld2VyLnNldENoZWNrZWQoZWxlbWVudCwgIWNoZWNrZWQpOworCQkJcmV0dXJuOworCQl9CisJCUZlYXR1cmVIaWVyYXJjaHlFbGVtZW50IGZlID0gKEZlYXR1cmVIaWVyYXJjaHlFbGVtZW50KSBlbGVtZW50OworCisJCWlmICghZmUuaXNFZGl0YWJsZSgpKQorCQkJdHJlZVZpZXdlci5zZXRDaGVja2VkKGVsZW1lbnQsICFjaGVja2VkKTsKKwkJZWxzZSB7CisJCQkvLyB1cGRhdGUgdGhlIHJlc3VsdAorCQkJZmUuc2V0Q2hlY2tlZChjaGVja2VkKTsKKwkJfQorCX0KKwkKKwlwdWJsaWMgSUZlYXR1cmVbXSBnZXRVbmNvbmZpZ3VyZWRPcHRpb25hbEZlYXR1cmVzKElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiBqb2IsIElDb25maWd1cmVkU2l0ZSB0YXJnZXRTaXRlKSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgam9iUm9vdHMubGVuZ3RoOyBpKyspIHsKKwkJCWlmIChqb2IuZXF1YWxzKGpvYlJvb3RzW2ldLmdldEpvYigpKSkgeworCQkJCXJldHVybiBqb2JSb290c1tpXS5nZXRVbmNvbmZpZ3VyZWRPcHRpb25hbEZlYXR1cmVzKGNvbmZpZywgdGFyZ2V0U2l0ZSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIG5ldyBJRmVhdHVyZVswXTsKKwl9CisJCisJcHVibGljIElGZWF0dXJlUmVmZXJlbmNlW10gZ2V0Q2hlY2tlZE9wdGlvbmFsRmVhdHVyZXMoSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIGN1cnJlbnRKb2IpIHsKKwkJSGFzaFNldCBzZXQgPSBuZXcgSGFzaFNldCgpOworCQlKb2JSb290IGpvYlJvb3QgPSBudWxsOworCisJCWZvciAoaW50IGkgPSAwOyBpIDwgam9iUm9vdHMubGVuZ3RoOyBpKyspIHsKKwkJCWlmIChjdXJyZW50Sm9iLmVxdWFscyhqb2JSb290c1tpXS5nZXRKb2IoKSkpIHsKKwkJCQlqb2JSb290ID0gam9iUm9vdHNbaV07CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKGpvYlJvb3QgPT0gbnVsbCkKKwkJCXJldHVybiBuZXcgSUZlYXR1cmVSZWZlcmVuY2VbMF07CisKKwkJSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIGpvYiA9IGpvYlJvb3QuZ2V0Sm9iKCk7CisJCWJvb2xlYW4gdXBkYXRlID0gam9iLmdldE9sZEZlYXR1cmUoKSAhPSBudWxsOworCQlib29sZWFuIHBhdGNoID0gVXBkYXRlVXRpbHMuaXNQYXRjaChqb2IuZ2V0RmVhdHVyZSgpKTsKKwkJRmVhdHVyZUhpZXJhcmNoeUVsZW1lbnRbXSBlbGVtZW50cyA9IGpvYlJvb3QuZ2V0RWxlbWVudHMoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgeworCQkJZWxlbWVudHNbaV0uYWRkQ2hlY2tlZE9wdGlvbmFsRmVhdHVyZXModXBkYXRlLCBwYXRjaCwgY29uZmlnLCBzZXQpOworCQl9CisJCXJldHVybiAoSUZlYXR1cmVSZWZlcmVuY2VbXSkgc2V0LnRvQXJyYXkobmV3IElGZWF0dXJlUmVmZXJlbmNlW3NldC5zaXplKCldKTsKKwl9Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9SZXBsYWNlRmVhdHVyZVZlcnNpb25XaXphcmQuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL1JlcGxhY2VGZWF0dXJlVmVyc2lvbldpemFyZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2MjI4MzEKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9SZXBsYWNlRmVhdHVyZVZlcnNpb25XaXphcmQuamF2YQpAQCAtMCwwICsxLDM2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLndpemFyZHM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSUltYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUlNZXNzYWdlczsKKworCitwdWJsaWMgY2xhc3MgUmVwbGFjZUZlYXR1cmVWZXJzaW9uV2l6YXJkIGV4dGVuZHMgV2l6YXJkIHsKKwlwcml2YXRlIFJlcGxhY2VGZWF0dXJlVmVyc2lvbldpemFyZFBhZ2UgcGFnZTsKKworCXB1YmxpYyBSZXBsYWNlRmVhdHVyZVZlcnNpb25XaXphcmQoSUZlYXR1cmUgY3VycmVudEZlYXR1cmUsIElGZWF0dXJlW10gZmVhdHVyZXMpIHsKKwkJc2V0V2luZG93VGl0bGUoVXBkYXRlVUlNZXNzYWdlcy5Td2FwRmVhdHVyZVdpemFyZF90aXRsZSk7IAorCQlzZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihVcGRhdGVVSUltYWdlcy5ERVNDX1VQREFURV9XSVopOworCQlwYWdlID0gbmV3IFJlcGxhY2VGZWF0dXJlVmVyc2lvbldpemFyZFBhZ2UoY3VycmVudEZlYXR1cmUsIGZlYXR1cmVzKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKKwkJYWRkUGFnZShwYWdlKTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKKwkJcmV0dXJuIHBhZ2UucGVyZm9ybUZpbmlzaCgpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvUmVwbGFjZUZlYXR1cmVWZXJzaW9uV2l6YXJkUGFnZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvUmVwbGFjZUZlYXR1cmVWZXJzaW9uV2l6YXJkUGFnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2NDNkNTcKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9SZXBsYWNlRmVhdHVyZVZlcnNpb25XaXphcmRQYWdlLmphdmEKQEAgLTAsMCArMSwxODAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkud2l6YXJkczsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy4qOworCisKK3B1YmxpYyBjbGFzcyBSZXBsYWNlRmVhdHVyZVZlcnNpb25XaXphcmRQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSB7CisJCisJcHJpdmF0ZSBJRmVhdHVyZSBjdXJyZW50RmVhdHVyZTsKKwlwcml2YXRlIElGZWF0dXJlW10gZmVhdHVyZXM7CisJcHJpdmF0ZSBUYWJsZVZpZXdlciB0YWJsZVZpZXdlcjsKKworCXB1YmxpYyBSZXBsYWNlRmVhdHVyZVZlcnNpb25XaXphcmRQYWdlKElGZWF0dXJlIGN1cnJlbnRGZWF0dXJlLCBJRmVhdHVyZVtdIGZlYXR1cmVzKSB7CisJCXN1cGVyKCJTd2FwRmVhdHVyZSIpOyAvLyROT04tTkxTLTEkCisJCXNldFRpdGxlKFVwZGF0ZVVJTWVzc2FnZXMuU3dhcEZlYXR1cmVXaXphcmRQYWdlX3RpdGxlKTsgCisJCXNldERlc2NyaXB0aW9uKFVwZGF0ZVVJTWVzc2FnZXMuU3dhcEZlYXR1cmVXaXphcmRQYWdlX2Rlc2MpOyAKKwkJdGhpcy5jdXJyZW50RmVhdHVyZSA9IGN1cnJlbnRGZWF0dXJlOworCQl0aGlzLmZlYXR1cmVzID0gZmVhdHVyZXM7CisJfQorCisJcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7CisJCUNvbXBvc2l0ZSB0YWJsZUNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7CisJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKKwkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IGxheW91dC5tYXJnaW5XaWR0aCA9IDA7CisJCXRhYmxlQ29udGFpbmVyLnNldExheW91dChsYXlvdXQpOworCisJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHRhYmxlQ29udGFpbmVyLCBTV1QuTk9ORSk7CisJCWxhYmVsLnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5Td2FwRmVhdHVyZVdpemFyZFBhZ2VfbGFiZWwpOyAKKworCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZSh0YWJsZUNvbnRhaW5lciwgU1dULkJPUkRFUiB8IFNXVC5TSU5HTEUgfCBTV1QuVl9TQ1JPTEwpOworCQl0YWJsZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKKworCQl0YWJsZVZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcih0YWJsZSk7CisJCXRhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IExhYmVsUHJvdmlkZXIoKSB7CisJCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKKwkJCQlVcGRhdGVMYWJlbFByb3ZpZGVyIHByb3ZpZGVyID0KKwkJCQkJVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldExhYmVsUHJvdmlkZXIoKTsKKwkJCQlyZXR1cm4gcHJvdmlkZXIuZ2V0KFVwZGF0ZVVJSW1hZ2VzLkRFU0NfVU5DT05GX0ZFQVRVUkVfT0JKLCAwKTsKKwkJCX0KKwkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgeworCQkJCUlGZWF0dXJlIGZlYXR1cmUgPSAoSUZlYXR1cmUpIGVsZW1lbnQ7CisJCQkJcmV0dXJuIGZlYXR1cmUuZ2V0TGFiZWwoKSArICIgIiArIGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldFZlcnNpb24oKS50b1N0cmluZygpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCX0pOworCQkKKwkJdGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcigpIHsKKwkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgZWxlbWVudCkgeworCQkJCXJldHVybiBmZWF0dXJlczsKKwkJCX0KKwkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCQl9CisJCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKKwkJCX0KKwkJfSk7CisJCQorCQl0YWJsZVZpZXdlci5zZXRTb3J0ZXIobmV3IFZpZXdlclNvcnRlcigpIHsKKwkJCXB1YmxpYyBpbnQgY29tcGFyZShWaWV3ZXIgdmlld2VyLCBPYmplY3QgZTEsIE9iamVjdCBlMikgeworCQkJCVBsdWdpblZlcnNpb25JZGVudGlmaWVyIHYxID0gKChJRmVhdHVyZSllMSkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldFZlcnNpb24oKTsKKwkJCQlQbHVnaW5WZXJzaW9uSWRlbnRpZmllciB2MiA9ICgoSUZlYXR1cmUpZTIpLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRWZXJzaW9uKCk7CisJCQkJcmV0dXJuIHYxLmlzR3JlYXRlck9yRXF1YWxUbyh2MikgPyAtMSA6IDE7CisJCQl9CisJCX0pOworCQkKKwkJdGFibGVWaWV3ZXIuYWRkRmlsdGVyKG5ldyBWaWV3ZXJGaWx0ZXIoKSB7CisJCQlwdWJsaWMgYm9vbGVhbiBzZWxlY3QoVmlld2VyIHZpZXdlciwgT2JqZWN0IHBhcmVudEVsZW1lbnQsIE9iamVjdCBlbGVtZW50KSB7CisJCQkJU3RyaW5nIHZlcnNpb24gPQorCQkJCQkoKElGZWF0dXJlKSBlbGVtZW50KS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0VmVyc2lvbigpLnRvU3RyaW5nKCk7CisJCQkJcmV0dXJuICF2ZXJzaW9uLmVxdWFscygKKwkJCQkJY3VycmVudEZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldFZlcnNpb24oKS50b1N0cmluZygpKTsKKwkJCX0KKwkJfSk7CisKKwkJdGFibGVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKKwkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpOworCQkJCWlmIChzc2VsID09IG51bGwpCisJCQkJCXJldHVybjsKKwkJCQlJRmVhdHVyZSBjaG9zZW5GZWF0dXJlID0gKElGZWF0dXJlKXNzZWwuZ2V0Rmlyc3RFbGVtZW50KCk7CisJCQkJSVN0YXR1cyB2YWxpZGF0aW9uU3RhdHVzID0KKwkJCQkJT3BlcmF0aW9uc01hbmFnZXIuZ2V0VmFsaWRhdG9yKCkudmFsaWRhdGVQZW5kaW5nUmVwbGFjZVZlcnNpb24oY3VycmVudEZlYXR1cmUsIGNob3NlbkZlYXR1cmUpOworCQkJCXNldFBhZ2VDb21wbGV0ZSh2YWxpZGF0aW9uU3RhdHVzID09IG51bGwgfHwgdmFsaWRhdGlvblN0YXR1cy5nZXRDb2RlKCkgPT0gSVN0YXR1cy5XQVJOSU5HKTsKKwkJCisJCQkJaWYgKHZhbGlkYXRpb25TdGF0dXMgPT0gbnVsbCkgeworCQkJCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7CisJCQkJfSBlbHNlIGlmICh2YWxpZGF0aW9uU3RhdHVzLmdldENvZGUoKSA9PSBJU3RhdHVzLldBUk5JTkcpIHsKKwkJCQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOworCQkJCQlzZXRNZXNzYWdlKHZhbGlkYXRpb25TdGF0dXMuZ2V0TWVzc2FnZSgpLCBJTWVzc2FnZVByb3ZpZGVyLldBUk5JTkcpOworCQkJCX0gZWxzZSB7CisJCQkJCXNldEVycm9yTWVzc2FnZSh2YWxpZGF0aW9uU3RhdHVzLmdldE1lc3NhZ2UoKSk7CisJCQkJfQorCQkJfQorCQl9KTsKKwkJCisJCXRhYmxlVmlld2VyLnNldElucHV0KGN1cnJlbnRGZWF0dXJlKTsKKwkJdGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5zZWxlY3QoMCk7CisJCXNldENvbnRyb2wodGFibGVDb250YWluZXIpOworCQkKKwkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udCh0YWJsZUNvbnRhaW5lcik7CisJfQorCisJcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKKwkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3NlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbil0YWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKKwkJSUZlYXR1cmUgY2hvc2VuRmVhdHVyZSA9IChJRmVhdHVyZSlzc2VsLmdldEZpcnN0RWxlbWVudCgpOworCQkKKwkJcmV0dXJuIHN3YXAoY3VycmVudEZlYXR1cmUsIGNob3NlbkZlYXR1cmUpOworCX0KKwkKKwlwcml2YXRlIGJvb2xlYW4gc3dhcChmaW5hbCBJRmVhdHVyZSBjdXJyZW50RmVhdHVyZSwgZmluYWwgSUZlYXR1cmUgYW5vdGhlckZlYXR1cmUpIHsKKy8vCQlJU3RhdHVzIHN0YXR1cyA9CisvLwkJCU9wZXJhdGlvbnNNYW5hZ2VyLmdldFZhbGlkYXRvcigpLnZhbGlkYXRlUGVuZGluZ1JlcGxhY2VWZXJzaW9uKGN1cnJlbnRGZWF0dXJlLCBhbm90aGVyRmVhdHVyZSk7CisvLwkJaWYgKHN0YXR1cyAhPSBudWxsKSB7CisvLwkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcigKKy8vCQkJCVVwZGF0ZVVJLmdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCksCisvLwkJCQludWxsLAorLy8JCQkJbnVsbCwKKy8vCQkJCXN0YXR1cyk7CisvLwkJCXJldHVybiBmYWxzZTsKKy8vCQl9CisKKwkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wZXJhdGlvbiA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7CisJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQorCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKKwkJCQlJT3BlcmF0aW9uIHJldmVydE9wZXJhdGlvbiA9CisJCQkJCU9wZXJhdGlvbnNNYW5hZ2VyCisJCQkJCQkuZ2V0T3BlcmF0aW9uRmFjdG9yeSgpCisJCQkJCQkuY3JlYXRlUmVwbGFjZUZlYXR1cmVWZXJzaW9uT3BlcmF0aW9uKGN1cnJlbnRGZWF0dXJlLCBhbm90aGVyRmVhdHVyZSk7CisJCQkJYm9vbGVhbiByZXN0YXJ0aW5nID0gZmFsc2U7CisJCQkJdHJ5IHsKKwkJCQkJYm9vbGVhbiByZXN0YXJ0TmVlZGVkID0gcmV2ZXJ0T3BlcmF0aW9uLmV4ZWN1dGUobW9uaXRvciwgbnVsbCk7CisJCQkJCXJlc3RhcnRpbmcgPSBVcGRhdGVVSS5yZXF1ZXN0UmVzdGFydChyZXN0YXJ0TmVlZGVkKTsKKwkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCQkJdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oZSk7CisJCQkJfSBmaW5hbGx5IHsKKwkJCQkJLy9pZiB0aGUgc3lzdGVtIGlzIGFscmVhZHkgc2h1dGRvd24sIGVuZGluZyB0aGUgbW9uaXRvciBoZXJlIHdpbGwgZmFpbAorCQkJCQlpZiAoIXJlc3RhcnRpbmcpCisJCQkJCQltb25pdG9yLmRvbmUoKTsKKwkJCQl9CisJCQl9CisJCX07CisJCXRyeSB7CisJCQlnZXRDb250YWluZXIoKS5ydW4oZmFsc2UsIHRydWUsIG9wZXJhdGlvbik7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7CisJCQlUaHJvd2FibGUgdGFyZ2V0RXhjZXB0aW9uID0gZS5nZXRUYXJnZXRFeGNlcHRpb24oKTsKKwkJCWlmICh0YXJnZXRFeGNlcHRpb24gaW5zdGFuY2VvZiBJbnN0YWxsQWJvcnRlZEV4Y2VwdGlvbikgeworCQkJCXJldHVybiB0cnVlOworCQkJfSBlbHNlIHsKKwkJCQlVcGRhdGVVSS5sb2dFeGNlcHRpb24oZSk7CisJCQl9CisJCQlyZXR1cm4gZmFsc2U7CisJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0KKworfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvUmVzaXphYmxlSW5zdGFsbFdpemFyZERpYWxvZy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvUmVzaXphYmxlSW5zdGFsbFdpemFyZERpYWxvZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlZDIzMGEKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9SZXNpemFibGVJbnN0YWxsV2l6YXJkRGlhbG9nLmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS53aXphcmRzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnBhcnRzLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuKjsKKworcHVibGljIGNsYXNzIFJlc2l6YWJsZUluc3RhbGxXaXphcmREaWFsb2cgZXh0ZW5kcyBXaXphcmREaWFsb2cgeworCXByaXZhdGUgU3RyaW5nIHRpdGxlOworCQorCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgcmVzaXphYmxlIHdpemFyZCBkaWFsb2cuCisJICovCisJcHVibGljIFJlc2l6YWJsZUluc3RhbGxXaXphcmREaWFsb2coU2hlbGwgcGFyZW50LCBJV2l6YXJkIHdpemFyZCwgU3RyaW5nIHRpdGxlKSB7CisJCXN1cGVyKHBhcmVudCwgd2l6YXJkKTsKKwkJc2V0U2hlbGxTdHlsZShnZXRTaGVsbFN0eWxlKCkgfCBTV1QuUkVTSVpFKTsKKwkJdGhpcy50aXRsZSA9IHRpdGxlOworCX0JCisJCisJCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdyNjcmVhdGUoKQorCSAqLworCXB1YmxpYyB2b2lkIGNyZWF0ZSgpIHsKKwkJc3VwZXIuY3JlYXRlKCk7CisJCQorCQlnZXRTaGVsbCgpLnNldFRleHQodGl0bGUpOworCQlTV1RVdGlsLnNldERpYWxvZ1NpemUodGhpcywgNjAwLCA1MDApOworCX0KKwkKKwkKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93I29wZW4oKQorCSAqLworCXB1YmxpYyBpbnQgb3BlbigpIHsKKwkJSVN0YXR1cyBzdGF0dXMgPSBPcGVyYXRpb25zTWFuYWdlci5nZXRWYWxpZGF0b3IoKS52YWxpZGF0ZVBsYXRmb3JtQ29uZmlnVmFsaWQoKTsKKwkJaWYgKHN0YXR1cyAhPSBudWxsKSB7CisJCQlFcnJvckRpYWxvZy5vcGVuRXJyb3IoCisJCQkJCWdldFNoZWxsKCksCisJCQkJCW51bGwsCisJCQkJCW51bGwsCisJCQkJCXN0YXR1cyk7CisJCQlyZXR1cm4gSURpYWxvZ0NvbnN0YW50cy5BQk9SVF9JRDsKKwkJfQorCQkKKwkJcmV0dXJuIHN1cGVyLm9wZW4oKTsKKwl9Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9SZXZlcnRDb25maWd1cmF0aW9uV2l6YXJkLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9SZXZlcnRDb25maWd1cmF0aW9uV2l6YXJkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVlOTc0MwotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL1JldmVydENvbmZpZ3VyYXRpb25XaXphcmQuamF2YQpAQCAtMCwwICsxLDM4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLndpemFyZHM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuKjsKKworLyoqCisgKiBAYXV0aG9yIFdhc3NpbSBNZWxoZW0KKyAqLworcHVibGljIGNsYXNzIFJldmVydENvbmZpZ3VyYXRpb25XaXphcmQgZXh0ZW5kcyBXaXphcmQgeworCQorCVJldmVydENvbmZpZ3VyYXRpb25XaXphcmRQYWdlIHBhZ2U7CisKKwlwdWJsaWMgUmV2ZXJ0Q29uZmlndXJhdGlvbldpemFyZCgpIHsKKwkJc3VwZXIoKTsKKwkJc2V0V2luZG93VGl0bGUoVXBkYXRlVUlNZXNzYWdlcy5SZXZlcnRDb25maWd1cmF0aW9uV2l6YXJkX3d0aXRsZSk7IAorCQlzZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihVcGRhdGVVSUltYWdlcy5ERVNDX0NPTkZJR19XSVopOworCX0KKwkKKwlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKKwkJcGFnZSA9IG5ldyBSZXZlcnRDb25maWd1cmF0aW9uV2l6YXJkUGFnZSgpOworCQlhZGRQYWdlKHBhZ2UpOworCX0KKworCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7CisJCXJldHVybiBwYWdlLnBlcmZvcm1GaW5pc2goKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL1JldmVydENvbmZpZ3VyYXRpb25XaXphcmRQYWdlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9SZXZlcnRDb25maWd1cmF0aW9uV2l6YXJkUGFnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyNTAzN2UKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9SZXZlcnRDb25maWd1cmF0aW9uV2l6YXJkUGFnZS5qYXZhCkBAIC0wLDAgKzEsMjYzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLndpemFyZHM7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLio7CisKKworcHVibGljIGNsYXNzIFJldmVydENvbmZpZ3VyYXRpb25XaXphcmRQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSB7CisKKwlwcml2YXRlIFRhYmxlVmlld2VyIGFjdGl2aXRpZXNWaWV3ZXI7CisJcHJpdmF0ZSBUYWJsZVZpZXdlciBjb25maWdWaWV3ZXI7CisJcHVibGljIHN0YXRpYyBDb2xvciBibHVlQkdDb2xvcjsKKwlwcml2YXRlIFNhc2hGb3JtIHNhc2hGb3JtOworCisJcHVibGljIFJldmVydENvbmZpZ3VyYXRpb25XaXphcmRQYWdlKCkgeworCQlzdXBlcigiUmV2ZXJ0Q29uZmlndXJhdGlvbiIpOyAvLyROT04tTkxTLTEkCisJCXNldFRpdGxlKFVwZGF0ZVVJTWVzc2FnZXMuUmV2ZXJ0Q29uZmlndXJhdGlvbldpemFyZFBhZ2VfdGl0bGUpOyAKKwkJc2V0RGVzY3JpcHRpb24oVXBkYXRlVUlNZXNzYWdlcy5SZXZlcnRDb25maWd1cmF0aW9uV2l6YXJkUGFnZV9kZXNjKTsgCisJCWJsdWVCR0NvbG9yID0gbmV3IENvbG9yKG51bGwsIDIzOCwyMzgsMjU1KTsKKwkJCisJfQorCisJcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7CisJCXNhc2hGb3JtID0gbmV3IFNhc2hGb3JtKHBhcmVudCwgU1dULlZFUlRJQ0FMKTsKKwkJc2FzaEZvcm0uc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOworCQlzYXNoRm9ybS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKKworCQljcmVhdGVDb25maWd1cmF0aW9uc1NlY3Rpb24oc2FzaEZvcm0pOworCQljcmVhdGVBY3Rpdml0aWVzU2VjdGlvbihzYXNoRm9ybSk7CisJCXNldENvbnRyb2woc2FzaEZvcm0pOworCisJCU9iamVjdCBlbGVtZW50ID0gY29uZmlnVmlld2VyLmdldEVsZW1lbnRBdCgwKTsKKwkJaWYgKGVsZW1lbnQgIT0gbnVsbCkKKwkJCWNvbmZpZ1ZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZWxlbWVudCkpOworCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KHNhc2hGb3JtKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgY3JlYXRlQ29uZmlndXJhdGlvbnNTZWN0aW9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJQ29tcG9zaXRlIHRhYmxlQ29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKKwkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOworCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKKwkJdGFibGVDb250YWluZXIuc2V0TGF5b3V0KGxheW91dCk7CisJCXRhYmxlQ29udGFpbmVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOworCisJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHRhYmxlQ29udGFpbmVyLCBTV1QuTk9ORSk7CisJCWxhYmVsLnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5SZXZlcnRDb25maWd1cmF0aW9uV2l6YXJkUGFnZV9sYWJlbCk7IAorCisJCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHRhYmxlQ29udGFpbmVyLCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMKTsKKwkJdGFibGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7CisKKwkJY29uZmlnVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHRhYmxlKTsKKwkJY29uZmlnVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IExhYmVsUHJvdmlkZXIoKSB7CisJCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKKwkJCQlVcGRhdGVMYWJlbFByb3ZpZGVyIHByb3ZpZGVyID0KKwkJCQkJVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldExhYmVsUHJvdmlkZXIoKTsKKwkJCQlyZXR1cm4gcHJvdmlkZXIuZ2V0KFVwZGF0ZVVJSW1hZ2VzLkRFU0NfQ09ORklHX09CSiwgMCk7CisJCQl9CisJCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKKwkJCQlyZXR1cm4gVXRpbGl0aWVzLmZvcm1hdCgKKwkJCQkJKChJSW5zdGFsbENvbmZpZ3VyYXRpb24pIGVsZW1lbnQpLmdldENyZWF0aW9uRGF0ZSgpKTsKKwkJCX0KKworCQl9KTsKKwkJY29uZmlnVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIoKSB7CisJCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGVsZW1lbnQpIHsKKwkJCQlBcnJheUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOworCQkJCUlMb2NhbFNpdGUgbG9jYWxTaXRlID0gKElMb2NhbFNpdGUpIGVsZW1lbnQ7CisJCQkJSUluc3RhbGxDb25maWd1cmF0aW9uIGN1cnJlbnQgPQlsb2NhbFNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKTsKKwkJCQlJSW5zdGFsbENvbmZpZ3VyYXRpb25bXSBjb25maWd1cmF0aW9ucyA9IGxvY2FsU2l0ZS5nZXRDb25maWd1cmF0aW9uSGlzdG9yeSgpOworCQkJCWZvciAoaW50IGkgPSBjb25maWd1cmF0aW9ucy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgeworCQkJCQlpZiAoIWN1cnJlbnQuZXF1YWxzKGNvbmZpZ3VyYXRpb25zW2ldKSkgeworCQkJCQkJcmVzdWx0LmFkZChjb25maWd1cmF0aW9uc1tpXSk7CisJCQkJCX0KKwkJCQl9CisJCQkJcmV0dXJuIHJlc3VsdC50b0FycmF5KCk7CisJCQl9CisJCQkKKwkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCQl9CisKKwkJCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZCgKKwkJCQlWaWV3ZXIgdmlld2VyLAorCQkJCU9iamVjdCBvbGRJbnB1dCwKKwkJCQlPYmplY3QgbmV3SW5wdXQpIHsKKwkJCX0KKworCQl9KTsKKworCQljb25maWdWaWV3ZXIKKwkJCS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBlKSB7CisJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3NlbCA9CShJU3RydWN0dXJlZFNlbGVjdGlvbikgZS5nZXRTZWxlY3Rpb24oKTsKKwkJCQlJbnN0YWxsQ29uZmlndXJhdGlvbiBjdXJyZW50Q29uZmlnID0gKEluc3RhbGxDb25maWd1cmF0aW9uKXNzZWwuZ2V0Rmlyc3RFbGVtZW50KCk7CisJCQkJYWN0aXZpdGllc1ZpZXdlci5zZXRJbnB1dChjdXJyZW50Q29uZmlnKTsKKwkJCQlhY3Rpdml0aWVzVmlld2VyLnJlZnJlc2goKTsKKwkJCQlUYWJsZUl0ZW1bXSBpdGVtcyA9IGFjdGl2aXRpZXNWaWV3ZXIuZ2V0VGFibGUoKS5nZXRJdGVtcygpOworCQkJCWZvciAoaW50IGkgPTA7IGk8aXRlbXMubGVuZ3RoOyBpKyspeworCQkJCQlJQWN0aXZpdHkgYWN0aXZpdHkgPSAoSUFjdGl2aXR5KWl0ZW1zW2ldLmdldERhdGEoKTsKKwkJCQkJLy8gZm9yIG5vdywgd2UgdGVzdCBleGFjdCBjb25maWcgbWF0Y2guIElmIG5lZWRlZCwgd2UgY2FuIGFsc28gY29tcGFyZSBkYXRlcywgZXRjLgorCQkJCQlpZiAoKChJbnN0YWxsQ29uZmlndXJhdGlvbilhY3Rpdml0eS5nZXRJbnN0YWxsQ29uZmlndXJhdGlvbigpKS5lcXVhbHMoY3VycmVudENvbmZpZykpCisJCQkJCQlpdGVtc1tpXS5zZXRCYWNrZ3JvdW5kKGJsdWVCR0NvbG9yKTsKKwkJCQkJZWxzZQorCQkJCQkJaXRlbXNbaV0uc2V0QmFja2dyb3VuZChhY3Rpdml0aWVzVmlld2VyLmdldENvbnRyb2woKS5nZXRCYWNrZ3JvdW5kKCkpOworCQkJCX0KKwkJCX0KKwkJfSk7CisKKwkJdHJ5IHsKKwkJCWNvbmZpZ1ZpZXdlci5zZXRJbnB1dChTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKSk7CisJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZTEpIHsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBjcmVhdGVBY3Rpdml0aWVzU2VjdGlvbihDb21wb3NpdGUgcGFyZW50KSB7CisJCWZpbmFsIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOworCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOworCQlncmlkTGF5b3V0Lm1hcmdpbkhlaWdodCA9IGdyaWRMYXlvdXQubWFyZ2luV2lkdGggPSAwOworCQljb21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOworCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOworCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShnZCk7CisKKworCisJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOworCQlsYWJlbC5zZXRUZXh0KAorCQkJVXBkYXRlVUlNZXNzYWdlcy5SZXZlcnRDb25maWd1cmF0aW9uV2l6YXJkUGFnZV9hY3Rpdml0aWVzKTsgCisKKwkJVGFibGVMYXlvdXRDb21wb3NpdGUgdGxDb21wb3NpdGU9IG5ldyBUYWJsZUxheW91dENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKKwkJdGxDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7CisJCWFjdGl2aXRpZXNWaWV3ZXIgPSBBY3Rpdml0aWVzVGFibGVWaWV3ZXIuY3JlYXRlVmlld2VyKHRsQ29tcG9zaXRlLCBmYWxzZSk7CisKKwkJdGxDb21wb3NpdGUuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uUGl4ZWxEYXRhKDE2LCB0cnVlLCB0cnVlKSk7CisJCXRsQ29tcG9zaXRlLmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoMiwgMTUwLCB0cnVlKSk7CisJCXRsQ29tcG9zaXRlLmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoNSwgMjAwLCB0cnVlKSk7CisJCXRsQ29tcG9zaXRlLmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoNCwgMTAwLCB0cnVlKSk7CisKKwkJLy9hY3Rpdml0aWVzVmlld2VyLmdldFRhYmxlKCkuc2V0TGF5b3V0KGxheW91dCk7CisKKwkJVGFibGVJdGVtW10gY29uZmlncyA9IGNvbmZpZ1ZpZXdlci5nZXRUYWJsZSgpLmdldEl0ZW1zKCk7CisJCWlmIChjb25maWdzLmxlbmd0aCA+MCkKKwkJCWFjdGl2aXRpZXNWaWV3ZXIuc2V0SW5wdXQoY29uZmlnc1swXS5nZXREYXRhKCkpOworCQkKKwkJY29tcG9zaXRlLmFkZENvbnRyb2xMaXN0ZW5lcihuZXcgQ29udHJvbEFkYXB0ZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZSkgeworCQkJCWludCBzYXNoSGVpZ2h0ID0gZ2V0U2FzaEZvcm0oKS5nZXRTaXplKCkueTsKKwkJCQlpbnQgc2FzaFdpZHRoID0gZ2V0U2FzaEZvcm0oKS5nZXRTaXplKCkueDsKKwkJCQlpZiAoY29tcG9zaXRlLmdldFNpemUoKS55ID4gKHNhc2hIZWlnaHQqMC44NSkgJiYgY29tcG9zaXRlLmdldFNpemUoKS54ID4gKHNhc2hXaWR0aCowLjUpKXsKKwkJCQkJZ2V0U2FzaEZvcm0oKS5zZXRPcmllbnRhdGlvbihTV1QuSE9SSVpPTlRBTCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJZ2V0U2FzaEZvcm0oKS5zZXRPcmllbnRhdGlvbihTV1QuVkVSVElDQUwpOworCQkJCX0KKwkJCX0KKwkJfSk7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNkaXNwb3NlKCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQlibHVlQkdDb2xvci5kaXNwb3NlKCk7CisJfQorCQorCXB1YmxpYyBTYXNoRm9ybSBnZXRTYXNoRm9ybSgpeworCQlyZXR1cm4gc2FzaEZvcm07CisJfQorCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7CisJCVNoZWxsIHNoZWxsID0gZ2V0Q29udGFpbmVyKCkuZ2V0U2hlbGwoKTsKKwkJYm9vbGVhbiByZXN1bHQgPQorCQkJTWVzc2FnZURpYWxvZy5vcGVuUXVlc3Rpb24oCisJCQkJc2hlbGwsCisJCQkJc2hlbGwuZ2V0VGV4dCgpLAorCQkJCVVwZGF0ZVVJTWVzc2FnZXMuUmV2ZXJ0Q29uZmlndXJhdGlvbldpemFyZFBhZ2VfcXVlc3Rpb24pOyAKKwkJaWYgKCFyZXN1bHQpCisJCQlyZXR1cm4gZmFsc2U7CisKKwkJYm9vbGVhbiBmaW5pc2ggPSBwZXJmb3JtUmV2ZXJ0KCk7CisJCWlmIChmaW5pc2gpIHsKKwkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkucmVzdGFydCgpOworCQl9CisJCXJldHVybiBmaW5pc2g7CisJfQorCisJcHVibGljIGJvb2xlYW4gcGVyZm9ybVJldmVydCgpIHsKKworCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzc2VsID0KKwkJCShJU3RydWN0dXJlZFNlbGVjdGlvbikgY29uZmlnVmlld2VyLmdldFNlbGVjdGlvbigpOworCQlmaW5hbCBJSW5zdGFsbENvbmZpZ3VyYXRpb24gdGFyZ2V0ID0KKwkJCShJSW5zdGFsbENvbmZpZ3VyYXRpb24pIHNzZWwuZ2V0Rmlyc3RFbGVtZW50KCk7CisKKwkJSVN0YXR1cyBzdGF0dXMgPQorCQkJT3BlcmF0aW9uc01hbmFnZXIuZ2V0VmFsaWRhdG9yKCkudmFsaWRhdGVQZW5kaW5nUmV2ZXJ0KHRhcmdldCk7CisJCWlmIChzdGF0dXMgIT0gbnVsbCAmJiBzdGF0dXMuZ2V0Q29kZSgpID09IElTdGF0dXMuRVJST1IpIHsKKwkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcigKKwkJCQlVcGRhdGVVSS5nZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpLAorCQkJCW51bGwsCisJCQkJbnVsbCwKKwkJCQlzdGF0dXMpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wZXJhdGlvbiA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7CisJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQorCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKKwkJCQlJT3BlcmF0aW9uIHJldmVydE9wZXJhdGlvbiA9CisJCQkJCU9wZXJhdGlvbnNNYW5hZ2VyCisJCQkJCQkuZ2V0T3BlcmF0aW9uRmFjdG9yeSgpCisJCQkJCQkuY3JlYXRlUmV2ZXJ0Q29uZmlndXJhdGlvbk9wZXJhdGlvbigKKwkJCQkJCXRhcmdldCwKKwkJCQkJCW5ldyBVSVByb2JsZW1IYW5kbGVyKCkpOworCQkJCXRyeSB7CisJCQkJCXJldmVydE9wZXJhdGlvbi5leGVjdXRlKG1vbml0b3IsIG51bGwpOworCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJCQl0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihlKTsKKwkJCQl9IGZpbmFsbHkgeworCQkJCQltb25pdG9yLmRvbmUoKTsKKwkJCQl9CisJCQl9CisJCX07CisJCXRyeSB7CisJCQlnZXRDb250YWluZXIoKS5ydW4oZmFsc2UsIHRydWUsIG9wZXJhdGlvbik7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7CisJCQlUaHJvd2FibGUgdGFyZ2V0RXhjZXB0aW9uID0gZS5nZXRUYXJnZXRFeGNlcHRpb24oKTsKKwkJCWlmICh0YXJnZXRFeGNlcHRpb24gaW5zdGFuY2VvZiBJbnN0YWxsQWJvcnRlZEV4Y2VwdGlvbikgeworCQkJCXJldHVybiB0cnVlOworCQkJfSBlbHNlIHsKKwkJCQlVcGRhdGVVSS5sb2dFeGNlcHRpb24oZSk7CisJCQl9CisJCQlyZXR1cm4gZmFsc2U7CisJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL1Jldmlld1BhZ2UuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL1Jldmlld1BhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmZlYWI3Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvUmV2aWV3UGFnZS5qYXZhCkBAIC0wLDAgKzEsMTY2MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS53aXphcmRzOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nUGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklNZXNzYWdlUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TYXNoRm9ybTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW07CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByb3BlcnR5RGlhbG9nQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLkh5cGVybGlua1NldHRpbmdzOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5IeXBlcmxpbmtBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5IeXBlcmxpbmtFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNjcm9sbGVkRm9ybVRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUNhdGVnb3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklJbXBvcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JUGx1Z2luRW50cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVNpdGVGZWF0dXJlUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklVUkxFbnRyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5VdGlsaXRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuVmVyc2lvbmVkSWRlbnRpZmllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5FeHRlbmRlZFNpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuVXBkYXRlQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5VcGRhdGVNYW5hZ2VyVXRpbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm9wZXJhdGlvbnMuRmVhdHVyZVN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwub3BlcmF0aW9ucy5PcGVyYXRpb25WYWxpZGF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm9wZXJhdGlvbnMuVXBkYXRlVXRpbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm9wZXJhdGlvbnMuT3BlcmF0aW9uVmFsaWRhdG9yLkludGVybmFsSW1wb3J0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zLk9wZXJhdGlvblZhbGlkYXRvci5SZXF1aXJlZEZlYXR1cmVzUmVzdWx0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUlJbWFnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsLkZlYXR1cmVSZWZlcmVuY2VBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbC5TaW1wbGVGZWF0dXJlQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWwuU2l0ZUJvb2ttYXJrOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbC5TaXRlQ2F0ZWdvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnBhcnRzLkRlZmF1bHRDb250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnBhcnRzLlNXVFV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnBhcnRzLlNoYXJlZExhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLklVcGRhdGVNb2RlbENoYW5nZWRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy5PcGVyYXRpb25zTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuc2VhcmNoLklVcGRhdGVTZWFyY2hTaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5zZWFyY2guVXBkYXRlU2VhcmNoUmVxdWVzdDsKKworcHVibGljIGNsYXNzIFJldmlld1BhZ2UJZXh0ZW5kcyBCYW5uZXJQYWdlIHsKKworCXByaXZhdGUgTGFiZWwgbGFiZWw7CisJcHJpdmF0ZSBBcnJheUxpc3Qgam9iczsKKwlwcml2YXRlIExhYmVsIGNvdW50ZXJMYWJlbDsKKwlwcml2YXRlIElTdGF0dXMgdmFsaWRhdGlvblN0YXR1czsKKwlwcml2YXRlIENvbGxlY3Rpb24gcHJvYmxlbWF0aWNGZWF0dXJlcyA9IG5ldyBIYXNoU2V0KCk7CisJLy8gZmVhdHVyZSB0aGF0IHdhcyByZWNlbnRseSBzZWxlY3RlZCBvciBudWxsCisJcHJpdmF0ZSBJRmVhdHVyZSBuZXdseVNlbGVjdGVkRmVhdHVyZTsKKwkvLyAKKwlwcml2YXRlIEZlYXR1cmVTdGF0dXMgbGFzdERpc3BsYXllZFN0YXR1czsKKwlwcml2YXRlIFByb3BlcnR5RGlhbG9nQWN0aW9uIHByb3BlcnRpZXNBY3Rpb247CisJcHJpdmF0ZSBTY3JvbGxlZEZvcm1UZXh0IGRlc2NMYWJlbDsKKwlwcml2YXRlIEJ1dHRvbiBzdGF0dXNCdXR0b247CisJcHJpdmF0ZSBCdXR0b24gbW9yZUluZm9CdXR0b247CisJcHJpdmF0ZSBCdXR0b24gcHJvcGVydGllc0J1dHRvbjsKKwlwcml2YXRlIEJ1dHRvbiBzZWxlY3RSZXF1aXJlZEZlYXR1cmVzQnV0dG9uOworCXByaXZhdGUgQnV0dG9uIGZpbHRlckNoZWNrOworCXByaXZhdGUgQnV0dG9uIGZpbHRlck9sZGVyVmVyc2lvbkNoZWNrOworCXByaXZhdGUgQ29udGFpbm1lbnRGaWx0ZXIgZmlsdGVyID0gbmV3IENvbnRhaW5tZW50RmlsdGVyKCk7CisJcHJpdmF0ZSBMYXRlc3RWZXJzaW9uRmlsdGVyIG9sZGVyVmVyc2lvbkZpbHRlciA9IG5ldyBMYXRlc3RWZXJzaW9uRmlsdGVyKCk7CisJcHJpdmF0ZSBVcGRhdGVTZWFyY2hSZXF1ZXN0IHNlYXJjaFJlcXVlc3Q7CisJLy9wcml2YXRlIGludCBMQUJFTF9PUkRFUiA9IDE7CisJLy9wcml2YXRlIGludCBWRVJTSU9OX09SREVSID0gMTsKKwkvL3ByaXZhdGUgaW50IFBST1ZJREVSX09SREVSID0gMTsKKyAgICBwcml2YXRlIENvbnRhaW5lckNoZWNrZWRUcmVlVmlld2VyIHRyZWVWaWV3ZXI7CisgICAgcHJpdmF0ZSBib29sZWFuIGluaXRpYWxpemVkOworICAgIHByaXZhdGUgYm9vbGVhbiBpc1VwZGF0ZVNlYXJjaDsKKyAgCisgICAgCisgICAgY2xhc3MgVHJlZUNvbnRlbnRQcm92aWRlciBleHRlbmRzIERlZmF1bHRDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cworICAgICAgICAgICAgSVRyZWVDb250ZW50UHJvdmlkZXIgeworCisgICAgICAgIHB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgcGFyZW50KSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0U2l0ZXMoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihmaW5hbCBPYmplY3QgcGFyZW50KSB7CisgICAgICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgU2l0ZUJvb2ttYXJrKSB7CisgICAgICAgICAgICAgICAgU2l0ZUJvb2ttYXJrIGJvb2ttYXJrID0gKFNpdGVCb29rbWFyaykgcGFyZW50OworICAgICAgICAgICAgICAgIGJvb2ttYXJrLmdldFNpdGUobnVsbCk7IC8vIHRyaWdnZXJzIGNhdGFsb2cgY3JlYXRpb24KKyAgICAgICAgICAgICAgICBPYmplY3RbXSBjaGlsZHJlbiA9IGJvb2ttYXJrLmdldENhdGFsb2codHJ1ZSxudWxsKTsKKyAgICAgICAgICAgICAgICBBcnJheUxpc3Qgbm9uRW1wdHlDYXRlZ29yaWVzID0gbmV3IEFycmF5TGlzdChjaGlsZHJlbi5sZW5ndGgpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxjaGlsZHJlbi5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhhc0NoaWxkcmVuKGNoaWxkcmVuW2ldKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vbkVtcHR5Q2F0ZWdvcmllcy5hZGQoY2hpbGRyZW5baV0pOworICAgICAgICAgICAgICAgIHJldHVybiBub25FbXB0eUNhdGVnb3JpZXMudG9BcnJheSgpOworICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBTaXRlQ2F0ZWdvcnkpIHsKKyAgICAgICAgICAgICAgICBTaXRlQ2F0ZWdvcnkgY2F0ZWdvcnkgPSAoU2l0ZUNhdGVnb3J5KXBhcmVudDsKKyAgICAgICAgICAgICAgICAvL3JldHVybiBjYXRlZ29yeS5nZXRDaGlsZHJlbigpOworICAgICAgICAgICAgICAgIE9iamVjdFtdIGNoaWxkcmVuID0gY2F0ZWdvcnkuZ2V0Q2hpbGRyZW4oKTsKKyAgICAgICAgICAgICAgICBBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoY2hpbGRyZW4ubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8Y2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkcmVuW2ldIGluc3RhbmNlb2YgRmVhdHVyZVJlZmVyZW5jZUFkYXB0ZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIGpvYiA9IGZpbmRKb2IoKEZlYXR1cmVSZWZlcmVuY2VBZGFwdGVyKWNoaWxkcmVuW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoam9iICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKGpvYik7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVcGRhdGVDb3JlLmxvZyhlLmdldFN0YXR1cygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbGlzdC50b0FycmF5KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbmV3IE9iamVjdFswXTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7CisgICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFNpdGVDYXRlZ29yeSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKChTaXRlQ2F0ZWdvcnkpIGVsZW1lbnQpLmdldEJvb2ttYXJrKCk7CisgICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbikgeworICAgICAgICAgICAgICAgIElGZWF0dXJlIGYgPSAoKElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbillbGVtZW50KS5nZXRGZWF0dXJlKCk7CisgICAgICAgICAgICAgICAgSVNpdGVGZWF0dXJlUmVmZXJlbmNlIGZyID0gZi5nZXRTaXRlKCkuZ2V0RmVhdHVyZVJlZmVyZW5jZShmKTsKKyAgICAgICAgICAgICAgICBJQ2F0ZWdvcnlbXSBjYXRlZ29yaWVzID0gZnIuZ2V0Q2F0ZWdvcmllcygpOworLy8gICAgICAgICAgICAgICAgaWYgKGNhdGVnb3JpZXMgIT0gbnVsbCAmJiBjYXRlZ29yaWVzLmxlbmd0aCA+IDApCisvLyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhdGVnb3JpZXNbMF07CisgICAgICAgICAgICAgICAgU2l0ZUJvb2ttYXJrW10gc2l0ZXMgPSAoU2l0ZUJvb2ttYXJrW10pKChJVHJlZUNvbnRlbnRQcm92aWRlcil0cmVlVmlld2VyLmdldENvbnRlbnRQcm92aWRlcigpKS5nZXRFbGVtZW50cyhudWxsKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8c2l0ZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAJdHJ5IHsKKyAgICAgICAgICAgICAgICAJCWlmIChzaXRlc1tpXS5nZXRTaXRlKGZhbHNlLCBudWxsKS5nZXRVUkwoKSAhPSBmLmdldFNpdGUoKS5nZXRTaXRlQ29udGVudFByb3ZpZGVyKCkuZ2V0VVJMKCkpIHsKKyAgICAgICAgICAgICAgICAJCSAgICAvLyBpZiB0aGUgc2l0ZSBoYXMgbWlycm9ycyBjaGVjayBpZiB0aGlzIGlzIGZyb20gdGhlIG1pcnJvciB0aGF0IHVzZXIgc2VsZWN0ZWQKKyAgICAgICAgICAgICAgICAJCQlpZiAoc2l0ZXNbaV0uZ2V0U2l0ZShmYWxzZSwgbnVsbCkgaW5zdGFuY2VvZiBFeHRlbmRlZFNpdGUpIHsKKyAgICAgICAgICAgICAgICAJCQkJRXh0ZW5kZWRTaXRlIHNpdGUgPSAoRXh0ZW5kZWRTaXRlKXNpdGVzW2ldLmdldFNpdGUoZmFsc2UsIG51bGwpOworICAgICAgICAgICAgICAgIAkJCQlJVVJMRW50cnkgc2l0ZU1pcnJvciA9IHNpdGUuZ2V0U2VsZWN0ZWRNaXJyb3IoKTsKKyAgICAgICAgICAgICAgICAJCQkJaWYgKHNpdGVNaXJyb3IgIT0gbnVsbCAmJiBzaXRlTWlycm9yLmdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkuZXF1YWxzKGYuZ2V0U2l0ZSgpLmdldFNpdGVDb250ZW50UHJvdmlkZXIoKS5nZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpKSkgeyAKKyAgICAgICAgICAgICAgICAJCQkJCS8vIHRoaXMgaXMgdGhlIHNpdGUgc28gcHJvY2VlZCB3aXRoIHRoZSBsb29wCisgICAgICAgICAgICAgICAgCQkJCX0gZWxzZSB7CisgICAgICAgICAgICAgICAgCQkJCQljb250aW51ZTsKKyAgICAgICAgICAgICAgICAJCQkJfQorICAgICAgICAgICAgICAgIAkJCX0gZWxzZSB7CisgICAgICAgICAgICAgICAgCQkJCWNvbnRpbnVlOworICAgICAgICAgICAgICAgIAkJCX0KKyAgICAgICAgICAgICAgICAJCX0KKyAgICAgICAgICAgICAgICAJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgeworICAgICAgICAgICAgICAgIAkJcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICAgICAgT2JqZWN0W10gY2hpbGRyZW4gPSBzaXRlc1tpXS5nZXRDYXRhbG9nKHRydWUsIG51bGwpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgajxjaGlsZHJlbi5sZW5ndGg7IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoY2hpbGRyZW5bal0gaW5zdGFuY2VvZiBTaXRlQ2F0ZWdvcnkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgYz0wOyBjIDwgY2F0ZWdvcmllcy5sZW5ndGg7IGMrKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2F0ZWdvcmllc1tjXS5nZXROYW1lKCkuZXF1YWxzKCgoU2l0ZUNhdGVnb3J5KWNoaWxkcmVuW2pdKS5nZXROYW1lKCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGRyZW5bal07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKKyAgICAgICAgICAgIHJldHVybiAoZWxlbWVudCBpbnN0YW5jZW9mIFNpdGVCb29rbWFyayB8fCAoCisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgaW5zdGFuY2VvZiBTaXRlQ2F0ZWdvcnkgJiYgZ2V0Q2hpbGRyZW4oZWxlbWVudCkubGVuZ3RoID4gMCkpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBTaXRlQm9va21hcmtbXSBnZXRTaXRlcygpIHsKKyAgICAgICAgICAgIGlmIChzZWFyY2hSZXF1ZXN0ID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTaXRlQm9va21hcmtbMF07CisgICAgICAgICAgICBlbHNlIGlmIChzZWFyY2hSZXF1ZXN0LmdldFNjb3BlKCkuZ2V0U2VhcmNoU2l0ZXMoKSA9PSBudWxsIHx8CisgICAgICAgICAgICAgICAgc2VhcmNoUmVxdWVzdC5nZXRTY29wZSgpLmdldFNlYXJjaFNpdGVzKCkubGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIGFuIHVwZGF0ZSBzZWFyY2gsIHNvIHNlZSBpZiB0aGVyZSBhcmUgYW55IGpvYnMgZmlyc3QsCisgICAgICAgICAgICAgICAgLy8gYW5kIGdldCB0aGVpciBzaXRlcworICAgICAgICAgICAgICAgIGlmIChqb2JzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0IHNpdGVzTGlzdCA9IG5ldyBBcnJheUxpc3Qoam9icy5zaXplKCkpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGpvYnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiBvcCA9IChJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24pIGpvYnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldChpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIG5lZWQgYSBsYWJlbCBmb3IgdGhlIHNpdGUsIHNvIHRyeSB0byBnZXQgaXQgZnJvbSB0aGUgb2xkCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBmZWF0dXJlIHVwZGF0ZSB1cmwKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICBJRmVhdHVyZVtdIGV4aXN0aW5nRmVhdHVyZXMgPSBVcGRhdGVVdGlscworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0SW5zdGFsbGVkRmVhdHVyZXMob3AuZ2V0RmVhdHVyZSgpLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleGlzdGluZ0ZlYXR1cmVzICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgZXhpc3RpbmdGZWF0dXJlcy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVVSTEVudHJ5IGVudHJ5ID0gb3AuZ2V0RmVhdHVyZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0VXBkYXRlU2l0ZUVudHJ5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBlbnRyeS5nZXRBbm5vdGF0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFiZWwgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IG9wLmdldEZlYXR1cmUoKS5nZXRTaXRlKCkuZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgU2l0ZUJvb2ttYXJrIGJvb2ttYXJrID0gbmV3IFNpdGVCb29rbWFyayhsYWJlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3AuZ2V0RmVhdHVyZSgpLmdldFNpdGUoKS5nZXRVUkwoKSwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNpdGVzTGlzdC5jb250YWlucyhib29rbWFyaykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l0ZXNMaXN0LmFkZChib29rbWFyayk7CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoIXNpdGVzTGlzdC5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFNpdGVCb29rbWFya1tdKSBzaXRlc0xpc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRvQXJyYXkobmV3IFNpdGVCb29rbWFya1tzaXRlc0xpc3Quc2l6ZSgpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2l0ZUJvb2ttYXJrWzBdOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBzZWFyY2ggZm9yIGZlYXR1cmVzCisgICAgICAgICAgICAgICAgSVVwZGF0ZVNlYXJjaFNpdGVbXSBzaXRlcyA9IHNlYXJjaFJlcXVlc3QuZ2V0U2NvcGUoKS5nZXRTZWFyY2hTaXRlcygpOworICAgICAgICAgICAgICAgIFNpdGVCb29rbWFya1tdIHNpdGVCb29rbWFya3MgPSBuZXcgU2l0ZUJvb2ttYXJrW3NpdGVzLmxlbmd0aF07CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXRlcy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgc2l0ZUJvb2ttYXJrc1tpXSA9IG5ldyBTaXRlQm9va21hcmsoc2l0ZXNbaV0uZ2V0TGFiZWwoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXRlc1tpXS5nZXRVUkwoKSwgZmFsc2UpOworICAgICAgICAgICAgICAgIHJldHVybiBzaXRlQm9va21hcmtzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgVHJlZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBTaGFyZWRMYWJlbFByb3ZpZGVyIHsKKworICAgICAgICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IG9iaikgeworICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFNpdGVCb29rbWFyaykKKyAgICAgICAgICAgICAgICByZXR1cm4gVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldExhYmVsUHJvdmlkZXIoKS5nZXQoCisgICAgICAgICAgICAgICAgICAgICAgICBVcGRhdGVVSUltYWdlcy5ERVNDX1NJVEVfT0JKKTsKKyAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBTaXRlQ2F0ZWdvcnkpCisgICAgICAgICAgICAgICAgcmV0dXJuIFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRMYWJlbFByb3ZpZGVyKCkuZ2V0KAorICAgICAgICAgICAgICAgICAgICAgICAgVXBkYXRlVUlJbWFnZXMuREVTQ19DQVRFR09SWV9PQkopOworICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbikgeworICAgICAgICAgICAgICAgIElGZWF0dXJlIGZlYXR1cmUgPSAoKElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbikgb2JqKS5nZXRGZWF0dXJlKCk7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBwYXRjaCA9IGZlYXR1cmUuaXNQYXRjaCgpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vYm9vbGVhbiBwcm9ibGVtYXRpYz1wcm9ibGVtYXRpY0ZlYXR1cmVzLmNvbnRhaW5zKGZlYXR1cmUpICYmIHRyZWVWaWV3ZXIuZ2V0Q2hlY2tlZChvYmopOworICAgICAgICAgICAgICAgIGJvb2xlYW4gZmVhdHVyZUlzUHJvYmxlbWF0aWMgPSBpc0ZlYXR1cmVQcm9ibGVtYXRpYyhmZWF0dXJlKTsKKyAgICAgICAgICAgICAgICBib29sZWFuIHByb2JsZW1hdGljID0gdHJlZVZpZXdlci5nZXRDaGVja2VkKG9iaikgJiYgZmVhdHVyZUlzUHJvYmxlbWF0aWM7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKCFwcm9ibGVtYXRpYyAmJiBmZWF0dXJlSXNQcm9ibGVtYXRpYykgeworICAgICAgICAgICAgICAgIAlPYmplY3QgcGFyZW50ID0gKChUcmVlQ29udGVudFByb3ZpZGVyKXRyZWVWaWV3ZXIuZ2V0Q29udGVudFByb3ZpZGVyKCkpLmdldFBhcmVudChvYmopOworICAgICAgICAgICAgICAgIAlpZihwYXJlbnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAJCXJldHVybiBzdXBlci5nZXRJbWFnZShvYmopOworICAgICAgICAgICAgICAgIAlwcm9ibGVtYXRpYyA9IHRyZWVWaWV3ZXIuZ2V0Q2hlY2tlZChwYXJlbnQpICYmICF0cmVlVmlld2VyLmdldEdyYXllZChwYXJlbnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAocGF0Y2gpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldChVcGRhdGVVSUltYWdlcy5ERVNDX0VGSVhfT0JKLCBwcm9ibGVtYXRpYz8gRl9FUlJPUiA6IDApOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXQoVXBkYXRlVUlJbWFnZXMuREVTQ19GRUFUVVJFX09CSiwgcHJvYmxlbWF0aWM/IEZfRVJST1IgOiAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0SW1hZ2Uob2JqKTsKKworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmopIHsKKyAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBTaXRlQm9va21hcmspIAorICAgICAgICAgICAgICAgIHJldHVybiAoKFNpdGVCb29rbWFyaykgb2JqKS5nZXRMYWJlbCgpOworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBTaXRlQ2F0ZWdvcnkpCisgICAgICAgICAgICAgICAgcmV0dXJuIG9iai50b1N0cmluZygpOworICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIGpvYiA9IChJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24pIG9iajsKKyAgICAgICAgICAgICAgICBJRmVhdHVyZSBmZWF0dXJlID0gam9iLmdldEZlYXR1cmUoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmVhdHVyZS5nZXRMYWJlbCgpICsgIiAiICsgZmVhdHVyZSAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFZlcnNpb25lZElkZW50aWZpZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRWZXJzaW9uKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRUZXh0KG9iaik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGFzcyBNb2RlbExpc3RlbmVyIGltcGxlbWVudHMgSVVwZGF0ZU1vZGVsQ2hhbmdlZExpc3RlbmVyIHsKKyAgICAgICAgcHVibGljIHZvaWQgb2JqZWN0Q2hhbmdlZChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpIHsKKyAgICAgICAgICAgIHRyZWVWaWV3ZXIucmVmcmVzaCgpOworICAgICAgICAgICAgY2hlY2tJdGVtcygpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb2JqZWN0c0FkZGVkKE9iamVjdCBwYXJlbnQsIE9iamVjdFtdIGNoaWxkcmVuKSB7CisgICAgICAgICAgICB0cmVlVmlld2VyLnJlZnJlc2goKTsKKyAgICAgICAgICAgIGNoZWNrSXRlbXMoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9iamVjdHNSZW1vdmVkKE9iamVjdCBwYXJlbnQsIE9iamVjdFtdIGNoaWxkcmVuKSB7CisgICAgICAgICAgICB0cmVlVmlld2VyLnJlZnJlc2goKTsKKyAgICAgICAgICAgIGNoZWNrSXRlbXMoKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGNoZWNrSXRlbXMoKSB7CisgICAgICAgICAgICBUcmVlSXRlbVtdIGl0ZW1zID0gdHJlZVZpZXdlci5nZXRUcmVlKCkuZ2V0SXRlbXMoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBTaXRlQm9va21hcmsgYm9va21hcmsgPSAoU2l0ZUJvb2ttYXJrKSBpdGVtc1tpXS5nZXREYXRhKCk7CisgICAgICAgICAgICAgICAgdHJlZVZpZXdlci5zZXRDaGVja2VkKGJvb2ttYXJrLCBib29rbWFyay5pc1NlbGVjdGVkKCkpOworICAgICAgICAgICAgICAgIFN0cmluZ1tdIGlnbm9yZWRDYXRzID0gYm9va21hcmsuZ2V0SWdub3JlZENhdGVnb3JpZXMoKTsKKyAgICAgICAgICAgICAgICB0cmVlVmlld2VyLnNldEdyYXllZChib29rbWFyaywgaWdub3JlZENhdHMubGVuZ3RoID4gMAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgYm9va21hcmsuaXNTZWxlY3RlZCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCWNsYXNzIENvbnRhaW5tZW50RmlsdGVyIGV4dGVuZHMgVmlld2VyRmlsdGVyIHsKKwkJCisJCXByaXZhdGUgSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uW10gc2VsZWN0ZWRKb2JzOworCQkKKwkJcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2aWV3ZXIsIE9iamVjdCBwYXJlbnQsIE9iamVjdCBlbGVtZW50KSB7CisgICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbikgeworICAgICAgICAgICAgICAgIHJldHVybiAhaXNDb250YWluZWQoKElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbikgZWxlbWVudCkgfHwgaXNTZWxlY3RlZCggc2VsZWN0ZWRKb2JzLCAoSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uKWVsZW1lbnQpOworICAgICAgICAgICAgfSBlbHNlIGlmICggKGVsZW1lbnQgaW5zdGFuY2VvZiBTaXRlQ2F0ZWdvcnkpIHx8IChlbGVtZW50IGluc3RhbmNlb2YgU2l0ZUJvb2ttYXJrKSl7CisgICAgICAgICAgICAJT2JqZWN0W10gY2hpbGRyZW4gPSAoKElUcmVlQ29udGVudFByb3ZpZGVyKSgoQ29udGFpbmVyQ2hlY2tlZFRyZWVWaWV3ZXIpdmlld2VyKS5nZXRDb250ZW50UHJvdmlkZXIoKSkuZ2V0Q2hpbGRyZW4oZWxlbWVudCk7CisgICAgICAgICAgICAJZm9yICggaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIAkJaWYgKHNlbGVjdCh2aWV3ZXIsIGVsZW1lbnQsIGNoaWxkcmVuW2ldKSkgeworICAgICAgICAgICAgCQkJcmV0dXJuIHRydWU7CisgICAgICAgICAgICAJCX0KKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAJcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworCQl9CisJCQorCQlwcml2YXRlIGJvb2xlYW4gaXNDb250YWluZWQoSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIGpvYikgeworCQkJVmVyc2lvbmVkSWRlbnRpZmllciB2aWQgPSBqb2IuZ2V0RmVhdHVyZSgpLmdldFZlcnNpb25lZElkZW50aWZpZXIoKTsKKworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBqb2JzLnNpemUoKTsgaSsrKSB7CisJCQkJSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIGNhbmRpZGF0ZSA9IChJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24pIGpvYnMuZ2V0KGkpOworCQkJCWlmIChjYW5kaWRhdGUuZXF1YWxzKGpvYikpCisJCQkJCWNvbnRpbnVlOworCQkJCUlGZWF0dXJlIGZlYXR1cmUgPSBjYW5kaWRhdGUuZ2V0RmVhdHVyZSgpOworCQkJCWlmIChpbmNsdWRlcyhmZWF0dXJlLCB2aWQsbnVsbCkpCisJCQkJCXJldHVybiB0cnVlOworCQkJfQorCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCXByaXZhdGUgYm9vbGVhbiBpbmNsdWRlcyhJRmVhdHVyZSBmZWF0dXJlLCBWZXJzaW9uZWRJZGVudGlmaWVyIHZpZCwgQXJyYXlMaXN0IGN5Y2xlQ2FuZGlkYXRlcykgeworCQkJdHJ5IHsKKwkJCQlpZiAoY3ljbGVDYW5kaWRhdGVzID09IG51bGwpCisJCQkJCWN5Y2xlQ2FuZGlkYXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJCQlpZiAoY3ljbGVDYW5kaWRhdGVzLmNvbnRhaW5zKGZlYXR1cmUpKQorCQkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihOTFMuYmluZChVcGRhdGVVSU1lc3NhZ2VzLkluc3RhbGxXaXphcmRfUmV2aWV3UGFnZV9jeWNsZSwgZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSksIG51bGwpOworCQkJCWVsc2UKKwkJCQkJY3ljbGVDYW5kaWRhdGVzLmFkZChmZWF0dXJlKTsKKwkJCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGlyZWZzID0KKwkJCQkJZmVhdHVyZS5nZXRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCk7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpcmVmcy5sZW5ndGg7IGkrKykgeworCQkJCQlJRmVhdHVyZVJlZmVyZW5jZSBpcmVmID0gaXJlZnNbaV07CisJCQkJCUlGZWF0dXJlIGlmZWF0dXJlID0gVXBkYXRlVXRpbHMuZ2V0SW5jbHVkZWRGZWF0dXJlKGZlYXR1cmUsIGlyZWYpOworCQkJCQlWZXJzaW9uZWRJZGVudGlmaWVyIGl2aWQgPQorCQkJCQkJaWZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOworCQkJCQlpZiAoaXZpZC5lcXVhbHModmlkKSkKKwkJCQkJCXJldHVybiB0cnVlOworCQkJCQlpZiAoaW5jbHVkZXMoaWZlYXR1cmUsIHZpZCwgY3ljbGVDYW5kaWRhdGVzKSkKKwkJCQkJCXJldHVybiB0cnVlOworCQkJCX0KKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9IGZpbmFsbHkgeworCQkJCS8vIGFmdGVyIHRoaXMgZmVhdHVyZSBoYXMgYmVlbiBERlMtZWQsIGl0IGlzIG5vIGxvbmdlciBhIGN5Y2xlIGNhbmRpZGF0ZQorCQkJCWN5Y2xlQ2FuZGlkYXRlcy5yZW1vdmUoZmVhdHVyZSk7CisJCQl9CisJCX0KKworCisJCXB1YmxpYyBJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb25bXSBnZXRTZWxlY3RlZEpvYnMoKSB7CisJCQlyZXR1cm4gc2VsZWN0ZWRKb2JzOworCQl9CisJCQorCisJCXB1YmxpYyB2b2lkIHNldFNlbGVjdGVkSm9icyhJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb25bXSBzZWxlY3RlZEpvYnMpIHsKKwkJCXRoaXMuc2VsZWN0ZWRKb2JzID0gc2VsZWN0ZWRKb2JzOworCQl9CisKKwkKKwl9CisKKwljbGFzcyBMYXRlc3RWZXJzaW9uRmlsdGVyIGV4dGVuZHMgVmlld2VyRmlsdGVyIHsKKwkJCisJCXByaXZhdGUgSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uW10gc2VsZWN0ZWRKb2JzOworCQkKKwkJcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2aWV3ZXIsIE9iamVjdCBwYXJlbnQsIE9iamVjdCBlbGVtZW50KSB7CisJCQkJCQkKKyAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGlzTGF0ZXN0VmVyc2lvbigoSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uKSBlbGVtZW50KSB8fCBpc1NlbGVjdGVkKCBzZWxlY3RlZEpvYnMsIChJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24pZWxlbWVudCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCAoZWxlbWVudCBpbnN0YW5jZW9mIFNpdGVDYXRlZ29yeSkgfHwgKGVsZW1lbnQgaW5zdGFuY2VvZiBTaXRlQm9va21hcmspKXsKKyAgICAgICAgICAgIAlPYmplY3RbXSBjaGlsZHJlbiA9ICgoSVRyZWVDb250ZW50UHJvdmlkZXIpKChDb250YWluZXJDaGVja2VkVHJlZVZpZXdlcil2aWV3ZXIpLmdldENvbnRlbnRQcm92aWRlcigpKS5nZXRDaGlsZHJlbihlbGVtZW50KTsKKyAgICAgICAgICAgIAlmb3IgKCBpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgCQlpZiAoc2VsZWN0KHZpZXdlciwgZWxlbWVudCwgY2hpbGRyZW5baV0pKSB7CisgICAgICAgICAgICAJCQlyZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIAkJfQorICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworCQl9CisJCQorCQlwcml2YXRlIGJvb2xlYW4gaXNMYXRlc3RWZXJzaW9uKElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiBqb2IpIHsKKwkJCUlGZWF0dXJlIGZlYXR1cmUgPSBqb2IuZ2V0RmVhdHVyZSgpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBqb2JzLnNpemUoKTsgaSsrKSB7CisJCQkJSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIGNhbmRpZGF0ZUpvYiA9IChJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24pIGpvYnMuZ2V0KGkpOworCQkJCWlmIChjYW5kaWRhdGVKb2IuZXF1YWxzKGpvYikpCisJCQkJCWNvbnRpbnVlOworCQkJCUlGZWF0dXJlIGNhbmRpZGF0ZSA9IGNhbmRpZGF0ZUpvYi5nZXRGZWF0dXJlKCk7CisJCQkJaWYgKGZlYXR1cmUuZ2V0U2l0ZSgpICE9IGpvYi5nZXRGZWF0dXJlKCkuZ2V0U2l0ZSgpKQorCQkJCQljb250aW51ZTsKKwkJCQlpZiAoIWZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldElkZW50aWZpZXIoKS5lcXVhbHMoY2FuZGlkYXRlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRJZGVudGlmaWVyKCkpKQorCQkJCQljb250aW51ZTsKKwkJCQlpZiAoIWZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldFZlcnNpb24oKS5pc0dyZWF0ZXJPckVxdWFsVG8oY2FuZGlkYXRlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRWZXJzaW9uKCkpKQorCQkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQkKKwkJcHVibGljIElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbltdIGdldFNlbGVjdGVkSm9icygpIHsKKwkJCXJldHVybiBzZWxlY3RlZEpvYnM7CisJCX0KKwkJCisJCXB1YmxpYyB2b2lkIHNldFNlbGVjdGVkSm9icyhJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb25bXSBzZWxlY3RlZEpvYnMpIHsKKwkJCXRoaXMuc2VsZWN0ZWRKb2JzID0gc2VsZWN0ZWRKb2JzOworCQl9CisJCQorCQkKKwl9CisJCisJY2xhc3MgRmVhdHVyZVByb3BlcnR5RGlhbG9nQWN0aW9uIGV4dGVuZHMgUHJvcGVydHlEaWFsb2dBY3Rpb24geworCQlwcml2YXRlIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbjsKKworCQlwdWJsaWMgRmVhdHVyZVByb3BlcnR5RGlhbG9nQWN0aW9uKAorCQkJU2hlbGwgc2hlbGwsCisJCQlJU2VsZWN0aW9uUHJvdmlkZXIgcHJvdmlkZXIpIHsKKwkJCXN1cGVyKHNoZWxsLCBwcm92aWRlcik7CisJCX0KKworCQlwdWJsaWMgSVN0cnVjdHVyZWRTZWxlY3Rpb24gZ2V0U3RydWN0dXJlZFNlbGVjdGlvbigpIHsKKwkJCXJldHVybiBzZWxlY3Rpb247CisJCX0KKworCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgeworCQkJdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247CisJCX0KKworCX0KKwkvKioKKwkgKiBDb25zdHJ1Y3RvciBmb3IgUmV2aWV3UGFnZTIKKwkgKi8KKwlwdWJsaWMgUmV2aWV3UGFnZShib29sZWFuIGlzVXBkYXRlU2VhcmNoLCBVcGRhdGVTZWFyY2hSZXF1ZXN0IHNlYXJjaFJlcXVlc3QsIEFycmF5TGlzdCBqb2JzKSB7CisJCXN1cGVyKCJSZXZpZXciKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICB0aGlzLmlzVXBkYXRlU2VhcmNoID0gaXNVcGRhdGVTZWFyY2g7CisgICAgICAgIHRoaXMuam9icyA9IGpvYnM7CisgICAgICAgIGlmICh0aGlzLmpvYnM9PW51bGwpIHRoaXMuam9icyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgdGhpcy5zZWFyY2hSZXF1ZXN0ID0gc2VhcmNoUmVxdWVzdDsKKyAgICAgICAgCisJCXNldFRpdGxlKFVwZGF0ZVVJTWVzc2FnZXMuSW5zdGFsbFdpemFyZF9SZXZpZXdQYWdlX3RpdGxlKTsgCisJCXNldERlc2NyaXB0aW9uKFVwZGF0ZVVJTWVzc2FnZXMuSW5zdGFsbFdpemFyZF9SZXZpZXdQYWdlX2Rlc2MpOyAKKwkJVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldExhYmVsUHJvdmlkZXIoKS5jb25uZWN0KHRoaXMpOworCQlzZXRCYW5uZXJWaXNpYmxlKGZhbHNlKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQlVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0TGFiZWxQcm92aWRlcigpLmRpc2Nvbm5lY3QodGhpcyk7CisJCXN1cGVyLmRpc3Bvc2UoKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgeworCQlzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOworCQkKKwkJLy8gd2hlbiBzZWFyY2hpbmcgZm9yIHVwZGF0ZXMsIG9ubHkgbmVzdGVkIHBhdGNoZXMgY2FuIGJlIHNob3duLgorCQkvLyB3aGVuIHNlYXJjaGluZyBmb3IgZmVhdHVyZXMsIGZlYXR1cmVzIGFuZCBwYXRjaGVzIGNhbiBiZSBzaG93bgorCQlTdHJpbmcgZmlsdGVyVGV4dCA9IGZpbHRlckNoZWNrLmdldFRleHQoKTsKKwkJU3RyaW5nIGZpbHRlckZlYXR1cmVzID0gVXBkYXRlVUlNZXNzYWdlcy5JbnN0YWxsV2l6YXJkX1Jldmlld1BhZ2VfZmlsdGVyRmVhdHVyZXM7IAorCQlTdHJpbmcgZmlsdGVyUGF0Y2hlcyA9IFVwZGF0ZVVJTWVzc2FnZXMuSW5zdGFsbFdpemFyZF9SZXZpZXdQYWdlX2ZpbHRlclBhdGNoZXM7IAorCisJCWlmIChpc1VwZGF0ZVNlYXJjaCAmJiBmaWx0ZXJUZXh0LmVxdWFscyhmaWx0ZXJGZWF0dXJlcykpCisJCQlmaWx0ZXJDaGVjay5zZXRUZXh0KGZpbHRlclBhdGNoZXMpOworCQllbHNlIGlmICggIWlzVXBkYXRlU2VhcmNoICYmIGZpbHRlclRleHQuZXF1YWxzKGZpbHRlclBhdGNoZXMpKQorCQkJZmlsdGVyQ2hlY2suc2V0VGV4dChmaWx0ZXJGZWF0dXJlcyk7CisJCQorCQlpZiAodmlzaWJsZSAmJiAhaW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgICAgIGluaXRpYWxpemVkID0gdHJ1ZTsKKy8vCQkJam9icy5jbGVhcigpOworCisvLwkJCXNldERlc2NyaXB0aW9uKFVwZGF0ZVVJLmdldFN0cmluZygiSW5zdGFsbFdpemFyZC5SZXZpZXdQYWdlLnNlYXJjaGluZyIpKTsgLy8kTk9OLU5MUy0xJDsKKy8vCQkJbGFiZWwuc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoIiIpKTsgLy8kTk9OLU5MUy0xJAorCisJCQlnZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgeworCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKy8vCQkJCQlzZWFyY2hSdW5uZXIucnVuU2VhcmNoKCk7CisJCQkJCXBlcmZvcm1Qb3N0U2VhcmNoUHJvY2Vzc2luZygpOworCQkJCX0KKwkJCX0pOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIHBlcmZvcm1Qb3N0U2VhcmNoUHJvY2Vzc2luZygpIHsKKwkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKKwkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQlpZiAodHJlZVZpZXdlciAhPSBudWxsKSB7CisvLyAgICAgICAgICAgICAgICAgICAgdHJlZVZpZXdlci5yZWZyZXNoKCk7CisvLyAgICAgICAgICAgICAgICAgICAgdHJlZVZpZXdlci5nZXRUcmVlKCkubGF5b3V0KHRydWUpOworCQkJCQlpZiAoaXNVcGRhdGVTZWFyY2gpIHsKKwkJCQkJCXNlbGVjdFRydWVVcGRhdGVzKCk7CisJCQkJCX0KKwkJCQl9CisJCQkJcGFnZUNoYW5nZWQoKTsKKwkJCQkKKwkJCQlpbnQgdG90YWxDb3VudCA9IGpvYnMgIT0gbnVsbCA/IGpvYnMuc2l6ZSgpOiAwOworCQkJCWlmKHRvdGFsQ291bnQgPjApIHsKKwkJCQkJc2V0RGVzY3JpcHRpb24oVXBkYXRlVUlNZXNzYWdlcy5JbnN0YWxsV2l6YXJkX1Jldmlld1BhZ2VfZGVzYyk7IAorCQkJCQlsYWJlbC5zZXRUZXh0KFVwZGF0ZVVJTWVzc2FnZXMuSW5zdGFsbFdpemFyZF9SZXZpZXdQYWdlX2xhYmVsKTsgCisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKGlzVXBkYXRlU2VhcmNoKQorCQkJCQkJc2V0RGVzY3JpcHRpb24oVXBkYXRlVUlNZXNzYWdlcy5JbnN0YWxsV2l6YXJkX1Jldmlld1BhZ2VfemVyb1VwZGF0ZXMpOyAKKwkJCQkJZWxzZQorCQkJCQkJc2V0RGVzY3JpcHRpb24oVXBkYXRlVUlNZXNzYWdlcy5JbnN0YWxsV2l6YXJkX1Jldmlld1BhZ2VfemVyb0ZlYXR1cmVzKTsgCisJCQkJCWxhYmVsLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCisJCQkJfQorCQkJfQorCQl9KTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIHNlbGVjdFRydWVVcGRhdGVzKCkgeworCQlBcnJheUxpc3QgdHJ1ZVVwZGF0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisJCWZvciAoaW50IGk9MDsgaTxqb2JzLnNpemUoKTsgaSsrKSB7CisJCQlJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gam9iID0gKElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbilqb2JzLmdldChpKTsKKwkJCWlmICghVXBkYXRlVXRpbHMuaXNQYXRjaChqb2IuZ2V0RmVhdHVyZSgpKSkKKwkJCQl0cnVlVXBkYXRlcy5hZGQoam9iKTsKKwkJfQorCQl0cmVlVmlld2VyLnNldENoZWNrZWRFbGVtZW50cyh0cnVlVXBkYXRlcy50b0FycmF5KCkpOyAKKwkJdmFsaWRhdGVTZWxlY3Rpb24obmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7CisJfQkKKworCS8qKgorCSAqIEBzZWUgRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKKwkgKi8KKwlwdWJsaWMgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7CisJCUNvbXBvc2l0ZSBjbGllbnQgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOworCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7CisJCWxheW91dC5udW1Db2x1bW5zID0gMjsKKwkJbGF5b3V0Lm1hcmdpbldpZHRoID0gbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7CisJCWNsaWVudC5zZXRMYXlvdXQobGF5b3V0KTsKKwkJbGFiZWwgPSBuZXcgTGFiZWwoY2xpZW50LCBTV1QuTlVMTCk7CisJCWxhYmVsLnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5JbnN0YWxsV2l6YXJkX1Jldmlld1BhZ2VfbGFiZWwpOyAKKwkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKKwkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOworCQlsYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKKworICAgICAgICBjcmVhdGVUcmVlVmlld2VyKGNsaWVudCk7CisKKwkJQ29tcG9zaXRlIGNvbXAgPSBuZXcgQ29tcG9zaXRlKGNsaWVudCwgU1dULk5PTkUpOworCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOworCQlsYXlvdXQubWFyZ2luV2lkdGggPSBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKKwkJY29tcC5zZXRMYXlvdXQobGF5b3V0KTsKKwkJY29tcC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMKSk7CisJCQkJCisJCUNvbXBvc2l0ZSBidXR0b25Db250YWluZXIgPSBuZXcgQ29tcG9zaXRlKGNvbXAsIFNXVC5OVUxMKTsKKwkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9WRVJUSUNBTCk7CisJCWJ1dHRvbkNvbnRhaW5lci5zZXRMYXlvdXREYXRhKGdkKTsKKwkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKKwkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKKwkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7IC8vMzA/CisJCWJ1dHRvbkNvbnRhaW5lci5zZXRMYXlvdXQobGF5b3V0KTsKKwkJYnV0dG9uQ29udGFpbmVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOworCisJCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbnRhaW5lciwgU1dULlBVU0gpOworCQlidXR0b24uc2V0VGV4dChVcGRhdGVVSU1lc3NhZ2VzLkluc3RhbGxXaXphcmRfUmV2aWV3UGFnZV9kZXNlbGVjdEFsbCk7IAorCQlnZCA9CisJCQluZXcgR3JpZERhdGEoCisJCQkJR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMCisJCQkJCXwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsKKwkJYnV0dG9uLnNldExheW91dERhdGEoZ2QpOworCQlTV1RVdGlsLnNldEJ1dHRvbkRpbWVuc2lvbkhpbnQoYnV0dG9uKTsKKwkJYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCWhhbmRsZURlc2VsZWN0QWxsKCk7CisJCQl9CisJCX0pOworCisJCW1vcmVJbmZvQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db250YWluZXIsIFNXVC5QVVNIKTsKKwkJbW9yZUluZm9CdXR0b24uc2V0VGV4dChVcGRhdGVVSU1lc3NhZ2VzLkluc3RhbGxXaXphcmRfUmV2aWV3UGFnZV9tb3JlSW5mbyk7IAorCQlnZCA9CisJCQluZXcgR3JpZERhdGEoCisJCQkJR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMCisJCQkJCXwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsKKwkJbW9yZUluZm9CdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7CisJCVNXVFV0aWwuc2V0QnV0dG9uRGltZW5zaW9uSGludChtb3JlSW5mb0J1dHRvbik7CisJCW1vcmVJbmZvQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCWhhbmRsZU1vcmVJbmZvKCk7CisJCQl9CisJCX0pOworCQltb3JlSW5mb0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKKwkJCisJCQorCQlwcm9wZXJ0aWVzQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db250YWluZXIsIFNXVC5QVVNIKTsKKwkJcHJvcGVydGllc0J1dHRvbi5zZXRUZXh0KFVwZGF0ZVVJTWVzc2FnZXMuSW5zdGFsbFdpemFyZF9SZXZpZXdQYWdlX3Byb3BlcnRpZXMpOyAKKwkJZ2QgPQorCQkJbmV3IEdyaWREYXRhKAorCQkJCUdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTAorCQkJCQl8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7CisJCXByb3BlcnRpZXNCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7CisJCVNXVFV0aWwuc2V0QnV0dG9uRGltZW5zaW9uSGludChwcm9wZXJ0aWVzQnV0dG9uKTsKKwkJcHJvcGVydGllc0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQloYW5kbGVQcm9wZXJ0aWVzKCk7CisJCQl9CisJCX0pOworCQlwcm9wZXJ0aWVzQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOworCisJCXNlbGVjdFJlcXVpcmVkRmVhdHVyZXNCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbnRhaW5lciwgU1dULlBVU0gpOworCQlzZWxlY3RSZXF1aXJlZEZlYXR1cmVzQnV0dG9uLnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5JbnN0YWxsV2l6YXJkX1Jldmlld1BhZ2Vfc2VsZWN0UmVxdWlyZWQpOworCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwKKwkJCQl8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7CisJCXNlbGVjdFJlcXVpcmVkRmVhdHVyZXNCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7CisJCVNXVFV0aWwuc2V0QnV0dG9uRGltZW5zaW9uSGludChzZWxlY3RSZXF1aXJlZEZlYXR1cmVzQnV0dG9uKTsKKwkJc2VsZWN0UmVxdWlyZWRGZWF0dXJlc0J1dHRvbgorCQkJCS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZS5kaXNwbGF5LCBuZXcgUnVubmFibGUoKSB7CisJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkJCQlPYmplY3RbXSBlbGVtZW50cyA9IHRyZWVWaWV3ZXIuZ2V0RXhwYW5kZWRFbGVtZW50cygpOworCQkJCQkJCQl0cmVlVmlld2VyLmV4cGFuZEFsbCgpOworCQkJCQkJCQl0cmVlVmlld2VyLnNldEV4cGFuZGVkRWxlbWVudHMoZWxlbWVudHMpOworCQkJCQkJCQlzZWxlY3RSZXF1aXJlZEZlYXR1cmVzKCk7CisJCQkJCQkJCXVwZGF0ZUl0ZW1Db3VudCgpOworCQkJCQkJCX0KKwkJCQkJCX0pOworCQkJCQl9CisJCQkJfSk7CisKKwkJc3RhdHVzQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db250YWluZXIsIFNXVC5QVVNIKTsKKwkJc3RhdHVzQnV0dG9uLnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5JbnN0YWxsV2l6YXJkX1Jldmlld1BhZ2Vfc2hvd1N0YXR1cyk7IAorCQlnZCA9CisJCQluZXcgR3JpZERhdGEoCisJCQkJR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMCisJCQkJCXwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsKKwkJc3RhdHVzQnV0dG9uLnNldExheW91dERhdGEoZ2QpOworCQlTV1RVdGlsLnNldEJ1dHRvbkRpbWVuc2lvbkhpbnQoc3RhdHVzQnV0dG9uKTsKKwkJc3RhdHVzQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCXNob3dTdGF0dXMoKTsKKwkJCX0KKwkJfSk7CisKKwkJLy9uZXcgTGFiZWwoY2xpZW50LCBTV1QuTlVMTCk7CisKKwkJY291bnRlckxhYmVsID0gbmV3IExhYmVsKGNsaWVudCwgU1dULk5VTEwpOworCQlnZCA9IG5ldyBHcmlkRGF0YSgpOworCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7CisJCWNvdW50ZXJMYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKKworCQlmaWx0ZXJPbGRlclZlcnNpb25DaGVjayA9IG5ldyBCdXR0b24oY2xpZW50LCBTV1QuQ0hFQ0spOworCQlmaWx0ZXJPbGRlclZlcnNpb25DaGVjay5zZXRUZXh0KFVwZGF0ZVVJTWVzc2FnZXMuSW5zdGFsbFdpemFyZF9SZXZpZXdQYWdlX2ZpbHRlck9sZGVyRmVhdHVyZXMpOyAKKwkJZmlsdGVyT2xkZXJWZXJzaW9uQ2hlY2suc2V0U2VsZWN0aW9uKHRydWUpOworCQl0cmVlVmlld2VyLmFkZEZpbHRlcihvbGRlclZlcnNpb25GaWx0ZXIpOworCQlmaWx0ZXJPbGRlclZlcnNpb25DaGVjay5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKworCQkJCUlJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbltdIGpvYnMgPSBnZXRTZWxlY3RlZEpvYnMoKTsKKwkJCQkKKwkJCQlpZiAoZmlsdGVyT2xkZXJWZXJzaW9uQ2hlY2suZ2V0U2VsZWN0aW9uKCkpCisJCQkJCXRyZWVWaWV3ZXIuYWRkRmlsdGVyKG9sZGVyVmVyc2lvbkZpbHRlcik7CisJCQkJZWxzZSAKKwkJCQkJdHJlZVZpZXdlci5yZW1vdmVGaWx0ZXIob2xkZXJWZXJzaW9uRmlsdGVyKTsKKwkJCQkKKwkJCQlvbGRlclZlcnNpb25GaWx0ZXIuc2V0U2VsZWN0ZWRKb2JzKGpvYnMpOwkJCQkKKwkJCQlwYWdlQ2hhbmdlZChqb2JzKTsKKwkJCX0KKwkJfSk7CisJCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7CisJCWdkLmhvcml6b250YWxTcGFuID0gMjsKKwkJZmlsdGVyT2xkZXJWZXJzaW9uQ2hlY2suc2V0TGF5b3V0RGF0YShnZCk7CisJCQorCQlmaWx0ZXJDaGVjayA9IG5ldyBCdXR0b24oY2xpZW50LCBTV1QuQ0hFQ0spOworCQlmaWx0ZXJDaGVjay5zZXRUZXh0KFVwZGF0ZVVJTWVzc2FnZXMuSW5zdGFsbFdpemFyZF9SZXZpZXdQYWdlX2ZpbHRlckZlYXR1cmVzKTsgCisJCWZpbHRlckNoZWNrLnNldFNlbGVjdGlvbihmYWxzZSk7CisJCS8vdGFibGVWaWV3ZXIuYWRkRmlsdGVyKGZpbHRlcik7CisJCWZpbHRlckNoZWNrLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCQorCQkJCUlJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbltdIGpvYnMgPSBnZXRTZWxlY3RlZEpvYnMoKTsKKwkJCQkKKwkJCQlpZiAoZmlsdGVyQ2hlY2suZ2V0U2VsZWN0aW9uKCkpIHsKKwkJCQkJLy8gbWFrZSBzdXJlIG1vZGVsIGlzIGxvY2FsCisJCQkJCWlmIChkb3dubG9hZEluY2x1ZGVkRmVhdHVyZXMoKSkgeworCQkJCQkJdHJlZVZpZXdlci5hZGRGaWx0ZXIoZmlsdGVyKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWZpbHRlckNoZWNrLnNldFNlbGVjdGlvbihmYWxzZSk7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQl0cmVlVmlld2VyLnJlbW92ZUZpbHRlcihmaWx0ZXIpOworCQkJCX0KKwkJCQkKKwkJCQlmaWx0ZXIuc2V0U2VsZWN0ZWRKb2JzKGpvYnMpOworCQkJCQorCQkJCXBhZ2VDaGFuZ2VkKGpvYnMpOworCQkJfQorCQl9KTsKKwkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKKwkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOworCQlmaWx0ZXJDaGVjay5zZXRMYXlvdXREYXRhKGdkKTsKKwkJCisJCXBhZ2VDaGFuZ2VkKCk7CisKKwkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjbGllbnQsICJvcmcuZWNsaXBzZS51cGRhdGUudWkuTXVsdGlSZXZpZXdQYWdlMiIpOyAvLyROT04tTkxTLTEkCisKKwkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOworCisJCXJldHVybiBjbGllbnQ7CisJfQorCisgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVRyZWVWaWV3ZXIoZmluYWwgQ29tcG9zaXRlIHBhcmVudCkgeworICAgICAgICBTYXNoRm9ybSBzZm9ybSA9IG5ldyBTYXNoRm9ybShwYXJlbnQsIFNXVC5WRVJUSUNBTCk7CisgICAgICAgIEdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7CisgICAgICAgIGdkLndpZHRoSGludCA9IDI1MDsKKyAgICAgICAgZ2QuaGVpZ2h0SGludCA9MTAwOworICAgICAgICBzZm9ybS5zZXRMYXlvdXREYXRhKGdkKTsKKyAgICAgICAgCisgICAgICAgIHRyZWVWaWV3ZXIgPSBuZXcgQ29udGFpbmVyQ2hlY2tlZFRyZWVWaWV3ZXIoc2Zvcm0sIFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTAorICAgICAgICAgICAgICAgIHwgU1dULkJPUkRFUik7CisgICAgICAgIHRyZWVWaWV3ZXIuZ2V0VHJlZSgpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOworICAgICAgICB0cmVlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgVHJlZUNvbnRlbnRQcm92aWRlcigpKTsKKyAgICAgICAgdHJlZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBUcmVlTGFiZWxQcm92aWRlcigpKTsKKyAgICAgICAgdHJlZVZpZXdlci5zZXRJbnB1dChVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0VXBkYXRlTW9kZWwoKSk7CisKKyAgICAgICAgdHJlZVZpZXdlcgorICAgICAgICAgICAgLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGUpIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVTZWxlY3Rpb25DaGFuZ2VkKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZS5nZXRTZWxlY3Rpb24oKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICAKKyAgICAgICAgdHJlZVZpZXdlci5hZGRDaGVja1N0YXRlTGlzdGVuZXIobmV3IElDaGVja1N0YXRlTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGV2ZW50KSB7CisgICAgCQkJLyoKKwkJCQkgKiB2YWxpZGF0ZVNlbGVjdGlvbigpOyBPYmplY3Qgc2l0ZSA9CisJCQkJICogZ2V0U2l0ZShldmVudC5nZXRFbGVtZW50KCkpOyBBcnJheUxpc3QgZGVzY2VuZGFudHMgPSBuZXcKKwkJCQkgKiBBcnJheUxpc3QoKTsgY29sbGVjdERlc2NlbmRhbnRzKHNpdGUsIGRlc2NlbmRhbnRzKTsgT2JqZWN0W10KKwkJCQkgKiBub2RlcyA9IG5ldyBPYmplY3RbZGVzY2VuZGFudHMuc2l6ZSgpXTsgZm9yIChpbnQgaSA9IDA7IGkgPAorCQkJCSAqIG5vZGVzLmxlbmd0aDsgaSsrKSBub2Rlc1tpXSA9IGRlc2NlbmRhbnRzLmdldChpKTsKKwkJCQkgKiB0cmVlVmlld2VyLnVwZGF0ZShub2RlcywgbnVsbCk7IHVwZGF0ZUl0ZW1Db3VudCgpOworCQkJCSAqLworCQkJCXRyeSB7CisJCQkJCWdldENvbnRhaW5lcigpLnJ1bih0cnVlLCB0cnVlLAorCQkJCQkJCWdldENoZWNrU3RhdGVPcGVyYXRpb24oZXZlbnQsIHBhcmVudC5nZXREaXNwbGF5KCkpKTsKKwkJCQkJZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOworCQkJCQl1cGRhdGVTdGF0dXNCdXR0b24oKTsKKwkJCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKKwkJCQkJVXBkYXRlVUkubG9nRXhjZXB0aW9uKGUpOworCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKwkJCQkJVXBkYXRlVUkubG9nRXhjZXB0aW9uKGUpOworCQkJCX0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIAorICAgICAgZGVzY0xhYmVsID0gbmV3IFNjcm9sbGVkRm9ybVRleHQoc2Zvcm0sIHRydWUpOworICAgICAgZGVzY0xhYmVsLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCisgICAgICBkZXNjTGFiZWwuc2V0QmFja2dyb3VuZChwYXJlbnQuZ2V0QmFja2dyb3VuZCgpKTsKKyAgICAgIEh5cGVybGlua1NldHRpbmdzIHNldHRpbmdzID0gbmV3IEh5cGVybGlua1NldHRpbmdzKHBhcmVudC5nZXREaXNwbGF5KCkpOworICAgICAgZGVzY0xhYmVsLmdldEZvcm1UZXh0KCkuc2V0SHlwZXJsaW5rU2V0dGluZ3Moc2V0dGluZ3MpOworICAgICAgZGVzY0xhYmVsLmdldEZvcm1UZXh0KCkuYWRkSHlwZXJsaW5rTGlzdGVuZXIobmV3IEh5cGVybGlua0FkYXB0ZXIoKSB7CisgICAgCSAgcHVibGljIHZvaWQgbGlua0FjdGl2YXRlZChIeXBlcmxpbmtFdmVudCBlKSB7CisgICAgCQkgIE9iamVjdCBocmVmID0gZS5nZXRIcmVmKCk7CisgICAgCQkgIGlmIChocmVmPT1udWxsKQorICAgIAkJCSAgcmV0dXJuOworICAgIAkJICB0cnkgeworICAgIAkJCSAgVVJMIHVybCA9IG5ldyBVUkwoaHJlZi50b1N0cmluZygpKTsKKyAgICAJCQkgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QnJvd3NlclN1cHBvcnQoKS5nZXRFeHRlcm5hbEJyb3dzZXIoKS5vcGVuVVJMKHVybCk7CisgICAgCQkgIH0KKyAgICAJCSAgY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGV4KSB7CisgICAgCQkJICBVcGRhdGVVSS5sb2dFeGNlcHRpb24oZXgpOworICAgIAkJICB9CisgICAgCQkgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZXgpIHsKKyAgICAJCQkgIFVwZGF0ZVVJLmxvZ0V4Y2VwdGlvbihleCk7CisgICAgCQkgIH0KKyAgICAJICB9CisgICAgICB9KTsKKyAgICAgIAorICAgICAgZ2QgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKKyAgICAgIGdkLmhvcml6b250YWxTcGFuID0gMTsKKyAgICAgIGRlc2NMYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKKyAgICAgIAorICAgICAgc2Zvcm0uc2V0V2VpZ2h0cyhuZXcgaW50W10gezEwLCAyfSk7CisgICAgfQorICAgIAorCXByaXZhdGUgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIGdldENoZWNrU3RhdGVPcGVyYXRpb24oCisJCQlmaW5hbCBDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGV2ZW50LCBmaW5hbCBEaXNwbGF5IGRpc3BsYXkpIHsKKwkJcmV0dXJuIG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7CisJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJCQkJbW9uaXRvci5iZWdpblRhc2soVXBkYXRlVUlNZXNzYWdlcy5SZXZpZXdQYWdlX3ZhbGlkYXRpbmcsCisJCQkJCQlJUHJvZ3Jlc3NNb25pdG9yLlVOS05PV04pOworCQkJCXZhbGlkYXRlU2VsZWN0aW9uKG1vbml0b3IpOworCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgeworCQkJCQl1bmRvU3RhdGVDaGFuZ2UoZXZlbnQpOworCQkJCQltb25pdG9yLmRvbmUoKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCQlPYmplY3Qgc2l0ZSA9IGdldFNpdGUoZXZlbnQuZ2V0RWxlbWVudCgpKTsKKwkJCQlBcnJheUxpc3QgZGVzY2VuZGFudHMgPSBuZXcgQXJyYXlMaXN0KCk7CisJCQkJY29sbGVjdERlc2NlbmRhbnRzKHNpdGUsIGRlc2NlbmRhbnRzLCBtb25pdG9yKTsKKwkJCQlmaW5hbCBPYmplY3RbXSBub2RlcyA9IG5ldyBPYmplY3RbZGVzY2VuZGFudHMuc2l6ZSgpXTsKKwkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKKwkJCQkJdW5kb1N0YXRlQ2hhbmdlKGV2ZW50KTsKKwkJCQkJbW9uaXRvci5kb25lKCk7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykKKwkJCQkJbm9kZXNbaV0gPSBkZXNjZW5kYW50cy5nZXQoaSk7CisJCQkJZGlzcGxheS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7CisJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJCXRyZWVWaWV3ZXIudXBkYXRlKG5vZGVzLCBudWxsKTsKKwkJCQkJCXVwZGF0ZUl0ZW1Db3VudCgpOworCQkJCQl9CisJCQkJfSk7CisJCQkJbW9uaXRvci5kb25lKCk7CisJCQl9CisJCX07CisJfQorCQorCXByaXZhdGUgdm9pZCB1bmRvU3RhdGVDaGFuZ2UoZmluYWwgQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBlKSB7CisJCXRyZWVWaWV3ZXIuZ2V0Q29udHJvbCgpLmdldERpc3BsYXkoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7CisJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJdHJlZVZpZXdlci5zZXRDaGVja2VkKGUuZ2V0RWxlbWVudCgpLCAhZS5nZXRDaGVja2VkKCkpOworCQkJfQorCQl9KTsKKwl9CisgICAgCisgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVNlbGVjdGlvbkNoYW5nZWQoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3NlbCkgeworICAgICAgICAKKyAgICAgICAgT2JqZWN0IGl0ZW0gPSBzc2VsLmdldEZpcnN0RWxlbWVudCgpOworICAgICAgICBTdHJpbmcgZGVzY3JpcHRpb24gPSBudWxsOworICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIFNpdGVCb29rbWFyaykgeworICAgICAgICAgICAgZGVzY3JpcHRpb24gPSAoKFNpdGVCb29rbWFyaylpdGVtKS5nZXREZXNjcmlwdGlvbigpOworICAgICAgICB9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBTaXRlQ2F0ZWdvcnkpIHsKKyAgICAgICAgICAgIElVUkxFbnRyeSBkZXNjRW50cnkgPSAoKFNpdGVDYXRlZ29yeSlpdGVtKS5nZXRDYXRlZ29yeSgpLmdldERlc2NyaXB0aW9uKCk7CisgICAgICAgICAgICBpZiAoZGVzY0VudHJ5ICE9IG51bGwpCisgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBkZXNjRW50cnkuZ2V0QW5ub3RhdGlvbigpOworICAgICAgICB9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24pIHsKKyAgICAgICAgICAgIGpvYlNlbGVjdGVkKHNzZWwpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRlc2NyaXB0aW9uID09IG51bGwpCisgICAgICAgICAgICBkZXNjcmlwdGlvbiA9ICIiOyAvLyROT04tTkxTLTEkCisgICAgICAgIC8vZGVzY0xhYmVsLnNldFRleHQoVXBkYXRlTWFuYWdlclV0aWxzLmdldFdyaXRhYmxlWE1MU3RyaW5nKGRlc2NyaXB0aW9uKSwgZmFsc2UsIHRydWUpOworICAgICAgICB1cGRhdGVEZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7CisgICAgICAgIHByb3BlcnRpZXNCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7CisgICAgICAgIG1vcmVJbmZvQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOworICAgIH0KKworLyoJCisJcHJpdmF0ZSB2b2lkIGZpbGxDb250ZXh0TWVudShJTWVudU1hbmFnZXIgbWFuYWdlcikgeworCQlpZiAodHJlZVZpZXdlci5nZXRTZWxlY3Rpb24oKS5pc0VtcHR5KCkpIHJldHVybjsKKwkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oVXBkYXRlVUlNZXNzYWdlcy5JbnN0YWxsV2l6YXJkX1Jldmlld1BhZ2VfcHJvcCkgeyAKKwkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQloYW5kbGVQcm9wZXJ0aWVzKCk7CisJCQl9CisJCX07CisJCW1hbmFnZXIuYWRkKGFjdGlvbik7CisJfQorKi8KKworCXByaXZhdGUgdm9pZCBqb2JTZWxlY3RlZChJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKwkJSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIGpvYiA9IChJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24pIHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKKwkJSUZlYXR1cmUgZmVhdHVyZSA9IGpvYiAhPSBudWxsID8gam9iLmdldEZlYXR1cmUoKSA6IG51bGw7CisJCUlVUkxFbnRyeSBkZXNjRW50cnkgPSBmZWF0dXJlICE9IG51bGwgPyBmZWF0dXJlLmdldERlc2NyaXB0aW9uKCkgOiBudWxsOworCQlTdHJpbmcgZGVzYyA9IG51bGw7CisJCWlmIChkZXNjRW50cnkgIT0gbnVsbCkKKwkJCWRlc2MgPSBkZXNjRW50cnkuZ2V0QW5ub3RhdGlvbigpOworCQlpZiAoZGVzYyA9PSBudWxsKQorCQkJZGVzYyA9ICIiOyAvLyROT04tTkxTLTEkCisJCS8vZGVzY0xhYmVsLnNldFRleHQoVXBkYXRlTWFuYWdlclV0aWxzLmdldFdyaXRhYmxlWE1MU3RyaW5nKGRlc2MpKTsKKwkJdXBkYXRlRGVzY3JpcHRpb24oZGVzYyk7CisJCXByb3BlcnRpZXNCdXR0b24uc2V0RW5hYmxlZChmZWF0dXJlICE9IG51bGwpOworCQltb3JlSW5mb0J1dHRvbi5zZXRFbmFibGVkKGpvYiAhPSBudWxsICYmIGdldE1vcmVJbmZvVVJMKGpvYikgIT0gbnVsbCk7CisJfQorCQorCXByaXZhdGUgdm9pZCB1cGRhdGVEZXNjcmlwdGlvbihTdHJpbmcgdGV4dCkgeworCQlkZXNjTGFiZWwuZ2V0Rm9ybVRleHQoKS5zZXRUZXh0KFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRXcml0YWJsZVhNTFN0cmluZyh0ZXh0KSwgZmFsc2UsIHRydWUpOworCQlkZXNjTGFiZWwucmVmbG93KHRydWUpOworCX0KKwkKKwlwcml2YXRlIHZvaWQgcGFnZUNoYW5nZWQoKSB7CisJCXBhZ2VDaGFuZ2VkKHRoaXMuZ2V0U2VsZWN0ZWRKb2JzKCkpOworCX0KKwkKKwlwcml2YXRlIHZvaWQgcGFnZUNoYW5nZWQoIElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbltdIGpvYnNTZWxlY3RlZCkgeworCQorCQlpZiAoam9ic1NlbGVjdGVkLmxlbmd0aCA9PSAwKSB7CisJCQlsYXN0RGlzcGxheWVkU3RhdHVzID0gbnVsbDsKKwkJCXNldEVycm9yTWVzc2FnZShudWxsKTsKKwkJCXNldFBhZ2VDb21wbGV0ZShmYWxzZSk7CisJCQlzZXRWYWxpZGF0aW9uU3RhdHVzKG51bGwpOworCQkJcHJvYmxlbWF0aWNGZWF0dXJlcy5jbGVhcigpOworCQl9CisJCXRyZWVWaWV3ZXIuc2V0Q2hlY2tlZEVsZW1lbnRzKGpvYnNTZWxlY3RlZCk7CisJCS8vdmFsaWRhdGVTZWxlY3Rpb24oKTsKKyAgICAgICAgdHJlZVZpZXdlci5yZWZyZXNoKCk7CisgICAgICAgIHRyZWVWaWV3ZXIuc2V0Q2hlY2tlZEVsZW1lbnRzKGpvYnNTZWxlY3RlZCk7CisgICAgICAgIHVwZGF0ZUl0ZW1Db3VudCgpOworCX0KKwkKKwlwcml2YXRlIHZvaWQgc2V0VmFsaWRhdGlvblN0YXR1cyhJU3RhdHVzIG5ld1ZhbGlkYXRpb25TdGF0dXMpIHsKKwkJdGhpcy52YWxpZGF0aW9uU3RhdHVzID0gbmV3VmFsaWRhdGlvblN0YXR1czsKKwkJdXBkYXRlU3RhdHVzQnV0dG9uKCk7CisJfQorCQorCXByaXZhdGUgdm9pZCB1cGRhdGVTdGF0dXNCdXR0b24oKSB7CisJCXN0YXR1c0J1dHRvbi5nZXREaXNwbGF5KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgeworCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCWJvb2xlYW4gbmV3U3RhdGUgPSB2YWxpZGF0aW9uU3RhdHVzICE9IG51bGwgJiYgdmFsaWRhdGlvblN0YXR1cy5nZXRTZXZlcml0eSgpICE9IElTdGF0dXMuT0s7CisJCQkJc3RhdHVzQnV0dG9uLnNldEVuYWJsZWQobmV3U3RhdGUpOworCQkJfQorCQl9KTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIHVwZGF0ZUl0ZW1Db3VudCgpIHsKKwkJdXBkYXRlSXRlbUNvdW50KC0xLCAtMSk7CisJfQorCQorCXByaXZhdGUgaW50IGdldFNlbGVjdGVkSm9ic1VuaXF1ZUNvdW50KCkgeworCQlPYmplY3RbXSBjaGVja2VkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEpvYnMoKTsKKwkJU2V0IHNldCA9IG5ldyBIYXNoU2V0KCk7CisJCWZvciAoaW50IGk9MDsgaTxjaGVja2VkRWxlbWVudHMubGVuZ3RoOyBpKyspIHsKKwkJCUlJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiBqb2IgPSAoSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uKWNoZWNrZWRFbGVtZW50c1tpXTsKKwkJCUlGZWF0dXJlIGZlYXR1cmUgPSBqb2IuZ2V0RmVhdHVyZSgpOworCQkJaWYgKHNldC5jb250YWlucyhmZWF0dXJlKSkKKwkJCQljb250aW51ZTsKKwkJCXNldC5hZGQoZmVhdHVyZSk7CisJCX0KKwkJcmV0dXJuIHNldC5zaXplKCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHVwZGF0ZUl0ZW1Db3VudChpbnQgY2hlY2tlZENvdW50LCBpbnQgdG90YWxDb3VudCkgeworCQlpZiAoY2hlY2tlZENvdW50ID09IC0xKSB7CisJCQljaGVja2VkQ291bnQgPSBnZXRTZWxlY3RlZEpvYnNVbmlxdWVDb3VudCgpOworCQl9CisJCWlmICh0b3RhbENvdW50ID09IC0xKSB7CisJCQl0b3RhbENvdW50ID0gam9icy5zaXplKCk7CisJCX0KKwkJU3RyaW5nIHRvdGFsID0gIiIgKyB0b3RhbENvdW50OyAvLyROT04tTkxTLTEkCisJCVN0cmluZyBzZWxlY3RlZCA9ICIiICsgY2hlY2tlZENvdW50OyAvLyROT04tTkxTLTEkCisJCWNvdW50ZXJMYWJlbC5zZXRUZXh0KAorCQkJTkxTLmJpbmQoVXBkYXRlVUlNZXNzYWdlcy5JbnN0YWxsV2l6YXJkX1Jldmlld1BhZ2VfY291bnRlciwgKG5ldyBTdHJpbmdbXSB7IHNlbGVjdGVkLCB0b3RhbCB9KSkpOwkKKyAgICAgICAgY291bnRlckxhYmVsLmdldFBhcmVudCgpLmxheW91dCgpOworCX0KKworLy8JcHJpdmF0ZSB2b2lkIGhhbmRsZVNlbGVjdEFsbChib29sZWFuIHNlbGVjdCkgeworLy8JCXRyZWVWaWV3ZXIuc2V0QWxsQ2hlY2tlZChzZWxlY3QpOworLy8vLwkJIG1ha2Ugc3VyZSBtb2RlbCBpcyBsb2NhbCAoZG93bmxvYWQgdXNpbmcgcHJvZ3Jlc3MgbW9uaXRvciBmcm9tIGNvbnRhaW5lcikKKy8vCQlkb3dubG9hZEluY2x1ZGVkRmVhdHVyZXMoKTsgCisvLwkJCQorLy8JCXRyZWVWaWV3ZXIuZ2V0Q29udHJvbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgeworLy8JCQlwdWJsaWMgdm9pZCBydW4oKSB7CisvLwkJCQlwYWdlQ2hhbmdlZCgpOworLy8JCQl9CisvLwkJfSk7CisvLwl9CisKKy8vICBwcml2YXRlIHZvaWQgaGFuZGxlU2VsZWN0QWxsKGJvb2xlYW4gc2VsZWN0KSB7CisvLyAgdHJlZVZpZXdlci5zZXRBbGxDaGVja2VkKHNlbGVjdCk7CisvLy8vICAgICBtYWtlIHN1cmUgbW9kZWwgaXMgbG9jYWwgKGRvd25sb2FkIHVzaW5nIHByb2dyZXNzIG1vbml0b3IgZnJvbSBjb250YWluZXIpCisvLyAgZG93bmxvYWRJbmNsdWRlZEZlYXR1cmVzKCk7IAorLy8gICAgICAKKy8vICB0cmVlVmlld2VyLmdldENvbnRyb2woKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKKy8vICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworLy8gICAgICAgICAgcGFnZUNoYW5nZWQoKTsKKy8vICAgICAgfQorLy8gIH0pOworLy99CisKKyAgIHByaXZhdGUgdm9pZCBoYW5kbGVEZXNlbGVjdEFsbCgpIHsKKyAgICAgICAgLy90cmVlVmlld2VyLnNldENoZWNrZWRFbGVtZW50cyhuZXcgT2JqZWN0WzBdKTsKKyAgICAgICAgIElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbltdIHNlbGVjdGVkSm9icyA9IGdldFNlbGVjdGVkSm9icygpOworICAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBzZWxlY3RlZEpvYnMubGVuZ3RoOyBpKyspCisgICAgICAgIAkgdHJlZVZpZXdlci5zZXRDaGVja2VkKCBzZWxlY3RlZEpvYnNbaV0sIGZhbHNlKTsKKyAgICAgICAgLy8gbWFrZSBzdXJlIG1vZGVsIGlzIGxvY2FsIChkb3dubG9hZCB1c2luZyBwcm9ncmVzcyBtb25pdG9yIGZyb20KKyAgICAgICAgLy8gY29udGFpbmVyKQorLy8gICAgICAgIGRvd25sb2FkSW5jbHVkZWRGZWF0dXJlcygpOworCisgICAgICAgIHRyZWVWaWV3ZXIuZ2V0Q29udHJvbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIHBhZ2VDaGFuZ2VkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworfQorICAgIAorCXByaXZhdGUgdm9pZCBoYW5kbGVQcm9wZXJ0aWVzKCkgeworCQlmaW5hbCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPQorCQkJKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0cmVlVmlld2VyLmdldFNlbGVjdGlvbigpOworCisJCWZpbmFsIElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiBqb2IgPQorCQkJKElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbikgc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOworCQlpZiAocHJvcGVydGllc0FjdGlvbiA9PSBudWxsKSB7CisJCQlwcm9wZXJ0aWVzQWN0aW9uID0KKwkJCQluZXcgRmVhdHVyZVByb3BlcnR5RGlhbG9nQWN0aW9uKGdldFNoZWxsKCksIHRyZWVWaWV3ZXIpOworCQl9CisKKwkJQnVzeUluZGljYXRvcgorCQkJLnNob3dXaGlsZSh0cmVlVmlld2VyLmdldENvbnRyb2woKS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKKwkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQlTaW1wbGVGZWF0dXJlQWRhcHRlciBhZGFwdGVyID0KKwkJCQkJbmV3IFNpbXBsZUZlYXR1cmVBZGFwdGVyKGpvYi5nZXRGZWF0dXJlKCkpOworCQkJCXByb3BlcnRpZXNBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZCgKKwkJCQkJbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oYWRhcHRlcikpOworCQkJCXByb3BlcnRpZXNBY3Rpb24ucnVuKCk7CisJCQl9CisJCX0pOworCX0KKworCXByaXZhdGUgU3RyaW5nIGdldE1vcmVJbmZvVVJMKElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiBqb2IpIHsKKwkJSVVSTEVudHJ5IGRlc2MgPSBqb2IuZ2V0RmVhdHVyZSgpLmdldERlc2NyaXB0aW9uKCk7CisJCWlmIChkZXNjICE9IG51bGwpIHsKKwkJCVVSTCB1cmwgPSBkZXNjLmdldFVSTCgpOworCQkJcmV0dXJuICh1cmwgPT0gbnVsbCkgPyBudWxsIDogdXJsLnRvU3RyaW5nKCk7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHJpdmF0ZSB2b2lkIGhhbmRsZU1vcmVJbmZvKCkgeworCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPQorCQkJKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0cmVlVmlld2VyLmdldFNlbGVjdGlvbigpOworCQlmaW5hbCBJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gc2VsZWN0ZWRKb2IgPQorCQkJKElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbikgc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOworCQlCdXN5SW5kaWNhdG9yCisJCQkuc2hvd1doaWxlKHRyZWVWaWV3ZXIuZ2V0Q29udHJvbCgpLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgeworCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCVN0cmluZyB1cmxOYW1lID0gZ2V0TW9yZUluZm9VUkwoc2VsZWN0ZWRKb2IpOworCQkJCVVwZGF0ZVVJLnNob3dVUkwodXJsTmFtZSk7CisJCQl9CisJCX0pOworCX0KKworCXByaXZhdGUgSVN0YXR1cyBzZWxlY3RSZXF1aXJlZEZlYXR1cmVzKCkgeworCQkKKwkJSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uW10gam9icyA9IGdldFNlbGVjdGVkSm9icygpOworCQlSZXF1aXJlZEZlYXR1cmVzUmVzdWx0IHJlcXVpcmVkRmVhdHVyZXNSZXN1bHQgPSAoKE9wZXJhdGlvblZhbGlkYXRvcilPcGVyYXRpb25zTWFuYWdlcgorCQkJCS5nZXRWYWxpZGF0b3IoKSkuZ2V0UmVxdWlyZWRGZWF0dXJlcyhqb2JzKTsKKwkJc2V0VmFsaWRhdGlvblN0YXR1cyhyZXF1aXJlZEZlYXR1cmVzUmVzdWx0LmdldFN0YXR1cygpKTsKKwkJU2V0IHJlcXVpcmVkRmVhdHVyZXMgPSByZXF1aXJlZEZlYXR1cmVzUmVzdWx0LmdldFJlcXVpcmVkRmVhdHVyZXMoKTsKKwkJcHJvYmxlbWF0aWNGZWF0dXJlcy5jbGVhcigpOworCQkKKwkJSXRlcmF0b3IgcmVxdWlyZWRGZWF0dXJlc0l0ZXJhdG9yID0gcmVxdWlyZWRGZWF0dXJlcy5pdGVyYXRvcigpOworCQlBcnJheUxpc3QgdG9CZUluc3RhbGxlZCA9IG5ldyBBcnJheUxpc3QoKTsKKwkJCisJCXdoaWxlIChyZXF1aXJlZEZlYXR1cmVzSXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQlJSW1wb3J0IHJlcXVpcmVkRmVhdHVyZSA9ICgoSW50ZXJuYWxJbXBvcnQpcmVxdWlyZWRGZWF0dXJlc0l0ZXJhdG9yLm5leHQoKSkuZ2V0SW1wb3J0KCk7CisKKwkJCUlJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiBjdXJyZW50RmVhdHVyZVNlbGVjdGVkID0gbnVsbDsKKwkJCVRyZWVJdGVtW10gaXRlbXMgPSB0cmVlVmlld2VyLmdldFRyZWUoKS5nZXRJdGVtcygpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgeworCQkJCVRyZWVJdGVtW10gc2l0ZVJvb3RDb250ZW50ID0gaXRlbXNbaV0uZ2V0SXRlbXMoKTsKKwkJCQlmb3IgKGludCBqID0gMDsgaiA8IHNpdGVSb290Q29udGVudC5sZW5ndGg7IGorKykgeworCQkJCQlpZiAoc2l0ZVJvb3RDb250ZW50W2pdLmdldERhdGEoKSBpbnN0YW5jZW9mIFNpdGVDYXRlZ29yeSkgeworCQkJCQkJCisJCQkJCQlpZiAoICF0cmVlVmlld2VyLmdldENoZWNrZWQoc2l0ZVJvb3RDb250ZW50W2pdLmdldERhdGEoKSkpIHsKKwkJCQkJCQkvLyB0aGlzIGNhdGVnb3J5IGhhcyBub3QgYmVlbiBjaGVja2VkIGF0IGFsbCBzbyB3ZSBoYXZlIHRvIGNyZWF0ZSBpdHMgZmVhdHVyZXMKKwkJCQkJCQl0cmVlVmlld2VyLmNyZWF0ZUNoaWxkcmVuKHNpdGVSb290Q29udGVudFtqXSk7CisJCQkJCQl9CisJCQkJCQlUcmVlSXRlbVtdIGZlYXR1cmVzID0gc2l0ZVJvb3RDb250ZW50W2pdLmdldEl0ZW1zKCk7CisJCQkJCQlpZiAoKGZlYXR1cmVzLmxlbmd0aCA+IDApICYmIChmZWF0dXJlc1swXS5nZXREYXRhKCkgPT0gbnVsbCkpIHsKKwkJCQkJCQkvLyB0aGlzIGNhdGVnb3J5IGhhcyBiZWVuIGNoZWNrZWQgYnV0IG5vdCB2aXNpdGVkIHlldCBzbyByZXN0b3JlIHRoZSBmZWF0dXJlcyBpbiBpdAorCQkJCQkJCXRyZWVWaWV3ZXIuY3JlYXRlQ2hpbGRyZW4oc2l0ZVJvb3RDb250ZW50W2pdKTsKKwkJCQkJCQl0cmVlVmlld2VyLnVwZGF0ZUNoaWxkcmVuSXRlbXMoc2l0ZVJvb3RDb250ZW50W2pdKTsKKwkJCQkJCQlmZWF0dXJlcyA9IHNpdGVSb290Q29udGVudFtqXS5nZXRJdGVtcygpOworCQkJCQkJfQorCQkJCQkJCisJCQkJCQlmb3IgKGludCBrID0gMDsgayA8IGZlYXR1cmVzLmxlbmd0aDsgaysrKSB7CisJCQkJCQkJY3VycmVudEZlYXR1cmVTZWxlY3RlZCA9IGRlY2lkZU9uRmVhdHVyZVNlbGVjdGlvbigKKwkJCQkJCQkJCXJlcXVpcmVkRmVhdHVyZSwKKwkJCQkJCQkJCShJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24pIGZlYXR1cmVzW2tdCisJCQkJCQkJCQkJCS5nZXREYXRhKCksIGN1cnJlbnRGZWF0dXJlU2VsZWN0ZWQpOworCQkJCQkJfQorCQkJCQl9IGVsc2UgaWYgKHNpdGVSb290Q29udGVudFtqXS5nZXREYXRhKCkgaW5zdGFuY2VvZiBJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24pIHsKKwkJCQkJCWN1cnJlbnRGZWF0dXJlU2VsZWN0ZWQgPSBkZWNpZGVPbkZlYXR1cmVTZWxlY3Rpb24oCisJCQkJCQkJCXJlcXVpcmVkRmVhdHVyZSwKKwkJCQkJCQkJKElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbikgc2l0ZVJvb3RDb250ZW50W2pdCisJCQkJCQkJCQkJLmdldERhdGEoKSwgY3VycmVudEZlYXR1cmVTZWxlY3RlZCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCWlmIChjdXJyZW50RmVhdHVyZVNlbGVjdGVkICE9IG51bGwpCisJCQkJdG9CZUluc3RhbGxlZC5hZGQoY3VycmVudEZlYXR1cmVTZWxlY3RlZCk7CisJCX0KKworCQlpZiAoIXRvQmVJbnN0YWxsZWQuaXNFbXB0eSgpKSB7CisJCQlJdGVyYXRvciB0b0JlSW5zdGFsbGVkSXRlcmF0b3IgPSB0b0JlSW5zdGFsbGVkLml0ZXJhdG9yKCk7CisJCQl3aGlsZSAodG9CZUluc3RhbGxlZEl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJCUlJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiBjdXJyZW50ID0gKElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbil0b0JlSW5zdGFsbGVkSXRlcmF0b3IubmV4dCgpOworCQkJCXRyZWVWaWV3ZXIuc2V0Q2hlY2tlZChjdXJyZW50LCB0cnVlKTsJCQkKKwkJCX0KKwkJCXJldHVybiBzZWxlY3RSZXF1aXJlZEZlYXR1cmVzKCk7CisJCX0gZWxzZSB7CisJCQlwcm9ibGVtYXRpY0ZlYXR1cmVzLmNsZWFyKCk7CisJCQlpZiAodmFsaWRhdGlvblN0YXR1cyAhPSBudWxsKSB7CisJCQkJSVN0YXR1c1tdIHN0YXR1cyA9IHZhbGlkYXRpb25TdGF0dXMuZ2V0Q2hpbGRyZW4oKTsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IHN0YXR1cy5sZW5ndGg7IGkrKykgeworCQkJCQlJU3RhdHVzIHNpbmdsZVN0YXR1cyA9IHN0YXR1c1tpXTsKKwkJCQkJaWYgKGlzU3BlY2lmaWNTdGF0dXMoc2luZ2xlU3RhdHVzKSkgeworCQkJCQkJSUZlYXR1cmUgZiA9ICgoRmVhdHVyZVN0YXR1cykgc2luZ2xlU3RhdHVzKQorCQkJCQkJCQkuZ2V0RmVhdHVyZSgpOworCQkJCQkJcHJvYmxlbWF0aWNGZWF0dXJlcy5hZGQoZik7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCXNldFBhZ2VDb21wbGV0ZSh2YWxpZGF0aW9uU3RhdHVzID09IG51bGwKKwkJCQkJfHwgdmFsaWRhdGlvblN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuV0FSTklORyk7CisKKwkJCWxhc3REaXNwbGF5ZWRTdGF0dXMgPSBudWxsOworCQkJdXBkYXRlV2l6YXJkTWVzc2FnZSgpOworCQkJCisJCQl0cmVlVmlld2VyLnVwZGF0ZShnZXRTZWxlY3RlZEpvYnMoKSwgbnVsbCk7CisJCQlyZXR1cm4gdmFsaWRhdGlvblN0YXR1czsKKwkJfQorCX0KKworCXB1YmxpYyBJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb25bXSBnZXRTZWxlY3RlZEpvYnMoKSB7ICAgICAgCisgICAgICAgIE9iamVjdFtdIHNlbGVjdGVkID0gdHJlZVZpZXdlci5nZXRDaGVja2VkRWxlbWVudHMoKTsKKyAgICAgICAgQXJyYXlMaXN0IHNlbGVjdGVkSm9icyA9IG5ldyBBcnJheUxpc3Qoc2VsZWN0ZWQubGVuZ3RoKTsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPHNlbGVjdGVkLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgaWYgKHNlbGVjdGVkW2ldIGluc3RhbmNlb2YgSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uKQorICAgICAgICAgICAgICAgIHNlbGVjdGVkSm9icy5hZGQoc2VsZWN0ZWRbaV0pOworICAgICAgICByZXR1cm4gKElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbltdKXNlbGVjdGVkSm9icy50b0FycmF5KG5ldyBJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb25bc2VsZWN0ZWRKb2JzLnNpemUoKV0pOworCX0KKwkKKwlwdWJsaWMgdm9pZCB2YWxpZGF0ZVNlbGVjdGlvbihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKwkJSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uW10gam9iczsKKworCQlmaW5hbCBJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb25bXVtdIGJhZyA9IG5ldyBJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb25bMV1bXTsKKwkJdHJlZVZpZXdlci5nZXRDb250cm9sKCkuZ2V0RGlzcGxheSgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKKwkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQliYWdbMF0gPSBnZXRTZWxlY3RlZEpvYnMoKTsKKwkJCX0KKwkJfSk7CisJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgcmV0dXJuOworCQlqb2JzID0gYmFnWzBdOworCQlzZXRWYWxpZGF0aW9uU3RhdHVzKE9wZXJhdGlvbnNNYW5hZ2VyLmdldFZhbGlkYXRvcigpCisJCQkJLnZhbGlkYXRlUGVuZGluZ0NoYW5nZXMoam9icykpOworCQlwcm9ibGVtYXRpY0ZlYXR1cmVzLmNsZWFyKCk7CisJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgcmV0dXJuOworCQlpZiAodmFsaWRhdGlvblN0YXR1cyAhPSBudWxsKSB7CisJCQlJU3RhdHVzW10gc3RhdHVzID0gdmFsaWRhdGlvblN0YXR1cy5nZXRDaGlsZHJlbigpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdGF0dXMubGVuZ3RoOyBpKyspIHsKKwkJCQlJU3RhdHVzIHNpbmdsZVN0YXR1cyA9IHN0YXR1c1tpXTsKKwkJCQlpZiAoaXNTcGVjaWZpY1N0YXR1cyhzaW5nbGVTdGF0dXMpKSB7CisJCQkJCUlGZWF0dXJlIGYgPSAoKEZlYXR1cmVTdGF0dXMpIHNpbmdsZVN0YXR1cykuZ2V0RmVhdHVyZSgpOworCQkJCQlwcm9ibGVtYXRpY0ZlYXR1cmVzLmFkZChmKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQorCQkJCXJldHVybjsKKwkJdHJlZVZpZXdlci5nZXRDb250cm9sKCkuZ2V0RGlzcGxheSgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKKwkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQlzZXRQYWdlQ29tcGxldGUodmFsaWRhdGlvblN0YXR1cyA9PSBudWxsCisJCQkJCQl8fCB2YWxpZGF0aW9uU3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5XQVJOSU5HKTsKKy8qCisJCQkJc3RhdHVzQnV0dG9uLnNldEVuYWJsZWQodmFsaWRhdGlvblN0YXR1cyAhPSBudWxsCisJCQkJCQkmJiB2YWxpZGF0aW9uU3RhdHVzLmdldFNldmVyaXR5KCkgIT0gSVN0YXR1cy5PSyk7CisJCQkJCQkqLworCisJCQkJdXBkYXRlV2l6YXJkTWVzc2FnZSgpOworCQkJfQorCQl9KTsKKwl9CisKKwlwcml2YXRlIHZvaWQgc2hvd1N0YXR1cygpIHsKKwkJaWYgKHZhbGlkYXRpb25TdGF0dXMgIT0gbnVsbCkgeworCQkJbmV3IFN0YXR1c0RpYWxvZygpLm9wZW4oKTsKKwkJfQorCisJfQorCS8qKgorCSAqIENoZWNrIHdoZXRoZXIgc3RhdHVzIGlzIHJlbGV2YW50IHRvIHNob3cgZm9yCisJICogYSBzcGVjaWZpYyBmZWF0dXJlIG9yIGlzIGEgb3RoZXIgcHJvYmxlbQorCSAqIEBwYXJhbSBzdGF0dXMKKwkgKiBAcmV0dXJuIHRydWUgaWYgc3RhdHVzIGlzIEZlYXR1cmVTdGF0dXMgd2l0aAorCSAqIHNwZWNpZmllZCBmZWF0dXJlIGFuZCBjZXJ0YWluIGVycm9yIGNvZGVzCisJICovCisJcHJpdmF0ZSBib29sZWFuIGlzU3BlY2lmaWNTdGF0dXMoSVN0YXR1cyBzdGF0dXMpeworCQlpZighKHN0YXR1cyBpbnN0YW5jZW9mIEZlYXR1cmVTdGF0dXMpKXsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlpZihzdGF0dXMuZ2V0U2V2ZXJpdHkoKSE9SVN0YXR1cy5FUlJPUil7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJRmVhdHVyZVN0YXR1cyBmZWF0dXJlU3RhdHVzID0gKEZlYXR1cmVTdGF0dXMpIHN0YXR1czsKKwkJaWYoZmVhdHVyZVN0YXR1cy5nZXRGZWF0dXJlKCk9PW51bGwpeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCXJldHVybiAwIT0gKGZlYXR1cmVTdGF0dXMuZ2V0Q29kZSgpCisJCQkJJiBGZWF0dXJlU3RhdHVzLkNPREVfQ1lDTEUKKwkJCQkrIEZlYXR1cmVTdGF0dXMuQ09ERV9FTlZJUk9OTUVOVAorCQkJCSsgRmVhdHVyZVN0YXR1cy5DT0RFX0VYQ0xVU0lWRQorCQkJCSsgRmVhdHVyZVN0YXR1cy5DT0RFX09QVElPTkFMX0NISUxECisJCQkJKyBGZWF0dXJlU3RhdHVzLkNPREVfUFJFUkVRX0ZFQVRVUkUKKwkJCQkrIEZlYXR1cmVTdGF0dXMuQ09ERV9QUkVSRVFfUExVR0lOKTsKKwl9CisJLyoqCisJICogVXBkYXRlIHN0YXR1cyBpbiB0aGUgd2l6YXJkIHN0YXR1cyBhcmVhCisJICovCisJcHJpdmF0ZSB2b2lkIHVwZGF0ZVdpemFyZE1lc3NhZ2UoKSB7CisJCQorCQlpZiAodmFsaWRhdGlvblN0YXR1cyA9PSBudWxsKSB7CisJCQlsYXN0RGlzcGxheWVkU3RhdHVzPW51bGw7CisJCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7CisJCX0gZWxzZSBpZiAodmFsaWRhdGlvblN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuV0FSTklORykgeworCQkJbGFzdERpc3BsYXllZFN0YXR1cz1udWxsOworCQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOworCQkJc2V0TWVzc2FnZSh2YWxpZGF0aW9uU3RhdHVzLmdldE1lc3NhZ2UoKSwgSU1lc3NhZ2VQcm92aWRlci5XQVJOSU5HKTsKKwkJfSBlbHNlIHsKKwkJCS8vIDEuICBGZWF0dXJlIHNlbGVjdGVkLCBjcmVhdGluZyBhIHByb2JsZW0gZm9yIGl0LCBzaG93IHN0YXR1cyBmb3IgaXQKKwkJCWlmKG5ld2x5U2VsZWN0ZWRGZWF0dXJlICE9bnVsbCl7CisJCQkJSVN0YXR1c1tdIHN0YXR1cyA9IHZhbGlkYXRpb25TdGF0dXMuZ2V0Q2hpbGRyZW4oKTsKKwkJCQlmb3IoaW50IHMgPTA7IHM8IHN0YXR1cy5sZW5ndGg7IHMrKyl7CisJCQkJCWlmKGlzU3BlY2lmaWNTdGF0dXMoc3RhdHVzW3NdKSl7CisJCQkJCQlGZWF0dXJlU3RhdHVzIGZlYXR1cmVTdGF0dXMgPSAoRmVhdHVyZVN0YXR1cylzdGF0dXNbc107CisJCQkJCQlpZihuZXdseVNlbGVjdGVkRmVhdHVyZS5lcXVhbHMoZmVhdHVyZVN0YXR1cy5nZXRGZWF0dXJlKCkpKXsKKwkJCQkJCQlsYXN0RGlzcGxheWVkU3RhdHVzPWZlYXR1cmVTdGF0dXM7CisJCQkJCQkJc2V0RXJyb3JNZXNzYWdlKGZlYXR1cmVTdGF0dXMuZ2V0TWVzc2FnZSgpKTsKKwkJCQkJCQlyZXR1cm47CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQkKKwkJCS8vIDIuICBzaG93IG9sZCBzdGF0dXMgaWYgcG9zc2libGUgKGl0IGlzIHN0aWxsIHZhbGlkKQorCQkJaWYobGFzdERpc3BsYXllZFN0YXR1cyAhPW51bGwpeworCQkJCUlTdGF0dXNbXSBzdGF0dXMgPSB2YWxpZGF0aW9uU3RhdHVzLmdldENoaWxkcmVuKCk7CisJCQkJZm9yKGludCBpPTA7IGk8c3RhdHVzLmxlbmd0aDsgaSsrKXsKKwkJCQkJaWYobGFzdERpc3BsYXllZFN0YXR1cy5lcXVhbHMoc3RhdHVzW2ldKSl7CisJCQkJCQkvL2xhc3REaXNwbGF5ZWRTdGF0dXM9bGFzdERpc3BsYXllZFN0YXR1czsKKwkJCQkJCS8vc2V0RXJyb3JNZXNzYWdlKHN0YXR1c1tpXS5nZXRNZXNzYWdlKCkpOworCQkJCQkJcmV0dXJuOworCQkJCQl9CisJCQkJfQorCQkJCWxhc3REaXNwbGF5ZWRTdGF0dXMgPSBudWxsOworCQkJfQorCQkJCisJCQkvLyAzLiAgcGljayB0aGUgZmlyc3QgcHJvYmxlbSB0aGF0IGlzIHNwZWNpZmljIHRvIHNvbWUgZmVhdHVyZQorCQkJSVN0YXR1c1tdIHN0YXR1cyA9IHZhbGlkYXRpb25TdGF0dXMuZ2V0Q2hpbGRyZW4oKTsKKwkJCWZvcihpbnQgcyA9MDsgczwgc3RhdHVzLmxlbmd0aDsgcysrKXsKKwkJCQlpZihpc1NwZWNpZmljU3RhdHVzKHN0YXR1c1tzXSkpeworCQkJCQlsYXN0RGlzcGxheWVkU3RhdHVzID0gKEZlYXR1cmVTdGF0dXMpc3RhdHVzW3NdOworCQkJCQlzZXRFcnJvck1lc3NhZ2Uoc3RhdHVzW3NdLmdldE1lc3NhZ2UoKSk7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9CisJCQkJCisJCQkvLyA0LiAgZGlzcGxheSB0aGUgZmlyc3QgcHJvYmxlbSAobm8gcHJvYmxlbXMgc3BlY2lmeSBhIGZlYXR1cmUpCisJCQlpZihzdGF0dXMubGVuZ3RoPjApeworCQkJCUlTdGF0dXMgc2luZ2xlU3RhdHVzPXN0YXR1c1swXTsKKwkJCQlzZXRFcnJvck1lc3NhZ2Uoc2luZ2xlU3RhdHVzLmdldE1lc3NhZ2UoKSk7CisJCQl9ZWxzZXsKKwkJCS8vIDUuIG5vdCBtdWx0aSBvciBlbXB0eSBtdWx0aSBzdGF0dXMKKwkJCQlzZXRFcnJvck1lc3NhZ2UoVXBkYXRlVUlNZXNzYWdlcy5JbnN0YWxsV2l6YXJkX1Jldmlld1BhZ2VfaW52YWxpZF9sb25nKTsgCisJCQl9CisJCX0KKwl9CisKKwljbGFzcyBTdGF0dXNEaWFsb2cgZXh0ZW5kcyBFcnJvckRpYWxvZyB7CisvLwkJQnV0dG9uIGRldGFpbHNCdXR0b247CisJCXB1YmxpYyBTdGF0dXNEaWFsb2coKSB7CisJCQlzdXBlcihnZXRDb250YWluZXIoKS5nZXRTaGVsbCgpLCBVcGRhdGVVSU1lc3NhZ2VzLkluc3RhbGxXaXphcmRfUmV2aWV3UGFnZV9pbnZhbGlkX3Nob3J0LCBudWxsLCAKKwkJCQkJdmFsaWRhdGlvblN0YXR1cywgSVN0YXR1cy5PSyB8IElTdGF0dXMuSU5GTworCQkJCQkJCXwgSVN0YXR1cy5XQVJOSU5HIHwgSVN0YXR1cy5FUlJPUik7CisJCX0KKy8vCQlwcm90ZWN0ZWQgQnV0dG9uIGNyZWF0ZUJ1dHRvbigKKy8vCQkJCUNvbXBvc2l0ZSBwYXJlbnQsCisvLwkJCQlpbnQgaWQsCisvLwkJCQlTdHJpbmcgbGFiZWwsCisvLwkJCQlib29sZWFuIGRlZmF1bHRCdXR0b24pIHsKKy8vCQkJQnV0dG9uIGIgPSBzdXBlci5jcmVhdGVCdXR0b24ocGFyZW50LCBpZCwgbGFiZWwsIGRlZmF1bHRCdXR0b24pOworLy8JCQlpZihJRGlhbG9nQ29uc3RhbnRzLkRFVEFJTFNfSUQgPT0gaWQpeworLy8JCQkJZGV0YWlsc0J1dHRvbiA9IGI7CisvLwkJCX0KKy8vCQkJcmV0dXJuIGI7CisvLwkJfQorCQlwdWJsaWMgdm9pZCBjcmVhdGUoKSB7CisJCQlzdXBlci5jcmVhdGUoKTsKKwkJCWJ1dHRvblByZXNzZWQoSURpYWxvZ0NvbnN0YW50cy5ERVRBSUxTX0lEKTsKKy8vCQkJaWYoZGV0YWlsc0J1dHRvbiE9bnVsbCl7CisvLwkJCQlkZXRhaWxzQnV0dG9uLmRpc3Bvc2UoKTsKKy8vCQkJfQorCQl9CisJfQorCisJLyoqCisJICogQHJldHVybiB0cnVlLCBpZiBjb21wbGV0ZWQsIGZhbHNlIGlmIGNhbmNlbGVkIGJ5IHRoZSB1c2VyCisJICovCisJcHJpdmF0ZSBib29sZWFuIGRvd25sb2FkSW5jbHVkZWRGZWF0dXJlcygpIHsKKwkJdHJ5IHsKKwkJCURvd25sb2FkZXIgZG93bmxvYWRlciA9IG5ldyBEb3dubG9hZGVyKGpvYnMpOworCQkJZ2V0Q29udGFpbmVyKCkucnVuKHRydWUsIHRydWUsIGRvd25sb2FkZXIpOworCQkJcmV0dXJuICFkb3dubG9hZGVyLmlzQ2FuY2VsZWQoKTsKKwkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBpdGUpIHsKKwkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisJLyoqCisJICogUnVubmFibGUgdG8gcmVzb2x2ZSBpbmNsdWRlZCBmZWF0dXJlIHJlZmVyZW5jZXMuCisJICovCisJY2xhc3MgRG93bmxvYWRlciBpbXBsZW1lbnRzIElSdW5uYWJsZVdpdGhQcm9ncmVzcyB7CisJCWJvb2xlYW4gY2FuY2VsZWQgPSBmYWxzZTsKKwkJLyoqCisJCSAqIExpc3Qgb2YgSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uCisJCSAqLworCQlBcnJheUxpc3Qgb3BlcmF0aW9uczsKKwkJcHVibGljIERvd25sb2FkZXIoQXJyYXlMaXN0IGluc3RhbGxPcGVyYXRpb25zKSB7CisJCQlvcGVyYXRpb25zID0gaW5zdGFsbE9wZXJhdGlvbnM7CisJCX0KKwkJcHVibGljIGJvb2xlYW4gaXNDYW5jZWxlZCgpIHsKKwkJCXJldHVybiBjYW5jZWxlZDsKKwkJfQorCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQorCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IG9wZXJhdGlvbnMuc2l6ZSgpOyBpKyspIHsKKwkJCQlJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gY2FuZGlkYXRlID0gKElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbikgb3BlcmF0aW9ucworCQkJCQkJLmdldChpKTsKKwkJCQlJRmVhdHVyZSBmZWF0dXJlID0gY2FuZGlkYXRlLmdldEZlYXR1cmUoKTsKKwkJCQl0cnkgeworCQkJCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGlyZWZzID0gZmVhdHVyZQorCQkJCQkJCS5nZXRSYXdJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCk7CisJCQkJCWZvciAoaW50IGYgPSAwOyBmIDwgaXJlZnMubGVuZ3RoOyBmKyspIHsKKwkJCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgeworCQkJCQkJCWNhbmNlbGVkID0gdHJ1ZTsKKwkJCQkJCQlyZXR1cm47CisJCQkJCQl9CisJCQkJCQlJRmVhdHVyZVJlZmVyZW5jZSBpcmVmID0gaXJlZnNbZl07CisJCQkJCQlpcmVmLmdldEZlYXR1cmUobW9uaXRvcik7CisJCQkJCX0KKwkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCQl9CisJCQl9CisJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKKwkJCQljYW5jZWxlZCA9IHRydWU7CisJCQl9CisJCX0KKwl9CisgICAgCisgICAgcHJpdmF0ZSBJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gZmluZEpvYihGZWF0dXJlUmVmZXJlbmNlQWRhcHRlciBmZWF0dXJlKQorICAgICAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24geworICAgICAgICBpZiAoam9icyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgam9icy5zaXplKCk7IGkrKykKKyAgICAgICAgICAgIGlmICgoKElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbikgam9icy5nZXQoaSkpLmdldEZlYXR1cmUoKQorICAgICAgICAgICAgICAgICAgICAuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmVxdWFscyhmZWF0dXJlLmdldEZlYXR1cmVSZWZlcmVuY2UoKQorICAgICAgICAgICAgICAgICAgICAuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbikgam9icy5nZXQoaSk7CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgT2JqZWN0IGdldFNpdGUoT2JqZWN0IG9iamVjdCkgeworICAgICAgICBJVHJlZUNvbnRlbnRQcm92aWRlciBwcm92aWRlciA9IChJVHJlZUNvbnRlbnRQcm92aWRlcil0cmVlVmlld2VyLmdldENvbnRlbnRQcm92aWRlcigpOworICAgICAgICB3aGlsZSAob2JqZWN0ICE9IG51bGwgJiYgIShvYmplY3QgaW5zdGFuY2VvZiBTaXRlQm9va21hcmspKSB7CisgICAgICAgICAgICBvYmplY3QgPSBwcm92aWRlci5nZXRQYXJlbnQob2JqZWN0KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gb2JqZWN0OworICAgIH0KKyAgICAKKwlwcml2YXRlIHZvaWQgY29sbGVjdERlc2NlbmRhbnRzKE9iamVjdCByb290LCBBcnJheUxpc3QgbGlzdCwKKwkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgeworCQlJVHJlZUNvbnRlbnRQcm92aWRlciBwcm92aWRlciA9IChJVHJlZUNvbnRlbnRQcm92aWRlcikgdHJlZVZpZXdlcgorCQkJCS5nZXRDb250ZW50UHJvdmlkZXIoKTsKKwkJT2JqZWN0W10gY2hpbGRyZW4gPSBwcm92aWRlci5nZXRDaGlsZHJlbihyb290KTsKKwkJaWYgKGNoaWxkcmVuICE9IG51bGwgJiYgY2hpbGRyZW4ubGVuZ3RoID4gMCkKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKKwkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCisJCQkJCXJldHVybjsKKwkJCQlsaXN0LmFkZChjaGlsZHJlbltpXSk7CisJCQkJY29sbGVjdERlc2NlbmRhbnRzKGNoaWxkcmVuW2ldLCBsaXN0LCBtb25pdG9yKTsKKwkJCX0KKwl9CisKKwkKKwlwdWJsaWMgYm9vbGVhbiBpc0ZlYXR1cmVHb29kKElJbXBvcnQgcmVxdWlyZWRGZWF0dXJlLCBJRmVhdHVyZSBmZWF0dXJlKSB7CisJCXJldHVybiBpc0ZlYXR1cmVHb29kKHJlcXVpcmVkRmVhdHVyZSwgZmVhdHVyZSwgbmV3IEFycmF5TGlzdCgpKTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gaXNGZWF0dXJlR29vZChJSW1wb3J0IHByZXJlcSwgSUZlYXR1cmUgZmVhdHVyZSwgTGlzdCB2aXNpdGVkRmVhdHVyZXMpIHsKKworCQlpZiAocHJlcmVxLmdldEtpbmQoKSA9PSBJSW1wb3J0LktJTkRfRkVBVFVSRSkgeyAKKwkJCWlmICgoIXByZXJlcS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0SWRlbnRpZmllcigpLmVxdWFscygKKwkJCQkJZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0SWRlbnRpZmllcigpKSkpIHsKKwkJCQlJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlW10gaWlmciA9IG51bGw7CisJCQkJdHJ5IHsKKwkJCQkJaWlmciA9IGZlYXR1cmUuZ2V0SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpOworCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJCQlVcGRhdGVVSS5sb2dFeGNlcHRpb24oZSk7CisJCQkJCS8vCWlmIHdlIGNhbiBub3QgZ2V0IGluY2x1ZGVkIGZlYXR1cmVzIHRoZW4gdGhleSBjYW4gbm90IHNhdGlzZnkgcmVxdWlyZW1lbnQsIHNvIGp1c3QgaWdub3JlIHRoZW0KKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJCQlpZiAoaWlmciA9PSBudWxsKSB7CisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisJCQkJCisJCQkJZm9yKGludCBpID0gMDsgaSA8IGlpZnIubGVuZ3RoOyBpKyspIHsKKwkJCQkJSUZlYXR1cmUgY3VycmVudDsKKwkJCQkJdHJ5IHsKKwkJCQkJCWN1cnJlbnQgPSBVcGRhdGVVdGlscy5nZXRJbmNsdWRlZEZlYXR1cmUoZmVhdHVyZSwgaWlmcltpXSk7CisJCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJCQkJLy8gaWYgd2UgY2FuIG5vdCBnZXQgZmVhdHVyZSB0aGVuIGl0IGNhbiBub3Qgc2F0aXNmeSByZXF1aXJlbWVudCwgc28ganVzdCBpZ25vcmUgaXQKKwkJCQkJCVVwZGF0ZVVJLmxvZ0V4Y2VwdGlvbihlKTsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisJCQkJCWlmICghdmlzaXRlZEZlYXR1cmVzLmNvbnRhaW5zKGN1cnJlbnQpKSB7CisJCQkJCQl2aXNpdGVkRmVhdHVyZXMuYWRkKGN1cnJlbnQpOworCQkJCQkJaWYgKGlzRmVhdHVyZUdvb2QocHJlcmVxLCBjdXJyZW50LCB2aXNpdGVkRmVhdHVyZXMpKSB7CisJCQkJCQkJcmV0dXJuIHRydWU7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJCisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCisJCQlpbnQgcnVsZSA9IChwcmVyZXEuZ2V0UnVsZSgpICE9IElJbXBvcnQuUlVMRV9OT05FKSA/IHByZXJlcS5nZXRSdWxlKCkgOiBJSW1wb3J0LlJVTEVfQ09NUEFUSUJMRTsKKworCQkJc3dpdGNoIChydWxlKSB7CisJCQljYXNlIElJbXBvcnQuUlVMRV9QRVJGRUNUOiByZXR1cm4gZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0VmVyc2lvbigpLmlzUGVyZmVjdCgKKwkJCQkJCQkJcHJlcmVxLmdldFZlcnNpb25lZElkZW50aWZpZXIoKQorCQkJCQkJCQkuZ2V0VmVyc2lvbigpKTsKKwkJCWNhc2UgSUltcG9ydC5SVUxFX0VRVUlWQUxFTlQ6CisJCQkJCQlyZXR1cm4gZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0VmVyc2lvbigpCisJCQkJCQkuaXNFcXVpdmFsZW50VG8oCisJCQkJCQkJCXByZXJlcS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkKKwkJCQkJCQkJLmdldFZlcnNpb24oKSk7CisJCQljYXNlIElJbXBvcnQuUlVMRV9DT01QQVRJQkxFOgorCQkJCXJldHVybiBmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRWZXJzaW9uKCkKKwkJCQkJCS5pc0NvbXBhdGlibGVXaXRoKAorCQkJCQkJCQlwcmVyZXEuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpCisJCQkJCQkJCS5nZXRWZXJzaW9uKCkpOworCQkJY2FzZSBJSW1wb3J0LlJVTEVfR1JFQVRFUl9PUl9FUVVBTDoKKwkJCQkJCXJldHVybiBmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRWZXJzaW9uKCkKKwkJCQkJCS5pc0dyZWF0ZXJPckVxdWFsVG8oCisJCQkJCQkJCXByZXJlcS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkKKwkJCQkJCQkJLmdldFZlcnNpb24oKSk7CisJCQl9CisKKwkJCXJldHVybiBmYWxzZTsKKwkJfSBlbHNlIHsKKwkJCWlmICgocHJlcmVxLmdldEtpbmQoKSA9PSBJSW1wb3J0LktJTkRfUExVR0lOKSkgeyAKKwkJCQlyZXR1cm4gY2hlY2tJZkZlYXR1cmVIYXNQbHVnaW4oIHByZXJlcSwgZmVhdHVyZSk7CisJCQl9CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9CisJCisJcHJpdmF0ZSBib29sZWFuIGNoZWNrSWZGZWF0dXJlSGFzUGx1Z2luKElJbXBvcnQgcmVxdWlyZWRGZWF0dXJlLCBJRmVhdHVyZSBmZWF0dXJlKSAgeworCQkKKwkJSVBsdWdpbkVudHJ5W10gcGx1Z2lucyA9IGZlYXR1cmUuZ2V0UGx1Z2luRW50cmllcygpOworCQl0cnkgewkJCQorCQkJTGlzdCBpbmNsdWRlZFBsdWdpbnMgPSBnZXRQbHVnaW5FbnRyaWVzRnJvbUluY2x1ZGVkRmVhdHVyZXMoZmVhdHVyZSwgbmV3IEFycmF5TGlzdCgpLCBuZXcgQXJyYXlMaXN0KCkpOworCQkJaW5jbHVkZWRQbHVnaW5zLmFkZEFsbChBcnJheXMuYXNMaXN0KHBsdWdpbnMpKTsKKwkJCXBsdWdpbnMgPSAoSVBsdWdpbkVudHJ5W10paW5jbHVkZWRQbHVnaW5zLnRvQXJyYXkoIG5ldyBJUGx1Z2luRW50cnlbaW5jbHVkZWRQbHVnaW5zLnNpemUoKV0pOworCQl9IGNhdGNoKCBDb3JlRXhjZXB0aW9uIGNlKSB7CisJCQlVcGRhdGVVSS5sb2dFeGNlcHRpb24oY2UpOworCQkJLy8gaWdub3JlIHRoaXMgcGx1Z2lucyBjYW4gbm90IHN1dGlzZnkgcmVxdWlyZW1lbnQgYW55d2F5cworCQl9CisJCWlmIChwbHVnaW5zID09IG51bGwpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQkKKwkJZm9yKGludCBpID0gMDsgaSA8IHBsdWdpbnMubGVuZ3RoOyBpKyspIHsKKwkJCWlmIChpc01hdGNoKHBsdWdpbnNbaV0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLCByZXF1aXJlZEZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLCByZXF1aXJlZEZlYXR1cmUuZ2V0SWRSdWxlKCkpKSB7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX0KKwkJCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwcml2YXRlIExpc3QgZ2V0UGx1Z2luRW50cmllc0Zyb21JbmNsdWRlZEZlYXR1cmVzKElGZWF0dXJlIGZlYXR1cmUsIExpc3QgcGx1Z2lucywgTGlzdCB2aXNpdGVkRmVhdHVyZXMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZVtdIGlpZnIgPSBmZWF0dXJlLmdldEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKTsKKwkJZm9yKGludCBpID0gMDsgaSA8IGlpZnIubGVuZ3RoOyBpKyspIHsKKwkJCUlGZWF0dXJlIGN1cnJlbnQgPSBVcGRhdGVVdGlscy5nZXRJbmNsdWRlZEZlYXR1cmUoIGZlYXR1cmUsIGlpZnJbaV0pOworCQkJaWYgKCF2aXNpdGVkRmVhdHVyZXMuY29udGFpbnMoY3VycmVudCkpIHsKKwkJCQlJUGx1Z2luRW50cnlbXSBwbHVnaW5FbnRyaWVzID0gY3VycmVudC5nZXRQbHVnaW5FbnRyaWVzKCk7CisJCQkJcGx1Z2lucy5hZGRBbGwoQXJyYXlzLmFzTGlzdChwbHVnaW5FbnRyaWVzKSk7CisJCQkJdmlzaXRlZEZlYXR1cmVzLmFkZChjdXJyZW50KTsKKwkJCQlnZXRQbHVnaW5FbnRyaWVzRnJvbUluY2x1ZGVkRmVhdHVyZXMoY3VycmVudCwgcGx1Z2lucywgdmlzaXRlZEZlYXR1cmVzKTsKKwkJCX0KKwkJfQorCQkKKwkJcmV0dXJuIHBsdWdpbnM7CisJfQorCisJLy8gdmlkMSA9IGZlYXR1cmUKKwkvLyB2aWQyID0gcmVxdWlyZWRGZWF0dXJlCisJcHJpdmF0ZSBib29sZWFuIGlzTWF0Y2goIFZlcnNpb25lZElkZW50aWZpZXIgdmlkMSwgVmVyc2lvbmVkSWRlbnRpZmllciB2aWQyLCBpbnQgcnVsZSkgeworCQkKKwkJaWYgKCF2aWQxLmdldElkZW50aWZpZXIoKS5lcXVhbHModmlkMi5nZXRJZGVudGlmaWVyKCkpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJaWYgKCB2aWQyLmdldFZlcnNpb24oKS5nZXRNYWpvckNvbXBvbmVudCgpID09IDAgJiYgdmlkMi5nZXRWZXJzaW9uKCkuZ2V0TWlub3JDb21wb25lbnQoKSA9PSAwICYmIHZpZDIuZ2V0VmVyc2lvbigpLmdldFNlcnZpY2VDb21wb25lbnQoKSA9PSAwICkgeworCQkJLy92ZXJzaW9uIGlzIGlnbm9yZWQKKwkJCXJldHVybiB0cnVlOworCQl9CisJCXN3aXRjaCAocnVsZSkgeworCQljYXNlIElJbXBvcnQuUlVMRV9QRVJGRUNUOgorCQkJcmV0dXJuIHZpZDEuZ2V0VmVyc2lvbigpLmlzUGVyZmVjdCh2aWQyLmdldFZlcnNpb24oKSk7CisJCWNhc2UgSUltcG9ydC5SVUxFX0VRVUlWQUxFTlQ6CisJCQlyZXR1cm4gdmlkMS5nZXRWZXJzaW9uKCkuaXNFcXVpdmFsZW50VG8odmlkMi5nZXRWZXJzaW9uKCkpOworCQljYXNlIElJbXBvcnQuUlVMRV9DT01QQVRJQkxFOgorCQkJcmV0dXJuIHZpZDEuZ2V0VmVyc2lvbigpLmlzQ29tcGF0aWJsZVdpdGgodmlkMi5nZXRWZXJzaW9uKCkpOworCQljYXNlIElJbXBvcnQuUlVMRV9HUkVBVEVSX09SX0VRVUFMOgorCQkJcmV0dXJuIHZpZDEuZ2V0VmVyc2lvbigpLmlzR3JlYXRlck9yRXF1YWxUbyh2aWQyLmdldFZlcnNpb24oKSk7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzRmVhdHVyZUJldHRlcihJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gZmVhdHVyZSwKKwkJCUlJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiBjdXJyZW50RmVhdHVyZVNlbGVjdGVkKSB7CisKKwkJaWYgKGN1cnJlbnRGZWF0dXJlU2VsZWN0ZWQgPT0gbnVsbCkKKwkJCXJldHVybiB0cnVlOworCQkvLyBJZiB0aGUgZmVhdHVyZSBpcyB0aGUgc2FtZSwgcGljayB0aGUgbmV3ZXIgb25lCisJCWlmIChjdXJyZW50RmVhdHVyZVNlbGVjdGVkLmdldEZlYXR1cmUoKS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0SWRlbnRpZmllcigpLmVxdWFscygKKwkJCQlmZWF0dXJlLmdldEZlYXR1cmUoKS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0SWRlbnRpZmllcigpKSkgeworCQkJcmV0dXJuICFjdXJyZW50RmVhdHVyZVNlbGVjdGVkLmdldEZlYXR1cmUoKS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkKKwkJCS5nZXRWZXJzaW9uKCkuaXNHcmVhdGVyT3JFcXVhbFRvKAorCQkJCQlmZWF0dXJlLmdldEZlYXR1cmUoKS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkKKwkJCQkJCQkuZ2V0VmVyc2lvbigpKTsJCQkKKwkJfQorCQllbHNlIHsKKwkJCS8vIERpZmZlcmVudCBmZWF0dXJlcy4KKwkJCS8vIFBpY2sgYSBmZWF0dXJlIHdpdGggc21hbGxlciBudW1iZXIgb2YgcGx1Zy1pbnMKKwkJCU51bGxQcm9ncmVzc01vbml0b3IgbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7CisJCQlpbnQgY3VycmVudE51bWJlciA9IGdldFRvdGFsTnVtYmVyT2ZQbHVnaW5FbnRyaWVzKGN1cnJlbnRGZWF0dXJlU2VsZWN0ZWQuZ2V0RmVhdHVyZSgpLCBtb25pdG9yKTsKKwkJCWludCBuZXdOdW1iZXIgPSBnZXRUb3RhbE51bWJlck9mUGx1Z2luRW50cmllcyhmZWF0dXJlLmdldEZlYXR1cmUoKSwgbW9uaXRvcik7CisJCQlyZXR1cm4gbmV3TnVtYmVyPGN1cnJlbnROdW1iZXI7CisJCX0KKwl9CisJCisJcHJpdmF0ZSBpbnQgZ2V0VG90YWxOdW1iZXJPZlBsdWdpbkVudHJpZXMoSUZlYXR1cmUgZmVhdHVyZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJCWludCBjb3VudCA9IDA7CisJCXRyeSB7CisJCQljb3VudCA9IGZlYXR1cmUuZ2V0UGx1Z2luRW50cnlDb3VudCgpOworCQkJSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZSBbXSBpcmVmcyA9IGZlYXR1cmUuZ2V0SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpOworCQkJZm9yIChpbnQgaT0wOyBpPGlyZWZzLmxlbmd0aDsgaSsrKSB7CisJCQkJSUZlYXR1cmUgY2hpbGQgPSBpcmVmc1tpXS5nZXRGZWF0dXJlKG1vbml0b3IpOworCQkJCWNvdW50ICs9IGdldFRvdGFsTnVtYmVyT2ZQbHVnaW5FbnRyaWVzKGNoaWxkLCBtb25pdG9yKTsKKwkJCX0KKwkJfQorCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCX0KKwkJcmV0dXJuIGNvdW50OworCX0KKworCXB1YmxpYyBJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gZGVjaWRlT25GZWF0dXJlU2VsZWN0aW9uKAorCQkJSUltcG9ydCByZXF1aXJlZEZlYXR1cmUsIElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiBmZWF0dXJlLAorCQkJSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIGN1cnJlbnRGZWF0dXJlU2VsZWN0ZWQpIHsKKworCQlpZiAoaXNGZWF0dXJlR29vZChyZXF1aXJlZEZlYXR1cmUsIGZlYXR1cmUuZ2V0RmVhdHVyZSgpKSAmJiBpc0ZlYXR1cmVCZXR0ZXIoZmVhdHVyZSwgY3VycmVudEZlYXR1cmVTZWxlY3RlZCkpIHsKKwkJCQlyZXR1cm4gZmVhdHVyZTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBjdXJyZW50RmVhdHVyZVNlbGVjdGVkOworCQl9CisJfQorCQorCXByaXZhdGUgYm9vbGVhbiBpc0ZlYXR1cmVQcm9ibGVtYXRpYyhJRmVhdHVyZSBmZWF0dXJlKSB7CisJCQorCQlpZiAoIHByb2JsZW1hdGljRmVhdHVyZXMuY29udGFpbnMoZmVhdHVyZSkgKQorCQkJcmV0dXJuIHRydWU7CisJCQorCQlJSW1wb3J0W10gaWltcG9ydHMgPSBmZWF0dXJlLmdldEltcG9ydHMoKTsKKwkJCisJCWZvcihpbnQgaSA9IDA7IGkgPCBpaW1wb3J0cy5sZW5ndGg7IGkrKykgeworCQkJSXRlcmF0b3IgcHJvYmxlbWF0aWNGZWF0dXJlcyA9IHRoaXMucHJvYmxlbWF0aWNGZWF0dXJlcy5pdGVyYXRvcigpOworCQkJd2hpbGUocHJvYmxlbWF0aWNGZWF0dXJlcy5oYXNOZXh0KCkpIHsKKwkJCQlpZiAoaWltcG9ydHNbaV0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmVxdWFscyggKChJRmVhdHVyZSlwcm9ibGVtYXRpY0ZlYXR1cmVzLm5leHQoKSkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpKSApIHsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJfQorCQl9CisJCXRyeSB7CisJCQlJdGVyYXRvciBpbmNsdWRlZEZlYXR1cmVzID0gT3BlcmF0aW9uVmFsaWRhdG9yLmNvbXB1dGVGZWF0dXJlU3VidHJlZShmZWF0dXJlLCBudWxsLCBudWxsLCBmYWxzZSwgbmV3IEFycmF5TGlzdCgpLCBudWxsICkuaXRlcmF0b3IoKTsKKwkJCXdoaWxlIChpbmNsdWRlZEZlYXR1cmVzLmhhc05leHQoKSkgeworCQkJCUl0ZXJhdG9yIHByb2JsZW1hdGljRmVhdHVyZXMgPSB0aGlzLnByb2JsZW1hdGljRmVhdHVyZXMuaXRlcmF0b3IoKTsJCQorCQkJCVZlcnNpb25lZElkZW50aWZpZXIgY3VycmVudEluY2x1ZGVkRmVhdHVyZXNWSSA9ICgoSUZlYXR1cmUpaW5jbHVkZWRGZWF0dXJlcy5uZXh0KCkpLmdldFZlcnNpb25lZElkZW50aWZpZXIoKTsKKwkJCQl3aGlsZSAocHJvYmxlbWF0aWNGZWF0dXJlcy5oYXNOZXh0KCkpIHsKKwkJCQkJT2JqZWN0IGN1cnJlbnRQcm9ibGVtYXRpY0ZlYXR1cmVzID0gcHJvYmxlbWF0aWNGZWF0dXJlcy5uZXh0KCk7CisJCQkJCWlmIChjdXJyZW50UHJvYmxlbWF0aWNGZWF0dXJlcyBpbnN0YW5jZW9mIElGZWF0dXJlKSB7CisJCQkJCQlWZXJzaW9uZWRJZGVudGlmaWVyIGN1cnJlbnRQcm9ibGVtYXRpY0ZlYXR1cmVzVkkgPSAoKElGZWF0dXJlKWN1cnJlbnRQcm9ibGVtYXRpY0ZlYXR1cmVzKS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7CQkJCQkJCisJCQkJCQlpZiAoY3VycmVudFByb2JsZW1hdGljRmVhdHVyZXNWSS5lcXVhbHMoIGN1cnJlbnRJbmNsdWRlZEZlYXR1cmVzVkkpICkgeworCQkJCQkJCXJldHVybiB0cnVlOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7CisJCX0KKyAJCXJldHVybiBmYWxzZTsKKwl9CisJCisJcHJpdmF0ZSBib29sZWFuIGlzU2VsZWN0ZWQoIElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbltdIHNlbGVjdGVkSm9icywgSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIGlJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbikgeworCQkKKwkJaWYgKHNlbGVjdGVkSm9icyA9PSBudWxsKQorCQkJcmV0dXJuIGZhbHNlOworCQkKKwkJZm9yKCBpbnQgaSA9IDA7IGkgPCBzZWxlY3RlZEpvYnMubGVuZ3RoOyBpKyspIHsKKwkJCQorCQkJaWYgKGlJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbi5nZXRGZWF0dXJlKCkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmVxdWFscyhzZWxlY3RlZEpvYnNbaV0uZ2V0RmVhdHVyZSgpLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSkgJiYKKwkJCQlpSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24uZ2V0RmVhdHVyZSgpLmdldFNpdGUoKS5nZXRVUkwoKS5lcXVhbHMoc2VsZWN0ZWRKb2JzW2ldLmdldEZlYXR1cmUoKS5nZXRTaXRlKCkuZ2V0VVJMKCkpKSB7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX0KKwkJCisJCXJldHVybiBmYWxzZTsKKwl9Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9TaG93QWN0aXZpdGllc0RpYWxvZy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvU2hvd0FjdGl2aXRpZXNEaWFsb2cuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDIyOWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvU2hvd0FjdGl2aXRpZXNEaWFsb2cuamF2YQpAQCAtMCwwICsxLDIwNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS53aXphcmRzOworCitpbXBvcnQgamF2YS50ZXh0LkRhdGVGb3JtYXQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5XZWlnaHREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5TaXRlTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5JbnN0YWxsQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUk7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJTWVzc2FnZXM7CisKKworCitwdWJsaWMgY2xhc3MgU2hvd0FjdGl2aXRpZXNEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgeworCXByaXZhdGUgVGFibGVWaWV3ZXIgYWN0aXZpdGllc1ZpZXdlcjsKKworCS8vIGxvY2F0aW9uIGNvbmZpZ3VyYXRpb24KKwlwcml2YXRlIElEaWFsb2dTZXR0aW5ncyBkaWFsb2dTZXR0aW5nczsKKwlwcml2YXRlIFBvaW50IGRpYWxvZ0xvY2F0aW9uOworCXByaXZhdGUgUG9pbnQgZGlhbG9nU2l6ZTsKKworCS8qKgorCSAqIEBwYXJhbSBwYXJlbnRTaGVsbAorCSAqLworCXB1YmxpYyBTaG93QWN0aXZpdGllc0RpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCkgeworCQlzdXBlcihwYXJlbnRTaGVsbCk7CisJCXNldFNoZWxsU3R5bGUoU1dULlJFU0laRSB8IFNXVC5NSU4gfCBTV1QuTUFYIHwgU1dULkFQUExJQ0FUSU9OX01PREFMKTsKKwkJcmVhZENvbmZpZ3VyYXRpb24oKTsKKwl9CisJCisJcHVibGljIHZvaWQgY3JlYXRlKCkgeworCQlzdXBlci5jcmVhdGUoKTsKKwkJLy8gZGlhbG9nIGxvY2F0aW9uIAorCQlpZiAoZGlhbG9nTG9jYXRpb24gIT0gbnVsbCkKKwkJCWdldFNoZWxsKCkuc2V0TG9jYXRpb24oZGlhbG9nTG9jYXRpb24pOworCQkKKwkJLy8gZGlhbG9nIHNpemUKKwkJaWYgKGRpYWxvZ1NpemUgIT0gbnVsbCkKKwkJCWdldFNoZWxsKCkuc2V0U2l6ZShkaWFsb2dTaXplKTsKKwkJZWxzZQorCQkJZ2V0U2hlbGwoKS5zZXRTaXplKDUwMCw1MDApOworCQkKKwkJCisJCWFwcGx5RGlhbG9nRm9udChidXR0b25CYXIpOworCQlnZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5PS19JRCkuc2V0Rm9jdXMoKTsKKwl9CisKKwlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7CisJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKKwkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOworCQlsYXlvdXQubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gZmFsc2U7CisJCWNvbnRhaW5lci5zZXRMYXlvdXQobGF5b3V0KTsKKwkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKKwkJZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7CisJCWdkLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKKwkJY29udGFpbmVyLnNldExheW91dERhdGEoZ2QpOworCQljcmVhdGVEZXNjcmlwdGlvblNlY3Rpb24oY29udGFpbmVyKTsKKwkJY3JlYXRlQWN0aXZpdGllc1ZpZXdlcihjb250YWluZXIpOworCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KGNvbnRhaW5lcik7CisJCXJldHVybiBjb250YWluZXI7CisJfQorCisJcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGVzY3JpcHRpb25TZWN0aW9uKENvbXBvc2l0ZSBwYXJlbnQpeworCQlDb21wb3NpdGUgY29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKKwkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOworCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7CisJCWxheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSBmYWxzZTsKKwkJY29udGFpbmVyLnNldExheW91dChsYXlvdXQpOworCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOworCQljb250YWluZXIuc2V0TGF5b3V0RGF0YShnZCk7CisJCXRyeSB7CisJCQlMYWJlbCB0YXJnZXRMYWJlbCA9IG5ldyBMYWJlbChjb250YWluZXIsIFNXVC5OT05FKTsKKwkJCXRhcmdldExhYmVsLnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5TaG93QWN0aXZpdGllc0RpYWxvZ19kYXRlKTsgCisJCQlMYWJlbCB0YXJnZXQgPSBuZXcgTGFiZWwoY29udGFpbmVyLCBTV1QuTk9ORSk7CisJCQlEYXRlRm9ybWF0IGRmID0gRGF0ZUZvcm1hdC5nZXREYXRlVGltZUluc3RhbmNlKCk7CisJCQlTdHJpbmcgbG9jYWxpemVkRGF0ZSA9IGRmLmZvcm1hdChTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldENyZWF0aW9uRGF0ZSgpKTsKKwkJCXRhcmdldC5zZXRUZXh0KGxvY2FsaXplZERhdGUpOworCQkJCisJCQlMYWJlbCB1cmxMYWJlbCA9IG5ldyBMYWJlbChjb250YWluZXIsIFNXVC5OT05FKTsKKwkJCXVybExhYmVsLnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5TaG93QWN0aXZpdGllc0RpYWxvZ19sb2MpOyAKKwkJCUxhYmVsIHVybCA9IG5ldyBMYWJlbChjb250YWluZXIsIFNXVC5OT05FKTsKKwkJCXVybC5zZXRUZXh0KCgoSW5zdGFsbENvbmZpZ3VyYXRpb24pU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKSkuZ2V0VVJMKCkuZ2V0RmlsZSgpKTsKKwkJCQorCQkJCisJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJVXBkYXRlVUkubG9nRXhjZXB0aW9uKGUpOworCQl9CisJCXJldHVybiBjb250YWluZXI7CisJfQorCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUFjdGl2aXRpZXNWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgeworCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKKwkJR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKKwkJZ3JpZExheW91dC5tYXJnaW5IZWlnaHQgPSBncmlkTGF5b3V0Lm1hcmdpbldpZHRoID0gNDsKKwkJY29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKKworCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOworLy8JCWdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOworLy8JCWdkLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKKworCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShnZCk7CisKKwkJCisJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOworCQlsYWJlbC5zZXRUZXh0KFVwZGF0ZVVJTWVzc2FnZXMuU2hvd0FjdGl2aXRpZXNEaWFsb2dfbGFiZWwpOyAKKwkJYWN0aXZpdGllc1ZpZXdlciA9IEFjdGl2aXRpZXNUYWJsZVZpZXdlci5jcmVhdGVWaWV3ZXIoY29tcG9zaXRlLCB0cnVlKTsKKworCQlUYWJsZUxheW91dCBsYXlvdXQgPSBuZXcgVGFibGVMYXlvdXQoKTsKKwkJbGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoOCwgMjAsIGZhbHNlKSk7CisJCWxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDUwLCAxNjAsIHRydWUpKTsKKwkJbGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoNTAsIDE4MywgdHJ1ZSkpOworCQlsYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSg1MCwgMTAwLCB0cnVlKSk7CisKKwkJYWN0aXZpdGllc1ZpZXdlci5nZXRUYWJsZSgpLnNldExheW91dChsYXlvdXQpOworCQl0cnkgeworCQkJYWN0aXZpdGllc1ZpZXdlci5zZXRJbnB1dChTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpKTsKKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCX0KKwkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChjb21wb3NpdGUpOworCQlyZXR1cm4gY29tcG9zaXRlOworCX0KKworCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgeworCQkvLyBjcmVhdGUgT0sgYnV0dG9uIG9ubHkgYnkgZGVmYXVsdAorCQljcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lELCBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLCB0cnVlKTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBjbG9zZSgpIHsKKwkJc3RvcmVTZXR0aW5ncygpOworCQlyZXR1cm4gc3VwZXIuY2xvc2UoKTsKKwl9CisJCisJLyoqCisJICogU3RvcmVzIHRoZSBjdXJyZW50IHN0YXRlIGluIHRoZSBkaWFsb2cgc2V0dGluZ3MuCisJICogQHNpbmNlIDIuMAorCSAqLworCXByaXZhdGUgdm9pZCBzdG9yZVNldHRpbmdzKCkgeworCQl3cml0ZUNvbmZpZ3VyYXRpb24oKTsKKwl9CisJLyoqCisJICogUmV0dXJucyB0aGUgZGlhbG9nIHNldHRpbmdzIG9iamVjdCB1c2VkIHRvIHNoYXJlIHN0YXRlCisJICogYmV0d2VlbiBzZXZlcmFsIGV2ZW50IGRldGFpbCBkaWFsb2dzLgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGRpYWxvZyBzZXR0aW5ncyB0byBiZSB1c2VkCisJICovCisJcHJpdmF0ZSBJRGlhbG9nU2V0dGluZ3MgZ2V0RGlhbG9nU2V0dGluZ3MoKSB7CisJCUlEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncyA9IFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXREaWFsb2dTZXR0aW5ncygpOworCQlkaWFsb2dTZXR0aW5ncyA9IHNldHRpbmdzLmdldFNlY3Rpb24oZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworCQlpZiAoZGlhbG9nU2V0dGluZ3MgPT0gbnVsbCkKKwkJCWRpYWxvZ1NldHRpbmdzPSBzZXR0aW5ncy5hZGROZXdTZWN0aW9uKGdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKwkJcmV0dXJuIGRpYWxvZ1NldHRpbmdzOworCX0KKworCS8qKgorCSAqIEluaXRpYWxpemVzIGl0c2VsZiBmcm9tIHRoZSBkaWFsb2cgc2V0dGluZ3Mgd2l0aCB0aGUgc2FtZSBzdGF0ZQorCSAqIGFzIGF0IHRoZSBwcmV2aW91cyBpbnZvY2F0aW9uLgorCSAqLworCXByaXZhdGUgdm9pZCByZWFkQ29uZmlndXJhdGlvbigpIHsKKwkJSURpYWxvZ1NldHRpbmdzIHM9IGdldERpYWxvZ1NldHRpbmdzKCk7CisJCXRyeSB7CisJCQlpbnQgeD0gcy5nZXRJbnQoIngiKTsgLy8kTk9OLU5MUy0xJAorCQkJaW50IHk9IHMuZ2V0SW50KCJ5Iik7IC8vJE5PTi1OTFMtMSQKKwkJCWRpYWxvZ0xvY2F0aW9uPSBuZXcgUG9pbnQoeCwgeSk7CisJCQkKKwkJCXggPSBzLmdldEludCgid2lkdGgiKTsgLy8kTk9OLU5MUy0xJAorCQkJeSA9IHMuZ2V0SW50KCJoZWlnaHQiKTsgLy8kTk9OLU5MUy0xJAorCQkJZGlhbG9nU2l6ZSA9IG5ldyBQb2ludCh4LHkpOworCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworCQkJZGlhbG9nTG9jYXRpb249IG51bGw7CisJCQlkaWFsb2dTaXplID0gbnVsbDsKKwkJfQorCX0KKwkKKwlwcml2YXRlIHZvaWQgd3JpdGVDb25maWd1cmF0aW9uKCl7CisJCUlEaWFsb2dTZXR0aW5ncyBzID0gZ2V0RGlhbG9nU2V0dGluZ3MoKTsKKwkJUG9pbnQgbG9jYXRpb24gPSBnZXRTaGVsbCgpLmdldExvY2F0aW9uKCk7CisJCXMucHV0KCJ4IiwgbG9jYXRpb24ueCk7IC8vJE5PTi1OTFMtMSQKKwkJcy5wdXQoInkiLCBsb2NhdGlvbi55KTsgLy8kTk9OLU5MUy0xJAorCQkKKwkJUG9pbnQgc2l6ZSA9IGdldFNoZWxsKCkuZ2V0U2l6ZSgpOworCQlzLnB1dCgid2lkdGgiLCBzaXplLngpOyAvLyROT04tTkxTLTEkCisJCXMucHV0KCJoZWlnaHQiLCBzaXplLnkpOyAvLyROT04tTkxTLTEkCisJfQorfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvU2l0ZVBhZ2UuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL1NpdGVQYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZiYTdlNAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL1NpdGVQYWdlLmphdmEKQEAgLTAsMCArMSw1NTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkud2l6YXJkczsKKworaW1wb3J0IGphdmEubmV0LlVSTDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRhYmxlVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNoZWNrU3RhdGVMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLkh5cGVybGlua1NldHRpbmdzOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2Nyb2xsZWRGb3JtVGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5VcGRhdGVDb3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLlVwZGF0ZU1hbmFnZXJVdGlsczsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUk7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJSW1hZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSU1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbC5EaXNjb3ZlcnlGb2xkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsLlNpdGVCb29rbWFyazsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWwuU2l0ZUNhdGVnb3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbC5VcGRhdGVNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkucGFydHMuU1dUVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy5JVXBkYXRlTW9kZWxDaGFuZ2VkTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnNlYXJjaC5FbnZpcm9ubWVudEZpbHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuc2VhcmNoLlVwZGF0ZVNlYXJjaFJlcXVlc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnNlYXJjaC5VcGRhdGVTZWFyY2hTY29wZTsKKworcHVibGljIGNsYXNzIFNpdGVQYWdlIGV4dGVuZHMgQmFubmVyUGFnZSBpbXBsZW1lbnRzIElTZWFyY2hQcm92aWRlciB7CisKKwljbGFzcyBTaXRlc0xhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIHsKKworCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IG9iaikgeworCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFNpdGVCb29rbWFyaykKKwkJCQlyZXR1cm4gVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldExhYmVsUHJvdmlkZXIoKS5nZXQoCisJCQkJCVVwZGF0ZVVJSW1hZ2VzLkRFU0NfU0lURV9PQkopOworCQkJcmV0dXJuIHN1cGVyLmdldEltYWdlKG9iaik7CisJCX0KKworCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iaikgeworCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFNpdGVCb29rbWFyaykgeworCQkJCXJldHVybiAoKFNpdGVCb29rbWFyaykgb2JqKS5nZXRMYWJlbCgpOworCQkJfQorCQkJcmV0dXJuIHN1cGVyLmdldFRleHQob2JqKTsKKwkJfQorCX0KKworCWNsYXNzIE1vZGVsTGlzdGVuZXIgaW1wbGVtZW50cyBJVXBkYXRlTW9kZWxDaGFuZ2VkTGlzdGVuZXIgeworCQlwdWJsaWMgdm9pZCBvYmplY3RDaGFuZ2VkKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkgeworCQkJdmlld2VyLnJlZnJlc2goKTsKKwkJCWNoZWNrSXRlbXMoKTsKKwkJfQorCisJCXB1YmxpYyB2b2lkIG9iamVjdHNBZGRlZChPYmplY3QgcGFyZW50LCBPYmplY3RbXSBjaGlsZHJlbikgeworICAgICAgICAgICAgdmlld2VyLnJlZnJlc2goKTsKKwkJCWNoZWNrSXRlbXMoKTsKKwkJfQorCisJCXB1YmxpYyB2b2lkIG9iamVjdHNSZW1vdmVkKE9iamVjdCBwYXJlbnQsIE9iamVjdFtdIGNoaWxkcmVuKSB7CisJCQl2aWV3ZXIucmVmcmVzaCgpOworCQkJY2hlY2tJdGVtcygpOworCQl9CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgRGlzY292ZXJ5Rm9sZGVyIGRpc2NvdmVyeUZvbGRlciA9IG5ldyBEaXNjb3ZlcnlGb2xkZXIoKTsKKwlwcml2YXRlIENoZWNrYm94VGFibGVWaWV3ZXIgdmlld2VyOworCXByaXZhdGUgU2Nyb2xsZWRGb3JtVGV4dCBkZXNjTGFiZWw7CisJcHJpdmF0ZSBCdXR0b24gYWRkU2l0ZUJ1dHRvbjsKKwlwcml2YXRlIEJ1dHRvbiBhZGRMb2NhbEJ1dHRvbjsKKwlwcml2YXRlIEJ1dHRvbiBhZGRMb2NhbFppcHBlZEJ1dHRvbjsKKwlwcml2YXRlIEJ1dHRvbiBlZGl0QnV0dG9uOworCXByaXZhdGUgQnV0dG9uIHJlbW92ZUJ1dHRvbjsKKwlwcml2YXRlIEJ1dHRvbiBleHBvcnRCdXR0b247CisJcHJpdmF0ZSBCdXR0b24gaW1wb3J0QnV0dG9uOworCXByaXZhdGUgQnV0dG9uIGVudkZpbHRlckNoZWNrOworCXByaXZhdGUgQnV0dG9uIGF1dG9tYXRpY2FsbHlTZWxlY3RNaXJyb3JzQ2hlY2tib3g7CisJcHJpdmF0ZSBFbnZpcm9ubWVudEZpbHRlciBlbnZGaWx0ZXI7CisJcHJpdmF0ZSBVcGRhdGVTZWFyY2hSZXF1ZXN0IHNlYXJjaFJlcXVlc3Q7CisJcHJpdmF0ZSBNb2RlbExpc3RlbmVyIG1vZGVsTGlzdGVuZXI7CisJCisJcHJpdmF0ZSBib29sZWFuIGF1dG9tYXRpY2FsbHlTZWxlY3RNaXJyb3JzID0gdHJ1ZTsKKworCXB1YmxpYyBTaXRlUGFnZShVcGRhdGVTZWFyY2hSZXF1ZXN0IHNlYXJjaFJlcXVlc3QpIHsKKwkJc3VwZXIoIlNpdGVQYWdlIik7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgdGhpcy5zZWFyY2hSZXF1ZXN0ID0gc2VhcmNoUmVxdWVzdDsKKwkJc2V0VGl0bGUoVXBkYXRlVUlNZXNzYWdlcy5TaXRlUGFnZV90aXRsZSk7IAorCQlzZXREZXNjcmlwdGlvbihVcGRhdGVVSU1lc3NhZ2VzLlNpdGVQYWdlX2Rlc2MpOyAKKwkJVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldExhYmVsUHJvdmlkZXIoKS5jb25uZWN0KHRoaXMpOworICAgIAllbnZGaWx0ZXIgPSBuZXcgRW52aXJvbm1lbnRGaWx0ZXIoKTsKKworCQltb2RlbExpc3RlbmVyID0gbmV3IE1vZGVsTGlzdGVuZXIoKTsKKwkJVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldFVwZGF0ZU1vZGVsKCkuYWRkVXBkYXRlTW9kZWxDaGFuZ2VkTGlzdGVuZXIoCisJCQltb2RlbExpc3RlbmVyKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgdG9nZ2xlRW52RmlsdGVyKGJvb2xlYW4gYWRkKSB7CisJCWlmIChhZGQpCisJCQlzZWFyY2hSZXF1ZXN0LmFkZEZpbHRlcihlbnZGaWx0ZXIpOworCQllbHNlCisJCQlzZWFyY2hSZXF1ZXN0LnJlbW92ZUZpbHRlcihlbnZGaWx0ZXIpOworCX0KKworCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCVVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRMYWJlbFByb3ZpZGVyKCkuZGlzY29ubmVjdCh0aGlzKTsKKwkJVXBkYXRlVUkKKwkJCS5nZXREZWZhdWx0KCkKKwkJCS5nZXRVcGRhdGVNb2RlbCgpCisJCQkucmVtb3ZlVXBkYXRlTW9kZWxDaGFuZ2VkTGlzdGVuZXIoCisJCQltb2RlbExpc3RlbmVyKTsKKwkJc3VwZXIuZGlzcG9zZSgpOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKSBAc2VlCisJICogb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLndpemFyZHMuQmFubmVyUGFnZSNjcmVhdGVDb250ZW50cyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCisJICovCisJcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgeworCQlDb21wb3NpdGUgY2xpZW50ID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKKwkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOworCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7CisJCWNsaWVudC5zZXRMYXlvdXQobGF5b3V0KTsKKworCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjbGllbnQsIFNXVC5OVUxMKTsKKwkJbGFiZWwuc2V0VGV4dChVcGRhdGVVSU1lc3NhZ2VzLlNpdGVQYWdlX2xhYmVsKTsgCisJCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7CisJCWdkLmhvcml6b250YWxTcGFuID0gMjsKKwkJbGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7CisKKwkJY3JlYXRlVmlld2VyKGNsaWVudCk7CisKKwkJQ29tcG9zaXRlIGJ1dHRvbkNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUoY2xpZW50LCBTV1QuTlVMTCk7CisJCWJ1dHRvbkNvbnRhaW5lci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMKSk7CisJCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7CisJCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7CisJCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOworCQlidXR0b25Db250YWluZXIuc2V0TGF5b3V0KGxheW91dCk7CisKKwkJYWRkU2l0ZUJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29udGFpbmVyLCBTV1QuUFVTSCk7CisJCWFkZFNpdGVCdXR0b24uc2V0VGV4dChVcGRhdGVVSU1lc3NhZ2VzLlNpdGVQYWdlX2FkZFVwZGF0ZVNpdGUpOyAKKwkJYWRkU2l0ZUJ1dHRvbi5zZXRMYXlvdXREYXRhKAorCQkJbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOworCQlTV1RVdGlsLnNldEJ1dHRvbkRpbWVuc2lvbkhpbnQoYWRkU2l0ZUJ1dHRvbik7CisJCWFkZFNpdGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CisJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJaGFuZGxlQWRkU2l0ZSgpOworCQkJfQorCQl9KTsKKworCQlhZGRMb2NhbEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29udGFpbmVyLCBTV1QuUFVTSCk7CisJCWFkZExvY2FsQnV0dG9uLnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5TaXRlUGFnZV9hZGRMb2NhbFNpdGUpOyAKKwkJYWRkTG9jYWxCdXR0b24uc2V0TGF5b3V0RGF0YSgKKwkJCW5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKKwkJU1dUVXRpbC5zZXRCdXR0b25EaW1lbnNpb25IaW50KGFkZExvY2FsQnV0dG9uKTsKKwkJYWRkTG9jYWxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CisJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJaGFuZGxlQWRkTG9jYWwoKTsKKwkJCX0KKwkJfSk7CisKKwkJYWRkTG9jYWxaaXBwZWRCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbnRhaW5lciwgU1dULlBVU0gpOworCQlhZGRMb2NhbFppcHBlZEJ1dHRvbi5zZXRUZXh0KFVwZGF0ZVVJTWVzc2FnZXMuU2l0ZVBhZ2VfYWRkTG9jYWxaaXBwZWRTaXRlKTsgCisJCWFkZExvY2FsWmlwcGVkQnV0dG9uLnNldExheW91dERhdGEoCisJCQluZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7CisJCVNXVFV0aWwuc2V0QnV0dG9uRGltZW5zaW9uSGludChhZGRMb2NhbFppcHBlZEJ1dHRvbik7CisJCWFkZExvY2FsWmlwcGVkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCWhhbmRsZUFkZExvY2FsWmlwcGVkKCk7CisJCQl9CisJCX0pOworCQkKKwkJLy8gc2VwYXJhdG9yCisJCW5ldyBMYWJlbChidXR0b25Db250YWluZXIsIFNXVC5Ob25lKTsKKwkJCisJCWVkaXRCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbnRhaW5lciwgU1dULlBVU0gpOworCQllZGl0QnV0dG9uLnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5TaXRlUGFnZV9lZGl0KTsgCisJCWVkaXRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7CisJCWVkaXRCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7CisJCVNXVFV0aWwuc2V0QnV0dG9uRGltZW5zaW9uSGludChlZGl0QnV0dG9uKTsKKwkJZWRpdEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQloYW5kbGVFZGl0KCk7CisJCQl9CisJCX0pOworCisJCXJlbW92ZUJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29udGFpbmVyLCBTV1QuUFVTSCk7CisJCXJlbW92ZUJ1dHRvbi5zZXRUZXh0KFVwZGF0ZVVJTWVzc2FnZXMuU2l0ZVBhZ2VfcmVtb3ZlKTsgCisJCXJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKKwkJcmVtb3ZlQnV0dG9uLnNldExheW91dERhdGEoCisJCQluZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7CisJCVNXVFV0aWwuc2V0QnV0dG9uRGltZW5zaW9uSGludChyZW1vdmVCdXR0b24pOworCQlyZW1vdmVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CisJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJaGFuZGxlUmVtb3ZlKCk7CisJCQl9CisJCX0pOworCQkKKwkJLy8gc2VwYXJhdG9yCisJCW5ldyBMYWJlbChidXR0b25Db250YWluZXIsIFNXVC5Ob25lKTsKKwkJCisJCWltcG9ydEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29udGFpbmVyLCBTV1QuUFVTSCk7CisJCWltcG9ydEJ1dHRvbi5zZXRUZXh0KFVwZGF0ZVVJTWVzc2FnZXMuU2l0ZVBhZ2VfaW1wb3J0KTsgCisJCWltcG9ydEJ1dHRvbi5zZXRMYXlvdXREYXRhKAorCQkJbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOworCQlTV1RVdGlsLnNldEJ1dHRvbkRpbWVuc2lvbkhpbnQoaW1wb3J0QnV0dG9uKTsKKwkJaW1wb3J0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCWhhbmRsZUltcG9ydCgpOworCQkJfQorCQl9KTsKKwkJCisJCWV4cG9ydEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29udGFpbmVyLCBTV1QuUFVTSCk7CisJCWV4cG9ydEJ1dHRvbi5zZXRUZXh0KFVwZGF0ZVVJTWVzc2FnZXMuU2l0ZVBhZ2VfZXhwb3J0KTsgCisJCWV4cG9ydEJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKKwkJU1dUVXRpbC5zZXRCdXR0b25EaW1lbnNpb25IaW50KGV4cG9ydEJ1dHRvbik7CisJCWV4cG9ydEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQloYW5kbGVFeHBvcnQoKTsKKwkJCX0KKwkJfSk7CisKKwkJZGVzY0xhYmVsID0gbmV3IFNjcm9sbGVkRm9ybVRleHQoY2xpZW50LCB0cnVlKTsKKwkJZGVzY0xhYmVsLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCisJCWRlc2NMYWJlbC5zZXRCYWNrZ3JvdW5kKHBhcmVudC5nZXRCYWNrZ3JvdW5kKCkpOworCQlIeXBlcmxpbmtTZXR0aW5ncyBzZXR0aW5ncyA9IG5ldyBIeXBlcmxpbmtTZXR0aW5ncyhwYXJlbnQuZ2V0RGlzcGxheSgpKTsKKwkJZGVzY0xhYmVsLmdldEZvcm1UZXh0KCkuc2V0SHlwZXJsaW5rU2V0dGluZ3Moc2V0dGluZ3MpOworCQkKKwkJZ2QgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKKwkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAxOworICAgICAgICBnZC5oZWlnaHRIaW50ID0gMzA7CisJCWRlc2NMYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKKwkJCisJCWVudkZpbHRlckNoZWNrID0gbmV3IEJ1dHRvbihjbGllbnQsIFNXVC5DSEVDSyk7CisJCWVudkZpbHRlckNoZWNrLnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5TaXRlUGFnZV9pZ25vcmUpOyAKKwkJZW52RmlsdGVyQ2hlY2suc2V0U2VsZWN0aW9uKHRydWUpOworCQl0b2dnbGVFbnZGaWx0ZXIodHJ1ZSk7CisJCWVudkZpbHRlckNoZWNrLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCXRvZ2dsZUVudkZpbHRlcihlbnZGaWx0ZXJDaGVjay5nZXRTZWxlY3Rpb24oKSk7CisJCQl9CisJCX0pOworCQlnZCA9IG5ldyBHcmlkRGF0YSgpOworCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7CisgICAgICAgIGdkLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkJPVFRPTTsKKwkJZW52RmlsdGVyQ2hlY2suc2V0TGF5b3V0RGF0YShnZCk7CisKKwkJCisJCWF1dG9tYXRpY2FsbHlTZWxlY3RNaXJyb3JzQ2hlY2tib3ggPSBuZXcgQnV0dG9uKGNsaWVudCwgU1dULkNIRUNLKTsKKwkJYXV0b21hdGljYWxseVNlbGVjdE1pcnJvcnNDaGVja2JveC5zZXRUZXh0KFVwZGF0ZVVJTWVzc2FnZXMuU2l0ZVBhZ2VfYXV0b21hdGljYWxseVNlbGVjdE1pcnJvcnMpOyAKKwkJYXV0b21hdGljYWxseVNlbGVjdE1pcnJvcnNDaGVja2JveC5zZXRTZWxlY3Rpb24odHJ1ZSk7CisJCWF1dG9tYXRpY2FsbHlTZWxlY3RNaXJyb3JzQ2hlY2tib3guYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CisJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJYXV0b21hdGljYWxseVNlbGVjdE1pcnJvcnMgPSBhdXRvbWF0aWNhbGx5U2VsZWN0TWlycm9yc0NoZWNrYm94LmdldFNlbGVjdGlvbigpOworCQkJCVVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShVcGRhdGVDb3JlLlBfQVVUT01BVElDQUxMWV9DSE9PU0VfTUlSUk9SLCBhdXRvbWF0aWNhbGx5U2VsZWN0TWlycm9ycyk7CisJCQl9CisJCX0pOworCQlnZCA9IG5ldyBHcmlkRGF0YSgpOworCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7CisgICAgICAgIGdkLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkJPVFRPTTsKKyAgICAgICAgYXV0b21hdGljYWxseVNlbGVjdE1pcnJvcnNDaGVja2JveC5zZXRMYXlvdXREYXRhKGdkKTsKKwkJCisJCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKKworCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNsaWVudCwgIm9yZy5lY2xpcHNlLnVwZGF0ZS51aS5TaXRlUGFnZSIpOyAvLyROT04tTkxTLTEkCisKKwkJcmV0dXJuIGNsaWVudDsKKwl9CisKKwlwcml2YXRlIHZvaWQgY3JlYXRlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJdmlld2VyID0KKwkJCUNoZWNrYm94VGFibGVWaWV3ZXIubmV3Q2hlY2tMaXN0KAorCQkJCXBhcmVudCwKKwkJCQlTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKKwkJdmlld2VyLmdldFRhYmxlKCkuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7CisJCXZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyKCkgeworCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBwYXJlbnQpIHsKKwkJCQlyZXR1cm4gZ2V0QWxsU2l0ZUJvb2ttYXJrcygpOworCQkJfQorCisJCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQkJfQorCisJCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LAorCQkJCQlPYmplY3QgbmV3SW5wdXQpIHsKKwkJCX0KKwkJfSk7CisJCXZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBTaXRlc0xhYmVsUHJvdmlkZXIoKSk7CisJCXZpZXdlci5zZXRJbnB1dChVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0VXBkYXRlTW9kZWwoKSk7CisJCQorCQkvLyBidWcgIyA4MzIxMgorCQl2aWV3ZXIuc2V0U29ydGVyKCBuZXcgVmlld2VyU29ydGVyKCkpOworCQkKKwkJCisJCWluaXRpYWxpemVJdGVtcygpOworCisJCXZpZXdlci5hZGRDaGVja1N0YXRlTGlzdGVuZXIobmV3IElDaGVja1N0YXRlTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGUpIHsKKwkJCQlPYmplY3QgZWxlbWVudCA9IGUuZ2V0RWxlbWVudCgpOworCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgU2l0ZUJvb2ttYXJrKQorCQkJCQloYW5kbGVTaXRlQ2hlY2tlZCgoU2l0ZUJvb2ttYXJrKSBlbGVtZW50LCBlLmdldENoZWNrZWQoKSk7CisJCQl9CisJCX0pOworCisJCXZpZXdlcgorCQkJLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGUpIHsKKwkJCQloYW5kbGVTZWxlY3Rpb25DaGFuZ2VkKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZS5nZXRTZWxlY3Rpb24oKSk7CisJCQl9CisJCX0pOworCisJfQorCisJcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVJdGVtcygpIHsKKwkJY2hlY2tJdGVtcygpOworCQl1cGRhdGVTZWFyY2hSZXF1ZXN0KCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGNoZWNrSXRlbXMoKSB7CisJCVRhYmxlSXRlbVtdIGl0ZW1zID0gdmlld2VyLmdldFRhYmxlKCkuZ2V0SXRlbXMoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgeworCQkJU2l0ZUJvb2ttYXJrIGJvb2ttYXJrID0gKFNpdGVCb29rbWFyaykgaXRlbXNbaV0uZ2V0RGF0YSgpOworCQkJdmlld2VyLnNldENoZWNrZWQoYm9va21hcmssIGJvb2ttYXJrLmlzU2VsZWN0ZWQoKSk7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgaGFuZGxlQWRkU2l0ZSgpIHsKKwkJTmV3VXBkYXRlU2l0ZURpYWxvZyBkaWFsb2cgPSBuZXcgTmV3VXBkYXRlU2l0ZURpYWxvZyhnZXRTaGVsbCgpLCBnZXRBbGxTaXRlQm9va21hcmtzKCkpOworCQlkaWFsb2cuY3JlYXRlKCk7CisJCWRpYWxvZy5nZXRTaGVsbCgpLnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5TaXRlUGFnZV9uZXcpOyAKKwkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gTmV3VXBkYXRlU2l0ZURpYWxvZy5PSykKKwkJCXVwZGF0ZVNlYXJjaFJlcXVlc3QoKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgaGFuZGxlQWRkTG9jYWwoKSB7CisJCVNpdGVCb29rbWFyayBzaXRlQm9va21hcmsgPSBMb2NhbFNpdGVTZWxlY3Rvci5nZXRMb2NhTFNpdGUoZ2V0U2hlbGwoKSwgdGhpcy5nZXRBbGxTaXRlQm9va21hcmtzKCkpOworCQlpZiAoc2l0ZUJvb2ttYXJrICE9IG51bGwpIHsKKwkJCWlmIChoYW5kbGVOYW1lRWRpdChzaXRlQm9va21hcmspID09IEVkaXRTaXRlRGlhbG9nLk9LKSB7CisJCQkJc2l0ZUJvb2ttYXJrLnNldFNlbGVjdGVkKHRydWUpOworCQkJCVVwZGF0ZU1vZGVsIG1vZGVsID0gVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldFVwZGF0ZU1vZGVsKCk7CisJCQkJbW9kZWwuYWRkQm9va21hcmsoc2l0ZUJvb2ttYXJrKTsKKwkJCQltb2RlbC5zYXZlQm9va21hcmtzKCk7CisJCQkJdXBkYXRlU2VhcmNoUmVxdWVzdCgpOworCQkJfQorCQl9CisJCXJldHVybjsKKwl9CisKKwlwcml2YXRlIHZvaWQgaGFuZGxlQWRkTG9jYWxaaXBwZWQoKSB7CisJCVNpdGVCb29rbWFyayBzaXRlQm9va21hcmsgPSBMb2NhbFNpdGVTZWxlY3RvcgorCQkJCS5nZXRMb2NhTFppcHBlZFNpdGUoZ2V0U2hlbGwoKSwgdGhpcy5nZXRBbGxTaXRlQm9va21hcmtzKCkpOworCQlpZiAoc2l0ZUJvb2ttYXJrICE9IG51bGwpIHsKKwkJCWlmIChoYW5kbGVOYW1lRWRpdChzaXRlQm9va21hcmspID09IEVkaXRTaXRlRGlhbG9nLk9LKSB7CisJCQkJc2l0ZUJvb2ttYXJrLnNldFNlbGVjdGVkKHRydWUpOworCQkJCVVwZGF0ZU1vZGVsIG1vZGVsID0gVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldFVwZGF0ZU1vZGVsKCk7CisJCQkJbW9kZWwuYWRkQm9va21hcmsoc2l0ZUJvb2ttYXJrKTsKKwkJCQltb2RlbC5zYXZlQm9va21hcmtzKCk7CisJCQkJdXBkYXRlU2VhcmNoUmVxdWVzdCgpOworCQkJfQorCQl9CisJCXJldHVybjsKKwl9CisKKwlwcml2YXRlIHZvaWQgaGFuZGxlUmVtb3ZlKCkgeworCQlCdXN5SW5kaWNhdG9yCisJCQkuc2hvd1doaWxlKHZpZXdlci5nZXRDb250cm9sKCkuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7CisJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJVXBkYXRlTW9kZWwgdXBkYXRlTW9kZWwgPQorCQkJCQlVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0VXBkYXRlTW9kZWwoKTsKKwkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzc2VsID0KKwkJCQkJKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXIuZ2V0U2VsZWN0aW9uKCk7CisJCQkJU2l0ZUJvb2ttYXJrIGJvb2ttYXJrID0gKFNpdGVCb29rbWFyaykgc3NlbC5nZXRGaXJzdEVsZW1lbnQoKTsKKwkJCQlTdHJpbmcgc2VsTmFtZSA9IGJvb2ttYXJrLmdldExhYmVsKCk7CisJCQkJYm9vbGVhbiBhbnN3ZXIgPSBNZXNzYWdlRGlhbG9nCisJCQkJCQkJCS5vcGVuUXVlc3Rpb24oCisJCQkJCQkJCQkJZ2V0U2hlbGwoKSwKKwkJCQkJCQkJCQlVcGRhdGVVSU1lc3NhZ2VzLlNpdGVQYWdlX3JlbW92ZV9sb2NhdGlvbl9jb25mX3RpdGxlLCAKKwkJCQkJCQkJCQlVcGRhdGVVSU1lc3NhZ2VzLlNpdGVQYWdlX3JlbW92ZV9sb2NhdGlvbl9jb25mCisJCQkJCQkJCQkJCQkrICIgIiArIHNlbE5hbWUpOyAvLyROT04tTkxTLTEkCisKKwkJCQlpZiAoYW5zd2VyICYmICFib29rbWFyay5pc1JlYWRPbmx5KCkpIHsKKwkJCQkJdXBkYXRlTW9kZWwucmVtb3ZlQm9va21hcmsoYm9va21hcmspOworCQkJCQl1cGRhdGVTZWFyY2hSZXF1ZXN0KCk7CisJCQkJfQorCQkJfQorCQl9KTsKKwl9CisKKwlwcml2YXRlIHZvaWQgaGFuZGxlRWRpdCgpIHsKKwkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3NlbCA9CisJCQkoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlci5nZXRTZWxlY3Rpb24oKTsKKwkJU2l0ZUJvb2ttYXJrIGJvb2ttYXJrID0gKFNpdGVCb29rbWFyaykgc3NlbC5nZXRGaXJzdEVsZW1lbnQoKTsKKwkJVVJMIG9sZFVSTCA9IGJvb2ttYXJrLmdldFVSTCgpOworCQlFZGl0U2l0ZURpYWxvZyBkaWFsb2cgPSBuZXcgRWRpdFNpdGVEaWFsb2coZ2V0U2hlbGwoKSwgYm9va21hcmssIGdldEFsbFNpdGVCb29rbWFya3MoKSk7CisJCWRpYWxvZy5jcmVhdGUoKTsKKwkJU3RyaW5nIHRpdGxlID0gYm9va21hcmsuaXNMb2NhbCgpID8gVXBkYXRlVUlNZXNzYWdlcy5TaXRlUGFnZV9kaWFsb2dFZGl0TG9jYWwgOiBVcGRhdGVVSU1lc3NhZ2VzLlNpdGVQYWdlX2RpYWxvZ0VkaXRVcGRhdGVTaXRlOyAKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0yJAorCQlkaWFsb2cuZ2V0U2hlbGwoKS5zZXRUZXh0KHRpdGxlKTsKKwkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gRWRpdFNpdGVEaWFsb2cuT0sgKSB7CisJCQlVUkwgbmV3VVJMID0gYm9va21hcmsuZ2V0VVJMKCk7CisJCQlpZiAoIVVwZGF0ZU1hbmFnZXJVdGlscy5zYW1lVVJMKG9sZFVSTCwgbmV3VVJMKSkgeworCQkJCVVwZGF0ZU1vZGVsIG1vZGVsID0gVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldFVwZGF0ZU1vZGVsKCk7CisJCQkJbW9kZWwuZmlyZU9iamVjdENoYW5nZWQoYm9va21hcmssIG51bGwpOworCQkJCXVwZGF0ZVNlYXJjaFJlcXVlc3QoKTsJCisJCQl9CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgaGFuZGxlSW1wb3J0KCkgeworCQlTaXRlQm9va21hcmtbXSBzaXRlQm9va21hcmtzID0gU2l0ZXNJbXBvcnRFeHBvcnQuZ2V0SW1wb3J0ZWRCb29rbWFya3MoZ2V0U2hlbGwoKSk7CisJCWlmIChzaXRlQm9va21hcmtzICE9IG51bGwgJiYgc2l0ZUJvb2ttYXJrcy5sZW5ndGggPiAwKSB7CisJCQlVcGRhdGVNb2RlbCBtb2RlbCA9IFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRVcGRhdGVNb2RlbCgpOworCQkJU2l0ZUJvb2ttYXJrW10gY3VycmVudEJvb2ttYXJrcyA9IGdldEFsbFNpdGVCb29rbWFya3MoKTsKKwkJCWZvciAoaW50IGk9MDsgaTxzaXRlQm9va21hcmtzLmxlbmd0aDsgaSsrKSB7CisJCQkJYm9vbGVhbiBzaXRlRXhpc3RzID0gZmFsc2U7CisJCQkJZm9yIChpbnQgaj0wOyAhc2l0ZUV4aXN0cyAmJiBqPGN1cnJlbnRCb29rbWFya3MubGVuZ3RoOyBqKyspCisJCQkJCWlmIChjdXJyZW50Qm9va21hcmtzW2pdLmdldFVSTCgpLmVxdWFscyhzaXRlQm9va21hcmtzW2ldLmdldFVSTCgpKSkKKwkJCQkJCXNpdGVFeGlzdHMgPSB0cnVlOworCQkJCWlmICghc2l0ZUV4aXN0cykKKwkJCQkJbW9kZWwuYWRkQm9va21hcmsoc2l0ZUJvb2ttYXJrc1tpXSk7CisJCQl9CisJCQltb2RlbC5zYXZlQm9va21hcmtzKCk7CisJCQl1cGRhdGVTZWFyY2hSZXF1ZXN0KCk7CisJCX0KKwkJcmV0dXJuOworCX0KKwkKKwlwcml2YXRlIHZvaWQgaGFuZGxlRXhwb3J0KCkgeworCQlTaXRlc0ltcG9ydEV4cG9ydC5leHBvcnRCb29rbWFya3MoZ2V0U2hlbGwoKSwgZ2V0QWxsU2l0ZUJvb2ttYXJrcygpKTsKKwl9CisJCisJcHJpdmF0ZSBpbnQgaGFuZGxlTmFtZUVkaXQoU2l0ZUJvb2ttYXJrIGJvb2ttYXJrKSB7CisJCUVkaXRTaXRlRGlhbG9nIGRpYWxvZyA9IG5ldyBFZGl0U2l0ZURpYWxvZyhnZXRTaGVsbCgpLCBib29rbWFyaywgZ2V0QWxsU2l0ZUJvb2ttYXJrcygpLCB0cnVlKTsKKwkJZGlhbG9nLmNyZWF0ZSgpOworCQlTdHJpbmcgdGl0bGUgPSBib29rbWFyay5pc0xvY2FsKCkgPyBVcGRhdGVVSU1lc3NhZ2VzLlNpdGVQYWdlX2RpYWxvZ0VkaXRMb2NhbCA6IFVwZGF0ZVVJTWVzc2FnZXMuU2l0ZVBhZ2VfZGlhbG9nRWRpdFVwZGF0ZVNpdGU7IAorCQkvLyAvLyROT04tTkxTLTIkCisJCWRpYWxvZy5nZXRTaGVsbCgpLnNldFRleHQodGl0bGUpOworCQlpbnQgcmMgPSBkaWFsb2cub3BlbigpOworCQlyZXR1cm4gcmM7CisJfQorCisJcHJpdmF0ZSB2b2lkIGhhbmRsZVNpdGVDaGVja2VkKFNpdGVCb29rbWFyayBib29rbWFyaywgYm9vbGVhbiBjaGVja2VkKSB7CisJCWlmIChib29rbWFyay5pc1VuYXZhaWxhYmxlKCkpIHsKKwkJCWJvb2ttYXJrLnNldFNlbGVjdGVkKGZhbHNlKTsKKwkJCXZpZXdlci5zZXRDaGVja2VkKGJvb2ttYXJrLCBmYWxzZSk7CisJCQlyZXR1cm47CisJCX0KKwkJCisJCWJvb2ttYXJrLnNldFNlbGVjdGVkKGNoZWNrZWQpOworCQl1cGRhdGVTZWFyY2hSZXF1ZXN0KCk7CisJfQorCisKKwlwcml2YXRlIHZvaWQgaGFuZGxlU2VsZWN0aW9uQ2hhbmdlZChJU3RydWN0dXJlZFNlbGVjdGlvbiBzc2VsKSB7CisJCWJvb2xlYW4gZW5hYmxlID0gZmFsc2U7CisJCU9iamVjdCBpdGVtID0gc3NlbC5nZXRGaXJzdEVsZW1lbnQoKTsKKwkJU3RyaW5nIGRlc2NyaXB0aW9uID0gbnVsbDsKKwkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBTaXRlQm9va21hcmspIHsKKwkJCWVuYWJsZSA9ICEoKFNpdGVCb29rbWFyaykgaXRlbSkuaXNSZWFkT25seSgpOworCQkJZGVzY3JpcHRpb24gPSAoKFNpdGVCb29rbWFyaylpdGVtKS5nZXREZXNjcmlwdGlvbigpOworCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBTaXRlQ2F0ZWdvcnkpIHsKKy8vCQkJSVVSTEVudHJ5IGRlc2NFbnRyeSA9ICgoU2l0ZUNhdGVnb3J5KWl0ZW0pLmdldENhdGVnb3J5KCkuZ2V0RGVzY3JpcHRpb24oKTsKKy8vCQkJaWYgKGRlc2NFbnRyeSAhPSBudWxsKQorLy8JCQkJZGVzY3JpcHRpb24gPSBkZXNjRW50cnkuZ2V0QW5ub3RhdGlvbigpOworCQl9CisJCWVkaXRCdXR0b24uc2V0RW5hYmxlZChlbmFibGUpOworCQlyZW1vdmVCdXR0b24uc2V0RW5hYmxlZChlbmFibGUpOworCisJCWlmIChkZXNjcmlwdGlvbiA9PSBudWxsKQorCQkJZGVzY3JpcHRpb24gPSAiIjsgLy8kTk9OLU5MUy0xJAorCQlkZXNjTGFiZWwuc2V0VGV4dChVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0V3JpdGFibGVYTUxTdHJpbmcoZGVzY3JpcHRpb24pKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgdXBkYXRlU2VhcmNoUmVxdWVzdCgpIHsKKwkJT2JqZWN0W10gY2hlY2tlZCA9IHZpZXdlci5nZXRDaGVja2VkRWxlbWVudHMoKTsKKworCQlVcGRhdGVTZWFyY2hTY29wZSBzY29wZSA9IG5ldyBVcGRhdGVTZWFyY2hTY29wZSgpOworCQlpbnQgbnNpdGVzID0gMDsKKworCQlmb3IgKGludCBpID0gMDsgaSA8IGNoZWNrZWQubGVuZ3RoOyBpKyspIHsKKwkJCWlmIChjaGVja2VkW2ldIGluc3RhbmNlb2YgU2l0ZUJvb2ttYXJrKSB7CisJCQkJU2l0ZUJvb2ttYXJrIGJvb2ttYXJrID0gKFNpdGVCb29rbWFyaykgY2hlY2tlZFtpXTsKKwkJCQlzY29wZS5hZGRTZWFyY2hTaXRlKAorCQkJCQlib29rbWFyay5nZXRMYWJlbCgpLAorCQkJCQlib29rbWFyay5nZXRVUkwoKSwKKwkJCQkJYm9va21hcmsuZ2V0SWdub3JlZENhdGVnb3JpZXMoKSk7CisJCQkJbnNpdGVzKys7CisJCQl9CisJCX0KKwkJc2VhcmNoUmVxdWVzdC5zZXRTY29wZShzY29wZSk7CisJCXNldFBhZ2VDb21wbGV0ZShuc2l0ZXMgPiAwKTsKKwl9CisKKwlwdWJsaWMgVXBkYXRlU2VhcmNoUmVxdWVzdCBnZXRTZWFyY2hSZXF1ZXN0KCkgeworCQlyZXR1cm4gc2VhcmNoUmVxdWVzdDsKKwl9CisgICAgCisJcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZhbHVlKSB7CisJCXN1cGVyLnNldFZpc2libGUodmFsdWUpOworCQlpZiAodmFsdWUpIHsKKwkJCS8vIFJlc2V0IGFsbCB1bmF2YWlsYWJsZSBzaXRlcywgc28gdGhleSBjYW4gYmUgdHJpZWQgYWdhaW4gaWYgdGhlIHVzZXIgd2FudHMgaXQKKwkJCVNpdGVCb29rbWFya1tdIGJvb2ttYXJrcyA9IGdldEFsbFNpdGVCb29rbWFya3MoKTsKKwkJCWZvciAoaW50IGk9MDsgaTxib29rbWFya3MubGVuZ3RoOyBpKyspIHsKKwkJCQlpZiAoYm9va21hcmtzW2ldLmlzVW5hdmFpbGFibGUoKSkKKwkJCQkJYm9va21hcmtzW2ldLnNldFVuYXZhaWxhYmxlKGZhbHNlKTsKKwkJCX0KKwkJCWF1dG9tYXRpY2FsbHlTZWxlY3RNaXJyb3JzID0gVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldEJvb2xlYW4oVXBkYXRlQ29yZS5QX0FVVE9NQVRJQ0FMTFlfQ0hPT1NFX01JUlJPUik7CisJCQlhdXRvbWF0aWNhbGx5U2VsZWN0TWlycm9yc0NoZWNrYm94LnNldFNlbGVjdGlvbihhdXRvbWF0aWNhbGx5U2VsZWN0TWlycm9ycyk7CisJCX0KKwl9CisJCisJcHJpdmF0ZSBTaXRlQm9va21hcmtbXSBnZXRBbGxTaXRlQm9va21hcmtzKCkgeworCQlVcGRhdGVNb2RlbCBtb2RlbCA9IFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRVcGRhdGVNb2RlbCgpOworCQlPYmplY3RbXSBib29rbWFya3MgPSBtb2RlbC5nZXRCb29rbWFya0xlYWZzKCk7CisJCU9iamVjdFtdIHNpdGVzVG9WaXNpdCA9CisJCQlkaXNjb3ZlcnlGb2xkZXIuZ2V0Q2hpbGRyZW4oZGlzY292ZXJ5Rm9sZGVyKTsKKwkJU2l0ZUJvb2ttYXJrW10gYWxsID0gbmV3IFNpdGVCb29rbWFya1tib29rbWFya3MubGVuZ3RoICsgc2l0ZXNUb1Zpc2l0Lmxlbmd0aF07CisJCVN5c3RlbS5hcnJheWNvcHkoYm9va21hcmtzLCAwLCBhbGwsIDAsIGJvb2ttYXJrcy5sZW5ndGgpOworCQlTeXN0ZW0uYXJyYXljb3B5KAorCQkJc2l0ZXNUb1Zpc2l0LAorCQkJMCwKKwkJCWFsbCwKKwkJCWJvb2ttYXJrcy5sZW5ndGgsCisJCQlzaXRlc1RvVmlzaXQubGVuZ3RoKTsKKwkJcmV0dXJuIGFsbDsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKKwkJcmV0dXJuIHZpZXdlci5nZXRDaGVja2VkRWxlbWVudHMoKS5sZW5ndGggIT0gMDsKKwl9Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9TaXRlc0ltcG9ydEV4cG9ydC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvU2l0ZXNJbXBvcnRFeHBvcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTg0YWYyCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvU2l0ZXNJbXBvcnRFeHBvcnQuamF2YQpAQCAtMCwwICsxLDg4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLndpemFyZHM7CisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbC4qOworCisvKioKKyAqLworcHVibGljIGNsYXNzIFNpdGVzSW1wb3J0RXhwb3J0IHsKKworCXN0YXRpYyBTdHJpbmcgbGFzdExvY2F0aW9uID0gbnVsbDsKKwkKKwlwdWJsaWMgU2l0ZXNJbXBvcnRFeHBvcnQoKSB7CisJCXN1cGVyKCk7CisJfQorCQorCisJcHVibGljIHN0YXRpYyBTaXRlQm9va21hcmtbXSBnZXRJbXBvcnRlZEJvb2ttYXJrcyhTaGVsbCBwYXJlbnQpIHsKKwkJRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgRmlsZURpYWxvZyhwYXJlbnQpOworCQlkaWFsb2cuc2V0VGV4dCgKKwkJCVVwZGF0ZVVJTWVzc2FnZXMuTG9jYWxTaXRlU2VsZWN0b3JfZGlhbG9nTWVzc2FnZUltcG9ydCk7IAorCisJCWRpYWxvZy5zZXRGaWx0ZXJFeHRlbnNpb25zKG5ldyBTdHJpbmdbXSB7ICIqLnhtbCIsICIqIiB9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisKKwkJU2l0ZUJvb2ttYXJrW10gc2l0ZUJvb2ttYXJrcyA9IG51bGw7CisKKwkJU3RyaW5nIGJvb2ttYXJrc0ZpbGUgPSBkaWFsb2cub3BlbigpOworCQl3aGlsZSAoYm9va21hcmtzRmlsZSAhPSBudWxsICYmIHNpdGVCb29rbWFya3MgPT0gbnVsbCkgeworCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoYm9va21hcmtzRmlsZSk7CisJCQlzaXRlQm9va21hcmtzID0gY3JlYXRlSW1wb3J0ZWRCb29rbWFya3MoZmlsZSk7CisJCQlpZiAoc2l0ZUJvb2ttYXJrcyA9PSBudWxsIHx8IHNpdGVCb29rbWFya3MubGVuZ3RoID09IDApIHsKKwkJCQlNZXNzYWdlRGlhbG9nLm9wZW5JbmZvcm1hdGlvbigKKwkJCQkJcGFyZW50LAorCQkJCQlVcGRhdGVVSU1lc3NhZ2VzLkxvY2FsU2l0ZVNlbGVjdG9yX2ltcG9ydEluZm9UaXRsZSwgCisJCQkJCVVwZGF0ZVVJTWVzc2FnZXMuTG9jYWxTaXRlU2VsZWN0b3JfaW1wb3J0SW5mb01lc3NhZ2UpOyAKKwkJCQlib29rbWFya3NGaWxlID0gZGlhbG9nLm9wZW4oKTsKKwkJCX0gZWxzZSB7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJcmV0dXJuIHNpdGVCb29rbWFya3M7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGV4cG9ydEJvb2ttYXJrcyhTaGVsbCBwYXJlbnQsIFNpdGVCb29rbWFya1tdIHNpdGVCb29rbWFya3MpIHsKKwkJRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgRmlsZURpYWxvZyhwYXJlbnQsIFNXVC5TQVZFKTsKKwkJZGlhbG9nLnNldFRleHQoCisJCQlVcGRhdGVVSU1lc3NhZ2VzLkxvY2FsU2l0ZVNlbGVjdG9yX2RpYWxvZ01lc3NhZ2VFeHBvcnQpOyAKKworCQlkaWFsb2cuc2V0RmlsZU5hbWUoImJvb2ttYXJrcy54bWwiKTsgLy8kTk9OLU5MUy0xJAorCisJCVN0cmluZyBib29rbWFya3NGaWxlID0gZGlhbG9nLm9wZW4oKTsKKwkJaWYgKGJvb2ttYXJrc0ZpbGUgPT0gbnVsbCkKKwkJCXJldHVybjsKKwkJCisJCVZlY3RvciBib29rbWFya3MgPSBuZXcgVmVjdG9yKHNpdGVCb29rbWFya3MubGVuZ3RoKTsKKwkJZm9yIChpbnQgaT0wOyBpPHNpdGVCb29rbWFya3MubGVuZ3RoOyBpKyspCisJCQlib29rbWFya3MuYWRkKHNpdGVCb29rbWFya3NbaV0pOworCQlCb29rbWFya1V0aWwuc3RvcmUoYm9va21hcmtzRmlsZSwgYm9va21hcmtzKTsKKwl9CisJCisJLyoqCisJICogQ3JlYXRlcyBib29rbWFya3Mgb3V0IGZyb20gdGhlIGdpdmVuIGZpbGUKKwkgKiAKKwkgKiBAcGFyYW0gZmlsZQorCSAqIEByZXR1cm4KKwkgKi8KKwlzdGF0aWMgU2l0ZUJvb2ttYXJrW10gY3JlYXRlSW1wb3J0ZWRCb29rbWFya3MoRmlsZSBmaWxlKSB7CisJCVZlY3RvciBib29rbWFya3MgPSBuZXcgVmVjdG9yKCk7CisJCUJvb2ttYXJrVXRpbC5wYXJzZShmaWxlLmdldEFic29sdXRlUGF0aCgpLCBib29rbWFya3MpOworCQlyZXR1cm4gQm9va21hcmtVdGlsLmdldEJvb2ttYXJrcyhib29rbWFya3MpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvVGFibGVMYXlvdXRDb21wb3NpdGUuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL1RhYmxlTGF5b3V0Q29tcG9zaXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFhYTRmNAotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL1RhYmxlTGF5b3V0Q29tcG9zaXRlLmphdmEKQEAgLTAsMCArMSwxODggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkud2l6YXJkczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5MYXlvdXREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uUGl4ZWxEYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uV2VpZ2h0RGF0YTsKKworLyoqCisgKiBBIHNwZWNpYWwgY29tcG9zaXRlIHRvIGxheW91dCBjb2x1bW5zIGluc2lkZSBhIHRhYmxlLiBUaGUgY29tcG9zaXRlIGlzIG5lZWRlZCBzaW5jZSB3ZSBoYXZlCisgKiB0byBsYXlvdXQgdGhlIGNvbHVtbnMgImJlZm9yZSIgdGhlIGFjdHVhbCB0YWJsZSBnZXRzIGxheW91dGVkLiBIZW5jZSB3ZSBjYW4ndCB1c2UgYSBub3JtYWwKKyAqIGxheW91dCBtYW5hZ2VyLgorICovCitwdWJsaWMgY2xhc3MgVGFibGVMYXlvdXRDb21wb3NpdGUgZXh0ZW5kcyBDb21wb3NpdGUgeworCisJcHJpdmF0ZSBMaXN0IGNvbHVtbnM9IG5ldyBBcnJheUxpc3QoKTsKKwkKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIGV4dHJhIHBpeGVscyB0YWtlbiBhcyBob3Jpem9udGFsIHRyaW0gYnkgdGhlIHRhYmxlIGNvbHVtbi4gCisJICogVG8gZW5zdXJlIHRoZXJlIGFyZSBOIHBpeGVscyBhdmFpbGFibGUgZm9yIHRoZSBjb250ZW50IG9mIHRoZSBjb2x1bW4sCisJICogYXNzaWduIE4rQ09MVU1OX1RSSU0gZm9yIHRoZSBjb2x1bW4gd2lkdGguCisJICogCisJICogQHNpbmNlIDMuMQorCSAqLworCXByaXZhdGUgc3RhdGljIGludCBDT0xVTU5fVFJJTSA9ICJjYXJib24iLmVxdWFscyhTV1QuZ2V0UGxhdGZvcm0oKSkgPyAyNCA6IDM7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VGFibGVMYXlvdXRDb21wb3NpdGU8L2NvZGU+LgorCSAqLworCXB1YmxpYyBUYWJsZUxheW91dENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKKwkJc3VwZXIocGFyZW50LCBzdHlsZSk7CisgICAgICAgIGFkZENvbnRyb2xMaXN0ZW5lcihuZXcgQ29udHJvbEFkYXB0ZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZSkgeworICAgICAgICAgICAgICAgIFJlY3RhbmdsZSBhcmVhPSBnZXRDbGllbnRBcmVhKCk7CisgICAgICAgICAgICAgICAgVGFibGUgdGFibGU9IChUYWJsZSlnZXRDaGlsZHJlbigpWzBdOworICAgICAgICAgICAgICAgIFBvaW50IHByZWZlcnJlZFNpemU9IGNvbXB1dGVUYWJsZVNpemUodGFibGUpOworICAgICAgICAgICAgICAgIGludCB3aWR0aD0gYXJlYS53aWR0aCAtIDIgKiB0YWJsZS5nZXRCb3JkZXJXaWR0aCgpOworICAgICAgICAgICAgICAgIGlmIChwcmVmZXJyZWRTaXplLnkgPiBhcmVhLmhlaWdodCkgeworICAgICAgICAgICAgICAgICAgICAvLyBTdWJ0cmFjdCB0aGUgc2Nyb2xsYmFyIHdpZHRoIGZyb20gdGhlIHRvdGFsIGNvbHVtbiB3aWR0aAorICAgICAgICAgICAgICAgICAgICAvLyBpZiBhIHZlcnRpY2FsIHNjcm9sbGJhciB3aWxsIGJlIHJlcXVpcmVkCisgICAgICAgICAgICAgICAgICAgIFBvaW50IHZCYXJTaXplID0gdGFibGUuZ2V0VmVydGljYWxCYXIoKS5nZXRTaXplKCk7CisgICAgICAgICAgICAgICAgICAgIHdpZHRoIC09IHZCYXJTaXplLng7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxheW91dFRhYmxlKHRhYmxlLCB3aWR0aCwgYXJlYSwgdGFibGUuZ2V0U2l6ZSgpLnggPCBhcmVhLndpZHRoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisJfQorCQorCS8qKgorCSAqIEFkZHMgYSBuZXcgY29sdW1uIG9mIGRhdGEgdG8gdGhpcyB0YWJsZSBsYXlvdXQuCisJICoKKwkgKiBAcGFyYW0gZGF0YSB0aGUgY29sdW1uIGxheW91dCBkYXRhCisJICovCisJcHVibGljIHZvaWQgYWRkQ29sdW1uRGF0YShDb2x1bW5MYXlvdXREYXRhIGRhdGEpIHsKKwkJY29sdW1ucy5hZGQoZGF0YSk7CisJfQorCQorCS8vLS0tLSBIZWxwZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkKKwlwcml2YXRlIFBvaW50IGNvbXB1dGVUYWJsZVNpemUoVGFibGUgdGFibGUpIHsKKwkJUG9pbnQgcmVzdWx0PSB0YWJsZS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOworCQkKKwkJaW50IHdpZHRoPSAwOworCQlpbnQgc2l6ZT0gY29sdW1ucy5zaXplKCk7CisJCWZvciAoaW50IGk9IDA7IGkgPCBzaXplOyArK2kpIHsKKwkJCUNvbHVtbkxheW91dERhdGEgbGF5b3V0RGF0YT0gKENvbHVtbkxheW91dERhdGEpIGNvbHVtbnMuZ2V0KGkpOworCQkJaWYgKGxheW91dERhdGEgaW5zdGFuY2VvZiBDb2x1bW5QaXhlbERhdGEpIHsKKwkJCQlDb2x1bW5QaXhlbERhdGEgY29sPSAoQ29sdW1uUGl4ZWxEYXRhKSBsYXlvdXREYXRhOworCQkJCXdpZHRoICs9IGNvbC53aWR0aDsKKwkJCQlpZiAoY29sLmFkZFRyaW0pIHsKKwkJCQkJd2lkdGggKz0gQ09MVU1OX1RSSU07CisJCQkJfQorCQkJfSBlbHNlIGlmIChsYXlvdXREYXRhIGluc3RhbmNlb2YgQ29sdW1uV2VpZ2h0RGF0YSkgeworCQkJCUNvbHVtbldlaWdodERhdGEgY29sPSAoQ29sdW1uV2VpZ2h0RGF0YSkgbGF5b3V0RGF0YTsKKwkJCQl3aWR0aCArPSBjb2wubWluaW11bVdpZHRoOworCQkJfSBlbHNlIHsKKwkJCQlBc3NlcnQuaXNUcnVlKGZhbHNlLCAiVW5rbm93biBjb2x1bW4gbGF5b3V0IGRhdGEiKTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQl9CisJCWlmICh3aWR0aCA+IHJlc3VsdC54KQorCQkJcmVzdWx0Lng9IHdpZHRoOworCQlyZXR1cm4gcmVzdWx0OworCX0KKwkKKwlwcml2YXRlIHZvaWQgbGF5b3V0VGFibGUoVGFibGUgdGFibGUsIGludCB3aWR0aCwgUmVjdGFuZ2xlIGFyZWEsIGJvb2xlYW4gaW5jcmVhc2UpIHsKKwkJLy8gWFhYOiBMYXlvdXQgaXMgYmVpbmcgY2FsbGVkIHdpdGggYW4gaW52YWxpZCB2YWx1ZSB0aGUgZmlyc3QgdGltZQorCQkvLyBpdCBpcyBiZWluZyBjYWxsZWQgb24gTGludXguIFRoaXMgbWV0aG9kIHJlc2V0cyB0aGUKKwkJLy8gTGF5b3V0IHRvIG51bGwgc28gd2UgbWFrZSBzdXJlIHdlIHJ1biBpdCBvbmx5IHdoZW4KKwkJLy8gdGhlIHZhbHVlIGlzIE9LLgorCQlpZiAod2lkdGggPD0gMSkKKwkJCXJldHVybjsKKworCQlUYWJsZUNvbHVtbltdIHRhYmxlQ29sdW1ucz0gdGFibGUuZ2V0Q29sdW1ucygpOworCQlpbnQgc2l6ZT0gTWF0aC5taW4oY29sdW1ucy5zaXplKCksIHRhYmxlQ29sdW1ucy5sZW5ndGgpOworCQlpbnRbXSB3aWR0aHM9IG5ldyBpbnRbc2l6ZV07CisJCWludCBmaXhlZFdpZHRoPSAwOworCQlpbnQgbnVtYmVyT2ZXZWlnaHRDb2x1bW5zPSAwOworCQlpbnQgdG90YWxXZWlnaHQ9IDA7CisKKwkJLy8gRmlyc3QgY2FsYyBzcGFjZSBvY2N1cGllZCBieSBmaXhlZCBjb2x1bW5zCisJCWZvciAoaW50IGk9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCUNvbHVtbkxheW91dERhdGEgY29sPSAoQ29sdW1uTGF5b3V0RGF0YSkgY29sdW1ucy5nZXQoaSk7CisJCQlpZiAoY29sIGluc3RhbmNlb2YgQ29sdW1uUGl4ZWxEYXRhKSB7CisJCQkJQ29sdW1uUGl4ZWxEYXRhIGNwZCA9IChDb2x1bW5QaXhlbERhdGEpIGNvbDsKKwkJCQlpbnQgcGl4ZWxzID0gY3BkLndpZHRoOworCQkJCWlmIChjcGQuYWRkVHJpbSkgeworCQkJCQlwaXhlbHMgKz0gQ09MVU1OX1RSSU07CisJCQkJfQorCQkJCXdpZHRoc1tpXT0gcGl4ZWxzOworCQkJCWZpeGVkV2lkdGggKz0gcGl4ZWxzOworCQkJfSBlbHNlIGlmIChjb2wgaW5zdGFuY2VvZiBDb2x1bW5XZWlnaHREYXRhKSB7CisJCQkJQ29sdW1uV2VpZ2h0RGF0YSBjdz0gKENvbHVtbldlaWdodERhdGEpIGNvbDsKKwkJCQludW1iZXJPZldlaWdodENvbHVtbnMrKzsKKwkJCQkvLyBmaXJzdCB0aW1lLCB1c2UgdGhlIHdlaWdodCBzcGVjaWZpZWQgYnkgdGhlIGNvbHVtbiBkYXRhLCBvdGhlcndpc2UgdXNlIHRoZSBhY3R1YWwgd2lkdGggYXMgdGhlIHdlaWdodAorCQkJCS8vIGludCB3ZWlnaHQgPSBmaXJzdFRpbWUgPyBjdy53ZWlnaHQgOiB0YWJsZUNvbHVtbnNbaV0uZ2V0V2lkdGgoKTsKKwkJCQlpbnQgd2VpZ2h0PSBjdy53ZWlnaHQ7CisJCQkJZml4ZWRXaWR0aCs9Y3cubWluaW11bVdpZHRoOworCQkJCXRvdGFsV2VpZ2h0ICs9IHdlaWdodDsKKwkJCX0gZWxzZSB7CisJCQkJQXNzZXJ0LmlzVHJ1ZShmYWxzZSwgIlVua25vd24gY29sdW1uIGxheW91dCBkYXRhIik7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJfQorCisJCS8vIERvIHdlIGhhdmUgY29sdW1ucyB0aGF0IGhhdmUgYSB3ZWlnaHQKKwkJaWYgKG51bWJlck9mV2VpZ2h0Q29sdW1ucyA+IDApIHsKKwkJCS8vIE5vdyBkaXN0cmlidXRlIHRoZSByZXN0IHRvIHRoZSBjb2x1bW5zIHdpdGggd2VpZ2h0LgorCQkJaW50IHJlc3Q9IHdpZHRoIC0gZml4ZWRXaWR0aDsKKwkJCWludCB0b3RhbERpc3RyaWJ1dGVkPSAwOworCQkJZm9yIChpbnQgaT0gMDsgaSA8IHNpemU7ICsraSkgeworCQkJCUNvbHVtbkxheW91dERhdGEgY29sPSAoQ29sdW1uTGF5b3V0RGF0YSkgY29sdW1ucy5nZXQoaSk7CisJCQkJaWYgKGNvbCBpbnN0YW5jZW9mIENvbHVtbldlaWdodERhdGEpIHsKKwkJCQkJQ29sdW1uV2VpZ2h0RGF0YSBjdz0gKENvbHVtbldlaWdodERhdGEpIGNvbDsKKwkJCQkJLy8gY2FsY3VsYXRlIHdlaWdodCBhcyBhYm92ZQorCQkJCQkvLyBpbnQgd2VpZ2h0ID0gZmlyc3RUaW1lID8gY3cud2VpZ2h0IDogdGFibGVDb2x1bW5zW2ldLmdldFdpZHRoKCk7CisJCQkJCWludCB3ZWlnaHQ9IGN3LndlaWdodDsKKwkJCQkJaW50IHNwYXJlUGl4ZWxzPSB0b3RhbFdlaWdodCA9PSAwID8gMCA6IHdlaWdodCAqIHJlc3QgLyB0b3RhbFdlaWdodDsKKwkJCQkJaW50IG5ld1dpZHRoID0gY3cubWluaW11bVdpZHRoOworCQkJCQlpZiAoc3BhcmVQaXhlbHMgPjAgKQorCQkJCQkJbmV3V2lkdGggKz0gc3BhcmVQaXhlbHM7CisJCQkJCXRvdGFsRGlzdHJpYnV0ZWQgKz0gbmV3V2lkdGg7CisJCQkJCXdpZHRoc1tpXT0gbmV3V2lkdGg7CisJCQkJfQorCQkJfQorCisJCQkvLyBEaXN0cmlidXRlIGFueSByZW1haW5pbmcgcGl4ZWxzIHRvIGNvbHVtbnMgd2l0aCB3ZWlnaHQuCisJCQlpbnQgZGlmZj0gcmVzdCAtIHRvdGFsRGlzdHJpYnV0ZWQ7CisJCQlmb3IgKGludCBpPSAwOyBkaWZmID4gMDsgKytpKSB7CisJCQkJaWYgKGkgPT0gc2l6ZSkKKwkJCQkJaT0gMDsKKwkJCQlDb2x1bW5MYXlvdXREYXRhIGNvbD0gKENvbHVtbkxheW91dERhdGEpIGNvbHVtbnMuZ2V0KGkpOworCQkJCWlmIChjb2wgaW5zdGFuY2VvZiBDb2x1bW5XZWlnaHREYXRhKSB7CisJCQkJCSsrd2lkdGhzW2ldOworCQkJCQktLWRpZmY7CisJCQkJfQorCQkJfQorCQl9CisJCQorCQlpZiAoaW5jcmVhc2UpIHsKKwkJCXRhYmxlLnNldFNpemUoYXJlYS53aWR0aCwgYXJlYS5oZWlnaHQpOworCQl9CisJCWZvciAoaW50IGk9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCXRhYmxlQ29sdW1uc1tpXS5zZXRXaWR0aCh3aWR0aHNbaV0pOworCQl9CisJCWlmICghaW5jcmVhc2UpIHsKKwkJCXRhYmxlLnNldFNpemUoYXJlYS53aWR0aCwgYXJlYS5oZWlnaHQpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvVGFyZ2V0UGFnZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvVGFyZ2V0UGFnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NDIzZWIKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9UYXJnZXRQYWdlLmphdmEKQEAgLTAsMCArMSw4MzMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkud2l6YXJkczsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudGV4dC5EZWNpbWFsRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRG91YmxlQ2xpY2tFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEb3VibGVDbGlja0xpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudUl0ZW07CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi5JQ29uZmlndXJlZFNpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uSUluc3RhbGxDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLklJbnN0YWxsQ29uZmlndXJhdGlvbkNoYW5nZWRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi5Mb2NhbFN5c3RlbUluZm87CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVNpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuQ29uZmlndXJlZFNpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuVXBkYXRlQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwub3BlcmF0aW9ucy5VcGRhdGVVdGlsczsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUk7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJSW1hZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSU1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wYXJ0cy5EZWZhdWx0Q29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wYXJ0cy5TV1RVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLklJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbjsKKworcHVibGljIGNsYXNzIFRhcmdldFBhZ2UgZXh0ZW5kcyBCYW5uZXJQYWdlIGltcGxlbWVudHMgSUR5bmFtaWNQYWdlIHsKKwkKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkVBVFVSRV9OQU1FX0NPTFVNTiA9IDA7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZFQVRVUkVfVkVSU0lPTl9DT0xVTU4gPSAxOworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGRUFUVVJFX1NJWkVfQ09MVU1OID0gMjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5TVEFMTEFUSU9OX0RJUkVDVE9SWV9DT0xVTU4gPSAzOworCQorCXByaXZhdGUgZmxvYXQgZmVhdHVyZU5hbWVDb2x1bW5Qcm9jZXRhbmdlID0gMC4yNWY7CisJcHJpdmF0ZSBmbG9hdCBmZWF0dXJlVmVyc2lvbkNvbHVtblByb2NldGFuZ2UgPSAwLjI1ZjsKKwlwcml2YXRlIGZsb2F0IGZlYXR1cmVTaXplQ29sdW1uUHJvY2V0YW5nZSA9IDAuMTVmOworCQorCXByaXZhdGUgVGFibGVWaWV3ZXIgam9iVmlld2VyOworCXByaXZhdGUgSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZzsKKwlwcml2YXRlIExhYmVsIHJlcXVpcmVkU3BhY2VMYWJlbDsKKwlwcml2YXRlIExhYmVsIGF2YWlsYWJsZVNwYWNlTGFiZWw7CisJcHJpdmF0ZSBJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb25bXSBqb2JzOworICAgIC8vcHJpdmF0ZSBJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gY3VycmVudEpvYjsKKyAgICBwcml2YXRlIExhYmVsIGluc3RhbGxMb2NhdGlvbjsKKyAgICBwcml2YXRlIEJ1dHRvbiBjaGFuZ2VMb2NhdGlvbjsKKyAgICBwcml2YXRlIElDb25maWd1cmVkU2l0ZSBbXSBhZGRlZFNpdGVzOworICAgIAorICAgIHByaXZhdGUgYm9vbGVhbiBpc1VwZGF0ZTsgLy8gd2hldGhlciB0aGUgd2l6YXJkIGlzIHVwZGF0aW5nIGEgZmVhdHVyZSBvciBpbnN0YWxsaW5nIGEgbmV3IG9uZQorCisJY2xhc3MgSm9ic0NvbnRlbnRQcm92aWRlcgorCQlleHRlbmRzIERlZmF1bHRDb250ZW50UHJvdmlkZXIKKwkJaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB7CisJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgcGFyZW50KSB7CisJCQlyZXR1cm4gam9iczsKKwkJfQorCX0KKworCWNsYXNzIEpvYnNMYWJlbFByb3ZpZGVyCisJCWV4dGVuZHMgTGFiZWxQcm92aWRlcgorCQlpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgeworCQkJCisJCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3Qgb2JqLCBpbnQgY29sKSB7CisJCQkKKwkJCWlmIChjb2wgPiAwKSB7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCQkKKwkJCVVwZGF0ZUxhYmVsUHJvdmlkZXIgcHJvdmlkZXIgPSBVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0TGFiZWxQcm92aWRlcigpOworCisJCQlJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gam9iID0gKElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbikgb2JqOworCQkJSW1hZ2VEZXNjcmlwdG9yIGJhc2UgPQorCQkJCWpvYi5nZXRGZWF0dXJlKCkuaXNQYXRjaCgpCisJCQkJCT8gVXBkYXRlVUlJbWFnZXMuREVTQ19FRklYX09CSgorCQkJCQk6IFVwZGF0ZVVJSW1hZ2VzLkRFU0NfRkVBVFVSRV9PQko7CisJCQlpbnQgZmxhZ3MgPSAwOworCQkJaWYgKGpvYi5nZXRUYXJnZXRTaXRlKCkgPT0gbnVsbCkKKwkJCQlmbGFncyA9IFVwZGF0ZUxhYmVsUHJvdmlkZXIuRl9FUlJPUjsKKwkJCXJldHVybiBwcm92aWRlci5nZXQoYmFzZSwgZmxhZ3MpOworCQl9CisKKwkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmosIGludCBjb2wpIHsKKwkJCQorCQkJSUZlYXR1cmUgZmVhdHVyZSA9ICgoSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uKSBvYmopLmdldEZlYXR1cmUoKTsKKwkJCUlDb25maWd1cmVkU2l0ZSBjc2l0ZSA9KChJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24pb2JqKS5nZXRUYXJnZXRTaXRlKCk7IAorCQkJSVNpdGUgc2l0ZSA9IGNzaXRlIT1udWxsP2NzaXRlLmdldFNpdGUoKTpudWxsOworCQkJaWYgKGNvbCA9PSBGRUFUVVJFX05BTUVfQ09MVU1OKSB7CQkJCQorCQkJCXJldHVybiBmZWF0dXJlLmdldExhYmVsKCk7CisJCQl9IGVsc2UgaWYgKGNvbCA9PSBGRUFUVVJFX1ZFUlNJT05fQ09MVU1OKSB7CisJCQkJcmV0dXJuIGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldFZlcnNpb24oKS50b1N0cmluZygpOworCQkJfSBlbHNlIGlmIChjb2wgPT0gRkVBVFVSRV9TSVpFX0NPTFVNTikgeworCQkJCWlmIChzaXRlPT1udWxsKQorCQkJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKKwkJCQlsb25nIHJlcXVpcmVkU3BhY2UgPSBzaXRlLmdldERvd25sb2FkU2l6ZUZvcihmZWF0dXJlKSArIHNpdGUuZ2V0SW5zdGFsbFNpemVGb3IoZmVhdHVyZSk7CisJCQkJcmV0dXJuIGdldFNpemVTdHJpbmcocmVxdWlyZWRTcGFjZSk7CisJCQl9IGVsc2UgaWYgKGNvbCA9PSBJTlNUQUxMQVRJT05fRElSRUNUT1JZX0NPTFVNTikgeworCQkJCWlmIChzaXRlPT1udWxsKQorCQkJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKKwkJCQlyZXR1cm4gc2l0ZS5nZXRVUkwoKS5nZXRGaWxlKCkudG9TdHJpbmcoKTsKKwkJCX0KKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAorCQl9CisJfQorCQorCWNsYXNzIEpvYlZpZXdlclNvcnRlciBleHRlbmRzIFZpZXdlclNvcnRlciB7CisJCQorCQkKKwkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFTQ0VORElORyA9IDA7CisKKwkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFU0NFTkRJTkcgPSAxOworCisJCXByaXZhdGUgaW50IGNvbHVtbjsKKworCQlwcml2YXRlIGludCBkaXJlY3Rpb247CisKKwkJcHVibGljIHZvaWQgZG9Tb3J0KGludCBjb2x1bW4pIHsKKworCQkJaWYgKGNvbHVtbiA9PSB0aGlzLmNvbHVtbikgeworCQkJCWRpcmVjdGlvbiA9IDEgLSBkaXJlY3Rpb247CisJCQl9IGVsc2UgeworCQkJCXRoaXMuY29sdW1uID0gY29sdW1uOworCQkJCWRpcmVjdGlvbiA9IEFTQ0VORElORzsKKwkJCX0KKwkJfQorCisJCS8qKgorCQkgKiBDb21wYXJlcyB0aGUgb2JqZWN0IGZvciBzb3J0aW5nCisJCSAqLworCQlwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKKworCQkJaW50IHJjID0gMDsKKwkJCQorCQkJSUZlYXR1cmUgZmVhdHVyZTEgPSAoKElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbikgbzEpLmdldEZlYXR1cmUoKTsKKwkJCUlGZWF0dXJlIGZlYXR1cmUyID0gKChJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24pIG8yKS5nZXRGZWF0dXJlKCk7CisKKwkJCVN0cmluZyBmZWF0dXJlTmFtZTEgPSBmZWF0dXJlMS5nZXRMYWJlbCgpOworCQkJU3RyaW5nIGZlYXR1cmVOYW1lMiA9IGZlYXR1cmUyLmdldExhYmVsKCk7CisJCQkKKwkJCVN0cmluZyBmZWF0dXJlSWQxID0gZmVhdHVyZTEuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldFZlcnNpb24oKS50b1N0cmluZygpOworCQkJU3RyaW5nIGZlYXR1cmVJZDIgPSBmZWF0dXJlMi5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0VmVyc2lvbigpLnRvU3RyaW5nKCk7CisKKwkJCVN0cmluZyBpbnN0YWxsYXRpb25EaXJlY3RvcnkxID0gKChJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24pbzEpLmdldFRhcmdldFNpdGUoKS5nZXRTaXRlKCkuZ2V0VVJMKCkuZ2V0RmlsZSgpLnRvU3RyaW5nKCk7CisJCQlTdHJpbmcgaW5zdGFsbGF0aW9uRGlyZWN0b3J5MiA9ICgoSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uKW8yKS5nZXRUYXJnZXRTaXRlKCkuZ2V0U2l0ZSgpLmdldFVSTCgpLmdldEZpbGUoKS50b1N0cmluZygpOworCisJCQlzd2l0Y2ggKGNvbHVtbikgeworCQkJY2FzZSBGRUFUVVJFX05BTUVfQ09MVU1OOgorCQkJCXJjID0gY29sbGF0b3IuY29tcGFyZShmZWF0dXJlTmFtZTEsIGZlYXR1cmVOYW1lMik7CisJCQkJYnJlYWs7CisJCQljYXNlIEZFQVRVUkVfVkVSU0lPTl9DT0xVTU46CisJCQkJcmMgPSBjb2xsYXRvci5jb21wYXJlKGZlYXR1cmVJZDEsIGZlYXR1cmVJZDIpOworCQkJCWJyZWFrOworCQkJY2FzZSBJTlNUQUxMQVRJT05fRElSRUNUT1JZX0NPTFVNTjoKKwkJCQlyYyA9IGNvbGxhdG9yLmNvbXBhcmUoaW5zdGFsbGF0aW9uRGlyZWN0b3J5MSwgaW5zdGFsbGF0aW9uRGlyZWN0b3J5Mik7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8vIElmIGRlc2NlbmRpbmcgb3JkZXIsIGZsaXAgdGhlIGRpcmVjdGlvbgorCQkJaWYgKGRpcmVjdGlvbiA9PSBERVNDRU5ESU5HKQorCQkJCXJjID0gLXJjOworCisJCQlyZXR1cm4gcmM7CisJCX0KKwl9CisJCisJY2xhc3MgQ29uZmlnTGlzdGVuZXIgaW1wbGVtZW50cyBJSW5zdGFsbENvbmZpZ3VyYXRpb25DaGFuZ2VkTGlzdGVuZXIgeworCQlwdWJsaWMgdm9pZCBpbnN0YWxsU2l0ZUFkZGVkKElDb25maWd1cmVkU2l0ZSBjc2l0ZSkgeworCQkJCisJCQkvLyBzZXQgdGhlIHNpdGUgYXMgdGFyZ2V0IGZvciBhbGwgam9icyB3aXRob3V0IGEgdGFyZ2V0CisJCQlmb3IgKGludCBpPTA7IGpvYnMgIT0gbnVsbCAmJiBpPGpvYnMubGVuZ3RoOyBpKyspCisJCQkJaWYgKGpvYnNbaV0uZ2V0VGFyZ2V0U2l0ZSgpID09IG51bGwgJiYgZ2V0U2l0ZVZpc2liaWxpdHkoY3NpdGUsIGpvYnNbaV0pKSB7CisJCQkJCWpvYnNbaV0uc2V0VGFyZ2V0U2l0ZShjc2l0ZSk7CisJCQkJfQorCisJCQlqb2JWaWV3ZXIucmVmcmVzaCgpOworCQl9CisKKwkJcHVibGljIHZvaWQgaW5zdGFsbFNpdGVSZW1vdmVkKElDb25maWd1cmVkU2l0ZSBjc2l0ZSkgeworCQkJLy8gcmVtb3ZlIHRoZSB0YXJnZXQgc2l0ZSBmb3IgYWxsIGpvYnMgdGhhdCB1c2UgaXQKKwkJCS8vIHNldCB0aGUgc2l0ZSBhcyB0YXJnZXQgZm9yIGFsbCBqb2JzIHdpdGhvdXQgYSB0YXJnZXQKKwkJCWJvb2xlYW4gcmVmcmVzaEpvYnMgPSBmYWxzZTsKKwkJCWZvciAoaW50IGk9MDsgam9icyAhPSBudWxsICYmIGk8am9icy5sZW5ndGg7IGkrKykKKwkJCQlpZiAoam9ic1tpXS5nZXRUYXJnZXRTaXRlKCkgPT0gY3NpdGUpIHsKKwkJCQkJam9ic1tpXS5zZXRUYXJnZXRTaXRlKG51bGwpOworCQkJCQlyZWZyZXNoSm9icyA9IHRydWU7CisJCQkJfQorCQkJCQorCQkJcGFnZUNoYW5nZWQoKTsKKwkJCQorCQkJam9iVmlld2VyLnJlZnJlc2goKTsKKwkJCWlmIChyZWZyZXNoSm9icykgeworCQkJCWpvYlZpZXdlci5nZXRDb250cm9sKCkuc2V0Rm9jdXMoKTsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yIGZvciBSZXZpZXdQYWdlMgorCSAqLworCXB1YmxpYyBUYXJnZXRQYWdlKElJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcsIGJvb2xlYW4gaXNVcGRhdGUpIHsKKwkJc3VwZXIoIlRhcmdldCIpOyAvLyROT04tTkxTLTEkCisJCXNldFRpdGxlKFVwZGF0ZVVJTWVzc2FnZXMuSW5zdGFsbFdpemFyZF9UYXJnZXRQYWdlX3RpdGxlKTsgCisJCXNldERlc2NyaXB0aW9uKFVwZGF0ZVVJTWVzc2FnZXMuSW5zdGFsbFdpemFyZF9UYXJnZXRQYWdlX2Rlc2MpOyAKKwkJdGhpcy5jb25maWcgPSBjb25maWc7CisJCVVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRMYWJlbFByb3ZpZGVyKCkuY29ubmVjdCh0aGlzKTsKKwkJdGhpcy5pc1VwZGF0ZSA9IGlzVXBkYXRlOworCX0KKworCXB1YmxpYyB2b2lkIHNldEpvYnMoSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uW10gam9icykgeworCQkvL3dlIG5lZWQgb25seSB1bmlxdWUgZmVhdHVyZXMKKwkJLy91c2luZyBTZXQgaGVyZSBhbGxvd3MgdXMgdG8gZ2V0IHJpZCBvZiBhIGR1cGxpY2F0ZSBlbGVtZW50cworCQlTZXQgam9ic1NldCA9IG5ldyBIYXNoU2V0KCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgam9icy5sZW5ndGg7IGkrKykgeworCQkJam9ic1NldC5hZGQoam9ic1tpXSk7CisJCX0KKwkJCisJCXRoaXMuam9icyA9IChJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb25bXSkgam9ic1NldC50b0FycmF5KG5ldyBJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb25bam9ic1NldC5zaXplKCldKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQlVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0TGFiZWxQcm92aWRlcigpLmRpc2Nvbm5lY3QodGhpcyk7CisvLwkJY29uZmlnLnJlbW92ZUluc3RhbGxDb25maWd1cmF0aW9uQ2hhbmdlZExpc3RlbmVyKGNvbmZpZ0xpc3RlbmVyKTsKKwkJc3VwZXIuZGlzcG9zZSgpOworCX0KKworCXB1YmxpYyBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJQ29tcG9zaXRlIGNsaWVudCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7CisJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKKwkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOworCQlsYXlvdXQubWFyZ2luV2lkdGggPSBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKKwkJY2xpZW50LnNldExheW91dChsYXlvdXQpOworCQljbGllbnQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7CisJCQorCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjbGllbnQsIFNXVC5OVUxMKTsKKwkJbGFiZWwuc2V0VGV4dChVcGRhdGVVSU1lc3NhZ2VzLkluc3RhbGxXaXphcmRfVGFyZ2V0UGFnZV9qb2JzTGFiZWwpOyAKKwkJY3JlYXRlSm9iVmlld2VyKGNsaWVudCk7CisKKwkJbGFiZWwgPSBuZXcgTGFiZWwoY2xpZW50LCBTV1QuTlVMTCk7CisJCWxhYmVsLnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5JbnN0YWxsV2l6YXJkX1RhcmdldFBhZ2VfbG9jYXRpb24pOyAKKyAgICAgICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcpOworICAgICAgICBsYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKKworCQlpbnN0YWxsTG9jYXRpb24gPSBuZXcgTGFiZWwoY2xpZW50LCBTV1QuTlVMTCk7CisgICAgICAgIGluc3RhbGxMb2NhdGlvbi5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOworICAgICAgICBpbnN0YWxsTG9jYXRpb24uc2V0TGF5b3V0RGF0YShnZCk7CisgICAgICAgIAorICAgICAgICBjaGFuZ2VMb2NhdGlvbiA9IG5ldyBCdXR0b24oY2xpZW50LCBTV1QuUFVTSCk7CisgICAgICAgIGNoYW5nZUxvY2F0aW9uLnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5JbnN0YWxsV2l6YXJkX1RhcmdldFBhZ2VfbG9jYXRpb25fY2hhbmdlKTsgCisgICAgICAgIGNoYW5nZUxvY2F0aW9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworICAgICAgICAgICAgICAgIGNoYW5nZUxvY2F0aW9uT2ZGZWF0dXJlcygpOworICAgICAgICAgICAgfQorCisJCQkKKyAgICAgICAgfSk7CisJCQkKKwkJQ29tcG9zaXRlIHN0YXR1cyA9IG5ldyBDb21wb3NpdGUoY2xpZW50LCBTV1QuTlVMTCk7CisJCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7CisJCWdkLmhvcml6b250YWxTcGFuID0gMzsKKwkJc3RhdHVzLnNldExheW91dERhdGEoZ2QpOworCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOworCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7CisJCXN0YXR1cy5zZXRMYXlvdXQobGF5b3V0KTsKKwkJbGFiZWwgPSBuZXcgTGFiZWwoc3RhdHVzLCBTV1QuTlVMTCk7CisJCWxhYmVsLnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5JbnN0YWxsV2l6YXJkX1RhcmdldFBhZ2VfcmVxdWlyZWRTcGFjZSk7IAorCQlyZXF1aXJlZFNwYWNlTGFiZWwgPSBuZXcgTGFiZWwoc3RhdHVzLCBTV1QuTlVMTCk7CisJCXJlcXVpcmVkU3BhY2VMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKKwkJbGFiZWwgPSBuZXcgTGFiZWwoc3RhdHVzLCBTV1QuTlVMTCk7CisJCWxhYmVsLnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5JbnN0YWxsV2l6YXJkX1RhcmdldFBhZ2VfYXZhaWxhYmxlU3BhY2UpOyAKKwkJYXZhaWxhYmxlU3BhY2VMYWJlbCA9IG5ldyBMYWJlbChzdGF0dXMsIFNXVC5OVUxMKTsKKwkJYXZhaWxhYmxlU3BhY2VMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKKworICAgICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNsaWVudCwgIm9yZy5lY2xpcHNlLnVwZGF0ZS51aS5NdWx0aVRhcmdldFBhZ2UyIik7IC8vJE5PTi1OTFMtMSQKKwkJCisJCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKKwkJCisJCXJldHVybiBjbGllbnQ7CisJfQorCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZUpvYlZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7CisJCQorCQlmaW5hbCBUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShwYXJlbnQsIFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIgfCBTV1QuTVVMVEkgfCBTV1QuUkVTSVpFIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKKwkJCisJCVRhYmxlQ29sdW1uIGZlYXR1cmVOYW1lQ29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTEVGVCwgRkVBVFVSRV9OQU1FX0NPTFVNTik7CisJCWZlYXR1cmVOYW1lQ29sdW1uLnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5UYXJnZXRQYWdlX0ZlYXR1cmVOYW1lQ29sdW1uKTsgCisJCWZlYXR1cmVOYW1lQ29sdW1uLnNldFdpZHRoKDc1KTsKKwkJCisJCVRhYmxlQ29sdW1uIGZlYXR1cmVWZXJzaW9uQ29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTEVGVCwgRkVBVFVSRV9WRVJTSU9OX0NPTFVNTik7CisJCWZlYXR1cmVWZXJzaW9uQ29sdW1uLnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5UYXJnZXRQYWdlX0ZlYXR1cmVfVmVyc2lvbik7IAorCQlmZWF0dXJlVmVyc2lvbkNvbHVtbi5zZXRXaWR0aCg3NSk7CisJCQorCQlUYWJsZUNvbHVtbiBmZWF0dXJlU2l6ZUNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULkxFRlQsIEZFQVRVUkVfU0laRV9DT0xVTU4pOworCQlmZWF0dXJlU2l6ZUNvbHVtbi5zZXRUZXh0KFVwZGF0ZVVJTWVzc2FnZXMuVGFyZ2V0UGFnZV9GZWF0dXJlX1NpemUpOyAKKwkJZmVhdHVyZVNpemVDb2x1bW4uc2V0V2lkdGgoNzUpOworCQkKKwkJVGFibGVDb2x1bW4gZmVhdHVyZUxvY2F0aW9uQ29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTEVGVCwgSU5TVEFMTEFUSU9OX0RJUkVDVE9SWV9DT0xVTU4pOworCQlmZWF0dXJlTG9jYXRpb25Db2x1bW4uc2V0VGV4dChVcGRhdGVVSU1lc3NhZ2VzLlRhcmdldFBhZ2VfSW5zdGFsbGF0aW9uRGlyZWN0b3J5Q29sdW1uKTsgCisJCWZlYXR1cmVMb2NhdGlvbkNvbHVtbi5zZXRXaWR0aCg3NSk7CisJCWpvYlZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcih0YWJsZSk7CisJCQorCQkvL2pvYlZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcihwYXJlbnQsIFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIgfCBTV1QuTVVMVEkpOworCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOworICAgICAgICBnZC5ob3Jpem9udGFsU3BhbiA9IDM7CisJCWdkLndpZHRoSGludCA9IDE1MDsKKwkJZ2QuaGVpZ2h0SGludCA9IDIwMDsKKwkJam9iVmlld2VyLmdldFRhYmxlKCkuc2V0TGF5b3V0RGF0YShnZCk7CisJCWpvYlZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEpvYnNDb250ZW50UHJvdmlkZXIoKSk7CisJCWpvYlZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBKb2JzTGFiZWxQcm92aWRlcigpKTsKKwkJam9iVmlld2VyLnNldFNvcnRlcihuZXcgSm9iVmlld2VyU29ydGVyKCkpOworCQkKKwkJam9iVmlld2VyLmFkZERvdWJsZUNsaWNrTGlzdGVuZXIobmV3IElEb3VibGVDbGlja0xpc3RlbmVyKCkgeworCQkJCXB1YmxpYyB2b2lkIGRvdWJsZUNsaWNrKERvdWJsZUNsaWNrRXZlbnQgZXZlbnQpIHsKKwkJCQkJY2hhbmdlTG9jYXRpb25PZkZlYXR1cmVzKCk7CQkJCQorCQkJCX0KKwkJCX0KKwkJKTsKKwkJCisJCXRhYmxlLmFkZExpc3RlbmVyKFNXVC5NZW51RGV0ZWN0LCBuZXcgTGlzdGVuZXIoKSB7CisJCSAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7CisJCSAgICAJICBNZW51IG1lbnUgPSBuZXcgTWVudSAoZ2V0U2hlbGwoKSwgU1dULlBPUF9VUCk7CisJCQkJCU1lbnVJdGVtIGl0ZW0gPSBuZXcgTWVudUl0ZW0gKG1lbnUsIFNXVC5QVVNIKTsKKwkJCQkJaXRlbS5zZXRUZXh0KFVwZGF0ZVVJTWVzc2FnZXMuSW5zdGFsbFdpemFyZF9UYXJnZXRQYWdlX2xvY2F0aW9uX2NoYW5nZSk7CisJCQkJCWl0ZW0uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKKwkJCQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgeworCQkJCQkJCQljaGFuZ2VMb2NhdGlvbk9mRmVhdHVyZXMoKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCSk7CisJCQkJCW1lbnUuc2V0TG9jYXRpb24gKGV2ZW50LngsIGV2ZW50LnkpOworCQkJCQltZW51LnNldFZpc2libGUgKHRydWUpOworCQkgICAgICB9CisJCQl9CisJCSk7CisJCWZlYXR1cmVOYW1lQ29sdW1uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7CisJCQkJCSgoSm9iVmlld2VyU29ydGVyKSBqb2JWaWV3ZXIuZ2V0U29ydGVyKCkpLmRvU29ydChGRUFUVVJFX05BTUVfQ09MVU1OKTsKKwkJCQkJam9iVmlld2VyLnJlZnJlc2goKTsKKwkJCQl9CisJCSAgICB9CisJCSk7CisJCQorCQlmZWF0dXJlVmVyc2lvbkNvbHVtbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJICAgICAgCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7CisJCSAgICAgIAkJKChKb2JWaWV3ZXJTb3J0ZXIpIGpvYlZpZXdlci5nZXRTb3J0ZXIoKSkuZG9Tb3J0KEZFQVRVUkVfVkVSU0lPTl9DT0xVTU4pOworCQkgICAgICAJCWpvYlZpZXdlci5yZWZyZXNoKCk7CisJCSAgICAgIAl9CisJCSAgICB9CisJCSk7CisJCQorCQlmZWF0dXJlU2l6ZUNvbHVtbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJICAgICAgCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7CisJCSAgICAgIAkJKChKb2JWaWV3ZXJTb3J0ZXIpIGpvYlZpZXdlci5nZXRTb3J0ZXIoKSkuZG9Tb3J0KEZFQVRVUkVfU0laRV9DT0xVTU4pOworCQkgICAgICAJCWpvYlZpZXdlci5yZWZyZXNoKCk7CisJCSAgICAgIAl9CisJCSAgICB9CisJCSk7CisJCQorCQlmZWF0dXJlTG9jYXRpb25Db2x1bW4uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CisJCSAgICAgIAlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgeworCQkgICAgICAJCSgoSm9iVmlld2VyU29ydGVyKSBqb2JWaWV3ZXIuZ2V0U29ydGVyKCkpLmRvU29ydChJTlNUQUxMQVRJT05fRElSRUNUT1JZX0NPTFVNTik7CisJCSAgICAgIAkJam9iVmlld2VyLnJlZnJlc2goKTsKKwkJICAgICAgCX0KKwkJICAgIH0KKwkJKTsKKwkJCisJCXRhYmxlLmFkZENvbnRyb2xMaXN0ZW5lcihuZXcgQ29udHJvbEFkYXB0ZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZSkgeworCisKKwkJCQlSZWN0YW5nbGUgYXJlYSA9IHRhYmxlLmdldENsaWVudEFyZWEoKTsKKwkJCQlQb2ludCBwcmVmZXJyZWRTaXplID0gdGFibGUuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKKworCQkJCWludCB0YWJsZVdpZHRoID0gYXJlYS53aWR0aCAtIDMgKiB0YWJsZS5nZXRCb3JkZXJXaWR0aCgpOworCQkJCWlmIChwcmVmZXJyZWRTaXplLnkgPiBhcmVhLmhlaWdodCArIHRhYmxlLmdldEhlYWRlckhlaWdodCgpKXsKKwkJCQkJUG9pbnQgdkJhclNpemUgPSB0YWJsZS5nZXRWZXJ0aWNhbEJhcigpLmdldFNpemUoKTsKKwkJCQkJdGFibGVXaWR0aCAtPSB2QmFyU2l6ZS54OworCQkJCX0JCQorCQkJCQorCQkJCVRhYmxlQ29sdW1uIGZlYXR1cmVOYW1lQ29sdW1uID0gdGFibGUuZ2V0Q29sdW1uKEZFQVRVUkVfTkFNRV9DT0xVTU4pOworCQkJCVRhYmxlQ29sdW1uIGZlYXR1cmVWZXJzaW9uQ29sdW1uID0gdGFibGUuZ2V0Q29sdW1uKEZFQVRVUkVfVkVSU0lPTl9DT0xVTU4pOworCQkJCVRhYmxlQ29sdW1uIGZlYXR1cmVTaXplQ29sdW1uID0gdGFibGUuZ2V0Q29sdW1uKEZFQVRVUkVfU0laRV9DT0xVTU4pOworCQkJCVRhYmxlQ29sdW1uIGZlYXR1cmVMb2NhdGlvbkNvbHVtbiA9IHRhYmxlLmdldENvbHVtbihJTlNUQUxMQVRJT05fRElSRUNUT1JZX0NPTFVNTik7CisKKwkJCQlmZWF0dXJlTmFtZUNvbHVtbi5zZXRXaWR0aCgoaW50KSh0YWJsZVdpZHRoICogZmVhdHVyZU5hbWVDb2x1bW5Qcm9jZXRhbmdlKSk7CisJCQkJZmVhdHVyZVZlcnNpb25Db2x1bW4uc2V0V2lkdGgoKGludCkodGFibGVXaWR0aCAqIGZlYXR1cmVWZXJzaW9uQ29sdW1uUHJvY2V0YW5nZSkpOworCQkJCWZlYXR1cmVTaXplQ29sdW1uLnNldFdpZHRoKChpbnQpKHRhYmxlV2lkdGggKiBmZWF0dXJlU2l6ZUNvbHVtblByb2NldGFuZ2UpKTsKKwkJCQlmZWF0dXJlTG9jYXRpb25Db2x1bW4uc2V0V2lkdGgodGFibGVXaWR0aCAtIGZlYXR1cmVOYW1lQ29sdW1uLmdldFdpZHRoKCkgLSBmZWF0dXJlVmVyc2lvbkNvbHVtbi5nZXRXaWR0aCgpIC0gZmVhdHVyZVNpemVDb2x1bW4uZ2V0V2lkdGgoKSk7CQkgICAgCQorCisJCQkJCisJCQkJZmVhdHVyZU5hbWVDb2x1bW5Qcm9jZXRhbmdlID0gZmVhdHVyZU5hbWVDb2x1bW4uZ2V0V2lkdGgoKSAvIChmbG9hdCl0YWJsZVdpZHRoOworCQkJCWZlYXR1cmVWZXJzaW9uQ29sdW1uUHJvY2V0YW5nZSA9IGZlYXR1cmVWZXJzaW9uQ29sdW1uLmdldFdpZHRoKCkgLyAoZmxvYXQpdGFibGVXaWR0aDsKKwkJCQlmZWF0dXJlU2l6ZUNvbHVtblByb2NldGFuZ2UgPSBmZWF0dXJlU2l6ZUNvbHVtbi5nZXRXaWR0aCgpIC8gKGZsb2F0KXRhYmxlV2lkdGg7CisJCQl9CisJCX0pOworCisKKwkJam9iVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7CisJCQkJdXBkYXRlU3RhdHVzKCk7CisKKwkJCX0KKwkJfSk7CisJCQorCQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOworCSAgICB0YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7CisJfQorCisJcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKKwkJaWYgKHZpc2libGUpIHsKKwkJCWluaXRpYWxpemVEZWZhdWx0VGFyZ2V0U2l0ZXMoKTsKKwkJCWpvYlZpZXdlci5zZXRJbnB1dChqb2JzKTsKKwkJCWlmIChqb2JWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkuaXNFbXB0eSgpICYmIGpvYnMubGVuZ3RoID4gMCkKKwkJCQlqb2JWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGpvYnNbMF0pKTsKKwkJfQorCQkKKwkJc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgdmVyaWZ5Tm90RW1wdHkoYm9vbGVhbiBlbXB0eSkgeworCQlTdHJpbmcgZXJyb3JNZXNzYWdlID0gbnVsbDsKKwkJaWYgKGVtcHR5KQorCQkJZXJyb3JNZXNzYWdlID0gVXBkYXRlVUlNZXNzYWdlcy5JbnN0YWxsV2l6YXJkX1RhcmdldFBhZ2VfbG9jYXRpb25fZW1wdHk7IAorCQlzZXRFcnJvck1lc3NhZ2UoZXJyb3JNZXNzYWdlKTsKKwkJc2V0UGFnZUNvbXBsZXRlKCFlbXB0eSk7CisJfQorCisKKwlwcml2YXRlIHZvaWQgdXBkYXRlU3RhdHVzKCkgeworCQkKKwkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0ZWRKb2JzID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKWpvYlZpZXdlci5nZXRTZWxlY3Rpb24oKTsKKwkJSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIHNlbGVjdGVkSm9iID0gKElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbilzZWxlY3RlZEpvYnMuZ2V0Rmlyc3RFbGVtZW50KCk7CisJCisJCXJlcXVpcmVkU3BhY2VMYWJlbC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAorCQlhdmFpbGFibGVTcGFjZUxhYmVsLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCisJCWluc3RhbGxMb2NhdGlvbi5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAorCQkKKwkJaWYgKHNlbGVjdGVkSm9iID09IG51bGwpIHsKKwkJCXJldHVybjsKKwkJfQorCQkKKwkJSUNvbmZpZ3VyZWRTaXRlIHNpdGUgPSBzZWxlY3RlZEpvYi5nZXRUYXJnZXRTaXRlKCk7IC8qKElDb25maWd1cmVkU2l0ZSkgZWxlbWVudDsqLworCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShzaXRlLmdldFNpdGUoKS5nZXRVUkwoKS5nZXRGaWxlKCkpOworCQlsb25nIGF2YWlsYWJsZSA9IC0xOworCQlsb25nIHJlcXVpcmVkID0gLTE7CisJCWlmIChhcmVBbGxUYXJnZXRTaXRlc1NhbWUoKSkgeworCQkJYXZhaWxhYmxlID0gTG9jYWxTeXN0ZW1JbmZvLmdldEZyZWVTcGFjZShmaWxlKTsKKwkJCXJlcXVpcmVkID0gY29tcHV0ZVJlcXVpcmVkU2l6ZUZvcihzaXRlKTsKKwkJCS8vYWRkIHRoZSBkb3dubG9hZCBzaXplIHRvIHNwYWNlIHJlcXVpcmVkIHRvIGRvIG9wZXJhdGlvbiBzaW5jZSBhbGwgcGx1Z2lucyBhbmQgbm9ucGx1Z2luIGRhdGEgd2lsbCBiZSBkb3dubG9hZGVkIGZpcnN0CisJCQlyZXF1aXJlZCArPSBjb21wdXRlRG93bmxvYWRTaXplRm9yKHNpdGUpOyAKKwkJCWluc3RhbGxMb2NhdGlvbi5zZXRUZXh0KG5ldyBGaWxlKHNlbGVjdGVkSm9iLmdldFRhcmdldFNpdGUoKS5nZXRTaXRlKCkuZ2V0VVJMKCkuZ2V0RmlsZSgpKS50b1N0cmluZygpKTsKKwkJfQkJCisJCQorCQlpZiAoYXZhaWxhYmxlID09IExvY2FsU3lzdGVtSW5mby5TSVpFX1VOS05PV04pCisJCQlhdmFpbGFibGUgPSAtMTsKKwkJCisJCXJlcXVpcmVkU3BhY2VMYWJlbC5zZXRUZXh0KGdldFNpemVTdHJpbmcocmVxdWlyZWQpKTsKKwkJYXZhaWxhYmxlU3BhY2VMYWJlbC5zZXRUZXh0KGdldFNpemVTdHJpbmcoYXZhaWxhYmxlKSk7CisJCQorCQkKKwkJLy9pZiB0aGUgYXZhaWxhYmxlIHNwYWNlIHdhcyByZXRpcmV2ZWQgZnJvbSB0aGUgT1MgYW5kIHRoZSByZXF1aXJlZCBzcGFjZSBpcyBncmVhdGVyIHRoYXQgdGhlIGF2YWlsYWJsZSBzcGFjZSwgZG8gbm90IGxldCB0aGUgdXNlciBjb250aW51ZQorCQlpZihhdmFpbGFibGUgIT0gTG9jYWxTeXN0ZW1JbmZvLlNJWkVfVU5LTk9XTiAmJiByZXF1aXJlZCA+IGF2YWlsYWJsZSl7CisJCQl0aGlzLnNldFBhZ2VDb21wbGV0ZShmYWxzZSk7CisJCQkvL1RPRE86IHNldCBlcnJvciBtZXNzYWdlOiAiLi4ubm90IGVub3VnaCBzcGFjZS4uLiIKKwkJfWVsc2UKKwkJCXRoaXMuc2V0UGFnZUNvbXBsZXRlKHRydWUpOworCX0KKwkKKwlwcml2YXRlIGJvb2xlYW4gYXJlQWxsVGFyZ2V0U2l0ZXNTYW1lKCkgeworCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3RlZEpvYnMgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pam9iVmlld2VyLmdldFNlbGVjdGlvbigpOworCQlJdGVyYXRvciBpdGVyYXRvciA9IHNlbGVjdGVkSm9icy5pdGVyYXRvcigpOworCQlVUkwgc2l0ZSA9IG51bGw7CisJCWlmIChpdGVyYXRvciAhPSBudWxsKSB7CisJCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCQlJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gY3VycmVudCA9IChJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24pIGl0ZXJhdG9yLm5leHQoKTsJCQkJCisJCQkJaWYgKHNpdGUgIT0gbnVsbCkgeworCQkJCQlpZiAoIXNpdGUuZXF1YWxzKGN1cnJlbnQuZ2V0VGFyZ2V0U2l0ZSgpLmdldFNpdGUoKS5nZXRVUkwoKSkpIHsKKwkJCQkJCXJldHVybiBmYWxzZTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCXNpdGUgPSBjdXJyZW50LmdldFRhcmdldFNpdGUoKS5nZXRTaXRlKCkuZ2V0VVJMKCk7CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXByaXZhdGUgU3RyaW5nIGdldFNpemVTdHJpbmcobG9uZyBzaXplKSB7CisJCWlmIChzaXplIDw9IDApIHsKKwkJCXJldHVybiBVcGRhdGVVSU1lc3NhZ2VzLkluc3RhbGxXaXphcmRfVGFyZ2V0UGFnZV91bmtub3duU2l6ZTsKKwkJfSBlbHNlIHsKKwkJCWRvdWJsZSBvcmRlciA9IDEwMjQuMDsKKwkJCWRvdWJsZSBzaXplSW5NQiA9IHNpemUgLyBvcmRlcjsKKwkJCWRvdWJsZSBzaXplSW5HQiA9IHNpemUgLyBvcmRlciAvIG9yZGVyOworCQkJaWYgKCBzaXplSW5NQiA8IDEpIHsKKwkJCQlyZXR1cm4gTkxTLmJpbmQoVXBkYXRlVUlNZXNzYWdlcy5JbnN0YWxsV2l6YXJkX1RhcmdldFBhZ2Vfc2l6ZV9LQiwgIiIgKyBzaXplKTsgLy8kTk9OLU5MUy0xJAorCQkJfSBlbHNlIHsKKwkJCQlTdHJpbmcgcGF0dGVybiA9ICIjLiMjIjsgLy8kTk9OLU5MUy0xJAorCQkJCURlY2ltYWxGb3JtYXQgZm9ybWF0dGVyID0gbmV3IERlY2ltYWxGb3JtYXQocGF0dGVybik7CisJCQkJaWYgKHNpemVJbkdCIDwgMSkgewkJCQkJCisJCQkJCXJldHVybiBOTFMuYmluZChVcGRhdGVVSU1lc3NhZ2VzLkluc3RhbGxXaXphcmRfVGFyZ2V0UGFnZV9zaXplX01CLCBmb3JtYXR0ZXIuZm9ybWF0KHNpemVJbk1CKSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJcmV0dXJuIE5MUy5iaW5kKFVwZGF0ZVVJTWVzc2FnZXMuSW5zdGFsbFdpemFyZF9UYXJnZXRQYWdlX3NpemVfR0IsIGZvcm1hdHRlci5mb3JtYXQoc2l6ZUluR0IpKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlwcml2YXRlIGxvbmcgY29tcHV0ZVJlcXVpcmVkU2l6ZUZvcihJQ29uZmlndXJlZFNpdGUgc2l0ZSkgeworCQlsb25nIHRvdGFsU2l6ZSA9IDA7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgam9icy5sZW5ndGg7IGkrKykgeworCQkJaWYgKHNpdGUuZXF1YWxzKGpvYnNbaV0uZ2V0VGFyZ2V0U2l0ZSgpKSkgeworCQkJCWxvbmcgam9iU2l6ZSA9IHNpdGUuZ2V0U2l0ZSgpLmdldEluc3RhbGxTaXplRm9yKGpvYnNbaV0uZ2V0RmVhdHVyZSgpKTsKKwkJCQlpZiAoam9iU2l6ZSA9PSAtMSkKKwkJCQkJcmV0dXJuIC0xOworCQkJCXRvdGFsU2l6ZSArPSBqb2JTaXplOworCQkJfQorCQl9CisJCXJldHVybiB0b3RhbFNpemU7CisJfQorCQorCXByaXZhdGUgbG9uZyBjb21wdXRlRG93bmxvYWRTaXplRm9yKElDb25maWd1cmVkU2l0ZSBzaXRlKSB7CisJCWxvbmcgdG90YWxTaXplID0gMDsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBqb2JzLmxlbmd0aDsgaSsrKSB7CisJCQlpZiAoc2l0ZS5lcXVhbHMoam9ic1tpXS5nZXRUYXJnZXRTaXRlKCkpKSB7CisJCQkJbG9uZyBqb2JTaXplID0gc2l0ZS5nZXRTaXRlKCkuZ2V0RG93bmxvYWRTaXplRm9yKGpvYnNbaV0uZ2V0RmVhdHVyZSgpKTsKKwkJCQlpZiAoam9iU2l6ZSA9PSAtMSkKKwkJCQkJcmV0dXJuIC0xOworCQkJCXRvdGFsU2l6ZSArPSBqb2JTaXplOworCQkJfQorCQl9CisJCXJldHVybiB0b3RhbFNpemU7CisJfQorCisJcHJpdmF0ZSB2b2lkIHBhZ2VDaGFuZ2VkKCkgeworCQlib29sZWFuIGVtcHR5ID0gZmFsc2U7CisJCWZvciAoaW50IGk9MDsgam9icyE9bnVsbCAmJiBpPGpvYnMubGVuZ3RoOyBpKyspIHsKKwkJCWlmIChqb2JzW2ldLmdldFRhcmdldFNpdGUoKSA9PSBudWxsKSB7CisJCQkJZW1wdHkgPSB0cnVlOworCQkJCWJyZWFrOworCQkJfQorCQkKKwkJCUlGZWF0dXJlIGZlYXR1cmUgPSBqb2JzW2ldLmdldEZlYXR1cmUoKTsKKwkJCWlmIChmZWF0dXJlLmlzUGF0Y2goKSkgeworCQkJCS8vIFBhdGNoZXMgbXVzdCBnbyB0b2dldGhlciB3aXRoIHRoZSBmZWF0dXJlcworCQkJCS8vIHRoZXkgYXJlIHBhdGNoaW5nLgorCQkJCQorCQkJCS8vIENoZWNrIGN1cnJlbnQgam9icworCQkJCUlJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiBwYXRjaGVkRmVhdHVyZUpvYiA9IGZpbmRQYXRjaGVkRmVhdHVyZShmZWF0dXJlKTsKKwkJCQlpZiAocGF0Y2hlZEZlYXR1cmVKb2IgIT0gbnVsbAorCQkJCQkmJiBwYXRjaGVkRmVhdHVyZUpvYi5nZXRUYXJnZXRTaXRlKCkgIT0gbnVsbAorCQkJCQkmJiAham9ic1tpXS5nZXRUYXJnZXRTaXRlKCkuZXF1YWxzKHBhdGNoZWRGZWF0dXJlSm9iLmdldFRhcmdldFNpdGUoKSkpIHsKKwkJCQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKFVwZGF0ZVVJTWVzc2FnZXMuSW5zdGFsbFdpemFyZF9UYXJnZXRQYWdlX3BhdGNoRXJyb3IsIChuZXcgU3RyaW5nW10geworICAgICAgICAgICAgICAgICAgICBmZWF0dXJlLmdldExhYmVsKCksCisgICAgICAgICAgICAgICAgICAgIHBhdGNoZWRGZWF0dXJlSm9iLmdldEZlYXR1cmUoKS5nZXRMYWJlbCgpfSkpOworCQkJCQlzZXRFcnJvck1lc3NhZ2UobXNnKTsKKwkJCQkJc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCQkvLyBDaGVjayBpbnN0YWxsZWQgZmVhdHVyZXMKKwkJCQlJRmVhdHVyZSBwYXRjaGVkRmVhdHVyZSA9IFVwZGF0ZVV0aWxzLmdldFBhdGNoZWRGZWF0dXJlKGZlYXR1cmUpOworCQkJCWlmIChwYXRjaGVkRmVhdHVyZSAhPSBudWxsICAKKwkJCQkJJiYgIWpvYnNbaV0uZ2V0VGFyZ2V0U2l0ZSgpLmVxdWFscyhwYXRjaGVkRmVhdHVyZS5nZXRTaXRlKCkuZ2V0Q3VycmVudENvbmZpZ3VyZWRTaXRlKCkpKSB7CisJCQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChVcGRhdGVVSU1lc3NhZ2VzLkluc3RhbGxXaXphcmRfVGFyZ2V0UGFnZV9wYXRjaEVycm9yMiwgKG5ldyBTdHJpbmdbXSB7CisgICAgICAgICAgICAgICAgICAgIGZlYXR1cmUuZ2V0TGFiZWwoKSwKKyAgICAgICAgICAgICAgICAgICAgcGF0Y2hlZEZlYXR1cmUuZ2V0TGFiZWwoKSwKKyAgICAgICAgICAgICAgICAgICAgcGF0Y2hlZEZlYXR1cmUuZ2V0U2l0ZSgpLmdldEN1cnJlbnRDb25maWd1cmVkU2l0ZSgpLmdldFNpdGUoKS5nZXRVUkwoKS5nZXRGaWxlKCl9KSk7CisJCQkJCXNldEVycm9yTWVzc2FnZShtc2cpOworCQkJCQlzZXRQYWdlQ29tcGxldGUoZmFsc2UpOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJfQorCQl9CisJCXZlcmlmeU5vdEVtcHR5KGVtcHR5KTsKKwl9CisJCisJCisJcHJpdmF0ZSAgYm9vbGVhbiBnZXRTaXRlVmlzaWJpbGl0eShJQ29uZmlndXJlZFNpdGUgc2l0ZSwgSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIGpvYikgeworCQkvLyBEbyBub3QgYWxsb3cgaW5zdGFsbGluZyBpbnRvIGEgbm9uLXVwZGF0ZWFibGUgc2l0ZQorCQlpZiAoIXNpdGUuaXNVcGRhdGFibGUoKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJCisJCS8vIElmIGFmZmluaXR5IHNpdGUgaXMga25vd24sIG9ubHkgaXQgc2hvdWxkIGJlIHNob3duCisJCUlDb25maWd1cmVkU2l0ZSBhZmZpbml0eVNpdGUgPSBVcGRhdGVVdGlscy5nZXRBZmZpbml0eVNpdGUoY29uZmlnLCBqb2IuZ2V0RmVhdHVyZSgpKTsKKwkJaWYgKGFmZmluaXR5U2l0ZSAhPSBudWxsKSB7CisJCQkvLyBNdXN0IGNvbXBhcmUgcmVmZXJlbmNlZCBzaXRlcyBiZWNhdXNlCisJCQkvLyBjb25maWd1cmVkIHNpdGVzIHRoZW1zZWx2ZXMgbWF5IGNvbWUgZnJvbSAKKwkJCS8vIGRpZmZlcmVudCBjb25maWd1cmF0aW9ucworCQkJcmV0dXJuIHNpdGUuZ2V0U2l0ZSgpLmVxdWFscyhhZmZpbml0eVNpdGUuZ2V0U2l0ZSgpKTsKKwkJfQorCQkKKwkJLy8gQ28tbG9jYXRlIHVwZGF0ZXMgd2l0aCB0aGUgb2xkIGZlYXR1cmUKKwkJaWYgKGpvYi5nZXRPbGRGZWF0dXJlKCkgIT0gbnVsbCkgeworCQkJSUNvbmZpZ3VyZWRTaXRlIG9sZFNpdGUgPSBVcGRhdGVVdGlscy5nZXRTaXRlV2l0aEZlYXR1cmUoY29uZmlnLCBqb2IuZ2V0T2xkRmVhdHVyZSgpLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRJZGVudGlmaWVyKCkpOworCQkJcmV0dXJuIChzaXRlID09IG9sZFNpdGUpOworCQl9CisKKwkJLy8gQWxsb3cgaW5zdGFsbGluZyBpbnRvIGFueSBzaXRlIHRoYXQgaXMgdXBkYXRlYWJsZSBhbmQgdGhlcmUgaXMgbm8gYWZmaW5pdHkgc3BlY2lmaWVkCisJCXJldHVybiB0cnVlOworCX0KKwkKKwlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRUYXJnZXRTaXRlcygpIHsKKwkJCisJCQorCQlJQ29uZmlndXJlZFNpdGUgbW9zdFJlY2VhbnRseVVzZWRTaXRlID0gZ2V0TW9zdFJlY2VhbnRseVVzZWRTaXRlKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgam9icy5sZW5ndGg7IGkrKykgeworCQkJaWYgKGpvYnNbaV0uZ2V0VGFyZ2V0U2l0ZSgpICE9IG51bGwpCisJCQkJY29udGludWU7CisJCQkKKwkJCUlDb25maWd1cmVkU2l0ZSBhZmZpbml0eVNpdGUgPQlVcGRhdGVVdGlscy5nZXRBZmZpbml0eVNpdGUoY29uZmlnLCBqb2JzW2ldLmdldEZlYXR1cmUoKSk7CisJCQlpZiAoYWZmaW5pdHlTaXRlICE9IG51bGwpIHsKKwkJCQlqb2JzW2ldLnNldFRhcmdldFNpdGUoYWZmaW5pdHlTaXRlKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJSUNvbmZpZ3VyZWRTaXRlIGRlZmF1bHRTaXRlID0gVXBkYXRlVXRpbHMuZ2V0RGVmYXVsdFRhcmdldFNpdGUoY29uZmlnLCBqb2JzW2ldLCBmYWxzZSk7CisJCQlpZiAoZGVmYXVsdFNpdGUgIT0gbnVsbCkgeworCQkJCWpvYnNbaV0uc2V0VGFyZ2V0U2l0ZShkZWZhdWx0U2l0ZSk7CisJCQkJY29udGludWU7CisJCQl9CisJCQkKKwkJCWlmIChtb3N0UmVjZWFudGx5VXNlZFNpdGUgIT0gbnVsbCkgeworCQkJCWpvYnNbaV0uc2V0VGFyZ2V0U2l0ZShtb3N0UmVjZWFudGx5VXNlZFNpdGUpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJCisJCQlJQ29uZmlndXJlZFNpdGUgY3NpdGUgPSBnZXRGaXJzdFRhcmdldFNpdGUoam9ic1tpXSk7CisJCQlpZiAoY3NpdGUgPT0gbnVsbCAmJiBQbGF0Zm9ybS5nZXRJbnN0YWxsTG9jYXRpb24oKS5pc1JlYWRPbmx5KCkgJiYgaXNVcGRhdGUgPT0gZmFsc2UpIHsKKwkJCQkvLyB0aGVyZSBhcmUgbm8gdXBkYXRlYWJsZSBzaXRlcywgdGhlIGluc3RhbGxhdGlvbiBsb2NhdGlvbiBpcyByZWFkLW9ubHkgYW5kIHdlIGFyZSBpbnN0YWxsaW5nIGEgbmV3IGZlYXR1cmUKKwkJCQkvLyBtYWtlIGFuIHVwZGF0ZSBzaXRlIGluIHRoZSBjb25maWd1cmF0aW9uIGFyZWEKKwkJCQlTdHJpbmcgY29uZmlndXJhdGlvbkxvY2F0aW9uID0gUGxhdGZvcm0uZ2V0Q29uZmlndXJhdGlvbkxvY2F0aW9uKCkuZ2V0VVJMKCkuZ2V0RmlsZSgpOworCQkJCUZpbGUgc2l0ZSA9IG5ldyBGaWxlKGNvbmZpZ3VyYXRpb25Mb2NhdGlvbik7CisJCQkJaWYgKCFDb25maWd1cmVkU2l0ZS5jYW5Xcml0ZShzaXRlKSkgeworCQkJCQkvLyBpZiB3ZSBjYW5ub3Qgd3JpdGUgdG8gdGhlIGNvbmZpZ3VyYXRpb24gYXJlYSB0aGVuIG1ha2UgYW4gdXBkYXRlIHNpdGUgaW4gdGhlIHVzZXIncyBob21lIGRpcmVjdG9yeQorCQkJCQlzaXRlID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmhvbWUiKSArIEZpbGUuc2VwYXJhdG9yICsgIi5lY2xpcHNlIiArIEZpbGUuc2VwYXJhdG9yICsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJCQkJUGxhdGZvcm0uZ2V0UHJvZHVjdCgpLmdldElkKCkgKyBGaWxlLnNlcGFyYXRvciArICJ1cGRhdGVzIik7IC8vJE5PTi1OTFMtMSQKKwkJCQl9CisJCQkJdHJ5IHsKKwkJCQkJY3NpdGUgPSBjb25maWcuY3JlYXRlQ29uZmlndXJlZFNpdGUoc2l0ZSk7CisJCQkJCWNvbmZpZy5hZGRDb25maWd1cmVkU2l0ZShjc2l0ZSk7CisJCQkJCUlTdGF0dXMgc3RhdHVzID0gY3NpdGUudmVyaWZ5VXBkYXRhYmxlU3RhdHVzKCk7CisJCQkJCWlmICghc3RhdHVzLmlzT0soKSkKKwkJCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1cyk7CisJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkJCS8vIHRoZXJlIHdhcyBhIHByb2JsZW0sIHRoZSB1c2VyIG11c3QgY2hvb3NlIGFuIGluc3RhbGxhdGlvbiBzaXRlCisJCQkJCWNzaXRlID0gbnVsbDsKKwkJCQkJLy8gbm8gbmVlZCB0byBjaGVjayBpZiB0aGUgZGlyZWN0b3J5IGV4aXN0cyBiZWNhdXNlIEZpbGUuZGVsZXRlKCkgcmV0dXJucyBmYWxzZSBpZiBpdCdzIG5vdCB0aGVyZQorCQkJCQlkZWxldGVEaXIoc2l0ZSk7CisJCQkJfQorCQkJfQorCisJCQlqb2JzW2ldLnNldFRhcmdldFNpdGUoY3NpdGUpOworCQl9CisJfQorCQorCQlwcml2YXRlIGJvb2xlYW4gZGVsZXRlRGlyKEZpbGUgZGlyKSB7CisJCWlmIChkaXIuaXNEaXJlY3RvcnkoKSkgeworCQkJU3RyaW5nW10gZmlsZXMgPSBkaXIubGlzdCgpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgeworCQkJCWlmICghZGVsZXRlRGlyKG5ldyBGaWxlKGRpciwgZmlsZXNbaV0pKSkgeworCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBkaXIuZGVsZXRlKCk7CisJfQorCQorCXByaXZhdGUgSUNvbmZpZ3VyZWRTaXRlIGdldE1vc3RSZWNlYW50bHlVc2VkU2l0ZSgpIHsKKwkJSURpYWxvZ1NldHRpbmdzIG1hc3RlciA9IFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXREaWFsb2dTZXR0aW5ncygpOworCQlJRGlhbG9nU2V0dGluZ3Mgc2VjdGlvbiA9IG1hc3Rlci5nZXRTZWN0aW9uKFRhcmdldFNpdGVEaWFsb2cuTU9TVF9SRUNFQU5UTFlfVVNFRF9TSVRFX1VSTCk7CisJCWlmIChzZWN0aW9uID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCVN0cmluZyBtb3N0UmVjZWFudGx5VXNlZFNpdGVVUkxTdHJpbmcgPSBzZWN0aW9uLmdldChUYXJnZXRTaXRlRGlhbG9nLk1PU1RfUkVDRUFOVExZX1VTRURfU0lURV9VUkwpOyAKKwkJaWYgKG1vc3RSZWNlYW50bHlVc2VkU2l0ZVVSTFN0cmluZyA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQkKKwkJVVJMIG1vc3RSZWNlYW50bHlVc2VkU2l0ZVVSTCA9IG51bGw7CisJCXRyeSB7CisJCQltb3N0UmVjZWFudGx5VXNlZFNpdGVVUkwgPSBuZXcgVVJMKG1vc3RSZWNlYW50bHlVc2VkU2l0ZVVSTFN0cmluZyk7CisJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtdWUpIHsKKwkJCVVwZGF0ZUNvcmUubG9nKCJVcmwgZm9ybWF0IGlzIHdyb25nIGZvciB0aGUgbW9zdFJlY2VhbnRseVVzZWRTaXRlVVJMIGluIHByZWZlcmVuY2VzIiwgbXVlKTsgLy8kTk9OLU5MUy0xJAorCQkJbXVlLnByaW50U3RhY2tUcmFjZSgpOworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJSUNvbmZpZ3VyZWRTaXRlW10gc2l0ZXMgPSBjb25maWcuZ2V0Q29uZmlndXJlZFNpdGVzKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l0ZXMubGVuZ3RoOyBpKyspIHsKKwkJCUlDb25maWd1cmVkU2l0ZSBjb25maWd1cmVkU2l0ZSA9IHNpdGVzW2ldOworCQkJaWYgKG1vc3RSZWNlYW50bHlVc2VkU2l0ZVVSTC5lcXVhbHMoY29uZmlndXJlZFNpdGUuZ2V0U2l0ZSgpLmdldFVSTCgpKSkgeworCQkJCXJldHVybiBjb25maWd1cmVkU2l0ZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisJCisKKwlwcml2YXRlIElDb25maWd1cmVkU2l0ZSBnZXRGaXJzdFRhcmdldFNpdGUoSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIGpvYikgeworCQlJQ29uZmlndXJlZFNpdGVbXSBzaXRlcyA9IGNvbmZpZy5nZXRDb25maWd1cmVkU2l0ZXMoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXRlcy5sZW5ndGg7IGkrKykgeworCQkJSUNvbmZpZ3VyZWRTaXRlIGNzaXRlID0gc2l0ZXNbaV07CisJCQlpZiAoZ2V0U2l0ZVZpc2liaWxpdHkoY3NpdGUsIGpvYikgJiYgY3NpdGUuZ2V0U2l0ZSgpLmdldEN1cnJlbnRDb25maWd1cmVkU2l0ZSgpLnZlcmlmeVVwZGF0YWJsZVN0YXR1cygpLmlzT0soKSkKKwkJCQlyZXR1cm4gY3NpdGU7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCQorCXB1YmxpYyBJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gZmluZFBhdGNoZWRGZWF0dXJlKElGZWF0dXJlIHBhdGNoKSB7CisJCWZvciAoaW50IGk9MDsgaTxqb2JzLmxlbmd0aDsgaSsrKSB7CisJCQlJRmVhdHVyZSB0YXJnZXQgPSBqb2JzW2ldLmdldEZlYXR1cmUoKTsKKwkJCWlmICghdGFyZ2V0LmVxdWFscyhwYXRjaCkgJiYgVXBkYXRlVXRpbHMuaXNQYXRjaCh0YXJnZXQsIHBhdGNoKSkKKwkJCQlyZXR1cm4gam9ic1tpXTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAKKyAgICAvKiAobm9uLUphdmFkb2MpCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2UjaXNQYWdlQ29tcGxldGUoKQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgeworICAgICAgICAvLyBjaGVjayBpZiBhbGwgam9icyBoYXZlIGEgdGFyZ2V0IHNpdGUgc2V0CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBqb2JzICE9IG51bGwgJiYgaSA8IGpvYnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChqb2JzW2ldLmdldFRhcmdldFNpdGUoKSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIuaXNQYWdlQ29tcGxldGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gam9iCisgICAgICovCisvKiAgICBwcml2YXRlIHZvaWQgc2V0VGFyZ2V0TG9jYXRpb24oSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIGpvYikgeworICAgICAgICBpZiAoam9iICE9IG51bGwgJiYgam9iLmdldFRhcmdldFNpdGUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBpbnN0YWxsTG9jYXRpb24uc2V0VGV4dChuZXcgRmlsZShqb2IuZ2V0VGFyZ2V0U2l0ZSgpLmdldFNpdGUoKS5nZXRVUkwoKS5nZXRGaWxlKCkpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgdXBkYXRlU3RhdHVzKGpvYi5nZXRUYXJnZXRTaXRlKCkpOworICAgICAgICB9CisgICAgfSovCisgICAgCisgICAgcHJpdmF0ZSBJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb25bXSB0b0pvYkFycmF5KEl0ZXJhdG9yIHNlbGVjdGVkSm9icykgeworCQkKKyAgICAJaWYgKHNlbGVjdGVkSm9icyA9PSBudWxsKSAKKyAgICAJCXJldHVybiBuZXcgSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uWzBdOworICAgIAkKKyAgICAJQXJyYXlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAJCisgICAgCXdoaWxlIChzZWxlY3RlZEpvYnMuaGFzTmV4dCgpKSB7CisgICAgCQlyZXN1bHQuYWRkKHNlbGVjdGVkSm9icy5uZXh0KCkpOworICAgIAl9CisgICAgCQorICAgIAlyZXR1cm4gKElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbltdKXJlc3VsdC50b0FycmF5KG5ldyBJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb25bcmVzdWx0LnNpemUoKV0pOworCX0KKworCXByaXZhdGUgdm9pZCBjaGFuZ2VMb2NhdGlvbk9mRmVhdHVyZXMoKSB7CisJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgam9iVmlld2VyLmdldFNlbGVjdGlvbigpOworCQlpZiAoc2VsZWN0aW9uID09IG51bGwpCisJCSAgICByZXR1cm47CisJCUl0ZXJhdG9yIHNlbGVjdGVkSm9iID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7CisJCWlmIChzZWxlY3RlZEpvYiA9PSBudWxsKSAKKwkJICAgIHJldHVybjsKKwkJCisJCVRhcmdldFNpdGVEaWFsb2cgZGlhbG9nID0gbmV3IFRhcmdldFNpdGVEaWFsb2coZ2V0U2hlbGwoKSwgY29uZmlnLCB0b0pvYkFycmF5KHNlbGVjdGlvbi5pdGVyYXRvcigpKSk7CisJCWRpYWxvZy5jcmVhdGUoKTsKKworCQlTV1RVdGlsLnNldERpYWxvZ1NpemUoZGlhbG9nLCA0MDAsIDMwMCk7CisJCQorCQlkaWFsb2cuZ2V0U2hlbGwoKS5zZXRUZXh0KFVwZGF0ZVVJTWVzc2FnZXMuU2l0ZVBhZ2VfbmV3KTsgCisJCWlmICggZGlhbG9nLm9wZW4oKSA9PSBEaWFsb2cuT0spIHsKKwkJCXBhZ2VDaGFuZ2VkKCk7CisJCQlqb2JWaWV3ZXIucmVmcmVzaCgpOworCQkJdXBkYXRlU3RhdHVzKCk7CisJCQlhZGRlZFNpdGVzID0gZGlhbG9nLmdldEFkZGVkU2l0ZXMoKTsKKwkJfQorCX0KKwkKKwl2b2lkIHJlbW92ZUFkZGVkU2l0ZXMoKSB7CisJCWlmIChhZGRlZFNpdGVzIT1udWxsKSB7CisJCQlmb3IgKGludCBpPTA7IGk8YWRkZWRTaXRlcy5sZW5ndGg7IGkrKykgeworCQkJCWNvbmZpZy5yZW1vdmVDb25maWd1cmVkU2l0ZShhZGRlZFNpdGVzW2ldKTsKKwkJCX0KKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL1RhcmdldFNpdGVEaWFsb2cuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL1RhcmdldFNpdGVEaWFsb2cuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDE1MzRmCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvVGFyZ2V0U2l0ZURpYWxvZy5qYXZhCkBAIC0wLDAgKzEsMzc2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLndpemFyZHM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk9ic2VydmFibGU7CitpbXBvcnQgamF2YS51dGlsLk9ic2VydmVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi5JQ29uZmlndXJlZFNpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uSUluc3RhbGxDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklTaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zLlVwZGF0ZVV0aWxzOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVMYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUlNZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkucGFydHMuRGVmYXVsdENvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkucGFydHMuU1dUVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy5JSW5zdGFsbEZlYXR1cmVPcGVyYXRpb247CisKK3B1YmxpYyBjbGFzcyBUYXJnZXRTaXRlRGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNT1NUX1JFQ0VBTlRMWV9VU0VEX1NJVEVfVVJMID0gIm1vc3RSZWNlYW50bHlVc2VkU2l0ZVVSTCI7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIFRhYmxlVmlld2VyIHNpdGVWaWV3ZXI7CisJcHJpdmF0ZSBJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnOworCXByaXZhdGUgQnV0dG9uIGFkZEJ1dHRvbjsKKwlwcml2YXRlIEJ1dHRvbiBkZWxldGVCdXR0b247CisgICAgcHJpdmF0ZSBJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb25bXSBqb2JzOworICAgIHByaXZhdGUgV29ya2luZ0NvcHkgd29ya2luZ0NvcHk7CisgICAgCisgICAgY2xhc3MgV29ya2luZ0NvcHkgZXh0ZW5kcyBPYnNlcnZhYmxlIHsKKyAgICAJcHJpdmF0ZSBBcnJheUxpc3Qgc2l0ZXM9bmV3IEFycmF5TGlzdCgpOworICAgIAlwcml2YXRlIEFycmF5TGlzdCBhZGRlZD1uZXcgQXJyYXlMaXN0KCk7CisgICAgCXByaXZhdGUgSUNvbmZpZ3VyZWRTaXRlIHRhcmdldFNpdGU7CisKKyAgICAJcHVibGljIFdvcmtpbmdDb3B5KCkgeworICAgIAkJT2JqZWN0IFtdIGluaXRpYWwgPSBjb25maWcuZ2V0Q29uZmlndXJlZFNpdGVzKCk7CisgICAgCQlmb3IgKGludCBpPTA7IGk8aW5pdGlhbC5sZW5ndGg7IGkrKykKKyAgICAJCQlzaXRlcy5hZGQoaW5pdGlhbFtpXSk7CisgICAgCQlmb3IgKGludCBpPTA7IGk8am9icy5sZW5ndGg7IGkrKykgeworICAgIAkJCUlDb25maWd1cmVkU2l0ZSBqc2l0ZSA9IGpvYnNbaV0uZ2V0VGFyZ2V0U2l0ZSgpOworICAgIAkJCWlmICh0YXJnZXRTaXRlPT1udWxsKQorICAgIAkJCQl0YXJnZXRTaXRlID0ganNpdGU7CisgICAgCQkJZWxzZQorICAgIAkJCQlpZiAoIXRhcmdldFNpdGUuZXF1YWxzKGpzaXRlKSkKKyAgICAJCQkJCXRhcmdldFNpdGUgPSBudWxsOworICAgIAkJfQorICAgIAl9CisgICAgCQorICAgIAlwdWJsaWMgdm9pZCBhZGRTaXRlKElDb25maWd1cmVkU2l0ZSBzaXRlKSB7CisgICAgCQlzaXRlcy5hZGQoc2l0ZSk7CisgICAgCQlhZGRlZC5hZGQoc2l0ZSk7CisgICAgCQlzZXRDaGFuZ2VkKCk7CisgICAgCQlub3RpZnlPYnNlcnZlcnMoc2l0ZSk7CisgICAgCQljbGVhckNoYW5nZWQoKTsKKyAgICAJfQorICAgIAkKKyAgICAJcHVibGljIHZvaWQgcmVtb3ZlU2l0ZShJQ29uZmlndXJlZFNpdGUgc2l0ZSkgeworICAgIAkJc2l0ZXMucmVtb3ZlKHNpdGUpOworICAgIAkJYWRkZWQucmVtb3ZlKHNpdGUpOworICAgIAkJc2V0Q2hhbmdlZCgpOworICAgIAkJbm90aWZ5T2JzZXJ2ZXJzKHNpdGUpOworICAgIAkJY2xlYXJDaGFuZ2VkKCk7CisgICAgCX0KKyAgICAJCisgICAgCXB1YmxpYyBib29sZWFuIGlzTmV3bHlBZGRlZChJQ29uZmlndXJlZFNpdGUgc2l0ZSkgeworICAgIAkJcmV0dXJuIGFkZGVkLmNvbnRhaW5zKHNpdGUpOworICAgIAl9CisgICAgCQorICAgIAlwdWJsaWMgdm9pZCBjb21taXQoKSB7CisgICAgCQkvLyBhZGQgbmV3IHNpdGVzIHRvIHRoZSBjb25maWcKKyAgICAJCWZvciAoaW50IGk9MDsgaTxhZGRlZC5zaXplKCk7IGkrKykgeworICAgIAkJCWNvbmZpZy5hZGRDb25maWd1cmVkU2l0ZSgoSUNvbmZpZ3VyZWRTaXRlKWFkZGVkLmdldChpKSk7CisgICAgCQl9CisgICAgCQkvLyBzZXQgc2VsZWN0ZWQgc2l0ZSB0byB0aGUgam9iCisgICAgCQlmb3IgKGludCBpPTA7IGk8am9icy5sZW5ndGg7IGkrKykgeworICAgIAkJCWpvYnNbaV0uc2V0VGFyZ2V0U2l0ZSh0YXJnZXRTaXRlKTsKKyAgICAJCX0KKyAgICAJfQorICAgIAkKKyAgICAJcHVibGljIElDb25maWd1cmVkU2l0ZSBbXSBnZXRTaXRlcygpIHsKKyAgICAJCXJldHVybiAoSUNvbmZpZ3VyZWRTaXRlW10pc2l0ZXMudG9BcnJheShuZXcgSUNvbmZpZ3VyZWRTaXRlW3NpdGVzLnNpemUoKV0pOworICAgIAl9CisgICAgCQorICAgIAlwdWJsaWMgSUNvbmZpZ3VyZWRTaXRlIFtdIGdldEFkZGVkU2l0ZXMoKSB7CisgICAgCQlyZXR1cm4gKElDb25maWd1cmVkU2l0ZVtdKWFkZGVkLnRvQXJyYXkobmV3IElDb25maWd1cmVkU2l0ZVthZGRlZC5zaXplKCldKTsKKyAgICAJfSAgICAJCisgICAgCQorICAgIAlwdWJsaWMgSUNvbmZpZ3VyZWRTaXRlIGdldFRhcmdldFNpdGUoKSB7CisgICAgCQlyZXR1cm4gdGFyZ2V0U2l0ZTsKKyAgICAJfQorICAgIAkKKyAgICAJcHVibGljIHZvaWQgc2V0VGFyZ2V0U2l0ZShJQ29uZmlndXJlZFNpdGUgc2l0ZSkgeworICAgIAkJdGhpcy50YXJnZXRTaXRlID0gc2l0ZTsKKyAgICAJfQorICAgIH0KKyAgICAKKyAgICBjbGFzcyBTaXRlc0NvbnRlbnRQcm92aWRlciBleHRlbmRzIERlZmF1bHRDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB7CisJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgcGFyZW50KSB7CisJCQlyZXR1cm4gd29ya2luZ0NvcHkuZ2V0U2l0ZXMoKTsKKwkJfQorCX0KKwkKKwljbGFzcyBTaXRlc0xhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7CisJCQorCQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IG9iaiwgaW50IGNvbCkgeworCQkJVXBkYXRlTGFiZWxQcm92aWRlciBwcm92aWRlciA9IFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRMYWJlbFByb3ZpZGVyKCk7CisJCQlyZXR1cm4gcHJvdmlkZXIuZ2V0TG9jYWxTaXRlSW1hZ2UoKElDb25maWd1cmVkU2l0ZSkgb2JqKTsKKwkJfQorCQorCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iaiwgaW50IGNvbCkgeworCQkJaWYgKGNvbCA9PSAwKSB7CisJCQkJSVNpdGUgc2l0ZSA9ICgoSUNvbmZpZ3VyZWRTaXRlKSBvYmopLmdldFNpdGUoKTsKKwkJCQlyZXR1cm4gbmV3IEZpbGUoc2l0ZS5nZXRVUkwoKS5nZXRGaWxlKCkpLnRvU3RyaW5nKCk7CisJCQl9CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCX0KKworCisJLyoqCisJICogQ29uc3RydWN0b3IgZm9yIFJldmlld1BhZ2UyCisJICovCisJcHVibGljIFRhcmdldFNpdGVEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIElJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcsIElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbltdIGpvYnMpIHsKKyAgICAgICAgc3VwZXIocGFyZW50U2hlbGwpOworCQl0aGlzLmNvbmZpZyA9IGNvbmZpZzsKKwkJVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldExhYmVsUHJvdmlkZXIoKS5jb25uZWN0KHRoaXMpOworCQl0aGlzLmpvYnMgPSBqb2JzOworCQl3b3JraW5nQ29weSA9IG5ldyBXb3JraW5nQ29weSgpOworCX0KKworCXB1YmxpYyBib29sZWFuIGNsb3NlKCkgeworCQlVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0TGFiZWxQcm92aWRlcigpLmRpc2Nvbm5lY3QodGhpcyk7CisJCXJldHVybiBzdXBlci5jbG9zZSgpOworCX0KKworICAgIHB1YmxpYyBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgeworICAgIAlDb21wb3NpdGUgY2xpZW50ID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKKwkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOworCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7CisJCWxheW91dC5tYXJnaW5XaWR0aCA9IGxheW91dC5tYXJnaW5IZWlnaHQgPSAxMDsKKwkJY2xpZW50LnNldExheW91dChsYXlvdXQpOworCQljbGllbnQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7CisKKwkJQ29tcG9zaXRlIGxlZnRQYW5lbCA9IG5ldyBDb21wb3NpdGUoY2xpZW50LCBTV1QuTlVMTCk7CisJCUdyaWRMYXlvdXQgY2VudGVyTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKKwkJY2VudGVyTGF5b3V0Lm51bUNvbHVtbnMgPSAxOworCQljZW50ZXJMYXlvdXQubWFyZ2luV2lkdGggPSBjZW50ZXJMYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKKwkJbGVmdFBhbmVsLnNldExheW91dChjZW50ZXJMYXlvdXQpOworCQlsZWZ0UGFuZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7CisgICAgICAgIAorCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChsZWZ0UGFuZWwsIFNXVC5OVUxMKTsKKwkJbGFiZWwuc2V0VGV4dChVcGRhdGVVSU1lc3NhZ2VzLkluc3RhbGxXaXphcmRfVGFyZ2V0UGFnZV9zaXRlTGFiZWwpOyAKKwkJY3JlYXRlU2l0ZVZpZXdlcihsZWZ0UGFuZWwpOworCisJCUNvbXBvc2l0ZSByaWdodFBhbmVsID0gbmV3IENvbXBvc2l0ZShjbGllbnQsIFNXVC5OVUxMKTsKKwkJR3JpZExheW91dCByaWdodExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7CisJCXJpZ2h0TGF5b3V0Lm51bUNvbHVtbnMgPSAxOworCQlyaWdodExheW91dC5tYXJnaW5XaWR0aCA9IHJpZ2h0TGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7CisJCXJpZ2h0UGFuZWwuc2V0TGF5b3V0KHJpZ2h0TGF5b3V0KTsKKwkJcmlnaHRQYW5lbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMKSk7CisKKwkJbmV3IExhYmVsKHJpZ2h0UGFuZWwsIFNXVC5OVUxMKTsKKwkJQ29tcG9zaXRlIGJ1dHRvbkNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocmlnaHRQYW5lbCwgU1dULk5VTEwpOworCQlHcmlkTGF5b3V0IGJsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOworCQlibGF5b3V0Lm1hcmdpbldpZHRoID0gYmxheW91dC5tYXJnaW5IZWlnaHQgPSAwOworCQlidXR0b25Db250YWluZXIuc2V0TGF5b3V0KGJsYXlvdXQpOworCQlidXR0b25Db250YWluZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9WRVJUSUNBTCkpOworCQkKKwkJYWRkQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db250YWluZXIsIFNXVC5QVVNIKTsKKwkJYWRkQnV0dG9uLnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5JbnN0YWxsV2l6YXJkX1RhcmdldFBhZ2VfbmV3KTsgCisJCWFkZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQlhZGRUYXJnZXRMb2NhdGlvbigpOworCQkJfQorCQl9KTsKKworCQlhZGRCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7CisJCVNXVFV0aWwuc2V0QnV0dG9uRGltZW5zaW9uSGludChhZGRCdXR0b24pOworCQkKKwkJZGVsZXRlQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db250YWluZXIsIFNXVC5QVVNIKTsKKwkJZGVsZXRlQnV0dG9uLnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5JbnN0YWxsV2l6YXJkX1RhcmdldFBhZ2VfZGVsZXRlKTsgCisJCWRlbGV0ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQl0cnkgeworCQkJCQlyZW1vdmVTZWxlY3Rpb24oKTsKKwkJCQl9CisJCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKKwkJCQkJVXBkYXRlVUkubG9nRXhjZXB0aW9uKGV4KTsKKwkJCQl9CisJCQl9CisJCX0pOworCQlkZWxldGVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7CisJCWRlbGV0ZUJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKKwkJU1dUVXRpbC5zZXRCdXR0b25EaW1lbnNpb25IaW50KGRlbGV0ZUJ1dHRvbik7CQkKKworICAgICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNsaWVudCwgIm9yZy5lY2xpcHNlLnVwZGF0ZS51aS5NdWx0aVRhcmdldFBhZ2UyIik7IC8vJE5PTi1OTFMtMSQKKwkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOworICAgICAgICAKKyAgICAgICAgc2l0ZVZpZXdlci5zZXRJbnB1dChqb2JzWzBdKTsKKyAgICAgICAgSUNvbmZpZ3VyZWRTaXRlIGFmZmluaXR5U2l0ZSA9IFVwZGF0ZVV0aWxzLmdldERlZmF1bHRUYXJnZXRTaXRlKGNvbmZpZywgam9ic1swXSwgdHJ1ZSk7CisgICAgICAgIGlmIChqb2JzWzBdLmdldFRhcmdldFNpdGUoKSAhPSBudWxsKSAKKyAgICAgICAgCXNpdGVWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGpvYnNbMF0uZ2V0VGFyZ2V0U2l0ZSgpKSk7CisgICAgICAgIGFkZEJ1dHRvbi5zZXRFbmFibGVkKGFmZmluaXR5U2l0ZSA9PSBudWxsKTsKKyAgICAgICAgCisgICAgICAgIHJldHVybiBjbGllbnQ7CisJfQorCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZVNpdGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgeworCQlzaXRlVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHBhcmVudCwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUik7CisJCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7CisJCWdkLndpZHRoSGludCA9IDIwMDsKKwkJc2l0ZVZpZXdlci5nZXRUYWJsZSgpLnNldExheW91dERhdGEoZ2QpOworCQlzaXRlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgU2l0ZXNDb250ZW50UHJvdmlkZXIoKSk7CisJCXNpdGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgU2l0ZXNMYWJlbFByb3ZpZGVyKCkpOworCQlzaXRlVmlld2VyLmFkZEZpbHRlcihuZXcgVmlld2VyRmlsdGVyKCkgeworCQkJcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2LCBPYmplY3QgcGFyZW50LCBPYmplY3Qgb2JqKSB7CisJCQkJSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIGpvYiA9IChJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24pIHNpdGVWaWV3ZXIuZ2V0SW5wdXQoKTsKKwkJCQlyZXR1cm4gZ2V0U2l0ZVZpc2liaWxpdHkoKElDb25maWd1cmVkU2l0ZSkgb2JqLCBqb2IpOworCQkJfQorCQl9KTsKKwkJc2l0ZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgeworCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpOworCQkJCXNlbGVjdFRhcmdldFNpdGUoc3NlbCk7CisJCQkJdXBkYXRlQnV0dG9ucyhzc2VsKTsKKwkJCX0KKwkJfSk7CisJCXdvcmtpbmdDb3B5LmFkZE9ic2VydmVyKG5ldyBPYnNlcnZlcigpIHsKKwkJCXB1YmxpYyB2b2lkIHVwZGF0ZShPYnNlcnZhYmxlIGFyZzAsIE9iamVjdCBhcmcxKSB7CisJCQkJc2l0ZVZpZXdlci5yZWZyZXNoKCk7CisJCQl9CisJCX0pOworCX0KKwkKKyAgICBwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7CisgICAgCXdvcmtpbmdDb3B5LmNvbW1pdCgpOworICAgICAgICBzdXBlci5va1ByZXNzZWQoKTsKKyAgICB9CisgICAgCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7CisJCXN1cGVyLmNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIocGFyZW50KTsKKwkJdXBkYXRlQnV0dG9ucygoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2l0ZVZpZXdlci5nZXRTZWxlY3Rpb24oKSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHVwZGF0ZUJ1dHRvbnMoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7CisJCWRlbGV0ZUJ1dHRvbi5zZXRFbmFibGVkKGNhbkRlbGV0ZShzZWxlY3Rpb24pKTsKKwkJQnV0dG9uIG9rQnV0dG9uID0gZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuT0tfSUQpOworCQlpZiAob2tCdXR0b24hPW51bGwpCisJCQlva0J1dHRvbi5zZXRFbmFibGVkKCFzZWxlY3Rpb24uaXNFbXB0eSgpKTsKKwl9CisJCisJcHJpdmF0ZSBib29sZWFuIGNhbkRlbGV0ZShJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKwkJaWYgKHNlbGVjdGlvbi5pc0VtcHR5KCkpIHJldHVybiBmYWxzZTsKKwkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworCQkJSUNvbmZpZ3VyZWRTaXRlIHNpdGUgPSAoSUNvbmZpZ3VyZWRTaXRlKWl0ZXIubmV4dCgpOworCQkJaWYgKCF3b3JraW5nQ29weS5pc05ld2x5QWRkZWQoc2l0ZSkpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCXJldHVybiB0cnVlOworCX0KKworCXByaXZhdGUgdm9pZCBzZWxlY3RUYXJnZXRTaXRlKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgeworCQlJQ29uZmlndXJlZFNpdGUgc2l0ZSA9IChJQ29uZmlndXJlZFNpdGUpIHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKKwkJaWYgKHNpdGUhPW51bGwpIHsKKwkJCUlEaWFsb2dTZXR0aW5ncyBtYXN0ZXIgPSBVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0RGlhbG9nU2V0dGluZ3MoKTsKKwkJCUlEaWFsb2dTZXR0aW5ncyBzZWN0aW9uID0gbWFzdGVyLmdldFNlY3Rpb24oTU9TVF9SRUNFQU5UTFlfVVNFRF9TSVRFX1VSTCk7CisJCQlpZiAoc2VjdGlvbj09bnVsbCkKKwkJCQlzZWN0aW9uID0gbWFzdGVyLmFkZE5ld1NlY3Rpb24oTU9TVF9SRUNFQU5UTFlfVVNFRF9TSVRFX1VSTCk7CisJCQlzZWN0aW9uLnB1dChNT1NUX1JFQ0VBTlRMWV9VU0VEX1NJVEVfVVJMLCBzaXRlLmdldFNpdGUoKS5nZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpKTsKKwkJCXdvcmtpbmdDb3B5LnNldFRhcmdldFNpdGUoc2l0ZSk7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgYWRkVGFyZ2V0TG9jYXRpb24oKSB7CisJCURpcmVjdG9yeURpYWxvZyBkZCA9IG5ldyBEaXJlY3RvcnlEaWFsb2coZ2V0U2hlbGwoKSk7CisJCWRkLnNldE1lc3NhZ2UoVXBkYXRlVUlNZXNzYWdlcy5JbnN0YWxsV2l6YXJkX1RhcmdldFBhZ2VfbG9jYXRpb25fbWVzc2FnZSk7IAorCQlTdHJpbmcgcGF0aCA9IGRkLm9wZW4oKTsKKwkJaWYgKHBhdGggIT0gbnVsbCkgeworCQkJYWRkQ29uZmlndXJlZFNpdGUoZ2V0U2hlbGwoKSwgY29uZmlnLCBuZXcgRmlsZShwYXRoKSk7CisJCX0KKwl9CisJCisJcHJpdmF0ZSB2b2lkIHJlbW92ZVNlbGVjdGlvbigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzaXRlVmlld2VyLmdldFNlbGVjdGlvbigpOworCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisJCQlJQ29uZmlndXJlZFNpdGUgdGFyZ2V0U2l0ZSA9IChJQ29uZmlndXJlZFNpdGUpIGl0ZXIubmV4dCgpOworCQkJd29ya2luZ0NvcHkucmVtb3ZlU2l0ZSh0YXJnZXRTaXRlKTsKKwkJfQorCQlzaXRlVmlld2VyLnJlZnJlc2goKTsKKwl9CisKKwlwcml2YXRlIElDb25maWd1cmVkU2l0ZSBhZGRDb25maWd1cmVkU2l0ZShTaGVsbCBzaGVsbCwgSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZywgRmlsZSBmaWxlKSB7CisJCXRyeSB7CisJCQlJQ29uZmlndXJlZFNpdGUgY3NpdGUgPSBjb25maWcuY3JlYXRlQ29uZmlndXJlZFNpdGUoZmlsZSk7CisJCQlJU3RhdHVzIHN0YXR1cyA9IGNzaXRlLnZlcmlmeVVwZGF0YWJsZVN0YXR1cygpOworCQkJaWYgKHN0YXR1cy5pc09LKCkpCisJCQkJd29ya2luZ0NvcHkuYWRkU2l0ZShjc2l0ZSk7CisJCQllbHNlIAorCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1cyk7CisgICAgICAgICAgICBzaXRlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihjc2l0ZSkpOworICAgICAgICAgICAgc2l0ZVZpZXdlci5nZXRDb250cm9sKCkuc2V0Rm9jdXMoKTsKKwkJCXJldHVybiBjc2l0ZTsKKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQlTdHJpbmcgdGl0bGUgPSBVcGRhdGVVSU1lc3NhZ2VzLkluc3RhbGxXaXphcmRfVGFyZ2V0UGFnZV9sb2NhdGlvbl9lcnJvcl90aXRsZTsgCisJCQlFcnJvckRpYWxvZy5vcGVuRXJyb3Ioc2hlbGwsIHRpdGxlLCBudWxsLCBlLmdldFN0YXR1cygpKTsKKwkJCVVwZGF0ZVVJLmxvZ0V4Y2VwdGlvbihlLGZhbHNlKTsKKwkJCXJldHVybiBudWxsOworCQl9CisJfQorCQorCXByaXZhdGUgIGJvb2xlYW4gZ2V0U2l0ZVZpc2liaWxpdHkoSUNvbmZpZ3VyZWRTaXRlIHNpdGUsIElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiBqb2IpIHsKKwkJLy8gRG8gbm90IGFsbG93IGluc3RhbGxpbmcgaW50byBhIG5vbi11cGRhdGVhYmxlIHNpdGUKKwkJaWYgKCFzaXRlLmlzVXBkYXRhYmxlKCkpCisJCQlyZXR1cm4gZmFsc2U7CisJCQorCQkvLyBJZiBhZmZpbml0eSBzaXRlIGlzIGtub3duLCBvbmx5IGl0IHNob3VsZCBiZSBzaG93bgorCQlJQ29uZmlndXJlZFNpdGUgYWZmaW5pdHlTaXRlID0gVXBkYXRlVXRpbHMuZ2V0QWZmaW5pdHlTaXRlKGNvbmZpZywgam9iLmdldEZlYXR1cmUoKSk7CisJCWlmIChhZmZpbml0eVNpdGUgIT0gbnVsbCkgeworCQkJLy8gTXVzdCBjb21wYXJlIHJlZmVyZW5jZWQgc2l0ZXMgYmVjYXVzZQorCQkJLy8gY29uZmlndXJlZCBzaXRlcyB0aGVtc2VsdmVzIG1heSBjb21lIGZyb20gCisJCQkvLyBkaWZmZXJlbnQgY29uZmlndXJhdGlvbnMKKwkJCXJldHVybiBzaXRlLmdldFNpdGUoKS5lcXVhbHMoYWZmaW5pdHlTaXRlLmdldFNpdGUoKSk7CisJCX0KKwkJCisJCS8vIENvLWxvY2F0ZSB1cGRhdGVzIHdpdGggdGhlIG9sZCBmZWF0dXJlCisJCWlmIChqb2IuZ2V0T2xkRmVhdHVyZSgpICE9IG51bGwpIHsKKwkJCUlDb25maWd1cmVkU2l0ZSBvbGRTaXRlID0gVXBkYXRlVXRpbHMuZ2V0U2l0ZVdpdGhGZWF0dXJlKGNvbmZpZywgam9iLmdldE9sZEZlYXR1cmUoKS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0SWRlbnRpZmllcigpKTsKKwkJCXJldHVybiAoc2l0ZSA9PSBvbGRTaXRlKTsKKwkJfQorCisJCS8vIEFsbG93IGluc3RhbGxpbmcgaW50byBhbnkgc2l0ZSB0aGF0IGlzIHVwZGF0ZWFibGUgYW5kIHRoZXJlIGlzIG5vIGFmZmluaXR5IHNwZWNpZmllZAorCQlyZXR1cm4gdHJ1ZTsKKwl9CisJCisJcHVibGljIElDb25maWd1cmVkU2l0ZSBbXSBnZXRBZGRlZFNpdGVzKCkgeworCQlyZXR1cm4gd29ya2luZ0NvcHkuZ2V0QWRkZWRTaXRlcygpOworCX0KK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL1VJUHJvYmxlbUhhbmRsZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL1VJUHJvYmxlbUhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGMwODRlCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvVUlQcm9ibGVtSGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsMjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkud2l6YXJkczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS4qOworCisvKioKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBVSVByb2JsZW1IYW5kbGVyIGltcGxlbWVudHMgSVByb2JsZW1IYW5kbGVyIHsKKworCS8qCisJICogQHNlZSBJUHJvYmxlbUhhbmRsZXIjcmVwb3J0UHJvYmxlbShTdHJpbmcpCisJICovCisJcHVibGljIGJvb2xlYW4gcmVwb3J0UHJvYmxlbShTdHJpbmcgcHJvYmxlbVRleHQpIHsKKwkJU3RyaW5nIHRpdGxlID0gVXBkYXRlVUlNZXNzYWdlcy5SZXZlcnRfUHJvYmxlbURpYWxvZ190aXRsZTsgCisJCXJldHVybiBNZXNzYWdlRGlhbG9nLm9wZW5RdWVzdGlvbihVcGRhdGVVSS5nZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpLCB0aXRsZSwgcHJvYmxlbVRleHQpOworCX0KK30KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjX3dlYmFwcC9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvc2VydmxldHMvSW5zdGFsbFNlcnZsZXQuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjX3dlYmFwcC9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvc2VydmxldHMvSW5zdGFsbFNlcnZsZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTU1YjBlCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmNfd2ViYXBwL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9zZXJ2bGV0cy9JbnN0YWxsU2VydmxldC5qYXZhCkBAIC0wLDAgKzEsMjEwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnNlcnZsZXRzOworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEubmV0Lio7CitpbXBvcnQgamF2YS51dGlsLio7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlZlcnNpb25lZElkZW50aWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnNlYXJjaC5TaXRlU2VhcmNoQ2F0ZWdvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wYXJ0cy5TV1RVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5zZXJ2bGV0cy5TZXJ2bGV0c1V0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLndpemFyZHMuSW5zdGFsbFdpemFyZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy5PcGVyYXRpb25zTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuc2VhcmNoLkJhY2tMZXZlbEZpbHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuc2VhcmNoLkVudmlyb25tZW50RmlsdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5zZWFyY2guVXBkYXRlU2VhcmNoUmVxdWVzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuc2VhcmNoLlVwZGF0ZVNlYXJjaFNjb3BlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5zZWFyY2guVmVyc2lvbmVkSWRlbnRpZmllcnNGaWx0ZXI7CisKKy8qKgorICoKKyAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGVkaXQgdGhlIHRlbXBsYXRlIHZhcmlhYmxlICJ0eXBlY29tbWVudCI6CisgKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5UZW1wbGF0ZXMuCisgKiBUbyBlbmFibGUgYW5kIGRpc2FibGUgdGhlIGNyZWF0aW9uIG9mIHR5cGUgY29tbWVudHMgZ28gdG8KKyAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbi4KKyAqLworcHVibGljIGNsYXNzIEluc3RhbGxTZXJ2bGV0IGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCXByaXZhdGUgU2VydmxldENvbmZpZyBzZXJ2bGV0Q29uZmlnOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZMRVRfTkFNRSA9ICIvSW5zdGFsbFNlcnZsZXQiOyAvLyROT04tTkxTLTEkCisKKwlwdWJsaWMgdm9pZCBpbml0KFNlcnZsZXRDb25maWcgY29uZmlnKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7CisJCXRoaXMuc2VydmxldENvbmZpZyA9IGNvbmZpZzsKKwl9CisKKwlwdWJsaWMgdm9pZCBkZXN0cm95KCkgeworCX0KKworCXB1YmxpYyBTZXJ2bGV0Q29uZmlnIGdldFNlcnZsZXRDb25maWcoKSB7CisJCXJldHVybiBzZXJ2bGV0Q29uZmlnOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0U2VydmxldEluZm8oKSB7CisJCXJldHVybiAiRWNsaXBzZSBJbnN0YWxsIHNlcnZsZXQiOyAvLyROT04tTkxTLTEkCisJfQorCisJcHVibGljIHZvaWQgc2VydmljZSgKKwkJSHR0cFNlcnZsZXRSZXF1ZXN0IHNlcnZsZXRSZXF1ZXN0LAorCQlIdHRwU2VydmxldFJlc3BvbnNlIHNlcnZsZXRSZXNwb25zZSkKKwkJdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKwkJUHJpbnRXcml0ZXIgd3JpdGVyID0KKwkJCVNlcnZsZXRzVXRpbC5jcmVhdGVSZXNwb25zZVByb2xvZ3VlKHNlcnZsZXRSZXNwb25zZSk7CisJCWV4ZWN1dGUod3JpdGVyLCBzZXJ2bGV0UmVxdWVzdCk7CisJCVNlcnZsZXRzVXRpbC5jcmVhdGVSZXNwb25zZUVwaWxvZ3VlKAorCQkJc2VydmxldFJlcXVlc3QsCisJCQlzZXJ2bGV0UmVzcG9uc2UsCisJCQl3cml0ZXIpOworCX0KKworCS8qKgorCSAqIE1ldGhvZCBleGVjdXRlLgorCSAqIEBwYXJhbSBzZXJ2bGV0UmVxdWVzdAorCSAqLworCXByaXZhdGUgdm9pZCBleGVjdXRlKAorCQlQcmludFdyaXRlciB3cml0ZXIsCisJCUh0dHBTZXJ2bGV0UmVxdWVzdCBzZXJ2bGV0UmVxdWVzdCkgeworCQlTdHJpbmcgc2VydmVyVVJMID0gc2VydmxldFJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJzZXJ2ZXIiKTsgLy8kTk9OLU5MUy0xJAorCQlTdHJpbmcgbGljZW5zZSA9IHNlcnZsZXRSZXF1ZXN0LmdldFBhcmFtZXRlcigibGljZW5zZSIpOyAvLyROT04tTkxTLTEkCisJCWJvb2xlYW4gbmVlZExpY2Vuc2VQYWdlID0gdHJ1ZTsKKwkJaWYgKGxpY2Vuc2UgIT0gbnVsbCAmJiBsaWNlbnNlLmVxdWFsc0lnbm9yZUNhc2UoImZhbHNlIikpIC8vJE5PTi1OTFMtMSQKKwkJCW5lZWRMaWNlbnNlUGFnZSA9IGZhbHNlOworCisJCVN0cmluZ1tdIHZlcnNpb25lZElkcyA9IHNlcnZsZXRSZXF1ZXN0LmdldFBhcmFtZXRlclZhbHVlcygiZmVhdHVyZSIpOyAvLyROT04tTkxTLTEkCisKKwkJaWYgKHNlcnZlclVSTCA9PSBudWxsKSB7CisJCQljcmVhdGVQYWdlRXJyb3Iod3JpdGVyLCBVcGRhdGVVSS5nZXRTdHJpbmcoIkluc3RhbGxTZXJ2bGV0LnVua25vd25TZXJ2ZXJVUkwiKSk7IC8vJE5PTi1OTFMtMSQKKwkJCXJldHVybjsKKwkJfQorCQlpZiAodmVyc2lvbmVkSWRzID09IG51bGwpIHsKKwkJCWNyZWF0ZVBhZ2VFcnJvcih3cml0ZXIsIFVwZGF0ZVVJLmdldFN0cmluZygiSW5zdGFsbFNlcnZsZXQubm9GZWF0dXJlcyIpKTsgLy8kTk9OLU5MUy0xJAorCQkJcmV0dXJuOworCQl9CisJCWlmIChPcGVyYXRpb25zTWFuYWdlci5pc0luUHJvZ3Jlc3MoKSkgeworCQkJU2VydmxldHNVdGlsLmNyZWF0ZUVycm9yKHdyaXRlciwgVXBkYXRlVUkuZ2V0U3RyaW5nKCJJbnN0YWxsU2VydmxldC5pblByb2dyZXNzIiksIG51bGwpOyAvLyROT04tTkxTLTEkCisJCQlyZXR1cm47CisJCX0KKy8vCQlpZiAoRGV0YWlsc0Zvcm0uaXNJblByb2dyZXNzKCkpIHsKKy8vCQkJU2VydmxldHNVdGlsLmNyZWF0ZUVycm9yKHdyaXRlciwgVXBkYXRlVUkuZ2V0U3RyaW5nKCJJbnN0YWxsU2VydmxldC5pblByb2dyZXNzIiksIG51bGwpOworLy8JCQlyZXR1cm47CisvLwkJfQorCQl0cnkgeworCQkJVVJMIHVybCA9IG5ldyBVUkwoc2VydmVyVVJMKTsKKwkJCVZlcnNpb25lZElkZW50aWZpZXJbXSB2aWRzID0KKwkJCQljb21wdXRlVmVyc2lvbmVkSWRlbnRpZmllcnModmVyc2lvbmVkSWRzKTsKKwkJCWJvb2xlYW4gc3VjY2VzcyA9CisJCQkJZXhlY3V0ZUluc3RhbGwod3JpdGVyLCB1cmwsIHZpZHMsIG5lZWRMaWNlbnNlUGFnZSk7CisJCQlpZiAoc3VjY2VzcykKKwkJCQlTZXJ2bGV0c1V0aWwuY3JlYXRlSW5mbyh3cml0ZXIpOworCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworCQkJY3JlYXRlUGFnZUVycm9yKHdyaXRlciwgVXBkYXRlVUkuZ2V0Rm9ybWF0dGVkTWVzc2FnZSgiSW5zdGFsbFNlcnZsZXQuaW5jb3JyZWN0VVJMRm9ybWF0IiwgLy8kTk9OLU5MUy0xJAorCQkJc2VydmVyVVJMLnRvU3RyaW5nKCkpKTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBjcmVhdGVQYWdlRXJyb3IoUHJpbnRXcml0ZXIgd3JpdGVyLCBTdHJpbmcgcHJvYmxlbSkgeworCQlTZXJ2bGV0c1V0aWwuY3JlYXRlRXJyb3Iod3JpdGVyLCBwcm9ibGVtLCBVcGRhdGVVSS5nZXRTdHJpbmcoIkluc3RhbGxTZXJ2bGV0LmNvbnRhY3RXZWJtYXN0ZXIiKSk7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwlwcml2YXRlIFZlcnNpb25lZElkZW50aWZpZXJbXSBjb21wdXRlVmVyc2lvbmVkSWRlbnRpZmllcnMoU3RyaW5nW10gYXJyYXkpIHsKKwkJQXJyYXlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykgeworCQkJU3RyaW5nIGlkX3ZlcnNpb24gPSBhcnJheVtpXTsKKwkJCWludCBzZXAgPSBpZF92ZXJzaW9uLmxhc3RJbmRleE9mKCdfJyk7CisJCQlpZiAoc2VwID09IC0xKQorCQkJCWNvbnRpbnVlOworCQkJU3RyaW5nIGlkID0gaWRfdmVyc2lvbi5zdWJzdHJpbmcoMCwgc2VwKTsKKwkJCVN0cmluZyB2ZXJzaW9uID0gaWRfdmVyc2lvbi5zdWJzdHJpbmcoc2VwICsgMSk7CisJCQlWZXJzaW9uZWRJZGVudGlmaWVyIHZpZCA9IG5ldyBWZXJzaW9uZWRJZGVudGlmaWVyKGlkLCB2ZXJzaW9uKTsKKwkJCXJlc3VsdC5hZGQodmlkKTsKKwkJfQorCQlyZXR1cm4gKFZlcnNpb25lZElkZW50aWZpZXJbXSkgcmVzdWx0LnRvQXJyYXkoCisJCQluZXcgVmVyc2lvbmVkSWRlbnRpZmllcltyZXN1bHQuc2l6ZSgpXSk7CisJfQorCisJcHJpdmF0ZSBib29sZWFuIGV4ZWN1dGVJbnN0YWxsKAorCQlmaW5hbCBQcmludFdyaXRlciB3cml0ZXIsCisJCWZpbmFsIFVSTCBzaXRlVVJMLAorCQlmaW5hbCBWZXJzaW9uZWRJZGVudGlmaWVyW10gdmlkcywKKwkJZmluYWwgYm9vbGVhbiBuZWVkTGljZW5zZVBhZ2UpIHsKKworCQlEaXNwbGF5IGRpc3BsYXkgPSBTV1RVdGlsLmdldFN0YW5kYXJkRGlzcGxheSgpOworCQlmaW5hbCBib29sZWFuW10gcmVzdWx0ID0gbmV3IGJvb2xlYW5bXSB7IGZhbHNlIH07CisKKwkJZGlzcGxheS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7CisJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJZmluYWwgU2hlbGwgc2hlbGwgPSBVcGRhdGVVSS5nZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpOworCQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKHNoZWxsLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgeworCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQlyZXN1bHRbMF0gPQorCQkJCQkJCWRvRXhlY3V0ZUluc3RhbGwoCisJCQkJCQkJCXdyaXRlciwKKwkJCQkJCQkJc2hlbGwsCisJCQkJCQkJCXNpdGVVUkwsCisJCQkJCQkJCXZpZHMsCisJCQkJCQkJCW5lZWRMaWNlbnNlUGFnZSk7CisJCQkJCX0KKwkJCQl9KTsKKwkJCX0KKwkJfSk7CisJCXJldHVybiByZXN1bHRbMF07CisJfQorCisJcHJpdmF0ZSBib29sZWFuIGRvRXhlY3V0ZUluc3RhbGwoCisJCVByaW50V3JpdGVyIHdyaXRlciwKKwkJZmluYWwgU2hlbGwgc2hlbGwsCisJCVVSTCBzaXRlVVJMLAorCQlWZXJzaW9uZWRJZGVudGlmaWVyW10gdmlkcywKKwkJZmluYWwgYm9vbGVhbiBuZWVkTGljZW5zZVBhZ2UpIHsKKwkJCQorCQlzaGVsbC5mb3JjZUFjdGl2ZSgpOworCisJCVVwZGF0ZVNlYXJjaFNjb3BlIHNlYXJjaFNjb3BlID0gbmV3IFVwZGF0ZVNlYXJjaFNjb3BlKCk7CisJCXNlYXJjaFNjb3BlLmFkZFNlYXJjaFNpdGUoCisJCQlzaXRlVVJMLnRvU3RyaW5nKCksCisJCQlzaXRlVVJMLAorCQkJbmV3IFN0cmluZ1swXSk7CisKKwkJZmluYWwgVXBkYXRlU2VhcmNoUmVxdWVzdCBzZWFyY2hSZXF1ZXN0ID0KKwkJCW5ldyBVcGRhdGVTZWFyY2hSZXF1ZXN0KAorCQkJCW5ldyBTaXRlU2VhcmNoQ2F0ZWdvcnkoKSwKKwkJCQlzZWFyY2hTY29wZSk7CisJCisJCXNlYXJjaFJlcXVlc3QuYWRkRmlsdGVyKG5ldyBWZXJzaW9uZWRJZGVudGlmaWVyc0ZpbHRlcih2aWRzKSk7CisJCXNlYXJjaFJlcXVlc3QuYWRkRmlsdGVyKG5ldyBFbnZpcm9ubWVudEZpbHRlcigpKTsKKwkJc2VhcmNoUmVxdWVzdC5hZGRGaWx0ZXIobmV3IEJhY2tMZXZlbEZpbHRlcigpKTsKKworCQlzaGVsbC5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKKwkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQlvcGVuV2l6YXJkKHNoZWxsLCBzZWFyY2hSZXF1ZXN0KTsKKwkJCX0KKwkJfSk7CQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKworCXByaXZhdGUgdm9pZCBvcGVuV2l6YXJkKFNoZWxsIHNoZWxsLCBVcGRhdGVTZWFyY2hSZXF1ZXN0IHNlYXJjaFJlcXVlc3QpIHsKKwkJSW5zdGFsbFdpemFyZCB3aXphcmQgPSBuZXcgSW5zdGFsbFdpemFyZChzZWFyY2hSZXF1ZXN0KTsKKwkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBSZXNpemFibGVXaXphcmREaWFsb2coc2hlbGwsIHdpemFyZCk7CisJCWRpYWxvZy5jcmVhdGUoKTsKKy8vCQlkaWFsb2cuZ2V0U2hlbGwoKS5zZXRUZXh0KAorLy8JCQlVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX09QVElPTkFMX0lOU1RBTExfVElUTEUpKTsKKwkJZGlhbG9nLmdldFNoZWxsKCkuc2V0U2l6ZSg2MDAsIDUwMCk7CisJCWRpYWxvZy5vcGVuKCk7CisJCWlmICh3aXphcmQuaXNTdWNjZXNzZnVsSW5zdGFsbCgpKQorCQkJVXBkYXRlVUkucmVxdWVzdFJlc3RhcnQoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyY193ZWJhcHAvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3NlcnZsZXRzL1NlcnZsZXRzVXRpbC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmNfd2ViYXBwL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9zZXJ2bGV0cy9TZXJ2bGV0c1V0aWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTU3MThmCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmNfd2ViYXBwL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9zZXJ2bGV0cy9TZXJ2bGV0c1V0aWwuamF2YQpAQCAtMCwwICsxLDE1MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5zZXJ2bGV0czsKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ib290Lio7CitpbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLio7CisKKy8qKgorICovCitwdWJsaWMgY2xhc3MgU2VydmxldHNVdGlsIHsKKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNlcnZlckluZm8oSHR0cFNlcnZsZXRSZXF1ZXN0IHNlcnZsZXRSZXF1ZXN0KSB7CisJCVN0cmluZyBob3N0ID0gc2VydmxldFJlcXVlc3QuZ2V0U2VydmVyTmFtZSgpOworCQlpbnQgcG9ydCA9IHNlcnZsZXRSZXF1ZXN0LmdldFNlcnZlclBvcnQoKTsKKwkJU3RyaW5nIGNvbnRleHQgPSBzZXJ2bGV0UmVxdWVzdC5nZXRDb250ZXh0UGF0aCgpOworCisJCUVudW1lcmF0aW9uIGF0dHMgPSBzZXJ2bGV0UmVxdWVzdC5nZXRQYXJhbWV0ZXJOYW1lcygpOworCQlTdHJpbmdCdWZmZXIgYnVmZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJZm9yICg7IGF0dHMuaGFzTW9yZUVsZW1lbnRzKCk7KSB7CisJCQlTdHJpbmcgYXR0TmFtZSA9IChTdHJpbmcpIGF0dHMubmV4dEVsZW1lbnQoKTsKKwkJCU9iamVjdCBhdHRWYWx1ZSA9IHNlcnZsZXRSZXF1ZXN0LmdldFBhcmFtZXRlcihhdHROYW1lKTsKKwkJCWJ1ZmYuYXBwZW5kKGF0dE5hbWUgKyAiPSIgKyAiXCIiICsgYXR0VmFsdWUgKyAiXCIrIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCX0KKwkJcmV0dXJuIGhvc3QgKyAiOiIgKyBwb3J0ICsgY29udGV4dCArICI/IiArIGJ1ZmYudG9TdHJpbmcoKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJfQorCisJcHVibGljIHN0YXRpYyBQcmludFdyaXRlciBjcmVhdGVSZXNwb25zZVByb2xvZ3VlKEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisJCXRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L2h0bWwiKTsgLy8kTk9OLU5MUy0xJAorCQlQcmludFdyaXRlciB3cml0ZXIgPSByZXNwb25zZS5nZXRXcml0ZXIoKTsKKwkJU3RyaW5nIHRpdGxlID0gVXBkYXRlVUkuZ2V0U3RyaW5nKCJTZXJ2bGV0c1V0aWwucmVzcG9uc2VUaXRsZSIpOyAvLyROT04tTkxTLTEkCisJCXdyaXRlci5wcmludGxuKAorCQkJIiIgLy8kTk9OLU5MUy0xJAorCQkJCSsgIjwhRE9DVFlQRSBIVE1MIFBVQkxJQyBcIiAtLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOXCI+IiAvLyROT04tTkxTLTEkCisJCQkJKyAiXG4gPEhUTUw+IFxuIDxIRUFEPiBcbiIgLy8kTk9OLU5MUy0xJAorCQkJCSsgIjxUSVRMRT4iK3RpdGxlKyI8L1RJVExFPlxuIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkrICI8TUVUQSBodHRwLWVxdWl2PVwiQ29udGVudC1UeXBlXCIgY29udGVudD1cInRleHQvaHRtbDsgY2hhcnNldD1VVEYtOFwiPlxuIiAvLyROT04tTkxTLTEkCisJCQkJKyAiPC9IRUFEPiIpOyAvLyROT04tTkxTLTEkCisJCXdyaXRlci5wcmludGxuKCIgPEJPRFkgdG9wbWFyZ2luPVwiMFwiIGxlZnRtYXJnaW49XCIwXCI+Iik7IC8vJE5PTi1OTFMtMSQKKwkJcmV0dXJuIHdyaXRlcjsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlRXJyb3IoCisJCVByaW50V3JpdGVyIHdyaXRlciwKKwkJU3RyaW5nIHByb2JsZW0sCisJCVN0cmluZyByZXNvbHV0aW9uKSB7CisJCWNyZWF0ZUhlYWRpbmcod3JpdGVyLCBVcGRhdGVVSS5nZXRTdHJpbmcoIlNlcnZsZXRzVXRpbC51cGRhdGVGYWlsZWQiKSk7IC8vJE5PTi1OTFMtMSQKKwkJc3RhcnRUZXh0QXJlYSh3cml0ZXIpOworCQljcmVhdGVQYXJhZ3JhcGgod3JpdGVyLCBVcGRhdGVVSS5nZXRTdHJpbmcoIlNlcnZsZXRzVXRpbC5wcm9ibGVtIiksIHByb2JsZW0pOyAvLyROT04tTkxTLTEkCisJCWlmIChyZXNvbHV0aW9uICE9IG51bGwpIHsKKwkJCXdyaXRlci5wcmludGxuKCI8cD4iKTsgLy8kTk9OLU5MUy0xJAorCQkJY3JlYXRlUGFyYWdyYXBoKHdyaXRlciwgVXBkYXRlVUkuZ2V0U3RyaW5nKCJTZXJ2bGV0c1V0aWwud2hhdFRvRG8iKSwgcmVzb2x1dGlvbik7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQllbmRUZXh0QXJlYSh3cml0ZXIpOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVQYXJhZ3JhcGgoCisJCVByaW50V3JpdGVyIHdyaXRlciwKKwkJU3RyaW5nIGhlYWRpbmcsCisJCVN0cmluZyB0ZXh0KSB7CisJCXdyaXRlci5wcmludCgiPGI+PGZvbnQgY29sb3I9XCIjNUI3OEFDXCI+Iik7IC8vJE5PTi1OTFMtMSQKKwkJd3JpdGVyLnByaW50KGhlYWRpbmcpOworCQl3cml0ZXIucHJpbnRsbigiPC9iPjwvZm9udD48YnI+Iik7IC8vJE5PTi1OTFMtMSQKKwkJd3JpdGVyLnByaW50bG4odGV4dCk7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZUluZm8oUHJpbnRXcml0ZXIgd3JpdGVyKSB7CisJCWNyZWF0ZUhlYWRpbmcod3JpdGVyLCBVcGRhdGVVSS5nZXRTdHJpbmcoIlNlcnZsZXRzVXRpbC51cGRhdGVJblByb2dyZXNzIikpOyAvLyROT04tTkxTLTEkCisJCXN0YXJ0VGV4dEFyZWEod3JpdGVyKTsKKwkJd3JpdGVyLnByaW50bG4oCisJCQlVcGRhdGVVSS5nZXRTdHJpbmcoIlNlcnZsZXRzVXRpbC51cGRhdGVJbml0aWF0ZWQiKSk7IC8vJE5PTi1OTFMtMSQKKwkJZW5kVGV4dEFyZWEod3JpdGVyKTsKKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1dpbjMyKCkgeworCQlyZXR1cm4gQm9vdExvYWRlci5nZXRXUygpLmVxdWFscygid2luMzIiKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCXByaXZhdGUgc3RhdGljIHZvaWQgc3RhcnRUZXh0QXJlYShQcmludFdyaXRlciB3cml0ZXIpIHsKKwkJd3JpdGVyLnByaW50bG4oCisJCQkiPHRhYmxlIGJvcmRlcj1cIjBcIiB3aWR0aD1cIjEwMCVcIiBjZWxsc3BhY2luZz1cIjVcIiBjZWxscGFkZGluZz1cIjVcIj4iKTsgLy8kTk9OLU5MUy0xJAorCQl3cml0ZXIucHJpbnRsbigiPHRyPiIpOyAvLyROT04tTkxTLTEkCisJCXdyaXRlci5wcmludCgiPHRkIHdpZHRoPVwiMTAwJVwiPiIpOyAvLyROT04tTkxTLTEkCisJCWlmIChpc1dpbjMyKCkpCisJCQl3cml0ZXIucHJpbnRsbigiPGZvbnQgZmFjZT1cIk1TIFNhbnMgU2VyaWZcIiBzaXplPVwiMVwiPiIpOyAvLyROT04tTkxTLTEkCisJCWVsc2UKKwkJCXdyaXRlci5wcmludGxuKCIiKTsgLy8kTk9OLU5MUy0xJAorCX0KKwlwcml2YXRlIHN0YXRpYyB2b2lkIGVuZFRleHRBcmVhKFByaW50V3JpdGVyIHdyaXRlcikgeworCQlpZiAoaXNXaW4zMigpKQorCQkJd3JpdGVyLnByaW50bG4oIjwvZm9udD4iKTsgLy8kTk9OLU5MUy0xJAorCQl3cml0ZXIucHJpbnRsbigiPC90ZD4iKTsgLy8kTk9OLU5MUy0xJAorCQl3cml0ZXIucHJpbnRsbigiPC90cj4iKTsgLy8kTk9OLU5MUy0xJAorCQl3cml0ZXIucHJpbnRsbigiPC90YWJsZT4iKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVIZWFkaW5nKFByaW50V3JpdGVyIHdyaXRlciwgU3RyaW5nIHRpdGxlKSB7CisJCXdyaXRlci5wcmludGxuKAorCQkJIjx0YWJsZSBjb2xzPTEgd2lkdGg9XCI1ODhcIiBjZWxsc3BhY2luZz1cIjBcIiBjZWxscGFkZGluZz1cIjBcIj4iKTsgLy8kTk9OLU5MUy0xJAorCQl3cml0ZXIucHJpbnRsbigiPHRyPiIpOyAvLyROT04tTkxTLTEkCisJCXdyaXRlci5wcmludGxuKAorCQkJIjx0ZCBiYWNrZ3JvdW5kPVwiaW1hZ2VzL2Zvcm1fYmFubmVyLmpwZ1wiIHdpZHRoPVwiNTgwXCIgaGVpZ2h0PVwiMzBcIj4iKTsgLy8kTk9OLU5MUy0xJAorCQl3cml0ZXIucHJpbnQoIjxwPjxiPjxmb250IHNpemU9XCIzXCIgZmFjZT1cIlRhaG9tYVwiPiZuYnNwOyIpOyAvLyROT04tTkxTLTEkCisJCXdyaXRlci5wcmludCh0aXRsZSk7CisJCXdyaXRlci5wcmludGxuKCI8L2ZvbnQ+PC9iPjwvcD4iKTsgLy8kTk9OLU5MUy0xJAorCQl3cml0ZXIucHJpbnRsbigiPC90ZD4iKTsgLy8kTk9OLU5MUy0xJAorCQl3cml0ZXIucHJpbnRsbigiPC90cj4iKTsgLy8kTk9OLU5MUy0xJAorCisJCXdyaXRlci5wcmludGxuKCI8dHI+Iik7IC8vJE5PTi1OTFMtMSQKKwkJd3JpdGVyLnByaW50bG4oCisJCQkiPHRkIHdpZHRoPVwiNTgwXCI+PGltZyBib3JkZXI9XCIwXCIgc3JjPVwiaW1hZ2VzL2Zvcm1fdW5kZXJsaW5lLmpwZ1wiIHdpZHRoPVwiNjAwXCIgaGVpZ2h0PVwiMTVcIj48L3RkPiIpOyAvLyROT04tTkxTLTEkCisJCXdyaXRlci5wcmludGxuKCI8L3RkPiIpOyAvLyROT04tTkxTLTEkCisJCXdyaXRlci5wcmludGxuKCI8L3RyPiIpOyAvLyROT04tTkxTLTEkCisJCXdyaXRlci5wcmludGxuKCI8L3RhYmxlPiIpOyAvLyROT04tTkxTLTEkCisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZVJlc3BvbnNlRXBpbG9ndWUoCisJCUh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorCQlIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLAorCQlQcmludFdyaXRlciB3cml0ZXIpIHsKKworCQlTdHJpbmcgYmFja1VSTCA9IGdldE9yaWdpbmF0aW5nVVJMKHJlcXVlc3QpOworCQlpZiAoYmFja1VSTCAhPSBudWxsKSB7CisJCQlzdGFydFRleHRBcmVhKHdyaXRlcik7CisJCQlTdHJpbmcgYmFja1RleHQgPSBVcGRhdGVVSS5nZXRTdHJpbmcoIlNlcnZsZXRzVXRpbC5iYWNrIik7IC8vJE5PTi1OTFMtMSQKKwkJCXdyaXRlci5wcmludCgiPGltZyBib3JkZXI9XCIwXCIgc3JjPVwiaW1hZ2VzL2JhY2t3YXJkX25hdi5naWZcIi8+PGEgaHJlZj1cIiIpOyAvLyROT04tTkxTLTEkCisJCQl3cml0ZXIucHJpbnQoZ2V0T3JpZ2luYXRpbmdVUkwocmVxdWVzdCkpOworCQkJd3JpdGVyLnByaW50KCJcIj4iK2JhY2tUZXh0KyI8L2E+Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJZW5kVGV4dEFyZWEod3JpdGVyKTsKKwkJfQorCQl3cml0ZXIucHJpbnRsbigiIDwvQk9EWT4gIik7IC8vJE5PTi1OTFMtMSQKKwkJd3JpdGVyLnByaW50bG4oIjwvSFRNTD4iKTsgLy8kTk9OLU5MUy0xJAorCQl3cml0ZXIuY2xvc2UoKTsKKwl9CisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldE9yaWdpbmF0aW5nVVJMKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisJCXJldHVybiByZXF1ZXN0LmdldFBhcmFtZXRlcigiYmFja1VSTCIpOyAvLyROT04tTkxTLTEkCisJfQorfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS93ZWJhcHAvV0VCLUlORi8uY3ZzaWdub3JlIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS93ZWJhcHAvV0VCLUlORi8uY3ZzaWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwYjA3ZTkKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3dlYmFwcC9XRUItSU5GLy5jdnNpZ25vcmUKQEAgLTAsMCArMSBAQAorY2xhc3NlcwpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS93ZWJhcHAvV0VCLUlORi9saWIvLmN2c2lnbm9yZSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvd2ViYXBwL1dFQi1JTkYvbGliLy5jdnNpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQyOTJhMwotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvd2ViYXBwL1dFQi1JTkYvbGliLy5jdnNpZ25vcmUKQEAgLTAsMCArMSBAQAordXBkYXRlLXNlcnZsZXRzLmphcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS93ZWJhcHAvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmODQ3NzQKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKQEAgLTAsMCArMSwyMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgorCisKKzwhRE9DVFlQRSB3ZWItYXBwCisgICAgUFVCTElDICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgV2ViIEFwcGxpY2F0aW9uIDIuMi8vRU4iCisgICAgImh0dHA6Ly9qYXZhLnN1bi5jb20vajJlZS9kdGRzL3dlYi1hcHBfMi4yLmR0ZCI+CisKKzx3ZWItYXBwPgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+aW5zdGFsbDwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuc2VydmxldHMuSW5zdGFsbFNlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+CisgICAgPC9zZXJ2bGV0PgorICAgIAorCTxzZXJ2bGV0LW1hcHBpbmc+CisJCTxzZXJ2bGV0LW5hbWU+aW5zdGFsbDwvc2VydmxldC1uYW1lPgorCQk8dXJsLXBhdHRlcm4+L2luc3RhbGw8L3VybC1wYXR0ZXJuPgorCTwvc2VydmxldC1tYXBwaW5nPgorCis8L3dlYi1hcHA+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS93ZWJhcHAvaW1hZ2VzL2JhY2t3YXJkX25hdi5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3dlYmFwcC9pbWFnZXMvYmFja3dhcmRfbmF2LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTE4OGI3Ci0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS93ZWJhcHAvaW1hZ2VzL2JhY2t3YXJkX25hdi5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS93ZWJhcHAvaW1hZ2VzL2Zvcm1fYmFubmVyLmpwZyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvd2ViYXBwL2ltYWdlcy9mb3JtX2Jhbm5lci5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUzZTJkMgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvd2ViYXBwL2ltYWdlcy9mb3JtX2Jhbm5lci5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS93ZWJhcHAvaW1hZ2VzL2Zvcm1fdW5kZXJsaW5lLmpwZyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvd2ViYXBwL2ltYWdlcy9mb3JtX3VuZGVybGluZS5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZmM2QwYgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvd2ViYXBwL2ltYWdlcy9mb3JtX3VuZGVybGluZS5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS8ucHJvamVjdCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvLnByb2plY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU2MGY3NgotLS0gL2Rldi9udWxsCisrKyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvLnByb2plY3QKQEAgLTAsMCArMSwxMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxwcm9qZWN0RGVzY3JpcHRpb24+CisJPG5hbWU+b3JnLmVjbGlwc2UudXBkYXRlPC9uYW1lPgorCTxjb21tZW50PjwvY29tbWVudD4KKwk8cHJvamVjdHM+CisJPC9wcm9qZWN0cz4KKwk8YnVpbGRTcGVjPgorCTwvYnVpbGRTcGVjPgorCTxuYXR1cmVzPgorCTwvbmF0dXJlcz4KKzwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9SRUFETUUuVFhUIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9SRUFETUUuVFhUCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmMzUzN2MKLS0tIC9kZXYvbnVsbAorKysgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL1JFQURNRS5UWFQKQEAgLTAsMCArMSwyIEBACitUaGlzIGJ1bmRsZSBpcyBvYnNvbGV0ZS4gRnVuY3Rpb25hbGl0eSBmcm9tIHRoaXMgYnVuZGxlIHdhcyBzcGxpdCBpbnRvIHRoZQorb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUgYW5kIG9yZy5lY2xpcHNlLnVwZGF0ZS51aSBidW5kbGVzIGluIHRoZSBFY2xpcHNlIDIuMSByZWxlYXNlLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUK